AFE:音频前端硬件 audio front end hw
AFE MEMIF(FE): PCM DMA, memory read/write
Audio interconnection: connection fabric for audio sub module。核心路由器件。负责FE和BE之间的连接和路由。
DAI (BE) : Digital Audio I/F, eTDM/I2S/DMIC.– Enhanced TDM, can be configured to I2S or TDM
MISC
– CM: Channel merge to combine echo reference and Mic input
– GASRC: General audio sampling rate convertor(sample-based)
– HW gain: digital gain process
– Bus: SoC Top fabric bus
MTK音频前端硬件能力主要是指上行/下行slot数目数目。(TDM或者I2S)
AFE:音频前端硬件 audio front end hw
AFE MEMIF(FE): PCM DMA, memory read/write
Audio interconnection: connection fabric for audio sub module。核心路由器件。负责FE和BE之间的连接和路由。
DAI (BE) : Digital Audio I/F, eTDM/I2S/DMIC.– Enhanced TDM, can be configured to I2S or TDM
MISC
– CM: Channel merge to combine echo reference and Mic input
– GASRC: General audio sampling rate convertor(sample-based)
– HW gain: digital gain process
– Bus: SoC Top fabric bus
MTK音频前端硬件能力主要是指上行/下行slot数目数目。(TDM或者I2S)
speaker下行播放24声道
DL_2ch_xx (fe)=> I2SOUTxx(be)(master) D表示down
MTK MEMIF支持one-heart mode,可确保多路PCM path组合multi-ch同步输出。(channel merge)
上行32ch (16 mic + 16 echo ref)
16ch mic in
–I2SINxx(master) => VUL_CMx[0:15]
16ch echo in
–I2SINxx(master) => VUL_CMx[16:31] U表示up
蓝牙 HFP client :
–DL_2CH_xx => I2SOUTxx(master) => BT Tx (下行)
–BT Rx=> I2SINxx(master) => VUL_2CH_xx (上行)
• 蓝牙 A2DP sink :
–UART=> BT Stack=>BT HAL
eCall/Phone Call(通过modem模块):
–PCMxx_IN => I2SOUTxx(master)
–I2SINxx(master) => PCMxx_OUT
服务器安装cadance的编译工具以及liscense。详细步骤可以咨询MTK。
下载android部分的源码。
运行脚本编译ADSP的image。
烧录编译生成的image。
在platform_init函数中会调用音频的初始化audio_init函数,实现对整个音频框架的建立和初始化:
1.音频任务的创建
2.IPI(Inter-Processor-Interrupt)通信初始化
3.IRQ中断及回调注册
4.sw_mixer初始化
5.C2C(Chip-to-Chip)Client/Server端的初始化
audio init函数最终会调用到create_all_audio_task函数完成对所有任务的创建。核A和核B创建的任务不同。
A核负责处理下行数据(DL),B核负责处理上行数据(UL)。
IPI通信
task的钩子函数recv_message通过memcpy函数将IPI消息拷贝到本地ipi_msg_array数组,调用xQueueSendToBackFromISR函数把数组发送给消
息队列msg_idx_queue,此时会唤醒之前block在msg_idx_queue的task_common_task_loop任务并完成对相关消息的处理。
task_common_task_loop中对IPI消息的分析后面具体分析。
带文件名表示跨文件调用,不带文件名表示同一个文件内部调用。换行表示调用关系,无换行则表示顺序执行。
HIFI5_A/platform/src/main.c.main()
>>>>platform.c.platform_init()
>>>>audio.c.audio_init()
>>>>audio_task_factory.c.audio_task_factory_init() 创建task
>>>>create_all_audio_task()
>>>>create_audio_task(TASK_SCENE_AUDPLAYBACK,task_audplayback_new)参数1表示task处理的场景类型,参数2是构造task的函数指针
>>>>task_audplayback_new()调用函数指针。这个函数非常重要,负责对audio_task的生命周期函数和功能函数进行赋值。
>>>>constructor 此处皆是函数指针的执行,由task_audplayback_new赋值。此处执行(具体的指针实现可以参考audio_task_common.c.task_common_constructor)
>>>>create_task_loop 此处皆是函数指针的执行,由task_audplayback_new赋值。此处执行(具体的指针实现可以参考audio_task_common.c.task_common_XX)创建了task_common_task_loop(task的主循环线程实体)
>>>>create_data_task_loop 同上
>>>>create_audio_task(TASK_SCENE_PLAYBACK0,task_playback0_new)
... 根据需要创建不同的task。
>>>>create_audio_task(TASK_SCENE_PLAYBACKn,task_playbackn_new)
>>>>audio_messenger_ipi.c.audio_messenger_ipi_init() 处理消息
>>>>adsp_ipi.c.adsp_ipi_registration(audio_ipi_msg_dispatcher) 注意此处的audio_ipi_msg_dispatcher用来接受IPI的消息并处理(根据scene找到task,调用task的钩子recv_message)
>>>>audio_irq.c.audio_irq_init() 处理中断
>>>>interrupt.c.request_irq(adsp_audio_common_irq_handler)
adsp_audio_common_irq_handler的实现逻辑和注意此处的audio_ipi_msg_dispatcher逻辑类似
>>>>audio_hw_hal.c.init_dsp_audio_ops() 对接alsa。ASOC代码路径
./kernel/kernel_device_modules-6.1/sound/soc/mediatek/audio_dsp/mtk-dsp-platform-driver.c
>>>>set_dsp_audio_hw_hal_ops(s_audio_dsp_hw_hal_ops)
>>>>set_dsp_audio_hw_ops(s_audio_dsp_hw_ops)
>>>>audio_sw_mixer.c.init_audio_sw_mixer() 初始化混音器
>>>>创建所有的mixer以及mixer里面的thread
>>>>audio_xx_c2c_server.c.audio_xx_c2c_server_init() 初始化核间xxx场景通信服务端
>>>>audio_xx_c2c_client.c.audio_xx_c2c_client_init() 初始化核间xxx场景通信客户端
关于audio_task的一些细节:
1.每种scene只有一个task。(通过全局数组g_task_array来实现)
2.audio_task包含成员变量和成员函数指针。成员函数的命名风格和ASOC类似。
3.task_common_task_loop循环处理控制消息
4.task_common_data_task_loop循环处理数据