error_status emac_rxpkt_chainmode(void)
{
error_status status = ERROR;
/* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */
if ((dma_rx_desc_to_get->status & EMAC_DMARXDESC_OWN) != (u32)RESET)
{
/* return error: own bit set */
return status;
}
if (((dma_rx_desc_to_get->status & EMAC_DMARXDESC_FS) != (u32)RESET) &&
((dma_rx_desc_to_get->status & EMAC_DMARXDESC_LS) != (u32)RESET))
{
/* 单包数据 */
rx_frame.rx_fs_desc = dma_rx_desc_to_get;
rx_frame.rx_ls_desc = dma_rx_desc_to_get;
/* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */
rx_frame.length = ((dma_rx_desc_to_get->status & EMAC_DMARXDESC_FL) >> EMAC_DMARxDesc_FrameLengthShift) - 4;
rx_frame.buffer = rx_frame.rx_fs_desc->buf1addr;
status = SUCCESS;
}
else if ((dma_rx_desc_to_get->status & EMAC_DMARXDESC_FS) != (u32)RESET)
{
/* 多包数据的第一包 */
if (NULL != rx_frame.rx_fs_desc)
{
/* 已经记录了一次开始帧,丢掉上次的开始帧和后续的数据 */
while (rx_frame.rx_fs_desc != dma_rx_desc_to_get)
{
rx_frame.rx_fs_desc->status = EMAC_DMARXDESC_OWN;
rx_frame.rx_fs_desc = (emac_dma_desc_type*)rx_frame.rx_fs_desc->buf2nextdescaddr;
}
}
rx_frame.rx_fs_desc = dma_rx_desc_to_get;
}
else if ((dma_rx_desc_to_get->status & EMAC_DMARXDESC_LS) != (u32)RESET)
{
/* 多包数据的最后一包 */
if (NULL == rx_frame.rx_fs_desc)
{
//没有对应的开始包丢掉此包数据,不做处理。
dma_rx_desc_to_get->status = EMAC_DMARXDESC_OWN;
goto Nothing;
}
else
{
rx_frame.rx_ls_desc = dma_rx_desc_to_get;
/* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */
rx_frame.length = ((dma_rx_desc_to_get->status & EMAC_DMARXDESC_FL) >> EMAC_DMARxDesc_FrameLengthShift) - 4;
rx_frame.buffer = rx_frame.rx_fs_desc->buf1addr;
status = SUCCESS;
}
}
else//多包数据的中间包
{
if (dma_rx_desc_to_get->buf2nextdescaddr == (uint32_t)rx_frame.rx_fs_desc)
{
/* 多包数据超出了缓存 */
/* 丢掉上次的开始帧和后续的数据 */
while (rx_frame.rx_fs_desc != dma_rx_desc_to_get)
{
rx_frame.rx_fs_desc->status = EMAC_DMARXDESC_OWN;
rx_frame.rx_fs_desc = (emac_dma_desc_type*)rx_frame.rx_fs_desc->buf2nextdescaddr;
}
rx_frame.rx_fs_desc = NULL;
goto Nothing;
}
if (NULL == rx_frame.rx_fs_desc)
{
//没有对应的开始包丢掉此包数据,不做处理。
dma_rx_desc_to_get->status = EMAC_DMARXDESC_OWN;
goto Nothing;
}
}
/* Selects the next DMA Rx descriptor list for next buffer to read */
dma_rx_desc_to_get = (emac_dma_desc_type*)(dma_rx_desc_to_get->buf2nextdescaddr);