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 實現ioctllong
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...