/**************************************************************************//**
  @file lip_ll_gd32f450_descr.h

  Файл содержит функции для работы с дескрипторами Ethernet для контроллера
  gd32f450.
  Работа с дескрипторами не включает работу с регистрами и не привязывается
  к расположению регистров какого-то контроллера, в связи с чем может использоваться
  другими чипами, которые используют модифицированную версию данного контроллера
  Ethernet.

  ******************************************************************************/

#ifndef LIP_LL_GD32F4XX_DESCR_H
#define LIP_LL_GD32F4XX_DESCR_H


#define SELECT_DESCRIPTORS_ENHANCED_MODE

#include "lip_config.h"
#include "lip/lip_defs.h"
#include "lip/link/mac/tx/lip_mac_tx_cfg_defs.h"
#include "gd32f4xx_enet.h"
#include "gd32f4xx_enet_descr.h"

/* количество блоков на прием (оно же - кол-во дескрипторов) */
#ifndef LIP_PORT_RX_DESCR_CNT
    #define LIP_PORT_RX_DESCR_CNT       28
#endif

/* размер одного блока */
#define LIP_PORT_RX_BUF_SIZE       1520
//256
//1500
//256
/* размер последнего блока (=макс. размеру пакета + размер CRC + выравнивание на слово) */
#define LIP_PORT_RX_LAST_BUF_SIZE  (LIP_ETH_MAX_PACKET_SIZE + 4 + (LIP_ETH_MAX_PACKET_SIZE%4 ? (4 - LIP_ETH_MAX_PACKET_SIZE%4) : 0))
/* общий размер всей памяти на прием */
#define LIP_PORT_RX_FULL_BUF_SIZE ((LIP_PORT_RX_DESCR_CNT-1)*LIP_PORT_RX_BUF_SIZE + LIP_PORT_RX_LAST_BUF_SIZE)


/* кол-во дескрипторов на передачу */
#ifdef LIP_MAC_TX_FRAME_CNT
    #define LIP_PORT_TX_DESCR_CNT  LIP_MAC_TX_FRAME_CNT
#else
    #define LIP_PORT_TX_DESCR_CNT      16
#endif





uint32_t lip_ll_gd32descr_rx_init(void);
uint32_t lip_ll_gd32descr_tx_init(void);


uint8_t *lip_ll_gd32descr_tx_get_buf(int* max_length) ;
t_lip_errs lip_ll_gd32descr_tx_flush_split(size_t size, const uint8_t* data, int data_size);

extern void lip_ll_gd32descr_tx_poll_req(void);
extern void lip_ll_gd32descr_rx_poll_req(void);
extern void lip_ll_gd32descr_clear_stat(void);

#endif // LIP_LL_GD32F4XX_DESCR_H

