- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
UART设备驱动
尽管一个特定的UART设备驱动完全可以遵循14.2~14.5的方法来设计,即定义tty_driver并实现其中的成员函数,但是Linux已 经在文件 serial_core.c中实现了UART设备的通用tty驱动层(姑且称其为串口核心层),这样,UART驱动的主要任务演变成实现serial- core.c中定义的一组uart_xxx接口而非tty_xxx接口,如图14.5所示。??? serial_core.c串口核心层完全可以被当作14.2~14.5节tty设备驱动的实例,它实现了UART设备的tty驱动。??? 提示:Linux驱动的这种分层思想在许多类型的设备驱动中都得到了体现,例如上一章IDE设备驱动中,内核实现了通用的IDE层用于处理块设备I/O请求,而具体的IDE则只需使用ide_xxx这样的接口,甚至不必理会复杂的块设备驱动结构。?????????????
?
??????????????????????? 图14.5 串口核心层
串口核心层为串口设备驱动提供了如下3个结构体:1、uart_driveruart_driver包含串口设备的驱动名、设备名、设备号等信息,它封装了tty_driver,使得底层的UART驱动无需关心tty_driver,其定义如代码清单14.13。代码清单14.13 uart_driver结构体1? struct uart_driver2? {3??? struct module *owner;4??? const char *driver_name; //驱动名5??? const char *dev_name;??? //设备名6??? const char *devfs_name;? //设备文件系统名7??? int major;? //主设备号8??? int minor;?? //次设备号9??? int nr;10?? struct console *cons;11 12?? /* 私有的,底层驱动不应该访问这些成员,应该被初始化为NULL */13?? struct uart_state *state;14?? struct tty_driver *tty_driver;15 };一个tty驱动必须注册/注销tty_driver,而一个UART驱动则演变为注册/注销uart_driver,使用如下接口:int uart_register_driver(struct uart_driver *drv);void uart_unregister_driver(struct uart_driver *drv);实际上,uart_register_driver()和uart_unregister_driver()中分别包含了tty_register_driver()和tty_unregister_driver()的操作,如代码清单14.14所示。代码清单14.14 uart_register_driver()和uart_unregister_driver()函数1? int uart_register_driver(struct uart_driver *drv)2? {3?? struct tty_driver *normal = NULL;4?? int i, retval;5?? ...6??? /* 分配tty_driver */7?? normal? = alloc_tty_driver(drv-nr);8?? if (!normal)9??? goto out;10? drv-tty_driver = normal;11?? /* 初始化tty_driver */12? normal-owner? = drv-owner;13? normal-driver_name = drv-driver_name;14? normal-devfs_name = drv-devfs_name;15? normal-name? = drv-dev_name;16? normal-major? = drv-major;17? normal-minor_start = drv-minor;18? normal-type? = TTY_DRIVER_TYPE_SERIAL;19? normal-subtype? = SERIAL_TYPE_NORMAL;20? normal-init_termios = tty_std_termios;21? normal-init_termios.c_cflag = B9600 | CS8 | CREAD | HUPCL | CLOCA
文档评论(0)