"Без водителя" Утверждение концепции загрузчика

Деван
Ср. 13 июля 2016 г. 1:11
Это дополнение к дискуссии о загрузчике Maple:
ViewTopic.PHP?f = 20&T = 1234#P15835

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

Насколько я понимаю, Leaflabs имели два препятствия для реализации загрузчика с помощью композитного устройства DFU + CDC-ACM составного времени:
  1. Композитные USB -устройства использовали разные пользовательские дескрипторы в Windows, Mac OSX и Linux
  2. В Windows функции DFU и CDC-ACM не имели нативного драйвера Windows. Даже там, где были существующие драйверы ядра, они должны были быть связаны с USB -устройством на отдельном этапе установки.
Точка 1 больше не проблема, так как я думаю, что все три основных Оса принимают дескрипторы стандартизированной интерфейсной ассоциации.

Точка 2 остается, но не так плохо в Windows 10 (и, возможно, Windows 8, я не пробовал). В Windows 10 он загрузит драйвер CDC-ACM по умолчанию, если ваш класс интерфейса класса/подкласс/протоколы совпадают, даже если он встроен в композитное устройство с другими функциями, которые он не понимает, как DFU.

Для DFU конечная цель состоит в том, чтобы связать интерфейс с Winusb или Libusb, как делает установщик Zadig, чтобы DFU-UTIL мог получить к нему доступ. Это можно сделать с помощью индивидуальных дескрипторов ОС Microsoft и дескриптора совместимого идентификатора.

В качестве доказательства концепции я создал доказательство концепции USB-сериал для BluePill:
  • При загрузке загрузчик DFU проверяет, пуста ли вспышка или установлен флаг магии (в регистре резервного копирования RTC, который выживает сброс)
  • В остальное время основное приложение запускает композитное устройство DFU + CDC-ACM на PA2/PA3
  • Когда интерфейс DFU времени выполнения получает запрос на отдел, он записывает в резервную копию RTC и сбрасывается так, чтобы основной загрузчик запускался.
Я подтвердил, что могу загрузить прошивку с помощью DFU-UTIL в виртуальной машине Windows 10 (с ручным вмешательством для подключения устройства после переключения на загрузчик и обратно), и эта петля с перемычкой работает от Potty.

Форуму, похоже, не нравится .Вложения корзины (наверное, риск вируса), поэтому вот ссылка Dropbox на комбинированную прошивку Bootloader + USB-сериал, которую можно вспыхнуть непосредственно без смещения (то есть адрес 0x08000000).

https: // dl.DropboxUserContent.com/u/193 ... погрузчик.бин

Если вы хотите проверить, что DFU-UTIL работает, у меня есть альтернативное изображение только для приложения с немного другой строкой продукта («Termlink103-2» вместо «Termlink103»):
https: // dl.DropboxUserContent.com/u/193 ... ссылка-2.бин

Источник еще не задокументирован, но он находится на GitHub под филиалом Winusb:
https: // github.com/devanlai/termlink/tree/winusb

Как упомянул Роджер в исходном потоке, все равно было бы немного работы, чтобы интегрировать время выполнения DFU в собственное ядро ​​Libmaple - мой код использует USB -стек LiboPencm3 - но, по крайней мере, на стороне Windows, по крайней мере, вещи не кажется, что не кажется вещами не вещей не очень жаль.

Что касается старых версий Windows - ну, загрузчик Leaflabs, кажется, все равно работает для большинства людей ;) .

Rogerclark
Ср. 13 июля 2016 г., 7:39
@devan

Спасибо

Это очень интересно. Мне нужно будет пробить его на одну из моих досок

Что вы используете USB VID / PID Addreses, чтобы вам не нужно устанавливать драйверы в Windows?

Кроме того, вместо того, чтобы использовать DFU для загрузки, вы можете использовать либо USB -массовое хранилище, либо просто использовать последовательный USB (и использовать другой протокол)
Первоначально Leaflabs начал писать загрузчик, который принял последовательные загрузки в том же формате, что и программа Flash STM.

