Проблемы с генерацией звукового сигнала в C коде в Ubuntu - PullRequest
0 голосов
/ 19 января 2020

Я изучаю драйверы устройств и хочу написать модуль ядра, который может генерировать звук из 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, и он работает, как ожидалось, и издает звуковой сигнал с желаемой частотой.

Я что-то упустил? Пожалуйста, помогите мне понять это. Заранее спасибо.

...