轉自:http://blog.csdn.net/cjyusha/article/details/50418862
在Linux嵌入式設備開發中,對GPIO的操作是最常用的,在一般的情況下,一般都有對應的驅動,應用程序打開對應的驅動,然后通過ioctl函數就可以對其進行操作。在linux中,其實有一個通用的GPIO驅動,應用通過調用文件的形式來進行讀寫操作,這個文件是/sys/class/gpio,本文就簡單的來講解一下通用GPIO接口的讀寫。
一、 以echo的形式調用system函數進行操作,這種形式編程比較簡單,結構比較清晰,如下:
- set_gpio64_low
void set_gpio64_low(void) { system("echo 64 > /sys/class/gpio/export"); system("echo out > /sys/class/gpio/gpio64/direction"); system("echo 0 > /sys/class/gpio/gpio64/value"); }
- set_gpio64_high
void set_gpio64_high(void) { system("echo 64 > /sys/class/gpio/export"); system("echo out > /sys/class/gpio/gpio64/direction"); system("echo 1 > /sys/class/gpio/gpio64/value"); }
二、 通過文件的形式來調用
- set_io_value_low
int set_io_value_low(int gpio) { FILE *fp; char buffer[10]; int value; char s[50]=""; char s1[50]=""; if ((fp = fopen("/sys/class/gpio/export", "w")) == NULL) { printf("Cannot open export file.\n"); return -1; } fprintf(fp, "%d", gpio); fclose(fp); sprintf(s,"/sys/class/gpio/gpio%d/direction",gpio); if ((fp = fopen(s, "rb+")) == NULL) { printf("Cannot open %s.\n",s); return -1; } fprintf(fp, "out"); fclose(fp); sprintf(s1,"/sys/class/gpio/gpio%d/value",gpio); if ((fp = fopen(s1, "rb+")) == NULL) { printf("Cannot open %s.\n",s1); return -1; } strcpy(buffer,"0"); fwrite(buffer, sizeof(char), sizeof(buffer) - 1, fp); fclose(fp); return 1; }
- set_io_value_high
int set_io_value_high(int gpio) { FILE *fp; char buffer[10]; int value; char s[50]=""; char s1[50]=""; if ((fp = fopen("/sys/class/gpio/export", "w")) == NULL) { printf("Cannot open export file.\n"); return -1; } fprintf(fp, "%d", gpio); fclose(fp); sprintf(s,"/sys/class/gpio/gpio%d/direction",gpio); if ((fp = fopen(s, "rb+")) == NULL) { printf("Cannot open %s.\n",s); return -1; } fprintf(fp, "out"); fclose(fp); sprintf(s1,"/sys/class/gpio/gpio%d/value",gpio); if ((fp = fopen(s1, "rb+")) == NULL) { printf("Cannot open %s.\n",s1); return -1; } strcpy(buffer,"1"); fwrite(buffer, sizeof(char), sizeof(buffer) - 1, fp); fclose(fp); return 1; }