Chinaunix首页 | 论坛 | 博客
  • 博客访问: 246171
  • 博文数量: 41
  • 博客积分: 928
  • 博客等级: 准尉
  • 技术积分: 550
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-01 10:07
文章分类
文章存档

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

阅读(4204) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~