新串口通道打通紀實

在計算機系統中,串口是“古老”的通信方式,和它同時代的“并口”通信方式已經消失了。但它仍然頑強的存活著,主要原因是在開發和調試底層軟件時還經常用到串口。

正因為有這樣的需求,幽蘭代碼本是支持串口的,而且有兩種方式。第一種是主板上接頭,需要打開后蓋。第二種方式是通過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.pswp.cn/web/12467.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12467.shtml
英文地址,請注明出處:http://en.pswp.cn/web/12467.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue中父子組件如何相互調用方法

Vue 中父子組件如何相互調用方法 在 Vue 中,父子組件可以通過以下方法相互調用方法: 父組件調用子組件方法 通過 props: 父組件向子組件傳遞一個 prop,該 prop 是一個函數,子組件可以調用它來觸發父組件的方法。通過 refs: 父組…

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

現代C(特別是C20及以后的版本)引入了概念(Concepts),這是一種指定模板參數必須滿足的約束的方式。概念使得模板代碼更清晰,更容易理解和使用,并且能在編譯時提供更好的錯誤信息。以下是C概念的關…

UStaticMesh幾何數據相關(UE5.2)

UStaticMesh相關類圖 UStaticMesh的數據構成 UStaticMesh的FStaticMeshSourceModel UStaticMesh的Mesh幾何元數據來自于FStaticMeshSourceModel, 一級Lod就存在一個FStaticMeshSourceModel. FStaticMeshSourceModel幾何數據大致包含以下幾類: Vertex(點), VertexI…

【scikit-learn005】支持向量機(Support Vector Machines, SVM)ML模型實戰及經驗總結(更新中)

1.一直以來想寫下基于scikit-learn訓練AI算法的系列文章,作為較火的機器學習框架,也是日常項目開發中常用的一款工具,最近剛好擠時間梳理、總結下這塊兒的知識體系。 2.熟悉、梳理、總結下scikit-learn框架支持向量機(Support Vec…

Maven(項目管理和LINUX)

目錄 一、整合IDEA 二、POM模型 三、依賴和繼承關系 依賴(Dependency) 依賴的基本結構 依賴傳遞性 依賴管理 繼承(Inheritance) 繼承的基本結構 繼承的特性 四、插件的使用 五、私服的使用 一、整合IDEA 在Maven項目…

基于springboot的醫院管理系統源碼數據庫

基于springboot的醫院管理系統源碼數據庫 隨著信息互聯網信息的飛速發展,醫院也在創建著屬于自己的管理系統。本文介紹了醫院管理系統的開發全過程。通過分析企業對于醫院管理系統的需求,創建了一個計算機管理醫院管理系統的方案。文章介紹了醫院管理系…

玩轉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.定義 如果一個類加載器在接到加載類的請求時&…

react組件渲染性能優化之函數組件-useCallback使用

useCallback主要就是對函數進行緩存,useCallBack這個Hooks主要是解決React.memo不能緩存事件的問題 useCallBack(fn, dependencies) &#xff1a;fn想要緩存的函數&#xff0c;dependencies有關是否更新 fn 的所有響應式值的一個列表 比如&#xff1a;UseCallBackOptimize組件…

(done) NLP+HMM 協作,還有維特比算法

參考視頻&#xff1a;https://www.bilibili.com/video/BV1aP4y147gA/?p2&spm_id_frompageDriver&vd_source7a1a0bc74158c6993c7355c5490fc600 &#xff08;這實際上是 “序列標注任務”&#xff09; HMM 的訓練和預測如下圖 訓練過程&#xff1a;我們首先先給出一個語…

做一個桌面懸浮翻頁時鐘

毛玻璃效果翻頁桌面懸浮時鐘&#xff0c;TopMost&#xff08;Topmost“True”&#xff09;&#xff0c;不在任務欄顯示&#xff08;ShowInTaskbar“False”&#xff09;&#xff0c;在托盤區顯示圖標&#xff0c;雙擊托盤區圖標實現最小化和還原&#xff0c;右鍵托盤圖標可選“…

常見網絡攻擊及解決方案

網絡安全是開發中常常會遇到的情況&#xff0c;為什么會遇到網絡攻擊&#xff0c;網絡攻擊是如何進行的&#xff0c;如何抵御網絡攻擊&#xff0c;都是我們需要思考的問題。 為什么會遇到網絡攻擊&#xff1f; 以下是一些主要的因素&#xff1a; 技術漏洞&#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