ある晴れた昼下がり こんなツイートを見かけました
へー。中身…
うおおおおおお、通販ぽちーーーーー!
としてTLを眺めていると…
次々に流れてくる購入報告と開封画像
…あぁぁぁぁぁぁ!今から買いに行くかぁ…????
そして売り切れ報告…
えぇぇぇぇぇ???もうみんなUART触ってるのに歯ぎしりしながら明日を待つのか…
と思った矢先…

フォロワーさんからとんでもない連絡が
どうやら歩いて行けるほど近くに住んでいる模様
慌てて財布握りしめて譲ってもらいに行きました
そんなわけで一日早く手に入れたので!早速分解します!
分解して解析する
この手の機器、オンボードフラッシュにファームウェアなりブートローダーが入っているのが常套なので、引っぺがしてROMライターにぶち込みます。
ところが…中身が全部FF…つまり、空っぽってことです。
まじか…ってことは、起動時に出てたCはSoCがネイティブで吐いている可能性…
あーーーー、XMODEMでのファイル受信待ちか…そっからーーーー???!
ja.wikipedia.org
しかし、その手順もありますが、そんなに古くないSoCであればネイティブでSDカードからの起動をサポートしている可能性は大いにあります。
データシートを見る前にそれを確認するために、電源投入時のmicroSDスロットの状態を確認してみると…CLK端子に初期化用の波形が出ています。
つまり、適切なブートローダをSDカードに書いて挿せば起動する可能性があるということです。
(※過去にファミコンミニをSDカードから起動させたことがあります)
honeylab.hatenablog.jp
この手の機器で、量産するレベルのものであれば既存のLinuxが対応している可能性は大いにあります。というか、メーカから提供されるSDKがそのままLinuxのツリーだったりするわけで。また、似たような機器の起動イメージがそのまま利用できることもあります。互換品を探すためにSoCの型番と、組み込み用のシステムを組み合わせて検索していると…同系列のAM5338を搭載したBeagleBoneBlack、これはデフォルトでLinuxが使えます。OpenWRTのポーティングもあるということがわかりました。
また、内蔵eMMCのほか、外部microSDからのLinux起動ができます。しかも私の部品箱に転がっている。これは好都合。さっそく、このイメージを書いて…
既に試してくれていました。おお。少なくともブートローダが呼ばれている。これはもはや勝利は目前。
その後あれこれみんなが試して、どうやらBBBのイメージは割とすんなり動いてシェルまで立ち上がる、ということまでサクッと判明してしまいました。
しかし、これからです。私の主目的はこれに搭載されたWi-SUNと3Gモジュールまで含めて使い倒すこと。多少弄ってみましたが、BBBのイメージのままではそれらをうまく使いこなすことができません。何より、BBBのまま動いているというのが若干気持ち悪いです。そのため、ゼロからファームウェアのビルド手順を確立し、好きなモジュールを入れ、好きな機能を自分でいじれるようにする必要があります。
まずはブートローダのビルドから!
U-BOOTを作る
とはいえ、実際BBBに近いので、ビルド手順も大いに参考になります。
今回はこちらのWebページをほぼほぼそのままなぞる形になりました。
ichiri.biz
ただし、この手順で作っただけでは起動に至りません。
BBBはCapeというモジュールによる拡張やボードの判別をオンボードのEEPROMの領域を用いて行っていますが、この秋月ボードには搭載されていません。
そのため、起動中にその部分で失敗して停止してしまいます。
その部分をスキップする必要があります。
検索していると、ほぼ素の355xのu-bootを動かしている記事が見つかりました。
qiita.com
この記事で利用しているパッチを当てると、そのあたりを適当に回避して起動してくれるようです。もちろん、他の素の355x用のブートローダコードを使うのが正攻法かもしれませんが、とりあえずこれで進んでいきます。
TIのブートローダの仕組みとして、microSDに”MLO”というファイル(u-bootの一部)が書かれていれば、それを読み込んで起動できるらしいです。しかし、SDからのブートは本当にそれだけではなくて書かれているセクタなどが本当は決まっていたりするのであれこれ試すのに切り分けが難しいです。
そのため、せっかくなのでシリアルからのブートにチャレンジしてみました。
上記の手順でu-bootのSPL(1st bootloader)を、"CCCC"の状態のボードにTeraTermを使ってXMODEMで流し込みます。
SPLが立ち上がったら、2nd bootloaderをYMODEMで流し込みます…
すると…
やった。それまで"CCCC"しかしゃべらなかった基板にUIが発生しました。
つまり、ビルドしたu-bootが正しく動いた、ということです。よいよい。
続いて、microSDでの起動も試してみると無事成功しました。
なかなかリッチなU-BOOTで、USBメモリも、オンボードEtherも、USB-Etherも使えるというてんこもり状態です。すばらしい。
ここまで動いたらあと少し。カーネルのビルドを行います。
Linuxはカーネル本体だけでは使い物にならず、シェルなどを含むルートファイルシステムが必要です。
一般的にはDebianとかそういったリッチな環境がありますが、このような組み込み機器では、"busybox"を含む、小規模な環境が使われます。
このルートファイルシステムを作る環境の一つ"buildroot”に私は良く慣れているのでこれを使っていきます。
同様に、こちらのサイトを参考にします。
ichiri.biz
U-BOOTは先ほど成功しているのですが、BBBのイメージ作成ツールとして上記のbuildrootのコンフィグやスクリプトがありますので、これを改変しながら謎基板へ適用していきます。
あれやこれやと改変していき、とりあえずカーネルの起動画面とbuildrootのログイン画面を拝むことができるようになりました。
しかし、まだ足りません。これではBBBのイメージで動かしたときとはあまり変わらないのです。
Wi-SUNボードを使えるようにする
ボードに搭載されている、Wi-SUNモジュールを動かすための調査です。
www.tessera.co.jp
このモジュール、単体買いで一万円もするため、このボードがとってもお得だ、という話があるほどなかなか買いにくいものです。
詳細資料は本体を買ってサイトのIDをもらわないとDLできないのですが、最小限のデータシートはありました。
https://www.tessera.co.jp/Download/MB-RL7023-11_DSS_UM_J1.pdf
マイコンとはTTL UARTで接続してコマンドを送受信します。
マイコン側のドライバを調整し、Wi-SUNのポートから信号が出るようにします。
応答されるはずのコマンドを投げてみますが…無応答です。
調べてみると、どうやらRESETピンがイネーブルされていないようです。
RESETピン、通常はモジュール側でプルアップされているため、解放さえされていればそのまま動くことも多いのですが、今回はしっかりSoCに接続されていてRESET状態になったままのようです。幸い、電源はDC/DCから直結されて常時ONになっているようでした。
RESETピンの接続されているGPIOは53番との情報が出てきたので、このピンをGPIOとしてLinuxから制御できるようにします。(なんか、LEDとして扱うのが便利だよーっていう情報が多いのでそうしてますが、もっと素直にただのGPIOとしてnamingしてもいい気がするんですが…だれかdts直してくれてもいいのよ)
せっかくなので、秋月ボード専用のdtsファイルを作成していきます。
github.com
この修正を行うことで、Linux起動時にデフォルトでHIGHレベルが出力され、WiSUNモジュールが起き上がるはずです。レッツ。
見事、Wi-SUNモジュールと通信ができました。
/dev/ttyS1がWi-SUNモジュールとの通信口です。
これにより、例えば以下のようなサイトを参考に、スマートメータから瞬時電力量を取得するようなプログラムを動かすことができるようになりました!!
netlog.jpn.org
あと先ほどプログラミングマニュアルのDLにはIDが必要、との話でしたが、
どうやらこの手のモジュールには共通コマンドとして実装されているらしく、デバイスが違っても大体同じコマンドで通るらしいので、それで行けそうです。
あといっこ!!携帯電話モジュール
この謎基板を引き付けたものとしてもう一つ、3Gモジュールがあります。
ubloxのSARA-U201というものです。
www.digikey.jp
たしか、もうすぐ3Gが終わってしまうのであまり長く使えるものではないですが、
普通に買うと結構なお値段するものが載っているというのはなかなかありません。
少し前のIoTモジュールなんかにはよく使われていました。
soracom.jp
とどめに、こいつを使えるようにします。
いろいろな情報と経験から、このモジュールはUSBでマイコンと接続され、マイコンからは/dev/ttyXとして見えて、ATコマンドで操作したり、pppで接続できるもの、として間違いありません。
データシートを見ても、そのようになっています。
が、LinuxのコンソールからUSBを見ても、基板上のUSBコネクタとそこにつながった機器しか見えてきません。もしそっち側につながっているとしたら、HUBのチップが挟まるはずですが、そんな感じではありません。Linuxの起動ログでも、USBホストは一つしか認識されていませんでした。
しかし、このAM3352はUSBポートを二つもっていて、一つはホスト専用、もう一つはDual-Role-OTG、つまりホストしても、デバイスとしても動作できるポートを持っています。(動作を変更する際には周辺回路に注意が必要です)
BBBのデバイス設定では、このポートがperipheral (デバイス側)として設定されていました。

