1.资料准备:
我们需要下载以下文件:1.对应版本的内核源代码文件、2.对应版本的gcc文件、3.来自Jetson 下载中心的Jetson Xavier NX Pinmux Table。
2.环境准备:
我们需要安装编译工具:1.build-essential、2.flex、3.bison、4.libssl-dev。
使用命令"sudo apt-get install build-essential flex bison libssl-dev"来安装以上编译工具。
3.根据自己的电路图设置引脚参数:
我的电路连接是
cd-gpio ---第208引脚(默认是NV_THERM_FAN_TACH)
vcc --- 3.3v电源独立供电芯片
4.然后打开我们在步骤1中下载的Jetson Xavier NX Pinmux Table:
在Pin #列中找到第208引脚。
将对应的Customer Usage属性从NV_THERM_FAN_TACH改为GPIO3_PQ.02(我尝试不修改,发现没有区别。)
点击"Generate DT File"按钮,生成DTSi文件。
5.组装pinmux:
将步骤4生成"tegra19x-jetson_xavier_nx_module-gpio-default.dtsi"、“tegra19x-jetson_xavier_nx_module-padvoltage-default.dtsi”、"tegra19x-jetson_xavier_nx_module-pinmux.dtsi"文件复制到目录“Linux_for_Tegra/kernel/pinmux/t19x/”中。
执行以下两个命令生成“tegra19x-mb1-padvoltage-p3668-a01.cfg”、“tegra19x-mb1-pinmux-p3668-a01.cfg”文件。
"python pinmux-dts2cfg.py --pad pad_info.txt tegra19x-jetson_xavier_nx_module-padvoltage-default.dtsi 1.0 > tegra19x-mb1-padvoltage-p3668-a01.cfg"
"python pinmux-dts2cfg.py --pinmux addr_info.txt gpio_addr_info.txt por_val.txt tegra19x-jetson_xavier_nx_module-pinmux.dtsi tegra19x-jetson_xavier_nx_module-gpio-default.dtsi 1.0 > tegra19x-mb1-pinmux-p3668-a01.cfg"
最后将生成的“tegra19x-mb1-padvoltage-p3668-a01.cfg”、“tegra19x-mb1-pinmux-p3668-a01.cfg”文件更新到目录“Linux_for_Tegra/bootloader/t186ref/BCT/”中。
6.查看我们需要修改的内核文件和内核源代码文件:
登录到jetson Xerver NX上执行以下命令查看所使用的内核文件
ls /boot/dtb
这里我的是
kernel_tegra194-p3668-0001-p3509-0000.dtb
所以需要获取的内核是
tegra194-p3668-0001-p3509-0000.dtb
执行以下命令查看所使用的内核文件使用的源代码文件
dmesg | grep dts
这里我的是"hardware/nvidia/platform/t19x/jakku/kernel-dts/common/tegra194-p3668-common.dtsi"
7.提取内核源代码文件:
从下载好的源代码文件"public_sources.tbz2"中提取出内核源代码文件"kernel_src.tbz2"
解压文件"kernel_src.tbz2",注意"kernel_src.tbz2"压缩文件中没有根目录。请为内核源代码创建一个根目录以避免文件混乱。
8.提取gcc编译工具:
将对应版本的gcc工具文件解压。
9.常试编译以确保编译不出现错误:
执行命令设置编译gcc环境
export CROSS_COMPILE_AARCH64_PATH='gcc根目录,绝对路径'
创建一个目录用于输出编译好的内核文件
进入源代码根目录并执行命令编译内核
./nvbuild.sh -o 输出内核文件目录路径
###如果报错了,请自行解决。###
10编辑源代码文件:
编辑步骤6中对应的源代码文件"hardware/nvidia/platform/t19x/jakku/kernel-dts/common/tegra194-p3668-common.dtsi":
在sdhci_sd: sdhci@3400000设备后添加SDMMC3设备
sdmmc3: sdhci@3440000 {
mmc-ocr-mask = <0x0>;
cd-inverted;
cd-gpios = <&tegra_main_gpio TEGRA194_MAIN_GPIO(Q, 2) 0>;
#cd-gpios是检测引脚,这里我的是GPIOQ.2,低电平触发。
nvidia,cd-wakeup-capable;
mmc-ocr-mask = <0>;
cd-inverted;
status = "okay";
};
11.编译内核:
清理旧内核
sudo rm -rf 输出内核文件目录路径/*
执行命令以编译内核
./nvbuild.sh -o 输出内核文件目录路径
12.更新内核到NX上:
编译好的内核文件存储在目录“输出内核文件目录路径/arch/arm64/boot/dts/nvidia”中
复制新的dtb文件到目录“Linux_for_Tegra/kernel/dtb”中。
执行命令将新内核更新到NX上
sudo ./flash.sh -r -k kernel-dtb <board> <rootdev>
<board> --- 开发板 --- 例如 jetson-xavier-nx-devkit-emmc
<rootdev> --- 根设备 --- 例如 mmcblk0p1