石原 博の覚書

電子工作に関する日々の覚書を記載します

Raspberry Pi Picoでfuzix その2

2022-09-17 20:27:21 | 日記

先日はaspberry Pi Picoでfuzixを試してみた。一応動くところまで確認出来たが、せっかくなので環境を整えた。



  1. バックスペース
    なにもしないとcHがバックスペースになっている。通常どおりのバックスペースキーを使用するためには stty erase '^?' とする必要がある。毎回同じことをするのも面倒なので/root/.profileに登録した。これでrootでログオンすると自動的に反映される。/etc/profileは無いようだ。

  2. パスワード
    デフォールトではパスワードは登録されておらず、パスワードなしでログオン出来る。passwdコマンドで設定することが出来る。シャドウパスワードはない。

  3. グループ
    なぜか/etc/groupが無い。FUZIX/Standalone/filesystem-src/etc-filesにあるのだが、
    FUZIX/Kernel/platform-rpipico/update-flash.shでbgetの対象になっていないため、設定されない。update-flash.shを編集しfilesystem.uf2を作り直しても良いし、エディタで/etc/groupを作ってもOK。

  4. ユーザ
    常にrootというのは気持ち良くない。useraddadduserも無いので/etc/passwdを直接編集する。vipwも無いがユーザは一人なのでleveeで良い。/etc/groupも同様に追加すれば良い。(ホームディレクトリは作っておくこと)
    # cat /etc/passwd
    root::0:0::/root:/bin/sh
    ishi::500:500::/home/ishi:/bin/sh
    #cat /etc/group
    root:x:0:
    ishi:x:500:
    


  5. viが使いたい
    ここまでunixに似ていると、ついviと入力しエラーとなる。viクローンのleveeがあるので、ハードリンク。


    #ln levee vi
    

    なお同じくviクローンのvileもあったのでbgetの対象としてみたが、実行してみると「warning: out of memory fork: Out of memory」となり動かなかった。


  6. sdカードを外部記憶としたい
    神楽坂らせんさんのRaspberryPi Pico で UNIX!!を参考に、sdカードに母艦でパーティション(hdb1 2MB, hdb2 16MB)を作る。
    $ sudo fdisk /dev/sdb
    

    その後picoでフォーマット。


    #mkfs /dev/hdb2 32 65535
    ... 略 ...
    Building free list...
    Writing initial inode and superblock...
    Done.
    

    一応これでフォーマットは出来ているが、この後なにかコマンドを実行するとpanic: no free buffersとなり固まる。良くわからないが再起動して続行。


    # mkdir /home
    # mount /dev/sdb2 /home
    

    でマウント出来る。



  7. 起動時にsdカードを自動でマウントしたい
    /etc/fstabを作り、起動時のスクリプトのコメントをはずす(以下の/etc/rcは初期にはfsck -a, mount -aがコメントされている)


    # cat /etc/fstab
    /dev/sdb2 /home fuzix defaults 0 1
    
    # cat /etc/rc
    umask 022
    fsck -a /
    setdate
    remount -n / rw
    prtroot >/etc/mtab
    #Uncomment if you have multiple file systems
    fsck -a
    mount -a
    >/var/run/utmp
    

    ただしマウントしたままリセットすると、起動時にfsckでnot cleanlyと言われる。


    Current time is 19:50:00
    Enter new time: 19:51:00
    /dev/hdb2:
    Filesystem was not cleanly unmounted.
    Device 0 has fsize = 65535 and isize = 32. Continue? y
    Pass 1: Checking inodes...
    Pass 2: Rebuilding free list...
    Rebuild free list? y
    Pass 3: Checking block allocation...
    Pass 4: Checking directory entries...
    Pass 5: Checking link counts...
    -
     ^ ^
     n n   Fuzix 0.3.1
     >@<
          Welcome to Fuzix
     m m
    
    login:
    </code>


  8. swapを設定したい入れたい
    手動でswapon /dev/hdb1 4096とするらしいが、自動で行う方法がわからない。/etc/fstabに登録すれば良いのだろうか。良くわからない。



  9. shutdownしたい
    sdカードをマウントしたまま終了すると起動時にnot cleanlyと言われるので、終了時にはshutdownしたい。ところがrebootコマンドはあるのにshutdownコマンドがない。reboot自身も「reboot: Invalid argument」とエラーが出る。FUZIX/Applications/util/reboot.cを読んでみるとどうもshutdownやhaltをハードリンクする想定のようだ。そこで
    # ln reboot shutdown
    # ln reboot halt
    

    としてみたが、shutdownを実行すると/etc/rc.haltがないと出る。rc.haltはFUZIX/Standalone/filesystem-src/etc-filesにあるのだが、内部でkillallやsubstrootを呼んでいる(どちらもApplications/utilにあるのだが、bgetでコメントアウトされている) コメントをはずしchmod 0755 rc.haltとしてkillallsubstrootを導入してみたが、


    # cat /etc/rc.halt
    killall
    umount -a
    substroot remount % ro
    halt
    
    # shutdown
    Halted.
    halt: Invalid argument
    

    となる。ソースを追いかけても最終 FUZIX/Library/libs/fuzixarmm0/内のアセンブリにぶつかる。そこからsvcをcallしており以降さっぱりわからない。RP2040のアセンブリコードが読めないと駄目か。ただsdカードのアンマウントはするので、not cleanlyは避けることは出来る。




