LINUX.ORG.RU

История изменений

Исправление h4tr3d, (текущая версия) :

Может ли USB-устройство читать и писать произвольные участки памяти?

нет. Оно не может быть инициатором передачи данных вообще. Только на запрос хоста. В посылках вообще нет такого понятия как адрес - только данные понятные принимающей стороне (будь то HID, MassStorage или UVC). Полученные данные уже принимающая сторона будет куда-то ложить. Т.е. ты, теоретически, можешь реализовать особое устройство которое будет срать в память, но нужна будет поддержка со стороны драйвера на хосте.

Кстати, для обновления прошивок на устройствах вполне себе существует стандартный класс устройств DFU (Device Firmware Upgrade): http://www.usb.org/developers/docs/devclass_docs/DFU_1.1.pdf существуют и всяки dfu-util. Не все устройства правда это используют. Ну и да, одно физическое устройство, by design, может определяться в системе по разному, в зависимости от режимов. Взять тот же навигатор Garmin GPSMAP 62s: это или последовательный порт или mass storage. Или вообще как составное, композитное устройство.

А есть ещё чипы, типа того же Cypress FX3, которые вообще могут грузить прошивку от драйвера. Есть у них такой режим USB Boot: при подаче питания запускается Boot loader, который смотрит на состояние определённых пинов и решает откуда читать прошивку, если режим: USB Boot (есть ещё EEPROM, SDI, SPI), он передаёт системе определённые дескрипторы, VID/PID берутся предпрошитые при изготовлении или из EEPROM. Создаётся единственная EP0. Со стороны хоста система по VID/PID подбирает драйвер, загружает его, драйвер уже, используя регламентированный Cypress протокол, заливает конкретную прошивку в чип, после чего запускается процесс ренумерации, после чего устройство уже видится совершенно по другому, с совершенно другими дескрипторами и только после этого начинает свою работу. С такими устройствами играться прикольно: удаляешь драйвер и используя fxload или свою какую утилиту при помощи libusb зашиваешь туда свой код :)

Исходная версия h4tr3d, :

Может ли USB-устройство читать и писать произвольные участки памяти?

нет. Оно не может быть инициатором передачи данных вообще. Только на запрос хоста. В посылках вообще нет такого понятия как адрес - только данные понятные принимающей стороне (будь то HID, MassStorage или UVC). Полученные данные уже принимающая сторона будет куда-то ложить. Т.е. ты, теоретически, можешь реализовать особое устройство которое будет срать в память, но нужна будет поддержка со стороны драйвера на хосте.

Кстати, для обновления прошивок на устройствах вполне себе существует стандартный класс устройств DFU (Device Firmware Upgrade): http://www.usb.org/developers/docs/devclass_docs/DFU_1.1.pdf существуют и всяки dfu-util. Не все устройства правда это используют. Ну и да, одно физическое устройство, by design, может определяться в системе по разному, в зависимости от режимов. Взять тот же навигатор Garmin GPSMAP 62s: это или последовательный порт или mass storage.

А есть ещё чипы, типа того же Cypress FX3, которые вообще могут грузить прошивку от драйвера. Есть у них такой режим USB Boot: при подаче питания запускается Boot loader, который смотрит на состояние определённых пинов и решает откуда читать прошивку, если режим: USB Boot (есть ещё EEPROM, SDI, SPI), он передаёт системе определённые дескрипторы, VID/PID берутся предпрошитые при изготовлении или из EEPROM. Создаётся единственная EP0. Со стороны хоста система по VID/PID подбирает драйвер, загружает его, драйвер уже, используя регламентированный Cypress протокол, заливает конкретную прошивку в чип, после чего запускается процесс ренумерации, после чего устройство уже видится совершенно по другому, с совершенно другими дескрипторами и только после этого начинает свою работу. С такими устройствами играться прикольно: удаляешь драйвер и используя fxload или свою какую утилиту при помощи libusb зашиваешь туда свой код :)