Hi3531A芯片共有四个uart单元,uart0是调试串口默认是打开的,uart1-3需要重新配置。操作如下。
1.确定内核加载了串口uart驱动程序
可以参考
“hi3531 添加uart3 https://blog.csdn.net/xiaoaid01/article/details/51328667”
海思Hi3531A的linux内核中串口驱动和设备是挂在AMBA总线下的,其驱动程序文件为“……\osdrv\opensource\kernel\linux-3.10.y\drivers\tty\serial\amba-pl011.c”,在linux内核配置中默认是使能该驱动的,必须使能该驱动才能使用串口tty设备
2.添加amba总线上的串口设备
在“……\osdrv\opensource\kernel\linux-3.10.y\arch\arm\mach-hi3531a\core.c”中,添加uart1-3的amba总线设备数据结构体。
固定uart1-3时钟频率。
可以看下宏定义:amba设备数据结构体
例如HIL_AMBA_DEVICE(uart1, "uart:1", UART1, NULL)赋值后,其中的.irq={INTNR_UART1,INTNR_UART1}
INTNR_UART1的定义,在……\osdrv\opensource\kernel\linux-3.10.y\arch\arm\mach-hi3531a\include\mach\irqs.h中
3.设备树文件
参考“海思HI35xx平台串口配置方法 - dosthing的博客 - CSDN博客 https://blog.csdn.net/dosthing/article/details/82951207,配置内核,以实现UART单元映射为linux下的设备文件,这里主要涉及就是海思的设备树更改,相对简单。进入SDK目录\osdrv\opensource\kernel\linux-3.18.y\arch\arm\boot\dts,找到以下设备树文件。”
在“……\osdrv\opensource\kernel\linux-3.10.y\arch\arm\boot\dts”中,未找到hi3531a.dtsi和hi3531a-demb.dts。搜到里面类似内容,找到uart0-3相关配置,但未做修改。
4.确认tty文件
第1至3步需要从新编译内核并烧写到Hi3531A设备里,如果没有什么异常,在嵌入式设备上的/dev/目录下发现新的3个设备文件ttyAMA1-3。
串口驱动没有在驱动中建立设备文件,因此在文件系统的启动脚本手动建立。在/etc/init.d/S00devs里:mknod /dev/ttyAMA* c 204 *;
并且需要确保这些操作在设备启动时执行成功。
启动时串口uart0打印如下,说明启动S00devs成功。
5.配置管脚
参考“海思HI35xx平台串口配置方法 - dosthing的博客 - CSDN博客 https://blog.csdn.net/dosthing/article/details/82951207”和“【已解决】3516A UART1 / RS485 只能发送,不能接收 http://bbs.ebaina.com/thread-13585-1-1.html”
对比设备硬件电路图。查看uart1-3,管脚复用寄存器,及其各值所代表的管脚功能。
Register Name |
Function |
Address |
Default Value |
Description |
muxctrl_reg126 |
UART0_RXD管脚复用寄存器。 |
0x120F01F8 |
0 |
UART0_RXD管脚复用关系选择: 0 : UART0_RXD 1 : VOU_SLV_DAT5 2 : GPIO18_0 3 : reserved 其它:reserved |
muxctrl_reg127 |
UART0_TXD管脚复用寄存器。 |
0x120F01FC |
0 |
UART0_TXD管脚复用关系选择: 0 : UART0_TXD 1 : VOU_SLV_DAT4 2 : GPIO18_1 3 : reserved 其它:reserved |
muxctrl_reg128 |
UART1_RTSN管脚复用寄存器。 |
0x120F0200 |
0 |
UART1_RTSN管脚复用关系选择: 0 : GPIO18_2 1 : VOU_SLV_DAT11 2 : UART1_RTSN 3 : UART0_RTSN 其它:reserved |
muxctrl_reg129 |
UART1_CTSN管脚复用寄存器。 |
0x120F0204 |
0 |
UART1_CTSN管脚复用关系选择: 0 : GPIO18_3 1 : VOU_SLV_DAT10 2 : UART1_CTSN 3 : UART0_CTSN 其它:reserved |
muxctrl_reg130 |
UART1_RXD管脚复用寄存器。 |
0x120F0208 |
0 |
UART1_RXD管脚复用关系选择: 0 : GPIO18_4 1 : VOU_SLV_DAT7 2 : UART1_RXD 3 : reserved 其它:reserved |
muxctrl_reg131 |
UART1_TXD管脚复用寄存器。 |
0x120F020C |
0 |
UART1_TXD管脚复用关系选择: 0 : GPIO18_5 1 : VOU_SLV_DAT6 2 : UART1_TXD 3 : reserved 其它:reserved |
muxctrl_reg132 |
UART2_RXD管脚复用寄存器。 |
0x120F0210 |
0 |
UART2_RXD管脚复用关系选择: 0 : GPIO18_6 1 : VOU_SLV_DAT12 2 : UART2_RXD 3 : UART0_RTSN 其它:reserved |
muxctrl_reg133 |
UART2_TXD管脚复用寄存器。 |
0x120F0214 |
0 |
UART2_TXD管脚复用关系选择: 0 : GPIO18_7 1 : VOU_SLV_DAT13 2 : UART2_TXD 3 : UART0_CTSN 其它:reserved |
muxctrl_reg134 |
UART3_RXD管脚复用寄存器。 |
0x120F0218 |
0 |
UART3_RXD管脚复用关系选择: 0 : GPIO23_6 1 : UART3_RXD 2 : reserved 3 : reserved 其它:reserved |
muxctrl_reg135 |
UART3_TXD管脚复用寄存器。 |
0x120F021C |
0 |
UART3_TXD管脚复用关系选择: 0 : GPIO23_7 1 : UART3_TXD 2 : reserved 3 : reserved 其它:reserved |
使用himm(也可使用writew在内核程序中对寄存器进行操作) 使能对应的UART*_RXD和UART*_TXD寄存器,例如:
himm 0x120F0208 0x2 #使能UART1的读功能#UART1_RXD管脚寄存器复用为UART1_RXD
对uart1-3的对应管脚寄存器操作写成脚本uart-regconfig.sh,如下
6.编写对串口进行操作的程序
参考“海思HI35xx平台串口配置方法 - dosthing的博客 - CSDN博客 https://blog.csdn.net/dosthing/article/details/82951207,与其他的linux设备操作类似,通过open、fcntl、close来实现与UART单元进行操作。在串口设备中,比较特殊的就是串口的波特率、奇偶校验、数据位以及停止位的设置了,只有将它们正确设置了才能进行串口通讯。”
查看文件夹中Makefile,主要命令是:arm-hisiv400-linux-gcc -g hiserial.c -o myhicom,由于这样生成的myhicom放到设备里执行后,会显示,
-sh: ./myhicom: not found
所以在arm-linux编译环境里编译时添加-static,
arm-hisiv400-linux-gcc -g hiserial.c -o myhicom -static。
7.测试
下载sscom32串口调试工具到PC机,打开sscom32,设置波特率等。
打开设备telnet,设备启动后,使能uart1-3的管脚复用寄存器,
执行./myhicom 向PC发送信息:
可以用stty看一下当前串口的配置信息,stty -a -F /dev/ttyAMA1 查看终端输出的信息;
“cat /proc/tty/driver/ttyAMA” 看TX/RX的变化。
如果cat /proc/tty/driver/ttyAMA显示发送的数据字符数正确,但sscom32没收到数据,可能硬件错误。
使用sscom32向设备uart1发送数据,使用./myhicom -d /dev/ttyAMA1 -s 115200 -r读取数据。
如果读不到数据,说明硬件问题。
8.注意
这里注意SP3232EEN芯片的使用,参考
“sp3232中文_百度文库 https://wenku.baidu.com/view/4d849817866fb84ae45c8df4.html
常用元器件使用方法5:RS-232电平转换芯片SP3232EEN的使用方法 - snmplink的博客 - CSDN博客 https://blog.csdn.net/qingwufeiyang12346/article/details/82390626”
SP3232EEN芯片是TTL和RS232转换芯片,TTL属于嵌入式设备端,RS232接pc端。
使用的文档和代码在:Hi3531A添加串口uart1、uart2、uart3