論壇總覽 BeagleV-beta RISC-V 開源單板電腦 OpenSBI UART與串列埠通訊

標籤: , ,

正在檢視 1 篇文章 - 1 至 1 (共計 1 篇)
  • 作者
    文章
  • #675
    johnson
    管理員
    @johnson

    壹、UART歷史與簡介

    在嵌入式系統的開發中,設計好IC的第一步是使用JTAG來掃描/分析輸出的訊號是否如同設計,由於在第一階段,晶片內部還是最底層的狀態,因此還不能使用更進階的通訊協議。

    當第一階段測試通過後,下一階段就是啟用通用非同步收發器,又稱作(Universal Asynchronous Receiver/Transmitter UART),他是電腦硬體的一部分,將數據透過串列通訊和平行通訊間作傳輸轉換。UART通常用在與其他通訊接口(如EIA RS-232)的連接上。

    而在OpenSBI中,UART之所以這麼重要,是因為在韌體尚未開開發的階段前,我們需要有速度夠快,同時能夠雙向傳輸資料的通訊界面。JTAG雖然功能強大,但因為它的原理所有周邊界面都掃描過一次才能傳輸,所以速度很慢,我們確認晶片設計無誤後就不需要依序掃描個個腳位的訊號與狀況,我們需要更專注於核心與驅動程式的開發,因此採用UART作為傳輸介面。

    雖然USB以及Ethernet是非常實用且速度快的介面,但是傳輸速度越快,硬體線路的要求也會更高,且現在USB與Ethernet都動輒數百Mbps的傳輸速率,這兩種介面都需要額外的控制器以及周邊電路,甚至是驅動程式才能夠啟用,因此使用傳統晶片的周邊介面會比較容易實現且符合經濟效益。

    至於為何不使用SPI或者I2C呢?  因為UART是一種不需要額外時脈訊號,總共只需要四條線(含電源與地)的介面,雖然它在設定初期需要知道兩者之間的鮑率才能進行溝通,但是UART可以直接將資料放入接收端的暫存器中,只需要透過簡單的位移就可以達成傳輸的效果。

     

    UART8250是一顆由National Semiconductor開發的串列埠通訊IC,在個人電腦發展初期,由於USB協議尚未成熟,所以舉凡印表機、傳真機、網路數據機都是透過此介面傳輸資料,這棵IC在資料通訊與處理上扮演舉足輕重的地位,在Intel公司發展8086時,晶圓製造技術尚未把UART矽核心與CPU包再一起,因此在電路板上是分開兩個IC的,所以早期的使用方法,是將UART介面電路(即NS16550或UART8650)的8隻資料腳位與8086或其他邏輯單元連接再一起,板子的輸出端則是連接到UART介面的TXD與RXD。

    以下舉一個實例,這是一個8086教學板的電路圖,原始網址在這裡

    第一張圖左下角是主CPU 8086,可以看到右方的資料匯流排,從AD0到AD15。

    第二張圖是使用UART8250(NS16550的後繼晶片)將UART資料轉換成並列的8位元資料的電路。

    上述電路就是傳統UART介面進行轉換的過程。

    今日半導體製程越來越進步,UART的矽智財已經嵌入到各種微處理器中,如Arduino使用的Atmega328P,ST的STM32等等都只要佔兩個腳位就可以使用UART與其他裝置通訊,不需要再額外將件列訊號轉換成並列訊號。

     

    貳、UART於BeagleV的使用方法

    在BeagleV中,我們使用由starfive生產的vic7100作為主要處理器,在其資料手冊第35頁(文章附件)的IC方塊圖中可以看到,左下角繪出這顆晶片有4組UART介面可供使用。

    參、OpenSBI中的UART驅動程式碼

    BeagleV的UART界面程式碼放置在opensbi/lib/utils/serial下方,這個資料夾放置有關於串列界面的驅動程式,包含以下檔案:

    lib/utils/serial/
    ├── fdt_serial.c
    ├── fdt_serial_htif.c
    ├── fdt_serial_shakti.c
    ├── fdt_serial_sifive.c
    ├── fdt_serial_uart8250.c
    ├── objects.mk
    ├── shakti-uart.c
    ├── sifive-uart.c
    └── uart8250.c
    

    這裡可以看到也些檔案有fdt_的前綴,代表是有關於平坦裝置樹(flat device tree)的相關檔案。
    關於Flat Device Tree的說明可以參考這篇文章

    本資料夾中各個檔案的說明:

    1. fdt_serial.c: 是最主要的串列埠驅動程式碼,定義接下來會用到的客製驅動程式資料結構之外,執行初始化串列埠的功能。

     

    2. fdt_serial_htif.c : HTIF是 Host/Target Interface的簡稱,是一個連接前端與後端的伺服器,因為它並不是標準工具,因此在RISC-V架構的演進之下,已經逐漸被淘汰。

     

     

    3. fdt_serial_shakti.c : 這是一個開發給shakti晶片的小串列埠程式,用於該公司產品。

    4. fdt_serial_sifive.c : 這是一個開發給sifive晶片的串列程式,用於該公司產品。

    5. fdt_serial_uart8250.c : BeagleV使用的晶片核心VIC7100 SoC  就是使用經典的UART8250 IP core,這個程式,裏頭定義fdt_serial_uart8250的物件,並與ns16550通用,ns16550是UART傳輸協議的始祖,可以參考wiki說明

    6. objects.mk : 此檔案與OpenSBI 程式碼概述 提到的.mk檔案相同,裏頭包含參數的定義,這裡是將這個資料夾原始檔編譯後產生的.o檔案路徑加入到opensbi的Makefile中。

    7. shakti-uart.c :這是一個開發給shakti晶片的小串列埠程式,用於該公司產品。

    8. uart8250.c :

    這是一個寫給所有相容於業界UART8250標準的驅動程式。

    UART8250是一個歷史悠久的通訊轉換IC,其最初發表於1981年,由IBM公司發表,但架構是由National Instrument所提出,至今是一個UART通訊標準的代稱。其40Pin的設計以及廣泛運用場合日它成為至今被複製最多的IC之一。UART8250的後繼晶片是NS16550,在電腦科學以及嵌入式系統專佔有非常重要的地位。

    肆、結論

    在BeagleV beta中,使用VIC7100SoC,其中串列埠通訊的部分由UART作為主要介面,不管是初始的Bootloader燒錄、後期OpenSBI更新等等。UART由於歷史悠久,可靠性佳,且原理簡單,實現容易,可以在系統底層透過位移暫存器的方式達成資料傳輸。除了支援目前最快的115200鮑率之外,VIC7100具備4組UART周邊電路,讓使用者可以同時使用多個支援UART介面之裝置。

     

    附加檔案:
    你必須 登入 才能查看附件檔案。
正在檢視 1 篇文章 - 1 至 1 (共計 1 篇)
  • 需要以回覆此篇主題...