如何在linux下直接驱动PC音箱

如何在linux下直接驱动PC音箱

在最初的 IBM PC 上,您可以通过向 I/O 地址 0x61 的第 1 位写入 1 和 0 来直接驱动 PC 扬声器;它基本上是一个以 1.19 MHz 定时器频率运行的 1 位 DAC(系统时钟为 4.77 MHz,除以 4)。

在linux下有没有办法做到这一点?理想情况下,我想要一个串行设备,我可以向其提供文件或实时比特流,并将其直接连接到主板上的 TTL 扬声器电压引脚。我见过的大多数在线程序都通过 ioctl 对 PIT 的 2 进行时钟计时,但我想直接驱动扬声器,而不是通过计时器。

答案1

有一个名为的内核模块snd-pcsp正是试图做到这一点(源代码位于 中sound/drivers/pcsp/,您可以看到它如何寻址端口 0x61)。它作为 ALSA 设备公开,因此可以轻松向其提供实时比特流。

然而,在我的系统上,它发出的声音与你所说的不太相似,至少不是我尝试过的。但你没有说你想用它做什么。我也不认为你可以达到 1.19 MHz。但您始终可以修改内核模块以满足您的需要。

如果这不起作用,如果您的用户空间应用程序是 root 并且可以执行ioperm,那么没有什么可以阻止您写入端口 0x61。但当然你会遇到一个问题,Linux 不是实时操作系统,你的应用程序可能随时被抢占。 (我也对防止这种情况发生的方法感兴趣,例如为此特定应用程序保留一个核心)。

相关内容