一、如何查看LINUX内核

很多人说学习linux最好的方法是看内核源码,那怎么看呢?总不能通篇看吧,那猴年马月都看不完。现在我就教大家一个办法(以GPIO为例):

在内核源码目录下使用命令“ls drivers/gpio/*.o”,可以看到“gpioexynos4”被编译进了内核
                – 生成.o文件代表最终被编译进了内核
                – 除了menuconfig配置文件,还可以通过.o文件来判定该文件是否编译进了内核,编译进内核的才是我们需要看的。

在“gpio-exynos4.c”文件最下面一行
        – core_initcall(exynos4_gpiolib_init);
        – core_initcall代表在linux初始化过程中会调用
        – 初始化函数是在源码目录下“include/linux/init.h”文件中定义的,该头文件中定义了一系列的初始化函数,在linux启动的过程中会按等级。

初始化函数调用了“exynos4_gpiolib_init”
在该函数中引用了chip = exynos4_gpio_common_4bit结构体


结构体exynos4_gpio_common_4bit

宏定义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)

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中也使用了,这是一个平台文件

查找到宏定义EXYNOS4_PA_GPIO2
– #define EXYNOS4_PA_GPIO2    0x11000000
– 这个物理地址0x11000000就是CPU手册上面的实际地址

二、 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位寄存器联想起来。
        – 后面跟着我依葫芦画瓢,不影响大家实际写程序,有兴趣再回过头理解

十二、linux GPIO初始化相关推荐

  1. Oracle Golden Gate 系列十二 -- GG 数据初始化装载二 基于SCN 的初始化 说明 与 示例...

    一.初始化说明 GG实施过程中,初始化是一个重要的工作,尤其是要初始化的数据较多,并且系统又是7*24的时. 对于静态初始化,把业务停掉,DB 上的数据就不会有变化,这时候,我们可以用expdp/im ...

  2. Linux学习之CentOS(三十二)--Linux系统服务基础

    您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...

  3. Linux学习之十二-Linux文件属性

    Linux文件属性 在Linux中,对于每个文件都有相应属性,以Linux中root用户家目录下新建文件a.txt为例,在a.txt中输入几个字符 使用命令ls -ild a.txt查看文件的权限等 ...

  4. 云计算实战系列十二(Linux系统优化)

    Linux高级系统优化 uptime 命令 [root@newrain ~]# uptime 14:01:51 up 1 day, 20:11, 3 users, load average: 0.13 ...

  5. (十二)Linux内核驱动之poll和select

    使用非阻塞 I/O 的应用程序常常使用 poll, select, 每个允许一个进程来决定它是否可读或者写一个或多个文件而不阻塞. 这些调用也可阻塞进程直到任何一个给定集合的文件描述符可用来读或写.  ...

  6. 十二、linux LED初始化

    一.硬件原理图 我们今天的目标是将itop4412开发板上的两个led灯控制起来.先看一下原理图: 二.GPIO需要的接口和定义 1.Linux中申请GPIO的头文件 – include/linux/ ...

  7. 韦东山 IMX6ULL和正点原子_「正点原子Linux连载」第十二章官方SDK移植试验

    1)实验平台:正点原子Linux开发板 2)摘自<正点原子I.MX6U嵌入式Linux驱动开发指南> 关注官方微信号公众号,获取更多资料:正点原子 第十二章官方SDK移植试验 在上一章中, ...

  8. 【正点原子Linux连载】第六十二章 Linux SPI驱动实验 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  9. 【正点原子MP157连载】第二十二章 新字符设备驱动实验-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

最新文章

  1. 微软华人团队刷新COCO记录!全新目标检测机制达到SOTA|CVPR 2021
  2. jmeter环境配置
  3. 【Tools】Modbus Slave 7安装详解
  4. JAVA流程控制详解
  5. linux系统日常管理复习题讲解
  6. 2015年传智播客java_2015年Java 8强势开始
  7. linux中vi过滤,vim高级编辑(一)
  8. Json(四):Json增、删、改
  9. c mysql 异步查询_C#Mysql – 使用锁在数据库上查询异步等待服务器
  10. 2.7 Inception 网络
  11. 编译安装NTP时间服务报错
  12. 最新30套Java项目实战
  13. Docker 安装 linux版
  14. c语言逻辑推理题大全,C语言逻辑推理例题(附答案)
  15. 连续型随机变量+分布函数+密度函数+联合分布函数
  16. 快速清除系统中的木马病毒
  17. android 指纹识别 怎么使用方法,android实现指纹识别
  18. Java 设计员工类Employee,假设现有教师、科学家2种员工类型,根据要求求出各人的全年收入。
  19. 哪个心情不好来看看,老逗了
  20. 英伟达RTX 4070最新测评来了!光追效果更棒,但仅限于2k游戏

热门文章

  1. poj 2001 trie
  2. 利用IShellExecuteHook接口对程序监控
  3. mssql的T-SQL教程(从建登陆到建库、表和约束)
  4. [轉]俞老师在同济大学的演讲词:度过有意义的生命
  5. UA MATH567 高维统计IV Lipschitz组合1 Lipschitz函数
  6. Mathematica 对曲线进行拟合
  7. Python 列表和元组
  8. 图解微软ReportBuilder3连接Sql Server 2008数据库表创建报表
  9. 学习笔记97—matlab 获取矩阵中特定值的坐标
  10. vue中textarea标签自适应高度