字元裝置驅動 靜態 動態申請裝置號

2021-08-22 10:26:39 字數 2076 閱讀 5286

靜態裝置號申請:

申請裝置號, 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...