本篇文章主要是在ioremap_nocache函式說明的基礎上進行整理,加入該函式的用法簡介。 /*
* 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);
WaitForSingleObject函式的使用
程式舉例 1 建立對話方塊應用程式,專案名稱為mytestthread 2 新增按鈕,命名為啟動和停止,在對話方塊中增加編輯框,id為idc time,3 增加成員變數,handle m hthread 2 此為執行緒的控制代碼 4 定義全域性變數,用來控制線程的執行與否 volatile bool...
cvCreateVideoWriter函式使用
cvcreatevideowriter函式使用 2011 11 04 15 47 例如,cv fourcc p i m 1 是mpeg 1 codec,cv fourcc m j p g 是motion jpeg codec cv fourcc m p 4 2 mpeg 4.2 codec cv f...
CentimetersToPoints函式出錯
在word開發中,碰到centimeterstopoints函式呼叫出錯,提示未指定的錯誤的問題。解決辦法為修改centimeterstopoint函式 匯入msword.olb後的centimeterstopoint函式如下 修改後的centimeterstopoint函式如下,紅色表示的部分為增...