本篇文章主要是在ioremap_nocache函數說明的基礎上進行整理,加入該函數的用法簡介。 函數原型 調用 函數之後,返回一個線性地址,此時CPU 可以訪問設備的記憶體(已經將其映射到了線性地址空間中了),此時CPU可以使用訪問記憶體的指令訪問設備的記憶體空間,此時我們就可以像訪問記憶體一樣來訪問設備的 ...
本篇文章主要是在ioremap_nocache函數說明的基礎上進行整理,加入該函數的用法簡介。
函數原型
void __iomem * ioremap_nocache (unsigned long offset, unsigned long size);
/*
* ioremap - map bus memory into CPU space
* @offset: bus address of the memory
* @size: size of the resource to map
*
* ioremap performs a platform specific sequence of operations to
* make bus memory CPU accessible via the readb/readw/readl/writeb/
* writew/writel functions and the other mmio helpers. The returned
* address is not guaranteed to be usable directly as a virtual
* address.
*/
調用ioremap_nocache()
函數之後,返回一個線性地址,此時CPU 可以訪問設備的記憶體(已經將其映射到了線性地址空間中了),此時CPU可以使用訪問記憶體的指令訪問設備的記憶體空間,此時我們就可以像訪問記憶體一樣來訪問設備的記憶體(寄存器)。
ioremap
是為一段高端的物理記憶體建立映射(即增加相關的頁表內容),驅動常用mmap為可能不連續的一系列邏輯上相關的(如整體是一個文件)物理記憶體段建立映射,並呈現一個連續的虛擬地址空間。
應用程式常用mmap是系統調用,只能應用程式用。
ioremap是kernel提供的函數,只能在kernel里用。
用法
以下示例以讀寫基地址為0x9C016000,offset為0x100的寄存器為例。
// 全局定義兩個變數
static void __iomem *vaddr_base;
volatile u32 rw32;
// 從物理地址 0x9C016000 開始映射 0x200 大小給虛擬地址 vaddr_base
// 只執行一次
vaddr_base = ioremap_nocache(0x9C016000, 0x200);
// 讀寫0x9C016000+0x100寄存器bit24~bit27為0001
rw32 = *(volatile u32*)(vaddr_base + 0x100); // 讀
printk("Reg0x%x = 0x%x\n", 0x9C016000 + 0x100, rw32);
rw32 &= 0xf0ffffff;
rw32 |= 0x01000000;
*(volatile u32*)(vaddr_base + 0x100) = rw32; // 寫
iounmap(vaddr_base);