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