笔记二:字符设备之cdev方式注册字符驱动

一、字符设备核心:

字符设备的核心包括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);






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值