小ネタ 2006-004

NintendoDSで非純正ソフトを動作させるのを試みた その2 (開発用の機器の製作)

 昨年からNintendoDSをhackして非純正の自作ソフトを動作させる試みが活発化してきている。市販のマジコン類が出てきており、自作ソフトの開発者による開発も活発になってきている。DSにはhackerを引きつける魅力があるのだろう。
 私も昔はポケコンやザウルスに入れ込んでいたが、最近ではDSがお気に入りである。特にザウルスなどのPDAに比べれば本体の値段が安いというのが気に入っている。ペン入力も好きなのだが、これを活かしたソフトが作れるかというと当分自分には無理のような気がする。
 まずは自分なりの開発機器や環境作りをしたい。出来合いのものでも開発は可能なのだが、自家製のものが作りたい。というか、手段であるそれが目的になってしまっている。特にDSと外部との情報のやりとりのための通信やストレージの実験それ自体に興味がある。

 そうした実験の記録を記す。(失敗事例も恥ずかしさに耐えられる程度に含めて)


PassMeを自作 (失敗)-->成功

 DS本体に収納できるような小型なPassMe(TinyPassMe)が作れないかどうか、検討してみた。 中国では既にPASSCARD2という名前で開発されているようだ。
 去年、強引にDS本体にPassMeを内蔵というのをやってみた。あれはオプティマイズのPassMeキットの基板を小さく切り落としてDSの純正カートリッジの中身と貼り合わせただけなので厚みが厚かった。
 普通にDSのカードスロットに挿してハミ出さないPassMeを目指して基板から作ってみることにした。
 
 左側が作製した基板、右側が純正カートリッジの中身である。
 厚さを薄くするために、穴あきの基板を作製し、そこにCPLDのチップを収めた。回路は、元のPassMeと同じ。

 
 左側が自作の基板に純正カートリッジから部品を載せ替えた物、右側が普通のPassMe基板である。

 この基板をつくるためにちょっとした額のお金とPassMeキット1つとDSゲームカートリッジ1つを犠牲にした。

 残念ながら、せっかく作った基板なのだが、うまく動作しなかった。

 部品の載せ替えのために、熱をかけて元の基板から部品を取り外すのだが、手際が悪かったので部品が死んでしまったのだと思われる。
 再度部品を手に入れてまたチャレンジしたい。

(後日加筆 2006.3.5)
 基板の設計ミスを発見した。パターンカットとジャンパー配線で修正したところ、正常に動作することが確認できた。
 作ったのはPassMe無印なのだが、DS Lite用にPassMe2の小型版を作ってみようと思う。

(後日加筆 2006.3.9)
 小型PassMe2も作ることができた。
  (PassMe類の大きさの比較)

(後日加筆 2006.3.19)
 安い価格の中古DSゲームを買ってきて、それを材料に追加で作ってみた。
 全部合わせると、小型PassMeが3個と小型PassMe2が1個になった。こんなに自分ひとりでは使わないし。知り合いにでも配ろうか。


フラッシュカートリッジの自作に再挑戦 (これも失敗)

以前、GBAのフラッシュメモリカートリッジの自作に失敗している。懲りずに再設計してまた挑戦してみた。うまくいけばDS用に使えるはずである。
 
 残念ながら、これも失敗してしまった。どうも今年は幸先が悪い。


Homebrewファームウェアを使ってみる

 海外でloopyという人物が自作のDSファームウェアを作ってしまったそうだ。FlashMeもこの作者によるものである。
 ファームウェアのバックアップを取った後で、Homebrew firmwareを入れてみた。
 
 画面はシンプルに、
 NDS
 Passme
 GBA
 Off
 と表示される。
 
 NDSは、DS用ソフトをロードして実行する。
 Passmeは、GBA用カートリッジに書き込まれた自作DSソフトを起動する。
 GBAは、GBAモードでGBA用ソフトを実行する。
 Offは、電源を切って終了する。
 
 上記のうちPassmeは、本当のPassMeとは挙動が違うので注意。FlashMeのような動作である。PassMeを使って起動する場合はNDSを選べばよい。
 
 あと他にちょっと変わった機能で、STARTボタンを押すとメモリダンプ表示に切り替わるというのがある。
 
 使ってみて思ったのは、このファームウェアはDSの元々のファームウェアを改変してより使いやすくしたいというような面白い目的のためのものではなく、
 DSの起動時のシーケンスの最小限を取り出したスケルトンのようなものとして考えるのがよさそうだ。
 ソースコードも公開されていて、DS用ソフトをDSカートリッジからロードする手順もバッチリと書いてあるので、あとで読んでみよう。

