申請字元裝置
第一種方法:檢視系統中哪個裝置號屬於空閒
我們可以檢視字元裝置,塊裝置
int
register_chrdev_region
(dev_t from,
unsigned count,
const
char
*name)
; from: 待申請的裝置號
count: 待申請的裝置號數目(次裝置號)
name: 裝置名稱(出現在/proc/devices)
返回: 成功返回0,失敗返回負值
優點:在申請裝置號之前,可以提前建立裝置節點
缺點:不利於驅動的推廣。如果現在驅動使用的主裝置號為250,放在別的開發板時,有可能這個主裝置已經被別人使用,造成申請裝置失敗!,我們檢視看哪個沒有使用,對他進行註冊,所以這種方法我們一般不使用
第二張方法:
核心知道我們那些沒有使用,所以我們讓核心來幫助我們來分配
dev_t dev;
intalloc_chrdev_region
(dev_t* dev,
unsigned baseminor,
unsigned count, constchar *name)
;dev: 儲存分配到的裝置號,如果核心幫你分配好,將分配的裝置號儲存在dev中。
baseminor: 希望分配的起始次裝置號,一般這個引數指定為0
count: 需要分配的裝置號數目(主裝置號不變,次裝置號依次+
1)name:裝置名稱(出現在/proc/devices)
請求核心動態分配count個裝置號,且次裝置號baseminor開始
優點:便於驅動的推廣。
缺點:在申請裝置號之前,無法提前建立裝置檔案,只有申請完裝置號以後才能建立。
同樣的,當我們不再使用這些的時候,我們將他歸還給作業系統
unregister_chrdev_region
(dev_t dev,
int count)
;dev:裝置號
count:裝置的個數
open函式的呼叫
應用程式呼叫open,首先呼叫c庫的open實現,c庫的open函式會儲存open對應的系統呼叫號到r7中,然後呼叫swi/svc觸發乙個軟中斷異常
cpu跳轉到核心建立好的異常向量表的入口位址vetor_swi,根據open的系統呼叫號,在系統呼叫表中找到自己對應的系統核心實現sys_open
呼叫sys_open核心函式(fs/open.c),核心會在sys_open函式中建立file物件,根據已經找到的cdev物件,從這個物件中的ops中取出硬體操作集合(led_fops,beep_fops),把這個集合賦值給file物件的f_op欄位
sys_open最終執行:
file->f_op->open(inode,file); //如果底層驅動的操作集合有open函式(led_open,beep_open)那麼就呼叫此函式,如果沒有,直接返回使用者空間。
至此open的呼叫就完畢!
字元裝置驅動種四個重要的結構體是什麼
.3
struct cdev
描述:這個資料結構就是核心用來描述字元裝置,類似你用struct people來描述乙個人一樣!
跟驅動開發相關的重要字段
struct cdev
;
struct file_operations
描述:提供了操作硬體的方法(一堆的函式指標,這些函式指標最終指向驅動的某些函式),並且這些方法最終會提供給使用者去使用。
struct file_operations myfops =
;//一旦完成這些初始化,最終核心就會使用這個結構
體,供使用者去使用。
linux字元裝置
字元裝置的定義 linux下有三種裝置 字元裝置 塊裝置 網路裝置等等。它們均以乙個檔案節點形式顯示在檔案系統的 dev目錄下 crw w 1 root tty 4,0 7月 11 09 11 tty0其中c代表字元裝置型別 字元裝置是指裝置無需緩衝即可直接進行讀寫的裝置,如滑鼠,鍵盤,串列埠裝置等...
字元裝置驅動 裝置號 裝置檔案
主裝置號用來標識與裝置檔案相連的驅動程式.用來反映裝置型別.次裝置號被驅動程式用來辨別操作的是哪乙個裝置.用來區分同型別的裝置.通過的是主裝置號.字元裝置檔案 本身沒有太多的內容,通過 字元裝置檔案 能找到 字元裝置驅動程式 字元裝置檔案 能將 應用程式 的需求傳遞給 字元裝置驅動程式.核心中如何描...
Linux通過字元裝置檔案控制GPIO
通過字元裝置檔案控制gpio電平通知微控制器訊號。獲取gpio號 notify gpio of get named gpio pdev dev.of node,notify gpio 0 if ret gpio init 0 註冊字元裝置 define gpio major 199 major de...