,1. io 命令的操作

 

 

io 进行读取指定地址的数据,从物理地址直接读取,因为该命令是经过虚拟地址转换的,所以可以直接使用,

但在驱动程序中,应当经过ioremap重新偏移正确的虚拟地址,方可读取数据。

 

2. DS的理解

DataSheet通常都是 Address  Mapping 解析一堆寄存器的地址以及大小,例如:

先找到这个地址:

 

 

 再根据便宜的公式:

 

 

 得到的就是GPIO2C这组的地址,并非某一个GPIO,因为都是一组C的。

再根据读写的条件:

 

这部分需要强调,Write access enable 作为写入的使能,是需要在写入时,把低16位b1置位即可。如:

0x0000FFFF & write

 

 

pull-up 和 pull-down 作为上拉和下拉电阻,这是芯片内部的电路决定的,通过设备驱动配置方式。

2’b01意思是2位,置01即可,结合前面的不变数据,应此时利用位运算实现单独置位。

 

3. 驱动代码实现寄存器的读写

local_irq_save,该接口作为中断开始。

gpio_direction_input, 配置IO的模式,应为输入模式,并非输出。

__raw_readl, 最底层的读取寄存器的数据,raw形式。

__raw_writel, 最底层的写入寄存器的数据,raw形式。

local_irq_restore, 恢复现场,如同中断。

ioremap, 作为虚拟地址转换的一个关键通道。

 

上拉电阻写入寄存器的核心代码:

 

 

细节代码(自己实现转换地址)

 

 参考三星的物理地址转换为虚拟地址的方式,只实现对应组别的GPIO的寄存器虚拟物理地址转换。

4. 但是目前的这种方式,已经很少人在使用,都是通过设备树进行一行代码配置即可,但对于理解整个流程还是必要的。

 

原文地址:http://www.cnblogs.com/real-watson/p/16809721.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性