ジャンル不定の日記です。

Buildrootをやってみた

Orange pi R1のOSをSPIフラッシュに入る16MB未満で作りたいと考えてるが、
コマンド群をまとめる BusyBox は必要と思われる。BusyBoxならinitとかコンソールもまとめて置き換えられる。
BusyBoxのサイト見てたら、uClibcなるものを知った。glibcを置き換えるものでこれも必須ぽい。
さらに、BusyBoxとuClibcでrootfsを作るというBuildrootというものを知ったのでやってみた。

すごく簡単にu-boot linux rootfsを全部作れちゃう。
アプリが何も入ってないディストリビュージョンみたいな感じ。

$ git clone git://git.buildroot.net/buildroot --depth=1
$ make orangepi_r1_defconfig
$ make menuconfig
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi-
これでSD用のimageが出来上がるんでddで書き込むだけ。

menuconfigではとりあえず、
Toolchain --->
 Enable WCHAR support
System configuration --->
 (0000) Root password
 [*] Install timezone info
Target packages --->
 Networking applications --->
  [*] dnsmasq
  [*] dhcp support
  [*] hostapd
    [*] iptables
  [*] openssh
  [*] pppd
 Text editors and viewers --->
  [*] nano
ここだけいじった。
BusyBoxだけでviもどきが使えると思うが、viは使いこなせないのでnanoを選択したが、nanoにWCHAR supportが必要。
ルーター用なんで dnsmasq hostapd iptables pppd openssh を選択した。
RTL8152Bは標準で入るんでeth1は有効になるがwlan0は出てこないんで8189esは別途ビルドが必要そう。
kernelバージョンは標準で5.3.12だったが変更もできそうな感じ。

SDカード用のイメージは標準で60MBになるが、
/boot 10MB
/ 55MB
くらい?
/の使用済みは13MB強だった。

wlan0 出てきた!

かなり苦戦したが、Orange pi R1 の自ビルドカーネルでwlan0出てきた。
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 02:42:87:c2:e6:34 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.106/24 brd 192.168.2.255 scope global dynamic eth0
       valid_lft 22828sec preferred_lft 22828sec
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether c0:74:2b:ff:da:7b brd ff:ff:ff:ff:ff:ff
4: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 7c:a7:b0:81:a5:6f brd ff:ff:ff:ff:ff:ff

Orange pi R1 のwifiチップは RTL8189FTV なんで最初 https://linux-sunxi.org/Wifi#RTL8189FTV 参考に、
$ git clone https://github.com/jwrdegoede/rtl8189ES_linux.git
$ cd rtl8189ES_linux.git git checkout -B rtl8189fs origin/rtl8189fs
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- KSRC=../linux
とやって8189fs.koを作ったが、8189fsはロードできるのだがwlan0が出てこなかった。
これのビルドの際にはkernelのmenuconfigで作れるがcfg80211が必要。

RTL8189FTVはSDIOデバイスのようなので、SDIO関連のモジュール入れたり、他のRealtekドライバ入れたり試してみたが解決しなかった。
その際にR1の有線LANの片方はRTL8152Bなんでそれも有効にしたんでeth1は出るようになった。

wlan0が出てくるArmbian確認したらKernel 5.4.8でモジュールは8189fsではなく8189esだった。
kernelバージョン近いし手段はありそうだが・・・
5.4.8のカーネルを自ビルドしてArmbianのモジュールを流用しようか・・・

とか考えてたが、
モジュール作成の際にRTL8189FTVモジュールのビルド手順でブランチをmasterからrtl8189fsに切り替えて8189.fsができあがったが、
$ git checkout master
$ make clean
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- KSRC=../linux
としてmasterブランチに切り替えてやり直してみた。
そうすると8189es.koが出来上がる。
これいれたらwlan0でてきた。