MT7688学习笔记(18)——GPIO接口使用

一、简介

/sys/class/gpio/ 目录下,包含有两个文件 exportunexport 和若干 gpiochipN 类型文件夹

  • export
    用于将指定编号的引脚导出,作为GPIO使用
  • unexport
    用于将导出的GPIO删除掉
  • gpiochipN
    当前芯片中包含的GPIO控制器

二、输出

2.1 添加设备接口

echo 167 > export

/**
 @brief 用于将指定编号的引脚导出,作为GPIO使用
 @param pin -[in] 指定导出的引脚
 @return 1 - 成功;-1 - 失败
*/
int gpioExport(int pin)
{
    FILE *fp = fopen("/sys/class/gpio/export", "w");
    
    if(fp == NULL)
    {
        printf("Failed to open export for writing!\n");
        return -1;
    }
    else
    {
        fprintf(fp, "%d", pin);
    }
    
    fclose(fp);
    return 1;
}

2.2 控制设备接口

  • direction
    设置输出还是输入模式
    • 设置为输入:echo “in” > direction
    • 设置为输出:echo “out” > direction
  • value
    输出时,控制高低电平;输入时,获取高低电平
    • 高电平:echo 1 > value
    • 低电平:echo 0 > value
  • edge
    控制中断触发模式,引脚被配置为中断后可以使用poll() 函数监听引脚
    • 非中断引脚: echo “none” > edge
    • 上升沿触发:echo “rising” > edge
    • 下降沿触发:echo “falling” > edge
    • 边沿触发:echo “both” > edge
/**
 @brief 设置输入输出模式
 @param pin -[in] 引脚
 @param pDirection -[in] 设置方向
 @return 1 - 成功;-1 - 失败
*/
int gpioDirection(int pin, char *pDirection)
{
    char path[64] = {0};
    sprintf(path, "/sys/class/gpio/gpio%d/direction", pin);
    FILE *fp = fopen(path, "w");
    
    if(fp == NULL)
    { 
        printf("Failed to open gpio direction for writing!\n");
        return -1;
    }
    else
    {
        fprintf(fp, "%s", pDirection);
    }
    
    fclose(fp);
    return 1;
} 
/**
 @brief 设置输出值
 @param pin -[in] 引脚
 @param pValue -[in] 输出值
 @return 1 - 成功;-1 - 失败
*/
int gpioWrite(int pin, char *pValue)
{
    char path[64] = {0};
    sprintf(path, "/sys/class/gpio/gpio%d/value", pin);
    FILE *fp = fopen(path, "w");

    if(fp == NULL)
    {
        printf("Failed to open gpio value for writing!\n");
        return -1;
    }
    else
    {
        fprintf(fp, "%s", pValue);
    }
    
    fclose(fp);
    return 1;
}

2.3 流程

gpioExport(40);
gpioDirection(40, "out");
gpioWrite(40, "0");
gpioWrite(40, "1");

三、输入

3.1 添加设备接口

/**
 @brief 用于将指定编号的引脚导出,作为GPIO使用
 @param pin -[in] 指定导出的引脚
 @return 1 - 成功;-1 - 失败
*/
int gpioExport(int pin)
{
    FILE *fp = fopen("/sys/class/gpio/export", "w");
    
    if(fp == NULL)
    {
        printf("Failed to open export for writing!\n");
        return -1;
    }
    else
    {
        fprintf(fp, "%d", pin);
    }
    
    fclose(fp);
    return 1;
}

3.2 控制设备接口

  • direction
    设置输出还是输入模式
    • 设置为输入:echo “in” > direction
    • 设置为输出:echo “out” > direction
  • value
    输出时,控制高低电平;输入时,获取高低电平
    • 高电平:echo 1 > value
    • 低电平:echo 0 > value
  • edge
    控制中断触发模式,引脚被配置为中断后可以使用poll() 函数监听引脚
    • 非中断引脚: echo “none” > edge
    • 上升沿触发:echo “rising” > edge
    • 下降沿触发:echo “falling” > edge
    • 边沿触发:echo “both” > edge
/**
 @brief 设置输入输出模式
 @param pin -[in] 引脚
 @param pDirection -[in] 设置方向
 @return 1 - 成功;-1 - 失败
*/
int gpioDirection(int pin, char *pDirection)
{
    char path[64] = {0};
    sprintf(path, "/sys/class/gpio/gpio%d/direction", pin);
    FILE *fp = fopen(path, "w");
    
    if(fp == NULL)
    { 
        printf("Failed to open gpio direction for writing!\n");
        return -1;
    }
    else
    {
        fprintf(fp, "%s", pDirection);
    }
    
    fclose(fp);
    return 1;
} 
/**
 @brief 读取输入值
 @param pin -[in] 引脚
 @return 0/1 - 成功;-1 - 失败
*/
static int gpioRead(int pin)
{
    char path[64] = {0};
    char valueStr[3];
    int fd;
    snprintf(path, sizeof(path), "/sys/class/gpio/gpio%d/value", pin);
    fd = open(path, O_RDONLY);
    
    if(fd < 0)
    {
        printf("Failed to open gpio value for reading!\n");
        return -1;
    }
 
    if(read(fd, valueStr, 3) < 0)
    {
        printf("Failed to read value!\n");
        return -1;
    }
 
    close(fd);
    return (atoi(valueStr));
}

3.3 流程

gpioExport(42);
gpioDirection(42, "in");
while(1)
{
    int key = gpioRead(42);
}

• 由 Leung 写于 2020 年 8 月 26 日

• 参考:Linux 用户态设置GPIO控制
    linux设备驱动程序–gpio控制

猜你喜欢

转载自blog.csdn.net/qq_36347513/article/details/108241276