Hi Dave :-)
> I'd like to be able to detect that the power button on the computer
> has been pressed while running freedos. (Also this would apply to the
> powerdown event from the QEMU emulator)
> I know there is a power management utility from Eric but it doesn't
> seem to monitor for the power button.
The power button can indeed be switched between being a power button
and just generating an ACPI event. You can get the ACPI specs from
their page, but try to read only the most suitable details... ;-).
Even the ACPI 1.0 specs already were 400 pages back in 1999, now you
have the ACPI 4.0 specs here: www.acpi.info/DOWNLOADS/ACPIspec40.pdf
You can have either one or two buttons for power and sleep, see the
PWRBTN and PWR_BUTTON things... You can read out PWRBTN_STS in the
PM1 STS register and decide whether or not it creates an event via
PWRBTN_EN in the PM1 EN register. If the user presses the button,
the bit is set. If the event is enabled, a special interrupt then
is generated. Unless you have a fully ACPI operating system, this
will just tell the BIOS to do whatever you selected in BIOS / CMOS
setup: Either power off or suspend or hibernate your computer. The
latter two will only work if your BIOS has a sufficiently "deep"
understanding of how to hibernate and wake up all your hardware.
If you keep the button pressed for several seconds, you always do
get a power off in hardware. This is for the case that your ACPI
setup is messed up or your ACPI driver crashed :-).
You can do very fancy things with ACPI, in particular you can read
the DSDT to learn how the BIOS suggests you to treat all details
of your hardware power management in all situations, but of course
you could also just disable the event (PWRBTN_EN) and poll the bit
of PWRBRN_STS from time to time to detect a power button press, do
some shutdown stuff then, and use state transition as shown in the
FDAPM POWEROFF and PUREOFF to then actually switch off electricity.
Still, FDAPM takes quite some effort to flush caches etc etc but in
the end it is just that: A few I/O commands on the ACPI port, the
power supply gets a signal and switches off. The BIOS or mainboard
do not really care whether you cleanly shut down all components. Of
course it is somehow more polite if you do ;-). The I/O thing is in
principle sending the right SLP_TYP value to PM1 CNT... Three bits,
so 8 values are possible. Which is which is defined in ACPI tables,
for example in _S5 and _S4 sections. You could also try manually,
but take care to avoid states with fan off and CPU on, and do not
confuse power off with suspend to RAM ;-). A Wattmeter for your
AC socket is a good idea. Be prepared to use the override if you
get stuck in unpleasant state: Keep the button pressed to poweroff.
Your computer may also have a separate button for sleep, which can
be standby, suspend or hibernate depending on your OS and / or the
abilities of your hardware. If you do have it, it is definitely a
good target for experiments as you can play with polling the sleep
button without having to mess up the power button :-). You could
for example make a tool which just shuts down DOS and does a plain
poweroff when a sleep button press is detected. Nobody tells you
that the sleep button actually has to do anything sleep related.
I think this should help to get you started - even FDAPM does some
touching of the PWRBTN bits. While FDAPM updates the bits to make
sure that the power button does have effect, you can update them
in the opposite direction to make sure that the button only sets a
flag bit without causing actual power off itself :-).
PS: Sometimes you may want to manipulate SCI_EN to switch between
BIOS oriented and operating system oriented ACPI modes, but it is
often sufficient to leave things as they are. After all, the BIOS
does nice things for you such as throttling fans per temperature.
The Planet: dedicated and managed hosting, cloud storage, colocation
Stay online with enterprise data centers and the best network in the business
Choose flexible plans and management services without long-term contracts
Personal 24x7 support from experience hosting pros just a phone call away.
Freedos-user mailing list