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

OPI R1のAP化ができない・・・

Orange pi R1をSPIフラッシュブートでwifiアクセスポイントにする計画も、MTDでOSの起動ができてもう少しだと思ったが、またハマってる・・・
hostapdでAPは出てくるんだが接続できない状態。

まず hostapd dnsmasq nftablesを全部設定したが、nftablesはパッケージ入れるだけじゃなくてkernelでnftablesを有効にする必要があった。
nftコマンドを使うとNETLINKがないとか言われたので、
[*] Networking support  --->
  Networking options  --->
    <*> NETLINK: socket monitoring interface
NETLINKを有効にした。
それとnftablesはNetfilterってのの機能みたいで、
[*] Networking support  --->
  Networking options  --->
     <*> Netfilter connection tracking support
     <*> Netfilter nf_tables support
       <*>   Netfilter nf_tables masquerade support
       <*>   Netfilter nf_tables nat module
     IP: Netfilter Configuration  --->
       [*] IPv4 nf_tables support
こんな感じで有効にしないとnftコマンドでnatを設定する際にエラーが出るのだが、
Netfilter nf_tables nat moduleが隠れててどこにあるのかわからなかった。
Netfilter nf_tables support を有効にすると IPv4 nf_tables support が出てくる。
さらに Netfilter connection tracking support を有効にすると Netfilter nf_tables nat module が出てくる。
Netfilter nf_tables nat module を有効にすると Netfilter nf_tables masquerade support が出てくる。
て感じで順番に設定しないと項目がない。

まあ、そんなわけなんだがスマホとノートPCで試したが、アクセスポイントは出てくるんだが接続できない。
クライアント側にもサーバー側にもエラー内容が表示されないから困る・・・

dnsmasq と nftables 以前にhostapdで失敗してるぽいんで、DHCPが使えなくなるがdnsmasqとnftablesを切った状態で試してるがわからん。
hostapdの起動時はrfkillがないとか/dev/randomがどうとかメッセージ出るんでそのへん試してるところ。

SPIフラッシュから起動できた

やっとのことで、Orange pi R1をSPIフラッシュから起動できた。
昨日のパーティションパーティション割りで4kB単位で問題ないと思ってたが、erasesizeが64kBになるのでそれを下回るとリードオンリーになっちゃうようなので64kB単位にした。
u-boot、boot.scr、zImage、dtbは一緒のパーティションに入れちゃってもいいかもしれない。

boot.cmd
setenv mtdparts spi0.0:512k(U-Boot),64k(boot.scr),5M(zImage),64k(dtb),7M(ro),-(rw)
if load mmc 0:1 ${fdt_addr_r} /${fdtfile};then
    load mmc 0:1 ${kernel_addr_r} /zImage
    setenv bootargs mtdparts=${mtdparts} root=/dev/mmcblk0p2 init=/init.sh console=ttyS0,115200
    bootz ${kernel_addr_r} - ${fdt_addr_r}
fi
setenv bootargs mtdparts=${mtdparts} root=/dev/mtdblock4 init=/init.sh console=ttyS0,115200
mtd read nor0 ${kernel_addr_r} 0x90000 0x500000
mtd read nor0 ${fdt_addr_r} 0x590000 0x10000
bootz ${kernel_addr_r} - ${fdt_addr_r}
boot.scrはSDブート用とSPIブート用で共通にした。
SDからブートできそうならSDブートになる。
カーネルパラメータのmtdpartsでパーティション情報を渡すと割られる。
spi0.0はlinux上で見えるSPIフラッシュのデバイス名。
オフセットはなしでサイズだけ書いて最後のパーティションのサイズを-にすれば使い切れる。
イメージサイズに合わせて最適化しようかとも思ったがとりあえず固定にした。

mtdpartsをカーネルが受け取るのに、CONFIG_MTD_CMDLINE_PARTS=y でビルドしなおした。受け取れなくて結構ハマった。
上記設定すれば/dev/mtdXは割られるのだが、mountするのに/dev/mtdblockXが必要。
CONFIG_MTD_BLOCK=y を有効にしてビルドすると/dev/mtdblockXが出てきてマウントできるようになる。これまたハマった・・・

昨日やった部分だが
include/configs/sunxi-common.h
#define CONFIG_EXTRA_ENV_SETTINGS \
/*
    CONSOLE_ENV_SETTINGS \
    MEM_LAYOUT_ENV_SETTINGS \
    DFU_ALT_INFO_RAM \
    "fdtfile=" FDTFILE "\0" \
    "console=ttyS0,115200\0" \
    SUNXI_MTDIDS_DEFAULT \
    SUNXI_MTDPARTS_DEFAULT \
    "uuid_gpt_esp=" UUID_GPT_ESP "\0" \
    "uuid_gpt_system=" UUID_GPT_SYSTEM "\0" \
    "partitions=" PARTS_DEFAULT "\0" \
    BOOTCMD_SUNXI_COMPAT \
    BOOTENV
*/\
    MEM_LAYOUT_ENV_SETTINGS \
    "fdtfile=" FDTFILE "\0" \
