Я изучаю драйверы устройств и хочу написать модуль ядра, который может генерировать звук из pcspkr. Я использовал следующий код в моем модуле:
static void play_sound(uint32_t nFrequence)
{
uint32_t Div;
uint8_t tmp;
//Set the PIT to the desired frequency
Div = 1193180 / nFrequence;
outb(0x43, 0xb6);
outb(0x42, (uint8_t)(Div));
outb(0x42, (uint8_t)(Div >> 8));
//And play the sound using the PC speaker
tmp = inb(0x61);
if (tmp != (tmp | 3))
{
outb(0x61, tmp | 3);
}
}
//make it shutup
static void nosound(void)
{
uint8_t tmp = inb(0x61) & 0xFC;
outb(0x61, tmp);
}
//Make a beep
void beep(void)
{
static int ev = 1;
if(ev)
{
play_sound(1000);
ev = 0;
}
else
{
nosound();
ev = 1;
}
//set_PIT_2(old_frequency);
}
Это не генерирует звук вообще. Я попытался сгенерировать звук с помощью обычной c программы с использованием ioctl(console_fd, KIOCSOUND, 1193180 / freq)
, но даже это не работает.
После дальнейшего изучения я установил beep
, запустил sudo modprobe pcspkr
, проверил уровни громкости в alsamixer
.
printf '\a'
работает и издает короткий звук.
beep
также производит такой же звук до sudo modprobe pcspkr
, но не производит никакого звука после него.
Я запустил speaker-test
, и он работает, как ожидалось, и издает звуковой сигнал с желаемой частотой.
Я что-то упустил? Пожалуйста, помогите мне понять это. Заранее спасибо.