
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.218] |
![]() |
|
Страницы: (51) « Первая ... 29 30 [31] 32 33 ... 50 51 ( Перейти к последнему сообщению ) |
Сообщ.
#451
,
|
|
|
StasNewOs, дамп всех QH, TD в студию. А также регистров состояния.
|
Сообщ.
#452
,
|
|
|
Да, еще надо посмотреть на расположение qTD в памяти - они не должны пресекать границы физических страниц памяти.
|
Сообщ.
#453
,
|
|
|
В спеках я читал, что при 64 битной у qTD размер становится не 32 а 32+20. Управление у биоса я забирал как вы говорили, там ожидание с проверкой бита и если бы я там ошибся то всё повисло бы в этом ожидании.
Размер qTD сделал не 52 а 64 иначе следующий адрес будет без 5 нулей в начале. Добавлено Формирую я все qTD и данные так ![]() ![]() pre_allocate_Qh: mov [edi],edi ;адрес or dword[edi],11b ;QH (queue head) QH/(s)iTD/FSTN Select (Typ)[2-1] Terminate (T)[0]последний mov dword[edi+4],0x5200e000 ;RL[31-28]=5 C[27]=0 Maximum Packet Length[26-16]=200 ;H[15]=1 DTC[14]=1 EPS[13-12]=10b High-Speed Endpt[11-8] I[7]=0 Device Address[6-0]=0 mov dword[edi+8],0x40000000 ;Mult[31-30]=01b Port Number[29-23] Hub Addr[22-16] Split Completion Mask (?Frame C-Mask)[15-8] ;Interrupt Schedule Mask (?Frame S-mask)[7-0] mov dword[edi+12],0 ;Current Element Transaction Descriptor Link Pointer mov dword[edi+16],1 ;qTD последний mov dword[edi+20],1 ;Alternate Next qTD mov dword[edi+24],0 mov dword[edi+28],0 ;Buffer Pointer Page 0-4 mov dword[edi+32],0 mov dword[edi+36],0 mov dword[edi+40],0 mov dword[edi+44],0 mov dword[edi+48],0 ;Extended Buffer Pointer Page 0-4 mov dword[edi+52],0 mov dword[edi+56],0 mov dword[edi+60],0 mov dword[edi+64],0 ret enumeration: ;edi - адрес QH, eax - Port Status and Control Register, edx - USB Command Register mov ebx,def44 ;В команды заполним пакет из 8 байт для нумерации mov byte[ebx],0 ;bmRequestType mov byte[ebx+1],5 ;bRequest SET_ADDRESS mov [ebx+2],cx ;wValue Device Address mov word[ebx+4],0 ;wIndex mov word[ebx+6],0 ;wLength mov edi,[ebp+60] mov byte[edi+4],0 ;сконфигурированное устройство в начале с 0 адресом add edi,16 mov dword[edi],edi add dword[edi],64 ;следующий qTD mov dword[edi+4],1 ;Alternate Next qTD Pointer mov word[edi+10],8 ;dt[31]=0 Total Bytes to Transfer[30-16]=8 mov byte[edi+9],10b ;ioc[15]=0 C_Page[14-12]=0 Cerr[11-10]=0 PID_Code[9-8]=10b(SETUP) mov byte[edi+8],80h ;Status[7-0]=1 активируем mov dword[edi+12],ebx ;наш пакет mov dword[edi+16],0 mov dword[edi+20],0 mov dword[edi+24],0 mov dword[edi+28],0 mov dword[edi+32],0 mov dword[edi+36],0 mov dword[edi+40],0 mov dword[edi+44],0 mov dword[edi+48],0 add edi,64 mov dword[edi],1 ;следующий qTD последний mov dword[edi+4],1 ;Alternate Next qTD Pointer mov word[edi+10],0 ;dt[31]=0 Total Bytes to Transfer[30-16]=0 пакет нулевой длинны mov byte[edi+9],01b ;ioc[15]=0 C_Page[14-12]=0 Cerr[11-10]=0 PID_Code[9-8]=01b(IN) mov byte[edi+8],80h ;Status[7-0]=1 активируем mov dword[edi+12],0 mov dword[edi+16],0 mov dword[edi+20],0 mov dword[edi+24],0 mov dword[edi+28],0 mov dword[edi+32],0 mov dword[edi+36],0 mov dword[edi+40],0 mov dword[edi+44],0 mov dword[edi+48],0 sub edi,80 mov ebx,dword[ebp+64] bts dword[ebx],5 ;Asynchronous Schedule Enable на выполнение нумерации @@: cmp byte[edi+24],80h ;проверка готовности jnz @f jmp @b @@: mov al,byte[edi+24] mov [ebp+69],al ;@@: cmp byte[edi+88],80h ;проверка готовности ; jnz @f ; jmp @b ;@@: mov eax,0fffffffh @@: dec eax jnz @b mov al,byte[edi+89] mov [ebp+70],al btr dword[ebx],5 ;выключим ret |
Сообщ.
#454
,
|
|
|
Кстати если QH = 16 и qTD 64, то у следующего qTD адрес с 4 нулями
Добавлено Первый qTD контроллер берёт как продолжение QH, а следующий ищет по адресу? Добавлено Всё исправил, во втором qTD у меня пятый бит в адресе был 1, а для контроллера первые 5бит как 0 всегда, т.е. не тот адрес получался. добавил к 16(для QH) ещё 80 и получилось что второй после 96(1100000), т.е. 28 байт теряются(для выравнивания). Нет не проходит второй qTD опять |
Сообщ.
#455
,
|
|
|
А почему ты в QH ставишь Max Packet Length = 512? Когда устройство непронумеровано (а оно у тебя непронумеровано - адрес 0), оно работает с пакетами по 8 байт, причем вообще может отдать тебе не более 8 байт. После нумерации оно уже заработает в полную силу, но и то endpoint 0 не будет работать с пакетами 512 байт. Max Packet Length всегда надо брать из дескрипторов. Для 0-й точки - из DEVICE DESCRIPTOR, для bulk-in и bulk-out - из дескриптора конфигурации.
Добавлено Цитата StasNewOs @ Первый qTD контроллер берёт как продолжение QH, а следующий ищет по адресу? ?????? Как это - как продолжение QH? А зачем тогда в QH адрес qTD указывается???? |
Сообщ.
#456
,
|
|
|
QH это 16байт, в котором есть адрес следующего QH и текущего qTD, дальше идет qTD в котором есть адрес следующего qTD
Добавлено а первый qTD это же продолжение QH чтото я опять запутался. |
Сообщ.
#457
,
|
|
|
Цитата StasNewOs @ QH это 16байт, в котором есть адрес следующего QH и текущего qTD, дальше идет qTD в котором есть адрес следующего qTD Добавлено а первый qTD это же продолжение QH чтото я опять запутался. Да, ты прав. Я опять с UHCI спутал. |
Сообщ.
#458
,
|
|
|
Попробую изменить размер Max Packet Length, у вас же работает нумерация, если не трудно напишите рабочий пример заполнения, ато я буду до пенсии мучаться.
|
Сообщ.
#459
,
|
|
|
Кстати контроллер в адрес следующей qTD записал адрес второй и видимо смотрел её, но не захотел, а всётаки, зачем нужен альтернативный адрес.
|
Сообщ.
#460
,
|
|
|
Вот первые транзакции для какого-то картридера. Сначала я беру неполный DEVICE DESCRIPTOR (всего 8 байт, поскольку устройство еще не пронумеровано). В эти 8 байт уже попадает поле bMaxPackSize (у этого картридера - 64 байта). Потом - присваиваю адрес. Расписывать, что какой бит значит, не буду - документацию все читали.
Скрытый текст SETUP-IN QH 6300:0C80 physaddr=00063c80 ;это адрес самого QH 00063c80 00086000 40000000 00063d00 TD 0 6300:0D00 physaddr=00063d00 ;это адрес самого TD, дальше - все аналогично 00063d40 00063d40 00080280 00066880 00000000 00000000 00000000 00000000 TD 1 6300:0D40 physaddr=00063d40 00063d80 00063d80 80080181 00066000 00000000 00000000 00000000 00000000 TD 2 6300:0D80 physaddr=00063d80 00000001 00000001 80000080 00000000 00000000 00000000 00000000 00000000 Enumerate device as 1 SETUP QH 6300:0C80 physaddr=00063c80 00063c80 00406000 40000000 00063d00 TD 0 6300:0D00 physaddr=00063d00 00063d40 00063d40 00080280 00066880 00000000 00000000 00000000 00000000 TD 1 6300:0D40 physaddr=00063d40 00000001 00000001 80000d80 00000000 00000000 00000000 00000000 00000000 Там у меня адрес для ввода/вывода все время один и тот же, но это не значит, что инфа по этому адресу одна и та же. Просто выделен специальный буфер, который гарантированно не пересекает границу физической страницы, и через этот буфер идет весь обмен. |
Сообщ.
#461
,
|
|
|
Спасибо, вижу что у вас в альтернативном адресе тот же адрес, на следующую
|
Сообщ.
#462
,
|
|
|
Цитата StasNewOs @ Попробую изменить размер Max Packet Length Первый запрос дескриптора устройства с размером пакета 8 байт, далее из пакета находишь уже выставляешь настоящий размер пакета. Добавлено Цитата StasNewOs @ зачем нужен альтернативный адрес. ЕНИП контроллер его использует в случае ошибок транзакции, хотя могу ошибаться у меня нет на работе документации под рукой, а у тебя должна быть. Добавлено Цитата StasNewOs @ что у вас в альтернативном адресе тот же адрес, на следующую Что-то мне подсказывает, что это дамп от UHC, а не EHC. Добавлено StasNewOs, если так надо, то воскресенье вечером (по Мск) могу выложить аналогичный дамп от EHC, раньше не могу т.к. уеду сейчас из города. Добавлено И ты бы тоже свой дамп выложил в таком же виде, а то изучать твой код у меня нет никакого желания, да думаю и у других людей тоже. |
Сообщ.
#463
,
|
|
|
Алилуя прошли два qTD, пойду отлаживать получение дескриптора и сектора.
В альтернативный адрес поставил такой же как и в следующий и поставил такие же пораметры для qTD, как и в примере. |
Сообщ.
#464
,
|
|
|
Цитата shm @ Что-то мне подсказывает, что это дамп от UHC, а не EHC. Не, точно от EHC. Я его брал прямо из своего модуля EHCI. И у Стаса вроде прошло. ![]() Добавлено Цитата StasNewOs @ Алилуя прошли два qTD, пойду отлаживать получение дескриптора и сектора. Там с дескриптором конфигурации есть одна хитрость. Дело в том, что он бывает переменной длины. Поэтому надо сначала прочитать его со стандартной длиной (18 байт) и найти там поле, в котором написан реальный размер (не помню, как оно называется, но оно точно там есть). И потом прочитать его заново, уже полностью, взяв этот размер в качестве требуемой длины. После этого его можно разбирать - в нем есть сразу все - и дескриптор интерфейса, и дескрипторы конечных точек. |
Сообщ.
#465
,
|
|
|
В програмке Ellisys USB Analysis списки дескрипторов их там много, ну в основном нужен с Max Packet Length, конечные точки я так и не понял что это ).
Там почемуто перед каждым строковым дискриптором дескриптор языка. |