天天看點

linux 标準 GPIO 操作

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編号

繼續閱讀