|
после приема CONTROL пакета с запросом на присвоение адреса, он почему-то не сразу его присваивает, а ждет следующей посылки IN token, и проверяя флаг в предыдущей послыке, присваивает адрес.
бред... зачем так делать ? почему сразу не присваивается ?
Код после компиляции работает.
вот куски
..............
switch(SetupPkt.bRequest)
{
case SET_ADR:
ctrl_trf_session_owner = MUID_USB9;
usb_device_state = ADR_PENDING_STATE; // Update state only
/* See USBCtrlTrfInHandler() in usbctrltrf.c for the next step */
break;
...........
это USBCtrlTrfInHandler() вызывается
...........
}
else if(USTAT == EP00_IN) // EP0 IN
USBCtrlTrfInHandler();
...........
в его начале проверяется флаг и уст адрес
void USBCtrlTrfInHandler(void)
{
mUSBCheckAdrPendingState(); // Must check if in ADR_PENDING_STATE
if(ctrl_trf_state == CTRL_TRF_TX)
{
USBCtrlTrfTxService();
if(ep0Bi.Stat.DTS == 0)
ep0Bi.Stat._byte = _USIE|_DAT1|_DTSEN;
else
ep0Bi.Stat._byte = _USIE|_DAT0|_DTSEN;
}
else // CTRL_TRF_RX
USBPrepareForNextSetupTrf();
}//end USBCtrlTrfInHandler
вот и макрос с присвоением адреса:
#define mUSBCheckAdrPendingState() if(usb_device_state==ADR_PENDING_STATE) \
{ \
UADDR = SetupPkt.bDevADR._byte; \
if(UADDR > 0) \
usb_device_state=ADDRESS_STATE; \
else \
usb_device_state=DEFAULT_STATE; \
}//end if
E-mail: info@telesys.ru