之前對寄存器讀寫進行過操作,後面又忘了,這次做個記錄:
當我們知道寄存器的物理地址時,我們不可以直接使用物理地址。不使用物理地址是因爲我們使用了虛擬內存地址對實際的物理地址進行虛擬化管理。
假設我們知道某個寄存器的物理地址是: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