linux中通用GPIO接口的操作

2024-05-08 01:18
文章标签 linux gpio 接口 通用 操作

本文主要是介绍linux中通用GPIO接口的操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


    在linux嵌入式设备开发中,对GPIO的操作是最常用的,在一般的情况下,一般都有对应的驱动,应用程序打开对应的驱动,然后通过ioctl函数就可以对其进行操作。在linux中,其实有一个通用的GPIO驱动,应用通过调用文件的形式来进行读写操作,这个文件是/sys/class/gpio,本文就简单的来讲解一下通用GPIO接口的读写。


一、 以echo的形式调用system函数进行操作,这种形式编程比较简单,结构比较清晰,如下:

[cpp]  view plain copy
  1. void set_gpio64_low(void)  
  2. {     
  3.     system("echo 64 > /sys/class/gpio/export");  
  4.     system("echo out > /sys/class/gpio/gpio64/direction");  
  5.     system("echo 0 > /sys/class/gpio/gpio64/value");  
  6. }  

只要完成三个步骤,就可以了

[cpp]  view plain copy
  1. void set_gpio64_high(void)  
  2. {     
  3.     system("echo 64 > /sys/class/gpio/export");  
  4.     system("echo out > /sys/class/gpio/gpio64/direction");  
  5.     system("echo 1 > /sys/class/gpio/gpio64/value");  
  6. }  

二、 通过文件的形式来调用

[cpp]  view plain copy
  1. int set_io_value_high(int gpio)  
  2. {  
  3.     FILE *fp;  
  4.     char buffer[10];  
  5.     int value;  
  6.     char s[50]="";  
  7.     char s1[50]="";  
  8.     if ((fp = fopen("/sys/class/gpio/export""w")) == NULL)   
  9.     {  
  10.         printf("Cannot open export file.\n");  
  11.         return -1;  
  12.     }  
  13.     fprintf(fp, "%d", gpio);  
  14.     fclose(fp);  
  15.   
  16.     sprintf(s,"/sys/class/gpio/gpio%d/direction",gpio);  
  17.     if ((fp = fopen(s, "rb+")) == NULL)   
  18.     {  
  19.         printf("Cannot open %s.\n",s);  
  20.         return -1;  
  21.     }  
  22.     fprintf(fp, "out");  
  23.     fclose(fp);  
  24.           
  25.     sprintf(s1,"/sys/class/gpio/gpio%d/value",gpio);  
  26.   
  27.     if ((fp = fopen(s1, "rb+")) == NULL)   
  28.     {  
  29.         printf("Cannot open %s.\n",s1);  
  30.         return -1;  
  31.     }  
  32.     strcpy(buffer,"1");  
  33.     fwrite(buffer, sizeof(char), sizeof(buffer) - 1, fp);         
  34.     fclose(fp);  
  35.     return 1;  
  36. }  

[cpp]  view plain copy
  1. int set_io_value_low(int gpio)  
  2. {  
  3.     FILE *fp;  
  4.     char buffer[10];  
  5.     int value;  
  6.     char s[50]="";  
  7.     char s1[50]="";  
  8.     if ((fp = fopen("/sys/class/gpio/export""w")) == NULL)   
  9.     {  
  10.         printf("Cannot open export file.\n");  
  11.         return -1;  
  12.     }  
  13.     fprintf(fp, "%d", gpio);  
  14.     fclose(fp);  
  15.   
  16.     sprintf(s,"/sys/class/gpio/gpio%d/direction",gpio);  
  17.     if ((fp = fopen(s, "rb+")) == NULL)   
  18.     {  
  19.         printf("Cannot open %s.\n",s);  
  20.         return -1;  
  21.     }  
  22.     fprintf(fp, "out");  
  23.     fclose(fp);  
  24.           
  25.     sprintf(s1,"/sys/class/gpio/gpio%d/value",gpio);  
  26.   
  27.     if ((fp = fopen(s1, "rb+")) == NULL)   
  28.     {  
  29.         printf("Cannot open %s.\n",s1);  
  30.         return -1;  
  31.     }  
  32.     strcpy(buffer,"0");  
  33.     fwrite(buffer, sizeof(char), sizeof(buffer) - 1, fp);         
  34.     fclose(fp);  
  35.     return 1;  
  36.   
  37. }  

这篇关于linux中通用GPIO接口的操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968912

相关文章

Linux命令学习之二

每日一结 ​               命令置换:是将一个命令的输出作为另一个命令的参数,命令格式如下: commond1 `command2` 其中,命令command2的输出将作为命令command1的参数,需要注意的是, 命令置换的单引号为ESC键下方的 ` 其意思就是说,先运行单引号内的命令,再将其命令作为

Linux命令学习之一

每日一结                                                                                        注:当用户不确定一个软件包的类型时, 可使用file命令查看文件类型

Linux文件I/O之一

每日一结(标准I/O)   一  库    本质 :一组实现函数接口 [printf,scanf,strcpy,strlen]   使用标准库好处:屏蔽底层细节,向上层提供统一的接口,提高程序的可移植性   windows 库 : *.dll  linux   库 : *.so    二 系统调用接口    本

Linux网络编程之五

每日一结 组播: ​ 网络地址: 一些特殊的组播地址:   一 组播包收和发 1.发送方 (1)创建用户数据报套接字 (2)填充组播地址和端口  (3)发送数据到组播地址 2.接收方  (1)创建用户数据报套接字 (2)加入组播组  struct ip_mreq mreq; mreq.imr_m

Linux网络编程之四

每日一结 一 UDP并发  核心思想:父进程接收到客户端的数据,就创建子进程,在子进程中创建一个新的套接字  和客户端交互  int do_client(接受客户端地址,数据,数据长度) { 1.创建用户数据报套接字  2.自动分配地址  3.处理数据[例如:输出数据内容] 4.通过新创建的套接字将数据回发给客户端  w

Linux网络编程之三

每日一结 Tftp服务器的实现: server.c ​       client.c     代码分析如下:     一 Linux IO模型  (1)阻塞IO  (2)非阻塞IO  非阻塞IO

Linux网络编程之二

每日一结   一 TCP 函数接口  int listen(int sockfd, int backlog); 功能:设置流式套接字为监听模式  参数: @sockfd    流式套接字的fd  @backlog   请求队列的长度,最大128  返回值: 成功返回0,失败返回-1    int accept(i

Linux网络编程之一

每日一结 一 网络基础知识 (一)IP地址 1.IP   :网络中一台主机唯一标识  2.组成 :网络号 + 主机号  3.IP 分类 最高位    第一个字节 A  1 + 3     0        [0-127]     B  2 + 2    10        [128-191]

Linux进程与线程之五

每日一结 一 共享内存 :内核空间预留出来的一块内存,用于进程间通信  (1)int shmget(key_t key, size_t size, int shmflg); 功能:获取共享内存段的ID  参数: @key    IPC_PRIVATE  或 ftok()  @size   申请的共享内存段大小 [4k的倍

Linux进程与线程之四

每日一结 一 传统的进程间通信  1.信号 : 异步进程间通信方式    信号是对中断机制的一种模拟  进程对信号处理方式: (1)忽略信号  SIGKILL ,SIGSTOP 不能忽略  (2)捕捉 : 信号到达的时候,执行信号处理函数  (3)缺省操作 : 系统默认的操作  大部分信号默认的操作都是杀死进程,SIGCHLD 进