WANDBOARD.ORGのサイトを覗くと、同社のWANDBOARDシリーズに対応したLinux BSPが利用可能であることが判る。
WANDBOARD.ORGからはビルド済みのSDカードイメージとそれをWindows PC環境でSDカードに書き込むためのツールが入ったzipアーカイブをダウンロードすることができる。
実際に10年前に買ったボードが最新のLinux BSPで動くかどうか試してみたところ、問題なく起動した。
同社がバイナリでお試し版を提供しているビルド済みイメージはQTというGUI環境を搭載したものでHDMIディスプレイやUSBキーボードとマウスを接続すればつかえるというもの。
本サーバーはwebサーバー専用なのでGUIは必要ないので、あっても構わないけど、Full HD対応のディスプレイをサポートするためにメモリの大半がディスプレイシステム用に予約されてしまうので、自分の目的にあったBSPを再構築する必要がある。
WANDBOARD用のlinux BSPは、Freescale社由来のyoctoベースのcommunity BSP環境でサポートされており、誰でもダウンロードして利用できる。
WANDBOARD社のサイトからWANDBOARD用のWIKIページがリンクしてあるので、そこにBSPの場所やダウンロード方法やビルド方法が簡単に記述してある。
それを参考にやってみたところ問題なくビルドと動作確認ができたので、ここに記録しておくことに。
WIKIページには安定版と最新版の2つのcommunity BSPダウンロード方法が記載されているが、いろいろと最新でないと困るので最新版を試してみた。
ビルドに使用する環境は手元のWindows PC上にインストールしたVMWare上のUbuntu 18.04LTSを使用した。
WIKIページでは具体的には記載していないが、yoctoベースのBSPをビルドするには、予めUbuntu環境にデフォルトではインストールされていない依存パッケージをインストールしておく必要がある。
(1) yocto BSPの依存パッケージのインストール
Ubuntu 18.04LTSにログインして、下記を実行する。
引用:
$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib \
build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \
xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \
pylint3 xterm
これはFreescale社のyocto BSPの使い方を記載したドキュメント"i.MX Yocto Project User's Guide"からの引用。
これで必要なUbuntu環境は出来たので、yocto BSPをダウンロードすることに。
(2) repoのインストール
community BSPは複数の開発者のレポジトリの集合体であるのと、それぞれの開発社のレポジトリの特定のリビジョンでないと同一ビルドの再現性が得られないため、repoというGoogleがAndroid開発者向けに提供しているツールを使用してそれらのレポジトリを自動的にダウンロードする方法が採用されている。
そのためにまず、Googleのサイトから最新のrepoをインストールするか、Ubuntuで予め用意されているrepoパッケージを導入する必要がある。
手元のUbuntu 18.04LTS環境では、前者だとUbuntuのPythonではバージョンが古すぎて怒られたので、後者の方法を取る必要がありました。
下記を実行する。
引用:
$ sudo apt-get install repo
これでrepoコマンドが使用できる。
(3) Community BSPのダウンロード
WANDBOARDに対応したCommunity BSPをrepoを使用してダウンロードする手順は下記の通り。
予めgitを使用する上で必須の設定をするために、下記を実行。
引用:
$ git config --global user.name "Your Name"
$ git config --global user.email "Your Email"
$ git config --list
これをやらないと怒られるのだよね。
元々gitレポジトリをダウンロードするのは、それをローカルで修正したり更新して自分のレポジトリを作っていくので、その際にコミットログに記載されるユーザー名とメールアドレスが必須になるという寸法。
実際にはコミットログに記載されるだけで、その設定内容が公表されることはないのでご安心を。ちょっと開発者の仲間入りした気分になるよ。
続いて本題のCommunity BSPのダウンロードは下記の通り。
引用:
最初のrepo initコマンドはyocto BSPを構成するのに必要なgit レポジトリの所在とリビジョンを記載したmanifestレポジトリだけをダウンロードするので直ぐに終わるけど、最後のrepo syncコマンドは記述されたgit レポジトリを全部ダウンロードするので時間がかかります。
これが終わればCommunity BSPのローカルクローンが出来たことに。
(4) Community BSPのbuildディレクトリ作成
ダウンロードされたyocto BSPはサポートするターゲットボード固有のconfigファイルとターゲット固有もしくは共通のパッケージビルドのためのレシピから成ります。
なので、特定のターゲット用のBSPをビルドするには、どのターゲットとどのようなパッケージをOSのファイルシステムにインストールするかを指定しないといけないことになります。
Freescaleの場合は、専用のスクリプトが用意されていて、それを使用することで最小限の手間でビルドディレクトリを作成することができます。
WANDBOARDの場合は、WIKIに書かれているのとは masterブランチを使用したこともあって違っていました。WANDBOARDはハードウェアでどのボードかを自動的に判別できる手段を提供しているので、それを利用することでWANDBOARD全部を包含してサポートするBSPイメージを作成することになります。
BSPダウンロードの後、下記のコマンドを実行します。
引用:
MACHINE=wandboard DISTRO=fslc-framebuffer source setup-environment build
実行すると利用契約の承諾が求められYを入力しないと中止されるので注意。
実行し終わると環境設定がされた状態でbuildディレクトリにカレントディレクトリが変わり、ビルドが出来る状態になります。
(5) BSPのビルド
GUIパッケージを含まない最小限のパッケージで構成されるBSPをビルドするためには、下記を実行します。
引用:
$ bitbake core-image-minimal
実行すると、設定したMACHINE構成に対応するレシピがスキャンされビルドするパッケージが依存関係ツリーの枝葉から順にビルドされて、最終的に根っこのcore-image-minimalパッケージがビルドされて完了します。
各パッケージのビルドに必要なソースコードレポジトリがダウンロードされるため不確定の時間が要するため、初回のビルドは長時間かかります。以降のリビルドでは既にダウンロードされたソースコードレポジトリはローカルにダウンロードされたものが参照されるため最短時間で済みます。
ビルドが終わった時の状態は下記の様になります。
引用:
$ bitbake core-image-minimal
NOTE: Your conf/bblayers.conf has been automatically updated.
Loading cache: 100% | | ETA: --:--:--
Loaded 0 entries from dependency cache.
Parsing recipes: 100% |#########################################| Time: 0:02:10
Parsing of 2309 .bb files complete (0 cached, 2309 parsed). 3538 targets, 480 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: Multiple providers are available for runtime nativesdk-u-boot-mkimage (nativesdk-u-boot-imx-tools, nativesdk-u-boot-tools)
Consider defining a PREFERRED_RPROVIDER entry to match nativesdk-u-boot-mkimage
Build Configuration:
BB_VERSION = "1.49.0"
BUILD_SYS = "x86_64-linux"
NATIVELSBSTRING = "ubuntu-18.04"
TARGET_SYS = "arm-fslc-linux-gnueabi"
MACHINE = "wandboard"
DISTRO = "fslc-framebuffer"
DISTRO_VERSION = "3.3-snapshot-20201230"
TUNE_FEATURES = "arm vfp cortexa9 neon thumb callconvention-hard"
TARGET_FPU = "hard"
meta
meta-poky = "HEAD:e4b1b01f5a79b38ebcc5356f08ebec2f79b1fe85"
meta-oe
meta-multimedia
meta-python = "HEAD:2c7bbea253f473b6aa35b9263311a83acd4d9d95"
meta-freescale = "HEAD:409bbc843991b999f16dc035493eb46823b7fce8"
meta-freescale-3rdparty = "HEAD:01df375846003b420c0419735bb97d79761218a4"
meta-freescale-distro = "HEAD:9eff18e2e71b4696023edd903046499cb2d096fb"
NOTE: Fetching uninative binary shim http://downloads.yoctoproject.org/releases/uninative/2.9/x86_64-nativesdk-libc.tar.xz;sha256sum=d07916b95c419c81541a19c8ef0ed8cbd78ae18437ff28a4c8a60ef40518e423 (will check PREMIRRORS first)
Initialising tasks: 100% |######################################| Time: 0:00:01
Sstate summary: Wanted 945 Found 0 Missed 945 Current 0 (0% match, 0% complete)
NOTE: Executing Tasks
NOTE: Tasks Summary: Attempted 2665 tasks of which 1 didn't need to be rerun and all succeeded.
NOTE: Writing buildhistory
NOTE: Writing buildhistory took: 30 seconds
$
ビルドが終わると生成物は tmp/deploy/images/wandboard配下に下記の様なファイルができます。
引用:
core-image-minimal-wandboard.wic.gz
あとはこれをSDカードに書き込むだけ。
(5) BSPイメージのSDカードへの書き込み
Ubuntu環境であれば、SDカードをカードリーダーに挿して、予め自動マウントされたパーティションのデバイス名を調べます。
引用:
$ df | grep /media
/dev/sdd1 8164 6992 1172 86% /media/<ユーザーログイン名>/????
これでSDカードのデバイス名が/dev/sddだということがわかります。末尾の番号はパーティション番号に対応するので、ストレージ先頭から全体をアクセスできるのはそれを省いたパス名になります。
上記の例で、SDカードにBSPイメージを書き込むために下記を実行します。
引用:
$ zcat tmp/deploy/images/wandboard/core-image-minimal-wandboard.wic.gz |sudo dd of=/dev/sdd bs=1M
[sudo] <ユーザログイン名> のパスワード:
0+1207 レコード入力
0+1207 レコード出力
39732224 bytes (40 MB, 38 MiB) copied, 9.01067 s, 4.4 MB/s
$
BSPイメージは圧縮されているので、それを解凍しながらSDカードに直接書き込みます。
WANDBAORDがビルド済みBSPと一緒に提供しているWindows用のSDカード書き込みツールを使用しても同じことができますが、その場合には予め、gzipコマンドで解凍したファイルを用意する必要があります。
(6) BSPイメージのターゲットでの動作確認
BSPイメージを書き込んだSDカードをホストPCのカードリーダーから外して、WANDBOARDのCPUモジュール上にあるSDカードスロットに差し込み、デバッグコンソールシリアルをホストPCにNULLモデムケーブル(クロス接続ケーブル)で接続し、ターミナルエミュレータでボーレイト115200かつ8bit パリティ無しで開いておきます。
上記の状態でWANDBOADに電源を供給すればSDからu-bootが起動し自動的にlinuxが立ち上がるはず。
実際に確認した際のログは下記の通り。
引用:
U-Boot SPL 2020.10+fslc+g5003fc093c (Dec 09 2020 - 17:09:55 +0000)
Trying to boot from MMC1
U-Boot 2020.10+fslc+g5003fc093c (Dec 09 2020 - 17:09:55 +0000)
CPU: Freescale i.MX6SOLO rev1.1 at 792 MHz
Reset cause: POR
DRAM: 512 MiB
MMC: FSL_SDHC: 2, FSL_SDHC: 1, FSL_SDHC: 0
Loading Environment from MMC... *** Warning - bad CRC, using default environment
No panel detected: default to HDMI
Display: HDMI (1024x768)
In: serial
Out: serial
Err: serial
Board: Wandboard rev B1
Net: eth0: ethernet@2188000
Normal Boot
Hit any key to stop autoboot: 0
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found /boot/extlinux/extlinux.conf
Retrieving file: /boot/extlinux/extlinux.conf
188 bytes read in 15 ms (11.7 KiB/s)
1: FSLC FrameBuffer
Retrieving file: /boot/extlinux/../zImage
10461648 bytes read in 511 ms (19.5 MiB/s)
append: root=PARTUUID=eb091661-01 rootwait rw console=ttymxc0,115200
Retrieving file: /boot/extlinux/../imx6dl-wandboard-revb1.dtb
36051 bytes read in 20 ms (1.7 MiB/s)
## Flattened Device Tree blob at 18000000
Booting using the fdt blob at 0x18000000
Using Device Tree in place at 18000000, end 1800bcd2
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x0
[ 0.000000] Linux version 5.10.2+gf263d1928d7d (oe-user@oe-host) (arm-fslc-linux-gnueabi-gcc (GCC) 10.2.0, GNU ld (GNU Binutils) 2.35.0.20200730) #1 SMP Mon Dec 21 17:14:45 UTC 2020
[ 0.000000] CPU: ARMv7 Processor [412fc09a] revision 10 (ARMv7), cr=10c5387d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[ 0.000000] OF: fdt: Machine model: Wandboard i.MX6 Dual Lite Board rev B1
[ 0.000000] Memory policy: Data cache writeback
[ 0.000000] cma: Reserved 64 MiB at 0x2c000000
[ 0.000000] Zone ranges:
[ 0.000000] Normal [mem 0x0000000010000000-0x000000002fffffff]
[ 0.000000] HighMem empty
[ 0.000000] Movable zone start for each node
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x0000000010000000-0x000000002fffffff]
[ 0.000000] Initmem setup node 0 [mem 0x0000000010000000-0x000000002fffffff]
[ 0.000000] CPU: All CPU(s) started in SVC mode.
[ 0.000000] percpu: Embedded 20 pages/cpu s51628 r8192 d22100 u81920
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 130048
[ 0.000000] Kernel command line: root=PARTUUID=eb091661-01 rootwait rw console=ttymxc0,115200
[ 0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes, linear)
[ 0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes, linear)
[ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[ 0.000000] Memory: 423600K/524288K available (14336K kernel code, 2027K rwdata, 4824K rodata, 1024K init, 6661K bss, 35152K reserved, 65536K cma-reserved, 0K highmem)
[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=2, Nodes=1
[ 0.000000] Running RCU self tests
[ 0.000000] rcu: Hierarchical RCU implementation.
[ 0.000000] rcu: RCU event tracing is enabled.
[ 0.000000] rcu: RCU lockdep checking is enabled.
[ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=4 to nr_cpu_ids=2.
[ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.
[ 0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=2
[ 0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
[ 0.000000] L2C-310 erratum 769419 enabled
[ 0.000000] L2C-310 enabling early BRESP for Cortex-A9
[ 0.000000] L2C-310 full line of zeros enabled for Cortex-A9
[ 0.000000] L2C-310 ID prefetch enabled, offset 16 lines
[ 0.000000] L2C-310 dynamic clock gating enabled, standby mode enabled
[ 0.000000] L2C-310 cache controller enabled, 16 ways, 512 kB
[ 0.000000] L2C-310: CACHE_ID 0x410000c8, AUX_CTRL 0x76450001
[ 0.000000] random: get_random_bytes called from start_kernel+0x34c/0x56c with crng_init=0
[ 0.000000] Switching to timer-based delay loop, resolution 333ns
[ 0.000008] sched_clock: 32 bits at 3000kHz, resolution 333ns, wraps every 715827882841ns
[ 0.000038] clocksource: mxc_timer1: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 637086815595 ns
[ 0.001580] Console: colour dummy device 80x30
[ 0.001633] Lock dependency validator: Copyright (c) 2006 Red Hat, Inc., Ingo Molnar
[ 0.001656] ... MAX_LOCKDEP_SUBCLASSES: 8
[ 0.001678] ... MAX_LOCK_DEPTH: 48
[ 0.001701] ... MAX_LOCKDEP_KEYS: 8192
[ 0.001722] ... CLASSHASH_SIZE: 4096
[ 0.001742] ... MAX_LOCKDEP_ENTRIES: 32768
[ 0.001764] ... MAX_LOCKDEP_CHAINS: 65536
[ 0.001785] ... CHAINHASH_SIZE: 32768
[ 0.001805] memory used by lock dependency info: 4061 kB
[ 0.001825] memory used for stack traces: 2112 kB
[ 0.001846] per task-struct memory footprint: 1536 bytes
[ 0.001960] Calibrating delay loop (skipped), value calculated using timer frequency.. 6.00 BogoMIPS (lpj=30000)
[ 0.002005] pid_max: default: 32768 minimum: 301
[ 0.002417] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[ 0.002455] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[ 0.005974] CPU: Testing write buffer coherency: ok
[ 0.006113] CPU0: Spectre v2: using BPIALL workaround
[ 0.007119] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
[ 0.010674] Setting up static identity map for 0x10100000 - 0x10100078
[ 0.011499] rcu: Hierarchical SRCU implementation.
[ 0.013791] smp: Bringing up secondary CPUs ...
[ 0.017305] smp: Brought up 1 node, 1 CPU
[ 0.017346] SMP: Total of 1 processors activated (6.00 BogoMIPS).
[ 0.017380] CPU: All CPU(s) started in SVC mode.
(省略)
FSLC FrameBuffer 3.3-snapshot wandboard /dev/ttymxc0
wandboard login: root
root@wandboard:~# free
total used free shared buff/cache available
Mem: 490160 18396 454336 196 17428 461300
Swap: 0 0 0
root@wandboard:~#
予想通り、大部分のメモリを空き状態にすることに成功。
これなら現行のIBMノートPCより空きメモリ量は多い感じ。
ここからカスタマイズを始めることに。
んじゃまた。