linux gpio 输出无效

这篇博客主要讨论了在Linux环境下遇到GPIO输出无效的问题。通过提供的简单程序展示了GPIO初始化、输出初始化和关闭的过程,强调了在操作GPIO后必须关闭文件的重要性。

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

linux gpio 输出无效 必须每次fclose
/******************************************************************************
A simple program of Hisilicon Hi35xx video encode implementation.
Copyright ©, 2010-2011, Hisilicon Tech. Co., Ltd.


Modification:  2011-2 Created

*****************************************************************************/
#ifdef __cplusplus
#if __cplusplus
extern “C” {
#endif
#endif /
End of #ifdef __cplusplus */

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include “sample_comm.h”

//SAMPLE_PRT(“Start Venc failed!\n”);
int gpio_in_init(unsigned int gpio_chip_num, unsigned int gpio_offset_num)
{
FILE *fp;
char file_name[50];
unsigned char buf[10];
unsigned int gpio_num;

gpio_num = gpio_chip_num * 8 + gpio_offset_num;

sprintf(file_name, "/sys/class/gpio/export");
fp = fopen(file_name, "w");
if (fp == NULL) {
	SAMPLE_PRT("Cannot open %s.\n", file_name);
	return -1;
}
fprintf(fp, "%d", gpio_num);
fclose(fp);

sprintf(file_name, "/sys/class/gpio/gpio%d/direction", gpio_num);
fp = fopen(file_name, "rb+");
if (fp == NULL) {
	SAMPLE_PRT("Cannot open %s.\n", file_name);
	return -1;
}
fprintf(fp, "in");
fclose(fp);
return 0;

}

int gpio_out_init(unsigned int gpio_chip_num, unsigned int gpio_offset_num)
{
FILE *fp;
char file_name[50];
unsigned char buf[10];
unsigned int gpio_num;

gpio_num = gpio_chip_num * 8 + gpio_offset_num;

sprintf(file_name, "/sys/class/gpio/export");
fp = fopen(file_name, "w");
if (fp == NULL) {
	SAMPLE_PRT("Cannot open %s.\n", file_name);
	return -1;
}
fprintf(fp, "%d", gpio_num);
fclose(fp);

sprintf(file_name, "/sys/class/gpio/gpio%d/direction", gpio_num);
fp = fopen(file_name, "rb+");
if (fp == NULL) {
	SAMPLE_PRT("Cannot open %s.\n", file_name);
	return -1;
}
fprintf(fp, "out");
fclose(fp);
return 0;

}
int gpio_close(unsigned int gpio_chip_num, unsigned int gpio_offset_num)
{
FILE *fp;
char file_name[50];
unsigned char buf[10];
unsigned int gpio_num;

gpio_num = gpio_chip_num * 8 + gpio_offset_num;
sprintf(file_name, "/sys/class/gpio/unexport");
fp = fopen(file_name, "w");
if (fp == NULL) {
	SAMPLE_PRT("Cannot open %s.\n", file_name);
	return -1;
}
fprintf(fp, "%d", gpio_num);
fclose(fp);
return 0;

}
int main(int argc, char *argv[])
{
FILE *fp8_0,*fp6_5,*fp6_6;
char file_name[50];
unsigned char buf[10];
unsigned int gpio_num;
int ir_flag=0;

char LastFlag=-1;
int Second3Count = 0;
int data_8_0=-1;
int venc_pid=-1;
gpio_in_init(8,0);
gpio_out_init(6,5);
gpio_out_init(6,6);	
			
venc_pid=atoi(argv[1]);

while(1)
{	
	sprintf(file_name, "/sys/class/gpio/gpio%d/value", 8*8+0);
	fp8_0 = fopen(file_name, "rb+");
	if (fp8_0 == NULL) {
		SAMPLE_PRT("Cannot open %s.\n", file_name);
		return -1;
	}		
	memset(buf, 0, 10);
	fread(buf, sizeof(char), sizeof(buf) - 1, fp8_0);
	data_8_0=(int)(buf[0]-48);
	fclose(fp8_0);	
	sleep(1);
	//SAMPLE_PRT("data_8_0=%d\n",data_8_0);
	if(data_8_0)
	{
		ir_flag=1;
		//SAMPLE_PRT("ir_flag=1\n");
	}
	else
	{
		ir_flag=0;
		//SAMPLE_PRT("ir_flag=0\n");
	}
	
	if(LastFlag!=ir_flag)
	{
		
		
		if(ir_flag!=0)
		{

			sprintf(file_name, "/sys/class/gpio/gpio%d/value", 6*8+5);
			fp6_5 = fopen(file_name, "rb+");
			if (fp6_5 == NULL) {
				SAMPLE_PRT("Cannot open %s.\n", file_name);
				return -1;
			}
			sprintf(file_name, "/sys/class/gpio/gpio%d/value", 6*8+6);
			fp6_6 = fopen(file_name, "rb+");
			if (fp6_6 == NULL) {
				SAMPLE_PRT("Cannot open %s.\n", file_name);
				return -1;
			}
			strcpy(buf,"1");fwrite(buf, sizeof(char), sizeof(buf) - 1, fp6_5);
			strcpy(buf,"0");fwrite(buf, sizeof(char), sizeof(buf) - 1, fp6_6);
			if(-1!=kill(venc_pid,SIGUSR1))
			{
				SAMPLE_PRT("ircut=1  send pid=%d SIGUSR1\n",venc_pid);
			}
			else break;
			SAMPLE_PRT("ir_flag=1 set io = 1,0\n");
			usleep(200*1000);
			fclose(fp6_5);
			fclose(fp6_6);
			sleep(1);
			
			sprintf(file_name, "/sys/class/gpio/gpio%d/value", 6*8+5);
			fp6_5 = fopen(file_name, "rb+");
			if (fp6_5 == NULL) {
				SAMPLE_PRT("Cannot open %s.\n", file_name);
				return -1;
			}
			sprintf(file_name, "/sys/class/gpio/gpio%d/value", 6*8+6);
			fp6_6 = fopen(file_name, "rb+");
			if (fp6_6 == NULL) {
				SAMPLE_PRT("Cannot open %s.\n", file_name);
				return -1;
			}
			strcpy(buf,"0");fwrite(buf, sizeof(char), sizeof(buf) - 1, fp6_5);
			strcpy(buf,"0");fwrite(buf, sizeof(char), sizeof(buf) - 1, fp6_6);
			SAMPLE_PRT("ir_flag=1 set io = 0,0\n");
			//必须每次fclose  否则输出无效 ircut 一直带电烫手的很哦
			fclose(fp6_5);
			fclose(fp6_6);
			sleep(1);
			
			
		}
		else
		{
			
			sprintf(file_name, "/sys/class/gpio/gpio%d/value", 6*8+5);
			fp6_5 = fopen(file_name, "rb+");
			if (fp6_5 == NULL) {
				SAMPLE_PRT("Cannot open %s.\n", file_name);
				return -1;
			}
			sprintf(file_name, "/sys/class/gpio/gpio%d/value", 6*8+6);
			fp6_6 = fopen(file_name, "rb+");
			if (fp6_6 == NULL) {
				SAMPLE_PRT("Cannot open %s.\n", file_name);
				return -1;
			}
			strcpy(buf,"0");fwrite(buf, sizeof(char), sizeof(buf) - 1, fp6_5);
			strcpy(buf,"1");fwrite(buf, sizeof(char), sizeof(buf) - 1, fp6_6);
			if(-1!=kill(venc_pid,SIGUSR2))
			{
				SAMPLE_PRT("ircut=1  send pid=%d SIGUSR2\n",venc_pid);
			}
			else break;
			SAMPLE_PRT("ir_flag=1 set io = 1,0\n");
			usleep(200*1000);
			fclose(fp6_5);
			fclose(fp6_6);
			sleep(1);
			
			sprintf(file_name, "/sys/class/gpio/gpio%d/value", 6*8+5);
			fp6_5 = fopen(file_name, "rb+");
			if (fp6_5 == NULL) {
				SAMPLE_PRT("Cannot open %s.\n", file_name);
				return -1;
			}
			sprintf(file_name, "/sys/class/gpio/gpio%d/value", 6*8+6);
			fp6_6 = fopen(file_name, "rb+");
			if (fp6_6 == NULL) {
				SAMPLE_PRT("Cannot open %s.\n", file_name);
				return -1;
			}
			strcpy(buf,"0");fwrite(buf, sizeof(char), sizeof(buf) - 1, fp6_5);
			strcpy(buf,"0");fwrite(buf, sizeof(char), sizeof(buf) - 1, fp6_6);
			SAMPLE_PRT("ir_flag=1 set io = 0,0\n");
			fclose(fp6_5);
			fclose(fp6_6);
			sleep(1);
						
			
		}
		LastFlag=ir_flag;
		
	}
	sleep(3);
	
}
gpio_close(6,5);
gpio_close(6,6);
gpio_close(8,0);

return -1;

}

#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* End of #ifdef __cplusplus */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值