update eq from DS3

This commit is contained in:
Steven Dan
2025-12-30 22:07:04 +08:00
parent a2d5b8a2bd
commit 0811deeabf
5 changed files with 206 additions and 21 deletions

View File

@@ -45,7 +45,11 @@
/* Enable/Disable Mixing core(s) - Default is on */
#ifndef MIXER
#define MIXER (1)
#define MIXER (0)
#endif
#ifndef _XUA_BMAX_POWER
#define _XUA_BMAX_POWER (50)
#endif
/* Set the number of mixes to perform - Default is 0 i.e mixing disabled */
@@ -177,7 +181,184 @@
#endif
#define EXCLUDE_USB_AUDIO_MAIN (1)
/*
* New spispec for QF60 board
* */
#define FL_QUADDEVICE_XT25F16F \
{ \
0, /* XT25F16F - Just specify 0 as flash_id */ \
256, /* page size */ \
8192, /* num pages */ \
3, /* address size */ \
4, /* log2 clock divider */ \
0x9F, /* QSPI_RDID */ \
0, /* id dummy bytes */ \
3, /* id size in bytes */ \
0x0B4015, /* device id */ \
0x20, /* QSPI_SE */ \
4096, /* Sector erase is always 4KB */ \
0x06, /* QSPI_WREN */ \
0x04, /* QSPI_WRDI */ \
PROT_TYPE_SR, /* Protection via SR */ \
{{0x0,0x00},{0,0}}, /* QSPI_SP, QSPI_SU */ \
0x02, /* QSPI_PP */ \
0xEB, /* QSPI_READ_FAST */ \
1, /* 1 read dummy byte */ \
SECTOR_LAYOUT_REGULAR, /* mad sectors */ \
{4096,{0,{0}}}, /* regular sector sizes */ \
0x05, /* QSPI_RDSR */ \
0x01, /* QSPI_WRSR */ \
0x01, /* QSPI_WIP_BIT_MASK */ \
}
#define FL_QUADDEVICE_WINBOND_W25Q16JW \
{ \
0, /* W25Q16JW - Just specify 0 as flash_id */ \
256, /* page size */ \
8192, /* num pages */ \
3, /* address size */ \
4, /* log2 clock divider */ \
0x9F, /* QSPI_RDID */ \
0, /* id dummy bytes */ \
3, /* id size in bytes */ \
0xEF4015, /* device id */ \
0x20, /* QSPI_SE */ \
4096, /* Sector erase is always 4KB */ \
0x06, /* QSPI_WREN */ \
0x04, /* QSPI_WRDI */ \
PROT_TYPE_SR, /* Protection via SR */ \
{{0x3C,0x00},{0,0}}, /* QSPI_SP, QSPI_SU */ \
0x02, /* QSPI_PP */ \
0xEB, /* QSPI_READ_FAST */ \
1, /* 1 read dummy byte */ \
SECTOR_LAYOUT_REGULAR, /* mad sectors */ \
{4096,{0,{0}}}, /* regular sector sizes */ \
0x05, /* QSPI_RDSR */ \
0x01, /* QSPI_WRSR */ \
0x01, /* QSPI_WIP_BIT_MASK */ \
}
#define FL_QUADDEVICE_UC25HQ16B \
{ \
0, /* W25Q16JW - Just specify 0 as flash_id */ \
256, /* page size */ \
8192, /* num pages */ \
3, /* address size */ \
4, /* log2 clock divider */ \
0x9F, /* QSPI_RDID */ \
0, /* id dummy bytes */ \
3, /* id size in bytes */ \
0xB36015, /* device id */ \
0x20, /* QSPI_SE */ \
4096, /* Sector erase is always 4KB */ \
0x06, /* QSPI_WREN */ \
0x04, /* QSPI_WRDI */ \
PROT_TYPE_SR, /* Protection via SR */ \
{{0x3C,0x00},{0,0}}, /* QSPI_SP, QSPI_SU */ \
0x02, /* QSPI_PP */ \
0xEB, /* QSPI_READ_FAST */ \
1, /* 1 read dummy byte */ \
SECTOR_LAYOUT_REGULAR, /* mad sectors */ \
{4096,{0,{0}}}, /* regular sector sizes */ \
0x05, /* QSPI_RDSR */ \
0x01, /* QSPI_WRSR */ \
0x01, /* QSPI_WIP_BIT_MASK */ \
}
/*
* New spispec for QF60 3V3 board
* */
#define FL_QUADDEVICE_WINBOND_W25Q32JVxxxM \
{ \
0, /* W25Q32JV - Just specify 0 as flash_id */ \
256, /* page size */ \
16384, /* num pages */ \
3, /* address size */ \
4, /* log2 clock divider */ \
0x9F, /* QSPI_RDID */ \
0, /* id dummy bytes */ \
3, /* id size in bytes */ \
0xEF4016, /* device id */ \
0x20, /* QSPI_SE */ \
4096, /* Sector erase is always 4KB */ \
0x06, /* QSPI_WREN */ \
0x04, /* QSPI_WRDI */ \
PROT_TYPE_SR, /* Protection via SR */ \
{{0x3C,0x00},{0,0}}, /* QSPI_SP, QSPI_SU */ \
0x02, /* QSPI_PP */ \
0xEB, /* QSPI_READ_FAST */ \
1, /* 1 read dummy byte */ \
SECTOR_LAYOUT_REGULAR, /* mad sectors */ \
{4096,{0,{0}}}, /* regular sector sizes */ \
0x05, /* QSPI_RDSR */ \
0x01, /* QSPI_WRSR */ \
0x01, /* QSPI_WIP_BIT_MASK */ \
}
/*
* New spispec for xcore-AI explorer board
* */
#define FL_QUADDEVICE_MX25R3235 \
{ \
0, /* MX25R3235 - Just specify 0 as flash_id */ \
256, /* page size */ \
16384, /* num pages */ \
3, /* address size */ \
3, /* log2 clock divider */ \
0x9F, /* QSPI_RDID */ \
0, /* id dummy bytes */ \
3, /* id size in bytes */ \
0xC22816, /* device id */ \
0x20, /* QSPI_SE */ \
4096, /* Sector erase is always 4KB */ \
0x06, /* QSPI_WREN */ \
0x04, /* QSPI_WRDI */ \
PROT_TYPE_SR, /* Protection via SR */ \
{{0x3C,0x00},{0,0}}, /* QSPI_SP, QSPI_SU */ \
0x02, /* QSPI_PP */ \
0xEB, /* QSPI_READ_FAST */ \
1, /* 1 read dummy byte */ \
SECTOR_LAYOUT_REGULAR, /* mad sectors */ \
{4096,{0,{0}}}, /* regular sector sizes */ \
0x05, /* QSPI_RDSR */ \
0x01, /* QSPI_WRSR */ \
0x01, /* QSPI_WIP_BIT_MASK */ \
}
#define FL_QUADDEVICE_MX25L160E \
{ \
0, /* MX25R3235 - Just specify 0 as flash_id */ \
256, /* page size */ \
8192, /* num pages */ \
3, /* address size */ \
3, /* log2 clock divider */ \
0x9F, /* QSPI_RDID */ \
0, /* id dummy bytes */ \
3, /* id size in bytes */ \
0xC22017, /* device id */ \
0x20, /* QSPI_SE */ \
4096, /* Sector erase is always 4KB */ \
0x06, /* QSPI_WREN */ \
0x04, /* QSPI_WRDI */ \
PROT_TYPE_SR, /* Protection via SR */ \
{{0x3C,0x00},{0,0}}, /* QSPI_SP, QSPI_SU */ \
0x02, /* QSPI_PP */ \
0xEB, /* QSPI_READ_FAST */ \
1, /* 1 read dummy byte */ \
SECTOR_LAYOUT_REGULAR, /* mad sectors */ \
{4096,{0,{0}}}, /* regular sector sizes */ \
0x05, /* QSPI_RDSR */ \
0x01, /* QSPI_WRSR */ \
0x01, /* QSPI_WIP_BIT_MASK */ \
}
// DFU_FLASH_DEVICE is a comma-separated list of flash spec structures
// This define is used in lib_xua/lib_xua/src/dfu/flashlib_user.c
#define DFU_FLASH_DEVICE FL_QUADDEVICE_XT25F16F, FL_QUADDEVICE_WINBOND_W25Q16JW, FL_QUADDEVICE_UC25HQ16B, FL_QUADDEVICE_WINBOND_W25Q32JVxxxM, FL_QUADDEVICE_MX25R3235, FL_QUADDEVICE_MX25L160E
//:
#include "user_main.h"
#endif

