U-Bootのカスタマイズ
Jetson TX2 NX Moduleで、U-BootのTX2 NX向けバージョンのバグを修正する必要に迫られて、一度、U-Bootを自分でビルドして実際に書き込んで使用したことはあるが、そのときは、詳細な記録を残していなかったので、今回、Jetson Nano Moduleの環境にて、U-Bootのカスタマイズ、というか、具体的に変更する必要のあるネタは今のところないので、とりあえず、自分でビルドしてそれを使ってみるとして、その記録をここに残す。
U-Bootのビルド
32.7.1 Release Notes
に、
Release tag | tegra-l4t-r32.7.1 |
とあるので、これを使うのか。
NVIDIA Jetson Linux Developer Guide 32.7.1 Release のDownloading and Building U-Bootのセクション
を参照しつつやってみる。(TX2 NXのときもそうしたはず)
まずは、ダウンロードして展開。
$ git clone -n git://nv-tegra.nvidia.com/3rdparty/u-boot.git Cloning into 'u-boot'... remote: Enumerating objects: 691094, done. remote: Counting objects: 100% (691094/691094), done. remote: Compressing objects: 100% (108227/108227), done. remote: Total 691094 (delta 573623), reused 691060 (delta 573589), pack-reused 0 Receiving objects: 100% (691094/691094), 136.85 MiB | 1.46 MiB/s, done. Resolving deltas: 100% (573623/573623), done. $ cd u-boot/ $ git checkout -b jetson_nano_module_u-boot_customization tegra-l4t-r32.7.1 Updating files: 100% (16598/16598), done. Switched to a new branch 'jetson_nano_module_u-boot_customization' $ git branch * jetson_nano_module_u-boot_customization $ ls Kbuild Makefile board configs dts include scripts Kconfig README cmd disk env lib test Licenses api common doc examples net tools MAINTAINERS arch config.mk drivers fs post $ git checkout-index -a --prefix=exports/ $ ls Kbuild Makefile board configs dts fs post Kconfig README cmd disk env include scripts Licenses api common doc examples lib test MAINTAINERS arch config.mk drivers exports net tools $ mkdir ~/nvidia/nvidia_sdk/JetPack_4.6.2_Linux_JETSON_NANO_TARGETS/Linux_for_Tegra/sources $ mv exports ~/nvidia/nvidia_sdk/JetPack_4.6.2_Linux_JETSON_NANO_TARGETS/Linux_for_Tegra/sources/u-boot $ cd ~/nvidia/nvidia_sdk/JetPack_4.6.2_Linux_JETSON_NANO_TARGETS/Linux_for_Tegra/sources/u-boot $ ls Kbuild Makefile board configs dts include scripts Kconfig README cmd disk env lib test Licenses api common doc examples net tools MAINTAINERS arch config.mk drivers fs post
次に、ビルド。環境変数を設定して、makeなど。
$ export CROSS_COMPILE=$HOME/l4t-gcc/gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- $ make distclean $ make p3450-0000_defconfig $ make
無事にmakeできたっぽい。(っぽいと書くのは、もちろん、単にmakeして、エラーらしきメッセージが出なかっただけだから)
ちなみに、32.6.1のときのTX2 NX向けのバグだったところをみると、
$ grep kernel_addr_r_size include/configs/p3636-0001.h "kernel_addr_r_size=08000000\0" \
と、この32.7.1ではちゃんと修正されていることが確認できた。
まだカスタマイズまではいかず。。。
(2022/10/7)
2022/9/21に非公開領域にて記録していた内容だが、U-Bootのカスタマイズの一例としてこちらに転記。
ひとまず、U-Bootのデフォルトのブート順序を変更してみる。
U-Bootのソース内、include/configs/p3450-0000.h内に定義されている、マクロBOOTTARGETDEVICESの定義を以下のように変更した。
/*#define BOOT_TARGET_DEVICES(func) \ func(MMC, mmc, 1) \ func(MMC, mmc, 0) \ func(USB, usb, 0) \ func(NVME, nvme, 0) \ func(PXE, pxe, na) \ func(DHCP, dhcp, na)*/ #define BOOT_TARGET_DEVICES(func) \ func(NVME, nvme, 0) \ func(MMC, mmc, 1) \ func(MMC, mmc, 0) \ func(USB, usb, 0) \ func(PXE, pxe, na) \ func(DHCP, dhcp, na)
これでmake。 “Before Flashing”に従って所定の場所にコピーした上で、
$ sudo ./flash.sh -k LNX jetson-nano-devkit-emmc mmcblk0p1
とやるが、初期状態では無理のようで、一旦は、全体的にflash、つまり、
$ sudo ./flash.sh -r jetson-nano-devkit-emmc mmcblk0p1
と実行。 これで、デバッグシリアルから手動でブート順序をSSD優先に変更することなく、そのままデフォルトでSSDからブートできたみたい。OK。
(2023/6/16)
今日は、SPI通信ができなくなったJetson Nanoに対して、U-Bootのバージョンを変更してみることにより、SPIが復活するかどうかをみていく。
というのは、SPI通信が突如できなくなったJetson Nanoに対して、SDK Managerにて初期化してSPIが復活した個体(Jetson Nano #1)と、SDK Managerで初期化してもSPIが復活しなかった個体(Jetson Nano #2)とが発生しているが、Jetson Nano #1と#2とでどちらも同じシステムSDにて起動しているが、その違いが発生している。ということから、は現在のところ、U-Bootのバージョンの違いによってその違いが発生していると推測。
今回、R32.7.3をベースに作業してみているので、以下のページを参照。
Downloading and Building U-Bootで、まず、U-bootをダウンロード。
$ git clone -n git://nv-tegra.nvidia.com/3rdparty/u-boot.git $ git checkout -b jetson_nano_u-boot_customization tegra-l4t-r32.7.1 $ make distclean $ make p3450-0000_defconfig $ make $ cp u-boot{,.bin,.dtb,-dtb.bin} ~/nvidia/nvidia_sdk/JetPack_4.6.3_Linux_JETSON_NANO_TARGETS/Linux_for_Tegra/bootloader/t210ref/p3450-0000/ $ sudo ./flash.sh -k LNX jetson-nano-qspi-sd mmcblk0p1