外設I O資源的訪問方式

2021-05-24 12:29:12 字數 2063 閱讀 2670

華清遠見嵌入式學院

講師。我們知道缺省外設i/o資源是不在linux核心空間中的(如sram或硬體介面暫存器等),若需要訪問該外設i/o資源,必須先將其位址對映到核心空間中來,然後才能在核心空間中訪問它。

linux核心訪問外設i/o記憶體資源的方式有兩種:動態對映(ioremap)和靜態對映(map_desc)。

一、動態對映(ioremap)方式

動態對映方式是大家使用了比較多的,也比較簡單。即直接通過核心提供的ioremap函式動態建立一段外設i/o記憶體資源到核心虛擬位址的對映表,從而可以在核心空間中訪問這段i/o資源。

ioremap巨集定義在asm/io.h內:

#define ioremap(cookie,size) __ioremap(cookie,size,0)

__ioremap函式原型為(arm/mm/ioremap.c):

void __iomem * __ioremap(unsigned long phys_addr, size_t size, unsigned long flags);

phys_addr:要對映的起始的io位址

size:要對映的空間的大小

flags:要對映的io空間和許可權有關的標誌

該函式返回對映後的核心虛擬位址(3g-4g). 接著便可以通過讀寫該返回的核心虛擬位址去訪問之這段i/o記憶體資源。

舉乙個簡單的例子: (取自s3c2410的驅動)

比如我們要訪問s3c2410平台上的i2s暫存器, 檢視datasheet 知道iis實體地址為0x55000000,我們把它定義為巨集s3c2410_pa_iis,如下:

#define s3c2410_pa_iis (0x55000000)

our_card->regs = ioremap(s3c2410_pa_iis, 0x100);

if (our_card->regs == null)

建立好了之後,我們就可以通過readl(our_card->regs )或writel(value, our_card->regs)等io介面函式去訪問它。

二、靜態對映(map_desc)方式

下面重點介紹靜態對映方式即通過map_desc結構體靜態建立i/o資源對映表。

核心提供了在系統啟動時通過map_desc結構體靜態建立i/o資源到核心位址空間的線性對映表(即page table)的方式,這種對映表是一種一一對映的關係。程式設計師可以自己定義該i/o記憶體資源對映後的虛擬位址。建立好了靜態對映表,在核心或驅動中訪問該i/o資源時則無需再進行ioreamp動態對映,可以直接通過對映後的i/o虛擬位址去訪問它。

下面詳細分析這種機制的原理並舉例說明如何通過這種靜態對映的方式訪問外設i/o記憶體資源。

核心提供了乙個重要的結構體struct machine_desc ,這個結構體在核心移植中起到相當重要的作用,核心通過machine_desc結構體來控制系統體系架構相關部分的初始化。

machine_desc結構體的成員包含了體系架構相關部分的幾個最重要的初始化函式,包括map_io, init_irq, init_machine以及phys_io , timer成員等。

machine_desc結構體定義如下:

struct machine_desc

iotable_init核心提供,定義如下:

由上知道,s3c2410_map_io最終呼叫iotable_init建立對映表。

iotable_init函式的引數有兩個:乙個是map_desc型別的結構體,另乙個是該結構體的數量nr。這裡最關鍵的就是struct map_desc。map_desc結構體定義如下:

/* include/asm-arm/mach/map.h */

struct map_desc ;

這樣的話我們就知道了建立i/o對映表的大致流程為:只要定義相應i/o資源的map_desc結構體,並將該結構體傳給iotable_init函式執行,就可以建立相應的i/o資源到核心虛擬地 址空間的對映表了。

android培訓

3g培訓

qt培訓

物聯網培訓

嵌入式學習

外設I O資源的訪問方式

華清遠見嵌入式培訓中心 講師。我們知道缺省外設i o資源是不在linux核心空間中的 如sram或硬體介面暫存器等 若需要訪問該外設i o資源,必須先將其位址對映到核心空間中來,然後才能在核心空間中訪問它。linux核心訪問外設i o記憶體資源的方式有兩種 動態對映 ioremap 和靜態對映 ma...

核心訪問外設I O資源方式

參考 很多預設的外設i o資源是不在linux核心空間中,如sram 硬體暫存器,如果要訪問這些資源,就必須將它位址對映到核心空間。linux核心空間訪問外設i o資源有兩種方式 動態對映 ioremap 和靜態對映 map desc 一 動態對映 動態對映方式接觸應該比較多,即通過核心提供的ior...

Linux 核心訪問外設IO資源的方式

首先介紹一下i o埠和i o記憶體。1.i o埠 當乙個暫存器或記憶體位於i o空間時,稱其為i o埠。2.i o記憶體 當乙個暫存器或記憶體位於記憶體空間時,稱其為i o記憶體。再來看一下i o暫存器和常規記憶體的區別 i o暫存器具有邊際效應 side effect 而記憶體操作則沒有,記憶體寫...