2025-02-27 17:59:18 +08:00

127 lines
3.4 KiB
C
Executable File

#include <common/bk_include.h>
#include "bk_arm_arch.h"
//#include "bk_arm_mcu.h"
#include "bk_lbus.h"
#include "bk_dsp.h"
#include "dsp.h"
#include <os/os.h>
#include "pmu.h"
#include <components/ate.h>
#include <common/sys_config.h>
#include <components/log.h>
#define TAG "dsp"
#if (CONFIG_SOC_BK7271)
int g_dsp_inited = 0;
#if CONFIG_DSP
void dsp_start(void)
{
uint32 i;
uint32 src_code_offset = 0;
uint32 src_code_len = 0;
uint32 src_data_offset = 0;
uint32 src_data_len = 0;
uint32 src_ext_data_offset = 0;
uint32 src_ext_data_len = 0;
uint32 dst_code_base = W_DSP_DMEM_64KB_BASE_ADDR;
uint32 dst_code_offset = 0x0;
uint32 dst_data_base = W_DSP_DMEM_64KB_BASE_ADDR;
uint32 dst_data_offset = 0x0;
uint32 dst_ext_data_base = W_DSP_DMEM_64KB_BASE_ADDR;
uint32 dst_ext_data_offset = 0;
src_code_offset = REG_READ(CONFIG_DSP_SRC_ADD);
src_code_len = REG_READ(CONFIG_DSP_SRC_ADD + 4);
dst_code_offset = REG_READ(CONFIG_DSP_SRC_ADD + 8);
src_data_offset = REG_READ(CONFIG_DSP_SRC_ADD + 16);
src_data_len = REG_READ(CONFIG_DSP_SRC_ADD + 20);
dst_data_offset = REG_READ(CONFIG_DSP_SRC_ADD + 24);
src_ext_data_offset = REG_READ(CONFIG_DSP_SRC_ADD + 32);
src_ext_data_len = REG_READ(CONFIG_DSP_SRC_ADD + 36);
dst_ext_data_offset = REG_READ(CONFIG_DSP_SRC_ADD + 40);
BK_LOGI(TAG, "code:0x%08x 0x%08x\r\n" "dst_code_offset:0x%08x \r\n"
"data:0x%08x 0x%08x\r\n" "dst_data_offset:0x%08x \r\n"
"ext_data:0x%08x 0x%08x\r\n" "dst_ext_data_offset:0x%08x \r\n"
, src_code_offset, src_code_len, dst_code_offset
, src_data_offset, src_data_len, dst_data_offset
, src_ext_data_offset, src_ext_data_len, dst_ext_data_offset);
/* LBUS should be ready when copy dsp and bluetooth data */
*((volatile unsigned long *) PMU_CO_MCU_CONFIG) |= 0x15;
BK_LOGI(TAG, "start code DL !! \r\n");
i = 0;
while (i < src_code_len) {
*((volatile unsigned long *)(dst_code_base + dst_code_offset + i)) =
*((volatile unsigned long *)(CONFIG_DSP_SRC_ADD + src_code_offset + i));
i += 4;
}
BK_LOGI(TAG, "start data DL !! \r\n");
i = 0;
while (i < src_data_len) {
*((volatile unsigned long *)(dst_data_base + dst_data_offset + i)) =
*((volatile unsigned long *)(CONFIG_DSP_SRC_ADD + src_data_offset + i));
i += 4;
}
if (*((volatile unsigned long *)(dst_data_base + dst_data_offset + i - 4)) !=
*((volatile unsigned long *)(CONFIG_DSP_SRC_ADD + src_data_offset + i - 4)))
BK_LOGI(TAG, "last dst data error \r\n");
BK_LOGI(TAG, "start ext data DL !! \r\n");
i = 0;
while (i < src_ext_data_len) {
*((volatile unsigned long *)(dst_ext_data_base + dst_ext_data_offset + i)) =
*((volatile unsigned long *)(CONFIG_DSP_SRC_ADD + src_ext_data_offset + i));
i += 4;
}
if (*((volatile unsigned long *)(dst_ext_data_base + dst_ext_data_offset + i - 4)) !=
*((volatile unsigned long *)(CONFIG_DSP_SRC_ADD + src_ext_data_offset + i - 4)))
BK_LOGI(TAG, "last dst ext data error \r\n");
*((volatile unsigned long *) PMU_CO_MCU_CONFIG) &= ~(0x1 << 0);
}
void dsp_reset(void)
{
*((volatile unsigned long *) LBUS_CONF0_REG) |= DSP_DOWNLOAD_ENABLE;
rtos_delay_milliseconds(100);
*((volatile unsigned long *) LBUS_CONF0_REG) &= ~DSP_DOWNLOAD_ENABLE;
}
#endif
void dsp_init(void)
{
if (ate_is_enabled())
return;
#if CONFIG_DSP
BK_LOGI(TAG, "dsp_init\r\n");
dsp_start();
g_dsp_inited = 1;
#endif
}
uint32_t dsp_is_inited(void)
{
return g_dsp_inited;
}
void dsp_exit(void)
{
}
#endif // (CONFIG_SOC_BK7271)
// eof