LinuxでI/Oポート操作してBeep音を鳴らす

スポンサーリンク

LinuxでハードウェアI/O制御する例として、システムビープのI/Oポートを操作して、Ubuntu Linuxでビープ音を鳴らしたので備忘録を残す。

【Ubuntu 20.04/18.04 LTS】gcc, make などの開発ツールをインストールして使う
前の記事で「Ubuntu 18.04 LTS Server」をインストールした。続いて、gccやmakeコマンドの開発ツールを使えるようにしたので備忘録を残す。 尚、「Ubuntu 18.04 LTS Desktop」のターミナルでも手順は...

システム・タイマのハード仕様

関連するI/Oレジスタについては、姉妹サイトの下記記事参照。

LinuxでI/Oポート操作(Beep音を鳴らす) [新石器Wiki]

テストプログラム

I/Oポートを操作するサンプルプログラム。

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>            /* for usleep */
#include <sys/io.h>            /* for inb,outb */

static void beep_on(void)
{
    outb(inb(0x61)|3, 0x61);    /* beep on */
}

static void beep_off(void)
{
    outb(inb(0x61)&0xfc, 0x61); /* beep off */
}

int main(int argc, char *argv[])
{
    uint32_t count;

    if ((ioperm(0x0040, 4, 1)) || (ioperm(0x0061, 1, 1))) {
        perror("ioperm");
        return 1;
    }

    count = 1193180/1000;       /* 1000 Hz */
    outb(0xb6, 0x43);           /* set freq */
    outb(count & 0xff, 0x42);
    outb((count>>8) & 0xff, 0x42);

    beep_on();
    usleep(1000000);            /* 1sec wait */
    beep_off();

    return 0;
}
  • ioperm関数で、ポートの入出力許可を設定する。

コンパイル方法

上記ソースを、beep_test.c ファイルに作成。下記コマンドでコンパイル。

$ gcc -o beep_test beep_test.c

実行方法

root権限で実行する。

$ sudo ./beep_test

実行すると、1秒間ビープ音が鳴る。

参考

  1. 「Linuxによるハードウェア制御の基礎」 Linux Japan July 2001

コメント

タイトルとURLをコピーしました