F1C100sは平凡Linuxユーザーが組み込み開発の夢をみれるか？

こんにちは、普段はWeb系エンジニアのuzullaです。[低レベル勉強会](https://lowleveltokyo.connpass.com/)という勉強会で勉強させてもらっています。

これは「[日本Androidの会秋葉原支部ロボット部 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/akbrobot)」のアドベントカレンダー記事で、組み込み、電子工作的な話であり、Webの話はしません。知り合いがWeb系が多いので、知ってる人には冗長な所もあるでしょうがご了承を。

以下は「最初からこれがわかっていたら、自分は楽だったなーというリンク集」です（そうなってしまった）。

## F1C100s/200sが気になっている（1年くらい）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6959/d55e22ec-5373-341b-e69a-b188dbe7e2cf.png)


[F1C100s](http://www.allwinnertech.com/index.php?c=product&a=index&id=73)は[Allwinner社](https://ja.wikipedia.org/wiki/Allwinner)の販売している、(組み込み向け)[Arm(プロセッサ)](https://www.aps-web.jp/academy/ca/234/)がのった[SoC](https://ja.wikipedia.org/wiki/System-on-a-chip)（というかDRAMを考えると[SIP](https://ja.wikipedia.org/wiki/SiP)([例](https://emb.macnica.co.jp/articles/4893/))）です（雑に言えばSoC/SIPというのは一つの「チップ」に色々なチップがはいってシステムになっているチップです）。もともとタブレットやメディアプレイヤー用につくられたもので、歴史あるチップらしいです。

最近だと[ゲームギアミクロ](https://pc.watch.impress.co.jp/docs/topic/review/1281158.html)でつかわれていたり、[Lichee Nano](https://jp.seeedstudio.com/Sipeed-Lichee-Nano-Linux-Development-Board-p-2892.html) というSDカードサイズの開発ボードが出て、ちょっと有名になったかなと思います。

## なぜ気になるのか？

私もみなさんも（？）ガジェットは好きですよね、私も好きです。買うなりしてきましたが、そろそろ作りたくなるのが人情です。

私は昔[電子名札をBuildersconというカンファレンスで配布して](https://uzulla.hateblo.jp/entry/2018/09/11/025414)とても楽しかった、これはラズパイでつくられていたが、原価が高い！あと木工！

それを反省（？）して、電子名札の後には[ESP32](https://akizukidenshi.com/catalog/g/gM-11819/)で[REAL FM](https://hachiojipm.hatenablog.com/#REAL-FM)というものもつくったりした。ビルコンで展示した後、[Tsukuba Mini Maker Faire 2020](https://www.itmedia.co.jp/pcuser/articles/2003/10/news075_6.html)で展示したりしたのだが、やっぱりコストが高いしESP32は開発が（Web系の人間には）面倒くさいな！モダンな言語で書きたい！っていうかLLで書きたい！っていうかPHPをうごかしたい！ファイルシステムをくれ！となり、やっぱりLinuxがほしいなあとなるのは自然。

そんなところ知ったこのチップは、CPU+DRAM(100s:32Mbyte, 200s:64Mbyte)で構成されており、あとはSPI Flash([例](https://www.aitendo.com/product/18872))かSDカードくらいを線で繋げばLinuxが走る（はず）です。実際、[Linuxが動く名刺](https://github.com/thirtythreeforty/businesscard-linux)という前例があり、部品点数がかなり少なく、F1C100s以外のチップは汎用部品で成り立つのがわかります。つまり安く、簡単につくる（基盤から）ことができる（はず）。性能的には、ゲームギアミクロや[ハンドヘルドエミュレーター](https://bittboy.com/products/pocketgo)に使われているのだから、まあなんとか色々できるはず。


っていうかDRAMがちゃんと動くような基盤のパターン引ける気しないんですよね…。ということでSIPのチップを使いたい！[回路図もあるしね！](https://whycan.com/files/members/3/Lichee_nano.pdf)オープンソース最高！[BOMらしきもある！](https://pan.baidu.com/s/1smzuGS9#list/path=%2F%E8%8D%94%E6%9E%9D%E6%B4%BE%2FLichee%20Nano%2FSCH%20%26%20Lib&parentPath=%2F%E8%8D%94%E6%9E%9D%E6%B4%BE)

## 既存SBCをつかえばいいのでは？

さて、LinuxのSBCといえば[Raspberry pi](https://www.raspberrypi.org/products/)です（諸説ある）。ラズパイは本当〜によくできていて、まず安い、国内で簡単に手に入る。しかし本当の凄さはそこではなく、[（Raspbianから名前が変わった）Raspberry Pi OS](https://www.raspberrypi.org/software/operating-systems/)が存在する事だと思います。RPiOSは「最近のカーネルで、完全にドライバーが追従しており、ユーザーランド（パッケージといえばいい？）がちゃんと更新されつづけている」所かなと思います、これは本当にすごい。

（そして、「なぜそれを他社がマネできないのか、『本物』のRPクローンはなぜないのか？」というところに行き着くんですが…あのチップ（BroadcomのBCM2XXX）がでてこないんでしょうが。[ブートローダも非OSSらしいし](https://wiki.debian.org/RaspberryPi)）

しかし、安いといってもばら撒くには高い！[Raspberry pi zero（非 w/wh）](https://raspberry-pi.ksyic.com/main/index/pdp.id/222/pdp.open/222)が600〜700円で、こいつが大量に手に入れば（まだ）安いんですが、教育用ということで数が手に入らない！

RPi以外も、案外「Linuxがうごく『安い』SBC」はあんまりない、悲しい。自作するしかないよね…。

## しかし新しくも古い

さて、ということで(?)F1C100sをつかうとなると苦しいのが環境が「古い」こと。まず、Kernelが古い。「Linux対応」と歌われている開発ボードやチップは、（大抵は）メーカーがどっかのバージョンのLinuxをForkしてドライバを当てて、[BSP](https://www.cybertrust.co.jp/blog/iot/techinfo/point/point-03.html)（そのボードでLinuxを動かすソフト一式）として提供され、そこで終わるようである（継続的なアプデは無い、有償でサポートしている所もある）。(licheepi nanoのbspは[こちら](https://pan.baidu.com/s/1smzuGS9#list/path=%2F%E8%8D%94%E6%9E%9D%E6%B4%BE%2FLichee%20Nano%2Fbsp%20sdk&parentPath=%2F%E8%8D%94%E6%9E%9D%E6%B4%BE) baidoのストレージサービスなのですごくDLがふべん)

たとえば、[F1C100sドキュメント](http://nano.lichee.pro/index.html)上で[公式カーネルは(4.14)](https://github.com/Lichee-Pi/linux/tree/nano-4.14-exp)である。よくよくブランチを掘るとなんと[nano-5.2-flash](https://github.com/Lichee-Pi/linux/tree/nano-5.2-flash)というのもあってやった〜！と思うのだが、そのままでは[USBデバイスを認識できない](https://qiita.com/aselectroworks/items/dc345b1b3fc84ec3b7f1)などあるらしい。このあたりの情報はイマイチ公式にはかいてないので（つらい）[フォーラムなどを念入りに掘る](https://en.bbs.sipeed.com/t/topic/2002)とかしないといけない。

カーネルが古いと、最近のコード（というより、libc周りなのか？）がしれっとうごかなくてつらい。Linuxは[ABI（LSB）](https://ja.wikipedia.org/wiki/Linux_Standard_Base)をすごく守るので（カーネルにかかわらない）古いソフトはうごくが、新しいソフト（ライブラリ）がうごかないこともある。そんで、ドライバもあったりなかったりする。

話を戻すが、つまり（チップメーカー、ボードメーカー）公式の提供はカーネルのバージョンアップに「あんまり」ついてこないので、Linux 5.10がでている今でも、フル機能サポートには4系となる。有志のメンテで本家Mainline統合や追従もあったりしますが（AllWinner系だと[Sunxi](https://linux-sunxi.org/Main_Page)）、まあやっぱり[全部の機能ははいっていない](https://linux-sunxi.org/Linux_mainlining_effort)（たとえばF1C100sは、オーディオもビデオもドロップ？）。

そして（普通の人が指すところのOSである）ディストリビューションも難しい。たとえば、[組み込み向けLinuxディストリビューションは色々](https://elinux.org/Embedded_Linux_Distributions)あり、RPiOSみたいなフルスペック（？）っぽいものでいうと [Armbian](https://www.armbian.com/)とかあるが、[BeagleBoard](http://beagleboard.org/boards)や[Orange Pi](http://www.orangepi.org/)とか[HardKernelのだしているODROID](https://wiki.odroid.com/getting_started/os_installation_guide#operating_systems_we_re_providing)とかの高い板はいいけど、やっぱりF1C100sとかで使えるようなものではない。「インストーラー」は無いし（カスタムして使う）、Distroによってはarmelに対応していなかったり（あるいはもっと細分化していたり）なんだりすることもある。

余談：Armはarm(ここまで[OABI](https://docs.embeddedarm.com/EABI_vs_OABI)),(ここから[EABI](https://docs.embeddedarm.com/EABI_vs_OABI))armel,armhf,AArch64(≒Arm64)とあり…いや[実際のパッケージはもっとバラバラ](https://openwrt.org/docs/techref/instructionset/start)で…まあ詳しくは[Wikipediaみてほしい](https://ja.wikipedia.org/wiki/ARM%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3#%E3%82%B3%E3%82%A2%E3%81%AE%E6%80%A7%E8%83%BD%E3%81%A8%E6%8E%A1%E7%94%A8%E5%AE%9F%E7%B8%BE)が、F1C100sはARM9ファミリーのv5TEJアーキティクチャのARM926EJ-S とかいうコアなので、armelという微妙な（非力な）ゾーンである、余談おわり。

「Linux動く！」というのはまあそうなんだけど、普段PCのLinuxを使っている感覚の「最近のLinuxがちゃんとうごく！インストーラーがある！」みたいなのは期待ができないのであった。

ということで、「最初から提供されているLinuxを諦めて使い続ける」か、「全部自分でビルド」しないといけない

## ビルド

Linux環境があるなら前述の通り、どこからカーネルをもってきて、どういうパッチを宛てるかということをクリアできれば、昨今ビルドは非常に簡単に（…ソースがこわれていなければ）できる。いろんなツールやソースコードをいれないといけない＆ビルドは重い処理なので、おすすめはLinux on Dockerである。というか、公式が[docker imageで一式配布している](https://pan.baidu.com/s/1smzuGS9#list/path=%2F%E8%8D%94%E6%9E%9D%E6%B4%BE%2FLichee%20Nano%2FSDK&parentPath=%2F%E8%8D%94%E6%9E%9D%E6%B4%BE)

`arm-linux-gnueabi`とかでググるとコンパイラはaptではいることがわかるし、普通に`make menuconig`…もしなくてよくて、大抵公式がconfigファイルを提供しているのでそれをコピーして、`make oldconfig`して`make all arch=ARM CROSS_COMPILE=arm-none-eabi-`すればクロスコンパイルができる。このあたりは情報が本当に多いので省略

無事ビルドが通ると`arch/arm/boot/zImage`みたいなのが生成され、[`initramfs`をつくり](https://lyngvaer.no/log/create-linux-initramfs)、[イメージ]をつくって](http://www.vjiot.net/typecho/index.php/archives/53/)m[icroSDに焼くなど](https://linux-sunxi.org/Bootable_SD_card)します。

あ、あとLinuxのローダーとして[u-boot](http://www.denx.de/wiki/U-Boot/)が必要ですね、[公式のforkにブランチあります](https://github.com/Lichee-Pi/u-boot/tree/nano-lcd800480)

## と、いうところで

u-boot, linux kernel, initramfsをビルドし、
QEMUのArmエミュレータで実機レスでテストし、
そこからmicroSDイメージをつくって実機でうごかし、
さらにはOTGコネクタでUSBデバイスこと技適Wifiドングルを認識してTCPIPを…ということをお話したいんです、が。

アドベントカレンダーには締切があるのですまん、次回にさせてくれ！（途中まで進捗しているが、再試し、文字におこせていません、師走ェ…）

そしてユーザーランド（ワールド）を手組（自前ビルド）して、できればOpenWrtやArmbianあたりにのっかってラクラクパッケージ管理したい…。

昔はこういう手組をやってたんで、できるっしょ！って慢心してたんですが、x86環境は本当にイージーモードだったと認識しております。Arm（ブート周りが）なにもかもわからん。

尻切れトンボ（首切れトンボ？）ですみません。

なんとか新しい、Linuxの動く謎ガジェットを設計して世に出したい。今後も頑張っていきます、進捗でたらまた。

## 以下蛇足

## こういうのがF1C100sで実際うごいている、という例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6959/2b63e09a-7bf6-77ed-f03d-728792ed57a3.png)


## 違うCPUもみてはいる

高いから諦め気味だけど、違うCPU（RockChip系）だけど、これくらい（メモリ1GB、4コア）スペックあると楽なんだよな…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6959/4f50641f-b176-8a5b-9cd0-8ccc59a553b0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6959/9708bf9d-c6e4-bb85-5671-e4e55876dca1.png)
最終的には、これくらいつくれるとうれしいですよね。（いまはなき、Pocket CHIP）


しかし謎ガジェットつくってると、こういう中国/韓国/UK系のエミュレータが、「なんでこんな安く作れるんだ？」って気分になりますよね。

異常蛇足でした。