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