阅读:2125回复:17
菜鸟:非pnp的ISA卡带两中断如何编写驱动程序?
ISA卡为输入型四字节端口,地址200~203H,中断5、7,均由硬件跳线设置;现欲在win98下用VTOOLsD开发一VxD驱动程序,请赐请!
若能提供类似的源程序则最好,不胜感谢! |
|
沙发#
发布于:2002-11-22 20:40
我写过一个中断的vxd.
|
|
板凳#
发布于:2002-11-22 22:42
Gong_XG兄,能给我一些有实质性的建议或说明吗?谢谢!
|
|
地板#
发布于:2002-11-23 20:41
你的两个中断关系密切吗?
|
|
地下室#
发布于:2002-11-24 09:07
是两个独立的中断。
|
|
5楼#
发布于:2002-11-24 09:12
我的信箱是topgun19@sohu.com
|
|
6楼#
发布于:2002-11-24 17:42
没有写过,但是挂两个中断应该是可以解决的。
|
|
7楼#
发布于:2002-11-24 19:11
VToolsD里面有VHardwareInt类,直接子类化2个,分别对应不同的IRQ即可。
|
|
|
8楼#
发布于:2002-11-24 22:35
就是说得有两个不同的派生VHardwareInt类吗?
|
|
9楼#
发布于:2002-11-26 14:30
还有:我在W98下编驱动可以只编中断服务程序,而I/O服务程序就用直接I/O可以吗?
|
|
10楼#
发布于:2002-11-26 15:17
还有:我在W98下编驱动可以只编中断服务程序,而I/O服务程序就用直接I/O可以吗? 我想应该可以吧。 |
|
11楼#
发布于:2002-11-26 23:05
终于找到了。
对,建立两个中断类。 在初始化时,建立两个实例,并用hook挂构虚拟;在中断程序中直接用_inp,_outp对端口操作。退出时,删除实例。ok |
|
12楼#
发布于:2002-11-27 13:47
还有:我在W98下编驱动可以只编中断服务程序,而I/O服务程序就用直接I/O可以吗? 完全可以。 |
|
13楼#
发布于:2002-12-02 16:13
Gong_XG兄:你找到什么了?是例程吗?能不能给我发一个,我的E――MAIL:topgun19@sohu.com。谢谢!
|
|
14楼#
发布于:2002-12-02 16:14
我的VXD驱动程序(仅针对中断5)与INF文件源码如下,但在WIN98下利用INF安装后板卡仍为问号(在系统中),请各位DX帮忙看一下有何问题。不胜感谢!
// VXDDRV.h - include file for VxD VXDDRV #include <vtoolscp.h> #define DEVICE_CLASS VxdDrvDevice #define VXDDRV_DeviceID UNDEFINED_DEVICE_ID #define VXDDRV_Init_Order NDEFINED_INIT_ORDER #define VXDDRV_Major 1 // 主版本号 #define VXDDRV_Minor 0 // 从版本号 //使用输入卡所设硬件中断5 #define TestIrq 5 class OurInt : public VSharedHardwareInt { public: OurInt(); //中断类构造函数 virtual BOOL OnSharedHardwareInt(VMHANDLE hVM); // 重载中断服务程序函数 }; //以下定义虚拟设备类 class VxdDrvDevice : public VDevice { private: OurInt *pOurInt; public: virtual BOOL OnSysDynamicDeviceInit(); // 虚拟机动态加载事件 virtual BOOL OnSysDynamicDeviceExit(); // 虚拟机动态卸载事件 }; // VXDDRV.cpp - VxD 主程序 #define DEVICE_MAIN #include \"vxdDrv.h\" Declare_Virtual_Device(VXDDRV) #undef DEVICE_MAIN static bool bflag=0; // 以下为中断服务程序 //使某输出端口根据所接收到的中断产生相应跳变的方波信号 BOOL OurInt::OnVSharedHardwareInt(VMHANDLE hVM) { if(bflag==0){ _outp(0xe800,0xff); //向某输出端口写FFH bflag=1; } else if(bflag==1) { _outp(0xe800,0x00); //向某输出端口写00H bflag=0; } sendPhysicalEOI(); // 通知 VPICD 重新允许该中断 return true; } // 向中断类实例化构造函数传递中断号 TestIrq OurInt::OurInt():VSharedHardwareInt(TestIrq,VPICD_OPT_CAN_SHARE,0,0) { } BOOL VxdDrvDevice::OnSysDynamicDeviceInit() { pOurInt = new OurInt(); // 为测试中断建立实例 // 挂接中断 if((pOurInt==NULL)||(!pOurInt->hook())) return FALSE ; pOurInt->physicalUnmask(); bflag=0; return TRUE ; } BOOL VxdDrvDevice::OnSysDynamicDeviceExit() { pOurInt->unhook() ; //解挂中断 pOurInt->physicalMask(); delete pOurInt ; //删除中断实例 return TRUE; } VXDDRV.inf源码: [Version] Signature=$CHICAGO$ Class=Unknown Provider=%string0% [ClassInstall] [DestinationDirs] DefaultDestDir=11 ; C:\\WINDOWS\\SYSTEM [Manufacturer] %string1%=SECTION_0 [SECTION_0] %string2%=VXDDRV.install,*VXDDRV ; HardwareID [VXDDRV.install] CopyFiles=CopyFiles_VXDDRV AddReg=AddReg_VXDDRV LogConfig=LogConfig_VXDDRV [CopyFiles_VXDDRV] VXDDRV.vxd [AddReg_VXDDRV] HKR,,DevLoader,0,VXDDRV.vxd [LogConfig_VXDDRV] ConfigPriority=NORMAL IOConfig=4@200-203%fff0(3FF::) IRQConfig=5,7 [ControlFlags] [Strings] string0=\"XXX\" string1=\"XXX\" string2=\"Data Acquisition Cards\" |
|
15楼#
发布于:2002-12-06 09:13
顶一下,请大侠们帮忙解决一下!
|
|
16楼#
发布于:2002-12-09 16:25
再顶一下。
|
|
17楼#
发布于:2002-12-11 16:30
继续放分,继续发问:
ISA卡中断可以用动态加载的方法进行编程控制,而可以不编写INF安装信息文件、不进行静态安装(在系统中也不可见)吗? |
|