我们在Android设备或者linux设备开发的时候,涉及到最基本的操作就是对GPIO的操作,通过标准的linux的GPIO操作函数,我们可以拉高或者拉低GPIO的电平实现控制,例如上电使能,控制LED亮灭等操作。而且我们一般的做法是写一个单独驱动程序,网上大多数的例子都是这样的。其实linux下面有一个通用的GPIO操作接口,那就是下面要介绍的 “/sys/class/gpio” 方式。

首先,看看系统中有没有“/sys/class/gpio”这个文件夹。如果没有请在编译内核的时候加入进去:

Device Drivers
—> GPIOSupport
—> /sys/class/gpio/… (sysfsinterface)。

/sys/class/gpio 的使用说明:

1、gpio_operation 通过/sys/文件接口操作IO端口 GPIO到文件系统的映射;

2、控制GPIO的目录位于/sys/class/gpio;

3、 /sys/class/gpio/export文件用于通知系统需要导出控制的GPIO引脚编号,首先给它赋读写权限;
adb shell chmod 0666 /sys/class/gpio/export
4、/sys/class/gpio/unexport 用于通知系统取消导出GPIO引脚编号,首先给它赋读写权限;
adb shell chmod 0666 /sys/class/gpio/export

5、/sys/class/gpio/gpiochipX目录保存系统中GPIO寄存器的信息,包括每个寄存器控制引脚的起始编号base,寄存器名称,引脚总数等。

6、首先需要计算此引脚编号,引脚编号 = 控制引脚的寄存器基数 + 控制引脚寄存器位数(一般平台不同计算方法也不相同,主要根据平台来计算;
查看gpio对应配置:cat /sys/kernel/debug/gpio //这里可以对应计算出gpio号

7、向/sys/class/gpio/export写入此编号,比如12号引脚,在shell中可以通过以下命令实现,命令成功后生成/sys/class/gpio/gpio12目录,如果没有出现相应的目录,说明此引脚不可导出:
echo 12 > /sys/class/gpio/export;

8、direction文件,定义输入输入方向,可以通过下面命令定义为输出,direction接受的参数:in,out, high, low。in/out设置为输入或者输出口,high/low同时设置方向为输出,并将value设置为相应的1/0;;

echo out > direction //设置该gpio为输出口

9、value文件是端口的数值,为1或0:为1设置为高电平,为0设置为低电平。
echo 1 > value

下面是简单的一个使用例子(在(adb工具)shell中操作):

adb shell chmod 0666 /sys/class/gpio/export  //export赋权限0666adb shell chmod 0666 /sys/class/gpio/unexport //unexport赋权限0666adb shell echo 62 > /sys/class/gpio/export  //通知系统需要导出控制的GPIO62adb shell chmod 0666 /sys/class/gpio/gpio62/direction //给GPIO62的direction属性赋权限0666adb shell chmod 0666 /sys/class/gpio/gpio62/value //给GPIO62的value属性赋权限0666adb shell echo out > /sys/class/gpio/gpio62/direction  //往GPIO62的direction属性写入out,设置GPIO为输出adb shell echo 1 > /sys/class/gpio/gpio62/value  //往GPIO62的value属性写入1,设置GPIO为高电平

上面的做法是直接操作GPIO,不需要再另外编写驱动程序,其实在Android的上层c服务程序中我们还可以通过上面的接口(节点)直接操作GPIO,以下就是c应用直接操作GPIO的DEMO代码:

  1 #include <sys/ioctl.h>2 #include <sys/types.h>3 #include <sys/stat.h>4 #include <fcntl.h>5 #include <unistd.h>67 /* C */8 #include <stdio.h>9 #include <string.h>10 #include <stdlib.h>11 #include <errno.h>1213 #include <linux/types.h>14 #include <linux/input.h>15 #include <linux/i2c.h>16 #include <linux/i2c-dev.h>1718 #define SYSFS_GPIO_EXPORT          "/sys/class/gpio/export"1920 #define SYSFS_GPIO_BUSY_PIN_VAL      "154"2122 #define SYSFS_GPIO_BUSY_DIR          "/sys/class/gpio/gpio154/direction"2324 #define SYSFS_GPIO_BUSY_DIR_VAL      "in"2526 #define SYSFS_GPIO_BUSY_VAL          "/sys/class/gpio/gpio154/value"37 static int gpio_set(void)38 {39             int fd;40414243         //打开端口/sys/class/gpio# echo 48 > export4445         fd = open(SYSFS_GPIO_EXPORT, O_WRONLY);4647         if(fd == -1)4849         {5051                   printf("ERR: Radio hard reset pin open error.\n");5253                   return -1;5455         }5657         write(fd, SYSFS_GPIO_BUSY_PIN_VAL ,sizeof(SYSFS_GPIO_BUSY_PIN_VAL));5859         close(fd);60616263         //设置端口方向/sys/class/gpio/gpio48# echo out > direction6465         fd = open(SYSFS_GPIO_BUSY_DIR, O_WRONLY);6667         if(fd == -1)6869         {7071                   printf("ERR: Radio hard reset pin direction open error.\n");7273                   return -1;7475         }7677         write(fd, SYSFS_GPIO_BUSY_DIR_VAL, sizeof(SYSFS_GPIO_BUSY_DIR_VAL));7879         close(fd);8081         return 0;83 }84858687 static  unsigned char gpio_read(void)8889 {9091     int fd;92         unsigned char buf = 0;9394959697 98     fd = open(SYSFS_GPIO_BUSY_VAL, O_RDONLY);99
100     if (fd < 0) {101
102         printf("Failed to open gpio value for reading!\n");
103
104         return -1;
105
106     }
107
108
109
110     if (read(fd, &buf, 1) < 0) {111
112         printf("Failed to read value!\n");
113
114         return -1;
115
116     }
117
118
119
120     close(fd);
121
122     return buf;
123
124 }

