ACPI_THINKPAD(4)

NAME
acpi_thinkpad - ThinkPad ACPI extras driver

SYNOPSIS
To compile this driver into the kernel, place the following line in your kernel configuration file:

device acpi_thinkpad

Alternatively, to load the driver as a module at boot time, place the following line in loader.conf(5):

    acpi_thinkpad_load="YES"

DESCRIPTION
The acpi_thinkpad driver provides support for hotkeys and other components of ThinkPad laptops. The main purpose of this driver is to provide an interface, accessible via sysctl(8) and devd(8), through which applications can determine the status of various laptop components.

While the sysctl(8) interface is enabled automatically after loading the driver, the devd(8) interface has to be enabled explicitly, as it may alter the default action of certain keys. This is done by setting the events sysctl as described below. Specifying which keys should generate events is done by setting a bitmask, whereas each bit represents one key or key combination. This bitmask, accessible via the eventmask sysctl, is set to availmask by default, a value representing all possible keypress events on the specific ThinkPad model.

  devd 8 Events
Hotkey events received by devd(8) provide the following information:

system
    "ACPI"
subsystem
    "THINKPAD"
type
    The source of the event in the ACPI namespace. The value depends on the model.
notify
    Event code (see below).

Depending on the ThinkPad model, event codes may vary. On a ThinkPad T41p these are as follows:

0x01
    Fn + F1
0x02
    Fn + F2
0x03
    Fn + F3 (LCD backlight)
0x04
    Fn + F4 (Suspend to RAM)
0x05
    Fn + F5 (Bluetooth)
0x06
    Fn + F6
0x07
    Fn + F7 (Screen expand)
0x08
    Fn + F8
0x09
    Fn + F9
0x0a
    Fn + F10
0x0b
    Fn + F11
0x0c
    Fn + F12 (Suspend to disk)
0x0d
    Fn + Backspace
0x0e
    Fn + Insert
0x0f
    Fn + Delete
0x10
    Fn + Home (Brightness up)
0x11
    Fn + End (Brightness down)
0x12
    Fn + PageUp (ThinkLight)
0x13
    Fn + PageDown
0x14
    Fn + Space (Zoom)
0x15
    Volume Up
0x16
    Volume Down
0x17
    Mute
0x18
    Access THINKPAD Button

  led 4 Interface
The acpi_thinkpad driver provides a led(4) interface for the ThinkLight. The ThinkLight can be made to blink by writing ASCII strings to the /dev/led/thinklight device.

SYSCTL VARIABLES
The following sysctls are currently implemented:

dev.acpi_thinkpad.<node>.initialmask
    (read-only) Bitmask of ACPI events before the acpi_thinkpad driver was loaded.

dev.acpi_thinkpad.<node>.availmask
    (read-only) Bitmask of all supported ACPI events.

dev.acpi_thinkpad.<node>.events
    Enable ACPI events and set the eventmask to availmask. Without the acpi_thinkpad driver being loaded, only the Fn+F4 button generates an ACPI event.

dev.acpi_thinkpad.<node>.eventmask
    Sets the ACPI events which are reported to devd(8). Fn+F3, Fn+F4 and Fn+F12 always generate ACPI events, regardless which value eventmask has. Depending on the ThinkPad model, the meaning of different bits in the eventmask may vary. On a ThinkPad T41p this is a bitwise OR of the following:

    1   Fn + F1
    2   Fn + F2
    4   Fn + F3 (LCD backlight)
    8   Fn + F4 (Suspend to RAM)
    16  Fn + F5 (Bluetooth)
    32  Fn + F6
    64  Fn + F7 (Screen expand)
    128 Fn + F8
    256 Fn + F9
    512 Fn + F10
    1024
        Fn + F11
    2048
        Fn + F12 (Suspend to disk)
    4096
        Fn + Backspace
    8192
        Fn + Insert
    16384
        Fn + Delete
    32768
        Fn + Home (Brightness up)
    65536
        Fn + End (Brightness down)
    131072
        Fn + PageUp (ThinkLight)
    262144
        Fn + PageDown
    524288
        Fn + Space (Zoom)
    1048576
        Volume Up
    2097152
        Volume Down
    4194304
        Mute
    8388608
        Access THINKPAD Button

