GadgetFS на плате Linux на базе Allwinner H3
У меня есть nanopi-neo, который является платой Linux на основе Allwinner H3. Он поддерживает режим USB OTG, поэтому я хотел попробовать преобразовать его в slave с помощью GadgetFS.
Из того, что я понимаю, я должен пересобрать ядро linux, предоставленное им с этой опцией
<*> USB Gadget Drivers
<*> Gadget Filesystem
И для rootfs используйте это
Package Selection for the target --->
Hardware handling --->
[*] gadgetfs-test
Затем я приступил к сборке и загрузке платы.
Я следовал этому руководству и использовал эти команды
root:/dev> mkdir /dev/gadget
root:/dev> mount -t gadgetfs gadgetfs /dev/gadget
[ 219.808688] WRN:L2558(drivers/usb/sunxi_usb/udc/sunxi_udc.c):ERR: Error in bind() : -120
[ 219.827939] nop sunxi_usb_udc: failed to start (null): -120
root:/dev> ls /dev/gadget/ -l
total 0
-rw------- 1 root root 0 Jan 1 00:03 sunxi_usb_udc
Я не могу найти ничего по этой ошибке. Большинство проблем, с которыми сталкиваются люди, касается insmod, но я встроил модуль в ядро. Так что у меня нет этой проблемы наверняка.
Затем я нашел этот пост для Sunxi, т.е. Allwinner SDK, прося меня передать некоторые значения в otg_role, я сделал, и я получил это
echo 1 > /sys/bus/platform/devices/sunxi_usb_udc/otg_role
[ 192.310934] sunxi-ehci sunxi-ehci.1: remove, state 4
[ 192.326666] usb usb1: USB disconnect, device number 1
[ 192.343775] sunxi-ehci sunxi-ehci.1: USB bus 1 deregistered
[ 192.370300] sunxi-ohci sunxi-ohci.1: remove, state 4
[ 192.385941] usb usb5: USB disconnect, device number 1
[ 192.402761] sunxi-ohci sunxi-ohci.1: USB bus 5 deregistered
[ 192.444442] sunxi-ehci sunxi-ehci.1: SW USB2.0 'Enhanced' Host Controller (EHCI) Driver
[ 192.458113] sunxi-ehci sunxi-ehci.1: new USB bus registered, assigned bus number 1
[ 192.471720] sunxi-ehci sunxi-ehci.1: irq 104, io mem 0xf1c1a000
[ 192.500050] sunxi-ehci sunxi-ehci.1: USB 0.0 started, EHCI 1.00
[ 192.511581] hub 1-0:1.0: USB hub found
[ 192.519996] hub 1-0:1.0: 1 port detected
[ 192.548993] sunxi-ohci sunxi-ohci.1: SW USB2.0 'Open' Host Controller (OHCI) Driver
[ 192.561898] sunxi-ohci sunxi-ohci.1: new USB bus registered, assigned bus number 5
[ 192.574365] sunxi-ohci sunxi-ohci.1: irq 105, io mem 0xf1c1a400
[ 192.644522] hub 5-0:1.0: USB hub found
[ 192.652612] hub 5-0:1.0: 1 port detected
root@kyloren:/$ # echo 2 > /sys/bus/platform/devices/sunxi_usb_udc/otg_role
[ 195.940888] sunxi-ehci sunxi-ehci.1: remove, state 4
[ 195.956330] usb usb1: USB disconnect, device number 1
[ 195.976521] sunxi-ehci sunxi-ehci.1: USB bus 1 deregistered
[ 195.997477] sunxi-ohci sunxi-ohci.1: remove, state 4
[ 196.007624] usb usb5: USB disconnect, device number 1
[ 196.018520] sunxi-ohci sunxi-ohci.1: USB bus 5 deregistered
И я пытаюсь смонтировать снова, но я получаю ту же ошибку.
Кто-нибудь может направить меня в этом?
1 ответ
Когда-то намного позже...
Короткий ответ: вам не хватает компонента пользовательского режима, который фактически создает конечные точки USB и обрабатывает запросы на настройку и управление.
Пример такого зверя можно найти в 3 частях, ссылки ниже.
Длинная версия:
Чтобы использовать плату H3 в качестве устройства, вам необходимо modprobe gadgetfs
создать каталог mkdir -p /dev/gadget
, а затем подключите устройство в этот каталог с помощью mount -t gadgetfs gadgetfs /dev/gadget
,
Наконец, включите роль устройства с помощью echo 2 > /sys/bus/platform/devices/sunxi_usb_udc/otg_role
,
Вам нужно будет добавить следующее к autoconfig()
функция в usb.c
поскольку этот путь кода предшествует самому существованию AllWinner.
Как только приложение usermode (usb) создано, просто запустите его как sudo usb -v
для подробного режима. Если вы правильно подключены и включены, ваше устройство должно теперь отображаться на хосте с двумя массовыми конечными точками и одним EP прерывания.
Если вы пытаетесь использовать mainline, вам нужно изменить имя контроллера в приведенном ниже коде (находится в /dev/gadget) и добавить правильное заклинание в файл DTS. Удачи в этом, поскольку мне еще предстоит настроить 4.11 для работы в режиме устройства на моих платах NanoPi M1 и NanoPi Neo Air.
Надеюсь, что это очень запоздало, кому-то пригодится!
if (stat(DEVNAME = "sunxi_usb_udc", &statb) == 0)
{
HIGHSPEED = 1;
fs_source_desc.bEndpointAddress = hs_source_desc.bEndpointAddress = USB_DIR_IN | 1;
EP_IN_NAME = "ep1in-bulk";
fs_sink_desc.bEndpointAddress = hs_sink_desc.bEndpointAddress = USB_DIR_OUT | 1;
EP_OUT_NAME = "ep1out-bulk";
source_sink_intf.bNumEndpoints = 3;
fs_status_desc.bEndpointAddress = hs_status_desc.bEndpointAddress = USB_DIR_IN | 2;
EP_STATUS_NAME = "ep2in-interrupt";
}