diff --git a/rtl837x_leds.c b/rtl837x_leds.c index 4bf38e0..c641af9 100644 --- a/rtl837x_leds.c +++ b/rtl837x_leds.c @@ -26,6 +26,7 @@ extern __xdata uint8_t sfr_data[4]; void leds_dump(void) __banked { + print_string("RTL837X_PIN_MUX_0: "); print_reg(RTL837X_PIN_MUX_0); write_char('\n'); print_string("RTL837X_REG_LED_GLB_IO_EN: "); print_reg(RTL837X_REG_LED_GLB_IO_EN); write_char('\n'); print_string("RTL837X_REG_LED1_0_SET0: "); print_reg(RTL837X_REG_LED1_0_SET0); write_char('\n'); print_string("RTL837X_REG_LED3_2_SET0: "); print_reg(RTL837X_REG_LED3_2_SET0); write_char('\n'); @@ -39,9 +40,9 @@ void leds_dump(void) __banked print_string("RTL837X_LED_PORT_SET_SEL: "); print_reg(RTL837X_LED_PORT_SET_SEL); write_char('\n'); print_string("LED Configuration:\n"); print_string("LED-ID\t\t0\t\t1\t\t2\t\t3\n"); - for (uint8_t set = 0; set < 4; set++) { + for (__xdata uint8_t set = 0; set < 4; set++) { print_string("SET "); write_char('0' + set); write_char(':'); - for (uint8_t ledid = 0; ledid < 4; ledid++) { + for (__xdata uint8_t ledid = 0; ledid < 4; ledid++) { print_string("\t "); uint8_t b; if (set < 2) { @@ -64,12 +65,12 @@ void leds_dump(void) __banked } for (uint8_t i = machine.min_port; i <= machine.max_port; i++) { reg_read_m(RTL837X_LED_PORT_SET_SEL); - uint8_t set = sfr_data[3 - (i >> 2)]; + __xdata uint8_t set = sfr_data[3 - (i >> 2)]; set = (set >> ((i & 3) << 1)); print_string("Port "); write_char('0' + i); print_string(": SET "); write_char('0' + set); print_string(": "); - for (uint8_t ledid = 0; ledid < 4; ledid++) { + for (__xdata uint8_t ledid = 0; ledid < 4; ledid++) { write_char('('); reg_read_m(RTL837X_REG_LED1_0_SET0 - set * 8 - ((ledid >> 1) * 4)); if (ledid & 1) { // LEDID 1, 3 @@ -98,7 +99,7 @@ void leds_dump(void) __banked print_string(" RX"); if (sfr_data[2] & 0x04) print_string(" TX"); - if (sfr_data[2] & 0x00) + if (sfr_data[2] & 0x08) print_string(" COL"); if (sfr_data[2] & 0x10) print_string(" DUPLEX"); @@ -106,7 +107,7 @@ void leds_dump(void) __banked print_string(" TRAINING"); if (sfr_data[2] & 0x40) print_string(" MASTER"); - uint8_t b; + __xdata uint8_t b; if (set < 2) { reg_read_m(RTL837X_REG_LED3_0_SET1); b = sfr_data[3-((set << 1) + (ledid >> 1))]; @@ -128,3 +129,99 @@ void leds_dump(void) __banked write_char('\n'); } } + + +void leds_setup(void) __banked +{ + print_string("leds_setup called\n"); + REG_SET(RTL837X_REG_LED_MODE, 0x0021e6b0); + + // Disable RLDP (Realtek Loop Detection Protocol) LEDs on loop detection + reg_read_m(RTL837X_REG_LED_RLDP_1); + sfr_mask_data(0, 0x03, 0); + reg_write_m(RTL837X_REG_LED_RLDP_1); + + // Set up all Port-LEDs to belong to RLDP + sfr_data[3] = sfr_data[2] = sfr_data[1] = sfr_data[0] = 0; + for (uint8_t i = machine.min_port; i <= (machine.max_port > 7 ? 7 : machine.max_port); i++) + sfr_data[3 - (i >> 2)] |= i & 1 ? 0xf0 : 0x0f; + reg_write_m(RTL837X_REG_LED_RLDP_2); + if (machine.max_port == 8) + REG_SET(RTL837X_REG_LED_RLDP_3, 0x0000000f); // Port 8 + + // Configure high LEDs 27-29: mux and LED enable + if (machine.high_leds.mux & LED_27) + reg_bit_set(RTL837X_PIN_MUX_0, 27); + else + reg_bit_clear(RTL837X_PIN_MUX_0, 27); + + if (machine.high_leds.mux & LED_28) + reg_bit_set(RTL837X_PIN_MUX_0, 28); + else + reg_bit_clear(RTL837X_PIN_MUX_0, 28); + + if (machine.high_leds.mux & LED_29) + reg_bit_set(RTL837X_PIN_MUX_0, 29); + else + reg_bit_clear(RTL837X_PIN_MUX_0, 29); + + if (machine.high_leds.enable & LED_27) + reg_bit_set(RTL837X_REG_LED_GLB_IO_EN, 27); + else + reg_bit_clear(RTL837X_REG_LED_GLB_IO_EN, 27); + + if (machine.high_leds.enable & LED_28) + reg_bit_set(RTL837X_REG_LED_GLB_IO_EN, 28); + else + reg_bit_clear(RTL837X_REG_LED_GLB_IO_EN, 28); + + if (machine.high_leds.enable & LED_29) + reg_bit_set(RTL837X_REG_LED_GLB_IO_EN, 29); + else + reg_bit_clear(RTL837X_REG_LED_GLB_IO_EN, 29); + + + // Configure the LED-set of a port + sfr_data[3] = sfr_data[2] = sfr_data[1] = sfr_data[0] = 0; + for (uint8_t i = machine.min_port; i <= machine.max_port; i++) + sfr_data[3 - (i >> 2)] |= machine.port_led_set[i] << ((i & 3) << 1); + reg_write_m(RTL837X_LED_PORT_SET_SEL); + + // Configure the LED-sets + __code uint8_t * __xdata lptr = &machine.led_sets[0][0]; + for (__xdata uint8_t set = 0; set < 4; set++) { + sfr_data[0] = *(lptr + 5); + sfr_data[1] = *(lptr + 4); + sfr_data[2] = *(lptr + 1); + sfr_data[3] = *(lptr); + reg_write_m(RTL837X_REG_LED1_0_SET0 - set * 8); + + if (set < 2) { + reg_read_m(RTL837X_REG_LED3_0_SET1); + sfr_data[3 - (set << 1)] = (*(lptr + 6) << 4) | (*(lptr + 2)); + reg_write_m(RTL837X_REG_LED3_0_SET1); + } else { + reg_read_m(RTL837X_REG_LED3_0_SET3); + sfr_data[3 - (set << 1)] = (*(lptr + 6) << 4) | (*(lptr + 2)); + reg_write_m(RTL837X_REG_LED3_0_SET3); + } + lptr += 8; + sfr_data[0] = *(lptr + 5); + sfr_data[1] = *(lptr + 4); + sfr_data[2] = *(lptr + 1); + sfr_data[3] = *(lptr); + reg_write_m(RTL837X_REG_LED1_0_SET0 - set * 8 - 4); + + if (set < 2) { + reg_read_m(RTL837X_REG_LED3_0_SET1); + sfr_data[2 - (set << 1)] = (*(lptr + 6) << 4) | (*(lptr + 2)); + reg_write_m(RTL837X_REG_LED3_0_SET1); + } else { + reg_read_m(RTL837X_REG_LED3_0_SET3); + sfr_data[2 - (set << 1)] = (*(lptr + 6) << 4) | (*(lptr + 2)); + reg_write_m(RTL837X_REG_LED3_0_SET3); + } + lptr += 8; + } + print_string("leds_setup done\n"); +} diff --git a/rtl837x_leds.h b/rtl837x_leds.h index e616c31..0ca1d20 100644 --- a/rtl837x_leds.h +++ b/rtl837x_leds.h @@ -1,7 +1,28 @@ #ifndef _RTL837X_LEDS_H_ #define _RTL837X_LEDS_H_ +#define LEDS_2G5 0x00001 +#define LEDS_TWO_PAIR_1G 0x00002 +#define LEDS_1G 0x00004 +#define LEDS_500M 0x00008 +#define LEDS_100M 0x00010 +#define LEDS_10M 0x00020 +#define LEDS_LINK 0x00040 +#define LEDS_LINK_FLASH 0x00080 +#define LEDS_ACT 0x00100 +#define LEDS_RX 0x00200 +#define LEDS_TX 0x00400 +#define LEDS_COL 0x00800 +#define LEDS_DUPLEX 0x01000 +#define LEDS_TRAINING 0x02000 +#define LEDS_MASTER 0x04000 +#define LEDS_10G 0x10000 +#define LEDS_TWO_PAIR_5G 0x20000 +#define LEDS_5G 0x40000 +#define LEDS_TWO_PAIR_2G5 0x80000 + #include void leds_dump(void) __banked; +void leds_setup(void) __banked; #endif