iPXE
Functions
pit8254.c File Reference

8254 Programmable Interval Timer More...

#include <assert.h>
#include <ipxe/io.h>
#include <ipxe/pit8254.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
void pit8254_speaker_delay (unsigned int ticks)
 Delay for a fixed number of timer ticks using the speaker channel.

Detailed Description

8254 Programmable Interval Timer

Definition in file pit8254.c.


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )
void pit8254_speaker_delay ( unsigned int  ticks)

Delay for a fixed number of timer ticks using the speaker channel.

Parameters:
ticksNumber of timer ticks for which to delay

Definition at line 41 of file pit8254.c.

References assert, cmd, high, inb(), low, outb(), PIT8254_CH_SPKR, PIT8254_CMD, PIT8254_CMD_ACCESS_LOHI, PIT8254_CMD_BINARY, PIT8254_CMD_CHANNEL, PIT8254_CMD_OP_TERMINAL, PIT8254_DATA, PIT8254_SPKR, PIT8254_SPKR_ENABLE, PIT8254_SPKR_GATE, and PIT8254_SPKR_OUT.

Referenced by __attribute__().

                                                  {
        uint8_t spkr;
        uint8_t cmd;
        uint8_t low;
        uint8_t high;

        /* Sanity check */
        assert ( ticks <= 0xffff );

        /* Disable speaker, set speaker channel gate input high */
        spkr = inb ( PIT8254_SPKR );
        spkr &= ~PIT8254_SPKR_ENABLE;
        spkr |= PIT8254_SPKR_GATE;
        outb ( spkr, PIT8254_SPKR );

        /* Program speaker channel to "interrupt" on terminal count */
        cmd = ( PIT8254_CMD_CHANNEL ( PIT8254_CH_SPKR ) |
                PIT8254_CMD_ACCESS_LOHI | PIT8254_CMD_OP_TERMINAL |
                PIT8254_CMD_BINARY );
        low = ( ( ticks >> 0 ) & 0xff );
        high = ( ( ticks >> 8 ) & 0xff );
        outb ( cmd, PIT8254_CMD );
        outb ( low, PIT8254_DATA ( PIT8254_CH_SPKR ) );
        outb ( high, PIT8254_DATA ( PIT8254_CH_SPKR ) );

        /* Wait for channel to "interrupt" */
        do {
                spkr = inb ( PIT8254_SPKR );
        } while ( ! ( spkr & PIT8254_SPKR_OUT ) );
}