NetBSDでUSBシリアル変換IC CH340Kを動かす

秋月電子通商で¥100で買えるUSBシリアルICのCH340KNetBSD 10.99.3でもまだこんな感じで認識してくれなかったけど数行いじったら動くようになったよ、というお話。

ugen0: QinHeng Electronics (0x1a86) USB Serial (0x7522), rev 1.10/2.64, addr 1

動機

  1. 認識しないのは数ヶ月前から認識してたけど最近になってふと気になったので追ってみることにした
  2. CH341/CH340はuchcom(4)で実装されている……あれ?
  3. データシートないかなとメーカーのページに行ったらLinux向けのソースコードがあったけど、ざっと見た感じでは特にCH340K(というよりProductIDが0x7522)固有の処理はなさそう
  4. じゃあuchcom(4)でなんで動かんの、と思ったら0x7522が対象に入ってなかった
  5. もしかしてuchcom(4)に0x7522を追加すれば動くのでは……?

やったこと

まずsys/dev/usb/usbdevsにProductIDが0x7522になるデバイスを追加する。なお手元のはCH340Kだけどどうも他のCH340シリーズも中のチップは同じらしく、そうすると名称はCH340Kで良いものか一瞬悩む。が、そういえばメーカー純正のLinuxドライバコード中でも /* ch340k chip */ だったので気にしないことに。

--- a/sys/dev/usb/usbdevs
+++ b/sys/dev/usb/usbdevs
@@ -2836,6 +2836,7 @@ product QINHENG CH341_EPP 0x5512  CH341 USB-EPP/SSP Bridge
 product QINHENG CH341_ASP      0x5523  CH341 USB-Serial Bridge
 product QINHENG CH341_UPC      0x5584  CH341 USB-Printer Bridge
 product QINHENG CH340          0x7523  CH340 USB-Serial Bridge
+product QINHENG CH340K         0x7522  CH340K USB-Serial Bridge
 product QINHENG2 CH341SER      0x5523  CH341/CH340 USB-Serial Bridge

 /* Qtronix products */

note.com

次にusbdevs.husbdevs_data.h を再構築する。TOOLDIRはbuild.sh時に-Tで指定しているところ。

$ TOOLDIR=../../../../tools/amd64 make -f Makefile.usbdevs

終了するとusbdevs.hUSB_PRODUCT_QINHENG_CH340Kという定義が生えてくる。

#define USB_PRODUCT_QINHENG_CH340K  0x7522     /* CH340K USB-Serial Bridge */

最後にuchcom(4)のデバイステーブルに追加しておしまい。

