當我們對字元裝置進行程式設計的時候,需要做一些常有的準備工作,獲取裝置號,對裝置檔案操作函式的註冊,檔案資訊的初始化,檔案的核心表現形式,向核心的註冊等等.
對字元裝置的訪問是通過檔案系統內的裝置名稱進行的,通常在/dev目錄下.
使用ls -l 每行的第乙個字元用來識別該檔案型別,c就是字元裝置驅動檔案.b就是塊裝置驅動檔案.
核心通過主次裝置號來進行管理裝置.
主裝置號表示對應的驅動程式(雖然linux允許多個驅動程式共享主裝置號,但是絕大部分的裝置還是乙個主裝置號對應乙個驅動程式),次裝置號表示具體的裝置編號.
使用ls -l的命令,顯示在使用者組後面的兩列資料就是主次裝置號.
dev_t:乙個32位的數,12位表示主裝置號,20位表示次裝置號.
為了避免造成衝突,我們不能自己直接定義主次裝置號,應該使用函式來獲得主次裝置號.
major(dev_t dev);//獲得主裝置號
minor(dev_t dev);//獲得次裝置號
mkdev(int major,int minor);//將主次裝置號轉化為dev_t型別
int register_chrdev_region(dev_t from,unsigned int count,char * name);//獲得裝置號
引數:from:已經知道了主裝置號的裝置號
count:請求連續裝置編號的個數,如果很大會和下乙個主裝置號重疊,但是只要是分配通過的,都是可以正常使用的.
name:該型別裝置的名稱.
返回值:成功返回0,失敗返回失敗碼.如果是負數,則該請求的編號區域不可用.
int alloc_chrdev_region(dev_t *dev,unsigned int firstminor,unsigned int count,char *name);//獲取主裝置號
引數:dev:用於輸出,在成功呼叫後儲存以分配的第乙個編號
firstminor:要使用使用的第乙個次裝置號,通常為0
count:請求連續裝置編號的個數,如果很大會和下乙個主裝置號重疊,但是只要是分配通過的,都是可以正常使用的.
name:該型別裝置的名稱.
返回值:成功返回0,失敗返回失敗碼.
void unregister_chrdev_region(dev_t first,unsigned int count);//釋放裝置編號
引數:first:釋放的裝置編號的乙個編號
count:需要釋放的裝置號的個數.
通常在清除函式中呼叫.
已使用主裝置號可以在/proc/devices檔案中檢視
/sys/dev目錄下有詳細的裝置號的使用情況
字元裝置使用檔案操作方式進行操作
file_operations:結構體,核心開放給驅動的乙個介面,通過這個結構體可以將對裝置檔案的讀寫等操作和驅動的讀寫操作連線起來.
實現介面的對接:
struct file_operations op = ;
file結構體:開啟的檔案的一些資訊
inode結構體:表示檔案
dev_t i_rdev:對表示裝置檔案的inode結構,該欄位包含了真正的裝置編號
struct cdev *i_cdev:表示字元裝置的核心的內部構建,當indoe指向乙個字元裝置檔案時,該欄位包含了指向struct cdev結構的指標
unsigned int iminor(struct inode *inode);//從indoe中獲得次裝置號
unsigned int imajor(struct inode *inode);//從indoe中獲得主裝置號
cedv結構體:表示字元裝置
struct cdev *my_cdev = cdev_alloc();//申請空間
cdev->owner = this_module;//所有者
//註冊介面函式
struct file_operations *fops;
cdev_init(my_cdev,fops);
int cdev_add(struct cdev *p, dev_t dev, unsigned count);
//告訴核心該結構的資訊,新增完了以後,這個裝置就可以使用了,所以要所有東西初始化完成以後才能進行操作
引數:儲存有資訊的cdev結構體指標
dev裝置號
count:裝置數量,通常為1
返回值:0成功,錯誤返回錯誤碼
void cdev_del(struct cdev *p);//從系統中移除該字元裝置
字元裝置驅動程式設計思想
linux字元裝置驅動程式設計 1,實現入口函式 init 和解除安裝函式 exit 2,申請主裝置號 register chrdev region 與核心相關 3,註冊字元裝置驅動 cdev alloc cdev init cdev add 與核心相關 4,利用udev mdev機制建立裝置檔案 ...
Linux裝置驅動程式 字元裝置驅動程式設計
linux對裝置的操作與對檔案的操作是一樣的,可以看到乙個裝置所對應的檔案。我們平時用的read write等函式也可以用於裝置檔案。字元裝置 以字元為單位 按照順利操作 沒有快取區,故不支援隨機讀寫 例外 幀快取裝置,如顯示卡,是可以隨機訪問的 裝置號由主裝置號與次裝置號組成。主裝置號標識裝置對應...
裝置驅動例項 字元裝置驅動
在整個linux裝置驅動學習中,字元裝置驅動較為基礎。通過對它的學習,對裝置驅動進一步加深了解 cdev 結構體struct cdev 講下比較重要的成員變數 dev t dev 定義了32位的裝置號,其中12位是主裝置號,20位是從裝置號。獲取主裝置號 major dev t dev 獲取從裝置號...