ある晴れた昼下がり こんなツイートを見かけました
【新商品】部品取りに!無線モジュール付きSoc基板+白色プラスチックケース | 1,000円 #秋月電子 https://t.co/XGfEkWo9Qw pic.twitter.com/DNnpWKqidX
— あきそく2.0 (@aki_soku) March 17, 2023
へー。中身…
うおおおおおお、通販ぽちーーーーー!
こんなんかうやろ なんなら今から取りに行きたいわ(いかないけど) https://t.co/dawFBTXHbf pic.twitter.com/D1lpN9w3dK
— ひろみつ (@bakueikozo) March 17, 2023
としてTLを眺めていると…
次々に流れてくる購入報告と開封画像
久しぶりに秋月らしい物が… https://t.co/JB5Yvpu6N2 pic.twitter.com/ty8qciAbqx
— oʕ•̫͡•ʔd (@od_1969) March 17, 2023
…あぁぁぁぁぁぁ!今から買いに行くかぁ…????
そして売り切れ報告…
アキバ在庫切れ https://t.co/a1zBngMI7y
— 脱獄者(2/18退院しました) (@assume_bot) March 17, 2023
えぇぇぇぇぇ???もうみんなUART触ってるのに歯ぎしりしながら明日を待つのか…
電源コネクタは外形 4mm 内径 1.7mm のが一致、いわゆる PSP と同じやつ
— Takumi Sueda (@puhitaku) March 17, 2023
起動すると `C` がずっと出る。オシロでも確認。 pic.twitter.com/2eynGBG2aR
と思った矢先…
フォロワーさんからとんでもない連絡が
どうやら歩いて行けるほど近くに住んでいる模様
慌てて財布握りしめて譲ってもらいに行きました
秋月のSoC基板を歯ぎしりしながら見てたらまさに今日アキバから買って持って帰ってきたフォロワーさんが徒歩圏内に住んでて一枚売ってもらってきたんだけどそんなミラクルある??? pic.twitter.com/7cp65T7R1L
— ひろみつ (@bakueikozo) March 17, 2023
そんなわけで一日早く手に入れたので!早速分解します!
分解して解析する
この手の機器、オンボードフラッシュにファームウェアなりブートローダーが入っているのが常套なので、引っぺがしてROMライターにぶち込みます。
コイツやりやがった pic.twitter.com/XY4uKo5iiM
— ひろみつ (@bakueikozo) March 17, 2023
ところが…中身が全部FF…つまり、空っぽってことです。
まじか…ってことは、起動時に出てたCはSoCがネイティブで吐いている可能性…
あーーーー、XMODEMでのファイル受信待ちか…そっからーーーー???!
しかし、その手順もありますが、そんなに古くないSoCであればネイティブでSDカードからの起動をサポートしている可能性は大いにあります。
データシートを見る前にそれを確認するために、電源投入時のmicroSDスロットの状態を確認してみると…CLK端子に初期化用の波形が出ています。
FLASH剥がしてもmicroSDスロットにクロック出てるのでカード起動ワンチャンあるかも知れない。 pic.twitter.com/hwCw6ooa22
— ひろみつ (@bakueikozo) March 17, 2023
つまり、適切なブートローダをSDカードに書いて挿せば起動する可能性があるということです。
(※過去にファミコンミニをSDカードから起動させたことがあります)
この手の機器で、量産するレベルのものであれば既存のLinuxが対応している可能性は大いにあります。というか、メーカから提供されるSDKがそのままLinuxのツリーだったりするわけで。また、似たような機器の起動イメージがそのまま利用できることもあります。互換品を探すためにSoCの型番と、組み込み用のシステムを組み合わせて検索していると…同系列のAM5338を搭載したBeagleBoneBlack、これはデフォルトでLinuxが使えます。OpenWRTのポーティングもあるということがわかりました。
Beagleboneがam335xでopenwrtのポートがあるっぽい?https://t.co/ekd7W9I71w
— ひろみつ (@bakueikozo) March 17, 2023
また、内蔵eMMCのほか、外部microSDからのLinux起動ができます。しかも私の部品箱に転がっている。これは好都合。さっそく、このイメージを書いて…
既に試してくれていました。おお。少なくともブートローダが呼ばれている。これはもはや勝利は目前。
あっすごい もうここまできてんならいけるやん https://t.co/7kiKVLhKgg
— ひろみつ (@bakueikozo) March 17, 2023
その後あれこれみんなが試して、どうやらBBBのイメージは割とすんなり動いてシェルまで立ち上がる、ということまでサクッと判明してしまいました。
秋月SoC基板まとめ。
— TCE🌍🛰💡🍶📶📼 (@tceoo1) March 20, 2023
・ハードウェア構成がBeaglebone Blackに近いので、Beaglebone Blackのイメージで起動可能
・PMICまわりのドライバが落ちる?問題は/boot/uEnv.txtでロードするdtboを変えて回避
・USB、Ethernetともに問題なく動作。ただし内蔵EthernetはMACアドレスが起動のたびに変わる https://t.co/b44jLe3Hhs
Beaglebone BlackのeMMCフラッシュ手順↓がそのまま使えたhttps://t.co/oTQzR838jGhttps://t.co/Z8OWBta1uK から
— TCE🌍🛰💡🍶📶📼 (@tceoo1) March 20, 2023
"AM3358 Debian 10.3 2020-04-06 4GB eMMC IoT Flasher"のイメージを落としてきてmicroSDに書き込んで起動すると、eMMCがフォーマットされてファイルシステムが書き込まれる。
しかし、これからです。私の主目的はこれに搭載されたWi-SUNと3Gモジュールまで含めて使い倒すこと。多少弄ってみましたが、BBBのイメージのままではそれらをうまく使いこなすことができません。何より、BBBのまま動いているというのが若干気持ち悪いです。そのため、ゼロからファームウェアのビルド手順を確立し、好きなモジュールを入れ、好きな機能を自分でいじれるようにする必要があります。
まずはブートローダのビルドから!
U-BOOTを作る
とはいえ、実際BBBに近いので、ビルド手順も大いに参考になります。
今回はこちらのWebページをほぼほぼそのままなぞる形になりました。
ただし、この手順で作っただけでは起動に至りません。
BBBはCapeというモジュールによる拡張やボードの判別をオンボードのEEPROMの領域を用いて行っていますが、この秋月ボードには搭載されていません。
そのため、起動中にその部分で失敗して停止してしまいます。
その部分をスキップする必要があります。
検索していると、ほぼ素の355xのu-bootを動かしている記事が見つかりました。
この記事で利用しているパッチを当てると、そのあたりを適当に回避して起動してくれるようです。もちろん、他の素の355x用のブートローダコードを使うのが正攻法かもしれませんが、とりあえずこれで進んでいきます。
TIのブートローダの仕組みとして、microSDに”MLO”というファイル(u-bootの一部)が書かれていれば、それを読み込んで起動できるらしいです。しかし、SDからのブートは本当にそれだけではなくて書かれているセクタなどが本当は決まっていたりするのであれこれ試すのに切り分けが難しいです。
そのため、せっかくなのでシリアルからのブートにチャレンジしてみました。
上記の手順でu-bootのSPL(1st bootloader)を、"CCCC"の状態のボードにTeraTermを使ってXMODEMで流し込みます。
SPLが立ち上がったら、2nd bootloaderをYMODEMで流し込みます…
すると…
よっしゃ 秋月SoC基板 自前ビルドのu-bootがシリアル転送から起動したぜ!!! pic.twitter.com/KYVCu7yRyS
— ひろみつ (@bakueikozo) March 18, 2023
やった。それまで"CCCC"しかしゃべらなかった基板にUIが発生しました。
つまり、ビルドしたu-bootが正しく動いた、ということです。よいよい。
続いて、microSDでの起動も試してみると無事成功しました。
microSDからの起動もできた。転がってたカーネルはなぜか起動しないのでこいつに合わせてリビルドしなきゃなのかも知れん。USBストレージもethも上がるのでなんでもできるわ。まあ、何に使うかって話なんだがw
— ひろみつ (@bakueikozo) March 18, 2023
やっぱりwi-sunは使えるようにしたいんだがなぁ pic.twitter.com/eIcilNOgIs
なかなかリッチなU-BOOTで、USBメモリも、オンボードEtherも、USB-Etherも使えるというてんこもり状態です。すばらしい。
ここまで動いたらあと少し。カーネルのビルドを行います。
Linuxはカーネル本体だけでは使い物にならず、シェルなどを含むルートファイルシステムが必要です。
一般的にはDebianとかそういったリッチな環境がありますが、このような組み込み機器では、"busybox"を含む、小規模な環境が使われます。
このルートファイルシステムを作る環境の一つ"buildroot”に私は良く慣れているのでこれを使っていきます。
同様に、こちらのサイトを参考にします。
U-BOOTは先ほど成功しているのですが、BBBのイメージ作成ツールとして上記のbuildrootのコンフィグやスクリプトがありますので、これを改変しながら謎基板へ適用していきます。
dtb添付のuImageで起動できた
— ひろみつ (@bakueikozo) March 19, 2023
fatload mmc 0 0x81000000 uImage.am335x-boneblack;setenv bootargs 'console=ttyS0,115200n8 root=/dev/mmcblk0p2 rw rootfstype=ext4 rootwait earlyprintk loglevel=7';bootm 0x81000000 pic.twitter.com/TSNkvHs9sk
あれやこれやと改変していき、とりあえずカーネルの起動画面とbuildrootのログイン画面を拝むことができるようになりました。
しかし、まだ足りません。これではBBBのイメージで動かしたときとはあまり変わらないのです。
Wi-SUNボードを使えるようにする
ボードに搭載されている、Wi-SUNモジュールを動かすための調査です。
このモジュール、単体買いで一万円もするため、このボードがとってもお得だ、という話があるほどなかなか買いにくいものです。
詳細資料は本体を買ってサイトの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ファイルを作成していきます。
この修正を行うことで、Linux起動時にデフォルトでHIGHレベルが出力され、WiSUNモジュールが起き上がるはずです。レッツ。
RESETが53だというので触ろうとしたらbusy… BBBのDTBだとuser ledに割り当てられてるように見えて触れなくなってるのでBBBlueに入れ替えてusr0 ledにしてhighにしたらようやくRESET解除できてコマンド送受信OKに。やっぱりBBBのまんまだと不便なので削ってちゃんとDTSにしよう。 pic.twitter.com/kkPcPqrxhm
— ひろみつ (@bakueikozo) March 21, 2023
見事、Wi-SUNモジュールと通信ができました。
/dev/ttyS1がWi-SUNモジュールとの通信口です。
これにより、例えば以下のようなサイトを参考に、スマートメータから瞬時電力量を取得するようなプログラムを動かすことができるようになりました!!
あと先ほどプログラミングマニュアルのDLにはIDが必要、との話でしたが、
どうやらこの手のモジュールには共通コマンドとして実装されているらしく、デバイスが違っても大体同じコマンドで通るらしいので、それで行けそうです。
あといっこ!!携帯電話モジュール
この謎基板を引き付けたものとしてもう一つ、3Gモジュールがあります。
ubloxのSARA-U201というものです。
たしか、もうすぐ3Gが終わってしまうのであまり長く使えるものではないですが、
普通に買うと結構なお値段するものが載っているというのはなかなかありません。
少し前のIoTモジュールなんかにはよく使われていました。
とどめに、こいつを使えるようにします。
いろいろな情報と経験から、このモジュールは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カードを挿入し、
自分の携帯電話にダイヤルしてみたところ…
やったおw
— ひろみつ (@bakueikozo) March 22, 2023
秋月の謎SoC基板から無言電話できたおwwwwwwww
(音声I/Fはi2Sしか対応してないのでコーデック基板でも乗せれば音声ものる多分) pic.twitter.com/fWSObINlE6
着信したwwwwwつながったwwwwwww
モジュール側に音声入力の方法が無いので、無言電話なんですが…
あまり先がないデバイスとはいえ、完全停波までは時間がありますからまだ使えます。
データシートを見ると、普通のATモデムとしてダイヤルアップするほかに、
マイコンからコマンドでTCP,UDPのソケットを開いて通信したりする機能があるようです。へーーーーー。
さて、ここまでで、この基板に期待されていたほとんどの機能をよみがえらせることに成功しました。ついでに、基板に搭載されていたLEDを /sys/class/leds経由で点滅できるようにしました。後、ボタンが二つとおそらく気温測定用のサーミスタがADCに接続されているので、これをちょいちょいいじれば完全に使えるようになると思います。
そんな状態のLinux Kernelとbuildroot rootfsを作れるbuildrootのリポジトリがこちらになります。
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の空白が入ってて駄目だ、って言われるので、
この方法でPATHを綺麗にしてからやってください。
なんか気づいたことがあったらgithubの方にください。
buildroot rootに飽きたら、mmcblk0p2のext4にDebianのtarでも上書きしたら、Debianが使えてaptできて便利になると思います。
その辺、追々イメージまで含めてやっていければいいですね。誰かが。(は?)
あと、debianを入れたり、カーネルモジュールとかをちゃんとコンパイルしてDisplayLinkのUSB-VGAなんかを入れれば、ブラウザで秋月のページを表示したりすることもできるようになりますよん(ただしだいぶ重い)
秋月謎ケース付きSoC基板、ついに秋月の商品ページを表示させることに成功
— ひろみつ (@bakueikozo) March 20, 2023
(debian10+USB-VGA+Xorg+chromium) pic.twitter.com/MPBJzCotzD
あん?git cloneとかビルドとかわかんない…?
とりあえず、試したいだけの人のための試し用buildrootイメージを置いておきますね。
サービスだよ! SDカードに書くところは頑張ってね!!!
これで、モデムやWi-SUNとの通信、LEDのテストはできます。
(minicom、screenが入ってます)。