cdev方式註冊驅動

2021-08-07 16:51:57 字數 3663 閱讀 9941

核心提供了三個函式來註冊一組字元裝置編號,這三個函式分別是 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()。

(1)register_chrdev 比較老的核心註冊的形式 早期的驅動

(2)register_chrdev_region/alloc_chrdev_region + cdev 新的驅動形式

區別:register_chrdev()函式是老版本裡面的裝置號註冊函式,可以實現靜態和動態註冊兩種方法,主要是通過給定的主裝置號是否為0來進行區別,為0的時候為動態註冊。register_chrdev_region以及alloc_chrdev_region就是將上述函式的靜態和動態註冊裝置號進行了拆分的強化。

1.2 使用流程

字元驅動cdev註冊流程

1. 申請並註冊主從裝置號

2. 初始化已定義的cdev變數,cdev變數指定file_operations介面

3. 新增cdev變數到核心,完成驅動註冊,新增cdev時需要乙個已申請成功的主從裝置號

 字元驅動cdev登出流程

4. 刪除已新增的cdev

5. 登出申請的主從裝置號

1.3 主要方法

//動態分配裝置編號

int alloc_chrdev_region(dev_t *dev,unsigned

int firstminor,unsigned

int count,char *name);

dev:自動分配的主裝置號將儲存在dev中

firstminor:第乙個次裝置號 一般為0

count:要分配的裝置數量

name:裝置名

//指定乙個主裝置號和乙個起始從裝置號,如果成功返回0 失敗返回錯誤碼

dev_t first = mkdev(int major, int minor);

int register_chrdev_region(dev_t first, unsigned

int count, char *name);

first :要分配的裝置編號範圍的初始值, 這組連續裝置號的起始裝置號, 相當於register_chrdev()中主裝置號

count:連續編號範圍. 是這組裝置號的大小(也是次裝置號的個數)

name:編號相關聯的裝置名稱. (/proc/devices); 本組裝置的驅動名稱

//登出裝置

void unregister_chrdev_region(dev_t from,unsigned count)

//初始化cdev變數,並設定fops

void cdev_init(struct cdev *cdev, const

struct file_operations *fops)

//新增cdev到linux核心,完成驅動註冊

int cdev_add(struct cdev *p, dev_t dev, unsigned count)

dev:申請好的主裝置號+起始從裝置號

count:為該驅動所占用從裝置號的數目

//從核心中刪除cdev資料

void cdev_del(struct cdev *p)

#include 

#include

#include

#include

#include

/*宣告class_create 和device_create相關資訊*/

#include

//cdev用到的標頭檔案

#include

#define demo_debug

#ifdef demo_debug

#define dem_dbg(fmt, arg...) printk(kern_warning fmt, ##arg)

#else

#define dem_dbg(fmt, arg...) printk(kern_debug fmt, ##arg)

#endif

#define device_count 1

//1 定義cdev結構體變數和dev_nr主從裝置號變數

static

struct cdev demo_cdev;

static dev_t dev_nr;

static

int demo_open (struct inode *pnode, struct file *filp)

static ssize_t demo_read (struct file *filp, char __user *buf, size_t count, loff_t *offp)

return len;

cp_err:

return retval;

}static

int demo_release (struct inode *pnode, struct file *filp)

static

struct file_operations fops = ;

static

struct

class *demo_class;

static

int __init demo_init(void)

//3 初始化cdev資料

cdev_init(&demo_cdev, &fops);

//4 新增cdev變數到核心,完成驅動註冊

res = cdev_add(&demo_cdev, dev_nr, device_count);

if(res)

//建立裝置類

demo_class = class_create(this_module,"demo_class");

if(is_err(demo_class))

for(i=0; i//建立裝置節點

demo_device = device_create(demo_class,null, mkdev(major(dev_nr), i), null,"demo%d",i);

if(is_err(demo_device))

}return

0;device_err:

while(i--)

device_destroy(demo_class,mkdev(major(dev_nr), i));

class_destroy(demo_class);

class_err:

cdev_del(&demo_cdev);

cdev_err:

unregister_chrdev_region(dev_nr, device_count);

chrdev_err:

//申請主裝置號失敗

return res;

}static

void __exit demo_exit(void)

{ int i;

dem_dbg("==>demo_exit\n");

//5 刪除新增的cdev結構體,並釋放申請的主從裝置號

cdev_del(&demo_cdev);

unregister_chrdev_region(dev_nr, device_count);

for(i=0; i"dual bsd/gpl");

Linux 字元裝置驅動cdev

關鍵字 字元裝置檔案建立 device create 字元裝置cdev 與裝置號dev t的聯絡 sys class 目錄下建立類目錄class create linux下面一切皆是檔案,這句是有 的,這個 起因,應該就是vfs 虛擬檔案系統,將soc下面的所有外設,都抽象成乙個個檔案進行管理。外設...

Linux驅動之 經典方式註冊

雜項方式註冊生成的裝置檔案會自動掛載在 dev目錄下面,經典方式註冊的裝置不會自動掛載在 dev目錄下面 雜項裝置註冊的主裝置號只能為10,經典方式註冊主裝置號可以指定或者系統自動分配乙個除了 10 以外的任意乙個裝置號。雜項方式只暫用乙個子裝置號,經典方式占用當前主裝置號所有的子裝置號 0 254...

Linux字元裝置驅動 cdev結構體day00

day00 摘要 linux字元裝置驅動cdev結構體 1.cdev結構體 描述乙個字元裝置 定義 struct 1 dev t定義裝置號,32位,12位主裝置號,20位次裝置號.2 使用巨集major,minor可以獲得裝置主次號 major dev t dev 主裝置號 minor dev t ...