買了tiny6410的開發板很久了,一直沒有開始弄,現在想學了又沒有了時間,只有利用週末的時間來學習,也打算開始用博客記錄自己的學習過程,要不然就都忘了。這個是最簡單的hello的驅動程序,自己按照友善之臂的例子一點點來的,寫一點遇到的問題。
1.首先在驅動目錄下建立模塊的源文件,這裏命名爲 my_mini6410_hello_module.c
假設linux目錄爲linux-2.6.38 則文件存放在linux-2.6.38/drivers/char/
按照例子中的程序照着寫了個代碼 分別是 模塊的加載和卸載。
/* file begin my_mini6410_hello_module.c */
static int __init my_hello_module_init(void) /* init 前面有兩個下劃線 裝載時調用的函數*/
{
printk("hello ! \n");
return 0;
}
static void __exit my_hello_module_cleanup(void) /* 卸載時調用的函數 */
{
printk("bye !\n");
}
module_init(my_hello_module_init); /* 這裏應該是掛接函數 */
module_exit(my_hello_module_cleanup);
MODULE_LICENSE("GPL");
/* file end */
2 將新的module加入編譯的內核代碼樹,
在char目錄下打開Kconfig配置文件 vi Kconfig
看到有類似 config XXXX
XXXX 的地方按照同樣的方式爲自己的module添加一個配置。
代碼如下 :
config MY_MINI6410_HELLO_MODULE /* 這個名字會在下面的makefile中使用到,和具體的代碼文件關聯 */
tristate “my mini6410 hello module” /* 這個名字是在使用 make menuconfig配置時顯示的模塊的名字 */
depends on CPU_S3C6410
help
this is my hello module
保存退出,在linux-2.6.38 目錄下 使用make menuconfig命令打開圖形菜單,在Device Drivers -> Character Drivers菜單中看到剛剛添加的項了,
使用空格鍵切換到M模式,選擇編譯爲模塊方式, “*”是編譯爲內核中。確定保存。
3.修改makefile文件
在上面修改後添加了編譯選項,但是還需要修改makefile文件,使得真正的將my_mini6410_hello_module.c這個文件編譯進去。使得內核的編譯選項和真正的源文件真正聯繫起來。
在char目錄下打開Makefile文件 : vi Makefile
按照同樣的格式 添加:
obj -$(CONFIG_MY_MINI6410_HELLO_MODULE) += my_mini6410_hello_module.o /* 這裏可以看出括號裏的大寫部分是kconfig中的配置項名,=後面則爲文件名 相同的.o文件名*/
4 。執行make ,在執行make modules。
這時my_mini6410_hello_module.ko就應該出現在 char目錄下了。通過ftp下載到開發板上,放在開發板 /lib/modules/ 'uname -r' / 下。
uname -r 根據單板使用的內核不同而不同,必須使用這個目錄,沒有的話新建這樣的目錄。我的是2.6.38-FriendlyARM
5 按照說明書上的指示,我直接使用下面命令
modprobe my_mini6410_hello_module 並沒有出現意料中的打新hello,呵呵 而是出現了錯誤信息: modprobe: module './my_mini6410_hello_module' not found,
通過在網上搜索知道在編譯並準備好一個內核模塊後,使用modprobe裝載之前需要更新依賴關係:
depmod
這個命令會重新生成 modules.dep 這個依賴文件
這時再運行 modprobe my_mini6410_hello_module 即出現了期待的打印信息。
使用 rmmod my_mini6410_hello_module 出現了卸載模塊的打印信息。
至此我的第一個hello的驅動就這樣結束了。