使用flash刷机 使用命令查询自己机器上的版本号,开发相关的root file system、kernel、bootloader需要和机器上烧录的jetpack版本一样。
1 2 head -n 1 /etc/nv_tegra_release
前面为大版本 ,后面是小版本号,所以这个版本号是35.5.0
所以我之后的源码包为这个版本的开发,下载地址为https://developer.nvidia.com/embedded/jetson-linux-r3550
先安装实例系统包
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/rootfssudo tar -xpf ../../ Tegra_Linux_Sample-Root-Filesystem_R32.4.4_aarch64.tbz2 cd Linux_for_Tegrasudo ./apply_binaries.sh sudo ./flash.sh <board> mmcblk0p1
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 -vUsing 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 2 3 $ tar -xvjf public_sources.tbz2 $ cd Linux_for_Tegra/source/public $ tar -xvjf kernel_src.tbz2
在linux操作系统上只使用gcc编译是不够的,还要安装编译程序必须的软件包,使用下面的命令:
1 sudo apt install build-essential bc
构建环境变量
1 2 3 export CROSS_COMPILE_AARCH64_PATH=/opt/l4t-gcc/export CROSS_COMPILE_AARCH64=/opt/l4t-gcc/bin/aarch64-buildroot-linux-gnu-
创建生成镜像和设备树
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 make menuconfig ./nvbuild.sh -o /home/zext-ros/nvidia/sources/Linux_for_Tegra/source/public/kernel_out
将生成的对已有的示例做替换。
将 $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
安装依赖项(依赖项是支持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 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 开发套件。这些不同类型的根文件系统包括桌面版、最小版和基本版。以下是每种类型的根文件系统的简要描述:
桌面版(Desktop Flavor)根文件系统:
包含 Ubuntu 桌面环境和 OEM 配置。
使用 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
最小版(Minimal Flavor)根文件系统:
一个较小的根文件系统,用于 NVIDIA Jetson 开发套件。
不提供图形用户界面(GUI),所有操作只能通过 SSH 或 UART 控制台完成。
不包含 OEM 配置,建议在刷写设备之前创建默认用户。
使用 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
基本版(Basic Flavor)根文件系统:
最小的根文件系统,用于 NVIDIA Jetson 开发套件,包含 BSP 和 NVIDIA Docker 的依赖项。
终端用户可以安装 NVIDIA Docker 运行 NVIDIA 容器和启动 CUDA 应用程序。
与最小版根文件系统类似,所有操作只能通过 SSH 或 UART 控制台完成。
必须在刷写设备之前创建默认用户。
使用 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
参考文档索引
在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
进入Configure Jetson 40pin Header来配置想要使用的IO
之后选择 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 发送数据