https: // github.com/leaflabs/maple-bootl ... Эриал-Бут

Я кратко посмотрел на это, но я не знаю, компилируется ли он или работает вообще

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

Я также свяжусь с @jcw, чтобы узнать, как он занялся своим загрузчиком

Rogerclark
Ср. 13 июля 2016 г., 7:47 утра
Редактировать.

Я отправил по электронной почте @jcw, но я не знаю, обидел ли я его каким -то образом, потому что он не был на форуме целую вечность.

Но я надеюсь, что он ответит, даже если я как -то непреднамеренно обидел его

Rogerclark
Ср. 13 июля 2016 г. 10:34
@devan

Я получил ответ от @jcw, он в порядке.

Его код загрузчика здесь https: // github.com/jeelabs/emello/ree ... S/USBSerup

Ваше здоровье

Роджер

РЕДАКТИРОВАТЬ.

Исправлена ​​ссылка

Rogerclark
Ср. 13 июля 2016 г. 11:38
@devan

Каким аппаратным обеспечением работает загрузчик? Это просто Maple Mini, я.e Что он использует для сброса USB ?

Я только что попробовал это на общей плате F103TB, но это вообще не появляется на USB. Я думаю, мне нужно выкопать Maple Mini, который я не использую, и мигает с этим кодом.

Пса. Если вы хотите прикрепить файл к форуму, вы можете просто застегнуть их, так как он принимает Zips. Я мог бы изменить BBS, чтобы принять бин, но это может быть проблемой безопасности для некоторых пользователей, поэтому, вероятно, лучше просто использовать Zip

Редактировать.

Что -то не так с моей доской F103TB.

Завтра попробую еще одну доску

Мадиас
Ср. 13 июля 2016 г. 11:39
...дает 404 - опечатка?
---_> https: // github.com/jeelabs/emello/tree/Master/Tools/

Rogerclark
Ср. 13 июля 2016 г., 11:46
Привет, Матиас ;-)

Это странно

Я вставил это, возможно, я случайно удалил последнего персонажа

Попробуйте эту ссылку

https: // github.com/jeelabs/emello/ree ... S/USBSerup

Деван
Ср. 13 июля 2016 г. 16:50
Я тестировал с общими синими таблетками (без выделенных схем отключения USB).
Что вы используете USB VID / PID Addreses, чтобы вам не нужно устанавливать драйверы в Windows? Он не использует какую -либо специальную пару VID/PID - на самом деле, сейчас он просто использует VID/PID, который предназначен для тестирования.
На более новых версиях Windows он рассматривает класс и подклассы в дескрипторах интерфейса USB, чтобы определить, имеет ли у него общий драйвер класса для стандартного класса USB. Таким образом, устройство USB-серии CDC-ACM должно автоматически использовать серийный драйвер USB, как на Mac OSX/Linux.

Для классов устройств, которые не являются стандартизированными, или что Microsoft не разработала драйвер класса (я.эн. DFU), Microsoft запрашивает специальный «Дескриптор совместимого идентификатора» при первом подключении устройства, которое можно использовать для обучения Windows для загрузки определенных драйверов, таких как Winusb/Libusb/Mtp и т. Д.

У Libwdi Wiki есть очень полезная страница, которая проходит через все тонкости, чтобы заставить его работать:
https: // github.com/pbatard/libwdi/wiki/wcid-devices.
Я получил ответ от @jcw, он в порядке.

Его код загрузчика здесь https: // github.com/jeelabs/emello/ree ... S/USBSerup
USBERUP Bootloader выглядит довольно аккуратно - я думал о написании высокопоставленного загрузчика памяти после прочтения сообщения на форуме по... JCW. Я думаю, это объясняет, почему подход звучал так знакомо.

