Linux 提供了GPIO 操作的 API,具體初始化及注冊函數在 driver/gpio/lib_gpio.c 中實作。
#include
int gpio_request(unsigned gpio, const char *label);
獲得并占有 GPIO port 的使用權,由參數 gpio 指定具體 port。非空的label指針有助于診斷。主要告訴核心這塊位址被占用了。當其他地方調用同一位址的gpio_request就會報告錯誤,該位址已經被申請。在/proc/mem有位址占用表描述。先申請在通路的好處是避免資源競争。
void gpio_free(unsigned gpio);
釋放 GPIO port 的使用權,由參數 gpio 指定具體 port。
int gpio_direction_input(unsigned gpio);
将 GPIO port(由參數 gpio 指定)設為輸入。
int gpio_direction_output(unsigned gpio, int value);
将 GPIO port(由參數 gpio 指定)設為輸出,并指定輸出電平值(value)。
int gpio_get_value(unsigned gpio);
獲得 GPIO port 上的電平值并傳回。
void gpio_set_value(unsigned gpio, int value);
設定 GPIO port 上的電平。
int gpio_to_irq(unsigned gpio);
通過獲得 gpio port 對應的 irq number。
int gpio_cansleep(unsigned gpio)
這個主要區分是挂載在外部總線上的GPIO控制器,還是内部的GPIO控制器。因為外部總線上的GPIO控制器可以休眠,是以用這個來區分是否是擴充的GPIO,傳回1是擴充的GPIO,0的話就是内部的GPIO。
int gpio_get_value_cansleep(unsigned gpio);
void gpio_set_value_cansleep(unsigned gpio, int value);
這些都是對可以休眠擴充的gpio的操作
static inline int gpio_is_valid(int number) 判斷GPIO是否有效,有效傳回0
int gpio_export(unsigned gpio, booldirection_may_change);
void gpio_unexport();
//在 /sys/class/gpio/下面建立和取消對應的gpio号
int gpio_export_link(struct device *dev, const char *name, unsigned gpio)
//建立到導出GPIO的 sysfs link ,第一個參數是在哪個dev下建立,第二個是參數名字,第三個是gpio編号