实例:

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口的操作方法和相关代码相关推荐

  1. Android 底层驱动开发步骤——linux内核层、HAL层、JNI层

    1.Linux驱动实现 2.Linux内核驱动测试 3.Android HAL层实现 4.Aidl实现 5.Service java实现 6.Service jni 实现 7.注册service和jn ...

  2. Linux驱动 简单的Linux驱动基础知识

    Linux驱动 简单的Linux驱动基础知识 一.简述         记--Linux驱动学习笔记. Linux驱动程序初始化硬件设备,并提供硬件控制接口给更上一层的应用调用. 例如使用QT应用程序 ...

  3. android获取uevent实例,Android的uevent通信机制

    想研究Android从Linux驱动层到Android应用层的一整套流程,于是和刘同事做了个东东实现从驱动层到应用层的一整套通信,做完了,写个笔记备忘一下 总共需要增改的有四个东西,驱动.jni.ja ...

  4. linux更新驱动脚本,编写Linux驱动常见错误(不断更新)!

    工作中遇到的编写Linux驱动的常见错误和注意事项整理,将不断更新. 问题1.驱动的init函数声明错误 出错: [root@localhost]# insmod phyinfo.ko insmod: ...

  5. 武汉linux驱动培训转让,linux驱动培训靠谱吗

    作为一名Linux爱好者,在Linux的世界中也算是半个老司机了,从桌面玩到服务器.从ubuntu到centos.从计算机到路由器,各种Linux的花俏玩法都略有体验.作者并非职业Linux选手,我仅 ...

  6. linux内核驱动ldd3_走进linux 驱动开发 之 内核模块

    一.Linux内核简介 1.宏内核与微内核 内核分为四大类:单内核(宏内核):微内核:混合内核:外内核. 宏内核(Monolithickernel)是将内核从整体上作为一个大过程来实现,所有的内核服务 ...

  7. android 拨打电话 实例,Android实战教程第三篇之简单实现拨打电话功能

    本文实例为大家分享了Android打电话功能的实现代码,需要一个文本输入框输入号码,需要一个按钮打电话. 本质:点击按钮,调用系统打电话功能. xml布局文件代码:: xmlns:tools=&quo ...

  8. android播放器实例,android音乐播放器实例

    郑州app开发android音乐播放器实例.布局代码是一个imagebutton和seekbar. 下面是java代码 MainActivity.java package cn.xhhkj.music ...

  9. linux用户空间flash驱动,全面掌握Linux驱动框架——字符设备驱动、I2C驱动、总线设备驱动、NAND FLASH驱动...

    原标题:全面掌握Linux驱动框架--字符设备驱动.I2C驱动.总线设备驱动.NAND FLASH驱动 字符设备驱动 哈~ 这几天都在发图,通过这种方式,我们希望能帮大家梳理学过的知识,全局的掌握Li ...

最新文章

  1. 计算机音乐谱打上花火,原神乐谱打上花火
  2. LeetCode-best time to buy and sell stock 1 数组
  3. 05 - @property 后面所加的关键词
  4. (12)FPGA时钟设计原则
  5. wxnativecallback.php,ectouch开发 | 糊涂虫
  6. 学云计算能从事什么工作 云计算就业怎么样
  7. ubuntu 开机后 按键 鼠标不能用
  8. java二分法流程图,程序框图的法(二分法).ppt
  9. java sub_java调用zeromq PUB-SUB模式
  10. 网卡调优RSS、RPS、RFS和XPS
  11. android3d地图,百度地图Android版 新增卫星图及3D模式
  12. Mindjet MindManager2022版本自带简体中文,无需汉化
  13. mysql 99乘法表_MySQL 通过sql输出99乘法表
  14. 急!灾区的食物依然短缺!(找不到原题出处只能这样了.....)
  15. vue项目内存溢出的解决
  16. 弘辽科技:拼多多关键词出价多少好?出价方法有哪些?
  17. java phrase_java-Maven无法部署工件,ReasonPhrase:Forbidden
  18. 移相信号发生器 课程设计 电赛 正弦波发生 相位调节
  19. 直流无刷电机极对数图解(simulink)
  20. OpenFaaS实战之二:函数入门

热门文章

  1. centos7 mysql 5.6.38_centos7.4 安装mysql 5.6.38
  2. open wrt 跟换主题_Openwrt编译进阶-修改密码、路由连接数、时区及主题
  3. mysql 错误1136_mysql,_MySQL错误:Error Code: 1136,mysql - phpStudy
  4. 安全起见,这款 IDEA 插件赶紧删了吧!
  5. JWT 和 JJWT,别再傻傻分不清了!
  6. 皮一皮:这是为什么呢???
  7. 皮一皮:我也想做这样的房东,善解人意、为他人着想...
  8. 别在用U盘拷贝源码带回家了,有童鞋被判刑啦!
  9. 七夕保命攻略,各位兄弟请收好!
  10. 阿里云1C2G虚拟机【99/年】羊毛党集合啦!