Цитата(ДЕЙЛ @ Mar 10 2015, 17:06)

Опять вернулся к этой теме. Почитал Агурова и описание модуля. В моём представлении вырисовывается такая картина:
1. Подключаем разъём к ноуту, хост видит, что резистор притянул линию и отсылает запрос;
2. Устройство принимает байты запроса в буфер нулевой конечной точки, смотрит эти байты и формирует массив данных, которые хостом воспринимаются как дескриптор устройства;
3. На основании данных дескриптора хост отправляет более конкретную команду устройству и т.д. до окончания инициализации соединения.
Мои соображения похожи на правду?
в общем да
каждый запрос имеет свой идентификатор и, соответственно, структуру себя родимого и ответа
делается все в switch-case для каждого типа запроса. Если что-то не реализовано, отрабатывается STALL
смотреть во всех кейловских примерах (в яре, по-моему, то же самое было), файл
usbcore.c, функция
USB_EndPoint0примерно так:
CODE
void USB_EndPoint0 (U32 event) {
switch (event) {
case USB_EVT_SETUP:
USB_SetupStage();
USB_DirCtrlEP(SetupPacket.bmRequestType.BM.Dir);
EP0Data.Count = SetupPacket.wLength; /* Number of bytes to transfer */
switch (SetupPacket.bmRequestType.BM.Type) {
case REQUEST_STANDARD:
switch (SetupPacket.bRequest) {
case USB_REQUEST_GET_STATUS:
if (!USB_ReqGetStatus()) {
goto stall_i;
}
USB_DataInStage();
break;
case USB_REQUEST_CLEAR_FEATURE:
if (!USB_ReqSetClrFeature(0)) {
goto stall_i;
}
USB_StatusInStage();
break;
case USB_REQUEST_SET_FEATURE:
if (!USB_ReqSetClrFeature(1)) {
goto stall_i;
}
USB_StatusInStage();
break;
case USB_REQUEST_SET_ADDRESS:
if (!USB_ReqSetAddress()) {
goto stall_i;
}
USB_StatusInStage();
break;
case USB_REQUEST_GET_DESCRIPTOR:
if (!USB_ReqGetDescriptor()) {
goto stall_i;
}
USB_DataInStage();
break;
case USB_REQUEST_SET_DESCRIPTOR:
/*stall_o:*/ USB_SetStallEP(0x00); /* not supported */
EP0Data.Count = 0;
break;
case USB_REQUEST_GET_CONFIGURATION:
if (!USB_ReqGetConfiguration()) {
goto stall_i;
}
USB_DataInStage();
break;
case USB_REQUEST_SET_CONFIGURATION:
if (!USB_ReqSetConfiguration()) {
goto stall_i;
}
USB_StatusInStage();
break;
...... и так далее
сама функция дергается из USB-прерывания (
usbhw.c)