Android设备中直接通过shell操作GPIO或者上层c服务直接操作GPIO
我们在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相关推荐
- ADB命令行卸载或删除你的Android设备中的应用
如果你对你的Android设备在与命令行的交互间有一定的兴趣,那你可能想学习一些使用ADB卸载设备中已安装应用的技巧.为了使这种方法生效,你将需要在你的电脑中设置好Android ADB.可以去看看关 ...
- 通过ADB命令行卸载或删除你的Android设备中的应用
对于通过ADB卸载一个应用程序,你必须知道这个应用程序的程序包名称,在这点上,你要注意的是,这未必是某应用的APK文件名字,比如Yahoo! Mail(雅虎邮箱)Android终端应用,它的程序包名称 ...
- 获取Android设备中全部App
获取android设备中全部app名称和应用包名 /*** 获取android设备中全部app名称和应用包名* */public void getAllAppNames(){ArrayList cus ...
- android chrome html,在桌面chrome中调试android设备中的web页面
准备工作 1, 桌面版chrome 2, Android设备(安装有chrome浏览器) 3, Android-sdk Android-sdk安装及设置 SKD安装 从http://developer ...
- android 自定义声音,如何在Android设备中添加自己的自定义声音
大多数人在获得新手机后要做的第一件事就是更改铃声.根据制造商的不同,更改警报音,消息音和铃声的选项也有所不同. 如果您不喜欢预装的铃声,则可以根据需要从计算机上更改它.如果您已经将喜欢的铃声存储在计算 ...
- 通过adb巧用monkey获取android设备中所有应用的主activity
由于工作需要,想获取所有应用的activity(这里仅限应用的主入口Launcher activity),搜索了一下,网上实现的方案都是基于android编程实现的,对于不懂开发的测试来说稍有难度,而 ...
- window android sd卡,如何修复在Windows/Android设备中不能被识别的Micro SD卡?
三.Micro SD卡修复方法的详细介绍 1.在计算机中更改Micro SD卡的驱动器号 当Micro SD卡连接Windows计算机却无法被识别时,可以尝试更改Micro SD卡的驱动器号.具体步骤 ...
- 〖Android〗存在多个Android设备时,使用Shell脚本选择一个Android设备
Shell脚本: #!/bin/bash devices=( $(adb devices|grep device$|awk '{print $1}'|xargs echo) )case ${#devi ...
- android陀螺仪手机垂直角度,Android设备中实现陀螺仪(Orientation Sensor)
//加入需要的宏定义 #define ID_BASE SENSORS_HANDLE_BASE #define ID_ACCELERATION (ID_BASE+0) #de ...
- 如何把android设备中的固件dump出来
android固件是在mtdblock中, 但是会有很多个block, root@android: # cat /proc/partitionsmajor minor #blocks name31 0 ...
最新文章
- Robot framework 二次开发笔记
- 完美解决:"library not found for - "
- python no module name_python导包显示No module named XXX问题
- mycat和应用程序集成_企业应用程序集成简介
- 工业交换机在工业通信领域的应用分析
- 论文浅尝 - ISWC2021 | 当知识图谱遇上零样本视觉问答
- Python加权图的邻接表邻接矩阵之转换
- 大蛋陪伴机器人_家长孩子都喜欢 阿尔法蛋大蛋2.0 AI学习机器人图赏
- Layui导航、面包屑
- java注释符_Java程序中的单行注释符是( ),多行注释符是( )。
- Python调整图片透明度
- php 页面日历形式显示,日历页面展示-PHP制作阴阳历转换的日历插件-PHP中文网教程...
- 中国智能传感器投资规划建议及前景方向预测报告2022年版
- java.util.Map——Map集合的常用方法
- Java实现 LeetCode 765 情侣牵手(并查集 || 暴力)
- 第三章 微分中值定理与导数的应用
- 写在2020年尾的一点感悟:回朕车以复路兮,及行迷之未远
- MTTR、MTTF、MTBF详解
- 0.96寸OLED显示屏标准库移植HAL库(模拟IIC) - 基于STM32
- Unity3D入门(二):碰撞检测
热门文章
- 用for循环输出九九乘法表
- 【水】弱化版魔术球问题
- 黑马程序员_Java高新技术
- Palm应用开发之一开发环境搭建
- [经验]修改SDI主窗口Title
- 让人深思:句法真的重要吗?邱锡鹏组提出一种基于Aspect的情感分析的强大基线...
- 【NLP】浅谈 Transformer-based 模型中的位置表示
- bug6-_SymbolicException: Inputs to eager execution function cannot be Keras symbolic
- 从零实现深度学习框架——手写前馈网络实现电影评论分类
- [论文翻译]NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE