Chinaunix首页 | 论坛 | 博客
  • 博客访问: 392794
  • 博文数量: 80
  • 博客积分: 1982
  • 博客等级: 上尉
  • 技术积分: 1737
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-26 22:41
文章存档

2013年(9)

2012年(71)

分类: LINUX

2012-10-09 09:03:08

Linux字符设备驱动框架:
1. 申请主设备号
2. 填充file_operations结构体
3. 注册:register_chrdev(major, name, fops)
4. 模块入口
5. 模块出口

内核用cdev结构体描述一个字符设备:
struct cdev {
    struct kobject kobj;    //内嵌的object对象
    struct module *owner;
    const struct file_operations *ops;    //文件操作结构体
    struct list_head list;
    dev_t dev;    //设备号
    unsigned int count;    //引用计数
};

注册字符设备的第一种方法:
register_chrdev(major, name, fops);
    __register_chrdev_region(major, 0, 256, name);
    cdev = cdev_alloc();
    cdev_add(cdev, MKDEV(cd->major, 0), 256)

register_chrdev:如果主设备major=0,让系统自动分配。

注册字符设备的第二种方法:
1. 静态申请设备号:
register_chrdev_region(from, count, name);
    __register_chrdev_region(MAJOR(from), MINOR(from), count, name);
cdev = cdev_alloc();
cdev_init(cdev, fops);
cdev_add(cdev, from, count)
2. 动态申请设备号:
alloc_chrdev_region(dev_t * dev, baseminor, count, name)
    __register_chrdev_region(0, baseminor, count, name);
cdev = cdev_alloc();
cdev_init(cdev, fops);
cdev_add(cdev, dev, count)

    register_chrdev() 是 2.4 内核用来注册字符设备的函数,在 2.6 内核中已经不推荐使用,它的优点是简单,缺点是一个设备对应 256 个次设备号,是一个极度的浪费。


                       ——忠于梦想 勇于实践    linux_xpj@opencores.org

阅读(1234) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~