UART设备驱动.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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_driver uart_driver包含串口设备的驱动名、设备名、设备号等信息,它封装了tty_driver,使得底层的UART驱动无需关心tty_driver,其定义如代码清单14.13。 代码清单14.13 uart_driver结构体 1? struct uart_driver 2? { 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)

zhuwenmeijiale + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:7065136142000003

1亿VIP精品文档

相关文档