繁体   English   中英

如何使用直接写入模式为一个爱好操作系统编写一个简单的soundblaster 16驱动程序?

How to write a simple soundblaster 16 driver using direct write mode for a hobby OS?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在开发一个32位,保护模式的业余爱好操作系统。 目前,我希望增加简单的声音支持。 为此,我希望使用声音冲击波16并使用直接模式写入DAC(我想不惜一切代价避免使用DMA)。 但是,当我向DAC输出一个简单的方波(使用命令0x10)时,我的计算机扬声器没有声音输出。 我正在寻找这个问题的解决方案。

我试图使用以下算法来产生声音:

1. Reset DSP
2. Enable the speakers
3. Write 0x10 to 0x22C (direct mode DAC write command)
4. Write 0x00 to 0x22C (To set the speaker to low)
5. Write 0x10 to 0x22C
6. Write 0xFF to 0x22C (To set the speaker to high)
7. Jump back to step 4 and repeat.

这是我的代码:

#define DSP_RESET 0x226
#define DSP_READ 0x22A
#define DSP_WRITE 0x22C
#define DSP_READ_STATUS 0x22E
#define DSP_INT_ACK 0x22F

#define REG_ADDR 0x224
#define REG_DATA 0x225

#define DIRECT_DAC 0x10
#define ENABLE_SPEAKER 0xD1

void dsp_reset(){
      uint32_t buf[4];
      *buf = 128;
      rtc_write(0, buf, 4);

      outb(1, DSP_RESET);
      rtc_read(0, 0, NULL, 0);
      outb(0, DSP_RESET);

      if(inb(DSP_READ) != 0xAA){
            print_term((uint8_t *)"Could not init sb16\n", 20);
      }

      return;
}

void play_simple_sound(){

      dsp_reset();

      while(inb(DSP_WRITE));
      print_term((uint8_t *)"Enabling speaker\n", 18);
      outb(0xD1, DSP_WRITE);

      while(inb(DSP_WRITE));
      print_term((uint8_t *)"Playing sound\n", 14);
      outb(0xF0, DSP_WRITE);

      while(1){
            while(inb(DSP_WRITE));
            outb(0x10, DSP_WRITE);
            outb(0x00, DSP_WRITE);
            rtc_read(0, 0, NULL, 0);
            while(inb(DSP_WRITE));
            outb(0x10, DSP_WRITE);
            outb(0xFF, DSP_WRITE);
            rtc_read(0, 0, NULL, 0);
      }

      return;
}

rtc_write将rtc频率设置为几百赫兹,而rct_read使程序在rtc上等待(这两个程序都正常工作)。 dsp_reset也可以正常工作,因为当从DSP读取输出时,返回0xAA(表明存在声音器16)。

目前我正在使用Windows 10 64位来运行模拟操作系统的Qemu。 我正在使用“-soundhw all”选项集运行qemu。 由于我编写的代码或者Qemu有问题,我不确定我是否听不到声音。 我的问题是,问题可能是什么,以及我可以采取哪些措施来解决这个问题? 此外,与sb 16相关的文档和教程将不胜感激。

1 个回复

在Qemu仿真下,使用soundblaster 16不能直接使用DAC。也不允许使用直接ADC。 检查此处找到的源代码,查看从第390行开始支持的命令:

https://github.com/qemu/qemu/blob/master/hw/audio/sb16.c

看起来为了使用声音发射器卡输出声音,您必须使用DMA。 更进一步,看起来Q16上的SB16模拟非常缺乏。 可以在此处找到真正SB16支持的一系列命令: http//the.earth.li/~tfm/oldpage/sb_dsp.html 将这些命令与Qemu支持的命令进行比较,只模拟了一小部分。

编辑2:看看其他模拟器,Bochs不支持sb16(见第858行: http//bochs.sourceforge.net/cgi-bin/lxr/source/iodev/sound/sb16.cc ),但DOSBox令人印象深刻SB16支持,并支持直接DAC,但仍然不支持麦克风直接ADC(参见第1611行: http//dosbox-x.com/doxygen/html/sblaster_8cpp_source.html

2 如何编写一个简单的命令行操作系统?

我已经下载了MINIX 3操作系统,并在Mac pro的并行桌面上运行它。 MINIX3是一个.iso文件,我想知道如何编写一些程序并将其打包到.iso文件中。 并通过虚拟机(Parallels Desktop)运行它? 我该怎么办? 我是一名Android开发人员。 ...

3 如何在Tektronix DVST终端中使用直接写入模式

过去,泰克使用称为Direct View Storage Tube的技术制造了一系列终端,计算机和显示器。 从本质上讲,它是一种CRT,可以无限期地保留写入荧光粉涂层中的信息(直到擦除为止,这会擦除整个屏幕),从而减少了先前的矢量显示器快速刷新屏幕的需求。 到目前为止,这些终端已在xterm中进行了 ...

7 如何在Windows中编写简单明了的WDM驱动程序自定义接口?

我有两个WDM总线驱动程序:一个( busA )充当父级,另一个( busB )作为子级,然后枚举其子级。 我想在列表中收集有关busB的子代的一些信息,并将其保存在busB的父总线busA中。 稍后,在busB上发生一些事件之后,我想将已保存的信息从busA收集到busB中。 经 ...

2017-10-02 05:21:49 0 16   windows
8 如何为硬件版权保护加密狗编写简单的USB驱动程序?

我想创建一个USB驱动程序,所以我自己的C应用程序能够进入我的闪存驱动器并从导入的闪存驱动器获取信息。 操作系统:Windows 我开始我的应用程序包含我的USB驱动程序,我插入我的闪存和它的显示在资源管理器,这个驱动器插入,它是可访问的,而这发生了,我的应用程序正在检查文件data ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM