На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
Страницы: (51) « Первая ... 29 30 [31] 32 33 ...  50 51  ( Перейти к последнему сообщению )  
> Желающим USB под ДОС , Welcome!!!
    StasNewOs, дамп всех QH, TD в студию. А также регистров состояния.
      Да, еще надо посмотреть на расположение qTD в памяти - они не должны пресекать границы физических страниц памяти.
        В спеках я читал, что при 64 битной у qTD размер становится не 32 а 32+20. Управление у биоса я забирал как вы говорили, там ожидание с проверкой бита и если бы я там ошибся то всё повисло бы в этом ожидании.
        Размер qTD сделал не 52 а 64 иначе следующий адрес будет без 5 нулей в начале.

        Добавлено
        Формирую я все qTD и данные так
        ExpandedWrap disabled
          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
          Кстати если QH = 16 и qTD 64, то у следующего qTD адрес с 4 нулями

          Добавлено
          Первый qTD контроллер берёт как продолжение QH, а следующий ищет по адресу?

          Добавлено
          Всё исправил, во втором qTD у меня пятый бит в адресе был 1, а для контроллера первые 5бит как 0 всегда, т.е. не тот адрес получался.
          добавил к 16(для QH) ещё 80 и получилось что второй после 96(1100000), т.е. 28 байт теряются(для выравнивания).
          Нет не проходит второй qTD опять
          Сообщение отредактировано: StasNewOs -
            А почему ты в 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 указывается????
            Сообщение отредактировано: zakharo -
              QH это 16байт, в котором есть адрес следующего QH и текущего qTD, дальше идет qTD в котором есть адрес следующего qTD

              Добавлено
              а первый qTD это же продолжение QH
              чтото я опять запутался.
              Сообщение отредактировано: StasNewOs -
                Цитата StasNewOs @
                QH это 16байт, в котором есть адрес следующего QH и текущего qTD, дальше идет qTD в котором есть адрес следующего qTD

                Добавлено
                а первый qTD это же продолжение QH
                чтото я опять запутался.

                Да, ты прав. Я опять с UHCI спутал.
                  Попробую изменить размер Max Packet Length, у вас же работает нумерация, если не трудно напишите рабочий пример заполнения, ато я буду до пенсии мучаться.
                    Кстати контроллер в адрес следующей qTD записал адрес второй и видимо смотрел её, но не захотел, а всётаки, зачем нужен альтернативный адрес.
                    Сообщение отредактировано: StasNewOs -
                      Вот первые транзакции для какого-то картридера. Сначала я беру неполный 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


                      Там у меня адрес для ввода/вывода все время один и тот же, но это не значит, что инфа по этому адресу одна и та же. Просто выделен специальный буфер, который гарантированно не пересекает границу физической страницы, и через этот буфер идет весь обмен.
                      Сообщение отредактировано: zakharo -
                        Спасибо, вижу что у вас в альтернативном адресе тот же адрес, на следующую
                          Цитата StasNewOs @
                          Попробую изменить размер Max Packet Length

                          Первый запрос дескриптора устройства с размером пакета 8 байт, далее из пакета находишь уже выставляешь настоящий размер пакета.

                          Добавлено
                          Цитата StasNewOs @
                          зачем нужен альтернативный адрес.

                          ЕНИП контроллер его использует в случае ошибок транзакции, хотя могу ошибаться у меня нет на работе документации под рукой, а у тебя должна быть.

                          Добавлено
                          Цитата StasNewOs @
                          что у вас в альтернативном адресе тот же адрес, на следующую

                          Что-то мне подсказывает, что это дамп от UHC, а не EHC.

                          Добавлено
                          StasNewOs, если так надо, то воскресенье вечером (по Мск) могу выложить аналогичный дамп от EHC, раньше не могу т.к. уеду сейчас из города.

                          Добавлено
                          И ты бы тоже свой дамп выложил в таком же виде, а то изучать твой код у меня нет никакого желания, да думаю и у других людей тоже.
                          Сообщение отредактировано: shm -
                            Алилуя прошли два qTD, пойду отлаживать получение дескриптора и сектора.
                            В альтернативный адрес поставил такой же как и в следующий и поставил такие же пораметры для qTD, как и в примере.
                              Цитата shm @
                              Что-то мне подсказывает, что это дамп от UHC, а не EHC.

                              Не, точно от EHC. Я его брал прямо из своего модуля EHCI. И у Стаса вроде прошло. :D

                              Добавлено
                              Цитата StasNewOs @
                              Алилуя прошли два qTD, пойду отлаживать получение дескриптора и сектора.

                              Там с дескриптором конфигурации есть одна хитрость. Дело в том, что он бывает переменной длины. Поэтому надо сначала прочитать его со стандартной длиной (18 байт) и найти там поле, в котором написан реальный размер (не помню, как оно называется, но оно точно там есть). И потом прочитать его заново, уже полностью, взяв этот размер в качестве требуемой длины. После этого его можно разбирать - в нем есть сразу все - и дескриптор интерфейса, и дескрипторы конечных точек.
                                В програмке Ellisys USB Analysis списки дескрипторов их там много, ну в основном нужен с Max Packet Length, конечные точки я так и не понял что это ).
                                Там почемуто перед каждым строковым дискриптором дескриптор языка.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (51) « Первая ... 29 30 [31] 32 33 ...  50 51


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0653 ]   [ 15 queries used ]   [ Generated: 21.07.25, 10:39 GMT ]