wwei_wang
驱动大牛
驱动大牛
  • 注册日期2002-06-07
  • 最后登录2006-06-23
  • 粉丝0
  • 关注0
  • 积分77分
  • 威望9点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:1015回复:1

如何将接口卡的内存地址转换为驱动程序可用的地址?

楼主#
更多 发布于:2002-06-07 12:33
目前,我正进行Windows NT环境下设备驱动程序的开发,开发过程中遇到一些难题,特向各位大虾请教!

我所开发的驱动程序的应用对象是研华的产品――PCL841,这是一块双通道CAN总线接口卡。为了满足我们自己的应用要求,我们准备自己开发驱动程序。因为不知你对这块卡是否熟悉,所以我简单介绍一下这块卡。
这块卡需要4K的内存空间,通过板卡上的跳线可以设置每个通道的中断和内存基地址。

1.在开发过程中,我设置两通道的中断分别为5和11,通道1的基地址为0xda000,通道2的基地址为0xda200。

2.然后,在驱动程序中先利用函数HalTranslateBusAddress()将通道的物理地址(即0xda000和0xda200)分别转化为逻辑空间的地址,其中,参数AddressSpace设为0。

3.运用函数MmMapIoSpace()将步骤2中的结果转换到虚拟空间,其中参数CacheEnable 设为false。
4. 最后直接利用步骤3所得的地址在加上相应的偏移,采用HAL函数是READ_REGISTER_UCHAR和WRITE_REGISTER_UCHAR对两个通道内的诸寄存器(包括控制、命令字、状态、中断、发送/接收缓冲区等)进行访问。

结果:驱动程序启动后,对接口卡的硬件初始化不正常,对某寄存器读的结果与初始化时设定的数值不同(注:该寄存器是可以进行读操作的)。

请问: 我这么处理,问题出在那里?请赐教!!
小弟不胜感激!!

(随信附上:与接口卡硬件初始化有关的程序片断)

王巍
2002.6.7
Come on, let us drive the world.
highw
驱动牛犊
驱动牛犊
  • 注册日期2002-01-10
  • 最后登录2011-04-05
  • 粉丝0
  • 关注0
  • 积分372分
  • 威望38点
  • 贡献值0点
  • 好评度36点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-15 14:51
我也遇到过同样的问题,我的解决方法是,不在DriverEntry里映射
而是在分发例程里进行。你可以试一下
msn : armlinux2000@hotmail.com
游客

返回顶部