fix: harden CH390 bring-up diagnostics
This commit is contained in:
@@ -13,7 +13,7 @@ static volatile uint8_t g_ch390_irq_pending;
|
||||
static uint8_t g_ch390_ready;
|
||||
static ch390_diag_t g_diag;
|
||||
|
||||
static void ch390_runtime_refresh_diag(void)
|
||||
static uint8_t ch390_runtime_probe_identity(void)
|
||||
{
|
||||
g_diag.vendor_id = ch390_get_vendor_id();
|
||||
g_diag.product_id = ch390_get_product_id();
|
||||
@@ -25,11 +25,21 @@ static void ch390_runtime_refresh_diag(void)
|
||||
g_diag.intcr = ch390_read_reg(CH390_INTCR);
|
||||
g_diag.gpr = ch390_read_reg(CH390_GPR);
|
||||
g_diag.isr = ch390_read_reg(CH390_ISR);
|
||||
g_diag.link_up = (uint8_t)ch390_get_link_status();
|
||||
g_diag.link_up = (uint8_t)0u;
|
||||
g_diag.id_valid = (uint8_t)((g_diag.vendor_id != 0x0000u) &&
|
||||
(g_diag.vendor_id != 0xFFFFu) &&
|
||||
(g_diag.product_id != 0x0000u) &&
|
||||
(g_diag.product_id != 0xFFFFu));
|
||||
return g_diag.id_valid;
|
||||
}
|
||||
|
||||
static void ch390_runtime_refresh_diag(void)
|
||||
{
|
||||
uint8_t id_valid = ch390_runtime_probe_identity();
|
||||
|
||||
if (id_valid != 0u) {
|
||||
g_diag.link_up = (uint8_t)ch390_get_link_status();
|
||||
}
|
||||
}
|
||||
|
||||
static struct pbuf *ch390_runtime_input(struct netif *netif)
|
||||
@@ -38,6 +48,7 @@ static struct pbuf *ch390_runtime_input(struct netif *netif)
|
||||
struct pbuf *p = NULL;
|
||||
struct pbuf *q;
|
||||
uint16_t len;
|
||||
uint8_t rcr;
|
||||
uint8_t rx_ready;
|
||||
uint8_t rx_header[4];
|
||||
|
||||
@@ -45,11 +56,12 @@ static struct pbuf *ch390_runtime_input(struct netif *netif)
|
||||
rx_ready = ch390_read_reg(CH390_MRCMDX);
|
||||
|
||||
if (rx_ready & CH390_PKT_ERR) {
|
||||
ch390_write_reg(CH390_RCR, 0u);
|
||||
rcr = ch390_read_reg(CH390_RCR);
|
||||
ch390_write_reg(CH390_RCR, (uint8_t)(rcr & (uint8_t)(~RCR_RXEN)));
|
||||
ch390_write_reg(CH390_MPTRCR, 0x01u);
|
||||
ch390_write_reg(CH390_MRRH, 0x0Cu);
|
||||
ch390_delay_us(1000u);
|
||||
ch390_write_reg(CH390_RCR, RCR_RXEN | RCR_DIS_CRC);
|
||||
ch390_write_reg(CH390_RCR, rcr);
|
||||
ethernetif->rx_len = 0u;
|
||||
LINK_STATS_INC(link.drop);
|
||||
return NULL;
|
||||
@@ -107,6 +119,22 @@ void ch390_runtime_init(struct netif *netif, const uint8_t *mac)
|
||||
ch390_spi_init();
|
||||
SEGGER_RTT_WriteString(0, "ETH init: reset\r\n");
|
||||
ch390_hardware_reset();
|
||||
|
||||
SEGGER_RTT_WriteString(0, "ETH init: probe\r\n");
|
||||
g_ch390_ready = ch390_runtime_probe_identity();
|
||||
if (g_ch390_ready == 0u) {
|
||||
netif->hwaddr_len = ETHARP_HWADDR_LEN;
|
||||
netif->mtu = 1500;
|
||||
netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP;
|
||||
|
||||
ethernetif->rx_len = 0u;
|
||||
ethernetif->rx_status = 0u;
|
||||
|
||||
netif_set_link_down(netif);
|
||||
SEGGER_RTT_WriteString(0, "ETH init: invalid chip id\r\n");
|
||||
return;
|
||||
}
|
||||
|
||||
SEGGER_RTT_WriteString(0, "ETH init: default\r\n");
|
||||
ch390_default_config();
|
||||
SEGGER_RTT_WriteString(0, "ETH init: mac\r\n");
|
||||
@@ -151,6 +179,7 @@ void ch390_runtime_poll(struct netif *netif)
|
||||
ch390_write_reg(CH390_ISR, int_status);
|
||||
|
||||
if ((int_status & ISR_LNKCHG) != 0u) {
|
||||
HAL_Delay(65u);
|
||||
ch390_runtime_check_link(netif);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user