当前位置: 代码迷 >> 驱动开发 >> 带固件程序下载的驱动程序工作过程及具体编程?该如何解决
  详细解决方案

带固件程序下载的驱动程序工作过程及具体编程?该如何解决

热度:187   发布时间:2016-04-28 11:21:13.0
带固件程序下载的驱动程序工作过程及具体编程?
我接到一个旧的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);
这两句,不是产生了一个死循环:下载固件程序、重启设备,如此反复下去。

在下实在菜鸟,盼高手不吝赐教,万分感激!

------解决方案--------------------
它是有两个驱动的。