Jetson-nano系统烧录与字符设备驱动
0 写在前面
刚入手了一块Jetson-nano开发板,准备学习一下CUDA编程。因为之前一直在学习驱动开发,所以刚一入手,还是习惯性的从交叉编译环境搭建,系统移植开始。之前学习驱动开发的时候也一直没有记录总结的习惯,现在也是想凑着这个机会,一方面做个记录,另一方面也是对知识的重新梳理,希望可以开个好头,一直坚持下去
1 系统烧录
链接: 官方资料下载中心.
链接: 开发指南.
链接: BSP开发包下载链接.
-
官网下载BSP驱动包和源码包以及交叉编译器
-
解压BSP驱动包和文件系统
tar -jxpf Jetson-210_Linux_R32.7.1_aarch64.tbz2
cd rootfs
sudo tar -jxpf ../../Tegra_Linux_Sample-Root-Filesystem_R32.7.1_aarch64.tbz2
- 拷贝NVIDIA的依赖库
cd ..
sudo ./apply_binaries.sh
- 烧录
用跳帽或者杜邦线短接FC REC和GND引脚,位置如下图,位于开发板底板上,进入recovery 模式,用数据线连接Jetson Nano的Micro USB接口到Ubuntu主机
先烧录核心板里的FLASH
sudo ./flash.sh jetson-nano-qspi mmcblk0p1
再烧录外接TF卡
sudo ./flash.sh jetson-nano-qspi-sd mmcblk0p1
烧录完成之后,去掉底板的跳帽,重新上电,启动时由核心板FLASH上系统引导进入外接TF上的系统
2 字符设备驱动测试
磁盘空间保证在30G以上,我分配了50G的空间
- 下载依赖包
sudo apt install build-essential bc
- 解压内核
tar -xjf public_sources.tbz2
cd Linux_for_Tegra/source/public
tar –xjf kernel_src.tbz2
经过两次解压后,内核源码就在Linux_for_Tegra/source/public/kernel/kernel-4.9目录下
3. 解压交叉编译器
sudo tar -xvf gcc-linaro-7.3.1-2018.05-x86_64_aarch64-linux-gnu.tar.xz
- 修改环境变量CROSS_COMPILE的值
这里我们直接修改源码顶层目录下Makefile文件
cd Linux_for_Tegra/source/public/kernel/kernel-4.9
sudo vi Makefile
如图,添加第279行,CROSS_COMPILE设置为交叉编译器的绝对路径
5. 编译内核
# sudo make ARCH=arm64 O=/home/e/jetson/output menuconfig
make ARCH=arm64 O=/home/e/jetson/output tegra_defconfig
make ARCH=arm64 O=/home/e/jetson/output -j8
output目录根据自己情况选择
- 编写驱动程序
驱动代码
/* chrdevbase.c */
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/cdev.h>
#include <linux/device.h>
#define CHR_BASE_CNT 1 /* 设备号个数 */
#define CHR_BASE_NAME "chrbase" /* 名字 */
static char readbuf[</