四.驱动框架入门之LED(下)

接上篇:https://blog.csdn.net/wangweijundeqq/article/details/101697268目录八.linux内核的gpiolib学习18.1、gpiolib学习重点8.2、gpiolib的学习方法8.3、主线1:gpiolib的建立九.linux内核的gpiolib学习29.1、struct s3c_gpio_chip9.2...
摘要由CSDN通过智能技术生成

接上篇:https://blog.csdn.net/wangweijundeqq/article/details/101697268

目录

八.linux内核的gpiolib学习1

8.1、gpiolib学习重点

8.2、gpiolib的学习方法

8.3、主线1:gpiolib的建立

九.linux内核的gpiolib学习2

9.1、struct s3c_gpio_chip

9.2、s5pv210_gpio_4bit

十.linux内核的gpiolib学习3

10.1、S5PV210_GPA0宏

十一.linux内核的gpiolib学习4

11.1、几个问题

11.2、函数调用关系

十二.linux内核的gpiolib学习5_6

12.1、s3c_gpiolib_add

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

十三.linux内核的gpiolib学习7

13.1、gpiolib的attribute部分(稍微有点复杂)

13.2、 相关代码分析

十三.使用gpiolib完成led驱动

13.1、流程分析

13.2、代码实践

十四.将驱动添加到内核中

14.1、驱动的存在形式

14.2、驱动开发的一般步骤

14.3、实践


八.linux内核的gpiolib学习1

8.1、gpiolib学习重点

(1)gpiolib的建立过程

(2)gpiolib的使用方法:申请、使用、释放

(3)gpiolib的架构:涉及哪些目录的哪些文件

8.2、gpiolib的学习方法

(1)以一条主线进去,坚持主线

(2)中途遇到杂碎知识,彻底搞定之,然后继续主线

(3)随时做笔记以加深理解和记忆

(4)学习途中注意架构思想,提升自己大脑的空间复杂度

8.3、主线1:gpiolib的建立

截图取之https://blog.csdn.net/tongxinv/article/details/54790792

(1)找到目标函数

smdkc110_map_io函数

s5pv210_gpiolib_init 这个函数就是我们 gpiolib 初始化的函数

路径为: ......\kernel\arch\arm\mach-s5pv210\mach-x210.c

九.linux内核的gpiolib学习2

9.1、struct s3c_gpio_chip

先分析 sec_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)

而 S5PV210_GPIO_A0_NR 的定义为:

表示 A0 端口到底有多少个。

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)

最后+1 是为了在每个端口之间用一个空号隔开。

所以我们在开发板中看到 gpiochip0 下来就是 gpiochip9->gpiochip14, 依次类推, 如下图:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值