Jetson nano dtb self update
DTB self update
Jetson Nano 自身でdtbを更新。
基本フロー
母艦から、
- dts変更 arch/arm64/boot/dts/
- make dtbs ; make dtbs_install
- create-jetson-nano-sd-card-image.sh
- nanoに移動し、sudo dd if=bootloader/signed/$dtb.encrypt of=/dev/mmcblk0p10
.flash.shを使わない簡素書込み方法。
dts 関連ファイル
- sources-pkgのkernel_src.rbz2
- nano dts : tegra210-p3448-0000-p3449-0000-a02.dts
想定ツリー
Top +-- Linux_for_Tegra: l4t dir +-- rootfs : rootfs +-- kernel/dtb : dtb +-- bootloader/ : *.dtb.encrypted +-- jetson-nano-qspi-sd.conf +-- kernel : kernel src +-- kernel4.9/arch/arm64/boot/dts +-- nvidia/drivers/ +— hardware : kernel src +-- nvidia +-- platform/t210/porg/kernel-dts/ : dtsi +-- soc/ : dtsi +-- download : tarball dir +-- public_sources : srcpkg
手順
- ソースのboot/dts dirのdts編集
- kernel-4.9 dirにて make dtbs ; make INSTALL_PATH=Linux_for_Tegra/kernel dtbs_install
- l4t dirから ./create-jetson-nano-sd-card-image.sh -o sd.img -s 6G -r 200
- nanoから、 sudo dd if=bootloader/signed/$dtb.encrypt of=/dev/mmcblk0p10
# # 下記リンクからダウンロード # devlink=開発パッケージリンク rootlink=サンプルルートリンク srclink= https://developer.nvidia.com/embedded/dlc/l4t-sources-32-1-jetson-nano # # DLしたパッケージ名 # ksrc=kernel_src.tbz2 devpkg=l4t-r32-1.tbz2 rootpkg=rootfs.tbz2 srcpkg=l4t-sources-32-1-0.tbz3 # # dirs # dl=download lt=Linux_for_Tegra ps=public_sources rt=rootfs kk=kernel/kernel-4.9 # # file # dtb=tegra210-p3448-0000-p3449-0000-a02.dtb # top=~ cd $top if false ; then wget $devlink -O $dl/$devpkg wget $rootlink -O $dl/$rootpkg wget $srclink -O $dl/$srcpkg fi if false ; then tar jxvf $dl/$devpkg tar jxvf $dl/$rootpkg -C $lt tar jxvf $dl/$srcpkg tar jxvf $ps/$ksrc fi # build kernel cd $kk make -j2 Image ; make -j2 modules ; make dtbs # update dtb cp arch/arm64/boot/dts/$dtb $top/$lt/kernel/dtb/ # create sd image cd $top/$lt sudo ./create-jetson-nano-sd-card-image.sh -o sd-blob.img -s 6G -r 200 # write dtb sudo dd if=bootloader/signed/$dtb.encrypt of=/dev/mmcblk0p10
Nano SD.card Partitions
Number Start (sector) End (sector) Size Code Name 1 24576 62521310 29.8 GiB 8300 APP 2 2048 2303 128.0 KiB 8300 TBC 3 4096 4991 448.0 KiB 8300 RP1 4 6144 7295 576.0 KiB 8300 EBT 5 8192 8319 64.0 KiB 8300 WB0 6 10240 10623 192.0 KiB 8300 BPF 7 12288 13439 576.0 KiB 8300 TOS 8 14336 14463 64.0 KiB 8300 EKS 9 16384 17663 640.0 KiB 8300 LNX 10 18432 19327 448.0 KiB 8300 DTB 11 20480 20735 128.0 KiB 8300 RP4 12 22528 22687 80.0 KiB 8300 BMP
ref
https://developer.ridgerun.com/wiki/index.php?title=NVIDIA_Jetson_Nano-Building_the_Kernel_from_Source
壊れたbzip2を復旧
For 18.04: sudo apt install bzip2=1.0.6-8.1 libbz2-1.0=1.0.6-8.1
For 16.04: sudo apt install bzip2=1.0.6-8 libbz2-1.0=1.0.6-8
以後のupdateを抑制
sudo apt-mark hold bzip2 libbz2-1.0
更新抑制解除
sudo apt-mark unhold bzip2 libbz2-1.0
ref
ソース
pcie-tegra.c
tegra_pcie_restore_device()
ここで待ち合わせる。
static const struct dev_pm_ops tegra_pcie_pm_ops= { .resume = tegra_pcie_resume, .suspend_late = tegra_pcie_suspend_late, .resume_early = tegra_pcie_resume_early, .runtime_suspend = tegra_pcie_save_device, .runtime_resume = tegra_pcie_restore_device, .suspend_noirq = tegra_pcie_save_device, .resume_noirq = tegra_pcie_restore_device, }; #endif /* CONFIG_PM */ /* driver data is accessed after init, so use __refdata instead of __initdata */ static struct platform_driver __refdata tegra_pcie_driver = { .probe = tegra_pcie_probe, .remove = tegra_pcie_remove, .driver = { .name = "tegra-pcie", .owner = THIS_MODULE, #ifdef CONFIG_PM .pm = &tegra_pcie_pm_ops, #endif .of_match_table = tegra_pcie_of_match, }, }; static int __init tegra_pcie_init_driver(void) { return platform_driver_register(&tegra_pcie_driver); } static void __exit tegra_pcie_exit_driver(void) { platform_driver_unregister(&tegra_pcie_driver); } module_init(tegra_pcie_init_driver); module_exit(tegra_pcie_exit_driver); MODULE_LICENSE("GPL v2");
pcie-tegra.c
```
static const struct dev_pm_ops tegra_pcie_pm_ops = {
.resume = tegra_pcie_resume,
.suspend_late = tegra_pcie_suspend_late,
.resume_early = tegra_pcie_resume_early,
.runtime_suspend = tegra_pcie_save_device,
.runtime_resume = tegra_pcie_restore_device,
.suspend_noirq = tegra_pcie_save_device,
.resume_noirq = tegra_pcie_restore_device,
};
#endif /* CONFIG_PM */
/* driver data is accessed after init, so use __refdata instead of __initdata */
static struct platform_driver __refdata tegra_pcie_driver = {
.probe = tegra_pcie_probe,
.remove = tegra_pcie_remove,
.driver = {
.name = "tegra-pcie",
.owner = THIS_MODULE,
#ifdef CONFIG_PM
.pm = &tegra_pcie_pm_ops,
#endif
.of_match_table = tegra_pcie_of_match,
},
};
static int __init tegra_pcie_init_driver(void)
{
return platform_driver_register(&tegra_pcie_driver);
}
static void __exit tegra_pcie_exit_driver(void)
{
platform_driver_unregister(&tegra_pcie_driver);
}
module_init(tegra_pcie_init_driver);
module_exit(tegra_pcie_exit_driver);
MODULE_LICENSE("GPL v2");
```
ロボットアーム
ロボットアーム
nano にロボットアームと・カメラを繋げて、カメラを自由に動かしたい。
電動で動く雲台でも良いが、探してもnanoに繋げられそうなものがなく、ロボットに行き着いた。
良いのがあれば紹介して欲しい。
ref
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に書き込めれば、尚更嬉しく思う。