本文皆以 uart1 为例
1.Dts 配置:
打开 uart: 在 dts 中添加:
&uart_bb {
status = “okay”;
dma-names = “!tx”, “!rx”;
pinctrl-0 = <&uart1_xfer>;
};
根据需要打开关闭 uart 的 dma 功能,只有数据量大时,才考虑使用 dma 搬运,默认不
使用 dma
dma-names = “tx”, “rx”; 使能 DMA 发送和接收
dma-names = “!tx”, “!rx”; 禁止 DMA 发送和接收
rts 与 cts 需要硬件支持,使能 rts,cts 前请确定硬件有接这两个 pin
pinctrl-0 = <&uart1_xfer, &uart1_cts, &uart1_rts>;//使能 cts,rts,
以上配置完成后,烧录 resource.img 后,板子上会出现/dev/ttyS1 节点
2 调试方法:
2.1 如何测试 uart
通常用两种方式测试: 1:与 pc 通讯
2:自收发测试
2.1.1 与 pc 通讯
通常先将开发板与 pc 通讯,通讯正常后,再与外设通讯。按以下步骤与 pc 通讯: 1:首先开发板上装 uartapk,可网上下载,晚上有很多串口 apk,注意,如果有硬
件流控(即 rts,cts),则需要下载支持硬流控的串口 apk
2:pc 端下载串口工具,如 securecrt
3:通过串口转 usb 小板(淘宝有售),将串口接至 pc 上,securecrt 打开对应端口
(端口号可在“设备管理–>端口”中查看),设置波特率,通常使用 115200
4:开发板端打开串口 apk,设置流控及波特率,打开节点/dev/ttyS1,至此,可使
用 uart 进行通讯
2.1.2 自收发测试
1:首先开发板上装 uartapk,可网上下载,网上有很多串口 apk,注意,如果有硬
件流控(即 rts,cts),则需要下载支持硬流控的串口 apk
2:将 uart 的 tx,rx 互连,若有 cts,rts,将 cts 接地,rts 悬空
3:打开 apk,进行测试
2.2 常见问题及调试方法
2.2.1 串口无法输入或输出
通常无法输入或输出有两种可能
1:串口打开了硬流控,且 cts 未拉低,导致开发板不能输出
2:uart 的 tx 或 rx 复用有问题
排查方法:
使用 io 命令,查看寄存器配置。Io 命令使用方法: 1:向 rk 咨询,获取芯片 trm 手册
2:基本所有的 gpio 复用由 grf 控制器确定,这里以 3288trm 为例:
首先查看 trm 的 System Overview 章节的 Address Mapping 小节,搜 grf 可查到
Grf 寄存器的基地址为 0xff770000
再到 grf 章节,General Register Files (GRF)中,搜索 uart1(或者直接看硬件对应的 gpio),可查到 uart1 是由 GRF_GPIO5B_IOMUX 寄存器控制,查看
GRF_GPIO5B_IOMUX 偏移地址为 0x0050,即实际地址为:
0xff770000+0x0050=0xff770050
3:在串口或 adb 中使用命令:
su
io -4 -r 0xff770050
得到结果:
即可读到该寄存器的值,如下图中的寄存器说明,如果只开了 uart1 的 tx,rx,
未打开 cts,rts,则对应结果的 bit[7:0]应该为 0x05:如有异常,则应该到 dts 中搜索,是否其他驱动复用了这几个 pin 脚
2.2.2 串口输出乱码
输出乱码通常有两种可能: 1:波特率误差较大
2:串口波形异常
检查方法: 如 2.1 中所述将板子和 pc 相连,在板子端输出字符串“UUUUUU”,U 对应的
ascii 码值为 0x55,串口波形为 01010101,此时用示波器测量开发板 uart0 tx
端口,测量输出的波形,如下图所示是输出“U”时的波形:
测量频率:可看到实际波特率为 57.67k*2=115340
(115340-115200)/115200=0.0012152777777778
误差远小于 2%,因此该波特率可接受,且无乱码
如果波形有异常则需要检查硬件以及查看软件是否需要配置内部上下拉
2.2.3 串口乱码时检查串口时钟
正常常用的串口波特率 rockchip 都是支持的,如 4800,9600,115200 等,准确率
也较高,一般 1.5M 以下的波特率都可以分出来。
也有个别客户会要求使用一些不常见的波特率,此时需要根据波特率计算时钟。
波特率=时钟源/16/DIV。(DIV 是分频系数) Div 是系统会自动为 uart 控制器计算,数值为整数,以 2.2.2 中测量的 115200
波特率为例: 1:在 dts 中我们可看到时钟源:
uart_bt: serial@ff180000 {
compatible = “rockchip,serial”;
reg = <0xff180000 0x100>;
interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
clock-frequency = <24000000>;//这里设置的为 24M 时钟源
clocks = <&clk_uart0>, <&clk_gates6 8>;
配置好后,开发板开机,可用命令获取当前 uart1 时钟:
cat /d/clk/clk_summary | grep uart1
clk_uart1 2 2 24000000
clk_uart1_div 0 0 594000000
uart1_frac 0 0 29700000
g_pclk_uart1 2 2 74250000
2:根据 baud=clk/16/DIV 计算:
115384=24M/16/13
符合 2.2.2 中的实际测试结果。如果有需要特殊波特率,改时钟的,计算后修
改 clock-frequency 即可
注:在 4.4 的 kernel 版本后,驱动已经可以根据波特率自动计算时钟,但有些
未知情况可能还是会出问题,以相同的方式查看时钟来确定问题点
时钟
2.2.4 波特率与设置的不符或丢失字符
1:由于系统默认使用 ttyS0 或 ttyS1 作为蓝牙通讯使用,因此如果没有关闭蓝牙就
直接使用可能会导致两个问题,一是波特率被蓝牙服务改变,二是蓝牙从串口读取
了数据,导致客户 apk 再读取数据时会出现丢失字符串,此时可先将蓝牙服务关闭,
关闭方法: 1:在 device/rockchip/目录下搜 ttyS,将有关的内容都注释掉
2:在 device/rockchip/目录下搜 BOARD_HAVE_BLUETOOTH
将该属性设置为 false,在到 sdk 根目录下使用命令
get_build_var BOARD_HAVE_BLUETOOTH
确定返回结果为 false,然后重新编译系统
make installclean && make
2:有时个别客户存在两个 apk 同时读一个串口,此时也会导致数据在 apk 上显示
不全,同一时刻只能有一个服务读取串口数据
2.2.5 串口节点权限
可在以下文件中添加节点权限:
sdk\device\rockchip\common\init.connectivity.rc
的 on boot 中添加:
on boot
chmod 0777 /dev/ttyS0
chmod 0777 /dev/ttyS1