ioremap_nocache() 函數的使用

本篇文章主要是在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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章