小小的usb enumeration,竟然耗掉我20多天的青春,想起来,还是对Cypress CY7cxxx的BIOS功能没有吃透,把大部份时间花在新方法的尝试上,对IC的特性,USB的背景知识了解不够深哦、
case ES_SET_CONFIG:
DBGLOG( TRC_enum_handler, 0x8008 );
// We have completed sending the set configuration request to the device.
// Advance the enumeration state.
dev_ptr->enum_state = ES_CFG_PRODID;
send_request( dev_ptr, EP0, TD_CTRL_DIR_IN, REQ_TYPE_DATA,
USB_GET_DESCRIPTOR_REQUEST,
USB_STRING_DESCRIPTOR_TYPE_MASK, 0,
8,enumeration_handler );
break;
/* * * * * * * F A L L T H R O U G H * * * * * * */
case ES_CFG_PRODID:
DBGLOG( TRC_enum_handler, 0x8007 );
dev_ptr->enum_state = ES_CFG_OSID;
PtrLangId = urb->transfer_buffer;
send_request( dev_ptr, EP0, TD_CTRL_DIR_IN, REQ_TYPE_DATA,
USB_GET_DESCRIPTOR_REQUEST,
USB_STRING_DESCRIPTOR_TYPE_MASK2, PtrLangId[1],
180,enumeration_handler );
break;
case ES_CFG_OSID:
DBGLOG( TRC_enum_handler, 0x8007 );
ParsePidStr(urb->transfer_buffer);
dev_ptr->enum_state = ES_FIND_DRIVER;
send_request( dev_ptr, EP0, TD_CTRL_DIR_IN, REQ_IN_XEROX,
GET_OS_DESCRIPTOR,
0, 0,
8,enumeration_handler );
对于GET_OS_DESCRIPTOR的response,由于REQ_IN_XERX&0x40 == 0x40,要在中断SUSB1_VENDOR_INT回答.
/***************************************************IMPORTANT*******************************/
These interrupts will be called whenever bit 6 of a bmRequest byte is set ((bmRequest&0x40)==0x40).
而对于gerneral reqeust,如GET_DESCRIPTOR,GET_INTERFACE....则在SUSB1_STANDARD_INT中回答.
切记,吃透spec,再动手写程序.
这些天发现serial trace调试方法的巨大功力,尤其是实时变化快,很难捕捉的数据.呵呵,没有它,我可真死翘翘啦!