
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.52] |
![]() |
|
Страницы: (14) « Первая ... 6 7 [8] 9 10 ... 13 14 все ( Перейти к последнему сообщению ) |
Сообщ.
#106
,
|
|
|
Слушай, у меня тут страннось образовалась... с твоей прогой от "от 13.10.05 все работает отлично, а с прогой от 14.10.05 Kingstone опять виснет на Detecting Devices... в чем у них разница???
Я, просто, нарвался на странный глюк: мой драйвер со всеми флешками работает нормально, а с Kingstone не хочет! При SET_ADDRESS говорит, что устройство не отвечает ![]() ![]() Ресет порта делаю точно, как ты писал! Вот он на асме: ![]() ![]() ;в AX - номер порта для ресета UHC_PortReset PROC push EAX push EDX mov USB_TransErr, 0 mov DX, UHC_Address add DX, UHC_Port0Reg shl AX, 1 ;AX = AX*2 - смещение на регистр порта add DX, AX mov AX, 200h ;устанавливаем ресет out DX, AX mov AX, 20 call PTDelay ;за PTDelay спасибо Jin X'у mov AX, 0 out DX, AX ;снимаем ресет mov CX, 50 ;ждем установки флага подключенного устройства wait_res_end: mov AX, 1 call PTDelay ;1ms delay in AX, DX and AX, 1 cmp AX, 1 ;флаг установился, выходми je res_done loop wait_res_end jmp res_err res_done: mov AX, 0Eh ;включаем порт out DX, AX ;ждем 20ms для уверенности, что порт включился mov AX, 20 call PTDelay in AX, DX and AX, 4 cmp AX, 0 ;точно включился? je res_err ;нет - выходим с ошибкой jmp res_finish ;да - выходим без ошибки res_err: mov USB_TransErr, 1 res_finish: pop EDX pop EAX ret UHC_PortReset ENDP может быть я совсем уже глючу...? |
Сообщ.
#107
,
|
|
|
А разницы там никакой...
Только во второй дескриптор 0 строки не получается. Ресет у тебя вроди нормальный... Странно это всё как-то. Я сейчас буду разбираться - новый вариант часа через полтора думаю выложу. Вот покопался немного... В архиве три варианта. Если какой вдруг заработает, проверь на всех устройствах. Если обнаружится рабочий - потом сообщу в чём косяк был. Ну а если нет - буду искать дальше. Да, по поводу твоего вопроса - если дело всё-же дойдёт до стека, то скорее всего буду делать резидентом. Прикреплённый файл ![]() |
Сообщ.
#108
,
|
|
|
Мдя..... все 3 варианта работают на всех флешках! Что бы это значило?
|
Сообщ.
#109
,
|
|
|
Ну это мне вообще не понятно...
Я ради прикола в ohci_v1 оставил всё как было - только откомпилировал заново. Видать прикол получился... ![]() В остальных двух поувеличивал время ожидания кругом с 20мс до 50мс. Скорее всего проблеммы у тебя с транзакцией. Я создаю транзакцию с0 счётчиком ошибок = 3, и выхожу из цикла ожидания либо если всё Ок, либо при STALL. Плюс при конфигурировании устройства все транзакции повторяю по три раза. Т.е. например делаю SET_ADDRESS, если ошибка - попробовать ещё раз. И так три раза. Может устройство тормозит немного... |
Сообщ.
#110
,
|
|
|
cppasm спасай!!!
Я уже запарился с этим контроллером (на сколько все было проще с OHC)! Сейчас у меня 2-е глобальные проблемы: 1. SETUP посылки для Kingston'а не проходят (устройство не отвечает). SET_ADDRESS пробовал делать 10(!) раз подряд с проверкой на ошибки... нифига! Каждый раз устройство не отвечает. 2. Работаем с той флешкой от которой получили все нужные дескрипторы. Надо на Bulk OUT точку послать структуру CBW (Bulk Only Transport) с командой Inquie (опишу дальше). За тем с Bulk IN точки первым TD принимаем 36 байт информации, а следующим TD принимаем структуру CSW (см. Bulk Only Transport). Так у меня работало при OHC контроллере... В этом же получается какая-то фигня, в ответ на первый TD для Bulk IN точки мне приходит сразу CSW!!! Хотя должно быть 36 байт данных... ![]() Так вот, по поводу первой траблы, можешь поделится исходником функции, которая транзакцию осуществляет? А по поводу второго, если не влом, попробуй ты проделать выше описаные действия вот в hex'е вид CBW, который надо послать на Bulk OUT точку (длина CBW - 31 байт): ![]() ![]() 00000000: 55 53 42 43 01 00 00 00 24 00 00 00 80 00 06 12 00000001: 01 00 00 24 00 00 00 00 00 00 00 00 00 00 00 а ответный CSW выглядит вот так (его длина 13 байт): ![]() ![]() 00000000: 55 53 42 53 01 00 00 00 00 00 00 00 00 Попробуй плиз, а то я совсем уже потерялся... |
Сообщ.
#111
,
|
|
|
Исходники мылом.
Насчёт второй проблеммы - я такое делал, всё было Ок. Проверь код возврата после транзакции, может проясниться чего. По-моему OHCI NAK не так обрабатывает. Т.е. его в UHCI тоже ошибкой считать не надо - это достаточно легко достигается установкой счётчика ошибок в 3. При NAK он не уменьшается и транзакция остаётся активной, а при других ошибках уменьшается. Когда он падает в ноль - устанавливается STALL. Вот по нему и надо делать выход. Короче почитай исходники. Может что прояснится. Я может потом код чтения инфы с флэшки выложу. Просто после модификации дров я его не пробовал. А насчёт команд флэшки - можешь не описывать, у меня дока есть ![]() |
Сообщ.
#112
,
|
|
|
За исходник, еще раз спасибо!
А с чтением флешки, я нашел в чем трабла, но пока не понял как ее исправить ![]() Цитата cppasm @ А насчёт команд флэшки - можешь не описывать, у меня дока есть А у тебя какая дока? Случайно не описание SCSI 2 протокола? Если нет, то кинь ссылочку ПЛЗ. |
Сообщ.
#113
,
|
|
|
Цитата Gerret @ Случайно не описание SCSI 2 протокола? Случайно именно она ![]() Насчёт пропуска пакета - ты делаешь ресет флэшки перед использованием? Надо сделать общий ресет, а потом CLEAR_FEATURE для bulk in и bulk out. И тригер данных при первом использовании должен быть 0, а потом меняется. Причём сохраняется между транзакциями. Т.е. если ты скажем считал n байт и последний дескриптор имел тригер 0, то при следующей транзакции он должен быть 1. |
Сообщ.
#114
,
|
|
|
Цитата cppasm @ Причём сохраняется между транзакциями. Т.е. если ты скажем считал n байт и последний дескриптор имел тригер 0, то при следующей транзакции он должен быть 1. АААА!!! Спасибо!!! ![]() ![]() А то, даже в OHC драйвере мне приходилось перед каждой транзакцией делать CLEAR_FEATURE для обоих точек. Я еще думал, почему так получается?.. |
Сообщ.
#115
,
|
|
|
Цитата Gerret @ А где сие написано? Ну в стандарте где гаписано я не скажу... ![]() ![]() Лично я это видел в книге Кулакова. Ну и по личному опыту - просто так работает, а если не сохранять тригер то нет. Но первоисточник в принципе книга Кулакова. |
Сообщ.
#116
,
|
|
|
Тоесть, надо сохранять триггеры для каждой точки? Для Bulk IN свой и для Bulk OUT сыой, правилбно я понял?
В понедельник на работу приеду, попробую... если с этой штукой у меня заработает кардридер, с меня бутылка ![]() Как у тебя дела с OHCI? |
Сообщ.
#117
,
|
|
|
Цитата Gerret @ Тоесть, надо сохранять триггеры для каждой точки? Для Bulk IN свой и для Bulk OUT сыой, правилбно я понял? Да, именно так. Цитата Gerret @ Как у тебя дела с OHCI? Да нормально всё... ![]() Я потестировал на USB мыши и на флэшке - всё работает. Сейчас занимаюсь написанием bulk_read и bulk_write запросов. Ну и с флэшкой хочу немного пообщаться. ![]() На UHCI уже Inquiry попробовал - всё работает. У меня только прога не универсальная пока - без автодетекта. Ну типа параметры конечных точек руками забиваю в коде. Но это пока. А так всё Ок. И такой ещё вопрос: ты не знаешь где можно найти документацию на SCSI transparent command set. А то я команды беру из спецификации ATAPI и usbmass-ufi10 спецификации. А хотелось бы документа по чистому SCSI так сказать ![]() |
Сообщ.
#118
,
|
|
|
SCSI могу выслать на мыло, но там pdf'ка на 6 мегов и она без закладок по темам
![]() Если надо, я опять вернулся к OHCI (буду проверять сохранение траггера), так что могу потестить тебе, если что надо ![]() |
Сообщ.
#119
,
|
|
|
![]() ![]() ![]() ОГРОМНОЕ ТЕБЕ СПАСИБО!!! За подсказку про триггер!!! Кардридер заработал ![]() |
Сообщ.
#120
,
|
|
|
Цитата Gerret @ Кардридер заработал Прикольно ![]() Цитата Gerret @ SCSI могу выслать на мыло, но там pdf'ка на 6 мегов и она без закладок по темам Та не, 6 метров не надо. На T10 я был, документов там дофига, но мне ничего не понравилось ![]() Прога в архиве. Приду домой может чего ещё по флэшкам доделаю... Прикреплённый файл ![]() |