久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > Linux字符設備驅動模型之字符設備初始化(hua)

Linux字符設(she)備驅動模型之字符設(she)備初始化 時間:2018-09-29      來源:未知(zhi)

因為Linux字符(fu)設備驅動主(zhu)要(yao)依賴于struct cdev結構(gou),原型為:

所(suo)(suo)以我(wo)們需要對所(suo)(suo)使用到的結構成(cheng)員進(jin)行配置,驅動開發(fa)所(suo)(suo)使用到的結構成(cheng)員分別為:【unsigned int count;】、【dev_t dev;】、【const struct file_operations *ops;】。

開發流程如下(xia)圖:

一(yi)、字符設備驅動初始(shi)化

1、分配設備cdev

Cdev變(bian)量的定(ding)義可以采用靜態和(he)動態兩種方法進行分配(pei)(pei)。靜態方法直接分配(pei)(pei)內(nei)存,而動態方法隨機分配(pei)(pei)內(nei)存。

靜態分配(pei)cdev:

定義:struct cdev mdev;

mdev即代(dai)表(biao)相應(ying)的字符設備空間地址。

動態(tai)分配cdev:

定(ding)義:struct cdev *pdev = cdev_alloc();

pdev即代表(biao)對于(yu)的字符設(she)備的空間(jian)地址。

2、初始(shi)化設備cdev

Linux內核中(zhong),字符設(she)備struct cdev的(de)初始化(hua)使用(yong)cdev_init。其原(yuan)型如下:

參數:

cdev:待初始化(hua)的struct cdev結構(gou)

fops:設備對應的(de)操作(zuo)函數集

由原型所要求的(de)參數可知,需要初始(shi)化一(yi)個字符設(she)(she)備(bei)(bei)(bei)(bei),必須根(gen)據申(shen)請一(yi)個struct cdev結構的(de)空(kong)間,然后對其成(cheng)員(yuan)進行配置。即實現設(she)(she)備(bei)(bei)(bei)(bei)的(de)操作函數集、為設(she)(she)備(bei)(bei)(bei)(bei)申(shen)請設(she)(she)備(bei)(bei)(bei)(bei)號(hao)(包括主設(she)(she)備(bei)(bei)(bei)(bei)號(hao)和次設(she)(she)備(bei)(bei)(bei)(bei)號(hao))、指定此類(lei)型的(de)字符設(she)(she)備(bei)(bei)(bei)(bei)有多少個相(xiang)同設(she)(she)備(bei)(bei)(bei)(bei)。

3、注冊(ce)設備(bei)cdev

Linux內核中字符設(she)備的注冊(ce)使用cdev_add函數來進行完成注冊(ce)。其原型如下:

其(qi)相關參數定義(yi)為:

p:待添加到內核中的字符設備結構,即為(wei)struct cdev。

dev:設備號

count:該類設備(bei)的設備(bei)數量,各(ge)個設備(bei)的區別體(ti)現為從設備(bei)號。

在開發驅動時,當確定了字(zi)符(fu)設(she)(she)備(bei)的結構(gou),主(zhu)設(she)(she)備(bei)號(hao)和從設(she)(she)備(bei)號(hao)、設(she)(she)備(bei)的數量,就可以使用cdev_add函數將相(xiang)應的字(zi)符(fu)設(she)(she)備(bei)添加到Linux內核驅動中進(jin)行注冊(ce)。

4、硬件初始化(hua)

關于硬(ying)件的初(chu)始(shi)化就簡(jian)單了。直接根(gen)(gen)據(ju)所需要(yao)操作(zuo)的字(zi)符設備,閱(yue)讀器(qi)Datasheet,然后根(gen)(gen)據(ju)Datasheet進行硬(ying)件的配置即可。

二(er)、設備操作和(he)驅(qu)動操作映射

從上圖基本可知(zhi),在用戶空(kong)間的每一種硬件設備操(cao)(cao)作函數,在內核空(kong)間通(tong)用有一個(ge)映射操(cao)(cao)作函數實現。

•int (*open) (struct inode *, struct file *):打開設備,響應open系統

•int (*release) (struct inode *, struct file *):關閉設備(bei),響應(ying)close系統調用

•loff_t (*llseek) (struct file *, loff_t, int):重定位(wei)讀寫指(zhi)針,響應lseek系統調用

•ssize_t (*read) (struct file *, char __user *, size_t, loff_t *):從設(she)備讀(du)取數(shu)據,響應read系(xi)統(tong)調用

•ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *):向(xiang)設(she)備寫入數據,響應write系統調用

從以上函數(shu)指針操作方法中可以提取(qu)出兩(liang)個重要的參數(shu)成員,即(ji)為struct file和struct inode。

【struct file】:在(zai)(zai)Linux系統中,每一個打開的(de)(de)文(wen)(wen)件(jian),在(zai)(zai)內核中都(dou)會對應的(de)(de)關聯一個struct file結(jie)構體,它由內核在(zai)(zai)打開文(wen)(wen)件(jian)時創建,在(zai)(zai)文(wen)(wen)件(jian)關閉后(hou)釋放(fang)。

其非常重要的成員(yuan)有:

loff_t f_pos /*文件(jian)讀寫指針*/

struct file_operations *f_op /*該文件所對(dui)應的操(cao)作(zuo)*/

【struct inode】:每一(yi)個(ge)存在于文(wen)件(jian)系統(tong)里面的(de)文(wen)件(jian)都會(hui)關(guan)聯一(yi)個(ge)inode 結(jie)構(gou)(gou),該結(jie)構(gou)(gou)主要用來記錄文(wen)件(jian)物理上(shang)的(de)信息。因此, 它和(he)代(dai)表打(da)開文(wen)件(jian)的(de)file結(jie)構(gou)(gou)是(shi)不(bu)同(tong)的(de)。一(yi)個(ge)文(wen)件(jian)沒(mei)有被(bei)打(da)開時不(bu)會(hui)關(guan)聯file結(jie)構(gou)(gou),但是(shi)卻(que)會(hui)關(guan)聯一(yi)個(ge)inode 結(jie)構(gou)(gou)。

