На главную Наши проекты:
Журнал   ·   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) [1] 2 3 ...  50 51  ( Перейти к последнему сообщению )  
> Программирование USB в MS-DOS
    Здравствуйте и доброго Вам времени суток. У меня возникла проблема по работе с DS2490 (Dallas) и таблеткой Touch Memory. Мне нужно под Досом запрограммировать эту микруху, но я не разобрался с передачей данных по прерываниям и сплошными передачами (BULK). Есть ещё проблема при считывании дескриптора конфигурации устройство выдаёт все дескрипторы интерфейсов, конечных точек кроме одного а общий размер должен быть 129 байт, выдаёт только 122байта. С чем это может быть связано, если с другой микрухой проблем нет? :wall:
      Цитата Алексей @
      Есть ещё проблема при считывании дескриптора конфигурации устройство выдаёт все дескрипторы интерфейсов, конечных точек кроме одного а общий размер должен быть 129 байт, выдаёт только 122байта.


      Честно сказать, не знаю почему возвращается меньше, но это не принципиально, нужный только 0-й интерфейс:
      Цитата 2490.pdf страница 12 Notes

      3. Interface 0 is the only valid interface value for the DS2490.


      так что все что не относится к 0-му интерфейсу значения не имеет.

      Цитата Алексей @
      Мне нужно под Досом запрограммировать эту микруху, но я не разобрался с передачей данных по прерываниям и сплошными передачами (BULK).

      Так в чем вопрос-то? Тебе исходники нужны или что? И с каким контроллером USB ты работаешь?
      Сообщение отредактировано: Gerret -
        Я Алексей. Мне нужно знать, как вообще надо писать эти BULK и Interrupt транзакции, т.е. исходники желательно на Си. Пробовал перевести асм код из книги Кулакова на Си, но чо-то не работает (хотя вся прога пишется по его книге). Вот мне бы посмотреть на то как их писать. Или объяснить.
          Ну для начала напиши какой контроллер USB.
          Их вообще 3 есть: UHCI, OHCI - USB1.1, EHCI - USB2.0.
          У каждого из них всё по разному...
          Примеры из книги Кулакова это для UHCI.
          Но там есть ошибки. Точнее не ошибки, а неточности что-ли.
          Короче его программы работают далеко не со всеми устройствами.
          Но для начала очень даже неплохая информация.
          Ну и ещё спецификации найди на UHCI контроллер и на USB (www.usb.org).
          А вообще оптимально не тупо переводить код с ASM на C, а разобраться как он работает и написать свой.
            Про Interrupt не скажу... не пробовал. А вот с BULK все просто и прозаично :)
            На BULK OUT точку посылаешь данные, с BULK IN принимаешь. Все работает по тому же принцыпу что и Control. Только начинать передачу не надо с SETUP пакета, а сразу надо слать данные.

            Пример очереди для запроса информации с флешки:
            1. Дескриптор с направлением передачи pidOUT и указателем на буфер с командой.
            2. Дескриптор с направлением передачи pidIN и указателем на буфер для входящих данных.
            3. .... повторение п. 2 (смотря сколько информации считываешь)
            4. Дескриптор с направлением передачи pidIN для приема подтверждения от флешки.

            Соответственно, для каждой конечной точки надо сохранять значение триггера данных (DataToggle).

            Цитата chetr @
            исходники желательно на Си

            есть только на асме, и то специально под флешки.

            Для данной микросхемы, по идее, должно быть что-то похожее. Я, правда, так и не понял принцып ее работы...
              Использую UHCI
              1-Для BULK IN какую конечную точку надо указывать в маркере дескриптора передачи?
              2-Что надо записать в слово управления и состояния дескриптора передачи?
              3-Каким первоначально должен быть Тригер данных для конечной точки?
              4-если у кого-то есть пример даже на асме пришлите пожалуйста, а то у Кулакова упоминается "не полный пакет", как его трактовать?
              Заранее всем спасибо! chetr@list.ru
                Цитата Guest @
                1-Для BULK IN какую конечную точку надо указывать в маркере дескриптора передачи?

                Это надо в дескрипторах точек смотреть... Та которая с адресом 0x8X, та и IN.

                Цитата Guest @
                2-Что надо записать в слово управления и состояния дескриптора передачи?

                В слове управления выставить бит активного дескриптора.
                В слове состояния надо указать адрес конечной точки (первые 3 бита), адрес устройства, pidIN (для IN транзакции) и триггер данных.

                Цитата Guest @
                3-Каким первоначально должен быть Тригер данных для конечной точки?

                Он должен быть равным 0. Такое ощущение, что документацию на контроллер ты даже не смотрел! Да и Кулакова читал как-то странно...
                Цитата В Кулаков "Программирование на аппаратном уровне" 2-е издание стр. 700 "Передача массивов данных"

                ...перед началом передачи массива данных триггер синхронизации данных должен быть сброшен в 0: при выполнении первой транзакции блок данных имеет идентификатор DAT0, второй - DATA1, третий - DATA0 и т.д.


                Вот прямая ссылка на описание UHC

                Цитата Guest @
                у Кулакова упоминается "не полный пакет", как его трактовать?

                Это пакет, в котором передается меньше чем 64 байта.

                Цитата Guest @
                пример даже на асме пришлите пожалуйста

                Вот пожалуйста:
                ExpandedWrap disabled
                  NEXT_B_IN_TD:
                      add             EBX, 4
                      mov             EDX, EBX
                      add             EDX, 10h
                      mov             dword ptr GS:[EBX], EDX ;указываем на следующий TD
                      add             EBX, 4                  ;редактируем TD Control
                      mov             EDX, UTD_ACTIVE OR UTD_C_ERR_3
                      mov             dword ptr GS:[EBX], EDX ;сохраняем
                      add             EBX, 4                  ;редактируем TD Token
                      mov             dword ptr GS:[EBX], 0
                      xor             EDX, EDX
                      xor             EAX, EAX
                      mov             AL, lpUSB_MSD.MSD_EpIN_Adr    ;адрес IN точки
                      shl             EAX, 15
                      mov             DL, lpUSB_MSD.MSD_Adr         ;адрес устройства
                      shl             EDX, 8
                      or              EDX, UTD_pidIN OR (64 SHL 21) ;pidIN с длиной 64 байта
                      or              EDX, lpUSB_MSD.MSD_INDataT    ;триггер данных
                      or              EDX, EAX
                      xor             lpUSB_MSD.MSD_INDataT, UTD_DATA1 ;инвертируем триггер
                      mov             dword ptr GS:[EBX], EDX     ;записываем все это безобразие в дескриптор
                      add             EBX, 4
                      mov             EDX, TempDWReg
                      mov             dword ptr GS:[EBX], EDX ;установим указатель на буфер


                это кусок функции, которая формирует очередь, алгоритм которой я приводил в прошлом посте.
                  За пример спасибо!!!
                  Как я понимаю после этого запускаем контроллер и он складывает данные в буфер, т.е. 64 байта? Кстати как отследить конец передачи, та которая у Кулакова WaitOpComplete? А Bulk OUT будет отличаться только номером и адресом конечной точки и напрвлением передачи?
                    Цитата chetr @
                    А Bulk OUT будет отличаться только номером и адресом конечной точки и напрвлением передачи?

                    Bulk OUT будет отличатся только адресом точки и направлением передачи.

                    Цитата chetr @
                    Кстати как отследить конец передачи, та которая у Кулакова WaitOpComplete?

                    Я ставил, во первых, счетчик кадров, что бы не зависнуть. Во вторых, в цикле смотришь состояние заголовка очереди, если у него появляется флаг Terminate, значит закончили. И одновременно смотришь состояние исполняемого дескриптора, если флаг Active стоит, то продолжаем цикл, если в нем появился флажек Stall, значит ошибка и пора выходить. Если из цикла вышли по условию QH.Terminate, надо посмотреть, что там с последним дескриптором...
                    Можно еще по аппаратному прерыванию контроллера, но я этого не пробовал.
                      Проблема в том, что теоретически я понимаю, как оно работает, а практически порименить не могу (мало опыта и мозгов). Если Вам не жалко пришлите пожалуйста свой пример рабочей программы, пожалуйста!!! E-mail: chetr@list.ru
                        Цитата chetr @
                        мало опыта и мозгов

                        Ну так весь этот форум, для того, чтобы набиратся опыта :D Ну а про мозги не скажу... тебе виднее... :)

                        Цитата chetr @
                        свой пример рабочей программы

                        У меня нет рабочей программы, у меня драйвер для USB флешек. Драйвер целеком не пришлю точно. <_<
                        Вот живи!:
                        ExpandedWrap disabled
                          UHC_DoBulk                    PROC
                              push            EAX
                              push            ECX
                              push            EBX
                              push            EDX
                           
                              ;запишем указатель на первый дескриптор в дескриптор очереди
                              mov             DX, lpUHC_HC.UHC_BASE
                              mov             AX, 0h
                              out             DX, AX
                           
                              mov             AX, 1
                              call            PTDelay
                           
                              mov             DX, lpUHC_HC.UHC_BASE
                              add             DX, UHC_FrameNumber
                              mov             AX, 0
                              out             DX, AX
                           
                              mov             AX, 1
                              call            PTDelay
                           
                              mov             DX, lpUHC_HC.UHC_BASE
                              mov             AX, 81h
                              out             DX, AX
                           
                              mov             EBX, lpUHC_HC.UHC_QH    ;в EBX указатель на очередь
                              mov             EDX, EBX
                              add             EBX, 4                  ;редактируем QueueElement
                              add             EDX, 10h                ;в EDX указатель на первый TD
                              mov             dword ptr GS:[EBX], EDX
                           
                              ;передача началась
                            WAIT_BULK_TRANS_END:
                              mov             DX, lpUHC_HC.UHC_BASE
                              add             DX, UHC_FrameNumber
                              in              AX, DX
                              cmp             AX, 500
                              jg              BULK_TRANS_END
                           
                              mov             DX, lpUHC_HC.UHC_BASE
                              add             DX, UHC_StatusReg
                              in              AX, DX
                              and             AX, 38h
                              jnz             BULK_TRANS_ERR
                           
                              mov             EBX, lpUHC_HC.UHC_QH
                              add             EBX, 4
                              mov             EAX, dword ptr GS:[EBX]
                              and             EAX, Terminate          ;if(!(EAX & Terminate))continue
                              jnz             BULK_TRANS_END
                           
                              mov             EBX, dword ptr GS:[EBX] ;в EBX указатель на TD из очереди
                              add             EBX, 4
                              mov             EAX, dword ptr GS:[EBX]
                              and             EAX, UTD_ACTIVE         ;if(EAX & UTD_ACTIVE)continue;
                              jnz             WAIT_BULK_TRANS_END
                           
                              mov             EAX, dword ptr GS:[EBX]
                              and             EAX, UTD_STALL          ;if(EAX & UTD_STALL)break;
                              jnz             BULK_TRANS_ERR
                              jmp             WAIT_BULK_TRANS_END
                           
                            BULK_TRANS_ERR:
                              mov             EBX, lpUHC_HC.UHC_QH
                              add             EBX, 4
                              or              dword ptr GS:[EBX], Terminate
                            BULK_TRANS_END:
                              mov             EBX, TempDWReg
                              add             EBX, 4
                              mov             EAX, dword ptr GS:[EBX]
                              shr             EAX, 16                 ;в AX статус последнего дескриптора
                              mov             USB_TransErr, AL
                              pop             EDX
                              pop             EBX
                              pop             ECX
                              pop             EAX
                              ret
                          UHC_DoBulk                    ENDP
                          Огромное человеческое спасибо! Пустой пакет надо всегда отправлять (в случае Bulk In) и принимать (в случае Bulk Out)?
                            Цитата chetr @
                            Пустой пакет надо всегда отправлять (в случае Bulk In) и принимать (в случае Bulk Out)?

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

                              ExpandedWrap disabled
                                    mov             EBX, lpUHC_HC.UHC_QH
                                    add             EBX, 4
                                    mov             EAX, dword ptr GS:[EBX]
                                    and             EAX, Terminate          ;if(!(EAX & Terminate))continue
                                    jnz             BULK_TRANS_END
                                 
                                    mov             EBX, dword ptr GS:[EBX] ;в EBX указатель на TD из очереди
                                    add             EBX, 4
                                    mov             EAX, dword ptr GS:[EBX]
                                    and             EAX, UTD_ACTIVE         ;if(EAX & UTD_ACTIVE)continue;
                                    jnz             WAIT_BULK_TRANS_END
                                Это выход по флагу завершения очереди. Потом еще проверяется последний дескриптор, успешно, или нет.
                                ExpandedWrap disabled
                                      BULK_TRANS_END:
                                      mov             EBX, TempDWReg
                                      add             EBX, 4
                                      mov             EAX, dword ptr GS:[EBX]
                                      shr             EAX, 16                 ;в AX статус последнего дескриптора
                                      mov             USB_TransErr, AL

                                В TempDWReg лежит адрес последнего дескриптора в очереди. Он туда записывается в функции создания очереди.
                                Дальше USB_TransErr сравнивается с 0-м, если не равно, значит ошибка.
                                Сообщение отредактировано: Gerret -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (51) [1] 2 3 ...  50 51


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0592 ]   [ 15 queries used ]   [ Generated: 28.04.24, 13:29 GMT ]