上一章:智能语音应用开发指南 | 《无需从0开发 1天上手智能语音离在线方案》第四章>>>
下一章:智能语音组件适配指南 | 《无需从0开发 1天上手智能语音离在线方案》第六章>>>
智能语音终端开发板适配指南
本章将介绍开发板CB5631和CB5654的硬件适配方法。
1. CB5631适配指南
1.1 目录结构
开发板适配代码位于SDK的boards目录下面,CB5631的板级目录结构如下:
boards/csky/cb5631
├── README.md
├── bootimgs - 存放除了prim分区外的其他固件,包括boot/cpu1/cpu2/lpm/tee等固件
├── configs - 系统分区配置以及编译链接配置
├── include - 引脚配置定义和板级宏定义
├── package.yaml - 组件配置文件
└── src - 板级配置代码文件
1.2 初始化
1.2.1 初始化流程
应用分区的初始化流程如下:
startup.S是系统的启动文件,系统启动时首先会跳转到该文件。在startup.S流程中,会调用函数board_init()进行板级引脚配置。接下来会通过entry_c进入main函数,在main函数里面调用board_base_init()和board_audio_init(),进一步配置其他板级参数。板级配置完成后,才会开始后续的初始化流程。
1.2.2 引脚复用配置
芯片级的初始化和引脚的复用配置在board_init函数完成。board_init代码路径如下:
boards/csky/cb5631/src/pinmux_init.c
代码示例
本示例配置了串口调试引脚,Wi-Fi/蓝牙通讯引脚。实际开发过程中,开发者可以根据需要灵活进行配置。
void board_pinmux_config(void)
{
/* console */
drv_pinmux_config(CONSOLE_TXD, CONSOLE_TXD_FUNC);
drv_pinmux_config(CONSOLE_RXD, CONSOLE_RXD_FUNC);
/* wifi sdio */
drv_pinmux_config(WIFI_SDIO_CMD, WIFI_SDIO_CMD_FUNC);
drv_pinmux_config(WIFI_SDIO_CLK, WIFI_SDIO_CLK_FUNC);
drv_pinmux_config(WIFI_SDIO_DAT0, WIFI_SDIO_DAT0_FUNC);
drv_pinmux_config(WIFI_SDIO_DAT1, WIFI_SDIO_DAT1_FUNC);
drv_pinmux_config(WIFI_SDIO_DAT2, WIFI_SDIO_DAT2_FUNC);
drv_pinmux_config(WIFI_SDIO_DAT3, WIFI_SDIO_DAT3_FUNC);
/* BT */
drv_pinmux_config(BT_UART_TXD, BT_UART_TXD_FUNC);
drv_pinmux_config(BT_UART_RXD, BT_UART_RXD_FUNC);
}
void board_init(void)
{
board_pinmux_config();
}
1.2.3 其他板级初始化
其他板级的初始化包含两个接口,board_base_init为板级小系统的初始化;board_audio_init提供音频功能的初始化。 代码路径
boards/csky/cb5631/src/base_init.c
代码示例
板级小系统的初始化,主要包括:
• itcm加载初始化,将部分启动代码加载到itcm,可以加快启动速度;
• 注册串口驱动,CB5631开发板使用两个串口;其他开发板可以根据真实情况进行注册;
注意:uart_csky_register函数的参数是从零开始的ID,实际的硬件串口号需减一
• spiflash初始化
• i2c初始化
• 分区表初始化
• cpu1/cpu2初始化
• 配置RTC时钟
void board_base_init(void)
{
itcm_code_load(); // itcm加载初始化
uart_csky_register(0); // 注册串口号0
uart_csky_register(1); // 注册串口号1
spiflash_csky_register(0); // spiflash初始化
iic_csky_register(0); //i2c初始化
console_init(CONSOLE_IDX, 115200, 512); // 串口初始化
/* load partition */
int ret = partition_init(); //分区表初始化
if (ret <= 0) {
LOGE(TAG, "partition init failed");
} else {
cpu1_init(); //cpu1初始化
cpu2_init(); //cpu2初始化
LOGI(TAG, "find %d partitions", ret);
}
/* RTC CLK setting */
extern void drv_lclk_select_src(clk_src_e);
/* 设置内部RC晶振,用于RTC时钟 */
drv_lclk_select_src(ELS_CLK);
drv_set_rtc_freq(CONFIG_RTC_CLK);
}
音频功能的初始化,主要是注册声卡驱动,该函数一般无需修改。
void board_audio_init()
{
int id_list[5] = {0, 1, 4, EMPTY_INPUT_CHANNEL, EMPTY_INPUT_CHANNEL};
snd_pangu_config_t config = {id_list, sizeof(id_list) / sizeof(int)};
config.dac_db_max = -15;
config.dac_db_min = -45;
snd_card_pangu_register(&config);
}
1.3 参数配置
1.3.1 配置方法
本章主要介绍了引脚参数配置和其他配置。引脚需要根据芯片引脚定义和开发板原理图来进行配置,只有引脚配置完成后,才能保证上节介绍的引脚复用配置顺利运行。
以串口为例,配置方法如下:
- 通过硬件原理图可知,芯片的PA19/PA20引脚会连接到USB转串口芯片的USB_TXD/USB_RXD引脚,用于收发串口信号;所以需要将主芯片的PA19/PA20引脚配置为UART1_TX和UART1_RX。
- 打开芯片引脚定义文件pin_name.h, 找到PA19和PA20引脚的功能复用,得知需要将两个引脚的功能分别定义为PA19_UART1_TX和PA20_UART1_RX。
1.3.2 代码示例
代码路径:
boards/csky/cb5631/include/board_config.h
串口配置
/* console */
#define CONSOLE_TXD PA19
#define CONSOLE_RXD PA20
#define CONSOLE_TXD_FUNC PA19_UART1_TX
#define CONSOLE_RXD_FUNC PA20_UART1_RX
#define CONSOLE_IDX 1
Wi-Fi配置
• WLAN_ENABLE_PIN:WiFi芯片使能引脚
• WLAN_POWER_PIN :WiFi芯片的供电开关引脚
/* wifi*/
#define WIFI_SDIO_CMD PA15
#define WIFI_SDIO_CMD_FUNC PA15_SDIO_CMD
#define WIFI_SDIO_CLK PA16
#define WIFI_SDIO_CLK_FUNC PA16_SDIO_CLK
#define WIFI_SDIO_DAT0 PA17
#define WIFI_SDIO_DAT0_FUNC PA17_SDIO_DAT0
#define WIFI_SDIO_DAT1 PA18
#define WIFI_SDIO_DAT1_FUNC PA18_SDIO_DAT1
#define WIFI_SDIO_DAT2 PA13
#define WIFI_SDIO_DAT2_FUNC PA13_SDIO_DAT2
#define WIFI_SDIO_DAT3 PA14
#define WIFI_SDIO_DAT3_FUNC PA14_SDIO_DAT3
#define WLAN_ENABLE_PIN PB2
#define WLAN_POWER_PIN 0xFFFFFFFF
BT配置
• BT_DIS_PIN:BT芯片使能引脚
/* BT */
#define BT_UART_IDX 0
#define BT_UART_TXD PA2
#define BT_UART_RXD PA0
#define BT_UART_TXD_FUNC PA2_UART0_TX
#define BT_UART_RXD_FUNC PA0_UART0_RX
#define BT_DIS_PIN PB4
按键配置
• 定义了四个GPIO按键对应的引脚
/* button */
#define APP_KEY_MUTE PA29
#define APP_KEY_VOL_INC PB20
#define APP_KEY_VOL_DEC PA24
#define APP_KEY_STANDBY PA25
功放配置
• 定义了功放(PA)静音的控制引脚
/* PA */
#define PANGU_PA_MUTE PA23
LED配置
• 定义两个LED灯对应的引脚,以及灯的特性:低电平亮
/* LED */
#define LED0_PIN PB21
#define LED1_PIN PB31
#define LED_FLIP_FLAG 1 /* 低电平亮 */
QSPI Flash配置
• 定义QSPI Flash的ID
/* QSPI FLash */
#define EXAMPLE_QSPI_IDX 0
RTC配置
• 使能RTC时钟,并配置RTC时钟数值
/* RTC */
#define CONFIG_RTC_EN 1
#define CONFIG_RTC_CLK (24540) /* internal RC CLK: 24.540KHz */
GPIO信息
• 开发板对通用GPIO的说明,方便测试验证,可选配
/* 可用GPIO列表 */
#define USER_GPIO_LIST_STR \
"GPIO ID Name\n \
21 PA21 (IIC_SCLK)\n \
22 PA22 (IIC_SD0)\n \
23 PA23 (-PA MUTE)\n \
24 PA24 (-KEY K5)\n \
25 PA25 (-KEY K6)\n \
29 PA29 (-KEY K4)\n \
32 PB0 (UART3_TX)\n \
33 PB1 (UART3_RX)\n \
52 PB20 (-KEY K3)\n \
53 PB21 (-LED0)\n \
54 PB22 (PWM1_O5/PWM_LED_DEMO)\n \
55 PB23 (PWM1_O7/LCD_RESET)\n \
56 PB24 (PWM1_O9/UART2_TX)\n \
57 PB25 (PWM1_O11/UART2_RX)\n \
58 PB26 (PWM1_IO0/LCD_RS)\n \
59 PB27 (PWM1_IO2/LCD_CS)\n \
60 PB28 (PWM1_IO4/SPI_SCK/LCD_SCL)\n \
61 PB29 (PWM1_IO6/SPI_MOSI/LCD_SDA)\n \
62 PB30 (PWM1_IO8/SPI_MISO)\n \
63 PB31 (-LED1)\n \
"
2. CB5654适配指南
2.1 目录结构
SDK中开发板适配代码的目录结构如下:
boards/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 - 组件配置文件
2.2 初始化
2.2.1 引脚复用
设备引导时会先调用board_init函数,该函数中做芯片级的初始化和引脚的复用配置。
代码路径
boards/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();
}
2.2.2 初始化接口
板级的初始化分别两个接口,board_base_init为板级小系统的初始化;board_audio_init提供音频功能的初始化。 代码路径
boards/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
}
2.3 参数配置
2.3.1 硬件配置
代码路径
boards/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 \
"
2.3.2 其他配置
2.4 低功耗
2.4.1 进入低功耗
应用低功耗流程需要进入某种低功耗状态时会调用该函数。
• 函数原型
void board_enter_lpm(pm_policy_t policy);
• 功能描述 控制设备进入指定的功耗模式
• 参数描述
• 返回值
2.4.2 退出低功耗
设备从低功耗状态唤醒前调用该函数,在该函数中适配外设的恢复流程。
• 函数原型
void board_leave_lpm(pm_policy_t policy);
• 功能描述 从低功耗状态唤醒进入正常运行状态。
• 参数描述
• 返回值
YoC操作系统介绍及驱动开发指南
智能语音终端软件平台,采用了基于AliOS Thing为内核的YoC操作系统。关于YoC操作系统介绍、驱动开发指南以及核心模块说明,可以参考《yocbook》了解更多详细信息。