android gpio驱动实例,Android/Linux 驱动层对GPIO口的操作方法和相关代码
实例:
unsigned int otg_en_pin=952; ----->高通的gpio的基础值为902,这里我们时间的gpio为50,即这里定义值是要设置为952。
//young.yang add began
ret=gpio_request(otg_en_pin, "otg_en_pin"); ------>注册gpio,获得并占有gpio的使用权
if(ret){
printk("[young]:otg_en_pin request fail!!!!n");
}
gpio_direction_output(otg_en_pin, 1); ------>设置gpio的输入/输出状态,并指定初始输出值。
printk("[young]: otg_en_pin value = %dn",gpio_get_value(otg_en_pin));
//young.yang add end
查看gpio的工作状态:
在adb shell下查看如下目录
/sys/kernel/debug
cat gpio
下面为linux下gpio的常规操作函数:
Linux 提供了GPIO 操作的 API,具体初始化及注册函数在 driver/gpio/lib_gpio.c 中实现。
#include
int gpio_request(unsigned gpio, const char *label);
获得并占有 GPIO port 的使用权,由参数 gpio 指定具体 port。非空的label指针有助于诊断。主要告诉内核这块地址被占用了。当其他地方调用同一地址的gpio_request就会报告错误,该地址已经被申请。在/proc/mem有地址占用表描述。先申请在访问的好处是避免资源竞争。
void gpio_free(unsigned gpio);
释放 GPIO port 的使用权,由参数 gpio 指定具体 port。
int gpio_direction_input(unsigned gpio);
将 GPIO port(由参数 gpio 指定)设为输入。
int gpio_direction_output(unsigned gpio, int value);
将 GPIO port(由参数 gpio 指定)设为输出,并指定输出电平值(value)。
int gpio_get_value(unsigned gpio);
获得 GPIO port 上的电平值并返回。
void gpio_set_value(unsigned gpio, int value);
设置 GPIO port 上的电平。
int gpio_to_irq(unsigned gpio);
通过获得 gpio port 对应的 irq number。
int gpio_cansleep(unsigned gpio)
这个主要区分是挂载在外部总线上的GPIO控制器,还是内部的GPIO控制器。因为外部总线上的GPIO控制器可以休眠,所以用这个来区分是否是扩展的GPIO,返回1是扩展的GPIO,0的话就是内部的GPIO。
int gpio_get_value_cansleep(unsigned gpio);
void gpio_set_value_cansleep(unsigned gpio, int value);
这些都是对可以休眠扩展的gpio的操作
static inline int gpio_is_valid(int number) 判断GPIO是否有效,有效返回0
int gpio_export(unsigned gpio, booldirection_may_change);
void gpio_unexport();
//在 /sys/class/gpio/下面创建和取消对应的gpio号
int gpio_export_link(struct device *dev, const char *name, unsigned gpio)
//创建到导出GPIO的 sysfs link ,第一个参数是在哪个dev下创建,第二个是参数名字,第三个是gpio编号
Linux中的IO使用方法
应该是新版本内核才有的方法。
请参考:./Documentation/gpio.txt文件
提供的API:
驱动需要包含 #include
判断一个IO是否合法:int gpio_is_valid(int number);
设置GPIO的方向,如果是输出同时设置电平:
/* set as input or output, returning 0 or negative errno */
int gpio_direction_input(unsigned gpio);
int gpio_direction_output(unsigned gpio, int value);
获取输入引脚的电平:
/* GPIO INPUT: return zero or nonzero */
int gpio_get_value(unsigned gpio);
/* GPIO OUTPUT */
void gpio_set_value(unsigned gpio, int value);
int gpio_cansleep(unsigned gpio);
To access such GPIOs, a different set of accessors is defined:
/* GPIO INPUT: return zero or nonzero, might sleep */
int gpio_get_value_cansleep(unsigned gpio);
/* GPIO OUTPUT, might sleep */
void gpio_set_value_cansleep(unsigned gpio, int value);
获取一个GPIO并声明标签:
/* request GPIO, returning 0 or negative errno.
* non-null labels may be useful for diagnostics.
*/
int gpio_request(unsigned gpio, const char *label);
/* release previously-claimed GPIO */
void gpio_free(unsigned gpio);
将GPIO映射为IRQ中断:
/* map GPIO numbers to IRQ numbers */
int gpio_to_irq(unsigned gpio);
/* map IRQ numbers to GPIO numbers (avoid using this) */
int irq_to_gpio(unsigned irq);
设置GPIO IRQ中断类型:
if (!sw->both_edges) {
if (gpio_get_value(sw->gpio))
set_irq_type(gpio_to_irq(sw->gpio), IRQ_TYPE_EDGE_FALLING);
else
set_irq_type(gpio_to_irq(sw->gpio), IRQ_TYPE_EDGE_RISING);
在驱动中使用延时函数mdelay,需要包含文件。
android gpio驱动实例,Android/Linux 驱动层对GPIO口的操作方法和相关代码相关推荐
- Android 底层驱动开发步骤——linux内核层、HAL层、JNI层
1.Linux驱动实现 2.Linux内核驱动测试 3.Android HAL层实现 4.Aidl实现 5.Service java实现 6.Service jni 实现 7.注册service和jn ...
- Linux驱动 简单的Linux驱动基础知识
Linux驱动 简单的Linux驱动基础知识 一.简述 记--Linux驱动学习笔记. Linux驱动程序初始化硬件设备,并提供硬件控制接口给更上一层的应用调用. 例如使用QT应用程序 ...
- android获取uevent实例,Android的uevent通信机制
想研究Android从Linux驱动层到Android应用层的一整套流程,于是和刘同事做了个东东实现从驱动层到应用层的一整套通信,做完了,写个笔记备忘一下 总共需要增改的有四个东西,驱动.jni.ja ...
- linux更新驱动脚本,编写Linux驱动常见错误(不断更新)!
工作中遇到的编写Linux驱动的常见错误和注意事项整理,将不断更新. 问题1.驱动的init函数声明错误 出错: [root@localhost]# insmod phyinfo.ko insmod: ...
- 武汉linux驱动培训转让,linux驱动培训靠谱吗
作为一名Linux爱好者,在Linux的世界中也算是半个老司机了,从桌面玩到服务器.从ubuntu到centos.从计算机到路由器,各种Linux的花俏玩法都略有体验.作者并非职业Linux选手,我仅 ...
- linux内核驱动ldd3_走进linux 驱动开发 之 内核模块
一.Linux内核简介 1.宏内核与微内核 内核分为四大类:单内核(宏内核):微内核:混合内核:外内核. 宏内核(Monolithickernel)是将内核从整体上作为一个大过程来实现,所有的内核服务 ...
- android 拨打电话 实例,Android实战教程第三篇之简单实现拨打电话功能
本文实例为大家分享了Android打电话功能的实现代码,需要一个文本输入框输入号码,需要一个按钮打电话. 本质:点击按钮,调用系统打电话功能. xml布局文件代码:: xmlns:tools=&quo ...
- android播放器实例,android音乐播放器实例
郑州app开发android音乐播放器实例.布局代码是一个imagebutton和seekbar. 下面是java代码 MainActivity.java package cn.xhhkj.music ...
- linux用户空间flash驱动,全面掌握Linux驱动框架——字符设备驱动、I2C驱动、总线设备驱动、NAND FLASH驱动...
原标题:全面掌握Linux驱动框架--字符设备驱动.I2C驱动.总线设备驱动.NAND FLASH驱动 字符设备驱动 哈~ 这几天都在发图,通过这种方式,我们希望能帮大家梳理学过的知识,全局的掌握Li ...
最新文章
- 计算机音乐谱打上花火,原神乐谱打上花火
- LeetCode-best time to buy and sell stock 1 数组
- 05 - @property 后面所加的关键词
- (12)FPGA时钟设计原则
- wxnativecallback.php,ectouch开发 | 糊涂虫
- 学云计算能从事什么工作 云计算就业怎么样
- ubuntu 开机后 按键 鼠标不能用
- java二分法流程图,程序框图的法(二分法).ppt
- java sub_java调用zeromq PUB-SUB模式
- 网卡调优RSS、RPS、RFS和XPS
- android3d地图,百度地图Android版 新增卫星图及3D模式
- Mindjet MindManager2022版本自带简体中文,无需汉化
- mysql 99乘法表_MySQL 通过sql输出99乘法表
- 急!灾区的食物依然短缺!(找不到原题出处只能这样了.....)
- vue项目内存溢出的解决
- 弘辽科技:拼多多关键词出价多少好?出价方法有哪些?
- java phrase_java-Maven无法部署工件,ReasonPhrase:Forbidden
- 移相信号发生器 课程设计 电赛 正弦波发生 相位调节
- 直流无刷电机极对数图解(simulink)
- OpenFaaS实战之二:函数入门
热门文章
- centos7 mysql 5.6.38_centos7.4 安装mysql 5.6.38
- open wrt 跟换主题_Openwrt编译进阶-修改密码、路由连接数、时区及主题
- mysql 错误1136_mysql,_MySQL错误:Error Code: 1136,mysql - phpStudy
- 安全起见,这款 IDEA 插件赶紧删了吧!
- JWT 和 JJWT,别再傻傻分不清了!
- 皮一皮:这是为什么呢???
- 皮一皮:我也想做这样的房东,善解人意、为他人着想...
- 别在用U盘拷贝源码带回家了,有童鞋被判刑啦!
- 七夕保命攻略,各位兄弟请收好!
- 阿里云1C2G虚拟机【99/年】羊毛党集合啦!