Linux中UART驱动问题
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
你好,
这里它指明了是tty_class了,所以它调用device_create之后发送的uevent就有class,
所以就可以在udevd的帮助下创建设备节点。
你可以查看device_create这个函数的代码。
device_create(class..),只是传递地址..device_create_vargs函数中,device_register函数会为TTY设备创建设备结点..从而会在/dev目录下存在该结点.
回复 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
回复 2# vmlinz
谢谢! 不过tty_class只是定义的一个结构体指针啊,不通过class_create(),直接将其穿给device_class可以吗?那我回复3楼得那个驱动,麻烦你看一下,为什么去掉class_create()就不行呢?