在分析audio-pkt.c(passthru)这个文件的代码时,我们推断它实现了一个名为aud_passthru_adsp的字符设备。此设备的创建和操作过程可以通过跟踪代码来理解。首先,我们发现设备被 open 的代码位于gpr_lx.c文件的gpr_dl_lx_local_init
函数中。这里的gpr似乎作为客户端或前端的角色出现。
进一步分析显示,对该设备的 write 操作是通过gpr_dl_lx_send
函数实现的。为了深入了解这个函数的调用关系,我们追踪到gpr_dl_lx_send
是在哪些地方被调用。我们发现gpr_dl_lx_local_init
是在ipc_dl_lx_init
函数中被调用的。在ipc_dl_lx_init
的代码中,我们可以看到涉及到设备初始化和配置的具体细节:
*pp_ipc_to_gpr_vtbl = &gpr_dl_lx_vtbl;
gpr_dl_lx_vtbl
是一个包含函数指针的结构体,其中一个重要的函数指针是指向 gpr_dl_lx_send
的。这个函数主要用于数据发送操作,并且被封装在此结构体中。在深入代码时,我们注意到 pp_ipc_to_gpr_vtbl
属性是作为参数传递给 ipc_dl_lx_init
函数的,这表明 ipc_dl_lx_init
在初始化过程中需要引用这个结构体。
为了更好地理解如何初始化这个过程和相关的函数调用,我们继续追踪 ipc_dl_lx_init
的调用者。通过代码搜索和分析,我们得到了相关的调用代码段:
gpr_init_lx_wrapper.c
gpr_lx_ipc_dl_table[num_domains].init_fn = ipc_dl_lx_init;
查看 init_fn 函数的调用位置,发现它在 gpr_drv.c 中gpr_drv_internal_init_v2
函数里被调用
rc = local_gpr_ipc_dl_table[domain_id].init_fn(default_domain_id,
domain_id,
&gpr_to_ipc_tbl,
&local_gpr_ipc_dl_table[domain_id].fn_ptr);
fn_ptr
是指向 gpr_dl_lx_vtbl
的函数指针结构体,其中包含了如 gpr_dl_lx_send
等函数指针。该结构体的定义如下:
struct ipc_to_gpr_vtbl_t
{
uint32_t (*send)(uint32_t domain_id, void *buf, uint32_t length);
uint32_t (*receive_done)(uint32_t domain_id, void *buf);
};
现在,通过调用 fn_ptr
结构体中的 send
函数属性,实现了从应用处理器 (AP) 到后端驱动的通信。具体地,send
函数的调用发生在 gpr_drv_island.c
文件中的 __gpr_cmd_async_send
函数里。下面揭示了函数调用的关系链:
gsl_graph.c +530 gsl_apm_config_oob
gsl_common.c +171 gsl_send_spf_cmd
gpr_drv_island.c +150 __gpr_cmd_async_send
以pcm_read为例:
agm_pcm_plugin.c +605 agm_session_read
agm_client_wrapper.cpp +358 ipc_agm_session_read
agm_server_wrapper.cpp +1125 agm_session_read
agm.c +842 session_obj_read
session_obj.c +2436 graph_read
graph.c +1413 gsl_read
gsl_main.c +1954 gsl_graph_read
gsl_graph.c +4194 gsl_dp_read
gsl_datapath.c +2033 gsl_dp_read_shmem
gsl_datapath.c +1252 gsl_send_spf_cmd
以上都是分析,还未实际验证。
https://blog.csdn.net/jlgcumt/article/details/105518089
https://blog.csdn.net/top5419/article/details/122320025
&pineapple_snd {
qcom,mi2s-audio-intf = <1>; //如果不需要MI2S接口,将他设为0
}
proprietary/mm-audio/audio_ftm/ar/config/pineapple/ftm_test_config
CKV(Calibration Key Vector)基本控制Gain Level Samplerate等等
TKV当我们要做功能
audio_prm.c 提供时钟控制接口,比如开关的功能,或者介于开关的feature调整
APM_CMD_GET_SPF_STATE
LPAIDSP.HT.1.0\adsp_proc\avs\fwk\spf\apm\core\src\apm_gpr_cmd_handler.c
asoc pcm没有了(前端pcm)?现在是后端pcm(adsp)?
adcb这一层管stream,pcm_open管device
原生tinyalsa pcm_open操作后端注册的dai link,把codec前后端连起来,还有codec上电,数据走agm。
前端pcm 对应后端codec name
00-00: CODEC_DMA-LPAIF_RXTX-RX-0 rx_macro_rx1-0 : : playback 1
00-01: CODEC_DMA-LPAIF_RXTX-RX-1 rx_macro_rx2-1 : : playback 1
00-02: CODEC_DMA-LPAIF_RXTX-RX-2 rx_macro_rx3-2 : : playback 1
00-03: CODEC_DMA-LPAIF_RXTX-RX-3 rx_macro_rx4-3 : : playback 1
00-04: CODEC_DMA-LPAIF_RXTX-RX-5 rx_macro_rx5-4 : : playback 1
00-05: CODEC_DMA-LPAIF_RXTX-TX-3 tx_macro_tx1-5 : : capture 1
00-06: CODEC_DMA-LPAIF_RXTX-TX-4 tx_macro_tx2-6 : : capture 1
00-07: CODEC_DMA-LPAIF_VA-TX-0 va_macro_tx1-7 : : capture 1
00-08: CODEC_DMA-LPAIF_VA-TX-1 va_macro_tx2-8 : : capture 1
00-09: CODEC_DMA-LPAIF_VA-TX-2 va_macro_tx3-9 : : capture 1
00-10: PCM_RT_PROXY-TX-1 snd-soc-dummy-dai-10 : : capture 1
00-11: PCM_RT_PROXY-RX-1 snd-soc-dummy-dai-11 : : playback 1
00-12: USB_AUDIO-RX snd-soc-dummy-dai-12 : : playback 1
00-13: USB_AUDIO-TX snd-soc-dummy-dai-13 : : capture 1
00-14: PCM_DUMMY-TX-0 snd-soc-dummy-dai-14 : : capture 1
00-15: SLIM-DEV1-RX-7 btfm_bt_sco_a2dp_slim_rx-15 : : playback 1
00-16: SLIM-DEV1-TX-7 btfm_bt_sco_slim_tx-16 : : capture 1
00-17: CODEC_DMA-LPAIF_RXTX-RX-6 rx_macro_rx6-17 : : playback 1
adb shell "mount -t debugfs debugfs /sys/kernel/debug"
adb shell "echo file soc-dapm.c +p > /sys/kernel/debug/dynamic_debug/control"
adb shell "echo file kalams.c +p > /sys/kernel/debug/dynamic_debug/control"
rem adb shell "echo file pineapple.c +p > /sys/kernel/debug/dynamic_debug/control"
adb shell "echo file msm_common.c +p > /sys/kernel/debug/dynamic_debug/control"
adb shell "echo file bolero-clk-rsc.c +p > /sys/kernel/debug/dynamic_debug/control"
adb shell "echo file bolero-cdc.c +p > /sys/kernel/debug/dynamic_debug/control"
adb shell "echo file wcd939x.c +p > /sys/kernel/debug/dynamic_debug/control"
adb shell "echo file wcd939x-mbhc.c +p > /sys/kernel/debug/dynamic_debug/control"
adb shell "echo file tx-macro.c +p > /sys/kernel/debug/dynamic_debug/control"
adb shell "echo file va-macro.c +p > /sys/kernel/debug/dynamic_debug/control"
adb push C:\Users\xxxx\Downloads\qcom\proprietary\mm-audio\audio-log-utils\audio_dynamic_log.xml /data/vendor/audio/audio_dynamic_log.xml