视频下载地址: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的初始化的更多相关文章

  1. 迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解

    本文转自:http://www.topeetboard.com 视频下载地址: 驱动注册:http://pan.baidu.com/s/1i34HcDB 设备注册:http://pan.baidu.c ...

  2. 迅为4412开发板Linux驱动教程——编写简单应用调用驱动

    Linux驱动教程:http://pan.baidu.com/s/1c0hljUS 编写简单应用调用驱动--头文件 • 打印头文件 – include <stdio.h>调用打印函数pri ...

  3. 迅为4412开发板Linux驱动教程——总线_设备_驱动注冊流程具体解释

    视频下载地址: 驱动注冊:http://pan.baidu.com/s/1i34HcDB 设备注冊:http://pan.baidu.com/s/1kTlGkcR 总线_设备_驱动注冊流程具体解释 • ...

  4. 迅为4412开发板Linux驱动教程/硬件知识及原理图的使用

    视频教程下载地址:http://pan.baidu.com/s/1pJwxUfL 嵌入式研发流程介绍 • PCB研发流程介绍 – 方案,原理图(网表) – layoutproject师(gerber文 ...

  5. 迅为4412开发板Linux设备树的镜像烧写和源码简单优化教程

    1 烧写:   烧写和4412默认镜像的烧写类似,使用fastboot. 先更新uboot,用4412默认uboot更新支持设备树的uboot 用支持设备树的uboot烧写. 进入支持设备树的uboo ...

  6. 【4412开发板使用经验分享】迅为4412开发板I2C驱动问题

    本文转自迅为论坛:bbs.topeetboard.com 我想写DS3231 的驱动 但是读回的数据老是-6 硬件: 我I2C设备连接的这几个GPIO,看了2.5的手册,接口应该是链接正确的 软件 分 ...

  7. 迅为4412开发板QtE系统源码-屏幕横竖屏切换修改方法

    迅为4412开发板QtE系统源码-屏幕横竖屏切换修改方法 详情了解:http://topeetboard.com 更多了解:https://arm-board.taobao.com/ 用户在开发板上运 ...

  8. [转帖]迅为4412开发板最小linux系统的存储空间修改

    本文转自迅为论坛:http://www.topeetboard.com 最小linux系统的存储空间修改以修改成 1G 存储空间为例来修改,如果需要改成其他大小的存储空间,参照此方法修改即可. 首先连 ...

  9. 【学习/研发】嵌入式Linux/Android开发有它就够了——迅为4412开发板

    网站:http://www.topeetboard.com 光盘资料+网盘资料+配套视频+售后支持,助您加速学习研发的进程 产品介绍 iTOP-Exynos4412开发板采用 Exynos4412的主 ...

随机推荐

  1. Python入门版

    一.前言 陆陆续续学习Python已经近半年时间了,感觉到Python的强大之外,也深刻体会到Python的艺术.哲学.曾经的约定,到现在才兑现,其中不乏有很多懈怠,狼狈. Python入门关于Pyt ...

  2. SqlServer定时备份数据库和定时杀死数据库死锁解决

    上周五组长对我说了一句要杀死数据库的死锁进程,有时候同一时刻不停写入数据库会造成这种情况的发生,因为自己对数据库不是很熟悉,突然组长说了我也就决定一定要倒腾一下,不然自己怎么提高呢?现在不研究,说不定 ...

  3. Studio for Winforms FlexGrid: 创建分类汇总

    C1FlexGrid.Subtotal方法可以增加包含普通(非小计)行的汇总数据的分类汇总行. 分类汇总支持分层聚合.例如,如果你的表格包含销售数据,你可能会通过产品.地区和推销员来小计一下以得出总的 ...

  4. 使用PushSharp进行IOS发布应用的消息推送

    在做.NET向IOS设备的App进行消息推送时候,采用的是PushSharp开源类库进行消息的推送,而在开发过程中,采用的是测试版本的app,使用的是测试的p12证书采用的是ApnsConfigura ...

  5. Mybatis Physical Pagination

    1. Requirements: when we use the sql like "select * from targetTable", we get all records ...

  6. jQuery waterbubble 水球图

    在线实例 默认效果 显示文本 水球半径 文本颜色 边框宽度 设置字体 数据多少 是否显示波纹 水球颜色 是否显示动画 使用方法 <div class="wrap"> & ...

  7. [js开源组件开发]js轮播图片支持手机滑动切换

    js轮播图片支持手机滑动切换 carousel-image 轮播图片,支持触摸滑动. 例子见DEMO http://www.lovewebgames.com/jsmodule/carousel-ima ...

  8. 关于JS闭包,作者不详(转)

    说明:本文由两篇文章结合而成,系从他人笔记中转过来的, 具体作者不详.因为觉得不错,遂共享之.如有侵权,立删致歉. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变 ...

  9. 解决SharePoint 文档库itemadded eventhandler导致的上传完成后,编辑页面保持报错的问题,错误信息为“该文档已经被编辑过 the file has been modified by...”

    在文档库中添加itemadded 后,在上传文件后,会自动打开文档属性的编辑页面,在保存的时候就会报错,说这个文档已经被编辑过了.这是应为默认itemadded实践是异步执行的,会在edit页面打开之 ...

  10. 【读书笔记】iOS-GCD-网络编程要不要使用GCD

    一,网络编程强烈推荐使用异步API. 二,对于网络编程可以断言“线程是魔鬼”.如果在网络编程中使用线程,就很可能会产生大量使用线程的倾向,会引发很多问题.例如每个连接都使用线程,很快就会用尽线程栈内存 ...