Hi Rudolf,

I have the ACPI utilities working in QNX as well (i.e. acpidump, acpixtract, iasl, etc). The problem is I don't know what to look for in the FADT.

So far I have only seen this happen on Lenovo based x86 PCs. For example, the one that I have on hand is a Lenovo ThinkBook 14 Gen 2 laptop. If I boot the ThinkBook into QNX, then I can play a beep over the PC speaker just fine. However, after running ACPICA, then I can no longer play a beep over the PC speaker anymore on this device.

How can I check for 8254 clock gating?

delay is a QNX call to sleep for the specified time in ms.

Thanks,
Devin

On Wed, Sep 29, 2021 at 3:58 PM Rudolf Marek <r.marek@assembler.cz> wrote:
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