Представляет методы настройки и отладки USB-модуля.
Персонал по разработке и обслуживанию USB-модулей.
Таблица 1-1: Список применимой продукции
Версия ядра | файл драйвера |
---|---|
Linux-4.9 | drivers/usb/* |
Linux-5.4 | drivers/usb/* |
USB имеет функцию хоста и функцию подчиненного устройства. При использовании в качестве хоста он может подключать USB-устройства, такие как USB-накопители и USB-мыши; при использовании в качестве ведомого устройства он имеет функции ведомого устройства, такие как отладка ADB.
Таблица 2-1: Введение в терминологию
термин | иллюстрировать |
---|---|
USB | Универсальная последовательная шина, Универсальная последовательная шина |
OTG | On-The-Go |
ADB | Мост отладки Android, мост отладки Android |
Gadget | Гаджеты |
HCD | Драйвер хост-контроллера, драйвер хост-контроллера |
UDC | Контроллер USB-устройств, Контроллер USB-устройств |
HCI | Интерфейс хост-контроллера, интерфейс хост-контроллера |
EHCI | Улучшенный интерфейс хост-контроллера, улучшенный интерфейс хост-контроллера |
OHCI | Открытый интерфейс хост-контроллера, открытый интерфейс хост-контроллера |
В дереве устройств существует конфигурация модулей всех платформ этого типа чипа. Путь к файлу дерева устройств: kernel/linux-4.9/arch/arm64 (arm для 32-битной платформы)/boot/dts/. sunxi/xxx.dtsi (xxx Для конкретных моделей чипов, например sun50iw10p1 и т. д.), конфигурация дерева устройств следующая:
• USB0 Конфигурация
usbc0:usbc0@0 {
device_type = "usbc0";
compatible = "allwinner,sunxi-otg-manager";
usb_port_type = <2>;
usb_detect_type = <1>;
usb_id_gpio;
usb_det_vbus_gpio;
usb_regulator_io = "nocare";
usb_wakeup_suspend = <0>;
usb_luns = <3>;
usb_serial_unique = <0>;
usb_serial_number = "20080411";
rndis_wceis = <1>;
status = "okay";
};
udc:udc-controller@0x05100000 {
compatible = "allwinner,sunxi-udc";
reg = <0x0 0x05100000 0x0 0x1000>, /*udc base*/
<0x0 0x00000000 0x0 0x100>, /*sram base*/
<0x0 0x05200000 0x0 0x1000>; /*usb1 base, for common circuit*/
interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>; /*Использованиеустройствомпрерывания*/
clocks = <&clk_usbphy0>, <&clk_usbotg>, <&clk_usbehci1>, <&clk_usbphy1>; /*Использование устройстваиз часов*/
status = "okay"; /*лидавать Возможность Устройство*/
};
ehci0:ehci0-controller@0x05101000 {
compatible = "allwinner,sunxi-ehci0";
reg = <0x0 0x05101000 0x0 0xFFF>, /*hci0 base*/
<0x0 0x00000000 0x0 0x100>,
<0x0 0x05100000 0x0 0x1000>,
<0x0 0x07010250 0x0 0x10>, /*prcm base, for usb standby*/
<0x0 0x05200000 0x0 0x1000>; /*usb1 base, for common circuit*/
interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk_usbphy0>, <&clk_usbehci0>, <&clk_usbehci1>, <&clk_usbphy1>;
hci_ctrl_no = <0>; /*Хост-контроллер из последовательности*/
status = "okay";
};
ohci0:ohci0-controller@0x05101400 {
compatible = "allwinner,sunxi-ohci0";
reg = <0x0 0x05101000 0x0 0xFFF>, /*hci0 base*/
<0x0 0x00000000 0x0 0x100>,
<0x0 0x05100000 0x0 0x1000>,
<0x0 0x07010250 0x0 0x10>, /*prcm base, for usb standby*/
<0x0 0x05200000 0x0 0x1000>;/*usb1 base, for common circuit*/
interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk_usbphy0>, <&clk_usbohci0>, <&clk_usbohci1>, <&clk_usbphy1>;
hci_ctrl_no = <0>;
status = "okay";
};
• USB1 Конфигурация
usbc1:usbc1@0 {
device_type = "usbc1";
usb_regulator_io = "nocare";
usb_wakeup_suspend = <0>;
status = "okay";
};
ehci1:ehci1-controller@0x05200000 {
compatible = "allwinner,sunxi-ehci1";
reg = <0x0 0x05200000 0x0 0xFFF>,
<0x0 0x00000000 0x0 0x100>,
<0x0 0x05100000 0x0 0x1000>,
<0x0 0x07010250 0x0 0x10>;
interrupts = <GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk_usbphy1>, <&clk_usbehci1>;
hci_ctrl_no = <1>;
status = "okay";
};
ohci1:ohci1-controller@0x05200400 {
compatible = "allwinner,sunxi-ohci1";
reg = <0x0 0x05200000 0x0 0xFFF>,
<0x0 0x00000000 0x0 0x100>,
<0x0 0x05100000 0x0 0x1000>,
<0x0 0x07010250 0x0 0x10>;
interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clk_usbphy1>, <&clk_usbohci1>, <&clk_usbohci1_12m>, <&clk_osc48md4>, <&clk_hosc>, <&clk_losc>;
hci_ctrl_no = <1>;
status = "okay";
};
board.dts Используется для сохранения информации об устройстве для каждой платформы уровня платы (например, demo доска,перф1 доска и т. д.), информация внутри конфигурации перезапишет ее. Device Tree Информация о конфигурации по умолчанию. другой soc, версия и версия ядро соответствует из board.dts Конкретный путь следующий Вниз:device/config/chips/soc/conf igs/{board}/${Версия ядра}/board.dts。
• USB0 Конфигурация
usbc0:usbc0@0 {
device_type = "usbc0";
usb_port_type = <0x2>;
usb_detect_type = <0x1>;
usb_id_gpio = <&pio PH 8 0 0 0xffffffff 0xffffffff>;
usb_det_vbus_gpio = "axp_ctrl";
usb_regulator_io = "nocare";
det_vbus_supply = <&usb_power_supply>;
usb_wakeup_suspend = <0>;
usb_luns = <3>;
usb_serial_unique = <0>;
usb_serial_number = "20080411";
rndis_wceis = <1>;
status = "okay";
};
Примечание: (1) usb_port_type: порт USB0 по умолчанию имеет значение «измодель».
Установите значение 0: devciemodel;
Набор 1: хост-модель;
Комплект 2: модель otg.
(2) usb_detect_type: модель обнаружения порта USB0 otg.
Установлено на 0: нет обнаружения;
Установлено в 1: обнаружение vbus/id;
Набор 2: обнаружение id/dpdm.
(3)usb_wakeup_suspend:standbyмодель.
Установлено на 0: супер standbyмодель;
Набор 1: USB Модель в режиме ожидания, поддерживает удаленное пробуждение.
udc:udc-controller@0x51000000 {
det_vbus_supply = <&usb_power_supply>
}
ehci0:ehci0-controller@0x05101000 {
drvvbus-supply = <®_drivevbus>;
};
ohci0:ohci0-controller@0x05101400 {
drvvbus-supply = <®_drivevbus>;
};
иллюстрировать
Если вы используете usb standby режиме, обратите внимание на следующее:
1. IC поддерживает удаленное пробуждение;
2. Если условие 1 выполнено, соответствующие части аппаратного обеспечения должны быть спроектированы в строгом соответствии с «Документом по проектированию аппаратного обеспечения»;
3. Если условия 1 и 2 выполнены, добавьте дополнительный атрибут «wakeup-source;», чтобы включить функцию режима ожидания USB.
• USB1 Конфигурация
usbc1:usbc1@0 {
device_type = "usbc1";
usb_regulator_io = "nocare";
usb_wakeup_suspend = <0>;
status = "okay";
};
ehci1:ehci1-controller@0x05200000 {
drvvbus-supply = <®_usb1_vbus>;
};
ohci1:ohci1-controller@0x05200400 {
drvvbus-supply = <®_usb1_vbus>;
};
• Vbus Конфигурация
reg_usb1_vbus: usb1-vbus {
compatible = "regulator-fixed";
gpio = <&pio PH 10 1 2 0 1>;
regulator-name = "usb1-vbus";
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
regulator-enable-ramp-delay = <1000>;
enable-active-high;
};
Войдите в корневой каталог ядра и выполните make ARCH=arm menuconfig(64 Битовая платформа make ARCH=arm64 menuconfig)Входить Конфигурация Основной интерфейс,и выполните следующие действия:
выбирать Device Drivers Параметры Входитьследующий уровень Конфигурация,Как показано ниже.
картина 2-1: Device Drivers Параметры Конфигурация
выбирать USB support Параметры,Входитьследующий уровень Конфигурация,Как показано ниже.
картина 2-2: USB Support Параметры Конфигурация
Откройте следующие два варианта изображения, как показано ниже.
картина 2-3: USB Support подробный Конфигурация 1
картина 2-4: USB Support подробный Конфигурация 2
выбирать USB Gadget Support,Входитьследующий уровень Конфигурация,Как показано ниже.
картина 2-5: USB Gadget Support Параметры Конфигурация
Откройте опцию «Изображение изображения» и включите нужную по функционалу Конфигурация в существовании, соответствующем Конфигурации, нравиться: Когда необходима функция хранения, Нужно открыть следующую картинусерединаиз “mass storage” Конфигурация, Как показано ниже.
картина 2-6: USB Gadget Support подробный Конфигурация
Входить USB Peripheral Controller,и откройте опцию изображения:
картина 2-7: USB Peripheral Controller подробный Конфигурация
Вернитесь на предыдущий уровень, т.е. USB support,Входить SUNXI USB2.0 Dual Role controller support,и откройте опцию изображения,Как показано ниже.
картина 2-8: SUNXI USB2.0 Dual Role Controller Support подробный Конфигурация
Если вам нужна поддержка MTP PTP Остальные функции необходимо включить. TYPEC Конфигурация Вернитесь на предыдущий уровень, т.е. USB support,Входить USB Type-C Support,и откройте опцию изображения,Как показано ниже:
картина 2-9: USB Type-C Support подробный Конфигурация
Исходный код драйвера USB находится в каталоге драйверов ядра/usb. Ниже приведен исходный код, относящийся к платформе sunxi:
• Host
drivers/usb/host/
├── ehci_sunxi.c
├── ohci_sunxi.c
├── sunxi_hci.c
├── sunxi_hci.h
• UDC и Manager
drivers/usb/sunxi_usb/
├── include
│ ├── sunxi_hcd.h
│ ├── sunxi_sys_reg.h
│ ├── sunxi_udc.h
│ ├── sunxi_usb_board.h
│ ├── sunxi_usb_bsp.h
│ ├── sunxi_usb_config.h
│ ├── sunxi_usb_debug.h
│ └── sunxi_usb_typedef.h
├── Kconfig
├── Makefile
├── manager
│ ├── usbc0_platform.c
│ ├── usbc_platform.h
│ ├── usb_hcd_servers.c
│ ├── usb_hcd_servers.h
│ ├── usb_hw_scan.c
│ ├── usb_hw_scan.h
│ ├── usb_manager.c
│ ├── usb_manager.h
│ ├── usb_msg_center.c
│ └── usb_msg_center.h
├── misc
│ └── sunxi_usb_debug.c
├── udc
│ ├── sunxi_udc_board.c
│ ├── sunxi_udc_board.h
│ ├── sunxi_udc.c
│ ├── sunxi_udc_config.h
│ ├── sunxi_udc_debug.c
│ ├── sunxi_udc_debug.h
│ ├── sunxi_udc_dma.c
│ └── sunxi_udc_dma.h
└── usbc
├── usbc.c
├── usbc_dev.c
├── usbc_i.h
└── usbc_phy.c
Linux Ядро обеспечивает полный USB Структура драйвера. USB Шина имеет древовидную структуру, и на шине может быть только одно хост-устройство. Линукс Ядро рассматривается с двух точек зрения: хоста и устройства. USB структура автобуса. Следующая картина Linux Ядро рассматривается с двух точек зрения: хоста и устройства. USB Конструкция автобуса представляет собой картину.
картина 2-10: USB Общая структура привода
К основным задачам подсистемы USB относятся:
а. Регистрация и управление драйверами устройств;
б. USB-устройство выполняет поиск драйвера и инициализирует устройство;
в. Древовидная структура устройства, представленная в ядре;
г. Взаимодействуйте с устройством.
Gadget относится к наличию USB контроллер устройства USB устройство, в зависимости от конкретной функции Конфигурация, подключенное к PC позже может быть использован как mass storage、uac и другое оборудование. Линукс Есть родной gadget Структура, общий процесс настройки можно найти ниже.
Нужно быть в “USB functions configurable through configfs” Внизвыбиратьнуждатьсяиз Функция.
картина 2-11: linux-4.x usb gadget Конфигурациявыбирать
Linux-4.x/Linux-5.4 использует структуру configfs для реализации функции составного гаджета. Конкретный процесс заключается в следующем:
• устанавливать configs:
mount -t configfs none /sys/kernel/config
устанавливатьпосле завершениясуществовать/sys/kernel/config Он будет создан в каталоге usb_gadget/каталог.
• Учреждать gadgets:
mkdir /sys/kernel/config/usb_gadget/g1
После создания каталога g1/,В этом каталоге будет создано множество каталогов конфигурации.,здесьизg1поверхность Показывать gadget 1, один UDC Соответствует одному гаджет, если ваш SOC Есть несколько гаджет, вы можете создать несколько каталогов gx.
• писать gadget из PID, VID, серийный номер и другая информация:
echo "VID" > /sys/kernel/config/usb_gadget/g1/idVendor
echo "PID" > /sys/kernel/config/usb_gadget/g1/idProduct
mkdir /sys/kernel/config/usb_gadget/g1/strings/0x409
echo "manufacturer" > /sys/kernel/config/usb_gadget/g1/strings/0x409/manufacturer
echo "product" > /sys/kernel/config/usb_gadget/g1/strings/0x409/product
• Учреждать gadget Связанный Конфигурация configurations
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1
echo 0xc0 > /sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes
echo 500 > /sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409
• Учреждать Функция functions
mkdir /sys/kernel/config/usb_gadget/g1/functions/<name>.<instance name>
: имя функции: любая строка
• Ссылка для настройки функций
ln -s /sys/kernel/config/usb_gadget/g1/functions/<name>.<instance name> /sys/kernel/config/
usb_gadget/g1/configs/c.1
• давать возможность gadget
echo <udc name> > UDC
общий Gadget Функция из Конфигурацияувидеть путьприложение。
существовать Gadget Конфигурацияиспользоватьпроцесссередина,конечная может произойти точкаиз Метод конфигурации по умолчанию не может удовлетворить потребности ситуации, поэтому необходимо изменить конечную точка Внесены модификации для удовлетворения потребностей. Пожалуйста, обратитесь к существующей изконечной точка для внесения изменений. Например, размер партии конечная точка Изменить насерединаперерывконечная точка,Ссылка на существующуюизсерединаперерывконечная точку можно изменить. Изменения включают конечную точка fifo Размер, атрибуты конечной точки, направление конечной точки.
Видео с разрешением 4k:
статическая константная структура sw_udc_fifo ep_fifo[] = {
{ep0name, 0, 512, 0},/*имя, fifo_addr, fifo_size, double_fifo*/
{ep1in_bulk_name, 512, 512, 0},
{ep1out_bulk_name, 1024, 512, 0},
{ep2in_bulk_name, 1536, 512, 0},
{ep2out_bulk_name, 2048, 512, 0},
{ep3_iso_name, 2560, 1024, 0},
{ep4_int_name, 3584, 512, 0},
};
.ep[2] = {
.num = 1,
.ep = {
.name = ep1out_bulk_name,
.ops = &sunxi_udc_ep_ops,
.maxpacket = SW_UDC_EP_FIFO_SIZE,
.maxpacket_limit = SW_UDC_EP_FIFO_SIZE,
.caps = USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK,
USB_EP_CAPS_DIR_OUT),
},
.dev = &sunxi_udc,
.bEndpointAddress = (USB_DIR_OUT | 1),
.bmAttributes = USB_ENDPOINT_XFER_BULK,
},
/**
* ep_fifo_in[i] = {n} i: the physic ep index, n: ep_fifo's index for the ep
*
* eg: ep_fifo_in[2] = {3} ===> ep2_in is in ep_fifo[3]
*
* ep3_iso_name and ep4_int_name cannot be tx or rx simultaneously.
*
*/
static const int ep_fifo_in[] = {0, 1, 3, 5, 6, 7};
static const int ep_fifo_out[] = {0, 2, 4, 5, 6, 8};
Просмотр текущей роли USB0
cat /sys/devices/platform/soc/usbc0/otg_role
Вручную переключиться в режим хоста
cat /sys/devices/platform/soc/usbc0/usb_host
Вручную переключиться в режим устройства
cat /sys/devices/platform/soc/usbc0/usb_device
Удалить драйвер хоста
Найдите узел драйвера хоста и соответствующий путь с помощью следующей команды
find -name ehci_enable
find -name ohci_enable
Затем, основываясь на приведенных выше результатах, нажмите следующую команду: Удалить драйвер хоста (к t5 Platform в таком же примере)
echo 0 > sys/devices/platform/soc/5200000.ehci1-controller/ehci_enable
echo 0 > sys/devices/platform/soc/5200000.ohci1-controller/ohci_enable
Загрузить драйвер хоста
Найдите узел драйвера хоста и соответствующий путь с помощью следующей команды
find -name ehci_enable
find -name ohci_enable
Затем, основываясь на приведенных выше результатах, загрузите драйвер на хост (не платформу t5 в качестве примера) следующим образом.
echo 1 > sys/devices/platform/soc/5200000.ehci1-controller/ehci_enable
echo 1 > sys/devices/platform/soc/5200000.ohci1-controller/ohci_enable
Получить путь otg_ed_testiz
find /sys/ -name otg_ed_test
Тестовая команда изображения глаза
echo test_pack > path/otg_ed_test
Получить путь ed_testiz
find /sys/ -name ed_test
Тестовая команда изображения глаза
echo test_pack > path/ed_test
• Найдите еще несколько USB Попробуйте устройство и исключите некоторые USB Проблема в самом устройстве.
• Замените еще несколько USB Попробуйте кабель и исключите некоторые из них. USB Кабель из проблемы.
• Найдите еще несколько PC Хост делает то же самое в ходе эксперимента в качестве эталонного контраста. Если существуют PC Если такое же явление имеет место, это считается нормальным.
• Если имеется несколько устройств USB порт, попробуйте другие протестировать в таких же условиях USB Проверьте, нормально ли работает основной блок.
• Прототип оборудования USB Внешний независимый источник питания USB-HUB оборудование, затем USB устройство, подключенное к USB-HUB чтобы подтвердить, нормальна ли функция хоста.
• Убедитесь, что драйвер хоста загружен успешно.
(1) Если это порт USB0, это можно подтвердить следующим способом:
cat /sys/devices/platform/soc/usbc0/otg_role
(2) Если это порт USB1, это можно подтвердить следующим способом:
cat sys/devices/platform/soc/5200000.ehci1-controller/ehci_enable
cat sys/devices/platform/soc/5200000.ohci1-controller/ohci_enable
Если он равен 0, драйвер хоста не загружается.
• перезагрузить Host драйвер, чтобы подтвердить, работает ли функция в данный момент.
(1) Если это порт USB0, вы можете использовать следующие методы:
Способ1:Повторно подключитеOTGПроволока.
Способ2:Вручную переключиться наHostмодель.
(2) Если это порт USB1, вы можете удалить и перезагрузить драйвер.
• контраст SDK Код и последняя версия кода или патча, Убедитесь, что код обновлен до последней версии.
• Те же условия Вниз,Распечатайте ненормально функционирующую плату и нормально функционирующую плату и соответствующие регистры соответственно.,И провести контраст,Имеет ли значение подтверждение?
• При возникновении исключения проверьте USB Скоростной глаз картина нормален?
• Если проверка изображения глаза не удалась, вы можете попробовать настроить параметры изображения глаза.
• Измените еще несколько PC Хост выполняет тот же тест и исключает отдельные PC из проблемы.
• Замените еще несколько USB Кабели проходят такое же испытание, чтобы исключить отдельные USB Кабель из проблемы.
• подтверждать Device Успешно ли загружен драйвер, можно определить следующими методами:
(1) Журнал прохождения.
[ 104.732695] insmod_device_driver
[ 104.732695]
device_chose finished!
(2) Просмотрите текущую роль через узел.
• перезагрузить Device драйвер, подтвердить, вернется ли функция в нормальное состояние в это время.
(1) Снова подключите и отсоедините USB-кабель.
(2)Вручную переключиться в режим устройства。
• контраст SDK Код и последняя версия кода или патча, Убедитесь, что код обновлен до последней версии.
• Те же условия Вниз,Распечатайте ненормально функционирующую плату и нормально функционирующую плату и соответствующие регистры соответственно.,И провести контраст,Есть ли отклонения в подтверждать.
• При возникновении исключения подтвердить USB Скоростной глаз картина нормален?
Причина проблемы: только выполнение ./etc/adb_conf.sh stop Просто вынужден убить adb демон, но adb Функциональная ссылка сохраняется, если Конфигурация другая. gadget функция, она будет усугубляться adb Ссылка вызывает исключение, поэтому для существования требуется Конфигурация другое gadget функция, помимо насильственного убийства adb Демон также необходимо удалить adb Функциональная ссылка, этапы работы на небольшой машине следующие:
1、./etc/adb_conf.sh stop
2、umount /sys/kernel/config
3、rm -fr /sys/kernel/config/usb_gadget/g1/configs/c.1/ffs.adb
Выполните вышеуказанные операции и завершите работу в обычном режиме. adb Далее по мере необходимости из gadget Функцию, пожалуйста, обратитесь к главе [приложение] для настройки.
dd if=/dev/zero of=/dev/a.bin bs=1M count=100
mount -t configfs none /sys/kernel/config
mkdir /sys/kernel/config/usb_gadget/g1
echo "0x18d1" > /sys/kernel/config/usb_gadget/g1/idVendor
echo "0x0001" > /sys/kernel/config/usb_gadget/g1/idProduct
mkdir /sys/kernel/config/usb_gadget/g1/strings/0x409
mkdir /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0
echo /dev/a.bin > /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0/lun.0/file
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1
echo 0xc0 > /sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes
echo 500 > /sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409
ln -s /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0/ /sys/kernel/config/
usb_gadget/g1/configs/c.1/
ls /sys/class/udc/ | xargs echo > /sys/kernel/config/usb_gadget/g1/UDC
иллюстрировать
При необходимости увеличить lun,существовать functions/mass_storage.usb0 Вниз:
mkdir lun.1
mkdir lun.2
mount -t configfs none /sys/kernel/config
mkdir /sys/kernel/config/usb_gadget/g1
echo "0x1f3a" > /sys/kernel/config/usb_gadget/g1/idVendor
echo "0xa4ac" > /sys/kernel/config/usb_gadget/g1/idProduct
mkdir /sys/kernel/config/usb_gadget/g1/strings/0x409
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1
echo 0xc0 > /sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes
echo 500 > /sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409
mkdir /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0
echo 1 > /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0/lun.0/cdrom
echo /tmp/phoenixcard.iso > /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0/
lun.0/file
ln -s /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0/ /sys/kernel/config/
usb_gadget/g1/configs/c.1/mass_storage.usb0
ls /sys/class/udc/ | xargs echo > /sys/kernel/config/usb_gadget/g1/UDC
иллюстрировать
/tmp/phoenixcard.iso Измените в соответствии с реальной ситуацией.
mount -t configfs none /sys/kernel/config
mkdir /sys/kernel/config/usb_gadget/g1
echo "0x1d61" > /sys/kernel/config/usb_gadget/g1/idVendor
echo "0x0101" > /sys/kernel/config/usb_gadget/g1/idProduct
mkdir /sys/kernel/config/usb_gadget/g1/strings/0x409
mkdir /sys/kernel/config/usb_gadget/g1/functions/uac2.usb0
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1
echo 0xc0 > /sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes
echo 500 > /sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409
ln -s /sys/kernel/config/usb_gadget/g1/functions/uac2.usb0/ /sys/kernel/config/usb_gadget/
g1/configs/c.1/
ls /sys/class/udc/ | xargs echo > /sys/kernel/config/usb_gadget/g1/UDC
mount -t configfs none /sys/kernel/config
mkdir /sys/kernel/config/usb_gadget/g1
echo "0x1f3a" > /sys/kernel/config/usb_gadget/g1/idVendor
echo "0x100d" > /sys/kernel/config/usb_gadget/g1/idProduct
mkdir /sys/kernel/config/usb_gadget/g1/strings/0x409
mkdir /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0
mkdir -p /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/m/720p
echo 1280 > /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/m/720p/wWidth
echo 720 > /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/m/720p/
wHeight
echo 333333 > /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/m/720p/
dwFrameInterval
echo 333333 > /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/m/720p/
dwDefaultFrameInterval
echo 442368000 > /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/m/720p
/dwMinBitRate
echo 442368000 > /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/m/720p
/dwMaxBitRate
echo 1843200 > /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/m/720p/
dwMaxVideoFrameBufferSize
mkdir /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/header/h
ln -s /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/m/ /sys/kernel/
config/usb_gadget/g1/functions/uvc.usb0/streaming/header/h/
ln -s /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/header/h/ /sys/kernel/
config/usb_gadget/g1/functions/uvc.usb0/streaming/class/fs
ln -s /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/header/h/ /sys/kernel/
config/usb_gadget/g1/functions/uvc.usb0/streaming/class/hs
mkdir /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/control/header/h
ln -s /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/control/header/h/ /sys/kernel/
config/usb_gadget/g1/functions/uvc.usb0/control/class/fs/
ln -s /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/control/header/h/ /sys/kernel/
config/usb_gadget/g1/functions/uvc.usb0/control/class/ss/
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1
echo 0xc0 > /sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes
echo 500 > /sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409
ln -s /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/ /sys/kernel/config/usb_gadget/g1
/configs/c.1/
ls /sys/class/udc/ | xargs echo > /sys/kernel/config/usb_gadget/g1/UDC
mount -t configfs none /sys/kernel/config/
mkdir /sys/kernel/config/usb_gadget/g1
echo 0x0525 >/sys/kernel/config/usb_gadget/g1/idVendor
echo 0xa4ac >/sys/kernel/config/usb_gadget/g1/idProduct
mkdir /sys/kernel/config/usb_gadget/g1/strings/0x409
mkdir /sys/kernel/config/usb_gadget/g1/functions/hid.usb0
echo 512 >/sys/kernel/config/usb_gadget/g1/functions/hid.usb0/report_length
echo -ne <report_desc> >/sys/kernel/config/usb_gadget/g1/functions/hid.usb0/report_desc
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1
echo 0xc0 >/sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes
echo 500 >/sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409
ln -s /sys/kernel/config/usb_gadget/g1/functions/hid.usb0/ /sys/kernel/config/usb_gadget/g1/configs/c.1/
ls /sys/class/udc/ | xargs echo > /sys/kernel/config/usb_gadget/g1/UDC
иллюстрировать
report_desc настраивается в соответствии с потребностями.
mount -t configfs none /sys/kernel/config
mkdir /sys/kernel/config/usb_gadget/g1
echo "0x1f3a" > /sys/kernel/config/usb_gadget/g1/idVendor
echo "0x200a" > /sys/kernel/config/usb_gadget/g1/idProduct
mkdir /sys/kernel/config/usb_gadget/g1/strings/0x409
mkdir /sys/kernel/config/usb_gadget/g1/functions/rndis.usb0
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1
echo 0xc0 > /sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes
echo 500 > /sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409
ln -s /sys/kernel/config/usb_gadget/g1/functions/rndis.usb0/ /sys/kernel/config/usb_gadget/g1/configs/c.1/rndis.usb0
ls /sys/class/udc/ | xargs echo > /sys/kernel/config/usb_gadget/g1/UDC
mount -t configfs none /sys/kernel/config
mkdir /sys/kernel/config/usb_gadget/g1
echo "0x1f3a" > /sys/kernel/config/usb_gadget/g1/idVendor
echo "0x0007" > /sys/kernel/config/usb_gadget/g1/idProduct
mkdir /sys/kernel/config/usb_gadget/g1/strings/0x409
mkdir /sys/kernel/config/usb_gadget/g1/functions/acm.usb0
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1
echo 0xc0 > /sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes
echo 500 > /sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409
ln -s /sys/kernel/config/usb_gadget/g1/functions/acm.usb0/ /sys/kernel/config/usb_gadget/g1/configs/c.1/acm.usb0
ls /sys/class/udc/ | xargs echo > /sys/kernel/config/usb_gadget/g1/UDC
mount -t configfs none /sys/kernel/config
mkdir /sys/kernel/config/usb_gadget/g1
echo "0x18d1" > /sys/kernel/config/usb_gadget/g1/idVendor
echo "0x0002" > /sys/kernel/config/usb_gadget/g1/idProduct
mkdir /sys/kernel/config/usb_gadget/g1/strings/0x409
echo "20080411" > /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber
echo "Android" > /sys/kernel/config/usb_gadget/g1/strings/0x409/manufacturer
mkdir /sys/kernel/config/usb_gadget/g1/functions/ffs.adb
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1
echo 0xc0 > /sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes
echo 500 > /sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409
ln -s /sys/kernel/config/usb_gadget/g1/functions/ffs.adb/ /sys/kernel/config/usb_gadget/g1/
configs/c.1/ffs.adb
mkdir /dev/usb-ffs
mkdir /dev/usb-ffs/adb
mount -o uid=2000,gid=2000 -t functionfs adb /dev/usb-ffs/adb/
ls /sys/class/udc/ | xargs echo > /sys/kernel/config/usb_gadget/g1/UDC
mount -t configfs none /sys/kernel/config
mkdir /sys/kernel/config/usb_gadget/g1
echo "0x18d1" > /sys/kernel/config/usb_gadget/g1/idVendor
echo "0x0003" > /sys/kernel/config/usb_gadget/g1/idProduct
mkdir /sys/kernel/config/usb_gadget/g1/strings/0x409
echo "20080411" > /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber
echo "Android" > /sys/kernel/config/usb_gadget/g1/strings/0x409/manufacturer
mkdir /sys/kernel/config/usb_gadget/g1/functions/ffs.adb
mkdir /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0
echo ${BLOCK_PATH} > /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0/lun.0/file
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1
echo 0xc0 > /sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes
echo 500 > /sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409
ln -s /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0/ /sys/kernel/config/
usb_gadget/g1/configs/c.1/mass_storage.usb0
ln -s /sys/kernel/config/usb_gadget/g1/functions/ffs.adb/ /sys/kernel/config/usb_gadget/g1/
configs/c.1/ffs.adb
mkdir /dev/usb-ffs
mkdir /dev/usb-ffs/adb
mount -o uid=2000,gid=2000 -t functionfs adb /dev/usb-ffs/adb/
ls /sys/class/udc/ | xargs echo > /sys/kernel/config/usb_gadget/g1/UDC
mount -t configfs none /sys/kernel/config
mkdir /sys/kernel/config/usb_gadget/g1
echo "0x1f3a" > /sys/kernel/config/usb_gadget/g1/idVendor
echo "0x100d" > /sys/kernel/config/usb_gadget/g1/idProduct
mkdir /sys/kernel/config/usb_gadget/g1/strings/0x409
mkdir /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0
mkdir /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0
mkdir -p /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/m/720p
echo 1280 > /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/m/720p/wWidth
echo 720 > /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/m/720p/wHeight
echo 333333 > /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/m/720p/dwFrameInterval
echo 333333 > /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/m/720p/dwDefaultFrameInterval
echo 442368000 > /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/m/720p/dwMinBitRate
echo 442368000 > /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/m/720p/dwMaxBitRate
echo 1843200 > /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/m/720p/dwMaxVideoFrameBufferSize
mkdir /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/header/h
ln -s /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/mjpeg/m/ /sys/kernel/
config/usb_gadget/g1/functions/uvc.usb0/streaming/header/h/
ln -s /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/header/h/ /sys/kernel/
config/usb_gadget/g1/functions/uvc.usb0/streaming/class/fs
ln -s /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/streaming/header/h/ /sys/kernel/
config/usb_gadget/g1/functions/uvc.usb0/streaming/class/hs
mkdir /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/control/header/h
ln -s /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/control/header/h/ /sys/kernel/
config/usb_gadget/g1/functions/uvc.usb0/control/class/fs/
ln -s /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/control/header/h/ /sys/kernel/
config/usb_gadget/g1/functions/uvc.usb0/control/class/ss/
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1
echo 0xc0 > /sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes
echo 500 > /sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409
ln -s /sys/kernel/config/usb_gadget/g1/functions/uvc.usb0/ /sys/kernel/config/usb_gadget/g1
/configs/c.1/
ln -s /sys/kernel/config/usb_gadget/g1/functions/uac1.usb0/ /sys/kernel/config/usb_gadget/g1/configs/c.1/
ls /sys/class/udc/ | xargs echo > /sys/kernel/config/usb_gadget/g1/UDC
mount -t configfs none /sys/kernel/config
mkdir /sys/kernel/config/usb_gadget/g1
echo "0x1f3a" > /sys/kernel/config/usb_gadget/g1/idVendor
echo "0xa4ac" > /sys/kernel/config/usb_gadget/g1/idProduct
mkdir /sys/kernel/config/usb_gadget/g1/strings/0x409
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1
echo 0xc0 > /sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes
echo 500 > /sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409
mkdir /sys/kernel/config/usb_gadget/g1/functions/hid.usb0
mkdir /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0
echo 512 >/sys/kernel/config/usb_gadget/g1/functions/hid.usb0/report_length
echo -ne <report_desc> >/sys/kernel/config/usb_gadget/g1/functions/hid.usb0/report_desc
ln -s /sys/kernel/config/usb_gadget/g1/functions/hid.usb0/ /sys/kernel/config/usb_gadget/g1/configs/c.1/hid.usb0
echo 1 > /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0/lun.0/cdrom
echo /tmp/phoenixcard.iso > /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0/lun.0/file
ln -s /sys/kernel/config/usb_gadget/g1/functions/mass_storage.usb0/ /sys/kernel/config/usb_gadget/g1/configs/c.1/mass_storage.usb0
ls /sys/class/udc/ | xargs echo > /sys/kernel/config/usb_gadget/g1/UDC
mount -t configfs none /sys/kernel/config
mkdir /sys/kernel/config/usb_gadget/g1
echo "0x18d1" > /sys/kernel/config/usb_gadget/g1/idVendor
echo "0x0010" > /sys/kernel/config/usb_gadget/g1/idProduct
mkdir /sys/kernel/config/usb_gadget/g1/strings/0x409
mkdir /sys/kernel/config/usb_gadget/g1/functions/ffs.adb
mkdir /sys/kernel/config/usb_gadget/g1/functions/rndis.usb0
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1
echo 0xc0 >/sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes
echo 500 >/sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower
mkdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409
ln -s /sys/kernel/config/usb_gadget/g1/functions/rndis.usb0/ /sys/kernel/config/usb_gadget/g1/configs/c.1/rndis.usb0
ln -s /sys/kernel/config/usb_gadget/g1/functions/ffs.adb/ /sys/kernel/config/usb_gadget/g1/configs/c.1/ffs.adb
mkdir /dev/usb-ffs
mkdir /dev/usb-ffs/adb
mount -o uid=2000,gid=2000 -t functionfs adb /dev/usb-ffs/adb/
ls/sys/class/udc/|xargs echo>/sys/kernel/config/usb_gadget/g1/UDC