天天看點

智能語音終端開發闆适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第五章

上一章: 智能語音應用開發指南 | 《無需從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 初始化流程

應用分區的初始化流程如下:

智能語音終端開發闆适配指南 | 《無需從0開發 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 配置方法

本章主要介紹了引腳參數配置和其他配置。引腳需要根據晶片引腳定義和開發闆原理圖來進行配置,隻有引腳配置完成後,才能保證上節介紹的引腳複用配置順利運作。

以序列槽為例,配置方法如下:

  1. 通過硬體原理圖可知,晶片的PA19/PA20引腳會連接配接到USB轉序列槽晶片的USB_TXD/USB_RXD引腳,用于收發序列槽信号;是以需要将主晶片的PA19/PA20引腳配置為UART1_TX和UART1_RX。
  2. 打開晶片引腳定義檔案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 其他配置
智能語音終端開發闆适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第五章

2.4 低功耗

2.4.1 進入低功耗

應用低功耗流程需要進入某種低功耗狀态時會調用該函數。

• 函數原型

void board_enter_lpm(pm_policy_t policy);
           

• 功能描述 控制裝置進入指定的功耗模式

• 參數描述

智能語音終端開發闆适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第五章

• 傳回值

智能語音終端開發闆适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第五章
2.4.2 退出低功耗

裝置從低功耗狀态喚醒前調用該函數,在該函數中适配外設的恢複流程。

void board_leave_lpm(pm_policy_t policy);
           

• 功能描述 從低功耗狀态喚醒進入正常運作狀态。

智能語音終端開發闆适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第五章
智能語音終端開發闆适配指南 | 《無需從0開發 1天上手智能語音離線上方案》第五章

YoC作業系統介紹及驅動開發指南

智能語音終端軟體平台,采用了基于AliOS Thing為核心的YoC作業系統。關于YoC作業系統介紹、驅動開發指南以及核心子產品說明,可以參考

《yocbook》

了解更多詳細資訊。