This commit is contained in:
2025-11-07 19:29:06 +06:00
parent d577c5193c
commit 1403c53d32
3 changed files with 36 additions and 27 deletions

4
main.c
View File

@@ -79,14 +79,12 @@ int main() {
netif_add(&g_netif, &ipaddr, &netmask, &gw, NULL, &ethernetif_init,
&ethernet_input);
// netif_set_link_callback(&g_netif, link_status_callback);
netif_set_default(&g_netif);
netif_set_up(&g_netif);
dhcp_start(&g_netif);
ethernetif_init(&g_netif);
uint32_t last_led_toggle = 0;
uint32_t last_send_time = 0;
int led_state = 0;

View File

@@ -75,6 +75,10 @@ void ETH_IRQHandler(void) {
g_isr_call_count++;
uint8_t flags = ETH10M->EIR;
if (flags & RB_ETH_EIR_RXIF) {
printf("<<< RX Interrupt Fired. EIR=0x%02X >>>>>\n", flags);
}
// tx complete/error
if (flags & (RB_ETH_EIR_TXIF | RB_ETH_EIR_TXERIF)) {
// release DMA descriptor back to cpu
@@ -113,8 +117,8 @@ static void low_level_init(struct netif* netif) {
// interrupts
ETH10M->EIE = 0; // clear
ETH10M->EIE = RB_ETH_EIE_INTIE | RB_ETH_EIE_RXIE | RB_ETH_EIE_LINKIE |
RB_ETH_EIE_TXIE | RB_ETH_EIE_TXERIE | RB_ETH_EIE_RXERIE;
ETH10M->EIE = RB_ETH_EIE_INTIE | RB_ETH_EIE_LINKIE | RB_ETH_EIE_TXIE |
RB_ETH_EIE_TXERIE | RB_ETH_EIE_RXERIE;
ETH10M->EIE |= RB_ETH_EIE_R_EN50; // 50 ohm pull-up
ETH10M->EIR = 0xFF;
@@ -196,51 +200,52 @@ static err_t low_level_output(struct netif* netif, struct pbuf* p) {
return ERR_OK;
}
static struct pbuf* low_level_input(struct netif* netif) {
struct pbuf* low_level_input(struct netif* netif) {
struct ethernetif* ethernetif = netif->state;
struct pbuf *p = NULL, *q;
u16_t len;
ETH_DMADESCTypeDef* dmarxdesc;
if (ETH10M->EIR & RB_ETH_EIR_RXIF) {
dmarxdesc = ethernetif->DMARxDescToGet;
if ((ethernetif->DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == 0) {
if (ETH10M->ESTAT & (RB_ETH_ESTAT_BUFER | RB_ETH_ESTAT_RXCRCER)) {
len = 0; // drop packet
// printf("RX ESTAT Error: 0x%02X\n", ETH10M->ESTAT);
len = 0;
printf("HW RX Error ESTAT: 0x%02X\n", (unsigned int)ETH10M->ESTAT);
ETH10M->ESTAT |= (RB_ETH_ESTAT_BUFER | RB_ETH_ESTAT_RXCRCER);
} else {
len = ETH10M->ERXLN;
if (len > 4) {
len -= 4;
} else {
len = 0;
}
}
// copy valid packet to pbuf
if (len > 0) {
p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
if (p != NULL) {
uint8_t* rx_buffer = (uint8_t*)ethernetif->DMARxDescToGet->Buffer1Addr;
uint8_t* rx_buffer = (uint8_t*)dmarxdesc->Buffer1Addr;
uint32_t bytes_copied = 0;
for (q = p; q != NULL; q = q->next) {
memcpy(q->payload, rx_buffer + bytes_copied, q->len);
bytes_copied += q->len;
}
MIB2_STATS_NETIF_ADD(netif, ifinoctets, p->tot_len);
printf(
"\n>>> Packet Received (len=%d, MAC len=%d). Copied to LwIP. "
"<<<\n\n",
len, ETH10M->ERXLN);
} else {
printf("pbuf_alloc failed. Dropping packet.\n");
}
}
ethernetif->DMARxDescToGet->Status |= ETH_DMARxDesc_OWN;
dmarxdesc->Status = ETH_DMARxDesc_OWN;
ethernetif->DMARxDescToGet =
(ETH_DMADESCTypeDef*)ethernetif->DMARxDescToGet->Buffer2NextDescAddr;
(ETH_DMADESCTypeDef*)dmarxdesc->Buffer2NextDescAddr;
// tell hw where next free buffer is?
ETH10M->ERXST = (uint32_t)ethernetif->DMARxDescToGet->Buffer1Addr;
ETH10M->EIR = RB_ETH_EIR_RXIF;
return p;
return p; // return pbuf to LwIP
}
return NULL; // no packet
return NULL; // No packet was available.
}
void ethernetif_input(struct netif* netif) {
@@ -290,6 +295,7 @@ err_t ethernetif_init(struct netif* netif) {
}
void ethernetif_link_poll(struct netif* netif) {
struct ethernetif* ethernetif = netif->state;
static uint32_t last_poll_time = 0;
uint32_t now = millis();
@@ -305,6 +311,7 @@ void ethernetif_link_poll(struct netif* netif) {
if (!netif_is_link_up(netif)) {
printf("Link is UP (10M-FD Mode)\n");
ETH10M->ERXST = (uint32_t)ethernetif->DMARxDescToGet->Buffer1Addr;
ETH10M->ECON1 |= RB_ETH_ECON1_RXEN;
netif_set_link_up(netif);

View File

@@ -4,9 +4,11 @@
#define LWIP_DEBUG 1
#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL
#define DHCP_DEBUG LWIP_DBG_ON
#define NETIF_DEBUG LWIP_DBG_ON
#define ETHARP_DEBUG LWIP_DBG_ON
#define UDP_DEBUG LWIP_DBG_ON
#define IP_DEBUG LWIP_DBG_ON
#define DHCP_DEBUG LWIP_DBG_ON
#define NETIF_DEBUG LWIP_DBG_ON
#define ETHARP_DEBUG LWIP_DBG_ON
#define NO_SYS 1
@@ -40,7 +42,7 @@
// #define CHECKSUM_GEN_UDP 0
// #define CHECKSUM_GEN_TCP 0
// #define CHECKSUM_CHECK_IP 0
// #define CHECKSUM_CHECK_UDP 0
#define CHECKSUM_CHECK_UDP 0
// #define CHECKSUM_CHECK_TCP 0
// #define LWIP_CHECKSUM_ON_COPY 1
@@ -50,4 +52,6 @@
// Statistics
#define LWIP_STATS 0
#define LWIP_NETIF_LINK_CALLBACK 1
#endif /* __LWIPOPTS_H__ */