向Linux内核添加驱动的步骤详解

Posted 正在起飞的蜗牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了向Linux内核添加驱动的步骤详解相关的知识,希望对你有一定的参考价值。

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等等的笔试题、面试常问问题等等知识,无论是学习基础知识、面试刷题、交流工作经验都是不错的选择。大家一起进步,欢迎留言交流。
链接:学习神器跳转

以上是关于向Linux内核添加驱动的步骤详解的主要内容,如果未能解决你的问题,请参考以下文章

添加自己的驱动程序到Linux内核(详解)

向 linux 内核 3.8.8 添加系统调用

Linux内核开发与Linux驱动开发有啥关系?

linux驱动开发insmod hello.ko失败

往android的内核添加驱动及 ueventd.rc 修改

linux如何加载驱动