
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.218] |
![]() |
|
Страницы: (51) « Первая ... 32 33 [34] 35 36 ... 50 51 ( Перейти к последнему сообщению ) |
Сообщ.
#496
,
|
|
|
Понятно теперь, нужно 3 QH делать в которой 1 qTD. Я прочитал у своих трёх флешек конечные точки, и у двух было 1(out = 1) 130(in = 2), у одной 2(out = 2) 129(in = 1), ни какого единообразия, в примерах я встречал ваш случай, но там была не флешка а флопик или сдром, и я подумал, что это может быть связанно с сообщениями о открытии дверцы(хотя тоже врядли).
|
Сообщ.
#497
,
|
|
|
Сообщения о состоянии устройство выдает по команде REQUEST_SENSE. Например, я даю команду TEST_UNIT_READY, устройство мне в CSW возвращает статус 1 (не готово), я даю REQUEST_SENSE. Оно выдает длинный код, из которого имеют смысл три байта, и эти три байта я расшифровываю по таблице. В документации на SCSI (SCSI-2) есть эта таблица, там перечислена тьма возможных причин, в т.ч и открытые дверцы.
Добавлено Кстати, флопики работают не по Bulk-Only, а по Control-Bulk-Interrupt. Им положено иметь три точки. Добавлено Номера конечных точек удобнее сразу представлять в 16-ричной системе. Ты вот пишешь, например, 130, но тут зрительно легче вопринять 82h - сразу видно - точка IN, номер 2. |
Сообщ.
#498
,
|
|
|
Всё понял, главное прочитать теперь сектор с флешки. Вообще странный метод, на каждый qTD QH делать, я уже привык, что один QH и несколько qTD.
|
Сообщ.
#499
,
|
|
|
Мне так удобнее - каждая транзакция выполняется отдельно. Надо послать команду SCSI - вызываю функцию BulkOut, независимую от контроллера (ветвление по типу контроллера уже идет внутри, структура-описатель устройства указывает на контроллер, к которому это устройство подключено). Функция выполняется, возвращает код завершения транзакции все такое.. Потом - данные, потом - BulkIn Для приема CSW. Все как отдельные функции. Конечно, в серьезных системах все делается в виде очередей к контроллеру, с обработкой завершений по прерываниям, но мне очень важно было уложиться в минимум памяти.
|
Сообщ.
#500
,
|
|
|
Inquiry сработала хорошо, а read10 сделал по аналогии но пока не работает.
|
Сообщ.
#501
,
|
|
|
Проверь DT. Там же нельзя полностью повторять qTD - для bulkout DT уже д.б. 1.
|
Сообщ.
#502
,
|
|
|
read10 прошла после изменения DT, зачем их вообще придумали? Правдо данных с сектора я пока не увидел.
|
Сообщ.
#503
,
|
|
|
Для защиты от помех на шине. Могут исказиться как сами пакеты, так и подтверждения. Чтобы из-за ошибок на шине не принять дважды один и тот же пакет, все пакеты снабжаются битом DT - получаются пакеты четные и нечетные. Чередование DT проходит строго через весь поток пакетов, адресованных одной конечной точке, независимо от того, что там передается.
|
Сообщ.
#504
,
|
|
|
Я понял, что DT setup всегда =0, а дальше in и out чередуются(yfxbyfz c 1) и в конце in или out с DT=1, а у bulk in и out отдельно друг от друга.
Функция read10 проходит но данных с сектора нету. |
Сообщ.
#505
,
|
|
|
Обе транзакции in проходят? Посмотри CSW.
|
Сообщ.
#506
,
|
|
|
Да, если бы хоть одна не прошла, то повисло бы у меня. CSW возвращает 0 но данных нету с сектора(это единственная теперь моя проблемма, так бы уже листал файлы с флешки).
Инверсию бита DT я настроил командой btc, эта команда проверяет у устройства состояние прошлого бита для in out отдельно и инвертирует, если прошлый 0 то поставит 1 в DT, после этого я действительно смог вызывать read10 уже несколько раз. Добавлено Хотя всё остальное работает нормально, со всех портов настраивает флешки, читает дискрипторы, строки, инквири |
Сообщ.
#507
,
|
|
|
сделаю функции GetMaxLun, ReadCapacity, ModeSense, RequestSense может поможет
ReadCapacity выдаёт только размер блока, чтото маловато инфы. |
Сообщ.
#508
,
|
|
|
ReadCapacity дает 8 байт - 4 байта размер блока и 4 - MaxLBA. Все в big-endian.
Добавлено ModeSense мне ни разу не потребовалась. |
Сообщ.
#509
,
|
|
|
У меня в Ellisys USB Analysis software примеры старые и мало их, где ещё посмотреть примеры не знаю или как свои устройства подключить.
Вот я попал с сектором, просмотрел всё, всё правильно, а данных всё нету. |
Сообщ.
#510
,
|
|
|
Смотри адрес памяти, куда ты его принимаешь. Соответствует ли физический адрес тому, куда ты смотришь? Не пересекает ли буфер границу 4 кб? Не записано ли что-нибудь в старших 32 битах адреса в qTD?
Вообще дай распечатку своих QH и qTD до и после транзакций. |