驅動程序(11) Windriver下讀寫外部設備BAR內存資源的方法

前言

在利用windriver生成外部設備的驅動程序的時候,我們往往需要去訪問外部設備上的內存資源,windriver提供了幾種API接口(以下都以32位來介紹),只需要提供一些參數就可以訪問到外部設備的內存資源了。

WDC_WriteAddr32/WDC_ReadAddr32

這兩個API函數的定義如下:
hDev:被訪問的外部設備的句柄
dwAddrSpace:外部設備上的某個地址空間段,也就是某個BAR
dwOffset:相對於外部設備上某個地址空間基地址的偏移地址
val:Write就是需要寫進去的數據值,Read就是讀出來的數據值對應的虛擬地址
由定義可以看到這種讀寫的方式只能每隔32bit讀寫一次,讀寫的數據值也是一個一個的,不能做到一個API函數裏連續讀寫數據。

DWORD DLLCALLCONV WDC_ReadAddr32(WDC_DEVICE_HANDLE hDev, DWORD dwAddrSpace,
    KPTR dwOffset, UINT32 *val);
DWORD DLLCALLCONV WDC_WriteAddr32(WDC_DEVICE_HANDLE hDev, DWORD dwAddrSpace,
    KPTR dwOffset, UINT32 val); 

WDC_ReadAddrBlock32/WDC_WriteAddrBlock32

dwBytes:被讀取數據的字節數
pData:Read時作爲輸出參數,被讀取數據存放buffer的指針;Write時作爲輸入參數,被寫入數據存放buffer的指針
mode:讀寫的接入方式,主要分爲8bit/16bit/32bit/64bit
options:數據將如何被讀寫的標識位,默認被該API函數自動設置

DWORD DLLCALLCONV WDC_ReadAddrBlock(WDC_DEVICE_HANDLE hDev, DWORD dwAddrSpace,
    KPTR dwOffset, DWORD dwBytes, PVOID pData, WDC_ADDR_MODE mode,
    WDC_ADDR_RW_OPTIONS options);
DWORD DLLCALLCONV WDC_WriteAddrBlock(WDC_DEVICE_HANDLE hDev, DWORD dwAddrSpace,
    KPTR dwOffset, DWORD dwBytes, PVOID pData, WDC_ADDR_MODE mode,
    WDC_ADDR_RW_OPTIONS options);

WDC_ReadMem32/WDC_WriteMem32

addr:被讀取數據的內存虛擬地址
off:相對於指定內存虛擬地址的偏移地址
val:需要寫進指定內存虛擬地址的數據
由此處定義可以看到,這個API是通過虛擬地址加偏移地址的方式來讀寫數據的,但是外部設備的BAR內存資源一般不會映射到用戶態的虛擬地址,除非人工進行相關操作。所以這個API函數適用於在PC端自行申請buffer之後的讀寫數據。

#define WDC_ReadMem32(addr, off) \
    dtoh32(*(volatile UINT32 *)((UPTR)(addr) + (UPTR)(off)))
#define WDC_WriteMem32(addr, off, val) \
    *(volatile UINT32 *)(((UPTR)(addr) + (UPTR)(off))) = dtoh32(val)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章