linux arm 寄存器進行讀寫的操作

之前對寄存器讀寫進行過操作,後面又忘了,這次做個記錄:

當我們知道寄存器的物理地址時,我們不可以直接使用物理地址。不使用物理地址是因爲我們使用了虛擬內存地址對實際的物理地址進行虛擬化管理。

假設我們知道某個寄存器的物理地址是: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章