Usbdk windows 7 ошибка при установке

Ok, I see that you’re running with VIA USB controller which was not tested with UsbDk yet.

Let’s try to collect some more information in order to understand what’s going on.

First of all, regarding you own builds — could it be driver signing problem? Please try to compile Debug configuration and enable test signing on the target system before running it.
Please see https://github.com/daynix/UsbDk/blob/master/Documentation/DriverSigning.txt for information on how to enable test signing.

Regarding the official build that freezes — could you please collect a driver’s binary trace as described at https://github.com/daynix/UsbDk/blob/master/Documentation/Tracing.txt and share it with us?
Also could you please check whether this is a system freeze of just USB devices do not work.
In the latter case things should change on the screen (clock, for example).

Thanks

Содержание

  1. Не устанавливается Windows 7 x64 — «USB disk is not yet available»
  2. Please reinsert the usb disk при установке windows 7
  3. Как установить Windows 7 вместо Windows 8
  4. Комментарии (613)
  5. Рекламный блок
  6. Подпишитесь на рассылку
  7. Навигация
  8. Облако тегов
  9. Архив статей
  10. Сейчас обсуждаем
  11. admin
  12. admin
  13. admin
  14. Фёдор
  15. Гость Андрей
  16. О проекте RemontCompa.ru
  17. Добавляем поддержку USB 3.0 в установщик Windows 7
  18. Общая информация
  19. Содержание:
  20. ↑ Как создать загрузочную флешку Windows 7
  21. ↑ Как создать загрузочную флешку Windows 7 программой WinSetupFromUSB
  22. ↑ Как создать загрузочную UEFI флешку Windows 7 программой WinSetupFromUSB

Не устанавливается Windows 7 x64 — «USB disk is not yet available»

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Windows 7 не устанавливается после ошибки «А disk read error occurred press ctrl+alt+del to restart»
Здравствуйте. Проблема такова: после того, как я достаточно сильно хлопнул крышкой ноутбука, то.

В меню BIOS «Hard Disk Boot Priority» нет пункта «USB»
Здравствуйте, возникла такая проблема: Решил переустановить винду, сделал образ через ultraiso.

«Отваливается» USB 3.0 в Windows 7 x64
Проблема возникла после того, как usb 3.0 пару раз автоматом пробросило в виртуальную машину.

угу, и святой водичкой окропить :jokingly:

Если 10-ка установлена, то можно из её попробовать установить 7-ку (на другой раздел). Подключить установочный .iso образ в виртуальный привод и запустить setup.exe, начнётся обычная установка 7-ки. Посмотреть, что получится с установкой, если 7-ка установится, то поюзать её (установить драйвера и т.д.). Если 7-ка будет правильно работать, то потом можно подумать об установке её основной (единственной) системой.

При установке через setup.exe «правила» такие:
Из 32-х битной ОС можно запустить установку только 32-х битной системы.
Из 64-х битной ОС можно запустить установку любой системы.

Можно ещё использовать такой вариант установки 7-ки Установка Win 7 второй системой к Win 8/8.1 в режиме UEFI на GPT диск. Ограничений на рарядность в этом случае нет.

Источник

Please reinsert the usb disk при установке windows 7

Waiting usb disks to initialize

2) Использование USB 3.0. Так же довольно частая ошибка, особенно при установке Windows 7. Попробуйте вставить Вашу флешку в порт USB 2.0.

3) Загрузка с UEFI. Если есть возможность, попробуйте загрузиться на флешку без UEFI.(В некоторых версиях Биоса это возможно сделать, у Вас будет в выборе загрузочного диска отображаться: UEFI «Name Flash» (название Вашей флешки) и просто Name Flash (название Вашей флешки), выберите ту, что без приписки UEFI.

4) Отсутствие USB драйверов при загрузке загрузочной флешки. (Как правило, данный способ актуален, если у Вы пытаетесь установить Windows 7).

111

После окончания процесса записи Windows на флешку. Скачиваем, устанавливаем и запускаем приложение NLite. Скачать приложение можете с его официального сайта.

Открываем утилиту NLite => Добавить => Файл образа (WIM, ESD, SWM).

1 1

Идем на флешку (она должна быть вставлена в USB) => Ищем там файл «boot.wim». В зависимости от Вашего дистрибутива и способа записи он может быть в любой папке на флешке, к примеру диск-флешки:WINSETUPW7_SP1x64

2 1

3 1

Далее отмечаем Windows Setup => Загрузить

4 1

После окончания процесса выбираем пункт «Драйверы» => Далее «Добавить» => Каталог, содержащий драйверы. Драйвера для Ваших USB можете скачать на сайте производителя.

5 1

Если у Вас ноутбук, то найти их можете по модели ноутбука, если стационарный ПК, то по модели материнской платы. Узнать точную модель материнской платы можете через программу «Speccy» скачать ее можете на ее официальном сайте.

7

После выбора папки с драйверами. В нижней части панели жмем «Применить» => Обработка. Везде отвечаем «Да» и ждем окончания процесса интеграции драйверов.

6 1

А так же, мы рекомендуем использовать только оригинальные дистрибутивы Windows. Скачать их можете в нашем каталоге.

Источник

Сначала была мысль установить Windows 7 прямо на жёсткий диск GPT. Дело в том, что у меня есть ещё системный блок с БИОСом UEFI и на него я спокойно установил Windows 7 на GPT-диск. Для инструкции использовал вашу статью Как установить Windows 7 на GPT-диск. Но с ноутбуком такой номер не проходит.

1381138853 18

Если в БИОСе UEFI ноутбука выключена опция «Secure Boot», но включена опция UEFI BOOT, то установка Windows 7 опять зависает в самом начале ещё до выбора разделов.

Даже если я куплю Windows 8 с новым ключом, мне его просто негде будет ввести, при переустановке Windows 8, я получу ошибку ещё до ввода ключа «Введенный ключ продукта не соответствует ни одному из образов Windows».

1381138844 17

Восстановить Windows 8 можно будет только в сервисном центре за деньги. Тоже самое мне сказали на форуме сообщества Майкрософт!

1381138908 1

Не поможет даже отключение в БИОС опции «Secure Boot» и перевод режима UEFI в положение «Legacy OS» или «CMS OS»

Обратите внимание админ, если раньше ключ Windows был прописан на днище ноутбука, то сейчас его там нет, вам не кажется, что странные дела творятся в этом мире! Юстас.

1381142475 10

Согласен со всем сказанным выше, поэтому друзья, прежде чем установить Windows 7 вместо Windows 8 прочитайте вот эти три наши статьи, создайте бэкап Windows 8 и положите его на всякий случай на полочку, может он вам и пригодится когда-нибудь.

Ещё в этих статьях подробно написано, как восстановить Windows 8 в случае необходимости.

1381139553 5

1381139541 5w

1381139595 6

В БИОС во вкладке «Advanced» находим опцию «System configuration» и входим в неё,

1381139746 8

здесь видим опцию «BOOT MODE» или «OS Mode Selection», выставляем её вместо положения UEFI OS (может быть UEFI BOOT)

1381139987 9

в положение «CSM Boot» или «UEFI and Legacy OS», «CMS OS»

1381140077 10

1381140015 11

что даст нам возможность загрузить наш ноутбук с установочного диска с любой операционной системой.

После этого сохраняем наши изменения в БИОС, нажимаем F10

1381140196 12

1381140187 14

и загружаемся с установочного диска или флешки с Windows 7. Например на моём ноутбуке, чтобы попасть в загрузочное меню, нужно при загрузке часто жать клавишу F12,

1381140402 15

появится меню выбираем в нём наш DVD-ROM.

1381140348 16

При появлении на экране надписи «Press any key to boot from CD or DVD», нажимаем любую клавишу на клавиатуре, этим мы соглашаемся загрузиться с установочного диска.

1381140400 19

1381140579 20

1381140517 21

Принимаем условия соглашения. Выбираем полную установку.

1381140550 22

Друзья, здесь вы просто можете нажать на кнопку «Настройка диска» и удалить все имеющиеся разделы,

1381140881 2

1381140857 23

далее устанавливайте Windows 7 в нераспределённое пространство. Windows 7 при установке автоматически преобразует жёсткий диск в стандарт MBR.

Или вызываем командную строку, нажимаем на клавиатуре Shift + F10 и преобразуем наш жёсткий диск в стандарт MBR в командной строке, все разделы и данные на диске также будут удалены. Жмём на клавиатуре Shift + F10. В командной строке последовательно вводим команды:

diskpart
sel dis 0
clean
convert mbr
exit
exit

1381140962 5

1381140979 24

1381141089 23

1381141131 01

После установки операционной системы Windows 7 идём в Управление дисками, щёлкаем правой мышью на нашем диске и выбираем Свойства,

1381141228 02

далее Тома. Как видим, наш диск имеет стиль раздела MBR.

1381141223 4

Комментарии (613)

Рекламный блок

Подпишитесь на рассылку

Навигация

Облако тегов

Архив статей

Сейчас обсуждаем

foto 1

admin

Мне нужно зайти на винду на жёстком (если она конечно не удалилась), восстановить там возможно

foto 1

admin

Андрей, никак не убрать панель инструментов, она заточена под сенсорное управление. Юзайте

foto 1

admin

удалять все разделы на жёстком диске и ставить систему прямо в нераспределённое пространство

noavatar

Фёдор

Цитата: Гость Владимир Собственными силами нарыл модифицированную прошивку БИОС p5k-1201-ahci,rom.

noavatar

Гость Андрей

Очень круто. Респект за инфу.

О проекте RemontCompa.ru

RemontCompa — сайт с огромнейшей базой материалов по работе с компьютером и операционной системой Windows. Наш проект создан в 2010 году, мы стояли у истоков современной истории Windows. У нас на сайте вы найдёте материалы по работе с Windows начиная с XP. Мы держим руку на пульсе событий в эволюции Windows, рассказываем о всех важных моментах в жизни операционной системы. Мы стабильно выпускаем мануалы по работе с Windows, делимся советами и секретами. Также у нас содержится множество материалов по аппаратной части работы с компьютером. И мы регулярно публикуем материалы о комплектации ПК, чтобы каждый смог сам собрать свой идеальный компьютер.

Наш сайт – прекрасная находкой для тех, кто хочет основательно разобраться в компьютере и Windows, повысить свой уровень пользователя до опытного или профи.

Источник

usb3flashДобавляем поддержку USB 3.0 в установщик Windows 7

2159

Общая информация

Связано это с тем, что в новых чипсетах Intel, начиная с 100 серии (B150, H110, H170, Q150, Q170, Z170) убрана поддержка Enhanced Host Controller Interface, и поэтому USB разъемы любой версии попросту не работают в установщике Windows. Выражается это в следующем сообщении:

Не найден необходимый драйвер для дисковода оптических дисков. Если у вас есть дискета, CD, DVD или флеш-накопитель USB с этим драйвером, вставьте этот носитель.
Примечение: если носитель установки Windows вставлен в устройство CD/DVD его можно извлечь на время выполнение этого шага.

firefox 2018 11 25 14 34 45

Тем не менее, многие производители материнских плат решили позаботиться о своих пользователях, и выпустили соответствующие утилиты, которые интегрируют драйвера в установщик Windows 7.

Поддерживаются материнские платы на следующих чипсетах Intel*:
B150, H110, H170, Q150, Q170, Z170
B250, H270, Q250, Q270, Z270
X299
B360, H310, H370, Q360, Q370

Система на кристалле (SoC) Intel:
J3000, N3000

* По информации производителя программного обеспечения.

Пользоваться данной утилитой достаточно легко:

* По информации производителя программного обеспечения.

Кампания Gigabyte так же выпустила утилиту под названием «Windows Image Tool», скачать которую можно по этой ссылке.

Для её использования, достаточно просто распаковать содержимое архива в любую папку, и запустить исполняемый файл под названием WindowsImageTool.

Запуск программы потребует права администратора, так что если она их затребует, разрешите их.

Как только будут выбраны все нужные диски, нужно обязательно убедится, что стоит галочка у пункта «Add USB drivers to an offline Windows 7 image», и нажать на кнопку «Start».

По завершению процесса вместо кноки «Start» станет активна кнопка «Close». После этого, нужно извлечь флешку и приступать к установке Windows на нужном компьютере.

Поддерживаются материнские платы на следующих чипсетах Intel*:
B150, H110, H170, Q150, Q170, Z170

* По информации производителя программного обеспечения.

Скачать её можно в разделе загрузок нужной материнской платы MSI (Раздел «Утилиты»), или же с нашего сайта (см. ниже).

После скачивания запускаем исполняемый файл, и устанавливаем программу.

Smart Tool.tmp 2018 01 25 22 27 11

После установки запускаем её, и видим перед собой предупреждающее сообщение, в котором говориться для какой цели была создана данная программа, а так же указание не вытаскивать флешку во время работы программы.

Smart Tool 2018 01 25 22 28 39

В программе выбираем пункт «Win7 Smart Tool».

Smart Tool 2018 01 25 22 28 43

Затем задаем в пункте Source Folder путь к файлу образа, или же к папке с распакованным образом. В разделе «Choose storage device» выбираем либо флеш-носитель («USB Storage»), либо создание образа ISO («ISO Destination»). По завершению указания всех нужных путей нажимем кнопку Start, и ждем завершения процедуры.

Smart Tool 2018 01 25 22 33 32

По окончанию процедуры появится соответствующее уведомление:

Источник

Содержание:

1) Как создать загрузочную флешку Windows 7 в программе WinSetupFromUSB.

2) Как создать мультизагрузочную флешку содержащую сразу две операционные системы Windows 7 и Windows 8!

↑ Как создать загрузочную флешку Windows 7

↑ Как создать загрузочную флешку Windows 7 программой WinSetupFromUSB

1391512403 1

1391512433 2

Извлекаем файлы программы в папку. Если мы собираемся делать загрузочную флешку Windows 7 64 бит, значит запускаем файл WinSetupFromUSB_1-3_x64.exe.

1391512468 4

1400777157 2

1400778439 3

1391512526 7

1400778645 4

откроется предупреждение, жмём Да,

1400777533 5

Здесь тоже жмём Да.

1400777573 6

Начинается процесс создания нашей загрузочной флешки, который заканчивается успешно.

1400777677 8

1391512694 12

Если вы устанавливаете Windows 7 на ноутбук или компьютер с БИОСом UEFI и вы хотите преобразовать ваш жёсткий диск в стандарт формата размещения таблиц разделов GPT, то вам нужно настроить соответственно сам БИОС UEFI, как это сделать, читайте в нашей статье Как установить Windows 7 на GPT-диск.

Если вы устанавливаете Windows 7 на ноутбук или компьютер с простым БИОС, вы просто загружаете свой девайс с только что созданной нами загрузочной флешки Windows 7. Возможно на этом этапе кому-то из пользователей пригодится наша статья Как загрузить любой компьютер или ноутбук с флешки.

Если вы правильно выставили в БИОС приоритет загрузки компьютера с флешки или просто выбрали в меню загрузки ноутбука вашу флешку,

1391513423 7

то первым окном будет меню, в нашем случае в нём ничего не нужно выбирать и оно пропадёт в течении нескольких секунд.

1391513066 1

1391513168 3

что означает установка операционных систем Windows Vista, Windows 7 и выше. Нажимаем Enter. В следующем окне выбираем Windows 7 SP 1 x64

1391513218 2

и начинается процесс установки операционной системы с нашей загрузочной флешки Windows 7.

1391513277 3

1391514423 4

Принимаем лицензионное соглашение. Полная установка (дополнительные параметры).

1391513326 5

В этом окне выбираем раздел для установки операционной системы и нажимаем далее, всё процесс установки Windows 7 начался.

1391513293 6

↑ Как создать загрузочную UEFI флешку Windows 7 программой WinSetupFromUSB

1400778107 36

