在编译内核和设备树之前,首先默认已经安装了JetPack,如果没有安装,请参考其它资料进行安装。
1、首先需要下载编译内核需要用到的工具链,通过下面的链接下载。
https://developer.nvidia.com/embedded/dlc/l4t-gcc-toolchain-64-bit-28-2-ga
2、安装工具链,通过下面的命令来安装工具链。
sudo mkdir /opt/l4t-gcc-toolchain-64-bit-28-2.1
sudo chown $USER:$USER /opt/l4t-gcc-toolchain-64-bit-28-2.1
cd /opt/l4t-gcc-toolchain-64-bit-28-2.1
首先在文件系统的opt文件夹下创建一个l4t-gcc-toolchain-64-bit-28-2.1文件夹,接下来设置文件夹的拥有者,其中$USER为你的用户名。然后进入到l4t-gcc-toolchain-64-bit-28-2.1文件夹下。
然后通过下面的命令将下载的工具链复制到l4t-gcc-toolchain-64-bit-28-2.1文件夹下
mv ~/Downloads/gcc-4.8.5-aarch64.tgz ./
并用下面的命令解压工具链。
tar -xvf gcc-4.8.5-aarch64.tgz
3、下载内核源码,通过下面的链接下载。
https://developer.nvidia.com/embedded/dlc/sources-r2821#Getting_kernel
然后执行下面的命令。
tar -xf public_sources.tbz2
cd public_release/
cp kernel_src.tbz2 $HOME/JetPack-L4T-3.2.1/64_TX2/Linux_for_Tegra/sources
cd $HOME/JetPack-L4T-3.2.1/64_TX2/Linux_for_Tegra/sources
tar -xf kernel_src.tbz2
首先解压public_sources.tbz2,之后将kernel_src.tbz2复制到sources文件夹下,并解压kernel_src.tbz2,其中$HOME为JetPack的安装目录。
4、接下来就进入内核与设备树编译的主题,执行下面的命令。
export DEVDIR=$HOME/JetPack-L4T-3.2.1/64_TX2/Linux_for_Tegra
mkdir -p $DEVDIR/images/modules
mkdir -p $DEVDIR/images/packages
mkdir -p $DEVDIR/images/dtb
export CROSS_COMPILE=/opt/l4t-gcc-toolchain-64-bit-28-2.1/install/bin/aarch64-unknown-linux-gnu-
export KERNEL_MODULES_OUT=$DEVDIR/images/modules
export TEGRA_KERNEL_OUT=$DEVDIR/images
export ARCH=arm64
其中export命令用来定义环境变量。上面的操作主要用来配置交叉编译环境。
之后通过下面的命令清楚内核和配置
cd $DEVDIR/sources/kernel/kernel-4.4
make mrproper
接下来需要配置你的内核,执行下面的命令。
make O=$TEGRA_KERNEL_OUT tegra18_defconfig
make O=$TEGRA_KERNEL_OUT menuconfig
这两条命令会设置默认的配置,并打开一个设置菜单,你可以改变设置,如果不需要修改则直接退出。
注意:你需要使用ncurses才能使用上面的命令。如果有任何问题,请安装以下软件包。
sudo apt-get install libncurses5 libncurses5-dev
5、下面就是编译内核、设备树和模块,只想下面的命令。
make O=$TEGRA_KERNEL_OUT zImage
make O=$TEGRA_KERNEL_OUT dtbs
make O=$TEGRA_KERNEL_OUT modules
make O=$TEGRA_KERNEL_OUT modules_install INSTALL_MOD_PATH=$KERNEL_MODULES_OUT
执行完上面的命令之后,内核的镜像在下面的文件夹下
$DEVDIR/images/arch/arm64/boot/Image
设备树在下面的文件夹下
$DEVDIR/images/arch/arm64/boot/dts/*.dtb
6、这一步需要创建JetPack需要的kernel_supplements.tbz2压缩包
首先执行下面的命令。
cd $DEVDIR/images/modules/lib/modules/
ls .
接下来定义下面的变量。
export KERNEL_MODULES_NAME=4.4.38+
然后执行下面的命令
cd $DEVDIR/images/modules/lib/modules/$KERNEL_MODULES_NAME
rm build source
最后创建压缩包
cd $DEVDIR/images/modules/
tar -cjf kernel_supplements.tbz2 *
mv kernel_supplements.tbz2 $DEVDIR/images/packages
7、除了上面的操作,还需要创建一个kernel_headers.tbz2文件,执行下面的命令
cd $DEVDIR/kernel
tar -xf kernel_headers.tbz2
然后查找头文件夹的名字,如下
ls | grep linux-headers
linux-headers-4.4.38-tegra
定义变量
export KERNEL_HEADERS_NAME=linux-headers-4.4.38-tegra
重定义文件夹
mv $KERNEL_HEADERS_NAME linux-headers-$KERNEL_MODULES_NAME
tar -cjf kernel_headers_custom.tbz2 linux-headers-$KERNEL_MODULES_NAME
mv kernel_headers_custom.tbz2 $DEVDIR/images/packages
rm -rf linux-headers-$KERNEL_MODULES_NAME
8、创建JetPack中文件的备份。
mkdir -p $DEVDIR/images/packages-backup cp -rf $DEVDIR/kernel/* $DEVDIR/images/packages-backup
9、复制设备树文件
cp $DEVDIR/images/arch/arm64/boot/dts/tegra186-quill-p3310-1000-c03-00-base.dtb $DEVDIR/kernel/dtb
10、覆盖掉JetPack中默认的镜像文件
cd $DEVDIR/images
cp -rf arch/arm64/boot/Image arch/arm64/boot/zImage packages/kernel_supplements.tbz2 $DEVDIR/kernel/
cp -rf packages/kernel_headers_custom.tbz2 $DEVDIR/kernel/kernel_headers.tbz2
11、执行applybinaries脚本来生成用来烧写的镜像文件
cd $DEVDIR/
sudo ./apply_binaries.sh
12、经过上面的步骤就编译生成了内核、模块和设备树的文件,下面就是向TX2烧写的过程了。
a. 首先进入recovery模式。
b. 复制dtb文件从Linux_for_Tegra/images/arch/arm64/boot/dts 文件夹到 Linux_for_Tegra/kernel/dtb文件夹。
c. 复制Linux_for_Tegra/images/arch/arm64/boot/ 文件夹下的Image和zImage 到 Linux_for_Tegra/kernel 文件夹。
d. 复制模块从Linux_for_Tegra/images/modules/lib/modules/4.4.38文件夹到Linux_for_Tegra/rootfs/lib/modules/4.4.38 文件夹。
e. 进入$DEVDIR文件夹,并执行下面的命令。
sudo ./flash.sh -r -d kernel/dtb/tegra186-quill-p3310-1000-c03-00-base.dtb -K kernel/Image jetson-tx2 mmcblk0p1
f. 执行下面的命令来安装dtb文件。
cd $DEVDIR
sudo ./flash.sh -r -k kernel-dtb jetson-tx2 mmcblk1p1
至此,我们完成了TX2上内核、模块和DTB的更新,重启TX2就行了。