我接到一个旧的USB设备驱动代码,bos要求我重新写驱动,但是这个驱动不同一般,它是带有固件程序下载的驱动程序,而且是纯DDK代码,实在看得头都大,特别是那个固件程序下载的过程搞不懂,具体代码如下:
NTSTATUS Ezusb_StartDevice( IN PDEVICE_OBJECT fdo )
{
#ifdef DOWNLOAD_KEIL_MONITOR
// download the Keil monitor
// First download loader firmware. The loader firmware implements a vendor
// specific command that will allow us to anchor load to external ram
Ezusb_8051Reset(fdo,1);
Ezusb_DownloadIntelHex(fdo,loader);//loader 是一个buffer 里面存放固件程序
Ezusb_8051Reset(fdo,0);
// Now download the Keil Monitor
if (IsFx2(fdo))
{
Ezusb_KdPrint (("**** Downloading FX2 monitor\n"));
Ezusb_DownloadIntelHex(fdo,mon_ext_sio1_fx2);//这里看不懂了
}
else
{
Ezusb_KdPrint (("**** Downloading EZ-USB monitor\n"));
Ezusb_DownloadIntelHex(fdo,mon_ext_sio1_ezusb););//这里看不懂了
}
Ezusb_8051Reset(fdo,1);
Ezusb_8051Reset(fdo,0);
#endif // if DOWNLOAD_KEIL_MONITOR
Ezusb_KdPrint (("exit Ezusb_StartDevice (%x)\n", ntStatus));
return ntStatus;
}
我知道一开始上电后,USB芯片是以一个默认的VID PID来告诉主机,然后主机打开这个驱动,然后执行到Ezusb_DownloadIntelHex(fdo,loader);把程序下载到USB芯片的存储器,然后Ezusb_8051Reset(fdo,0);
重新复位USB设备,这里就不明白了,复位USB设备是不是会断开USB设备的连接然后再重新列举设备?那如果是的话,当重新列举设备后,这个设备的VID PID已经是下载到固件的程序重新改变了的,怎么还能识别到要调用当前这个驱动程序?就算是能识别到要调用当前这个驱动程序,但是进入这个驱动程序的这个Ezusb_StartDevice()中,执行到Ezusb_DownloadIntelHex(fdo,loader); Ezusb_8051Reset(fdo,0);
这两句,不是产生了一个死循环:下载固件程序、重启设备,如此反复下去。
在下实在菜鸟,盼高手不吝赐教,万分感激!
------解决方案--------------------
它是有两个驱动的。