gpio_get_value等一系列函数,并非Linux标准函数,而是跟硬件相关的。 通常我们说的driver都是跟外围设备相关的,所以需要我们自己开发,但是这次我们说到的gpio是跟soc相关的,其实也是需要自己定义的,只不过这个自己变成了soc的provider,比如高通,intel等等

a)接口定义在.h文件

有每个cpu平台都有自己定义的gpio_get_value,要继续查看到底是哪个.h文件,要看你现在用的是哪个cpu平台

例如:intel:就是x86

Gpio.h (z:\jb_intel\hardware\intel\linux-2.6\arch\x86\include\asm)

b)具体实现在drivers\gpio里面

==============>

gpio driver:

drivers\gpio

里面有各种平台的gpio.c文件,查看makefile,

根据build 之后生成config,发现只有2个是被编译的,
一个是gpiolib.c,这个是通用的,不是平台相关的
另一个是,比如:obj-$(CONFIG_GPIO_LANGWELL) += langwell_gpio.o

==============>

gpiolib.c

int __gpio_get_value(unsigned gpio) { struct gpio_chip*chip; int value;
chip = gpio_to_chip(gpio); WARN_ON(chip->can_sleep); value = chip->get ? chip->get(chip, gpio - chip->base) : 0;

我们最终要进入到get函数中,去进一步查看。但是首先要知道,是哪个chip的get 函数, 这个由上面的红色语句gpio_to_chip(gpio);得出 trace_gpio_value(gpio, 1, value); return value; } EXPORT_SYMBOL_GPL(__gpio_get_value);

其中语句:chip = gpio_to_chip(gpio);是为了得到当前的chip,进入她的函数定义里面查看

static inline struct gpio_chip *gpio_to_chip(unsigned gpio) { return gpio_desc[gpio].chip; }

继续查看gpio_desc 是从哪里来的,发现有个gpiochip_add 函数 有如下语句:

gpio_desc[id].chip = chip;

继续查看gpiochip_add被谁调用, 发现很多个gpio文件中有gpiochip_add,但是由于我们通过config文件已经知道,是:

obj-$(CONFIG_GPIO_LANGWELL) += langwell_gpio.o

langwell_gpio.c

发现调用gpiochip_add的地方有2处:

1: platform_driver wp_gpio_driver (name=wp_gpio) 的probe函数

2:    pci_driver lnw_gpio_driver (name=langwell_gpio) 的probe函数

因为是x86平台我们可以猜想,应该是2,但是我们还是可以验证一下

把设备连上pc,adb 进入

sys/bus/pci/drivers/ 下有个langwell_gpio

sys/bus/platform/drivers/下没有wp_gpio

可以证实,我们用的是2

继续查看probe 2 发现:lnw->chip.get = lnw_gpio_get;

由此得知:

gpio_get_value在intel平台上 最终调用了 lnw_gpio_get 来说实现。

========================================================================================================

以上部分仍然处于 对接口的定义阶段,下面我们来看看具体 是怎么实现的

