Tiny6410 設(shè)備驅(qū)動之helloworld
在自己的工作目錄下建立helloworld_driver.c
#include
#include
//代碼遵守的license:BSDGPL
MODULE_LICENSE("DualBSD/GPL");
//代碼作者聲明
MODULE_AUTHOR("bruce");
//模塊初始化
staticint__inithello_init(void)
{
printk(KERN_ALERT"Helloworld!n");
return0;
}
//模塊退出
staticvoid__exithello_exit(void)
{
printk(KERN_ALERT"Goodbyeworld!n");
}
module_init(hello_init);
module_exit(hello_exit);
補(bǔ)充下:
1. printk輸出跟輸出的日志級別有關(guān)系,當(dāng)輸出日志級別比控制臺的級別高時,就會顯示在控制臺上,當(dāng)比控制臺低時,則會記錄在/var/log/message中。
2.printk()并不是設(shè)計用來同用戶交互的,雖然我們在hello-1就是出于這樣的目的使用它!它實(shí)際上是為內(nèi)核提供日志功能,記錄內(nèi)核信息或用來給出警告。因此,每
個printk()聲明都會帶一個優(yōu)先級,就像你看到的<1>和KERN_ALERT那樣。內(nèi)核總共定義了八個優(yōu)先級的宏,所以你不必使用晦澀的數(shù)字代碼,并且你可以從文
件linux/kernel.h查看這些宏和它們的意義。如果你不指明優(yōu)先級,默認(rèn)的優(yōu)先級DEFAULT_MESSAGE_LOGLEVEL將被采用。
#define KERN_EMERG"<0>"
#defineKERN_ALERT"<1>"
#define KERN_CRIT"<2>"
#define KERN_ERR"<3>"
#define KERN_WARNING"<4>"
#define KERN_NOTICE"<5>"
#define KERN_INFO"<6>"
#define KERN_DEBUG"<7>"
在同目錄下建立Makefile
KERNELDIR:=/home/workdir/kernel/linux-2.6.38
PWD:=$(shellpwd)
modules:
$(MAKE)-C$(KERNELDIR)M=$(PWD)modules
modules_install:
$(MAKE)-C$(KERNELDIR)M=$(PWD)modules_install
obj-m:=helloworld_driver.o
clean:
rm-rf*.o*~core.depend.*.cmd*.ko*.mod.c.tmp_versions*.order*.symvers
執(zhí)行makemodules生成helloworld_driver.ko文件。
將helloworld_driver.ko下載到開發(fā)板文件系統(tǒng)中,執(zhí)行insmodhelloworld_driver.ko加載驅(qū)動模塊,串口將打印如下信息:
成功!
卸載helloworld_driver.ko
成功!
這是最簡單的設(shè)備驅(qū)動示例!
補(bǔ)充知識:
insmod——載入模塊
insmod 就是install module的縮寫
功能說明:載入模塊。
語法:insmod [-fkmpsvxX][-o <模塊名稱>][模塊文件][符號名稱 = 符號值]
說明:Linux有許多功能是通過模塊的方式,在需要時才載入kernel。如此可使kernel較為精簡,進(jìn)而提高效率,以及保有較大的彈性。這類可載入的模塊,通常是設(shè)備驅(qū)動程序。
參數(shù)-f 不檢查目前kernel版本與模塊編譯時的kernel版本是否一致,強(qiáng)制將模塊載入。
-k 將模塊設(shè)置為自動卸除。
-m 輸出模塊的載入信息。
-o<模塊名稱> 指定模塊的名稱,可使用模塊文件的文件名。
-p 測試模塊是否能正確地載入kernel。
-s 將所有信息記錄在系統(tǒng)記錄文件中。
-v 執(zhí)行時顯示詳細(xì)的信息。
-x 不要匯出模塊的外部符號。
-X 匯出模塊所有的外部符號,此為預(yù)設(shè)值。
rmmod——刪除不必要的模塊 rmmod 即remove module的簡稱
功能說明:刪除模塊。
語法:rmmod [-as][模塊名稱...]
說明:執(zhí)行rmmod指令,可刪除不需要的模塊。Linux操作系統(tǒng)的核心具有模塊化的特性,因此在編譯核心時,務(wù)須把全部的功能都放入核心。你可以將這些功能編譯成一個個單獨(dú)的模塊,待有需要時再分別載入它們。
參數(shù):
-a 刪除所有目前不需要的模塊。
-s 把信息輸出至syslog常駐服務(wù),而非終端機(jī)界面。
lsmod——顯示已載入系統(tǒng)的模塊
lsmod 其實(shí)就是list modules的縮寫,即 列出所有模塊.
功能說明:顯示已載入系統(tǒng)的模塊。
語法:lsmod
說明:執(zhí)行l(wèi)smod指令,會列出所有已載入系統(tǒng)的模塊。Linux操作系統(tǒng)的核心具有模塊化的特性,因此在編譯核心時,無需把全部的功能都放入核心。你可以將這些功能編譯成一個個單獨(dú)的模塊,待需要時再分別載入。