驱动程序(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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章