芯片型号:AB1565
功能模块:RACE之AudioLoopbackTest
功能描述:DSP中音频流的处理
一、指令介绍
AB1565的SDK支持串口指令的调试和控制,在SDK中叫作RACE模块,通过串口调试助手或者官方的ATK工具按照指令的指令格式和芯片进行交互,支持如下这些操作:
- ANC标定
- MCSync ANC标定
- Version检查,Model名称检查,电量检查等等;
- MIC相关的测试;
指令格式【摘自原说明文档】:
二、RACE指令在MCU中相关的函数及调用关系
如下图所示,为MCU中RACE指令的相关的主要函数调用关系,其中tasks_list中包含了race_task这个任务,用于负责处理race指令和应答。
数组race_handlers[]定义了所支持的RACE指令及每个命令的处理函数。其中
RACE_CmdHandler_audio_loopback_test
为DSP中audio_loopback_test_interface.c中所执行的处理
在race_processing()函数中,会进行串口消息的接收和解析,其中对函数race_handle_command()的调用即为本文所讲的主题。
在race_handle_command()函数中,找到如下这一行调用:
status = race_input_command_handler(port_handle, msg->msg_data);
可以发现,参数msg_data的类型为:
typedef struct {
RACE_CH_BYTE pktId;
uint8_t type;
uint16_t length;
uint16_t id;
}PACKED RACE_COMMON_HDR_STRU, *PTR_RACE_COMMON_HDR_STRU;
/** @brief
* This enum defines the ATCI status types.
*/
typedef struct {
RACE_COMMON_HDR_STRU hdr;
uint8_t payload[0];
}PACKED race_pkt_t, *ptr_race_pkt_t;
其中RACE_COMMON_HDR_STRU即为上面所提到的消息格式的定义。
接着进入RACE_CmdHandler()这个函数,看case RACE_TYPE_COMMAND_WITHOUT_RSP
里面的内容可以发现,它在列表中race_handlers[]查找 消息发送过来的ID值,找到符合的后就会调用对应的回调函数。
三、以DSP中audio loopback test为实现对指令进行测试
首先确定ID的值是多少:
通过查看race_handlers[]中RACE_ID_AUDIO_LOOPBACK_TEST_BEGIN和RACE_ID_AUDIO_LOOPBACK_TEST_END的值可以发现,该loopback test的ID值的范围为0x1000 ~ 0x100F,因此我们在发送指令的时候需要把ID值设置为该范围内。
其次确定参数域的定义,即Payload域的定义:
我们来分析其对应的指令处理函数:
void* RACE_CmdHandler_audio_loopback_test(ptr_race_pkt_t pCmdMsg, uint16_t Length, uint8_t channel_id);
当ID值为RACE_AUDIO_LOOPBACK_TEST_TEST_CMD [0x1000]时:
分析对应的子函数:
race_cmd_audio_loopback_test_test_cmd(...);
可以得知Payload域定义了一个字节,即mode,可以在如下结构体中进行体现:
typedef struct
{
RACE_COMMON_HDR_STRU raceCmdHeader;
uint8_t mode;
}PACKED race_audio_loopback_test_test_cmd_t;
分析代码可知,该mode用于定义采用哪个ADC,SDK中共支持6个MODE,由左右MIC和3个通道按照不同和排列进行定义。
mode值的定义表为:
0x02: MIC_L + HAL_AUDIO_INTERFACE_1
0x03: MIC_R + HAL_AUDIO_INTERFACE_1
0x04: MIC_L + HAL_AUDIO_INTERFACE_2
0x05: MIC_R + HAL_AUDIO_INTERFACE_2
0x06: MIC_L + HAL_AUDIO_INTERFACE_3
0x07: MIC_R + HAL_AUDIO_INTERFACE_3
当ID值为RACE_AUDIO_LOOPBACK_TEST_CHANGE_TIME_CMD [0x1001]时:
分析对应的子函数:
race_cmd_audio_loopback_test_change_time_cmd(...);
可以知道该函数用来对audio loopback test进行参数配置,其payload域的定义体现在如下结构体中:
typedef struct {
RACE_COMMON_HDR_STRU race_header;
uint16_t test_interval; //unit: 100ms
uint16_t checking_interval; //unit: 1ms
uint16_t is_print_checking_log;
} PACKED race_audio_loopback_test_change_time_cmd_t;
对于payload域,第0~1字节为test_interval, 低字节在先;
因此,我们要执行dsp中的audio loopback test则需要发送两条指令,第一次是先对通道进行配置,然后再执行处理,两条指令分别如下:
通道配置的指令:
055A070001100200640001 = Audio Loopback Test Change Time Cmd
Test Interval = 0x0002 = 200ms;
CheckingInterval= 0x0064 = 100ms;
IsPrintCheckLog = 0x01 = PrintEnable
测试执行的指令:
055A0300001002 --Audo Loopback Test Cmd ,Mode = ADC0
四、在DSP模块中添加自定义日志输出类型
在文件dsp_temp.h中添加如下内容:
#define GHP_DSP_LOG_E(msg, ...) LOG_MSGID_E(ghp, msg, ##__VA_ARGS__)
#define GHP_DSP_LOG_W(msg, ...) LOG_MSGID_W(ghp, msg, ##__VA_ARGS__)
#define GHP_DSP_LOG_I(msg, ...) LOG_MSGID_I(ghp, msg, ##__VA_ARGS__)
#define GHP_DSP_LOG_D(msg, ...) LOG_MSGID_D(ghp, msg, ##__VA_ARGS__)
在文件dsp_temp.c中添加如下内容:
log_create_module(dsp_mw, PRINT_LEVEL_INFO);
log_create_module(ghp,PRINT_LEVEL_INFO);
五、调整日志中查看执行效果
打开ATK的日志调试窗口,如下图所示,关掉不需要的日志显示和打开希望输出的日志项:
首先发送配置指令,对loopback进行必要的配置:
其次,发送执行测试的指令:
从上面日志可以看出audio_loopback_test被正确执行并输出 了对应的日志。