字元裝置驅動是linux驅動中最基本的一類裝置驅動,也是我們學習重點。
我們從下面這一張圖來詳解字元裝置驅動
在linux核心中,使用cdev結構體來描述乙個字元裝置驅動,關於cdev的結構體的定義和操作在include\linux\cdev.h
標頭檔案中
#ifndef _linux_cdev_h
#define _linux_cdev_h
#include
#include
#include
struct file_operations;
struct inode;
struct module;
struct cdev
;void
cdev_init
(struct cdev *
,const
struct file_operations *);
struct cdev *
cdev_alloc
(void);
void
cdev_put
(struct cdev *p)
;int
cdev_add
(struct cdev *
, dev_t,
unsigned);
void
cdev_del
(struct cdev *);
void
cd_forget
(struct inode *);
#endif
struct cdev
;
在字元裝置中最重要的就是const struct file_operations *ops
dev_t dev
2個成員。
dev_t型別定義在include/linux/types.h
標頭檔案中。
typedef __u32 __kernel_dev_t;
typedef __kernel_dev_t dev_t;
linux裝置號位32位,其高12位為主裝置號,第20為次裝置號。include\linux\kdev_t.h
標頭檔案中定義了裝置號相關巨集和函式。
#define minorbits 20
#define minormask ((1u << minorbits) - 1)
#define major(dev) ((unsigned int) ((dev) >> minorbits))
#define minor(dev) ((unsigned int) ((dev) & minormask))
#define mkdev(ma,mi) (((ma) << minorbits) | (mi))
靜態分配裝置號(自己確定裝置的裝置號)
核心如何管理裝置驅動:核心中有乙個255個元素的陣列來儲存字元裝置驅動。
有一些常用的裝置號已經給linux核心開發使用了,具體如miscdev input。分配的內容可以檢視文件 documentation/devices.txt。
檢視當前系統中所使用的裝置號:
cat /proc/devices
動態分配裝置號(由系統分配)
靜態分配裝置號需要我們檢查當前系統中所有被使用了的裝置號,然後挑選乙個沒有使用的。而且靜態分配裝置號很容易帶來衝突問題, linux 社群推薦使用動態分配裝置號,在註冊字元裝置之前先申請乙個裝置號,系統會自動給你乙個沒有被使用的裝置號,這樣就避免了衝突。解除安裝驅動的時候釋放掉這個裝置號即可。
裝置號的申請函式:
int
alloc_chrdev_region
(dev_t *dev,
unsigned baseminor,
unsigned count,
const
char
*name)
裝置號的註冊函式:
int
register_chrdev_region
(dev_t from,
unsigned count,
const
char
*name)
裝置號的釋放函式:
void unregister_chrdev_region(dev_t from, unsigned count)
void
cdev_init
(struct cdev *
,const
struct file_operations *);
struct cdev *
cdev_alloc
(void);
void
cdev_put
(struct cdev *p)
;int
cdev_add
(struct cdev *
, dev_t,
unsigned);
void
cdev_del
(struct cdev *);
void
cd_forget
(struct inode *
);
cdev_add()函式和cdev_del()函式分別向系統新增和刪除乙個cdev,完成字元裝置的註冊和登出。對cdev_add()的呼叫通常發生在字元裝置驅動的模組載入函式中,而對cdev_del()函式通常發生在字元裝置驅動模組解除安裝函式中。 裝置驅動例項 字元裝置驅動
在整個linux裝置驅動學習中,字元裝置驅動較為基礎。通過對它的學習,對裝置驅動進一步加深了解 cdev 結構體struct cdev 講下比較重要的成員變數 dev t dev 定義了32位的裝置號,其中12位是主裝置號,20位是從裝置號。獲取主裝置號 major dev t dev 獲取從裝置號...
字元裝置驅動
字元裝置驅動 概述 塊裝置 字元裝置以及網路裝置中塊裝置和網路裝置一般都會硬體配置完備,對於程式設計師而言,能夠更多操作的就是字元裝置。設定字元裝置的一般步驟 1.初始化硬體 2.定義fops file operations 3.申請cdev,掛載fops 3.加入cdev 函式cdev add 主...
字元裝置驅動
標頭檔案包含 include 變數定義 define gpgconaddr 0x56000060 硬體中斷號定義 define key1 irq irq eint5 define key2 irq irq eint3 裝置名定義 define devname mykey 主裝置號 cdev定義 需全...