fix: dma
This commit is contained in:
4
main.c
4
main.c
@@ -79,14 +79,12 @@ int main() {
|
|||||||
|
|
||||||
netif_add(&g_netif, &ipaddr, &netmask, &gw, NULL, ðernetif_init,
|
netif_add(&g_netif, &ipaddr, &netmask, &gw, NULL, ðernetif_init,
|
||||||
ðernet_input);
|
ðernet_input);
|
||||||
|
// netif_set_link_callback(&g_netif, link_status_callback);
|
||||||
netif_set_default(&g_netif);
|
netif_set_default(&g_netif);
|
||||||
netif_set_up(&g_netif);
|
netif_set_up(&g_netif);
|
||||||
|
|
||||||
dhcp_start(&g_netif);
|
dhcp_start(&g_netif);
|
||||||
|
|
||||||
ethernetif_init(&g_netif);
|
|
||||||
|
|
||||||
uint32_t last_led_toggle = 0;
|
uint32_t last_led_toggle = 0;
|
||||||
uint32_t last_send_time = 0;
|
uint32_t last_send_time = 0;
|
||||||
int led_state = 0;
|
int led_state = 0;
|
||||||
|
|||||||
@@ -75,6 +75,10 @@ void ETH_IRQHandler(void) {
|
|||||||
g_isr_call_count++;
|
g_isr_call_count++;
|
||||||
uint8_t flags = ETH10M->EIR;
|
uint8_t flags = ETH10M->EIR;
|
||||||
|
|
||||||
|
if (flags & RB_ETH_EIR_RXIF) {
|
||||||
|
printf("<<< RX Interrupt Fired. EIR=0x%02X >>>>>\n", flags);
|
||||||
|
}
|
||||||
|
|
||||||
// tx complete/error
|
// tx complete/error
|
||||||
if (flags & (RB_ETH_EIR_TXIF | RB_ETH_EIR_TXERIF)) {
|
if (flags & (RB_ETH_EIR_TXIF | RB_ETH_EIR_TXERIF)) {
|
||||||
// release DMA descriptor back to cpu
|
// release DMA descriptor back to cpu
|
||||||
@@ -113,8 +117,8 @@ static void low_level_init(struct netif* netif) {
|
|||||||
|
|
||||||
// interrupts
|
// interrupts
|
||||||
ETH10M->EIE = 0; // clear
|
ETH10M->EIE = 0; // clear
|
||||||
ETH10M->EIE = RB_ETH_EIE_INTIE | RB_ETH_EIE_RXIE | RB_ETH_EIE_LINKIE |
|
ETH10M->EIE = RB_ETH_EIE_INTIE | RB_ETH_EIE_LINKIE | RB_ETH_EIE_TXIE |
|
||||||
RB_ETH_EIE_TXIE | RB_ETH_EIE_TXERIE | RB_ETH_EIE_RXERIE;
|
RB_ETH_EIE_TXERIE | RB_ETH_EIE_RXERIE;
|
||||||
ETH10M->EIE |= RB_ETH_EIE_R_EN50; // 50 ohm pull-up
|
ETH10M->EIE |= RB_ETH_EIE_R_EN50; // 50 ohm pull-up
|
||||||
|
|
||||||
ETH10M->EIR = 0xFF;
|
ETH10M->EIR = 0xFF;
|
||||||
@@ -196,51 +200,52 @@ static err_t low_level_output(struct netif* netif, struct pbuf* p) {
|
|||||||
return ERR_OK;
|
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 ethernetif* ethernetif = netif->state;
|
||||||
struct pbuf *p = NULL, *q;
|
struct pbuf *p = NULL, *q;
|
||||||
u16_t len;
|
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)) {
|
if (ETH10M->ESTAT & (RB_ETH_ESTAT_BUFER | RB_ETH_ESTAT_RXCRCER)) {
|
||||||
len = 0; // drop packet
|
len = 0;
|
||||||
// printf("RX ESTAT Error: 0x%02X\n", ETH10M->ESTAT);
|
printf("HW RX Error ESTAT: 0x%02X\n", (unsigned int)ETH10M->ESTAT);
|
||||||
ETH10M->ESTAT |= (RB_ETH_ESTAT_BUFER | RB_ETH_ESTAT_RXCRCER);
|
ETH10M->ESTAT |= (RB_ETH_ESTAT_BUFER | RB_ETH_ESTAT_RXCRCER);
|
||||||
} else {
|
} else {
|
||||||
len = ETH10M->ERXLN;
|
len = ETH10M->ERXLN;
|
||||||
if (len > 4) {
|
|
||||||
len -= 4;
|
|
||||||
} else {
|
|
||||||
len = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// copy valid packet to pbuf
|
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
|
p = pbuf_alloc(PBUF_RAW, len, PBUF_POOL);
|
||||||
if (p != NULL) {
|
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;
|
uint32_t bytes_copied = 0;
|
||||||
for (q = p; q != NULL; q = q->next) {
|
for (q = p; q != NULL; q = q->next) {
|
||||||
memcpy(q->payload, rx_buffer + bytes_copied, q->len);
|
memcpy(q->payload, rx_buffer + bytes_copied, q->len);
|
||||||
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 =
|
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->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) {
|
void ethernetif_input(struct netif* netif) {
|
||||||
@@ -290,6 +295,7 @@ err_t ethernetif_init(struct netif* netif) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ethernetif_link_poll(struct netif* netif) {
|
void ethernetif_link_poll(struct netif* netif) {
|
||||||
|
struct ethernetif* ethernetif = netif->state;
|
||||||
static uint32_t last_poll_time = 0;
|
static uint32_t last_poll_time = 0;
|
||||||
uint32_t now = millis();
|
uint32_t now = millis();
|
||||||
|
|
||||||
@@ -305,6 +311,7 @@ void ethernetif_link_poll(struct netif* netif) {
|
|||||||
if (!netif_is_link_up(netif)) {
|
if (!netif_is_link_up(netif)) {
|
||||||
printf("Link is UP (10M-FD Mode)\n");
|
printf("Link is UP (10M-FD Mode)\n");
|
||||||
|
|
||||||
|
ETH10M->ERXST = (uint32_t)ethernetif->DMARxDescToGet->Buffer1Addr;
|
||||||
ETH10M->ECON1 |= RB_ETH_ECON1_RXEN;
|
ETH10M->ECON1 |= RB_ETH_ECON1_RXEN;
|
||||||
|
|
||||||
netif_set_link_up(netif);
|
netif_set_link_up(netif);
|
||||||
|
|||||||
@@ -4,9 +4,11 @@
|
|||||||
#define LWIP_DEBUG 1
|
#define LWIP_DEBUG 1
|
||||||
#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL
|
#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL
|
||||||
|
|
||||||
#define DHCP_DEBUG LWIP_DBG_ON
|
#define UDP_DEBUG LWIP_DBG_ON
|
||||||
#define NETIF_DEBUG LWIP_DBG_ON
|
#define IP_DEBUG LWIP_DBG_ON
|
||||||
#define ETHARP_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
|
#define NO_SYS 1
|
||||||
|
|
||||||
@@ -40,7 +42,7 @@
|
|||||||
// #define CHECKSUM_GEN_UDP 0
|
// #define CHECKSUM_GEN_UDP 0
|
||||||
// #define CHECKSUM_GEN_TCP 0
|
// #define CHECKSUM_GEN_TCP 0
|
||||||
// #define CHECKSUM_CHECK_IP 0
|
// #define CHECKSUM_CHECK_IP 0
|
||||||
// #define CHECKSUM_CHECK_UDP 0
|
#define CHECKSUM_CHECK_UDP 0
|
||||||
// #define CHECKSUM_CHECK_TCP 0
|
// #define CHECKSUM_CHECK_TCP 0
|
||||||
// #define LWIP_CHECKSUM_ON_COPY 1
|
// #define LWIP_CHECKSUM_ON_COPY 1
|
||||||
|
|
||||||
@@ -50,4 +52,6 @@
|
|||||||
// Statistics
|
// Statistics
|
||||||
#define LWIP_STATS 0
|
#define LWIP_STATS 0
|
||||||
|
|
||||||
|
#define LWIP_NETIF_LINK_CALLBACK 1
|
||||||
|
|
||||||
#endif /* __LWIPOPTS_H__ */
|
#endif /* __LWIPOPTS_H__ */
|
||||||
|
|||||||
Reference in New Issue
Block a user