[an error occurred while processing this directive]
|
Например Input Endpoint 0 Configuration имеет адрес 0x6780
Input Endpoint 0 Byte Count имеет адрес 0x6781
И они оба описаны в csl_usbhal.h как указатели на 16 битные числа:
#define USBICNF0 *(ioport Uint16 *)USBICNF0_ADDR
#define USBICT0 *(ioport Uint16 *)USBICT0_ADDR
То есть когда я пишу:
USBICNF0=(USBEPCNF_UBME | USBEPCNF_USBIE | USBEPCNF_STALL);
USBICT0=18;
То реально каждое присвоение вызывает следующие действие.
1.Чтение порта во временную переменную.
2.Наложение маски на переменную для освобождения места под байт (and)
3.Наложение собственно байта (or) в нужное место.
4.Запись временной переменной в порт?
А то я что-то не могу увидеть прерывание от Endpoint 1 IN.
После получения запроса Get Descriptor Device.
Разрешаю Endpoint 1 IN:
USBICNF0=(USBEPCNF_UBME | USBEPCNF_USBIE);
Копирую данные:
CopyMemToControlIn (&StrDescriptorDevice[0],&ControlIn, 18);
Даю команду отправить 18 байт:
USBICT0=18;
А прерывание не происходит.
Я знаю что драйвер Windows после получения части дескриптора генерирует сброс шины.
Пробовал отсылать нулевой пакет USBICT0=0;
Все равно не появляется флаг прерывания.
Только USB Reset/Suspend/Resume и Get Descriptor Device.
USBIEPIF=0
USBIEPIE=1
USBICNF0=A4
Может флаг от Endpoint 0 In сбрасывается сигналом шины USB reset и я его не увижу?
E-mail: info@telesys.ru