Re: [PATCH] Eject button handling in quickstart driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Mar 7, 2012 at 3:02 PM, Rainer Koenig
<Rainer.Koenig@xxxxxxxxxxxxxx> wrote:
> Background: Fujitsu is releasing currently small desktop systems like the
> ESPRIMO Q510 that have no direct accessible eject button for the optical drive.
>
> http://www.fujitsu.com/fts/products/computing/pc/desktops/all-round/esprimo-q510/index.html
>
> Instead of an eject button on the drive the system has a button on the
> mainboard that will send a notify event to the assigned device using the
> following ACPI code:
>
> Scope(\_GPE)
> {
>        Method(_L15, 0)                                         // ODD Eject GPIO handler
>        {
>                 Notify(\_SB.ODDE, 0x80)                         // Notify a ODD Eject Button event
> to the OS
>        }
> } //Scope(\_GPE)
>
> Scope(\_SB)
> {
> //
> // Direct Application Launch Button definition used for Windows Vista, Windows 7, Linux ...
> //
>        Device(ODDE)                                            // Eject Button Device
>        {
>                Name(_HID, EISAID("PNP0C32"))   // HID ACPI button device
>                Name(_UID, 1)                                   // Unique instance # of that device
>                Name(_STA, 0x0F)                                // Device is working properly
>
>                Method(GHID, 0)                                 // Button "role" method
>                {
>                        Return(Buffer(){1})                 // Application Launch Button role
>                }
>        }
>
> Matthew Garrett advised me that there is a quickstart driver in staging that
> was designed to handle the PNP0C32 devices. I had a look at it and it needed
> patching for my purpose because
>
> - the driver only reports the pressed button on wakeup events, but in
>  my case it should report the pressure of the "Optical Disc Drive Eject"
>  button during runtime.
> - The driver was generating character input events when I pressed the button
>  during runtime, resulting in the funny question of the bash open if I want
>  to see all possible completions.
>
> So I made a minor change to this driver to handle my "ODDE" button event as I want
> it and to be minimal intrusive to the remaining functionality.
>
> Of course this needs a small "daemon like skript" that polls the pressed_button file
> frequently and initiates the eject command if the button is pressed. This one
> (modified from the Sourceforge quickstart download) works:
>
> #!/bin/bash
> #
> # Sample application launcher.
> # Angelo Arrifano <miknix@xxxxxxxxx>
> # http://quickstart.sourceforge.net
> #
> # Put this script on ~/.config/autostart.
> #
>
> # Add your button actions here
> LAUNCH["ODDE"]="eject /dev/sr0"
>
> # The sysfs file telling which button was pressed
> PRESSEDFILE="/sys/devices/platform/quickstart/pressed_button"
>
> if [[ ! -e "$PRESSEDFILE" ]]; then
>        exit 1
> fi
>
> while (true) do
> PRESSEDBUTTON="$(cat "$PRESSEDFILE")"
> if [[ "$PRESSEDBUTTON" != "none" ]]; then
>        ${LAUNCH[$PRESSEDBUTTON]};
>        echo -n "none" > "$PRESSEDFILE"
> fi
> sleep 1;
> done
>
> # End of script
>
> Signed-off-by: Rainer Koenig <Rainer.Koenig@xxxxxxxxxxxxxx>
>
> ---
>
> --- upstream/drivers/staging/quickstart/quickstart.c    2012-03-07 14:32:37.000000000 +0100
> +++ new/drivers/staging/quickstart/quickstart.c 2012-03-07 14:50:36.000000000 +0100
> @@ -223,10 +223,16 @@
>        if (event == QUICKSTART_EVENT_WAKE)
>                quickstart_data.pressed = quickstart->btn;
>        else if (event == QUICKSTART_EVENT_RUNTIME) {
> -               input_report_key(quickstart_input, quickstart->btn->id, 1);
> -               input_sync(quickstart_input);
> -               input_report_key(quickstart_input, quickstart->btn->id, 0);
> -               input_sync(quickstart_input);
> +                if (strncasecmp(quickstart->btn->name, "ODDE", 4) == 0) {
> +                  /* ODDE is Optical Disc Drive Eject */
> +                  quickstart_data.pressed = quickstart->btn;
> +                }
> +                else {
> +                 input_report_key(quickstart_input, quickstart->btn->id, 1);
> +                 input_sync(quickstart_input);
> +                 input_report_key(quickstart_input, quickstart->btn->id, 0);
> +                 input_sync(quickstart_input);
> +                }
>        }
>        return;
>  }
>

I'm really not sure it's how this driver is supposed to work.
>From what I understand, it reads a keymap from ACPI, associate button
strings to ids, and when a button is pressed, send the button id using
an input device.
Currently raw id are sent to the input device. I think it may be a
good idea to send "real" keycodes like KEY_EJECTCD for well known keys
(using a kind of keymap).


-- 
Corentin Chary
http://xf.iksaif.net
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux