新串口通道打通纪实

在计算机系统中,串口是“古老”的通信方式,和它同时代的“并口”通信方式已经消失了。但它仍然顽强的存活着,主要原因是在开发和调试底层软件时还经常用到串口。

正因为有这样的需求,幽兰代码本是支持串口的,而且有两种方式。第一种是主板上接头,需要打开后盖。第二种方式是通过SD卡接口,不需要打开后盖,非常方便,得到很多兰友的好评。

144c622b055ac61d16bd97c0b54f73b9.png

比幽兰更早的GDK8也支持串口,但是要打开后盖。不够方便,因为此,这几天在准备GDK8的新版本镜像时,我根据GDK8用户的意见提了一个需求,把幽兰的SD串口做法应用到GDK8上。

格蠹的小伙伴Jack接到这个需求,这两天在着手实现。

Jack是格蠹的老程序员了,有比较丰富的底层开发经验。为了方便写代码和试验,他轻车熟路地选择用“刘姥姥”驱动做原型。

GDK8使用的是RK3328 SoC。与幽兰使用的RK3588 SoC相似,3328的串口信号也是与SD卡信号复用的,而且复用的都是2号串口,即UART2。

 不同的是,3328的UART2有两种连接模式,分别称为UART2m0和UART2m1。下面这张表来自RK3328 TRM的第17章接口描述一节。

7d972958eefda991ded9ab2ebd5a21bb.png

对于上表中的m缩写,手册中没有给出任何解释,很让软件工程师困惑。

虽然m的含义不是很明确,但因为m0接口是与SD信号复用的,所以应该按m0方式来设置寄存器。Jack这样修改刘姥姥驱动,把改寄存器的想法转化为代码。

临近中饭时,Jack报告第一个坏消息,“寄存器不能写”。

考虑到这个任务有难度和重要性,我走过去和他一起看寄存器的描述。

9dcb79eccadc6d2fea8ed25e2206733e.png

首先,RK的SPEC中有时也有明显的错误,比如上面截图中的GRF_COM_MUX应该是GRF_CON_MUX,CON是Control的缩写,MUX是复用的缩写。

RK的很多寄存器都是一个套路:高16位是掩码,低16位负责具体功能,高位为1时,低位的值才有效。但这个规则在上表中解释的很啰嗦。Jack说话很少,交流一番,他可能是被解释中的“when bit16=0, bit 0 cannot be written by software”迷惑了。也可能是被冗长的spec搞晕头了。

午饭后,我看Jack的代码,发现一个明显的问题。

我们要选择m0模式,按照第一张截图中表格下面的描述,需要把GRF_CON_MUX[0]写为0。写寄存器时应该写0x10000。但可能是被SPEC中的真真假假搞晕,Jack的代码里把本来想写的0x30000写成了30000。16进制变成10进制了。

06f8c0f4d4d1c60044fb4ada5d4acdd0.png

纠正了这个bug后,寄存器写成功了。GRF_CON_IOMUX[0]位成功被设置为0。

2446fd528e0a60b6f783cca70a540391.png

这个比特位的设置之前为1,说明是工作在m1模式。我特意与GDK8的硬件工程师确认,GDK8主板上的串口使用的正是UART2m1。

bd2d34d5b27a8c9ea0e10b16bb476e20.png

但寄存器写成功的喜悦还没持续几分钟,Jack报告了第二个坏消息:接了SD串口转接头后,主机端还是收不到串口数据。

我说是不是软件写的设备文件不对,Jack说他写了个脚本,把dev下的所有串口设备都试过了。

50754bc48d3e025731afede5968a1177.png

对于通信问题来说,收不到数据是最让人头痛的。刚好今天早上,我顺手把调试WIFI驱动的几张截图发到WOA技术群,引来多位同行发表感想,普遍觉得涉及到通信的问题有很多坑。

ea084a881a1ffc995def72d25dc4f03d.png

还有真实的案例。

7225abaa0981fddc4ec89beccd0cf950.jpeg

看到Jack前进受挫,我决定放下手头的其它事情,进来助力。

一方面,先汇总手头的各种信息,做些归纳和总结,夯牢基础。查看RK3328硬件设计手册,3328的最初开发板EVB也是使用UART2m1方式来做调试口。根据硬件工程师的回复,GDK8是沿用了EVB的设计。GDK8主板背面的TX、RX、GND三个信号是便是UART2m1实物。

48169af59b71dcaf7609353ae1da8b70.png

其实,这个设计也延续到幽兰使用的RK3588,也是使用UART2做为默认的调试口。

另一方面,我联系做硬件的Intel老同事,请他帮忙解释SPEC中m缩写的含义。

9d83f96b9e7a6cebe3c2ad6a76cdbc33.jpeg

术业有专攻,硬件工程师果然不一样,明确给出了m缩写的含义。

