1. 程式人生 > >[RK3399][Android7.1] 獲取gpio函式devm_gpiod_get_optional()

[RK3399][Android7.1] 獲取gpio函式devm_gpiod_get_optional()

latform: RK3399 
OS: Android 7.1 
Board: Firefly-RK3399

呼叫流程: 
在看顯示模組的程式碼時看到一個函式devm_gpiod_get_optional(), 之前沒接觸過,它的呼叫如下: 
devm_gpiod_get_optional -> 
 devm_gpiod_get_index_optional -> //index為0 
  devm_gpiod_get_index -> 
   gpiod_get_index

可以看到devm_gpiod_get_optional只是對gpiod_get_index的包裝而已,並且index為0。index引數後面會提。

函式引數

struct gpio_desc *__must_check devm_gpiod_get_index(struct device *dev,
                            const char *con_id,
                            unsigned int idx,
                            enum gpiod_flags flags);
  • 1
  • 2
  • 3
  • 4

重點關注第二個和第三個引數。

gpiod_get_index()到底用來幹什麼? 
答:gpiod_get_index()本質上和gpio_request()是一個功能,是申請gpio的,只是它是從device tree去查詢, 
因此看到第二個引數”con_id”是字串型別,也就是gpio的名字。

例如在顯示驅動看到的去查詢名字為”enable”的gpio 
panel-simple.c:

 panel->enable_gpio = devm_gpiod_get_optional(dev, "enable", 0);
  • 1

在使用mipi螢幕的主dts就有enable pin的定義 
rk3399-firefly-mipi.dts:

 enable-gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>;
  • 1

那麼index又有什麼用呢? 
核心文件有個例子,比如gpio如下定義:

        led-gpios = <&gpio 15 GPIO_ACTIVE_HIGH>
, /* red */ <&gpio 16 GPIO_ACTIVE_HIGH>, /* green */ <&gpio 17 GPIO_ACTIVE_HIGH>; /* blue */
  • 1
  • 2
  • 3

如果index是0,那麼對應的就是gpio 15;  如果index是1,那麼對應就是gpio 16,以此類推。