15.3. 探测，连接等
上一页 | 第 15 章 声音子系统 | 下一页

## 15.3. 探测，连接等

声音驱动程序使用与任何硬件驱动程序模块相同的方法探测和连接（设备）。 你可能希望浏览一下手册中ISA或PCI章节的内容来获取更多信息。

然而，声音驱动程序在某些方面又有些不同：

- 他们将自己声明为`pcm`类设备，带有一个 设备私有结构struct snddev_info：

  static driver_t xxx_driver = { "pcm", xxx_methods, sizeof(struct snddev_info) }; DRIVER_MODULE(snd_xxxpci, pci, xxx_driver, pcm_devclass, 0, 0); MODULE_DEPEND(snd_xxxpci, snd_pcm, PCM_MINVER, PCM_PREFVER,PCM_MAXVER);

  大多数声音驱动程序需要存储关于其设备的附加私有信息。私有数据 结构通常在连接例程中分配。其地址通过调用 `pcm_register()`和 `mixer_init()`传递给 `pcm`。后面`pcm` 将此地址作为调用声音驱动程序接口时的参数传递回来。

- 声音驱动程序的连接例程应当通过调用`mixer_init()` 向`pcm`声明它的MIXER或AC97 接口。对于MIXER接口，这会接着引起调用 `xxxmixer_init()`。

- 声音驱动程序的连接例程通过调用 `pcm_register(dev, sc, nplay, nrec)` 向`pcm`声明其通用CHANNEL配置，其中 `sc`是设备数据结构的地址， 在`pcm`以后的调用中将会用到它， `nplay`和`nrec`是播放和录音 通道的数目。

- 声音驱动程序的连接例程通过调用 `pcm_addchan()`声明它的每个通道对象。这会在 `pcm`中建立起通道合成，并接着会引起调用 `xxxchannel_init()` （译注：请参考原文）。

- 声音驱动程序的分离例程在释放其资源之前应当调用 `pcm_unregister()`。

有两种可能的方法来处理非PnP设备：

- 使用`device_identify()`方法 （范例：`sound/isa/es1888.c`）。 `device_identify()`方法在已知地址探测硬件， 如果发现支持的设备就会创建一个新的pcm设备，这个pcm设备接着 会被传递到probe/attach。

- 使用定制内核配置的方法，为pcm设备设置适当的hints（范例： `sound/isa/mss.c`）。

`pcm`驱动程序应当实现 `device_suspend`， `device_resume`和 `device_shutdown`例程，这样电源管理和模块卸载就能 正确地发挥作用。

上一页 | 上一级 | 下一页
15.2. 文件 | 起始页 | 15.4. 接口

本文档和其它文档可从这里下载： ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题，请先阅读 文档，如不能解决再联系 <questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.