1,裝置
linux檔案系統/dev/下通常存放了一系列裝置名稱。對裝置的訪問,即訪問這些檔案。
ls -l /dev/ 能看到這些裝置的一些基本資訊。如下圖所示
了解過linux下檔案型別的小夥伴應該對哪些是字元裝置、塊裝置不會感到陌生了。(bcd-lsp分別是塊、字元、目錄、普通、鏈結、套接字、管道)
root後面 那兩個逗號隔開的數字是裝置的主裝置號和次裝置號。那我們跳到下乙個概念吧。
2,裝置號
裝置號分為主裝置號和次裝置號;
主裝置號標識裝置對應的驅動程式,次裝置號由核心使用,區分同乙個型別的多個裝置,如兩個串列埠。個人認為了解這些就夠了。我們需要重點關注的是驅動程式裡面如何表達這些概念,也就是下一步。
dev_t devno //定義裝置號,資料型別為dev_t,實際是乙個32位的數。
devno = mkdev(int major, int minor); //major minor 即我們看到的程式設計師給出的203,0等這些數字。習慣上限於255個主裝置號,255個次裝置號 devno = major << 20 | minor;
int major = major(dev_t devno);
int minor = minor(dev_t devno); //與上面的相反,如果你想通過dev_t devno獲得主裝置號和次裝置號的話,可以這麼做。
3,分配和釋放裝置號
直接上**
#include
int register_chrdev_region(dev_t first, unsigned int count, char *name);
void unregister_chrdev_region(dev_t first, unsigned int count);
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);
引數說明:
dev_t first :mkdev();獲取得到的裝置號,
unsigned int count :連續裝置編號的個數
char *name :檔案系統中看到的裝置驅動的名稱,cat /proc/devices 或 ls /dev/下能看到的
初始化時需要register,退出時需要unregister。
alloc顧名思義,動態分配。經常認為通用pc隨機分配,嵌入式產品需提前規劃好,故盡量用靜態。
register成功返回0,失敗返回負的錯誤碼,時刻謹記,可能失敗,所以要新增if判斷。
驅動程式員們經常這樣寫:
4,裝置節點
當你驅動程式按上面的步驟寫好後,編譯並且insmod。你會發現檔案系統中:
cat /proc/devices/下會出現你新增的裝置名稱,和主裝置號。但是/dev/下並沒有存在你所註冊的dev。這是因為你還沒有建立裝置節點。這時你需要執行如下命令:
mknod /dev/name c $major minor
你可以確定count 個裝置節點,根據你**中register時指定的count個數。
動態分配主裝置號有乙個缺點:無法預先建立裝置節點。不過,你可以通過/proc/devices/中獲得。如果要寫成指令碼自動分配,可以參考書page 51,有乙個很棒的shell指令碼,幫我們完成了。
最後附上幾行簡單的完整的註冊裝置號程式:
1 #include
2 #include
3 #include
4 #include //note: register_chrdev need it
56 module_license("dual bsd/gpl");
78 static int __init scull_init(void)
9 else
2122 return 0;
23 register_fail:
24 unregister_chrdev_region(devno, 1);
25 }
26 static void __exit scull_exit(void)
27 33
34 module_init(scull_init);
35 module_exit(scull_exit);
關於裸裝置的一些網札
1 什麼叫做裸裝置?裸裝置,也叫裸分割槽 原始分割槽 是一種沒有經過格式化,不被unix通過檔案系統來讀取的特殊字元裝置。它由應用程式負責對它進行讀寫操作。不經過檔案系統的緩衝。2 如何辨別裸裝置?在unix的 dev目錄下,有許多檔案,其中有兩個大類 字元裝置檔案和塊裝置檔案。字元裝置特殊檔案進行...
USB裝置的一些概念
每個usb裝置有乙個或多個配置來控制其行為 每個配置中都含有乙個或多個介面 裝置的介面具有乙個或多個端點,每個usb裝置在主機看來就是一些端點的結合,提取乙個端點的位址 緩衝區長度 資料傳輸方向 類別等資訊,就把乙個端點封裝成乙個管道,利用這個管道控制代碼就可以實現主機與乙個記憶體緩衝區和裝置多個端...
一些簡單的裝置驅動函式
華清遠見嵌入式學院講師。open 函式 功能 開啟裝置檔案 原型 include include include int open const char pathname,int flag 說明 利用flags指定的屬性開啟表示pathname上指定字元的裝置檔案。通常,pathname上指定的位置...