# cypress_winusb **Repository Path**: stdplus_wangkai/cypress_winusb ## Basic Information - **Project Name**: cypress_winusb - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-11-25 - **Last Updated**: 2024-02-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 1. # cypress_winusb #### 介绍 使用了CYPRESS的FX2硬件方案,枚举成WINUSB设备,与WINDOS进行免驱通信 #### WINUSB识别WINUSB设备的过程 1. 判断设备描述符中的BCD字段,如果USB版本大于2.0,则尝试去获取BOS字符串描述符 2. 通信BOS描述符,判断是否为WINUSB设备,得到VENDER CODE。 如果是WINUSB设备,则创建注册表项\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags,值为1,则表示是WINUSB设备,可以根据这个来判断是否成功得到了BOS描述符。 **xx xx xx 03 ee ** 3. 根据上一步骤得到的VENDER CODE发送请求,其中INDEX为04的特性描述符,INDEX为05的扩展属性描述符,用来向WINDOWS注册GUID,给应用层调用设备 其中0X17为上一步的VENDER CODE **xx 17 xx xx 04 ** **xx 17 xx xx 05 ** #### 注意点 1. 开发的过程中,最好每次编译后使用新的VID/PID组合,确保系统重新枚举识别设备,不受以前的过程的影响,否则需要每次都删除注册表项 1. 重要参考https://www.usbzh.com/article/detail-1068.html #### CMSIS-DAP识别 1. interface描述符中包含字符串"CMSIS-DAP" 2. 端点分布 Endpoint 1: Bulk Out – used for commands received from host PC. Endpoint 2: Bulk In – used for responses send to host PC. Endpoint 3: Bulk In (optional) – used for streaming SWO trace (if enabled with SWO_STREAM). 3. GUID 必须为{CDB3B5AD-293B-4663-AA36-1AAE46463776} ### 高速模式和全速的切换 先,在CY7C68013A的所有例程中,默认情况下,都是将设备枚举成高速模式的。那么如果想实现将其默认枚举成全速设备的话,应该怎么做呢?那就需要修改其中的寄存器值了。怎么改,改哪里呢?CY7C68013A的实现方法有点weird。因为他不是像别的MCU那样在程序中配置了某个寄存器的值就可以实现的,他是通过修改KEIL软件的配置实现的。准确的说是在KEIL调用Hex2bix文件,实现将HEX的文件转换为IIC文件时通过修改转换的参数来实现的。即将KEIL配置中的命令改成 c:\cypress\usb\bin\hex2bix -c 0x80 -i-f 0xC2 -o bulkloop.iic bulkloop.hex。 如果不加-c 0x80命令,那么CY7C68013A就会默认枚举成高速,加上-c 0x80就默认枚举成全速 那么在实现将设备默认枚举为全速后,如果在程序中将USB断开了一次,CY7C68013A又会变成了高速模式,此时想要切换速度模式,又需要怎么做呢?很简单,只需要这样(大招来了): USBCS |= bmDISCON; // just disconnect from USB CT1&=0x02; //0x02保证程序重启后可以保持在全速,//0x00保证在高速 EZUSB_Delay(1500); USBCS&=~bmDISCON; // reconnect USB USBCS|= bmRENUM; //EZUSB_Discon(TRUE); 即修改寄存器CT1的值就好了。这个寄存器就是控制速度模式的寄存器。但是翻遍了TRM手册,也没有关于这个寄存器的介绍,为什么呢?那是因为这个寄存器是不合法的,准确说是这个寄存器是CYPRESS公司开发的时候,在TEST时候使用的。所以没有公布。以上内容希望对大家有帮助。(本段代码只能参考例程中关于寄存器的文件fx2regs.h)