Если ваша флешка отформатирована в файловую систему FAT32, то выйдет вот такое предупреждение, жмём ОК.

Источник

В двух предыдущих статьях мы сделали USB 3.0 систему на базе контроллера FX3. Пришла пора научиться работать с нею из своих программ для PC. Ну, и попутно понять, насколько получившаяся система пригодна для практического применения. Действительно ли ширины канала хватает на весь поток? И не теряются ли единичные байты из потока? Кто хоть немного поработал тестировщиком, не поверит в то, что если система в принципе работает, значит, работает и в деталях. А я на этой должности проработал лет пять, не меньше, поэтому привык проверять всё на практике. В общем, приступаем.

1 Теория о методах доступа к USB

1.1 Windows

Когда новое, доселе неизвестное системе USB-устройство впервые вставлено в ЭВМ, работающую под управлением Windows, оно отображается в диспетчере устройств с жёлтым знаком вопроса. Это связано с тем, что Windows обязательно нужен драйвер для работы с ним. Давайте я немного порассуждаю про эти драйверы, но не с научной точки зрения, а как инженер, раскрыв чисто практические аспекты, но несколько упростив теорию. Потому что мне не нужно, чтобы все уснули. Мне нужно, чтобы суть была понятна, так что ряд скучных деталей придётся опустить.

1.1.1 Драйверы, работающие на функциональном уровне

Что такое USB-устройство? Это набор конечных точек. Но прикладному программисту, если честно, эти точки не интересны. Давным-давно, ещё в прошлом тысячелетии, когда последовательные порты делались на микросхеме UART16550, под неё был сделан функциональный драйвер для Windows, и все прикладные программисты привыкли работать с абстракциями именно этого драйвера. И с этой привычкой трудно спорить. Представим на минутку, что с переходником USB-COM придётся работать в USB-шном стиле, на уровне конечных точек. Есть идеология CDC: две конечных точки туда-обратно, одна точка статуса в режиме прерываний и определённый набор команд, подаваемых через конечную точку EP0. Это всё описано в стандартах, относящихся к USB.

Всё? Нет, некоторым этого мало! Prolific сделала свой набор команд для точки EP0, не совместимый с CDC. А FTDI – свой. Он не совместим ни с CDC, ни с Prolific. Так что, если бы прикладной программист работал бы с переходниками USB-COM на уровне конечных точек, ему пришлось бы нелегко. К счастью, Prolific и FTDI предоставляют функциональные драйверы для своих чипов, а для CDC функциональный драйвер разработала сама Microsoft и прилагает его в составе Windows. Поэтому прикладной программист понятия не имеет, как работать с конкретным переходником (помню, мы целый NDA лет 15 назад с FTDI подписывали, чтобы получить от них руководство по их командам, причём я сразу же им послал информацию об ошибке в документе, так как пока работали бюрократы, я через дизассемблер всё сам уже успел изучить, так что сразу нашёл несовпадение их описания с моим). На прикладном уровне драйверы всех упомянутых производителей дают интерфейс такой же, как и при работе со старым добрым UART16550.

То же касается и USB-накопителей. Мало кто знает, что физически там две конечных точки. Почти никому не интересно, как там надо гонять пакеты, чтобы посылать команды и данные. Как разруливать ошибки, знает ещё меньше людей. Все работают через драйвер usbstor.sys, предоставляемый Microsoft, который обеспечивает работу точно так же, как и с дисками, подключёнными через локальную шину материнской платы.
Удобно? Однозначно! Но вот мы сделали своё устройство, не совместимое по логике работы ни с каким из стандартных. И что нам теперь, всенепременно писать для него персональный драйвер?

Не обязательно. Если нас устраивает работа на прикладном уровне через конечные точки, то уже имеется целый ряд готовых драйверов, которые позволяют общаться с устройством через них. Некоторые из них мы сейчас и рассмотрим.

1.1.2 CyUSB

С этим драйвером я познакомился раньше других. Было это 12 лет назад. Вот с него и начну рассказ. Правда, скажу лишь вскользь. Фирма Cypress, выпуская замечательные контроллеры FX2LP, просто обязана была сделать драйвер, работающий на уровне конечных точек, чтобы облегчить жизнь своим клиентам. И она его сделала. Кому интересно – ищите по слову CyAPI. Это DLL-ка, предоставляющая ряд функций для прикладного программиста. Я как системщик старался обойтись без DLL, поэтому сделал себе библиотеку, работающую с драйвером на уровне IOCTL запросов.

Главный недостаток данной библиотеки заключается в её лицензионном соглашении. Её можно использовать только с контроллерами Cypress. А чтобы всё было убедительнее, начиная с некоторых версий, драйвер стал просто зависать, если он работает с контроллерами других производителей. По крайней мере, старые версии с AT90USB работали, а более свежие – нет. Поэтому я решил, что не буду пользоваться данным драйвером. Даже написал свой… Но вскоре обнаружился замечательный готовый вариант от Microsoft, и я перешёл на него.

1.1.3 WinUSB

Этот драйвер уходит своими корнями в инфраструктуру UMDF. Когда фирма Microsoft работала над возможностью запускать драйверы на пользовательском уровне защиты, они сделали специальный драйвер-прослойку WinUSB. Но через этот же драйвер можно работать и из обычных прикладных программ, а не только из UMDF-драйверов. Кому интересно – вбейте в поиск WinUSB API. Через эту функциональность можно делать то же самое, что и через CyUSB, но с контроллерами любых производителей.

Сам драйвер входит в состав Windows, поэтому в Win7 его можно было вообще ставить без каких-либо проблем с подписыванием. Можно было создать по инструкции от Microsoft или найти и скачать готовый inf файл, поменять в нём VID/PID на свои и установить. К сожалению, начиная с WIN8, обязательно надо подписывать не только сам драйвер, но и INF файл. Однако никто не мешает поправить VID/PID у устройства на тот, который будет найден. Вот у меня есть вот такой подписанный inf файл.

Посмотреть inf файл

;
; Android WinUsb driver installation.
;
[Version]
Signature           = "$Windows NT$"
Class               = AndroidUsbDeviceClass
ClassGuid           = {3F966BD9-FA04-4ec5-991C-D326973B5128}
Provider            = %ProviderName%
DriverVer           = 06/06/2017,2.0.0010.00003
CatalogFile.NTx86   = MT16_x86.cat
CatalogFile.NTamd64 = MT16_x64.cat

;
; This section seems to be required for WinUsb driver installation.
; If this section is removed the installer will report an error
; "Required section not found in INF file".
;
[ClassInstall32]
Addreg = AndroidWinUsbClassReg

[AndroidWinUsbClassReg]
HKR,,,0,%ClassName%
HKR,,Icon,,"-26"

[Manufacturer]
%ProviderName% = Google, NTx86, NTamd64

[Google.NTx86]
%CompositeAdbInterface1%     = USB_Install, USBVID_1234&PID_0001
%CompositeAdbInterface2%     = USB_Install, USBVID_1234&PID_0002
%CompositeAdbInterface3%     = USB_Install, USBVID_1234&PID_0003
%CompositeAdbInterface5%     = USB_Install, USBVID_1234&PID_0005
%OldBox%     		     = USB_Install, USBVID_4844&PID_8816
%HIDkey%     		     = USB_Install, USBVID_A1A2&PID_2001

[Google.NTamd64]
%CompositeAdbInterface1%     = USB_Install, USBVID_1234&PID_0001
%CompositeAdbInterface2%     = USB_Install, USBVID_1234&PID_0002
%CompositeAdbInterface3%     = USB_Install, USBVID_1234&PID_0003
%CompositeAdbInterface5%     = USB_Install, USBVID_1234&PID_0005
%OldBox%     		     = USB_Install, USBVID_4844&PID_8816
%HIDkey%     		     = USB_Install, USBVID_A1A2&PID_2001

[USB_Install]
Include = winusb.inf
Needs   = WINUSB.NT

[USB_Install.Services]
Include     = winusb.inf
AddService  = WinUSB,0x00000002,WinUSB_ServiceInstall

[WinUSB_ServiceInstall]
DisplayName     = %WinUSB_SvcDesc%
ServiceType     = 1
StartType       = 3
ErrorControl    = 1
ServiceBinary   = %12%WinUSB.sys

[USB_Install.Wdf]
KmdfService = WINUSB, WinUSB_Install

[WinUSB_Install]
KmdfLibraryVersion  = 1.7

[USB_Install.HW]
AddReg  = Dev_AddReg

[Dev_AddReg]
HKR,,DeviceInterfaceGUIDs,0x10000,"{F72FE0D4-CBCB-407d-8814-9ED673D0DD6B}"

[USB_Install.CoInstallers]
AddReg    = CoInstallers_AddReg
CopyFiles = CoInstallers_CopyFiles

[CoInstallers_AddReg]
HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01009.dll,WdfCoInstaller","WinUSBCoInstaller2.dll"

[CoInstallers_CopyFiles]
WinUSBCoInstaller2.dll
WdfCoInstaller01009.dll

[DestinationDirs]
CoInstallers_CopyFiles=11

[SourceDisksNames]
1 = %DISK_NAME%,,,i386
2 = %DISK_NAME%,,,amd64

[SourceDisksFiles.x86]
WinUSBCoInstaller2.dll  = 1
WdfCoInstaller01009.dll = 1

[SourceDisksFiles.amd64]
WinUSBCoInstaller2.dll  = 2
WdfCoInstaller01009.dll = 2

[Strings]
ProviderName                = "GM Software"
CompositeAdbInterface1      = "MT16 Device"
CompositeAdbInterface2      = "MT16 Ports 1-5"
CompositeAdbInterface3      = "MT16 Ports 12-16"
CompositeAdbInterface5      = "TBR Flasher"
OldBox      		    = "Old MT16 Box"
HIDkey      		    = "HID Dongle via WinUSB"
WinUSB_SvcDesc              = "MT16 COM Ports"
DISK_NAME                   = "MT16 Driver Installation Directory"
ClassName                   = "MT16 USB Devices"

Раньше таких inf файлов на просторах сети было много. Андроид-телефоны через них подключались. Сейчас надо искать по слову WinUSB.sys внутри. Ну, или «ServiceBinary = %12%WinUSB.sys».

Я поправил «Прошивку» для FX3 вот так:

То же самое текстом.