Я на самом деле стремился к подходу Leaflabs, описанного для оригинального Maple Rev 1:
http: // docs.Leaflabs.com/static.Leaflab ... aple-rev-1

Он использует стандартную последовательность DFU DETACH/RESET, которую DFU-UTIL понимает, вместо использования последовательного сброса сброса последовательного порта. Из IDE это, вероятно, не имеет большого значения (хотя теперь, когда я думаю об этом, возможно, причина, по которой мне всегда приходилось использовать режим вечного загрузчика на клене, была потому, что я открыл последовательный порт из -за пределов IDE...). Это делает его непосредственно полезным с DFU-UTIL, хотя.

Rogerclark
Ср. 13 июля 2016 г., 21:14
Спасибо

Я попробую свою синюю доску таблеток

Rogerclark
Сб 16 июля 2016 г. 6:51 утра
@devan

Я попытался загрузить новый загрузчик, но W7
bootloader_error.png
bootloader_error.PNG (15.61 киб) просмотрено 1340 раз

Деван
Сб 16 июля 2016 г., 7:41
Это странно. Я уже знал, что он будет работать только на Windows 7 против Windows 10, но интерфейс DFU должен был установить чисто.

РЕДАКТИРОВАТЬ: Я только что заметил, что у вас есть установка драйверов через обновление Windows отключено на этом скриншоте. Я знаю, что сказал, что это без водителя, но я думаю, что вы должны установить драйвер Winusb через обновление Windows хотя бы раз.

Дополнительное редактирование: Очевидно, я поменял порядок скриншотов изначально.

Вот что появилось, когда я подключил свой в. Примечание. Имя немного отличается, потому что я настроил на строку продукта, чтобы я мог проверить, что оно загрузило новое приложение по DFU. Часть, где интерфейс DFU переименован в «Устройство Winusb», является ограничением для Windows 7 и раньше, согласно Wiki Libwdi Wiki.
Driver_install_status.png
Driver_install_status.PNG (21.27 киб) просмотрено 1116 раз

Rogerclark
Сб 16 июля 2016 г. 8:30 утра
Я попробую это на другой машине, но я не думаю, что это будет работать на любой из моих машин, так как все они W7

Редактировать.

Попробого на еще 2 машинах W7, и они оба хуже, так как все, что я получаю, - это пузыриться в лотке уведомлений
Непознанный. Png
непризнанный.PNG (15.43 киб) просмотрено 1110 раз

Rogerclark
Солнце 17 июля 2016 г., 11:15 вечера
Я попытался внести несколько изменений в настройках моих обновлений W7, чтобы Windows определенно смогла пойти и искать соответствующий драйвер, но когда я внес изменения, удалил и повторно подключил загрузчик, Windows, кажется, уходит на неопределенное время в поисках Драйвер, и я не смог закрыть диалог поиска драйвера.

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

Деван
Пн 18 июля 2016 г. 1:20 утра
На первой машине вы использовали USB 3.0 порт или USB 2.0 порт? Я могу воспроизвести проблему, когда интерфейс DFU не может установить, если я подключу его к USB 3.0 Порт первой.

Я пытаюсь выяснить обходную работу для USB 3.0 выпуск, но USB 3.0 Трассирование с Logman, кажется, не работает на моей машине, поэтому я застрял в применении исправлений на основе других диагнозов, которые я могу найти в Интернете.

Что касается двух других машин, я видел ошибку «USB -устройства не распознана» при отправке плохих дескрипторов обратно - я не уверен, почему оно будет отличаться от этих машин по сравнению с первыми.

Я думаю, что Winusb/WCID не так просто работать, как я думал. Надеюсь, когда я получу в свои руки нативную машину Windows 10, я смогу проверить, работает ли она на реальном оборудовании, как и в виртуальной машине...

Rogerclark
Вт 19 июля 2016 г., 11:15 вечера
Я попробовал все порты на моем компьютере, и он просто появляется как «непризнанное устройство»

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

