阅读:918回复:3
用过DriverStudio进行开发的朋友请进
我在当固件程序的时候,遇到一个问题:
我用ds生成了一个驱动,然后根据ds提供的ezusb的例子,添加了一些代码。 在downloadfirmware这个函数中,先当下去了loader这个程序,然后再当一个dev_io程序(有cypress提供的例子),用drivermonitor察看,发现loader成功当下去,但当dev_io的时候就没反应了。然后,再拔出设备,才会出现“failed to download dev_io”的信息。 NTSTATUS USBDRMDevice::DownloadFirmware(void) { t << "Entering DownloadFirmware\n"; NTSTATUS status = STATUS_SUCCESS; Reset8051(1); status = DownloadIntelHex(loader); if( !NT_SUCCESS(status) ) return status; t<<"Download loader OK!\n"; Reset8051(0); status = DownloadIntelHex(dev_io); if( !NT_SUCCESS(status) ) { t << "Fail to Download dev_io\n"; return status; } else { t << "Download dev_io OK!\n"; } Reset8051(1); Reset8051(0); return status; } downloadintelhex调用了下面的函数 NTSTATUS USBDRMDevice::DownloadRAM(PINTEL_HEX_RECORD pHexRecord, bool fExternal) { t << "Entering DownloadRAM\n"; NTSTATUS status = STATUS_SUCCESS; URB Urb; while( 0 == pHexRecord->Type ) { if( fExternal ? (! INTERNAL_R(pHexRecord>Address )) : (INTERNAL_RAM( pHexRecord->Address )) ) { m_Lower.BuildVendorRequest( pHexRecord->Data, pHexRecord->Length, 0, static_cast<UCHAR>( fExternal ? ANCHOR_LOAD_EXTERNAL : ANCHOR_LOAD_INTERNAL), pHexRecord->Address, FALSE, //default FALSE, //default NULL, //default 0, //default URB_FUNCTION_VENDOR_DEVICE,//default &Urb ); status = m_Lower.SubmitUrb(&Urb); if( !NT_SUCCESS(status) ) { t << " SubmitUrb Failed ! \n"; break; } else { t << " SubmitUrb OK! \n"; break; } } pHexRecord++; } return status; } SubmitUrb这个函数既没返回成功,也没返回失败? 它将irp传到底层的驱动,但我如何知道irp处理的情况? irp到底是如何进行工作的? 这个问题已经搞了很久了,一直没搞定,还请各位指点指点!急啊! |
|
沙发#
发布于:2004-02-25 11:01
可以理解,不过那个驱动是不需要修改就可以应用的
至少对于那个芯片是这样 |
|
|
板凳#
发布于:2004-02-25 10:59
开发板带驱动的是直接用ddk写的,我是想用ds来做一个。
我的目的是想验证一下我的驱动程序,ds封装了ddk的东西后是变的很简便,但如果不了解驱动程序工作的细节,写代码还是有些困难。 我觉的对于以前没做过驱动的新手来说,直接用ds开发还是有些困难,而且ds的帮助写的并不是很详细,也没有一个专门讨论ds开发的论坛,一个人做起来会感到有点费力。 有没有工具可以跟踪调试驱动程序?像vc我就可以debug,知道程序具体是怎么运行的,可驱动呢?它的一些函数是怎么进入的? |
|
地板#
发布于:2004-02-25 10:39
我想你还是用芯片自带的那个驱动程序比较合适
|
|
|