(後日加筆 2005.2.21)
 Homebrew firmwareのバージョンアップ版が出たので、入れ替えてみた。細かいバグ取りがされたということなので、下のファームウェアバックアップ用のソフトが動くか試してみたが、残念ながら動作しなかった。一応作者に報告のメールを送っておくか。


ファームウェアのバックアップ方法

 DSのファームウェアを書き換えてFlashMeやHomebrew firmwareを入れるのは、普通はちょっと勇気がいる。なぜなら失敗すると簡単に直せないからである。
 ファームウェアを書き直す仕組みを以前に作製しており、それを使えばバックアップやリストアが可能である。ただし、この方法はハンダ付けスキルが必要であり、簡単ではない。

 とりあえず、ハンダ付けとか無しに簡単にファームウェアのバックアップを取ることができるようなソフトを作ってみたので、公開しておく。
 せっかくバックアップを取っても、それを修理のためにDSに取り付け直すにはハンダ付けが結局は必要なのだが。
 ハンダ付けでファームウェアをいじったりするのはこの人くらいか。

 
 [ ファームウェアバックアップ用ソフトfirmdump.zip (download) ]


 ちょっと謎なのだが、Homebrew firmwareから動かすと、このソフトがうまく動かなかったりする。(なぜ? )

 自作版のfirmwareと普通のfirmwareとを2つメモリを実装して、スイッチで切り替え式にすれば便利かもしれない。書き込みに失敗しても元のfirmがあるから安心。PC用にロム焼き大丈夫という商品があったが、似たような感じか。 PassMeやFlashMeが通用しないようになると、Modチップでそういうのが流行るのかなあ?


SPIバスI/Fボードの製作

 小型PassMeを作ろうとしたときに、PassMeキットを1つ分解してCPLDチップを取り外した。その基板を再利用してSPIバスI/Fボードを作ってみた。SPIバスをD-Subの9ピンコネクタで信号を取り出すことができる。
 とりあえず、ファームウェアバックアップソフトを使って、DSのファームウェアを直接的に書き換えるためのI/Fとして使ってみた。
 
 左側は、PassMeを改造したSPI I/FボードとM45PE20書込用サブ基板、右側は直接DSのFWを書込むサブ基板。

 前にXportという汎用I/O用のGBA周辺機器を使ってSPI方式のAD変換器をDSに接続したのだが、そういった特殊な機器がなくても、このSPIバスI/Fボードで同じことができるはずである。


(後日加筆 2006.3.25)
 SPI I/Fなどの電子工作用に使うためのユニバーサル基板を作ってみた。
 
 これを使ってDSの周辺機器をいろいろと作れそうだ。


SDカードリーダーの製作

 自作したSPIバスI/Fボードを使って、SDカードリーダーを作ってみた。といってもSPIモードにしか対応していない。
 MagicKeyと似たような感じか。

 ハードウェアは作ったのだが、まだソフトは作り中である。まずはSPIモードにしてセクタダンプあたりから始めるところ。
 SDカードから何か読み込んだり、書き込んだりするにはFATをサポートしないといけないので難しそうだ。
 

(後日加筆 2006.2.11)
 Chishm's GBA Movie Player projectのGBAMP用CompactFlashドライバが、M3とかSuperCardなどの各種マジコンにも対応し、ストレージメディアもCF/MMC/SDカードに対応しているそうだ。MagicKeyにも最近対応している。Sata.さんのRAIN等で性能は実証済みと言えそうだ。このドライバを流用すれば、そんなに手間を掛けずに自作SDカードリーダー用のソフトが作れるのかもしれない。


