高通8650 AudioReach架构中的GSL-Passthru-GPR推理过程

在分析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

MI2S时钟配置Slave模式 3.3章

	&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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值