1. 概述
SC5654芯片是面向语音识别、音频处理的SOC,该芯片基于平头哥玄铁803,内置240K高速SRAM、8M大容量SDRAM、集成高性能音频专用DSP和音频CODEC。
CB5654是基于SC5654芯片的智能语音应用开发板,本文主要基于该开发板的适配代码,讲解如何适配一款新的板子。
2. 目录结构
silan/cb5654
├── bootimgs - 引导固件
├── configs - 默认的系统分区及编译链接文件
├── dspalg_cxc - 士兰语音识别方案核间通讯接口
├── include - 包含引脚配置定义、OS配置文件、LWIP配置文件
├── audio - 音频初始化及 软VAD低功耗框架
├── base_init.c - 板级初始化
├── pinmux_init.c - 引脚复用配置
├── soc_lpm.c - 低功耗适配
├── board_lpm.c - 板级低功耗处理
└── package.yaml - 组件配置文件
3. 初始化
3.1 引脚复用
设备引导时会先调用board_init函数,该函数中做芯片级的初始化和引脚的复用配置。
代码路径
silan/cb5654/pinmux_init.c
代码示例
开发板中明确的引脚功能进行配置,例如PA4、PA5复用为UART2,作为串口调试输出,PB0、PB1复用为UART1和RTL8723的蓝牙模块通讯。开发者需要根据实际的硬件连接进行复用的配置。
static void board_pinmux_config(void)
{
//console
drv_pinmux_config(PA4, PA4_UART2_TX);
drv_pinmux_config(PA5, PA5_UART2_RX);
// BT
drv_pinmux_config(PB0, PB0_UART1_TX);
drv_pinmux_config(PB1, PB1_UART1_RX);
//WiFi
drv_pinmux_config(PC2, PC2_SD_D0);
drv_pinmux_config(PC1, PC1_SD_D1);
drv_pinmux_config(PC6, PC6_SD_D2);
drv_pinmux_config(PC5, PC5_SD_D3);
drv_pinmux_config(PC3, PC3_SD_CLK);
drv_pinmux_config(PC4, PC4_SD_CMD_CMD);
drv_pinmux_config(PC0, PC0_SD_DET);
//SD card
drv_pinmux_config(PC9, PC9_SDIO_D0);
drv_pinmux_config(PC8, PC8_SDIO_D1);
drv_pinmux_config(PC13, PC13_SDIO_D2);
drv_pinmux_config(PC12, PC12_SDIO_D3);
drv_pinmux_config(PC10, PC10_SDIO_CLK);
drv_pinmux_config(PC11, PC11_SDIO_CMD);
drv_pinmux_config(PC7, PC7_SDIO_DET);
}
void board_init(void)
{
board_pinmux_config();
/* 关闭无需调试核的调试引脚,相关引脚可作为通用IO使用 */
silan_mcu_debug_close();
silan_dsp_debug_close();
}
3.2 初始化接口
板级的初始化分别两个接口,board_base_init为板级小系统的初始化;board_audio_init提供音频功能的初始化。 代码路径
silan/cb5654/base_init.c
代码示例
板级小系统的初始化,主要对可用的串口和Flash进行初始化,CB5654开发板的三个串口都注册到串口驱动,若新的板子,串口被其他功能复用,根据情况删除注册。
注意:uart_csky_register函数的参数是从零开始的ID,实际的硬件串口号需减一
代码中宏SOC_DSP_LDO_LEVEL和宏CONFIG_DMAC_DSP_ACQ的功能,板级参数配置章节再说明
void board_base_init(void)
{
#ifdef SOC_DSP_LDO_LEVEL
extern void silan_dsp_ldo_config(int level);
extern void silan_soc_ldo_config(int level);
silan_dsp_ldo_config(SOC_DSP_LDO_LEVEL);
silan_soc_ldo_config(SOC_DSP_LDO_LEVEL);
#endif
uart_csky_register(0); /* UART1 */
uart_csky_register(1); /* UART2 */
uart_csky_register(2); /* UART3 */
spiflash_csky_register(0);
#ifndef CONFIG_DMAC_DSP_ACQ
sram_init();
#endif
}
音频功能的初始化,启动麦克风和参考音的采集,该函数一般无需修改,功能已经参数化,板级参数配置章节再说明
void board_audio_init()
{
#ifndef CONFIG_DMAC_DSP_ACQ
/* 参考音 增益, 前端反馈,理论 (16)0dB即可,但单端模补偿6dB*/
voice_ref_init(24, 24); /* 数值单位0.75dB 16 + 6/0.75 = 24 */
/* 麦克风 增益, boost (3)20dB 模拟增益(8)0dB,伪差分补偿6dB,看信号还较小继续增加12dB */
int mic_gain_val = 8 + (CONFIG_MIC_GAIN * 2 / 3);
voice_mic_init(3, mic_gain_val, mic_gain_val); /*数值单位1.5dB 8 + 18/1.5 = 20*/
#endif
}
4. 参数配置
4.1 硬件配置
代码路径
silan/cb5654/include/board_config.h
代码示例
SOC_DSP_LDO_LEVEL宏定义芯片内部输出的DSP的供电电压
CONSOLE_ID定义调试串口输出的串口ID,1对应硬件的UART2
/* 系统 */
//1:1.2V 2:1.0V 3:1.4V
// #define SOC_DSP_LDO_LEVEL 3
#define CONSOLE_ID 1
示例应用中使用一个LED灯,此处定义灯的引脚和参数
/* LED */
#define PIN_LED_R LED_PIN_NOT_SET
#define PIN_LED_G PD4
#define PIN_LED_B LED_PIN_NOT_SET
#define LED_FLIP_FLAG 1 /* 低电平亮 */
定义是否支持芯片内部RTC,RTC需要外部电路支持,若板子支持可开启改配置,示例应用会支持时间同步和闹铃功能
/* RTC */
#define CONFIG_RTC_EN 1
音频相关配置
- PIN_PA_EN 模拟功放对应的引脚号
- CONFIG_VOL_MAX 音量系统的最大值配置,下面参数已经配置为芯片的最佳参数,不建议修改
- CONFIG_LEFT_GAIN CONFIG_RIGHT_GAIN,左右声道 的音量配置,-1表示该声道应用可调,该声道输出到扬声器,若固定一个值则表示该声道为参考音声道,该值不能大于CONFIG_VOL_MAX值
- CONFIG_MIC_GAIN 麦克风的增益配置db数,CONFIG_MIC_GAIN+20db是总的增益数
/* 音频 */
#define PIN_PA_EN PD0
#define CONFIG_VOL_MAX (88)
#define CONFIG_LEFT_GAIN (-1) /* 左声道固定 -> PA */
#define CONFIG_RIGHT_GAIN (88) /* 右声道可调 -> REF */
#define CONFIG_MIC_GAIN (18) /* MIC初始20dB, 该值在20dB基础上增加的dB数 */
WiFi驱动配置
- WLAN_ENABLE_PIN WiFi芯片使能引脚
- WLAN_POWER_PIN WiFi芯片的供电开关引脚
- PIN_WL_WAKE_HOST WiFi芯片的唤醒主控的引脚
/* WiFi */
#define WLAN_ENABLE_PIN PC8
#define WLAN_POWER_PIN PC0 /* 等于0xffffffff表示不支持 */
#define PIN_WL_WAKE_HOST PA6
#define PIN_WL_WAKE_HOST_GROUP LPM_DEV_MASK_GENERAL_GPIO2
ADC按键配置
- PIN_ADC_KEY 按键的ADC引脚号
- KEY_ADC_VAL* ADC各个按键对应的电压值
- KEY_AD_VAL_OFFSET 按键检测允许的误差范围
/
* ADC按键引脚 */
#define PIN_ADC_KEY PA1
/* ADC按键配置 */
#define KEY_ADC_VAL1 1751
#define KEY_ADC_VAL2 2311
#define KEY_ADC_VAL3 3051
#define KEY_ADC_VAL4 1376
#define KEY_ADC_VAL5 3587
#define KEY_AD_VAL_OFFSET 100 /* 按键值误差允许 */
#define VAD_ADC_VAL_MAX KEY_ADC_VAL5 + KEY_AD_VAL_OFFSET /* 最大值 + 误差值 */
#define VAD_ADC_VAL_MIN KEY_ADC_VAL4 - KEY_AD_VAL_OFFSET /* 最小值 - 误差值 */
GPIO信息,开发板对通用GPIO的说明,方便测试验证,可选配
/* 可用GPIO列表 */
#define USER_GPIO_LIST_STR \
"ID Name\n \
42 PD4(LED)\n \
46 PD0(PA MUTE)\n \
45 PD1\n \
38 PD7\n \
39 PD8\n \
29 PC12\n \
30 PC13\n \
2 PA2\n \
59 PB7\n \
60 PB6\n \
61 PB5\n \
62 PB4\n \
"
4.2 其他配置
5. 低功耗
5.1 进入低功耗
应用低功耗流程需要进入某种低功耗状态时会调用该函数。
函数原型
void board_enter_lpm(pm_policy_t policy);
功能描述 控制设备进入指定的功耗模式
参数描述
5.2 退出低功耗
设备从低功耗状态唤醒前调用该函数,在该函数中适配外设的恢复流程。
函数原型
void board_leave_lpm(pm_policy_t policy);
功能描述 从低功耗状态唤醒进入正常运行状态。
参数描述
文章来源:芯片开放社区
文章链接:https://occ.t-head.cn/community/post/detail?spm=a2cl5.14300636.0.0.1b87180flWxVN5&id=3771155070247899136