--- a/sys/dev/usb/uchcom.c
+++ b/sys/dev/usb/uchcom.c
@@ -164,6 +164,7 @@ static const uint32_t rates4x[8] = {
 static const struct usb_devno uchcom_devs[] = {
        { USB_VENDOR_QINHENG2, USB_PRODUCT_QINHENG2_CH341SER },
        { USB_VENDOR_QINHENG, USB_PRODUCT_QINHENG_CH340 },
+       { USB_VENDOR_QINHENG, USB_PRODUCT_QINHENG_CH340K },
        { USB_VENDOR_QINHENG, USB_PRODUCT_QINHENG_CH341_ASP },
 };
 #define uchcom_lookup(v, p)    usb_lookup(uchcom_devs, v, p)

結果

[  8134.473206] uchcom0 at uhub1 port 1
[  8134.473206] uchcom0: QinHeng Electronics (0x1a86) USB Serial (0x7522), rev 1.10/2.64, addr 1
[  8134.483205] ucom0 at uchcom0

うむ。

このCH340KはESP32のライター(自作)に使用しているので、とりあえずESP32と繋いでみたところ起動メッセージは表示されるのでちゃんとUSBシリアルとして動作していそう。なおminicomだとCtrl-A Z からの H(Hang up) をしないと何もでてこないので不具合かと思ったがFT232RLを使用したESP32ライターでも同じ動作だったのでminicomの設定か何かの問題らしい。ちなみにcuだと問題なさそう。

おまけ

FreeBSDは2022年の1月と6月ので対応したのかな。

github.com github.com

電池交換2022

前回交換してからちょうど4年だそうで。時刻表示だけのシンプルなものとはいえずいぶん持つなぁ。

steleto.hatenablog.jp

というわけで新しいSR920SW(270円@ヨドバシカメラ)を調達し、

蓋を工具で開いて

スペーサーを外し

電池を交換して元通りに組み立てて完了。

そういや未だにスマートウォッチならぬスマート懐中時計って見かけないけど実在するのかな。 腕につけるときよりも重量制限が緩くなる上に生体センサ関連が丸々省略できるから技術的には可能な気がする。市場が小さすぎて採算は取れなさそうだけど。

pharo-vm on NetBSD/amd64

Pharo 9のVMNetBSD/amd64でも動かせるようになったのでメモ。

f:id:steleto:20210815201040p:plain

source

リポジトリhttps://github.com/pharo-project/opensmalltalk-vm にあるが、こちらはVMMakerで自動生成されたコードは入っていない。自動生成させるにはpharo-vmが必要なので、「pharo-vmバイナリを作るのにpharo-vmのソースが必要で、pharo-vmのソースを作るのにpharo-vmバイナリが必要で……」という循環参照が発生する。

幸い自動生成されたコードも含めたものが http://files.pharo.org/vm/pharo-spur64-headless/Linux-x86_64/source/ にあるので、こっちから持ってくれば問題ない。ディレクトリ名に「headless」とあるけどcmakeのオプション指定で非headlessにできるので問題なし。

patch

とりあえず動くようにはなったけど、これで正解なのかは知らない。

  • "cmake/<OS>.cmake" を要求するので、とりあえず "cmake/OpenBSD.cmake" を "cmake/NetBSD.cmake" にコピー

  • backtrace(3) を使用しているので libexecinfo が必要になる

--- CMakeLists.txt.orig
+++ CMakeLists.txt
@@ -367,6 +367,7 @@
 check_library_exists(dl dlopen "" HAVE_LIBDL)
 check_library_exists(dyld dlopen "" HAVE_DYLD)
 check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
+check_library_exists(execinfo backtrace "" HAVE_EXECINFO)
 
 #Required by the UUID Plugin
 
@@ -451,6 +452,10 @@
 add_executable(${VM_EXECUTABLE_NAME} ${VM_FRONTEND_APPLICATION_TYPE} ${VM_FRONTEND_SOURCES})
 addLibraryWithRPATH(${VM_LIBRARY_NAME} ${VM_SOURCES})
 
+if(${HAVE_EXECINFO})
+   target_link_libraries(${VM_LIBRARY_NAME} execinfo)
+endif()
+
 #
 # LibFFI
 #
  • uuidgen(2) を使用する(同時に libuuid の uuid_generate との衝突を回避)
    • もともと uuidgen(2) を使用するコードがあったのでなるべくそちらを使うように頑張ったけど、やっぱり面倒だったので libuuid の uuid_generate に統一しても良いんじゃないかと思った次第。
--- CMakeLists.txt.orig
+++ CMakeLists.txt
@@ -374,6 +374,6 @@
 check_include_files(uuid/uuid.h HAVE_UUID_UUID_H)
 check_include_files(uuid.h HAVE_UUID_H)
-check_library_exists(uuid uuidgen "" HAVE_UUIDGEN)
+check_function_exists(uuidgen HAVE_UUIDGEN)
 check_library_exists(uuid uuid_generate "" HAVE_UUID_GENERATE)
 
 
--- plugins.cmake.orig
+++ plugins.cmake
@@ -77,7 +77,7 @@
     addLibraryWithRPATH(UUIDPlugin ${UUIDPlugin_SOURCES})
     if(WIN)
         target_link_libraries(UUIDPlugin PRIVATE "-lole32")
-    elseif(UNIX AND NOT OSX)
+    elseif(UNIX AND NOT OSX AND HAVE_UUID_GENENATE)
        #find_path(LIB_UUID_INCLUDE_DIR uuid.h PATH_SUFFIXES uuid)
         find_library(LIB_UUID_LIBRARY uuid)
         message(STATUS "Using uuid library:" ${LIB_UUID_LIBRARY})
  • uuidgen(2) は native byte-order なので、 uuid_generate に合わせて big endian に強制する
    • やっぱり uuid_generate に統一したほうが楽そう
--- plugins/UUIDPlugin/common/UUIDPlugin.c.orig
+++ plugins/UUIDPlugin/common/UUIDPlugin.c
@@ -41,6 +41,9 @@
 
    #if defined(HAVE_UUIDGEN)
      uuidgen(&uuid, 1);
+     uuid.time_low = htobe32(uuid.time_low);
+     uuid.time_mid = htobe16(uuid.time_mid);
+     uuid.time_hi_and_version = htobe16(uuid.time_hi_and_version);
    #else
      uuid_generate(uuid);
    #endif
  • clone(2) と名前が衝突したので、とりあえず sqclone へ変更
--- generated/64/vm/src/gcc3x-cointerp.c.orig
+++ generated/64/vm/src/gcc3x-cointerp.c
@@ -1068,7 +1068,7 @@
 extern sqInt classUnsafeAlien(void);
 static void clearLeakMapAndMapAccessibleFreeSpace(void);
 static sqInt NoDbgRegParms cloneInOldSpaceforPinning(sqInt objOop, sqInt forPinning);
-extern sqInt clone(sqInt objOop);
+extern sqInt sqclone(sqInt objOop);
 extern sqInt compactClassIndexOf(sqInt objOop);
 static sqInt NoDbgRegParms copyObjtoAddrstopAtsavedFirstFieldsindex(sqInt objOop, sqInt segAddr, sqInt endSeg, sqInt savedFirstFields, sqInt i);
 extern void countMarkedAndUnmarkdObjects(sqInt printFlags);
@@ -46834,7 +46834,7 @@
 
    /* SpurMemoryManager>>#clone: */
 sqInt
-clone(sqInt objOop)
+sqclone(sqInt objOop)
 {   DECL_MAYBE_SQ_GLOBAL_STRUCT
     sqInt classIndex;
     sqInt classIndex1;
@@ -54408,14 +54408,14 @@
 
    clone1 = (((longAt(obj1)) & (classIndexMask())) == ClassMethodContextCompactIndex
        ? cloneContext(obj1)
-      : clone(obj1));
+       : sqclone(obj1));
    if (!(clone1)) {
        error("Not enough space to copy the objects in two-way become. This should have been detected before");
        return;
    }
    clone2 = (((longAt(obj2)) & (classIndexMask())) == ClassMethodContextCompactIndex
        ? cloneContext(obj2)
-      : clone(obj2));
+       : sqclone(obj2));
    if (!(clone2)) {
        error("Not enough space to copy the objects in two-way become. This should have been detected before");
        return;
@@ -75835,7 +75835,7 @@
        else {
            if ((GIV(argumentCount) == 0)
             || (!(((longAt(rcvr)) & ((classIndexMask()) - (isForwardedObjectClassIndexPun()))) == 0))) {
-              newCopy = clone(rcvr);
+               newCopy = sqclone(rcvr);
            }
            else {
                newCopy = 0;
  • クラッシュレポートの NetBSD/amd64 対応(クラッシュさせたことがないので合っているか不明)
--- src/debugUnix.c.orig
+++ src/debugUnix.c
@@ -16,6 +16,12 @@
 
 #endif
 
+#if __NetBSD__
+
+#include <ucontext.h>
+
+#endif
+
 
 #ifdef HAVE_EXECINFO_H
 # include <execinfo.h>
@@ -250,6 +256,20 @@
            regs->mc_edi, regs->mc_edi, regs->mc_ebp, regs->mc_esp,
            regs->mc_eip);
    return regs->mc_eip;
+#elif __NetBSD__ && __x86_64__
+   __greg_t *regs = &uap->uc_mcontext.__gregs;
+   fprintf(output,
+           "\trax 0x%08llx rbx 0x%08llx rcx 0x%08llx rdx 0x%08llx\n"
+           "\trdi 0x%08llx rsi 0x%08llx rbp 0x%08llx rsp 0x%08llx\n"
+           "\tr8  0x%08llx r9  0x%08llx r10 0x%08llx r11 0x%08llx\n"
+           "\tr12 0x%08llx r13 0x%08llx r14 0x%08llx r15 0x%08llx\n"
+           "\trip 0x%08llx\n",
+           regs[_REG_RAX], regs[_REG_RBX], regs[_REG_RCX], regs[_REG_RDX],
+           regs[_REG_RDI], regs[_REG_RSI], regs[_REG_RBP], regs[_REG_RSP],
+           regs[_REG_R8 ], regs[_REG_R9 ], regs[_REG_R10], regs[_REG_R11],
+           regs[_REG_R12], regs[_REG_R13], regs[_REG_R14], regs[_REG_R15],
+           regs[_REG_RIP]);
+   return (void *)regs[_REG_RIP];
 #elif __linux__ && __x86_64__
    greg_t *regs = uap->uc_mcontext.gregs;
    fprintf(output,
@@ -409,6 +429,9 @@
 # elif __FreeBSD__ && __i386__
            void *fp = (void *)(uap ? uap->uc_mcontext.mc_ebp: 0);
            void *sp = (void *)(uap ? uap->uc_mcontext.mc_esp: 0);
+#elif __NetBSD__
+           void *fp = (void *)(uap ? _UC_MACHINE_FP(uap) : 0);
+           void *sp = (void *)(uap ? _UC_MACHINE_SP(uap) : 0);
 # elif __OpenBSD__
            void *fp = (void *)(uap ? uap->sc_rbp: 0);
            void *sp = (void *)(uap ? uap->sc_rsp: 0);
  • 起動スクリプトで LD_LIBRAY_PATHに @pkglibdir@ (後で /usr/pkg/lib に置換)を追加
--- packaging/linux/bin/launch.sh.in.orig
+++ packaging/linux/bin/launch.sh.in
@@ -18,8 +18,8 @@
 *) PLUGINS="`pwd`/$BIN"
 esac
 
-if [ $(uname -s) = "OpenBSD" ]; then
-  LD_LIBRARY_PATH="$PLUGINS:${LD_LIBRARY_PATH}" exec $GDB "$BIN/@VM_EXECUTABLE_NAME@" "$@"
+if [ $(uname -s) = "OpenBSD" -o $(uname -s) = "NetBSD" ]; then
+  LD_LIBRARY_PATH="$PLUGINS:@pkglibdir@:${LD_LIBRARY_PATH}" exec $GDB "$BIN/@VM_EXECUTABLE_NAME@" "$@"
 fi
 
 # On some linuxes there multiple versions of the C library.  If the image uses

cmake option

  • -DFLAVOUR=CoInterpreter: デフォルト値と同じだけどJenkinsfileが指定してたので。
  • -DALWAYS_INTERACTIVE=1: 非headlessなVMが必要な場合に指定する。これもJenkinsfileで指定されていたので。
  • -DGENERATE_SOURCES=OFF: ソースの自動生成を行わなくする。
  • -DPHARO_BIN_LOCATION=${PREFIX}/lib/pharo 起動スクリプトがここで指定されたバイナリを実行する。

after build

build/vm/* がバイナリとライブラリ、 build/packaging/linux/bin/pharo が起動スクリプトなので適当に回収する。

なお build/vm/pharoJITで動く関係か paxctl -m で PaX MPROTECT を解除しておく必要がる。

NetBSDから Brother DCP-J963N で印刷する

家で使用している Brother DCP-J963N はドライバのソースが非公開で gimp-printのようなオープンなドライバも無かったので、印刷する時は毎回Windowsを起動させていたのだが、どうやらAirPrintに対応しているのでCUPSから動かせるらしいと聞いて試してみたらうまくいったのでメモ。

参考文献

qiita.com

Debian + CUPS + avahi で Brother DCP-J973N を動作させている例。最初はこちらの通りに進めてみたけど印刷時に「見つかりません」になってしまったのであきらめた。

blog.onodera.asia

NetBSD + CUPS + mdnsd で EPSON EW-M752T。実はこっちを見て mdnsd(8) の存在を知ったりする。

CUPSの起動

いつものpkgsrcからインストール。

  1. cd pkgsrc/print/cups して make package-install
  2. cp /usr/pkg/share/examples/rc.d/cups /etc/rc.d
  3. /etc/rc.conf に "cupsd=YES" を追加
  4. service cupsd start (/etc/rc.d/cupsd start と一緒だけど service(8) なるものがいつの間にか増えてたので使ってみた)

手元の環境だと cups-browsed は最終的に無くても認識できたけど、キャッシュが残っていた可能性もあるので本当に必要ないかどうかは不明。

mdnsdのインストール

  1. /etc/nsswitch.conf の "hosts:" の末尾に "mdnsd" を追加
  2. /etc/rc.conf に "mdnsd=YES" を追加
  3. service mdnsd start
  4. プリンタの電源を入れた状態で ippfind と入力して何か出たらOK(今回は ”ipp://BRW40B89A423C96.local:631/ipp/print” と出た)

この1.の nssswitch.conf の追加をしないとCUPSで名前の取得まではできるけども、印刷してみると「見つかりません」で印刷できないという状態になった。 それから net/avahi は無くても良いらしい。

CUPSの設定

  1. Firefoxで "http://localhost:631" にアクセス
  2. 「管理」 → 「新しいプリンターの検索」
  3. しばらく待つと「Brother DCP-J963N (Brother DCP-J963N)」という全く同じ項目が2つ出る
    • プロトコルが異なるようで、上が「dnssd://Brother%20DCP-J963N.ipp.tcp.local./?uuid=(略)」、下が「lpd://BRW40B89A423C96/BINARY_P1」だった
  4. どっちが良いのかわからなかったのでとりあえず上(dnssd)を選択して進める
  5. 名前とかもそのまま
  6. メーカーは「Generic → Generic IPP Everywhere Printer (en)」
  7. デフォルトオプションの設定は無変更で「デフォルトオプションの設定」ボタンを押して完了

テスト印刷

CUPSから「テストページの印刷」をやったら印刷はできたものの左右両端の線が出なかった(印刷可能範囲を越えたかな?)が、その辺は次に印刷が必要になったときに考えよう(ぉぃ

Raspberry Pi 2B(v1.1)でカメラを試す

NetBSDRaspberry Piのカメラ使えるのかなーと手元に余ってたRaspberry Pi 2B(v1.1)でちょっと試してみた。

カメラの撮影で使われる raspistill などはpkgsrcの misc/raspberrypi-userland で用意されているようなので、まずはこれをインストールする。microSDのスペックにも依存しそうだが、手持ちの環境でMAKE_JOBS=3でビルドさせると大体10時間くらいかかる模様。なおswapなしでMAKE_JOBS=5で走らせるとcmakeのところでメモリ不足になって死ぬので注意。

で、インストールまで行ってもそのままでは raspistill の実行に失敗する。色々調べたところ vcgencmd (これも misc/raspberrypi-userland に含まれている)でカメラの状態を確認できるらしいが、実行してみるとどうもカメラサポートが無効になっているとのこと。

armv7# vcgencmd get_camera
supported=0 detected=0

じゃあどうやってカメラサポート有効にするのかとまた色々探し回ったところ、 /boot/config.txt に以下の2行を追加すれば良いらしい。

gpu_mem=128
start_x=1

前者は名前からなんとなくわかるとして、後者のstart_x=1って何? と調べたら、通常の起動時では start.elf と fixup.dat を参照するところで start_x.elf と fixup_x.dat を参照させるようにするコマンドとのこと。なるほど、ところで/bootにそんなファイルないぞ?

ということで今度はファームのバイナリを探し回って、おそらくコイツのbootの下にあるやつだろうと見当をつける。念のため start.elf などと同じリビジョン(今回は0c01dbefba4)をチェックアウトして start_x.elf と fixup_x.dat を/boot配下へコピー。リビジョンは src/external/broadcom/rpi-firmware/dist/start.elf のログを参照。

github.com

こんな作業が必要なあたり「……もしかして誰もカメラ動かした人いないんじゃね?」みたいな予感がしてくる。とりあえず見なかったことにしてファイルを/bootにコピーし、/boot/config.txt を書き換えたら再起動して再びvcgencmdでカメラ状態をチェック。

armv7# vcgencmd get_camera
supported=1 detected=1

無事にサポートOKになったし検出もできてる。では準備も整ったのでいよいよ raspistill を実行。

armv7# raspistill -o hoge.jpg

[ 122.1222268] uvm_fault(0x80b30a08, 6c533000, 2) -> e
[ 122.1222268] Fatal kernel mode data abort: 'Translation Fault (S)'
[ 122.1329515] trapframe: 0xb8e15de0
[ 122.1329515] FSR=00002805, FAR=6c533c80, spsr=00030013
[ 122.1426852] r0 =6c533c80, r1 =00000380, r2 =00000040, r3 =00000010
[ 122.1426852] r4 =80abb480, r5 =6c533c90, r6 =00000370, r7 =3395fc90
[ 122.1571841] r8 =913df940, r9 =00000370, r10=00000002, r11=b8e15e64
[ 122.1633485] r12=0000003f, ssp=b8e15e30, slr=8009a92c, pc =80097290

Stopped in pid 0.206 (system) at        netbsd:armv7_dcache_inv_range+0x28:
mcr     p15, 0, r0, c7, c6, 1
db{0}>

カーネル落ちた…… (´・ω・`)

RaspberryPi4 + ZFS で bonnie++ ベンチ

最初に結論:

  • NetBSDZFSは少なくともベンチマークを回せる程度の安定性はある
  • さすがに raidframe RAID1 と比較すると速度もCPU負荷も分が悪い
  • そもそも測定方法もいいかげんなのでぶっちゃけ話のネタ以上の意味はない

Raspberry Pi 4 と USB HDD 2台で raidframe による RAID1 と、最近になって更新された ZFS で mirror を組んだときのベンチマークを測ってみた。比較用に1台の場合も。

  • Raspberry Piは小型のヒートシンクを着けただけなので、測定中のどこかの段階で発熱によるクロックダウンが起きていると思われる。
  • コマンドは "bonnie++ -d <mount先> -b -u root"。
  • 測定が早すぎると "+++++" という結果になる。解決には例えば "-n 256:1024:1024:16" のようにオプションで調整するように紹介しているところが多いが、実際に試したら一日経っても終わらなかったので諦めた。
  • パーティションはGPTで作成。1台のとRAID1はどちらもUFS2+log。
  • USB-HDD変換はAOTECH ADK-HDCASE25BKA千石電商2号店(本店の右)でワゴン売りしてたもの。最近は見かけなくなった電源供給用のUSBプラグが生えており、Raspebrry Piで不安だった電源供給能力を回避できて実に都合が良かったりする。
  • HDDは東芝 MQ04ABF100。なんかバッファー容量でけぇな?と思っていたが、おそらくSMR(シングル磁気記憶方式)による書き込み性能悪化をフォローするためなんじゃないかという気がする。つまりベンチマークのような非現実的な書き込み負荷をかけるものとすこぶる相性が悪い。
singleraidrame RAID1ZFS mirror
Sequencial OutputPer Characterspeed 17 K/sec23 K/sec7 K/sec
CPU 99 %99 %99 %
Latency 527 ms360 ms1,161 ms
Blockspeed 44,554 K/sec47,822 K/sec39,870 K/sec
CPU 93 %92 %89 %
Latency 3,286 ms1,991 ms57,757 us
Rewritespeed 17,823 K/sec13,193 K/sec27,813 K/sec
CPU 70 %44 %83 %
Latency 3,337 ms7,757 ms872 ms
Sequencial InputPer Characterspeed 149 K/sec132 K/sec21 K/sec
CPU 96 %85 %99 %
Latency 810 ms3,408 ms469 ms
Blockspeed 96,631 K/sec88,545 K/sec87,687 K/sec
CPU 69 %66 %95 %
Latency 182 ms185 ms158 ms
Random Seeksspeed 123.2 /sec121.4 /sec99.4 /sec
CPU 22 %22 %21 %
Latency 348 ms486 ms550 ms
Sequencial CreateCreatespeed 2 /sec296 /sec62 /sec
CPU 0 %57 %4 %
Latency 596 ms43,634 us201 ms
Readspeed +++++ /sec+++++ /sec9,824 /sec
CPU +++ %+++ %98 %
Latency 84 us81 us16,000 us
Deletespeed 2 /sec784 /sec56 /sec
CPU 0 %21 %5 %
Latency 640 ms22,506 us300 ms
Random CreateCreatespeed 35 /sec295 /sec61 /sec
CPU 8 %56 %4 %
Latency 491 ms49,918 us285 ms
Readspeed +++++ /sec+++++ /sec10,041 /sec
CPU +++ %+++ %97 %
Latency 51 us72 us14,300 us
Deletespeed 37 /sec525 /sec46 /sec
CPU 5 %46 %4 %
Latency 279 ms71,794 us329 ms

RaspberryPi4にNetBSD/aarch64を試す (2)

昨日動かねーって書いたら早速情報を頂きました。ありがとうございます。

ということで rpi4-acpi.tgzをFATパーティション(うちの環境だと/dev/sd1e)に展開。てっきり中身はカーネルイメージかと思っていたんだけど、中身はこれだけだった。

  • overlays/miniuart-bt.btbo
  • RPI_EFI.fd
  • bcm2711-rpi-4-b.dtb
  • config.txt

これカーネルイメージだったらuserlandも同じバージョンのものを用意しないとなー、と思っていたんだけども、どうやらそのままで良さそうなので昨日ダウンロードしてきた9.99.46の上にぶちまけて電源投入。…あれカーネル起動までの挙動が違う?と思ったらUEFIかなこれ? そして無事にmicroSDを/dev/ld0で認識(ついでにUSBも)してログインまで到達。わーい。

>> NetBSD/evbarm efiboot (arm64), Revision 1.13 (Mon Feb 10 03:23:29 UTC 2020)
Press return to boot now, any other key for boot prompt
booting netbsd - starting in 0 seconds.
6200256+2685688+3049488+1514744 [587306+732024+515925]=0x101b010
[   1.0000000] Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
[   1.0000000]     2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017,
[   1.0000000]     2018, 2019, 2020 The NetBSD Foundation, Inc.  All rights reserved.
[   1.0000000] Copyright (c) 1982, 1986, 1989, 1991, 1993
[   1.0000000]     The Regents of the University of California.  All rights reserved.

[   1.0000000] NetBSD 9.99.46 (GENERIC64) #0: Mon Feb 10 03:23:29 UTC 2020
[   1.0000000]  mkrepro@mkrepro.NetBSD.org:/usr/src/sys/arch/evbarm/compile/GENERIC64
[   1.0000000] total memory = 3932 MB
[   1.0000000] avail memory = 3799 MB
[   1.0000000] pool redzone disabled for 'buf4k'
[   1.0000000] pool redzone disabled for 'buf64k'
[   1.0000000] armfdt0 (root)
[   1.0000000] simplebus0 at armfdt0: Sony UK Raspberry Pi 4 Model B
[   1.0000000] simplebus1 at simplebus0
[   1.0000000] acpifdt0 at simplebus0
[   1.0000000] acpifdt0: using EFI runtime services for RTC
[   1.0000000] ACPI: RSDP 0x0000000037320014 000024 (v02 MCRSFT)
[   1.0000000] ACPI: XSDT 0x00000000373100E8 00005C (v01 MCRSFT RPI4EDK2 02000820      01000013)
[   1.0000000] ACPI: FACP 0x0000000037260000 00010C (v05 MCRSFT RPI4EDK2 02000820 RPI4 00000097)
[   1.0000000] ACPI: DSDT 0x0000000037210000 001788 (v05 MSFT   EDK2     00000002 INTL 20181213)
[   1.0000000] ACPI: CSRT 0x0000000037280000 000169 (v00 MCRSFT RPI4EDK2 02000820 RPI4 00000097)
[   1.0000000] ACPI: DBG2 0x0000000037270000 00005C (v00 MCRSFT RPI4EDK2 02000820 RPI4 00000097)
[   1.0000000] ACPI: GTDT 0x0000000037250000 000060 (v02 MCRSFT RPI4EDK2 02000820 RPI4 00000097)
[   1.0000000] ACPI: APIC 0x0000000037240000 000174 (v03 MCRSFT RPI4EDK2 02000820 RPI4 00000097)
[   1.0000000] ACPI: MCFG 0x0000000037230000 00003C (v01 MCRSFT RPI4EDK2 02000820 RPI4 00000097)
[   1.0000000] ACPI: SPCR 0x0000000037220000 000050 (v02 MCRSFT RPI4EDK2 02000820 RPI4 00000097)
[   1.0000000] ACPI: 1 ACPI AML tables successfully acquired and loaded
[   1.0000000] acpi0 at acpifdt0: Intel ACPICA 20191213
[   1.0000000] cpu0 at acpi0: Cortex-A72 r0p3 (Cortex V8-A core)
[   1.0000000] cpu0: package 0, core 0, smt 0
[   1.0000000] cpu0: IC enabled, DC enabled, EL0/EL1 stack Alignment check enabled
[   1.0000000] cpu0: Cache Writeback Granule 16B, Exclusives Reservation Granule 16B
[   1.0000000] cpu0: Dcache line 64, Icache line 64
[   1.0000000] cpu0: L1 48KB/64B 3-way read-allocate PIPT Instruction cache
[   1.0000000] cpu0: L1 32KB/64B 2-way write-back read-allocate write-allocate PIPT Data cache
[   1.0000000] cpu0: L2 1024KB/64B 16-way write-back read-allocate write-allocate PIPT Unified cache
[   1.0000000] cpu0: revID=0x0, PMCv3, 4k table, 64k table, 16bit ASID
[   1.0000000] cpu0: auxID=0x10000, FP, CRC32, NEON, rounding, NaN propagation, denormals, 32x64bitRegs, Fused Multiply-Add
[   1.0000000] cpu1 at acpi0: Cortex-A72 r0p3 (Cortex V8-A core)
[   1.0000000] cpu1: package 0, core 1, smt 0
[   1.0000000] cpu2 at acpi0: Cortex-A72 r0p3 (Cortex V8-A core)
[   1.0000000] cpu2: package 0, core 2, smt 0
[   1.0000000] cpu3 at acpi0: Cortex-A72 r0p3 (Cortex V8-A core)
[   1.0000000] cpu3: package 0, core 3, smt 0
[   1.0000000] gic0 at acpi0: GIC
[   1.0000000] armgic0 at gic0: Generic Interrupt Controller, 256 sources (247 valid)
[   1.0000000] armgic0: 16 Priorities, 224 SPIs, 7 PPIs, 16 SGIs
[   1.0000000] gtmr0 at acpi0: irq 27
[   1.0000000] armgtmr0 at gtmr0: Generic Timer (54000 kHz, virtual)
[   1.0000070] PEPD (BCM2854) at acpi0 not configured
[   1.0000070] xhci0 at acpi0 (XHC0, 11063483-0): mem 0x600000000-0x600000fff irq 175
[   1.0000070] usb0 at xhci0: USB revision 3.0
[   1.0000070] usb1 at xhci0: USB revision 2.0
[   1.0000070] USB0 (BCM2848) at acpi0 not configured
[   1.0000070] bcmmbox0 at acpi0 (RPIQ, BCM2849-0): mem 0xfe00b880-0xfe00b8a3 irq 65
[   1.0000070] vcmbox0 at bcmmbox0
[   1.0000070] VCIQ (BCM2835) at acpi0 not configured
[   1.0000070] VCSM (BCM2856) at acpi0 not configured
[   1.0000070] GPI0 (BCM2845) at acpi0 not configured
[   1.0000070] I2C1 (BCM2841) at acpi0 not configured
[   1.0000070] I2C2 (BCM2841) at acpi0 not configured
[   1.0000070] SPI0 (BCM2838) at acpi0 not configured
[   1.0000070] SPI1 (BCM2839) at acpi0 not configured
[   1.0000070] plcom0 at acpi0 (URT0, BCM2837-4): mem 0xfe201000-0xfe201fff irq 153
[   1.0000070] plcom0: txfifo disabled
[   1.0000070] plcom0: console
[   1.0000070] URTM (BCM2836) at acpi0 not configured
[   1.0000070] BTH0 (BCM2EA6) at acpi0 not configured
[   1.0000070] RHPX (MSFT8000) at acpi0 not configured
[   1.0000070] sdhc0 at acpi0 (SDC1, BCM2847-0): mem 0xfe300000-0xfe3000ff irq 158
[   1.0000070] SDC2 (BCM2855) at acpi0 not configured
[   1.0000070] sdhc0: SDHC 3.0, rev 153, PIO, 250000 kHz, HS 3.3V, re-tuning mode 1, 1024 byte blocks
[   1.0000070] sdmmc0 at sdhc0 slot 0
[   1.0000070] cpu1: IC enabled, DC enabled, EL0/EL1 stack Alignment check enabled
[   1.0000070] cpu1: Cache Writeback Granule 16B, Exclusives Reservation Granule 16B
[   1.1425640] cpu1: Dcache line 64, Icache line 64
[   1.1425640] cpu1: L1 48KB/64B 3-way read-allocate PIPT Instruction cache
[   1.1525598] cpu1: L1 32KB/64B 2-way write-back read-allocate write-allocate PIPT Data cache
[   1.1625609] cpu1: L2 1024KB/64B 16-way write-back read-allocate write-allocate PIPT Unified cache
[   1.1725606] cpu1: revID=0x0, PMCv3, 4k table, 64k table, 16bit ASID
[   1.1725606] cpu1: auxID=0x10000, FP, CRC32, NEON, rounding, NaN propagation, denormals, 32x64bitRegs, Fused Multiply-Add
[   1.1925616] cpu3: IC enabled, DC enabled, EL0/EL1 stack Alignment check enabled
[   1.1925616] cpu3: Cache Writeback Granule 16B, Exclusives Reservation Granule 16B
[   1.2025633] cpu3: Dcache line 64, Icache line 64
[   1.2025633] cpu3: L1 48KB/64B 3-way read-allocate PIPT Instruction cache
[   1.2125629] cpu3: L1 32KB/64B 2-way write-back read-allocate write-allocate PIPT Data cache
[   1.2225636] cpu3: L2 1024KB/64B 16-way write-back read-allocate write-allocate PIPT Unified cache
[   1.2325636] cpu3: revID=0x0, PMCv3, 4k table, 64k table, 16bit ASID
[   1.2325636] cpu3: auxID=0x10000, FP, CRC32, NEON, rounding, NaN propagation, denormals, 32x64bitRegs, Fused Multiply-Add
[   1.2525648] cpu2: IC enabled, DC enabled, EL0/EL1 stack Alignment check enabled
[   1.2525648] cpu2: Cache Writeback Granule 16B, Exclusives Reservation Granule 16B
[   1.2625663] cpu2: Dcache line 64, Icache line 64
[   1.2625663] cpu2: L1 48KB/64B 3-way read-allocate PIPT Instruction cache
[   1.2725660] cpu2: L1 32KB/64B 2-way write-back read-allocate write-allocate PIPT Data cache
[   1.2825670] cpu2: L2 1024KB/64B 16-way write-back read-allocate write-allocate PIPT Unified cache
[   1.2925670] cpu2: revID=0x0, PMCv3, 4k table, 64k table, 16bit ASID
[   1.3025680] cpu2: auxID=0x10000, FP, CRC32, NEON, rounding, NaN propagation, denormals, 32x64bitRegs, Fused Multiply-Add
[   1.3125681] cpu0: PMU interrupting on irq 48
[   1.3125681] cpu1: PMU interrupting on irq 49
[   1.3125681] cpu2: PMU interrupting on irq 50
[   1.3125681] cpu3: PMU interrupting on irq 51
[   1.3125681] uhub0 at usb0: NetBSD (0000) xHCI root hub (0000), class 9/0, rev 3.00/1.00, addr 0
[   1.3398059] uhub1 at usb1: NetBSD (0000) xHCI root hub (0000), class 9/0, rev 2.00/1.00, addr 0
[   1.4898097] sdmmc0: SD card status: 4-bit, C10, U1, A1
[   1.4998097] ld0 at sdmmc0: <0x02:0x544d:SA32G:0x50:0x28c11dbe:0x12c>
[   1.4998097] ld0: 29544 MB, 7503 cyl, 128 head, 63 sec, 512 bytes/sect x 60506112 sectors
[   1.5163645] ld0: 4-bit width, High-Speed/SDR25, 50.000 MHz
[   2.9711459] uhub2 at uhub1 port 1: vendor 2109 (0x2109) USB2.0 Hub (0x3431), class 9/0, rev 2.10/4.20, addr 1
[   2.9826380] uhub2: single transaction translator
[   3.3211594] boot device: ld0
[   3.3211594] root on ld0a dumps on ld0b
[   3.3311597] root file system type: ffs
[   3.3411609] kern.module.path=/stand/evbarm/9.99.46/modules
[   3.3411609] WARNING: clock lost 40 days
[   3.3531083] WARNING: using filesystem time
[   3.3571838] WARNING: CHECK AND RESET THE DATE!
Mon Feb 10 07:48:25 UTC 2020
Starting root file system check:
/dev/rld0a: file system is clean; not checking
fdisk: Cannot determine the number of heads
Not resizing /: already correct size
Starting file system checks:
/dev/rld0e: 124 files, 54282 free (54282 clusters)
random_seed: /var/db/entropy-file: Not present
Setting tty flags.
Setting sysctl variables:
ddb.onpanic: 1 -> 0
Starting network.
Hostname: arm64
IPv6 mode: host
Configuring network interfaces:.
Adding interface aliases:.
Waiting for DAD to complete for statically configured addresses...
Starting dhcpcd.
no valid interfaces found
Starting mdnsd.
mDNSResponder: mDNSResponder (Engineering Build) starting
mDNSResponder: Unable to parse DNS server list. Unicast DNS-SD unavailable
mDNSResponder: mDNSPlatformSourceAddrForDest: connect 1.1.1.1 failed errno 49 (Can't assign requested address)
Building databases: dev, utmp, utmpx, services.
Starting syslogd.
Feb 10 07:48:30 arm64 mDNSResponder: mDNSPlatformSendUDP got error 49 (Can't assign requested address) sending packet to 224.0.0.251 on interface 127.0.0.11
Mounting all file systems...
Clearing temporary files.
Updating fontconfig cache: done.
Checking quotas: done.
Setting securelevel: kern.securelevel: 0 -> 1
Starting virecover.
Starting devpubd.
Starting local daemons:.
Updating motd.
Starting ntpd.
ssh-keygen: 1024 SHA256:JfZlqlKMsSSUEZM1LMQ3TWRWOfUqURaueAhu/FT0TGA root@arm64 (DSA)
ssh-keygen: 521 SHA256:td5L5p5hgp4kuBi4Oid7PoCf7WetoTCqxDU2RXr4rw8 root@arm64 (ECDSA)
ssh-keygen: 256 SHA256:/1qwo0nQT+1hbHa8QEC4VzvnqOWk2RiHIdPVOHwX/sk root@arm64 (ED25519)
Feb 10 07:49:00 arm64 syslogd[183]: last message repeated 4 times
ssh-keygen: 3072 SHA256:PA1KOUFEmnjGYwK4kM+JE/L4B21ZbMToeRa8c23A5es root@arm64 (RSA)
Starting sshd.
postfix: rebuilding /etc/mail/aliases (missing /etc/mail/aliases.db)
Starting postfix.
Starting inetd.
Starting cron.
Mon Feb 10 07:49:08 UTC 2020

NetBSD/evbarm (arm64) (constty)

login: