APP下载

自动站气压传感器校准系统串口扩展设计

2022-02-18马修才温晓辉牛永红

南方农机 2022年4期
关键词:寄存器调用内核

马修才 , 温晓辉 , 牛永红

(1.内蒙古自治区大气探测技术保障中心,内蒙古 呼和浩特 010051;2.内蒙古自治区气象信息中心,内蒙古 呼和浩特 010051)

0 引言

串口作为常用的通信接口,在嵌入式领域有着广泛的应用。现如今,随着计算机、网络技术的发展,设备连入网络的要求越来越迫切。目前,电子领域仍存在着大量的串口设备,对现有的串口设备进行改造使其具备联网功能将耗费大量人力、财力。自动气象站的气压传感器[1]接口为232串口,为提高检定/校准的效率,设计了气压传感器多路采集器,将多路气压串口信号转换为以太网信号传输,可以同时批量完成传感器的检定/校准任务。气压传感器多路采集器在设计时,由于主控芯片自带232串行端口数量有限,需要进行串口的扩展。串口扩展的实现方案多种多样[2-6],本设计采用的是嵌入式微控制器+专用串口扩展芯片的方法[7-9]。本文以嵌入式设备驱动的整个开发流程为主线,从硬件电路设计、Linux下的扩展串口驱动、驱动测试等方面对本设计展开讨论。

1 硬件平台及串口扩展芯片介绍

S3C2440A基于ARM920T核心,集成了强大的片上功能,多达130个复用用户IO,4通道DMA控制器,3通道64位FIFO的UART,8通道多路复用ADC,支持IIC、IIS、SPI接口。

TL16C754B与EXAR的ST16C654管脚兼容,内置4个可独立工作的UART单元,最高波特率可达3 Mbit/s,具有软/硬件流控功能,可设置4路UART在不同的波特率下工作,并可选择各种串行数据格式。对驱动程序开发人员来说,必须要了解以下引脚功能[10]:CS[A:D]为4路UART的选通信号引脚,低电平有效;A[0:2]为3位地址线;D[0:7]为8位数据线;TX/RX[A:D]为4路UART串行发送/接收引脚;INT[A:D]为4路UART的中断信号引脚;RESET为芯片的复位信号,高电平有效;INTSEL为UART中断屏蔽引脚,高电平时能UART中断,低电平时需视MCR寄存器的第3位而定;CLKSEL为芯片时钟选择引脚,高电平时为低电平时的四倍频;XTAL1、XTAL2为芯片外部晶振的输入输出引脚,外接晶振典型值为1.843 2 M、3.072 M。该器件内部共有20个8位宽的寄存器,在硬件连接正确的情况下,只要地址正确,就能像读取MCU内部寄存器那样读取芯片的内部寄存器。通过A0~A2这3根地址线的8种状态来区分20个寄存器,这20个寄存器中一定有一些是地址重叠的,这就需要通过读写信号及某些寄存器的特定位来进行唯一确定。S3C2440A与TL16C754B硬件连接图,如图1所示。

图1 S3C2440A与TL16C754B硬件连接图

S3C2440A的nGCS5地址译码芯片使能端口相连接,addr0[3:5]连接地址译码器的输入,地址译码器的8个输出端依次连接两片TL16C754B的8个通道的片选信号,S3C2440A的addr[0:2]分别与TL16C754B的A[0:2]顺序直连,S3C2440A读写控制信号与TL16C754B读写控制信号。两片TL16C754B的8个通道UART寄存器的寻址范围为:0×28000000-0×2800003F。

2 Linux下的TL16C754B驱动

2.1 Linux下的终端设备驱动

终端设备多种多样,如串行终端、显示器、telnet终端、HSS终端等。串口也属于一种终端设备,它的驱动程序不仅仅是简单的初始化硬件、接收/发送数据。串口驱动程序从上到下可分为四层:终端设备层、行规层、串口抽象层、串口芯片层。

终端设备层实现了用于注册终端设备的接口函数tty_register_driver(),行规层实现了tty_disc结构体中的成员,串口抽象层的drivers/serial/serial_core.h将各类串口的共性概括出来,串口类型的识别/波特率的设置都是通过这一层来完成的。串口芯片层与具体的芯片有关,比如访问地址和中断号,并对芯片寄存器进行相关设置,对于标准串口,大部分驱动工作都是在这一层完成。TL16C754与8250/16550等标准串口在结构与操作方式上具有一致性,因此可以参考Linux内核中的8250/16550等标准串口驱动8250.c完成Linux下的TL16C754的驱动。

2.2 Linux下的串口驱动编程思路

串口抽象层的serial_core.c为串口芯片层驱动提供了三个结构:uart_driver、uart_port、uart_ops以及对应的接口函数。uart_driver封装了tty_driver,包含了串口设备的驱动名称、设备名称和主次设备号等信息。uart_port用来描述一个串口的地址、中断号、端口类型等信息。uart_ops定义了针对串口的操作,如打开、关闭、线路设置等。

串口芯片层驱动程序需要完成的任务很明确:实现uart_driver、uart_port、uart_ops结构体实例并初始化它们;模块初始化时调用uart_register_driver()和uart_add_one_port()完成串口驱动的注册和端口的添加,模块卸载时调用对应的“反函数”进行回收处理;根据串口芯片手册实现uart_ops实例中的成员函数,串口芯片驱动的大部分任务是在这里完成的。

2.3 驱动数据结构定义和驱动模块初始化

定义uart_driver实体serial_16c754,定义UART_NR个uart_port实体,本设计中UART_NR定义为8。driver_name成员代表驱动名称,在Linux下用cat/proc/drivers命令所看到的驱动名称;dev_name成员代表设备名称,在Linux下用cat/proc/tty/driver/serialEX所看到的串口设备名称,如ttysEX0;major成员代表驱动主设备号;minor成员代表驱动的起始次设备号;nr成员代表串口个数。

定义驱动的uart_ops,其中较为重要的成员函数具体实现将在2.4小节中进行介绍。除了调用uart_register_driver()和uart_add_one_port()完成串口驱动的注册和端口的添加,Linux2.6内核中,还新增了platform驱动的结构,在内核启动时由probe机制自动完成平台设备结构数组和平台驱动的匹配。在TL16C754B的驱动模块初始化时,调用platform_device_register()和platform_driver_register()完成扩展串口平台设备和平台驱动的注册。此前,需要定义扩展串口的平台数据结构的定义和初始化。

plat_serial16c754_port结构体st16c654_data加入dmdk2410的platform_device结构体数组里,内核启动时会将此结构体信息加载到内核中。内核将通过probe机制寻找与之匹配的驱动自动完成tl16c754串口驱动的加载。另外,模块初始化函数中还要完成TL16C754B芯片复位和中断申请的任务。

2.4 串口操作函数实现

serial16c754_startup:应用程序的open()函数,最终会调用到serial16c754_startup,主要完成串口芯片寄存器的初始化工作。serial16c754_set_mctrl:应用程序的tcsetattr()函数,最终会调用serial16c754_set_mctrl,主要完成串行通信的通信格式的设定等功能。serial16c754_get_mctrl:应用程序的tcgetattr()函数,最终会调用serial16c754_get_mctrl,主要完成串行通信的通信格式的设定等功能。serial16c754_shutdown:应用程序的close()函数,最终会调用到serial16c754_shutdown,功能与serial16c754_startup相反。中断处理函数static irqreturn_t serial16c754_interrupt:串口最终的数据收发都是在此完成的,当应用程序调用write()函数时,系统经过层层调用,达到驱动的serial16c754_start_tx函数,启动串口发送中断,驱动在中断处理函数中将缓存中的数据发送出去,直到发送缓存为空,驱动程序调用serial16c754_stop_tx关闭串口发送中断;当串口接收到数据,并且数据个数超过串口接收中断触发层级或者产生串口超时中断,驱动在中断处理函数中将接收到的数据写入内核中的串口数据缓冲区中,此时如果应用程序调用了read()函数,内核会把内核中的串口数据缓冲区中的数据返回给应用程序。

3 驱动测试及结果

驱动调试完成之后,重新编译、下载内核,启动新的内核后,执行“#cat/proc/tty/driver/serialEX”命令,可以查看扩展串口的内核相关信息。将8个扩展串口与安装有串口卡(至少8个串口)的PC机相连,利用PC机下串口测试软件和扩展串口平台Linux下的简单多串口应用程序完成扩展串口的驱动测试。PC串口测试软件每秒钟产生数据包长度为255的无符号char型随机数据,通过串口卡串口发送到扩展串口,扩展串口平台串口应用程序将接收到的数据通过扩展串口原样发送回串口卡串口,由PC机串口测试软件统计成功回送次数。在以上测试条件下运行2 330 min左右,8路串口在长时不间断工作情况下,未产生丢包,可靠性高。

4 结束语

本设计为TL16C754B串口扩展的硬件系统设计和Linux下的串口驱动开发提供了一个示例,可作为设计多串口服务器时进行串口扩展的参考方案。气压传感器多路采集器可以支持多路气压传感器同时接入,大大提高传感器的检定/校准效率。

猜你喜欢

寄存器调用内核
多内核操作系统综述①
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
Lite寄存器模型的设计与实现
核电项目物项调用管理的应用研究
微软发布新Edge浏览器预览版下载换装Chrome内核
二进制翻译中动静结合的寄存器分配优化方法
系统虚拟化环境下客户机系统调用信息捕获与分析①
移位寄存器及算术运算应用
利用RFC技术实现SAP系统接口通信