靜態裝置號申請:
申請裝置號, from --- 要申請的裝置號, count --- 申請幾個裝置, name --- 裝置名字
int register_chrdev_region(dev_t from, unsigned count, const char *name)
登出裝置號, from --- 要登出的裝置號, count--- 登出幾個裝置
void unregister_chrdev_region(dev_t from, unsigned count)
靜態裝置號申請弊端:
麻煩, cat /proc/devices 檢視可用的裝置號, 其次在驅動**裡定義,申請
靜態申請裝置號, 會產生衝突
動態裝置號的申請:
動態申請裝置號, dev 帶回的裝置號, baseminor 要申請的從裝置號的起始, count --- 申請幾個裝置, name --- 裝置名字
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,
const char *name)
應用程式如何操作裝置?
1, sudo insmod ./hello.ko
2, cat /proc/devices 檢視裝置hahaha 的裝置號
sudo mknod /dev/hahaha c 250 0 // 在使用者空間建立乙個裝置檔案 hahaha , 字元裝置, 主裝置號 250 從裝置號 0
字元裝置驅動:
首先了解下cdev 結構體:
struct cdev ;
申請cdev 結構體:
cdev_alloc
把cdev 結構體 和 裝置的操作方法聯絡起來 :
cdev_init
把裝置賦值給cdev 結構體, 並且把cdev 結構體新增到字元裝置表裡,
cdev_add
linux/cdev.h
申請cdev 結構體, 錯誤返回空值
struct cdev *cdev_alloc(void)
把申請到的cdev 結構體 和 該裝置的具體操作關聯起來
void cdev_init(struct cdev *cdev, const struct file_operations *fops)
struct file_operations ;
把cdev 結構體和 裝置號關聯起來, 並且把cdev 結構體 新增到字元裝置表裡,
int cdev_add(struct cdev *p, dev_t dev, unsigned count)
從使用者空間copy 資料到核心空間
static inline unsigned long __must_check copy_from_user(void *to, const void __user *from, unsigned long n)
從核心空間copy 資料到使用者空間
static inline unsigned long __must_check copy_to_user(void __user *to, const void *from, unsigned long n)
字元裝置框架:
動態申請裝置號 alloc_chrdev_region
申請cdev 結構體 cdev_alloc
把cdev 結構體 和 裝置操作集 關聯起來 : cdev_init
把cdev 結構體和 裝置號關聯起來,並且把cdev 新增到字元裝置表: cdev_add
實現裝置的操作方法 :
struct file_operations hahahaops =
;實現具體的方法:
int hahahaopen( struct inode *p, struct file *f)
測試步驟:
make
sudo insmod ./hello/ko
cat /proc/devices 檢視我們申請的字元裝置的主裝置號
mknod /dev/hahaha c 250 0
5, 編寫應用程式, 測試驅動
靜態申請字元類裝置號
字元裝置函式在檔案 include linux fs.h 中 核心提供了三個函式來註冊一組字元裝置編號,這三個函式分別是 register chrdev region alloc chrdev region register chrdev register chrdev region 是提前知道裝置...
動態申請字元類裝置號
字元裝置函式在檔案 include linux fs.h 中 alloc chrdev region 是動態分配主次裝置號 巨集定義major提取dev t資料中的主裝置號 編寫,編譯 測試原始碼 include 包含初始化巨集定義的標頭檔案,中的module init和module exit在此檔...
linux 靜態申請字元類裝置號
包括主裝置號和次裝置號 字元裝置函式在檔案 include linux fs.h 中 核心提供了三個函式來註冊一組字元裝置編號,這三個函式分別是 register chrdev region alloc chrdev region register chrdev register chrdev re...