linux - 基于 Allwinner H3 的 linux 板上的 GadgetFS

标签 linux usb linux-device-driver usb-otg system-on-chip

我有 nanopi-neo,它是基于 Allwinner H3 的 Linux 板。它支持 USB OTG 模式,所以我想尝试使用 GadgetFS 将其转换为从机。

据我了解,我应该用这个选项重建他们提供的linux内核

<*>   USB Gadget Drivers
<*>     Gadget Filesystem

对于 rootfs 使用这个

Package Selection for the target  --->
Hardware handling  --->
    [*] gadgetfs-test

然后我开始构建并启动电路板。

我关注了这个guide并使用了这些命令

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 有关,但我已将模块内置在内核中。所以我不确定这个问题。

然后我找到了这个 post对于 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

我尝试再次挂载,但我得到了同样的错误。

有人可以指导我吗?

最佳答案

很久以后的某个时候......

简短的回答是您缺少实际实例化 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 启用设备角色。

您需要将以下内容添加到 usb.c 中的 autoconfig() 函数中,因为该代码方式早于 AllWinner 的存在。

构建用户模式应用程序 (usb) 后,只需将其作为 sudo usb -v 运行即可进入详细模式。如果您正确插入并供电,您的设备现在应该显示在主机上,带有 2 个批量端点和一个中断 EP。

如果您尝试使用主线,您将需要在下面的代码中更改 Controller 的名称(位于/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";
}

Main usermode driver

USB descriptor strings

Header file for the above

关于linux - 基于 Allwinner H3 的 linux 板上的 GadgetFS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41394520/

相关文章:

usb - HID 设备测试仪

c++ - 有没有办法保存 USB 设备,以便在重新插入后可以防止重新枚举?

linux - 打印到内核日志的限制

compiler-construction - makefile - 如何处理 kconfig 文件

java - 如何从USB连接的RS-485获取数据

c - Linux内核中嵌入锁的动态分配/释放结构

c - 我的环境中的 realpath() 不喜欢 NULL 作为第二个参数?

linux - 如何在 bash 中比较变量

python - Bash:按字节区分大小写的排序命令或使用 python 排序命令对文本文件进行排序

linux - 使用每个虚拟主机一个文件的 vhost.d 目录时,在 Apache 2.4 中指定默认虚拟主机?