概述
本文讲述RK3568 Android 11 串口驱动的适配,包括TTL,RS232和RS485等。
内核编译选项配置
Android 驱动在系统加载方式由两种:
1)将驱动编译进入内核镜像,在系统开机内核初始化阶段被加载;
2)将驱动编译为模块的形式,在系统用户空间初始化过程中被加载;
串口驱动比较简单,我们选择在系统启动内核初始化加载,因此在内核编译的配置文件中,将串口驱动默认编译进内核中。我们在内核配置文件中打开如下的配置选项:
文件路径为kernel/arch/arm64/configs/rockchip_defconfig
CONFIG_SERIAL_8250_DW=y
我们如何能确保上述的编译选型生效呢,我们有2种方法可以查看
a、打开该选项后,我们在编译内核后,在kernel/.config文件中搜索上述的字段,如果能搜到并且没有被注释掉,则说明已经打开,下面是我的搜索截图, 表示该编译配置选项已经生效:

b、查看uart的驱动源码是否被编译成8250_dw.o文件了。我们进入kernel/drivers/tty/serial/8250的目录下,去查看是否有8250_dw.o文件

设备树配置
在串口驱动适配中,常常提及到的TTL电平、RS232电平、RS485电平,这些都是硬件信号定义的概念。在Android系统串口调试来说驱动来说都是一样的。虽然对于驱动调试来说方法都是一样的,但是我们在调试的过程中关注的点还是不一样的,下面我们分开讲述。
所有驱动的调试,都是根据硬件设计的原理图进行相应的调整的。所以作为一个驱动工程师,我们还需要具备能看懂原理图的能力。
TTL驱动配置
a、首先我们根据原理图找到串口TTL的部分,对于RK3568 CPU来说,串口默认就是TTL电平,例如下面的原理图设计, 将uart4直接作为TTL电平接口接入到了J26的接口座子上:

b、我们在原理图中看到它使用了UART4_RX_M1和UART4_TX_M1这两个引脚,我们在原理图文件中搜索UART4_RX_M1和UART4_TX_M1找到他们最终连接到CPU的部分,如下所示:

我们可以搜到最终UART4_RX_M1和UART4_TX_M1的地方,发现这两个引脚是引脚复用的(也就是一个引脚,可以作为多个功能引脚,但是同一时刻,只有一种功能起作用)。
c、分析完原理图,我们最终的设备树配置节点如下所示:
&uart4 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart4m1_xfer>;
};
设备树配置节点我们需要关注如下信息:
1)status 设置为okay,表示使能该串口节点
- pinctrl-names: 设置为default即可,其他的名字也是可以;
3)pinctrl-0: 设置为uart4m1_xfer。这个设置是根据原理图设计 。uart4m1_xfer的信息存放 kernel/arch/arm64/boot/dts/rockchip/rk3568-pinctrl.dtsi文件中;
RS232驱动配置
RS232的驱动适配跟TTL驱动适配步骤是相同,RS232的大部分参考电路如下所示:

从上面的原理图中我们可以看到:
1)MAX3232是一个电平转化芯片,将TTL电平转化为RS232电平(关于什么是RS232电平,这里不再详细展开说明)。
2)原理图的左侧是CPU的连到UART3_{RT}X_M1端。右侧是电平转化后的输出,RS232------{TR}X1.
所以对于我们驱动来说,只需要配置CPU端的UART3_RX_M1和UART3_TX_M1的设备树节点,如下所示:
&uart3 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart3m1_xfer>;
};
RS485驱动配置
RS485的驱动适配跟TTL驱动适配步骤是相同,RS485的大部分参考电路如下所示:

从上面的原理图中我们可以看到:
1)SIT3485E是一个电平转化芯片,将TTL电平转化为RS485电平(关于什么是RS485电平,这里不再详细展开说明)。
2)原理图的左侧是CPU的连到UART7_{RT}X_M1端。右侧是电平转化后的输出,RS485_A/B.
所以对于我们驱动来说,只需要配置CPU端的UART7_RX_M1和UART7_TX_M1的设备树节点,如下所示:
&uart7 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&uart7m1_xfer>;
};
内核启动加载
查看串口驱动是否加载成功,我们有两种方式:
1)第一种接板子上的调试串口(RK3568是UART2), 波特率设置为1500000,然后开机查看是否有如下截图的输出,如果有,则表明串口UART0,UART3, UART4, UART5, UART7, UART8设备树配置生效。

2)adb shell登录后,输入dmesg 从输出的内核日志去查找上面截图的串口信息,如果有你驱动配置的UART信息输出,则说明备树配置生效,驱动初始化成功;
驱动测试
1)首先我们安装ComAssistant.apk工具,然后运行该工具,如下截图:

2)查看/dev/ttyS*的权限,如下截图:

在调试阶段,将所有的ttyS*的文件权限修改为 0777, 执行 chmod 0777 /dev/ttyS* 否则第三方应用ComAssistant打开串口会报无权限的错误
- TTL和RS232的测试
TTL的测试和RS232的测试,我们可以将RX与TX的引脚短接在一起,然后使用ComAssistant进行收发,成功如下截图:
4)RS485的测试
工程连接
https://gitee.com/yanl1229/Rockchip_Android11.git
常见问题总结
1、设备树pin引脚复用配置问题, 导致UART的串口驱动初始化失败;
2、配置的uart的设备树节点是否status = "okay"的状态;
3、RS232的测试中TX和RX的交叉问题导致收发都不起作用;
4、测试工具波特率设置的不相同,导致的收发出现乱码或者根本收不到数据;
5、RS485的测试中,在波特率匹配的情况下出现乱码的话,注意120R的匹配电阻;
总结
本文描述了在RK3568 平台 Android 11串口驱动的调试步骤。下一节讲述I2C设备驱动调试。