首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匹配Ralink Wifi卡和加载rt2800usb的Udev规则

匹配Ralink Wifi卡和加载rt2800usb的Udev规则
EN

Stack Overflow用户
提问于 2014-04-28 23:01:05
回答 1查看 2.6K关注 0票数 0

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

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

代码语言:javascript
复制
KERNEL=="wlan*", ATTRS{manufacturer}=="Ralink", NAME="wificard%E{SLOT}"

尽管规则与卡的属性相匹配,但它不加载卡的rt2800usb驱动程序。

我已经用udevadm trigger --attr-match=manufacturer="Ralink"检查过了,我看到了同样的情况,它会获取设备路径,但不会加载驱动程序。

似乎有一条规则可以加载驱动程序,那就是:

代码语言:javascript
复制
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的输出

代码语言:javascript
复制
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==""
EN

回答 1

Stack Overflow用户

发布于 2014-07-09 02:06:15

1)

代码语言:javascript
复制
ACTION=="add", SUBSYSTEM=="net", KERNEL=="wlan*", ATTR{flags}=="0x1002", DRIVERS=="rt2800usb"

2)

代码语言:javascript
复制
ACTION=="add", SUBSYSTEM=="compat_firmware"

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

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

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

"compat_firmware.sh“代码

代码语言:javascript
复制
#!/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中查看我

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23344495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档