上一章: 智能語音應用開發指南 | 《無需從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開發闆的三個序列槽都注冊到序列槽驅動,若新的闆子,序列槽被其他功能複用,根據情況删除注冊。
代碼中宏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》了解更多詳細資訊。