상황에 맞게 yocto로 만든 자체 Linux 이미지를 실행하고 SD 카드에서 부팅하는 stm32mp135d odyssey 보드가 있습니다. 저렴한 ath9k Wi-Fi USB 동글을 연결했지만 동글을 뽑았다가 다시 연결할 때까지 Wi-Fi 인터페이스가 표시되지 않는 성가신 문제에 직면했습니다.
재부팅 후 문제 해결에 도움이 되는 몇 가지 결과가 표시됩니다.
만약을 대비해 커널 정보가 중요합니다.
root@stm32mp1:~# uname -a
Linux stm32mp1 5.15.67 #1 SMP PREEMPT Fri Mar 15 01:01:46 UTC 2024 armv7l GNU/Linux
lsusb 출력.
root@stm32mp1:~# lsusb -v
Bus 002 Device 002: ID 040d:3801 VIA Technologies, Inc. VIA USB2.0 WLAN
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 255 Vendor Specific Class
bDeviceSubClass 255 Vendor Specific Subclass
bDeviceProtocol 255 Vendor Specific Protocol
bMaxPacketSize0 64
idVendor 0x040d VIA Technologies, Inc.
idProduct 0x3801
bcdDevice 1.08
iManufacturer 16 VIA TECH
iProduct 32 VIA USB2.0 WLAN
iSerial 48 12345
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x003c
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 500mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 6
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 0
bInterfaceProtocol 0
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x01 EP 1 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x82 EP 2 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x83 EP 3 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x04 EP 4 OUT
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x05 EP 5 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x06 EP 6 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Device Qualifier (for other device speed):
bLength 10
bDescriptorType 6
bcdUSB 2.00
bDeviceClass 255 Vendor Specific Class
bDeviceSubClass 255 Vendor Specific Subclass
bDeviceProtocol 255 Vendor Specific Protocol
bMaxPacketSize0 64
bNumConfigurations 1
Device Status: 0x0000
(Bus Powered)
인터페이스가 표시되지 않습니다
root@stm32mp1:~# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: end0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
link/ether aa:ce:65:8a:8d:22 brd ff:ff:ff:ff:ff:ff
3: end1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
link/ether 62:7b:ce:1d:79:c4 brd ff:ff:ff:ff:ff:ff
4: usb0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
link/ether 96:9d:05:79:2b:95 brd ff:ff:ff:ff:ff:ff
dmesg 출력에 ath9k 펌웨어 로드에 실패했음이 표시됩니다.
root@stm32mp1:~# dmesg | grep -i "ath9k"
[ 0.351901] usbcore: registered new interface driver ath9k_htc
[ 4.369966] usb 2-1: ath9k_htc: Firmware ath9k_htc/htc_9271-1.4.0.fw requested
[ 4.387041] usb 2-1: Direct firmware load for ath9k_htc/htc_9271-1.4.0.fw failed with error -2
[ 4.401769] usb 2-1: ath9k_htc: Firmware htc_9271.fw requested
[ 4.421233] usb 2-1: ath9k_htc: Failed to get firmware htc_9271.fw
[ 4.427899] usb 2-1: ath9k_htc: USB layer deinitialized
뒤쪽에모듈을 분리했다가 다시 연결했는데 dmesg에 다음 메시지가 표시되었습니다.
[ 467.033794] usb 2-1: ath9k_htc: Firmware ath9k_htc/htc_9271-1.4.0.fw requested
[ 467.334719] usb 2-1: ath9k_htc: Transferred FW: ath9k_htc/htc_9271-1.4.0.fw, size: 51008
[ 467.585338] ath9k_htc 2-1:1.0: ath9k_htc: HTC initialized with 33 credits
[ 467.854226] ath9k_htc 2-1:1.0: ath9k_htc: FW Version: 1.4
[ 467.858250] ath9k_htc 2-1:1.0: FW RMW support: On
[ 468.025043] ath9k_htc 2-1:1.0 wlu1: renamed from wlan0
인터페이스가 나타납니다
5: wlu1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 00:12:7b:21:6f:39 brd ff:ff:ff:ff:ff:ff
이 시점에서는 아무런 문제 없이 인터페이스에서 Hostapd 및 wpa_supplicant를 사용할 수도 있습니다. 처음에는 수동으로 재설정하면 됩니다. 이것이 임베디드 장치라는 점을 감안할 때 최종 제품에서는 이 작업을 수행하고 싶지 않습니다. dmesg 출력에 따르면 부팅 프로세스 초기에 ath9k 펌웨어를 로드하려고 시도하여 실패할 수 있으므로 지연하는 방법이 필요하거나 Linux 부팅 후 자동으로 재설정하는 방법이 필요합니다. 이 작업을 수행하기 위해 udev 규칙을 사용하여 뭔가를 할 수 있다는 막연한 생각이 있습니까? 하지만 잘 모르겠습니다.
내가 시도한 것들
- 표시된 대로 프로그래밍 방식으로 USB 장치를 재설정합니다.여기
modprobe ath9k
modprobe ath9k_htc
답변1
이 질문에 스스로 답해보세요.
내 해결책은 부팅이 완료된 후 USB 장치를 재설정하는 것이었고 나에게 효과가 있었던 것은 그림과 같습니다.이것우편 엽서.
거기 사용자가 이것을
sudo sh -c "echo 0 > /sys/bus/usb/devices/1-4.6/authorized"
sudo sh -c "echo 1 > /sys/bus/usb/devices/1-4.6/authorized"
이 스크립트(또는 다른 방법)를 사용하여 재설정하려는 Wi-Fi 장치의 /sys 경로를 찾을 수 있습니다.
for X in /sys/bus/usb/devices/*; do
echo "$X"
cat "$X/idVendor" 2>/dev/null
cat "$X/idProduct" 2>/dev/null
echo
done
더 우아한 해결책이 있을 수 있지만 제 목적에는 이것이 효과적입니다.