络达开发----RACE指令之---DSP中AudioLoopbackTest如何触发执行

芯片型号:AB1565

功能模块:RACE之AudioLoopbackTest

功能描述:DSP中音频流的处理


一、指令介绍

AB1565的SDK支持串口指令的调试和控制,在SDK中叫作RACE模块,通过串口调试助手或者官方的ATK工具按照指令的指令格式和芯片进行交互,支持如下这些操作:

  • ANC标定
  • MCSync ANC标定
  • Version检查,Model名称检查,电量检查等等;
  • MIC相关的测试;

指令格式【摘自原说明文档】:

标题RACE指令和应答消息格式定义
标标题RACE指令和应答消息格式定义题

 

RACE指令和应答消息格式定义
Type域值的定义

 

 

二、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_BEGINRACE_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的日志调试窗口,如下图所示,关掉不需要的日志显示和打开希望输出的日志项:

标题MCU中打开自定义的日志输出
标DSP中打开自定义的日志输出题

首先发送配置指令,对loopback进行必要的配置:

标题发送配置指令

 

 

其次,发送执行测试的指令:

 

标题Audio Loopback Test执行的指令

 

 

 

 从上面日志可以看出audio_loopback_test被正确执行并输出 了对应的日志。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值