Отправку можно сделать гораздо проще, чем приём. Запихиваем кадр в
буфер и вперёд: static err_t
low_level_output(struct netif *netif, struct pbuf *p)
{
if (!netif_is_link_up(netif))
{
return ERR_OK;
}
uint8_t buf[600];
if (p->tot_len > sizeof buf)
{
return ERR_MEM;
}
uint32_t mask;
do
{
mask = ETH->DMASR & ETH_DMASR_TPS;
}
while (mask != ETH_DMASR_TPS_Suspended && mask != ETH_DMASR_TPS_Stopped);
tx_desc[0].len[1] = p->tot_len;
tx_desc[0].ptr[1] = buf;
uint8_t* ptr = buf;
while (p)
{
memcpy(ptr, p->payload, p->len);
ptr += p->len;
p = p->next;
}
tx_desc[0].status = (1u << 31) // OWN bit
| (1 << 29) // last segment
| (1 << 28) // first segment
| (1 << 21); // end of ring
ETH->DMASR = ETH_DMASR_ETS; // reset ETS flag in status register
ETH->DMATPDR = 0; // start transmission
while ((ETH->DMASR & ETH_DMASR_ETS) == 0)
{
// wait for data to be copied into Tx FIFO
}
return ERR_OK;
}