Перейти к содержанию
    

Имеется несколько вопросов для обсуждения связанных с программированием USB 2.0:

1) На какую среднюю пропускную способность можно расчитывать?

2) Самый скоростной чипсет мат. платы в плане USB ?

3) Какой режим работы, ISO или BULK предпочтительней с точки зрения скорости?

4) Кто-нибудь пробовал сцепить URB пакеты? Имеется ли в этом смысл?

5) Кто или что может будить устройство под XP без спроса?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имеется несколько вопросов для обсуждения связанных с программированием USB 2.0:

1) На какую среднюю пропускную способность можно расчитывать?

2) Самый скоростной чипсет мат. платы в плане USB ?

3) Какой режим работы, ISO или BULK предпочтительней с точки зрения скорости?

4) Кто-нибудь пробовал сцепить URB пакеты? Имеется ли в этом смысл?

5) Кто или что может будить устройство под XP без спроса?

 

Писал драйвер под ХР (USB2.0), НО устройство было USB1.1.

IMHO если устройство на шине одно, то BULK - самый удобный вид передачи.

ISO быстрее только в случае наличия нескольких устройств на шине.

Большой минус ISO - негарантированная доставка пакетов.

Максимум скорости для BULK USB1.1 (~1,6 Mbit/s) был достигнут без особых усилий.

 

Что значит "Кто-нибудь пробовал сцепить URB пакеты? Имеется ли в этом смысл" ? На стороне РС надуваешь USB Bus Driver в асинхронном режиме (не ждешь завершения предыущего запроса) - пакеты вылетают на шину со свистом. USB Bus Driver сам слепит всё за тебя так, как ему удобнее. Сообщит об ошибке, если делаешь что-то не так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответ! В асинхронной накачке есть минусы - нужно делать очередь в драйвере, чтобы пакеты не перепутались. А скорость хотелось порядка 50 Мбайт/сек, пока у меня только 30 получается.

А насчёт спячки ничего сказать не можете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я знаю :)

 

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 dmitry_tomsk

 

Очередь в драйвере реализовать просто. Полно всяких классов для работы со связанными списками ( я их использовал для хранения URB). Не нравится С++, напиши что-то своё.

 

Если не хочешь всё же связываться с асинхронной передачей запросов в USB Bus Driver, попробуй увеличить размер URB, которыми его накачиваешь.

Насколько я понял, драйвер шины у микрософта работает весьма эффективно,если ему не давать простаивать. По моему опыту синхронная передача в Bus Driver URB небольших размеров здорово снижает скорость.

 

Ещё совет: не делай каждый раз выделение памяти под новый URB.

Используй метод "reuse URB" для засылки в драйвер шины.

 

Может вот эта ссылка чем-то будет полезна?(h**p://www.usb.org/phpbb)

 

По поводу спячки полностью согласен с v_mirgorodsky.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо огромное за помощь!!!

Размеры URB увеличивать пробовал, получал синий экран в отместку.

С синхронной передачей в драйвере у меня тоже не получается. Стандартный пример в DDK использует

BuildPartialMdl, если устройство отключить во время передачи данных, то попытка освободить память

в CompletionRoutine приводит к синему экрану. Если посылать асинхронные запросы в драйвере,

то каким образом разбить таблицу MDL на части? А если в приложении, то сколько запросов нужно делать?

Если считать время пересылки стандартного пакета 64 кБ = 1 ms, то какой массив надо запихать в

waitformultipleobject, чтобы обеспечить непрерывность посылки при условии, что в параллельном потоке

данные обрабатываются (полагаю, связано с квантом опроса активности потоков)?

Кстати, для CY7C68013, можно ли там сбросить уже заряженный endpoint буфер для EP2-4-6-8? С EP1 достаточно было сбросить BUSY флаг, а для других что-то не найду такого.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я лично писал драйвер с использованием 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" и пример к ней.

Не получится найти в гугле - пиши.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть такая английская книжка Walter Oney, "Programming Windows Driver Model", первое или второе издание. Кое чего по ней можно посмотреть на сайте автора: h**p://ww*w.oney*soft.co*m. Эта книга уже давно считается Библией по вопросам написания WDM драйверов под Windows. Там рассмотрены практически все аспекты программирования WDM драйверов и в частности уделено очень много внимания USB драйверам. Она есть на нашем FTP. Там описано все по поводу очередей, обработки запросов от USB и т.д.

 

Без построения очередей в драйвере и рециклирования буфера в CompletionRoutine() добиться сколь нибудь нормальной скорости невозможно :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Большое спасибо за помощь!!!

Книгу Oney в инете нашёл, действительно классная, я пользовался книгой backer the windows 2000 device driver book, там все очень поверхностно. Driver Studio тоже начал закачивать. Книгу Хайда не нашел, но думаю, пока и найденного хватит для изучения. Попробую совместить асинхронную накачку с двумя выделенными URB, а затем перезаряжать их в CompletionRoutine. На импортном форуме нашёл, что задержка от передачи irp в шинный драйвер до вызова CompletionRoutine 750 тыс тактов процессора, то есть от 0,5 до 2 мс для более менее современных компьютеров, так что двумя запросами со стандартным размером буфера endpoint 64 кБ можно обойтись.

Ещё раз спасибо за ценные советы!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...