您的位置:首页 > 其它

内核设备驱动API之register_chrdev

2018-03-23 20:16 399 查看
register_chrdev用于注册一个字符设备。
其源码分析如下:
static inline int register_chrdev(unsigned int major, const char *name,
const struct file_operations *fops)
{
#这里设置最小的字符设备号和最大的设备号后,调用下面的函数继续注册
return __register_chrdev(major, 0, 256, name, fops);
}
int __register_chrdev(unsigned int major, unsigned int baseminor,
unsigned int count, const char *name,
const struct file_operations *fops)
{
struct char_device_struct *cd;
struct cdev *cdev;
int err = -ENOMEM;
#申请一个保存字符设备的结构体
cd = __register_chrdev_region(major, baseminor, count, name);
if (IS_ERR(cd))
return PTR_ERR(cd);
#申请一个字符设备
cdev = cdev_alloc();
if (!cdev)
goto out2;
#字符设备赋值
cdev->owner = fops->owner;
cdev->ops = fops;
#设定字符设备的name
kobject_set_name(&cdev->kobj, "%s", name);
#添加字符设备
err = cdev_add(cdev, MKDEV(cd->major, baseminor), count);
if (err)
goto out;
#指向新申请的字符设备
cd->cdev = cdev;
#正常情况下major 不为零,所以整个函数返回零作为成功的结果
return major ? 0 : cd->major;
out:
kobject_put(&cdev->kobj);
out2:
kfree(__unregister_chrdev_region(cd->major, baseminor, count));
return err;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: