ショックなことが。UD01、H8/3052ベースの開発機の拡張メモリがいかれてしまっ
た。うまく起動しないな...と何度かリセットを押すとついにだんまりに。拡張
メモリ確認プログラムを走らせてみたところ、完全にだめになってました。
PCのメモリなら買ってきて交換で済むけれど...これはパーツ買ってきて作るの 面倒なんだよ。基板の問題かもしれない。(一応チェックしたけれど)
一気に開発効率が落ちてしまいました。とはいえ、ファイルシステムサポート の基本部分は終わって、エラー時のタイムアウト処理を実装しようとしていた ところだったので、まだよかった。ここから先はマシン非依存だから。ARMでい い。というか最終的なターゲットはARMなのだけど。
上物のファイルシステムSysVBFSはx86ポートでそこそこ、このOSに馴染ませて おいたので、bi-endianサポートと、intの排除。H8ポートではintを16bitとし ているので、intが32bitを必要な部分は明示的にint32_tにしないといけない。
ファイルの読み書きできるようになりました。これでデータロガーの基本部分 までは見積りがついた。

PCのメモリなら買ってきて交換で済むけれど...これはパーツ買ってきて作るの 面倒なんだよ。基板の問題かもしれない。(一応チェックしたけれど)
一気に開発効率が落ちてしまいました。とはいえ、ファイルシステムサポート の基本部分は終わって、エラー時のタイムアウト処理を実装しようとしていた ところだったので、まだよかった。ここから先はマシン非依存だから。ARMでい い。というか最終的なターゲットはARMなのだけど。
上物のファイルシステムSysVBFSはx86ポートでそこそこ、このOSに馴染ませて おいたので、bi-endianサポートと、intの排除。H8ポートではintを16bitとし ているので、intが32bitを必要な部分は明示的にint32_tにしないといけない。
ファイルの読み書きできるようになりました。これでデータロガーの基本部分 までは見積りがついた。

