Jetson nano dtb 変更
nano dtb 書き換え方法
nanoと母艦をUSBケーブルで接続し、Force Recovery modeにする。
母艦で下記コマンド。
cd Linux_for_Tegra/ sudo ./apply_binaries.sh sudo ./flash.sh --no-systemimg -k DTB jetson-nano-qspi-sd mmcblk0p1
書込み後、nanoが自動的にリブートする。リブートしない場合はリセットする。
Nano button jumper
pinouts
- Power on
- Force Recovery Mode
- Reset 7,8 Disable auto power on when connected.
2,4,6 GND
Pin 1 : エッジから遠い方の左上。
Top View | | 1 2 | 3 4. | 5 6. | 7 8. | | | ———-+
device tree
現在のデバイスツリー
sudo apt install device-tree-cimpiler
dtc -I fs -O dts -o extracted.dts /proc/device-tree
extracted.dts内のソースdtsファイル名を確認し、利用dtsファイルを確認。
確認後、nvidiaからダウンロードしたsources.tbz2内のkernel_src.tbz2 を展開し、dtsファイルを検索する。
nanoの場合は、p3488-0000-p3488-0000-a02.dtsの様なファイル名。
リビジョン等によりファイル名が異なる場合がある。
書き込み
Force recovery modeにするには、人がジャンパをショートしないといけない。自動でリカバリモードにする方法、つまり、reboot -force-recovery-modeの様なコマンドがあると、とても嬉しい。
nano自らdtbをflashに書き込めれば、尚更嬉しく思う。
ref
Linux Kconfig
Kconfig
kernelにリンクされるモジュールを見つける方法。
基本的には.configにconfigが保存されており、configの内容を元にリンクされるモジュールが決まる。
.config から対象のモジュールがリンクされているかを知る方法は、.configを読むしかない?
Device Tree
config通りにカーネルにリンクされたかを知る方法は?
リンクされても実際にアクティブなドライバを知る方法は?
dmesgコマンドの出力を見るのが一番早い。但し、未搭載デバイスのドライバ起動もあり、詳細はドライバを確認する。
あるいは、デバイスツリーを使って、
strings /proc/device-tree/compatible
cat /proc/device-tree/axi@0/compatible
等により、ツリー上のデバイスドライバを確認。
ref
device tree
https://qiita.com/koara-local/items/ed99a7b96a0ca252fc4e#_reference-7fb61179985d53e7a181
https://qiita.com/iwatake2222/items/0d13142863d9ed064e41
http://nahitafu.cocolog-nifty.com/nahitafu/2017/12/menuconfig-2062.html
https://tnishinaga.hatenablog.com/entry/2016/04/11/035548
https://www.anarg.jp/personal/t-tugawa/note/linux/kernel_restruct.html
Jetson nano kernel compile
kernel self compile
全体の流れ
- swap拡大&max perf
- Download and expand kernel sources
- .config 取り出し & 編集
- build & install
全体で4ステップ。
configやソースを変更したら、4. build&installを繰り返す。
作業一覧
# 1. swap拡大 & max perf wget http://github.com/JetsonHacksNano/installSwapfile cd installSwapfile ./installSwapfile.sh sudo jetson_clocks # 2. Download & Expand top=~/nano dl=$top/dl srclink=https://developer.nvidia.com/embedded/dlc/l4t-sources-32-1-jetson-nano srcpkg=l4t-sources-32-1-jetson-nano.tar.gz #srcpkg related ksrc=public_sources/kernel_src.tbz2 mkdir -p $dl cd $top wget $srclink -O $dl/$srcpkg tar jxvf $dl/$srcpkg tar jxvf $ksrc # 3. get config & edit cd kernel/kernel-4.9 zcat /proc/config.gz > .config # config 編集 # as you like # 4. build & install ## now in $top/kernel/kernel-4.9 make oldconfig make prepare make modules_prepare ## build に1時間程度かかる make -j4 Image && make -j4 modules ## install sudo make modules_install sudo cp arch/arm64/boot/Image /boot/Image # 最後にリブート sudo reboot
ref
Jetson and Tegra names
tegra
Jetson | Tegra | Devkit | rule | note |
---|---|---|---|---|
K1 | 132/K1-64 | ... | 28nm | Denver,nexus 9 tablet |
TX1 | 210 X1/erista | p2597-2180 | 20nm | nintendo switch, CortexA57x4/53x4 |
TX2 | 186 X2/Parker | p3310-1000 | 16nm | Denver2 |
Xavier | 194 | 12nm | carmel | |
Nano | 210 | p3448-0000 | TX1base |
ref
https://www.rt-shop.jp/blog/archives/11277
https://en.wikichip.org/wiki/nvidia/tegra/xavier
note
Jetson TX1/TX2 devkitのCarrier Boardは同じ。
tx2
hardware/nvidia/platform/t18x/quill/kernel-dts/tegra186-quill-p3310-1000-c00-00-auo-1080p-edp.dts
DTS name
board-som-ver-xxx.dts
shのステップ制御
shのステップ制御
インストールスクリプトや、試験スクリプト作成時、エラーが起きた行を修正し、エラーの行から再実行したい場合がないだろうか。
そんな時、一部をコメントアウトしたり、コピペしたりしていませんか。
そんな時に役立つshのステップ実行用関数。
作り方
shスクリプトファイルをfooとする。
sh スクリプト
- s && 試験コード1
- s && 試験コード2
- ...
実行方法
- foo -s 23
ステップ23 から実行。
先頭にs && を追加するのが大変とは言え、個別にコメントを入れるよりはマシ。
コマンド全体を文字列として受け取り、行単位に実行する方法もあるが、大掛かりになり過ぎるかもしれない。
s関数
_start=0 _end=0 _to=0 s (){ _step=$(( $_step + 1)) echo "step $_step" [ $_step -lt $_start ] && return 0 [ $_step -gt $_end ] && return 0 return 1 } # 引数処理 handleopts (){ while getopts hs:e: OPT ; do case $OPT in h) usage ; exit 0;; s) _start=$OPTARG ;; e) _end=$OPTARG ;; *) usage ;; esac done shift $(( $OPTIND - 1 )) } usage(){ echo "usage: cmd [options] params..." }
Jetson nano usb boot
usb boot
Jetson Nano のUSB bootには、usb3 firmware とxusbドライバをカーネルに盛り込む必要がある。
全体の流れ。
- kernel source download
- get kernel config
- get usb firmware
- make menuconfig & build & install
- create ext4 and copy on usb
- edit extlinux.conf
kernel source
Jetson-Nano-public_sources.tbz2
get config
zcat /proc/config.gz > .config
get firmware
cp /lib/firmware/tegra21x_xusb_firmware ./firmware/
make menuconfig
kernel config
- sudo apt-get install libncurses5-dev
- make menuconfig
Device Drivers -> Generic Driver Options -> "External firmware blobs to build into the kernel binary," -> "tegra21x_xusb_firmware"
build and install kernel
カーネルのビルドとインストール。
cd ~/kernel/kernel-4.9 make -j5 sudo make modules_install sudo cp /boot/Image /boot/Image.dist sudo cp arch/arm64/boot/Image /boot
ここでreboot。
create ext4 and copy on usb
usb flashにパーティションを作成し、rootfsをコピー。
# clear usb flash sudo dd if=/dev/zero of=/dev/sda bs=1M count=1 sudo cfdisk /dev/sda # root とswapの2つのgptパーティションを作成。 # 24GB/root + 6GB/swapの例 sudo parted /dev/sda print sudo parted /dev/sda mklabel gpt sudo parted /dev/sda mkpart root ext4 1MB 24GB sudo parted /dev/sda mkpart swap linux-swap 24GB 30GB # copy rootfs sudo mkfs.ext4 /dev/sda1 sudo mkswap /dev/sda2 sudo mkdir /mnt/root sudo mount /dev/sda1 /mnt/root sudo mkdir /mnt/root/proc sudo apt -y install rsync sudo rsync -axHAWX --numeric-ids --info=progress2 --exclude=/proc / /mnt/root
edit extlinux.conf
sudo sed -i 's/mmcblk0p1/sda1/' /boot/extlinux/extlinux.conf # 以下は不要。 sudo sed -i 's/rootwait/rootwait zswap.enabled=1/' /boot/extlinux/extlinux.conf
上記のzswap.enabled=1はドライバを入れた場合だが、本記事では省略しているので不要。
ここでreboot
最後にswap partition
先のrebootで問題なければ、
echo "/dev/sda2 none swap \ defaults 0 1" | sudo tee -a /etc/fstab cd ~ wget https://raw.githubusercontent.com/Syonyk/raspberry_pi_scripts/master/zswap.sh
zswap は、ドライバを入れていれば。
参考元にはzswapドライバを入れる手順があるが省略。
ref
https://syonyk.blogspot.com/2019/04/nvidia-jetson-nano-desktop-use-kernel-builds.html?m=1