static int lnw_gpio_get(struct gpio_chip *chip, unsigned offset) { void __iomem *gplr = gpio_reg(chip, offset, GPLR);//应该是映射   gpio对应的要操作的寄存器GPLR  的地址空间: GPLR, refer to  intel的spec, 一个寄存器:Monitor Pin State。
return readl(gplr) & BIT(offset % 32);//读取GPLR寄存器之后,由于每个bit都代表一个gpio,所以与上BIT(该位gpio);

//通过spec可知,Note: There are a total of 94 configurable Always-On GPIOs on GPIO controller 0. There is no gp_aon_15.

//There are a total of 69 configurable GPIOs on GPIO controller 1. There is no gp_core[5..0], GP_Core[11..8], gp_core_[25..23] and gp_core[34] }

=======================================================================================

动态更改 gpio function:

lnw_gpio_set_alt

 

http://blog.csdn.net/tangkegagalikaiwu/article/details/8615995

gpio_get_value的定义 (转)的更多相关文章

  1. 超文本传输协议-HTTP/1.1

    超文本传输协议-HTTP/1.1(修订版) ---译者:孙超进本协议不限流传发布.版权声明Copyright (C) The Internet Society (1999). All Rights R ...

  2. 【.net 深呼吸】细说CodeDom(4):类型定义

    上一篇文章中说了命名空间,你猜猜接下来该说啥.是了,命名空间下面就是类型,知道了如何生成命名空间的定义代码,之后就该学会如何声明类型了. CLR的类型通常有这么几种:类.接口.结构.枚举.委托.是这么 ...

  3. 为.NET Core项目定义Item Template

    作为这个星球上最强大的IDE,Visual Studio不仅仅提供了很多原生的特性,更重要的是它是一个可定制的IDE,比如自定义Project Template和Item Template就是一个非常 ...

  4. B样条基函数的定义和性质

    定义:令U={u0,u1,…,um}是一个单调不减的实数序列,即ui≤ui+1,i=0,1,…,m-1.其中,ui称为节点,U称为节点矢量,用Ni,p(u)表示第i个p次(p+1阶)B样条基函数,其定 ...

  5. JavaScript 常量定义

    相信同学们在看见这个标题的时候就一脸懵逼了,什么?JS能常量定义?别逗我好吗?确切的说,JS当中确实没有常量(ES6中好像有了常量定义的关键字),但是深入一下我们可以发现JS很多不为人知的性质,好好利 ...

  6. Objective-C枚举的几种定义方式与使用

    假设我们需要表示网络连接状态,可以用下列枚举表示: enum CSConnectionState { CSConnectionStateDisconnected, CSConnectionStateC ...

  7. 深入理解javascript函数定义与函数作用域

    最近在学习javascript的函数,函数是javascript的一等对象,想要学好javascript,就必须深刻理解函数.本人把思路整理成文章,一是为了加深自己函数的理解,二是给读者提供学习的途径 ...

  8. 编译器开发系列--Ocelot语言4.类型定义的检查

    这里主要介绍一下检查循环定义的结构体.联合体.是对成员中包含自己本身的结构体.联合体进行检查.所谓"成员中包含自己本身",举例来说,就是指下面这样的定义. struct point ...

  9. JQuery插件定义

    一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写$("#"),$("."),写了几年就对别人说非常熟悉JQuery.我曾经也是这样的人 ...

随机推荐

  1. SNMP学习笔记之SNMPWALK 命令

    SNMPWALK是一个通过SNMP GET-NEXT类型PDU,实现对目标AGENT的某指定MIB分支信息进行完整提取输出的命令工作. 命令行: snmpwalk [选项] agent [oid] 选 ...

  2. Linux基础入门第三节(修改)

    第三节 作业部分 添加一个用户loutest,使用sudo创建文件/opt/forloutest,设置成用户loutest可以读写.截图并把操作过程写入实验报告. 找到了解决的办法,在touch命令前 ...

  3. UVa 10491 奶牛和轿车(全概率公式)

    https://vjudge.net/problem/UVA-10491 题意: 假设有a头牛,b辆车,在最终选择前主持人会替你打开c个有牛的门,输出"总是换门"的策略下,赢得车的 ...

  4. shell 设置超时时间

    等待20s后退出 a= b= while(true) do if [ $a -eq $b ] then echo "20s !!!" break else if [[ true ] ...

  5. python 获取5天前的日期

    from datetime import date, timedelta dt = date.today() - timedelta() print('Current Date :',date.tod ...

  6. [转]Cryengine渲染引擎剖析

    转篇Napoleon314 大牛的分析,排版好乱,见谅,耐心读,这是个好东西,注意看他自己的实现,是个技术狂人啊,Ogre焕发次时代的光芒啊~~~努力 ------------------------ ...

  7. Android多个Module统一配置相同jar或库的版本号

    Android Studio多个Module依赖相同的库时对版本号进行统一配置 在Android项目中,一个项目经常会依赖其他的一个甚至多个库文件,在这种依赖的时候最常见的一个错误就是 jar包版本不 ...

  8. [java]No qualifying bean of type 解决方法

    1.错误原因:注解写错 2.原理如下: 现在的spring早就已经摆脱了之前一堆xml配置文件的情况,都是通过注解配置的方式进行依赖注入了,通常情况下,我们会有一个配置类,然后通过Annotation ...

  9. docker 安装mysql mongo

    Docker安装Mysql 1.拉取镜像 docker pull mysql/mysql-server 2.运行mysql docker run -d -p : --name [Name] [Imag ...

  10. UVALive-2966 King's Quest(强连通+二分图匹配)

    题目大意:有n个男孩和和n个女孩,已只每个男孩喜欢的女孩.一个男孩只能娶一个女孩.一个女孩只能嫁一个男孩并且男孩只娶自己喜欢的女孩,现在已知一种他们的结婚方案,现在要求找出每个男孩可以娶的女孩(娶完之 ...