1. 程式人生 > >[Linux驅動煉成記] 09-串列埠除錯

[Linux驅動煉成記] 09-串列埠除錯

實現功能

主控(Amlogic A113X)串列埠和MCU(STM32) 進行串列埠通訊,實現資料的傳輸,由STM32控制燈效.看似簡單的一個雙方對接功能,還是走了不少彎路的.

串列埠DTS配置
	//Amlogic A113X引腳編號
   GPIOZ_8  -> I2C_SCK_B/UART_TX_AO_B
   GPIOZ_9  -> I2C_SDA_B/UART_RX_AO_B
   根據引腳功能中UART_RX_AO_B和dts中的serial2 = &uart_AO_B對應
   
	aliases {
		serial0 = &uart_AO;
		serial1 = &uart_A;
		serial2 = &uart_AO_B;
		serial3 = &uart_B;
	};

	uart_AO_B: 
[email protected]
{ compatible = "amlogic, meson-uart"; reg = <0x0 0x4000 0x0 0x18>; interrupts = <0 197 1>; status = "okay"; clocks = <&xtal>; clock-names = "clk_uart"; fifosize = < 64 >; pinctrl-names = "default"; pinctrl-0 = <&ao_b_uart_pins>; }; //串列埠正常載入之後,會顯示 ls /dev/ttyS0 ttyS0 ttyS1 ttyS2 ttyS3
MCU進行通訊
  1. 首先呼叫A方提供的動態庫, 通過 file *so 發現是MIPS格式,而A113X需要的是
file xxx.so 
xxx.so: ELF 32-bit LSB shared object, ARM, EABI5 version 1 (SYSV), dynamically linked, BuildID[sha1]=2a8193fca2caa7fcb9f62120f8bd34152a38ee9b, not stripped
  1. 寫了一個小的測試程式,驗證的動態庫,如下 :
arm-linux-xxx/g++ -W -Wall -O2 -g -std=c++11 -Wl,-rpat=.-o xxx xxx.cpp -L . -lxxxx -lpthread 

A方提供的MCU程式使用C++ 11實現,這點還是值得學習的
  1. 除錯 發現LED沒有反應,這個時候只能單獨測試, 通過PC的串列埠驗證,也不行,只能排查硬體.

意外發現MCU和主控的 RX / TX接反了, 修改後正常.

經驗說明專案的手板什麼低階的硬體錯誤都可以犯, 還是要靜下心來分析問題,解決問題 這次的坑:

  1. 功放IIC通訊不成功, 功放IIC SDA SCL 短路導致
  2. 串列埠和外設通訊不成功, RX/TX接反