LINUX.ORG.RU

Работает ли USB-OTG в режиме device на актуальном U-Boot?

 , ,


0

1

Мне нужно проинициализировать OTG-контроллер в режиме Device. Подскажите, возможно ли это в принципе? Если да, то как я могу это сделать и проверить работоспособность?

  • Работаю с платой BPI M2 Berry (процессор Allwinner A40i-H)
  • Версия U-Boot 6.8.0-90-generic

Из того, что уже сделано

Модифицированы dts-файлы

usb_otg: usb@1c13000 {
	compatible = "allwinner,sun8i-h3-musb";
	reg = <0x01c13000 0x400>;
	clocks = <&ccu CLK_BUS_OTG>;
	resets = <&ccu RST_BUS_OTG>;
	interrupts = <GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>;
	interrupt-names = "mc";
	phys = <&usbphy 0>;
	phy-names = "usb";
	extcon = <&usbphy 0>;
	dr_mode = "otg";
	status = "disabled";
};

---

&usb_otg {
	dr_mode = "peripheral";
	status = "okay";
};

&usbphy {
	usb0_id_det = "disabled";
	usb1_vbus-supply = <&reg_vcc5v0>;
	status = "okay";
};

В menuconfig включены такие настройки (в блоке USB Support):

  • Enable driver model for USB Gadget
  • MUSB host mode support (без этого поля даже не начинается инициализация otg-контроллера)
  • MUSB gadget mode support
  • Enable sunxi OTG/DRC USB controller
  • Hardcode MUSB CONFIGDATA register (без этого поля тоже возникает больше проблем)
  • USB Gadget support
  • USB Gadget support in SPL (Указал то, что показалось значимым. Мог что-то упустить)

При вызове usb start получаю следующий вывод:

=> usb start
starting USB...
Bus usb@1c13000: Port not available.

Актуальный u-boot имеет версию 2026.01, и allwinner’ов в нём со включенным CONFIG_USB_MUSB_GADGET=y пара дюжин. Сетью на cdc-ecm я тоже время от времени там пользовался, так что да, на актуальном u-boot работает. Что происходит в вендорском, я в душе не чаю.

beefdeadbeef
()
Ответ на: комментарий от beefdeadbeef

Я обновился до версии 2026.04 Конфиг под мою плату из USB включает только HCD. И даже не описан узел otg в dts-файле.

Как же оно тогда работает? Или мне надо снова всё вручную настраивать?

maxBbb
() автор топика
Ответ на: комментарий от maxBbb

«работает» очевидно относилось к тем платкам из числа пары дюжин, да и «вообще». Ну т.е. «вообще» достаточно добавить в соответствующий config одну строчку CONFIG_USB_MUSB_GADGET=y. Что до конкретно этой платки, то да, для неё в mainline в dts узел usb@1c13000 вообще не описан, так что я могу только гадать, что в железе (r40/v40 и как они там ещё называются) он всё-таки существует и не отличается от такого же в, скажем, h3. Соответственно, можно было бы списать usb_otg: из sunxi-h3-h5.dtsi (с поправкой на адрес/прерывание он выглядит так же, как и ваш).

Вторая часть выглядит обычно так (опять же, с поправкой на id pin и vbus-supply):

&usb_otg {                                                                                                                                                                    
        status = "okay";                                                                                                                                                      
        dr_mode = "otg";                                                                                                                                                      
};                                                                                                                                                                            
                                                                                                                                                                              
&usbphy {                                                                                                                                                                     
        usb0_id_det-gpios = <&pio 6 12 GPIO_ACTIVE_HIGH>; /* PG12 */                                                                                                          
        usb0_vbus-supply = <&reg_usb0_vbus>;                                                                                                                                  
        status = "okay";                                                                                                                                                      
};

Продолжая гадать, предложил бы попробовать в другую сторону – в dr_mode = «host» оно работает ?

beefdeadbeef
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.