1.概述:
在linux内核中增加程序需要完成以下三项工作:
将编写的源代码复制到Linux内核源代码的相应目录
在目录的Kconfig文件中增加新源代码对应项目的编译配置选项
在目录的Makefile文件中增加对新源代码的编译条目
2.实例
2.1 先把驱动代码usbtmc
(文件夹)复制到/usr/src/linux2.6.32/drivers/char
下
首先你要清楚你的模块应在内核源代码树中处于何处。
设备驱动程序存放在内核源码树根目录drivers/
的子目录下,在其内部,设备驱动文件进一步按照类别,类型等有序地组织起来。
字符设备存在于
drivers/char/
目录下块设备存放在
drivers/block/
目录下USB设备则存放在
drivers/usb/
目录下。
注意:
此处的文件组织规则并非绝对不变,例如:USB设备也属于字符设备,也可以存放在
drivers/usb/
目录下。例如我们把驱动程序
usbtmc
存放在drivers/char/
目录下,那么你要注意,在该目录下同时会存在大量的C源代码文件和许多其他目录。所有对于仅仅只有一两个源文件的设备驱动程序,可以直接存放在该目录下,但如果驱动程序包含许多源文件和其他辅助文件,那么可以创建一个新子目录。
此处,我们是把usbtmc
目录放在了drivers/char
目录下面
2.2 修改char目录下的Kconfig和Makefile
2.2.1 修改Kconfig
sudo gedit Kconfig
添加下面一句后
source"drivers/char/usbtmc/Kconfig"
它表示将usbtmc目录下的Kconfig
挂载到char目录下的Kconfig
里面(为了使本层的Kconfig
文件能起作用,我们需要修改父目录的Kconfig
文件,加入source
语句)
对驱动程序而言,
Kconfig
通常和源代码处于同一目录。如果你建立了一个新目录,而且也希望
Kconfig
文件存在于该目录中的话,那么就必须在一个已存在的Kconfig
文件中将它引入,需要用上面的
语句将其挂接在drivers/char
目录中的Kconfig
中。
2.2.2 修改Makefile
添加一句话:
obj-$(CONFIG_USBTMC)+=usbtmc/
这行编译指令告诉模块构建系统在编译模块时需要进入usbtmc/
子目录中。此时的驱动程序的编译取决于一个特殊配置CONFIG_USBTMC
配置选项。
3.在自己的驱动程序文件夹中添加Kconfig和Makefile
3.1 修改Kconfig
新建一个Kconfig
添加下面的话
menu "USBTMC"
comment"USBTMC Driver"
config USBTMC
tristate "USBTMC"
defaultn
help
If you say Y here,support for the usbtmc with computer interface will be compiled
into he kernel and accessible via device node. You can also say M here and the
driver will be built as a module named usbtmc.ko.
If unsure,say N.
endmenu
正确配置好后,我们在源码下执行sudo make menuconfig
后,在出现的Linux Kernel Configuration
图形界面中选择Device Drivers
下的character devcie
中,将会看到新加的USBTCM菜单,
3.2 修改Makefile
新建一个Makefile,添加下面的话
obj-$(CONFIG_USBTMC)+=usbtmc.o
此时,构建系统运行就将会进入usbtmc/
目录下,并且将usbtmc.
c编译为usbtmc.ko
模块
注:
如果驱动程序源文件可能不只有一个,可以把Makefile
做如下修改:
obj-$(CONFIG_USBTMC) += usbtmc.o
usbtmc-objs := usbtmc-main.o usbtmc-usb1.o
此时,usbtmc-main.c
和usbtmc-usb1.c
就一起被编译和连接到了usbtmc.ko
某块中。
4. 设定和编译
现在我们可以进入Linux内核目录下通过menuconfig
找到我们的USBTMC
选项(在Device_Drivers下的character devices里可以找到USBTMC),对其进行选定。然后退出,编译内核。
5. 删除
删除也很简单,首先在drivers/char
目录下删掉自己的驱动文件夹。其次再删除Makefile
和Kconfig
之前添加的东西。