使用flash刷机

使用命令查询自己机器上的版本号,开发相关的root file system、kernel、bootloader需要和机器上烧录的jetpack版本一样。

1
2
head -n 1 /etc/nv_tegra_release
# R35(release),REVISION:5.0,GCID:35550180,BOARD:t186ref,EABI:aarch64,DATE:...

前面为大版本 ,后面是小版本号,所以这个版本号是35.5.0

所以我之后的源码包为这个版本的开发,下载地址为https://developer.nvidia.com/embedded/jetson-linux-r3550

先安装实例系统包

img

Jetson_Linux_R35.5.0_aarch64.tbz2

Tegra_Linux_Sample-Root-Filesystem_R35.5.0_aarch64.tbz2

1
2
3
4
5
6
7
8
tar -xf  Tegra186_Linux_R32.4.4_aarch64.tbz2
cd Linux_for_Tegra/rootfs
sudo tar -xpf ../../ Tegra_Linux_Sample-Root-Filesystem_R32.4.4_aarch64.tbz2
cd Linux_for_Tegra
sudo ./apply_binaries.sh
#安装NVIDIA应用库
sudo ./flash.sh <board> mmcblk0p1
#其中 board 为指定目标Jetson设备的配置的名称,根据自己Jetson板卡系列对应的Configuration

img

img

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
系统镜像生成并升级(把机器中的所有内容擦除并刷机,重新制作system.img)
$sudo ./flash.sh jetson-xavier mmcblk0p1
$sudo ./flash.sh jetson-agx-xavier-devkit mmcblk0p1
系统完整升级但不生成system.img镜像(把机器中的所有内容擦除并刷机)
$sudo ./flash.sh -r jetson-xavier mmcblk0p1

更新DTB 设备树(涉及外设驱动)
将新的DTB文件"tegra194-p2888-0001-p2822-0000.dtb"复制到目录Linux_for_Tegra/kernel/dtb
$sudo ./flash.sh -r -k kernel-dtb jetson-xavier mmcblk0p1

更新内核镜像(kernel/Image 涉及外设驱动)
Xavier检索内核先判断根目录下/boot/Image 文件,此时只需要把新的内核Image文件复制到 Xavier开机后的/boot/ 目录后再重启即可,通过uname -a 查看内核信息如日期时间是否为更新的内核
$sudo ./flash.sh -r -k kernel jetson-xavier mmcblk0p1

系统备份(备份Xavier机器中的系统及全部文件至当前目录的backup.img)
$sudo ./flash.sh -r -k APP -G backup.img jetson-xavier mmcblk0p1
如何恢复使用备份的镜像:
1、上面步骤备份会生出两个文件,把其中的backup.img.raw 重新命名到bootloader/system.img(软件镜像包含用户空间的所有文件信息),backup.img 文件不被使用可以删除掉
2、运行命令重新升级机器:
$sudo ./flash.sh -r jetson-xavier mmcblk0p1

配置硬件的引脚工具

1
sudo /opt/nvidia/jetson-io/jetson-io.py

交叉编译工具

先下载源码包

1
2
3
$ mkdir $HOME/l4t-gcc
$ cd $HOME/l4t-gcc
$ tar xf <toolchain_archive>源码包的名字

设置交叉编译的环境变量

To set CROSS_COMPILE for the aarch64 toolchain, enter the command:

1
2
3
4
5
6
7
8
9
$export CROSS_COMPILE=$$HOME/l4t-gcc/bin/aarch64-buildroot-linux-gnu-
$aarch64-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/aarch64-linux-gnu/7/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=aarch64-linux-gnu --program-prefix=aarch64-linux-gnu- --includedir=/usr/aarch64-linux-gnu/include
Thread model: posix
gcc version 7.5.0 (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04)

Kernel

Build kernel source

  1. 这时下载内核的源码包
1
2
3
$ tar -xvjf public_sources.tbz2 
$ cd Linux_for_Tegra/source/public
$ tar -xvjf kernel_src.tbz2
  1. 在linux操作系统上只使用gcc编译是不够的,还要安装编译程序必须的软件包,使用下面的命令:
1
sudo apt install build-essential bc
  1. 构建环境变量
1
2
3
#在public目录下输入
export CROSS_COMPILE_AARCH64_PATH=/opt/l4t-gcc/
export CROSS_COMPILE_AARCH64=/opt/l4t-gcc/bin/aarch64-buildroot-linux-gnu-
  1. 创建生成镜像和设备树
1
2
3
4
5
6
7
mkdir kernel_out
./nvbuild.sh -o /home/zext-ros/nvidia/sources/Linux_for_Tegra/source/public/kernel_out
# nvbuild.sh文件在kernel_src目录下
#源码目录下执行下面的命令
make menuconfig
#保存.config在kernel_out下
./nvbuild.sh -o /home/zext-ros/nvidia/sources/Linux_for_Tegra/source/public/kernel_out

img

  1. 将生成的对已有的示例做替换。

$kernel_out/drivers/gpu/nvgpu/nvgpu.ko 复制到 Linux_for_Tegra/rootfs/usr/lib/modules/$(uname -r)/kernel/drivers/gpu/nvgpu/nvgpu.ko

Linux_for_Tegra/kernel/dtb/被kernel_out/arch/arm64/boot/dts/nvidia/替换

