微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 字符设备驱动模型浅析

字符设备驱动模型浅析

时间:01-08 来源:3721RD 点击:

复制代码

接着又调用了函数cdev_add(),这个函数又调用了kobj_map()函数,其作用就是分配一个struct probe结构体,填充该结构体中的变量并将其加入到全局的cdev_map中,说白了,就是分个一亩三分田给该字符设备驱动,并做好标记,放到主设备号对应的地方,等主人下次来找的时候能找到(使用kobj_lookup()函数,后面会讲到)。该函数是这样的,int kobj_map(struct kobj_map *domain, dev_t dev, unsigned long range,

struct module *module, kobj_probe_t *probe,

int (*lock)(dev_t, void *), void *data)

{

unsigned n = MAJOR(dev + range - 1) - MAJOR(dev) + 1;

unsigned index = MAJOR(dev);

unsigned i;

struct probe *p;

if (n > 255)

n = 255;

/*分配了一亩三分田*/

p = kmalloc(sizeof(struct probe) * n, GFP_KERNEL);

if (p == NULL)

return -ENOMEM;

/*填充些私有的东西*/

for (i = 0; i owner = module;

p->get = probe; /*是exact_match ()函数,获取cdev结构体的kobject指针*/

p->lock = lock; /*是exact_lock()函数,增加引用*/

p->dev = dev;

p->range = range;

p->data = data; /* cdev保存到p->data中*/

}

mutex_lock(domain->lock);

/*将这一亩三分田加到主设备号对应的位置上去*/

for (i = 0, p -= n; i probes[index % 255];

while (*s (*s)->range next;

p->next = *s;

*s = p;

}

mutex_unlock(domain->lock);

return 0;

}

复制代码接下来有class_create()函数和class_device_create()函数,前者生成一个名字为"testchar"的class,后者作用就是在/dev目录下生成设备节点,当然,需要uevent和UDEVD的支持,具体可见鄙人博客上的文章《Linux设备模型浅析之uevent篇》。

顺带说下register_chrdev()函数,其也是注册字符设备驱动,只不过是封装好的,包含了所有前面讲的注册步骤--分配一个设备号,由一个主设备号和255个次设备号组成。如下,int register_chrdev(unsigned int major, const char *name,

const struct file_operations *fops)

{

struct char_device_struct *cd;

struct cdev *cdev;

char *s;

int err = -ENOMEM;

cd = __register_chrdev_region(major, 0, 256, name);

if (IS_ERR(cd))

return PTR_ERR(cd);

cdev = cdev_alloc(); /*这个有点不一样,动态分配的,不是调用者提供*/

if (!cdev)

goto out2;

cdev->owner = fops->owner;

cdev->ops = fops;

kobject_set_name( "%s", name);

for (s = strchr(kobject_name( s; s = strchr(s, '/'))

*s = '!';

err = cdev_add(cdev, MKDEV(cd->major, 0), 256);

if (err)

goto out;

cd->cdev = cdev;

return major ? 0 : cd->major;

out:

kobject_put(

out2:

kfree(__unregister_chrdev_region(cd->major, 0, 256));

return err;

}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top