博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
gpio_get_value的定义
阅读量:4181 次
发布时间:2019-05-26

本文共 2435 字,大约阅读时间需要 8 分钟。

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://ivhai.baihongyu.com/

你可能感兴趣的文章
简析java字节流和字符流
查看>>
TomCat的工作原理和端口理解
查看>>
系统吞吐量、TPS(QPS)、用户并发量、性能测试概念和公式
查看>>
SVN分支与合并透析
查看>>
TCP协议中的三次握手和四次挥手(图解)
查看>>
浏览器缓存详解:expires,cache-control,last-modified,etag详细说明
查看>>
java内存泄漏
查看>>
HttpClient教程
查看>>
Intellij IDEA【模拟http请求】
查看>>
四种常见的 POST 提交数据方式
查看>>
REST简介
查看>>
JAVA中重写equals()方法为什么要重写hashcode()方法?
查看>>
SimpleDateFormat线程不安全
查看>>
eclipse下生成Java类图和时序图,生成UML图
查看>>
M文件程序设计(matlab)
查看>>
matlab基础知识
查看>>
程序员的职业素养
查看>>
一道面试题深入了解java底层
查看>>
java下载附件
查看>>
cron表达式每个月最后一天
查看>>