machine driver的probe函数会调用此api向Alsa注册声卡 1intsnd_soc_register_card(structsnd_soc_card *card)2{3inti, ret;4structsnd_soc_pcm_runtime *rtd;56if(!card->name || !card->dev)7return-EINVAL;89for(i =0; i < card->num_links; i++) {10structsnd_soc_dai_link *link = &card-...
-->soc_post_component_init// 为pcm runtime实例创建device对象-->soc_new_pcm// 创建PCM 逻辑设备,分FE和BE-->snd_soc_dapm_link_dai_widgets// dai widget 和 stream widget 建立连接-->snd_soc_dapm_connect_dai_link_widgets// BE dai widget和 codec dai widget建立连接,codec dai widget和codec ...
snd_pcm_ops open 中会有 DMA 的相关设置 注意 其中的 音频数据流向图 就是 dpam 中 流向图 snd_pcm_ops的更多描述
.open =soc_pcm_open, .close =soc_codec_close, .hw_params =soc_pcm_hw_params, .hw_free =soc_pcm_hw_free, .prepare =soc_pcm_prepare, .trigger =soc_pcm_trigger, .pointer =soc_pcm_pointer, }; staticintsoc_new_pcm(structsnd_soc_pcm_runtime*rtd,intnum) ...
(struct snd_soc_pcm_runtime *rtd, int num) { if (platform-driver-ops) { soc_pcm_ops.mmap = platform-driver-ops-mmap; soc_pcm_ops.pointer = platform-driver-ops-pointer; soc_pcm_ops.ioctl = platform-driver-ops-ioctl; soc_pcm_ops.copy = platform-driver-ops-copy; soc_pcm_ops....
root@cm4:~# for mod in snd-soc-tlv320aic32x4-i2c snd-soc-tlv320aic32x4 snd-soc-simple-card snd-soc-simple-card-utils; do modprobe $mod; done # Run `dtoverlay pipad-i2s-soundcard` but record a function call graph for everything the kernel does. root@cm4:~# trace-cmd record -p ...
==> snd_pcm_playback_open或者snd_pcm_capture_open ==> snd_pcm_open或者oss的snd_pcm_oss_f_reg.snd_pcm_oss_open,这就对应/dev/dsp了 ==> snd_pcm_open_file或者oss的snd_pcm_oss_open_file ==> snd_pcm_open_substream ==> soc_pcm_open ...