この記事は、NetBSD Advent Calendar 2017のすっかり遅くなった13日目の記事です。
はじめに
最近、NetBSD/armでは、fdt(4)に対応するのが進んでいる。 fdtとはFlattened Device Treeの略で、dtbファイルを用意しておけば、 各機種ごとにカーネルを用意しなくても、NetBSD/i386やNetBSD/amd64における GENERICカーネルのようなものを用意できるもののようだ。
fdt(4)に対応すると、カーネルのブートメッセージがどのように変化するか 自分で確認しておきたかったので、今回試してみた。
今回使用した機種は、Cubieboard2というAllwinner A20というSoCを搭載した ものです。これはsun7iという名前で呼ばれているアーキテクチャーである。 これは、SATAでHDDやSSDを接続できるため、pkgsrc/www/firefoxをビルド するのに使用していた。 今は、pkgsrc/lang/rustがNetBSD/armではビルドできないので お休み中である、
fdt(4)
に対応する前のCUBIEBOARDカーネルのカーネルのブートメッセージは、
えびはらさんが
https://github.com/ebijun/NetBSD/blob/master/allwinner/dmesgに
掲載してくれている。
どのカーネルを使用すれば良いか
GENERICカーネル的なものを作成できると書いたが、 現状ではAllwinnerのsun?iアーキテクチャーのSoCを使った機種は、 SUNXIカーネルを使うことになっているようだ。
ディスクイメージファイルを生成する
Cubieboard2に対しては、NetBSD/evbearmv7hf-elが リトルエンディアンでは最適なアーキテクチャーだと考えられる。
NetBSD-currentのソースコードが/usr/src
に、
X window systemのソースコードが/usr/xsrc
に
それぞれ配置されているとすると、
以下のようにして、ディスクイメージファイルの生成まで一括して
実行することができる。
$ cd /usr/src
$ ./build.sh -U -O /usr/world/8.99/evbearmv7hf-el/obj \
-T /usr/world/8.99/evbearmv7hf-el/tools \
-D /usr/world/8.99/evbearmv7hf-el/destdir \
-R /usr/world/8.99/evbearmv7hf-el/release -x -j 5 -m evbearmv7hf-el release
私は、NetBSD/arm64 8.0_BETAの環境で実行したが、POSIXにある程度準拠した環境で
あれば、どこでも同じようにビルドできるはずである。
私の環境では、ほぼ2時間で完了した。
以上のように実行すると、/usr/world/8.99/evbearmv7hf-el/release/evbarm/binary/gzimg/armv7.img.gz
のように、gzip
で圧縮されたディスクイメージファイルが作成される。
ディスクイメージファイルをmicroSDカードに書き込む
Cubieboard2には、microSDカードを挿入できるようになっている。
以下のようにして、dynabook R73/PS上のNetBSD/amd64でmicroSDカードに書き込んだ。
dynabook R73/PSには、SDカードスロットがあり、そこに挿入された
SDカードは、ld(4)
デバイスとして認識されるが、
USB接続のメモリーカードリーダー/ライターであれば、
sd(4)
になるだろう。
NetBSD/amd64かNetBSD/i386でなければ、書き込み先は/dev/rld0d
のようにd
ではないかもしれない。
$ gzcat armv7.img.gz| sudo dd of=/dev/rld0d bs=1m
ここでは、pkgsrc/security/sudoを使ってみた。
ディスクにu-bootブートローダーのプログラムを書き込む
Cuboeboard2でのブートはu-bootを使う。 Cubieboard用のu-bootのバイナリーは、以下のようにしてpkgsrcの枠組みの中で 作成することができる。
$ cd /usr/pkgsrc/sysutils/u-boot-cubieboard2
$ make install
これで、/usr/pkg/share/u-boot/cubieboard2/u-boot-sunxi-with-spl.bin
にCubieboard2用のu-bootイメージを得ることができた。
以下のようにして書き込む。
# dd if=/usr/pkg/share/u-boot/cubieboard2/u-boot-sunxi-with-spl.bin of=/dev/rld0d bs=1k seek=8 conv=sync
HDMI接続でブートメッセージが見えるようにする
Cubieboard2は、HDMIでディスプレイを接続し、X window systemも使用できるが、
armv7img
ディスクイメージファイルでSUNXIカーネルの対応する環境には、
シリアルコンソールしかない機種もある。
そのためか、armv7.img
ディスクイメージファイルでは、
Cubieboard2であってもシリアルコンソールを使用するようになっている。
そこで、HDMI接続されたディスプレイにカーネルのブートメッセージを表示し、
操作できるように設定しておくことにする。
まずは、u-bootのブートコマンドを書き換え、バイナリーを再生成する。 ここでは、NetBSD/amd64の環境で実行するとする。
# mount_msdos /dev/ld0a /mnt
$ cd /mnt
$ vi boot.cmd (赤字の部分を追加する)
if test "${soc}" = "sunxi" ; then
setenv kernel netbsd-SUNXI.ub
setenv bootargs root=ld0a console=fb
setenv mmcpart 0:1
setenv use_fdt 1
fi
if test "${soc}" = "tegra" ; then
setenv kernel netbsd-TEGRA.ub
setenv bootargs root=ld1a
setenv mmcpart 1:1
setenv use_fdt 1
fi
if test "${board}" = "am335x" ; then
setenv kernel netbsd-BEAGLEBONE.ub
setenv mmcpart 0:1
setenv bootargs root=ld0a
fi
if test "${kernel}" = "" ; then
echo '>>>'
echo '>>> Target device is not supported by this script.'
echo '>>>'
exit
fi
if test "${use_fdt}" = "1" ; then
fatload mmc ${mmcpart} ${kernel_addr_r} ${kernel}
fatload mmc ${mmcpart} ${fdt_addr_r} ${fdtfile}
fdt addr ${fdt_addr_r}
bootm ${kernel_addr_r} - ${fdt_addr_r}
else
fatload mmc ${mmcpart} ${kernel_addr_r} ${kernel}
bootm ${kernel_addr_r} ${bootargs}
fi
$ mkubootimage -A arm -C none -O linux -T script -a 0 -n "NetBSD sunxi boot" boot.cmd boot.scr
$ cd ~
# umount /mnt
これで準備は完了した。
起動してカーネルのブートメッセージを確認する
後は、microSDカードをCubieboard2に挿入して、HDMIケーブルとUSBキーボードを つなぎ、電源をつなげば起動する。
初回は、microSDカードいっぱいまで使用可能領域を伸長させる処理があるので、 何もできない。 自動的に再起動した後にログインできる。 この時点では、ユーザーIDはroot、パスワードは設定なしでログインできる。 以下のようなカーネルのブートメッセージが表示できた。 いたる所にfdtと入っている。
Copyright (c) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017
The NetBSD Foundation, Inc. All rights reserved.
Copyright (c) 1982, 1986, 1989, 1991, 1993
The Regents of the University of California. All rights reserved.
NetBSD 8.99.9 (SUNXI) #0: Sat Dec 16 00:35:22 JST 2017
ryoon@datesquare:/usr/world/8.99/evbearmv7hf-el/obj/sys/arch/evbarm/compile/SUNXI
total memory = 1016 MB
avail memory = 998 MB
timecounter: Timecounters tick every 10.000 msec
armfdt0 (root)
fdt0 at armfdt0: Cubietech Cubieboard2
fdt1 at fdt0
fdt2 at fdt0
fdt3 at fdt0
cpus0 at fdt0
cpu0 at cpus0: Cortex-A7 r0p4 (Cortex V7A core)
cpu0: DC enabled IC enabled WB disabled EABT branch prediction enabled
cpu0: 32KB/32B 2-way L1 VIPT Instruction cache
cpu0: 32KB/64B 4-way write-back-locking-C L1 PIPT Data cache
cpu0: 256KB/64B 8-way write-through L2 PIPT Unified cache
vfp0 at cpu0: NEON MPE (VFP 3.0+), rounding, NaN propagation, denormals
cpufreqdt0 at cpu0
cpu1 at cpus0
gic0 at fdt1: GIC
armgic0 at gic0: Generic Interrupt Controller, 160 sources (150 valid)
armgic0: 16 Priorities, 128 SPIs, 7 PPIs, 15 SGIs
fclock0 at fdt2: 25000000 Hz fixed clock
fclock1 at fdt2: 125000000 Hz fixed clock
fclock2 at fdt2: 24000000 Hz fixed clock
fclock3 at fdt2: 32768 Hz fixed clock
gtmr0 at fdt0: Generic Timer
gtmr0: interrupting on GIC irq 27
armgtmr0 at gtmr0: ARMv7 Generic 64-bit Timer (24000 kHz)
timecounter: Timecounter "armgtmr0" frequency 24000000 Hz quality 500
sun4ia10ccu0 at fdt1: A20 CCU
sunxigmacclk0 at fdt2: GMAC MII/RGMII clock mux
sunxigpio0 at fdt1: PIO
gpio0 at sunxigpio0: 175 pins
sunxigpio0: interrupting on GIC irq 60
sunxisramc0 at fdt1: SRAM Controller
sunxisramc0: area: SRAM A3/A4
sunxisramc0: area: SRAM D
fregulator0 at fdt0: vcc3v3
fregulator1 at fdt0: usb1-vbus
fregulator2 at fdt0: usb2-vbus
fregulator3 at fdt0: ahci-5v
fregulator4 at fdt0: vcc3v0
fregulator5 at fdt0: vcc5v0
sunxisid0 at fdt1: Security ID EFUSE
sunxiusbphy0 at fdt1: USB PHY
sunxitwi0 at fdt1: Marvell TWSI controller
sunxitwi0: interrupting on GIC irq 39
iic0 at sunxitwi0: I2C bus
axp20x0 at iic0 addr 0x34: AC used
axp20x0: DCDC2 1400mV
axp20x0: DCDC3 1250mV
axp20x0: LDO2 3000mV, LDO4 3300mV
axp20x0: LDO3 2800mV
axp20xreg0 at axp20x0: dcdc2 (vdd-cpu)
axp20xreg1 at axp20x0: dcdc3 (vdd-int-dll)
sunxits0 at fdt1: Touch Screen Controller
sunxits0: interrupting on GIC irq 61
/soc@1c00000/display-frontend@1e00000 at fdt1 not configured
/soc@1c00000/display-frontend@1e20000 at fdt1 not configured
sun4idma0 at fdt1: DMA controller
sun4idma0: interrupting on GIC irq 59
/soc@1c00000/display-backend@1e60000 at fdt1 not configured
/soc@1c00000/display-backend@1e40000 at fdt1 not configured
/soc@1c00000/hdmi@1c16000 at fdt1 not configured
/soc@1c00000/lcd-controller@1c0c000 at fdt1 not configured
/soc@1c00000/lcd-controller@1c0d000 at fdt1 not configured
/hdmi-connector at fdt0 not configured
/soc@1c00000/interrupt-controller@1c00030 at fdt1 not configured
awge0 at fdt1: GMAC
awge0: interrupting on GIC irq 117
awge0: Ethernet address: 02:0d:0b:82:26:14
rlphy0 at awge0 phy 1: RTL8201L 10/100 media interface, rev. 1
rlphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
psci0 at fdt0: PSCI 0.1
/pmu at fdt0 not configured
/display-engine at fdt0 not configured
gpioleds0 at fdt0: cubieboard2:blue:usr cubieboard2:green:usr
sunximmc0 at fdt1: SD/MMC controller
sunximmc0: interrupting on GIC irq 64
motg0 at fdt1: 'otg' mode not supported
ehci0 at fdt1: EHCI
ehci0: interrupting on GIC irq 71
ehci0: EHCI version 1.0
ehci0: 1 companion controller, 1 port
usb0 at ehci0: USB revision 2.0
ohci0 at fdt1: OHCI
ohci0: interrupting on GIC irq 96
ohci0: OHCI version 1.0
usb1 at ohci0: USB revision 1.0
/soc@1c00000/crypto-engine@1c15000 at fdt1 not configured
ahcisata0 at fdt1: SATA
ahcisata0: interrupting on GIC irq 88
ahcisata0: ignoring broken port multiplier support
ahcisata0: AHCI revision 1.10, 1 port, 32 slots, CAP 0x6f24ff80
atabus0 at ahcisata0 channel 0
ehci1 at fdt1: EHCI
ehci1: interrupting on GIC irq 72
ehci1: EHCI version 1.0
ehci1: 1 companion controller, 1 port
usb2 at ehci1: USB revision 2.0
ohci1 at fdt1: OHCI
ohci1: interrupting on GIC irq 97
ohci1: OHCI version 1.0
usb3 at ohci1: USB revision 1.0
sunxitimer0 at fdt1: Timer
sunxiwdt0 at fdt1: Watchdog
sunxiwdt0: default watchdog period is 16 seconds
sunxirtc0 at fdt1: RTC
/soc@1c00000/ir@1c21800 at fdt1 not configured
sunxicodec0 at fdt1: A10 Audio Codec
audio0 at sunxicodec0: full duplex, playback, capture, mmap, independent
sunxicodec0: Virtual format configured - Format SLINEAR, precision 16, channels 2, frequency 48000
sunxicodec0: Latency: 256 milliseconds
spkr0 at audio0: PC Speaker (synthesized)
wsbell at spkr0 not configured
com0 at fdt1: ns16550a, working fifo
com0: interrupting on GIC irq 33
sunxitwi1 at fdt1: Marvell TWSI controller
sunxitwi1: interrupting on GIC irq 40
iic1 at sunxitwi1: I2C bus
/soc@1c00000/hstimer@1c60000 at fdt1 not configured
genfb0 at fdt3: Simple Framebuffer (1920x1080 32-bpp @ 0x7f817000)
genfb0: switching to framebuffer console
genfb0: framebuffer at 0x7f817000, size 1920x1080, depth 32, stride 7680
wsdisplay0 at genfb0 kbdmux 1: console (default, vt100 emulation)
wsmux1: connecting to wsdisplay0
wsdisplay0: screen 1-3 added (default, vt100 emulation)
timecounter: Timecounter "clockinterrupt" frequency 100 Hz quality 0
cpu1: Cortex-A7 r0p4 (Cortex V7A core)
cpu1: DC enabled IC enabled WB disabled EABT branch prediction enabled
cpu1: 32KB/32B 2-way L1 VIPT Instruction cache
cpu1: 32KB/64B 4-way write-back-locking-C L1 PIPT Data cache
cpu1: 256KB/64B 8-way write-through L2 PIPT Unified cache
vfp1 at cpu1: NEON MPE (VFP 3.0+), rounding, NaN propagation, denormals
cpufreqdt0: 960.000 MHz, 1400000 uV
cpufreqdt0: 912.000 MHz, 1400000 uV
cpufreqdt0: 864.000 MHz, 1300000 uV
cpufreqdt0: 720.000 MHz, 1200000 uV
cpufreqdt0: 528.000 MHz, 1100000 uV
cpufreqdt0: 312.000 MHz, 1000000 uV
cpufreqdt0: 144.000 MHz, 1000000 uV
sdmmc0 at sunximmc0
uhub0 at usb1: Generic (0000) OHCI root hub (0000), class 9/0, rev 1.00/1.00, addr 1
uhub0: 1 port with 1 removable, self powered
uhub1 at usb0: Generic (0000) EHCI root hub (0000), class 9/0, rev 2.00/1.00, addr 1
uhub1: 1 port with 1 removable, self powered
uhub2 at usb3: Generic (0000) OHCI root hub (0000), class 9/0, rev 1.00/1.00, addr 1
uhub2: 1 port with 1 removable, self powered
uhub3 at usb2: Generic (0000) EHCI root hub (0000), class 9/0, rev 2.00/1.00, addr 1
uhub3: 1 port with 1 removable, self powered
IPsec: Initialized Security Association Processing.
sdmmc0: SD card status: 4-bit, C10, U1
ld0 at sdmmc0: <0x03:0x5344:SL32G:0x80:0x61532365:0x0f3>
ld0: 29476 MB, 7486 cyl, 128 head, 63 sec, 512 bytes/sect x 60367872 sectors
ld0: 4-bit width, High-Speed/SDR25, 50.000 MHz
ehci0: handing over low speed device on port 1 to companion controller
boot device: ld0
root on ld0a dumps on ld0b
root file system type: ffs
kern.module.path=/stand/evbarm/8.99.9/modules
WARNING: preposterous TOD clock time
WARNING: using filesystem time
WARNING: CHECK AND RESET THE DATE!
uhidev0 at uhub0 port 1 configuration 1 interface 0
uhidev0: Dell (0x413c) Dell USB Keyboard (0x2003), rev 1.10/2.00, addr 2, iclass 3/1
ukbd0 at uhidev0: 8 Variable keys, 6 Array codes
wskbd0 at ukbd0: console keyboard, using wsdisplay0
wsdisplay0: screen 4 added (default, vt100 emulation)
cpu0
とcpu1
が離れているのがおもしろい。
まとめ
fdt(4)
を使ったNetBSD/evbarmの環境を体験することができた。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。