1、获取驱动源码
(1)驱动源码一般都是从设备厂商处获取;
(2)设备厂商给的驱动源码大体上是没有问题的,能加载但是效果不一定好,需要根据自己的板子进行适配;
2、驱动在内核中的两种形式
(1)直接编译进内核:内核启动时自动加载,无须在启动脚步中用insmod加载驱动。坏处是默认加载,没法使之不加载,不灵活,适合一些必须加载的驱动;
(2)单独编译成ko文件:需要内核启动后,用insmod命令手动加载驱动,好处是十分灵活,可以根据需要去选择是否加载驱动;
(3)在驱动调试阶段,推荐使用ko文件的方式比较方便;
(4)想深入连接驱动加载机制,参考博客:《内核加载驱动机制详解(module_init & module_exit)》;
3、添加驱动的步骤
(1)将驱动代码放到内核源码中合适路径下。内核源码是十分复杂的,源码都按照功能进行了分类,要按照分类来选择驱动代码存放的位置,不要破坏内核源码的结构,便于后期维护;
(2)将驱动源码添加到Makefile中,使之能被编译链接;
(3)在Kbuild体系中添加驱动代码的选项,也就是在"make menuconfig"中能对驱动代码进行配置;
(4)分别测试直接编译进内核和单独编译成ko文件,两种方式是否都能正常工作;
4、添加gslx680驱动为例
4.1、确认驱动源码
root@Ubunut220401:gslx680# tree
.
├── gsl_point_id
├── gslX680.c
├── gslX680.h
└── Makefile
0 directories, 4 files
(1)驱动源码包含三个文件:gslX680.c、gslX680.h、和gsl_point_id,其中gsl_point_id是编译好的二进制文件,厂商对这部分代码不开源;有的驱动源码全部是.c文件.h文件,这里的gsl_point_id文件可以看做是一个提前编译好的.o文件;
(2)此驱动源码涉及三个文件,文件数量不算多,直接添加到内核中也可以,但是为了演示多个文件的驱动代码(放一堆散文件在内核里不方便维护),这里将驱动代码以文件夹的方式添加;
4.2、确定gslx680驱动源码添加的位置
kernel/drivers/input/touchscreen/gslx680
(1)gslx680是触摸屏芯片,属于输入型外设;
(2)外设的驱动都放在内核的drivers目录中,里面已经为 触摸屏驱动源码专门创建了目录input/touchscreen;
4.3、在Makefile中添加驱动源码
4.3.1、修改drivers/input/touchscreen层的Makefile
obj-$(CONFIG_TOUCHSCREEN_FILTER) += ts_filter_chain.o
obj-$(CONFIG_TOUCHSCREEN_FILTER_GROUP) += ts_filter_group.o
obj-$(CONFIG_TOUCHSCREEN_FILTER_MEDIAN) += ts_filter_median.o
obj-$(CONFIG_TOUCHSCREEN_FILTER_MEAN) += ts_filter_mean.o
obj-$(CONFIG_TOUCHSCREEN_FILTER_LINEAR) += ts_filter_linear.o
obj-$(CONFIG_TOUCHSCREEN_FILTER_ZOOM) += ts_filter_zoom.o
obj-$(CONFIG_TOUCHSCREEN_FT5X06) += ft5x06_touch.o
# 新增下面的脚本
obj-y += gslx680/
(1)我们是在touchscreen目录里添加了gslx680文件夹,上面添加脚本的作用:当编译内核时会进到gslx680文件夹里进行编译;
(2)不清楚这句脚本具体含义的参考博客:《项目通用Makefile的编写(包含Makefile.build文件分析)》;
4.3.2、gslx680的源码中添加Makefile脚本
obj-$(CONFIG_TOUCHSCREEN_GSLX680) += gslx680_TS.o
gslx680_TS-objs += gslX680.o gsl_point_id
(1)CONFIG_TOUCHSCREEN_GSLX680:这个宏觉得是否编译gslx680驱动源码,以及是编译进内核还是单独编译成ko文件;
(2)上面就是通用的编译驱动的Makefile,不熟悉可参考博客:《编译驱动的Makefile详解》;
4.4、在Kbuild体系中添加配置项
config TOUCHSCREEN_FT5X06
tristate "FocalTech FT5X06 Touch Panel Controller"
depends on I2C
help
This enables support for FocalTech over I2C based touchscreens.
# 新增gslx680驱动配置项
config TOUCHSCREEN_GSLX680
tristate "GSLX680 Touch Panel Controller"
depends on I2C
help
This enables support for GSLX680 over I2C based touchscreens.
(1)在drivers/input/touchscreen目录下的Kconfig文件中添加上面gslx680的配置项,注意名字要和gslx680文件夹里Makefile使用的宏CONFIG_TOUCHSCREEN_GSLX680对应,不能出错;
(2)添加完成后,就可以"make menuconfig"命令来配置gslx680驱动源码;
(3)对Kbuild体系不熟悉的可参考博客:《Linux内核配置和编译原理 & menuconfig、Makefile、.config三者之间的关系》;
推荐
给大家推荐一个学校嵌入式知识的网站,博主在大学时候学习嵌入式知识、找工作的时候都在用这个网站,网站里有C语言、Linux等等的笔试题、面试常问问题等等知识,无论是学习基础知识、面试刷题、交流工作经验都是不错的选择。大家一起进步,欢迎留言交流。
链接:学习神器跳转