驱动程序(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);
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Wind River 中,可以通过 I/O 端口和内存映射 I/O 两种方式进行寄存器读写操作。 1. I/O 端口读写 I/O 端口读写是通过访问特定的 I/O 端口进行的,可以使用 `inb`、`inw`、`inl`、`outb`、`outw`、`outl` 等函数进行读写操作。例如,要读取 I/O 端口号为 0x80 的寄存器的值,可以使用以下代码: ```c unsigned char val = inb(0x80); ``` 要将值写入 I/O 端口号为 0x80 的寄存器,可以使用以下代码: ```c outb(val, 0x80); ``` 2. 内存映射 I/O 读写 内存映射 I/O 读写是通过将 I/O 端口映射到内存地址空间进行的,可以使用 `ioremap`、`iounmap`、`readb`、`readw`、`readl`、`writeb`、`writew`、`writel` 等函数进行读写操作。例如,要读取地址为 0x6000 的内存映射 I/O 寄存器的值,可以使用以下代码: ```c volatile unsigned char *reg = (volatile unsigned char *)ioremap(0x6000, sizeof(unsigned char)); unsigned char val = readb(reg); ``` 要将值写入地址为 0x6000 的内存映射 I/O 寄存器,可以使用以下代码: ```c volatile unsigned char *reg = (volatile unsigned char *)ioremap(0x6000, sizeof(unsigned char)); writeb(val, reg); ``` 需要注意的是,I/O 端口和内存映射 I/O 读写方法在实现上有所不同,具体使用哪种方式需要根据硬件平台和操作系统进行选择。在使用 Wind River 进行寄存器读写操作时,应该根据具体情况选择合适的方法,并仔细阅读相关文档和参考资料,以确保正确实现功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值