‮Сдвиг по фазе (kincajou) wrote,
‮Сдвиг по фазе
kincajou

  • Music:

worklog: Я ТЕБЯ ПОБЕДИЛ

SETUP: Request 0005; wLength 0: SET_ADDRESS -> 06

Ну, ещё не совсем победил. Но проклятый SETUP таки прошёл! И заодно выяснилось, что:
1) отдельный хаб, название коего я уже не помню (семипортовый D-Link, маленькая аккуратная чёрная коробочка) опрашивает устройства НЕ ТАК!!!! как контроллер на материнке. Перед тем, как сдаться, он три раза медленно и печально пересбрасывает шину и начинает опрос заново. А контроллер на материнке бодро дёргает провода раз десять-пятьнадцать, почти не делая пауз. Выглядит это так:
  • Хаб: Эй, кто-нибудь!... эх... ну ладно... я ещё подожду, вдруг ответит кто-то... мне-то что... Нда. Нет, не отвечают. BUS RESET. Эй, кто-нибудь!...
  • Материнка: Есть чо? Быра бля BUS RESET Есть чо? Быра бля BUS RESET Есть чо? Быра бля BUS RESET

2) в обоих случаях, обмен в самом деле начинается с запроса дескриптора устройства, а вовсе не с присвоения адреса. Возможно, другие устройства (или операционные системы, тоже вариант) ведут себя иначе, но в этом конкретном случае начало обмена выглядит так (в сокращённом виде):

Проходит USB RESET.
Получаю SETUP: Request 8006; wLength 64: GET_DESCRIPTOR_DEVICE (01=USB_DEVICE_DESCRIPTOR_TYPE)
Отсылаю первые 8 байт дескриптора (решил таки сэкономить на размере пакетов, уж больно мало пакетной памяти в микроконтроллере... боюсь, всё-таки придётся урезать аппетиты).
Приходит OUT длиной 0 bytes сразу же (!). Видимо, это и есть STATUS подтверждение.
Приходит IN, даже успеваю что-то ещё отослать и тут приходит ещё один
USB RESET
а за ним сразу SETUP: Request 0005; wLength 0: SET_ADDRESS -> 06



Дело сдвинулось со второй мёртвой точки.

Заодно перелопатил, наверное, треть библиотечных макросов, превратив чудовищное
#define _SetEPRxTxStatus(bEpNum,wStaterx,wStatetx) {\
register uint32_t _wRegVal; \
\
_wRegVal = _GetENDPOINT(bEpNum) & (EPRX_DTOGMASK |EPTX_STAT) ;\
/* toggle first bit ? */ \
if((EPRX_DTOG1 & wStaterx)!= 0) \
_wRegVal ^= EPRX_DTOG1; \
/* toggle second bit ? */ \
if((EPRX_DTOG2 & wStaterx)!= 0) \
_wRegVal ^= EPRX_DTOG2; \
/* toggle first bit ? */ \
if((EPTX_DTOG1 & wStatetx)!= 0) \
_wRegVal ^= EPTX_DTOG1; \
/* toggle second bit ? */ \
if((EPTX_DTOG2 & wStatetx)!= 0) \
_wRegVal ^= EPTX_DTOG2; \
_SetENDPOINT(bEpNum, _wRegVal | EP_CTR_RX|EP_CTR_TX); \
}

в гораздо более изящное
#define EP_TOGGLEBITS_SET(ep,mask,value) \
USB->EPR[ep] = (USB->EPR[ep] & EPREG_MASK) | ((USB->EPR[ep] & mask) ^ value) /* установить указанные тоггл-биты */

Tags: радио
Subscribe

  • Кончита Ваенга

    ( Сорц) Интересено, а вот ежели бы такое попробывать в мичете?..

  • О настоящем патриоте.

    Олег Матвейчев - лживый идиот и распространитель плоскозёмной пропаганды. Впрочем, ничего нового.

  • штоу?

    и достигл высокой эффективности колумбической системы 99,9%

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 3 comments