一週搞定MPU6050Linux驅動(2)
阿新 • • 發佈:2018-12-31
第2-3日
參考:
《Linux裝置驅動程式》 第三版
有了前面的原始碼學習和分析,對i2c驅動有了大概的認識。那麼接下來,我們就開始我們自己的mpu6500/6050驅動的編寫。這裡說一下,mpu6500和mpu6050在暫存器上基本沒什麼區別,只有version ID不同,6500的是0x70,6050是0x68。
之前分析了airk000的原始碼,發現他的驅動方式是在後臺完成6050的資料定時讀取。那麼,我們所需要實現的驅動,是對mpu6050/6500進行中斷讀取。並且包含了字元裝置驅動,用來在使用者空間獲取資料。
1、學習字元裝置驅動,實現fifo
在建立一個字元裝置之前,需要獲得一個或多個裝置編號。可以選擇靜態分配和動態分配,推薦動態分配。使用alloc_chrdev_region函式來進行裝置號的動態分配。
字元驅動的三個核心資料結構file_operations,file,inode
file_operations定義操作方法,包括字元的open,wirte,ioctrl等。
file結構表示一個開啟的檔案
inode在核心表示一個檔案實體,包含了大量的有關檔案的資訊。
讀出的數與寫入的數相同,說明核心函式能夠正常執行。
這裡需要注意的是,執行程式需要以sudo來執行,因為裝置驅動的許可權是root。第一次執行的時候,我沒有使用sudo,一直報錯,裝置無法開啟,fd返回-1。這個要注意。
折騰了兩個晚上,明天開始寫mpu6050/6500的驅動。
有什麼疑問或者交流的加我QQ475292178,請註明“交流探討”
- 在虛擬檔案系統VFS中的查詢對應與字元裝置對應 struct inode節點
- 遍歷字元裝置列表(chardevs陣列),根據inod節點中的 cdev_t裝置號找到cdev物件
- 建立struct file物件(系統採用一個數組來管理一個程序中的多個被開啟的裝置,每個檔案秒速符作為陣列下標標識了一個裝置物件)
- 初始化struct file物件,將 struct file物件中的 file_operations成員指向 struct cdev物件中的 file_operations成員(file->fops = cdev->fops)
-
回撥file->fops->open函式