我正在尝试使用 MIDI Linux 小工具模块 (g_midi) 将 Raspberry Pi Zero 变成 USB MIDI 设备。我使用以下命令启用了 g_midi:
echo "dtoverlay=dwc2" | sudo tee -a /boot/config.txt
echo "dwc2" | sudo tee -a /etc/modules
echo "g_midi" | sudo tee -a /etc/modules
reboot
现在,当我运行时,MIDI 设备会出现在列表中sudo amidi -l
。
当我通过 USB 将 Pi Zero 连接到计算机时,计算机会检测到新的 MIDI 设备,并且我可以在 Pi 和计算机之间发送 MIDI 消息。我可以根据需要多次插拔设备,并且计算机总是会重新识别 Pi。
然而,使用 iPad 时情况就不一样了。当我将 Pi 数据 USB 线插入相机连接套件(Pi Zero 也与 PWR USB 一起插入)时,我可以将相机连接套件插入 iPad,它会将 Pi 识别为 MIDI 设备。但是,如果我拔下并重新插入相机连接套件,iPad 将无法再次识别 Pi。
将 Pi USB 重新插入计算机会导致该计算机再次识别 Pi,但在 iPad 上则无法识别。如果我拔掉 Pi 并再次通电,我可以让它再次正常识别,但仅限于第一次插入时。
我使用了一下dmesg -wH
,输出如下:
Pi Zero 最初插入计算机:
[May27 11:58] dwc2 20980000.usb: new device is high-speed
[ +0.012000] dwc2 20980000.usb: new address 25
[ +0.008198] MIDI Gadget gadget: high-speed config #1: MIDI Gadget
Pi Zero 重新插入计算机:
[May27 11:59] dwc2 20980000.usb: new device is high-speed
[ +0.010505] dwc2 20980000.usb: new address 26
[ +0.006452] MIDI Gadget gadget: high-speed config #1: MIDI Gadget
Pi Zero 最初插入 iPad:
[ +23.850688] dwc2 20980000.usb: new device is low-speed
[ +0.158771] dwc2 20980000.usb: new device is high-speed
[ +0.015806] dwc2 20980000.usb: new address 1
[ +0.007635] MIDI Gadget gadget: high-speed config #1: MIDI Gadget
Pi Zero 重新插入 iPad:
[ +5.517874] dwc2 20980000.usb: new device is low-speed
我(非常偶然)曾多次拔出并重新插入电源,同时在重新插入之间等待,从而成功地让 Pi Zero 在 iPad 上再次被识别。我对拔掉插头和重新插入插头的时间进行了计时,但这些时间不可重现。在 Pi Zero 再次被识别的罕见情况下,我注意到来自的消息dmesg -wH
是:
[May27 11:52] dwc2 20980000.usb: new device is low-speed
[ +0.158547] dwc2 20980000.usb: new device is high-speed
[ +0.015820] dwc2 20980000.usb: new address 1
[ +0.008327] MIDI Gadget gadget: high-speed config #1: MIDI Gadget
奇怪的是,new address
仍然是 1,而在计算机上,每次我插入 Pi Zero 时,地址都会增加 1。
对 MIDI、USB 或 Linux 小工具模块一无所知,我不确定这是否重要,但据我所知,这是我在计算机上识别 Pi Zero 与在计算机上识别时唯一不同的地方iPad。
有没有人有使用 MIDI Linux 小工具模块和 iPad 的经验,知道这里出了什么问题?如果我能得到任何帮助,我将不胜感激。
答案1
这可能是因为默认情况下 g_midi 小工具(顺便说一句,已弃用)使用 250mV VBus Draw,这意味着它期望主机设备向设备发送 250mV。不知道iPad有没有这个功能
这不是 g_midi 上的错误,因为它是通用配置。您可以在编译内核时通过将 更改CONFIG_USB_GADGET_VBUS_DRAW flag
为 a 来更改此设置mV * 2
,如 USB 规范所指定。
例如,仅需要 13mV:
CONFIG_USB_GADGET_VBUS_DRAW=26
另外,尝试使用您可用的最新Linux内核版本,它可能会修复此错误。