Interface 2009/5月号の付録基板の続き。
フラッシュロムの書き込みプログラム、4KBあればしばらく使えるだろう..と思っ ていたのだけど、すぐに限界に達した。32bitのRISCだからね。H8の16bitの CISCの感覚だとすぐにあふれてしまう。Thumbは落ちついてから。
ということでフラッシュロムライタをフルスペックにまで書きました。懸案の Autobaudのところでダンマリになってしまうのは、ノンブロックモードにして からリードにして、ボードのリセットを促すようにしました
次はシリアルI/O。これは16550互換なのね。インターフェース6月号のサンプルを 見てポーリングのgetc,putcまで作って、シェルまでつなげました。
19200bps 8N1で単にエコーバックするエッセンスはこれ。
フラッシュロムの書き込みプログラム、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 RESETOK。あとはちまちま実装だ。
