From f481d1fbe46d5497ef88d0bd48d56c2439b530f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Thu, 4 Sep 2025 23:49:17 +0200 Subject: [PATCH 01/12] add cmd gpio --- cmd_parser.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/cmd_parser.c b/cmd_parser.c index 7bf6eca..92d317a 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -13,6 +13,7 @@ #include "rtl837x_flash.h" #include "rtl837x_phy.h" #include "rtl837x_regs.h" +#include "rtl837x_sfr.h" #include "uip/uip.h" #pragma codeseg BANK1 @@ -423,6 +424,22 @@ void cmd_parser(void) __banked if (cmd_compare(0, "sds")) { print_reg(RTL837X_REG_SDS_MODES); } + + if (cmd_compare(0, "gpio")) { + for (uint8_t idx = 0; idx < 3; idx++) { + reg_read_m(RTL837X_REG_GPIO_A + (idx * 4)); + print_string("GPIO "); + write_char(idx + 'A'); + write_char(':'); + write_char(' '); + + print_byte(SFR_DATA_24); + print_byte(SFR_DATA_16); + print_byte(SFR_DATA_8); + print_byte(SFR_DATA_0); + write_char(' '); + } + } } } From 8e9cababfb8cddf5ee5eec12cf0f17bf50e45cbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Fri, 5 Sep 2025 00:10:18 +0200 Subject: [PATCH 02/12] gpio: show also bit changes vs last gpio cmd --- cmd_parser.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/cmd_parser.c b/cmd_parser.c index 92d317a..ef06898 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -32,6 +32,7 @@ extern __code uint8_t * __code hex; extern __xdata uint8_t flash_buf[256]; __xdata uint8_t vlan_names[VLAN_NAMES_SIZE]; __xdata uint16_t vlan_ptr; +__xdata uint8_t gpio_last_value[12] = { 0 }; // Buffer for writing to flash 0x1fd000, copy to 0x1fe000 @@ -427,7 +428,7 @@ void cmd_parser(void) __banked if (cmd_compare(0, "gpio")) { for (uint8_t idx = 0; idx < 3; idx++) { - reg_read_m(RTL837X_REG_GPIO_A + (idx * 4)); + reg_read(RTL837X_REG_GPIO_A + (idx * 4)); print_string("GPIO "); write_char(idx + 'A'); write_char(':'); @@ -438,12 +439,20 @@ void cmd_parser(void) __banked print_byte(SFR_DATA_8); print_byte(SFR_DATA_0); write_char(' '); + print_byte( gpio_last_value[(idx *4)] ^ SFR_DATA_24); + gpio_last_value[(idx *4)] = SFR_DATA_24; + print_byte( gpio_last_value[(idx *4) + 1] ^ SFR_DATA_16); + gpio_last_value[(idx *4) + 1] = SFR_DATA_16; + print_byte( gpio_last_value[(idx *4) + 2] ^ SFR_DATA_8); + gpio_last_value[(idx *4) + 2] = SFR_DATA_8; + print_byte( gpio_last_value[(idx *4) + 3] ^ SFR_DATA_0); + gpio_last_value[(idx *4) + 3] = SFR_DATA_0; + write_char('\n'); } } } } - void execute_config(void) __banked { __xdata uint32_t pos = CONFIG_START; From 74b8280d800b285bb9f2ff4b4080fea49fc104ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sat, 6 Sep 2025 16:56:54 +0200 Subject: [PATCH 03/12] gpio: SOC only has 64 gpio not 96. Remove BANK_A Rename BANK_B to GPIO_00_31 Rename BACK_C to GPIO_32_63 Added also _INPUT, _DIRECTIOn registers --- cmd_parser.c | 2 +- rtl837x_port.c | 4 ++-- rtl837x_regs.h | 17 +++++++++++------ rtlplayground.c | 36 ++++++++++++++++++------------------ 4 files changed, 32 insertions(+), 27 deletions(-) diff --git a/cmd_parser.c b/cmd_parser.c index ef06898..a7d03d7 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -428,7 +428,7 @@ void cmd_parser(void) __banked if (cmd_compare(0, "gpio")) { for (uint8_t idx = 0; idx < 3; idx++) { - reg_read(RTL837X_REG_GPIO_A + (idx * 4)); + reg_read(RTL837X_REG_GPIO_32_63_OUTPUT + (idx * 4)); print_string("GPIO "); write_char(idx + 'A'); write_char(':'); diff --git a/rtl837x_port.c b/rtl837x_port.c index f999196..4383bf0 100644 --- a/rtl837x_port.c +++ b/rtl837x_port.c @@ -423,13 +423,13 @@ void port_stats_print(void) __banked break; } } else { // An SFP Module TODO: This is for 1 module devices - reg_read_m(RTL837X_REG_GPIO_B); + reg_read_m(RTL837X_REG_GPIO_00_31_INPUT); if (!(sfr_data[0] & 0x40)) { print_string("SFP OK\t"); } else { print_string("NO SFP\t"); } - reg_read_m(RTL837X_REG_GPIO_C); + reg_read_m(RTL837X_REG_GPIO_32_63_INPUT); if (sfr_data[3] & 0x20) { print_string("Down\t"); } else { diff --git a/rtl837x_regs.h b/rtl837x_regs.h index a07f2be..58b09b7 100644 --- a/rtl837x_regs.h +++ b/rtl837x_regs.h @@ -44,19 +44,24 @@ * Pin configuration (pinmux) */ -#define RTL837X_PIN_MUX_A 0x7f8c -#define RTL837X_PIN_MUX_B 0x7f90 +#define RTL837X_PIN_MUX_0 0x7f8c +#define RTL837X_PIN_MUX_1 0x7f90 -#define RTL837X_REG_GPIO_A 0x40 +// Output Registers +#define RTL837X_REG_GPIO_00_31_OUTPUT 0x3c +#define RTL837X_REG_GPIO_32_63_OUTPUT 0x40 // BIT 4 resets RTL8224 on 9000-9XH -#define RTL837X_REG_GPIO_B 0x44 +// Input Registers +#define RTL837X_REG_GPIO_00_31_INPUT 0x44 +#define RTL837X_REG_GPIO_32_63_INPUT 0x48 // Bit 1e cleared: SFP Module inserted on 9000-6XH (MOD_DEF0 pin) -#define RTL837X_REG_GPIO_C 0x48 // BIT 5 set: SIGNAL LOS of SFP module on 9000-6XH (RX_LOS pin) -#define RTL837X_REG_GPIO_CONF_A 0x50 +// Direction Registers, 0 = input, 1 = output +#define RTL837X_REG_GPIO_00_31_DIRECTION 0x4c +#define RTL837X_REG_GPIO_32_63_DIRECTION 0x50 // Configures IO direction for bank a #define RTL837X_REG_GPIO_EXT 0x63e8 diff --git a/rtlplayground.c b/rtlplayground.c index c140362..dcff1f9 100644 --- a/rtlplayground.c +++ b/rtlplayground.c @@ -873,7 +873,7 @@ void sfp_print_info(uint8_t sfp) void handle_sfp(void) { - reg_read_m(RTL837X_REG_GPIO_B); + reg_read_m(RTL837X_REG_GPIO_00_31_INPUT); if ((sfp_pins_last & 0x1) && (!(sfr_data[0] & 0x40))) { sfp_pins_last &= ~0x01; print_string("\n "); @@ -893,7 +893,7 @@ void handle_sfp(void) print_string("\n\n"); } - reg_read_m(RTL837X_REG_GPIO_C); + reg_read_m(RTL837X_REG_GPIO_32_63_INPUT); if ((sfp_pins_last & 0x2) && (!(sfr_data[3] & 0x20))) { sfp_pins_last &= ~0x02; print_string("\n\n"); @@ -903,7 +903,7 @@ void handle_sfp(void) print_string("\n\n"); } - reg_read_m(RTL837X_REG_GPIO_C); + reg_read_m(RTL837X_REG_GPIO_32_63_INPUT); if ((sfp_pins_last & 0x10) && (!(sfr_data[1] & 0x04))) { sfp_pins_last &= ~0x10; print_string("\n "); @@ -989,7 +989,7 @@ void idle(void) handle_sfp(); /* Button pressed on KL-8xhm-x2: - reg_read(RTL837X_REG_GPIO_C); + reg_read(RTL837X_REG_GPIO_32_63_INPUT); if (!(sfr_data[2] & 0x40)) print_string("Button pressed\n"); */ @@ -1038,12 +1038,12 @@ void setup_external_irqs(void) void rtl8224_enable(void) { // Set Pin 4 low - reg_bit_clear(RTL837X_REG_GPIO_A, 4); + reg_bit_clear(RTL837X_REG_GPIO_32_63_OUTPUT, 4); // Configure Pin as output - reg_bit_set(RTL837X_REG_GPIO_CONF_A, 4); + reg_bit_set(RTL837X_REG_GPIO_32_63_DIRECTION, 4); delay(100); // Set pin 4 high - reg_bit_set(RTL837X_REG_GPIO_A, 4); + reg_bit_set(RTL837X_REG_GPIO_32_63_OUTPUT, 4); delay(500); } @@ -1064,9 +1064,9 @@ void setup_clock(void) reg_write_m(RTL837X_REG_HW_CONF); // Enable serial interface, set bit 0 - reg_read_m(RTL837X_PIN_MUX_B); + reg_read_m(RTL837X_PIN_MUX_1); sfr_mask_data(0, 0x1, 0x1); - reg_write_m(RTL837X_PIN_MUX_B); + reg_write_m(RTL837X_PIN_MUX_1); } @@ -1286,7 +1286,7 @@ void led_config_9xh(void) reg_bit_clear(0x65dc, 0x1b); // r7f8c:30000000 R7f8c-30000000 r7f8c:30000000 R7f8c-38000000 - reg_bit_set(RTL837X_PIN_MUX_A, 0x1b); + reg_bit_set(RTL837X_PIN_MUX_0, 0x1b); // R6548-0041017f REG_SET(0x6548, 0x0041017f); @@ -1338,13 +1338,13 @@ void led_config(void) // Set bits 1b/1d of 0x7f8c: r7f8c:30000000 R7f8c-30000000 r7f8c:30000000 R7f8c-38000000 if (nSFPPorts == 2) { - reg_bit_set(RTL837X_PIN_MUX_A, 0x1b); // R7f8c-28000000 - reg_bit_clear(RTL837X_PIN_MUX_A, 0x1c); // R7f8c-28000000 - reg_bit_set(RTL837X_PIN_MUX_A, 0x1d); // R7f8c-28000000 + reg_bit_set(RTL837X_PIN_MUX_0, 0x1b); // R7f8c-28000000 + reg_bit_clear(RTL837X_PIN_MUX_0, 0x1c); // R7f8c-28000000 + reg_bit_set(RTL837X_PIN_MUX_0, 0x1d); // R7f8c-28000000 } else { - reg_bit_set(RTL837X_PIN_MUX_A, 0x1d); - reg_bit_set(RTL837X_PIN_MUX_A, 0x1c); - reg_bit_set(RTL837X_PIN_MUX_A, 0x1b); + reg_bit_set(RTL837X_PIN_MUX_0, 0x1d); + reg_bit_set(RTL837X_PIN_MUX_0, 0x1c); + reg_bit_set(RTL837X_PIN_MUX_0, 0x1b); } // LED setup // r6520:0021fdb0 R6520-0021e7b0 r6520:0021e7b0 R6520-0021e6b0 r65f8:00000018 R65f8-00000018 R65fc-fffff000 r6600:00000000 R6600-0000000f r65dc:5fffff00 R65dc-7fffff00 r65dc:7fffff00 R65dc-77ffff00 @@ -1620,10 +1620,10 @@ void setup_i2c(void) REG_SET(0x041c, 0); // HW Control register, enable I2C? - reg_read_m(RTL837X_PIN_MUX_B); + reg_read_m(RTL837X_PIN_MUX_1); sfr_mask_data(3, 0x20, 0x00); // Clear bit 29 sfr_mask_data(0, 0x60, 0x40); // Set bits 5-6 to 0b10 - reg_write_m(RTL837X_PIN_MUX_B); + reg_write_m(RTL837X_PIN_MUX_1); } From e0864f811fdd151e140407547c4132dbf04a492f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sat, 6 Sep 2025 17:05:16 +0200 Subject: [PATCH 04/12] cmd: move gpio status to a function print_gpio_status() --- cmd_parser.c | 55 +++++++++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/cmd_parser.c b/cmd_parser.c index a7d03d7..c6bdbbd 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -32,7 +32,7 @@ extern __code uint8_t * __code hex; extern __xdata uint8_t flash_buf[256]; __xdata uint8_t vlan_names[VLAN_NAMES_SIZE]; __xdata uint16_t vlan_ptr; -__xdata uint8_t gpio_last_value[12] = { 0 }; +__xdata uint8_t gpio_last_value[8] = { 0 }; // Buffer for writing to flash 0x1fd000, copy to 0x1fe000 @@ -284,6 +284,34 @@ uint8_t cmd_tokenize(void) __banked return 0; } +// Print GPIO status +void print_gpio_status(void) { + for (uint8_t idx = 0; idx < 2; idx++) { + reg_read(RTL837X_REG_GPIO_00_31_INPUT + (idx * 4)); + print_string("GPIO "); + write_char(idx + '0'); + write_char(':'); + write_char(' '); + + print_byte(SFR_DATA_24); + print_byte(SFR_DATA_16); + print_byte(SFR_DATA_8); + print_byte(SFR_DATA_0); + + write_char(' '); + print_byte( gpio_last_value[(idx *4)] ^ SFR_DATA_24); + gpio_last_value[(idx *4)] = SFR_DATA_24; + print_byte( gpio_last_value[(idx *4) + 1] ^ SFR_DATA_16); + gpio_last_value[(idx *4) + 1] = SFR_DATA_16; + print_byte( gpio_last_value[(idx *4) + 2] ^ SFR_DATA_8); + gpio_last_value[(idx *4) + 2] = SFR_DATA_8; + print_byte( gpio_last_value[(idx *4) + 3] ^ SFR_DATA_0); + gpio_last_value[(idx *4) + 3] = SFR_DATA_0; + write_char('\n'); + write_char('\n'); + } +} + // Identify command void cmd_parser(void) __banked @@ -426,29 +454,8 @@ void cmd_parser(void) __banked print_reg(RTL837X_REG_SDS_MODES); } - if (cmd_compare(0, "gpio")) { - for (uint8_t idx = 0; idx < 3; idx++) { - reg_read(RTL837X_REG_GPIO_32_63_OUTPUT + (idx * 4)); - print_string("GPIO "); - write_char(idx + 'A'); - write_char(':'); - write_char(' '); - - print_byte(SFR_DATA_24); - print_byte(SFR_DATA_16); - print_byte(SFR_DATA_8); - print_byte(SFR_DATA_0); - write_char(' '); - print_byte( gpio_last_value[(idx *4)] ^ SFR_DATA_24); - gpio_last_value[(idx *4)] = SFR_DATA_24; - print_byte( gpio_last_value[(idx *4) + 1] ^ SFR_DATA_16); - gpio_last_value[(idx *4) + 1] = SFR_DATA_16; - print_byte( gpio_last_value[(idx *4) + 2] ^ SFR_DATA_8); - gpio_last_value[(idx *4) + 2] = SFR_DATA_8; - print_byte( gpio_last_value[(idx *4) + 3] ^ SFR_DATA_0); - gpio_last_value[(idx *4) + 3] = SFR_DATA_0; - write_char('\n'); - } + if (cmd_compare(0, "gpio stat")) { + print_gpio_status(); } } } From 7e729c626cfaa84f7b30042db102c2bcd32285fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sun, 7 Sep 2025 01:03:15 +0200 Subject: [PATCH 05/12] cmd: add reg read and write. like: * `reg w 04` * `reg w 04 00023678` --- cmd_parser.c | 133 ++++++++++++++++++++++++++++++++++++++++++++-- rtl837x_common.h | 1 + rtlplayground.c | 11 ++++ rtlplayground.mem | 4 +- 4 files changed, 144 insertions(+), 5 deletions(-) diff --git a/cmd_parser.c b/cmd_parser.c index c6bdbbd..ed714e0 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -25,6 +25,7 @@ extern __xdata uint8_t isRTL8373; extern __xdata uint16_t mpos; extern volatile __xdata uint32_t ticks; +extern volatile __xdata uint8_t sfr_data[4]; extern __code uint8_t * __code greeting; extern __code uint8_t * __code hex; @@ -34,6 +35,10 @@ __xdata uint8_t vlan_names[VLAN_NAMES_SIZE]; __xdata uint16_t vlan_ptr; __xdata uint8_t gpio_last_value[8] = { 0 }; +// Temporatly for str to hex convertion value. +// Support up to 32_bits. +__xdata uint8_t hexvalue[4] = { 0 }; + // Buffer for writing to flash 0x1fd000, copy to 0x1fe000 __xdata uint8_t cmd_buffer[SBUF_SIZE]; @@ -80,6 +85,50 @@ uint8_t cmd_compare(uint8_t start, uint8_t * __code cmd) } +/* Converts ascii-hex array into value. + returns number of hexvalue[] entries has been written. + return value = 0 means error. +*/ +uint8_t atoi_hex(uint8_t idx) +{ + uint8_t h_idx = 0; + uint8_t val = 0; + uint8_t c; + + while(1) { + c = cmd_buffer[idx]; + + if (c == '\0' || c == ' ') { + break; + } + + // swap hex nibbles + val = (val >> 4) | (val << 4); + + if (c - '0' < 10) { + val |= c - '0'; + } else { + c |= 0x20; + c -= 'a'; + if (c > 5) { + h_idx = 0; + break; + } + val |= c + 10; + } + + idx++; + hexvalue[h_idx >> 1] = val; + + if (h_idx & 1 == 1) { + val = 0; + } + h_idx++; + } + + return ((h_idx + 1) >> 1); +} + uint8_t atoi_short(register uint16_t *vlan, register uint8_t idx) { uint8_t err = 1; @@ -251,6 +300,82 @@ void parse_mirror(void) } +void parse_reg(void) +{ + __xdata uint16_t reg = 0; + uint8_t read = 0xFF; + + if (cmd_words_b[2] < 0) { + write_char('v'); + goto err; + } + + if (cmd_buffer[cmd_words_b[1]] == 'w') { + write_char('w'); + read = 0; + } + + if (cmd_buffer[cmd_words_b[1]] == 'r') { + write_char('r'); + read = 1; + } + + if (read == 0xFF) { + print_string("usage: reg r or reg w "); + return; + } + + uint8_t hex_size = atoi_hex(cmd_words_b[2]); + + if (hex_size == 0 || hex_size > 2) { + write_char('s'); + goto err; + } + + if (hex_size == 1) { + reg = hexvalue[0]; + } else { + reg = (((uint16_t)hexvalue[0]) << 8) | hexvalue[1]; + } + + print_string("REG: "); + print_short(reg); + print_string(": VAL: "); + + if (read) { + reg_read_m(reg); + + } else { + hex_size = atoi_hex(cmd_words_b[3]); + + if (hex_size == 0 || hex_size > 4 || cmd_words_b[3] < 0) { + write_char('S'); + goto err_write; + } + + // zero sfp data + sfr_set_zero(); + + // copy data over + while(hex_size) { + hex_size -= 1; + sfr_data[hex_size] = hexvalue[hex_size]; + } + + reg_write_m(reg); + } + print_sfr_data(); + write_char('\n'); + return; + +err: + print_string("usage: reg r like reg r 00BB"); + return; +err_write: + print_string("usage: reg w like reg e 00BB 00112233"); +} + + // Parse command into words uint8_t cmd_tokenize(void) __banked { @@ -308,7 +433,6 @@ void print_gpio_status(void) { print_byte( gpio_last_value[(idx *4) + 3] ^ SFR_DATA_0); gpio_last_value[(idx *4) + 3] = SFR_DATA_0; write_char('\n'); - write_char('\n'); } } @@ -453,10 +577,12 @@ void cmd_parser(void) __banked if (cmd_compare(0, "sds")) { print_reg(RTL837X_REG_SDS_MODES); } - - if (cmd_compare(0, "gpio stat")) { + if (cmd_compare(0, "gpio")) { print_gpio_status(); } + if (cmd_compare(0, "reg")) { + parse_reg(); + } } } @@ -478,3 +604,4 @@ void execute_config(void) __banked } } while (mpos != 0xffff); } + diff --git a/rtl837x_common.h b/rtl837x_common.h index 46f480d..35d1e49 100644 --- a/rtl837x_common.h +++ b/rtl837x_common.h @@ -75,6 +75,7 @@ void print_reg(uint16_t reg); uint8_t sfp_read_reg(uint8_t slot, uint8_t reg); void reg_bit_set(uint16_t reg_addr, char bit); void reg_bit_clear(uint16_t reg_addr, char bit); +void sfr_set_zero(void); void reset_chip(void); void memcpy(__xdata void * __xdata dst, __xdata const void * __xdata src, uint16_t len); void memcpyc(register __xdata uint8_t *dst, register __code uint8_t *src, register uint16_t len); diff --git a/rtlplayground.c b/rtlplayground.c index dcff1f9..b5ea978 100644 --- a/rtlplayground.c +++ b/rtlplayground.c @@ -61,6 +61,7 @@ __xdata uint8_t sbuf[SBUF_SIZE]; __xdata uint8_t sfr_data[4]; extern __xdata uint8_t cmd_buffer[SBUF_SIZE]; +extern __xdata uint8_t gpio_last_value[8]; __code uint8_t * __code greeting = "\nA minimal prompt to explore the RTL8372:\n"; __code uint8_t * __code hex = "0123456789abcdef"; @@ -380,6 +381,16 @@ void sfr_mask_data(uint8_t n, uint8_t mask, uint8_t set) sfr_data[3-n] = b; } +/* + * This zeros all the sfr data fields + */ +void sfr_set_zero(void) { + uint8_t idx = 4; + while (idx) { + idx -= 1; + sfr_data[idx] = 0; + } +} /* * Transfer Network Interface RX data from the ASIC to the 8051 XMEM diff --git a/rtlplayground.mem b/rtlplayground.mem index 5b1efa1..0f2fcb3 100644 --- a/rtlplayground.mem +++ b/rtlplayground.mem @@ -25,5 +25,5 @@ Other memory: Name Start End Size Max ---------------- -------- -------- -------- -------- PAGED EXT. RAM 0 256 - EXTERNAL RAM 0x0001 0x1ad8 6872 16777216 - ROM/EPROM/FLASH 0x0000 0x1c195 45278 16777216 + EXTERNAL RAM 0x0001 0x1aea 6890 16777216 + ROM/EPROM/FLASH 0x0000 0x1c72c 47034 16777216 From 074c89cf27dc2c7aa1d3003d3b54ce7a8cd95116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sun, 7 Sep 2025 14:50:50 +0200 Subject: [PATCH 06/12] cmd: convert reg to regget and regset. We want to stick close to the origonal commands. See: https://github.com/up-n-atom/SWTG118AS?tab=readme-ov-file#commands --- cmd_parser.c | 104 +++++++++++++++++++++++++--------------------- rtlplayground.mem | 4 +- 2 files changed, 58 insertions(+), 50 deletions(-) diff --git a/cmd_parser.c b/cmd_parser.c index ed714e0..69e7dec 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -300,35 +300,18 @@ void parse_mirror(void) } -void parse_reg(void) +void parse_regget(void) { - __xdata uint16_t reg = 0; - uint8_t read = 0xFF; + uint16_t reg = 0; if (cmd_words_b[2] < 0) { write_char('v'); goto err; } - if (cmd_buffer[cmd_words_b[1]] == 'w') { - write_char('w'); - read = 0; - } - - if (cmd_buffer[cmd_words_b[1]] == 'r') { - write_char('r'); - read = 1; - } - - if (read == 0xFF) { - print_string("usage: reg r or reg w "); - return; - } - - uint8_t hex_size = atoi_hex(cmd_words_b[2]); + uint8_t hex_size = atoi_hex(cmd_words_b[1]); if (hex_size == 0 || hex_size > 2) { - write_char('s'); goto err; } @@ -338,41 +321,63 @@ void parse_reg(void) reg = (((uint16_t)hexvalue[0]) << 8) | hexvalue[1]; } - print_string("REG: "); + print_string("REGGET: "); print_short(reg); print_string(": VAL: "); - if (read) { - reg_read_m(reg); - - } else { - hex_size = atoi_hex(cmd_words_b[3]); - - if (hex_size == 0 || hex_size > 4 || cmd_words_b[3] < 0) { - write_char('S'); - goto err_write; - } - - // zero sfp data - sfr_set_zero(); - - // copy data over - while(hex_size) { - hex_size -= 1; - sfr_data[hex_size] = hexvalue[hex_size]; - } - - reg_write_m(reg); - } + reg_read_m(reg); print_sfr_data(); write_char('\n'); return; err: - print_string("usage: reg r like reg r 00BB"); + print_string("usage: regget \n\tlike: regget 0BB0 or regget 0c"); return; -err_write: - print_string("usage: reg w like reg e 00BB 00112233"); +} + + +void parse_regset(void) +{ + uint16_t reg = 0; + + uint8_t hex_size = atoi_hex(cmd_words_b[1]); + + if (hex_size == 0 || hex_size > 2) { + goto err; + } + + if (hex_size == 1) { + reg = hexvalue[0]; + } else { + reg = (((uint16_t)hexvalue[0]) << 8) | hexvalue[1]; + } + + hex_size = atoi_hex(cmd_words_b[2]); + + if (hex_size == 0 || hex_size > 4 || cmd_words_b[3] < 0) { + goto err; + } + + print_string("REGSET: "); + print_short(reg); + print_string(": VAL: "); + + // zero sfp data + sfr_set_zero(); + + // copy data over + while(hex_size) { + hex_size -= 1; + sfr_data[hex_size] = hexvalue[hex_size]; + } + + reg_write_m(reg); + print_sfr_data(); + write_char('\n'); + return; + +err: + print_string("usage: regset \n\tlike regset 0b abcd1234."); } @@ -580,8 +585,11 @@ void cmd_parser(void) __banked if (cmd_compare(0, "gpio")) { print_gpio_status(); } - if (cmd_compare(0, "reg")) { - parse_reg(); + if (cmd_compare(0, "regget")) { + parse_regget(); + } + if (cmd_compare(0, "regset")) { + parse_regset(); } } } diff --git a/rtlplayground.mem b/rtlplayground.mem index 0f2fcb3..ab1078f 100644 --- a/rtlplayground.mem +++ b/rtlplayground.mem @@ -25,5 +25,5 @@ Other memory: Name Start End Size Max ---------------- -------- -------- -------- -------- PAGED EXT. RAM 0 256 - EXTERNAL RAM 0x0001 0x1aea 6890 16777216 - ROM/EPROM/FLASH 0x0000 0x1c72c 47034 16777216 + EXTERNAL RAM 0x0001 0x1ae8 6888 16777216 + ROM/EPROM/FLASH 0x0000 0x1c72d 47021 16777216 From 1b578405c003bfbbb382c375244e8e02226ef3b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sun, 7 Sep 2025 14:56:13 +0200 Subject: [PATCH 07/12] Remove unused and not related to GPIO define --- rtl837x_regs.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/rtl837x_regs.h b/rtl837x_regs.h index 58b09b7..326acb8 100644 --- a/rtl837x_regs.h +++ b/rtl837x_regs.h @@ -62,9 +62,6 @@ // Direction Registers, 0 = input, 1 = output #define RTL837X_REG_GPIO_00_31_DIRECTION 0x4c #define RTL837X_REG_GPIO_32_63_DIRECTION 0x50 -// Configures IO direction for bank a - -#define RTL837X_REG_GPIO_EXT 0x63e8 /* * I2C controller From 4cad857ad5a3158de69ddb4113a852881292b180 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sun, 7 Sep 2025 16:33:01 +0200 Subject: [PATCH 08/12] fix: cmd: regset: need add offset when we have less then 8 hex numbers --- cmd_parser.c | 3 ++- rtlplayground.mem | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd_parser.c b/cmd_parser.c index 69e7dec..a45850e 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -365,10 +365,11 @@ void parse_regset(void) // zero sfp data sfr_set_zero(); + uint8_t offset = 4 - hex_size; // copy data over while(hex_size) { hex_size -= 1; - sfr_data[hex_size] = hexvalue[hex_size]; + sfr_data[offset + hex_size] = hexvalue[hex_size]; } reg_write_m(reg); diff --git a/rtlplayground.mem b/rtlplayground.mem index ab1078f..622a980 100644 --- a/rtlplayground.mem +++ b/rtlplayground.mem @@ -26,4 +26,4 @@ Other memory: ---------------- -------- -------- -------- -------- PAGED EXT. RAM 0 256 EXTERNAL RAM 0x0001 0x1ae8 6888 16777216 - ROM/EPROM/FLASH 0x0000 0x1c72d 47021 16777216 + ROM/EPROM/FLASH 0x0000 0x1c735 47029 16777216 From 54ab915557faa187f04fcfc424b35f1b484a4aee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sun, 7 Sep 2025 16:52:51 +0200 Subject: [PATCH 09/12] cmd: reg{get,set}: more small refactor Refactor some value checking. Simplified hexvalue to addr. Updated some comments. Remove extra debug prints and EOL after the command. --- cmd_parser.c | 41 ++++++++++++++++++++--------------------- rtlplayground.mem | 2 +- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/cmd_parser.c b/cmd_parser.c index a45850e..27eb596 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -304,8 +304,7 @@ void parse_regget(void) { uint16_t reg = 0; - if (cmd_words_b[2] < 0) { - write_char('v'); + if (cmd_words_b[1] < 0) { goto err; } @@ -315,10 +314,10 @@ void parse_regget(void) goto err; } - if (hex_size == 1) { - reg = hexvalue[0]; - } else { - reg = (((uint16_t)hexvalue[0]) << 8) | hexvalue[1]; + reg = hexvalue[0]; + if (hex_size == 2) { + reg <<= 8; + reg |= hexvalue[1]; } print_string("REGGET: "); @@ -327,7 +326,6 @@ void parse_regget(void) reg_read_m(reg); print_sfr_data(); - write_char('\n'); return; err: @@ -340,41 +338,42 @@ void parse_regset(void) { uint16_t reg = 0; - uint8_t hex_size = atoi_hex(cmd_words_b[1]); + if (cmd_words_b[2] < 0) { + goto err; + } + uint8_t hex_size = atoi_hex(cmd_words_b[1]); if (hex_size == 0 || hex_size > 2) { goto err; } - if (hex_size == 1) { - reg = hexvalue[0]; - } else { - reg = (((uint16_t)hexvalue[0]) << 8) | hexvalue[1]; + reg = hexvalue[0]; + if (hex_size == 2) { + reg <<= 8; + reg |= hexvalue[1]; } hex_size = atoi_hex(cmd_words_b[2]); - - if (hex_size == 0 || hex_size > 4 || cmd_words_b[3] < 0) { + if (hex_size == 0 || hex_size > 4) { goto err; } - print_string("REGSET: "); - print_short(reg); - print_string(": VAL: "); - - // zero sfp data + // zero sfr memory data sfr_set_zero(); + // copy data over sfr memory uint8_t offset = 4 - hex_size; - // copy data over while(hex_size) { hex_size -= 1; sfr_data[offset + hex_size] = hexvalue[hex_size]; } + print_string("REGSET: "); + print_short(reg); reg_write_m(reg); + + print_string(": VAL: "); print_sfr_data(); - write_char('\n'); return; err: diff --git a/rtlplayground.mem b/rtlplayground.mem index 622a980..7626c2d 100644 --- a/rtlplayground.mem +++ b/rtlplayground.mem @@ -26,4 +26,4 @@ Other memory: ---------------- -------- -------- -------- -------- PAGED EXT. RAM 0 256 EXTERNAL RAM 0x0001 0x1ae8 6888 16777216 - ROM/EPROM/FLASH 0x0000 0x1c735 47029 16777216 + ROM/EPROM/FLASH 0x0000 0x1c71b 47003 16777216 From bde84544493bf4ca72fe59eacaecc847a4e54db8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sun, 7 Sep 2025 17:04:46 +0200 Subject: [PATCH 10/12] isletter(): optimized version Less instructions and jumps. Saves 39 bytes. ```patch 1634,1651c1621,1628 < mov r7,a < mov r6,a < ; cmd_parser.c:63: return (l >= 'a' && l <= 'z') || (l >= 'A' && l <= 'Z'); < cjne r7,#0x61,00326$ < 00326$: < mov _parse_vlan_sloc0_1_0,c < jc 00153$ < mov a,r7 < add a,#0xff - 0x7a < mov _parse_vlan_sloc0_1_0,c < jnc 00149$ < 00153$: < cjne r6,#0x41,00329$ < 00329$: < mov _parse_vlan_sloc0_1_0,c < jc 00132$ < mov a,r6 < add a,#0xff - 0x5a --- > ; cmd_parser.c:66: l |= 0x20; > ; cmd_parser.c:67: l -= 'A'; > orl a,#0x20 > ; cmd_parser.c:68: return (l <= ('Z'-'A')); > add a,#0xbf > add a,#0xff - 0x19 > cpl c > ; cmd_parser.c:245: if (cmd_words_b[2] > 0 && isletter(cmd_buffer[cmd_words_b[2]])) { 1653,1654c1630 < jc 00132$ < 00149$: --- > jnc 00132$ ``` --- cmd_parser.c | 7 ++++++- rtlplayground.mem | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/cmd_parser.c b/cmd_parser.c index 27eb596..bf09cdf 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -60,7 +60,12 @@ __code uint8_t phys_to_log_port[6] = { inline uint8_t isletter(uint8_t l) { - return (l >= 'a' && l <= 'z') || (l >= 'A' && l <= 'Z'); + // return (l >= 'a' && l <= 'z') || (l >= 'A' && l <= 'Z'); + + // Make it upper case + l |= 0x20; + l -= 'A'; + return (l <= ('Z'-'A')); } diff --git a/rtlplayground.mem b/rtlplayground.mem index 7626c2d..cc92f39 100644 --- a/rtlplayground.mem +++ b/rtlplayground.mem @@ -26,4 +26,4 @@ Other memory: ---------------- -------- -------- -------- -------- PAGED EXT. RAM 0 256 EXTERNAL RAM 0x0001 0x1ae8 6888 16777216 - ROM/EPROM/FLASH 0x0000 0x1c71b 47003 16777216 + ROM/EPROM/FLASH 0x0000 0x1c6f2 46962 16777216 From 7a2e568fccdf08e732b2385af5d96b4ac70c9b7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Sun, 7 Sep 2025 17:18:36 +0200 Subject: [PATCH 11/12] Make a helper isnumber(), replace all same patterns. --- cmd_parser.c | 27 +++++++++++++++++---------- rtlplayground.mem | 2 +- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/cmd_parser.c b/cmd_parser.c index bf09cdf..3eb4986 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -68,6 +68,13 @@ inline uint8_t isletter(uint8_t l) return (l <= ('Z'-'A')); } +inline uint8_t isnumber(uint8_t l) +{ + // return (l >= '0' && l <= '9'); + l -= '0'; + return (l <= ('9'-'0')); +} + uint8_t cmd_compare(uint8_t start, uint8_t * __code cmd) { @@ -139,7 +146,7 @@ uint8_t atoi_short(register uint16_t *vlan, register uint8_t idx) uint8_t err = 1; *vlan = 0; - while (cmd_buffer[idx] >= '0' && cmd_buffer[idx] <= '9') { + while (isnumber(cmd_buffer[idx])) { err = 0; *vlan = (*vlan * 10) + cmd_buffer[idx] - '0'; idx++; @@ -154,7 +161,7 @@ uint8_t parse_ip(register uint8_t idx) for (b = 0; b < 4; b++) { ip[b] = 0; - while (cmd_buffer[idx] >= '0' && cmd_buffer[idx] <= '9') { + while (isnumber(cmd_buffer[idx])) { ip[b] = (ip[b] * 10) + cmd_buffer[idx] - '0'; idx++; } @@ -177,7 +184,7 @@ void parse_trunk(void) uint8_t w = 2; while (cmd_words_b[w] > 0) { uint8_t port; - if (cmd_buffer[cmd_words_b[w]] >= '0' && cmd_buffer[cmd_words_b[w]] <= '9') { + if (isnumber(cmd_buffer[cmd_words_b[w]])) { port = cmd_buffer[cmd_words_b[w]] - '1'; if (port > maxPort) goto err; @@ -222,9 +229,9 @@ void parse_vlan(void) } while (cmd_words_b[w] > 0) { uint8_t port; - if (cmd_buffer[cmd_words_b[w]] >= '0' && cmd_buffer[cmd_words_b[w]] <= '9') { + if (isnumber(cmd_buffer[cmd_words_b[w]])) { port = cmd_buffer[cmd_words_b[w]] - '1'; - if (cmd_buffer[cmd_words_b[w] + 1] >= '0' && cmd_buffer[cmd_words_b[w] + 1] <= '9') { + if (isnumber(cmd_buffer[cmd_words_b[w] + 1])) { port = (port + 1) * 10 + cmd_buffer[cmd_words_b[w] + 1] - '1'; if (cmd_buffer[cmd_words_b[w] + 2] == 't') tagged |= ((uint16_t)1) << port; @@ -258,23 +265,23 @@ void parse_mirror(void) __xdata uint16_t rx_pmask = 0; __xdata uint16_t tx_pmask = 0; - if (cmd_buffer[cmd_words_b[1]] < '0' || cmd_buffer[cmd_words_b[1]] > '9') { + if (!isnumber(cmd_buffer[cmd_words_b[1]])) { print_string("Port missing: port [port][t/r]..."); return; } mirroring_port = cmd_buffer[cmd_words_b[1]] - '1'; - if (cmd_buffer[cmd_words_b[1] + 1] >= '0' && cmd_buffer[cmd_words_b[1] + 1] <= '9') - mirroring_port = (mirroring_port + 1) * 10 + cmd_buffer[cmd_words_b[1] + 1] - '1'; + if (isnumber(cmd_buffer[cmd_words_b[1] + 1])) + mirroring_port = (mirroring_port + 1) * 10 + cmd_buffer[cmd_words_b[1] + 1] - '1'; if (!isRTL8373) mirroring_port = phys_to_log_port[mirroring_port]; uint8_t w = 2; while (cmd_words_b[w] > 0) { uint8_t port; - if (cmd_buffer[cmd_words_b[w]] >= '0' && cmd_buffer[cmd_words_b[w]] <= '9') { + if (isnumber(cmd_buffer[cmd_words_b[w]])) { port = cmd_buffer[cmd_words_b[w]] - '1'; - if (cmd_buffer[cmd_words_b[w] + 1] >= '0' && cmd_buffer[cmd_words_b[w] + 1] <= '9') { + if (isnumber(cmd_buffer[cmd_words_b[w] + 1])) { port = (port + 1) * 10 + cmd_buffer[cmd_words_b[w] + 1] - '1'; if (!isRTL8373) port = phys_to_log_port[port]; diff --git a/rtlplayground.mem b/rtlplayground.mem index cc92f39..0259cd7 100644 --- a/rtlplayground.mem +++ b/rtlplayground.mem @@ -26,4 +26,4 @@ Other memory: ---------------- -------- -------- -------- -------- PAGED EXT. RAM 0 256 EXTERNAL RAM 0x0001 0x1ae8 6888 16777216 - ROM/EPROM/FLASH 0x0000 0x1c6f2 46962 16777216 + ROM/EPROM/FLASH 0x0000 0x1c69f 46879 16777216 From 455d2e28d6487e63919e221a425b130c65d7f9b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20van=20Dorst?= Date: Mon, 8 Sep 2025 18:50:48 +0200 Subject: [PATCH 12/12] fix: isletter(), make everything lowercase. --- cmd_parser.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cmd_parser.c b/cmd_parser.c index 3eb4986..f976fe2 100644 --- a/cmd_parser.c +++ b/cmd_parser.c @@ -62,12 +62,13 @@ inline uint8_t isletter(uint8_t l) { // return (l >= 'a' && l <= 'z') || (l >= 'A' && l <= 'Z'); - // Make it upper case + // Make it lowercase l |= 0x20; - l -= 'A'; - return (l <= ('Z'-'A')); + l -= 'a'; + return (l <= ('z'-'a')); } + inline uint8_t isnumber(uint8_t l) { // return (l >= '0' && l <= '9');