高通GPIO驱动(DTS方式)

gpio调试的方式有很多,linux3.0以上ARM架构的处理器基本上都采用了DTS的方式,在linux3.0可以通过获取sysfs的方式来获取gpio状态;

sysfs文件系统的建立可以参照下面的博客:http://www.cnblogs.com/linhaostudy/p/8377895.html

一、GPIO的调试方法:

 在Linux下,通过sysfs,获取gpio状态,也可以操作gpio。

1、获取gpio状态,实质上就是调用show函数

        cd /sys/kernel/debug/

        cat gpio

2、echo 'value' > value        //设置gpio寄存器值

二、在kernel代码中操作gpio

 在代码中有两种方式操作gpio,一种是一次申请单个gpio,通过设备树,成功后操纵该gpio,另一种是使用pinctrl子系统,通过设备树设置,一次操作多个gpio。

 2.1 直接操作GPIO:

因为GPIO一般都是平台设备驱动,一般设备树挂载的节点都可以在&soc下:

1 device_node {
2                 ...
3                 gpio_name = <&msm_gpio 99 0>;    //gpio_99
4                 ...
5 }

驱动代码:

1      int gpio_99 = of_get_named_gpio_flags(dev->of_node, "gpio_name", 0, NULL);    //从设备数节点, 可选
2         gpio_request(gpio_99, "gpio_name");        //通过gpio号申请gpio
3         gpio_direction_output(gpio_99, 1);            //设置gpio_99输出,初始值为1
4         gpio_set_value(gpio_99, 0);                    //设置gpio_99值为0
5         gpio_free(gpio_99);                                //gpio_99不再使用后应当释放

gpio的申请和设置都可能会出现失败的情况,应该做好异常处理;;

2.2 pinctrl子系统设备树:

Pin Control Subsystem是Linux内核抽象出的一套用于控制硬件引脚的一套子系统。比上面的方式多了许多配置GPIO的方式,例如配置电流(可以用于睡眠唤醒的功能),管理pin脚的复用,接口规格等功能;蜗窝科技的大牛们就有几篇写的很好:

linux内核中的GPIO系统之(1):软件框架

linux内核中的GPIO系统之(2):pin control subsystem

Linux内核中的GPIO系统之(3):pin controller driver代码分析

linux内核中的GPIO系统之(4):pinctrl驱动的理解和总结

linux内核中的GPIO系统之(5):gpio subsysem和pinctrl subsystem之间的耦合

DTS代码:

1  device_node {
2                     ...
3                     pinctrl-names = "gpio_active", "gpio_sleep";    //分别对用pinctrl-0和pinctrl-1
4                     pinctrl-0 = <&gpio_active>;                               //引用
5                     pinctrl-1 = <&gpio_sleep>;                                //引用
6                     ...
7         };

驱动代码:

1      struct pinctrl *pinctrl = devm_pinctrl_get(device);    //获取device对应节点下的pinctrl
2         struct pinctrl_state = pinctrl_lookup_state(pinctrl, "gpio_active");    //通过pinctrl名获取pinctrl对应状态
3         pinctrl_select_state(pinctrl, pinctrl_state);        //设置pinctrl的状态为'gpio_active
4         devm_pinctrl_put(pinctrl);          //使用完了释放资源

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏散尽浮华

DNS之BIND使用小结(Forward转发)

之前详细介绍了DNS及其在linux下的部署过程,今天再说下DNS的BIND高级特性-forwarder转发功能。比如下面一个案例: 1)已经在测试环境下部署了...

1033
来自专栏杨建荣的学习笔记

Greenplum集群主机名问题及修复

昨天写了一篇Greenplum数据仓库迁移小记,看起来一起都在计划中,一切都在掌握中,今天早上的时候,统计组的同学反馈说写入GP的时候报了下面的错误。

792
来自专栏枕边书

Gotorch - 多机定时任务管理系统

前言 最近在学习 Go 语言,遵循着 “学一门语言最好的方式是使用它” 的理念,想着用 Go 来实现些什么,刚好工作中一直有一个比较让我烦恼的问题,于是用 Go...

3389
来自专栏xingoo, 一个梦想做发明家的程序员

Log4j官方文档翻译(一、基本介绍)

简介 log4j是使用java语言编写的可靠的、快速的、灵活的日志框架,它是基于Apache的license。 log4j支持c,c++,c#,perl,...

1695
来自专栏比原链

剥开比原看代码06:比原是如何把请求区块数据的信息发出去的

Gitee地址:https://gitee.com/BytomBlockchain/bytom

573
来自专栏北京马哥教育

LINUX上MYSQL优化三板斧

云豆贴心提醒,本文阅读时间7分钟 现在MySQL运行的大部分环境都是在Linux上的,如何在Linux操作系统上根据MySQL进行优化,我们这里给出一些通用简...

2577
来自专栏Golang语言社区

Golang测试技术

本篇文章内容来源于Golang核心开发组成员Andrew Gerrand在Google I/O 2014的一次主题分享“Testing Techniques”,...

3637
来自专栏数据之美

迷之 crontab 异常:不运行、不报错、无日志

1、背景 前几天新同学入职,一不小心将跳板机上的 crontab 清空了,导致凌晨一大批任务异常,同事问了运维同学也没有备份,这一百多个任务要是恢复起来可不是件...

3536
来自专栏我的小碗汤

maven最佳实践之模块划分

controller为控制器层;service为业务逻辑实现层;dao和数据库交互;util放些工具类;constant放常量类。

532
来自专栏轮子工厂

关于操作系统的一些事,这些你应该要知道~

764

扫描关注云+社区