Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.226.165.131] |
|
Страницы: (14) « Первая ... 10 11 [12] 13 14 все ( Перейти к последнему сообщению ) |
Сообщ.
#166
,
|
|
|
потом...
Добавлено не успел. потом опишу |
Сообщ.
#167
,
|
|
|
Посмотрел инициализацию. Вроде все нормально. Но Обрати внимание:
ты пишешь ;Disable Periodic List, Isochronous List ;Control List and Bulk List proccessing mov [dword ptr GS:ECX+04h],080h - тут вероятно дожно быть 0B3h или я ошибаюсь? Добавлено или ты вообще списки кадров не обрабатывашь? |
Сообщ.
#168
,
|
|
|
Цитата uchtinka @ Посмотрел инициализацию. Вроде все нормально. Но Обрати внимание: ты пишешь ;Disable Periodic List, Isochronous List ;Control List and Bulk List proccessing mov [dword ptr GS:ECX+04h],080h - тут вероятно дожно быть 0B3h или я ошибаюсь? почему 0B3h? Bulk и Control List Enable я включаю в процедуре WaitTransactionComplete, там я сосбтвенно и запускаю обработку ControlEDHead. PROC WaitTransactionComplete near pushad mov ESI,[USB_BaseAddr] mov [dword ptr GS:ESI+03Ch],0 mov ESI,[Addr_HcEndpoint0] xor [word ptr GS:ESI],CW1Skip mov ESI,[USB_BaseAddr] or [dword ptr GS:ESI+8],02h;ControlListFilled or [dword ptr GS:ESI+4],16;ControlListEnabled ... А вот PeriodicListEnable я не выставляю...только обратил внимание на это.Спасибо. Попробую вечерком с этим изменением. Цитата uchtinka @ или ты вообще списки кадров не обрабатывашь? А в OHCI есть FrameList? Вероятно, не обрабатываю. Я выложил все исходники, только без функций получения стандартных дескрипторов. Но получаю я их точно так же, как и запрос делаю. Почти те же функции, только тут константы забиты. |
Сообщ.
#169
,
|
|
|
Да список кадров нужен, только для UHCI прихидится резать пакет на кусочки, а в OHCI можно сразу до 4к кажется размер кадра указать. Поэтому если у тебя скажем mass storage устройство то можно пакет вовсе не резать поскольку все равно по секторам обмен идет. Фактически очередь будет из одного дескриптора передачи -если это bulk -транзакция.
А вот если control то схема транзакции такая: 1. Сначала setup пакет 2. Данные 3. Статус пакет и каждый пакет упаковывается в свой TD |
Сообщ.
#170
,
|
|
|
uchtinka
я так и делаю, setup packet, пакет данных ... ;setup packet (hid, set report) SetReport DB 21h,09h,01,02,0,0,40h,0 ;Пакет данных DataReport DB 64 dup(0) на uhci получается работать с устройством, а вот ohci - никак нет Исправил (Periodic List Enable), никаких изменений не дало. Кстати, попытался сделать ожидание завершения транзакции через проверку в дескрипторе первой конечной точки указателей на пакеты получения данных (IN) и пакет подтверждения (OUT), они никогда не равны. Т.е., получается что этот дескриптор вообще не обрабатывается HC-ом? Хотя в HccaDoneHead хранится указатель на дескриптор передачи на приём данных с устройства с первой КТ. |
Сообщ.
#171
,
|
|
|
Анализируя твой код возник ряд вопросов
1. mov EAX,[Addr_HcTransDescr] mov [dword ptr GS:ESI+8],EAX;TD Queue Head Pointer (HeadP) 0 C=0 H=0 mov [dword ptr GS:ESI+4],EAX;TD Queue Tail Pointer (TailP) mov [dword ptr GS:ESI+12],0;Next Endpoint Descriptor (NextED) Получается что у тебя и начало и конец очереди в дескрипторе EP совпадают? Но ведь у тебя там 3 дескиптора в очереди наверное надо прибавить к [dword ptr GS:ESI+4] +30h ? попробую Добавлено TD - Set Report (8 байт) - правильно Добавлено только зачем bufferRounding в 1 поставил? Добавлено 3;Handshake TD в DelayInterrupt поставь 000 Добавлено Досмотрел до конца - первый пункт отпадает Добавлено Попробуй проверять HCINTERRUPTSTATUS еще Добавлено и еще попробуй проверить HccaDoneHead это HCCA+0x84 - туда запосятся обработнные дескрипторы Вот как у меня ... obulk_loop: ; ... push OCADR_DONE_HEAD call XMSCadrGetDWORD add sp, 2 or eax, eax jz short obulk_read_intstatus test al, 1 jnz short obulk_read_intstatus mov eax, 2 ; WritebackDoneHead jmp short obulk_tst_status ; --------------------------------------------------------------------------- obulk_read_intstatus: ; ... push OHCI_HCINTERRUPTSTATUS ; Register call ReadFromDevice add sp, 2 obulk_tst_status: ; ... mov [bp+SaveIntStatusReg], eax test eax, 2 ; WritebackDoneHead jnz short obulk_end_loop2 test eax, 4 ; StartofFrame jz short obulk_flush_status dec cx or cx, cx jnz short obulk_flush_status jmp short obulk_end_loop |
Сообщ.
#172
,
|
|
|
Ошибка возникает в пакете DataReport...покрайней мере адрес в HcDoneHead является адресом DateReport пакетом.
Код ошибки 0101 Device did not respond to token (IN) or did not provide a handshake (OUT). Если же EN=0010b, то вылетает по таймауту... Вообщем ошибка где-то в запросе к устройству... . Кстати, на UHCI я через нулевую КТ отправлял запросы к устройству, с первой КТ (IN) получал ответы. А на OHCI точно так же? или тут принципиально запросы отправляются через 2ю КТ (OUT). Или вообще нужно SetupPacket(Set Report) на нулевую, сам Report на 2ю, а ответ с 1й? |
Сообщ.
#173
,
|
|
|
Попробуй еще в _HCCONTROLHEAD_ED записать физ адрес первого дескриптора конечной точки перед ControlListFilled
Добавлено С конечными точками работа аналогично UHCI |
Сообщ.
#174
,
|
|
|
На физ адрес дескриптора нулевой КТ, так?. Убрал BulkFilled и BulkHeadEd. не работает. (это ведь Control транзакция, запрос к устройству?!). Есть ещё какие-нибудь идеи?
по таймауту вываливается |
Сообщ.
#175
,
|
|
|
попробуй bufferRounding в 0 а CC=1111
Добавлено Да вроде у меня тоже все так Может у тебя OHCI как плата расширения? Добавлено А ты пробовал просто дескриптор какой-нибудь считать? |
Сообщ.
#176
,
|
|
|
Цитата uchtinka @ Может у тебя OHCI как плата расширения? Эм...это существенно меняет ситуацию? У меня OHCI как плата расширения Цитата uchtinka @ А ты пробовал просто дескриптор какой-нибудь считать? Да, я выполнил успешно Enumeration, получил стандартные дескрипторы: устройства, конфигурации; выполнил Set Configuration тоже без ошибок, по-моему(кстати, Set Configuration Обязательно делать, или по умолчанию устанавливается конфигурация устройства, если она одна?). Теперь осталось реализовать обмен данными с HID устройством. |
Сообщ.
#177
,
|
|
|
То, чт это плата расширения - ничего не менят, это точно такоеже PCI устройство, как и контроллер в составие чипсета.
SetConfiguration длать обязательно, причем номер конфигурации брать из дескриптора конфигурации. |
Сообщ.
#178
,
|
|
|
Огромное спасибо Barbosman. Вообщем ошибка заключалась в том что не проходил SET_ADDRESS и SET_CONFIGURATION.
А не проходили они из-за того что я не отправлял HandShake пакет. Как оказалось в очереди TD должен всегда присутствовать пустой TD. Тогда как у меня в очереди было при SET_ADDRESS, допустим, только 2 TD (Setup,Ack). Соответственно когда EP0.Headp==EP0.TailP Ack пакет не обрабатывался и транзакция устройство не обратывало Setup запросы. Теперь обращение к устройству вроде проходит нормально. Кто-нить может подсказать как получать ответ с конечной точки по прерываниям? Алгоритм. Цепочку TD я формирую такую: TD[0]=pidIN(DataX), TD[1]=pidOUT.Ack(Data1), TD[2]=Empty. EndpointDescriptor1 прописываю в HCCA во всех полях, т.к. PollingInterval = 1. В ED1 тоже нужно при формировании очереди устанавливать бит Skip, а потом снимать его для получения ответа от устройтсва? |
Сообщ.
#179
,
|
|
|
Вообщем не знаю правильно ли я делаю или нет, но попробовал работать с первой конечной точкой по прерываниям точно так же как и с нулевой и получить ответ от устройства удалось. Т.е. фактически просто поменял адрес конечной точки вместо 0 на 1 и всё дальше точно так же.
Причем адрес дескриптора конечной точки записываю в HcControlHeadEd. Устанавливаю бит ControlFilled и сверяю headp и tailp. Триггер сохраняю. Вообщем uhci и ohci побеждены для моей задачи, всем огромное спасибо за помощь. |
Сообщ.
#180
,
|
|
|
Привет всем! Решил потренироваться с USB под миниксом и столкнулся с такой проблемой. Пытаюсь записать 4 байта (0x00000008 - захват управления у SMM) в 32-битный регистр хост-контроллера OHCI (адрес 0xE8004008) и без толку. Если же пишу только в младшие 2 байта этого регистра, то запись проходит (есть нужная реакция в контрольном регистре). Ради интереса делал 12-байтовое копирование - и запись тоже прошла успешно. Как правильно писать 4 байта в регистр? Сейчас используется следующая функция:
! PUBLIC void phys_copy(phys_bytes source, phys_bytes destination, ! phys_bytes bytecount); ! Copy a block of physical memory. PC_ARGS = 4 + 4 + 4 + 4 ! 4 + 4 + 4 ! es edi esi eip src dst len .align 16 _phys_copy: cld push esi push edi push es mov eax, FLAT_DS_SELECTOR mov es, ax mov esi, PC_ARGS(esp) mov edi, PC_ARGS+4(esp) mov eax, PC_ARGS+4+4(esp) cmp eax, 10 ! avoid align overhead for small counts jb pc_small mov ecx, esi ! align source, hope target is too neg ecx and ecx, 3 ! count for alignment sub eax, ecx rep eseg movsb mov ecx, eax shr ecx, 2 ! count of dwords rep eseg movs and eax, 3 pc_small: xchg ecx, eax ! remainder rep eseg movsb pop es pop edi pop esi ret |