正点原子RK3568学习日志5-将驱动编译到内核
1.rk3568的编译与烧录
编译:
1.SDK整体编译,在SDK根目录下, ./.build.sh all 这个是build.h脚本,vim build.h可以进行查看,或者 ./build.sh -h
编译完,进行打包到rockdev, ./build.sh firmware rockdev指向output/firmware目录
再执行 ./build.sh updateimg 打包,会在output/firmware目录下生成update.img, 编译后的文件会进入bool.img文件

2.单独编译,如kernel开发,Uboot开发
单独编译kernel:在SDK根目录下, ./build.sh kernel ,单独编译,可能还需要更改kernel目录下的deconfig改为.config
单独编译kernel 内核,设备树 编译内核的时候会一起编译设备树,
得到kernel.img(内核镜像boot.img), resource.img(设备树镜像),
俩者会和内核DTB打包到boot.img,
./build.sh kernel
烧录:
1.整体烧录:rockdev工具下,直接烧写固件,需要时Loadar模式,
2.单img烧录,单独烧写boot.img, kernel单独编译后会存在这,先烧写一个Linux固件,再将固件生成的paremeter.txt, 注意里面img的后面的地址,需要再最前面进行修改。
1. 首先将rockdev下默认的cfg文件导入到界面,然后修改各个img的名字,没有的删掉,匹配好自己编译好的固件的img名字,update.img不要管。可以对照parameter.txt文件对照,
2. 然后修改路径,指向你的img路径,
3. 最后比对地址,直接烧进去就可以

可以用串口MobaXterm查看,ssh
2.make menuconfig

/搜索
空格切换
M 把驱动编译成模块
* 把驱动编译到内核里面
无 不编译
[] * 无
<> M * 无
()字符串,16进制数
1. 图形化界面,里面的选项是Kconfig,也就是菜单,kernel目录下的图形化界面,会包含下面目录所有的Kconfig,所以在字符设备下多了个Kconfig,需要在上一级目录包含,source命令。
Kconfig 配置选项定义子文件
.config配置文件 实际编译的配置
deconfig配置文件 系统默认配置文件
![]()
saveconfig精简配置保存 make saveconfig 只保存非默认值的配置
2.更改了make menuconfig,还需要将这个配置文件deconfig修改,因为kernel的Makefile会使用deconfig配置文件,修改之后的.config配置文件需要覆盖deconfig,这样图形化界面才会有我添加的Kconfig
3.source “路径” 上一级目录下,打开vim Kconfig,包含下一级的 上一级Kconfig包含这个Kconfig
source “init/Kconfig” 读取init目录下Kcongfig文件
4. .config查看
回到kernel目录, make menuconfig,drives目录下的char字符设备目录
查看变量没有,要在图形化界面保存
3.详解Makefile, Kconfig, .config
Makefile 菜的做法 炒
make是一个自动化构建工具,通过读取 Makefile文件来管理编译过程。
make # 构建默认目标(通常是第一个目标)
make target # 构建指定目标
make -j4 # 使用4个并行任务加速构建
make clean # 执行清理操作
make -n # 干运行(显示但不执行命令)
obj-m的作用
告诉内核构建系统将指定的目标文件编译为可加载模块(.ko 文件)
obj-m += helloworld.o # 将 helloworld.c 编译为模块
obj-y- 编译进内核镜像 作用:将目标文件直接编译进内核镜像 (vmlinux)
obj-y += core.o # 将 core.c 编译进内核
obj-y += drivers/ # 编译整个 drivers 目录
obj-n- 不编译 作用:明确指定不编译某个目标
obj-n += deprecated.o # 明确不编译此文件
obj-- 条件编译 作用:根据配置变量动态决定编译方式
obj-$(CONFIG_NETWORK) += network.o
obj-m := 用于直接设置/重置模块列表
obj-m += 用于向现有列表添加新模块
Kconfig文件 菜单 辣椒炒肉
Kconfig语法
make menuconfig命令时,内核会去读取arch/ARCH/Kconfig, 所以需要将ARCH环境变量改为arm64,即平台架构
menu “菜单标题”
config 名字 #配置选项。
bool “ 名字” 新选项 bool -> y和n tristat y,m,n string 字符串类型
default 默认
depends on 名字 #前面依赖后面。后面厉害 select 反过来,前面厉害
choice #可选择项
endchoice
help “帮助信息” #
comment “用来做什么” #Kconfig 使用comment用于注释,在图像化界面显示注释
endmenu
基本语法架构



.config 食材清单
deconfig文件和.config文件
内核的配置文件 deconfig文件在arch/$(ARCH)/configs目录下, .config文件在内核源码的顶层目录下,编译内核使用.config配置
如果没有.config,使用deconfig配置
4.驱动编译内核过程
.helloworld字符编译,kernel下,因此使用单独编译kernel,单独烧录,过程如下
1. 驱动源码的字符设备路径下,新建目录,用来存放我的字符驱动hellworld.c
内核kernel/drivers 路径 char/字符设备 路径下
cp驱动程序hellworld.c 拷贝到字符设备目录下的新目录
cp命令后面加一个点.表示将文件或目录复制到当前目录。这个点代表当前工作目录
新建目录mkdir helloworld
2.新建目录下添加Kconfig,新建文件Kconfig
Kconfig,图形化加一个菜单,touch新建Kconfig,新建一个菜单,vim Kconfig,用Kconfig语法

3.上一级目录Kconfig包含下一级目录的Kconfig
source “路径” 上一级目录下,打开vim Kconfig,包含下一级的 上一级Kconfig包含这个Kconfig
4. .config查看
回到kernel目录, make menuconfig,drives目录下的char字符设备目录,看自己的变量
查看变量没有,要在图形化界面保存,注意保存
5.Makefile 编译,Makefile 如果与图形化界面产生联系, 上一级vim .config里面有个变量,将这个变量写到Makefile CONFIG_helloworld 变量
5.1 在新目录helloworld下,新建vim Makefile,
5.2 首先得找到变量。在kernel目录下查看.config, vim .config, 找到我的变量,如果没有,那就是第四步没有保存,
5.3 接着需要将这个变量保存到我的新建的Makefile里面,vim Makefile
obj-$(变量) += helloworld.o
5.4 还需要将上一级的Makefile包含新的Makefile, 上一级vim Makefile
obj-y +=helloworld/ 目录形式,需要/
6.最后,kernel目录,需要将新的.config覆盖原来的deconfig
vim build.h 根目录 查看config是哪个,通常是默认的
找到deconfig路径,直接cp过去覆盖,覆盖前可以cp保存一下原来的
cp .config deconfig 将当前的.config覆盖默认的
![]()
7.验证:使用MobeXtermG工具
根目录下单独编译内核 kernel ./build.sh kermel
编译烧录好,端口查看
dmesg | grep “hello”
dmesg- 内核日志查看器 功能:显示 Linux 内核环形缓冲区的内容
5.问题解决
1. make distclean 清空系统
2.Kernle目录下输入 export ARCH=arm64
更多推荐
所有评论(0)