open 方法提供給驅動來做任何的初始化來準備後續的操作. 在大部分驅動中, open 應當進行下面的
工作:● 檢查裝置特定的錯誤(例如裝置沒準備好, 或者類似的硬體錯誤
● 如果它第一次開啟, 初始化裝置
● 如果需要, 更新 f_op 指標.
● 分配並填充要放進 filp->private_da
ta 的任何資料結構
但是, 事情的第一步常常是確定開啟哪個裝置. 記住 open 方法的原型是:
int (*open)(struct inode *inode, struct file *filp);
inode 引數有我們需要的資訊,以它的 i_cdev 成員的形式, 裡面包含我們之前建立的 cdev 結構. 唯一
的問題是通常我們不想要 cdev 結構本身, 我們需要的是包含 cdev 結構的 scull_dev 結構. c 語言使
程式設計師玩弄各種技巧來做這種轉換; 但是, 這種技巧程式設計是易出錯的, 並且導致別人難於閱讀和理
解**. 幸運的是, 在這種情況下, 核心 hacker 已經為我們實現了這個技巧, 以 container_of 巨集的形
式, 在 中定義:
container_of(pointer, container_type, container_field);
這個巨集使用乙個指向 container_field 型別的成員的指標, 它在乙個 container_type 型別的結構中, 並
且返回乙個指標指向包含結構. 在 scull_open, 這個巨集用來找到適當的裝置結構:
struct scull_dev *dev; /* device information */
dev = container_of(inode->i_cdev, struct scull_dev, cdev);
filp->private_da
ta = dev; /* for other methods */
一旦它找到 scull_dev 結構, scull 在檔案結構的 private_da
ta 成員中儲存乙個它的指標, 為以後更易存 取.
第 1/3 頁)2009-5-4 17:43:443.5. open 和 release-linux裝置驅動第三版(中文版)- -
識別開啟的裝置的另外的方法是檢視儲存在 inode 結構的次編號. 如果你使用 register_chrdev 註冊
你的裝置, 你必須使用這個技術. 確認使用 iminor 從 inode 結構中獲取次編號, 並且確定它對應乙個
你的驅動真正準備好處理的裝置.
scull_open 的**(稍微簡化過)是:
int scull_open(struct inode *inode, struct file *filp)
return 0; /* success */ }
**看來相當稀疏, 因為在呼叫 open 時它沒有做任何特別的裝置處理. 它不需要, 因為 scull 裝置設
計為全域性的和永久的. 特別地, 沒有如"在第一次開啟時初始化裝置"等動作, 因為我們不為 scull 保持
開啟計數.
唯一在裝置上的真實操作是當裝置為寫而開啟時將它擷取為長度為 0. 這樣做是因為, 在設計上, 用
乙個短的檔案覆蓋乙個 scull 裝置導致乙個短的裝置資料區. 這類似於為寫而開啟乙個常規檔案, 將
其截短為 0. 如果裝置為讀而開啟, 這個操作什麼都不做.
在我們檢視其他 scull 特性的**時將看到乙個真實的初始化如何起作用的.
linux驅動開發
這兩天在公司由於一直沒有太過於繁重的任務,於是便給分配了驅動開發的任務,之前一直不明白驅動開發和普通的嵌入式開發到底有什麼區別,然後有沒有經過系統的學習,於是就一直愣在那裡。不過慢慢的還是經過查資料,雖然 沒有編寫出來,但是對於系統的一些東西學習的終於有了一定的了解,感覺這個十分的重要,也為了給自己...
Linux驅動開發之DRM驅動
qq群 852283276 b站 主頁 drm 驅動程式開發 開篇 drm 驅動程式開發 vkms 最簡單的drm應用程式 single buffer drm 驅動是如何建立 fb device 的 linux中的drm 介紹 linux graphic dri 顯示子系統 介紹1 xilinx d...
Linux驅動開發步驟
1 在kconfig檔案中新增選項,如下 config ys qdec tristate ys qdec help ys qdec 2 在makefile檔案中新增編譯設定,如下 obj config ys qdec ys qdec.o 以上兩步做好,就可以在menuconfig中選擇,把你的驅動檔...