
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.15] |
![]() |
|
Страницы: (51) « Первая ... 7 8 [9] 10 11 ... 50 51 ( Перейти к последнему сообщению ) |
Сообщ.
#121
,
|
|
|
Ок, значится завтра ждём ReadCapacity
![]() В смысле не виснет и систему не тормозит? А то я уже не воспринимаю когда не большими буквами написано ![]() |
Сообщ.
#122
,
|
|
|
![]() ![]() ![]() |
Сообщ.
#123
,
|
|
|
терь ясно
![]() |
Сообщ.
#124
,
|
|
|
Обещанная прога по работе с Mass Storage Class (Bulk Only Transport).
Автодетекта пока нет - поэтому ограничения: 1. параметры устройства прописаны под тот кардридер с которого снимались предыдущие логи (конечные точки и т.д.) 2. он должен быть первым устройством обнаруживаемым на шине ohci.exe (лучше единственным, для уверенности) 3. используется LUN=0 В принципе для тестовых целей я думаю пойдёт... А насчёт того что у тебя при STALL всё зависает наглухо. Я вспомнил - было у меня такое. Происходит в таком случае: ты производишь транзакцию и получаеш STALL, но НЕ проверяеш это. А потом при попытке обмена с конечной точкой которая находится в состоянии STALL всё виснет наглухо - контроллер наверное шину захватывает и не отдаёт или что-то такое... Надо в общем делать ClearHaltFeature для этой конечной точки. Добавлено Да, и если заработает выложи лог тоже... Там ещё чтение секторов есть - но они в лог не попадут ![]() Добавлено Кстати яне знаю поможет или нет - но я когда сам писал, доку SCSI2 уже потом нашёл. А пользовался спецификацией на другой протокол: http://www.usb.org/developers/devclass_docs/usbmass-ufi10.pdf Там команды все описаны, протокол хоть другой, а совпадает многое... В плане команд я имею ввиду. И 23h там есть кстати ![]() Прикреплённый файл ![]() |
Сообщ.
#125
,
|
|
|
С зависанием во время STALL я разобрался, не понимая правда истиную причину этого (я прописал hcca и перестала виснуть)
omass.exe работает но, как ты сказал только с этим кардридером. Дольше наверное ты сделаешь универсальную программу, а я спрошу как ты это все делаешь. Прикреплённый файл ![]() |
Сообщ.
#126
,
|
|
|
Цитата PRT @ Дольше наверное ты сделаешь универсальную программу, а я спрошу как ты это все делаешь. Ну в планах в принципе да ![]() Как только время свободное будет заниматься, хотя потихоньку делаю. Я счас просто планирую общий драйвер сделать. Т.е. сейчас у меня так - скажем есть прога для работы с флэшкой и 2 модуля. Собираем с одним - она работает с OHCI, с другим - с UHCI. Сейчас я хочу эти 2 модуля в один объединить чтобы со всеми контроллерами в системе работало. Ну потом ещё EHCI писать буду... Короче я много чего хочу, а времени не оч много ![]() Добавлено Кстати, а сектора тоже читает? Добавлено И объём правильно надетектился - 32Мб? То-что 29Мб пишет это потому что я мегабайты человеческие считаю, а производители по 1000000 байт в Мегабайте. И так винт на 320Гб превращается в 300Гб ![]() |
Сообщ.
#127
,
|
|
|
Да, все правильно
![]() |
Сообщ.
#128
,
|
|
|
Получилось!!!
![]() использую следующий алгоритм: ![]() ![]() ClearEndpointIN(); ClearEndpointOUT(); MaxLUN=GetMaxLUN(); for (int i=0;i<MaxLUN;i++) { Inquiry(i); if (!ReadCapacity(i)) ReadCapacity(i); } ReadCapacity() // код команды конечно же 0x25 { if(!CBW()) return 0; if (!ReadBulkData()) ClearEndpointIN(); if(!CSW()) return 0; } CBW() { if (!SendBulkData(cbw)) { ResetRecovery(); if (!SendBulkData(cbw) return 0; } return 1; } CSW() { if (!ReadBulkData(&csw)) { ClearEndpointIN(); if (!ReadBulkData(&csw) { ResetRecovery(); return 0; } } if (CSW_IsValid) { if (csw.Status==0) return 1; else { if (csw.Status==2) ResetRecovery(); // Phase error return 0; } } return 0; } алгоритм по моему немножко неуклюжии и не полный, но раз все заработало остальное дело техники. Оромное спасибо всем Gerret,vmp,cppasm, особенно cppasm. |
Сообщ.
#129
,
|
|
|
Цитата PRT @ алгоритм по моему немножко неуклюжии и не полный Ну может и немного не полный - но очень похоже на то что написано в стандарте... ![]() Цитата PRT @ Оромное спасибо всем Gerret,vmp,cppasm, особенно cppasm И тебе большое спасибо, ведь тоже помог ![]() |
Сообщ.
#130
,
|
|
|
Привет всем еще раз. У меня вопрос насчет UHCI.
Как лучше и эфективнее заполнять FrameList? В спецификации никаких рекомендации не дано, а вариантов уима. Например, очередь можно прописать во все 1024 элементы FrameList-а, можно несколько TD записать в смежные очереди, тут еще BREADTH и DEPTH можно менять. Я даже видел, что транзакции состоящие из несколько TD распихиваются в FrameList через 10-20 элементов. Я тут экпериментировал с разными вариантами, но четкого представления не получил, какой из вариантов лучше, так как разные устроиства вели себя по разному. Неужели не существует одного правильного лекарства для этого дела? Заранее благодарен. |
Сообщ.
#131
,
|
|
|
по поводу stall - обнаружил, что если перед READ_CAPACITY делать TEST, а после него REQUEST_SENSE, то флешка не входит в stall. почему так - непонятно
|
Сообщ.
#132
,
|
|
|
Цитата PRT @ Например, очередь можно прописать во все 1024 элементы FrameList-а, можно несколько TD записать в смежные очереди, тут еще BREADTH и DEPTH можно менять. Я даже видел, что транзакции состоящие из несколько TD распихиваются в FrameList через 10-20 элементов. Лично я делал так: создаю QH, в него пишу цепочку TD, а в FrameList из каждого элемента кидаю ссылку на этот QH. По моему это самый простой вариант. Если QH прописывать не в каждый элемент FrameList - упадёт скорость обмена с устройством. Например можно QH прописать в FrameList в одном месте - всё будет работать, но пакеты будут слаться примерно раз в секунду. А так чтобы в FrameList прописывать ссылки на отдельные TD - тут возможны ошибки. Например в трензакции 4 пакета. Если их прописать в FrameList как TD0, TD1, TD2, TD3, ... то скорее всего будет ошибка, потому что FrameList обрабатывается циклически, и есть вероятность (в данном случае 3/4, а чем больше пакетов тем больше) что передача начнётся не с того TD и выйдет что-то типа TD2, TD3, TD0, TD1 Ясно что ничего хорошего не получится... Добавлено Цитата sergik_vrn @ по поводу stall - обнаружил, что если перед READ_CAPACITY делать TEST, а после него REQUEST_SENSE, то флешка не входит в stall. почему так - непонятно Т.е. должно быть так: ![]() ![]() TEST_UNIT_READY REQUEST_SENSE READ_CAPACITY Сегодня попробую... А без REQUEST_SENSE всё равно STALL? А вообще Windows например даже при полном бездействии флэшки с частотой примерно раз в секунду ей шлёт TEST_UNIT_READY. Вот только зачем непонятно, и без этого всё работает. Может мониторит не выдернул ли кто флэшку... |
Сообщ.
#133
,
|
|
|
Цитата Добавлено Цитата sergik_vrn @ по поводу stall - обнаружил, что если перед READ_CAPACITY делать TEST, а после него REQUEST_SENSE, то флешка не входит в stall. почему так - непонятно Т.е. должно быть так: ![]() ![]() TEST_UNIT_READY REQUEST_SENSE READ_CAPACITY именно. причем что интересно, сперва тест отдает в CSW processing error, потом sense говорит, что device not ready, потом read_capacity проходит нормально, и после этого test проходит нормально! последовательность команд слизал из линуксового лога, очень удобная штука, кстати Цитата А без REQUEST_SENSE всё равно STALL? по-моему, да. Цитата А вообще Windows например даже при полном бездействии флэшки с частотой примерно раз в секунду ей шлёт TEST_UNIT_READY. Вот только зачем непонятно, и без этого всё работает. Может мониторит не выдернул ли кто флэшку... скорее всего так и есть |
Сообщ.
#134
,
|
|
|
Цитата sergik_vrn @ причем что интересно, сперва тест отдает в CSW processing error, потом sense говорит, что device not ready, потом read_capacity проходит нормально, и после этого test проходит нормально! Ясно. Дык а тогда разница в чём? Просто выходит флэшка отвергает первую команду после подключения, вот и всё. Я сразу READ_CAPACITY шлю, а ты TEST_UNIT_READY - а в принципе разницы я большой не вижу... Цитата sergik_vrn @ последовательность команд слизал из линуксового лога, очень удобная штука, кстати Я логи под WinXP снимаю ![]() Ибо Linux'a на винте нет - только LiveCD. |
Сообщ.
#135
,
|
|
|
Цитата cppasm @ Цитата (sergik_vrn @ Сегодня, 13:56) причем что интересно, сперва тест отдает в CSW processing error, потом sense говорит, что device not ready, потом read_capacity проходит нормально, и после этого test проходит нормально! Ясно. Дык а тогда разница в чём? Просто выходит флэшка отвергает первую команду после подключения, вот и всё. Я сразу READ_CAPACITY шлю, а ты TEST_UNIT_READY - а в принципе разницы я большой не вижу... да нет. на read_capacity ты получаешь stall, а на test_ready - нормальный ответ включая CSW. просто в CSW status приходит command failed. Цитата cppasm @ Цитата (sergik_vrn @ Сегодня, 13:56) последовательность команд слизал из линуксового лога, очень удобная штука, кстати Я логи под WinXP снимаю Ибо Linux'a на винте нет - только LiveCD. в инете их тыщи. вид имеют примерно такой --=-IGgCSR+XvVk6kxTaxC7I Content-Disposition: attachment; filename=debug.log Content-Type: text/x-log; name=debug.log Content-Transfer-Encoding: 7bit Jun 8 22:57:40 bitsplitter kernel: usb-storage: scsi cmd done, result=0x0 Jun 8 22:57:40 bitsplitter kernel: usb-storage: *** thread sleeping. Jun 8 22:57:40 bitsplitter kernel: usb-storage: queuecommand called Jun 8 22:57:40 bitsplitter kernel: usb-storage: *** thread awakened. Jun 8 22:57:40 bitsplitter kernel: usb-storage: Command READ_10 (10 bytes) Jun 8 22:57:40 bitsplitter kernel: usb-storage: 28 00 00 05 00 33 00 00 68 00 Jun 8 22:57:40 bitsplitter kernel: usb-storage: usbat02_transport: READ_10: read block 0x50033 count 104 Jun 8 22:57:40 bitsplitter kernel: usb-storage: usb_stor_ctrl_transfer: rq=80 rqtype=40 value=0000 index=00 len=16 Jun 8 22:57:40 bitsplitter kernel: usb-storage: Status code 0; transferred 16/16 Jun 8 22:57:40 bitsplitter kernel: usb-storage: -- transfer complete Jun 8 22:57:40 bitsplitter kernel: usb-storage: usbat02_bulk_write: len = 14 Jun 8 22:57:40 bitsplitter kernel: usb-storage: usb_stor_bulk_transfer_buf: xfer 14 bytes Jun 8 22:57:40 bitsplitter kernel: usb-storage: Status code 0; transferred 14/14 Jun 8 22:57:40 bitsplitter kernel: usb-storage: -- transfer complete Jun 8 22:57:40 bitsplitter kernel: usb-storage: usbat02_bulk_read: len = 53248 Jun 8 22:57:40 bitsplitter kernel: usb-storage: usb_stor_bulk_transfer_buf: xfer 53248 bytes Jun 8 22:57:40 bitsplitter kernel: usb-storage: Status code 0; transferred 53248/53248 Jun 8 22:57:40 bitsplitter kernel: usb-storage: -- transfer complete Jun 8 22:57:40 bitsplitter kernel: usb-storage: usbat02_read_data: 53248 bytes Jun 8 22:57:40 bitsplitter kernel: usb-storage: scsi cmd done, result=0x0 Jun 8 22:57:40 bitsplitter kernel: usb-storage: *** thread sleeping. Jun 8 22:57:40 bitsplitter kernel: usb-storage: queuecommand called Jun 8 22:57:40 bitsplitter kernel: usb-storage: *** thread awakened. Jun 8 22:57:40 bitsplitter kernel: usb-storage: Command READ_10 (10 bytes) Jun 8 22:57:40 bitsplitter kernel: usb-storage: 28 00 00 05 00 9b 00 00 18 00 Jun 8 22:57:40 bitsplitter kernel: usb-storage: usbat02_transport: READ_10: read block 0x5009b count 24 Jun 8 22:57:40 bitsplitter kernel: usb-storage: usb_stor_ctrl_transfer: rq=80 rqtype=40 value=0000 index=00 len=16 Jun 8 22:57:40 bitsplitter kernel: usb-storage: Status code 0; transferred 16/16 Jun 8 22:57:40 bitsplitter kernel: usb-storage: -- transfer complete Jun 8 22:57:40 bitsplitter kernel: usb-storage: usbat02_bulk_write: len = 14 Jun 8 22:57:40 bitsplitter kernel: usb-storage: usb_stor_bulk_transfer_buf: xfer 14 bytes Jun 8 22:57:40 bitsplitter kernel: usb-storage: Status code 0; transferred 14/14 Jun 8 22:57:40 bitsplitter kernel: usb-storage: -- transfer complete Jun 8 22:57:40 bitsplitter kernel: usb-storage: usbat02_bulk_read: len = 12288 Jun 8 22:57:40 bitsplitter kernel: usb-storage: usb_stor_bulk_transfer_buf: xfer 12288 bytes Jun 8 22:57:40 bitsplitter kernel: usb-storage: Status code 0; transferred 12288/12288 Jun 8 22:57:40 bitsplitter kernel: usb-storage: -- transfer complete Jun 8 22:57:40 bitsplitter kernel: usb-storage: usbat02_read_data: 12288 bytes Jun 8 22:57:40 bitsplitter kernel: usb-storage: scsi cmd done, result=0x0 Jun 8 22:57:40 bitsplitter kernel: usb-storage: *** thread sleeping. Jun 8 22:57:40 bitsplitter kernel: usb-storage: queuecommand called Jun 8 22:57:40 bitsplitter kernel: usb-storage: *** thread awakened. Jun 8 22:57:40 bitsplitter kernel: usb-storage: Command READ_10 (10 bytes) Jun 8 22:57:40 bitsplitter kernel: usb-storage: 28 00 00 05 00 b3 00 00 21 00 Jun 8 22:57:40 bitsplitter kernel: usb-storage: usbat02_transport: READ_10: read block 0x500b3 count 33 Jun 8 22:57:40 bitsplitter kernel: usb-storage: usb_stor_ctrl_transfer: rq=80 rqtype=40 value=0000 index=00 len=16 Jun 8 22:57:40 bitsplitter kernel: usb-storage: Status code 0; transferred 16/16 Jun 8 22:57:40 bitsplitter kernel: usb-storage: -- transfer complete Jun 8 22:57:40 bitsplitter kernel: usb-storage: usbat02_bulk_write: len = 14 Jun 8 22:57:40 bitsplitter kernel: usb-storage: usb_stor_bulk_transfer_buf: xfer 14 bytes Jun 8 22:57:41 bitsplitter kernel: usb-storage: Status code 0; transferred 14/14 Jun 8 22:57:41 bitsplitter kernel: usb-storage: -- transfer complete Jun 8 22:57:41 bitsplitter kernel: usb-storage: usbat02_bulk_read: len = 16896 Jun 8 22:57:41 bitsplitter kernel: usb-storage: usb_stor_bulk_transfer_buf: xfer 16896 bytes Jun 8 22:57:41 bitsplitter kernel: usb-storage: Status code 0; transferred 16896/16896 Jun 8 22:57:41 bitsplitter kernel: usb-storage: -- transfer complete Jun 8 22:57:41 bitsplitter kernel: usb-storage: usbat02_read_data: 16896 bytes Jun 8 22:57:41 bitsplitter kernel: usb-storage: scsi cmd done, result=0x0 Jun 8 22:57:41 bitsplitter kernel: usb-storage: *** thread sleeping. Jun 8 22:57:41 bitsplitter kernel: usb-storage: queuecommand called Jun 8 22:57:41 bitsplitter kernel: usb-storage: *** thread awakened. Jun 8 22:57:41 bitsplitter kernel: usb-storage: Command READ_10 (10 bytes) Jun 8 22:57:41 bitsplitter kernel: usb-storage: 28 00 00 05 00 d4 00 00 02 00 Jun 8 22:57:41 bitsplitter kernel: usb-storage: usbat02_transport: READ_10: read block 0x500d4 count 2 Jun 8 22:57:41 bitsplitter kernel: usb-storage: usb_stor_ctrl_transfer: rq=80 rqtype=40 value=0000 index=00 len=16 Jun 8 22:57:41 bitsplitter kernel: usb-storage: Status code 0; transferred 16/16 Jun 8 22:57:41 bitsplitter kernel: usb-storage: -- transfer complete Jun 8 22:57:41 bitsplitter kernel: usb-storage: usbat02_bulk_write: len = 14 Jun 8 22:57:41 bitsplitter kernel: usb-storage: usb_stor_bulk_transfer_buf: xfer 14 bytes Jun 8 22:57:41 bitsplitter kernel: usb-storage: Status code 0; transferred 14/14 Jun 8 22:57:41 bitsplitter kernel: usb-storage: -- transfer complete Jun 8 22:57:41 bitsplitter kernel: usb-storage: usbat02_bulk_read: len = 1024 Jun 8 22:57:41 bitsplitter kernel: usb-storage: usb_stor_bulk_transfer_buf: xfer 1024 bytes Jun 8 22:57:41 bitsplitter kernel: usb-storage: Status code 0; transferred 1024/1024 Jun 8 22:57:41 bitsplitter kernel: usb-storage: -- transfer complete Jun 8 22:57:41 bitsplitter kernel: usb-storage: usbat02_read_data: 1024 bytes Jun 8 22:57:41 bitsplitter kernel: usb-storage: scsi cmd done, result=0x0 Jun 8 22:57:41 bitsplitter kernel: usb-storage: *** thread sleeping. Jun 8 22:57:41 bitsplitter kernel: usb-storage: queuecommand called Jun 8 22:57:41 bitsplitter kernel: usb-storage: *** thread awakened. Jun 8 22:57:41 bitsplitter kernel: usb-storage: Command READ_10 (10 bytes) Jun 8 22:57:41 bitsplitter kernel: usb-storage: 28 00 00 05 00 d6 00 00 25 00 Jun 8 22:57:41 bitsplitter kernel: usb-storage: usbat02_transport: READ_10: read block 0x500d6 count 37 Jun 8 22:57:41 bitsplitter kernel: usb-storage: usb_stor_ctrl_transfer: rq=80 rqtype=40 value=0000 index=00 len=16 Jun 8 22:57:41 bitsplitter kernel: usb-storage: Status code 0; transferred 16/16 Jun 8 22:57:41 bitsplitter kernel: usb-storage: -- transfer complete Jun 8 22:57:41 bitsplitter kernel: usb-storage: usbat02_bulk_write: len = 14 Jun 8 22:57:41 bitsplitter kernel: usb-storage: usb_stor_bulk_transfer_buf: xfer 14 bytes Jun 8 22:57:41 bitsplitter kernel: usb-storage: Status code 0; transferred 14/14 Jun 8 22:57:41 bitsplitter kernel: usb-storage: -- transfer complete Jun 8 22:57:41 bitsplitter kernel: usb-storage: usbat02_bulk_read: len = 18944 Jun 8 22:57:41 bitsplitter kernel: usb-storage: usb_stor_bulk_transfer_buf: xfer 18944 bytes Jun 8 22:57:41 bitsplitter kernel: usb-storage: Status code 0; transferred 18944/18944 Jun 8 22:57:41 bitsplitter kernel: usb-storage: -- transfer complete Jun 8 22:57:41 bitsplitter kernel: usb-storage: usbat02_read_data: 18944 bytes Jun 8 22:57:41 bitsplitter kernel: usb-storage: scsi cmd done, result=0x0 Jun 8 22:57:41 bitsplitter kernel: usb-storage: *** thread sleeping. Jun 8 22:57:41 bitsplitter kernel: usb-storage: queuecommand called Jun 8 22:57:41 bitsplitter kernel: usb-storage: *** thread awakened. Jun 8 22:57:41 bitsplitter kernel: usb-storage: Command READ_10 (10 bytes) Jun 8 22:57:41 bitsplitter kernel: usb-storage: 28 00 00 05 00 fb 00 00 68 00 Jun 8 22:57:41 bitsplitter kernel: usb-storage: usbat02_transport: READ_10: read block 0x500fb count 104 Jun 8 22:57:41 bitsplitter kernel: usb-storage: usb_stor_ctrl_transfer: rq=80 rqtype=40 value=0000 index=00 len=16 Jun 8 22:57:41 bitsplitter kernel: usb-storage: Status code 0; transferred 16/16 Jun 8 22:57:41 bitsplitter kernel: usb-storage: -- transfer complete Jun 8 22:57:41 bitsplitter kernel: usb-storage: usbat02_bulk_write: len = 14 Jun 8 22:57:41 bitsplitter kernel: usb-storage: usb_stor_bulk_transfer_buf: xfer 14 bytes Jun 8 22:57:41 bitsplitter kernel: usb-storage: Status code 0; transferred 14/14 Jun 8 22:57:41 bitsplitter kernel: usb-storage: -- transfer complete Jun 8 22:57:41 bitsplitter kernel: usb-storage: usbat02_bulk_read: len = 53248 Jun 8 22:57:41 bitsplitter kernel: usb-storage: usb_stor_bulk_transfer_buf: xfer 53248 bytes Jun 8 22:57:41 bitsplitter kernel: usb-storage: Status code 0; transferred 53248/53248 Jun 8 22:57:41 bitsplitter kernel: usb-storage: -- transfer complete Jun 8 22:57:41 bitsplitter kernel: usb-storage: usbat02_read_data: 53248 bytes Jun 8 22:57:41 bitsplitter kernel: usb-storage: scsi cmd done, result=0x0 Jun 8 22:57:41 bitsplitter kernel: usb-storage: *** thread sleeping. Jun 8 22:57:41 bitsplitter kernel: usb-storage: queuecommand called Jun 8 22:57:41 bitsplitter kernel: usb-storage: *** thread awakened. |