090627

|


ショックなことが。UD01、H8/3052ベースの開発機の拡張メモリがいかれてしまっ
た。うまく起動しないな...と何度かリセットを押すとついにだんまりに。拡張
メモリ確認プログラムを走らせてみたところ、完全にだめになってました。

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