前回のUltra96ネタではUltra96用のBSPとPetaLinuxを使って自前でビルドしたBOOT.BINを使ってボード上にbitファイルを読み込み、Linux側からアクセスが可能なことを確認した。
次はドライバでも、、と書いたのだが、前回は少しサボってマイクロSDはUltra96付属の物をそのまま使ったため
- パーティションが既に設定されているマイクロSD
- かつ、rootfsは差し替え無し
という状態だった。今回は新しくマイクロSDを用意したので、そこに前回ビルドしたデータ一式を展開して同様のことが出来ることを確認していこうと思う。
SDカードの準備
早速ではあるがSDカードの準備から。必要になるパーティションは以下の2つ
ブートの際の順番の関係上、boot用のパーティションがSDの先頭に来るようにしておく必要がある点は注意。
SDカードのパーティション作成
まずはパーティション作成から。とりあえずSD挿した後にdmesg
とかを使って場場所を確認
$ dmesg [ 6809.926432] sd 9:0:0:0: Attached scsi generic sg3 type 0 [ 6810.170779] sd 9:0:0:0: [sdd] 30375936 512-byte logical blocks: (15.6 GB/14.5 GiB) [ 6810.173198] sd 9:0:0:0: [sdd] Write Protect is off [ 6810.173203] sd 9:0:0:0: [sdd] Mode Sense: 23 00 00 00 [ 6810.175367] sd 9:0:0:0: [sdd] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA [ 6810.185126] sdd: [ 6810.190807] sd 9:0:0:0: [sdd] Attached SCSI removable disk
上記で調べたSDを指定してfdisk
使ってパーティションを作成
$ sudo fdisk /dev/sdd Welcome to fdisk (util-linux 2.27.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. コマンド (m でヘルプ): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): p パーティション番号 (1-4, default 1): 1 First sector (2048-30375935, default 2048): 2048 Last sector, +sectors or +size{K,M,G,T,P} (2048-30375935, default 30375935): +1024M Created a new partition 1 of type 'Linux' and of size 1 GiB. コマンド (m でヘルプ): t Selected partition 1 Partition type (type L to list all types): b Changed type of partition 'Linux' to 'W95 FAT32'. コマンド (m でヘルプ): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): p パーティション番号 (2-4, default 2): 2 First sector (2099200-30375935, default 2099200): 2099200 Last sector, +sectors or +size{K,M,G,T,P} (2099200-30375935, default 30375935): Created a new partition 2 of type 'Linux' and of size 13.5 GiB. コマンド (m でヘルプ): wq
上記の'W95 FAT32'がboot用のパーティションになる。
このfdisk
の書き込みが完了すると/dev
の下に以下の様にマイクロSDに対応したsdd
に数字がついたファイルが生成される。
$ ls /dev/sdd* -l brw-rw---- 1 root disk 8, 48 1月 6 23:24 /dev/sdd brw-rw---- 1 root disk 8, 49 1月 6 23:25 /dev/sdd1 # boot用 brw-rw---- 1 root disk 8, 50 1月 6 23:24 /dev/sdd2 # rootfs用
ファイルシステムの作成
次はファイルシステムの作成。
でファイルシステムを作成する。1番目のパーティションはvfat固定だが、2番目のrootfs用のパーティションについてはUltra96のPetaLinuxの生成物の中にはext3/ext4向けのデータが含まれているので、この辺はまあお好みで。 #他にもディレクトリ構造を保持した状態で固めたtarファイルとかもあるから何でも良い気がする。
- boot用パーティションの作成
$ sudo mkfs.vfat /dev/sdd1 -n boot mkfs.fat 3.0.28 (2015-05-16) mkfs.fat: warning - lowercase labels might not work properly with DOS or Windows
-n
オプションはボリュームの名前をつけるオプション。
- rootfs用パーティションの作成
こちらはmkfs.ext4
を使用する。ラベルをつけるオプションが異なるので注意。
$ sudo mkfs.ext4 -L rootfs /dev/sdd2 mke2fs 1.42.13 (17-May-2015) Creating filesystem with 3534592 4k blocks and 884736 inodes Filesystem UUID: e596b5af-9adb-4499-94ff-9cb87ee691a6 Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done
因みに以前にも使っていたファイルシステムが残っているのが検出された場合、以下のようなメッセージが表示される。問題なければy
を入力して先に進もう。
$ sudo mkfs.ext4 -L rootfs /dev/sdd2 mke2fs 1.42.13 (17-May-2015) /dev/sdd2 contains a ext4 file system last mounted on / on Sun Jan 6 23:14:29 2019 Proceed anyway? (y,n) y
データの書き込み
SDの設定が終了したので、後は既にビルド済みのイメージをSDに展開すればそれで準備は完了となる。
ブート用パーティションへのデータのコピー
ここは前回と同様なので、先日の記事から引用。
マイクロSD認識させて"boot"というパーティションに以下の2つのファイルをコピーする
rootfsの展開
次はrootfsの展開。自分のビルドしたPetaLinuxプロジェクトのimages/linux/
以下に複数のrootfs
という名前が入ったファイルが生成されているはずだ。筆者の環境だと以下のような感じ。
$ ls rootfs.* -rw-r--r-- 1 1000 1000 1141345792 12月 29 01:06 rootfs.cpio -rw-r--r-- 1 1000 1000 357363543 12月 29 01:06 rootfs.cpio.bz2 -rw-r--r-- 1 1000 1000 404942175 12月 29 01:06 rootfs.cpio.gz -rw-r--r-- 1 1000 1000 404942239 12月 29 01:06 rootfs.cpio.gz.u-boot -rw-r--r-- 1 1000 1000 1630629888 12月 29 01:06 rootfs.ext3 -rw-r--r-- 1 1000 1000 359294137 12月 29 01:06 rootfs.ext3.bz2 -rw-r--r-- 1 1000 1000 1630629888 12月 29 01:06 rootfs.ext4 -rw-r--r-- 1 1000 1000 408489496 12月 29 01:07 rootfs.ext4.gz -rw-r--r-- 1 1000 1000 536346624 12月 29 01:07 rootfs.jffs2 -rw-r--r-- 1 1000 1000 74522 12月 29 01:05 rootfs.manifest -rw-r--r-- 1 1000 1000 357618745 12月 29 01:05 rootfs.tar.bz2 -rw-r--r-- 1 1000 1000 406125713 12月 29 01:06 rootfs.tar.gz -rw-r--r-- 1 1000 1000 302812 12月 29 01:05 rootfs.testdata.json
この中の適当なデータをそれぞれのファイルに合った適当な方法で先ほど作ったSDのrootfsパーティションに展開すればそれでOKとなる。
"rootfs.ext4"を使った方法
ここは使う元データによって色々方法があるみたい。とりあえず筆者は"rootfs.ext4"を直接SDのパーティションに展開する方法を使った。
$ sudo sh -c "cat ./rootfs.ext4 > /dev/sdd2
Ultra96のサイトの手順だと、以下の様にdd
コマンドで展開する手順となっていた。
$ sudo dd if=rootfs.ext4 of=/dev/sdd2
うん、そういやこんな方法あったね。そしてこっちのほうがいいや。要するに"rootfs.ext4"はrootfsのイメージをそのファイルシステムのままバイナリデータにしたものなので、それをパーティションの先頭からきちんと展開すれば問題ない。
書き込んだ後にsync
コマンドを発行して、きちんとデータが書かれるようにしておこう。
# きちんと手順踏んでSDを取り外せば大丈夫なはずだけど、一応。
$ sudo sync
"rootfs.tar.bz2"/"rootfs.tar.gz"を使う方法
先ほどのext4のファイルはデータを全てバイナリに変換して物になってるが、この2つのファイルはrootfsをディレクトリ構造もそのままtar
で固めた様な状態になっている。
そのためこのファイルを使う場合はrootfsをマウントしておき、tar
コマンド等でデータを展開すればOK。
$ sudo tar zxvf rootfs.tar.gz -C /media/rootfs/ $ sudo sync
こっちもきちんとsync
を終えてからSDを抜くか、きちんとマウントを解除してからSDを取り外すかしておこう。
# tar
で展開するとコマンド終わってもきちんと書き込み終わってないことがあるので。。
上記の要領で書き込んだrootfsを入れたマイクロSDカードでLinuxが起動してログインが可能なことは確認が出来た。
PetaLinux 2018.2 xilinx-ultra96-reva-2018_2 /dev/ttyPS0 xilinx-ultra96-reva-2018_2 login: root Password: Last login: Fri Dec 28 16:06:32 UTC 2018 on ttyPS0 root@xilinx-ultra96-reva-2018_2:~#
ただ、なんかBluetooth周りでファームがダウンロード出来ないというエラーが出ている。あとGPUどうの、、てのいうのも。この辺はとりあえず今は関係ないので放置。後で付属のマイクロSDと比較して見るくらいはしてみようかな。
[ 31.206431] Bluetooth: hci0: send command d [ 31.210999] Bluetooth: hci0: download firmware failed, retrying... [2797:2797:1228/160607:ERROR:gl_factory.cc(48)] Requested GL implementation is . [2797:2797:1228/160607:ERROR:gpu_child_thread.cc(348)] Exiting GPU process due n [ 31.753959] Bluetooth: hci0: change remote baud rate command in firmware [2494:2713:1228/160610:ERROR:browser_gpu_channel_host_factory.cc(123)] Failed t. [2494:2713:1228/160610:ERROR:browser_gpu_channel_host_factory.cc(123)] Failed t. [ 36.518405] Bluetooth: hci0 command 0xff05 tx timeout [ 44.518399] Bluetooth: hci0: send command failed [ 44.523011] Bluetooth: hci0: download firmware failed, retrying... [ 45.210467] Bluetooth: hci0: change remote baud rate command in firmware
これでUltra96のBSP+PetaLinux2018.2で構築したrootfsも一部問題はありそうだが、とりあえず使えそうな感じであることは確認できた。
次こそは簡単なデバイスドライバ書いてPL領域へのメモリアクセスを確認しようと思う。