dac playing ok

This commit is contained in:
Steven Dan
2026-05-21 20:58:10 +08:00
parent c0c966c6de
commit b7e7941108
7 changed files with 707 additions and 921 deletions

View File

@@ -42,13 +42,15 @@
<Tile Number="1" Reference="tile[1]"> <Tile Number="1" Reference="tile[1]">
<Port Location="XS1_PORT_1A" Name="PORT_UART_RX"/> <Port Location="XS1_PORT_1A" Name="PORT_UART_RX"/>
<Port Location="XS1_PORT_1K" Name="PORT_UART_TX"/> <Port Location="XS1_PORT_1K" Name="PORT_UART_TX"/>
<Port Location="XS1_PORT_1F" Name="PORT_OPT_IN"/> <!-- HRT3236 -->
<Port Location="XS1_PORT_1K" Name="PORT_HTR3236_SDB"/>
<Port Location="XS1_PORT_1D" Name="PORT_MCLK_IN_SPDIF_TX"/>
<Port Location="XS1_PORT_1B" Name="PORT_I2S_SLRCLK"/>
<Port Location="XS1_PORT_1C" Name="PORT_I2S_SBCLK"/>
<Port Location="XS1_PORT_1G" Name="PORT_COAX_IN"/>
<!-- direct IO contorlled LEDs -->
<Port Location="XS1_PORT_1A" Name="PORT_LED_D5"/>
<Port Location="XS1_PORT_1B" Name="PORT_LED_D1"/>
<Port Location="XS1_PORT_4A" Name="PORT_LED_D3"/> <!-- 4A3 = D3 -->
<Port Location="XS1_PORT_1C" Name="PORT_LED_D2"/>
<Port Location="XS1_PORT_4D" Name="PORT_LED_D4_7_6"/> <!-- 4D3 = D4, 4D2 = D7, 4D0 = D6 -->
</Tile> </Tile>
</Node> </Node>

File diff suppressed because it is too large Load Diff

View File

@@ -1,50 +0,0 @@
#include "gpio_access.h"
#include "swlock.h"
#include <xs1.h>
swlock_t gpo_swlock = SWLOCK_INITIAL_VALUE;
void p_gpio_lock()
{
swlock_acquire(&gpo_swlock);
}
void p_gpio_unlock()
{
swlock_release(&gpo_swlock);
}
unsigned p_gpio_peek()
{
unsigned portId, x;
// Wrapped in lock to ensure it's safe from multiple logical cores
swlock_acquire(&gpo_swlock);
asm("ldw %0, dp[p_gpio]":"=r"(portId));
asm volatile("peek %0, res[%1]":"=r"(x):"r"(portId));
return x;
}
void p_gpio_out(unsigned x)
{
unsigned portId;
asm("ldw %0, dp[p_gpio]":"=r"(portId));
asm volatile("out res[%0], %1"::"r"(portId),"r"(x));
// Wrapped in lock to ensure it's safe from multiple logical cores
swlock_release(&gpo_swlock);
}
void set_gpio(unsigned bit, unsigned value)
{
unsigned port_shadow;
port_shadow = p_gpio_peek(); // Read port pin value
if (value == 0) port_shadow &= ~bit; // If writing a 0, generate mask and AND with current val
else port_shadow |= bit; // Else use mask and OR to set bit
p_gpio_out(port_shadow); // Write back to port. Will make port an output if not already
}

View File

