之前对寄存器读写进行过操作,后面又忘了,这次做个记录:

当我们知道寄存器的物理地址时,我们不可以直接使用物理地址。不使用物理地址是因为我们使用了虚拟内存地址对实际的物理地址进行虚拟化管理。

假设我们知道某个寄存器的物理地址是:0x302c0038

如果我们要操作这个寄存器,就需要对这个地址进行内存映射:ioremap

void reg_set(u32 phy_reg_addr, u32 reg_value)
{
    volatile unsigned long *virt_reg_addr;
    u32 reg_val;
    virt_reg_addr = (unsigned long *)ioremap(phy_reg_addr,4);
    reg_val = ioread32(virt_reg_addr);
    reg_val &= reg_value;
    iowrite32(reg_value, virt_reg_addr);
    iounmap((void *)virt_reg_addr);
}

通过ioremap函数获取映射后的地址,这个地址我们可以对其进行读写

通过ioread32函数对可读写的地址进行数据读取

通过iowrite32函数对可读写的地址进行数据写入

 

之前使用的读写函数是:

readl(reg_mem)和writel(val,reg_mem)

readl等价于ioread32

writel等价于iowrite32

Logo

更多推荐