新串口通道打通纪实

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

正因为有这样的需求,幽兰代码本是支持串口的,而且有两种方式。第一种是主板上接头,需要打开后盖。第二种方式是通过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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

Python项目——基于回合制的RPG游戏设计与实现

基于回合制的RPG游戏设计与实现 项目概述 《魔法冒险》是一款基于回合制战斗的角色扮演游戏。玩家将创建一个角色,探索世界,战斗敌人,收集物品并提升等级。 项目设计报告 一、引言 本项目的目标是实现一个基于回合制战斗的 RPG 游戏&…

6---Linux下版本控制器Git的知识点

一、Linux之父与Git的故事: Linux之父叫做“Linus Torvalds”,我们简称为雷纳斯。Linux是开源项目,所以在Linux的早期开发中,许多世界各地的能力各异的程序员都参与到Linux的项目开发中。那时,雷纳斯每天都会收到许许…

1-4 GPIO输入模式(ARM-GD32)

输入结构 浮空输入模式: 上拉输入: 上面的电路浮空输入的状态是不确定的故需要通过设置上拉电阻的方式将电平设置为高电平,也就是确定的状态,此时下拉电阻处于关闭的状态,当按键没有按下的时候,处于浮空的状…

the7主题下载,探索WordPress主题的无限可能

在数字时代,一个出色的网站是任何企业或个人品牌的必备。但在这个竞争激烈的网络世界中,如何让您的网站脱颖而出?答案就是 the7 —— 一款专为创造独特和视觉冲击力强的网站而设计的 WordPress 主题。 1. 无限设计可能性 the7 以其独特的设…

Mini Cheetah 代码分析(八)基于零空间的任务分级

一、主要公式 二、源代码注释 三、相关原理解释 一、主要公式 二、源代码注释 该功能的实现在文件KinWBC.cpp中的FindConfiguration函数,主要看注释,与公式是能够对应起来的,由第0个任务,也就是接触任务开始进行迭代&#xff0…

【MATLAB】Enigma机加密原理与自实现

文章目录 什么是EnigmaEnigma机加密通信流程Enigma的物理构造Enigma的加密设置Enigma加密通信密码重新设置Enigma加密消息拼接注意 Enigma的解密分解设置Enigma解密通信密码重新设置Enigma解密消息 Enigma的弱点MATLAB自实现Enigma加密与解密Enigma_functionRotate_functiontes…

Scrapy爬虫:利用代理服务器爬取热门网站数据

在当今数字化时代,互联网上充斥着大量宝贵的数据资源,而爬虫技术作为一种高效获取网络数据的方式,受到了广泛的关注和应用。本文将介绍如何使用Scrapy爬虫框架,结合代理服务器,实现对热门网站数据的高效爬取&#xff0…

金价又双叒涨了!现货黄金什么比较好

虽然近期有新闻显示,国内的实物黄金价格出现大幅的下跌,但是从整体看,多个黄金投资品种的长期上升趋势还是比较稳定的,因此我们会看到,很多投资者会趁现在这波下跌重新入场做多。那么投资黄金买什么比较好呢&#xff1…

2024年5月18日(星期六)骑行香杆箐

2024年5月18日 (星期六)骑行香杆箐,早8:30到9:00,郊野公园西门集合,9:30准时出发【因迟到者,骑行速度快者,可自行追赶偶遇。】 偶遇地点:郊野公园西门集合 ,家住东,西,南…

dvwa靶场 JavaScript Attacks(js攻击)全难度教程(附代码分析)

JS简介 一种解释型语言&#xff08;代码不需要编译&#xff09;&#xff0c;一般镶嵌在html或者php中实现。 JavaScript Attacks&#xff08;Security Level: low&#xff09; 代码分析 <?php $page[ body ] . <<<EOF <script>/* MD5 code from here h…

参赛指南第二弹!9省齐发 详解赛事参与全攻略

一. 大赛介绍 中国机器人及人工智能大赛是由中国人工智能学会、教育部高等学校计算机课程教学指导委员会联合主办。旨在引导和激励广大青年学生弘扬创新精神&#xff0c;搭建良好的科技创新赛事平台&#xff0c;积极推动广大学生参与机器人、人工智能科技创新实践、提高团队协…

动规解决01背包/完全背包精讲

还不会用动态规划解决01背包/完全背包&#xff1f;看这一篇文章就够了&#xff01; 首先我们要明白什么是01背包和完全背包。 背包问题总体问法就是&#xff1a; 你有一个背包&#xff0c;最多能容纳的体积是V。 现在有n个物品&#xff0c;第i个物品的体积为vi​ ,价值为wi​…

Linux|如何允许 awk 使用 Shell 变量

引言 当我们编写 shell 脚本时&#xff0c;我们通常会在脚本中包含其他较小的程序或命令&#xff0c;例如 awk 操作。就 Awk 而言&#xff0c;我们必须找到将一些值从 shell 传递到 Awk 操作的方法。 这可以通过在 Awk 命令中使用 shell 变量来完成&#xff0c;在本文中&#x…

做全域运营赛道,如何避免被割韭菜?

当下&#xff0c;全域运营赛道逐渐成型&#xff0c;许多创业者虽然都有了做全域运营服务商的想法&#xff0c;但却因全域运营是割韭菜等流言而心存疑虑&#xff0c;担心自己上当受骗&#xff0c;赔得血本无归。 事实上&#xff0c;关于全域运营是不是割韭菜这个问题&#xff0c…

Electron自动化测试技术选型调研

Electron简介 Electron是一个开源的框架&#xff0c;用于构建跨平台的桌面应用程序。它由GitHub开发并于2013年首次发布。Electron允许开发人员使用Web技术&#xff08;如HTML、CSS和JavaScript&#xff09;来构建桌面应用程序&#xff0c;同时可以在Windows、macOS和Linux等操…

量子计算机接入欧洲最快超算!芬兰加快混合架构算法开发

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨沛贤 深度好文&#xff1a;1900字丨7分钟阅读 摘要&#xff1a;芬兰技术研究中心&#xff08;VTT&#xff09;与 CSC 展开合作&#xff0c;基于量子计算机超算架构进行算法开…

Java为什么会成为现在主流的编程语言

Java为什么会成为现在的主流语言 前言一、Java语言概述Java是什么为什么大多数人会选择从事Java为什么从事Java的工作者数量从年递减 二、Java语言的特点简单性面向对象分布式&#xff08;微服务&#xff09;健壮性安全性体系结构中立可移植性解释型高性能多线程动态性 三、Jav…

Linux连接文件那点事

什么是连接文件 将一个文件和另一个文件建立联系&#xff0c;分为硬链接和软连接&#xff08;符号连接&#xff09;。 硬链接 Linux中&#xff0c;所有的文件都有一个inode&#xff0c;这个东西就是文件的ID号&#xff0c;硬链接的方式就是通过这个inode来产生新的文件名来建…