@@ -1,4 +1,3 @@
#define DEBUG_PRINT_ENABLE 1
#include <xs1.h> #include <xs1.h>
#include <platform.h> #include <platform.h>
#include "xua_conf.h" #include "xua_conf.h"
@@ -12,101 +11,8 @@
#include "hid.h" #include "hid.h"
#include "debug_print.h" #include "debug_print.h"
#if HID_CONTROLS > 0 static unsigned char lastHidData;
#ifdef XSCOPE
#include "print.h"
#endif
#ifdef DFU_CONTROL_USB_HID
#include <xccompat.h>
#define HID_DFU_REPORT_ID 0x41
#endif
#define P_GPI_BUTA_SHIFT 0x00
#define P_GPI_BUTA_MASK (1<<P_GPI_BUTA_SHIFT)
#define P_GPI_BUTB_SHIFT 0x01
#define P_GPI_BUTB_MASK (1<<P_GPI_BUTB_SHIFT)
#define P_GPI_BUTC_SHIFT 0x02
#define P_GPI_BUTC_MASK (1<<P_GPI_BUTC_SHIFT)
#define P_GPI_SW1_SHIFT 0x03
#define P_GPI_SW1_MASK (1<<P_GPI_SW1_SHIFT)
/* Write HID Report Data into hidData array
*
* Bits are as follows:
* 0: Play/Pause
* 1: Scan Next Track
* 2: Scan Prev Track
* 3: Volume Up
* 4: Volume Down
* 5: Mute
*/
unsigned multicontrol_count = 0;
unsigned wait_counter =0;
unsigned long get_reference_time();
#define THRESH 1
#define MULTIPRESS_WAIT 25
#define HID_CONTROL_NEXT 0x02
#define HID_CONTROL_PLAYPAUSE 0x01
#define HID_CONTROL_PREV 0x04
#define HID_CONTROL VOLUP 0x08
#define HID_CONTROL_VOLDN 0x10
#define HID_CONTROL_MUTE 0x20
typedef enum
{
STATE_IDLE = 0x00,
STATE_PLAY = 0x01,
STATE_NEXTPREV = 0x02,
}t_controlState;
t_controlState state;
unsigned lastA;
unsigned g_ButtonVal = 0;
unsigned char g_hid_pass_data0;
unsigned char g_hid_pass_data1;
unsigned char g_hid_pass_data2;
unsigned char g_hid_pass_data3;
unsigned char g_hid_pass_data4;
unsigned char g_hid_pass_data5;
unsigned char g_hid_pass_data6;
unsigned char g_hid_pass_data7;
void UserReadHIDButtons(unsigned char hidData[])
{
unsigned tmp;
GET_SHARED_GLOBAL(tmp, g_ButtonVal);
hidData[0] = tmp;
}
void UserReadHIDPass(unsigned char hidPassData[])
{
int i = 0;
GET_SHARED_GLOBAL(hidPassData[i++], g_hid_pass_data0);
GET_SHARED_GLOBAL(hidPassData[i++], g_hid_pass_data1);
GET_SHARED_GLOBAL(hidPassData[i++], g_hid_pass_data2);
GET_SHARED_GLOBAL(hidPassData[i++], g_hid_pass_data3);
GET_SHARED_GLOBAL(hidPassData[i++], g_hid_pass_data4);
GET_SHARED_GLOBAL(hidPassData[i++], g_hid_pass_data5);
GET_SHARED_GLOBAL(hidPassData[i++], g_hid_pass_data6);
GET_SHARED_GLOBAL(hidPassData[i++], g_hid_pass_data7);
SET_SHARED_GLOBAL(g_hid_pass_data0, 0);
SET_SHARED_GLOBAL(g_hid_pass_data1, 0);
SET_SHARED_GLOBAL(g_hid_pass_data2, 0);
SET_SHARED_GLOBAL(g_hid_pass_data3, 0);
SET_SHARED_GLOBAL(g_hid_pass_data4, 0);
SET_SHARED_GLOBAL(g_hid_pass_data5, 0);
SET_SHARED_GLOBAL(g_hid_pass_data6, 0);
SET_SHARED_GLOBAL(g_hid_pass_data7, 0);
}
#if DEBUG_MEMORY_LOG_ENABLED #if DEBUG_MEMORY_LOG_ENABLED
@@ -149,5 +55,3 @@ void UserReadHIDLog(unsigned char hidLogData[])
} }
#endif #endif
#endif

View File

