一般而言,驅動開發者會在內核源代碼的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查看