
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.218] |
![]() |
|
Страницы: (51) « Первая ... 33 34 [35] 36 37 ... 50 51 ( Перейти к последнему сообщению ) |
Сообщ.
#511
,
|
|
|
Status Block Wrapper не приходит ко мне оказывается, а бит активности этого qTD обнуляется
В первый qTD (out)статус стал 10000000000000000000000000000001, второй и третий (in) 00000010000000000000000101000000 10000000000011010000000101000000 64(Halted) |
Сообщ.
#512
,
|
|
|
я так понял, что кроме статуса контроллер обнуляет ещё много чего, в том числе и размер передоваемых байт?
Добавлено В первом qTD все мои данные обнулил и поставил 0 бит |
Сообщ.
#513
,
|
|
|
Похоже, это у тебя устройство выставляет STALL. Я говорил уже, что некоторые флешки не дают сразу же читать сектора, а сначала выставляют сигналы ATTENTION, которые надо снимать через REQUEST SENSE. В твоей ситуации, если STALL выставлен в ответ на READ, надо его снять через ClearFeature (см. описание Bulk-Only Mass Storage Protocol), а потом получить CSW. Там, скорее всего, в статусе будет 1, а причину этой 1 надо выяснять через REQUEST SENSE. Можно избежать этого, если начать работу с флешкой аккуратнее - первой командой дать TEST UNIT READY. Там нет фазы данных, сразу возвращается CSW. Смотришь там статус, и если он 1, даешь REQUEST SENSE. Повторяешь эту пару команд до тех пор, пока TEST UNIT READY не вернет 0 в статусе.
|
Сообщ.
#514
,
|
|
|
Inquiry выдавала мне такие результаты
10000000000000000000000000000001 10000000000000000000000100000000 00000000000000000000000100000000 она рабочая. Добавлено TEST UNIT READY выдал 0, я просто взял мою read10 убрал Data Transport и обнулил поля в 31байтных данных Command Transport, прошло всё нормально. 10000000000000000000000000000001 10000000000000000000000100000000 USBC tag 0 а может из за того, что флешка в кард ридере? Добавлено хотя нет, это 8-12байты 0, а 13байт выдаёт 1 |
Сообщ.
#515
,
|
|
|
Сделал TEST UNIT потом REQUEST SENSE и TEST UNIT, и опяти результат 13байта=1
|
Сообщ.
#516
,
|
|
|
Результаты REQUEST SENSE надо расшифровывать по таблице (она есть в док-ции по SCSI). Там три значащих байта. SK, ASC, ASCQ, сейчас точно не помню, какие они по счету в возвращаемом буфере. Есть безусловная неготовность - например, отсутствует карточка в картридере, а есть временная, для привлечения внимания хоста. Временная снимается уточнением причины.
И, в принципе, флешки могут неоднократно выставлять сигнал ATTENTION - "только что включено питание", "прошел сигнал RESET", и т.д. Мне приходилось по 3 раза спрашивать у устройства, готово ли оно. Ничего страшного в этом нет. Добавлено Для картридеров GetMaxLUN выдаст значение, больше 0. Дальше надо опрашивать каждый LUN до тех пор, пока не найдется тот, в котором установлена карточка. Но это для картридера. Если же ты пользуешься портом, который рядом, то это - просто порт. |
Сообщ.
#517
,
|
|
|
Теперь кстать уже стал 13байта=0
|
Сообщ.
#518
,
|
|
|
Как только TEST UNIT READY вернет 0 в bCSWStatus, можно читать сектора.
|
Сообщ.
#519
,
|
|
|
Но сектора пока не вижу
Добавлено Попробую с нормальной флешки загрузиться |
Сообщ.
#520
,
|
|
|
Значит, надо смотреть причину. Снимай состояние STALL (все равно эту процедуру придется делать), получай CSW и выясняй причину отказа по REQUEST SENSE.
|
Сообщ.
#521
,
|
|
|
Ладно, завтра сделаю.
|
Сообщ.
#522
,
|
|
|
У тебя уже вырисовывается 3 независимых уровня, замечаешь? Уровень контроллера - это где ты заполняешь QH и qTD и выполняешь транзакции. Уровень Bulk-Only Mass-Storage - это где ты упаковываешь команды в CBW и получаешь CSW. И уровень SCSI - где ты выдаешь осмысленные команды и получаешь осмысленные ответы. Эти три уровня лучше сделать делать независимыми. Например, если в будущем придется работать с контроллером типа USB 3.0 (xHCI) или с 1.1 (UHCI, OHCI) - ты просто меняешь уровень контроллера, и все. Остальное остается нетронутым. А если придется работать с флоппиками - меняешь уровень Bulk-Only на Control-Bulk-Interrupt. Система команд у флоппика - UFI, очень и очень похожа на SCSI. Основные команды вообще те же самые, так что по минимуму можно ничего больше и не менять.
Уровень логических дисков (FAT, FAT32 и т.д.) у тебя уже есть, как я понял? Там же можно еще сделать ISO9660 (CDFS) - для компакт-дисков, нижние же уровни это опять же не затронет. Когда будешь сделать снятие STALL (в серьезных системах это называется Clear Pipe) не забудь, что после него счет DT для этой конечной точки опять начнется с 0. |
Сообщ.
#523
,
|
|
|
Я сделал функции
INQUIRY TEST UNIT READY REQUEST SENSE READ CAPACITY READ(10) Они работают, в начале у каждой заполнение Command Transport, потом его вызов, потом Data Transport и Status Transport. Т.е. QH заполняет Command Transport Data Transport Status Transport, получилось выполнять всю работу тремя функциями для всех. TEST UNIT READY вызывает только первую и третью. На данный момент обнулилось 13 байтST после вызова TEST UNIT READY и если 1 то REQUEST SENSE и TEST UNIT READY потом уже 13бит=0. Но вызывая READ CAPACITY и READ(10) если 13бит=0 они всё равно у меня ещё не очень рабочии. Проверю результат вызова REQUEST SENSE. |
Сообщ.
#524
,
|
|
|
Цитата zakharo @ У тебя уже вырисовывается 3 независимых уровня, замечаешь? Уровень контроллера - это где ты заполняешь QH и qTD и выполняешь транзакции. Уровень Bulk-Only Mass-Storage - это где ты упаковываешь команды в CBW и получаешь CSW. И уровень SCSI - где ты выдаешь осмысленные команды и получаешь осмысленные ответы. Эти три уровня лучше сделать делать независимыми. Например, если в будущем придется работать с контроллером типа USB 3.0 (xHCI) или с 1.1 (UHCI, OHCI) - ты просто меняешь уровень контроллера, и все. zakharo, я ему многократно пытался это объяснить, причем не только про USB, но он слушать не хочет. Я когда-то давно также начинал писать: лишь бы побольше было. В итоге сейчас на досуге потихоньку переписываю по-нормальному, но StasNewOs упорно повторяет мой путь. |
Сообщ.
#525
,
|
|
|
Цитата shm @ zakharo, я ему многократно пытался это объяснить, причем не только про USB, но он слушать не хочет. Я когда-то давно также начинал писать: лишь бы побольше было. В итоге сейчас на досуге потихоньку переписываю по-нормальному, но StasNewOs упорно повторяет мой путь. О таких вещах у меня с табой разговоров небыло. Ещё раз тебе говорю, у меня объектная система на которыю я нарабатываю функционал и объекты. Про 3 уровня я полностью согласен и это собственно и реализовываю. |