Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117/* * PROJECT: ReactOS HAL * LICENSE: BSD - See COPYING.ARM in the top level directory * FILE: hal/halx86/generic/beep.c * PURPOSE: Speaker support (beeping) * PROGRAMMERS: ReactOS Portable Systems Group */
/* INCLUDES ******************************************************************/
#include <hal.h>#define NDEBUG#include <debug.h>
/* FUNCTIONS *****************************************************************/
/* * @implemented */BOOLEANNTAPIHalMakeBeep(IN ULONG Frequency){ SYSTEM_CONTROL_PORT_B_REGISTER SystemControl; TIMER_CONTROL_PORT_REGISTER TimerControl; ULONG Divider; BOOLEAN Result = FALSE;
// // Acquire CMOS Lock // HalpAcquireCmosSpinLock();
// // Turn the timer off by disconnecting its output pin and speaker gate // SystemControl.Bits = __inbyte(SYSTEM_CONTROL_PORT_B); SystemControl.SpeakerDataEnable = FALSE; SystemControl.Timer2GateToSpeaker = FALSE; __outbyte(SYSTEM_CONTROL_PORT_B, SystemControl.Bits);
// // Check if we have a frequency // if (Frequency) { // // Set the divider // Divider = PIT_FREQUENCY / Frequency;
// // Check if it's too large // if (Divider <= 0x10000) { // // Program the PIT for binary mode // TimerControl.BcdMode = FALSE;
// // Program the PIT to generate a square wave (Mode 3) on channel 2. // Channel 0 is used for the IRQ0 clock interval timer, and channel // 1 is used for DRAM refresh. // // Mode 2 gives much better accuracy, but generates an output signal // that drops to low for each input signal cycle at 0.8381 useconds. // This is too fast for the PC speaker to process and would result // in no sound being emitted. // // Mode 3 will generate a high pulse that is a bit longer and will // allow the PC speaker to notice. Additionally, take note that on // channel 2, when input goes low the counter will stop and output // will go to high. // TimerControl.OperatingMode = PitOperatingMode3; TimerControl.Channel = PitChannel2;
// // Set the access mode that we'll use to program the reload value. // TimerControl.AccessMode = PitAccessModeLowHigh;
// // Now write the programming bits // __outbyte(TIMER_CONTROL_PORT, TimerControl.Bits);
// // Next we write the reload value for channel 2 // __outbyte(TIMER_CHANNEL2_DATA_PORT, Divider & 0xFF); __outbyte(TIMER_CHANNEL2_DATA_PORT, (Divider >> 8) & 0xFF);
// // Reconnect the speaker to the timer and re-enable the output pin // SystemControl.Bits = __inbyte(SYSTEM_CONTROL_PORT_B); SystemControl.SpeakerDataEnable = TRUE; SystemControl.Timer2GateToSpeaker = TRUE; __outbyte(SYSTEM_CONTROL_PORT_B, SystemControl.Bits); Result = TRUE; } }
// // Release CMOS lock // HalpReleaseCmosSpinLock();
// // Return success // return Result;}