天天看點

通用接口(1)——GPIO控制sys檔案系統裝置節點uboot 接口函數電源域

文章目錄

  • sys檔案系統
  • 裝置節點
    • 裝置樹添加對應的裝置節點
    • 添加對應的驅動
    • 編寫測試app
  • uboot 接口函數
  • 電源域

sys檔案系統

涉及檔案:

kernel/include/dt-bindings/pinctrl/rockchip.h			//引腳pinctrl相關宏定義
           

選擇GPIO4_C6引腳,對該IO引腳進行控制。該引腳在OK3399上做edp屏的pwm背光,不過隻在選擇主或副屏選擇edp顯示的情況下才做pwm,預設情況下是做GPIO。

原理圖接口如下:

通用接口(1)——GPIO控制sys檔案系統裝置節點uboot 接口函數電源域

查閱使用者資料-原廠資料中的《Rockchip RK3399 TRM V1.4 Part1》文檔,檢索gpio4c6,檢視該引腳的功能複用:

通用接口(1)——GPIO控制sys檔案系統裝置節點uboot 接口函數電源域
通用接口(1)——GPIO控制sys檔案系統裝置節點uboot 接口函數電源域

可以看到該引腳預設的功能是gpio。

1、 采用iomux 的方法

OK3399 linux下面有一個通用的GPIO操作接口, “/sys/class/gpio” ,可以通過該操作接口對IO接口進行操作。

系統啟動後對于GPIO4_C6的操作指令如下

[[email protected]:/]# echo 150 > /sys/class/gpio/export 		//導出GPIO4_C6引腳
[[email protected]:/]# echo out > /sys/class/gpio/gpio150/direction	//設定IO輸出方向
[[email protected]:/]# echo 0 > /sys/class/gpio/gpio150/value 	//設定IO輸出為低電平
[[email protected]:/]# echo 1 > /sys/class/gpio/gpio150/value	//設定IO輸出為高電平
           

GPIO4_C6引腳gpio号為150的計算方法:

A-D對應1-4:A-1,B-2,C-3,D-4。

GPIOn_xy =n*32+(x-1)8+y

GPIO4_C6=432+(3-1)*8+6=150

裝置節點

裝置樹添加對應的裝置節點

gpio-inputs {
                compatible = "gpio-input";
                pinctrl-names = "default";
                pinctrl-0 = <&dis_gpio>;
                status = "okay";

                di0 {
                        label = "di0";
                        gpios = <&gpio2 2 GPIO_ACTIVE_HIGH>;
                        debounce_interval = <20>;
                };

                di1 {
                        label = "di1";
                        gpios = <&gpio2 3 GPIO_ACTIVE_LOW>;
                        debounce_interval = <20>;
                };
        };
           

添加對應的驅動

kernel/drivers/input/gpio_input.c

static const struct of_device_id gpio_input_of_match[] = {
        { .compatible = "gpio-input", },
        { },
};
MODULE_DEVICE_TABLE(of, gpio_input_of_match);
           

編寫測試app

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

#define BUFFER_SIZE 1024

int main(int argc,char *argv[])
{
       int fd, ret;
       char* dev  = argv[1];
       char buffer[BUFFER_SIZE];

       fd = open(dev, O_RDWR);
       if(fd < 0){
               perror("open");
               return 1;
       }

       ret = read(fd, buffer, BUFFER_SIZE);
       if(fd < 0){
               perror("read");
               return 1;
       }

       printf("value = %d\n", buffer[0]);
       return 0;
}
           

uboot 接口函數

dm_gpio_is_valid
dm_gpio_set_value
gpio_request_by_name

gpio_request
gpio_direction_input
gpio_get_value
           
引腳
GPIO0_B1/PMUIO2_VOLSEL_d		V30_GPIO0_B1

#define LED_CONTROL_GPIO 9 /*GPIO0B1*/
	gpio_request(LED_CONTROL_GPIO, "led_control");
	gpio_direction_output(LED_CONTROL_GPIO, 0);
	gpio_set_value(LED_CONTROL_GPIO, 0);
           
struct udevice *dev
ret = gpio_request_by_name(dev, "enable-gpios", 0, &priv->enable_gpio, GPIOD_IS_OUT);
if (dm_gpio_is_valid(&priv->reset_gpio))
	dm_gpio_set_value(&priv->reset_gpio, 1);
           

電源域

LCD_EN		AJ3_GPIO4_D5
           
writel(0xb000b, 0xff77e640);		//設定gpio1830、audio、bt656電源域工作電壓為1.8V
0xb000b : 1011 0000 0000 0000 1011
           

将引腳配置到與硬體相符的電源域。

通用接口(1)——GPIO控制sys檔案系統裝置節點uboot 接口函數電源域
Possible supplies for rk3399:
- bt656-supply:  The supply connected to APIO2_VDD.
- audio-supply:  The supply connected to APIO5_VDD.
- sdmmc-supply:  The supply connected to SDMMC0_VDD.
- gpio1830       The supply connected to APIO4_VDD.

Possible supplies for rk3399 pmu-domains:
- pmu1830-supply:The supply connected to PMUIO2_VDD.
           

繼續閱讀