"load_scr=if load mmc 0:1 $scriptaddr /boot.scr;then echo Found boot.scr in mmc;else mtd read nor0 $scriptaddr 0x80000 0x10000;fi;\0"\
"distro_bootcmd=sf probe;run load_scr;source $scriptaddr;\0"

#else /* ifndef CONFIG_SPL_BUILD */
こんな感じで、自動実行されるdistro_bootcmdでSDかSPIのboot.scrを実行する。

イメージをMTDに書き込む際は全体のイメージをddで作ってSDブートのOSで書き込もうとしたのだが、
flashcpはパーティション単位でしか書き込めない。というか、カーネル起動オプションでMTDを割ると全体のデバイスは出てこなくて割られたデバイスしかなくなるのね。
というわけで、個別に母艦からwgetしてflashcpした。
どっかで、flashcpはデバイスサイズとイメージサイズが一致しないと書き込めないとか見た気がするんだが、そんなことはなかった。サイズはいじらないで書き込めた。

/init.sh
#!/bin/sh
/bin/mount -t proc proc /proc
if [ -e /dev/mmcblk0p3 ];then
  /bin/mount /dev/mmcblk0p3 /mnt/rw
else
  /bin/mount /dev/mtdblock5 /mnt/rw
fi
/bin/mount -o bind /mnt/rw/etc /etc
/bin/mount -o bind /mnt/rw/home /home
exec /sbin/init
/initの前に実行するスクリプトもmmcとspi共通にした。
/がroなSquashfsにして/etcをrwにするために、/etc/inittabを処理する/initは使えないので、先に/etcをマウントする。

また丸1日ハマったが、SD抜いて起動できるようになった。

rwパーティションのイメージは2MBで作ってあるので、
# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root                 6144      6144         0 100% /
devtmpfs                116608         0    116608   0% /dev
/dev/mtdblock5            2011       860      1049  45% /mnt/rw
/dev/mtdblock5            2011       860      1049  45% /etc
/dev/mtdblock5            2011       860      1049  45% /home
tmpfs                   125312         0    125312   0% /dev/shm
tmpfs                   125312        28    125284   0% /tmp
tmpfs                   125312        24    125288   0% /run
こんな感じ。
起動後に拡張するつもりだったが、resize2fsとかpartedとかないし、mkfsもなく、
resize2fsがBuildrootでビルドできなくて、別途ビルドしたのとか別ディストリのresize2fsを持ってきたりしたがエラーになっちゃったんで更にハマった。
mkfsは有効にしてなかったが、mke2fsが初期状態で有効だったんで、一旦コピーしてmke2fsして中身戻した。
# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root                 6144      6144         0 100% /
devtmpfs                116608         0    116608   0% /dev
/dev/mtdblock5            3343       852      2319  27% /mnt/rw
/dev/mtdblock5            3343       852      2319  27% /etc
/dev/mtdblock5            3343       852      2319  27% /home
tmpfs                   125312         0    125312   0% /dev/shm
tmpfs                   125312        28    125284   0% /tmp
tmpfs                   125312        24    125288   0% /run
こんな感じに。
余裕はないけど2.5MBくらい使える。
頑張ればあと2MBくらいは捻出できるかな?

U-Bootのデフォルト環境変数を設定した

Orange pi R1をMTDブートさせたい件で、U-Bootのデフォルト環境変数を設定した。

include/configs/sunxi-common.h の CONFIG_EXTRA_ENV_SETTINGS で設定できる。
#define CONFIG_EXTRA_ENV_SETTINGS \
/*
    CONSOLE_ENV_SETTINGS \
    MEM_LAYOUT_ENV_SETTINGS \
    DFU_ALT_INFO_RAM \
    "fdtfile=" FDTFILE "\0" \
    "console=ttyS0,115200\0" \
    SUNXI_MTDIDS_DEFAULT \
    SUNXI_MTDPARTS_DEFAULT \
    "uuid_gpt_esp=" UUID_GPT_ESP "\0" \
    "uuid_gpt_system=" UUID_GPT_SYSTEM "\0" \
    "partitions=" PARTS_DEFAULT "\0" \
    BOOTCMD_SUNXI_COMPAT \
    BOOTENV
*/\
    MEM_LAYOUT_ENV_SETTINGS \
    "fdtfile=" FDTFILE "\0" \
