5.4.13、从驱动框架角度再来分析一下gpiolib

5.4.13.2、从驱动框架角度再来分析一下gpiolib
(1)之前的分析已经告一段落,截至目前我们已经搞清楚了gpiolib的建立工程。但是这只是整个gpiolib建立的一部分,是厂商驱动工程师负责的那一部分;还有另一部分是内核开发者提供的驱动框架的那一部分,就是我们后面要去分析的第2条主线。
(2)drivers/gpio/gpiolib.c这个文件中所有的函数构成了我们第2部分,也就是内核开发者写的gpiolib框架部分。这个文件中提供的函数主要有以下部分:
gpiochip_add: 是框架开出来的接口,给厂商驱动工程师用,用于向内核注册我们的gpiolib
gpio_request: 是框架开出来的接口,给使用gpiolib来编写自己的驱动的驱动工程师用的,
驱动中要想使用某一个gpio,就必须先调用gpio_request接口来向内核的gpiolib部分申请,得到允许后才可以去使用这个gpio。
gpio_free: 对应gpio_request,用来释放申请后用完了的gpio
gpio_request_one/gpio_request_array: 这两个是gpio_request的变种
gpiochip_is_requested: 接口用来判断某一个gpio是否已经被申请了
gpio_direction_input/gpio_direction_output: 接口用来设置GPIO为输入/输出模式,
注意该函数内部实际并没有对硬件进行操作,只是通过chip结构体变量 函数指针调用了将来SoC厂商的驱动工程师写的真正的操作硬件实现gpio设置成输出模式的那个函数。

以上的接口属于一类,这些都是给写其他驱动并且用到了gpiolib的人使用的

剩下的还有另外一类函数,这类函数是gpiolib内部自己的一些功能实现的代码

首先要了解一下linux内核工程师给我们开发的接口:
文件:/drivers/gpio/gpiolib.c文件中提供所有的接口
1:gpio_request:向内核申请gpio
int gpio_request(unsigned gpio, const char label)
2:gpio_free对应gpio_request,是使用完gpio以后把gpio释放掉
void gpio_free(unsigned gpio)
3:gpiochip_add:向内核注册gpio
int gpiochip_add(struct gpio_chip
chip)
4:gpio_request_one 申请gpio
int gpio_request_one(unsigned gpio, unsigned long flags, const char label)
5:gpio_request_one申请gpio
int gpio_request_one(unsigned gpio, unsigned long flags, const char
label)
6:gpiochip_is_requested:用来看gpio是否已经使用
const char gpiochip_is_requested(struct gpio_chip chip, unsigned offset)
7:gpio_direction_input :设置gpio输入
int gpio_direction_input(unsigned gpio)
8:gpio_direction_output:gpio输出
int gpio_direction_output(unsigned gpio, int value)
9:__gpio_get_value :获取寄存器的值 这里注意由于前面加了__是内核用的函数所以我们不能用这个函数
在/arch/arm/mach-s5pv210/include/mach/gpio.h中定义了以下宏;所以我们使用的时候直接包含这个头文件使用gpio_get_value 函数即可

define gpio_get_value __gpio_get_value

define gpio_set_value __gpio_set_value

define gpio_cansleep __gpio_cansleep

define gpio_to_irq __gpio_to_irq
int __gpio_get_value(unsigned gpio)
10:__gpio_get_value :设置寄存器的值
int __gpio_get_value(unsigned gpio)

猜你喜欢

转载自www.cnblogs.com/Ocean-Star/p/9245160.html