const uint8_t CyFxUSB30DeviceDscr[] __attribute__ ((aligned (32))) =
{
    0x12,                           /* Descriptor size */
    CY_U3P_USB_DEVICE_DESCR,        /* Device descriptor type */
    0x00,0x03,                      /* USB 3.0 */
    0x00,                           /* Device class */
    0x00,                           /* Device sub-class */
    0x00,                           /* Device protocol */
    0x09,                           /* Maxpacket size for EP0 : 2^9 */
#ifdef CY_VID_PID
    0xB4,0x04,                      /* Vendor ID */
    0xF1,0x00,                      /* Product ID */
#else
    0x34,0x12,                      /* Vendor ID */
    0x05,0x00,                      /* Product ID */
#endif
…

И теперь могу собирать варианты хоть под CyUSB, хоть под WinUSB с привязкой к имеющемуся у меня inf файлу. А так — можно перевести ОС в режим, не требующий подписывания драйверов, хоть это и не очень удобно.

1.1.4 Библиотека libusb

Вариант с WinUSB отличный, но не кроссплатформенный. Насколько мне известно, под Linux нет точно такого же API, который предоставляет Microsoft для Windows. Кроссплатформенный вариант – это использование библиотеки libusb. Причём под Windows эта библиотека по умолчанию опирается на всё тот же драйвер WinUSB. Нашли драйвер, накатили его на устройство. Скачали библиотеку, начали через неё работать с этим драйвером. Надо будет – через неё же можно будет работать и под Linux. Замечательно? Да. Особенно если мы разработали полностью своё устройство. Но, увы, я просто обязан указать недостаток данного метода для общего случая.

Когда мы устанавливаем на устройство драйвер WinUSB, мы убираем оригинальный драйвер. В рамках данного блока статей мы теряем возможность общаться с нашим устройством при помощи утилиты ControlCenter. Ну, и я не упоминал в статьях про утилиту Streamer, позволяющую измерять скорость устройства… В общем, ею мы тоже не сможем пользоваться, если заменим штатный драйвер на WinUSB.

В рамках другой задачи мне надо было экспериментировать с аудиоустройствами из своего приложения. При этом я не хотел постигать все тонкости работы с ними. Я хотел только некоторые команды подавать, а чтобы всё остальное за меня делала сама операционка. Но если бы я посадил устройства на WinUSB, ОС бы потеряла контроль над ними и не могла бы оказывать мне всемерное содействие.

Можно ли работать из прикладной программы с устройствами, не пересаживая их на специальный драйвер? В принципе, да (правда, это очень аккуратное утверждение). Давайте я покажу этот метод… Правда, в конце — сильно раскритикую его.

1.1.5 Драйвер UsbDk

Библиотека libusb существует в двух версиях. Версия 0.1 и версия 1.0. Обе версии в настоящее время развиваются, создавая некоторую путаницу. И вот версия 1.0 может работать не только через драйвер WinUSB, но и через драйвер UsbDk. Последний является фильтр-драйвером. Что такое фильтр-драйверы? Вспоминаем детство, сказку о царе Салтане:

Собственно, фильтр-драйвер встаёт на пути IRP-пакетов от прикладной программы к основному драйверу и обратно. IRP — это гонцы, которые бегают туда-сюда. А фильтр-драйвер может их пропустить, не изменяя, а может подменить их содержимое. Он придуман для исправления ошибок, чтобы не менять основной драйвер, а просто немножко подправить пакеты, дабы те не вызывали проблем. Их можно править на прямом и на обратном пути. Но в целом, никто не мешает через этот фильтр-драйвер запустить в основной драйвер запросы от приложения, которое общается именно с фильтром. И UsbDk этим и занимается.

Очень схематично, опустив ряд неважных подробностей, это можно показать так:

Вот тут мы видим, что фильтр-драйвер UsbDK подсел на пути пакетов к нашему устройству (на самом деле, он подсел на пути ко всем USB-устройствам, так как прицепился к драйверу класса USB):

Если при открытии библиотеки libusb 1.0 сказать:

    libusb_init(&m_ctx);
    libusb_set_option(m_ctx, LIBUSB_OPTION_USE_USBDK);

то она будет использовать в качестве основы не WinUSB, а UsbDk. Ура? Не совсем. Приведу минимум две проблемы, создаваемые при использовании данного пути.

Первая проблема организационная. Если мы запустили программу, поработали, вышли, то всё будет хорошо. Но вот мы запустили программу, начали работать, а потом почему-то прервались. Да хоть у меня стояла точка останова, исполнение прервалось, я осмотрел переменные, увидел, что программа работает неверно, и завершил её. Могу я так сделать? Дело-то житейское при разработке программы. Или просто зациклилась она. В общем, мы её прервали. Снова запускаем – устройство уже не открывается. Смотрим код ошибки – он очень интересный.

Driver file operation error. DeviceIoControl failed (Cannot create a file when that file already exists.  Error code = 183)
Cannot Open USB Device

И всё. Выдёргивать-вставлять USB-кабель – бесполезно. Только полная перезагрузка Windows спасёт Отца Русской Демократии. Когда перезапускаешься третий-четвёртый раз за час – это начинает несколько раздражать. Поиск в сети не дал никаких результатов. Попытка бегло осмотреть исходники UsbDk – тоже, а на детальные разбирательства нет времени. Может, кто в комментариях чего подскажет…

Но на самом деле, эта проблема раздражает, но не является фатальной. Вторая проблема более серьёзная. Вот я поставил VirtualBox. Я просто запустил виртуальную машину и хочу подключить к ней, скажем, бластер. И что получаю?

Аналогично – любое другое устройство.

Поиск по сети даёт много вариантов типа: «У меня всё заработало после того, как я потёр заячьей лапкой по бубну из кожи тушканчика, спрыснутому кровью семидесятидвухлетней девственницы, полученной…» … Что там дальше в рецепте — сейчас уже не помню… Тем более, мне он не помог… Более осмысленные рекомендации требуют сносить фильтр-драйверы USB, пока не полегчает. Проблема уходит, когда сносишь именно UsbDK. Ну, значится, так тому и быть. Хотя для экспериментов с аудио, других приемлемых вариантов я не нашёл. Так что драйвер я снёс, но дистрибутив – оставил. Пригодится. Именно поэтому описываю эту методику. Ну, и вдруг кто в комментариях подскажет, как обходить эти две проблемы. Тогда станет совсем здорово.

1.1.6 Итого

Итого, сегодня мы будем работать через библиотеку libusb, посадив устройство на драйвер WinUSB. Да, мы потеряем возможность работать с устройством через стандартные приложения от Cypress. Зато всё будет стабильно и хорошо.

1.2 Linux

1.2.1 Драйвер

Я уже много раз писал, что не очень сильно разбираюсь в уходе за пингвинами, поэтому просто перескажу слова своего начальника, опрошенного специально для написания данной статьи.

Некоторые устройства уже поддержаны в Линуксе по классу, либо по VID/PID. Вот, скажем, я подключил макетную плату ICE40 с ПЛИС Latice и подал сначала команду lsusb, чтобы увидеть USB устройства, а затем – уже полюбившуюся нам по прошлым статьям команду:
ls –l /dev/serial/by-path, чтобы увидеть, что мост фирмы FTDI сам прикинулся двумя последовательными портами.

С такими устройствами, если ничего не предпринимать, можно работать только на функциональном уровне. Однако, если функциональный драйвер не подключился, как уверяет начальник, в отличие от Windows такие устройства не станут неизвестными (а потому недоступными). Напротив, с ними можно сразу и без какой-либо подготовки работать через библиотеку libusb. А разработанное нами устройство относится к таковым. Поэтому никакой подготовки для начала работы не требуется. Надеюсь, начальник меня не обманул.

Правда, есть чисто организационная подготовка, которую мы вынесем в собственный раздел.

1.2.2 Отключение требований прав администратора при работе с USB-устройствами

Главная особенность USB-устройств в Linux состоит в том, что по умолчанию для доступа к ним надо обладать правами администратора. То есть, для сборки «прошивки» для ПЛИС ICE40 (к теме статьи они не относятся, но по проекту я сейчас их осваиваю, причём под Linux, так что скриншоты готовить проще для них) мне достаточно набрать make, а вот если для «прошивки» я наберу make prog, то получу такое сообщение:

Не хватает прав. Надо набирать sudo make prog.

Чтобы понизить требуемые права, надо прописать правила. А чтобы быстро выяснить, как их прописать, я обычно даю такой запрос Гуглю:

Usb blaster Linux

Ссылок будет много, все они разной степени шаманства. Вот более-менее подробная ссылка:
Using USB Blaster / USB Blaster II under Linux | Documentation | RocketBoards.org

Что сразу бросается в глаза: имена файлов с правилами для Debian и для Ubuntu разные.
/etc/udev/rules.d/92-usbblaster.rules и /etc/udev/rules.d/51-usbblaster.rules, соответственно.

Всё тот же начальник, а по совместительству – любитель Линукса, объяснил, что если в нескольких файлах есть правила для одного и того же устройства, число задаёт приоритет разбора файлов. Собственно, документ также говорит, что число 92 базируется на том, что в системе имеется файл /lib/udev/rules.d/91-permissions.rules.

Вообще, мне стало интересно, и я вбил в Гугля строку поиска
/etc/udev/rules.d/

Он нашёл мне много статей про udev. Некоторые более теоретические. Некоторые слишком практические. Пересказывать их не вижу смысла. При желании вы можете погуглить сами. Дам только ссылку на статью, которая мне кажется хорошо сбалансированной по теории и практике:
Igorka: Знакомство с udev в ubuntu

Итак. Иду в каталог /etc/udev/rules.d. Вижу файл 70-snap.snapd.rules, в котором есть правило, относящееся ко всем FTDI чипам:

FTDI-based serial adapters:

#   FTDI does USB to serial converter ICs; and it's very likely that they'll
#   never do modems themselves, so it should be safe to add a rule only based
#   on the vendor Id.
ATTRS{idVendor}=="0403", ENV{ID_MM_DEVICE_MANUAL_SCAN_ONLY}="1"

Не понимая до конца, что творю, запускаю не просто mc, а sudo mc и в его редакторе создаю файл /etc/udev/rules.d /71-ice40.rules со следующим содержимым:

#FTDI Programmer for latice
SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="0666"

Закрываю терминал с админскими правами, открываю новый, с правами обычными. Отключаю-включаю устройство, и… Вуаля! Оно уже доступно без прав администратора!

Поэтому можете просто повторить мои шаманства, можете – почитать теорию по ссылкам, после чего у вас всё получится уже с пониманием физики процесса. А так – в рамках данной статьи я буду работать только через Windows, но через кроссплатформенную библиотеку libusb версии 1.0 (не путать с 0.1). Поэтому в Линуксе прописывать правила для устройства FX3 не буду.

2 Практика

Ох, и огромный сегодня получился теоретический раздел! Но наконец, мы владеем достаточным количеством знаний, чтобы приступить к опытам. Напомню, я буду работать в ОС Windows, пользуясь библиотекой libusb 1.0, опираясь на драйвер WinUSB. Я сейчас осваиваю работу с кроссплатформенной библиотекой Qt, поэтому буду разрабатывать код под неё.

2.1 Добавляем libusb в проект

Я скачал библиотеку libusb и распаковал её в каталог своего проекта. Чтобы подключить её к проекту, в файл *.pro пришлось добавить блок:

win32:{
LIBS +=  D:/Work/AS/2020/teensy/Qt/UsbSpeedTest/LibUSB/MinGW64/static/libusb-1.0.a
}

Кто сказал, что абсолютные пути – зло? Золотые слова! Я тоже так считаю. Но я уйму времени убил на эксперименты с относительными путями в этом месте. Ничего не получалось. Поэтому пока сделал так. Если кто-то знает тайну, как в проект добавляются относительные пути, да ещё так, чтобы работали, буду премного благодарен за разъяснения. А пока – отмечаю, что такой вариант работает, но однозначно является злом, так как он работает только у меня и только, пока я не соберусь перенести проект куда-то. Собственно, всё. Библиотека добавлена и готова к работе.

2.2 Класс для доступа к библиотеке

Обычно примеры для статей я пишу в слитном стиле. Но сегодняшний код получился несколько запутанным, поэтому пришлось вынести работу с платой FX3 в примитивный класс. Вот его интерфейсная часть:

#ifndef CUSBTESTER_H
#define CUSBTESTER_H
#include "./LibUSB/libusb.h"


class CUsbTester
{
public:
    CUsbTester();
    ~CUsbTester();
    virtual bool ConnectToDevice();
    virtual void DisconnectFromDevice();
    libusb_device_handle* m_hUsb;
protected:
    libusb_context * m_ctx = NULL;
};

#endif // CUSBTESTER_H

По функциям мы ещё пройдёмся, а пока я отмечу то, что у класса есть переменная-член, хранящая указатель на контекст, который будет нужен для вызова некоторых функций тонкой настройки библиотеки, и манипулятор (в простонародии — хэндл) устройства, необходимый для обращения к устройству.

В конструкторе происходит инициализация и тонкая настройка библиотеки:

//#define CY_VID_PID

CUsbTester::CUsbTester()
{
    libusb_init(&m_ctx);
#ifdef CY_VID_PID
    libusb_set_option(m_ctx, LIBUSB_OPTION_USE_USBDK);
#endif
    libusb_set_option(m_ctx, LIBUSB_OPTION_LOG_LEVEL, LIBUSB_LOG_LEVEL_DEBUG);
    m_hUsb = 0;
}

Как видим, возможна работа библиотеки через драйвер CyUSB и фильтр UsbDk, но сейчас она отключена. И мы включаем расширенную диагностику работы библиотеки. Все сообщения о проблемах будут сыпаться в окно отладочного вывода. Помните, я показывал сообщение об ошибке при работе UsbDk? Без этой опции никто бы ничего не узнал. Ошибка и ошибка.

Деструктор, соответственно, всё деинициализирует. Класс тестовый, заботиться о наличии дополнительных пользователей библиотекой нет смысла. Так что просто деинициализируем и всё.

CUsbTester::~CUsbTester()
{
    DisconnectFromDevice();
    libusb_exit(m_ctx);
}

Подключение к устройству интересно лишь тем, что может работать по разным парам VID/PID. Как я уже говорил, я могу собирать «прошивку» под штатные VID/PID от Cypress, если идёт работа через UsbDk, и под те, на которые у меня нашёлся inf-файл, устанавливающий драйвер WinUSB. В остальном, ничем не примечательные типовые вызовы функции библиотеки libusb:

bool CUsbTester::ConnectToDevice()
{
#ifdef CY_VID_PID
    m_hUsb = libusb_open_device_with_vid_pid(m_ctx,0x4b4,0xf1);
#else
    m_hUsb = libusb_open_device_with_vid_pid(m_ctx,0x1234,0x0005);
#endif
    if (m_hUsb == 0)
    {
        qDebug()<<"Cannot Open USB Device";
        return false;
    }
    int res = libusb_claim_interface(m_hUsb,0);
    if (res != 0)
    {
        qDebug()<<"Cannot claim interface - "<<libusb_error_name(res);
    }
    return true;
}

Ну, и отключаемся от устройства тоже типовым методом:

void CUsbTester::DisconnectFromDevice()
{
    if (m_hUsb != 0)
    {
        libusb_release_interface(m_hUsb,0);
        libusb_close(m_hUsb);
        m_hUsb = 0;
    }
}

Собственно, всё. Функцию чтения из устройства я буду вызывать напрямую. Это противоречит принципам проектирования классов, но для опытов сойдёт. Я просто заметил, что код инициализации сильно разросся и отделил его от основного кода, вынеся в класс. А чтение — оно в одну строку выполняется, его отделять было не нужно.

2.3 Тестовая программа

Программа состоит из функции main() и тестовой функции.

Тестовая функция делится на две части. Первая часть измеряет скорость передачи данных. Вторая — проверяет то, что данные из счётчика приходят с инкрементом. При обнаружении разрыва – сведения об этом выдаются в консоль отладочного вывода. Собственно, вот текст функции:

bool TestStep(CUsbTester& tester,uint16_t* pData, const int bytesCnt)
{
    bool bResult = true;
    qDebug() << "Testing...";

    QElapsedTimer timer;
    timer.start();

    int actualLength;
    int res = libusb_bulk_transfer(tester.m_hUsb,0x81,(uint8_t*)pData,bytesCnt,&actualLength,10000);
    if (res != 0)
    {
        qDebug() << libusb_error_name(res);
        return false;
    }

    quint64 after = timer.elapsed();

    qDebug() << "Read Result = " << res;
    qDebug() << "Actual Length = " << actualLength;
    qDebug() << "Time = " << after;

    double speed = bytesCnt/after;
    qDebug() << speed << "Bytes / Sec";

    uint16_t prevData = pData[0];
    for (int i=1;i<bytesCnt/2;i++)
    {
        if (pData[i] != ((prevData + 1)&0xffff))
        {
            qDebug() << Qt::hex << i << " : " << prevData << ", " << pData[i];
        }
        prevData = pData[i];
    }
    return bResult;
}

В будущем я планирую вызывать эту функцию многократно, но пока — функция main() вызывает её один раз:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    CUsbTester tester;
    if (tester.ConnectToDevice())
    {

        QByteArray ar1;
        ar1.resize(128*1024*1024);

        for (int i=0;i<1;i++)
        {
            TestStep (tester,(uint16_t*)ar1.constData(),ar1.size());
        }
        tester.DisconnectFromDevice();
    }


    return a.exec();
}