dev.acpi_thinkpad.<node>.hotkey
    (read-only) Status of several buttons. Every time a button is pressed, the respecting bit is toggled. It is a bitwise OR of the following:

    1   Home Button
    2   Search Button
    4   Mail Button
    8   Access THINKPAD Button
    16  Zoom
    32  Wireless LAN Button
    64  Video Button
    128 Hibernate Button
    256 ThinkLight Button
    512 Screen Expand
    1024
        Brightness Up/Down Button
    2048
        Volume Up/Down/Mute Button

dev.acpi_thinkpad.<node>.lcd_brightness
    Current brightness level of the display.

dev.acpi_thinkpad.<node>.volume
    Speaker volume.

dev.acpi_thinkpad.<node>.mute
    Indicates, whether the speakers are muted or not.

dev.acpi_thinkpad.<node>.mic_mute
    Indicates, whether the microphone led (present on some model) is on or not. Note that this does not mean that the microphone input is muted.

dev.acpi_thinkpad.<node>.thinklight
    Indicates, whether the ThinkLight keyboard light is activated or not.

dev.acpi_thinkpad.<node>.bluetooth
    Toggle Bluetooth chip activity.

dev.acpi_thinkpad.<node>.wlan
    (read-only) Indicates whether the WLAN chip is active or not.

dev.acpi_thinkpad.<node>.fan
    Indicates whether the fan is in automatic (1) or manual (0) mode. Default is automatic mode. This sysctl should be used with extreme precaution, since disabling automatic fan control might overheat the ThinkPad and lead to permanent damage if the fan_level is not set accordingly.

dev.acpi_thinkpad.<node>.fan_level
    Indicates at what speed the fan should run when being in manual mode. Values are ranging from 0 (off) to 7 (max). The resulting speed differs from model to model. On a T41p this is as follows:

    0   off
    1, 2
        ~3000 RPM
    3, 4, 5
        ~3600 RPM
    6, 7
        ~4300 RPM

dev.acpi_thinkpad.<node>.fan_speed
    (read-only) Fan speed in rounds per minute. A few older ThinkPads report the fan speed in levels ranging from 0 (off) to 7 (max).

hw.acpi.thermal
    (read-only) Shows the readings of up to eight different temperature sensors. Most ThinkPads include six or more temperature sensors but only expose the CPU temperature through acpi_thermal(4). Some ThinkPads have the below sensor layout which might vary depending on the specific model:

    1.  CPU
    2.  Mini PCI Module
    3.  HDD
    4.  GPU
    5.  Built-in battery
    6.  UltraBay battery
    7.  Built-in battery
    8.  UltraBay battery

dev.acpi_thinkpad.<node>.handlerevents
    devd(8) events handled by acpi_thinkpad when events is set to 1. Events are specified as a whitespace-separated list of event code in hexadecimal or decimal form. Note that the event may be handled twice (eg. Brightness up/down) if ACPI BIOS already handled the event.

hw.sensors.acpi_thinkpad0.tempX
    Show the readings of up to eight different temperature sensors.

hw.sensors.acpi_thinkpad0.fan0
    Fan speed in rounds per minute.

Defaults for these sysctls can be set in sysctl.conf(5). Sensors can be monitored by sensorsd(8).

FILES

/dev/led/thinklight
    ThinkLight led(4) device node

EXAMPLES
The following can be added to devd.conf(5) in order to pass button events to a /usr/local/sbin/acpi_oem_exec.sh script:

    notify 10 {
            match "system"          "ACPI";
            match "subsystem"       "THINKPAD";
            action "/usr/local/sbin/acpi_oem_exec.sh $notify thinkpad";
    };

