基本固件框架的追踪研读之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