開発日記

flash programming に成功. sector erase 0x10000 bytes, back switch 8 times 込みで 0x10000 bytes の転送で 16 秒かかっている. おそいし、USBの受信が安定していない.

USB 受信

  • 64 bytes を超えるPCからの送信はMCU 側の処理が多くなると、USB 受信パケット(64 bytes単位)を喪失してしまう.
  • USB プロトコルの NAK をうまく利用する方法はどうもなさそう.
  • 根本的な解決は受信前に連続受信バイト数を UsbDeviceDescBank.PCKSIZE.MULTI_PACK_SIZE を設定する.
    • DMA で書かれるので MCU からの転送処理(memcpy())を省ける
    • PCKSIZE.SIZE の倍数でないと DMA で RAM を破壊される可能性あり
  • PCKSIZE.SIZE は 8,16,32,64 から選べるので少ない転送量の場合は小さめの値にしておくことで倍数制限とうまくつきあえるはず

DMA descriptor

  • program cycle (write) と polling cycle (read)のたびに DMA descriptor を最初から作り直しているが時間がかかる(25us程度)ので descriptor の再利用機能を実装して DMA の初期化時間を減らす.
  • descriptor とは別に event contoller の初期化は毎回必要でそれも気になる.

ハードウェア変更

1度の DMA で REGION と RW を変更させると flash の programming や polling が効率化できる.

  • 74595 を追加, 4個目, 出力 CPU RW, BOTH RW. REGION x2
  • 新しい 74595 の LATCH 許可用に OR か AND gate が必要, DMA 制御でそれを変えるか従来どおりにするか選択する.
  • DMA 途中に memory strobe の時間を変更できないので、 CPU と PPU で別の脚を設けて有効時間は決めておく
74595.RCLK = DW_SS || 74595.control (AND, OR どちらでもよい)
PPU.A13# = CARTRIDGE_A13 == 1 && REGION_PPU
74165.PL# = ~(CPU_MS || PPU_MS)
CPU_ROMSEL# = REGION_CPU && CPU_MS && CARIDGE_A15 == 1
PPU_RD# = REGION_PPU && PPU_MS && BOTH_RW
PPU_WR# = REGION_PPU && PPU_MS && ~BOTH_RW