修正する:

修正する:

鉱山では、Dell latitude e6540WMIショートカットFn+UpFn+はDown機能しません。カーネルに必要なすべてのモジュールをコンパイルしました。

CONFIG_DELL_LAPTOP=m
CONFIG_DELL_WMI=m
CONFIG_DELL_WMI_AIO=m

以前のモデル(Latitude e6520)では、追加設定なしですべてがうまく機能しました。私は両方のラップトップで同じ(カスタムビルド)カーネル3.16.6を使用しています。 e6520ではwmiは機能しますが、e6540では機能しません。

以下で明るさを変更できますecho

echo 35 > /sys/class/backlight/acpi_video0/brightness

rootしかし、明らかにそうです。

Fn+UpFn+を押してもDown値は変わりません/sys/class/backlight/acpi_video0/brightness。以前のモデルでは値が変更されました。

私が気づいた1つは、古いモデルでは最大です15。これは最新モデルでも同様です95。内部的に何か変化があったようです。

私の質問は次のとおりです。新しいノートブックでWMIショートカットキーを操作するにはどうすればよいですか?

私はカスタムカーネル3.16.6でDebian wheezyを使用しています。また、ディストリビューションカーネル3.16(Wheezy-backportsのlinux-image-3.16-0.bpo.2-amd64)を試しましたが、wmiキーも機能しませんでした。

修正する:

私はBIOSにいるときにWMIショートカットが正しく動作することを確認しました!驚くべきことに、Linuxで起動すると機能しません。

以下はdmesgの出力です。言及された内容はdell_wmi: Received unknown WMI event私の問題に関連していますが、WMIショートカットが動作する古いラップトップでも同じメッセージを受け取りました。だからそれだけでは問題にならないようです。

dmesg | egrep -i '(dell|wmi)'
[Tue Apr 15 22:04:30 2014] DMI: Dell Inc. Latitude E6540/05V0V4, BIOS A05 09/03/2013
[Tue Apr 15 22:04:30 2014] ACPI: RSDP 00000000000eee60 00024 (v02 DELL  )
[Tue Apr 15 22:04:30 2014] ACPI: XSDT 00000000d8fe0080 0007C (v01 DELL    CBX3    01072009 AMI  00010013)
[Tue Apr 15 22:04:30 2014] ACPI: FACP 00000000d8fed7e8 0010C (v05 DELL    CBX3    01072009 AMI  00010013)
[Tue Apr 15 22:04:30 2014] ACPI: DSDT 00000000d8fe0188 0D659 (v02 DELL    CBX3    00000014 INTL 20091112)
[Tue Apr 15 22:04:30 2014] ACPI: APIC 00000000d8fed8f8 00072 (v03 DELL    CBX3    01072009 AMI  00010013)
[Tue Apr 15 22:04:30 2014] ACPI: FPDT 00000000d8fed970 00044 (v01 DELL    CBX3    01072009 AMI  00010013)
[Tue Apr 15 22:04:30 2014] ACPI: HPET 00000000d8feed38 00038 (v01 DELL    CBX3    01072009 AMI. 00000005)
[Tue Apr 15 22:04:30 2014] ACPI: MCFG 00000000d8fef148 0003C (v01 DELL    CBX3    01072009 MSFT 00000097)
[Tue Apr 15 22:04:38 2014] dcdbas dcdbas: Dell Systems Management Base Driver (version 5.6.0-3.2)
[Tue Apr 15 22:04:39 2014] wmi: Mapper loaded
[Tue Apr 15 22:04:39 2014] input: Dell WMI hotkeys as /devices/virtual/input/input10
[Wed Apr 16 18:30:04 2014] dell_wmi: Received unknown WMI event (0x0)
[Fri Apr 18 17:09:41 2014] dell_wmi: Received unknown WMI event (0x0)
[Fri Apr 18 17:09:41 2014] dell_wmi: Received unknown WMI event (0x0)
[Fri Apr 18 17:09:49 2014] dell_wmi: Received unknown WMI event (0x0)

アップデート2

WMIモジュールにパッチを適用すると、次のFn+UpおよびFn+メッセージが表示されます。Down

2014-04-18 19:00:49  kernel: [  120.731480] dell_wmi: WMBU = 0002 0010 0048
2014-04-18 19:00:49  kernel: [  120.731496] wmi: DEBUG Event GUID: 9DBB5994-A997-11DA-B012-B622A1EF5492

