在embedded linux平台,GPIO數值在filesystem下設定或讀取方法較為人知,但在debug或產測等等需要時效的情況,往往選擇在bootloader檢查GPIO狀態,但卻又不知道如何讀取,以下分享如何在bootloader讀取GPIO狀態的方法。
開始之前需要先找到想讀取的GPIO對應的腳位編號,可以參考平台的pin assignment文件,例如QCS40X就是qcs40x_gpio_pin_assignment_spreadsheet.pdf 如下圖。
以下是一些高通常見架構的GPIO讀取方法。
Qualcomm平台的uboot :
#include <asm/arch-ipq40xx/iomap.h>
/* this include is depend on platform */
unsigned int gpio; // gpio number
unsigned int val;
gpio = 13; //GPIO_13
//其中val為該gpio的狀態(0或1)
val = readl((unsigned int *)GPIO_IN_OUT_ADDR(gpio));
Qualcomm平台的little kernel:
#include <dev/gpio.h>
unsigned int gpio; // gpio number
unsigned int val;
gpio = 14; //GPIO_14
//其中val為該gpio的狀態(0或1)
val = get_gpio(gpio);
Qualcomm平台的edk2:
#include <Protocol/EFITlmm.h>
EFI_STATUS Status;
UINT32 val;
UINT32 gpio; //gpio number
gpio = 15; //GPIO_15
//其中val為該gpio的狀態(0或1)
Status = TLMMProtocol->GpioIn((UINT32)gpio, &val);
DEBUG((EFI_D_INFO, “GPIO %d : %d\n”, gpio, val));