@@ -24,7 +24,7 @@
#endif #endif
#include "uac_hwresources.h" #include "uac_hwresources.h"
/* 改动原因:引入 C1 面板 LED 控制 interface 声明user_main.h供 main 中声明 interface 实例并连接 AudioHwRemote / app_control_slave。 */ /* 改动原因:引入用户自定义声明user_main.h。 */
#include "user_main.h" #include "user_main.h"
#ifdef IAP #ifdef IAP
@@ -436,12 +436,15 @@ extern void hid_button_task(chanend cc_mic_level, chanend c_hid, chanend c_hidSe
/* 改动原因:与 audiohw.xc 中 AudioHwRemote 一致。HID/音量/MIC 检测等已迁到 tile1 hid_button_task 与 AudioHwRemote2 内物理口; /* 改动原因:与 audiohw.xc 中 AudioHwRemote 一致。HID/音量/MIC 检测等已迁到 tile1 hid_button_task 与 AudioHwRemote2 内物理口;
* codec 仅经 streaming c_audiohwDFU 命令经 c_dfu仅 HID_DFU_EN=1。 */ * codec 仅经 streaming c_audiohwDFU 命令经 c_dfu仅 HID_DFU_EN=1。 */
#if HID_DFU_EN #if HID_DFU_EN
extern void AudioHwRemote(streaming chanend c_audiohw_rx, client interface c1_led_ctrl_if i_c1_led_ctrl, streaming chanend c_dfu_rx); extern void AudioHwRemote(streaming chanend c_audiohw_rx, streaming chanend c_dfu_rx, client interface tx1_led_if led_if);
#else #else
extern void AudioHwRemote(streaming chanend c_audiohw_rx, client interface c1_led_ctrl_if i_c1_led_ctrl); extern void AudioHwRemote(streaming chanend c_audiohw_rx, client interface tx1_led_if led_if);
#endif #endif
extern void dnr_dsp_proc_task(void); extern void dnr_dsp_proc_task(void);
// TX1 LED helper task on tile[1]
extern void tx1_led_helper_task(server interface tx1_led_if led_if);
extern unsafe chanend uc_dsp_to_ex3d[DSP_WORKER_COUNT]; extern unsafe chanend uc_dsp_to_ex3d[DSP_WORKER_COUNT];
extern unsafe chanend uc_dsp_to_dnr_t1; extern unsafe chanend uc_dsp_to_dnr_t1;
extern unsafe chanend uc_key_to_ubm_t0; extern unsafe chanend uc_key_to_ubm_t0;
@@ -555,10 +558,10 @@ int main()
chan c_eq_data; chan c_eq_data;
chan c_uac_vol; chan c_uac_vol;
chan c_ex3d_hid_cmd; chan c_ex3d_hid_cmd;
chan c_ex3d_to_ubm; chan c_ex3d_to_ubm;
/* 改动原因MIC 插拔检测已并入 audiohw.xcp_mic_phone_detect / AudioHwRemote2删除未使用 c_mic_det。
* C1 面板灯tile0 AudioHwRemote 为 c1_led_ctrl_if clienttile1 app_control_slave 为 server。 */ // TX1 LED interface for tile[0] -> tile[1] communication
interface c1_led_ctrl_if i_c1_led_ctrl; interface tx1_led_if i_tx1_led;
par par
{ {
@@ -579,23 +582,16 @@ int main()
key_sender(c_key); key_sender(c_key);
for (int i = 0; i < DSP_WORKER_COUNT; i++) for (int i = 0; i < DSP_WORKER_COUNT; i++)
uc_dsp_to_ex3d[i] = (chanend)c_dsp_to_ex3d[i]; uc_dsp_to_ex3d[i] = (chanend)c_dsp_to_ex3d[i];
ex3d_task(c_ex3d_to_ubm); ex3d_task(c_ex3d_to_ubm);
} }
#endif #endif
} }
} }
/* 改动原因C1 硬件插拔检测与 DAC/MIC 哑音逻辑已并入 tile0 button_task见 audiohw.xc不再使用原 mute_handler + p_ctl_det 方案。 */ on tile[1]: tx1_led_helper_task(i_tx1_led);
on tile[1]: app_control_slave(i_c1_led_ctrl);
/* 改动原因XUA_AudioHub 与 AudioHwRemote/dsp 并行启动AudioHwInit→codec_init 经 CODEC_REGWRITE 使用 uc_audiohw。
* 若仅在 dsp_main 内赋值AudioHub 先跑到 codec_init 时 uc_audiohw 未绑定会 ET_ILLEGAL_RESOURCE。
* 与 fosi_c1 user_main.h 一致:在 tile[0]、启动 AudioHwRemote 之前绑定 streaming chan 发送端句柄。 */
on tile[0] : { on tile[0] : {
unsafe { par {
uc_audiohw = (streaming chanend)c_audiohw;
}
par {
{ {
/* 改动原因:参数顺序与类型对齐 audiohw.xc 的 AudioHwRemote修复链接阶段符号类型不一致。 */ /* 改动原因:参数顺序与类型对齐 audiohw.xc 的 AudioHwRemote修复链接阶段符号类型不一致。 */
{ {
@@ -608,30 +604,33 @@ int main()
#endif #endif
#if HID_DFU_EN #if HID_DFU_EN
AudioHwRemote(c_audiohw, i_c1_led_ctrl, c_dfu); AudioHwRemote(c_audiohw, c_dfu, i_tx1_led);
#else #else
AudioHwRemote(c_audiohw, i_c1_led_ctrl); AudioHwRemote(c_audiohw, i_tx1_led);
#endif #endif
} }
} }
} }
} }
#if EQ_EN == 1
on tile[0] : { on tile[0] : {
{ {
#if HID_DFU_EN #if HID_DFU_EN
unsafe { unsafe {
uc_dfu = (streaming chanend)c_dfu; uc_dfu = (streaming chanend)c_dfu;
} }
#endif #endif
unsafe {
uc_audiohw = (streaming chanend)c_audiohw;
}
#if EQ_EN == 1
dsp_core0(); dsp_core0();
#endif
} }
} }
/* 改动原因uc_audiohw 已在上文 tile[0] AudioHwRemote 父块入口绑定,此处删除重复赋值,避免误读为唯一初始化点。 */
on tile[0] : { dsp_main(c_eq_data); } on tile[0] : { dsp_main(c_eq_data); }
#endif
#if DNR_ENABLE == 1 #if DNR_ENABLE == 1
on tile[0] : { dnr_dsp_proc_task(); } on tile[0] : { dnr_dsp_proc_task(); }
@@ -656,7 +655,7 @@ int main()
#ifdef XUD_PRIORITY_HIGH #ifdef XUD_PRIORITY_HIGH
set_core_high_priority_on(); set_core_high_priority_on();
#endif #endif
/* Run UAC2.0 at high-speed, UAC1.0 at full-speed */ /* Run UAC2.0 at high-speed, UAC1.0 at full-speed */
unsigned usbSpeed = (AUDIO_CLASS == 2) ? XUD_SPEED_HS : XUD_SPEED_FS; unsigned usbSpeed = (AUDIO_CLASS == 2) ? XUD_SPEED_HS : XUD_SPEED_FS;
unsigned xudPwrCfg = (XUA_POWERMODE == XUA_POWERMODE_SELF) ? XUD_PWR_SELF : XUD_PWR_BUS; unsigned xudPwrCfg = (XUA_POWERMODE == XUA_POWERMODE_SELF) ? XUD_PWR_SELF : XUD_PWR_BUS;

