Xavier 内核编译

本文主要基于 JetPack 源码进行内核编译,也可以下载制定版本的内核源码进行编译,具体方法参照“Specific Version Source”部分.

  • 获取源码,在~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra 目录下运行./source_sync.sh 下载源码到~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/sources,在该目录下会出现 kernel 文件夹,便是下载的内核代码。 参考文章 1,参考文章 2

Kernel 编译

添加环境变量

export KERNEL_OUT=~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/sources/kernel/kernel-4.9/build

export KERNEL_MODULES_OUT=~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/rootfs

参考 1

编译配置文件 (Create the .config file)

在~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/sources/kernel/kernel-4.9 目录下输入:

make ARCH=arm64 O=$KERNEL_OUT tegra_defconfig

编译内核和设备树 (Build the kernel and DTBs)

在当前目录下继续执行:

make ARCH=arm64 O=$KERNEL_OUT CROSS_COMPILE=${CROSS_COMPILE} -j4

开始编译,编译时间与主机的配置有关,不同机器编译时间也不一样,以我的 i3 笔记本为例 4G 内存,Ubuntu16.04 系统,编译大概 30 分钟左右。

加载模块 (Install modules in temporal location)

在当前目录下继续执行:

sudo make modules_install ARCH=arm64 O=$KERNEL_OUT CROSS_COMPILE=${CROSS_COMPILE} INSTALL_MOD_PATH=$KERNEL_MODULES_OUT

备份当前镜像 (Make a backup of the current image)

把当前的镜像备份成:文件名 + 日期时间的格式.

mv ~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/kernel/Image{,.date "+%Y_%m_%d_%H_%M_%S"}

mv ~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/kernel/zImage{,.date "+%Y_ %m_%d_%H_%M_%S"}

mv ~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/kernel/kernel_supplements.tbz2{,.date "+%Y_%m_%d_%H_%M_%S"}

mv ~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/kernel/dtb{,.date "+%Y_%m_%d_%H_%M_%S"}

但是实际我的目录下并没有 zImage 这个文件。

部署二进制文件 (Deploy binarier in their required locations)

进入到编译输出目录:

cd $KERNEL_OUT

进入到~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/sources/kernel/kernel-4.9/build$ 目录下。

执行复制命令,拷贝二进制文件。

cp ./arch/arm64/boot/Image ~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/kernel/

cp ./arch/arm64/boot/zImage ~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/kernel/

cp -r ./arch/arm64/boot/dts ~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/kernel/

重新生成内核模块追加文件 (Regenerate kernel modules supplement file)

切换到~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/rootfs 目录

cd $KERNEL_MODULES_OUT

执行如下命令:

tar –owner root –group root -cjf ~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegro/kernel/kernel_supplements.tbz2 lib/modules

生成 JetPack 映像 (Generate JetPack image)

切换到~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra/目录下,执行如下命令:

cd ~/nVIDIA/xavier/JetPack/Xavier/Linux_for_Tegra

sudo ./apply_binaries.sh

要修改Xavier内核中硬件watchdog复位timeout时间,可以进行以下步骤: 1. 首先,需要在内核中对watchdog进行配置。在Xavier内核中,可以使用watchdog_hardware_register()函数进行watchdog硬件的注册和初始化。在这个函数中,可以设置watchdog的超时时间,例如: ```c watchdog_hardware_register(&tegra_wdt_hw, NULL); tegra_wdt_hw.timeout = 60; // 设置watchdog的超时时间为60秒 ``` 2. 然后,需要在内核中实现喂狗功能。可以使用watchdog_hardware_enable()函数启用watchdog,并在watchdog喂狗线程中定期喂狗。例如: ```c static void tegra_wdt_ping(unsigned long data) { int timeout = tegra_wdt_hw.timeout / 2; watchdog_hardware_ping(); mod_timer(&tegra_wdt_timer, jiffies + timeout * HZ); } static int tegra_wdt_start(struct watchdog_device *wdd) { init_timer(&tegra_wdt_timer); tegra_wdt_timer.function = tegra_wdt_ping; tegra_wdt_timer.expires = jiffies + tegra_wdt_hw.timeout * HZ; add_timer(&tegra_wdt_timer); watchdog_hardware_enable(); return 0; } ``` 在这个代码中,tegra_wdt_ping()函数为watchdog喂狗线程,通过mod_timer()函数定期喂狗,tegra_wdt_start()函数为watchdog启用函数,通过add_timer()函数启用watchdog,并启动喂狗线程。 3. 最后,重新编译并安装内核,使watchdog的配置生效。可以使用make命令编译内核,并使用make install命令安装内核。 需要注意的是,修改watchdog的复位timeout时间需要谨慎,过短的超时时间可能会导致系统频繁复位,而过长的超时时间则可能会延迟系统的响应时间。建议根据系统的实际情况进行合理的设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值