在struct inode結(jie)構中(zhong),dev_t i_rdev尤(you)其重要,表示設備號。

三、struct file_operations結構(gou)常用設備(bei)操作解析(xi)

1.open設備操作

根據原型可知,open設(she)備函(han)(han)數(shu)方法是在進(jin)行開始(shi)啟用操作(zuo)設(she)備時的初始(shi)化工作(zuo),與用戶空間的open函(han)(han)數(shu)對應,通常情況下,open函(han)(han)數(shu)實現:

(1)表明(ming)次設備(bei)號

(2)啟用(yong)設備

當然,如果在(zai)啟用(yong)設備時,不需要任何(he)的準備操(cao)作或者初始(shi)化操(cao)作,那么(me)open函(han)數(shu)可以為空函(han)數(shu),不實現。

2.release設備操作

release函(han)數(shu)方法(fa)的作(zuo)用正好和open函(han)數(shu)方法(fa)的作(zuo)用相反,它在(zai)(zai)設(she)(she)備(bei)關(guan)閉時(shi)用到,與用戶(hu)空(kong)間(jian)的close對應。通(tong)常用來(lai)進行關(guan)閉設(she)(she)備(bei)的實(shi)現。如果(guo)所操(cao)作(zuo)的設(she)(she)備(bei)在(zai)(zai)關(guan)閉時(shi)不需要其他(ta)操(cao)作(zuo),那么(me)使其為(wei)空(kong)函(han)數(shu)即可。

3.read設備操(cao)作

read方法主要(yao)完成兩件(jian)事:

(1)訪問硬件操作,從(cong)設備中讀取數(shu)據。

(2)將(jiang)從設備端讀取到(dao)的數據返(fan)回給用(yong)戶空間的應用(yong)程(cheng)序read函數。

其read方法的(de)具體原(yuan)型可分析(xi)如下:

ssize_t (*read) (struct file *filp, char __user *buff, size_t count, loff_t *offp)

參數分析:

filp:與字符設備文件關聯(lian)的file結構指針, 由內核創建(jian)。

 buff : 從設(she)備(bei)讀取到(dao)的數據(ju),需(xu)要保存到(dao)的位(wei)置。由read系統調用提供該參數。

count: 請求傳輸的數據量,由read系統調(diao)用提供(gong)該參(can)數。

offp: 文件的讀(du)寫位置,由內(nei)核從file結(jie)構(gou)中取出后(hou),傳(chuan)遞進來。

那么(me)實際上在這里就存(cun)在了一個問題,從內核空間(jian)(jian)如何將數據返回給用戶空間(jian)(jian)???

在Linux內(nei)核(he)中,為從(cong)內(nei)核(he)空(kong)(kong)間將(jiang)數據返回到用(yong)戶空(kong)(kong)間提供了函數方法(fa),即為:copy_to_user。其原型如下:

之所以(yi)采用(yong)(yong)copy_to_user函數(shu)的(de)原因(yin)是(shi),buff參數(shu)來(lai)源于用(yong)(yong)戶空(kong)間的(de)指針(zhen),這(zhe)類指針(zhen)在內核(he)(he)空(kong)間中不(bu)能(neng)直(zhi)接被內核(he)(he)代碼直(zhi)接引用(yong)(yong),所以(yi)必須采用(yong)(yong)拷貝的(de)方式進行數(shu)據的(de)傳遞。具體的(de)操作過程如下圖(tu)表示:

4.write設備操作

write函數方法也主(zhu)要完成兩(liang)件事:

(1)從應用程序(xu)提供的(de)地址中取(qu)出數據到內核空間。

(2)訪問硬件設備(bei),將數據(ju)寫入到設備(bei)中(zhong)。

write函(han)(han)數方(fang)法直(zhi)接對應于用戶空間的write函(han)(han)數。

ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *)

write函數(shu)(shu)方法(fa)的參數(shu)(shu)基本上和(he)read函數(shu)(shu)方法(fa)類似,在(zai)此不(bu)再(zai)做解(jie)釋。

那么實際上在此(ci)也存(cun)在一(yi)個(ge)問題,如何將數據從用戶空(kong)間取出到內核空(kong)間使用???

實(shi)際(ji)上Linux內(nei)核中也提(ti)供了相應的方(fang)法(fa)函(han)數,將(jiang)用戶空(kong)間的數據拷貝(bei)到內(nei)核空(kong)間進行使用,其(qi)方(fang)法(fa)為:copy_from_user。原型如下:

四、設(she)備驅動(dong)注銷

當(dang)內核中不再(zai)需(xu)要使用一個字(zi)(zi)符設備時,我(wo)們可以在內核中將相(xiang)應的(de)設備驅動(dong)程序進(jin)(jin)行卸(xie)載。那(nei)么(me)就需(xu)要對其字(zi)(zi)符設備進(jin)(jin)行注銷(xiao)。Linux內核中為我(wo)們提供了cdev_del函(han)數來完成字(zi)(zi)符設備的(de)注銷(xiao)。其原型如下:

上一篇:線程互斥與同步

下一篇:ARM異常處理

熱點文章推薦
華清學員就(jiu)業榜單
高薪學員(yuan)經驗(yan)分享(xiang)
熱點新(xin)聞(wen)推薦(jian)
前臺專線(xian):010-82525158 企業培(pei)訓洽談專線:010-82525379 院(yuan)校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部