一、測試環境
近期在回復客戶疑問時,遇到在 ap1 側基於 sysfs 接口訪問 GPIO,log 提示 value 為 1,而實際引腳電平不能拉高的問題。使用G9H參考板復現問題並調整配置後,使得電平變化符合預期。
下面結合文檔《SemiDrive_9 系列_IO&PinCtrl_使用手冊》進行說明。
硬體:SemiDrive G9H ref A02 圖一
軟體:G9 PTG 5.0
軟體環境搭建以及 G9H Ref A02 操作方法參考:《SD_G9_Quick_Start_Rev2.4.pdf》
圖一 G9H 參考板
二、處理過程
1. 問題描述:
客戶用 SDconfigTool 更改了管腳的配置,重新生成新的配置工程,後/target/refence_g9q/port_cfg.h、/projects/default/system_config.bin、/projects/default/g9q_default.zprj 這 3 個文件考到 Buildsystem 工程里。然後編譯新的工程,給 gpio119 echo 成 out、1 後,value 是 1 了,但是電平信號沒有拉高。
提示客戶在safety側使用 get_pin_info 檢查引腳配置。如圖:
圖二 檢查引腳配置
這裡不難發現 GPIO controller: GPIO5,而 linux 使用的控制器為 controller: GPIO4,需要使用 SDconfigTool 修正 controller 到對應配置。然後在 linux 內基於 sysfs 接口訪問GPIO,通過設備文件使操作特定引腳的電平。
2. 操作過程
2.1 GPIO 以及 Domain 資源說明
典型的 包括 ap1、ap2、safety、secure 以及 mp 等。controller 和 core 的對應關係如下:
- GPIO_SAFETY = PIN_CONTROLLER1
- GPIO_SECURE = PIN_CONTROLLER2
- GPIO_MP = PIN_CONTROLLER3
- GPIO_AP1 = PIN_CONTROLLER4
- GPIO_AP2 = PIN_CONTROLLER5
2.2 配置啟動流程
safety domain 在系統啟動過程會讀取 system_config.bin 的配置信息並將其寫入到寄存器中 生效。當 Linux 內核運行起來後之前的配置信息已經生效,所以內核初始化過程中主要就是解析 DTS 中設置的 GPIO 信息並進行初始化設置,之後根據各個進程需求在驅動中得到調用。
2.3 SDconfigTool 配置
第一部分是 PinCtrl,其中關注點:功能復用為 GPIO 功能;
第二部分是 General PAD Config,其中主要關注點: 參照 2.1 配置,GPIO Controller:GPIO 控制器選擇 4,
圖三 SDconfigTool
2.3 DTS相關說明
.dtsi 配置:初始化各項信息,處於 disabled 狀態,如圖:
圖四 默認dtsi配置
gpio4 下面有五個 port,每個 port 有 32 個 gpio,即 Linux GPIO 號為 0-159 依次對應從 4a 到 4e 五個組。
2.4 相關信息入口
內核啟動過程中,針對 GPIO 部分在 sysfs 和 debugfs 下設置了相關的信息節點,通過這些節點可以驗證 和了解當前平台中關於 GPIO 部分的內容。
2.4.1 基於 sysfs 接口訪問 GPIO,屬性說明:
- 針對 GPIO 類,可以看到有五個 gpiochip,即五個組,名字是 gpiochip%d , %d 用的是對應組的 起始 gpio 編號。
- 一個 export 和一個 unexport 節點,此處用於導出和取消導出對應的 GPIO。
圖五 sysfs 接口
圖六 調試命令一
2.4.2 debugfs下 GPIO 節點
debugfs下相關的節點則可以看到關於 GPIO 總體的信息。
一共有五個 gpiochip,每個占用 32 個 GPIO,號碼從 0 到 159。 各個組中已經申請了的 GPIO 信息,包括 GPIO 號、名字、輸入輸出以及高低、是否用作了中斷 等。
圖七 調試命令二
2.5 測試對照
以上兩種調試都配合萬用表進行了引腳測量(如圖),結果顯示符合預期。
圖八 引腳原理圖
三、參考文獻
- 《SemiDrive_9 系列_IO&PinCtrl_使用手冊》
- 《SemiDrive_Linux_BSP_User_Manual_Rev1.1》
如有更多需求,歡迎聯繫大聯大世平集團 ATU 部門:atu.sh@wpi-group.com 作者:老哥三五瓶
更多資訊,請掃碼關注我們!
評論