SDメモリカードを抜き差しせずイメージを書き換えRaspberry Piをブートするツール(SDカード版ハード作成編)
どんなもの
Raspberry PiみたいなSDカードから起動するソフトウェアを書き換えるには、書き換えのたびに、SDメモリカードを取り出し、PCに接続して書き換えなければなりません。この面倒な書き換えを、SDメモリカードを抜き差しせずに、ツール内のSDカードやフラッシュメモリ(eMMC)にUSB経由で直接行って、さらに電源のON/OFFを赤外線でコントールして、すべてPCからの指示でできるようにしたツールを作りました。
詳細はこちら eMMC版 GitHub
特徴
速い書き込み
SDメモリカードへの書き込みをやめてフラッシュメモリ(eMMC)にし約4倍の速さで書き込みができるようになりました。
赤外線リモコン
赤外線リモコンのON/OFFコマンドを学習し、PCからの指示で学習したコマンド信号を赤外線で送信し、ON/OFFがコントロールできます。
速いMUX IC搭載
速いMUX ICを採用することで、Raspberry Piでも起動できるようになりました。
以下、ここまで作るのに、これまでの私の格闘を記しておきたいと思います。初めは、eMMC版に至るまでのSDカード版の内容です。参考になれば幸いです。
きっかけ
Raspberry Piと同じようにSDメモリカードから起動する機器のソフトウェアを開発していたのですが、在宅勤務中に、SDメモリカードイメージを自宅からリモートで書き換えて、電源OFF/ONして起動できればいいなと考えていました。いろいろネットで買えるところを探してみたのですが、国内で簡単に入手できそうになく、また結構なお値段しそうでした。するといくつか、回路図を公開しているSDWireとかあったので、久しぶりに電子工作のつもりで、いっそ作ってみようと思ったのがきっかけです。これができたら、カードの書き換えのたびに、カード抜き差しいらないし、リモートでできるようにすれば、出社しなくても済むことを目論んでました。
回路図をもとに、手元にあったUSBメディアカードリーダと、購入したUSBシリアルIFモジュールやトランジスタなどの部品を購入し、1週間ぐらいで出来たのがこれです。ただ、これではBeagleBone Blackでは、動くのですが、Raspberry Piではデータリードエラーとなり起動しませんでした。
いろいろ調べていくと、どうも機器のSDメモリカードスロットと信号を切り替えるMUX ICの間の配線長が長いとSDメモリカードのクロック信号(周波数50MHz)が崩れ、エラーとなるとのことでした。やっぱり10MHzを超えると作れないかなとあきらめかけたのですが、くやしいのでハードウェアの勉強もかねて改善に挑戦することにしました。
原因はMUX ICの入力キャパシタンス(静電容量)
このツールの仕組みは以下の図のようになっています。SDメモリカードにホストPCからデータを書き込み(オレンジ線)、その書き込んだSDカードからデータを読み込み(青線)起動します。そのデータ信号線の切り替えをするのがMultiplexer(MUX)というICスイッチで実現しています。先ほどのデータエラーにしないためには、機器のSDカードスロットから、MUX ICまでの配線長が短いほどよいとのことでした。作成したプロトタイプ機は、本体が大きく、配線長を短くすると接続しにくいため、長くしていたのですが、ケーブルは25cmぐらいでした。
使用しているSDメモリカード(Secure Digital Memory Card)は、microSDカードです。このSDカードは、8本の信号線があります。
番号 | 信号名 | 意味 |
---|---|---|
1 | DAT2 | データ信号2 |
2 | DAT3/CD | データ信号3およびカード検出 |
3 | CMD | コマンド信号 |
4 | VCC | +電源 |
5 | CLK | クロック信号 |
6 | GND | グランド電源 |
7 | DAT0 | データ信号0 |
8 | DAT1 | データ信号1 |
このうち5番のCLK信号が最大50MHz(Raspberry PiのLinuxの場合)の周期で信号がアップダウンします。この信号線が10cmぐらいあるとクロックの立ち上がりの波形がなまります。最初のプロトタイプ機から、SDカードスロットとMUX ICまでのケーブルを10cmほどに短くしてみました。しかし、現象は変わりませんでした。クロックの信号波形を取ると、それほど崩れていないように感じました。
やはり、SDWireのように、直接機器のSDカードから信号を取れるようにPCB基板を作るしかないのかとPCBの設計を始めました。しかし、PCB基板を作って、動かなかったら相当がっかりなので、PCB基板を作る前に、はたして配線を短くするだけで動くのだろうか、確かめました。なんとか数センチぐらいまで短くして動かしてみましたが、BeagleBone Blackは起動してくれますが、Raspberry Piは起動しません。下記のクロックの波形では、立ち上がりの時間が短く(4.0ns → 3.1ns)なっており、だいぶ改善しているのですが、起動しません。
ほんとうに配線長だけなのか。MUX ICについてもう一度調べ直しました。使用していたMUX ICは、Texas InstrumentsのTS3A27518Eです。6チャンネルの信号を切り替えることができ、データシートでは240MHzまでの周波数の信号がハンドリングできるとあります。このSDメモリカードスロットのクロック50MHzの周波数なら問題ないはずですが、いろいろ検索していると下記のサポートへのQ&Aを見つけました。
そこには、同じようにTS3A27518Eでは、SDカードにアクセスできないようでした。TS3A27518Eの代わりに入力キャパシタンス(静電容量)が低いTMUX1574を使ってみてはとあります。確かにデータシートでは、キャパシタンスがTS3A27518Eは21.5pF、TMUX1574では1/3の7.5pFです。キャパシタンスが小さいほど、信号のなまりがすくなく、立ち上がりがよくなります。さっそく、TMUX1574をDigiKeyから取り寄せ、プロトタイプ2号機を作り、実験してみました。その基盤がこれです。ケーブルは最初から短いと困るので、初めは長くしておきました。
すると、なんとRaspberry Piは起動しました。その時のクロック波形は以下です。立ち上がりの時間は4.1nsとあまりよくありませんが、起動できました。原因は、MUX ICだったのでした。目標達成できたので、これでいいかと思ったのですが、PCB設計をせっかくやり始めて、面白くなってきましたので、PCB版を作ることにしました。
まずは回路設計
(KiCad)[https://www.kicad.org/]というオープンソースのEDA(Electronic Design Automation)ツールがあります。検索すると多く使用方法の解説が載ってますので、入門に最適です。
まずは、回路図の作成です。ポイントのみ説明します。
USBインタフェースから、SDメモリカードなどのメディアへアクセスするコントローラ(USBメモリカードリーダ)はMICROCHIP製のUSB2640を使用しました。USB(2.0)ポートとSDカードインタフェース(ここではMUX ICへ)へ接続します。あとはデータシートの例に従い、ID等の設定値保存用のEEPROM、コンデンサ、水晶発振子等を接続します。
次は、SDカード信号を切り替える部分の回路図です。SD1_x部分の赤枠のグループの信号線と、SD2_x部分の青枠のグループの信号線を、オレンジのラインのSEL信号のHIGH/LOWによって切替わり、SDOUTxに入出力されます。SELの信号がLOWの時にSD1_x側(赤枠)の信号線につながり、HIGHの時にSD2_x(青枠)に接続されます。赤枠グループの信号線を機器のSDスロットのI/Fに、青枠グループの信号線をUSBメディアコントローラの信号線に、SDOUTxをこのボードの中のSDカードに接続します。SELのラインは10Kの抵抗でPULLUPされ、デフォルトHIGHとなり、初期起動時は、USBメディアコントローラ側(PC側青枠)にSDカードが接続されるようにします。
次に、SDカードへの電源です。SDカードへの電源も切替が必要です。切替にはSELの信号に従い、PC側(青)と機器側(赤)のSDカード電源を切り替えてボードのSDカードに供給します。切替にはMOSFETを使用しました。SDWireでは、MOSFETだと逆流するので、トランジスタにしていましたが、ちょっと贅沢な使い方かもしれませんが、MOSFETをそれぞれの電源に2個逆向きで、計4個使用しました。これでそれぞれの電源が選択されて流れている時、逆流しないようにしています。
続いて、SEL信号をPCからUSBでコントロールするためのUSB UART/FIFOコントローラです。ここでは、FTDIのFT232HLを使用しました。SEL信号のH/Lだけなら、FT200XDでも良いのですが、今回、赤外線リモコンの信号を送受信する必要があり、赤外線の0,1信号をソフトウェアで作り出すので、Highスピードのものを選択しました。赤外線信号のコントロールについては、後日、ソフトウェア編で解説したいと思います。
FT232HLは、USBシリアルコンバータとしてよく使われるICです。そのFT232HLをUSBメディアコントローラのUSBダウンポートに接続します。USBメディアコントローラは、USBハブの機能もあり、1本の接続で、PCからは別のUSBデバイスとして見えます。FT232HLをADBUS0-1を赤外線LEDの送信,受信として利用し、ACBUS5をMUXの切替信号SELの出力としました。なぜACBUS0ではなくACBUS5なのかといいますと、ACBUS5,6,8,9のみがGPIOつまりHIGH/LOWを自由にコントロールできるポートに設定できるからです。ACBUS0ではCLKなどの設定はできますが、GPIOとしては利用できません。
最後に、送信用の赤外線LEDを駆動する送信信号、赤外線受信モジュールからの受信信号をFT232HLに接続します。
電源部分については、USBのバスパワー5Vから3.3VにレギュレータICで出力するようにしています。説明は割愛します。
回路図が完成したら、KiCadのエレクトリカルルールチェッカー(ERC)にかけて、間違いや接続漏れがないか確認し、違反項目すべてクリアできたら完成です。(ルールチェッカでチェックを除外してもよいものもあります。SPICEモデルを読み込めない等)
PCBレイアウト作成
ある意味これが一番面白いかもしれません。回路図はある程度、定番が決まっているので、データシートで推奨する回路図からあまり変えることができませんが、PCBレイアウトは自由度があります。また、いかにコンパクトに部品を配置し、短く配線できるか、配線のルートを決めるのも、まるでパズルを解くようです。また見た目もきれいにしたいのでデザイン的な要素があります。(あくまで私の感想です)
今回、一番大変だったのは、SDカードを挿入する基板の部分です。基板をそのまま機器のSDカードに挿入するので、外形の形状と、端子のPADの位置が0.1mm単位で一致させるようにしなければなりません。USBマイクロスコープカメラが安価にあったので、それを購入して、付属していたスケールでSDメモリカードの端子を測定しました。
KiCadには、フットプリントエディターがあります。これに測定したとおりの寸法のフットプリントを作成します。(数値については、あくまで個人的に測定したもので、SDカード規格に沿っていないので注意ください)
その他、必要なフットプリントをKiCadのライブラリから集めます。ほとんど、ありましたが、赤外線受信器は穴の大きさが合わず、作成しました。
PCBレイアウトは、KiCadのPCBエディターで行います。MUX IC(TMUX1574)の配置をスロット部分になるべく近くなるように配置しました。そして、スロットからの信号ラインの長さをそれぞれ同じ長さになるように、最長となる信号ラインの長さに合わせて、各信号ラインを引きます。このとき、PCBエディターには、配線長を調整する機能(青枠部分)があり入力した配線長になるように”くねくね”したライン(ミアンダ配線)を自動で作成してくれます。各信号線の配線長を同じにすることで、各信号ラインがCLK信号と同じタイミングに合うようにします。
USBメディアコントローラのUSB2640 ICのフットプリントの中心に大き目のスルーホール(貫通穴)を開けてあります。USB2640は、裏面にGNDのPADの接続が必要であるため穴をあけてハンダづけできるようにしておきます。他の部品のレイアウトと配線を繰り返し、一通りレイアウトができたら、PCBレイアウトのデザインルールチェッカーにかけます。シルク(基板の文字)がお互いかかっていたり、未配線のところ、GNDがつながってないところ、PCB製造ルールに合わないところなどチェックしてくれます。すべての違反項目を対処し、チェックにクリアして完成したPCBレイアウトです。この時のレイアウトは、SDカード版です。右上の部分がSDカードスロットになっており、ここにマイクロSDメモリカードを入れます。3Dビュー表示して、向きや配置に間違いがないか確認します。
3Dビュー
PCBの発注
デザインしたPCBのデータで、PCBを製造してくれるところがいくつかあります。KiCadには、[プラグイン&コンテンツマネージャ]からアドオンでPCBデータをボタン一つで送信できる機能があり、今回は、この機能が使えるPCBWayにしました。
KiCadの[プラグイン&コンテンツマネージャ]をクリックし、プラグインから [PCBWay Plug-in for KidCad]を選択し、[インストール]をクリック、[保留中の変更を適用]をクリックすることで、アドオンがインストールされます。PCBエディターの右端にPCBWayのボタンが出てくるので、クリックすると自動でガーバーデータ(PCB製造データ)が送信されて、Web画面にオーダ画面が表示されるので便利です。
オーダ画面には、送信したPCB基板の形状が出てくるのですが、このPCBは複雑な形状なので、正しく表示されてませんが、問題ありませんでした。オーダする際の選択項目は以下としました。ほとんどデフォルトの値ですが、「板材の厚み」は必ず0.8mmにしてください。デフォルトの1.6mmとすると、SDカードスロットに入りません。他のパラメータについては、必要に応じて変更してください。選択値によっては、価格がプラスされます。
項目 | オーダ仕様 | 備考 |
---|---|---|
基板の種類 | 面付けなし | |
異なった面付の種類 | 1 | |
寸法 | (予め入力されている) | |
枚数 | 5 または 10 | |
層 | 2層 | |
材質 | FR-4 | |
FR4-TG | TG 130-140 | |
板材の厚み | 0.8 | デフォルト1.6mmではスロットに入りません。 |
最小パターン幅/間隔 | 6/6mil | |
最小ビア径 | 0.3mm | |
レジスト | 緑 | 他の色も選べますが、製作時間が3日ぐらいになります |
シルク | 白 | |
エッジコネクタ | なし | エッジありにして、エッジを無電解金フラッシュまたは金メッキとすることもできます。(お値段が許すなら) |
表面処理 | 有鉛はんだレベラー | 無鉛はんだレベラー(RoHS対応)もあります |
ビア処理 | レジストカバー | |
銅箔の厚み | 1 oz Cu | |
Remove Product No. | No. | |
メタルマスク | チェックなし | 手はんだで実装するのでなし |
部品実装サービス | チェックなし | 同上 |
運賃の項目の配送先国名をJAPANにして、配送業者を選択し、オーダの内容がよければ[カートに追加]し、その後、デザインの審査が行われます。問題なければ30分から1時間程度で審査が通ります。その後、支払い手続きに進みオーダできました。デザインに問題があればメールで問い合わせが来るので、質問に答えると直してくれます。順調に製造が進めば、配送業者にもよりますが、1週間程度で届きます。
届いたPCB基板
部品実装と動作確認
届いたPCB基板に、部品を実装して行きます。まずは中心となるUSB2640-HZH-02です。48pinのQFN(Quad Flat, No Lead Package)です。名前の通り、リード線がありませんが、手はんだでもつけることが可能です。YouTube等に実装の手順がありますので、参考になりました。QFN Package Soldering。しかし、USB2640は裏面にGNDのパッドがあるため、裏面のハンダづけが必要です。PCB基板のUSB2640の中心部分に大きなスルーホールを入れたのは、裏面からハンダを流すために開けました。この穴からハンダを流すことで裏面のGNDのハンダをづけができます。位置合わせが、うまくいくと手ハンダでも以下のようにきれいにはんだ付できました。
USB2640がハンダづけが終わった時点で、テスターで導通試験をしておきます。QFNであるため、見ただけではパターンと接続できているかわかりません。また、ICの端子間でブリッジしているかもしれないので、テスターで各端子を確認することで、ある程度確認できます。テスタのー端子を各ICの端子、VCC電源に+端子を接続し、導通試験すると電流がIC内部を流れ1KΩから2KΩの抵抗値を示します。ICの端子が接続不良もしくは他の端子にブリッジ(ショート)していると、接続不良の場合はまったく電流が流れず無限大表示になり、隣の端子に+端子を当てるとショートの0Ωになります。(パターンでショートされていない場合)。また、GND端子からVCC端子への電流が流れ抵抗値は1KΩぐらいになります。0Ωの場合、電源がショートしているので要確認です。
すべてのハンダづけが済んだら火入れ(電源入れ)しますが、その前に、もう一度、ICの足やチップ部品等のハンダブリッジがないかよく確認しておきます。よく見ると、↑のようにブリッジしてました。また、電源がショートしていないか、GND端子とVCC端子の導通試験をしておきます。ショートしていなければUSBケールを接続します。PCの電源は入っていれば、PWRのLEDが点灯します。SDメモリカードをボードに挿入し、メモリカードを認識しているはずです。認識しない場合は、USBケーブルを抜き差ししてみてください。うまくすれば一発で動くので、あっけないほどです。
IDの設定、EEPROMの書き込み
USBメディアコントローラ(USB2640)とUSB UART/FIFO(FT232HL)には、USBのVendor ID、Product ID、製品名、製造者名、シリアルナンバーなどの設定を保存しておくEEPROM(電源を切ってもデータが残るメモリ)を外部に持っています。そのEEPROMに設定値の書き込みを行います。また、FT232HLのMUX切替信号のSELをコントロールするため、ACBUS5をGPIO(IO Mode)に設定しておく必要があります。それぞれ、ICメーカより書き込みツールが公開されており、それを使ってEEPROMを書き込みます。どちらもWindows PC用です。
まずはUSBメディアコントローラですが、MicrochipのサイトからUSBDM toolをダウンロードします。ユーザガイドもあります。ダウンロード後、インストールし、ツールを起動し、USBケーブルに接続すると、Infoのタブにデフォルト値が表示されます。
Blandingのタブをクリックし、Manufacture String、Product String、Serial Number Stringを変更します。Vendor IDとProduct IDについては変更しないでください。変更すると認識しなくなります。[Update Now]をクリックするとEEPROMに設定値が書き込まれます。
Infoタブに書き込まれた内容が反映されます。
次にFT232HLの書き込みですが、こちらはFTDIのサイトのFT_Progをダウンロードします。ユーザガイド。こちらもインストールします。Microsoftの.NET Frameworkのインストールが必要です。ツールを起動し、虫眼鏡のアイコンを押すとデバイスをサーチし、見つかればデバイス情報が左側に表示されます。その表示されたツリーのFT EEPROM->Hardware Specific -> IO Controlsをクリックし、C5のところをI/O Modeに変更します。変更後、書き込みアイコンをクリックしてEEPROMに書き込みます。
動作確認
Githubからソースコードを取り出し、ビルドします。Ubuntu 22.04 LTSを使用しています。
$ sudo apt -y install build-essential libftdi-dev
$ git clone https://github.com/hnz1102/sdcdmux-emmc.git
$ cd sdcdmux-emmc/src
$ make
接続確認します。
$ ./sdcdmux
Memory Device is connected to : HOST.
SDカードをボードのSDカードスロットに挿入し、PCからメモリが認識されるかlsblkコマンドで確認します。このPCでは/dev/sdbとして認識しました。
$ lsblk
sdb 8:16 1 29.1G 0 disk
Raspberry Piのイメージをダウンロードして、SDカード(この場合 /dev/sdb)に書込みしてみます。
PCによって書込みのデバイス名が異なるのでシステムを壊さぬ様書込みデバイス名に注意してください
$ wget https://downloads.raspberrypi.org/raspios_armhf/images/raspios_armhf-2023-05-03/2023-05-03-raspios-bullseye-armhf.img.xz
$ xzcat 2023-05-03-raspios-bullseye-armhf.img.xz | sudo dd of=/dev/sdb bs=1M status=progress
$ lsblk
sdb 8:16 1 29.1G 0 disk
├─sdb1 8:17 1 256M 0 part
└─sdb2 8:18 1 3.6G 0 part
書込みが終了したらSDカードをTarget(Raspberry Pi)の方に切り替えます。
$ ./sdcdmux -s target
Memory Device is connected to : TARGET.
Raspberry Piの電源を入れます。おー。みごと起動しました!
SDカードスロットからのCLK信号です。きれいな波形で立ち上がりの時間も3.1nsになりました。
次回
次回、Raspberry Piの電源のON/OFFを赤外線でコントロールする方法ついて、ソフトウェア編で記したいと思います。こちらも、いろいろ紆余曲折がありました。ここまで読んでくださりありがとうございます。
Discussion