天天看点

Jetson TX1内核kernel编译与烧写

Data: 2017.09.13

Author: cjh

Theme: Jetson TX1内核kernel编译与烧写

PS   :本人用的JetPack版本为3.0

1.      Getting bootloader and kernel

本文内核kernel源码是通过JetPack进行安装的,如果没安装的请首先下载JetPack。

通过运行以下命令可获得源码

cd/home/$USER/JetPack-L4T-3.0/64_TX1/Linux_for_Tegra_64_tx1

./source_sync.sh

下载源码需要时间

Use: source_sync.sh [options]

Available general options are,

    -h     :     help

    -e     : exit on sync error

    -d DIR : root of source is DIR

默认情况下会下载所有的源码

如果用到了一个或多个以下选项,则仅下载指定的源。

    -k [TAG]: Download kernel source and optionally sync to TAG

    -u [TAG]: Download u-boot source and optionally sync to TAG

PS:DEVDIR为JetPack的安装目录,可用export DEVDIR = /    添加临时环境变量

cd $ DEVDIR / 64_TX1 /Linux_for_Tegra_64_tx1 / sources / kernel_source

git branch -a

git checkout l4t / l4t-r24.2

cd $ DEVDIR / 64_TX1 /Linux_for_Tegra_64_tx1 / sources / u-boot_source

git branch -a

git checkout l4t / l4t-r24.2

此时源码下载完成

2.      安装Toolchain

下载:

5.3-2016.02 for 64bits PC - 64bits ARM

5.3-2016.02 for 64bits PC - 32bits ARM

安装:

sudo mkdir /opt/linaro

sudo chmod -R 775 /opt/linaro

sudo chown -R $USER /opt/linaro

cpgcc-linaro-5.3-2016.02-x86_64_aarch64-linux-gnu.tar.xz /opt/linaro

cpgcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf.tar.xz /opt/linaro

cd /opt/linaro/

tar -xfgcc-linaro-5.3-2016.02-x86_64_aarch64-linux-gnu.tar.xz

tar -xfgcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf.tar.xz

PS:USER为当前用户

3.      内核编译

1) 指定工具链的路径:

mkdir -p $DEVDIR/images/modules

mkdir -p $DEVDIR/images/packages

export CROSS_COMPILE=/opt/linaro/gcc-linaro-5.3-2016.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-

exportCROSS32CC=/opt/linaro/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc

exportKERNEL_MODULES_OUT=$DEVDIR/images/modules

export ARCH=arm64

2) 清理内核和配置

cd$DEVDIR/64_TX1/Linux_for_Tegra_64_tx1/sources/kernel_source/

make mrproper

PS:为避免错误

    error: r7 cannot beused in asm here

error: logical not is only applied to the left hand side ofcomparison

分别修改一下代码:

目录:kernel_source/arch/arm64/kernel/vdso32/Makefile

GCOV_PROFILE := n

注释:ccflags-y := -shared -fPIC-fno-common -fno-builtin -march=armv7-a

增加:ccflags-y := -shared -fPIC-fomit-frame-pointer -fno-common -fno-builtin -march=armv7-a

 ccflags-y += -nostdlib -Wl,-soname=linux-vdso32.so.1\

                $(call cc-ldoption,-Wl$(comma)--hash-style=sysv)

 asflags-y := -D__VDSO32__ -s

目录:kernel_source/drivers/platform/tegra/tegra21_clocks.c

static void tegra21_cpu_clk_init(struct clk*c)

 {

注释:       c->state = (!is_lp_cluster() ==(c->u.cpu.mode == MODE_G)) ? ON : OFF;

增加:       c->state = ((!is_lp_cluster()) ==(c->u.cpu.mode == MODE_G)) ? ON : OFF;

 }

 static int tegra21_cpu_clk_enable(struct clk*c)

3) 配置你的内核

make tegra21_defconfig

make menuconfig

PS:错误解决

*** Unable to find thencurses libraries or the

*** required headerfiles.

*** 'make menuconfig'requires the ncurses libraries.

***

*** Install ncurses(ncurses-devel) and try again.

方法:sudo apt-get installlibncurses5-dev

4) 编译内核,设备树和模块

make zImage

make dtbs

make modules

make modules_installINSTALL_MOD_PATH=$KERNEL_MODULES_OUT

PS:错误解决

GEN   config-host.h

     LEX convert-dtsv0-lexer.lex.c

make[1]: flex:命令未找到

     BISON dtc-parser.tab.c

make[1]: bison:命令未找到

     LEX dtc-lexer.lex.c

make[1]: flex:命令未找到

CHK version_gen.h

方法:sudo apt-get install flex

     sudo apt-get install bison

5) 后期准备,修改JetPack

将您的二进制文件保存在images目录中

cp arch/arm64/boot/Imagearch/arm64/boot/zImage $DEVDIR/images/

用kernel模块创建kernel_supplements.tbz2,Jetpack需要这个包

cd $DEVDIR/images/modules/lib/modules/

ls .

使用modules目录的名称定义一个变量

export KERNEL_MODULES_NAME=3.10.96+

修复内核模块目录上的符号链接

cd$DEVDIR/images/modules/lib/modules/$KERNEL_MODULES_NAME

