在写字符设备驱动,通常都需要注册设备与注销设备操作,而终端设备也是字符设备的一种,也需要注册与注销,只是实现函数的不同而已
关键是学习注册与注销的整体框架
1、分配 tty 驱动
struct tty_driver *alloc_tty_driver(int lines);这个函数返回 tty_driver 指针,其参数为要分配的设备数量,line 会被赋值给
tty_driver 的 num 成员,例如:
xxx_tty_driver = alloc_tty_driver(XXX_TTY_MINORS);
if (!xxx_tty_driver) //分配失败
return -ENOMEM;
int tty_register_driver(struct tty_driver *driver);
注册 tty 驱动成功时返回 0, 参数为由 alloc_tty_driver ()分配的 tty_driver 结构体指
针,例如:
retval = tty_register_driver(xxx_tty_driver);
if (retval) //注册失败
{
printk(KERN_ERR "failed to register tiny tty driver");
put_tty_driver(xxx_tty_driver);
return retval;
}
int tty_unregister_driver(struct tty_driver *driver);
这个函数与 tty_register_driver ()对应, tty 驱动最终会调用上述函数注销 tty_driver。
void tty_register_device(struct tty_driver *driver, unsigned index, struct device *device);
仅有 tty_driver 是不够的,驱动必须依附于设备,tty_register_device()函数用于注册关联于 tty_driver 的设备,index 为设备的索引(范围是 0~driver->num) ,
例如:
for (i = 0; i < XXX_TTY_MINORS; ++i)tty_register_device(xxx_tty_driver, i, NULL);
重点:在以Linux2.6的设备驱动模型中,platform 总线将设备与驱动绑定,所以要进行具体设备与驱动的关联。
void tty_unregister_device(struct tty_driver *driver, unsigned index);
上述函数与 tty_register_device()对应,用于注销 tty 设备,其使用方法如下:
for (i = 0; i < XXX_TTY_MINORS; ++i)
tty_unregister_device(xxx_tty_driver, i);
参考资料:Linux 设备驱动开发详解-宋宝华