声音驱动程序使用与任何硬件驱动程序模块相同的方法探测和连接(设备)。 你可能希望浏览一下手册中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
例程,这样电源管理和模块卸载就能
正确地发挥作用。
本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.