2009-12-12 56 views
2

我正在尝试在ASM和C中编写一个非常简单的操作系统(NASM汇编程序) 我想直接访问声卡,无论是否带驱动程序。 如果我不需要驱动程序,我怎样才能访问并发送示例音频文件 到声卡? (一个例子会很好) 如果我确实需要驱动程序,是否有接口,并从驱动程序调用函数 ?我如何访问并发送示例音频文件到 声卡? (另一个例子会很好)NASM直接访问声卡(无操作系统)

+0

什么是声卡?你有权访问该卡的注册地图吗? – 2009-12-14 13:52:16

回答

3

我不想让你灰心,但现代声卡驱动程序是非常复杂的,正如你可能知道的,操作系统特定的。这是操作系统开发中的一个难题 - 驱动程序支持。这不是用简单的代码片段就可以实现的。

为了加载文件,您需要一个文件系统。你有没有实现呢?你使用“内核”标志的事实表明你的操作系统还处于初级阶段。我不确定我是否想要对操作系统的内核提供良好的支持。

这就是说,有一个很好的模拟器叫做Bochs,它有Sound Blaster 16 emulation。还有一些really old documentation如何编程。这可能是你最好的选择。在一天之内访问声音硬件要容易得多。

+0

是的。但是,大量的声卡/板载芯片组都与AC97兼容。直接编程比编程SB16更容易。有一点运气,OP有这些芯片之一.. – 2009-12-12 02:51:25

+0

嗯....我其实正在考虑SB16。但是,现在你提到它了,AC97是我认识的东西。但是,我不知道如何编程该芯片组。:P我的板载声卡是基于英特尔HDA的芯片组,支持AC97,这是完美的测试场地。 – 2009-12-12 03:03:34

1

当然,你需要一个驱动程序,当然还有没有简单的方法来与现有的驱动程序接口(有一个统一的操作系统无关的“统一驱动程序接口”的建议 - 但我不认为它有任何地方) 。

因此,在您编写代码从硬盘读取文件后,您需要打开自己的音频驱动程序。

现在,我一段时间都没有这样做过,所以这可能已经过时了,但在90年代,你会用一些'out dx,al'(细节因声卡而异)配置你的声卡,并且然后设置DMA将数据从内存缓冲区发送到您的卡。该卡(或者它是DMA控制器?)会在中断到达缓冲区的末尾时触发中断,该中断将用于使用新数据填充缓冲区。

如果你的卡有一个可用的linux驱动程序,我会先看看它的代码。否则,您将不得不逆向设计Windows驱动程序,Soft-Ice的bpio(断开io端口访问)日志记录对于该iirc是非常有用的。

祝你好运。

+0

“90年代”的界面类型就是我的想法。我听说有人说新的声卡可能(可能)支持SoundBlaster接口。问题是 - 我不知道如何让它工作! :P我期待只支持ALSA驱动程序集。我不会去尝试反汇编或记录自己的专有驱动程序,因为这对于一个特定的芯片组来说是浪费时间。也许我可以为我的操作系统编译ALSA ....? (我打算实现ELF兼容性。) – 2009-12-12 03:01:20

1

最好的办法是看看Linux或FreeBSD声卡驱动程序,看看它们的功能。除了最简单的声卡外,你不可能获得更好的实现文档...

这是一个难题。被警告:-p

+1

我知道。太糟糕的声卡制造商并不专注于一种实现方式,而只是自己动手制作。 :P我想知道是否有可能将ALSA移植到我的内核中... – 2009-12-12 02:57:35