基本固件框架的追踪研读之SETUP命令的处理6

书接上回

响应“清除特性请求”

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 Feature
if(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;
这个参见“清除特性请求”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值