RK3568 Android 11 驱动开发(五):串口驱动适配

概述

本文讲述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,表示使能该串口节点

  1. 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打开串口会报无权限的错误

  1. 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设备驱动调试。

相关推荐
bandaoyu1 天前
【RDMA】rdma指令
驱动开发
2301_772204281 天前
LCD驱动开发:行场扫描与时序
驱动开发
LUCIFER2 天前
[驱动进阶——MIPI摄像头驱动(五)]rk3588+OV13855摄像头驱动加载过程详细解析第四部分——ISP驱动
linux·驱动开发
Lueeee.2 天前
注册 platform 设备实验
linux·驱动开发
dump linux2 天前
字符设备框架与驱动开发入门
linux·驱动开发·嵌入式硬件
草草_2 天前
【内核驱动基础】内核模块的两种编译方式(in-tree vs out-of-tree)
linux·驱动开发·内核
春日见2 天前
C++单例模式 (Singleton Pattern)
java·运维·开发语言·驱动开发·算法·docker·单例模式
Moonquakes5402 天前
嵌入式开发基础学习笔记(RGB LCD 驱动开发)
arm开发·驱动开发·嵌入式硬件
嵌入式-老费2 天前
Linux camera驱动开发(开篇)
linux·运维·驱动开发