Skip to content
This repository was archived by the owner on Dec 14, 2025. It is now read-only.

Commit a10b586

Browse files
committed
[ADAPTER] Reload bare core on multitap & dev_mode cfg changes
1 parent b58b0b4 commit a10b586

10 files changed

Lines changed: 68 additions & 7 deletions

File tree

main/adapter/config.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "system/fs.h"
1616
#include "adapter/gameid.h"
1717
#include "bluetooth/mon.h"
18+
#include "system/manager.h"
1819

1920
struct config config;
2021
struct hw_config hw_config = {
@@ -113,6 +114,7 @@ static uint32_t config_version_magic[] = {
113114
static uint8_t config_default_combo[BR_COMBO_CNT] = {
114115
PAD_LM, PAD_RM, PAD_MM, PAD_RB_UP, PAD_RB_LEFT, PAD_RB_RIGHT, PAD_RB_DOWN, PAD_LD_UP, PAD_LD_DOWN, PAD_MS
115116
};
117+
static bool config_rst_bare_core = false;
116118

117119
static void config_init_struct(struct config *data);
118120
static void config_init_nvs_patch(struct config *data);
@@ -384,6 +386,36 @@ static int32_t config_store_on_file(struct config *data, char *filename) {
384386
return ret;
385387
}
386388

389+
static bool config_is_rst_required(void) {
390+
static uint32_t magic = 0;
391+
static uint8_t multitap_cfg = 0;
392+
static uint8_t dev_mode[WIRED_MAX_DEV] = {0};
393+
bool ret = false;
394+
395+
if (multitap_cfg != config.global_cfg.multitap_cfg) {
396+
ret = true;
397+
}
398+
multitap_cfg = config.global_cfg.multitap_cfg;
399+
400+
for (uint32_t i = 0; i < WIRED_MAX_DEV; i++) {
401+
if (dev_mode[i] != config.out_cfg[i].dev_mode) {
402+
ret = true;
403+
}
404+
dev_mode[i] = config.out_cfg[i].dev_mode;
405+
}
406+
407+
if (magic != config.magic) {
408+
ret = false;
409+
}
410+
magic = config.magic;
411+
412+
return ret;
413+
}
414+
415+
void IRAM_ATTR config_set_rst_bare_core(bool value) {
416+
config_rst_bare_core = value;
417+
}
418+
387419
void hw_config_patch(void) {
388420
esp_err_t err;
389421
nvs_handle_t nvs;
@@ -427,6 +459,10 @@ void config_init(uint32_t src) {
427459
}
428460

429461
config_load_from_file(&config, filename);
462+
if (config_rst_bare_core && config_is_rst_required()) {
463+
sys_mgr_cmd(SYS_MGR_CMD_WIRED_RST);
464+
printf("# %s: Reloaded wired core cfg: %s\n", __FUNCTION__, filename);
465+
}
430466
}
431467

432468
void config_update(uint32_t dst) {
@@ -442,6 +478,10 @@ void config_update(uint32_t dst) {
442478
}
443479

444480
config_store_on_file(&config, filename);
481+
if (config_rst_bare_core && config_is_rst_required()) {
482+
sys_mgr_cmd(SYS_MGR_CMD_WIRED_RST);
483+
printf("# %s: Reloaded wired core cfg: %s\n", __FUNCTION__, filename);
484+
}
445485
}
446486

447487
uint32_t config_get_src(void) {

main/adapter/config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ struct hw_config {
101101
extern struct config config;
102102
extern struct hw_config hw_config;
103103

104+
void config_set_rst_bare_core(bool value);
104105
void hw_config_patch(void);
105106
void config_init(uint32_t src);
106107
void config_update(uint32_t dst);

main/system/manager.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,13 @@ void sys_mgr_cmd(uint8_t cmd) {
570570
printf("# %s cmd_q full!\n", __FUNCTION__);
571571
}
572572
}
573+
else {
574+
printf("# %s cmd_q_hdl NULL!\n", __FUNCTION__);
575+
if (cmd == SYS_MGR_CMD_WIRED_RST) {
576+
/* For gameid cfg we may need to reset bare core very early */
577+
sys_mgr_wired_reset();
578+
}
579+
}
573580
}
574581

575582
void sys_mgr_init(uint32_t package) {

main/wired/cdi_uart.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021-2023, Jacques Gagnon
2+
* Copyright (c) 2021-2025, Jacques Gagnon
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

@@ -270,6 +270,7 @@ static unsigned isr_dispatch(unsigned cause) {
270270
void cdi_uart_init(uint32_t package) {
271271
#if defined (CONFIG_BLUERETRO_SYSTEM_CDI)
272272
gpio_config_t io_conf = {0};
273+
config_set_rst_bare_core(true);
273274

274275
for (uint32_t i = 0; i < CDI_PORT_MAX; i++) {
275276
struct cdi_ctrl_port *p = &cdi_ctrl_ports[i];

main/wired/jag_io.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2019-2023, Jacques Gagnon
2+
* Copyright (c) 2019-2025, Jacques Gagnon
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

@@ -451,6 +451,8 @@ void jag_io_init(uint32_t package) {
451451
uint8_t inputs[] = {P1_J0_PIN, P1_J1_PIN, P1_J2_PIN, P1_J3_PIN};
452452
uint8_t outputs[] = {P1_J8_PIN, P1_J9_PIN, P1_J10_PIN, P1_J11_PIN, P1_B0_PIN, P1_B1_PIN};
453453

454+
config_set_rst_bare_core(true);
455+
454456
/* Inputs */
455457
io_conf.intr_type = GPIO_INTR_DISABLE;
456458
io_conf.mode = GPIO_MODE_INPUT;

main/wired/npiso_io.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2019-2023, Jacques Gagnon
2+
* Copyright (c) 2019-2025, Jacques Gagnon
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

@@ -570,6 +570,8 @@ void npiso_init(uint32_t package)
570570
{
571571
gpio_config_t io_conf = {0};
572572

573+
config_set_rst_bare_core(true);
574+
573575
if (wired_adapter.system_id == NES) {
574576
switch (config.global_cfg.multitap_cfg) {
575577
case MT_SLOT_1:

main/wired/pce_io.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2021-2023, Jacques Gagnon
2+
* Copyright (c) 2021-2025, Jacques Gagnon
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

@@ -351,6 +351,8 @@ static unsigned pce_kb_oe_isr(unsigned cause) {
351351
void pce_io_init(uint32_t package) {
352352
gpio_config_t io_conf = {0};
353353

354+
config_set_rst_bare_core(true);
355+
354356
/* SEL */
355357
io_conf.intr_type = GPIO_INTR_DISABLE;
356358
io_conf.pin_bit_mask = 1ULL << P1_SEL_PIN;

main/wired/ps_spi.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2019-2023, Jacques Gagnon
2+
* Copyright (c) 2019-2025, Jacques Gagnon
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

@@ -721,6 +721,8 @@ static unsigned isr_dispatch(unsigned cause) {
721721
}
722722

723723
void ps_spi_init(uint32_t package) {
724+
config_set_rst_bare_core(true);
725+
724726
for (uint32_t i = 0; i < PS_PORT_MAX; i++) {
725727
memset(ps_ctrl_ports[i].dev_id, 0x41, sizeof(ps_ctrl_ports[0].dev_id));
726728
memset(ps_ctrl_ports[i].pend_dev_id, 0x41, sizeof(ps_ctrl_ports[0].pend_dev_id));

main/wired/sega_io.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2019-2023, Jacques Gagnon
2+
* Copyright (c) 2019-2025, Jacques Gagnon
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

@@ -939,6 +939,8 @@ void sega_io_init(uint32_t package) {
939939
gpio_config_t io_conf = {0};
940940
uint8_t port_cnt = 0;
941941

942+
config_set_rst_bare_core(true);
943+
942944
dev_type[0] = DEV_NONE;
943945
dev_type[1] = DEV_NONE;
944946

main/wired/wii_i2c.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2019-2023, Jacques Gagnon
2+
* Copyright (c) 2019-2025, Jacques Gagnon
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

@@ -294,6 +294,8 @@ static unsigned isr_dispatch(unsigned cause) {
294294

295295
void wii_i2c_init(uint32_t package) {
296296
#if defined (CONFIG_BLUERETRO_SYSTEM_WII_EXT) || defined(CONFIG_BLUERETRO_SYSTEM_UNIVERSAL)
297+
config_set_rst_bare_core(true);
298+
297299
for (uint32_t i = 0; i < WII_PORT_MAX; i++) {
298300
struct wii_ctrl_port *p = &wii_ctrl_ports[i];
299301

0 commit comments

Comments
 (0)