Android设备中直接通过shell操作GPIO或者上层c服务直接操作GPIO相关推荐

  1. ADB命令行卸载或删除你的Android设备中的应用

    如果你对你的Android设备在与命令行的交互间有一定的兴趣,那你可能想学习一些使用ADB卸载设备中已安装应用的技巧.为了使这种方法生效,你将需要在你的电脑中设置好Android ADB.可以去看看关 ...

  2. 通过ADB命令行卸载或删除你的Android设备中的应用

    对于通过ADB卸载一个应用程序,你必须知道这个应用程序的程序包名称,在这点上,你要注意的是,这未必是某应用的APK文件名字,比如Yahoo! Mail(雅虎邮箱)Android终端应用,它的程序包名称 ...

  3. 获取Android设备中全部App

    获取android设备中全部app名称和应用包名 /*** 获取android设备中全部app名称和应用包名* */public void getAllAppNames(){ArrayList cus ...

  4. android chrome html,在桌面chrome中调试android设备中的web页面

    准备工作 1, 桌面版chrome 2, Android设备(安装有chrome浏览器) 3, Android-sdk Android-sdk安装及设置 SKD安装 从http://developer ...

  5. android 自定义声音,如何在Android设备中添加自己的自定义声音

    大多数人在获得新手机后要做的第一件事就是更改铃声.根据制造商的不同,更改警报音,消息音和铃声的选项也有所不同. 如果您不喜欢预装的铃声,则可以根据需要从计算机上更改它.如果您已经将喜欢的铃声存储在计算 ...

  6. 通过adb巧用monkey获取android设备中所有应用的主activity

    由于工作需要,想获取所有应用的activity(这里仅限应用的主入口Launcher activity),搜索了一下,网上实现的方案都是基于android编程实现的,对于不懂开发的测试来说稍有难度,而 ...

  7. window android sd卡,如何修复在Windows/Android设备中不能被识别的Micro SD卡?

    三.Micro SD卡修复方法的详细介绍 1.在计算机中更改Micro SD卡的驱动器号 当Micro SD卡连接Windows计算机却无法被识别时,可以尝试更改Micro SD卡的驱动器号.具体步骤 ...

  8. 〖Android〗存在多个Android设备时,使用Shell脚本选择一个Android设备

    Shell脚本: #!/bin/bash devices=( $(adb devices|grep device$|awk '{print $1}'|xargs echo) )case ${#devi ...

  9. android陀螺仪手机垂直角度,Android设备中实现陀螺仪(Orientation Sensor)

    //加入需要的宏定义 #define  ID_BASE           SENSORS_HANDLE_BASE #define  ID_ACCELERATION   (ID_BASE+0) #de ...

  10. 如何把android设备中的固件dump出来

    android固件是在mtdblock中, 但是会有很多个block, root@android: # cat /proc/partitionsmajor minor #blocks name31 0 ...

最新文章

  1. Robot framework 二次开发笔记
  2. 完美解决:"library not found for - "
  3. python no module name_python导包显示No module named XXX问题
  4. mycat和应用程序集成_企业应用程序集成简介
  5. 工业交换机在工业通信领域的应用分析
  6. 论文浅尝 - ISWC2021 | 当知识图谱遇上零样本视觉问答
  7. Python加权图的邻接表邻接矩阵之转换
  8. 大蛋陪伴机器人_家长孩子都喜欢 阿尔法蛋大蛋2.0 AI学习机器人图赏
  9. Layui导航、面包屑
  10. java注释符_Java程序中的单行注释符是(  ),多行注释符是( )。
  11. Python调整图片透明度
  12. php 页面日历形式显示,日历页面展示-PHP制作阴阳历转换的日历插件-PHP中文网教程...
  13. 中国智能传感器投资规划建议及前景方向预测报告2022年版
  14. java.util.Map——Map集合的常用方法
  15. Java实现 LeetCode 765 情侣牵手(并查集 || 暴力)
  16. 第三章 微分中值定理与导数的应用
  17. 写在2020年尾的一点感悟:回朕车以复路兮,及行迷之未远
  18. MTTR、MTTF、MTBF详解
  19. 0.96寸OLED显示屏标准库移植HAL库(模拟IIC) - 基于STM32
  20. Unity3D入门(二):碰撞检测

热门文章

  1. 用for循环输出九九乘法表
  2. 【水】弱化版魔术球问题
  3. 黑马程序员_Java高新技术
  4. Palm应用开发之一开发环境搭建
  5. [经验]修改SDI主窗口Title
  6. 让人深思:句法真的重要吗?邱锡鹏组提出一种基于Aspect的情感分析的强大基线...
  7. 【NLP】浅谈 Transformer-based 模型中的位置表示
  8. bug6-_SymbolicException: Inputs to eager execution function cannot be Keras symbolic
  9. 从零实现深度学习框架——手写前馈网络实现电影评论分类
  10. [论文翻译]NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE