一、简介
在 /sys/class/gpio/
目录下,包含有两个文件 export、unexport 和若干 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 日