
EZ-USBFX2(68013)固件研究(6).pdf
2页那么,什么是重枚举呢? 首先,上面的 USB 枚举是对通用 USB 来说的,一般 USB 设备只有枚举过程, 没有重枚举过程也就是说其实,对EZ-USB 系列来说,上面的枚举举实际包含 了 EZ-USB 枚举和重枚举两 个过程: 对 EZ-USB 来说,枚举过程就是 USB 上电复位到加载固件前这段过程,此时 USB 设备地址号为默认的0 号,枚举完成后,驱动为 cypress...eeprom..missing(FX2/FX2LP来说)然后加载固件,进行重枚举,重枚举 完成后,显示驱动为cypress...ez-usb...example 或其他自定义设备 为什么 EZ-USB 有重枚举过程呢?这就是为了可以让主机在前期固件未加载 前自动枚举,识别USB,从而可以从上位机加载固件到68013 的 RAM 中,而无 需使用 ROM,EEPROM,FLASH 等内存实现“软件”架构加载程序代码,随时 修改固件 EZ-USB 如何控制重枚举? 首先, EZUSB 有一个寄存器 USBCS,其中第 1 位 USBCS.1为 Renum控制 枚举重枚举在 USB 上电未加载固件代码前, Renum=0,表示使用“ EZUSB 核 心”对芯片的初始配置,处理主机设备请求,并负责把固件下载到RAM 中,这 个过程就是“枚举”,完成该枚举过程的设备叫做“缺省USB 设备 (地址号 0) ”, 即驱动显示为“ ...missing”的设备。
当固件被下载到8051 RAM 后,此时 Renum =1,表示使用“增强8051 核心”处理主机设备请求,并按照固件的代码(读取 所有描述符)重新配置USB 设备,这个过程就叫做“重枚举”,完成重枚举后, 显示自定义的 USB 设备“ ...example”,实际是模拟断开与连接的过程 用以下表表示: 处理设备请求Renum8051 动作 枚举EZUSB 核心Renum=08051 置 Renum=1 重枚举8051Renum=18051 重置 Renum =0 在重枚举完成后, 对控制端点 0 的设备请求可以由“ EZUSB 核心”处理或由 “增强 8051核心”处理,有 Renum的值决定芯片上电时 Renum=0, 由“EZUSB 核心”处理; 一旦 8051开始运行,就可以设置 Renum=1,由“增强 8051核心” 处理,表示按照8051 下载的固件代码处理 当然,这时也可以设置Renum=0,让“ EZUSB 核心”处理端点 0 的设备请 求,而让 8051 完成具体的 USB 数据传输,这样做会大大简化8051固件代码 然后再看接下来的代码: 注意,在这段代码之前,EZUSB 已经枚举完成,当然,整个过程是自动的, 我们看不见的。
#ifndef NO_RENUM if(!(USBCS // renumerate 重列举 } #endif这段代码即告诉 USB 进行重枚举,用软件设置,模拟USB 断开与连接, EZUSB_Discon(TRUE)完成断开连接,具体实现在EZUSB.lib 库中,大概代码是 这样的: void UsbDisconnect(BOOL renum) { if(renum) USBCS |= (bmDISCON | bmRENUM); else USBCS |= bmDISCON; EZUSB_Delay(1500); USBIRQ = 0xff; EPIRQ = 0xff; EZUSB_IRQ_CLEAR(); USBCS } 将 USBCS 寄存器的 DICON 位置 1,断开 USB,同时如果 RENUM 位为 0, 则置 1;然后重新连接 USB // unconditionally re-connect. If we loaded from eeprom we are // disconnected and need to connect. If we just renumerated this // is not necessary but doesn't hurt anything USBCS //重新连接 CKCON = (CKCON // Set stretch // clear the Sleep flag. Sleep = FALSE; //清 sleep标志 这段代码英文意思说的很清楚了,CKCON 还不清楚干什么用的。
紧接着主机开始读描述符,并进行配置(发送SetConfiguration),加载驱动 等,完成重枚举。
