ioremap nocache 函式的使用

2021-07-26 11:57:26 字數 1517 閱讀 1776

本篇文章主要是在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函式如下,紅色表示的部分為增...