一、环境准备
下载同一个SDK的开源code以及编译好的对应镜像,链接:
https://developer.nvidia.com/embedded/linux-tegra-r3271
一般选择最新的即可,然后主要需要以下工具
- public source code :设备树以及linux源码
- x86 cross compile tool : x86 交叉编译使用
- linux headers : 编译自己的驱动模块使用
- develop guideline:离线开发文档
另外镜像也在其中,自行下载烧写即可,烧写镜像网上有免费资源可以看。
二、编译kenrel以及device tree
编译pulic source code内核源码以及设备树,首先
sudo apt install build-essential bc
- 进入pulic source code的kernel4.9目录下:
{my_pulic_souce_dir}/Linux_for_Tegra/source/public/kernel/kernel-4.9
- 创建输出路径
mkdir kImageOut
- make defconfig,配置linux kernel默认参数
export LOCALVERSION=-tegra
make ARCH=arm64 O=kImageOut tegra_defconfig
- 编译
make ARCH=arm64 O=kImageOut -j8
- 编译结果
在kImageOut文件夹中:
Linux内核镜像:./kImageOut/arch/arm64/boot/Image
设备树:/kImageOut/arch/arm64/boot/dts/tegra210-p3448-0000-p3449-0000-a02.dtb
设备树具体文件不明确的可以看你的板子是多少 - 注意make4.3实际编译有bug,建议是用4.2.1,
wget http://archive.ubuntu.com/ubuntu/pool/main/m/make-dfsg/make_4.2.1-1.2_amd64.deb
然后执行:
$ cat /proc/device-tree/nvidia,dtsfilename
../arch/arm64/boot/dts/../../../../../../hardware/nvidia/platform/t210/porg/kernel-dts/tegra210-p3448-0000-p3449-0000-a02.dtsd
然后,cp自己的对应的编译结果就可以
三、生效自己编译的kenrel以及device tree
最简单的方法直接cp 编译好的Image镜像以及的dtb文件到板子上/boot/Image或者/boot/xxx.dtb,不要用flash.sh脚本烧写,操作复杂且慢
- 修改调试设备树路径
sudo vim /boot/extlinux/extlinux.conf
修改对应内容如下:
注意设备树换成自己的名字
LABEL primary
MENU LABEL primary kernel
LINUX /boot/Image
FDT /boot/tegra210-p3448-0000-p3449-0000-a02.dtb
INITRD /boot/initrd
APPEND ${cbootargs} quiet root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 console=ttyS0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0
- cp Image以及device tree
首先scp本地编译结果到开发板上,然后直接cp覆盖
sudo cp ./Image /boot/
sudo cp ./xxx.dtb /boot/
最后sync一下,reboot生效
四、编译用户module
创建自己的mod文件夹,然后写一个测试驱动:
编译命令:
make ARCH=arm64 -C {top_Src}/Linux_for_Tegra/kernel/linux-headers-4.9.253-tegra-linux_x86_64/kernel-4.9/ M=$(pwd)
如果meanconfig
make ARCH=arm64 O=kImageOut menuconfig
相同路径下假如编译ov5640.c,其Makefile如下:
obj-m := ov5640.o
最后编译出ko文件,scp到开发板上
sudo insmod ov5460.ko