fix: harden CH390 bring-up diagnostics

This commit is contained in:
2026-04-01 04:22:13 +08:00
parent 14a532290d
commit 1808f9916f
3 changed files with 46 additions and 35 deletions
+33 -4
View File
@@ -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);
}