qshinoの日記

Powershell関係と徒然なこと

Jetson nano dtb self update

DTB self update

Jetson Nano 自身でdtbを更新。

基本フロー

母艦から、

  1. dts変更 arch/arm64/boot/dts/
  2. make dtbs ; make dtbs_install
  3. create-jetson-nano-sd-card-image.sh
  4. 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

手順

  1. ソースのboot/dts dirのdts編集
  2. kernel-4.9 dirにて make dtbs ; make INSTALL_PATH=Linux_for_Tegra/kernel dtbs_install
  3. l4t dirから ./create-jetson-nano-sd-card-image.sh -o sd.img -s 6G -r 200
  4. 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

https://manual.atmark-techno.com/armadillo-eva-1500/armadillo-eva-1500_product_manual_ja-1.0.0/ch09.html

ソース

pcie-tegra.c

tegra_pcie_restore_device()

ここで待ち合わせる。

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/pci/host/pci-tegra.c?h=v4.9.184

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

https://jp.sainsmart.com/products/6-axis-desktop-robotic-arm-assembled?variant=13568954335290¤cy=JPY&utm_campaign=gs-2019-02-25&utm_source=google&utm_medium=smart_campaign&gclid=CjwKCAjwmNzoBRBOEiwAr2V27dodrdSHoWFeezH2xQppusXigLfbXQ05CAKBHsjplaWUjNmfy3enURoC5vcQAvD_BwE

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

  1. Power on
  2. Force Recovery Mode
  3. 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自らdtbflashに書き込めれば、尚更嬉しく思う。

ref

https://www.rt-shop.jp/blog/archives/11277