090615

|


Interface 2009/5月号の付録基板の続き。

フラッシュロムの書き込みプログラム、4KBあればしばらく使えるだろう..と思っ ていたのだけど、すぐに限界に達した。32bitのRISCだからね。H8の16bitの CISCの感覚だとすぐにあふれてしまう。Thumbは落ちついてから。
ということでフラッシュロムライタをフルスペックにまで書きました。懸案の Autobaudのところでダンマリになってしまうのは、ノンブロックモードにして からリードにして、ボードのリセットを促すようにしました
  fcntl (fd ,F_SETFL, O_NONBLOCK);	// Non-block mode.
  do
    {
      if (retry++)
	{
  ここの処理はダンマリになってからtipで接続してみて、ネゴシエーションを
開始できるようになるのを模しています。
	  buf[0] = '\r';
	  buf[1] = '\n';
	  write (fd, buf, 2);
	  tcdrain (fd);
	  usleep (100000);
	}

      buf[0] = '?';
      if (write (fd, buf, 1) == -1)
	{
	  perror ("'?' write failed.");
	  return 1;
	}
      tcdrain (fd);

      if ((sz = read (fd, buf, sizeof buf)) == -1)
	{
	  perror ("'?' read failed. PLEASE RESET AGAIN.");
	}
    }
  while (sz != 14);
  fcntl (fd ,F_SETFL, 0);	// Block mode.
これでなんとかリセットボタンを何度か押すだけでフラッシュに書き込めるよ うになった。とはいえ不満。もっといい解決方があるはずなのだけど..。 (Flash Magicはずっと確実)
次はシリアルI/O。これは16550互換なのね。インターフェース6月号のサンプルを 見てポーリングのgetc,putcまで作って、シェルまでつなげました。
19200bps 8N1で単にエコーバックするエッセンスはこれ。
void
func2 ()
{
  // UART0 Echoback test.
  // 19200bps 8N1
#define	PINSEL0  ((volatile uint32_t *)0xe002c000)
  *PINSEL0 = (*PINSEL0 & 0xffffff0f) | 0x50;
#define	CLK_PCLKSEL0 ((volatile uint32_t *)0xe01fc1a8)
  *CLK_PCLKSEL0 &= 0xffffff3f;
#define	POW_PCONP	((volatile uint32_t *)0xe01fc0c4)
  *POW_PCONP |= 8;
#define	COM_LCR	((volatile uint32_t *)0xe000c00c)
#define	COM_DLL	((volatile uint32_t *)0xe000c000)
#define	COM_DLM	((volatile uint32_t *)0xe000c004)
#define	COM_FDR	((volatile uint32_t *)0xe000c028)
#define	COM_IER	((volatile uint32_t *)0xe000c004)
  *COM_LCR = 0x80;
  *COM_DLL = 3;
  *COM_DLM = 0;
  *COM_FDR = (12 <<4)|1;
  *COM_LCR = 3;
  *COM_IER = 0;
#define	COM_LSR	((volatile uint32_t *)0xe000c014)
#define	COM_THR	((volatile uint32_t *)0xe000c000)
#define	COM_RBR	((volatile uint32_t *)0xe000c000)
  while (/*CONSTCOND*/1)
    {
      uint8_t c;
      while ((*COM_LSR & 0x01) == 0)
	;
      c = *COM_RBR;
      while ((*COM_LSR & 0x20) == 0)
	;
      *COM_THR = c;
    }
}
プログラムの書き込み。
../../lpc23xxwrite/lpc23xxwrite test.bin
test.bin: 12908 byte
'?' read failed. PLEASE RESET AGAIN.: Resource temporarily unavailable
'?' read failed. PLEASE RESET AGAIN.: Resource temporarily unavailable
この表示でリセットをかける。何度も。
'?' read failed. PLEASE RESET AGAIN.: Resource temporarily unavailable
'?' read failed. PLEASE RESET AGAIN.: Resource temporarily unavailable
'?' read failed. PLEASE RESET AGAIN.: Resource temporarily unavailable
Baudrate synchronized.
Frequency 14746 KHz
echo off
U 23130 done.
P 0 3 done.
E 0 3 done.
W 1073742336 4096 done.
0x0: sector 0x0 offset 0x0
P 0 0 done.
C 0 1073742336 4096 done.
W 1073742336 4096 done.
0x1000: sector 0x1 offset 0x0
P 1 1 done.
C 4096 1073742336 4096 done.
W 1073742336 4096 done.
0x2000: sector 0x2 offset 0x0
P 2 2 done.
C 8192 1073742336 4096 done.
W 1073742336 620 done.
0x3000: sector 0x3 offset 0x0
P 3 3 done.
C 12288 1073742336 1024 done.
echo on
Success.

$ tip umon19200
connected

stack_start: 0x4000fff0
ROM data: 0x2de4-0x326c 1160byte
RAM data: 0x40000000-0x40000488 1160byte
bss: 0x40000488-0x4000051c 148byte
stack check: 4000ffd8
LPC2388 Simple Monitor Build Jun 15 2009 22:09:20
>> help         
avaliable command: help reset l 
>> reset
RESET
OK。あとはちまちま実装だ。