C 读写GPIO

  • 创建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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值