迅为4412开发板Linux驱动教程之GPIO的初始化
视频下载地址:http://pan.baidu.com/s/1c06oiti
GPIO的初始化
• 在内核源码目录下使用命令“ls drivers/gpio/*.o”,可以看到“gpio-exynos4”被编译进了内核
– 生成.o文件代表最终被编译进了内核
– 除了menuconfig配置文件,还可以通过.o文件来判定该文件是否编译进了
内核
• 在“gpio-exynos4.c”文件最下面一行
– core_initcall(exynos4_gpiolib_init);
– core_initcall代表在linux初始化过程中会调用
– 初始化函数是在源码目录下“include/linux/init.h”文件中定义的,该头文件
中定义了一系列的初始化函数,在linux启动的过程中会按等级
结构体exynos4_gpio_common_4bit
• 以有带有label= "GPL2"的结构体为例
• .base = (S5P_VA_GPIO2 + 0x100)
– 表示偏移地址和虚拟地址相加
• .eint_offset = 0x20
– 表示中断部分,介绍中断的时候再讲(IO口可以配置为中断模式)
• .group = 22
– 给GPIO分组
• chip.base = EXYNOS4_GPL2(0),
– 宏定义EXYNOS4_GPL2(0)赋值给初始化函数
• chip.ngpio = EXYNOS4_GPIO_L2_NR
– 表示这一小组中有几个GPIO
• chip.label = "GPL2",
– 程序员需要关心的标志
• 宏定义EXYNOS4_GPL2(0)分析
– EXYNOS4_GPL2(_nr) (EXYNOS4_GPIO_L2_START + (_nr))
– 枚举GPIO
– EXYNOS4_GPIO_L2_START= EXYNOS4_GPIO_NEXT(EXYNOS4_GPIO_L1)
– EXYNOS4_GPIO_NEXT宏定义
– #define EXYNOS4_GPIO_NEXT(__gpio) \ ((__gpio##_START) + (__gpio##_NR)
+ CONFIG_S3C_GPIO_SPACE + 1)
• GPIO的数量EXYNOS4_GPIO_L2_NR
– 可以通过手册查到
• S5P_VA_GPIO2
– 虚拟地址
• 查找S5P_VA_GPIO2宏定义,可以看到所有的GPIO被分为4个bank,这
个和datasheet上面是一致的。
– S5P_VA_GPIO1
– S5P_VA_GPIO2 S3C_ADDR(0x02240000)
– S5P_VA_GPIO3
– S5P_VA_GPIO4
• 查找到S3C_ADDR宏定义
– #define S3C_ADDR(x) (S3C_ADDR_BASE + (x))
• 查找到S3C_ADDR_BASE宏定义,这是一个虚拟地址,可以看出,地址
范围超出了1G或者2G内存的范围
– #define S3C_ADDR_BASE 0xF6000000
物理地址和虚拟地址的映射关系
• 虚拟地址和物理地址映射
– 虚拟地址一般很好查找,一般在平台相关gpio的文件中就可以找到宏定义
• 在source insight中搜索关键字“S5P_VA_GPIO2”,看看那里用到了这个
宏定义。搜索时间会比较长,1-5分钟吧。
• 搜索出来之后,可以看到除了gpio-exynos4.c文件中使用,cpu-exynos
中也使用了,这是一个平台文件
• 映射数组如下图所示
• 结构体解释
– .virtual = (unsigned long)S5P_VA_GPIO2,表示虚拟地址
– .pfn = __phys_to_pfn(EXYNOS4_PA_GPIO2),表示物理地址
– .length = SZ_4K,表示映射的宽度
– .type = MT_DEVICE,
• 查找到宏定义EXYNOS4_PA_GPIO2
– #define EXYNOS4_PA_GPIO2 0x11000000
– 这个物理地址0x11000000就是
GPIO的初始化流程
• 初始化过程简单描述
– 平台文件分别定义好物理地址和虚拟地址
– 物理地址和虚拟地址之间映射
• 在初始化中,引入了程序员需要使用的GPIO宏定义,并将宏定义装入
chip结构体中
GPIO的调用函数
• 例如头文件gpio-cfg.h中s3c_gpio_cfgpin函数。这个函数是给GPIO做配
置,第一个参数是宏EXYNOS4_GPL2(0),第二个是配置的状态参数
– 配置头文件在arm/arm/plat-samsung/include/plat/gpio-cfg.h
• 查找该函数,可以看到进入函数就会调用chip结构体
– s3c_gpiolib_getchip,这个函数通过pin调用之后,会返回s3c_gpios[chip] 的
参数
– exynos4_gpio_common_4bit[]和s3c_gpios都是结构体s3c_gpio_chip类型的
数据
– 然后计算偏移地址等等一系列操作,这一部分是linux内核以及三星平台完
成的,具体细节不用管。
• 也就是我们控制GPIO的时候,可以通过GPIO的一些处理函数加上类似
EXYNOS4_GPL2(0)的宏定义,就可以操作GPIO
• 后面再具体介绍GPIO操作中,常用函数的使用
常见问题
• 不是说好的分页大小要一样,怎么GPIO经过mmu处理的时候,又有
SZ_256又有SZ_4K?
– 实际上CPU查找地址的时候,仍旧是通过内存。mmu本身不保存具体的数
据,主要是提供一个虚拟地址和物理地址的表格,表格中还有字段的长
度。这个分页和mmu没什么关系,是CPU内存以及物理地址之间通信使用
的概念。这个只是一个抽象的概念,理解mmu只是一个表格,CPU对GPIO
的操作就很好理解了。
• 内部寄存器不是很快么,CPU为什么不直接读取?
– 内部寄存器是很快,但是相对于CPU还是非常慢。CPU处理数据是将内存
中一大段一大段处理,如果单个的读取内部寄存器的值,对CPU是极大的
浪费。把内部寄存器也看成“特殊的物理地址”即可。
• 只讲了虚拟地址和物理地址对应数组,怎么没介绍哪里调用了?
– 大家可以看一下函数ioremap,linux会调用这个函数来实现gpio的映射关
系
– 今天讲的已经够多够深入了,大家只要能够理解这么一层意思就可以了
,这个东西对我们实际写驱动的帮助其实不是那么大!
• 如果我还是理解不了“对宏定义EXYNOS4_GPL2(0)的操作就是对4412芯
片管脚AC21寄存器的操作”,怎么办?
– 记住这个结论,能够将宏变量EXYNOS4_GPL2(0)和GPL这一组GPIO的第0位
寄存器联想起来。
– 后面跟着我依葫芦画瓢,不影响大家实际写程序,有兴趣再回过头理解
迅为4412开发板Linux驱动教程之GPIO的初始化的更多相关文章
- 迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解
本文转自:http://www.topeetboard.com 视频下载地址: 驱动注册:http://pan.baidu.com/s/1i34HcDB 设备注册:http://pan.baidu.c ...
- 迅为4412开发板Linux驱动教程——编写简单应用调用驱动
Linux驱动教程:http://pan.baidu.com/s/1c0hljUS 编写简单应用调用驱动--头文件 • 打印头文件 – include <stdio.h>调用打印函数pri ...
- 迅为4412开发板Linux驱动教程——总线_设备_驱动注冊流程具体解释
视频下载地址: 驱动注冊:http://pan.baidu.com/s/1i34HcDB 设备注冊:http://pan.baidu.com/s/1kTlGkcR 总线_设备_驱动注冊流程具体解释 • ...
- 迅为4412开发板Linux驱动教程/硬件知识及原理图的使用
视频教程下载地址:http://pan.baidu.com/s/1pJwxUfL 嵌入式研发流程介绍 • PCB研发流程介绍 – 方案,原理图(网表) – layoutproject师(gerber文 ...
- 迅为4412开发板Linux设备树的镜像烧写和源码简单优化教程
1 烧写: 烧写和4412默认镜像的烧写类似,使用fastboot. 先更新uboot,用4412默认uboot更新支持设备树的uboot 用支持设备树的uboot烧写. 进入支持设备树的uboo ...
- 【4412开发板使用经验分享】迅为4412开发板I2C驱动问题
本文转自迅为论坛:bbs.topeetboard.com 我想写DS3231 的驱动 但是读回的数据老是-6 硬件: 我I2C设备连接的这几个GPIO,看了2.5的手册,接口应该是链接正确的 软件 分 ...
- 迅为4412开发板QtE系统源码-屏幕横竖屏切换修改方法
迅为4412开发板QtE系统源码-屏幕横竖屏切换修改方法 详情了解:http://topeetboard.com 更多了解:https://arm-board.taobao.com/ 用户在开发板上运 ...
- [转帖]迅为4412开发板最小linux系统的存储空间修改
本文转自迅为论坛:http://www.topeetboard.com 最小linux系统的存储空间修改以修改成 1G 存储空间为例来修改,如果需要改成其他大小的存储空间,参照此方法修改即可. 首先连 ...
- 【学习/研发】嵌入式Linux/Android开发有它就够了——迅为4412开发板
网站:http://www.topeetboard.com 光盘资料+网盘资料+配套视频+售后支持,助您加速学习研发的进程 产品介绍 iTOP-Exynos4412开发板采用 Exynos4412的主 ...
随机推荐
- webservice 原理
webservice 原理1.soap协议,其实就是用http协议来传输xml格式的数据,可以post,get.一般有post.2.服务端有:本地程序代码(也不是dll)和xml格式的文件用来描述dl ...
- C# 快速反射 IL
public class FastInvoke { public delegate object FastInvokeHandler(object target, object[] paramters ...
- [PE结构分析] 5.IMAGE_OPTIONAL_HEADER
结构体源代码如下: typedef struct _IMAGE_OPTIONAL_HEADER { // // Standard fields. // +18h WORD Magic; // 标志字, ...
- 泛函编程(9)-异常处理-Option
Option是一种新的数据类型.形象的来描述:Option就是一种特殊的List,都是把数据放在一个管子里:然后在管子内部对数据进行各种操作.所以Option的数据操作与List很相似.不同的是Opt ...
- php多版本管理phpenv
曾经有试过phpbrew的童鞋应该知道有多复杂 虽然这个好久没更新了,还是可以用的-- github:phpenv/phpenv 它的原理就是处理PATH变量,将你要求的php版本的路径加到PATH的 ...
- linux 下 整合 nginx 和 php
一.整合nginx 和 PHP: # vi /usr/local/php/etc/php-fpm.conf 如果该文件不存在,有可能是默认的php-fpm.conf.default 可以使用命令拷贝一 ...
- Android笔记——Android中数据的存储方式(三)
Android系统集成了一个轻量级的数据库:SQLite,所以Android对数据库的支持很好,每个应用都可以方便的使用它.SQLite作为一个嵌入式的数据库引擎,专门适用于资源有限的设备上适量数据存 ...
- Erlang进程间消息接收超时设定
Erlang消息接收函数,一般都会设计成尾递归调用自己的模式.但是这样的模式,如果没有消息则会无限的等待下去,所以为了不无限等待,这里可以加个超时设定,例如: flush() -> re ...
- 利用Jquery使用HTML5的FormData属性实现对文件的上传
1.利用Jquery使用HTML5的FormData属性实现对文件的上传 在HTML5以前我们如果需要实现文件上传服务器等功能的时候,有时候我们不得不依赖于FLASH去实现,而在HTML5到来之后,我 ...
- 约瑟夫问题(c++实现)
描述:约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1 开始报数.就这样,直到圈内只剩下一只猴子时,这个猴子 ...