Linux中UART驱动问题

发布于 2022-10-15 04:17:31 字数 1461 浏览 35 评论 0

struct class *tty_class;

struct device *tty_register_device(struct tty_driver *driver, unsigned index,
                                   struct device *device)
{
        char name[64];
        dev_t dev = MKDEV(driver->major, driver->minor_start) + index;

        if (index >= driver->num) {
                printk(KERN_ERR "Attempt to register invalid tty line number "
                       " (%d).\n", index);
                return ERR_PTR(-EINVAL);
        }

        if (driver->type == TTY_DRIVER_TYPE_PTY)
                pty_line_name(driver, index, name);
        else
                tty_line_name(driver, index, name);
        //找出这里的tty_class在什么地方给赋值了
        return device_create(tty_class, device, dev, NULL, name);
}

请问这里没有调用class_create()函数,直接调用device_create()函数,为什么能够在/dev中创建串口的设备节点呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

生生漫 2022-10-22 04:17:31

你好,

这里它指明了是tty_class了,所以它调用device_create之后发送的uevent就有class,
所以就可以在udevd的帮助下创建设备节点。

你可以查看device_create这个函数的代码。

北笙凉宸 2022-10-22 04:17:31

device_create(class..),只是传递地址..device_create_vargs函数中,device_register函数会为TTY设备创建设备结点..从而会在/dev目录下存在该结点.

尝蛊 2022-10-22 04:17:31

回复 3# meditateandroid

    谢谢!不过我这个驱动:(如下)

struct class *cls;

static int __init mm_init(void)
{
    int ret=0;
    ret=alloc_chrdev_region(&devid,0,DEV_CNT,modname);
    if(ret)
        printk("get devid failed\n");

    ops0.read    =mm_read0;
    ops0.write   =mm_write0;
    ops0.poll   = fifo_poll;
    ops1.read    =mm_read1;
    ops1.write   =mm_write1;

    ops.open=mm_open;

    fifo=(struct fifo*)kmalloc(sizeof(*fifo),GFP_KERNEL);
    memset(fifo,0,sizeof(*fifo));
    cdev_init(&fifo->dev,&ops);

    cdev_add(&fifo->dev,devid,DEV_CNT);
       
   cls=class_create(THIS_MODULE,modname);

  device_create(cls,NULL,MKDEV(MAJOR(devid),0),fifo,"fifo");
    device_create(cls,NULL,MKDEV(MAJOR(devid),1),fifo,"pipe");

    sema_init(&fifo->sem,1);
    init_waitqueue_head(&fifo->rq);
    init_waitqueue_head(&fifo->wq);

    return 0;
}

module_init(mm_init);

如果是将上面的class_create(THIS_MODULE,modname)去掉,不仅/sys/class中没有类,/dev中也没有节点“fifo”和“pipe”。必须加上class_create()才可以。这个字符型驱动是培训班老师写的调试成功的驱动。很是疑惑,能帮我解释一下吗?不知道能不能加你QQ,想请教一点问题,419074202

亚希 2022-10-22 04:17:31

回复 2# vmlinz

    谢谢!  不过tty_class只是定义的一个结构体指针啊,不通过class_create(),直接将其穿给device_class可以吗?那我回复3楼得那个驱动,麻烦你看一下,为什么去掉class_create()就不行呢?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文