通過字元裝置檔案,應用程式可以使用相應的字元裝置驅動程式來控制字元裝置。建立字元裝置檔案的方法:
字元裝置在核心中使用struct cdev來描述。
struct cdev
linux核心中使用dev_t型別來定義裝置號,dev_t這種型別其實質為32位的unsigned int,其中高12位為主裝置號,低20位為次裝置號.
dev_t dev = mkdev
(主裝置號,次裝置號)
主裝置號 = major
(dev_t dev)
次裝置號=minor
(dev_t dev)
通過函式register_chrdev_region向核心申請使用。
缺點:如果申請使用的裝置號已經被核心中的其他驅動使用了,則申請失敗。
使用alloc_chrdev_region由核心分配乙個可用的主裝置號。
優點:因為核心知道哪些號已經被使用了,所以不會導致分配到已經被使用的號。
在驅動退出時,使用unregister_chrdev_region函式釋放裝置號。
struct file_operations ;
這裡面的函式在驅動中不用全部實現,不支援的操作留置為null即可。eg.
struct file_operations dev_fops = ;
cdev變數的定義可以採用靜態和動態兩種辦法
·靜態分配struct cdev mdev;
·動態分配struct cdev *pdev = cdev_alloc();
struct cdev的初始化使用cdev_init函式來完成。
cdev_init(struct cdev *cdev, const struct file_operations *fops)
引數:cdev: 待初始化的cdev結構
fops: 裝置對應的操作函式集
字元裝置的註冊使用cdev_add函式來完成。
cdev_add(struct cdev *p, dev_t dev, unsigned count)
引數:p: 待新增到核心的字元裝置結構
dev: 裝置號
count: 該類裝置的裝置個數
open裝置方法是驅動程式用來為以後的操作,完成初始化準備工作的。在大部分驅動程式中,open完成標明次裝置號、啟動裝置兩個工作。
原型:
int (*open) (struct inode *, struct file *)
裝置方法有時也稱為close
原型:
int (*release) (struct inode *, struct file *)
read裝置方法通常完成2件事情:
ssize_t (*read) (struct file *filp, char __user *buff, size_t count, loff_t *offp)
引數分析:
filp:與字元裝置檔案關聯的file結構指標, 由核心建立。
buff : 從裝置讀取到的資料,需要儲存到的位置。由read系統呼叫提供該引數。
count: 請求傳輸的資料量,由read系統呼叫提供該引數。
offp: 檔案的讀寫位置,由核心從file結構中取出後,傳遞進來。
原型:
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *)
每乙個存在於檔案系統裡面的檔案都會關聯乙個inode 結構,該結構主要用來記錄檔案物理上的資訊。因此, 它和代表開啟檔案的file結構是不同的。乙個檔案沒有被開啟時不會關聯file結構,但是卻會關聯乙個inode 結構。
重要成員:
dev_t i_rdev:裝置號
從核心中解除安裝驅動程式的時候,需要使用cdev_del函式來完成字元裝置的登出。
原型:
void cdev_del
(struct cdev *)
;
裝置驅動簡介
系統呼叫是作業系統核心和應用程式之間的介面,裝置驅動程式是作業系統核心和機器硬體之間的介面。裝置驅動程式為應用程式遮蔽了硬體的細節,這樣在應用程式看來,硬體只是個裝置檔案,應用程式可以象操作普通檔案一樣對硬體裝置進行操作。裝置驅動與使用者程式的區別 1 應用程式以main 開始 驅動程式沒有main...
驅動開發 字元裝置 塊裝置簡介 sky原創
驅動開發 字元裝置,塊裝置,網路裝置 字元裝置 以位元組流的方式訪問,不能隨機訪問 有例外,顯示卡 eeprom可以隨機訪問 eeprom可以擦寫1億次,是一種字元裝置,可以隨機訪問 讀寫是直接訪問硬體的 flash 擦寫次數有限,一百萬次,容易有壞塊 塊裝置 能隨機訪問 以 塊 為單位進行訪問 塊...
linux字元裝置及其驅動編寫簡介
1.1字元裝置簡介 字元裝置是一種按序列順序來訪問的裝置,如觸控螢幕,磁帶驅動器,滑鼠等。1.2字元裝置驅動 字元裝置驅動負責驅動字元裝置,通常實現由open read write close ioctl 等函式。1.3裝置號 裝置號分為主次裝置號,主裝置號標示裝置與哪個驅動相連,次裝置號標示同乙個...