Вчера я прочитал, что, когда у Windows появился новый VID / PID неизвестного устройства производителя, он пытается загрузить драйвер устройства для класса устройства, но затем он связывает драйвер с VID / PID, поэтому в следующий раз, когда вы подключаете то же самое VID/PID он загружает драйвер, который он загружал для того же VID/PID в последний раз, когда он был вставлен.

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

Но мне нужно попробовать это на машине. В худшем случае я ломаю окна

Деван
Ср. 20 июля 2016 г., 3:04
Да, некоторые из шагов, необходимых для того, чтобы нагрузить Windows нагрузка, драйвер Winusb выполняется в первый раз, когда он видит эту пару VID/PID - он кэширует в реестре и никогда не запрашивает какое -либо устройство с той же парой VID/PID снова.

Из того, что я видел, диспетчер устройств можно использовать для удаления некоторых из этих кэшированных записей реестра. Например, после подключения к USB 3.0 порт и не удалось установить драйверы, я могу успешно установить его на USB 2.0 порт, если я сначала удаляю устройство от диспетчера устройств.

Для любых машин, где он не думает, что устройство неисправно, не могли бы вы посмотреть на записи реестра, как я описал здесь?
ViewTopic.PHP?f = 10&t = 1242&начало = 10#p15985

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

Я также могу создать новое изображение, которое использует другой пид, если вы хотите попробовать Fresh, не охотясь о более чистых установках Windows.

Rogerclark
Ср. 20 июля 2016 г., 3:23
Я проверил, и первая запись reg была правильной, но вторая запись reg
Hkey_local_machine \ system \ currentControlset \ enum \ usb \ vid_1209

вообще не существует.

Стивестронг
Ср. 20 июля 2016 г. 8:37 утра
В Windows вы можете попробовать просто удалить драйвер, а также удалить существующий драйвер.
Таким образом, это запустит новый поиск драйвера и снова будет искать VID/PID.

Rogerclark
Ср. 20 июля 2016 г. 8:43 утра
Он появляется как «неизвестное устройство» и не дает возможности удалить любой драйвер :-(

Деван
Сб 23 июля 2016 г., 22:15
Странно, что в реестре вообще нет записи для расширенных свойств. Я предполагаю, что вся стратегия магически-установленного регистрации-вход на первую очередь стратегию, которую Windows использует для автоматической установки драйверов, немного склонна к ошибкам по сравнению с только вручную установки драйверов в качестве отдельного шага.

Я наконец установил Windows 10 на подержанный ноутбук. Требуется очень много времени, чтобы автоматически установить драйвер WinusB при подключении его в первый раз, но в конечном итоге он работает. Класс CDC-ACM работает из коробки, как и ожидалось.

Если вы хотите попробовать еще раз, я создал новые изображения прошивки для BluePill и Maple Mini с тестовым VID/PID 1209: 0003 вместо 1209: 0002, который должен заставить его пройти через процесс установки с нуля.

Rogerclark
Сб 23 июля 2016 г., 22:51
Я думаю, что однажды, когда окна прижимают вещи, трудно восстановить.

Windows теперь полностью висит, ища для этого драйверов, поэтому я подозреваю, что это ошибка в Windows

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

Поскольку W7 требуется так много времени, чтобы автоматически искать драйверов, даже для драйверов, его уже установлено, я часто просто нажимаю на отмену, если он ищет драйверов, потому что я подключил одно и то же устройство к другому USB -порту. Обычно он понимает, что он действительно получил локальную копию драйвера и мгновенно устанавливает.

С драйверами Maple Serial и Maple DFU - что бы Libwdi, похоже, не дает Windows в Интернете для водителя.

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

Теперь я понимаю, почему Arduino.CC в основном для отдельных выделенных USB для серийных ICS на их досках, поскольку они гораздо более надежны, чем использование загрузчиков, и вам не нужно беспокоиться о своих собственных драйверах.