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) |