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

相关推荐
TangDuoduo00053 天前
【Linux SPI驱动开发】
驱动开发
The️3 天前
Linux驱动开发之Read_Write函数
linux·运维·服务器·驱动开发·ubuntu·交互
FserSuN3 天前
AI编程 - 规范驱动开发(SDD)学习
驱动开发·学习·ai编程
TangDuoduo00054 天前
【Linux I2C设备驱动】
linux·驱动开发
The️4 天前
Linux驱动开发之Open_Close函数
linux·运维·驱动开发·mcu·ubuntu
LCG元4 天前
嵌入式GUI设计:STM32F429+LVGL,智能仪表盘界面开发指南
驱动开发·stm32·嵌入式硬件
小龙报5 天前
【51单片机】 给单片机加 “安全锁”!看门狗 WDT:原理 + 配置 + 复位验证全拆解,让程序稳定不跑飞
驱动开发·stm32·单片机·嵌入式硬件·物联网·51单片机·硬件工程
码农编程录5 天前
【notes12】kbuild,内核模块化,字符设备驱动,设备树,platform总线,设备驱动模型
驱动开发
乔碧萝成都分萝5 天前
二十六、IIO子系统 + SPI子系统 + ICM20608
linux·驱动开发·嵌入式
A星空1235 天前
二、交叉编译工具链(arm-linux-gnueabihf-gcc)安装与验证,搭建 TFTP+NFS 服务,调试开发板网络连通性;
linux·c++·驱动开发·单片机·嵌入式硬件