dmitry-tomsk 0 3 марта, 2005 Опубликовано 3 марта, 2005 · Жалоба Имеется несколько вопросов для обсуждения связанных с программированием USB 2.0: 1) На какую среднюю пропускную способность можно расчитывать? 2) Самый скоростной чипсет мат. платы в плане USB ? 3) Какой режим работы, ISO или BULK предпочтительней с точки зрения скорости? 4) Кто-нибудь пробовал сцепить URB пакеты? Имеется ли в этом смысл? 5) Кто или что может будить устройство под XP без спроса? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nemo444 0 4 марта, 2005 Опубликовано 4 марта, 2005 · Жалоба Имеется несколько вопросов для обсуждения связанных с программированием USB 2.0: 1) На какую среднюю пропускную способность можно расчитывать? 2) Самый скоростной чипсет мат. платы в плане USB ? 3) Какой режим работы, ISO или BULK предпочтительней с точки зрения скорости? 4) Кто-нибудь пробовал сцепить URB пакеты? Имеется ли в этом смысл? 5) Кто или что может будить устройство под XP без спроса? <{POST_SNAPBACK}> Писал драйвер под ХР (USB2.0), НО устройство было USB1.1. IMHO если устройство на шине одно, то BULK - самый удобный вид передачи. ISO быстрее только в случае наличия нескольких устройств на шине. Большой минус ISO - негарантированная доставка пакетов. Максимум скорости для BULK USB1.1 (~1,6 Mbit/s) был достигнут без особых усилий. Что значит "Кто-нибудь пробовал сцепить URB пакеты? Имеется ли в этом смысл" ? На стороне РС надуваешь USB Bus Driver в асинхронном режиме (не ждешь завершения предыущего запроса) - пакеты вылетают на шину со свистом. USB Bus Driver сам слепит всё за тебя так, как ему удобнее. Сообщит об ошибке, если делаешь что-то не так. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dmitry-tomsk 0 4 марта, 2005 Опубликовано 4 марта, 2005 · Жалоба Спасибо за ответ! В асинхронной накачке есть минусы - нужно делать очередь в драйвере, чтобы пакеты не перепутались. А скорость хотелось порядка 50 Мбайт/сек, пока у меня только 30 получается. А насчёт спячки ничего сказать не можете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
v_mirgorodsky 0 4 марта, 2005 Опубликовано 4 марта, 2005 · Жалоба Я знаю :) 1. Средняя пропускная способность по USB выше 40MB/s строго говоря очень проблематична. У нас получилось достигнуть 46MB/s, но это уже был екстремум. Использовали BULK-трансферы с одним устройством на шине, на серверной двухпроцессорной материнке. В устройстве стоял CY7C68013. 2. Самый скоростной чипсет в плане USB - Intel, с ICH4-5 и новее южным мостом. В этих чипсетах USB хост встроен в чипсет, что позволяет достичь большей пропускной способности. По результатам тестирования прирост составляет 30-40% по сравнению с внешними USB хостами. 3. С ISO не работали, потому ничего не скажу. 4. Сцепка URB-ов не поддерживается на данный момент ни под одной из ОС, поддерживающих USB. Эта идея была выдвинута для ускорения работы шинного драйвера, однако похоронена за ненадобностью. Винда, например, тупо показывает синий экран, если видит там что-либо отличное от NULL :) 5. Устройство под хрюном никто кроме драйвера не трогает. Однако, если реализован ровер-манаджер (IRP_MJ_POWER), то винда может по своему усмотрению будить устройство, но через ваш драйвер. По другому это не работает. Хост ничего не шлет лишнего, чего ему не скажут послать, ничего не прячет и ведет себя в высшей степени корректно. Если устройство просыпается само по себе, то значит есть ошибки в софте или девайсе - ищите. Самый ПЛОХОЙ (ДЕРЬМОВЫЙ, %:?№", ....) чипсет в плане USB это VIA, его надо избегать, IMHO. Железка там может и не самая плохая, но драйвера полный отстой, IMHO. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nemo444 0 4 марта, 2005 Опубликовано 4 марта, 2005 · Жалоба 2 dmitry_tomsk Очередь в драйвере реализовать просто. Полно всяких классов для работы со связанными списками ( я их использовал для хранения URB). Не нравится С++, напиши что-то своё. Если не хочешь всё же связываться с асинхронной передачей запросов в USB Bus Driver, попробуй увеличить размер URB, которыми его накачиваешь. Насколько я понял, драйвер шины у микрософта работает весьма эффективно,если ему не давать простаивать. По моему опыту синхронная передача в Bus Driver URB небольших размеров здорово снижает скорость. Ещё совет: не делай каждый раз выделение памяти под новый URB. Используй метод "reuse URB" для засылки в драйвер шины. Может вот эта ссылка чем-то будет полезна?(h**p://www.usb.org/phpbb) По поводу спячки полностью согласен с v_mirgorodsky. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dmitry-tomsk 0 4 марта, 2005 Опубликовано 4 марта, 2005 · Жалоба Спасибо огромное за помощь!!! Размеры URB увеличивать пробовал, получал синий экран в отместку. С синхронной передачей в драйвере у меня тоже не получается. Стандартный пример в DDK использует BuildPartialMdl, если устройство отключить во время передачи данных, то попытка освободить память в CompletionRoutine приводит к синему экрану. Если посылать асинхронные запросы в драйвере, то каким образом разбить таблицу MDL на части? А если в приложении, то сколько запросов нужно делать? Если считать время пересылки стандартного пакета 64 кБ = 1 ms, то какой массив надо запихать в waitformultipleobject, чтобы обеспечить непрерывность посылки при условии, что в параллельном потоке данные обрабатываются (полагаю, связано с квантом опроса активности потоков)? Кстати, для CY7C68013, можно ли там сбросить уже заряженный endpoint буфер для EP2-4-6-8? С EP1 достаточно было сбросить BUSY флаг, а для других что-то не найду такого. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nemo444 0 5 марта, 2005 Опубликовано 5 марта, 2005 · Жалоба Я лично писал драйвер с использованием DriverStudio v3.1. Мне это показалось удобнее, чем непосредственно на DDK. На изучение много времени не уйдёт - там всё просто (готовые классы на основе DDK). К тому же SoftIce здорово помог в отладке. Плюс есть куча примеров WDM драйверов (в том числе и USB). Синий экран - следствие ошибок в написании драйвера. У меня тоже так было, пока баги не подчистил. Если ошибки возникают в устройстве, то драйвер просто подвисает (так у меня было). Внимательно почитай, что тебе синий экран пишет (очень помогает понять из-за чего он вываливается). У меня увеличение размера URB не вызывало синего экрана. Взять более свежую версию DriverStudio можно вот здесь: h**p://soft.0zones.com/SoftDown.asp?ID=16751 и обязательно здесь: h**p://soft.0zones.com/SoftDown.asp?ID=22405 Ещё мне понравился пример из книги John Hyde ""USB Design by Example". Особенно рекомендую Chapter 11 "Moving a lot of Data" и пример к ней. Не получится найти в гугле - пиши. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
v_mirgorodsky 0 5 марта, 2005 Опубликовано 5 марта, 2005 · Жалоба Есть такая английская книжка Walter Oney, "Programming Windows Driver Model", первое или второе издание. Кое чего по ней можно посмотреть на сайте автора: h**p://ww*w.oney*soft.co*m. Эта книга уже давно считается Библией по вопросам написания WDM драйверов под Windows. Там рассмотрены практически все аспекты программирования WDM драйверов и в частности уделено очень много внимания USB драйверам. Она есть на нашем FTP. Там описано все по поводу очередей, обработки запросов от USB и т.д. Без построения очередей в драйвере и рециклирования буфера в CompletionRoutine() добиться сколь нибудь нормальной скорости невозможно :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dmitry-tomsk 0 5 марта, 2005 Опубликовано 5 марта, 2005 · Жалоба Большое спасибо за помощь!!! Книгу Oney в инете нашёл, действительно классная, я пользовался книгой backer the windows 2000 device driver book, там все очень поверхностно. Driver Studio тоже начал закачивать. Книгу Хайда не нашел, но думаю, пока и найденного хватит для изучения. Попробую совместить асинхронную накачку с двумя выделенными URB, а затем перезаряжать их в CompletionRoutine. На импортном форуме нашёл, что задержка от передачи irp в шинный драйвер до вызова CompletionRoutine 750 тыс тактов процессора, то есть от 0,5 до 2 мс для более менее современных компьютеров, так что двумя запросами со стандартным размером буфера endpoint 64 кБ можно обойтись. Ещё раз спасибо за ценные советы!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vallen 0 7 марта, 2005 Опубликовано 7 марта, 2005 · Жалоба Help! Скиньте USB Design by Example на мыло. Заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nemo444 0 9 марта, 2005 Опубликовано 9 марта, 2005 · Жалоба 2 Vallen Уточните мыло, на которое кинуть книжку. Она весит чуть больше 16 метров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vallen 0 12 марта, 2005 Опубликовано 12 марта, 2005 · Жалоба 2 nemo444 На [email protected]. Если возможно разбитым на куски по 2-3 мега. Заранее спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nemo444 0 14 марта, 2005 Опубликовано 14 марта, 2005 · Жалоба 2 Vallen Проверяйте почту. Разбил примерно по 2 мега. (9 кусков) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vallen 0 16 марта, 2005 Опубликовано 16 марта, 2005 · Жалоба 2 nemo444 Спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vvvvv 0 17 марта, 2005 Опубликовано 17 марта, 2005 · Жалоба А как бы на Ftp выложить, или намыльте мне, я положу Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться