uboot 2020版本下gpio命令的使用 + linux下的libgpiod lib庫的移植使用
第一大部分 uboot下的gpio
1.在uboot命令行中想要支持gpio的命令,需要打開如下宏
CONFIG_CMD_GPIO=y
2.選用gpio引腳,作為測試引腳
2.1 查看電路原理圖,選用那種soc不和mcu連接的pin,這樣可以避免mcu的干擾。
2.2 查看pinmux的配置文件pinmux.h,選用目前已經(jīng)被復(fù)用為gpio的pin管腳。
0x049BC418, 0x00060094, /* PadName = I2C9_SDA Fuction = GPIO0_A29 */ 0x049BC80C, 0x00060094, /* PadName = SDIO_DAT3 Fuction = GPIO0_A14 */ 0x049BC818, 0x00060094, /* PadName = SDIO_DAT2 Fuction = GPIO0_A13 */
目前ball name SDIO_DAT2,SDIO_DAT3,I2C9_SDA已經(jīng)被pinmux成gpio管腳,也就是說 這幾個ball管腳已經(jīng)被內(nèi)部連接到gpio controller模塊。
我們就以這三個管腳為例,進行實驗。
3.在uboot command中設(shè)置管腳輸出高/低,并用邏輯分析儀進行查看
在本soc中g(shù)pio分為0、1、2三組,每組有32個gpio,做如下約定N為gpio的編號,p為組號取值范圍為0、1、2,可以得到 N=p*32+offset。以GPIO0_29為例計算gpio的編號,可以知道
p=0, offset為29,N=0*32+29=29.


4.根據(jù)uboot command gpio命令,我們可以追蹤到源碼,發(fā)現(xiàn)其核心的實現(xiàn)是基于如下幾個函數(shù)
gpio_request
gpio_direction_output
gpio_get_value
附錄1:即使是配置成輸出模式,也是可以通過gpio_get_value獲取現(xiàn)在的值是多少。
我曾經(jīng)做過如下實驗,
將某個gpio設(shè)置成輸出,并設(shè)置成輸出邏輯1,由于我在外圍電路上強制將其硬線連接到GND地,所以uboot gpio command會告訴我設(shè)置失敗。
設(shè)置輸出為0或者1的邏輯是 先設(shè)置并獲取其值,如果不一致,就通過打印 報 錯誤信息。
附錄2:通過研究步驟4中函數(shù)的代碼實現(xiàn),最終就是 設(shè)置gpio controller對應(yīng)的寄存器。
所以 我們應(yīng)該是也可以通過uboot中md和mw命令來讀寫寄存器直接進行設(shè)定。由于時間關(guān)系,目前尚未驗證。
第二大部分 linux下的libgpiod
1.移植的版本
https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/snapshot/libgpiod-v1.6.x.tar.gz
2.編譯方法
./autogen.sh --enable-tools=yes --host=arm-linux-gnueabihf --prefix=/home/zhongshan/zhongshan_test/libgpiod_install_path
3.查看編譯出來的工具集合gpiodetect依賴的庫,以及庫本身所依賴的庫。確認板子上目前是否有這些被依賴的庫。

4.執(zhí)行如下命令,并通過mcu輸出方波到soc的GPIO2_A8,觀察如下打印
gpiomon --num-events=3 --rising-edge gpiochip2 8 event: RISING EDGE offset: 8 timestamp: [949336016.966726520] event: RISING EDGE offset: 8 timestamp: [949336018.966762854] event: RISING EDGE offset: 8 timestamp: [949336020.966797355]
總結(jié):在uboot下是用一個總的N, number號來指明是哪個gpio管腳,需要轉(zhuǎn)換
而下linux下是用 哪個group 哪個腳,不需要進行轉(zhuǎn)換。

浙公網(wǎng)安備 33010602011771號