2014-04-18 19:00:53  kernel: [  123.935400] dell_wmi: WMBU = 0002 0010 0050
2014-04-18 19:00:53  kernel: [  123.935415] wmi: DEBUG Event GUID: 9DBB5994-A997-11DA-B012-B622A1EF5492

アップデート3

また、興味深いのは、Ubuntu 12.04がラップトップにプリインストールされており、wmiキーがUbuntuで動作することです。

ベストアンサー1

この記事では、acpidumpがDSDTに基づいてWMIデバッグを実行する方法について説明します(SSDTはここでは詳しく説明しません)。

\_SB.AMW0Dell ACPIファームウェアのWMIデバイスです。この\EV4メソッドは、\WMNFデバイスから呼び出される唯一のメソッド\_SB.AMW0(関数SWEV=Set?WMIイベント)を呼び出します.\EV4組み込み/キーボードコントローラによって呼び出されるメソッド。

これはSWEVWMIイベント設定であり、CMEVWMIクリアイベントである可能性が高いです。呼び出し後、SWEV変数のビットWMEV(「WMI イベント」?)がセットされます。 WMIはメソッドを呼び出し、対応する戻り値を確認してイベントコードを確認します_WED。この_WEDメソッドでは、実際に visible がWMEV確認され、CMEV呼び出されます。

Method (_WED, 1, NotSerialized)  // _Wxx: Wake Event
{
    WVSP ()
    If (LNotEqual (Arg0, 0xD0))
    {
        WVCU ()
        Return (WMBU) /* \_SB_.AMW0.WMBU */
    }

    If (LEqual (ECD0, Zero))
    {
        WVCU ()
        Return (WMBU) /* \_SB_.AMW0.WMBU */
    }

    If (And (WMEV, 0x0200))
    {
        CWEV (0x0200)
        // WMBU = { 0x0002, 0x0000, 0xE045 }
        WVPT (0x02)
        WVPT (Zero)
        WVPT (0xE045)
    }
    Else
    {
        If (And (WMEV, 0x0100))
        {
            CWEV (0x0100)
            If (ECG4 ())
            {
                WVPT (0x02)
                WVPT (Zero)
                WVPT (0xE043)
            }
            Else
            {
                WVPT (0x02)
                WVPT (Zero)
                WVPT (0xE044)
            }
        }
        Else
        {
            If (And (WMEV, 0x0800))
            {
                Store (EC0A (WMBU), WMBU) /* \_SB_.AMW0.WMBU */
                CWEV (0x0800)
            }
        }
    }

    WVCU ()
    Return (WMBU) /* \_SB_.AMW0.WMBU */
}

ただし、イベントコードが返されない可能性がある2つの状況があります(ただしこれには適用されません)。

  • Arg0(通知ID)が0xD0でない場合。 WMI 説明の説明に示すように、これは真ではありません。

    9DBB5994-A997-11DA-B012-B622A1EF5492:
        object_id: � [D0 00]
        notify_id: D0
        reserved: 00
        instance_count: 1
        flags: 0x8 ACPI_WMI_EVENT 
    
  • \_SB.AMW0.ECD0等しい場合、0Dell WMIコードはWMIイベントを受け取るため、ゼロ以外の引数(WMIイベント)で呼び出されます。WED0これも真ではありません。D0

それでは説明しましょう_WED。戻り値はの値によって異なりますWMEVWVPT返されたバッファに16ビットワードを設定しますWMBU(そして次の呼び出しのためにポインタを進めますWVPT)。次のテーブルを作成できます。

WMEV                returned WMBU   guessed key (see dell-wmi)
0200                0002 0000 E045  KEY_PROG1 or NumLock
0100 (ECG4())       0002 0000 E043  ??
0100 (not ECG4())   0002 0000 E044  ??
0800                ?? (value depends on EC registers)

これで、dell-wmiコードは2番目の単語ではなく0x0010なると予想しています0x0000。この問題をさらにデバッグするには、debug_eventWMIモジュールオプションを有効にする必要があります。

# remove all dependencies of WMI and WMI itself:
modprobe -vr dell-wmi
modprobe wmi debug_event
modprobe dell-wmi

今すぐショートカットを押してカーネルログを見てください。正確な形式が何であるかを知る必要がありますWMBU。最も興味深いキーはWMEV 0x0800です。詳しく見てください。デバッグのために、以下をdell_wmi_notify(後にu16 *buffer_entry = (u16 *)obj->buffer.pointer;)追加することもできます。

pr_info("WMBU = %04x %04x %04x\n", buffer_entry[0], buffer_entry[1], buffer_entry[2]);

おすすめ記事