如何使用setpci查找并控制wlan卡?

如何使用setpci查找并控制wlan卡?

我的笔记本电脑上有一些功能/热键无法使用,例如控制亮度或打开/关闭 WLAN 卡。幸运的是,我知道如何用 setpci 控制亮度,例如: setpci -s 00:02.0 F4.B=55 其中 55 是所需的亮度级别。

所以问题是,我如何才能找到我的 WLAN 卡并打开/关闭它。

这是 dumpregs 命令输出:

cap pos w name
     00 W VENDOR_ID
     02 W DEVICE_ID
     04 W COMMAND
     06 W STATUS
     08 B REVISION
     09 B CLASS_PROG
     0a W CLASS_DEVICE
     0c B CACHE_LINE_SIZE
     0d B LATENCY_TIMER
     0e B HEADER_TYPE
     0f B BIST
     10 L BASE_ADDRESS_0
     14 L BASE_ADDRESS_1
     18 L BASE_ADDRESS_2
     1c L BASE_ADDRESS_3
     20 L BASE_ADDRESS_4
     24 L BASE_ADDRESS_5
     28 L CARDBUS_CIS
     2c L SUBSYSTEM_VENDOR_ID
     2e W SUBSYSTEM_ID
     30 L ROM_ADDRESS
     3c B INTERRUPT_LINE
     3d B INTERRUPT_PIN
     3e B MIN_GNT
     3f B MAX_LAT
     18 B PRIMARY_BUS
     19 B SECONDARY_BUS
     1a B SUBORDINATE_BUS
     1b B SEC_LATENCY_TIMER
     1c B IO_BASE
     1d B IO_LIMIT
     1e W SEC_STATUS
     20 W MEMORY_BASE
     22 W MEMORY_LIMIT
     24 W PREF_MEMORY_BASE
     26 W PREF_MEMORY_LIMIT
     28 L PREF_BASE_UPPER32
     2c L PREF_LIMIT_UPPER32
     30 W IO_BASE_UPPER16
     32 W IO_LIMIT_UPPER16
     38 L BRIDGE_ROM_ADDRESS
     3e W BRIDGE_CONTROL
     10 L CB_CARDBUS_BASE
     14 W CB_CAPABILITIES
     16 W CB_SEC_STATUS
     18 B CB_BUS_NUMBER
     19 B CB_CARDBUS_NUMBER
     1a B CB_SUBORDINATE_BUS
     1b B CB_CARDBUS_LATENCY
     1c L CB_MEMORY_BASE_0
     20 L CB_MEMORY_LIMIT_0
     24 L CB_MEMORY_BASE_1
     28 L CB_MEMORY_LIMIT_1
     2c W CB_IO_BASE_0
     2e W CB_IO_BASE_0_HI
     30 W CB_IO_LIMIT_0
     32 W CB_IO_LIMIT_0_HI
     34 W CB_IO_BASE_1
     36 W CB_IO_BASE_1_HI
     38 W CB_IO_LIMIT_1
     3a W CB_IO_LIMIT_1_HI
     40 W CB_SUBSYSTEM_VENDOR_ID
     42 W CB_SUBSYSTEM_ID
     44 L CB_LEGACY_MODE_BASE
  01 00 - CAP_PM
  02 00 - CAP_AGP
  03 00 - CAP_VPD
  04 00 - CAP_SLOTID
  05 00 - CAP_MSI
  06 00 - CAP_CHSWP
  07 00 - CAP_PCIX
  08 00 - CAP_HT
  09 00 - CAP_VNDR
  0a 00 - CAP_DBG
  0b 00 - CAP_CCRC
  0c 00 - CAP_HOTPLUG
  0d 00 - CAP_SSVID
  0e 00 - CAP_AGP3
  0f 00 - CAP_SECURE
  10 00 - CAP_EXP
  11 00 - CAP_MSIX
  12 00 - CAP_SATA
  13 00 - CAP_AF
0001 00 - ECAP_AER
0002 00 - ECAP_VC
0003 00 - ECAP_DSN
0004 00 - ECAP_PB
0005 00 - ECAP_RCLINK
0006 00 - ECAP_RCILINK
0007 00 - ECAP_RCECOLL
0008 00 - ECAP_MFVC
000a 00 - ECAP_RBCB
000b 00 - ECAP_VNDR
000d 00 - ECAP_ACS
000e 00 - ECAP_ARI
000f 00 - ECAP_ATS
0010 00 - ECAP_SRIOV

答案1

首先,使用setpci直接设置硬件寄存器和状态可能会有风险,因为硬件访问级别非常低,除非您知道它之前已经尝试过,就像您提到的亮度设置一样。

其次,由于我不知道您的笔记本电脑型号及其组件的技术规格,因此这篇文章仅介绍如何使用lspci和查找信息setpci,您可以根据您的需要进行调整。

第三,所有命令都可以运行,因为它们仅仅查询设备;只有setpci使用 sudo 运行才会真正改变设备设置。

(如果您只是想断开连接而不是真正关闭硬件设备,您可以选择您的 wlan 设备并运行sudo iwconfig wlan0 down。这比尝试使用启用/禁用硬件设备容易得多!setpci


首先运行lspci以查找所有硬件的地址;例如,我的以太网控制器是

02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)

现在使用总线地址/域(02:00:0)并lspci再次运行

sudo lspci -s 02:00.0 -nnvvxxx

您将获得可用信息的完整读数和 PCI 配置空间的十六进制转储:

02:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ [10ec:8139] (rev 10)
    Subsystem: Billionton Systems Inc LNR-100 Family 10/100 Base-TX Ethernet [14cb:0200]
    Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
    Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
    Latency: 64 (8000ns min, 16000ns max)
    Interrupt: pin A routed to IRQ 17
    Region 0: I/O ports at 2400 [size=256]
    Region 1: Memory at 44000000 (32-bit, non-prefetchable) [size=512]
    Capabilities: [50] Power Management version 2
        Flags: PMEClk- DSI- D1+ D2+ AuxCurrent=0mA PME(D0-,D1+,D2+,D3hot+,D3cold-)
        Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
    Kernel driver in use: 8139too
    Kernel modules: 8139too, 8139cp
00: ec 10 39 81 07 00 90 02 10 00 00 02 00 40 00 00
10: 01 24 00 00 00 00 00 44 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 02 01 00 00 cb 14 00 02
30: 00 00 00 00 50 00 00 00 00 00 00 00 11 01 20 40
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

十六进制转储仍在继续,但我已经将其缩短了;您将需要设备的进一步技术规格才能使这些值具有任何意义。

现在,setpci --dumpregs您可以了解常规硬件寄存器,然后使用它setpci来查询设备地址(02:00.0),例如使用以下寄存器之一:

setpci -s 02:00.0 STATUS

返回一个值。这可以与列表中的其他寄存器重复,但您仍然需要同时参考有关设备的详细技术信息。

总之,您需要参考 WLAN 卡的技术规格(可能还有 PCI 规格),以便找到并选择正确的寄存器,然后参考lspcisetpci数据,以便准备sudo setpci启用/禁用卡的命令设置。如果没有深入的规格说明,就不可能找到正确的寄存器,而且通常很难找到正确的寄存器。但是,我希望这个简短的讨论能帮助您找到正确的方向。

相关内容