View File

@@ -0,0 +1,122 @@
#include <xs1.h>
#include <platform.h>
#include "user_main.h"
// TX1 GPIO LEDs on tile[1] - port declarations (moved from audiohw.xc)
on tile[1]: out port p_led_d5 = XS1_PORT_1A; // FPS20 indicator
on tile[1]: out port p_led_d1 = XS1_PORT_1B; // FOOTSTEPS indicator
on tile[1]: out port p_led_d2 = XS1_PORT_1C; // MIC MUTE indicator
on tile[1]: out port p_led_d3 = XS1_PORT_4A; // GUNSHOT indicator (uses 4A bit3)
on tile[1]: out port p_led_d4_d7_d6 = XS1_PORT_4D; // bit3=D4_GAME, bit2=D7_3A, bit0=D6_FPS71
// TX1 HTR3236 RGB LED driver control
// 改动原因:与 xu316_qf60.xn 中 PORT_HTR3236_SDB 一致,避免硬编码端口与 xn 脱节
on tile[1]: out port p_htr3236_sdb = PORT_HTR3236_SDB;
on tile[1]: out port p_ctl_mute = XS1_PORT_1F; // Amplifier mute control
// tile[1] LED helper task - controls tile[1] GPIO LED ports
// Receives commands via tx1_led_if interface from AudioHwRemote2 on tile[0]
void tx1_led_helper_task(server interface tx1_led_if led_if)
{
// Local state mirrors for tile[1] ports
unsigned d1_state = 1; // active low: 1=off, 0=on
unsigned d2_state = 1;
unsigned d3_state = 0xF; // 4-bit port, bit3 controls D3
unsigned d5_state = 1;
unsigned d4_d7_d6_state = 0xF; // bit3=D4, bit2=D7, bit0=D6
// Init all LEDs off
p_led_d1 <: 1;
p_led_d2 <: 1;
p_led_d3 <: 0xF;
p_led_d5 <: 1;
p_led_d4_d7_d6 <: 0xF;
p_htr3236_sdb <: 0; // HTR3236 disabled initially
p_ctl_mute <: 1; // Muted initially
while (1)
{
select
{
case led_if.led_on(tx1_gpio_led_t led):
switch (led)
{
case TX1_GPIO_LED_D1: d1_state = 0; p_led_d1 <: 0; break;
case TX1_GPIO_LED_D2: d2_state = 0; p_led_d2 <: 0; break;
case TX1_GPIO_LED_D3: d3_state &= ~0x8; p_led_d3 <: d3_state; break;
case TX1_GPIO_LED_D4: d4_d7_d6_state &= ~0x8; p_led_d4_d7_d6 <: d4_d7_d6_state; break;
case TX1_GPIO_LED_D5: d5_state = 0; p_led_d5 <: 0; break;
case TX1_GPIO_LED_D6: d4_d7_d6_state &= ~0x1; p_led_d4_d7_d6 <: d4_d7_d6_state; break;
case TX1_GPIO_LED_D7: d4_d7_d6_state &= ~0x4; p_led_d4_d7_d6 <: d4_d7_d6_state; break;
default: break;
}
break;
case led_if.led_off(tx1_gpio_led_t led):
switch (led)
{
case TX1_GPIO_LED_D1: d1_state = 1; p_led_d1 <: 1; break;
case TX1_GPIO_LED_D2: d2_state = 1; p_led_d2 <: 1; break;
case TX1_GPIO_LED_D3: d3_state |= 0x8; p_led_d3 <: d3_state; break;
case TX1_GPIO_LED_D4: d4_d7_d6_state |= 0x8; p_led_d4_d7_d6 <: d4_d7_d6_state; break;
case TX1_GPIO_LED_D5: d5_state = 1; p_led_d5 <: 1; break;
case TX1_GPIO_LED_D6: d4_d7_d6_state |= 0x1; p_led_d4_d7_d6 <: d4_d7_d6_state; break;
case TX1_GPIO_LED_D7: d4_d7_d6_state |= 0x4; p_led_d4_d7_d6 <: d4_d7_d6_state; break;
default: break;
}
break;
case led_if.set_d4_d7_d6(unsigned d4, unsigned d7, unsigned d6):
d4_d7_d6_state = 0xF; // all off
if (d4) d4_d7_d6_state &= ~0x8;
if (d7) d4_d7_d6_state &= ~0x4;
if (d6) d4_d7_d6_state &= ~0x1;
p_led_d4_d7_d6 <: d4_d7_d6_state;
break;
case led_if.set_all_leds(unsigned d1, unsigned d2, unsigned d3,
unsigned d4, unsigned d5, unsigned d6, unsigned d7):
p_led_d1 <: d1 ? 0 : 1;
p_led_d2 <: d2 ? 0 : 1;
d3_state = d3 ? 0x0 : 0xF;
p_led_d3 <: d3_state;
p_led_d5 <: d5 ? 0 : 1;
d4_d7_d6_state = 0xF;
if (d4) d4_d7_d6_state &= ~0x8;
if (d7) d4_d7_d6_state &= ~0x4;
if (d6) d4_d7_d6_state &= ~0x1;
p_led_d4_d7_d6 <: d4_d7_d6_state;
break;
case led_if.all_off(void):
p_led_d1 <: 1;
p_led_d2 <: 1;
p_led_d3 <: 0xF;
p_led_d5 <: 1;
p_led_d4_d7_d6 <: 0xF;
d1_state = 1; d2_state = 1; d3_state = 0xF;
d5_state = 1; d4_d7_d6_state = 0xF;
break;
case led_if.set_htr3236_sdb(unsigned value):
p_htr3236_sdb <: value;
break;
case led_if.set_mute(unsigned value):
//p_ctl_mute <: value;
break;
case led_if.init(void):
p_led_d1 <: 1;
p_led_d2 <: 1;
p_led_d3 <: 0xF;
p_led_d5 <: 1;
p_led_d4_d7_d6 <: 0xF;
p_htr3236_sdb <: 1; // Enable HTR3236
//p_ctl_mute <: 1; // Muted
d1_state = 1; d2_state = 1; d3_state = 0xF;
d5_state = 1; d4_d7_d6_state = 0xF;
break;
}
}
}

