笔记二:字符设备之cdev方式注册字符驱动
来源:互联网 发布:应知故乡事全诗图 编辑:程序博客网 时间:2024/05/21 14:55
一、字符设备核心:
字符设备的核心包括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;};
- 设备号:实现设备文件与驱动的程序的关联。
<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);
阅读全文
0 0
- 笔记二:字符设备之cdev方式注册字符驱动
- 字符设备驱动--- 数据结构 设备注册struct cdev , 注销
- 字符设备驱动--- 数据结构 设备注册struct cdev , 注销
- linux字符设备驱动 cdev
- 设备驱动学习之字符设备驱动内核代码分析(二)——字符设备结构体cdev
- 设备驱动-----字符驱动globalmem(cdev)
- 设备驱动之二----字符设备驱动
- Linux设备驱动第三天(字符设备驱动、cdev)
- linux字符设备 cdev
- cdev方式注册驱动
- 字符设备驱动程序之misc_dev方式注册字符设备
- Linux 设备驱动之字符设备(二)
- Linux 设备驱动之字符设备(二)
- linux驱动学习(四) linux字符设备驱动 cdev
- linux驱动学习(四) linux字符设备驱动 cdev
- linux驱动学习(四) linux字符设备驱动 cdev
- linux驱动:[2]字符设备驱动memdev(cdev结构解析)
- cdev 结构体与字符设备的注册
- 飞凌嵌入式i.MX6Q开发板Android APP签名安装问题的解决方法
- mysql索引
- 约瑟夫环各种实现方法的总结
- 关于小程序登录时获取openId和unionId走过的坑
- 利用navicat写mysql的存储过程
- 笔记二:字符设备之cdev方式注册字符驱动
- 【JZOJ 5424】【NOIP2017提高A组集训10.25】凤凰院凶真
- 如果获取枚举值
- sqlservel常用语法
- Linux之redhat硬盘文件快照安装虚拟机教程
- php显示日期(今天、昨天、本周、上周、本月、上月、)
- 面向对象程序设计上机练习一(函数重载)
- linux下定时执行任务的方法
- BUG_ON and WARN_ON