Share on:

1 分鐘閱讀

前言

本篇內容將base on RPi CM4來帶各位一步一步瞭解硬體驗證的流程與步驟,主要針對UART的啟用。

前提準備

在啟用USB 3.0之前我們要先把RPi架設好環境,請參考這篇文章->Base on RPi CM4 開發板 硬體驗證流程 教學 步驟 硬體驗證工程師 BSP工程師<-

RS232/RS485打通的方法

為了確認RS232設備是否有抓到,一開始我們可以先下這個指令看

$ ls -l /dev/ttyA*
crw-rw---- 1 root dialout 204, 64 Jun 16 11:30 /dev/ttyAMA0

看看有幾個ttyACMX,開通了幾個UART,這邊我只有看到一個UART,而從電路圖上看我公司板子還有額外使用UART2, UART3, UART4,我們知道晶片的GPIO會有Alternative function pin,也就是說一個pin腳,他可以設定成不同的作用或功能,我們看下圖CM4 Datasheet CM4_Alternative_function_assignments

從上圖中我們可以得知GPIO0可以設定成SDA0, SA5, PCLK, SPI3_CE0_N, TXD2, SDA6,不同的通訊協定,看當初產品設計有哪些周邊功能,來規劃每一個GPIO最為哪一個通訊協定,那我們只要看電路圖就可以得知那些腳為用到了哪些功能。

既然我們知道pin腳位功能可以設定,那接下來要講怎麼設定,一般來說要去改device tree的硬體描述設定,但RPi有另位做了overlap的機制,讓我們開發者只要修改config.txt檔,加上簡短幾個描述,就會把他原本又已經編譯好的device tree blob(dtb),overlap進去原本的dtb。

那我們看一下raspberry overlap的README從這裡我們可以知道要怎麼在/boot/config.txt裡面做設定,而這裡可以快速知道有哪些已經做好的dtb可以直接使用像是底下這圖。

CM4_UART_DTB

也可以使用底下指令來快速查有哪些UART的設定

$ dtoverlay -a | grep uart
  midi-uart0
  midi-uart1
  midi-uart2
  midi-uart3
  midi-uart4
  midi-uart5
  miniuart-bt
  qca7000-uart0
  uart0
  uart1
  uart2
  uart3
  uart4
  uart5

ref: 树莓派 4 UART 多串口配置通信

UART他已經做好dtb,所以我們可以使用底下指令來確認UART的參數設定或是看上面的README

$ sudo dtoverlay -h uart2
Name:   uart2

Info:   Enable uart 2 on GPIOs 0-3. BCM2711 only.

Usage:  dtoverlay=uart2,<param>

Params: ctsrts                  Enable CTS/RTS on GPIOs 2-3 (default off)

從剛剛上面的Alternative function pin中的TXD2, RXD2, CTS2即是代表UART2的腳位,而參數Params: ctsrts就是用來設定你的UART是只有TX/RX還是RS232有CTS腳位。

知道語法後我們依照公司的電路圖在config.txt加入底下語法來開啟相對應的UART Port。

# Enable UART Port
dtoverlay=uart2,ctsrts
dtoverlay=uart3,ctsrts
dtoverlay=uart4

設定完成後重新開機

我們在下達底下指令觀看結果

$ ls -l /dev/ttyA*
crw-rw---- 1 root dialout 204, 64 Jun 16 11:30 /dev/ttyAMA0
crw-rw---- 1 root dialout 204, 65 Jun 16 11:17 /dev/ttyAMA1
crw-rw---- 1 root dialout 204, 66 Jun 16 11:17 /dev/ttyAMA2
crw-rw---- 1 root dialout 204, 67 Jun 16 11:17 /dev/ttyAMA3

!!補充 雖然UART打開了,但我卻發現dmesg出現了錯誤訊息,我們底下再來看看

[   19.566331] pinctrl-bcm2835 fe200000.gpio: pin gpio9 already requested by fe201800.serial; cannot claim for fe204000.spi
[   19.566369] bcm2835_vc_sm_cma_probe: Videocore shared memory driver
[   19.566370] pinctrl-bcm2835 fe200000.gpio: pin-9 (fe204000.spi) status -22
[   19.566388] pinctrl-bcm2835 fe200000.gpio: could not request pin 9 (gpio9) from group gpio9  on device pinctrl-bcm2711
[   19.566397] [vc_sm_connected_init]: start
[   19.566407] spi-bcm2835 fe204000.spi: Error applying setting, reverse things back

從錯誤訊息來看猜測是SPI與UART發生衝突(GPIO9),這時候我就去查config.txt檔,沒有用到SPI的參數,所以Google搜尋相關問題查到 Setting alternate function for GPIO pins裡面說換另一個GPIO功能需要把driver modulr給關閉,如下指令

# cat blacklist spi-bcm2708 > /etc/modprobe.d/raspi-blacklist.conf

再重新開機問題就解決了,目前初步猜測是driver有用到SPI,詳細root cause需要花時間再下去看。

結語

硬體驗證就是這麼簡單有趣~

留言