C 读写GPIO

2 篇文章 0 订阅
  • 创建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;
}

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嵌入式Linux中,可以通过sysfs文件系统来读写GPIO。sysfs是Linux内核提供的一种虚拟文件系统,可以让用户空间程序访问内核数据结构。GPIO在sysfs中的路径为/sys/class/gpio。 以下是使用C语言读取GPIO的步骤: 1. 在/sys/class/gpio目录中创建GPIO节点,命名格式为gpioN,其中N为GPIO的编号。 2. 设置GPIO方向为输入或输出。在GPIO节点目录下,将direction文件写入in或out。 3. 读取或写入GPIO状态。在GPIO节点目录下,读取value文件可以获取GPIO的当前状态,写入value文件可以设置GPIO的状态。 下面是一个简单的示例程序,读取GPIO1的状态: ```c #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #define GPIO_DIR "/sys/class/gpio" #define GPIO_NUM "1" int main(void) { int fd; char buf[10]; // 创建GPIO节点 fd = open(GPIO_DIR "/export", O_WRONLY); sprintf(buf, "%d", 1); write(fd, buf, strlen(buf)); close(fd); // 设置GPIO方向为输入 fd = open(GPIO_DIR "/gpio" GPIO_NUM "/direction", O_WRONLY); write(fd, "in", 2); close(fd); // 读取GPIO状态 fd = open(GPIO_DIR "/gpio" GPIO_NUM "/value", O_RDONLY); read(fd, buf, 1); close(fd); if (buf[0] == '0') printf("GPIO1 is low\n"); else printf("GPIO1 is high\n"); return 0; } ``` 需要注意的是,在使用GPIO之前,需要先将GPIO对应的引脚配置为GPIO模式,否则无法读写GPIO。具体的引脚配置方法和GPIO编号与引脚对应关系需要根据嵌入式系统的硬件平台和相关文档来确定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值