mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-08-30 14:52:51 +08:00
Add support for 10G Fiber
This commit is contained in:
+38
-9
@@ -419,19 +419,28 @@ void cpy_4(__xdata uint8_t dest[], __xdata uint8_t source[])
|
|||||||
|
|
||||||
void sds_config(uint8_t sds, uint8_t mode)
|
void sds_config(uint8_t sds, uint8_t mode)
|
||||||
{
|
{
|
||||||
|
print_string("\r\nsds_config: sds: ");
|
||||||
|
print_byte(sds);
|
||||||
|
print_string(", mode: 0x");
|
||||||
|
print_byte(mode);
|
||||||
print_string("\r\nBEFORE RTL837X_REG_SDS_MODES: ");
|
print_string("\r\nBEFORE RTL837X_REG_SDS_MODES: ");
|
||||||
print_reg(RTL837X_REG_SDS_MODES);
|
print_reg(RTL837X_REG_SDS_MODES);
|
||||||
reg_read_m(RTL837X_REG_SDS_MODES);
|
reg_read_m(RTL837X_REG_SDS_MODES);
|
||||||
|
sfr_data[0] = 0;
|
||||||
|
sfr_data[1] = 0;
|
||||||
if (!sds) {
|
if (!sds) {
|
||||||
sfr_mask_data(0, 0x1f, mode);
|
sfr_mask_data(0, 0x1f, mode);
|
||||||
} else {
|
} else {
|
||||||
sfr_mask_data(0, 0xe0, mode << 5);
|
sfr_mask_data(0, 0xe0, mode << 5);
|
||||||
sfr_mask_data(1, 0x03, mode >> 3);
|
sfr_mask_data(1, 0xf3, mode >> 3);
|
||||||
}
|
}
|
||||||
reg_write_m(RTL837X_REG_SDS_MODES);
|
reg_write_m(RTL837X_REG_SDS_MODES);
|
||||||
print_string("\r\nRTL837X_REG_SDS_MODES: ");
|
print_string("\r\nRTL837X_REG_SDS_MODES: ");
|
||||||
print_reg(RTL837X_REG_SDS_MODES);
|
print_reg(RTL837X_REG_SDS_MODES);
|
||||||
|
|
||||||
|
if (mode == SDS_10GR) // 10G Fiber
|
||||||
|
sds_write_v(sds, 0x21, 0x10, 0x4480); // Q002110:6480
|
||||||
|
else
|
||||||
sds_write_v(sds, 0x21, 0x10, 0x6400); // Q002110:6480
|
sds_write_v(sds, 0x21, 0x10, 0x6400); // Q002110:6480
|
||||||
sds_write_v(sds, 0x21, 0x13, 0x0400); // Q002113:0400
|
sds_write_v(sds, 0x21, 0x13, 0x0400); // Q002113:0400
|
||||||
sds_write_v(sds, 0x21, 0x18, 0x6d02); // Q002118:6d02
|
sds_write_v(sds, 0x21, 0x18, 0x6d02); // Q002118:6d02
|
||||||
@@ -447,21 +456,35 @@ void sds_config(uint8_t sds, uint8_t mode)
|
|||||||
print_string("\r\n");
|
print_string("\r\n");
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case 0x02:
|
case SDS_SGMII:
|
||||||
case 0x04:
|
case SDS_1000BX_FIBER:
|
||||||
SFR_DATA_8 = 0x03;
|
SFR_DATA_8 = 0x03;
|
||||||
page = 0x24;
|
page = 0x24;
|
||||||
break;
|
break;
|
||||||
case 0x12:
|
case SDS_HISGMII:
|
||||||
SFR_DATA_8 = 0x02;
|
SFR_DATA_8 = 0x02;
|
||||||
page = 0x28;
|
page = 0x28;
|
||||||
break;
|
break;
|
||||||
|
case SDS_10GR:
|
||||||
|
SFR_DATA_8 = 0x02;
|
||||||
|
page = 0x2e;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
print_string("Error in SDS Mode\r\n");
|
print_string("Error in SDS Mode\r\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
sds_write(sds, 0x36, 0x10); // Q003610:0200
|
sds_write(sds, 0x36, 0x10); // Q003610:0200
|
||||||
|
|
||||||
|
if (page == 0x2e) { // 10G Fiber
|
||||||
|
sds_write_v(sds, page, 0x04, 0x0080); // Q012e04:0080
|
||||||
|
sds_write_v(sds, page, 0x06, 0x0408); // Q012e06:0408
|
||||||
|
sds_write_v(sds, page, 0x07, 0x020d); // Q012e07:020d
|
||||||
|
sds_write_v(sds, page, 0x09, 0x0601); // Q012e09:0601
|
||||||
|
sds_write_v(sds, page, 0x0b, 0x222c); // Q012e0b:222c
|
||||||
|
sds_write_v(sds, page, 0x0c, 0xa217); // Q012e0c:a217
|
||||||
|
sds_write_v(sds, page, 0x0d, 0xfe40); // Q012e0d:fe40
|
||||||
|
sds_write_v(sds, page, 0x15, 0xf5c1); // Q012e15:f5c1
|
||||||
|
} else {
|
||||||
sds_write_v(sds, page, 0x04, 0x0080); // Q002804:0080
|
sds_write_v(sds, page, 0x04, 0x0080); // Q002804:0080
|
||||||
sds_write_v(sds, page, 0x07, 0x1201); // Q002807:1201
|
sds_write_v(sds, page, 0x07, 0x1201); // Q002807:1201
|
||||||
sds_write_v(sds, page, 0x09, 0x0601); // Q002809:0601
|
sds_write_v(sds, page, 0x09, 0x0601); // Q002809:0601
|
||||||
@@ -469,8 +492,10 @@ void sds_config(uint8_t sds, uint8_t mode)
|
|||||||
sds_write_v(sds, page, 0x0c, 0x9217); // Q00280c:9217
|
sds_write_v(sds, page, 0x0c, 0x9217); // Q00280c:9217
|
||||||
sds_write_v(sds, page, 0x0f, 0x5b50); // Q00280f:5b50
|
sds_write_v(sds, page, 0x0f, 0x5b50); // Q00280f:5b50
|
||||||
sds_write_v(sds, page, 0x15, 0xe7f1); // Q002815:e7f1
|
sds_write_v(sds, page, 0x15, 0xe7f1); // Q002815:e7f1
|
||||||
sds_write_v(sds, page, 0x16, 0x0443); // Q002816:0443
|
}
|
||||||
sds_write_v(sds, page, 0x1d, 0xabb0); // Q00281d:abb0
|
|
||||||
|
sds_write_v(sds, page, 0x16, 0x0443); // Q002816:0443 / Q012e16:0443
|
||||||
|
sds_write_v(sds, page, 0x1d, 0xabb0); // Q00281d:abb0 / Q012e1d:abb0
|
||||||
|
|
||||||
sds_write_v(sds, 0x06, 0x12, 0x5078); // Q000612:5078
|
sds_write_v(sds, 0x06, 0x12, 0x5078); // Q000612:5078
|
||||||
sds_write_v(sds, 0x07, 0x06, 0x9401); // Q000706:9401
|
sds_write_v(sds, 0x07, 0x06, 0x9401); // Q000706:9401
|
||||||
@@ -551,9 +576,9 @@ void idle(void)
|
|||||||
cpy_4(linkbits_last, sfr_data);
|
cpy_4(linkbits_last, sfr_data);
|
||||||
if (p5_last != p5) {
|
if (p5_last != p5) {
|
||||||
if (p5 == 0x5) // 2.5GBit Mode
|
if (p5 == 0x5) // 2.5GBit Mode
|
||||||
sds_config(0, 0x12);
|
sds_config(0, SDS_HISGMII);
|
||||||
else if (p5 == 0x2) // 1GBit
|
else if (p5 == 0x2) // 1GBit
|
||||||
sds_config(0, 0x2);
|
sds_config(0, SDS_SGMII);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -566,6 +591,8 @@ void idle(void)
|
|||||||
uint8_t rate = sfp_read_reg(12);
|
uint8_t rate = sfp_read_reg(12);
|
||||||
print_string("\r\nRate: ");
|
print_string("\r\nRate: ");
|
||||||
print_byte(rate);
|
print_byte(rate);
|
||||||
|
print_string("\r\nEncoding: ");
|
||||||
|
print_byte(sfp_read_reg(11));
|
||||||
print_string("\r\n");
|
print_string("\r\n");
|
||||||
for (uint8_t i = 20; i < 60; i++) {
|
for (uint8_t i = 20; i < 60; i++) {
|
||||||
uint8_t c = sfp_read_reg(i);
|
uint8_t c = sfp_read_reg(i);
|
||||||
@@ -574,7 +601,9 @@ void idle(void)
|
|||||||
}
|
}
|
||||||
print_string("\r\n");
|
print_string("\r\n");
|
||||||
if (rate == 0xd)
|
if (rate == 0xd)
|
||||||
sds_config(1, 0x4);
|
sds_config(1, SDS_1000BX_FIBER);
|
||||||
|
if (rate > 0x65 && rate < 0x70)
|
||||||
|
sds_config(1, SDS_10GR);
|
||||||
|
|
||||||
}
|
}
|
||||||
if ((!(sfp_pins_last & 0x1)) && (sfr_data[0] & 0x40)) {
|
if ((!(sfp_pins_last & 0x1)) && (sfr_data[0] & 0x40)) {
|
||||||
|
|||||||
Reference in New Issue
Block a user