免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3418 | 回复: 4
打印 上一主题 下一主题

Linux中UART驱动问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-15 13:36 |只看该作者 |倒序浏览
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中创建串口的设备节点呢?

论坛徽章:
0
2 [报告]
发表于 2011-06-15 14:11 |只看该作者
你好,

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

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

论坛徽章:
0
3 [报告]
发表于 2011-06-15 17:35 |只看该作者
device_create(class..),只是传递地址..device_create_vargs函数中,device_register函数会为TTY设备创建设备结点..从而会在/dev目录下存在该结点.

论坛徽章:
0
4 [报告]
发表于 2011-06-17 15:22 |只看该作者
回复 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

论坛徽章:
0
5 [报告]
发表于 2011-06-17 15:27 |只看该作者
回复 2# vmlinz


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

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP