书接上回
响应“清除特性请求”
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;
这个参见“清除特性请求”