091029

|





jiskan24から作ってみました。ラップタイムの部分は、ランタイムになんちゃっ てボールドにしてあります。一行目の反転表示が速度、横がラップ、ラップタ イムの下の棒グラフが30分までの経過時間の割合いを示しています。
LCDは通常のVRAM構成と違って、VRAMの一番最初に1B書き込むと、それは縦に8bit なので、フォントの変換とか面倒だ。
今回は使われていないイーサネット用のメモリ領域(0x7fe00000からの16KB)の 最初の1KBを仮想VRAMとしました。ここにイメージを作って、適時SPIで一気に LCDに転送です。イーサネットのメモリならDMA領域なので、SPIからSSPのSPIモー ドに変更すれば、DMA転送もできるだろうという目論見。
最近はCでも整合配列が使えるようになったのでちょっと楽になった。
イーサネットのメモリをVRAMにします。ページサイズで整合配列にしておきます。
uint8_t (*vram)[VRAM_PAGE_SIZE] = (uint8_t(*)[])ETHER_RAM_START;

フォントは24x24。1ページが8bitなので3ページを使います。
#define	BITMAP_WIDTH	24
#define	BITMAP_NPAGE	3
フォントはLCD用のフォーマットに変換しておきます。これは'0'
struct font
{
  uint8_t bitmap[BITMAP_NPAGE][BITMAP_WIDTH];
} fonts[] = {
//[0xcb]----------------------------------------------------------------------
  {{
    { 	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
	0xc0, //||......
	0xf0, //||||....
	0x38, //..|||...
	0x0c, //....||..
	0x04, //.....|..
	0x02, //......|.
	0x02, //......|.
	0x02, //......|.
	0x02, //......|.
	0x04, //.....|..
	0x0c, //....||..
	0x38, //..|||...
	0xf0, //||||....
	0xc0, //||......
	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
    },
    { 	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
	0xff, //||||||||
	0xff, //||||||||
	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
	0xff, //||||||||
	0xff, //||||||||
	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
    },
    { 	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
	0x03, //......||
	0x07, //.....|||
	0x0c, //....||..
	0x08, //....|...
	0x10, //...|....
	0x10, //...|....
	0x10, //...|....
	0x10, //...|....
	0x08, //....|...
	0x0c, //....||..
	0x07, //.....|||
	0x03, //......||
	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
	0x00, //........
    },
  }},
...

仮想VRAMにはLCDに送るイメージそのものを。こうしたのは「'」や「.」を合成
したいため。このLCDモジュールはLCDへのデータの書き込みしかできないので
read-modify-writeができない。なので、こっちでやっておく。

// Write to V-RAM
void
lcd_vram_font (int font_index, int x, int y, bool inverse)
{
  int j, k;
  assert ((size_t)font_index < sizeof fonts / sizeof (fonts[0]));
  struct font *font = fonts + font_index;

  for (j = 0; j < BITMAP_NPAGE; j++)
    {
      uint8_t *p = vram[j + y] + x;
      uint8_t *bits = font->bitmap[j];
      for (k = 0; k < BITMAP_WIDTH; k++)
	{
	  uint8_t b = *bits++;
	  *p++ |= inverse ? ~b : b;
	}
    }
}

頃合を見て一気に転送。いずれ、ここはDMAにしたい。
// Transfer internal V-RAM data to LCD
void
lcd_vram_transfer ()
{
  int i, j;

  for (i = 0; i < VRAM_NPAGE; i++)
    {
      lcd_set_page (i);
      lcd_set_column (0);
      uint8_t *bits = vram[i];
      for (j = 0; j < VRAM_PAGE_SIZE; j++)
	lcd_data_putc (bits[j]);
    }
}


なんとなく接続したのをきっちりまとめないと。ここから車体に乗せるまでが 結構大変なんだよね。
GPSの書き込みフォーマットも考えておかないと。