WINCE驅動開發之暫存器的使用

2021-05-17 20:33:24 字數 2541 閱讀 5461

暫存器的使用:

可以有3個途徑。

1:直接使用g_oaladdresstable(oemaddrtab_cfg.inc)的已經定義好的,實體地址對應的虛擬位址。 如:

dcd     0x80000000, 0x30000000, 128     ;

訪問虛擬位址0x80000000實際就是訪問實體地址0x30000000。

2:在oal層,使用oalpatova函式。 如:

volatile s3c2410x_ioport_reg *pioctr;

pioctr = (volatile s3c2410x_ioport_reg *)oalpatova(s3c2410x_base_reg_pa_ioport, false);

那麼在訪問pioctr指向的首位址,實際就是訪問被對映後s3c2410x_base_reg_pa_ioport定義的實體地址。

void* oalpatova(

uint32 pa,                         引數1:需要對映的實體地址

bool cached                            引數2:是否使用cache(驅動中要使用uncached))

3:在kernel裡,使用mmmapiospace函式。

如:pbaseaddress = (puchar)mmmapiospace(iophysicalbase, size, false);

同上,訪問pbaseaddress的指向位址,就為訪問被對映後iophysicalbase定義的實體地址。

pvoid mmmapiospace(

physical_address physicaladdress,     引數1:需要對映的實體地址

ulong numberofbytes,                   引數2:對映的位址長度

boolean cacheenable                    引數3:是否使用cache(驅動中要使用uncached));

與oalpatova不同,在使用mmmapiospace後,必須使用mmunmapiospace。

void mmunmapiospace(

pvoid baseaddress,                      引數1:被對映後的虛擬位址

ulong numberofbytes                     引數2:對映的位址長度);

在一般的nk驅動編寫中,為了規範程式設計風格,請勿直接使用g_oaladdresstable中的虛擬位址。統一使用mmmapiospace、mmunmapiospace函式。

2、wince標準的暫存器訪問

定義乙個結構體。此結構包含某功能模組的暫存器位址。 如:

typedef struct s3c2410x_ioport_reg, *ps3c2410x_ioport_reg;

volatile s3c2410x_ioport_reg *pioctr;

pioctr = (volatile s3c2410x_ioport_reg *)oalpatova(s3c2410x_base_reg_pa_ioport, false);

這樣,訪問pioctr的各個成員,就為訪問被對映後s3c2410x_base_reg_pa_ioport定義的物理偏移位址。

為了統一、相容平台的驅動**,我們加入了暫存器操作巨集(oal_io.h):

#define reg8(_register_)    (*(volatile unsigned char  *)(_register_))

#define reg16(_register_)   (*(volatile unsigned short *)(_register_))

#define reg32(_register_)   (*(volatile unsigned long *)(_register_))

訪問模組中的功能暫存器,使用加上偏移位址的方式。

#define usb_reg_faddr_offset             (0x0000)

#define usb_reg_power_offset             (0x0001)

例子:

要編寫某個模組的驅動,首先使用mmmapiospace或oalpatova建立物理位址對映關係。

volatile byte *pusbctrladdr;

pusbctrladdr= (volatile byte *)oalpatova(ak3224_base_reg_pa_usb, false);

這樣,usb模組的首位址就為pusbctrladdr的指向位址。然後,使用regxx的巨集來訪問各個功能暫存器。

reg8(pusbctrladdr + usb_reg_power_offset) = usb_power_ensuspend;

ucintstatusr  =  reg16(pusbctrladdr + usb_reg_intrrx1_offset);

reg32(pusbctrladdr + usb_dma_count_1_offset) = 256; 

在驅動編寫中,請統一使用regxx的巨集操作。

WINCE驅動開發之暫存器的使用

暫存器的使用 可以有3個途徑。1 直接使用g oaladdresstable oemaddrtab cfg.inc 的已經定義好的,實體地址對應的虛擬位址。如 dcd 0x80000000,0x30000000,128 訪問虛擬位址0x80000000實際就是訪問實體地址0x30000000。2 在...

暫存器 之 SI DI

si源變址暫存器,di目地變址暫存器,都是變址暫存器,都是在某個位址的基礎上進行偏移變化,因此都需要基址暫存器。1 si di 一般與資料段暫存器ds聯用,用來確定資料段中某一儲存單元的位址。這兩個暫存器有自動增量和自動減量的功能所以用於變址是很方便的。2 在串處理指令中si 和di作為隱含的源變址...

STM32之暫存器開發

首先克服心理作用,不要總是預設暫存器開發難,其實暫存器開發和庫函式開發所用的方法和難度是一樣的,並不難,下面用以stm32為例解釋。1.明確自己需要的功能 庫函式開發也需要 2.檢視手冊,找到功能對應的微控制器資源 3.找到功能所需暫存器 庫函式開發需要找到相應的功能函式 4.根據位址每位對應的功能...