秋月のSoC基板 (白い箱) にDebianを入れる

秋月で1,000円で販売されていた「無線モジュール付きSoC基板＋白色プラスチックケース」でDebian "bullseye" を起動することができたのでメモとして残しておきます。

戦略としては以下の通りです。

1. [honeylabさん](https://honeylab.hatenablog.jp/entry/2023/03/23/152732) の設定を使い、BuildrootでLinuxが起動するSDカードイメージを作成する
2. 作成されたSDカードイメージのrootfsをdebootstrapで作成したDebianのファイル群と置き換える

# BuidrootでLinuxが起動するSDカードイメージを作成する

ほとんど [honeylabさんの記事](https://honeylab.hatenablog.jp/entry/2023/03/23/152732) で紹介されている通りです。
[github.com/bakueikozo/buildroot_am3352_aki](https://github.com/bakueikozo/buildroot_am3352_aki) を利用します。

作業はamd64のUbuntu22.04で実施しています。

```bash
cd ~/
sudo apt -y install build-essential bc libssl-dev unzip ncurses-dev
git clone git@github.com:bakueikozo/buildroot_am3352_aki.git
cd buildroot_am3352_aki
make akiduki_am3352_defconfig
make menuconfig
```

menuconfig では、rootfsのファイルシステムサイズを大きくします。

```
Filesystem images -> exact size -> 1200M
```

これだけではSDカードのイメージサイズが小さいので、 `board/akiduki_am3352/genimage.cfg` を編集し、sizeを 512MB から 1536MB ぐらいに変更しておきます。

```bash
vi board/akiduki_am3352/genimage.cfg
```

もし Debian を利用せずに、Buildroot でできたイメージを使い続けるなら元の記事の説明等を見つつパスワードを設定したりSSHサーバを起動したり、DHCPの設定をするなどしておくと便利です。

もしLinuxカーネルのオプションを変更したい場合は

```bash
make linux-menuconfig
```

を利用してください。


ここまでできたら `make` を実行します。

```bash
make
```

完成すると `output/images/sdcard.img` にSDカードイメージが作成されます。


# Debian に置き換える

## debootstrap で rootfs を作成する

debootstrapコマンドをqemuと一緒にインストールし、実行します。

```bash
cd ~/
sudo apt-get install debootstrap qemu-user-static
sudo qemu-debootstrap --verbose --arch=armhf --variant=buildd bullseye rootfs-debian-armhf http://ftp.jp.debian.org/debian/
```

できたディレクトリに chroot してさらにパッケージのインストールなどを進めます。

```
sudo chroot ./rootfs-debian-armhf /bin/bash
apt update
apt upgrade -y
apt install -y ifupdown iproute2 iputils-ping net-tools dnsutils sudo vim screen tcpdump ca-certificates locales locales-all avahi-daemon kmod fdisk e2fsprogs curl wget openssh-server udev
echo "Asia/Tokyo" > /etc/timezone
cp /usr/share/zoneinfo/Japan /etc/localtime
locale-gen en_US.UTF-8
locale-gen ja_JP.UTF-8
ln -s /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@ttyS0.service
apt clean
```

SSHでログインするためのユーザを作成します。

```bash
adduser debian
usermod -aG sudo debian
```

`/etc/fstab` などを作成します。

```bash
# fstabの作成
cat - << EOS > /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# / was on /dev/vda2 during curtin installation
/dev/mmcblk0p2 / ext4 defaults 0 1
EOS


# ネットワークインターフェースの設定
cat - << EOS > /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
EOS


# ホスト名の設定
echo "akiduki" > /etc/hostname


# hostsファイルの作成
cat - << EOS > /etc/hosts
127.0.0.1 localhost
127.0.1.1 akiduki

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
EOS


# aptのsourceを追加
cat - << EOS > /etc/apt/sources.list
deb http://ftp.jp.debian.org/debian bullseye main

deb http://security.debian.org/ bullseye-security main
deb-src http://security.debian.org/ bullseye-security main
EOS


# leds-gpio カーネルモジュールをロード
echo "leds-gpio" > /etc/modules-load.d/leds-gpio.conf


# Wi-SUNモジュールの安定動作対応
cat - << EOS > /etc/rc.local
#!/bin/sh

echo 0 > /sys/class/leds/wisun_reset/brightness
echo 7 > /sys/class/gpio/export
echo high > /sys/class/gpio/gpio7/direction
echo 1 > /sys/class/leds/wisun_reset/brightness

exit 0
EOS

chmod a+x /etc/rc.local
```

作業が終わったら chroot を抜けます。

```bash
exit
```


## カーネルモジュールを Buildroot から持ってくる
`/sys/class/leds/wisun_reset` を利用したいので、カーネルモジュール一式を持ってきます。
```bash
sudo rsync -av ~/buildroot_am3352_aki/output/target/lib/modules/ ~/rootfs-debian-armhf/lib/modules/
```


## SDカードイメージのrootfsを差し替える

ここからの操作は chroot から抜けた状態で行います。

`losetup` コマンドで作成されるループバックデバイスは `/dev/loop0` とは限らないので、異なる場合は実際に作成されたループバックデバイスファイル名で読み替えてください。

```bash
cp ~/buildroot_am3352_aki/output/images/sdcard.img ~/debian.img
sudo losetup -f ~/debian.img -P --show
sudo mkfs.ext4 -L rootfs -F /dev/loop0p2
sudo mkdir /mnt/rootfs
sudo mount /dev/loop0p2 /mnt/rootfs
sudo rsync -av ~/rootfs-debian-armhf/ /mnt/rootfs/
sudo umount /mnt/rootfs
sync; sync; sync;
sudo losetup -d /dev/loop0
```

これで `~/debian.img` の rootfs がDebianに置き換えられました。

あとはSDに焼いて起動すればOKです。
DHCPでIPが取得されるのでSSHでログインできます。

avahi-daemonをインストールしてあるので、同一ネットワーク上からホスト名で名前解決可能です。

```
ssh debian@akiduki.local
```

# SDカードのパーティションサイズ拡大

パーティションサイズを拡大します。

```bash
sudo fdisk /dev/mmcblk0 <<EOF
p
d
2
n
p
2
32769

p
w
EOF
```

ファイルシステムも拡大します。

```bash
sudo /sbin/resize2fs /dev/mmcblk0p2
```


# Wi-SUN を使ってみる

まずWi-SUNモジュールをリセットします。

```bash
echo "0" | sudo tee /sys/class/leds/wisun_reset/brightness
sleep 1
echo "1" | sudo tee /sys/class/leds/wisun_reset/brightness
```
`/dev/ttyS1` が Wi-SUN モジュールに接続されているシリアルポートなのでボーレート115200で接続します。

```bash
sudo screen /dev/ttyS1 115200
```

動作確認のために `SKINFO` コマンドを実行してみると応答が返ってくるはずです。

```
SKINFO
EINFO FE80:0000:0000:0000:1207:XXXX:FEA8:XXXX 1007XXXXFEA8XXXX 21 FFFF 0 
OK
```