智能语音终端开发板适配指南 | 《无需从0开发 1天上手智能语音离在线方案》第五章-阿里云开发者社区-云惠网

avatar
avatar
云惠网小编
1563
文章
0
评论
2020年9月16日14:04:30 评论 5 次浏览 8883字阅读29分36秒
摘要

本章将介绍开发板CB5631和CB5654的硬件适配方法。

阿里云2000元通用代金券点击领取

智能语音终端开发板适配指南

本章将介绍开发板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  Namen 
 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  Namen 
42  PD4(LED)n 
46  PD0(PA MUTE)n 
45  PD1n 
38  PD7n 
39  PD8n 
29  PC12n 
30  PC13n 
 2  PA2n 
59  PB7n 
60  PB6n 
61  PB5n 
62  PB4n 
"
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》了解更多详细信息。

阿里云2000元通用代金券点击领取

腾讯云618
avatar
腾讯云618
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: