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

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

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

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
Страницы: (14) « Первая ... 10 11 [12] 13 14  все  ( Перейти к последнему сообщению )  
> OHCI USB
    потом...

    Добавлено
    не успел. потом опишу
      Посмотрел инициализацию. Вроде все нормально. Но Обрати внимание:
      ты пишешь
      ;Disable Periodic List, Isochronous List
      ;Control List and Bulk List proccessing
      mov [dword ptr GS:ECX+04h],080h - тут вероятно дожно быть 0B3h или я ошибаюсь?

      Добавлено
      или ты вообще списки кадров не обрабатывашь?
        Цитата uchtinka @
        Посмотрел инициализацию. Вроде все нормально. Но Обрати внимание:
        ты пишешь
        ;Disable Periodic List, Isochronous List
        ;Control List and Bulk List proccessing
        mov [dword ptr GS:ECX+04h],080h - тут вероятно дожно быть 0B3h или я ошибаюсь?


        почему 0B3h? :whistle: Bulk и Control List Enable я включаю в процедуре WaitTransactionComplete, там я сосбтвенно и запускаю обработку ControlEDHead.
        ExpandedWrap disabled
          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? :wacko:
        Вероятно, не обрабатываю. Я выложил все исходники, только без функций получения стандартных дескрипторов. Но получаю я их точно так же, как и запрос делаю. Почти те же функции, только тут константы забиты.
          Да список кадров нужен, только для UHCI прихидится резать пакет на кусочки, а в OHCI можно сразу до 4к кажется размер кадра указать. Поэтому если у тебя скажем mass storage устройство то можно пакет вовсе не резать поскольку все равно по секторам обмен идет. Фактически очередь будет из одного дескриптора передачи -если это bulk -транзакция.
          А вот если control то схема транзакции такая:
          1. Сначала setup пакет
          2. Данные
          3. Статус пакет
          и каждый пакет упаковывается в свой TD
          Сообщение отредактировано: uchtinka -
            uchtinka
            я так и делаю, setup packet, пакет данных ...
            ExpandedWrap disabled
              ;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 хранится указатель на дескриптор передачи на приём данных с устройства с первой КТ.
              Анализируя твой код возник ряд вопросов
              1.
              ExpandedWrap disabled
                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

              Добавлено
              Досмотрел до конца - первый пункт отпадает :yes:

              Добавлено
              Попробуй проверять HCINTERRUPTSTATUS еще

              Добавлено
              и еще попробуй проверить HccaDoneHead это HCCA+0x84 - туда запосятся обработнные дескрипторы
              Вот как у меня
              ExpandedWrap disabled
                ...
                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
              Сообщение отредактировано: uchtinka -
                Ошибка возникает в пакете DataReport...покрайней мере адрес в HcDoneHead является адресом DateReport пакетом.
                Код ошибки 0101 Device did not respond to token (IN) or did not provide a handshake (OUT).
                Если же EN=0010b, то вылетает по таймауту...

                Вообщем ошибка где-то в запросе к устройству... :wall: .
                Кстати, на UHCI я через нулевую КТ отправлял запросы к устройству, с первой КТ (IN) получал ответы.

                А на OHCI точно так же? или тут принципиально запросы отправляются через 2ю КТ (OUT).
                Или вообще нужно SetupPacket(Set Report) на нулевую, сам Report на 2ю, а ответ с 1й? :wacko:
                  Попробуй еще в _HCCONTROLHEAD_ED записать физ адрес первого дескриптора конечной точки перед ControlListFilled

                  Добавлено
                  С конечными точками работа аналогично UHCI
                    На физ адрес дескриптора нулевой КТ, так?. Убрал BulkFilled и BulkHeadEd. не работает. (это ведь Control транзакция, запрос к устройству?!). Есть ещё какие-нибудь идеи? :no-sad:
                    по таймауту вываливается
                    Сообщение отредактировано: whoIS -
                      попробуй bufferRounding в 0 а CC=1111

                      Добавлено
                      Да вроде у меня тоже все так :wacko: Может у тебя OHCI как плата расширения?

                      Добавлено
                      А ты пробовал просто дескриптор какой-нибудь считать?
                        Цитата uchtinka @
                        Может у тебя OHCI как плата расширения?

                        Эм...это существенно меняет ситуацию? У меня OHCI как плата расширения :whistle:

                        Цитата uchtinka @
                        А ты пробовал просто дескриптор какой-нибудь считать?

                        Да, я выполнил успешно Enumeration, получил стандартные дескрипторы: устройства, конфигурации; выполнил Set Configuration тоже без ошибок, по-моему(кстати, Set Configuration Обязательно делать, или по умолчанию устанавливается конфигурация устройства, если она одна?).

                        Теперь осталось реализовать обмен данными с HID устройством.
                          То, чт это плата расширения - ничего не менят, это точно такоеже PCI устройство, как и контроллер в составие чипсета.

                          SetConfiguration длать обязательно, причем номер конфигурации брать из дескриптора конфигурации.
                            Огромное спасибо 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, а потом снимать его для получения ответа от устройтсва?
                            Сообщение отредактировано: whoIS -
                              Вообщем не знаю правильно ли я делаю или нет, но попробовал работать с первой конечной точкой по прерываниям точно так же как и с нулевой и получить ответ от устройства удалось. Т.е. фактически просто поменял адрес конечной точки вместо 0 на 1 и всё дальше точно так же.
                              Причем адрес дескриптора конечной точки записываю в HcControlHeadEd. Устанавливаю бит ControlFilled и сверяю headp и tailp.
                              Триггер сохраняю.
                              Вообщем uhci и ohci побеждены для моей задачи, всем огромное спасибо за помощь.
                              Сообщение отредактировано: whoIS -
                                Привет всем! Решил потренироваться с USB под миниксом и столкнулся с такой проблемой. Пытаюсь записать 4 байта (0x00000008 - захват управления у SMM) в 32-битный регистр хост-контроллера OHCI (адрес 0xE8004008) и без толку. Если же пишу только в младшие 2 байта этого регистра, то запись проходит (есть нужная реакция в контрольном регистре). Ради интереса делал 12-байтовое копирование - и запись тоже прошла успешно. Как правильно писать 4 байта в регистр? Сейчас используется следующая функция:
                                ExpandedWrap disabled
                                  ! 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
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0990 ]   [ 14 queries used ]   [ Generated: 20.05.24, 05:20 GMT ]