迅为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位

寄存器联想起来。

– 后面跟着我依葫芦画瓢,不影响大家实际写程序,有兴趣再回过头理解

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-14 05:05:55

迅为4412开发板Linux驱动教程之GPIO的初始化的相关文章

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

视频下载地址: 驱动注册:http://pan.baidu.com/s/1i34HcDB 设备注册:http://pan.baidu.com/s/1kTlGkcR 总线_设备_驱动注册流程详解 ? 注册流程图 ? 设备一般都需要先注册,才能注册驱动 – 现在越来越多的热拔插设备,反过来了.先注册驱动,设备来了再注册 设备 ? 本节使用的命令 – 查看总线的命令#ls /sys/bus/ – 查看设备号的命令#cat /proc/devices ? 设备都有主设备号和次设备号,否则255个设备号不

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

Linux驱动教程:http://pan.baidu.com/s/1c0hljUS 编写简单应用调用驱动--头文件 ? 打印头文件 – include <stdio.h>调用打印函数printf ? 应用中调用文件需要的头文件 – #include <sys/types.h>基本系统数据类型.系统的基本数据类型在32 编译 环境中保持为32 位值,并会在64 编译环境中增长为64 位值. – #include <sys/stat.h>系统调用函数头文件.可以调用普通文件

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

视频教程下载地址:http://pan.baidu.com/s/1pJwxUfL 嵌入式研发流程介绍 ? PCB研发流程介绍 – 方案,原理图(网表) – layoutproject师(gerber文件) – PCB板厂制板(裸板PCB) – 焊接(Demo板) – 硬件測试 – 稳定性測试(须要软件project师) – 量产 – 驱动的工作在方案选定了之后就开展.到了量产之后还有可能一 直更新升级 原理图的使用 ? 原理图的使用 – 模块 – 元件标号 – 网络标号 模块 ? 拿到原理图之后

迅为4412开发板Linux驱动教程之内核开发基础

视频教程:http://v.youku.com/v_show/id_XMTMwNjAwMDc0OA==.html 主要内容 ? Linux体系结构 ? Linux内核结构 ? Linux内核源码目录结构 Linux体系结构 从上图可知,Linux体系结构由用户空间和内核空间构成 ? 为什么Linux体系要分为用户空间和内核空间? ? 从程序员的角度分析 – 将linux底层和应用分开,做应用的做应用,做底层的做底层,各干各的. 经济学的原理是,分工产生效率. 从安全性的角度分析,为了保护内核.现

嵌入式开发-迅为4412开发板QT鼠标和触摸的问题解决方案

迅为4412开发板-QT鼠标和触摸的问题解决方案: 一. 背景 在使用迅为提供的QT4.7的时候,鼠标可以正常使用,有触摸但是触摸会出现问题.尤其是在左右滑动qt界面的时候,总是会出现往左滑动,画面急速往右走,然而往右滑动,画面急速的往左走. 在使用迅为提供的Qtopia4的时候,只能用触摸不能用鼠标. 二.解决办法 ① QT4.7系统 打开/bin/qt4 找到这句话: export QWS_MOUSE_PROTO='MouseMan:/dev/input/mice Tslib:/dev/in

迅为4412开发板学习之win8下基础软件的安装和学习

平台:迅为4412开发板 详情了解:http://topeetboard.com更多了解:https://arm-board.taobao.com 一.超级终端的安装和使用 1 关闭 win8 的自动更新 如果用户使用的 PC 机没有串口,就需要用到 USB转串口驱动.我们给用户配套的硬件是 PL 2303, 提供的驱动也是 PL2303. 如果用户使用其它的设备, 那么所需要的驱动就不一样了. 本来驱动安装后直接使用,但是在 win8 下有自动更新,默认自动更新的,它会更新到最 新的版本,最新

嵌入式开发板 迅为4412开发板 初学ARM开发板首选!提供教学视频!

选择迅为4412开发板无论是学习ARM技术还是开发产品都无须担心,迅为4412开发板提供了丰富的例程源码实例和视频,只需要你有C语言基础,就可以快速学习嵌入式高端技术开发! 搭载三星Exynos四核处理器,配备1GB内存,4GB固态硬盘EMMC存储,兼具快速读取与超大容量,纵使海量思考也能及时处理. 详情了解: http://topeetboard.com   更多了解:https://arm-board.taobao.com

4412开发板Linux系统编程实战-字符设备控制

在 linux 驱动中字符驱动是必须掌握的,本章主要介绍字符设备应用的程序,无论是学习了后面的知识自己写的字符驱动,还是已有的字符驱动,都需要能够写一些简单的应用程序. 即使从事 linux 驱动的工作,linux 驱动写出来之后,也需要由驱动程序员编写简单的应用进行测试的. 另外,关于驱动部分,迅为电子有专门的驱动实验教程提供给大家学习,大家有了这些基础之后再去学习底层的知识就会很容易了. 在使用手册的第八章,大家可以看到这些 c 程序也是可以在 Android 下面运行的,只不过没有图形界面

迅为4412开发板平台-嵌入式开源平台

转载:http://www.topeetboard.com/ 4412核心板介绍 两种封装形式:Exynos4412有两种封装形式, 其中POP封装的芯片内含1GB内存, 所以不需要外扩DDR, 可大大节省 PCB 面积,功耗控制方面也更好,多用于手持设备当中: SCP 封装优点是内存扩展更灵活,生产工艺相对更容易控制. 4412POP 封装 长宽:5CM * 6CM,高度 1.5MM,320 个引脚(80 * 4): 板载 1GB 内存,电源管理: 和底板装配的时候注意“防呆箭头”. 4412