清楚了m缩写的含以后,我彻底明白了SPEC的意思,脑海中浮现出一张比较清晰的硬件路线图。

有了这个路线图之后,我更加坚定了信念,认为这个方向是可以走的通的。为了避免单一试验的局限性,我决定增大投入,安排小伙伴Bob也投入战斗,搭建环境,编译新代码。

 但还没有等到Bob把新环境搭建好,Jack发出好消息:

ee141506f988025b7bcff7ff183c33af.png

上面这条信息是从GDK8上通过SD转接头发送到主机端的,也就是说,是以新规划的m0路线传递的。这条消息代表新的串口通道打通了!

7e047366405b17722f2da485a46418cd.jpeg

我询问Jack哪里做了改动,原来只是改了波特率。因为以前使用m1方式调试时,dts里配置的波特率是115200,所以下午试验时误以为还是这个值,但其实根据UART_DLL和UART_DLH寄存器的值计算,应该是1.5M。
dlh=1,uart_clk_sel=2’b10-24mhz,波特率=24m/(1*16)=1.5

经过一天的努力,期待许久的串口新通道终于打通了。回顾整个过程,其实主要的改动就是配置寄存器。

一件事情,做成功了之后,再回头看就觉得没什么复杂,但是在没有做成之前,则充满了困惑。对于这个问题,有很多可能失败和放弃。虽然失败也是一种选项,可它是无法和成功相比的。

GDK8是2021年发布的,在硬件高速度发展的今天,有些人可能觉得它有些老了,但其实,对于很多用户来说,GDK8具有很多不可多得的优点,比如:

- 非常稳定地支持JTAG调试。

- 超低功耗,开机半个月也用不到一度电,所以有些用户从不关机。

- 积累了大量文档、代码以及开发经验,比如今天这样的踩坑实践。

- 小巧玲珑,节约空间。

今天,它又多了一个优点,可以非常方便的通过SD插槽连接串口。手里有GDK8的小伙伴可以亲自体验一下!对于没有GDK8的朋友,有一种特殊的方式可以得到GDK8 + 挥码枪伴侣,那就是参加格蠹的调试研习班,人手一套。研习班的上海站正在招生之中。

(写文章很辛苦,恳请各位读者点击“在看”,也欢迎转发)

*************************************************

正心诚意,格物致知,以人文情怀审视软件,以软件技术改变人生

扫描下方二维码或者在微信中搜索“盛格塾”小程序,可以文章和有声读物

3483d20aebbf6fde15a637f8fa7eab40.png

也欢迎关注格友公众号

cdba780ea38e9f49b694d03c48a8d3be.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/12467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【现代C++】概念的使用

现代C(特别是C20及以后的版本)引入了概念(Concepts),这是一种指定模板参数必须满足的约束的方式。概念使得模板代码更清晰,更容易理解和使用,并且能在编译时提供更好的错误信息。以下是C概念的关…

UStaticMesh几何数据相关(UE5.2)

UStaticMesh相关类图 UStaticMesh的数据构成 UStaticMesh的FStaticMeshSourceModel UStaticMesh的Mesh几何元数据来自于FStaticMeshSourceModel, 一级Lod就存在一个FStaticMeshSourceModel. FStaticMeshSourceModel几何数据大致包含以下几类: Vertex(点), VertexI…

玩转Matlab-Simscape(初级)- 06 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真(理论部分2)

** 玩转Matlab-Simscape(初级)- 06 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真(理论部分2) ** 目录 玩转Matlab-Simscape(初级)- 06 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真&am…

风电功率预测 | 基于GRU门控循环单元的风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测 | 基于GRU门控循环单元的风电功率预测(附matlab完整源码)完整代码风电功率预测 | 基于GRU门控循环单元的风电功率预测(附matlab完整源码) 完整代码 clc; clear close allX = xlsread(风电场预测.xlsx)

python数据分析——seaborn绘图2

参考资料:活用pandas库 # 导入库 import pandas as pd import matplotlib.pyplot as plt import seaborn as sns tipspd.read_csv(r"...\seaborn常用数据案例\tips.csv") print(tips.head()) 1、成对关系表示 当数据大部分是数据时,可以使用…

分享一个基于Qt的Ymodem的上位机(GitHub开源)

文章目录 1.项目地址2.Ymodem 协议介绍3.文件传输过程4.使用5.SecureCRT 软件也支持Ymodem6.基于PyQt5的Ymodem界面实现案例 1.项目地址 https://github.com/XinLiGH/SerialPortYmodem 基于VS2019 Qt5.15.2 编译,Linux下编译也可以,这里不做说明。 2.…

Python | Leetcode Python题解之第89题格雷编码

题目&#xff1a; 题解&#xff1a; class Solution:def grayCode(self, n: int) -> List[int]:ans [0] * (1 << n)for i in range(1 << n):ans[i] (i >> 1) ^ ireturn ans