"load_scr=if load mmc 0:1 $scriptaddr /boot.scr;then echo Found boot.scr in mmc;else mtd read nor0 $scriptaddr 0x80000 0x1000;fi;\0"\
"distro_bootcmd=sf probe;run load_scr;source $scriptaddr;\0"

#else /* ifndef CONFIG_SPL_BUILD */
初期設定はまるごとコメントアウトした。
末尾に空行が入らないといけないのと、途中に改行が入るといけないみたいなのでエスケープに注意。
MEM_LAYOUT_ENV_SETTINGS は無いとscriptaddrとかkernel_addr_rとか使えなくなる。
fdtfileもboot.scrで使うので入れた。

初期設定でビルドするとdistro_bootcmdが自動実行されるのでこれを変えた。
SPIフラッシュを有効にして、load_scrを実行して、スクリプトを処理する。
load_scrは長いんで分けたが、SDの第1パーティションに/boot.scrがあればそれをロード。なければSPIフラッシュからオフセット512kBの4kBをロード。
オフセットの512kBまでにU-Boot本体を入れる。boot.scrは4kB。
搭載フラッシュは256B単位で読めるようなんだが、MTDは4kB単位で使うのが基本ぽい?
てな感じで、SPIフラッシュとSDカードの両方で使える感じにした。
boot.scrも共通で使えるようにしたい。init.shも共通にできるかな。

U-bootでSPIフラッシュ認識した!

Orange pi R1でU-bootでSPIフラッシュを認識しなかった件ですごい苦戦したがやっとできた。

u-bootでspiフラッシュを使おうとすると
=> sf probe
Invalid bus 0 (err=-19)
Failed to initialize SPI flash at 0:0 (error -19).
こんな感じになって数日解決できなかった。

原因は、
arch/arm/dts/sun8i-h2-plus-orangepi-r1.dts
でデバイスの設定がされてるのだが、
&spi0 {
    status = "okay";

    flash@0 {
        compatible = "mxicy,mx25l12805d", "jedec,spi-nor";
    };
};
↑この部分まるごとコメントアウトされてた。
ブロックまるごとコメントアウトとは思わんし、.dtsファイルだからKateのハイライトが効いてなくてコメントに気づかなかった。
これアンコメントしたらdm treeでデバイスが出てきた。

それだけだとsf probeでエラーが出るのは変わらないのだが、
    aliases {
        ethernet1 = &rtl8189etv;
        spi0 = &spi0;
    };
spi0のエイリアスを設定すると利用できるようになる。

=> mtd list
List of MTD devices:
No MTD device found
=> sf probe
SF: Detected mx25l12805d with page size 256 Bytes, erase size 64 KiB, total 16 MiB
=> mtd list
List of MTD devices:
* nor0
  - type: NOR flash
  - block size: 0x10000 bytes
  - min I/O: 0x1 bytes
  - 0x000000000000-0x000001000000 : "nor0"
出てきた。

Orange pi R1 のSPIフラッシュはMacronixみたい

Orange pi R1のOSをSPIフラッシュに入れようとしているが、まずSDのu-bootでmtdコマンドを使ってみることにした。
u-bootのmenuconfigで、
Command line interface  --->
Device access commands  --->
[*] mtd
Filesystem commands  --->
[*] MTD partition support

Device Drivers  --->
[*] SPI Support  --->
MTD Support  --->
[*] Legacy SPI Flash Interface support
[*] Winbond SPI flash support
をチェックして再ビルド。
でmtd認識しない・・・

Armbian使ったときはmtd認識してたんでLinuxの方は使えると思ってたが、確認してみたら無かった。
というわけで、linuxも再ビルド。
menuconfigでWinbondのドライバが見当たらなくて時間かかったが、
<*> Memory Technology Device (MTD) support  --->
<*>   SPI-NOR device support  --->
この2つだけ有効にしたら認識した。
固有のドライバは要らないみたい。

そして、作業中にルーペ+スマホカメラでボードのチップを確認してみたらMXICとか書いてある。
Orange pi R1 のSPIフラッシュはmiZyのとこでWinbondとかって記述があったのでてっきりWinbondと思ってたんだが、
WinbondじゃなくてMacronixみたい・・・

あと、linuxビルドの際に前回ビルドしたときにサウンドとか外して3.7MBに減らしてたが今回4.1MBに増えた。

modules.builtin 確認したらサウンドとか入っちゃってるし・・・
defconfigし直しちゃってたみたいね・・・
逆に要るやつ無くなっちゃってるし再ビルドしなきゃ・・・