linux - udev规则匹配雷凌wifi卡加载rt2800usb

标签 linux linux-kernel linux-device-driver embedded-linux udev

我一直在研究一个简单的 Linux 固件来加载需要驱动程序 rt2800usb 的 Ralink wifi 卡。固件在相关位置包含文件 rt2800usb,启动 udev 守护进程并具有匹配卡属性的规则。

这是我最初用来匹配卡片的规则:

KERNEL=="wlan*", ATTRS{manufacturer}=="Ralink", NAME="wificard%E{SLOT}"

虽然规则匹配卡的属性,但它不会加载卡的 rt2800usb 驱动程序。

我已经使用 udevadm trigger --attr-match=manufacturer="Ralink" 检查了这一点,我看到了同样的事情,它获取了设备路径,但没有加载驱动程序.

似乎有一个加载驱动程序的规则,那就是:

udevadm trigger --verbose --parent-match=/sys/devices/pci0000\:00/0000\:00\:0f.5/usb1/1-2/1-2\:1.0/

但是,就我对 udev 的理解而言,此规则会触发任何插入该特定 USB 插槽的设备。我正在尝试调整此规则以使其仅适用于 Ralink 卡。我尝试添加 --attr-match=manufacturer="Ralink" 但规则不再匹配。

如果有人能帮助我阐明这一点,我将不胜感激,特别是为什么一些 udev 比赛会启动驱动程序而其他人不会?

这也是 udevadm info --attribute-walk udevadm info --attribute-walk --path=/sys/devices/pci0000\:00/0000\:00\:0f.5/usb1 的输出/1-2/1-2\:1.0:

looking at device '/devices/pci0000:00/0000:00:0f.5/usb1/1-2/1-2:1.0':
KERNEL=="1-2:1.0"
SUBSYSTEM=="usb"
DRIVER=="rt2800usb"
ATTR{bInterfaceClass}=="ff"
ATTR{bInterfaceSubClass}=="ff"
ATTR{bInterfaceProtocol}=="ff"
ATTR{bNumEndpoints}=="07"
ATTR{supports_autosuspend}=="0"
ATTR{bAlternateSetting}==" 0"
ATTR{bInterfaceNumber}=="00"
ATTR{interface}=="1.0"

looking at parent device '/devices/pci0000:00/0000:00:0f.5/usb1/1-2':
KERNELS=="1-2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{devpath}=="2"
ATTRS{idVendor}=="148f"
ATTRS{speed}=="480"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{busnum}=="1"
ATTRS{devnum}=="2"
ATTRS{configuration}==""
ATTRS{bMaxPower}=="450mA"
ATTRS{authorized}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bNumConfigurations}=="1"
ATTRS{maxchild}=="0"
ATTRS{bcdDevice}=="0101"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{quirks}=="0x0"
ATTRS{serial}=="1.0"
ATTRS{version}==" 2.00"
ATTRS{urbnum}=="2719"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="Ralink"
ATTRS{removable}=="unknown"
ATTRS{idProduct}=="5370"
ATTRS{bDeviceClass}=="00"
ATTRS{product}=="802.11 n WLAN"

looking at parent device '/devices/pci0000:00/0000:00:0f.5/usb1':
KERNELS=="usb1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{devpath}=="0"
ATTRS{idVendor}=="1d6b"
ATTRS{speed}=="480"
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{authorized_default}=="1"
ATTRS{busnum}=="1"
ATTRS{devnum}=="1"
ATTRS{configuration}==""
ATTRS{bMaxPower}=="0mA"
ATTRS{authorized}=="1"
ATTRS{bmAttributes}=="e0"
ATTRS{bNumConfigurations}=="1"
ATTRS{maxchild}=="4"
ATTRS{bcdDevice}=="0312"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{quirks}=="0x0"
ATTRS{serial}=="0000:00:0f.5"
ATTRS{version}==" 2.00"
ATTRS{urbnum}=="40"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="Linux 3.12.9 ehci_hcd"
ATTRS{removable}=="unknown"
ATTRS{idProduct}=="0002"
ATTRS{bDeviceClass}=="09"
ATTRS{product}=="EHCI Host Controller"

looking at parent device '/devices/pci0000:00/0000:00:0f.5':
KERNELS=="0000:00:0f.5"
SUBSYSTEMS=="pci"
DRIVERS=="ehci-pci"
ATTRS{irq}=="12"
ATTRS{subsystem_vendor}=="0x1022"
ATTRS{broken_parity_status}=="0"
ATTRS{class}=="0x0c0320"
ATTRS{companion}==""
ATTRS{consistent_dma_mask_bits}=="32"
ATTRS{dma_mask_bits}=="32"
ATTRS{local_cpus}=="1"
ATTRS{device}=="0x2095"
ATTRS{uframe_periodic_max}=="100"
ATTRS{enable}=="1"
ATTRS{msi_bus}==""
ATTRS{local_cpulist}=="0"
ATTRS{vendor}=="0x1022"
ATTRS{subsystem_device}=="0x2095"

looking at parent device '/devices/pci0000:00':
KERNELS=="pci0000:00"
SUBSYSTEMS==""
DRIVERS==""

最佳答案

1)

ACTION=="add", SUBSYSTEM=="net", KERNEL=="wlan*", ATTR{flags}=="0x1002", DRIVERS=="rt2800usb"

2)

ACTION=="add", SUBSYSTEM=="compat_firmware"

1) 此规则检测到 USB 适配器的插入但未链接。我将此规则用于重新启动网络、udhcpd 和 hostapd(用于主模式)。重新启动网络服务导致固件加载和 wlan 获取 IP 地址;-)

2) 我使用从 Compat Driver 编译的驱动程序,固件加载成功:

SUBSYSTEM=="compat_firmware", ACTION=="add", RUN+="compat_firmware.sh"

“compat_firmware.sh”的代码
#!/bin/sh -e

FIRMWARE_DIRS="/lib/firmware/updates/$(uname -r) /lib/firmware/updates \
               /lib/firmware/$(uname -r) /lib/firmware"

err() {
        echo "$@" >&2
        logger -t "${0##*/}[$$]" "$@" 2>/dev/null || true
}

if [ ! -e /sys$DEVPATH/loading ]; then
        err "udev firmware loader misses sysfs directory"
        exit 1
fi

for DIR in $FIRMWARE_DIRS; do
        [ -e "$DIR/$FIRMWARE" ] || continue
        echo 1 > /sys$DEVPATH/loading
        cat "$DIR/$FIRMWARE" > /sys$DEVPATH/data
        echo 0 > /sys$DEVPATH/loading
        exit 0
done

echo -1 > /sys$DEVPATH/loading
err "Cannot find  firmware file '$FIRMWARE'"
mkdir -p /dev/.udev/firmware-missing
file=$(echo "$FIRMWARE" | sed 's:/:\\x2f:g')
ln -s -f "$DEVPATH" /dev/.udev/firmware-missing/$file
exit 1

对不起我的英语

在 G+ GustavoReyes71 见我

关于linux - udev规则匹配雷凌wifi卡加载rt2800usb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23344495/

相关文章:

c - 为什么会触发 SIGSEGV?

linux - 如何在 Linux 下为新创建的网络 namespace 设置单独的内核参数?

c - 如何在内核空间写入数据包

linux - 从 Web 仪表板管理 Spring Boot 应用程序

php - 如何知道一个命令已执行并完成执行另一个命令(ssh - php)

linux - 如何从用户空间访问输入设备驱动程序

c - Linux : watchdog node is not created in/dev directory

linux-kernel - 为什么/proc/iomem在64位linux中仅显示零而不是地址?

python - 安装 Pillow 错误 : Setup script exited with error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

linux - 使用 sed 过滤页面失败