fix: dma
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user