由于缺料,codec由rt5651 更换为es8316,本以为是青铜,却发现是王者,最后竟然是驱动一个简单的符号导致。写到此时好像以前有遇到过忘记了,特此记录一下,百度了下amlogic的东西非常少。
常规步骤:
1 驱动放进 common\sound\soc\codecs\amlogic
2 更改 common\sound\soc\codecs\amlogic 下Makefile Kconfig
3 meson64_a32_defconfig写好
4 dts写好:
接下来就是编译烧录,但是发现没有声音,
查看card :
# cat proc/asound/pcm
似乎一切正常?
再来tinyplay一下 tingplay xxx.wav -D 0 -d 1 也就是调用 AMLAUGESOUND 下 的pcm1p 设备。因为AMLAUGESOUND 为0.
此时耳机有声音输出,说明用命令直接打开card 是可以正常播放,那硬件和tdm 都是正常的。现在怀疑的是上层没有open这个card。
logcat看起:
满屏的 pcm_handle is null 这个肯定是有问题的,
查找发现hardware\amlogic\audio\audio_hal\audio_port.c 下:
为啥port->pcm_handle = null ?
查找pcm_handle 发现 static ssize_t output_port_start(struct output_port *port) 中 port->pcm_handle = pcm;
再检查一下这个函数为啥没跑到赋值的地方,下面发现是device 值一直是-1 ,问题就出现device 没有获取到
查找有调用到 ->start 的地方发现
amlAudioMixer.c 中
再继续找mixer_output_startup 顺藤摸瓜发现在static int initSubMixngOutput 中:
再接着看alsa_device_update_pcm_index :
查看 alsa_device_parser_pcm_string 发现这里能看到对应到DTS 里面的字符配置了,例如
发现这里有相关打印
这里截取部分log 红线部分为可疑之处。
看到这里发现HiFi的字样,灵感一现,赶紧对比下2个dai_name
这才发现是空格造成的dai_name识别错误。修改为 .name = "ES8316-HiFi", 工作正常。
以上纯手打,希望能帮助到你。