ALSA SOC驱动的snd_soc_dai_link数组中新增一路stream,所有参数配置正确,但声卡始终注册失败。
关键Log:
<3>[ 1.010918](2)soc-audio soc-audio: ASoC: failed to register soundcard -16
ERROR NO:-EBUSY (-16)
关键原因:
声卡设备较多,但没有打开CONFIG_SND_DYNAMIC_MINORS这个宏。
分析过程:
1.定位Log位置:
跟踪代码实现,追查报错EBUSY的位置,最终定位到如下函数:
在执行snd_register_device时,会在snd_minors数组中查找空闲的index,用于存储声卡相关信息,
传入的参数就是声卡设备的几大关键信息:type、card及device id。
而问题原因就是snd_minors[minor]不为0,也就是说minor对应的id已经被注册,minor的计算方式如下(card<<5|dev),其中dev = type + device,而从下面的宏定义就可以发现:C0D0c与C0D8p计算的minor都为24,因此发生了BUSY。
而通过代码我们也可以发现,CONFIG_SND_DYNAMIC_MINORS这个宏打开后,使用的是snd_find_free_minor的另一种实现,这种实现则不会存在这种问题,因此解决方式选择打开这个宏。