gpiolib注册过程
1,gpiolib的初始化和注册在mach-xxx.c文件中板卡硬件结构体的map_io函数中完成
2,s5pv210_gpio_init函数中s5pv210_gpio_4bit是一个s3c_gpio_chip类型的全局数组,在mach-s5pv210/gpiolib.c中定义,这个结构体数组就是用来向gpiolib注册对应端口的。并对这个结构体数组的config和base成员变量进行了初始化,其中base成员变量记录了每个端口(chip)的基地址(虚拟地址)。
s5pv210_gpio_4bit变量定义时初始化了一部分成员变量,如每个端口(chip)的基础编号、gpio个数、端口名和中断号。
3,s3c_gpio_chip结构体的定义如下,这个结构体中记录了一个gpio端口的信息,如端口名、基地址、基础编号、端口的gpio个数、设置输入模式函数、设置输出模式函数、获取gpio值函数、设置gpio值函数等等。
chip成员变量为gpio_chip结构体类型,其成员变量意义如下:
label 端口名
requst 申请函数
free 释放函数
direction_input 设置输入模式函数
get 获取gpio值函数
direction_output 设置输出函数
set 设置gpio值函数
base 基础序号
ngpio 端口gpio个数
config成员变量时s3c_gpio_cfg类型大的指针,主要作用是记录gpio的上下拉函数。
pm成员变量是s3c_gpio_pm类型的指针,记录了电源管理的掉电保存状态函数,和上电恢复状态函数。
base成员变量记录了端口的基地址(虚拟地址)。
4,s5pv210_gpio_init调用samsung_gpiolib_add_4bit_chips函数完成gpiolib的注册,就是将s5pv210_gpio_4bit这个数组注册给gpiolib,其中nr_chips为s5pv210_gpio_4bit的大小。
5,samsung_gpiolib_add_4bit_chips函数通过轮询的方式遍历s5pv210_gpio_4bit数组,并调用samsung_gpiolib_add_4bit和s3c_gpiolib_add函数,完成每个chip(端口)的注册。其中samsung_gpiolib_add_4bit函数是对s5pv210_gpio_4bit数组的进一步初始化,s3c_gpiolib_add函数完成了真正的注册。
6,samsung_gpiolib_add_4bit函数给chip的direction_input和direction_output函数赋值,这两个函数通过s3c_gpio_chip结构中记录的base基地址,偏移得到control寄存器的地址,并设置gpio的输入输出模式。
7,s3c_gpiolib_add函数首先由对s5pv210_gpio_4bit数组对应的端口进行了初始化,如果gpio的控制寄存器为2bit,将会使用在这里给input和output函数赋值;然后给chip(端口)的set和get函数赋值。
最后通过gpiochip_add向gpiolib注册这个chip,gpiochip_add函数是gpiobil提供给芯片厂商的一个注册接口,在driver/gpio/gpiolib.c文件中定义。
8,gpiochip_add函数,gpiolib通过数组来记录每个gpio的描述符,这个函数将之前在三星gipo驱动中初始化好gpio_chip的值赋值给每个gpio的描述符。
参考韦东山,朱友鹏课程所做笔记。