miniSD Adaptor for DS

 自作したSDリーダーは、実用にするには大きすぎるので、DSカードサイズの小型なminiSDカードリーダーを作ってみた。
 回路はこの回路図のとおり。 This circuit is just an experiment.
 
 SDカードにアクセスするためのソフトを作っているのだが、最初のSPIモードへの移行の部分でうまくいっていない。動作が不安定で、時々しかSPIモードへの移行コマンドが通らない。ソフトを何か間違えているか、それとも回路に問題があるのだろうか?

(後日加筆 2006.3.19)
 これとは別に作製したXport2.0のSDカードI/Fを使ってハードとソフトのデバッグをしている。そういう用途にはXportがやはり一番使いやすいなあ。
 さて、ハード面では大きな問題は無いようで、ソフトを直したらSPIモードへの移行が安定して動くようになった。

 回路の問題として、懸念されていた点が3つあったのだが、とりあえず問題になっていない。
 (1)初期化のためにCS端子を'H'にしたままCLKを入力する必要があるのではないか?
 (2)Din,Dout端子にプルアップ抵抗が必要ではないか?
 (3)DSのSPIの速度は約500kHz〜4MHzだが、400kHzが必要ではないか?
 これに対し、(1)は、MASKROMへのCLKが出ているので問題ない。(2)は、既にプルアップされているらしい。(3)はSD側にマージンがあるようなので最近のSDなら大丈夫みたいだ。

 せっかく作ったminiSD Adaptorであるが、このカードをDSから抜き差しするときにminiSDカードごと押し込まなければならない。そうするとminiSDカードsocketのロックも作動してしまうので、意図せずminiSDが抜けてきてしまい使いにくい。DSカードからminiSDがハミ出さないサイズには作れないものだろうか。


Natrium42's DSerial

 DS PassThroughの小型版であるPassMeを作ったNatrium42氏が、PassMeをシリアルポートに改造する例を紹介している。
 SPIバスはクロック同期式のシリアル信号なのだが、クロック部分を無視すれば非同期式のシリアル信号としても使用可能ということらしい。そんな使い方があるとは気が付かなかった。目からウロコが落ちたというか。
 ちなみに自分でもSPIバスIFに接続するRS-232Cインターフェースを作ろうとしていたのだが、まだ部品を揃えただけで仕込み中である。

 さて、そんなNatrium42氏が新しいI/Fボードを作ろうとしているようだ。基本的にはSPIバスをDSから取り出していろんな周辺回路とマイコンを接続するという周辺機器らしい。
 


Serial Port for DS (1)

 Natrium42氏が、PassMeをシリアルポートに改造する例を紹介している。その例だと、PassMeのCPLDを書き換えてTX,RX信号を取り出している。ハードウェア記述言語で書かれたソースコードでPassMeのハードを変更するというのが面白い。
 CPLDを書き換える方がラクなのだが、あえて同じ動作をするハードを74シリーズを使った電子回路で作ってみた。

  
 ソフトも上記のNatrium42氏のページを参考にして作ってみたが、うまく動作しなかった。SPIバスのクロック周波数は一定なのだが、DSのSPI-I/Fのパラレル→シリアル変換のハード部分で変換終了検出時間にムラがあるみたいで、正確なRS-232Cのボーレートを作ることができなかった。Natrium氏に質問してみることにする。

 これとは別に当初の予定どおりSPIバスに接続するRS-232C用のICを使った回路を製作してみようと思う。部品は買ってあるし。

(後日加筆 2005.2.21)
 Natrium氏から4800bpsで通信するための新しいソフトを頂いて、それを使って動作確認できた。そのコードを元に自分でもソフトを作ってみた。
 [ シリアルインターフェースのテスト用ソフト serial-test.zip (download) ]


Serial Port for DS (2)

 上記のシリアルインターフェースはボーレートを正確に作って合わせるのが大変である。UARTインターフェースの定番はNationalSemiconductor社の16550というICなのだが、SPIバスに接続するのは難しい。そこでMAXIM社のMAX3100を使って作ってみることにした。本当はMAX3111を使いたかったのだが入手できなかった。

 
 とりあえず、組み立てただけで、まだソフトを作ってない。シリアルポートを使ってPCからロードするようなソフトを作りたい。


CompactFlash Adaptor (DarkFader方式)

 最近、ハンダ付けのスキルが落ちているのかもしれない。老眼にはまだ早いはずなのだが。
 ちょっとトレーニングがてらにCompactFlashアダプタを作ってみた。
 回路図DarkFader氏のページのものを使った。CFのコネクタ部分は、PCMCIAカードへの変換アダプタを改造した。
 GBAMPとの互換性はないみたいで、ソフトを作らないと使えないみたいだ。これもSDカードアダプタと同様で、GBAMPのソフトをベースにするのがよいだろう。
 
 ちなみにこのCFアダプタだとGBAスロットから何かを起動することができないのであまり実用向きにはならない。自作ソフト起動手段として使うには何か工夫が必要なようだ。
 わりと簡単にできそうなのはNDSファイルをGBAカートからロードするローダーに細工をしてロード後にすぐに実行せずに待機するようにして、その間にGBAカートを入れ替えるというのを作ればできそうだ。 待機する部分のコードはGBAカート以外のメモリアドレスで実行しないといけないが、NDSローダー自体をDSのメインメモリの隅にでも転送して実行するような2段式にするのがよさそうだ。


GBA Slot Extender for DS

 GBA-SP用のGBAスロットを3つ拡張してスイッチで切り替える土台が出ていた。これを改造してDSに接続できるようにしてみた。
 上記の自作CFアダプタのソフト開発のためには、GBAスロットの入れ替えのために抜き差しを頻繁にしないといけないが、それを軽減したいと思った。
 
 残念ながら消費電力の大きそうなものは、この切り替え器で動作しなかった。
 DS-Lite用にGBAスロットを延長するようなものを作りたいと思ったのだが、注意が必要なようだ。

 動作したもの: 普通のGBAソフト, Flash2Advance, EZ-FlashII, DS-RumblePak, バンブラ拡張カートリッジ
 動作しなかったもの: アドムービー(GBAMP), SuperCard-CF, SuperCard-SD, Xport2.0
 動作が不安定なもの: プレイやん(起動するが、動画再生できず)

 電源ラインを強化したり、電流計で消費電力の定量値を測ったりしてみようと思う。

(後日加筆 2006.2.25)
 DS Lite用のGBAポートの延長も作ってみた
 


XPort2.0 SD/CF adaptor

 XPort.20を使ってSDカードとCFカードをつないでみた。FlashROM付のカートリッジでないと開発のために抜き差しが必要なので使いにくかったからである。GBAスロットを拡張する切り替え器もうまくいかなかったし。
 

 CFやSDのファイルをロードしてDSからXPort2.0のフラッシュメモリの書き換えをしてみようとしている。
 SDやCFといったストレージに対するFATアクセスはまだ全然できていないが、XPort2.0のフラッシュメモリについては消去するコマンドが動作するところまで動作確認できている。


XPort on XPort

 DSを有線でLANに接続する方法を以前から作ろうとネタをあたためていて、いくつか部品を検討していた。

 定番は、Realtek社(蟹)のRTL8019というICがLANアダプタの自作によく使われている。GBAに接続する事例もある。
 SPIバスに接続できるMicrochip社のENC28J60というのが良さそうだが、発表されたあと製品が出てこない。
 最近だと、SiliconLaboratories社のCP2201というのが面白そうだ。

 敷居が低くて開発しやすそうなLantronix社のXPortというUART+LAN+WebHostという製品がある。これをDSに接続してみた。UART用にMAX3100を使っている。厳密には直接LAN接続してないのだが、気にしないことにする。

 

 ハードウェアを組み立てたが、ソフトウェアはまだこれからである。PCからLAN経由でDSを制御したりファイル転送するのが当面の目標か。

 Web browserとか大それたことは考えていない。Nintendoから出ることが発表されたし。
 名前は、SuperMario Browser とか, Bowser Browser とか。