MMCカード。
コマンドは6byte。最初がコマンド指定で、引数4byte(MSB 1st)、CRC7|ストッ
プビット。コマンド指定が0x40|コマンドで0x80が落ちているのがスタートビッ
トになる。CRC7|0x01にするのが、ストップビットになる。
レスポンスはコマンドレスポンスに3種類、R1,R2(ステータスレジスタの
み),R3(OCRのみ)。
書き込みあとのレスポンスが2種類、データレスポンスとエラーレスポンス。
レスポンスの区別は上位3bitで区別できる。
コマンドとコマンドの間にはダミークロックが必要(8クロック)。CS#の状態は
問わない。
void
md_mmc_activate ()
{
md_mmc_putc (0xff); //コマンドの前にダミークロックを入れることにした。
*PB_DR &= ~1; // CS# Assert;
udelay (1);
}
void
md_mmc_deactivate ()
{
*PB_DR |= 1; // CS# Deassert.
}
データパケットを共なうコマンド。
bool
__mmc_data_command (int command, uint32_t arg, uint8_t *buf, size_t n)
{
size_t i;
md_mmc_activate ();
if (!__mmc_command (mmc_set_command (command, arg)))
return FALSE;
// ここでデータトークンスタートバイト(0xfe)が送られてくるのを待ちます。
if (!__mmc_wait_data ())
return FALSE;
for (i = 0; i < n; i++)
{
buf[i] = md_mmc_getc ();
}
// 最後にCRC16が送られてきます。
__mmc_data_crc ();
md_mmc_deactivate ();
return TRUE;
}
データパケットを送るコマンド
bool
__mmc_data_write_command (int command, uint32_t arg, uint8_t *buf, size_t n)
{
size_t i;
uint8_t r;
bool done = FALSE;
md_mmc_activate ();
if (!__mmc_command (mmc_set_command (command, arg)))
return FALSE;
//ダミークロック
md_mmc_putc (0xff); // At least 1byte wait.
//まずデータトークンスタートバイトを送ります。
// Data packet.
md_mmc_putc (0xfe); //Data token start byte.
for (i = 0; i < n; i++)
{
md_mmc_putc (buf[i]);
}
//SPIモードなのでCRCなし。
md_mmc_putc (0x00); // Dummy CRC
md_mmc_putc (0x00); // Dummy CRC
DPRINTF ("send done\n");
//ここでレスポンスを待ちます。
r = __mmc_response ();
//レスポンスは二種類あります。
if ((r & 0xe0) == 0)
__mmc_error_response (r);
else
done = __mmc_data_response (r);
// iprintf ("%x\n", (uint32_t)r);
//まだこの段階ではMMCカードは作業中。Doutが0xffになるまで待ちます。
__mmc_wait_busy ();
md_mmc_deactivate ();
return done;
}
UD01 H8/3052にて。test.txtにあらかじめNetBSD側でdisklabelの内容を入れておき
それを表示、同じものをa.txtとして新しくファイルを作ります。
$ tip hmon
connected
stack_start: 0xfff10
ROM data: 0x7e60-0x82bc
RAM data: 0xfdf10-0xfe36c 1116byte
bss: 0xfe36c-0xffa9c 5936byte
NMI return address|CCR: 8000016e
delay_div=40
calibrstack_start: 0xfff10
ROM data: 0x7e60-0x82bc
RAM data: 0xfdf10-0xfe36c 1116byte
bss: 0xfe36c-0xffa9c 5936byte
NMI return address|CCR: 8000016e
delay_div=40
calibrated. delay_div=40
[0] DOS 3.0+ 16-bit FAT <32M [63 33264]
[1] NetBSD [33327 90657]
[2] unused [0 0]
[3] unused [0 0]
SysVBFS sector = 6 size = 65536
bfs super block + inode area = 1024byte
inode: 3/8
root inode: 2-2
bfs dirent area = 512byte
dirent: 4/32
super block 512byte, inode 64byte, dirent 16byte
magic=1badface
data_start_byte=0x400
data_end_byte=0x1ffffff
from=ffffffff
to=ffffffff
from_backup=ffffffff
to_backup=ffffffff
fsname=
volume=
[inode index list](max 8)
2 64 2 2 (0) 2 493 0 0 2 4a45e8a1 4a45aea4 4a45aea4
3 868 3 4 (1) 1 420 0 0 1 4a45da4b 4a45b0c0 4a45b0b8
4 868 5 6 (2) 1 420 0 0 1 4a45dd2d 0 0
total 3 i-node.
[dirent index list]
32 file entries.
.: sector:58448 + 2 -> 2 64byte. inode=2
..: sector:58448 + 2 -> 2 64byte. inode=2
test.txt: sector:58448 + 3 -> 4 868byte. inode=3
a.txt: sector:58448 + 5 -> 6 868byte. inode=4
4 files.
test.txt: sector:58448 + 3 -> 4 868byte. inode=3
# /dev/rld0d:
type: ld
disk: unknown
label: fictitious
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 16
sectors/cylinder: 1008
cylinders: 123
total sectors: 124160
rpm: 7200
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0 # microseconds
track-to-track seek: 0 # microseconds
drivedata: 0
6 partitions:
# size offset fstype [fsize bsize cpg/sgs]
a: 8737 33327 4.2BSD 1024 8192 16 # (Cyl. 33*- 41*)
b: 16384 42064 swap # (Cyl. 41*- 57*)
c: 90657 33327 unused 0 0 # (Cyl. 33*- 122)
d: 123984 0 unused 0 0 # (Cyl. 0 - 122)
e: 33264 63 MSDOS # (Cyl. 0*- 33*)
f: 65536 58448 SysVBFS # (Cyl. 57*- 122)
bfs_file_delete: "a.txt" deleted.
bfs_file_create: start 5 end 6
