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