核心提供了三個函式來註冊一組字元裝置編號,這三個函式分別是 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 ...