1、第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 6.1 串口的基本类型串口的基本类型6.2 Linux串口驱动程序与分析串口驱动程序与分析6.3 基于基于Linux串口设备驱动程序分析串口设备驱动程序分析6.4 S3C2440 UART驱动实例分析驱动实例分析6.5 串口串口GPS数据的采集例程数据的采集例程6.6 小结小结 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 6.1.1 RS-232串行接口标准串行接口标准 目前,RS-232是PC机与通信工业中应用最广泛的一种串行接口。RS-232被定义为一种在低速率串行通信中增加通信
2、距离的单端标准。6.1 串口的基本类型串口的基本类型第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 6.1.2 RS-422与与RS-485串行接口标准串行接口标准 1平衡传输平衡传输 RS-422、RS-485与RS-232不一样,数据信号采用差分传输方式,也称作平衡传输,使用一对双绞线,将其中一线定义为A,另一线定义为B,通常情况下,采用差分信号负逻辑,发送驱动器A、B之间的正电平在+2+6V之间,表示逻辑“0”,负电平在-6-2V之间,表示逻辑“1”。第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 2RS-422电气规定电气规定
3、 RS-422标准全称是“平衡电压数字接口电路的电气特性”,它定义了接口电路的特性。典型的RS-422是四线接口。3RS-485电气规定电气规定由于RS-485是从RS-422基础上发展而来的,因此RS-485许多电气规定与RS-422相仿。第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 6.2.1 串行端口终端串行端口终端(/dev/ttySn)串行端口终端是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看做是一个字符设备。有段时间这些串行端口设备通常被称为终端设备,因为那时它的最大用途就是用来连接终端的。6.2 Linux串口驱动程序与分析串口驱动程
4、序与分析第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 6.2.2 伪终端伪终端(/dev/pty/)伪终端是成对的逻辑终端设备,例如/dev/ptyp3和/dev/ttyp3(或者在设备文件系统中分别是/dev/pty/m3和/dev/pty/s3)。第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 6.2.3 控制终端控制终端(/dev/tty)如果当前进程有控制终端,那么/dev/tty就是当前进程的控制终端的设备特殊文件。可以使用命令“ps ax”来查看进程与哪个控制终端相连。如果登录的是shell,/dev/tty就是控制终端
5、,设备号是(5,0)。使用命令“tty”可以查看它具体对应哪个实际终端设备。/dev/tty有些类似于到实际所使用终端设备的一个连接。第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 6.2.4 控制台终端控制台终端(/dev/ttyn,/dev/console)在UNIX系统中,计算机显示器通常被称为控制台终端。使用Alt+F1F6组合键时,就可以切换到tty2、tty3等。tty1tty6称为虚拟终端,而tty0则是当前所使用虚拟终端的一个别名,系统所产生的信息会发送到该终端上。因此不管当前正在使用哪个虚拟终端,系统信息都会发送到控制台终端上。第第6章章 Lin
6、ux下下S3C2440串口驱动及应用实例串口驱动及应用实例 6.3.1 UART驱动结构图驱动结构图从图6-1可以看到,UART设备是继tty_driver的又一层封装,包含tty核心函数、tty线路规程函数和tty驱动函数。实际上,uart_driver对应tty驱动函数,在操作函数中,将操作转入uart_port。6.3 基于基于Linux串口设备驱动程序分析串口设备驱动程序分析 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 图6-1 UART驱动结构图第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 当uart_port从ser
7、ial设备接收到数据时,会将设备放入对应line discipline的缓冲区中。这样,用户在编写串口驱动时,需先注册一个uart_driver,其主要作用是定义设备节点号,然后将对设备的各项操作封装在uart_port上,驱动工程师没必要关心上层的流程,只需按硬件规范将uart_port中的接口函数完成就可以了。第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 6.3.2 UART驱动中重要的数据结构及其关联驱动中重要的数据结构及其关联 一个uart_driver通常会注册一段设备号,即在用户空间会看到uart_driver对应有多个设备节点。从上面的架构来看,每
8、个设备文件应该对应一个uart_port,每个uart_port对应一个circ_buf,所以uart_port必须和这个缓存区关联起来。第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 1.UART驱动中常用的数据结构驱动中常用的数据结构1)tty_operations结构体结构体tty_operations结构体定义了tty设备的相关操作,包括发送、接收及线路设置等,uart驱动常用的数据结构如图6-2所示。第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 图6-2 UART驱动常用的数据结构第第6章章 Linux下下S3C2440串
9、口驱动及应用实例串口驱动及应用实例 2)uart_driver结构体结构体uart_driver包含串口设备的驱动名、设备名、设备号等信息,封装了tty_driver,使得底层的UART驱动无需关心tty_driver。3)uart_port结构体结构体uart_port用于描述一个UART端口(直接对应于一个串口)的I/O端口或I/O内存地址、FIFO大小、端口类型等信息。第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 2.UART驱动中函数原型描述驱动中函数原型描述(1)uart_driver的注册操作:的注册操作:int uart_register_driv
10、er(struct uart_driver*drv)(2)增加一个串口端口增加一个串口端口uart_add_one_port()函数:函数:int uart_add_one_port(struct uart_driver*drv,struct uart_port*port)(3)设备节点的设备节点的open操作操作 uart_open函数:函数:static int uart_open(struct tty_struct*tty,struct file*filp)第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例(4)uart_startup()函数:函数:stati
11、c int uart_startup(struct uart_state*state,int init_hw)(5)设备节点的设备节点的write操作函数:操作函数:static int uart_write(struct tty_struct*tty,const unsigned char*buf,int count)(6)读取串口设备收到一个字符读取串口设备收到一个字符uart_put_char:static void uart_put_char(struct tty_struct*tty,unsigned char ch)(7)获取控制台参数获取控制台参数uart_tiocmget:st
12、atic int uart_tiocmget(struct tty_struct*tty,struct file*file)第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例(8)设置控制台参数设置控制台参数uart_tiocmget:static int uart_tiocmset(struct tty_struct*tty,struct file*file,unsigned int set,unsigned int clear)(9)IO命令处理函数命令处理函数uart_ioctl:static int uart_ioctl(struct tty_struct*t
13、ty,struct file*filp,unsigned int cmd,unsigned long arg)第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 6.4.1 串口硬件串口硬件S3C2440内部具有3个独立的UART控制器,每个控制器都可以工作在Interrupt(中断)模式或DMA(直接内存访问)模式上。一个完整的数据帧包含开始位、有效数据位、奇偶校验位、停止位四个部分,各部分的顺序都是规定好的,如图6-3所示。6.4 S3C2440 UART驱动实例分析第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 图6-3 UART数
14、据帧格式第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 实际上,一个完整的数据帧可以不包含奇偶校验位,所以通过UART发送的数据帧至少包含开始位,有效数据位,停止位。数据帧格式描述如表6-1所示。第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-1 数据帧格式描述数据帧格式描述数据帧的各部分 位 长 描 述 开始位 1 代表一个数据帧的开始 有效数据位 58 它写入输出缓存寄存器UTXH里的值或从接收缓存器RXH0读出值。LSB 代表数据位的最低位,MSB 代表数据的最高位,如果接收到的数据位被配置成少于 8 位,则在 RXH0
15、 里,该数据位是右对齐的,不足 8 位的地方会被填充 0 奇偶校验位 0 或 1 如果是奇校验,该位会被设置为 1,并且数据位有奇数个 1;如果是偶校验,该位会被设置为 0,数据位则有偶数个 1 停止位 1 或 1.5 或 2 表示一个数据帧的结束,以高电平显示 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 对于每个串口都可以通过ULCON控制器设置,作为发送方和接收方波特率的数据格式必须一致。波特率产生器:每个UART由一个专用的波特率分频寄存器(UBRDIVn)控制,计算公式如下:UBRDIVn=(int)16波特率clock UART-1第第6章章 Lin
16、ux下下S3C2440串口驱动及应用实例串口驱动及应用实例 上面公式中,时钟频率由UART控制寄存器UCONn11:10的值及UBRDIVn的值确定。例如,如果波特率为115200b/s和UART clock为40MHz,则UBRDIVn=(int)116200 115000 000 40=(int)(21.7)-1=22-1=21第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 6.4.2 UART的寄存器的寄存器1.UART线路控制寄存器线路控制寄存器该串口模块有3个UART线路控制寄存器:UCLON0,UCLON1和UCLON2。表6-2、表6-3为UART线
17、路控制寄存器各位定义。第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-2 UART线路控制寄存器线路控制寄存器寄存器 地 址 读/写 描 述 默认值 ULCON0 0 x500000000 R/W 串口 0 线路控制寄存器 0 x00 ULCON1 0 x500004000 R/W 串口 1 线路控制寄存器 0 x00 ULCON2 0 x500008000 R/W 串口 2 线路控制寄存器 0 x00 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-3 UART线路控制寄存器位定义线路控制寄存器位定义ULCONn 位
18、 描 述 初始状态 保留 7 0 红外模式 6 0=普通模式,1=红外 Tx/Rx 模式 0 奇偶校验模式 5:3 0 xx=无校验,100=奇校验,101=偶校验 000 数据停止位 2 0=1 位停止位,1=2 各停止位,如果数据长度为5,则停止位 1=1.5 0 数据长度 1:0 00=5 位,01=6 位,10=7 位,11=8 位 00 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 2.UART控制寄存器控制寄存器UART控制寄存器各位定义如表6-4和表6-5所示。第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-4
19、 UART控制寄存器控制寄存器寄存器 地 址 读/写 描 述 默认值 UCON0 0 x500000004 R/W 串口 0 控制寄存器 0 x00 UCON1 0 x500004004 R/W 串口 1 控制寄存器 0 x00 UCON2 0 x500008004 R/W 串口 2 控制寄存器 0 x00 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-5 UART控制寄存器位定义控制寄存器位定义 UCONn 位 描 述 初始状态 FCLK 分频器 15:12 当时钟源选择 FCLK/n 时分频,n 的值由 UCON015:12、UCON115:12、U
20、CON214:12决定。UCON215用来设置 FCLK/n 是否有效 n 值为 721 时,使用 UCON015:12 n 值为 2236 时,使用 UCON115:12 n 值为 3743 时,使用 UCON014:12 UCON215为 0 时,FCLK/n 无效 UCON215为 1 时,FCLK/n 有效 如果用 UCON0,则 UART clock=FCLK/(div+6),第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 续表续表UCONn 位 描 述 初始状态 FCLK 分频器 15:12 如果 div0,则 UCON1、UCON2 必须为 0;例如
21、,1:UART clock=FCLK/7 2:UART clock=FCLK/8 3:UART clock=FCLK/9 15:UART clock=FCLK/21 如果是 UCON1,则 UART clock=FCLK/(div+21),如果 div0,则 UCON0、UCON2 必须为 0;例如,1:UART clock=FCLK/22 2:UART clock=FCLK/23 3:UART clock=FCLK/24 15:UART clock=FCLK/36 如果是 UCON2,则 UART clock=FCLK/(div+36)如果 div0,则 UCON0、UCON1 必须为 0;
22、例如,1:UART clock=FCLK/37 2:UART clock=FCLK/38 3:UART clock=FCLK/39 7:UART clock=FCLK/43 如果 UCON0/115:12和 UCON214:12都为 0,则Div=44,UART clock=FCLK/44 Div 范围为 744 0000 时钟选择 11:10 00=PCLK,10=PCLK,01=UEXTCLK,11=FCLK/n 0 Tx 中断类型 9 0=脉冲,1=电平 0 Rx 中断类型 8 0=脉冲,1=电平 0 Rx 超时使能 7 0=无效,1=有效 0 Rx 错误中断与否 6 0=不产生 Rx
23、错误中断,1=产生 Rx 错误中断 0 Loopbank 模式 5 0=普通模式,1=Loopback 发送间断信号 4 0=普通模式发送,1=发送中断信号 发送模式 3:2 00=禁止发送,01=中断或查询模式,10=DMA0 中断请求(仅针对 UART0)DMA3(仅针对 UART2)11=DMA1 中断请求(仅针对 UART1)00 接收模式 1:0 00=禁止接收,01=中断或查询模式,10=DMA0 中断请求(仅针对 UART0)DMA3(仅针对 UART2)11=DMA1 中断请求(仅针对 UART1)00 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实
24、例 3.UART FIFO控制寄存器控制寄存器UART FIFO控制寄存器各位定义如表6-6和表6-7所示。第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-6 UART FIFO控制寄存器控制寄存器寄存器 地 址 读/写 描 述 默认值 UFCON0 0 x500000008 R/W 串口 0 FIFO 控制寄存器 0 x0 UFCON1 0 x500004008 R/W 串口 1 FIFO 控制寄存器 0 x0 UFCON2 0 x500008008 R/W 串口 2 FIFO 控制寄存器 0 x0 第第6章章 Linux下下S3C2440串口驱动及应用
25、实例串口驱动及应用实例 表表6-7 UART FIFO控制寄存器位定义控制寄存器位定义UFCONn 位 描 述 初始状态 Tx FIFO触发类型 7:6 00=0 字节,01=16 字节,10=32 字节,11=48 字节 00 Tx FIFO触发类型 5:4 00=1 字节,01=8 字节,10=16 字节,11=32 字节 0 保留 3 0 Tx FIFO 复位 2 0=Tx FIFO 复位不清零,1=Tx FIFO 复位清零 0 Rx FIFO 复位 1 0=Rx FIFO 复位不清零,1=Rx FIFO 复位清零 0 FIFO 使能 0 0:禁止,1:使能 0 第第6章章 Linux下
26、下S3C2440串口驱动及应用实例串口驱动及应用实例 4.UART MODEM控制寄存器控制寄存器UART MODEM控制寄存器各位定义如表6-8和表6-9所示。第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-8 UART MODEM控制寄存器控制寄存器寄存器 地 址 读/写 描 述 默认值 UMCON0 0 x50000000C R/W 串口 0 FIFO 控制寄存器 0 x0 UMCON1 0 x50000400C R/W 串口 1 FIFO 控制寄存器 0 x0 保留 0 x50000800C 保留 未定义 第第6章章 Linux下下S3C2440串
27、口驱动及应用实例串口驱动及应用实例 表表6-9 UART MODEM控制寄存器位定义控制寄存器位定义UMCONn 位 描 述 初始状态 保留 7:5 必须设置成 0 00 自动流控标志位 4 0=关闭,1=打开 0 保留 3:1 必须设置成 0 00 nRTS 是否激活 0 0=不激活,1=激活 0 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 5.UART Tx/Rx状态寄存器状态寄存器UART TX/RX状态寄存器各位定义如表6-10和表6-11所示。6.UART错误状态寄存器错误状态寄存器UART错误状态寄存器各位定义如表6-12和表6-13所示。第第6章
28、章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-10 UART Tx/Rx状态寄存器状态寄存器寄存器 地 址 读/写 描 述 默认值 UTRSTAT0 0 x5000000010 R 串口 0 Tx/Rx 状态寄存器 0 x6 UTRSTAT1 0 x5000040010 R 串口 1 Tx/Rx 状态寄存器 0 x6 UTRSTAT2 0 x5000080010 R 串口 2 Tx/Rx 状态寄存器 0 x6 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-11 UART Tx/Rx状态寄存器位定义状态寄存器位定义UTRST
29、ATn 位 描 述 初始状态 发送缓存清空 2 0=不为空,1=发送器(发送缓冲区或移位寄存器)为空 1 发送缓冲区 1 0=缓冲区为空,1=缓冲区不为空 1 接收缓冲区 0 0=缓冲区为空,1=缓冲区不为空 0 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-12 UART错误状态寄存器错误状态寄存器寄存器 地 址 读/写 描 述 默认值 UERSTAT0 0 x5000000014 R/W 串口 0 错误状态寄存器 0 x0 UERSTAT1 0 x5000040014 R/W 串口 1 错误状态寄存器 0 x0 UERSTAT2 0 x5000080
30、014 R/W 串口 2 错误状态寄存器 0 x0 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-13 UART错误状态寄存器位定义错误状态寄存器位定义 UERSTATn 位 描 述 初始状态 间隔信号 3 0=没有间隔接收,1=有间隔发送 0 帧错误 2 0=在接收中没有帧错误,1=帧错误(中断发生)0 奇偶校验错误 1 0=在接收中没有错误,1=奇偶校验错误(中断发生)0 溢出错误 0 0=在接收中没有溢出错误,1=溢出错误(中断发生)0 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 7.UART FIFO状态寄存器状
31、态寄存器UART FIFO状态寄存器各位定义如表6-14和表6-15所示。第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-14 UART FIFO状态寄存器状态寄存器寄存器 地 址 读/写 描 述 默认值 UFSTAT0 0 x5000000018 R 串口 0 FIFO 状态寄存器 0 x0 UFSTAT1 0 x5000040018 R 串口 1 FIFO 状态寄存器 0 x0 UFSTAT2 0 x5000080018 R 串口 2 FIFO 状态寄存器 0 x0 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-
32、15 UART FIFO状态寄存器位定义状态寄存器位定义 UFSTATn 位 描 述 初始状态 保留 15 0 Tx FIFO 是否位空 14 0=0 字节Tx FIFO 数据63 字节 1=满 0 Tx FIFO 字节数 13:8 Tx FIFO 中的字节数 0 保留 7 0 Rx FIFO 是否位空 6 0=0 字节Rx FIFO 数据63 字节 1=满 0 Tx FIFO 字节数 5:0 Tx FIFO 中的字节数 0 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 8.UART MODEM状态寄存器状态寄存器UART MODEM状态寄存器各位定义如表6-1
33、6和表6-17所示。第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-16 UART MODEM状态寄存器状态寄存器寄存器 地 址 读/写 描 述 默认值 UMSTAT0 0 x500000001C R 串口 0 MODEM 状态寄存器 0 x0 UMSTAT1 0 x500004001C R 串口 1 MODEM 状态寄存器 0 x0 保留 0 x500008001C 保留 未定义 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-17 UART MODEM状态寄存器位定义状态寄存器位定义UMSTAT0 位 描 述 初始
34、状态 检测 CTS 4 0=没有变化,1=变化 0 保留 3:1 0 清除发送 0 0=CTS 信号未激活(nCTS 脚为高)1=CTS 信号激活(nCTS 脚为低)0 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 图6-4为nCTS和CTS Delta CTS时序图,描述了nCTS和CTS Delta CTS的时序。第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 图6-4 nCTS和CTS Delta CTS时序图第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 9.UART发送缓冲寄存器发送缓冲寄存器
35、UART发送缓冲寄存器各位定义如表6-18和表6-19所示。10.UART接收缓冲寄存器接收缓冲寄存器UART接收缓冲寄存器各位定义如表6-20和表6-21所示。第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-18 UART发送缓冲寄存器发送缓冲寄存器寄存器 地 址 读/写 描 述 默认值 UTXH0 0 x5000000020(L)0 x5000000023(B)W 串口 0 发送缓冲寄存器 UTXH1 0 x5000040020(L)0 x5000040023(B)W 串口 1 发送缓冲寄存器 UTXH2 0 x5000080020(L)0 x5000
36、080023(B)W 串口 2 发送缓冲寄存器 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-19 UART发送缓冲寄存器位定义发送缓冲寄存器位定义UTXHn 位 描 述 初始状态 保留 7:0 传输的数据 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-20 UART接收缓冲寄存器接收缓冲寄存器寄存器 地 址 读/写 描 述 默认值 URXH0 0 x5000000024(L)0 x5000000027(B)R 串口 0 接收缓冲寄存器 URXH1 0 x5000040024(L)0 x5000040027(B)R
37、 串口 1 接收缓冲寄存器 URXH2 0 x5000080024(L)0 x5000080027(B)R 串口 2 接收缓冲寄存器 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-21 UART接收缓冲寄存器位定义接收缓冲寄存器位定义URXHn 位 描 述 初始状态 RXDATAn 7:0 接收的数据 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 11.UART波特率分频寄存器波特率分频寄存器UART波特率分频寄存器各位定义如表6-22和表6-23所示。第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应
38、用实例 表表6-22 UART波特率分频寄存器波特率分频寄存器 寄存器 地 址 读/写 描 述 默认值 UBRDIV0 0 x5000000028 R/W 波特率分频寄存器 0 UBRDIV1 0 x5000040028 R/W 波特率分频寄存器 1 UBRDIV2 0 x5000080028 R/W 波特率分频寄存器 2 第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 表表6-23 UART波特率分频寄存器位定义波特率分频寄存器位定义UBRDIVn 位 描 述 初始状态 UBRDIV 15:0 波特率分界线值 UBRDIVn0 使用 UEXTCLK 为输入时钟,
39、UBRDIVn 被设置成“0”第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 6.4.3 S3C2440串口驱动数据结构分析串口驱动数据结构分析3C2440 UART控制器相关寄存器地址及初始值定义如下:#define S3C24XX_VA_UARTS3C2410_ADDR(0 x00800000)#define S3C2440_PA_UART(0 x15000000)#define S3C2410_PA_UART(0 x50000000)#define S3C24XX_SZ_UARTSZ_1M#define S3C24XX_VA_UART0 (S3C24XX_V
40、A_UART)#define S3C24XX_VA_UART1 (S3C24XX_VA_UART+0 x4000)第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例#define S3C24XX_VA_UART2 (S3C24XX_VA_UART+0 x8000)#define S3C2410_PA_UART0 (S3C2410_PA_UART)#define S3C2410_PA_UART1 (S3C2410_PA_UART+0 x4000)#define S3C2410_PA_UART2(S3C2410_PA_UART+0 x8000)#define S3C241
41、0_URXH(0 x24)#define S3C2410_UTXH(0 x20)#define S3C2410_ULCON(0 x00)#define S3C2410_UCON(0 x04)第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例#define S3C2410_UFCON (0 x08)#define S3C2410_UMCON(0 x0C)#define S3C2410_UBRDIV (0 x28)#define S3C2410_UTRSTAT (0 x10)#define S3C2410_UERSTAT (0 x14)#define S3C2410_UF
42、STAT (0 x18)#define S3C2410_UMSTAT (0 x1C)第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 6.4.4 结构体及相关变量定义结构体及相关变量定义串口驱动相关数据结构关系如图6-5所示。(1)uart_driver结构体中很多数据结构其实就是tty_driver中的。将数据转换为tty_driver之后,注册tty_driver,结构体代码如下:#define S3C24XX_SERIAL_NAMEttySAC#define S3C24XX_SERIAL_DEVFS tts/#define S3C24XX_SERIAL_MAJ
43、OR204#define S3C24XX_SERIAL_MINOR64static struct uart_driver s3c24xx_uart_drv=第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例 图6-5 相关数据结构关系图第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例.owner=THIS_MODULE,.dev_name=“s3c2410_serial”,.nr =3,.cons=S3C24XX_SERIAL_CONSOLE,.driver_name=S3C24XX_SERIAL_NAME,.devfs_name=S3C2
44、4XX_SERIAL_DEVFS,.major=S3C24XX_SERIAL_MAJOR,.minor=S3C24XX_SERIAL_MINOR,;第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例(2)s3c24xx_uart_port结构体中的s3c24xx_uart_info成员,是一些针对S3C2410 UART的信息,代码如下:struct s3c24xx_uart_port unsigned char rx_claimed;unsigned char tx_claimed;struct s3c24xx_uart_info *info;struct s3c2
45、4xx_uart_clksrc *clksrc;struct clk *clk;struct clk *baudclk;struct uart_port port;第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例(3)uart_ops结构体定义了串口的基本操作,代码如下:static struct uart_ops s3c24xx_serial_ops=.pm=s3c24xx_serial_pm,.tx_empty=s3c24xx_serial_tx_empty,/发送缓冲区空.get_mctrl=s3c24xx_serial_get_mctrl,/得到modem控
46、制设置.set_mctrl=s3c24xx_serial_set_mctrl,/设置modem控制(MCR).stop_tx=s3c24xx_serial_stop_tx,/停止接收字符.start_tx=s3c24xx_serial_start_tx,/开始传输字符.stop_rx=s3c24xx_serial_stop_rx,/停止接收字符第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例.enable_ms=s3c24xx_serial_enable_ms,/modem状态中断使能.break_ctl=s3c24xx_serial_break_ctl,/控制br
47、eak信号的传输.startup=s3c24xx_serial_startup,/启动端口.shutdown=s3c24xx_serial_shutdown,/禁用端口.set_termios=s3c24xx_serial_set_termios,/改变端口参数第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例.type=s3c24xx_serial_type,/返回描述特定端口的常量字符串指针.release_port=s3c24xx_serial_release_port,/释放端口占用的内存及IO资源.request_port=s3c24xx_serial_re
48、quest_port,/申请端口所需的内存和IO资源.config_port=s3c24xx_serial_config_port,/执行端口所需的自动配置步骤.verify_port=s3c24xx_serial_verify_port,/验证新的串行端口信息;第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例(4)s3c24xx_uart_info结构体的代码如下:static struct s3c24xx_uart_info s3c2410_uart_inf=.name=“Samsung S3C2410 UART”,.type=PORT_S3C2410,.fif
49、osize=64,.rx_fifomask=S3C2410_UFSTAT_RXMASK,.rx_fifoshift=S3C2410_UFSTAT_RXSHIFT,.rx_fifofull=S3C2410_UFSTAT_RXFULL,第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例.tx_fifofull=S3C2410_UFSTAT_TXFULL,.tx_fifomask=S3C2410_UFSTAT_TXMASK,.tx_fifoshift=S3C2410_UFSTAT_TXSHIFT,.get_clksrc=s3c2410_serial_getsource,.s
50、et_clksrc=s3c2410_serial_setsource,.reset_port=s3c2410_serial_resetport,第第6章章 Linux下下S3C2440串口驱动及应用实例串口驱动及应用实例(5)s3c2410_uartcfg结构体,针对UART的设置(UCONn、ULCONn、UFCONn寄存器等)被封装到s3c2410_uartcfg结构体中,代码如下:struct s3c2410_uartcfg unsigned char hwport;/*硬件端口号*/unsigned char unused;unsigned short flags;unsigned l