A possible /usr/local/sbin/acpi_oem_exec.sh script might look like:

    #!/bin/sh
    #
    if [ "$1" = "" -o "$2" = "" ]
    then
            echo "usage: $0 notify oem_name"
            exit 1
    fi
    NOTIFY=`echo $1`
    LOGGER="logger"
    CALC="bc"
    BC_PRECOMMANDS="scale=2"
    ECHO="echo"
    CUT="cut"
    MAX_LCD_BRIGHTNESS=7
    MAX_VOLUME=14
    OEM=$2
    DISPLAY_PIPE=/tmp/acpi_${OEM}_display
    case ${NOTIFY} in
            0x05)
                    LEVEL=`sysctl -n dev.acpi_${OEM}.0.bluetooth`
                    if [ "$LEVEL" = "1" ]
                    then
                            sysctl dev.acpi_${OEM}.0.bluetooth=0
                            MESSAGE="bluetooth disabled"
                    else
                            sysctl dev.acpi_${OEM}.0.bluetooth=1
                            MESSAGE="bluetooth enabled"
                    fi
                    ;;
            0x10|0x11)
                    LEVEL=`sysctl -n dev.acpi_${OEM}.0.lcd_brightness`
                    PERCENT=`${ECHO} "${BC_PRECOMMANDS} ; \
                             ${LEVEL} / ${MAX_LCD_BRIGHTNESS} * 100" |\
                             ${CALC} | ${CUT} -d . -f 1`
                    MESSAGE="brightness level ${PERCENT}%"
                    ;;
            0x12)
                    LEVEL=`sysctl -n dev.acpi_${OEM}.0.thinklight`
                    if [ "$LEVEL" = "1" ]
                    then
                            MESSAGE="thinklight enabled"
                    else
                            MESSAGE="thinklight disabled"
                    fi
                    ;;
            0x15|0x16)
                    LEVEL=`sysctl -n dev.acpi_${OEM}.0.volume`
                    PERCENT=`${ECHO} "${BC_PRECOMMANDS} ; \
                            ${LEVEL} / ${MAX_VOLUME} * 100" | \
                             ${CALC} | ${CUT} -d . -f 1`
                    MESSAGE="volume level ${PERCENT}%"
                    ;;
            0x17)
                    LEVEL=`sysctl -n dev.acpi_${OEM}.0.mute`
                    if [ "$LEVEL" = "1" ]
                    then
                            MESSAGE="volume muted"
                    else
                            MESSAGE="volume unmuted"
                    fi
                    ;;
            0x1b)
                    LEVEL=`sysctl -n dev.acpi_${OEM}.0.mic_led`
                    if [ $LEVEL -eq 0 ]; then
                            sysctl dev.acpi_${OEM}.0.mic_led=1
                            mixer rec 0
                    fi
                    if [ $LEVEL -eq 1 ]; then
                            sysctl dev.acpi_${OEM}.0.mic_led=0
                            mixer rec 30
                    fi
                    ;;
            *)
                    ;;
    esac
    ${LOGGER} ${MESSAGE}
    if [ -p ${DISPLAY_PIPE} ]
    then
            ${ECHO} ${MESSAGE} >> ${DISPLAY_PIPE} &
    fi
    exit 0

The following example specify that event code 0x04 (Suspend to RAM), 0x10 (Brightness up) and 0x11 (Brightness down) are handled by acpi_thinkpad.

    sysctl dev.acpi_thinkpad.0.handlerevents='0x04 0x10 0x11'

in sysctl.conf(5):

    hw.acpi.thinkpad.handlerevents=0x04\ 0x10\ 0x11

SEE ALSO
acpi(4), led(4), sysctl.conf(5), devd(8), sensorsd(8), sysctl(8)

HISTORY
The acpi_thinkpad device driver first appeared in FreeBSD 6.0 and was imported into DragonFly 2.1.

AUTHORS
-nosplit The acpi_thinkpad driver was written by Takanori Watanabe <takawata@FreeBSD.org> and later mostly rewritten by Markus Brueffer <markus@FreeBSD.org>. This manual page was written by Christian Brueffer <brueffer@FreeBSD.org> and Markus Brueffer <markus@FreeBSD.org>.