Собственно, и вся программа.

2.4 Результат тестового прогона

2.4.1 Скорость

При тестовом прогоне мы видим, что скорость близка к требуемой. Напомню, что источник гонит 16-битные данные на скорости 60 МГц, так что нам требуется поток 120 миллионов байт в секунду. Когда на временных диаграммах наблюдался огромный дефицит колбасы, скорость была всего 30 Мегабайт в секунду. Даже меньше, чем практически достижимая скорость на шине USB 2.0. Так что текущие результаты вполне приемлемые.

Правда, чтобы окончательно успокоиться, я решил немного поэкспериментировать со скоростью. Чаще всего она была равна 119 0XX XXX байт в секунду. Изредка – 119 4XX XXX. Ну, и совсем редко – промежуточные значения, похожие на указанные выше. Сначала я решил, что это могут быть ошибки округления. У нас идёт округление показаний таймера, и возникают округления при делении. Тогда я переписал вычисление скорости так (перешёл на наносекунды и стал умножать перед делением, чтобы минимизировать ошибку округления):

    QElapsedTimer timer;
    int actualLength;

    timer.start();
    int res = libusb_bulk_transfer(tester.m_hUsb,0x81,(uint8_t*)pData,bytesCnt,&actualLength,10000);
    quint64 after = timer.nsecsElapsed();

    if (res != 0)
    {
        qDebug() << libusb_error_name(res);
        return false;
    }

    qDebug() << "Read Result = " << res;
    qDebug() << "Actual Length = " << actualLength;
    qDebug() << "Time = " << after;

    quint64 size = bytesCnt;
    size *= 1000000000;
    quint64 speed = size/after;
    qDebug() << speed << "Bytes / Sec";

Результат ничуть не изменился. Следующее подозрение было, что источник имеет некоторую ошибку кварцевого резонатора и шлёт данные чуть медленнее, чем надо. Но другая плата даёт точно такие же показания! Значит, дело не в экземпляре. Мало того, осциллограф (правда, весьма дешёвый китайский) говорит, что тактовая частота нисколько не занижена, даже чуть завышена.

Тогда я полез в исходники библиотеки libusb и просто-таки утонул в коде, который исполняется при ожидании конца передачи данных. Там такая цепочка функций – просто закачаешься! И много, где может возникать задержка. Но давайте прикинем, какова задержка.

120 мегабайт в секунду… Округлим до ста. Это 1 мегабайт в 10 миллисекунд. А у нас просадка как раз на 1 мегабайт. Неужели начало и конец прокачки съедают так много времени? Как бы проверить хотя бы начерно? Я решил переписать на пробу код под прямой вызов WinUSB API. Полностью объяснять я его не стану, там устройство открывается хитро, через SetupDi API. Я просто воспользовался готовыми своими старыми классами, поэтому всё было сделано под Visual Studio. Но вместо страшных километровых текстов ожидания завершения библиотеки WinUSB, моя функция чтения выглядит вполне канонически:

int CWinUSBConnector::ReadViaBulk (void* pData,int count,int timeOut)
{
	DWORD dwRead;

	ResetEvent (m_hEvRead);
	if ((!WinUsb_ReadPipe (m_hUsbDrive,m_nReadEP,(BYTE*)pData,count,&dwRead,&m_ovRead)) && (GetLastError() != ERROR_IO_PENDING))
	{
		return -1;
	}
	if (WaitForSingleObject(m_hEvRead,timeOut)!=WAIT_OBJECT_0)
	{
		WinUsb_AbortPipe (m_hUsbDrive,m_nReadEP);
		return -2;
	} else
	{
		WinUsb_GetOverlappedResult (m_hUsbDrive,&m_ovRead,&dwRead,FALSE);
	}
	return dwRead;
}

А тест теперь выглядит так:

#include <iostream>
#include <windows.h>

#include "./USB/WinUSBConnector.h"

CWinUSBConnector m_connector;