$kernel_out/arch/arm64/boot/Image 复制到 Linux_for_Tegra/kernel/Image

Externel module

  1. 安装依赖项(依赖项是支持make ARCH=arm64 O=$TEGRA_KERNEL_OUT -j modules_prepare,可能还有别的报错,但是另一个报错是给出了安装的依赖项

1
2
sudo apt update
sudo apt install python3-sphinx

在内核源码5.1.0下面进行操作

1
2
3
4
5
sudo apt-get update
sudo apt-get install sudo apt install libncurses5
make menuconfig
#将config保存在和构建内核输出的目录中
make ARCH=arm64 O=/home/zext-ros/nvidia/sources/Linux_for_Tegra/source/public/kernel_out modules_prepare

进入到自己写的驱动目录中,编写Makefile

1
2
3
4
5
6
7
8
KERNELDIR := /home/zext-ros/nvidia/kernel_out
CURRENT_PATH := $(shell pwd)
obj-m := chrdev.o

build: kernel_modules

kernel_modules:
make ARCH=arm64 -C $(KERNELDIR) M=$(CURRENT_PATH)

Root file system

使用Ubuntu20.04的环境,如果不是可以使用容器来模拟。

1
2
3
4
5
6
sudo apt-get install docker.io
$ sudo docker run --privileged -it --rm -v <your_L4T_root>/Linux_for_Tegra:/l4t ubuntu:20.04

(inside of container) $ apt-get update
(inside of container) $ apt-get install -y qemu-user-static wget sudo
(inside of container) $ cd /l4t/tools/samplefs

这段文本描述了如何生成不同类型的根文件系统(root file system)用于 NVIDIA Jetson 开发套件。这些不同类型的根文件系统包括桌面版、最小版和基本版。以下是每种类型的根文件系统的简要描述:

  1. 桌面版(Desktop Flavor)根文件系统:
    1. 包含 Ubuntu 桌面环境和 OEM 配置。
    2. 使用 nv_build_samplefs.sh 脚本生成,需要指定参数 --abi aarch64 --distro ubuntu --flavor desktop --version focal
1
sudo ./nv_build_samplefs.sh --abi aarch64 --distro ubuntu --flavor desktop --version focal
  1. 最小版(Minimal Flavor)根文件系统:
    1. 一个较小的根文件系统,用于 NVIDIA Jetson 开发套件。
    2. 不提供图形用户界面(GUI),所有操作只能通过 SSH 或 UART 控制台完成。
    3. 不包含 OEM 配置,建议在刷写设备之前创建默认用户。
    4. 使用 nv_build_samplefs.sh 脚本生成,需要指定参数 --abi aarch64 --distro ubuntu --flavor minimal --version focal
1
sudo ./nv_build_samplefs.sh --abi aarch64 --distro ubuntu --flavor minimal --version focal
  1. 基本版(Basic Flavor)根文件系统:
    1. 最小的根文件系统,用于 NVIDIA Jetson 开发套件,包含 BSP 和 NVIDIA Docker 的依赖项。
    2. 终端用户可以安装 NVIDIA Docker 运行 NVIDIA 容器和启动 CUDA 应用程序。
    3. 与最小版根文件系统类似,所有操作只能通过 SSH 或 UART 控制台完成。
    4. 必须在刷写设备之前创建默认用户。
    5. 使用 nv_build_samplefs.sh 脚本生成,需要指定参数 --abi aarch64 --distro ubuntu --flavor basic --version focal
1
sudo ./nv_build_samplefs.sh --abi aarch64 --distro ubuntu --flavor basic --version focal

参考文档索引

img

在jetson系统上使用命令查询使用的设备树

1
cat /proc/device-tree/nvidia,dtsfilename

之后从内核源码中进行搜索找到设备树文件,进行修改的设备树,可以根据型号来修改自己的设备树文件,

编写内核配置文件

1
2
3
4
5
6
7
make menuconfig

-> Networking support
-> CAN bus subsystem support
-> CAN Device Drivers
<*> Raw CAN Protocol (raw access with CAN-ID filtering) │ │
<*> Broadcast Manager CAN Protocol (with content filtering)

保存.config文件在源码生成的镜像的目录kernel_out中,之后使用.nvbuild.sh进行编译。

最后将生成的镜像和设备树和系统中的进行替换,使用flash进行烧录

1
sudo ./flash.sh jetson-agx-xavier-devkit mmcblk0p1

刷机成功后,使用nvidia的自带工具进行引脚的配置

1
sudo /opt/nvidia/jetson-io/jetson-io.py

img

进入Configure Jetson 40pin Header来配置想要使用的IO

imgimg

之后选择 save pin changes , save and reboot跟换设备树文件。

重启之后输入命令ifconfig -a就能看到can 0 can1两个设备

输入命令来安装工具进行本地回环的can测试。

1
2
3
4
5
6
7
8
9
10
11
12
sudo apt-get install can-utils
# 回环测试
ifconfig can0 down
#如果 can0 已经打开了,先关闭
ip link set can0 type can bitrate 500000 loopback on
#开启回环测试
ifconfig can0 up
#重新打开
can0 candump can0 &
#candump 后台接收数据
cansend can0 5A1#11.22.33.44.55.66.77.88
#cansend 发送数据