百度收录网站排名,58同城做网站的电话,凤岗网站建设公司,常州百度搜索优化一、对于串口驱动Linux系统中UART驱动属于终端设备驱动#xff0c;应该说是实现串口驱动和终端驱动来实现串口终端设备的驱动。要了解串口终端的驱动在Linux系统的结构就先要了解终端设备驱动在Linux系统中的结构体系#xff0c;一方面自己了解的不够#xff0c;另一发面关于…一、对于串口驱动Linux系统中UART驱动属于终端设备驱动应该说是实现串口驱动和终端驱动来实现串口终端设备的驱动。要了解串口终端的驱动在Linux系统的结构就先要了解终端设备驱动在Linux系统中的结构体系一方面自己了解的不够另一发面关于终端设备的体系结构网上有很多很好很详细的资料参考这里我主要是鉴于终端设备体系的复杂性我大概总结一下自己了解到的一些方面和一个整体的框架。二、终端设备的结构Linux内核中 tty的层次结构图所示包含tty核心、tty线路规程和tty驱动。tty核心是对整个tty设备的抽象对用户提供统一的接口tty线路规程是对传输数据的格式化tty驱动则是面向tty设备的驱动这是对设备的驱动应该要我们来实现的但是后面我们可以看到对于串口驱动Linux还要进行抽象把共性提取出来封装使得整个驱动层次化简单化。使得驱动的修改只要设计设备硬件的差异来但是这样使得设备驱动的结构体系比较复杂过程层次太多难于理解。tty设备发送数据的流程为tty核心从一个用户获取将要发送给一个 tty设备的数据tty核心将数据传递给tty线路规程驱动接着数据被传递到tty驱动tty驱动将数据转换为可以发送给硬件的格式。接收数据的流程为 从tty硬件接收到的数据向上交给tty驱动进入tty线路规程驱动再进入 tty 核心在这里它被一个用户获取。尽管大多数时候tty核心和tty之间的数据传输会经历tty线路规程的转换但是tty驱动与tty核心之间也可以直接传输数据。三、tty设备驱动结构图显示了与tty相关的主要源文件及数据的流向。tty_io.c定义了tty 设备通用的file_operations结构体并实现了接口函数tty_register_driver()用于注册tty设备它会利fs/char_dev.c提供的接口函数注册字符设备与具体设备对应的tty驱动将实现tty_driver结构体中的成员函数。同时 tty_io.c也提供了tty_register_ldisc()接口函数用于注册线路规程n_tty.c文件则实现了tty_disc结构体中的成员。特定tty设备驱动的主体工作是填充tty_driver结构体中的成员实现其中的成员函数。四、串口驱动核心层上图的数据流向应该和上面tty设备驱动一样同样需要经过tty线路规则层不过上图箭头标的不是很准确说明一下因为图是从网上下的。很明显的看得到由tty设备驱动到串口驱动中间经过了一层serial_core 从tty设备驱动中需要填充的是tty_driver结构经过串口核心层后就转变成了实现xxx_uart.c 。到现在Linux系统已经封装了终端设备(tty)的驱动www.linuxidc.com而我们只需要实现串口驱动就能实现整个串口终端驱动。五、主要结构与关系对于tty驱动层主要有几个重要的结构serial_core实现了UART设备的通用TTY驱动层(称为串口核心层)这样UART驱动的主要任务演变成了实现serial_core中定义的一组uart_xxx接口而非tty_xxx接口见如下的对应关系----------------设备方法-----------------------------设备注册------------------------设备信息------------tty_operations------------------------tty_driver---------------------------tty-struct // tty核心层定义serial_core(串口核心层实现的结构体) --------------uart_ops-----------------------------uart_driver---------------------------uart_port // 串口核心层定义需要我们实现但是Linuxs3c2410支持很好我们只有去修改一下----------s3c24xx_serial-ops-----------------s3c24xx_uart_drv-----------------s3c24xx_uart_port对于s3c2410支持很好一般只需要修改一些设备的硬件的一些寄存器设置的差异部分所以看s3c2440的uart驱动代码的时候发现好少一开始我都懵了怎么其他的驱动代码这么多怎么2440的代码这么少下一篇文章我将分析一下s3c2440的代码。那么这样一来主要修改的地方时s3c24xx_uart_port的一些设置s3c24xx_uart_port主要包含一下几个结构uart_ports3c24xx_uart_info ——主要是UART中的FIFO信息需要修改s3c34xx_uart_clksrc ——UART时钟、频率 需要修改另外在加上一个结构体 s3c2410_uartcfg ——硬件端口、寄存器 这个需要修改归纳起来对于支持完善的s3c2410的Linux来修改成s3c2440的驱动需要修改的地方就是后面说明的三个结构体啦所以工作就简单了很多啊。但是整个结构变的复杂了上面是我自己总结的图是网上下载的有什么地方不对或者错误希望广大网友指出我好更正。