阅读:1015回复:1
如何将接口卡的内存地址转换为驱动程序可用的地址?
目前,我正进行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 |
|
|
沙发#
发布于:2002-06-15 14:51
我也遇到过同样的问题,我的解决方法是,不在DriverEntry里映射
而是在分发例程里进行。你可以试一下 |
|
|