Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.154.208] |
|
Страницы: (51) [1] 2 3 ... 50 51 ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Здравствуйте и доброго Вам времени суток. У меня возникла проблема по работе с DS2490 (Dallas) и таблеткой Touch Memory. Мне нужно под Досом запрограммировать эту микруху, но я не разобрался с передачей данных по прерываниям и сплошными передачами (BULK). Есть ещё проблема при считывании дескриптора конфигурации устройство выдаёт все дескрипторы интерфейсов, конечных точек кроме одного а общий размер должен быть 129 байт, выдаёт только 122байта. С чем это может быть связано, если с другой микрухой проблем нет?
|
Сообщ.
#2
,
|
|
|
Цитата Алексей @ Есть ещё проблема при считывании дескриптора конфигурации устройство выдаёт все дескрипторы интерфейсов, конечных точек кроме одного а общий размер должен быть 129 байт, выдаёт только 122байта. Честно сказать, не знаю почему возвращается меньше, но это не принципиально, нужный только 0-й интерфейс: Цитата 2490.pdf страница 12 Notes 3. Interface 0 is the only valid interface value for the DS2490. так что все что не относится к 0-му интерфейсу значения не имеет. Цитата Алексей @ Мне нужно под Досом запрограммировать эту микруху, но я не разобрался с передачей данных по прерываниям и сплошными передачами (BULK). Так в чем вопрос-то? Тебе исходники нужны или что? И с каким контроллером USB ты работаешь? |
Сообщ.
#3
,
|
|
|
Я Алексей. Мне нужно знать, как вообще надо писать эти BULK и Interrupt транзакции, т.е. исходники желательно на Си. Пробовал перевести асм код из книги Кулакова на Си, но чо-то не работает (хотя вся прога пишется по его книге). Вот мне бы посмотреть на то как их писать. Или объяснить.
|
Сообщ.
#4
,
|
|
|
Ну для начала напиши какой контроллер USB.
Их вообще 3 есть: UHCI, OHCI - USB1.1, EHCI - USB2.0. У каждого из них всё по разному... Примеры из книги Кулакова это для UHCI. Но там есть ошибки. Точнее не ошибки, а неточности что-ли. Короче его программы работают далеко не со всеми устройствами. Но для начала очень даже неплохая информация. Ну и ещё спецификации найди на UHCI контроллер и на USB (www.usb.org). А вообще оптимально не тупо переводить код с ASM на C, а разобраться как он работает и написать свой. |
Сообщ.
#5
,
|
|
|
Про Interrupt не скажу... не пробовал. А вот с BULK все просто и прозаично
На BULK OUT точку посылаешь данные, с BULK IN принимаешь. Все работает по тому же принцыпу что и Control. Только начинать передачу не надо с SETUP пакета, а сразу надо слать данные. Пример очереди для запроса информации с флешки: 1. Дескриптор с направлением передачи pidOUT и указателем на буфер с командой. 2. Дескриптор с направлением передачи pidIN и указателем на буфер для входящих данных. 3. .... повторение п. 2 (смотря сколько информации считываешь) 4. Дескриптор с направлением передачи pidIN для приема подтверждения от флешки. Соответственно, для каждой конечной точки надо сохранять значение триггера данных (DataToggle). Цитата chetr @ исходники желательно на Си есть только на асме, и то специально под флешки. Для данной микросхемы, по идее, должно быть что-то похожее. Я, правда, так и не понял принцып ее работы... |
Сообщ.
#6
,
|
|
|
Использую UHCI
1-Для BULK IN какую конечную точку надо указывать в маркере дескриптора передачи? 2-Что надо записать в слово управления и состояния дескриптора передачи? 3-Каким первоначально должен быть Тригер данных для конечной точки? 4-если у кого-то есть пример даже на асме пришлите пожалуйста, а то у Кулакова упоминается "не полный пакет", как его трактовать? Заранее всем спасибо! chetr@list.ru |
Сообщ.
#7
,
|
|
|
Цитата Guest @ 1-Для BULK IN какую конечную точку надо указывать в маркере дескриптора передачи? Это надо в дескрипторах точек смотреть... Та которая с адресом 0x8X, та и IN. Цитата Guest @ 2-Что надо записать в слово управления и состояния дескриптора передачи? В слове управления выставить бит активного дескриптора. В слове состояния надо указать адрес конечной точки (первые 3 бита), адрес устройства, pidIN (для IN транзакции) и триггер данных. Цитата Guest @ 3-Каким первоначально должен быть Тригер данных для конечной точки? Он должен быть равным 0. Такое ощущение, что документацию на контроллер ты даже не смотрел! Да и Кулакова читал как-то странно... Цитата В Кулаков "Программирование на аппаратном уровне" 2-е издание стр. 700 "Передача массивов данных" ...перед началом передачи массива данных триггер синхронизации данных должен быть сброшен в 0: при выполнении первой транзакции блок данных имеет идентификатор DAT0, второй - DATA1, третий - DATA0 и т.д. Вот прямая ссылка на описание UHC Цитата Guest @ у Кулакова упоминается "не полный пакет", как его трактовать? Это пакет, в котором передается меньше чем 64 байта. Цитата Guest @ пример даже на асме пришлите пожалуйста Вот пожалуйста: 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 ;установим указатель на буфер это кусок функции, которая формирует очередь, алгоритм которой я приводил в прошлом посте. |
Сообщ.
#8
,
|
|
|
За пример спасибо!!!
Как я понимаю после этого запускаем контроллер и он складывает данные в буфер, т.е. 64 байта? Кстати как отследить конец передачи, та которая у Кулакова WaitOpComplete? А Bulk OUT будет отличаться только номером и адресом конечной точки и напрвлением передачи? |
Сообщ.
#9
,
|
|
|
Цитата chetr @ А Bulk OUT будет отличаться только номером и адресом конечной точки и напрвлением передачи? Bulk OUT будет отличатся только адресом точки и направлением передачи. Цитата chetr @ Кстати как отследить конец передачи, та которая у Кулакова WaitOpComplete? Я ставил, во первых, счетчик кадров, что бы не зависнуть. Во вторых, в цикле смотришь состояние заголовка очереди, если у него появляется флаг Terminate, значит закончили. И одновременно смотришь состояние исполняемого дескриптора, если флаг Active стоит, то продолжаем цикл, если в нем появился флажек Stall, значит ошибка и пора выходить. Если из цикла вышли по условию QH.Terminate, надо посмотреть, что там с последним дескриптором... Можно еще по аппаратному прерыванию контроллера, но я этого не пробовал. |
Сообщ.
#10
,
|
|
|
Проблема в том, что теоретически я понимаю, как оно работает, а практически порименить не могу (мало опыта и мозгов). Если Вам не жалко пришлите пожалуйста свой пример рабочей программы, пожалуйста!!! E-mail: chetr@list.ru
|
Сообщ.
#11
,
|
|
|
Цитата chetr @ мало опыта и мозгов Ну так весь этот форум, для того, чтобы набиратся опыта Ну а про мозги не скажу... тебе виднее... Цитата chetr @ свой пример рабочей программы У меня нет рабочей программы, у меня драйвер для USB флешек. Драйвер целеком не пришлю точно. Вот живи!: 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 |
Сообщ.
#12
,
|
|
|
Огромное человеческое спасибо! Пустой пакет надо всегда отправлять (в случае Bulk In) и принимать (в случае Bulk Out)?
|
Сообщ.
#13
,
|
|
|
Цитата chetr @ Пустой пакет надо всегда отправлять (в случае Bulk In) и принимать (в случае Bulk Out)? Нет! Пустых пакетов не надо ни посылать, ни принимать... Единственное, если только этого требует протокол обмена с устройством, но я такого не встречал. |
Сообщ.
#14
,
|
|
|
Ниже приведён успешный выход?
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 |
Сообщ.
#15
,
|
|
|
Это выход по флагу завершения очереди. Потом еще проверяется последний дескриптор, успешно, или нет.
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-м, если не равно, значит ошибка. |