在我们写完简单的驱动程序之后,实际上就是建立了以下一种连接关系: ** 设备号-设备描述-设备行为描述三者之间建立相应的联系! **
对缩写的 驱动程序进行测试,首先 通过insmod加载驱动程序到内核里,然后通过 dmesg 查看内核的输出信息。
==> 将驱动函数insmod到内核中后,可以写一个相对应的测试程序对驱动程序进行验证: (相应的驱动程序)
在终端使用如下指令进行操作:
示意图:
通过在终端中,执行测试程序生成的目标程序,进一步验证有没有调用到内核中的read write 函数!
(需要具体的事例进行详细的操作来进行理解!)
(1)、 在编写完相应的驱动程序源码之后,在终端直接执行make指令就能够生成相应的 *.ko 可执行程序文件,这个是怎么做到的呢?
(2)、其实是由于有 Makefile文件的存在,才能使得直接执行一个make 指令就能够编译出可执行文件!
ifneq ($(KERNELRELEASE),)
obj-m :=charDev.o
else
PWD := $(shell pwd) // 表示取当前的pwd值赋给PWD变量
KDIR := /lib/modules/'uname -r'/build // 取内核的build目录给KDIR
all:
make -C $(KDIR) M=$(PWD) // -C:表示change,change到内核源码里面去编译, M=$( ):指定了要编译驱动的源码目录;因此就该程序会再次进入我们这个makefile文件进行执行,接下来继续去判断 KERNELRELEASE 变量.......
clean:
rm -rf *.o *.ko *.mod.c *.symvers *.c~ *~
endif
在进行Makefile编写的时候,完全可以根据这里的详细内容进行相应的修改!
(1)、 所谓的make menuconfig就是配置Kconfig文件中相应的item的值,另外**配置完的make menuconfig之后,就会生成相应的 .config文件,可以通过 vim .config 来查看刚才通过图像界面进行的相关配置 **, .config文件是动态变化的,反应的是你执行make menuconfig之后进行的一些操作。
(2)、make 的实质: 遍历所有目录下的makefile,并依照makefile的内容编译相关代码。
(3)、对下面的这个进行相关的说明:
obj- $(CONFIG_MINI210_LEDS) += mini210_leds.o
// 在上一部分学到如何写makefile文件的时候,obj-*后面直接跟着的是m,而在这里是"$(CONFIG_MINI210_LEDS)",故这个跟在make menuconfig 中进行的操作有关, 如果你在make menuconfig 中选定了这个,故这里的$(CONFIG_MIN210_LEDS) 就为 Y,若没选定,在这里就为 M。
接下来是整体的知识框图,用来说明整体上 make menuconfig 和 make 操作的实质
大致的技术思路:
(1)、linux 下,所有的驱动都会按照类型进行分类,比如说你编写的是一个字符设备驱动,其位于 /driver/char/下,所以要想添加charDev驱动到内核中,首先要做的就是为charDev在/drive/char/Kconfig里面添加一个config条目,比如 TEST_CHAR 。
添加config 条目的书写规则
config CONFIG_TEST_CHAR
tristate "my first char device"
help // 用来对你所写的这个驱动函数进行相应的说明
My first char device
(2)、然后需要修改 linux-2.6.32.2/drive/char/Makefile 文件,在这个文件里面添加如下代码:
obj-$(CONFIG_TEST_CHAR) += charDev.o
(3)、需要将 charDev源代码copy到 linux-2.6.32.2/drivers/char下面
【实质说明: 其实通过第二步第三步,将内核源码注册到内核源码树中!】
(4)、 make menuconfig ,选中 CONFIG_TEST_CHAR项目,设定为 [M] 或者 [Y] .
在这里,通过 make menuconfig 指令进入到配置界面的时候,你刚才所添加的字符设备驱动位于 **”Character devices ----> “**中,就可以找到刚才所添加的配置信息。(编译完之后,可以通过vim .config查看有没有将该设备驱动进行相应的配置)
(5)、重新编译即可。