View File

@@ -1,4 +1,3 @@
#ifndef _USER_MAIN_H_ #ifndef _USER_MAIN_H_
#define _USER_MAIN_H_ #define _USER_MAIN_H_
@@ -10,18 +9,48 @@
#include <platform.h> #include <platform.h>
#include "DSBuild.h" #include "DSBuild.h"
/* 改动原因:与 fosi_c1 一致mode/mic 物理灯在 tile[1]tile[0] 的 button_task 通过 client interface 下发状态,由 app_control_slave 统一驱动 GPIO。 */ #define USER_MAIN_DECLARATIONS
interface c1_led_ctrl_if {
void set_mode_led_color(unsigned color_idx); // TX1 LED commands for tile[1] LED helper
void set_mic_mute_state(unsigned mute_switch); typedef enum {
void set_mic_voice_fx(unsigned voice_fx_enabled); TX1_LED_CMD_NONE = 0,
TX1_LED_CMD_ON, // led_id
TX1_LED_CMD_OFF, // led_id
TX1_LED_CMD_SET_D4D7D6, // d4, d7, d6 (0/1 each, on=1)
TX1_LED_CMD_SET_ALL, // d1,d2,d3,d4,d5,d6,d7 (7 bytes, 0/1)
TX1_LED_CMD_HTR3236_SDB, // value (0/1)
TX1_LED_CMD_MUTE, // value (0/1)
TX1_LED_CMD_INIT,
TX1_LED_CMD_ALL_OFF
} tx1_led_cmd_t;
// tile[1] GPIO LED IDs
typedef enum {
TX1_GPIO_LED_D1 = 0, // FOOTSTEPS
TX1_GPIO_LED_D2, // MIC MUTE
TX1_GPIO_LED_D3, // GUNSHOT
TX1_GPIO_LED_D4, // GAME/BYPASS
TX1_GPIO_LED_D5, // FPS20
TX1_GPIO_LED_D6, // FPS71
TX1_GPIO_LED_D7, // 3A
TX1_GPIO_LED_MAX
} tx1_gpio_led_t;
// Interface for tile[1] LED control from tile[0]
interface tx1_led_if {
void led_on(tx1_gpio_led_t led);
void led_off(tx1_gpio_led_t led);
void set_d4_d7_d6(unsigned d4, unsigned d7, unsigned d6);
void set_all_leds(unsigned d1, unsigned d2, unsigned d3,
unsigned d4, unsigned d5, unsigned d6, unsigned d7);
void all_off(void);
void set_htr3236_sdb(unsigned value);
void set_mute(unsigned value);
void init(void);
}; };
void app_control_slave(server interface c1_led_ctrl_if i_c1_led_ctrl); void tx1_led_helper_task(server interface tx1_led_if led_if);
/* 改动原因v71 main.xc 自行展开任务拓扑,此处不注入额外 chan/interface 声明,避免宏续行空定义导致预处理异常。 */
#define USER_MAIN_DECLARATIONS
#endif // __XC__ #endif // __XC__
#endif // _USER_MAIN_H_ #endif // _USER_MAIN_H_