저는 i.MX6 프로세서 기반의 맞춤형 보드에서 Linux를 실행하고 있습니다. USB 포트의 장치 트리는 otg로 구성되며 두 역할 모두 작업 가젯( g_ether
또는 g_serial
)과 호스트(대량 저장 장치 연결)로 구성됩니다. 부팅 후 USB는 가젯으로 구성되며, 이 경우 g_ether
아무런 문제 없이 노트북을 로드하고 통신할 수 있습니다. 그 후 역할을 중재자로 전환했는데 이전처럼 잘 작동했습니다. "Mass Storage"를 마더보드에 연결하면 시스템이 이를 인식합니다. 마지막으로 캐릭터를 다시 가젯으로 다시 전환하면 더 이상 제작하거나 g_ether
작업 할 수 없습니다 g_serial
. 에는 오류 메시지가 없습니다 dmesg
.
장치 트리
&usbotg1 {
pinctrl-names = "default";
dr_mode = "otg";
status = "okay";
};
리눅스
root@xxxx:~# uname -a
Linux xxxx 5.4.24-2.0.0+g8115d570b280 #1 SMP PREEMPT Tue Sep 21 14:56:23 UTC 2021 armv7l armv7l armv7l GNU/Linux
하드웨어
1. The board has a mini USB-B female connector
2. The ID pin is connected to ground
3. The +5V is not used (not connected)
문제를 재현하기 위한 단계별 명령
### 1. After boot the default role is gadget
root@xxxx:~# cat /sys/kernel/debug/ci_hdrc.0/role
gadget
### 2. Plug laptop and confirm that g_ether is working
root@xxxx:~# ifconfig usb0
usb0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 metric 1
inet 192.168.7.1 netmask 255.255.255.0 broadcast 192.168.7.255
inet6 fe80::64ba:c3ff:fef0:cfba prefixlen 64 scopeid 0x20<link>
ether 66:ba:c3:f0:cf:ba txqueuelen 1000 (Ethernet)
RX packets 62 bytes 6802 (6.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 45 bytes 3754 (3.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@xxxx:~# ping -c 2 -w 3 192.168.7.3
PING 192.168.7.3 (192.168.7.3): 56 data bytes
64 bytes from 192.168.7.3: seq=0 ttl=64 time=1.161 ms
64 bytes from 192.168.7.3: seq=1 ttl=64 time=1.023 ms
--- 192.168.7.3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 1.023/1.092/1.161 ms
### 3. Unplug laptop, switch USB role to host and plug mass storage device
root@xxxx:~# echo host > /sys/kernel/debug/ci_hdrc.0/role
root@xxxx:~# cat /sys/kernel/debug/ci_hdrc.0/role
host
root@xxxx:~# dmesg
...
[ 1387.750491] usb 2-1: new high-speed USB device number 3 using ci_hdrc
[ 1387.802654] usb 2-1: New USB device found, idVendor=0525, idProduct=a4a5, bcdDevice= 2.21
[ 1387.802711] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1387.802745] usb 2-1: Product: USB download gadget
[ 1387.802777] usb 2-1: Manufacturer: FSL
[ 1387.815591] usb-storage 2-1:1.0: USB Mass Storage device detected
[ 1387.837391] usb-storage 2-1:1.0: Quirks match for vid 0525 pid a4a5: 10000
[ 1387.838126] scsi host0: usb-storage 2-1:1.0
[ 1389.031295] usb 2-1: reset high-speed USB device number 3 using ci_hdrc
[ 1389.271363] usb 2-1: reset high-speed USB device number 3 using ci_hdrc
[ 1389.511572] usb 2-1: reset high-speed USB device number 3 using ci_hdrc
[ 1389.751624] usb 2-1: reset high-speed USB device number 3 using ci_hdrc
# sda is present
root@xxxx:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 1 7.3G 0 disk
`-sda1 8:1 1 7.3G 0 part
mmcblk1 179:0 0 7.3G 0 disk
`-mmcblk1p1 179:1 0 7.3G 0 part /sysroot
mmcblk1boot0 179:8 0 4M 1 disk
mmcblk1boot1 179:16 0 4M 1 disk
### 4. Unplug mass store device, switch USB role to gadget
root@xxxx:~# echo gadget > /sys/kernel/debug/ci_hdrc.0/role
root@xxxx:~# cat /sys/kernel/debug/ci_hdrc.0/role
gadget
### 5. Interface is present and g_ether is loaded but can't ping laptop anymore
root@xxxx:~# ifconfig usb0
usb0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 metric 1
inet 192.168.7.1 netmask 255.255.255.0 broadcast 192.168.7.255
ether 2e:40:4e:6a:3b:8c txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
root@xxxx:~# lsmod | grep g_ether
g_ether 16384 0
root@xxxx:~# ping -c 2 -w 3 192.168.7.3
PING 192.168.7.3 (192.168.7.3): 56 data bytes
--- 192.168.7.3 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
마지막 단계(5.) 후에 호스트로 다시 전환하면 여전히 잘 작동하지만 가젯은 더 이상 작동하지 않습니다. 즉, 가젯은 재부팅 후에만 작동하지만 콘솔은 매번 작동합니다. 가젯으로 전환하기 전에 다른 주문을 시도했습니다. 예를 들어 g_ether
먼저 제거한 다음 역할을 전환하세요. 또한 g_serial
문제가 네트워크 인터페이스와 관련이 없는지 확인하려고 했습니다 . 앞서 언급했듯이 오류가 없으며 dmesg
현재 이 문제를 디버깅하는 방법을 모르겠습니다.
무슨 일이 일어나고 있는지 또는 디버깅하는 방법에 대한 아이디어가 있습니까?
답변1
동일한 프로세서를 사용하는 IP 블록은칩데아그리고 장치 트리 설정에 속성이 없고 존재하는지 확인 hnp-disable
하세요 srp-disable
. 다음 예제를 사용하세요(Linux 설명서에서 가져옴).
&usbotg {
vbus-supply = <®_usb_otg_vbus>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usbotg_var>;
...
otg-rev = <0x0200>;
adp-disable;
status = "okay";
};
가젯을 구성한 후 호스트와 가젯 간에 변경을 수행합니다.
호스트로 변경:
echo "host" > /sys/kernel/debug/ci_hdrc.0/role
echo "" > /sys/kernel/config/usb_gadget/g1/UDC
가젯으로 변경:
echo "gadget" > /sys/kernel/debug/ci_hdrc.0/role
ls /sys/class/udc > /sys/kernel/config/usb_gadget/g1/UDC