gpio_get_value的定義 (轉)


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM