linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open(),close(),read(),write()等。
下面是乙個字元裝置驅動程式的簡單實現test.c
模組分析
1.初始化裝置驅動的結構體
struct file_operations test_fops = ;
定義了裝置io時所呼叫的函式,實際上在該模組中,上層read呼叫的就是底層的read_test,write呼叫write_test,open呼叫open_test,close呼叫release_test 。
2.module_init函式
int ******_c_init_module(void)
cdev_init(&cdevc,&test_fops);
cdevc.owner= this_module;
cdevc.ops=&test_fops;
result=cdev_add(&cdevc,dev,1);
if(result)
printk("error %d adding test",result);
return 0;
}(1)首先mkdev乙個裝置,test_major和test_minor分別定義在檔案的前面
unsigned int test_major=253;
unsigned int test_minor=0;
(2)然後註冊乙個範圍內的裝置編號,
result = register_chrdev_region(dev,1,"test");
該函式原型是
三個引數分別表示:第一次在預期的範圍內的裝置編號,連續數的裝置所需數量,這個名字的裝置或驅動程式。
(3)printk在核心中類似printf函式,列印出兩個裝置號。
(4)初始化字元裝置結構體cdev_init(&cdevc,&test_fops);
兩個引數分別表示:這個結構的初始化,本裝置的file_operations,
函式的功能是:記住fops cdev初始化,使之可以新增到系統和cdev_add。
(5)為字元裝置的結構cdevc賦值
(6)呼叫int cdev_add ( struct cdev *p, dev_t dev, unsigned count);
作用:cdev_add 將p結構體加入到系統的裝置,使其立即生效。 乙個負的錯誤**返回失敗。
3.module_exit();函式
void ******_c_cleanup_module(void)
函式cdev_del —從系統中移除乙個字元裝置
函式unregister_chrdev_region
返回的裝置數字範圍
4.底層函式設計
演示:編譯,make(makefile參見http://blog.csdn.net/wanxiao009/archive/2010/06/13/5669665.aspx)
生成test.ko
minicom登入開發板,
傳送到開發板中,
chmod +x test.ko
建立裝置節點 mknod /dev/test c 253 0(253 0 就是test_major,test_minor)
insmod test.ko
如下圖所示
說明字元驅動可以成功新增到核心模組中 ^_^!
Linux裝置驅動之字元裝置驅動
一 linux裝置的分類 linux系統將裝置分成三種基本型別,每個模組通常實現為其中某一類 字元模組 塊模組或網路模組。這三種型別有 字元裝置 字元裝置是個能夠像位元組流 類似檔案 一樣被訪問的裝置,由字元裝置驅動程式來實現這種特性。字元裝置可以通過檔案系統節點來訪問,比如 dev tty1等。這...
Linux裝置驅動之字元裝置(三)
在linux裝置驅動之字元裝置 一 中學習了裝置號的構成,裝置號的申請與釋放。在linux裝置驅動之字元裝置 二 中學習了如何建立乙個字元裝置,初始化,已經註冊到系統中和最後釋放該字元裝置。本節將結合前兩節學到的知道,編寫乙個簡單的字元裝置驅動。最後總結一下字元裝置驅動的模型。include inc...
Linux驅動基礎 platform裝置驅動
以高通平台為例,會在kernel arch arm mach msm下的相應的board c檔案裡邊用 dt machine start 這個巨集定義一系列的晶元。以高通8916為例 在kernel arch arm mach msm board 8916.c檔案裡定義了 當然下面使用哪個要看一下。...