int main()
{
    std::cout << "Hello World!n";
	if (m_connector.Open() != 0)
	{
		std::cerr << "Cannot Open Driven";
		return 1;
	}

	LARGE_INTEGER Frequency;
	QueryPerformanceFrequency(&Frequency);

	static const UINT64 cnt = 128 * 1024 * 1024;
	BYTE* pData = new BYTE [cnt];

	LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds;

	QueryPerformanceCounter(&StartingTime);
	UINT64 realSize = m_connector.ReadViaBulk(pData, (int)cnt, 10000);
	QueryPerformanceCounter(&EndingTime);
	if (realSize != cnt)
	{
		std::cerr << "Cannot Read Datan";
		return 2;
	}
	ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;
	ElapsedMicroseconds.QuadPart *= 1000000;
	ElapsedMicroseconds.QuadPart /= Frequency.QuadPart;

	UINT64 bytesPerSeconds = (cnt*1000000LL) / ElapsedMicroseconds.QuadPart;

	std::cout << "Test Finished! " << bytesPerSeconds << " Bytes  per second n";

	delete[] pData;
	return 0;
}

Теперь скорость стабильно находится в районе 119 2XX XXX байт в секунду. Вот какой красивый результат я подловил для красного словца:

А вот результат нескольких прогонов подряд:

В общем, никто не запрещает просадке возникать и на входе-выходе в функцию чтения. Если разрывов в показаниях счётчика не будет, то и ладно.

2.4.2 Пропуски в показаниях счётчика

Но на тему разрывов у нас тоже имеется пара строк в выводе основной тестовой программы:

Имеется два нарушения последовательности счёта. Неужели мы нарвались на выпадение данных? К счастью, всё в порядке. Множественные прогоны говорят, что проблемы всегда в одном и том же месте. И мы с таким уже сталкивались в одной из старых статей. У нас есть две точки буферизации данных: буфер контроллера и FIFO в ПЛИС. Готовы ли мы принимать данные или нет, они с выхода счётчика будут заливаться в буфер FX3. Когда тот переполнится, заливка остановится. Кроме буфера FX3, есть ещё FIFO в ПЛИС. Вот у нас и имеется две ёмкости, которые заполнились, но счётчик продолжил работу. При чтении мы увидели разрывы в счёте.

Соответственно, мы наблюдаем явление переходных процессов. При реальной работе надо будет настроить источник так, чтобы он не заполнял буфер данными, пока мы не готовы их принимать (собственно, в статье про голову USB-Анализатора мы уже делали такую функцию через добавление бита «Go»), а пока – просто будем игнорировать ошибки в этой области. Считаем, что это – не баги, а фичи. Меняем проверку разрывов на такую:

То же самое текстом.

    int from = 0xc001;
    uint16_t prevData = pData[from];
    for (int i=from+1;i<bytesCnt/2;i++)
    {
        if (pData[i] != ((prevData + 1)&0xffff))
        {
            qDebug() << Qt::hex << i << " : " << prevData << ", " << pData[i];
        }
        prevData = pData[i];
    }

Делаем массовый прогон для такого варианта… И тут я понял, кто даёт задержку… Отладочный вывод!!! Вот так всё выглядит:

Масса вспомогательных текстов, выдаваемых библиотекой. Ну и отлично. Закомментируем в конструкторе класса, обслуживающего libusb, строку:

// libusb_set_option(m_ctx, LIBUSB_OPTION_LOG_LEVEL, LIBUSB_LOG_LEVEL_DEBUG);

Получаем красоту, ничем не отличимую от того, что мы получали при прямом вызове WinUSB API (жаль только, что не идеальный результат):

Но главное – нет сообщений про разрывы в показаниях счётчика (известные точки разрывов мы игнорируем).

А что там нам про таймауты промежуточные говорили? Попробуем читать не 128, а 32 мегабайта! Получаем уже скорость вплоть до 119 8XX XXX мегабайт в секунду!

В общем, всё хорошо… Кроме одного. Я нашёл такой нестандартный вариант теста, при котором штатная «прошивка» FX3 подвисает. Но статья получилась такой большой, что как это найти, а главное – как исправить, я расскажу в следующий раз.

3 Заключение

Мы познакомились с теоретическими особенностями работы с USB устройствами в ОС Windows и Linux, а также получили практический навык работы с кроссплатформенной библиотекой libusb. Начерно, разработанное USB 3.0 устройство на базе контроллера FX обеспечивает требуемый поток данных для приёма данных из микросхемы ULPI без промежуточного их сохранения в SDRAM. В потоке не выявлено разрывов, то есть, протокол передачи с виду устойчивый. Автор утверждает, что выявил принципиальную проблему в системе, но выносит её обсуждение в следующую статью.

Hi

I’m unable to install USBDK any way possible on WIN7 64bit. When I first proceeded to install from GIMX 4.2 installer , it failed that way that installer waited endlessly . I had to kill process each time. After this I had to force shut down of windows with power button. In mean time any USB device stopped working at all, even mouse. OK , I restored image with Clonezilla that luckily I made 3 days ago :) and tried again and again. After several tries and restores I tried to install USBDK 1.02, not 1.04, it installed fine, I mean it showed up in installed program list , but also any USB device stopped working at all. Also refreshing devices in Device manager hung it’s process, and again, kill, power button, Clonezilla. I tried first to remove libusbk, with Zadig, nothing changed. Removing USBDK also is not possible now. I have to restore from image again. I’ll try to disconnect laptop from docking station and disconnect anything but mouse. It looks hopeless. Any suggestions? Only thing connected is external drive on esata that takes power from USB with USB mini connector.

Ok, after unplugging everything from computer, installing new Gimx and trying few times , finally it get to work. I don’t know what really helped, for sure at least partially helped disconnecting from docking station which had attached esata drive powered form mini USB. These USBDK drivers is a huge interference to the system. At the end Gimx started to work when I updated libusbk dll to the latest version.

Comments

@JusticePug

ybendito

added a commit
to ybendito/UsbDk
that referenced
this issue

Jan 2, 2020

@ybendito

daynix#81
If during redirection the redirection object is deleted
we may try accessing the deleted object in the loop of
attempts to create the redirection handle.
To avoid this we reference the redirection object until
the redirection request completely satisfied or failed.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>

ybendito

added a commit
to ybendito/UsbDk
that referenced
this issue

Jan 2, 2020

@ybendito

daynix#81
OnClose -> RemoveRedirect -> NotifyRedirectorRemovalStarted
NotifyRedirectorRemovalStarted passes process id to ModifyOne
in order to avoid stopping redirection if another not related
process just opens the filter device and then closes it.
Example (before this commit):
Start VM and use remote-viewer to it.
Separate application 'App' registers notification on USB
device interface arrival. When new device comes, the application
opens a file using symbolic link name and closes it.
Redirect USB device to VM.
The UsbDk forces device to be reenumerated.
Open-close operation from the 'App' unexpectedly discards
device redirection.
After this commit: because the 'App' process is not an owner
of the redirection, OnClose will not cause removal of the
redirection.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>

YanVugenfirer

pushed a commit
that referenced
this issue

Jan 2, 2020

@ybendito

@YanVugenfirer

#81
If during redirection the redirection object is deleted
we may try accessing the deleted object in the loop of
attempts to create the redirection handle.
To avoid this we reference the redirection object until
the redirection request completely satisfied or failed.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>

YanVugenfirer

pushed a commit
that referenced
this issue

Jan 2, 2020

@ybendito

@YanVugenfirer

#81
OnClose -> RemoveRedirect -> NotifyRedirectorRemovalStarted
NotifyRedirectorRemovalStarted passes process id to ModifyOne
in order to avoid stopping redirection if another not related
process just opens the filter device and then closes it.
Example (before this commit):
Start VM and use remote-viewer to it.
Separate application 'App' registers notification on USB
device interface arrival. When new device comes, the application
opens a file using symbolic link name and closes it.
Redirect USB device to VM.
The UsbDk forces device to be reenumerated.
Open-close operation from the 'App' unexpectedly discards
device redirection.
After this commit: because the 'App' process is not an owner
of the redirection, OnClose will not cause removal of the
redirection.

