笔记二:字符设备之cdev方式注册字符驱动
2017-10-25 16:34
281 查看
一、字符设备核心:
字符设备的核心包括cdev结构体和设备号!
cdev结构体:驱动中用来描述一个字符设备。
原型:
设备号:实现设备文件与驱动的程序的关联。
主从设备号在内核中用一个u32型变量描述:
<include/linux/types.h>
-------------------------------------------------
typedef __u32 __kernel_dev_t;
typedef __kernel_dev_t dev_t;
例子:
---->dev_t dev_num = MKDEV(major, minor);//指定方式
major = MAJOR(dev_num);
minor = MINOR(dev_num);
二、字符设备一般注册方法register_chrdev(…)函数内部封装了设备号申请以及cdev创建并注册的过程,如下图:
1)register_chrdev()-->申请主设备号并注册
-->__register_chrdev()
上图描述的是一般的注册函数方法的拆分(深入)。
2)class_create()-->创建设备类。
查看方法:cat /proc/devices
3)device_create()-->创建设备节点
查看方法:cat /dev
三、cdev方式注册注销字符设备的流程:
注册:
1、申请并注册主从设备号
2、初始化已定义的cdev变量,cdev变量指定file_operations接口
3、添加cdev变量到内核,完成驱动注册,添加cdev时需要一个已申请成功的主从设备号
注销:
1、删除已添加的cdev
2、注销申请的主从设备号
四、注册注销所用函数:
例子:(描述上述功能代码:一般在驱动入口函数中!)
signed int ret = 0;
printk(KERN_WARNING "**%d,%s**\n", __LINE__, __FUNCTION__);
devid = MKDEV(500, 500);/* 指定设备号 */
ret = register_chrdev_region(devid, 1, DEMOS_NAME);//1、指定设备号
//ret = alloc_chrdev_region(&devid, 0, 1, DEMOS_NAME);//2、动态申请设备号
cdev_init(&demo_cdev, &f_ops);
ret = cdev_add(&demo_cdev, devid, 1);
my_class = class_create(THIS_MODULE, DEMOS_NAME);
my_device = device_create(my_class, NULL, devid, NULL, DEMOS_DEV);
字符设备的核心包括cdev结构体和设备号!
cdev结构体:驱动中用来描述一个字符设备。
原型:
struct cdev { struct kobject kobj;//内核对象,由内核管理 struct module *owner; const struct file_operations *ops;//字符设备驱动方法结构体,需自己填充 struct list_head list; dev_t dev;//设备号一般有自己指定和动态申请两种方式 unsigned int count; };
设备号:实现设备文件与驱动的程序的关联。
主从设备号在内核中用一个u32型变量描述:
<include/linux/types.h>
-------------------------------------------------
typedef __u32 __kernel_dev_t;
typedef __kernel_dev_t dev_t;
例子:
---->dev_t dev_num = MKDEV(major, minor);//指定方式
major = MAJOR(dev_num);
minor = MINOR(dev_num);
二、字符设备一般注册方法register_chrdev(…)函数内部封装了设备号申请以及cdev创建并注册的过程,如下图:
1)register_chrdev()-->申请主设备号并注册
-->__register_chrdev()
上图描述的是一般的注册函数方法的拆分(深入)。
2)class_create()-->创建设备类。
查看方法:cat /proc/devices
3)device_create()-->创建设备节点
查看方法:cat /dev
三、cdev方式注册注销字符设备的流程:
注册:
1、申请并注册主从设备号
2、初始化已定义的cdev变量,cdev变量指定file_operations接口
3、添加cdev变量到内核,完成驱动注册,添加cdev时需要一个已申请成功的主从设备号
注销:
1、删除已添加的cdev
2、注销申请的主从设备号
四、注册注销所用函数:
例子:(描述上述功能代码:一般在驱动入口函数中!)
signed int ret = 0;
printk(KERN_WARNING "**%d,%s**\n", __LINE__, __FUNCTION__);
devid = MKDEV(500, 500);/* 指定设备号 */
ret = register_chrdev_region(devid, 1, DEMOS_NAME);//1、指定设备号
//ret = alloc_chrdev_region(&devid, 0, 1, DEMOS_NAME);//2、动态申请设备号
cdev_init(&demo_cdev, &f_ops);
ret = cdev_add(&demo_cdev, devid, 1);
my_class = class_create(THIS_MODULE, DEMOS_NAME);
my_device = device_create(my_class, NULL, devid, NULL, DEMOS_DEV);
相关文章推荐
- 韦东山驱动视频笔记——1.字符设备驱动程序之查询方式的按键驱动程序
- 字符设备驱动笔记——查询方式按键驱动(三)
- 韦东山驱动视频笔记——2.字符设备驱动程序之中断方式的按键驱动程序
- 字符设备驱动笔记——中断方式按键驱动之代码(六)
- 普通字符设备驱动的两种注册方式(新&旧)
- 字符设备驱动--- 数据结构 设备注册struct cdev , 注销
- rtc驱动框架 与 新的字符设备驱动注册方式
- 字符设备驱动笔记——中断方式按键驱动之linux异常处理结构(四)
- 字符设备驱动学习笔记----查询方式取得按键值
- 字符设备驱动笔记——中断方式按键驱动之linux中断处理结构(五)
- 学习笔记:创建一个简单字符设备驱动的过程
- 字符设备驱动笔记(二)
- 高级字符设备驱动-内核等待队列笔记
- 字符设备驱动笔记——异步通知(八)
- linux字符设备驱动-定时器按键去抖笔记
- 2.6内核前后--注册字符设备驱动区别
- 存储笔记--块设备驱动的注册
- Linux驱动开发-混杂字符设备驱动模型笔记 4
- [ARM笔记]字符设备驱动
- 三种方式注册一个字符设备