Linux裝置驅動之《字元裝置驅動》

2021-05-22 20:08:17 字數 1708 閱讀 1373

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檔案裡定義了 當然下面使用哪個要看一下。...