Signed-off-by: Yuri Benditovich <yuri.benditovich@daynix.com>

0 / 0 / 0

Регистрация: 11.01.2017

Сообщений: 24

1

04.02.2017, 18:50. Показов 25784. Ответов 26


Студворк — интернет-сервис помощи студентам

Ноутбук Lenovo IdeaPad 510-15 (80SV00DLPB) пришел без ОС. Хочу поставить вин 7 с флешки. Сделал все через winsetupfromUSB. На самом ноуте fn+f12 и выбрал флешку, далее все как всегда. Загрузка пошла до цветной заставки windows и тут система перестает видеть флешку, выдавая данную ошибку. Перепробовал разные образ, разные флешки, но результат тот же самый. Порт на ноуте 2.0, в биосе ничего не трога, и так вроде все включено. В чем может быть проблема?



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

04.02.2017, 18:50

26

1146 / 954 / 76

Регистрация: 11.10.2010

Сообщений: 6,031

04.02.2017, 19:00

2

причин может быть несколько, чтобы не гадать на кофе, запилите MSDN-образ на болванку.



0



0 / 0 / 0

Регистрация: 11.01.2017

Сообщений: 24

04.02.2017, 19:09

 [ТС]

3

sacredheart, из всех ноутов и пк что есть нету рабочих дисководов, да и дисков тоже нету, даже знакомых нету с рабочими dvd приводами…



0



Эксперт HardwareЭксперт WindowsАвтор FAQ

8486 / 3000 / 503

Регистрация: 14.04.2011

Сообщений: 7,454

04.02.2017, 19:20

4

Драйвера под 7-ку на оф.сайте есть? Возможно ноут «заточен» под 10-ку. Как вариант попробовать установить Win 8.1/10.



0



0 / 0 / 0

Регистрация: 11.01.2017

Сообщений: 24

04.02.2017, 19:25

 [ТС]

5

Андрей1224, блин, в магазине говорили что вин 7 установится без проблем и драйвера есть. Сегодня смотрел, вроде устанавливается семерка, но не на все устройства дрова есть. Просто так не хочется эти галимые 8.1/10 ставить.



0



Эксперт HardwareЭксперт WindowsАвтор FAQ

8486 / 3000 / 503

Регистрация: 14.04.2011

Сообщений: 7,454

04.02.2017, 19:31

6

fedes,
Как вариант, попробовать какой-нибудь способ установки системы прямо с жесткого диска (без использования установочной флешки) или поробовать развернуть бэкап 7-ки установленой на другом ПК, например с помощью Acronis True Image или подобных программ.



1



0 / 0 / 0

Регистрация: 11.01.2017

Сообщений: 24

04.02.2017, 19:33

 [ТС]

7

Андрей1224, интересно, сейчас попробую



0



1146 / 954 / 76

Регистрация: 11.10.2010

Сообщений: 6,031

04.02.2017, 19:48

8

диск из ноута вынуть, вставить в комп и накатить голую ОС, только смотрите чтобы AHCI было в биосе.



1



0 / 0 / 0

Регистрация: 11.01.2017

Сообщений: 24

04.02.2017, 20:24

 [ТС]

9

Андрей1224, sacredheart, блин, как на зло установка w10 запускается без проблем(… пока что



0



Эксперт HardwareЭксперт Windows

21297 / 12107 / 653

Регистрация: 11.04.2010

Сообщений: 53,466

04.02.2017, 20:31

10

Цитата
Сообщение от sacredheart
Посмотреть сообщение

и накатить голую ОС,

и получить потом 7b, впрочем, вполне излечимо…
оптимальный вариант — начать установку на другом железе, после первого ребута воткнуть хард в ноут



1



sacredheart

04.02.2017, 20:52

Не по теме:

Цитата
Сообщение от qvad
Посмотреть сообщение

и получить потом 7b

сначало надо комп перекрестить:)



0



qvad

04.02.2017, 20:53

Не по теме:

угу, и святой водичкой окропить :jokingly:



0



0 / 0 / 0

Регистрация: 11.01.2017

Сообщений: 24

04.02.2017, 21:05

 [ТС]

13

Спасибо ребята, вин 10 установилась. Противно выглядит, но хоть работает. Посмотрим если ОС не устроит брата, то будем искать варианты с W7.



0



Эксперт HardwareЭксперт WindowsАвтор FAQ

8486 / 3000 / 503

Регистрация: 14.04.2011

Сообщений: 7,454

05.02.2017, 09:25

14

Если 10-ка установлена, то можно из её попробовать установить 7-ку (на другой раздел). Подключить установочный .iso образ в виртуальный привод и запустить setup.exe, начнётся обычная установка 7-ки. Посмотреть, что получится с установкой, если 7-ка установится, то поюзать её (установить драйвера и т.д.). Если 7-ка будет правильно работать, то потом можно подумать об установке её основной (единственной) системой.

При установке через setup.exe «правила» такие:
Из 32-х битной ОС можно запустить установку только 32-х битной системы.
Из 64-х битной ОС можно запустить установку любой системы.

Можно ещё использовать такой вариант установки 7-ки Установка Win 7 второй системой к Win 8/8.1 в режиме UEFI на GPT диск. Ограничений на рарядность в этом случае нет.



1



0 / 0 / 0

Регистрация: 11.01.2017

Сообщений: 24

05.02.2017, 15:31

 [ТС]

15

Андрей1224, о, можно попробовать пока терять нечего

Добавлено через 2 часа 44 минуты
Андрей1224, Установил w7, но, wifi не работает, lan кабеля не видит, флешки не читает. Дрова туда никак не запихнуть), даже если их найду…



0



Эксперт HardwareЭксперт WindowsАвтор FAQ

8486 / 3000 / 503

Регистрация: 14.04.2011

Сообщений: 7,454

05.02.2017, 15:41

16

fedes,
Вероятно «ноги отсюда растут» ->

Цитата
Сообщение от Андрей1224
Посмотреть сообщение

Возможно ноут «заточен» под 10-ку.

Это только то, что «на поверхности». Даже если найдёте драйвера, то вполне вероятны (возможны) проблемы со включением; выключением; со спящим режимом или выходом из спящего режима; с работой системы охлаждения и др.



0



0 / 0 / 0

Регистрация: 11.01.2017

Сообщений: 24

05.02.2017, 16:39

 [ТС]

17

Андрей1224, да, производитель не оставляет выбора. В принципе это ожидалось, были варианты с асусом, но там такой же геморой с семеркой. Там еще с семеркой еще и тачпады не работали)

Добавлено через 40 минут
блин, постоянно появляется окошко set user settings to driver failed



0



0 / 0 / 0

Регистрация: 11.01.2017

Сообщений: 24

18.02.2017, 20:15

 [ТС]

18

Поменял ноутбук, взял еще дороже, который поддерживает windows 7, но такая же беда с флешкой, ноут перестает ее видеть)

Добавлено через 20 секунд
тут уже дисковода нету

Добавлено через 1 час 45 минут
установил windows 7 с под десятки. Но опять же блин он флешек не видит, внешний жд также, интернет не подключить.



0



Эксперт HardwareЭксперт Windows

21297 / 12107 / 653

Регистрация: 11.04.2010

Сообщений: 53,466

18.02.2017, 20:17

19

прямо как в байке, про ежиков и кактус…
драйвер установить на usb3 не судьба?



0



0 / 0 / 0

Регистрация: 11.01.2017

Сообщений: 24

18.02.2017, 20:38

 [ТС]

20

qvad, ну и раскажи пожалуйста как же его установить?

Добавлено через 2 минуты
хотя бы на 2.0



0



Понравилась статья? Поделить с друзьями:
  • Usb002 ошибка принтера canon
  • Usb001 ошибка принтера canon
  • Usb устройство ввода ошибка драйвера windows 10
  • Usb устройство mtp код ошибки 10
  • Usb модем ошибка подключения к сети