# U-Bootのカスタマイズ Jetson TX2 NX Moduleで、U-BootのTX2 NX向けバージョンのバグを修正する必要に迫られて、一度、U-Bootを自分でビルドして実際に書き込んで使用したことはあるが、そのときは、詳細な記録を残していなかったので、今回、Jetson Nano Moduleの環境にて、U-Bootのカスタマイズ、というか、具体的に変更する必要のあるネタは今のところないので、とりあえず、自分でビルドしてそれを使ってみるとして、その記録をここに残す。 ## U-Bootのビルド 32.7.1 Release Notes https://developer.download.nvidia.com/embedded/L4T/r32_Release_v7.1/Jetson_Linux_Driver_Package_Release_Notes_R32.7.1_GA.pdf?_WGgKwjJxb7q7sje7RDMOPrUef0LWxRhS5EGYVw62YJLB-Cz2BXy08ufELuY_VdN4ZJXQ-H5aD9RvAGPrKKhQIp-CDP6g6y1RJDSryNgSLZNPMoF-bNEX0wX8UsSUl0QmPRijgappDtfxk5K4Ho20r1nAHTk3yJDdb6iVKVGAb-Y2GMcPA9aEEQuq-d_BJ4kNWeYipo&t=eyJscyI6ImdzZW8iLCJsc2QiOiJodHRwczpcL1wvd3d3Lmdvb2dsZS5jb21cLyJ9 に、 | Release tag | tegra-l4t-r32.7.1 | とあるので、これを使うのか。 NVIDIA Jetson Linux Developer Guide 32.7.1 Release のDownloading and Building U-Bootのセクション https://docs.nvidia.com/jetson/archives/l4t-archived/l4t-3271/index.html#page/Tegra%20Linux%20Driver%20Package%20Development%20Guide/uboot_guide.html#wwpID0E0UL0HA を参照しつつやってみる。(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内に定義されている、マクロBOOT_TARGET_DEVICESの定義を以下のように変更した。 ``` /*#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をベースに作業してみているので、以下のページを参照。 https://docs.nvidia.com/jetson/archives/l4t-archived/l4t-3273/index.html#page/Tegra%20Linux%20Driver%20Package%20Development%20Guide/uboot_guide.html# 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 ```