- 创建GPIO
创建的GPIO可在/sys/class/gpio目录下看到。
#define AXI_AD_GPIO_START 960 #define AXI_AD_GPIO_COUNT 20 // 创建的GPIO总数 int ad_gpio_init() { int i = 0; int exportfd = 0; int write_len = 4; char gpio_str[20] = {0}; int gpioNum = 0; exportfd = open("/sys/class/gpio/export", O_WRONLY); if (exportfd < 0) { printf("Cannot open export."); return -1; } for (i=0; i<AXI_AD_GPIO_COUNT; i++) { gpioNum = AXI_AD_GPIO_START + i; sprintf(gpio_str, "%d", gpioNum); write(exportfd, gpio_str, write_len); // create gpio } close(exportfd); return 0; }
- 设置GPIO的读写模式
#define GPIO_DIRECTION_OUT "out" // GPIO direction [ in -> out ] (可编辑value值 ) #define GPIO_DIRECTION_IN "in" // GPIO direction [ out -> in ] (不可编辑value值) static int fd_dirct_wr(u32 gpio_num,char* dirc) { int fd_dirct = 0; int write_len = 4; char gpio_path_direction[50] = {0}; // direction value set 'out' sprintf(gpio_path_direction, "/sys/class/gpio/gpio%d/direction", gpio_num); fd_dirct = open(gpio_path_direction, O_WRONLY); if(fd_dirct < 0) { myprintf("Cannot open GPIO[%d] direction. ", gpio_num); close(fd_dirct); return -1; } if (write(fd_dirct, dirc, write_len) < 0) { myprintf("Write GPIO failed. "); close(fd_dirct); return -1; } close(fd_dirct); return 0; }
- 写GPIO操作
int gpio_write(u32 gpio_num, u32 value) { int fd_gpio = 0, write_len = 4; char gpio_path_value[50] = {0}, gpio_val[1] = {0}; if (gpio_num<0) { printf("GPIO number is invalid. \n"); return -1; } if (value<0 || value>1) { printf("GPIO value is invalid. \n"); return -1; } // direction value set 'out' if (fd_dirct_wr(gpio_num, GPIO_DIRECTION_OUT)) { return -1; } // gpio value set sprintf(gpio_path_value, "/sys/class/gpio/gpio%d/value", gpio_num); fd_gpio = open(gpio_path_value, O_WRONLY); if(fd_gpio < 0) { printf("Cannot open GPIO direction. \n"); close(fd_gpio); return -1; } sprintf(gpio_val, "%d", value); // set value if (write(fd_gpio, gpio_val, write_len) < 0) { printf("Write GPIO failed. \n"); close(fd_gpio); return -1; } close(fd_gpio); return 0; }
- 读GPIO操作
int gpio_read(u32 gpio_num, u32 *value) { int fd_gpio = 0; char gpio_path_value[50] = {0}; char rd_buf[20] = {0}; if (gpio_num<0) { myprintf("GPIO number is invalid."); return -1; } // direction value set 'in' if (fd_dirct_wr(gpio_num, GPIO_DIRECTION_IN)) { return -1; } // gpio value read sprintf(gpio_path_value, "/sys/class/gpio/gpio%d/value", gpio_num); fd_gpio = open(gpio_path_value, O_RDONLY); if(fd_gpio < 0) { myprintf("Cannot open GPIO direction. "); close(fd_gpio); return -1; } if (read(fd_gpio, rd_buf, sizeof(rd_buf)) < 0) { myprintf("Read GPIO failed. "); close(fd_gpio); return -1; } *value = (u32)atoi(rd_buf); close(fd_gpio); return 0; }