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 */