こんにちは、普段はWeb系エンジニアのuzullaです。低レベル勉強会という勉強会で勉強させてもらっています。
これは「日本Androidの会秋葉原支部ロボット部 Advent Calendar 2020」のアドベントカレンダー記事で、組み込み、電子工作的な話であり、Webの話はしません。知り合いがWeb系が多いので、知ってる人には冗長な所もあるでしょうがご了承を。
以下は「最初からこれがわかっていたら、自分は楽だったなーというリンク集」です(そうなってしまった)。
F1C100s/200sが気になっている(1年くらい)
F1C100sはAllwinner社の販売している、(組み込み向け)Arm(プロセッサ)がのったSoC(というかDRAMを考えるとSIP(例))です(雑に言えばSoC/SIPというのは一つの「チップ」に色々なチップがはいってシステムになっているチップです)。もともとタブレットやメディアプレイヤー用につくられたもので、歴史あるチップらしいです。
最近だとゲームギアミクロでつかわれていたり、Lichee Nano というSDカードサイズの開発ボードが出て、ちょっと有名になったかなと思います。
なぜ気になるのか?
私もみなさんも(?)ガジェットは好きですよね、私も好きです。買うなりしてきましたが、そろそろ作りたくなるのが人情です。
私は昔電子名札をBuildersconというカンファレンスで配布してとても楽しかった、これはラズパイでつくられていたが、原価が高い!あと木工!
それを反省(?)して、電子名札の後にはESP32でREAL FMというものもつくったりした。ビルコンで展示した後、Tsukuba Mini Maker Faire 2020で展示したりしたのだが、やっぱりコストが高いしESP32は開発が(Web系の人間には)面倒くさいな!モダンな言語で書きたい!っていうかLLで書きたい!っていうかPHPをうごかしたい!ファイルシステムをくれ!となり、やっぱりLinuxがほしいなあとなるのは自然。
そんなところ知ったこのチップは、CPU+DRAM(100s:32Mbyte, 200s:64Mbyte)で構成されており、あとはSPI Flash(例)かSDカードくらいを線で繋げばLinuxが走る(はず)です。実際、Linuxが動く名刺という前例があり、部品点数がかなり少なく、F1C100s以外のチップは汎用部品で成り立つのがわかります。つまり安く、簡単につくる(基盤から)ことができる(はず)。性能的には、ゲームギアミクロやハンドヘルドエミュレーターに使われているのだから、まあなんとか色々できるはず。
っていうかDRAMがちゃんと動くような基盤のパターン引ける気しないんですよね…。ということでSIPのチップを使いたい!回路図もあるしね!オープンソース最高!BOMらしきもある!
既存SBCをつかえばいいのでは?
さて、LinuxのSBCといえばRaspberry piです(諸説ある)。ラズパイは本当〜によくできていて、まず安い、国内で簡単に手に入る。しかし本当の凄さはそこではなく、(Raspbianから名前が変わった)Raspberry Pi OSが存在する事だと思います。RPiOSは「最近のカーネルで、完全にドライバーが追従しており、ユーザーランド(パッケージといえばいい?)がちゃんと更新されつづけている」所かなと思います、これは本当にすごい。
(そして、「なぜそれを他社がマネできないのか、『本物』のRPクローンはなぜないのか?」というところに行き着くんですが…あのチップ(BroadcomのBCM2XXX)がでてこないんでしょうが。ブートローダも非OSSらしいし)
しかし、安いといってもばら撒くには高い!Raspberry pi zero(非 w/wh)が600〜700円で、こいつが大量に手に入れば(まだ)安いんですが、教育用ということで数が手に入らない!
RPi以外も、案外「Linuxがうごく『安い』SBC」はあんまりない、悲しい。自作するしかないよね…。
しかし新しくも古い
さて、ということで(?)F1C100sをつかうとなると苦しいのが環境が「古い」こと。まず、Kernelが古い。「Linux対応」と歌われている開発ボードやチップは、(大抵は)メーカーがどっかのバージョンのLinuxをForkしてドライバを当てて、BSP(そのボードでLinuxを動かすソフト一式)として提供され、そこで終わるようである(継続的なアプデは無い、有償でサポートしている所もある)。(licheepi nanoのbspはこちら baidoのストレージサービスなのですごくDLがふべん)
たとえば、F1C100sドキュメント上で公式カーネルは(4.14)である。よくよくブランチを掘るとなんとnano-5.2-flashというのもあってやった〜!と思うのだが、そのままではUSBデバイスを認識できないなどあるらしい。このあたりの情報はイマイチ公式にはかいてないので(つらい)フォーラムなどを念入りに掘るとかしないといけない。
カーネルが古いと、最近のコード(というより、libc周りなのか?)がしれっとうごかなくてつらい。LinuxはABI(LSB)をすごく守るので(カーネルにかかわらない)古いソフトはうごくが、新しいソフト(ライブラリ)がうごかないこともある。そんで、ドライバもあったりなかったりする。
話を戻すが、つまり(チップメーカー、ボードメーカー)公式の提供はカーネルのバージョンアップに「あんまり」ついてこないので、Linux 5.10がでている今でも、フル機能サポートには4系となる。有志のメンテで本家Mainline統合や追従もあったりしますが(AllWinner系だとSunxi)、まあやっぱり全部の機能ははいっていない(たとえばF1C100sは、オーディオもビデオもドロップ?)。
そして(普通の人が指すところのOSである)ディストリビューションも難しい。たとえば、組み込み向けLinuxディストリビューションは色々あり、RPiOSみたいなフルスペック(?)っぽいものでいうと Armbianとかあるが、BeagleBoardやOrange PiとかHardKernelのだしているODROIDとかの高い板はいいけど、やっぱりF1C100sとかで使えるようなものではない。「インストーラー」は無いし(カスタムして使う)、Distroによってはarmelに対応していなかったり(あるいはもっと細分化していたり)なんだりすることもある。
余談:Armはarm(ここまでOABI),(ここからEABI)armel,armhf,AArch64(≒Arm64)とあり…いや実際のパッケージはもっとバラバラで…まあ詳しくはWikipediaみてほしいが、F1C100sはARM9ファミリーのv5TEJアーキティクチャのARM926EJ-S とかいうコアなので、armelという微妙な(非力な)ゾーンである、余談おわり。
「Linux動く!」というのはまあそうなんだけど、普段PCのLinuxを使っている感覚の「最近のLinuxがちゃんとうごく!インストーラーがある!」みたいなのは期待ができないのであった。
ということで、「最初から提供されているLinuxを諦めて使い続ける」か、「全部自分でビルド」しないといけない
ビルド
Linux環境があるなら前述の通り、どこからカーネルをもってきて、どういうパッチを宛てるかということをクリアできれば、昨今ビルドは非常に簡単に(…ソースがこわれていなければ)できる。いろんなツールやソースコードをいれないといけない&ビルドは重い処理なので、おすすめはLinux on Dockerである。というか、公式がdocker imageで一式配布している
arm-linux-gnueabi
とかでググるとコンパイラはaptではいることがわかるし、普通にmake menuconig
…もしなくてよくて、大抵公式がconfigファイルを提供しているのでそれをコピーして、make oldconfig
してmake all arch=ARM CROSS_COMPILE=arm-none-eabi-
すればクロスコンパイルができる。このあたりは情報が本当に多いので省略
無事ビルドが通るとarch/arm/boot/zImage
みたいなのが生成され、initramfs
をつくり、[イメージ]をつくって](http://www.vjiot.net/typecho/index.php/archives/53/)m[icroSDに焼くなど](https://linux-sunxi.org/Bootable_SD_card)します。
あ、あとLinuxのローダーとしてu-bootが必要ですね、公式のforkにブランチあります
と、いうところで
u-boot, linux kernel, initramfsをビルドし、
QEMUのArmエミュレータで実機レスでテストし、
そこからmicroSDイメージをつくって実機でうごかし、
さらにはOTGコネクタでUSBデバイスこと技適Wifiドングルを認識してTCPIPを…ということをお話したいんです、が。
アドベントカレンダーには締切があるのですまん、次回にさせてくれ!(途中まで進捗しているが、再試し、文字におこせていません、師走ェ…)
そしてユーザーランド(ワールド)を手組(自前ビルド)して、できればOpenWrtやArmbianあたりにのっかってラクラクパッケージ管理したい…。
昔はこういう手組をやってたんで、できるっしょ!って慢心してたんですが、x86環境は本当にイージーモードだったと認識しております。Arm(ブート周りが)なにもかもわからん。
尻切れトンボ(首切れトンボ?)ですみません。
なんとか新しい、Linuxの動く謎ガジェットを設計して世に出したい。今後も頑張っていきます、進捗でたらまた。
以下蛇足
こういうのがF1C100sで実際うごいている、という例
違うCPUもみてはいる
高いから諦め気味だけど、違うCPU(RockChip系)だけど、これくらい(メモリ1GB、4コア)スペックあると楽なんだよな…
最終的には、これくらいつくれるとうれしいですよね。(いまはなき、Pocket CHIP)
しかし謎ガジェットつくってると、こういう中国/韓国/UK系のエミュレータが、「なんでこんな安く作れるんだ?」って気分になりますよね。
異常蛇足でした。