如何在云电脑实现虚拟应用—数据分层(应用分层)技术简介

如何在云电脑实现虚拟应用—数据分层&#xff08;应用分层&#xff09;技术简介 近几年虚拟化市场实现了非常大的发展&#xff0c;桌面虚拟化在企业中应用越来越广泛&#xff0c;其拥有的如下优点得到大量企业的青睐&#xff1a; 数据安全不落地。在虚拟化环境下面数据保存在…

STL库简介

一、STL库的概念 STL&#xff1a;是C标准库的重要追组成部分&#xff0c;不仅是一个可以复用的组件库&#xff0c;而且还是一个包含了数据结构和算法的软件框架。 二、STL的版本 原始版本 Alexander Stepanov、 Meng Lee 在惠普实验室完成的原始版本&#xff0c; 是一个开源…

JVM 双亲委派机制详解

文章目录 1. 双亲委派机制2. 证明3. 优势与劣势 1. 双亲委派机制 类加载器用来把类加载到 Java 虚拟机中。从JDK1.2版本开始&#xff0c;类的加载过程采用双亲委派机制&#xff0c;这种机制能更好地保证 Java 平台的安全。 1.定义 如果一个类加载器在接到加载类的请求时&…

(done) NLP+HMM 协作,还有维特比算法

参考视频&#xff1a;https://www.bilibili.com/video/BV1aP4y147gA/?p2&spm_id_frompageDriver&vd_source7a1a0bc74158c6993c7355c5490fc600 &#xff08;这实际上是 “序列标注任务”&#xff09; HMM 的训练和预测如下图 训练过程&#xff1a;我们首先先给出一个语…

web学习记录--(5.14)

1.Sublime安装与汉化 直接点击windows即可下载&#xff0c;安装即可 Thank You - Sublime Text 汉化 Install Package ChineseLocalzation 2.PHPstorm下载以及激活,汉化 直接下载&#xff0c;然后找激活码激活即可 汉化 plugins&#xff08;插件&#xff09;/chinese&…

SpringBoot接收参数的19种方式

https://juejin.cn/post/7343243744479625267?share_token6D3AD82C-0404-47A7-949C-CA71F9BC9583

未授权访问:ZooKeeper 未授权访问漏洞

目录 1、漏洞原理 2、环境搭建 3、未授权访问 防御手段 今天继续学习各种未授权访问的知识和相关的实操实验&#xff0c;一共有好多篇&#xff0c;内容主要是参考先知社区的一位大佬的关于未授权访问的好文章&#xff0c;还有其他大佬总结好的文章&#xff1a; 这里附上大…

2025年第十一届北京国际印刷技术展览会

2025年第十一届北京国际印刷技术展览会 展览时间&#xff1a;2025年5月15-19日 展览地点&#xff1a;北京中国国际展览中心&#xff08;顺义馆&#xff09; 主办单位&#xff1a;中国印刷及设备器材工业协会中国国际展览中心集团有限公司 承办单位&#xff1a;北京中印协华港国…

海思Hi3065H 200MHz 高性能 RISCV32 A² MCU

这是一款海思自研的RISCV32内核的高性能实时控制专用MCU&#xff0c; 具有高性能、高集成度、高可靠性、易开发的特点&#xff0c;同时还有嵌入式AI能力。 CPU • RISC-V200MHzFPU 存储 • Up to 152KB Code Flash • 8KB Data Flash • 16KB SRAM 个人认为这是MCU梯队非常…

【PB案例学习笔记】-02 目录浏览器

写在前面 这是PB案例学习笔记系列文章的第二篇&#xff0c;该系列文章适合具有一定PB基础的读者&#xff0c; 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上…

基于Django实现的(bert)深度学习文本相似度检测系统设计

基于Django实现的&#xff08;bert&#xff09;深度学习文本相似度检测系统设计 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat、Maven 系统功能实现 登录页面 注册页面&#xff1a;用户账号&#xff0c;密码…

05-14 周二 PyTorch动态量化和静态量化理解

05-14 周二 PyTorch动态量化和静态量化理解 时间版本修改人描述2024年5月14日10:44:30V0.1宋全恒新建文档2024年5月14日16:28:16V1.0宋全恒填充了PyTorch对于两种量化方式的内容 简介 Pytorch动态量化 设计神经网络时&#xff0c;可以进行许多权衡。在模型开发和训练期间&…

Dilworth定理:最少的下降序列个数就等于整个序列最长上升子序列的长度

概念如下&#xff1a; 狄尔沃斯定理_百度百科 (baidu.com) 本质就是找要求序列中最长的单调的子序列&#xff08;不一定连续&#xff09;的长度。 模板如下&#xff1a; 时间复杂度为O&#xff08;N^2&#xff09; #include<iostream>using namespace std;int dp[100…