裝置通常會提供一組暫存器用於控制裝置、讀定裝置和獲取裝置狀態
,即控制暫存器、資料暫存器和狀態暫存器
.這些暫存器可能位於
i/o空間
,也可能位於記憶體空間
.當位於
i/o空間時
,通常被稱為
i/o埠
,位於記憶體空間時
,對應的記憶體空間被稱為
i/o記憶體
.在嵌入式
linux中,
我們接觸最多的就是
i/o記憶體
:
#define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name), 0)
向核心申請
n個記憶體位址
,這些位址從
first
開始,name
引數為裝置的名稱
.如果分配成功返回值為非
null,
如果返回
null,
則意味著申請
i/o記憶體失敗
.其相反的動作函式為
:
int release_resource(struct resource *old)
這對函式一般用來判斷
i/o記憶體是否已經被占用了
.它一般配合
platform_get_resource()
函式來使用
.platform_get_resource()
用來獲取平台裝置端的
i/o記憶體位址空間
,並以其返回值為引數.如下
:
struct resource *platform_get_resource(struct platform_device *dev,unsigned int type, unsigned int num)
以s3c2440的rtc為例,簡單說明:
[注:]i/o記憶體一般只用來判斷我們目標操作記憶體是否被占用,但是這並不是必須的. 在對1. static int __devinit s3c_rtc_probe(struct platform_device *pdev)
2.
9.
10. s3c_rtc_mem = request_mem_region(res->start,res->end-res->start+1,pdev->name);
11. ... ...;
12. }
i/o記憶體的訪問核心提供了專門的
api:
例如1. unsigned readb(address);
2. unsigned readw(address);
3. unsigned readl(address);
4.
5. void writeb(unsigned value, address);
6. void writew(unsigned value, address);
7. void writel(unsigned value, address);
s3c2440
的lcd
驅動裡面,對
lcd主控端暫存器的配置
:
1. static int __init s3c24xxfb_probe(struct platform_device *pdev,enum s3c_drv_type drv_type)
2.
核心中與驅動相關的記憶體操作之十 記憶體屏障
雖然實際驅動中不常用 但是閱讀核心比較深層的 經常會遇到 為什麼存在記憶體屏障呢 先看一下下面的場景 編譯器和處理器為了提高效率 可能對讀和寫操作重新進行了排序,例如 在某些處理器上 以下 a 1 b 2 有可能在 a中存放新值之前就在 b中存放新值.但是,我們在操作記憶體或者和硬體互動時 常常需要...
核心中與驅動相關的記憶體操作之八 面向頁的記憶體分配
1.概述 當我們在核心驅動 中需要用到大量記憶體時,一般建議採用面向頁的記憶體管理.面向頁的記憶體管理有如下優點 高效利用記憶體,避免記憶體碎片的產生.因為核心都是基於頁為基本單位去管理記憶體的.面向頁的記憶體管理,顧名思義,就是以頁為基本單位來操作記憶體的.它比kmalloc 對記憶體使用上效率會...
Linux核心裝置驅動之核心中煉表的使用筆記整理
核心中煉表的應用 1 介紹 在linux核心中使用了大量的鍊錶結構來組織資料,包括裝置列表以及各種功能模組中的資料組織。這些鍊錶大多採用在include linux list.h實現的乙個相當精彩的鍊錶資料結構。鍊錶資料結構的定義很簡單 struct list head list head結構包含兩...