基本固件框架的追踪研读之SETUP命令的处理6
来源:互联网 发布:淘宝怎么编辑宝贝上架 编辑:程序博客网 时间:2024/06/05 19:04
书接上回
响应“清除特性请求”
case SC_CLEAR_FEATURE: // *** Clear Feature if(DR_ClearFeature()) switch(SETUPDAT[0]) { case FT_DEVICE: // Device if(SETUPDAT[2] == 1) Rwuen = FALSE; // Disable Remote Wakeup else EZUSB_STALL_EP0(); // Stall End Point 0 break; case FT_ENDPOINT: // End Point if(SETUPDAT[2] == 0) { *(BYTE xdata *) epcs(SETUPDAT[4]) &= ~bmEPSTALL; EZUSB_RESET_DATA_TOGGLE( SETUPDAT[4] ); } else EZUSB_STALL_EP0(); // Stall End Point 0 break; } break;
照例,可以忽略 if(DR_ClearFeature())。清除特性请求用于清除远程唤醒和停止位,所以,用switch(SETUPDAT[0])判断一下是哪一种。
清除设备特性,即清除远程唤醒
case FT_DEVICE: // Device if(SETUPDAT[2] == 1) Rwuen = FALSE; // Disable Remote Wakeup else EZUSB_STALL_EP0(); // Stall End Point 0 break;
其实,我有一点不明白,变量Rwuen在声明的时候,并没有指明地址,他是怎么跟Remote Wakeup这个功能连接起来的呢???
清除断电特性,牵涉到STALL位。
case FT_ENDPOINT: // End Point if(SETUPDAT[2] == 0) { *(BYTE xdata *) epcs(SETUPDAT[4]) &= ~bmEPSTALL; EZUSB_RESET_DATA_TOGGLE( SETUPDAT[4] ); } else EZUSB_STALL_EP0(); // Stall End Point 0 break;
其中,*(BYTE xdata *) epcs(SETUPDAT[4]) &= ~bmEPSTALL;用于清除STALL位;EZUSB_RESET_DATA_TOGGLE( SETUPDAT[4] );用于复位对应端点的TOGGLE:
#define EZUSB_RESET_DATA_TOGGLE(ep) TOGCTL = (((ep & 0x80) >> 3) + (ep & 0x0F));\ TOGCTL |= bmRESETTOGGLE
其中,TOGCTL = (((ep & 0x80) >> 3) + (ep & 0x0F))用于写端点选择位和端点方向。TOGCTL |= bmRESETTOGGLE用于将Data Toggle 设置到DATA0。“\”是续接上文的意思,表示其前后的内容是同一行,因为#define宏定义的内容必须在同一行里。
我又在文档里追踪到了 8.6.3.4 TOGCTL;
不过,这个固件又没有按照文档的要求完成数据触发位的复位,因为第二步,固件仅仅是将BIT5置1。这是USB的一种差错控制机制:
响应“设置特性请求”
case SC_SET_FEATURE: // *** Set Featureif(DR_SetFeature()) switch(SETUPDAT[0]) { case FT_DEVICE: // Device if(SETUPDAT[2] == 1) Rwuen = TRUE; // Enable Remote Wakeup else if(SETUPDAT[2] == 2) // Set Feature Test Mode. The core handles this request. However, it is // necessary for the firmware to complete the handshake phase of the // control transfer before the chip will enter test mode. It is also // necessary for FX2 to be physically disconnected (D+ and D-) // from the host before it will enter test mode. break; else EZUSB_STALL_EP0(); // Stall End Point 0 break; case FT_ENDPOINT: // End Point *(BYTE xdata *) epcs(SETUPDAT[4]) |= bmEPSTALL; break; default: EZUSB_STALL_EP0(); // Stall End Point 0 }break;
这个参见“清除特性请求”
0 0
- 基本固件框架的追踪研读之SETUP命令的处理6
- 基本固件框架的追踪研读之SETUP命令的处理1
- 基本固件框架的追踪研读之SETUP命令的处理2
- 基本固件框架的追踪研读之SETUP命令的处理3
- 基本固件框架的追踪研读之SETUP命令的处理4
- 基本固件框架的追踪研读之SETUP命令的处理5
- 基本固件框架的追踪研读之SETUP命令的处理7
- 基本固件框架的追踪研读之USB事务处理
- 基本固件框架的追踪研读之描述符1
- 基本固件框架的追踪研读之USB控制传输
- EZ-USB固件框架的追踪研读之main函数1
- EZ-USB固件框架的追踪研读之main函数2
- EZ-USB固件框架的追踪研读之main函数3
- 追踪研读法破解EZ-USB的“远程唤醒”
- GDI对位图文件的基本处理
- 用Source Insight追踪Arduino的setup和loop
- 【Darwin学习笔记】之QTSSReflectorModule的Setup消息处理
- 【Darwin学习笔记】之QTSSReflectorModule的Setup消息处理
- MySQL数据库事务隔离级别(Transaction Isolation Level)
- SQL--index类型
- 计算机网络基础
- ios 小知识点
- uva 10285 Longest Run on a Snowboard 最长滑雪路
- 基本固件框架的追踪研读之SETUP命令的处理6
- 解决服务器存在大量time_wait的问题
- Ubuntu使用技巧
- js 中创建Map的方法
- IOS UIWebView与Javascript之间的交互
- 他人博客链接(工作相关)
- Highcharts中字符串处理方式(2)
- poj 3185 贪心翻硬币 高斯消元
- 脏读、不可重复读 共享锁、悲观锁 和 事务五种隔离级别