一般而言,驱动开发者会在内核源代码的drivers 目录内的相应子目录中增加新设备驱动 的源代码或者在arch/arm/mach-xxx 下新增加板级支持的代码,同时增加或修改Kconfig 配置 脚本和 Makefile 脚本,那么如何添加了?
在前面搭建了arm虚拟开发板,使用的内核是3.16的版本。
内核代码的编写都有一般的固定格式,基本包括模块加载,卸载和GPL协议等,下面是一个简单的内核模块代码hello.c:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
static int __init hello_init(void)
{
printk(KERN_INFO"Hello World\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO"Exit Module\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
将此代码放置到内核源码 drivers/i2c 目录下
修改Make file 添加hello的编译选项
然后到内核根目录下编译内核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- O=./out_vexpress_3_16 LOADADDR=0x60003000 uImage -j8
编译完成后,可以在 out_vexpress_3_16/deivers/i2c下看到hello.o 的文件。
把新生成的uImage 放到tftp文件夹下,启动虚拟开发板,可以看到在启动打印的部分有
说明编写的内核模块已经加载。
这样写的内核模块不规范,在make menuconfig 时,无法配置hello 模块不编译,为了能在menuconfig 配置时有hello模块的配置,需要秀给Kconfig,添加如下内容
其中 config 后面内容为Makefile配置hello.o 等号前面显示的内容,即配置选项,boolean为menuconfig配置界面显示的内容。default 是一个bool内型的变量,Y 编译,N不编译,M编译为模块,即.ko文件,在此例中没有M的配置。bool 后面的内容为界面显示选项后面的减短说明。help为帮助信息。
配置后保存,然后make menuconfig 查看是否 有hello 的配置
若要是menuconfig配置的选项加载到内核编译环境中去,还要修改Makefile的文件,将原先的y变为$(HELLO_WORLD)
但这样在原内核文件中添加文件不利于以后代码的管理和优化,可以做到把自己写的代码单独放置到一个文件中
在内核源码的driver目录下建立test的文件夹,树形目录为
在内核中添加目录和子目录时,需要为新增的目录和子目录添加Kconfig 和 Makefile 文件,而且新增目录的父目录的Kconfig 和Makefile 也需要修改,以便新增的文件能被引用。
在test目录下添加Kconfig
# Test driver Configuratioon
menu "TEST Driver"
comment "TEST Driver"
config CONFIG_TEST
bool "TEST support"
config CONFIG_TEST_TWO
tristate "Test two interface"
depend on CONFIG_TEST
endmenu
为了使这个Kconfig起作用,修改上层目录的Kconfig.增加
source "drivers/test/Kconfig"
脚本中的source 意味着应用新的Kconfig文件。
同样在test目录下添加Makefile文件
#Makefile for TEST
obj-$(CONFIG_TEST) += test_three.o
obj-$(CONFIG_TEST_TWO) += test_two.o
obj-$(CONFIG_TEST_ONE) += test_one/
在test_one下添加Makefile
#Makefile for TEST—ONE
obj-$(CONFIG_TEST_ONE) += test_one.o
修改test父目录下的Makefile,添加如下脚本
obj-$(CONFiG_TEST) += test/
添加完毕后test目录结构为
回到内核根目录,make menuconfig查看