View File

@@ -46,7 +46,6 @@ audio_type g_new_audio_type, g_audio_type = 0;
unsigned g_mute_enable = 0;
unsigned g_mute_state = 0;
unsigned g_mute_state_old = 1;
unsigned g_samfreq;
unsigned g_unmute_dac_state, g_unmute_time, g_format_time;
unsigned g_volume_level = 60, g_saved_volume_level = 60;
unsigned g_request_volume_set = 0;
@@ -62,7 +61,7 @@ uint32_t get_reference_time();
unsigned g_disable_i2c = 0;
unsigned g_dac_mode = 10;
unsigned g_new_dac_mode = 0;
unsigned g_samFreq = DEFAULT_FREQ;
unsigned g_samfreq = 48000;
// 改动原因添加DSD模式全局变量用于HID命令读取采样率和格式信息已去掉DAC采样分辨率
unsigned g_dsd_mode = 0; // DSD模式0=PCM, >0=DSD
unsigned g_gain_mode = 0; // 0: 低阻, 1: 高阻
@@ -429,35 +428,42 @@ void AudioHwRemote2(chanend c, client interface i2c_master_if i2c)
GET_SHARED_GLOBAL(force_request_mode_change, g_force_request_eq_mode_change);
if (new_eq_mode != request_eq_mode)
{
// debug_printf("new eq mode != request eq mode\n");
SET_SHARED_GLOBAL(g_new_eq_mode, request_eq_mode);
}
if (force_request_mode_change == 1)
{
debug_printf("force request mode change\n");
SET_SHARED_GLOBAL(g_force_eq_mode_change, 1);
SET_SHARED_GLOBAL(g_force_request_eq_mode_change, 0);
}
break;
#if 0
case eq_sync_timer when timerafter(eq_sync_time) :> void :
eq_sync_time += EQ_SYNC_DELAY;
// 使用单参数存储系统保存脏参数独立保存EQ参数
if (eq_save_dirty_params() == 0) {
//debug_printf("Single EQ parameters synced to Flash successfully\n");
} else {
//debug_printf("Failed to sync single EQ parameters to Flash\n");
}
// 独立保存脏的增益
if (eq_save_dirty_gain() == 0) {
// debug_printf("Gain synced to Flash successfully\n");
} else {
//debug_printf("Failed to sync gain to Flash\n");
}
// 独立保存脏的模式名称
if (eq_save_dirty_names() == 0) {
// debug_printf("Mode names synced to Flash successfully\n");
} else {
//debug_printf("Failed to sync mode names to Flash\n");
}
break;
#endif
#endif
}
}
@@ -699,6 +705,7 @@ void AudioHwInit()
/* Configures the external audio hardware for the required sample frequency */
void AudioHwConfig(unsigned samFreq, unsigned mClk, unsigned dsdMode, unsigned sampRes_DAC, unsigned sampRes_ADC)
{
g_samfreq = samFreq;
{
sw_pll_fixed_clock(mClk);
}

View File

@@ -202,9 +202,7 @@ void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudi
#endif
}
#if EQ_EN
if (!is_eq_disabled()) {
buffer_exchange(uc_eq_data, sampsFromUsbToAudio);
}
#endif
sampsFromAudioToUsb[0] = sampsFromUsbToAudio[0];
sampsFromAudioToUsb[1] = sampsFromUsbToAudio[1];

View File

@@ -15,7 +15,7 @@
#include "debug_print.h"
#include "eq_flash_storage.h"
#if 0
#if 0
#define DPRINTF(...) printf(__VA_ARGS__)
#else
#define DPRINTF(...)
@@ -27,7 +27,6 @@
int eq_flash_initialized = 0;
extern unsigned int is_mode_changed(void);
extern void change_eq_mode(unsigned sample_freq);
extern unsigned int g_samfreq;
extern void clear_eq_status(unsigned sample_freq, unsigned ch_no);
extern unsigned int g_request_eq_mode;
extern unsigned int g_eq_enable; // 改动原因添加EQ使能开关外部声明用于初始化时检查EQ状态
@@ -50,7 +49,7 @@ void dsp_core0(void)
unsigned u_in_step;
unsigned b_fade_out = 0;
unsigned u_out_step;
// EQ Flash存储初始化标志
delay_milliseconds(100);
@@ -62,7 +61,7 @@ void dsp_core0(void)
if (eq_flash_initialized == 0) {
// 延迟更长时间确保QSPI Flash完全初始化
debug_printf("Initializing EQ Flash storage system\n");
// 初始化EQ Flash存储系统
if (eq_flash_init() == 0) {
debug_printf("EQ Flash storage initialized successfully\n");
@@ -72,7 +71,7 @@ void dsp_core0(void)
debug_printf("Loading EQ parameters from Flash using simplified storage\n");
// 简化加载逻辑:每个模式只加载一次,会自动应用到所有采样率和通道
int loaded_modes = 0;
for (int mode = EQ_USER_MODE_MIN; mode <= EQ_USER_MODE_MAX; mode++) {
if (eq_load_all_params_and_calculate_coefficients(44100, mode) == 0) {
loaded_modes++;
@@ -87,20 +86,20 @@ void dsp_core0(void)
// 改动原因修复EQ开关逻辑问题确保从Flash加载模式时正确设置g_saved_eq_mode和g_eq_enable
// eq_flash_load_current_mode()会同时加载模式并设置g_eq_enable
int saved_mode_result = eq_flash_load_current_mode();
// 改动原因确保g_eq_enable被正确加载无论模式加载是否成功
// eq_flash_load_current_mode()已经设置了g_eq_enable这里读取确认
unsigned int eq_enable = g_eq_enable;
if (saved_mode_result >= 0 && saved_mode_result <= 9) {
uint8_t saved_mode = (uint8_t)saved_mode_result;
debug_printf("Loaded current EQ mode %d and enable %d from Flash\n", saved_mode, eq_enable);
// 改动原因将eq_enable独立为全局开关所有模式共用一个开关
// 无论EQ是否启用都设置到Flash中保存的模式eq_enable只控制EQ处理开关
g_saved_eq_mode = saved_mode;
SET_SHARED_GLOBAL(g_request_eq_mode, saved_mode);
debug_printf("EQ initialization: Set mode to %d from Flash, EQ enable: %d (global switch, independent of mode)\n",
debug_printf("EQ initialization: Set mode to %d from Flash, EQ enable: %d (global switch, independent of mode)\n",
saved_mode, eq_enable);
} else {
// Flash加载失败时使用默认模式0EQ默认禁用
@@ -110,8 +109,8 @@ void dsp_core0(void)
g_eq_enable = 0;
eq_enable = 0; // 同步本地变量
debug_printf("Failed to load EQ mode from Flash, using default mode 0, EQ disabled (enable: %d)\n", eq_enable);
}
}
} else {
debug_printf("Failed to initialize EQ Flash storage system, continuing without Flash storage\n");
// 即使Flash初始化失败也标记为已初始化避免重复尝试
@@ -132,7 +131,7 @@ void dsp_core0(void)
}
else
{
sample_freq = g_samfreq;
sample_freq = 48000;
audio_in_samples[0] = read_from_ring_buffer(0);
audio_in_samples[1] = read_from_ring_buffer(1);
@@ -145,7 +144,7 @@ void dsp_core0(void)
u_out_step=1;
}
audio_out_samples[0] = handler_eq_filter(sample_freq, 0, audio_in_samples[0]);
audio_out_samples[1] = handler_eq_filter(sample_freq, 1, audio_in_samples[1]);

View File

@@ -1,5 +1,5 @@
#include "share_buffer.h"
#define RING_BUFFER_SIZE 128
#define RING_BUFFER_SIZE 512
typedef struct {
int buffer[RING_BUFFER_SIZE];