From 49e30681cbd5e580107e62feaee1db494dec9f37 Mon Sep 17 00:00:00 2001 From: yuquanjun Date: Mon, 28 Sep 2026 17:16:34 +0800 Subject: [PATCH] fix(amp): drop the prototype EQ and restore the flat coefficients The captured sample curves made the tone uneven. Rewrite the datasheet bypass values at boot because a software reset leaves the old coefficients in RAM. Co-authored-by: Cursor --- device/AD85020B/Drv_AD85020B.c | 94 ++++++---------------------------- device/AD85020B/Drv_AD85020B.h | 5 +- 2 files changed, 18 insertions(+), 81 deletions(-) diff --git a/device/AD85020B/Drv_AD85020B.c b/device/AD85020B/Drv_AD85020B.c index 460f5c2..c1d9131 100644 --- a/device/AD85020B/Drv_AD85020B.c +++ b/device/AD85020B/Drv_AD85020B.c @@ -295,87 +295,27 @@ AD85020B_StatusTypeDef AD85020B_RamRead24(uint8_t ram_addr, uint8_t bank, uint32 return AD85020B_OK; } -/* 样机《音频DSP配置汇总》:每段 5 个 Q3.21 系数,地址顺序 A1 A2 B1 B2 A0。 - 分母为 1 - B1·z^-1 - B2·z^-2。直通段也写入,避免软复位后 RAM 仍残留旧值。 */ -typedef struct +/* 样机 EQ 会留在功放 RAM 里,软复位清不掉。写回手册直通,恢复样机表之前的功放音色。 + 直通:A1/A2/B1/B2 = 0,A0 = 0x200000。覆盖两路 EQ1–EQ18。 */ +static AD85020B_StatusTypeDef AD85020B_RestoreDefaultEq(void) { - uint8_t bank; - uint8_t base; - uint32_t a1; - uint32_t a2; - uint32_t b1; - uint32_t b2; - uint32_t a0; -} AD85020B_EqBand; - -static const AD85020B_EqBand s_proto_eq[] = -{ - /* CH1 bank0:EQ1–EQ5 为样机非直通,EQ6–EQ18 直通 */ - {0, 0x00, 0xC25937, 0x1ED364, 0x3D9BF6, 0xE24E65, 0x1ED364}, - {0, 0x05, 0xC2FCBC, 0x1D24C7, 0x3D0344, 0xE2DB39, 0x200000}, - {0, 0x0A, 0xCFC351, 0x137DEF, 0x303CAF, 0xEBC9F2, 0x20B81F}, - {0, 0x0F, 0xC454DD, 0x1DD591, 0x3B8646, 0xE43000, 0x1DD591}, - {0, 0x14, 0xDF8842, 0x0B92EF, 0x2077BE, 0xF215B2, 0x22575F}, - {0, 0x19, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {0, 0x1E, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {0, 0x23, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {0, 0x28, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {0, 0x2D, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {0, 0x32, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {0, 0x37, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {0, 0x3C, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {0, 0x41, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {0, 0x46, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {0, 0xA0, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {0, 0xA5, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {0, 0xAA, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - /* CH2 bank1:EQ1–EQ7 为样机非直通,EQ8–EQ18 直通 */ - {1, 0x00, 0x00F723, 0x007B91, 0x36BC77, 0xE75542, 0x007B91}, - {1, 0x05, 0xC0243C, 0x1FD490, 0x3FDBC4, 0xE02403, 0x20076D}, - {1, 0x0A, 0xC016F7, 0x1FF484, 0x3FE905, 0xE016F3, 0x1FF484}, - {1, 0x0F, 0xC21CAD, 0x1DF911, 0x3DE353, 0xE206EF, 0x200000}, - {1, 0x14, 0xC04043, 0x1FC9CB, 0x3FBFBD, 0xE03F7A, 0x1FF6BB}, - {1, 0x19, 0xC0E5B4, 0x1F1D69, 0x3F1A4C, 0xE0E297, 0x200000}, - {1, 0x1E, 0x00EB92, 0x0075C9, 0x342C97, 0xE9FC45, 0x0075C9}, - {1, 0x23, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {1, 0x28, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {1, 0x2D, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {1, 0x32, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {1, 0x37, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {1, 0x3C, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {1, 0x41, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {1, 0x46, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {1, 0xA0, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {1, 0xA5, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, - {1, 0xAA, 0x000000, 0x000000, 0x000000, 0x000000, 0x200000}, -}; - -static AD85020B_StatusTypeDef AD85020B_ApplyPrototypeEq(void) -{ - uint16_t i; - uint8_t k; + uint8_t bank; + uint8_t addr; AD85020B_StatusTypeDef status; - status = AD85020B_I2C_Write(AD85020B_REG_SCTL4, AD85020B_SCTL4_PROTO_EQ); - if (status != AD85020B_OK) - return status; - - for (i = 0; i < (uint16_t)(sizeof(s_proto_eq) / sizeof(s_proto_eq[0])); i++) + for (bank = 0U; bank < 2U; bank++) { - const uint32_t coef[5] = + for (addr = 0x00U; addr <= 0x4AU; addr++) { - s_proto_eq[i].a1, - s_proto_eq[i].a2, - s_proto_eq[i].b1, - s_proto_eq[i].b2, - s_proto_eq[i].a0 - }; - - for (k = 0; k < 5U; k++) + status = AD85020B_RamWrite24(addr, bank, + ((addr % 5U) == 4U) ? 0x200000UL : 0UL); + if (status != AD85020B_OK) + return status; + } + for (addr = 0xA0U; addr <= 0xAEU; addr++) { - status = AD85020B_RamWrite24((uint8_t)(s_proto_eq[i].base + k), - s_proto_eq[i].bank, - coef[k]); + status = AD85020B_RamWrite24(addr, bank, + ((addr % 5U) == 4U) ? 0x200000UL : 0UL); if (status != AD85020B_OK) return status; } @@ -469,8 +409,8 @@ AD85020B_StatusTypeDef AD85020B_Init(void) - /* 样机 EQ:在解除静音前写入。写失败也要继续解除静音,否则拨片和琴弦无声 */ - (void)AD85020B_ApplyPrototypeEq(); + /* 写回直通 EQ。失败也要解除静音,否则拨片和琴弦无声 */ + (void)AD85020B_RestoreDefaultEq(); /* 步骤6:解除静音(文档SCTL3,MMUTE=0,0x00) */ status = AD85020B_I2C_Write(AD85020B_REG_SCTL3, 0x00); diff --git a/device/AD85020B/Drv_AD85020B.h b/device/AD85020B/Drv_AD85020B.h index 1d70e80..d5d3a7f 100644 --- a/device/AD85020B/Drv_AD85020B.h +++ b/device/AD85020B/Drv_AD85020B.h @@ -39,12 +39,9 @@ #define AD85020B_REG_SCTL3 0x02 // 静音控制 #define AD85020B_SCTL3_MMUTE 0x40 /* B6=1:主静音,退出时芯片做淡入 */ #define AD85020B_REG_MVOL 0x03 // 主音量控制 -#define AD85020B_REG_SCTL4 0x0C /* EQ / DEQ / 音调;样机 0x90:EQ 开、左右独立 */ -#define AD85020B_SCTL4_PROTO_EQ 0x90 #define AD85020B_REG_HEADPHONEVOL 0x87 // 耳机音量控制 -/* 系数 RAM 间接访问(手册 0x1D~0x2D) - 寄存器表 CFA 为 8 位;RAM 图地址到 0xB0。按样机抓包把完整地址写入 0x1D。 */ +/* 系数 RAM 间接访问(手册 0x1D~0x2D)。CFA 按 8 位写入,RAM 图地址到 0xB0。 */ #define AD85020B_REG_CFA 0x1D /* CFA[7:0] RAM 基址 */ #define AD85020B_REG_A1_T 0x1E /* 系数 top [23:16] */ #define AD85020B_REG_A1_M 0x1F /* 系数 middle [15:8] */