1 簡單的字元裝置

2021-09-22 04:58:37 字數 2022 閱讀 9732

1.2 初始化字元裝置

1.3 實現需要的檔案操作

2.驅動**檔案

1.實現步驟

首先想要實現乙個字元裝置,需要以下3步

註冊裝置號

初始化字元裝置

實現需要的檔案操作

1.1 註冊裝置號

1.1.1 主次裝置號以及裝置id

一般情況下,裝置的註冊是在模組載入入口所指向的函式中完成的。

1)先將主次裝置號合成為裝置id,這裡需要用到linux核心提供的巨集mkdev

2)通過裝置id在核心中對裝置進行註冊

【注意】 載入函式中的申請資源和解除安裝函式中的釋放資源要一一配對

//把主次裝置號合併生成裝置id

dev_t devno =

mkdev

(led_ma, led_mi)

;//註冊裝置號:

//"newled"是裝置的名字,註冊成功後可以在 /proc/devices檔案中看到這名字

//ret返回值用於判斷是否成功

ret =

register_chrdev_region

(devno, led_num,

"newled");

cdev_del

(&led)

;//刪除裝置

unregister_chrdev_region

(devno, led_num)

;//取消註冊

1.1.2 mkdev巨集的實現
/*****核心中mkdev巨集的實現*******/

// 檔案/include/linux/kdev_t.h

#define minorbits 20

#define mkdev(ma,mi) (((ma) << minorbits) | (mi))

//作用:將主裝置號ma左移20位與次裝置號mi相或,最後得到裝置id

/* | 31~20位 | 19~0位 |

| 主裝置號 | 次裝置號 |

*/

1.2 初始化字元裝置
1)宣告字元裝置cdev型別的變數

2)宣告檔案操作函式指標結構體,將函式指標指向相應的檔案操作函式

3)將裝置和檔案操作進行關聯

4)將字元裝置新增到系統之中

/*定義字元裝置*/

struct cdev led;

/*裝置的檔案操作函式指標結構體*/

struct file_operations led_fps=

;cdev_init

(&led,

&led_fps)

;//將裝置和檔案操作關聯起來

ret =

cdev_add

(&led, devno, led_num)

;//新增字元裝置到系統中

1.3 實現需要的檔案操作

1.3.1物理位址對映

由於硬體的實體地址和核心的位址是兩種不同的位址,所以在核心中是不能直接訪問硬體的實體地址的,需要將硬體物理位址對映成核心的虛位址。

/*led實際的實體地址*/

#define led2_con 0x11000c40

/*ioremap對映後的位址*/

unsigned

int*led2con=

null

;/*把物理位址對映為核心虛位址*/

led2con =

ioremap

(led2_con,4)

;if(led2con ==

null

)

1.3.2 實現ioctl
long

led_ioctl

(struct file *file,

unsigned

int cmd,

unsigned

long arg)

return0;

}

2.驅動**檔案

led驅動

字元裝置驅動1 乙個簡單的字元裝置驅動示例

1.註冊主次裝置號 register chrdev region 和 alloc chrdev region 2.註冊字元裝置驅動 cdev init 初始化,cdev add 新增,註冊裝置驅動,cdev alloc 申請空間,cdev del 登出驅動 3.建立驅動的裝置檔案 class cre...

字元裝置驅動 1

字元裝置驅動 1 成於堅持,敗於止步 linux 字元裝置驅動結構 cdev 結構體 在 linux 2.6 核心中使用 cdev 結構體描述字元裝置,cdev 結構體的定義如 所示。1 struct cdev 2 cdev 結構體的 dev t 成員定義了裝置號,為 32 位,其中高 12 位為主...

字元裝置驅動1

1 cdev 結構體linux2.6 核心使用 cdev 結構體描述字元裝置 struct cdev cdev 的定義在 其中dev t 定義了裝置號為32位 前12位為主裝置號,後 20位為次裝置號 可以使用如下巨集呼叫來獲得主 次裝置號 major dev t dev minor dev t d...