接上篇:https://blog.csdn.net/wangweijundeqq/article/details/101697268
目录
13.1、gpiolib的attribute部分(稍微有点复杂)
八.linux内核的gpiolib学习1
8.1、gpiolib学习重点
8.2、gpiolib的学习方法
8.3、主线1:gpiolib的建立
截图取之https://blog.csdn.net/tongxinv/article/details/54790792
s5pv210_gpiolib_init 这个函数就是我们 gpiolib 初始化的函数
路径为: ......\kernel\arch\arm\mach-s5pv210\mach-x210.c
九.linux内核的gpiolib学习2
9.1、struct s3c_gpio_chip
(1)这个结构体是一个GPIO端口的抽象,这个结构体的一个变量就可以完全的描述一个IO端口。
(2)端口和IO口是两个概念。S5PV210有很多个IO口(160个左右),这些IO口首先被分成N个端口(port group),然后每个端口中又包含了M个IO口。譬如GPA0是一个端口,里面包含了8个IO口,我们一般记作:GPA0_0(或GPA0.0)、GPA0_1、
(3)内核中为每个GPIO分配了一个编号,编号是一个数字(譬如一共有160个IO时编号就可以从1到160连续分布),编号可以让程序很方便的去识别每一个GPIO。
9.2、s5pv210_gpio_4bit
(1)这个东西是一个结构体数组,数组中包含了很多个struct s3c_gpio_chip类型的变量。
s5pv210_gpio_4bit(其实2个参数分别是数组名和数组元素个数),这个数组中其实就包含了当前系统中所有的IO端口的信息(这些信息包含:端口的名字、端口中所有GPIO的编号、端口操作寄存器组的虚拟地址基地址、端口中IO口的数量、端口上下拉等模式的配置函数、端口中的IO口换算其对应的中断号的函数)。
十.linux内核的gpiolib学习3
10.1、S5PV210_GPA0宏
(1)这个宏的返回值就是GPA0端口的某一个IO口的编号值,传参就是我们这个IO口在GPA0端口中的局部编号。
分析 S5PV210_GPIO_A1_START= S5PV210_GPIO_NEXT(S5PV210_GPIO_A0), 的值
#define S5PV210_GPIO_NEXT(__gpio) \
((__gpio##_START) + (__gpio##_NR) + CONFIG_S3C_GPIO_SPACE + 1)
#define S5PV210_GPIO_NEXT(__gpio) \
((S5PV210_GPIO_A0_START) + (S5PV210_GPIO_A0_NR) + CONFIG_S3C_GPIO_SPACE + 1)
CONFIG_S3C_GPIO_SPACE 前面有 CONFIG, 表明内核里面应该没有, 这是.config 文件中的
root@wwj:~/driver/kernel# vi .config
#define S5PV210_GPIO_NEXT(__gpio) \
((__gpio##_START) + (__gpio##_NR) + CONFIG_S3C_GPIO_SPACE + 1)
= 0 + 8 + 0 + 1 = 9 (9+4+0+1=14)
所以我们在开发板中看到 gpiochip0 下来就是 gpiochip9->gpiochip14, 依次类推, 如下图: