全部博文(41)
2011年(41)
分类: 嵌入式
2011-09-10 09:15:44
一、对于串口驱动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)的驱动,而我们只需要实现串口驱动就能实现整个串口终端驱动。
五、主要结构与关系
对于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_port
s3c24xx_uart_info ——>主要是UART中的FIFO信息,需要修改
s3c34xx_uart_clksrc ——>UART时钟、频率 ,需要修改
另外在加上一个结构体 s3c2410_uartcfg ——>硬件端口、寄存器 ,这个需要修改
归纳起来,对于支持完善的s3c2410的linux来修改成s3c2440的驱动,需要修改的地方就是后面说明的三个结构体啦,所以工作就简单了 很多啊。但是整个结构变的复杂了,上面是我自己总结的,图是网上下载的,有什么地方不对或者错误,希望广大网友指出,我好更正。今天教师节,祝愿所有教师 全家幸福!
2011-09-10 09:14