From 14157aaf9981a8c58679438256febca4cc152ccc Mon Sep 17 00:00:00 2001 From: Alexei Date: Mon, 13 Feb 2023 00:44:19 +0700 Subject: [PATCH] Added ENET_IRQHandler Made minor modifications --- FreeRTOS/source/include/FreeRTOSIPConfig.h | 9 ++ .../board_family/NetworkInterface.c | 143 +++++++++--------- RTE/RTOS/FreeRTOSConfig.h | 2 +- Test_project_for_GD32107C-EVAL.uvoptx | 56 +++---- main.c | 7 +- 5 files changed, 116 insertions(+), 101 deletions(-) diff --git a/FreeRTOS/source/include/FreeRTOSIPConfig.h b/FreeRTOS/source/include/FreeRTOSIPConfig.h index 01a9a49..ec43a00 100644 --- a/FreeRTOS/source/include/FreeRTOSIPConfig.h +++ b/FreeRTOS/source/include/FreeRTOSIPConfig.h @@ -43,7 +43,16 @@ #define ipconfigUSE_DHCP 1 #define ipconfigUSE_DHCP_HOOK 1 #define ipconfigUSE_DNS_CACHE 1 +#define ipconfigMAC_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY ) +//#define ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES 1 +//#define ipconfigDRIVER_INCLUDED_TX_IP_CHECKSUM 1 +//#define ipconfigDRIVER_INCLUDED_RX_IP_CHECKSUM 1 +//#define ipconfigZERO_COPY_RX_DRIVER 1 +//#define ipconfigZERO_COPY_TX_DRIVER 1 +#define ipconfigUSE_LINKED_RX_MESSAGES 1 +//#define ipconfigUDP_MAX_RX_PACKETS 10 #define ipconfigSUPPORT_SIGNALS 1 + #ifdef DEBUG #define ipconfigHAS_DEBUG_PRINTF 1 diff --git a/FreeRTOS/source/portable/NetworkInterface/board_family/NetworkInterface.c b/FreeRTOS/source/portable/NetworkInterface/board_family/NetworkInterface.c index 61c9eef..a4cfdea 100644 --- a/FreeRTOS/source/portable/NetworkInterface/board_family/NetworkInterface.c +++ b/FreeRTOS/source/portable/NetworkInterface/board_family/NetworkInterface.c @@ -82,6 +82,9 @@ //#ifdef RTE_Drivers_PHY_DP83848C /* Driver PHY DP83848C */ //#endif +#ifdef DEBUG +#define BKPT __asm volatile("BKPT #0\n") ; +#endif static void receiveHandlerTask( void *pvParameters ); static TaskHandle_t receiveHandler = NULL; @@ -95,6 +98,24 @@ static ARM_ETH_MAC_CAPABILITIES capabilities; extern ARM_DRIVER_ETH_PHY ARM_Driver_ETH_PHY_(0); #define Driver_ETH_PHY0 ARM_Driver_ETH_PHY_(0) +/** + \fn void ENET_IRQHandler(void) + \brief Ethernet IRQ Handler +*/ +void ENET_IRQHandler(void) +{ + portBASE_TYPE pxHigherPriorityTaskWoken = pdFALSE; + if (SET == enet_interrupt_flag_get(ENET_DMA_INT_FLAG_RS)) + { + enet_interrupt_flag_clear(ENET_DMA_INT_FLAG_RS_CLR); + vTaskNotifyGiveFromISR(receiveHandler, &pxHigherPriorityTaskWoken ); + } + if( pxHigherPriorityTaskWoken == pdTRUE) + { + taskYIELD(); + } +} + /** \fn ARM_DRIVER_VERSION ARM_ETH_MAC_GetVersion (void) \brief Get driver version. @@ -102,7 +123,7 @@ extern ARM_DRIVER_ETH_PHY ARM_Driver_ETH_PHY_(0); */ ARM_DRIVER_VERSION ARM_ETH_MAC_GetVersion (void) { - ARM_DRIVER_VERSION eth_mac_driver_version = {1,1}; + ARM_DRIVER_VERSION eth_mac_driver_version = {1,2}; return eth_mac_driver_version; } @@ -145,15 +166,17 @@ int32_t ARM_ETH_MAC_Initialize (ARM_ETH_MAC_SignalEvent_t cb_event) { ErrStatus xResult = ARM_DRIVER_ERROR; + (void)cb_event; if (SUCCESS == enet_init(ENET_AUTO_NEGOTIATION, ENET_AUTOCHECKSUM_DROP_FAILFRAMES, ENET_RECEIVEALL)) xResult = ARM_DRIVER_OK; - //enet_ptp_start(int32_t updatemethod, uint32_t init_sec, uint32_t init_subsec, uint32_t carry_cfg, uint32_t accuracy_cfg) + + enet_interrupt_enable( ENET_DMA_INT_RIE ); +/* enet_interrupt_enable( ENET_DMA_INT_TIE ); + enet_interrupt_enable( ENET_DMA_INT_TBUIE ); + enet_interrupt_enable( ENET_DMA_INT_ERIE );*/ + enet_interrupt_enable( ENET_DMA_INT_NIE ); + return xResult; - - //enet_init(ENET_AUTO_NEGOTIATION, ENET_AUTOCHECKSUM_DROP_FAILFRAMES, ENET_RECEIVEALL); - //enet_ptp_start(int32_t updatemethod, uint32_t init_sec, uint32_t init_subsec, uint32_t carry_cfg, uint32_t accuracy_cfg) - //return pdTRUE; - } /** @@ -220,10 +243,9 @@ int32_t ARM_ETH_MAC_SetMacAddress (const ARM_ETH_MAC_ADDR *ptr_addr) */ int32_t ARM_ETH_MAC_SetAddressFilter (const ARM_ETH_MAC_ADDR *ptr_addr, uint32_t num_addr) { -#ifdef DEBUG - printf("ARM_ETH_MAC_SetAddressFilter\n"); - __asm volatile("BKPT #0\n") ; -#endif + + FreeRTOS_debug_printf(("ARM_ETH_MAC_SetAddressFilter\n")); + enet_address_filter_config(ENET_MAC_ADDRESS0, ENET_ADDRESS_MASK_BYTE0, ENET_ADDRESS_FILTER_SA); enet_address_filter_config(ENET_MAC_ADDRESS0, ENET_ADDRESS_MASK_BYTE1, ENET_ADDRESS_FILTER_SA); enet_address_filter_config(ENET_MAC_ADDRESS0, ENET_ADDRESS_MASK_BYTE2, ENET_ADDRESS_FILTER_SA); @@ -243,10 +265,7 @@ int32_t ARM_ETH_MAC_SetAddressFilter (const ARM_ETH_MAC_ADDR *ptr_addr, uint32_t */ int32_t ARM_ETH_MAC_SendFrame (const uint8_t *frame, uint32_t len, uint32_t flags) { -#ifdef DEBUG - printf("ARM_ETH_MAC_SendFrame\n"); -// __asm volatile("BKPT #0\n") ; -#endif + FreeRTOS_debug_printf(("ARM_ETH_MAC_SendFrame\n")); if (frame != NULL & len > 0) { if (SUCCESS == enet_frame_transmit((uint8_t*)frame, len)) @@ -268,10 +287,8 @@ int32_t ARM_ETH_MAC_SendFrame (const uint8_t *frame, uint32_t len, uint32_t flag */ int32_t ARM_ETH_MAC_ReadFrame (uint8_t *frame, uint32_t len) { -#ifdef DEBUG - printf("ARM_ETH_MAC_ReadFrame\n"); -// __asm volatile("BKPT #0\n") ; -#endif + FreeRTOS_debug_printf(("ARM_ETH_MAC_ReadFrame\n")); + if (frame != NULL & len > 0) { if (SUCCESS == enet_frame_receive(frame, len)) @@ -300,10 +317,8 @@ uint32_t ARM_ETH_MAC_GetRxFrameSize (void) */ int32_t ARM_ETH_MAC_GetRxFrameTime (ARM_ETH_MAC_TIME *time) { -#ifdef DEBUG - printf("ARM_ETH_MAC_GetRxFrameTime\n"); -// __asm volatile("BKPT #0\n") ; -#endif + FreeRTOS_debug_printf(("ARM_ETH_MAC_GetRxFrameTime\n")); + //if ENET_RXTX_TIMESTAMP bit set in ENET_PTP_TSCTL register (enet_ptp_start(int32_t updatemethod, uint32_t init_sec, uint32_t init_subsec, uint32_t carry_cfg, uint32_t accuracy_cfg);) enet_ptp_systime_struct systime_struct; enet_ptp_system_time_get(&systime_struct); @@ -320,10 +335,8 @@ int32_t ARM_ETH_MAC_GetRxFrameTime (ARM_ETH_MAC_TIME *time) */ int32_t ARM_ETH_MAC_GetTxFrameTime (ARM_ETH_MAC_TIME *time) { -#ifdef DEBUG - printf("ARM_ETH_MAC_GetTxFrameTime\n"); -// __asm volatile("BKPT #0\n") ; -#endif + FreeRTOS_debug_printf(("ARM_ETH_MAC_GetTxFrameTime\n")); + //if ENET_RXTX_TIMESTAMP bit set in ENET_PTP_TSCTL register (enet_ptp_timestamp_function_config(ENET_PTP_SYSTIME_INIT);) enet_ptp_systime_struct systime_struct; enet_ptp_system_time_get(&systime_struct); @@ -341,10 +354,8 @@ int32_t ARM_ETH_MAC_GetTxFrameTime (ARM_ETH_MAC_TIME *time) */ int32_t ARM_ETH_MAC_Control (uint32_t control, uint32_t arg) { -#ifdef DEBUG - printf("ARM_ETH_MAC_Control\n"); -// __asm volatile("BKPT #0\n") ; -#endif + FreeRTOS_debug_printf(("ARM_ETH_MAC_Control\n")); + if((control >= 0) & (arg >= 0)) { if(SUCCESS == enet_phy_write_read(ENET_PHY_WRITE, PHY_ADDRESS, control, (uint16_t*)&arg)) @@ -364,10 +375,8 @@ int32_t ARM_ETH_MAC_Control (uint32_t control, uint32_t arg) */ int32_t ARM_ETH_MAC_ControlTimer (uint32_t control, ARM_ETH_MAC_TIME *time) { -#ifdef DEBUG - printf("ARM_ETH_MAC_ControlTimer\n"); -// __asm volatile("BKPT #0\n") ; -#endif + FreeRTOS_debug_printf(("ARM_ETH_MAC_ControlTimer\n")); + if((control >= 0) & (time != NULL)) { if(SUCCESS == enet_phy_write_read(ENET_PHY_WRITE, PHY_ADDRESS, control, (uint16_t*)time)) @@ -394,15 +403,11 @@ int32_t ARM_ETH_MAC_PHY_Read (uint8_t phy_addr, uint8_t reg_addr, uint16_t *data return ARM_DRIVER_OK; else { -#ifdef DEBUG - printf("ARM_ETH_MAC_PHY_Read_ERROR\n"); -#endif + FreeRTOS_debug_printf(("ARM_ETH_MAC_PHY_Read_ERROR\n")); return ARM_DRIVER_ERROR; } }else -#ifdef DEBUG - printf("ARM_ETH_MAC_PHY_Read_ERROR_PARAMETER\n"); -#endif + FreeRTOS_debug_printf(("ARM_ETH_MAC_PHY_Read_ERROR_PARAMETER\n")); return ARM_DRIVER_ERROR_PARAMETER; } @@ -422,15 +427,11 @@ int32_t ARM_ETH_MAC_PHY_Write (uint8_t phy_addr, uint8_t reg_addr, uint16_t data return ARM_DRIVER_OK; else { -#ifdef DEBUG - printf("ARM_ETH_MAC_PHY_Write_ERROR\n"); -#endif + FreeRTOS_debug_printf(("ARM_ETH_MAC_PHY_Write_ERROR\n")); return ARM_DRIVER_ERROR; } }else -#ifdef DEBUG - printf("ARM_ETH_MAC_PHY_Write_ERROR_PARAMETER\n"); -#endif + FreeRTOS_debug_printf(("ARM_ETH_MAC_PHY_Write_ERROR_PARAMETER\n")); return ARM_DRIVER_ERROR_PARAMETER; } @@ -441,6 +442,27 @@ int32_t ARM_ETH_MAC_PHY_Write (uint8_t phy_addr, uint8_t reg_addr, uint16_t data \return none */ +/*callback function for ARM_ETH_MAC_SignalEvent_t*/ +void ethernet_mac_notify (uint32_t event) { + switch (event) { + case ARM_ETH_MAC_EVENT_RX_FRAME: + /*received frame,call receive fuction*/ + //led1_toggle(); + xTaskNotifyGive( receiveHandler ); + break; + + case ARM_ETH_MAC_EVENT_TX_FRAME: + /* deliver finished */ + break; + + case ARM_ETH_MAC_EVENT_WAKEUP: + break; + + case ARM_ETH_MAC_EVENT_TIMER_ALARM: + /* do nothing */ + break; + } +} ARM_DRIVER_ETH_MAC Driver_ETH_MAC0 = {ARM_ETH_MAC_GetVersion, ARM_ETH_MAC_GetCapabilities, @@ -464,27 +486,7 @@ ARM_DRIVER_ETH_MAC Driver_ETH_MAC0 = {ARM_ETH_MAC_GetVersion, -/*callback function for ARM_ETH_MAC_SignalEvent_t*/ -void ethernet_mac_notify (uint32_t event) { - switch (event) { - case ARM_ETH_MAC_EVENT_RX_FRAME: - /*received frame,call receive fuction*/ - //led1_toggle(); - xTaskNotifyGive( receiveHandler ); - break; - - case ARM_ETH_MAC_EVENT_TX_FRAME: - /* deliver finished */ - break; - - case ARM_ETH_MAC_EVENT_WAKEUP: - break; - - case ARM_ETH_MAC_EVENT_TIMER_ALARM: - /* do nothing */ - break; - } -} + /* init the mac */ int32_t macIntialise(void) @@ -587,9 +589,8 @@ BaseType_t xNetworkInterfaceInitialise( void ) /* send tcp/ip buffer to mac buffer */ static void sendData(uint8_t *pucEthernetBuffer,size_t xDataLength){ if(mac->SendFrame(pucEthernetBuffer,xDataLength,ARM_ETH_MAC_TX_FRAME_EVENT|ARM_ETH_MAC_TX_FRAME_TIMESTAMP) == ARM_DRIVER_OK){ - //success - } - else{ + + }else{ //error } } diff --git a/RTE/RTOS/FreeRTOSConfig.h b/RTE/RTOS/FreeRTOSConfig.h index 3138fda..73f19b8 100644 --- a/RTE/RTOS/FreeRTOSConfig.h +++ b/RTE/RTOS/FreeRTOSConfig.h @@ -50,7 +50,7 @@ extern uint32_t SystemCoreClock; /* Constants that describe the hardware and memory usage. */ #define configCPU_CLOCK_HZ (SystemCoreClock) #define configTICK_RATE_HZ ((TickType_t)1000) -#define configTOTAL_HEAP_SIZE ((size_t)4*8192) +#define configTOTAL_HEAP_SIZE ((size_t)6*8192) #define configMINIMAL_STACK_SIZE ((uint16_t)256) #define configSUPPORT_DYNAMIC_ALLOCATION 1 #define configSUPPORT_STATIC_ALLOCATION 0 diff --git a/Test_project_for_GD32107C-EVAL.uvoptx b/Test_project_for_GD32107C-EVAL.uvoptx index 527f0d8..143c208 100644 --- a/Test_project_for_GD32107C-EVAL.uvoptx +++ b/Test_project_for_GD32107C-EVAL.uvoptx @@ -125,7 +125,7 @@ 0 DLGTARM - (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) + (1010=1360,271,1810,828,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0) 0 @@ -157,7 +157,7 @@ 0 0 - 1008 + 612 1
0
0 @@ -166,14 +166,14 @@ 0 0 0 - .\FreeRTOS\source\FreeRTOS_Sockets.c + .\FreeRTOS\source\portable\NetworkInterface\board_family\NetworkInterface.c
1 0 - 967 + 591 1
0
0 @@ -182,23 +182,7 @@ 0 0 0 - .\FreeRTOS\source\FreeRTOS_Sockets.c - - -
- - 2 - 0 - 865 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - .\FreeRTOS\source\FreeRTOS_Sockets.c + .\FreeRTOS\source\portable\NetworkInterface\board_family\NetworkInterface.c
@@ -232,14 +216,24 @@ 5 1 - dma_current_txdesc + dma_current_rxdesc + + + 6 + 1 + xDHCPSocket + + + 7 + 1 + pxCurrentTCB 1 0 - pxNetworkBuffer + 0x200072FA 0 @@ -260,7 +254,7 @@ - C:\Users\User\AppData\Local\Arm\Packs\ARM\CMSIS-FreeRTOS\10.5.1\CMSIS\RTOS2\FreeRTOS\FreeRTOS.scvd + E:\Arm\Packs\ARM\CMSIS-FreeRTOS\10.5.1\CMSIS\RTOS2\FreeRTOS\FreeRTOS.scvd ARM.CMSIS-FreeRTOS.10.5.1 1 @@ -306,12 +300,18 @@ + + + System Viewer\ENET_DMA + 35905 + + Source Group 1 - 0 + 1 0 0 0 @@ -367,7 +367,7 @@ 1 5 1 - 1 + 0 0 0 .\PHY\PHY_DP83848C.c @@ -651,7 +651,7 @@ 2 28 1 - 1 + 0 0 0 .\FreeRTOS\source\portable\NetworkInterface\board_family\NetworkInterface.c @@ -699,7 +699,7 @@ ::Device - 0 + 1 0 0 1 diff --git a/main.c b/main.c index bf37715..653c592 100644 --- a/main.c +++ b/main.c @@ -239,8 +239,13 @@ static void vInitMCU(void) /* Enable Ethernet MAC */ enet_descriptors_chain_init(ENET_DMA_TX); enet_descriptors_chain_init(ENET_DMA_RX); + //enet_desc_receive_complete_bit_enable(dma_current_rxdesc); enet_enable(); - + __disable_irq(); + NVIC_ClearPendingIRQ(ENET_IRQn); + NVIC_SetPriority(ENET_IRQn, ipconfigMAC_INTERRUPT_PRIORITY); + NVIC_EnableIRQ(ENET_IRQn); + __enable_irq(); } /**! \brief vTaskHelloWorld procedure