Hi Devin,
Dne 28. 09. 21 v 21:04 Devin Steffler napsal(a):
Hello, I am using ACPICA to read battery information in QNX. That part is working great so far. However, now some code that is being used to make beeps via the PC speaker stopped working. Strangely, this code stops working on a few devices only after ACPICA runs.You mean same device with same mainboard / BIOS version?
Maybe SMI and/or ACPI bytecode turns on 8254 clock gating? You can
try to disassemble the ACPI DSDT/SSDT bytecode and look for it.
What you can also do, is to try out to send ACPI enable SMI command without
enabling ACPICA and see if it breaks. You can read the I/O port address
and data enable command from FADT. To disassemble the ACPI tables
use acpidump acpixtract and iasl utillites in linux.
What could my ACPICA be doing (or failing to do) that could cause the beeps to stop working with the code below? Is the PIT being disabled somehow? I guess I'll need to learn more about the PIT and how to check its status to see if it's being disabled after ACPICA runs. Here's example code for QNX to generate a beep using the PC speaker: // ----------------------------------------------- #include <sys/neutrino.h> #include <hw/inout.h> #include <unistd.h> int main(void) { ThreadCtl( _NTO_TCTL_IO, 0 ); // get I/O permissions // start a beep int freq = 1000; int scale = 1193046 / freq; out8(0x43, 0xb6); out8(0x42, scale & 0xff); out8(0x42, scale >> 8); out8(0x61, in8(0x61) | 3);you can also try to see if your assembly for out8 is correct and maybe not re-ordered
by the compiler or that your asm clobber list is correct (same for in8)
// let the beep play for a second delay(1000);delay is an OS service right?
Thanks,
Rudolf