고쳐 쓰다:

고쳐 쓰다:

광산에서는 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. 이전 모델에서는 값이 변경되었습니다.

내가 알아차린 한 가지는 구형 모델에서는 최대 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+ UpFn+ 메시지가 나타납니다.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 */
}

그러나 이벤트 코드가 반환되지 않을 수 있는 두 가지 상황이 있습니다(그러나 여기에는 적용되지 않음).

  • 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 이벤트를 수신하므로 0이 아닌 인수(WMI 이벤트 )로 호출됩니다. WED0이 역시 true가 아닙니다.D0

그럼 계속 설명드리겠습니다 _WED. 이제 반환 값은 의 값에 따라 달라집니다 WMEV. WVPT반환된 버퍼에 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 코드에서는 두 번째 단어가 가 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]);

답변2

당신은 설치할 수 있습니다x백라이트, 밝기 관리 유틸리티랜드 R. 그런 다음 활성화하려면 두 개의 키에 바인딩된 간단한 스크립트를 사용하세요.

#!/usr/bin/env bash
up() {
    xbacklight -inc 10
}

down() {
    xbacklight -dec 10
}

notify() {
    bright=$(</sys/class/backlight/acpi_video0/actual_brightness)
    if [[ "$bright" -eq 95 ]]; then
        score="100%"
    else score="$(( $bright * 100 / 95 ))"
    fi
    printf '%s\n' "Backlight set to ${score}%" | dzen2 -p 3
}

if [[ $1 = up ]]; then
    up && notify
elif [[ $1 = down ]]; then
    down && notify
fi

알림 방법을 일반 설정에서 사용하는 방법으로 바꾸십시오(예: ) notify-send.

관련 정보