Raspberry Pi Picoでfuzix

2022-09-01 21:44:51 | 日記

先日はMulticomp Cycllne II-C でfuzixを試してみたが、同じfuzixつながりでRaspberry Pi Picoで動かしてみた。 (参考RaspberryPi PicoでUnix!!(FUZIX動いた!))


追試的に同じことをしてみたが全く同じ状態。記事にならってバイナリイメージをダウンロードし書き込むことで起動出来た。



しかしこれではソフトウエアを追加したり出来ない。そこでなぜgithub上の
最新が動かないのか調べてみた。


参考記事ではHow to get started with FUZIX on Raspberry Pi Picoを参照しながら



$ make world -j
$ ./update-flash.sh



としてbuild/fuzix.uf2filesystem.imgを作る手順としている。


記事でも触れられているように、作成されるfilesystem.imgが小さすぎる。
不思議なことにWebで「raspberry pi pico fuzix」で検索すると、ヒットするのがほとんど2021/2頃の記事。


途方にくれてローカルにクローン(git clone https://github.com/davidgiven/FUZIX.git)したソースでupdate-flash.shに絞って過去にさかのぼってみたところ2021/3/1のコミットでmkfsのサイズが大幅に変更されていることが判明。



$ git log -p Kernel/platform-rpipico/update-flash.sh
途中略
commit c934a0dfc78243e805d6364b7f9e74ec519afa4d
Author: David Given dg@cowlark.com
Date: Mon Mar 1 23:15:38 2021 +0100


Add tooling to create an FTL NAND flash root filesystem instead of an SD card
one, and import the tooling to turn it into a flashable UF2 file (I hope).


diff --git a/Kernel/platform-rpipico/update-flash.sh b/Kernel/platform-rpipico/update-flash.sh
index b3ecb0f9..8af3ad72 100755
--- a/Kernel/platform-rpipico/update-flash.sh
+++ b/Kernel/platform-rpipico/update-flash.sh
@@ -6,7 +6,8 @@ set -e
#truncate --size=1450k filesystem.img
#sudo losetup -P /dev/loop0 filesystem.img
#trap 'sudo losetup -d /dev/loop0' EXIT
-../../Standalone/mkfs ${IMG} 256 65535
+rm -f ${IMG}
+../../Standalone/mkfs ${IMG} 32 2794
../../Standalone/ucp ${IMG} <<EOF
cd /
mkdir bin



どうもNAND flashにルートファイルシステムを作り、microSDがなくても動くようにしたようだ。
なので32MBじゃないのか。さらにこのコミットの詳細を調べてみると



$ git show c934a0dfc78
途中略
-You should now end up with build/fuzix.uf2 and filesystem.img. The uf2
-file can be flashed onto the Pico in the usual way (i.e. connect it up as a
+You should now end up with build/fuzix.uf2 and filesystem.uf2. The uf2
+files can be flashed onto the Pico in the usual way (i.e. connect it up as a
mass storage device and copy the file on). Alternatively, you can use OpenOCD



このタイミングでfilesystem.imgではなくfilesystem.uf2になっている。
ちゃんと読んでなかったが確かにREADME.mdに$ make image -jと記載されており、
これを実行するとbuild/fuzix.uf2とfilesystem.uf2が出来た。


しかしRaspberryPi Picoでuf2ファイルを2個書き込む方法がわからない。
(usual wayとなっているが、RaspberryPi Picoではファイルを一つ書き込んだ段階でストレージモードが解除され実行開始されるので一度に2個書けない)


悩みながらfuzix2.uf2とfilesystem.uf2をbootモードにしながら何度となく書いていると
(何度も順に書いたので、どちらを先に書いたの既にわからない)が動き出した。
確かに/dev/ttyACM0に115200baudでつながる。



RaspberryPi Picoを良く知らないので原因がわからず若干のもやもやが残るが、
これでソフトウエアの追加や編集ができそう。