通用接口(1)——GPIO控制

本文详细介绍了在Rockchip RK3399平台上,如何通过sys文件系统操作GPIO4_C6引脚,包括设备树配置、驱动编写和测试应用的实现。此外,还提到了U-Boot接口函数的使用,以及电源域的配置,为GPIO设备的电源管理提供指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sys文件系统

涉及文件:

kernel/include/dt-bindings/pinctrl/rockchip.h			//引脚pinctrl相关宏定义

选择GPIO4_C6引脚,对该IO引脚进行控制。该引脚在OK3399上做edp屏的pwm背光,不过只在选择主或副屏选择edp显示的情况下才做pwm,默认情况下是做GPIO。
原理图接口如下:
在这里插入图片描述
查阅用户资料-原厂资料中的《Rockchip RK3399 TRM V1.4 Part1》文档,检索gpio4c6,查看该引脚的功能复用:
在这里插入图片描述
在这里插入图片描述
可以看到该引脚默认的功能是gpio。
1、 采用iomux 的方法
OK3399 linux下面有一个通用的GPIO操作接口, “/sys/class/gpio” ,可以通过该操作接口对IO接口进行操作。
系统启动后对于GPIO4_C6的操作指令如下

[root@rk3399:/]# echo 150 > /sys/class/gpio/export 		//导出GPIO4_C6引脚
[root@rk3399:/]# echo out > /sys/class/gpio/gpio150/direction	//设置IO输出方向
[root@rk3399:/]# echo 0 > /sys/class/gpio/gpio150/value 	//设置IO输出为低电平
[root@rk3399:/]# 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=4*32+(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);

char VENA_PWR_EN[4] = "io";
gpio_request(57,  VENA_PWR_EN);
gpio_direction_output(57, 0);
gpio_free(57);
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

将引脚配置到与硬件相符的电源域。
在这里插入图片描述

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值