/** * \brief Test EMAC read/write interfaces. * * \param test Current test case. */ static void run_emac_read_write_test(const struct test_case *test) { uint32_t ul_frm_size; uint8_t uc_rc = 0; uint32_t ul_retry_time = 0; /* Write the arp frame first */ emac_dev_write(&gs_emac_dev, gs_arp_frame, sizeof(gs_arp_frame), NULL); while ( ul_retry_time < EMAC_UINT_TEST_MAX_RETRY_TIME ) { /* Read the frame in the emac buffer */ if (EMAC_OK != emac_dev_read(&gs_emac_dev, (uint8_t *) gs_uc_eth_buffer, sizeof(gs_uc_eth_buffer), &ul_frm_size)) { continue; } /* Is arp frame sent? */ if (strncmp((const char *)gs_uc_eth_buffer, (const char *)gs_uc_mac_address, sizeof(gs_uc_mac_address))) { uc_rc = 1; break; } ul_retry_time++; } test_assert_true(test, uc_rc == 1, "Test EMAC: emac write error!"); }
/** * \brief This function should do the actual transmission of the packet. The * packet is contained in the pbuf that is passed to the function. This pbuf * might be chained. * note: Returning ERR_MEM here if a DMA queue of your MAC is full can lead to * strange results. You might consider waiting for space in the DMA queue * to become available since the stack doesn't retry to send a packet * dropped because of memory failure (except for the TCP timers). * * \param netif the lwip network interface structure for this ethernetif * \param p the MAC packet to send (e.g. IP packet including MAC addresses and type) * * \return ERR_OK if the packet could be sent * an err_t value if the packet couldn't be sent. */ static err_t low_level_output(struct netif *netif, struct pbuf *p) { struct pbuf *q = NULL; int8_t pc_buf[NET_RW_BUFF_SIZE]; int8_t *bufptr = &pc_buf[0]; uint8_t uc_rc; #if ETH_PAD_SIZE pbuf_header(p, -ETH_PAD_SIZE); /* Drop the padding word */ #endif /* Check the buffer boundary */ if (p->tot_len > NET_RW_BUFF_SIZE) { return ERR_BUF; } /* Clear the output buffer */ memset(bufptr, 0x0, NET_RW_BUFF_SIZE); for (q = p; q != NULL; q = q->next) { /* Send the data from the pbuf to the interface, one pbuf at a * time. The size of the data in each pbuf is kept in the ->len * variable. */ /* Send data from(q->payload, q->len); */ memcpy(bufptr, q->payload, q->len); bufptr += q->len; } /* Signal that packet should be sent(); */ uc_rc = emac_dev_write(&gs_emac_dev, pc_buf, p->tot_len, NULL); if (uc_rc != EMAC_OK) { return ERR_BUF; } #if ETH_PAD_SIZE pbuf_header(p, ETH_PAD_SIZE); /* Reclaim the padding word */ #endif LINK_STATS_INC(link.xmit); return ERR_OK; }