これを、dtsで定義しなおして

dr_mode="host" とし、ホストとして動作させてみます。
(dtsもC言語ライクな // や /* */ のコメントアウトが使えます)
すると、起動時のメッセージログが変化し、二つのUSBポートが存在する、という表示が出るようになりました。
…しかし、つながっているはずのモデムのデバイスは見えません。
改めてデータシートを見てみると


VUSB_DETピンにUSB電源の5Vが加われば、自動的にUSBモードになります、と書いてあります。
これかー。じゃぁ、それをやればいいじゃん、となりますが…

この実装だと、VUSB_DETピンがSoCのどこにつながっていくのか、全くわかりません。
SoCがQFPなどの足があるタイプならもう少し楽ですが、これは接点がすべて裏側にあるBGAです。既存のファームウェアが本体に入っていればそれを解析すればわかるのですが、この本体には先ほど書いたように、何もソフトウェアが入っていない状態でした。
…うーん、済まぬ、犠牲になってくれ。
(フォロワーさんから買った基板に加え、通販であと2枚買っているので)
基板から部品を外し、テスターで配線を当たる、という技を使います。
部品を外した基板を手に入れる
一般的に(一般的とは)こういう基板から部品を外すにはヒートガンなどを使うのですが、不幸にも会社のデスクに置いてきてしまいました。ドライヤーでは熱不足です。
とりあえず、ガスコンロの上に粉砕バットではないほうのバットとともに乗せて加熱してみますが…

基板の裏に結構部品があったり、足が出ていたりで基板自体がなかなか加熱されません。うまく熱を伝えるこの辺にあるもの…食塩!
バットに食塩を敷き、その上に基板を置いて加熱します。

これがうまくいき、しばらくするととても嫌なにおいとともにはんだが溶けてきました。
ここで一気に部品を外します。

成功です。


早速パターンを追っていくと、VUSB_DETはUSB用の電源供給IC(裏面のU10 TPS2405)から5Vを供給されていて、そのEnable端子はGPIO50に接続されていることがわかりました。やった!
これをdtsに定義して、Linux側から信号を出してやると…
やった!ttyUSBが現れました!これで携帯モジュールが使えるぞ!!!

ホントに使えるの???
ATコマンドで疎通を試した後、手持ちのYmobileのSIMカードを挿入し、
自分の携帯電話にダイヤルしてみたところ…
着信したwwwwwつながったwwwwwww
モジュール側に音声入力の方法が無いので、無言電話なんですが…
あまり先がないデバイスとはいえ、完全停波までは時間がありますからまだ使えます。
データシートを見ると、普通のATモデムとしてダイヤルアップするほかに、
マイコンからコマンドでTCP,UDPのソケットを開いて通信したりする機能があるようです。へーーーーー。
matoyomi.hatenablog.com
さて、ここまでで、この基板に期待されていたほとんどの機能をよみがえらせることに成功しました。ついでに、基板に搭載されていたLEDを /sys/class/leds経由で点滅できるようにしました。後、ボタンが二つとおそらく気温測定用のサーミスタがADCに接続されているので、これをちょいちょいいじれば完全に使えるようになると思います。
そんな状態のLinux Kernelとbuildroot rootfsを作れるbuildrootのリポジトリがこちらになります。
github.com
buildroot 2022.11ベースにdtsとパッチを取り込んで、defconfigを頑張って設定しただけです。
適当なlinuxの環境でgit clone して cdし、
$ make akiduki_am3352_defconfig
$ make
(小一時間まつ)
するだけで output/images に sdcard.img が出来上がります。
あれこれ細かいファイルができますが、sdcard.imgに全部入ってるので、
これをdd で書くかWin32DiskImagerとかraspi imager とかでSDカードに書くだけで起動SDが出来上がるはずです(はずです…)
bootcmdは今のところ固定です。変更できません。ぐらい。
それ以上細かいことは、この中をいじればできるようになります。
手元ではWSL Ubuntuでビルド成功してます。
ただし、WSLでいきなりやろうとすると、PATHにProgram Filesの空白が入ってて駄目だ、って言われるので、
zenn.dev
この方法でPATHを綺麗にしてからやってください。
なんか気づいたことがあったらgithubの方にください。
buildroot rootに飽きたら、mmcblk0p2のext4にDebianのtarでも上書きしたら、Debianが使えてaptできて便利になると思います。
その辺、追々イメージまで含めてやっていければいいですね。誰かが。(は?)
あと、debianを入れたり、カーネルモジュールとかをちゃんとコンパイルしてDisplayLinkのUSB-VGAなんかを入れれば、ブラウザで秋月のページを表示したりすることもできるようになりますよん(ただしだいぶ重い)
あん?git cloneとかビルドとかわかんない…?
とりあえず、試したいだけの人のための試し用buildrootイメージを置いておきますね。
サービスだよ! SDカードに書くところは頑張ってね!!!
www.dropbox.com
これで、モデムやWi-SUNとの通信、LEDのテストはできます。
(minicom、screenが入ってます)。