固件生成操作是由函数GenerateRfw完成。其原型为:
执行该函数需获得文件当前工程下的路径.以及文件大小,因此需调用FileFulJLlName函数。FileFullName函数原型为:INT FileFullName(CString FileName,CString &FilePath—Name);其中FileName为存储在工程目录下的文件名,FilePathName为文件路径的引用。该函数返回值为文件大小。
4 获取USB设备路径
便携式设备在进入固件升级模式时.向PC机枚举该设备的各类描述符,在成功应答最初的不完整的设备描述符请求后,PC机向设备分配一个新地址.该地址就是固件升级程序中需获取的设备路径。接着,PC机在得到完整的设备描述符、配置描述符、字符描述符后加载设备驱动程序。该过程完成后,通过驱动程序与设备通信。在开发应用软件中,通过API函数调用获取设备路径,该获取过程分为以下步骤:
(1)调用Windows设备管理函数SetupDiGetClassDevs()获取设备信息集。函数SetupDiGetC1assDevs()是设备信息集的处理程序,包含所有与指定参数匹配的已安装设备。
(2)利用函数SetupDiEnumDeviceInterfaces()返回设备信息集的一个设备接口元素的环境结构,每次调用该函数便返回一个设备接口信息,重复调用,直到获取设备信息集所有接口信息。函数SetupDiEnumDeviceInterfaces()调用成功返回“TRUE”且devicelnfoData指定一个与查找参数相符的接口。
(3)调用函数SetupDiGetDeviceInterfaceDetail()获得该接口详细信息。用其获得接口详细信息,必须先得到所请求的缓冲区大小,再分配适当的缓冲区,并再次调用该函数以得到接口详细信息。此时返回的接口信息包含设备接口名称.用户可调用函数CreateFile()获取所要打开设备的句柄。
5 USB二级BOOt loader的下载
该设计便携式设备在固件升级时.首先由第1级Bootloader引导进入USB Boot模式.并向PC枚举该设备。PC识别该USB设备,并加载相应驱动程序后。固件升级过程便获取设备系统路径。因为每一个USB设备有一个PID和VID,应用程序通过PID和VID定位到固件升级的USB设备。获取设备路径和句柄后,利用USB总线读取设备数据,从而为完成应用程序与USB设备通信做好准备。
由于器件MASK ROM的空间限制,诸如USB命令解析、Flash设备驱动等应用代码,也就是USB模式下的二级Bootloader代码,需要通过PC机下载至器件IRAM。
USB二级代码的下载过程创建子线程用于检测设备,只有确认设备已连接,才能下载二级代码,总的下载流程如图3所示,图中实线为主线程,虚线为子线程。
在获取到设备路径后,系统便调用函数CreateFile()获取设备句柄。利用该设备句柄和获取的二级代码文件路径,便能够通过调用函数Boot_VendorRequest()将二级代码下载到设备IRAM中。
Boot_VendorRequest函数原型为:B00L Boot_VendorRe-quest(HANDLE hDevice,DWORD requestCode,LPCTSTR str-FileName);其中hDevice是设备句柄,requestCode是请求控制码,strFileName是二级代码文件路径,返回值为“TRUE”,说明下载成功,否则下载失败。该函数主要调用系统函数DeviceIoControl(),将二级代码文件进行CRC校验后,传入设备IRAM。