rm build source

创建tarball

cd $DEVDIR/images/modules/

tar -cjf kernel_supplements.tbz2 *

mv kernel_supplements.tbz2$DEVDIR/images/packages

除了创建模块和内核映像之外,还需要再次创建您的kernel_headers.tbz2文件(Jetpack需要)。 默认情况下,当您修补内核代码时,您不会检查内核中的更改将为发行版本添加一个后缀(例如,检查ls $ DEVDIR / images / modules / lib / modules /)。因为这个特定的原因,你需要生成你的头文件tarball再次更改它的版本。

cd $DEVDIR/64_TX1/Linux_for_Tegra_64_tx1/kernel

tar -xf kernel_headers.tbz2

tar -cjf kernel_headers_custom.tbz2linux-headers-$KERNEL_MODULES_NAME

mv kernel_headers_custom.tbz2$DEVDIR/images/packages

rm -rf linux-headers-$KERNEL_MODULES_NAME

PS:KERNEL_MODULES_NAME这个后缀大家见机修改

创建dtb目录

mkdir -p $DEVDIR/images/dtb

cp$DEVDIR/64_TX1/Linux_for_Tegra_64_tx1/sources/kernel_source/arch/arm64/boot/dts/*.dtb$DEVDIR/images/dtb/

复制设备树编译器(DTC)

cp$DEVDIR/64_TX1/Linux_for_Tegra_64_tx1/sources/kernel_source/scripts/dtc/dtc$DEVDIR/images/dtc

创建Jetpack中包含的图像和软件包的备份

mkdir -p $DEVDIR/images/packages-backup

cp -rf$DEVDIR/64_TX1/Linux_for_Tegra_64_tx1/kernel/* $DEVDIR/images/packages-backup

最后使用自己的图像覆盖默认图像,以使用jetpack安装和引导它们

cd $ DEVDIR / images

cd $DEVDIR/images

rm -rf $DEVDIR/64_TX1/Linux_for_Tegra_64_tx1/kernel/dtb

cp -rf Image zImagepackages/kernel_supplements.tbz2 dtb/ dtc$DEVDIR/64_TX1/Linux_for_Tegra_64_tx1/kernel/

cp -rf packages/kernel_headers_custom.tbz2$DEVDIR/64_TX1/Linux_for_Tegra_64_tx1/kernel/kernel_headers.tbz2

运行应用程序脚本以生成要闪存的映像

cd $DEVDIR/64_TX1/Linux_for_Tegra_64_tx1/

sudo ./apply_binaries.sh

输出:

Using rootfs directory of:/home/dsoto/devdirs/tegra/Jetpack/TX1/Linux_for_Tegra_tx1/rootfs

Extracting the NVIDIA user space componentsto /home/dsoto/devdirs/tegra/Jetpack/TX1/Linux_for_Tegra_tx1/rootfs

Extracting the BSP test tools to/home/dsoto/devdirs/tegra/Jetpack/TX1/Linux_for_Tegra_tx1/rootfs

Extracting the NVIDIA gst test applicationsto /home/dsoto/devdirs/tegra/Jetpack/TX1/Linux_for_Tegra_tx1/rootfs

Extracting the configuration files for thesupplied root filesystem to/home/dsoto/devdirs/tegra/Jetpack/TX1/Linux_for_Tegra_tx1/rootfs

Creating a symbolic link nvgstplayerpointing to nvgstplayer-0.10

Creating a symbolic link nvgstcapturepointing to nvgstcapture-0.10

Adding symlink libcuda.so -->libcuda.so.1.1 in target rootfs

Adding symlink libGL.so --> libGL.so.1in target rootfs

Adding symlink libcuda.so -->tegra/libcuda.so in target rootfs

Adding symlink libEGL.so --> libEGL.so.1in target rootfs

Extracting the firmwares and kernel modulesto /home/dsoto/devdirs/tegra/Jetpack/TX1/Linux_for_Tegra_tx1/rootfs

Extracting the kernel headers to /usr/srcin target rootfs

Installing zImage into /boot in targetrootfs

Installing Image into /boot in targetrootfs

Installing the board *.dtb files into /bootin target rootfs

Success!

6) 从新刷机,修改TX1的kernel

您可以使用Jetpack直接刷新您的图像,而不是直接使用脚本,但这需要时间(约10分钟),因为我们将需要jetpack再次生成system.img

备份你的system.img

cd$DEVDIR/64_TX1/Linux_for_Tegra_tx1/bootloader/

mv system.img.raw system.img$DEVDIR/images/packages-backup/

只需运行Jetpack作为您首次安装它:

cd $DEVDIR

./JetPack-L4T-2.1-linux-x64.run

具体操作可详见刷机教程

PS:kernel是否更改可查看串口打印信息,Jetson TX1串口调试。

    Linuxversion 3.10.96-tegra (buil[email protected]) (gcc version 4.8.2 (GCC) )#1 SMP PREEMPT Wed Nov 9 19:42:57 PST 2016日期是否被修改

参考:

http://blog.csdn.net/mantis_1984/article/details/61616541

https://developer.ridgerun.com/wiki/index.php?title=Compiling_Tegra_X1_source_code

继续阅读