前面的字元裝置驅動框架有缺點,如:
(1)register_chrdev 函式只能指定主裝置號,無法指定次裝置號,會將乙個主裝置號下的所有次裝置號都使用掉。
(2)不能自動分配裝置號,需要在程式中利用巨集定義指定裝置號。
(2)不能自動建立裝置節點,需要手動 mknod /dev/*** c 《主裝置號》 《次裝置號》
我們接下來主要講如何自動分配裝置號、新的字元裝置註冊函式、自動建立裝置節點、使用 goto 集中處理錯誤。
1、建立描述裝置的結構體
定義結構體來直觀描述裝置資訊,每個裝置可定義不同結構體,當裝置要新增某項屬性時,直接向裝置結構體中新增。
2、分配和釋放裝置號
使用裝置號的時候向 linux 核心申請,需要幾個就申請幾個,由 linux 核心分配裝置可以使用的裝置號。
int
alloc_chrdev_region
(dev_t *dev,
unsigned baseminor,
unsigned count,
const
char
*name)
// 未指定裝置號,用來申請裝置號
intregister_chrdev_region
(dev_t from,
unsigned count,
const
char
*name)
// 指定了裝置號,直接用此函式註冊裝置號
void
unregister_chrdev_region
(dev_t from,
unsigned count)
// 釋放裝置號
mkdev 函式:用於將主裝置號和次裝置號轉換成 dev_t 型別。
標頭檔案:
#define mkdev(major,minor) (((major) << minorbits) | (minor))
// minorbits:20,成功執行返回 dev_t 型別的裝置編號
3、新的字元裝置註冊方法
在 linux 中使用 cdev 結構體表示乙個字元裝置。
(1)初始化 cdev 結構體變數 - cdev_init 函式
(2)向 linux 系統新增字元裝置(cdev 結構體變數)- cdev_add 函式
(3)解除安裝驅動時從 linux 核心中刪除相應的字元裝置 - cdev_del 函式
4、自動建立裝置節點
在 linux 使用 mdev (本質是應用程式)來實現裝置節點檔案的自動建立與刪除, linux 系統中的熱插拔事件也由 mdev 管理。使用 modprobe 命令成功載入驅動模組以後就自動在 /dev 目錄下建立對應的裝置節點檔案。
echo /sbin/mdev >
/proc/sys/kernel/hotplug // /etc/init.d/rcs 檔案中設定熱插拔事件由 mdev 來管理。
(1)建立和刪除類 - class_create 函式、class_destroy 函式
(2)建立和刪除裝置 - device_create 函式、 device_destroy 函式
5、使用 goto 集中處理錯誤
(1)使用 goto 語句只能 goto 到同一函式內,而不能從乙個函式中 goto 到另外乙個函式中。
(2)使用 goto 來處理錯誤,要特別注意的是 goto 會順序執行下去,因此要注意放置錯誤的位置,一般是在函式要退出的位置放置 label。
6、設定檔案私有資料
設定檔案私有資料有什麼用呢?
【答】:通常將檔案的私有資料 private_data 指向裝置結構體,為了在同乙個驅動支援多個相同裝置時,為各個裝置準備的資料結構互相不衝突。一般是在 open 函式裡面設定好私有資料以後,在 write、read、close 等函式中直接讀取 private_data 即可得到裝置結構體。
Linux 字元裝置驅動基本框架(二)
一 位址對映 我們知道 stm32 無法跑 linux 系統,是由於它內部沒有 mmu 記憶體管理單元 mmu 主要完成的功能如下 1 完成虛擬空間到物理空間的對映。2 記憶體保護,設定儲存器的訪問許可權,設定虛擬儲存空間的緩衝特性。linux 核心啟動的時候會初始化 mmu,設定好記憶體對映,設定...
linux 字元裝置驅動框架
linux 字元裝置驅動是3種型別中最簡單的一種,其實就是實現 file operations 中的函式,基本實現框架如下 1,需要包含的標頭檔案 include include include include include 2.定義及實現 file operations 中的函式,file op...
Linux字元裝置驅動框架總結
對於linux而言,一切皆檔案,在linux系統下,所有檔案都可以像文字檔案一樣open read write,那麼對於linux裝置驅動而言,比如現在有乙個點燈的驅動程式,它的裝置節點是 dev 當應用程式執行open read write的時候,是如何呼叫到驅動程式裡的open read wri...