From e92f44a3d83379f6dce1bda2df4ab610cbea1ad4 Mon Sep 17 00:00:00 2001 From: abazlaev Date: Wed, 24 May 2023 17:39:59 +0700 Subject: [PATCH] Added rf switch 2 --- DemoTasks/SimpleTCPEchoServer.c | 96 +- FreeRTOS/source/include/NetworkInterface.h | 6 +- .../board_family/NetworkInterface.c | 1618 +++++++++-------- Test_project_for_GD32107C-EVAL.uvguix.right | 416 ++--- Test_project_for_GD32107C-EVAL.uvoptx | 35 +- Test_project_for_GD32107C-EVAL.uvprojx | 2 +- main.c | 25 +- 7 files changed, 1112 insertions(+), 1086 deletions(-) diff --git a/DemoTasks/SimpleTCPEchoServer.c b/DemoTasks/SimpleTCPEchoServer.c index 7cbb04c..c50b561 100644 --- a/DemoTasks/SimpleTCPEchoServer.c +++ b/DemoTasks/SimpleTCPEchoServer.c @@ -90,7 +90,7 @@ #include "FreeRTOS_Sockets.h" #include "rf_switch_driver.h" -extern struct rf_switch_config rfSwitchConfig; +extern struct rf_switch_config rfSwitch1Config, rfSwitch2Config; /* Remove the whole file if FreeRTOSIPConfig.h is set to exclude TCP. */ #if( ipconfigUSE_TCP == 1 ) @@ -310,44 +310,78 @@ uint8_t *pucRxBuffer; /* If data was received, echo it back. */ if( lBytes > 0 ) { - RF_OUT_ENUM state = -1; - int8_t enable = -1; + RF_OUT_ENUM state1 = -1, state2 = -1; + int8_t enable1 = -1, enable2 = -1; - if (!strcmp("RF_ON", (char*)pucRxBuffer)) + if (!strcmp("RF1_ON", (char*)pucRxBuffer)) { - vRFSwitchEnable(&rfSwitchConfig); - enable = pdTRUE; + vRFSwitchEnable(&rfSwitch1Config); + enable1 = pdTRUE; } - else if (!strcmp("RF_OFF", (char*)pucRxBuffer)) + else if (!strcmp("RF1_OFF", (char*)pucRxBuffer)) { - vRFSwitchDisable(&rfSwitchConfig); - enable = pdFALSE; + vRFSwitchDisable(&rfSwitch1Config); + enable1 = pdFALSE; } - else if (!strcmp("RF01", (char*)pucRxBuffer)) - state = xRFSwitchSet(&rfSwitchConfig, RF_OUT_01); - else if (!strcmp("RF02", (char*)pucRxBuffer)) - state = xRFSwitchSet(&rfSwitchConfig, RF_OUT_02); - else if (!strcmp("RF03", (char*)pucRxBuffer)) - state = xRFSwitchSet(&rfSwitchConfig, RF_OUT_03); - else if (!strcmp("RF04", (char*)pucRxBuffer)) - state = xRFSwitchSet(&rfSwitchConfig, RF_OUT_04); - else if (!strcmp("RF05", (char*)pucRxBuffer)) - state = xRFSwitchSet(&rfSwitchConfig, RF_OUT_05); - else if (!strcmp("RF06", (char*)pucRxBuffer)) - state = xRFSwitchSet(&rfSwitchConfig, RF_OUT_06); - else if (!strcmp("RF07", (char*)pucRxBuffer)) - state = xRFSwitchSet(&rfSwitchConfig, RF_OUT_07); - else if (!strcmp("RF08", (char*)pucRxBuffer)) - state = xRFSwitchSet(&rfSwitchConfig, RF_OUT_08); + else if (!strcmp("RF2_ON", (char*)pucRxBuffer)) + { + vRFSwitchEnable(&rfSwitch2Config); + enable2 = pdTRUE; + } + else if (!strcmp("RF2_OFF", (char*)pucRxBuffer)) + { + vRFSwitchDisable(&rfSwitch2Config); + enable2 = pdFALSE; + } + else if (!strcmp("RF101", (char*)pucRxBuffer)) + state1 = xRFSwitchSet(&rfSwitch1Config, RF_OUT_01); + else if (!strcmp("RF102", (char*)pucRxBuffer)) + state1 = xRFSwitchSet(&rfSwitch1Config, RF_OUT_02); + else if (!strcmp("RF103", (char*)pucRxBuffer)) + state1 = xRFSwitchSet(&rfSwitch1Config, RF_OUT_03); + else if (!strcmp("RF104", (char*)pucRxBuffer)) + state1 = xRFSwitchSet(&rfSwitch1Config, RF_OUT_04); + else if (!strcmp("RF105", (char*)pucRxBuffer)) + state1 = xRFSwitchSet(&rfSwitch1Config, RF_OUT_05); + else if (!strcmp("RF106", (char*)pucRxBuffer)) + state1 = xRFSwitchSet(&rfSwitch1Config, RF_OUT_06); + else if (!strcmp("RF107", (char*)pucRxBuffer)) + state1 = xRFSwitchSet(&rfSwitch1Config, RF_OUT_07); + else if (!strcmp("RF108", (char*)pucRxBuffer)) + state1 = xRFSwitchSet(&rfSwitch1Config, RF_OUT_08); + + else if (!strcmp("RF201", (char*)pucRxBuffer)) + state2 = xRFSwitchSet(&rfSwitch2Config, RF_OUT_01); + else if (!strcmp("RF202", (char*)pucRxBuffer)) + state2 = xRFSwitchSet(&rfSwitch2Config, RF_OUT_02); + else if (!strcmp("RF203", (char*)pucRxBuffer)) + state2 = xRFSwitchSet(&rfSwitch2Config, RF_OUT_03); + else if (!strcmp("RF204", (char*)pucRxBuffer)) + state2 = xRFSwitchSet(&rfSwitch2Config, RF_OUT_04); + else if (!strcmp("RF205", (char*)pucRxBuffer)) + state2 = xRFSwitchSet(&rfSwitch2Config, RF_OUT_05); + else if (!strcmp("RF206", (char*)pucRxBuffer)) + state2 = xRFSwitchSet(&rfSwitch2Config, RF_OUT_06); + else if (!strcmp("RF207", (char*)pucRxBuffer)) + state2 = xRFSwitchSet(&rfSwitch2Config, RF_OUT_07); + else if (!strcmp("RF208", (char*)pucRxBuffer)) + state2 = xRFSwitchSet(&rfSwitch2Config, RF_OUT_08); - if ( RF_OUT_01 <= state && state <= RF_OUT_08 ) - FreeRTOS_debug_printf(("Switched to %s\n", (char*)pucRxBuffer)); - else if ( enable == 1 ) - FreeRTOS_debug_printf(("RF switch ON\n")); - else if ( enable == 0 ) - FreeRTOS_debug_printf(("RF switch OFF\n")); + if ( RF_OUT_01 <= state1 && state1 <= RF_OUT_08 ) + FreeRTOS_debug_printf(("RF switch1 switched to %s\n", (char*)pucRxBuffer)); + else if ( enable1 == 1 ) + FreeRTOS_debug_printf(("RF switch1 ON\n")); + else if ( enable1 == 0 ) + FreeRTOS_debug_printf(("RF switch1 OFF\n")); + else if ( RF_OUT_01 <= state2 && state2 <= RF_OUT_08 ) + FreeRTOS_debug_printf(("RF switch2 switched to %s\n", (char*)pucRxBuffer)); + else if ( enable2 == 1 ) + FreeRTOS_debug_printf(("RF switch2 ON\n")); + else if ( enable2 == 0 ) + FreeRTOS_debug_printf(("RF switch2 OFF\n")); else FreeRTOS_debug_printf(("Wrong command\n")); + lSent = 0; lTotalSent = 0; diff --git a/FreeRTOS/source/include/NetworkInterface.h b/FreeRTOS/source/include/NetworkInterface.h index c891b3c..a3b2348 100644 --- a/FreeRTOS/source/include/NetworkInterface.h +++ b/FreeRTOS/source/include/NetworkInterface.h @@ -28,7 +28,7 @@ #ifndef NETWORK_INTERFACE_H #define NETWORK_INTERFACE_H -#ifndef STM32_PORT +//#ifndef STM32_PORT //#include "FreeRTOS.h" //#include "FreeRTOSIPConfig.h" //#include "stdio.h" @@ -42,7 +42,7 @@ BaseType_t xNetworkInterfaceInitialise( void ); BaseType_t xNetworkInterfaceOutput( NetworkBufferDescriptor_t * const pxDescriptor,BaseType_t xReleaseAfterSend ); -#else /*STM32_PORT*/ +//#else /*STM32_PORT*/ #include "stdint.h" #include "FreeRTOS.h" #include "FreeRTOS_IP.h" @@ -353,5 +353,5 @@ BaseType_t xGetPhyLinkStatus( void ); } /* extern "C" */ #endif /* *INDENT-ON* */ -#endif /*STM32_PORT*/ +//#endif /*STM32_PORT*/ #endif /* NETWORK_INTERFACE_H */ diff --git a/FreeRTOS/source/portable/NetworkInterface/board_family/NetworkInterface.c b/FreeRTOS/source/portable/NetworkInterface/board_family/NetworkInterface.c index bc626c4..0c354bc 100644 --- a/FreeRTOS/source/portable/NetworkInterface/board_family/NetworkInterface.c +++ b/FreeRTOS/source/portable/NetworkInterface/board_family/NetworkInterface.c @@ -55,7 +55,42 @@ * */ -#ifndef STM32_PORT +/* + * FreeRTOS+TCP V3.1.0 + * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://aws.amazon.com/freertos + * http://www.FreeRTOS.org + */ + +/***************************************************************************** +* Note: This file is Not! to be used as is. The purpose of this file is to provide +* a template for writing a network interface. Each network interface will have to provide +* concrete implementations of the functions in this file. +* +* See the following URL for an explanation of this file and its functions: +* https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/Embedded_Ethernet_Porting.html +* +*****************************************************************************/ /* Standard includes. */ #include @@ -76,21 +111,56 @@ #include "NetworkBufferManagement.h" #include "NetworkInterface.h" +/* FreeRTOS+TCP includes. */ +#include "FreeRTOS_IP.h" +#include "FreeRTOS_Sockets.h" +#include "FreeRTOS_IP_Private.h" +#include "NetworkBufferManagement.h" +#include "NetworkInterface.h" + +#ifdef STM32_PORT +#include "phyHandling.h" +#include "FreeRTOS_DNS.h" +#include "FreeRTOS_ARP.h" +#endif /* STM32_PORT */ + //#include "Driver_ETH.h" -//#include "Driver_ETH_MAC.h" -//#include "Driver_ETH_PHY.h" -#include "gd32f10x_enet.h" +#if defined( GD32F10X_CL ) + #include "gd32f10x_enet.h" +#elif !defined( _lint ) /* Lint does not like an #error */ + #error What part? +#endif /* if defined( GD32F10X_CL ) */ #include "PHY_DP83848C.h" -//#ifdef RTE_Drivers_PHY_DP83848C /* Driver PHY DP83848C */ -#ifndef CENTRALISED_DEFERRED_IRQ_HADLING -static void receiveHandlerTask( void *pvParameters ); -static TaskHandle_t receiveHandler = NULL; -#else /*CENTRALISED_DEFERRED_IRQ_HADLING*/ -void PendedReceiveHandler( void *pvParameter1, uint32_t ulParameter2 ); +/* If ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES is set to 1, then the Ethernet + * driver will filter incoming packets and only pass the stack those packets it + * considers need processing. */ +#if ( ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES == 0 ) + #define ipCONSIDER_FRAME_FOR_PROCESSING( pucEthernetBuffer ) eProcessBuffer +#else + #define ipCONSIDER_FRAME_FOR_PROCESSING( pucEthernetBuffer ) eConsiderFrameForProcessing( ( pucEthernetBuffer ) ) #endif +/* ST includes. */ +#if defined( GD32F10X_CL ) + #include "gd32f10x_enet.h" +#elif defined( STM32F7xx ) + #include "stm32f7xx_hal.h" + #define CACHE_LINE_SIZE 32u +#elif defined( STM32F4xx ) + #include "stm32f4xx_hal.h" +#elif defined( STM32F2xx ) + #include "stm32f2xx_hal.h" +#elif defined( STM32F1xx ) + #include "stm32f1xx_hal.h" +#elif !defined( _lint ) /* Lint does not like an #error */ + #error What part? +#endif /* if defined( GD32F10X_CL ) */ + +//#ifdef RTE_Drivers_PHY_DP83848C /* Driver PHY DP83848C */ +extern TaskHandle_t vTaskHelloWorld_Handle, vTaskToggleLed_Handle; + static ARM_ETH_MAC_ADDR own_mac_address ;//device mac adress stores here. MSB first static ARM_DRIVER_ETH_MAC *mac; static ARM_ETH_MAC_CAPABILITIES capabilities; @@ -100,7 +170,292 @@ 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) -extern TaskHandle_t vTaskHelloWorld_Handle, vTaskToggleLed_Handle; +/*-----------------------------------------------------------*/ +int32_t phyIntialise(void); + +#ifdef STM32_PORT +/* Interrupt events to process. Currently only the Rx event is processed + * although code for other events is included to allow for possible future + * expansion. */ +#define EMAC_IF_RX_EVENT 1UL +#define EMAC_IF_TX_EVENT 2UL +#define EMAC_IF_ERR_EVENT 4UL +#define EMAC_IF_ALL_EVENT ( EMAC_IF_RX_EVENT | EMAC_IF_TX_EVENT | EMAC_IF_ERR_EVENT ) + +#ifndef ETH_MAX_PACKET_SIZE + #define ETH_MAX_PACKET_SIZE ENET_MAX_FRAME_SIZE +#endif +/* Calculate the maximum packet size that the DMA can receive. */ +#define EMAC_DMA_BUFFER_SIZE ( ( uint32_t ) ( ETH_MAX_PACKET_SIZE - ipBUFFER_PADDING ) ) + +#define ETH_DMA_IT_T ENET_DMA_INTEN_TIE /*!< transmit interrupt enable */ +#define ETH_DMA_IT_TPS ENET_DMA_INTEN_TPSIE /*!< transmit process stopped interrupt enable */ +#warning Check define ETH_DMA_IT_MMC ENET_DMA_INTEN_TBUIE +#define ETH_DMA_IT_MMC ENET_DMA_INTEN_TBUIE /*!< transmit buffer unavailable interrupt enable */ +#define ETH_DMA_IT_TJT ENET_DMA_INTEN_TJTIE /*!< transmit jabber timeout interrupt enable */ +#define ETH_DMA_IT_RO ENET_DMA_INTEN_ROIE /*!< receive overflow interrupt enable */ +#define ETH_DMA_IT_TU ENET_DMA_INTEN_TUIE /*!< transmit underflow interrupt enable */ +#define ETH_DMA_IT_R ENET_DMA_INTEN_RIE /*!< receive interrupt enable */ +#define ETH_DMA_IT_RBU ENET_DMA_INTEN_RBUIE /*!< receive buffer unavailable interrupt enable */ +#define ETH_DMA_IT_RPS ENET_DMA_INTEN_RPSIE /*!< receive process stopped interrupt enable */ +#define ETH_DMA_IT_RWT ENET_DMA_INTEN_RWTIE /*!< receive watchdog timeout interrupt enable */ +#warning Check define ETH_DMA_IT_PMT ENET_DMA_INTEN_ETIE /*!< early transmit interrupt enable */ +#define ETH_DMA_IT_PMT ENET_DMA_INTEN_ETIE /*!< early transmit interrupt enable */ +#define ETH_DMA_IT_FBE ENET_DMA_INTEN_FBEIE /*!< fatal bus error interrupt enable */ +#define ETH_DMA_IT_ER ENET_DMA_INTEN_ERIE /*!< early receive interrupt enable */ +#define ETH_DMA_IT_AIS ENET_DMA_INTEN_AIE /*!< abnormal interrupt summary enable */ +#define ETH_DMA_IT_NIS ENET_DMA_INTEN_NIE /*!< normal interrupt summary enable */ +#warning Check ETH_DMA_IT_TST +#ifndef ETH_DMA_ALL_INTERRUPTS +#define ETH_DMA_ALL_INTS \ + ( /*ETH_DMA_IT_TST | ETH_DMA_IT_PMT | ETH_DMA_IT_MMC |*/ ETH_DMA_IT_NIS | \ + /*ETH_DMA_IT_AIS | ETH_DMA_IT_ER | ETH_DMA_IT_FBE | ETH_DMA_IT_RWT | \ + ETH_DMA_IT_RPS | ETH_DMA_IT_RBU |*/ ETH_DMA_IT_R/* | ETH_DMA_IT_TU | \ + ETH_DMA_IT_RO | ETH_DMA_IT_TJT | ETH_DMA_IT_TPS | ETH_DMA_IT_T*/ ) +#else +#define ETH_DMA_ALL_INTS \ + ( /*ETH_DMA_IT_TST |*/ ETH_DMA_IT_PMT | ETH_DMA_IT_MMC | ETH_DMA_IT_NIS | \ + ETH_DMA_IT_AIS | ETH_DMA_IT_ER | ETH_DMA_IT_FBE | ETH_DMA_IT_RWT | \ + ETH_DMA_IT_RPS | ETH_DMA_IT_RBU | ETH_DMA_IT_R | ETH_DMA_IT_TU | \ + ETH_DMA_IT_RO | ETH_DMA_IT_TJT | ETH_DMA_IT_TPS | ETH_DMA_IT_T ) +#endif /* ETH_DMA_ALL_INTERRUPTS */ + +#ifndef NETWORK_BUFFER_HEADER_SIZE + #define NETWORK_BUFFER_HEADER_SIZE ( ipBUFFER_PADDING ) +#endif + +#ifndef niEMAC_HANDLER_TASK_PRIORITY + #define niEMAC_HANDLER_TASK_PRIORITY configMAX_PRIORITIES - 1 +#endif + +#if ( ( ipconfigDRIVER_INCLUDED_TX_IP_CHECKSUM == 0 ) || ( ipconfigDRIVER_INCLUDED_RX_IP_CHECKSUM == 0 ) ) + #warning Consider enabling checksum offloading +#endif + +#ifndef niDESCRIPTOR_WAIT_TIME_MS + #define niDESCRIPTOR_WAIT_TIME_MS 250uL +#endif + +/* + * Most users will want a PHY that negotiates about + * the connection properties: speed, dmix and duplex. + * On some rare cases, you want to select what is being + * advertised, properties like MDIX and duplex. + */ + +#if !defined( ipconfigETHERNET_AN_ENABLE ) + /* Enable auto-negotiation */ + #define ipconfigETHERNET_AN_ENABLE 1 +#endif + +#if !defined( ipconfigETHERNET_AUTO_CROSS_ENABLE ) + #define ipconfigETHERNET_AUTO_CROSS_ENABLE 1 +#endif + +#if ( ipconfigETHERNET_AN_ENABLE == 0 ) + +/* + * The following three defines are only used in case there + * is no auto-negotiation. + */ + #if !defined( ipconfigETHERNET_CROSSED_LINK ) + #define ipconfigETHERNET_CROSSED_LINK 1 + #endif + + #if !defined( ipconfigETHERNET_USE_100MB ) + #define ipconfigETHERNET_USE_100MB 1 + #endif + + #if !defined( ipconfigETHERNET_USE_FULL_DUPLEX ) + #define ipconfigETHERNET_USE_FULL_DUPLEX 1 + #endif +#endif /* ipconfigETHERNET_AN_ENABLE == 0 */ + +/* Default the size of the stack used by the EMAC deferred handler task to twice + * the size of the stack used by the idle task - but allow this to be overridden in + * FreeRTOSConfig.h as configMINIMAL_STACK_SIZE is a user definable constant. */ +#ifndef configEMAC_TASK_STACK_SIZE + #define configEMAC_TASK_STACK_SIZE ( 2 * configMINIMAL_STACK_SIZE ) +#endif + +/* Two choices must be made: RMII versus MII, + * and the index of the PHY in use ( between 0 and 31 ). */ +#ifndef ipconfigUSE_RMII + #ifdef GD32F10X_CL + #define ipconfigUSE_RMII 1 + #warning Using RMII, make sure if this is correct + #else + #define ipconfigUSE_RMII 0 + #warning Using MII, make sure if this is correct + #endif /* GD32F10X_CL */ +#endif /* ipconfigUSE_RMII */ + +typedef enum +{ + eMACInit, /* Must initialise MAC. */ + eMACPass, /* Initialisation was successful. */ + eMACFailed, /* Initialisation failed. */ +} eMAC_INIT_STATUS_TYPE; + +static eMAC_INIT_STATUS_TYPE xMacInitStatus = eMACInit; + +/* + * A deferred interrupt handler task that processes + */ +static void prvEMACHandlerTask( void * pvParameters ); + +/* + * Force a negotiation with the Switch or Router and wait for LS. + */ +static void prvEthernetUpdateConfig( BaseType_t xForce ); + +/* + * See if there is a new packet and forward it to the IP-task. + */ +static BaseType_t prvNetworkInterfaceInput( void ); + +#if ( ipconfigUSE_LLMNR != 0 ) || ( ipconfigUSE_MDNS != 0 ) + +/* + * For LLMNR, an extra MAC-address must be configured to + * be able to receive the multicast messages. + */ + static void prvMACAddressConfig( ETH_HandleTypeDef * heth, + uint32_t ulIndex, + uint8_t * Addr ); +#endif + +/* + * Check if a given packet should be accepted. + */ +static BaseType_t xMayAcceptPacket( uint8_t * pucEthernetBuffer ); + +/* + * Initialise the TX descriptors. + */ +static void prvDMATxDescListInit( void ); + +/* + * Initialise the RX descriptors. + */ +static void prvDMARxDescListInit( void ); + +/* After packets have been sent, the network + * buffers will be released. */ +static void vClearTXBuffers( void ); + +void vMACBProbePhy( void ); +/*-----------------------------------------------------------*/ + +#if ( ipconfigUSE_LLMNR == 1 ) + static const uint8_t xLLMNR_MACAddress[] = { 0x01, 0x00, 0x5E, 0x00, 0x00, 0xFC }; +#endif + +static EthernetPhy_t xPhyObject; + +/* Ethernet handle. */ +static ETH_HandleTypeDef xETH; + +/* xTXDescriptorSemaphore is a counting semaphore with + * a maximum count of ETH_TXBUFNB, which is the number of + * DMA TX descriptors. */ +static SemaphoreHandle_t xTXDescriptorSemaphore = NULL; + +/* + * Note: it is advised to define both + * + * #define ipconfigZERO_COPY_RX_DRIVER 1 + * #define ipconfigZERO_COPY_TX_DRIVER 1 + * + * The method using memcpy is slower and probably uses more RAM memory. + * The possibility is left in the code just for comparison. + * + * It is advised to define ETH_TXBUFNB at least 4. Note that no + * TX buffers are allocated in a zero-copy driver. + */ +/* MAC buffers: ---------------------------------------------------------*/ + + +/* Ethernet Rx MA Descriptor */ +#ifndef ETH_RXBUFNB + #define ETH_RXBUFNB ENET_RXBUF_NUM +#endif + +#ifndef ETH_RX_BUF_SIZE + #define ETH_RX_BUF_SIZE ENET_RXBUF_SIZE +#endif + +__attribute__( ( aligned( 32 ) ) ) +ETH_DMADescTypeDef DMARxDscrTab[ ETH_RXBUFNB ]; + +#if ( ipconfigZERO_COPY_RX_DRIVER == 0 ) + /* Ethernet Receive Buffer */ + uint8_t Rx_Buff[ ETH_RXBUFNB ][ ETH_RX_BUF_SIZE ] __attribute__ ((aligned (4))); +#endif + +/* Ethernet Tx DMA Descriptor */ +#ifndef ETH_TXBUFNB + #define ETH_TXBUFNB ENET_TXBUF_NUM +#endif + +#ifndef ETH_TX_BUF_SIZE + #define ETH_TX_BUF_SIZE ENET_TXBUF_SIZE +#endif + +__attribute__( ( aligned( 32 ) ) ) +ETH_DMADescTypeDef DMATxDscrTab[ ETH_TXBUFNB ]; + +#if ( ipconfigZERO_COPY_TX_DRIVER == 0 ) + /* Ethernet Transmit Buffer */ + uint8_t Tx_Buff[ ETH_TXBUFNB ][ ETH_TX_BUF_SIZE ] __attribute__ ((aligned (4))); +#endif + +/* DMATxDescToClear points to the next TX DMA descriptor + * that must be cleared by vClearTXBuffers(). */ +static __IO ETH_DMADescTypeDef * DMATxDescToClear; + +/* Holds the handle of the task used as a deferred interrupt processor. The + * handle is used so direct notifications can be sent to the task for all EMAC/DMA + * related interrupts. */ +static TaskHandle_t xEMACTaskHandle = NULL; + +/* For local use only: describe the PHY's properties: */ +const PhyProperties_t xPHYProperties = +{ + #if ( ipconfigETHERNET_AN_ENABLE != 0 ) + .ucSpeed = PHY_SPEED_AUTO, + .ucDuplex = PHY_DUPLEX_AUTO, + #else + #if ( ipconfigETHERNET_USE_100MB != 0 ) + .ucSpeed = PHY_SPEED_100, + #else + .ucSpeed = PHY_SPEED_10, + #endif + + #if ( ipconfigETHERNET_USE_FULL_DUPLEX != 0 ) + .ucDuplex = PHY_DUPLEX_FULL, + #else + .ucDuplex = PHY_DUPLEX_HALF, + #endif + #endif /* if ( ipconfigETHERNET_AN_ENABLE != 0 ) */ + + #if ( ipconfigETHERNET_AN_ENABLE != 0 ) && ( ipconfigETHERNET_AUTO_CROSS_ENABLE != 0 ) + .ucMDI_X = PHY_MDIX_AUTO, + #elif ( ipconfigETHERNET_CROSSED_LINK != 0 ) + .ucMDI_X = PHY_MDIX_CROSSED, + #else + .ucMDI_X = PHY_MDIX_DIRECT, + #endif +}; +#endif /*STM32_PORT*/ + +#ifndef STM32_PORT +#ifndef CENTRALISED_DEFERRED_IRQ_HADLING +static void receiveHandlerTask( void *pvParameters ); +static TaskHandle_t receiveHandler = NULL; +#else /*CENTRALISED_DEFERRED_IRQ_HADLING*/ +void PendedReceiveHandler( void *pvParameter1, uint32_t ulParameter2 ); +#endif /* CENTRALISED_DEFERRED_IRQ_HADLING */ /** \fn void ENET_IRQHandler(void) @@ -141,6 +496,54 @@ void ENET_IRQHandler(void) #endif portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); } +#else +void HAL_ETH_RxCpltCallback( ETH_HandleTypeDef * heth ); +void HAL_ETH_TxCpltCallback( ETH_HandleTypeDef * heth ); +/** + \fn void ENET_IRQHandler(void) + \brief Ethernet IRQ Handler +*/ +void ENET_IRQHandler(void) +{ + portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + if (SET == enet_interrupt_flag_get( ENET_DMA_INT_FLAG_RS )) + { + enet_interrupt_flag_clear( ENET_DMA_INT_FLAG_RS_CLR ); + HAL_ETH_RxCpltCallback( &xETH ); + } + else if (SET == enet_interrupt_flag_get( ENET_DMA_INT_FLAG_TS )) + { + enet_interrupt_flag_clear( ENET_DMA_INT_FLAG_RS_CLR ); + HAL_ETH_TxCpltCallback( &xETH ); + } + else + { + portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); + } + +#ifdef DEBUG_RBU_IRQ + if (SET == enet_interrupt_flag_get(ENET_DMA_INT_FLAG_RBU)) + { + enet_interrupt_flag_clear(ENET_DMA_INT_FLAG_RBU_CLR); + vTaskNotifyGiveIndexedFromISR(vTaskToggleLed_Handle, 0, &pxHigherPriorityTaskWoken ); + } +#elif defined (DEBUG_TBU_IRQ) + if (SET == enet_interrupt_flag_get(ENET_DMA_INT_FLAG_TBU)) + { + enet_interrupt_flag_clear(ENET_DMA_INT_FLAG_TBU_CLR); + vTaskNotifyGiveFromISR(vTaskHelloWorld_Handle, &pxHigherPriorityTaskWoken ); + } +#elif defined (DEBUG_RBU_IRQ) + if (SET == enet_interrupt_flag_get(ENET_DMA_INT_FLAG_ET)) + { + enet_interrupt_flag_clear(ENET_DMA_INT_FLAG_ET_CLR); + vTaskNotifyGiveIndexedFromISR(vTaskHelloWorld_Handle, 1, &pxHigherPriorityTaskWoken ); + } +#endif + //portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); +} +#endif /* STM32_PORT */ /** \fn ARM_DRIVER_VERSION ARM_ETH_MAC_GetVersion (void) @@ -622,734 +1025,7 @@ int32_t macIntialise(void) return state; } -/*init the mac and phy*/ -BaseType_t xNetworkInterfaceInitialise( void ) -{ - static ARM_ETH_LINK_INFO info; - BaseType_t xResult = pdFALSE; - - if(macIntialise() == ARM_DRIVER_OK && phyIntialise() == ARM_DRIVER_OK){ - - ARM_ETH_LINK_STATE link = Driver_ETH_PHY0.GetLinkState (); - - while(link != ARM_ETH_LINK_UP){ - link = Driver_ETH_PHY0.GetLinkState (); - } - - info = Driver_ETH_PHY0.GetLinkInfo (); - mac->Control(ARM_ETH_MAC_CONFIGURE, - info.speed << ARM_ETH_MAC_SPEED_Pos | - info.duplex << ARM_ETH_MAC_DUPLEX_Pos | - ARM_ETH_MAC_ADDRESS_BROADCAST); - mac->Control(ARM_ETH_MAC_CONTROL_TX, 1); - mac->Control(ARM_ETH_MAC_CONTROL_RX, 1); - - #warning "mac->Control(0x17, 0x23); check if this configuration fixes DP83848 Elasticity buffer problem. Refer to https://habr.com/ru/post/682172/" - mac->Control(REG_RBR, RBR_RMII_MODE | RBR_ELAST_BUF); -#ifndef CENTRALISED_DEFERRED_IRQ_HADLING - if (NULL == receiveHandler) - { - xTaskCreate( receiveHandlerTask, "receiveHandlerTask", 1000, NULL, tskIDLE_PRIORITY + 2, &receiveHandler ); - } - if ( receiveHandler != NULL) - xResult = pdPASS; - else - FreeRTOS_debug_printf(("[NETWORK_INTERFACE] Failed to create receiveHandlerTask()\n")); -#else /* CENTRALISED_DEFERRED_IRQ_HADLING */ - xResult = pdPASS; -#endif /* CENTRALISED_DEFERRED_IRQ_HADLING */ - }else{ - FreeRTOS_debug_printf(("[NETWORK_INTERFACE] Failed macIntialise() or phyIntialise()\n")); - } - return xResult; -} -/*-----------------------------------------------------------*/ - - -/* 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){ - - }else{ - //error - } -} - - -/* send frame */ -#if ( ipconfigZERO_COPY_TX_DRIVER == 0) -/*the Simple network interfaces ,just use Ethernet peripheral driver library functions to copy -data from the FreeRTOS+TCP buffer into the peripheral driver's own buffer.*/ -BaseType_t xNetworkInterfaceOutput( NetworkBufferDescriptor_t * const pxDescriptor,BaseType_t xReleaseAfterSend ){ - /* Simple network interfaces (as opposed to more efficient zero copy network - interfaces) just use Ethernet peripheral driver library functions to copy - data from the FreeRTOS+TCP buffer into the peripheral driver's own buffer. - This example assumes SendData() is a peripheral driver library function that - takes a pointer to the start of the data to be sent and the length of the - data to be sent as two separate parameters. The start of the data is located - by pxDescriptor->pucEthernetBuffer. The length of the data is located - by pxDescriptor->xDataLength. */ - sendData( pxDescriptor->pucEthernetBuffer, pxDescriptor->xDataLength ); - - /* Call the standard trace macro to log the send event. */ - iptraceNETWORK_INTERFACE_TRANSMIT(); - - if( xReleaseAfterSend != pdFALSE ) - { - /* It is assumed SendData() copies the data out of the FreeRTOS+TCP Ethernet - buffer. The Ethernet buffer is therefore no longer needed, and must be - freed for re-use. */ - vReleaseNetworkBufferAndDescriptor( pxDescriptor ); - } - - return pdTRUE; -} -#else /*( ipconfigZERO_COPY_TX_DRIVER == 0)*/ -#warning ipconfigZERO_COPY_TX_DRIVER==1 -/*the Simple network interfaces ,just use Ethernet peripheral driver library functions to copy -data from the FreeRTOS+TCP buffer into the peripheral driver's own buffer.*/ -BaseType_t xNetworkInterfaceOutput( NetworkBufferDescriptor_t * const pxDescriptor,BaseType_t xReleaseAfterSend ){ - /* Simple network interfaces (as opposed to more efficient zero copy network - interfaces) just use Ethernet peripheral driver library functions to copy - data from the FreeRTOS+TCP buffer into the peripheral driver's own buffer. - This example assumes SendData() is a peripheral driver library function that - takes a pointer to the start of the data to be sent and the length of the - data to be sent as two separate parameters. The start of the data is located - by pxDescriptor->pucEthernetBuffer. The length of the data is located - by pxDescriptor->xDataLength. */ - sendData( pxDescriptor->pucEthernetBuffer, pxDescriptor->xDataLength ); - - /* Call the standard trace macro to log the send event. */ - iptraceNETWORK_INTERFACE_TRANSMIT(); - - if( xReleaseAfterSend != pdFALSE ) - { - /* It is assumed SendData() copies the data out of the FreeRTOS+TCP Ethernet - buffer. The Ethernet buffer is therefore no longer needed, and must be - freed for re-use. */ - vReleaseNetworkBufferAndDescriptor( pxDescriptor ); - } - - return pdTRUE; -} -#endif /*( ipconfigZERO_COPY_TX_DRIVER == 0)*/ -/*-----------------------------------------------------------*/ -#ifndef CENTRALISED_DEFERRED_IRQ_HADLING -/*receive data func , will be notify after ARM_ETH_MAC_EVENT_RX_FRAME event*/ -#if (ipconfigZERO_COPY_RX_DRIVER==0) -static void receiveHandlerTask( void *pvParameters ){ - NetworkBufferDescriptor_t *receiveBufferDescriptor; - size_t xBytesReceived; - /* Used to indicate that xSendEventStructToIPTask() is being called becauseof an Ethernet receive event. */ - IPStackEvent_t xRxEvent; - - while(1){ - /* Wait for the Ethernet MAC interrupt to indicate that another packet - has been received. The task notification is used in a similar way to a - counting semaphore to count Rx events, but is a lot more efficient than - a semaphore. */ - ulTaskNotifyTake( pdFALSE, portMAX_DELAY ); - - /* See how much data was received. Here it is assumed ReceiveSize() is - a peripheral driver function that returns the number of bytes in the - received Ethernet frame. */ - xBytesReceived = mac->GetRxFrameSize(); - - if( xBytesReceived > 0 ){ - /* Allocate a network buffer descriptor that points to a buffer - large enough to hold the received frame. As this is the simple - rather than efficient example the received data will just be copied - into this buffer. */ - receiveBufferDescriptor = pxGetNetworkBufferWithDescriptor( xBytesReceived, 0 ); - if( receiveBufferDescriptor != NULL ){ - /* pxBufferDescriptor->pucEthernetBuffer now points to an Ethernet - buffer large enough to hold the received data. Copy the - received data into pcNetworkBuffer->pucEthernetBuffer. Here it - is assumed ReceiveData() is a peripheral driver function that - copies the received data into a buffer passed in as the function's - parameter. Remember! While is is a simple robust technique - - it is not efficient. An example that uses a zero copy technique - is provided further down this page. */ - mac->ReadFrame(receiveBufferDescriptor->pucEthernetBuffer,xBytesReceived); - receiveBufferDescriptor->xDataLength = xBytesReceived; - - /* See if the data contained in the received Ethernet frame needs - to be processed. NOTE! It is preferable to do this in - the interrupt service routine itself, which would remove the need - to unblock this task for packets that don't need processing. */ - if( eConsiderFrameForProcessing( receiveBufferDescriptor->pucEthernetBuffer )== eProcessBuffer ){ - /* The event about to be sent to the TCP/IP is an Rx event. */ - xRxEvent.eEventType = eNetworkRxEvent; - - /* pvData is used to point to the network buffer descriptor that - now references the received data. */ - xRxEvent.pvData = ( void * ) receiveBufferDescriptor; - - /* Send the data to the TCP/IP stack. */ - if( xSendEventStructToIPTask( &xRxEvent, 0 ) == pdFALSE ){ - /* The buffer could not be sent to the IP task so the buffer must be released. */ - vReleaseNetworkBufferAndDescriptor( receiveBufferDescriptor ); - - /* Make a call to the standard trace macro to log the occurrence. */ - iptraceETHERNET_RX_EVENT_LOST(); - }else{ - /* The message was successfully sent to the TCP/IP stack. - Call the standard trace macro to log the occurrence. */ - iptraceNETWORK_INTERFACE_RECEIVE(); - } - }else{ - /* The Ethernet frame can be dropped, but the Ethernet buffer - must be released. */ - vReleaseNetworkBufferAndDescriptor( receiveBufferDescriptor ); - } - - }else{ - /* The event was lost because a network buffer was not available. - Call the standard trace macro to log the occurrence. */ - iptraceETHERNET_RX_EVENT_LOST(); - } - } - } -} - -#else /*(ipconfigZERO_COPY_RX_DRIVER==0)*/ -#warning ipconfigZERO_COPY_RX_DRIVER==1 - /* The deferred interrupt handler is a standard RTOS task. FreeRTOS's centralised -deferred interrupt handling capabilities can also be used - however for additional -speed use BufferAllocation_1.c to perform the entire operation in the interrupt -handler. */ -typedef enet_descriptors_struct DMADescriptor_t; -extern enet_descriptors_struct *dma_current_rxdesc; -static void receiveHandlerTask( void *pvParameters ) -{ -NetworkBufferDescriptor_t *pxDescriptor; -size_t xBytesReceived; -DMADescriptor_t *pxDMARxDescriptor; -uint8_t *pucTemp; -/* Used to indicate that xSendEventStructToIPTask() is being called because -of an Ethernet receive event. */ -IPStackEvent_t xRxEvent; - - for( ;; ) - { - /* Wait for the Ethernet MAC interrupt to indicate that another packet - has been received. The task notification is used in a similar way to a - counting semaphore to count Rx events, but is a lot more efficient than - a semaphore. */ - ulTaskNotifyTake( pdFALSE, portMAX_DELAY ); - - /* This example assumes GetNextRxDescriptor() is an Ethernet MAC driver - library function that returns a pointer to the DMA descriptor (of type - DMADescriptor_t again) that references the Ethernet buffer containing the - received data. */ - pxDMARxDescriptor = (DMADescriptor_t *)enet_current_desc_address_get(ENET_RX_CURRENT_DESC);//(void*)dma_current_rxdesc-> buffer2_next_desc_addr;//GetNextRxDescriptor(); - - /* Allocate a new network buffer descriptor that references an Ethernet - frame large enough to hold the maximum network packet size (as defined - in the FreeRTOSIPConfig.h header file). */ - pxDescriptor = pxGetNetworkBufferWithDescriptor( ipTOTAL_ETHERNET_FRAME_SIZE, 0 ); - - /* Copy the pointer to the newly allocated Ethernet frame to a temporary - variable. */ - pucTemp = pxDescriptor->pucEthernetBuffer; - - /* This example assumes that the DMADescriptor_t type has a member - called pucEthernetBuffer that points to the Ethernet buffer containing - the received data, and a member called xDataLength that holds the length - of the received data. Update the newly allocated network buffer descriptor - to point to the Ethernet buffer that contains the received data. */ - pxDescriptor->pucEthernetBuffer = (uint8_t*)enet_desc_information_get(pxDMARxDescriptor, RXDESC_BUFFER_1_ADDR);//pxDMARxDescriptor->pucEthernetBuffer; - pxDescriptor->xDataLength = enet_rxframe_size_get();//enet_desc_information_get(pxDMARxDescriptor, RXDESC_FRAME_LENGTH);////pxDMARxDescriptor->xDataLength; - - /* Update the Ethernet Rx DMA descriptor to point to the newly allocated - Ethernet buffer. */ - pxDMARxDescriptor->buffer1_addr = (uint32_t)pucTemp; //pxDMARxDescriptor->puxEthernetBuffer = pucTemp; - - /* A pointer to the descriptor is stored at the front of the buffer, so - swap these too. */ - *( ( NetworkBufferDescriptor_t ** ) - ( pxDescriptor->pucEthernetBuffer - ipBUFFER_PADDING ) ) = pxDescriptor; - - *( ( NetworkBufferDescriptor_t ** ) - ( pxDMARxDescriptor->buffer1_addr - ipBUFFER_PADDING ) ) = (NetworkBufferDescriptor_t*)pxDMARxDescriptor;//( pxDMARxDescriptor->pucEthernetBuffer - ipBUFFER_PADDING ) ) = pxDMARxDescriptor; - - /* - * The network buffer descriptor now points to the Ethernet buffer that - * contains the received data, and the Ethernet DMA descriptor now points - * to a newly allocated (and empty) Ethernet buffer ready to receive more - * data. No data was copied. Only pointers to data were swapped. - * - * THE REST OF THE RECEIVE HANDLER FUNCTION FOLLOWS THE EXAMPLE PROVIDED - * FOR THE SIMPLE ETHERNET INTERFACE IMPLEMENTATION, whereby the network - * buffer descriptor is sent to the TCP/IP on the network event queue. - */ - - - - /* See if the data contained in the received Ethernet frame needs - to be processed. NOTE! It might be possible to do this in - the interrupt service routine itself, which would remove the need - to unblock this task for packets that don't need processing. */ - if( eConsiderFrameForProcessing( pxDescriptor->pucEthernetBuffer ) - == eProcessBuffer ) - { - /* The event about to be sent to the TCP/IP is an Rx event. */ - xRxEvent.eEventType = eNetworkRxEvent; - - /* pvData is used to point to the network buffer descriptor that - references the received data. */ - xRxEvent.pvData = ( void * ) pxDescriptor; - - /* Send the data to the TCP/IP stack. */ - if( xSendEventStructToIPTask( &xRxEvent, 0 ) == pdFALSE ) - { - /* The buffer could not be sent to the IP task so the buffer - must be released. */ - vReleaseNetworkBufferAndDescriptor( pxDescriptor ); - - /* Make a call to the standard trace macro to log the - occurrence. */ - iptraceETHERNET_RX_EVENT_LOST(); - } - else - { - /* The message was successfully sent to the TCP/IP stack. - Call the standard trace macro to log the occurrence. */ - iptraceNETWORK_INTERFACE_RECEIVE(); - } - } - else - { - /* The Ethernet frame can be dropped, but the Ethernet buffer - must be released. */ - vReleaseNetworkBufferAndDescriptor( pxDescriptor ); - } - } -} -#endif /*(ipconfigZERO_COPY_RX_DRIVER==0)*/ -#else /* CENTRALISED_DEFERRED_IRQ_HADLING*/ -void PendedReceiveHandler( void *pvParameter1, uint32_t ulParameter2 ) -{ - NetworkBufferDescriptor_t *receiveBufferDescriptor; - size_t xBytesReceived; - /* Used to indicate that xSendEventStructToIPTask() is being called becauseof an Ethernet receive event. */ - IPStackEvent_t xRxEvent; - - xBytesReceived = mac->GetRxFrameSize(); - if( xBytesReceived > 0 ){ - /* Allocate a network buffer descriptor that points to a buffer - large enough to hold the received frame. As this is the simple - rather than efficient example the received data will just be copied - into this buffer. */ - receiveBufferDescriptor = pxGetNetworkBufferWithDescriptor( xBytesReceived, 0 ); - if( receiveBufferDescriptor != NULL ){ - /* pxBufferDescriptor->pucEthernetBuffer now points to an Ethernet - buffer large enough to hold the received data. Copy the - received data into pcNetworkBuffer->pucEthernetBuffer. Here it - is assumed ReceiveData() is a peripheral driver function that - copies the received data into a buffer passed in as the function's - parameter. Remember! While is is a simple robust technique - - it is not efficient. An example that uses a zero copy technique - is provided further down this page. */ - mac->ReadFrame(receiveBufferDescriptor->pucEthernetBuffer,xBytesReceived); - receiveBufferDescriptor->xDataLength = xBytesReceived; - - /* See if the data contained in the received Ethernet frame needs - to be processed. NOTE! It is preferable to do this in - the interrupt service routine itself, which would remove the need - to unblock this task for packets that don't need processing. */ - if( eConsiderFrameForProcessing( receiveBufferDescriptor->pucEthernetBuffer )== eProcessBuffer ){ - /* The event about to be sent to the TCP/IP is an Rx event. */ - xRxEvent.eEventType = eNetworkRxEvent; - - /* pvData is used to point to the network buffer descriptor that - now references the received data. */ - xRxEvent.pvData = ( void * ) receiveBufferDescriptor; - - /* Send the data to the TCP/IP stack. */ - if( xSendEventStructToIPTask( &xRxEvent, 0 ) == pdFALSE ){ - /* The buffer could not be sent to the IP task so the buffer must be released. */ - vReleaseNetworkBufferAndDescriptor( receiveBufferDescriptor ); - - /* Make a call to the standard trace macro to log the occurrence. */ - iptraceETHERNET_RX_EVENT_LOST(); - }else{ - /* The message was successfully sent to the TCP/IP stack. - Call the standard trace macro to log the occurrence. */ - iptraceNETWORK_INTERFACE_RECEIVE(); - } - }else{ - /* The Ethernet frame can be dropped, but the Ethernet buffer - must be released. */ - vReleaseNetworkBufferAndDescriptor( receiveBufferDescriptor ); - } - - }else{ - /* The event was lost because a network buffer was not available. - Call the standard trace macro to log the occurrence. */ - iptraceETHERNET_RX_EVENT_LOST(); - } - } -} -#endif /* CENTRALISED_DEFERRED_IRQ_HADLING*/ -#else /*STM32_PORT*/ -/* - * FreeRTOS+TCP V3.1.0 - * Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * SPDX-License-Identifier: MIT - * - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - * http://aws.amazon.com/freertos - * http://www.FreeRTOS.org - */ - -/***************************************************************************** -* Note: This file is Not! to be used as is. The purpose of this file is to provide -* a template for writing a network interface. Each network interface will have to provide -* concrete implementations of the functions in this file. -* -* See the following URL for an explanation of this file and its functions: -* https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/Embedded_Ethernet_Porting.html -* -*****************************************************************************/ - -/* Standard includes. */ -#include -#include -#include - -/* FreeRTOS includes. */ -#include "FreeRTOS.h" -#include "task.h" -#include "queue.h" -#include "semphr.h" - -/* FreeRTOS+TCP includes. */ -#include "FreeRTOS_IP.h" -#include "FreeRTOS_Sockets.h" -#include "FreeRTOS_IP_Private.h" -#include "FreeRTOS_DNS.h" -#include "FreeRTOS_ARP.h" -#include "NetworkBufferManagement.h" -#include "NetworkInterface.h" -#include "phyHandling.h" - -//#include "stm32fxx_hal_eth.h" - -#include "Driver_ETH.h" -//#include "Driver_ETH_MAC.h" -//#include "Driver_ETH_PHY.h" -/* If ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES is set to 1, then the Ethernet - * driver will filter incoming packets and only pass the stack those packets it - * considers need processing. */ -#if ( ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES == 0 ) - #define ipCONSIDER_FRAME_FOR_PROCESSING( pucEthernetBuffer ) eProcessBuffer -#else - #define ipCONSIDER_FRAME_FOR_PROCESSING( pucEthernetBuffer ) eConsiderFrameForProcessing( ( pucEthernetBuffer ) ) -#endif - -/* ST includes. */ -#if defined( GD32F10X_CL ) - #include "gd32f10x_enet.h" -#elif defined( STM32F7xx ) - #include "stm32f7xx_hal.h" - #define CACHE_LINE_SIZE 32u -#elif defined( STM32F4xx ) - #include "stm32f4xx_hal.h" -#elif defined( STM32F2xx ) - #include "stm32f2xx_hal.h" -#elif defined( STM32F1xx ) - #include "stm32f1xx_hal.h" -#elif !defined( _lint ) /* Lint does not like an #error */ - #error What part? -#endif /* if defined( GD32F10X_CL ) */ - - -/* Interrupt events to process. Currently only the Rx event is processed - * although code for other events is included to allow for possible future - * expansion. */ -#define EMAC_IF_RX_EVENT 1UL -#define EMAC_IF_TX_EVENT 2UL -#define EMAC_IF_ERR_EVENT 4UL -#define EMAC_IF_ALL_EVENT ( EMAC_IF_RX_EVENT | EMAC_IF_TX_EVENT | EMAC_IF_ERR_EVENT ) - -#ifndef ETH_MAX_PACKET_SIZE - #define ETH_MAX_PACKET_SIZE ENET_MAX_FRAME_SIZE -#endif -/* Calculate the maximum packet size that the DMA can receive. */ -#define EMAC_DMA_BUFFER_SIZE ( ( uint32_t ) ( ETH_MAX_PACKET_SIZE - ipBUFFER_PADDING ) ) - -#define ETH_DMA_IT_T ENET_DMA_INTEN_TIE /*!< transmit interrupt enable */ -#define ETH_DMA_IT_TPS ENET_DMA_INTEN_TPSIE /*!< transmit process stopped interrupt enable */ -#warning Check define ETH_DMA_IT_MMC ENET_DMA_INTEN_TBUIE -#define ETH_DMA_IT_MMC ENET_DMA_INTEN_TBUIE /*!< transmit buffer unavailable interrupt enable */ -#define ETH_DMA_IT_TJT ENET_DMA_INTEN_TJTIE /*!< transmit jabber timeout interrupt enable */ -#define ETH_DMA_IT_RO ENET_DMA_INTEN_ROIE /*!< receive overflow interrupt enable */ -#define ETH_DMA_IT_TU ENET_DMA_INTEN_TUIE /*!< transmit underflow interrupt enable */ -#define ETH_DMA_IT_R ENET_DMA_INTEN_RIE /*!< receive interrupt enable */ -#define ETH_DMA_IT_RBU ENET_DMA_INTEN_RBUIE /*!< receive buffer unavailable interrupt enable */ -#define ETH_DMA_IT_RPS ENET_DMA_INTEN_RPSIE /*!< receive process stopped interrupt enable */ -#define ETH_DMA_IT_RWT ENET_DMA_INTEN_RWTIE /*!< receive watchdog timeout interrupt enable */ -#warning Check define ETH_DMA_IT_PMT ENET_DMA_INTEN_ETIE /*!< early transmit interrupt enable */ -#define ETH_DMA_IT_PMT ENET_DMA_INTEN_ETIE /*!< early transmit interrupt enable */ -#define ETH_DMA_IT_FBE ENET_DMA_INTEN_FBEIE /*!< fatal bus error interrupt enable */ -#define ETH_DMA_IT_ER ENET_DMA_INTEN_ERIE /*!< early receive interrupt enable */ -#define ETH_DMA_IT_AIS ENET_DMA_INTEN_AIE /*!< abnormal interrupt summary enable */ -#define ETH_DMA_IT_NIS ENET_DMA_INTEN_NIE /*!< normal interrupt summary enable */ -#warning Check ETH_DMA_IT_TST -#define ETH_DMA_ALL_INTS \ - ( /*ETH_DMA_IT_TST |*/ ETH_DMA_IT_PMT | ETH_DMA_IT_MMC | ETH_DMA_IT_NIS | \ - ETH_DMA_IT_AIS | ETH_DMA_IT_ER | ETH_DMA_IT_FBE | ETH_DMA_IT_RWT | \ - ETH_DMA_IT_RPS | ETH_DMA_IT_RBU | ETH_DMA_IT_R | ETH_DMA_IT_TU | \ - ETH_DMA_IT_RO | ETH_DMA_IT_TJT | ETH_DMA_IT_TPS | ETH_DMA_IT_T ) - - -#ifndef NETWORK_BUFFER_HEADER_SIZE - #define NETWORK_BUFFER_HEADER_SIZE ( ipBUFFER_PADDING ) -#endif - -#ifndef niEMAC_HANDLER_TASK_PRIORITY - #define niEMAC_HANDLER_TASK_PRIORITY configMAX_PRIORITIES - 1 -#endif - -#if ( ( ipconfigDRIVER_INCLUDED_TX_IP_CHECKSUM == 0 ) || ( ipconfigDRIVER_INCLUDED_RX_IP_CHECKSUM == 0 ) ) - #warning Consider enabling checksum offloading -#endif - -#ifndef niDESCRIPTOR_WAIT_TIME_MS - #define niDESCRIPTOR_WAIT_TIME_MS 250uL -#endif - -/* - * Most users will want a PHY that negotiates about - * the connection properties: speed, dmix and duplex. - * On some rare cases, you want to select what is being - * advertised, properties like MDIX and duplex. - */ - -#if !defined( ipconfigETHERNET_AN_ENABLE ) - /* Enable auto-negotiation */ - #define ipconfigETHERNET_AN_ENABLE 1 -#endif - -#if !defined( ipconfigETHERNET_AUTO_CROSS_ENABLE ) - #define ipconfigETHERNET_AUTO_CROSS_ENABLE 1 -#endif - -#if ( ipconfigETHERNET_AN_ENABLE == 0 ) - -/* - * The following three defines are only used in case there - * is no auto-negotiation. - */ - #if !defined( ipconfigETHERNET_CROSSED_LINK ) - #define ipconfigETHERNET_CROSSED_LINK 1 - #endif - - #if !defined( ipconfigETHERNET_USE_100MB ) - #define ipconfigETHERNET_USE_100MB 1 - #endif - - #if !defined( ipconfigETHERNET_USE_FULL_DUPLEX ) - #define ipconfigETHERNET_USE_FULL_DUPLEX 1 - #endif -#endif /* ipconfigETHERNET_AN_ENABLE == 0 */ - -/* Default the size of the stack used by the EMAC deferred handler task to twice - * the size of the stack used by the idle task - but allow this to be overridden in - * FreeRTOSConfig.h as configMINIMAL_STACK_SIZE is a user definable constant. */ -#ifndef configEMAC_TASK_STACK_SIZE - #define configEMAC_TASK_STACK_SIZE ( 2 * configMINIMAL_STACK_SIZE ) -#endif - -/* Two choices must be made: RMII versus MII, - * and the index of the PHY in use ( between 0 and 31 ). */ -#ifndef ipconfigUSE_RMII - #ifdef GD32F10X_CL - #define ipconfigUSE_RMII 1 - #warning Using RMII, make sure if this is correct - #else - #define ipconfigUSE_RMII 0 - #warning Using MII, make sure if this is correct - #endif /* GD32F10X_CL */ -#endif /* ipconfigUSE_RMII */ - -typedef enum -{ - eMACInit, /* Must initialise MAC. */ - eMACPass, /* Initialisation was successful. */ - eMACFailed, /* Initialisation failed. */ -} eMAC_INIT_STATUS_TYPE; - -static eMAC_INIT_STATUS_TYPE xMacInitStatus = eMACInit; - -/*-----------------------------------------------------------*/ - -/* - * A deferred interrupt handler task that processes - */ -static void prvEMACHandlerTask( void * pvParameters ); - -/* - * Force a negotiation with the Switch or Router and wait for LS. - */ -static void prvEthernetUpdateConfig( BaseType_t xForce ); - -/* - * See if there is a new packet and forward it to the IP-task. - */ -static BaseType_t prvNetworkInterfaceInput( void ); - -#if ( ipconfigUSE_LLMNR != 0 ) || ( ipconfigUSE_MDNS != 0 ) - -/* - * For LLMNR, an extra MAC-address must be configured to - * be able to receive the multicast messages. - */ - static void prvMACAddressConfig( ETH_HandleTypeDef * heth, - uint32_t ulIndex, - uint8_t * Addr ); -#endif - -/* - * Check if a given packet should be accepted. - */ -static BaseType_t xMayAcceptPacket( uint8_t * pucEthernetBuffer ); - -/* - * Initialise the TX descriptors. - */ -static void prvDMATxDescListInit( void ); - -/* - * Initialise the RX descriptors. - */ -static void prvDMARxDescListInit( void ); - -/* After packets have been sent, the network - * buffers will be released. */ -static void vClearTXBuffers( void ); - -/*-----------------------------------------------------------*/ - -#if ( ipconfigUSE_LLMNR == 1 ) - static const uint8_t xLLMNR_MACAddress[] = { 0x01, 0x00, 0x5E, 0x00, 0x00, 0xFC }; -#endif - -static EthernetPhy_t xPhyObject; - -/* Ethernet handle. */ -static ETH_HandleTypeDef xETH; - -/* xTXDescriptorSemaphore is a counting semaphore with - * a maximum count of ETH_TXBUFNB, which is the number of - * DMA TX descriptors. */ -static SemaphoreHandle_t xTXDescriptorSemaphore = NULL; - -/* - * Note: it is advised to define both - * - * #define ipconfigZERO_COPY_RX_DRIVER 1 - * #define ipconfigZERO_COPY_TX_DRIVER 1 - * - * The method using memcpy is slower and probably uses more RAM memory. - * The possibility is left in the code just for comparison. - * - * It is advised to define ETH_TXBUFNB at least 4. Note that no - * TX buffers are allocated in a zero-copy driver. - */ -/* MAC buffers: ---------------------------------------------------------*/ - - -/* Ethernet Rx MA Descriptor */ -#ifndef ETH_RXBUFNB - #define ETH_RXBUFNB ENET_RXBUF_NUM -#endif - -#ifndef ETH_RX_BUF_SIZE - #define ETH_RX_BUF_SIZE ENET_RXBUF_SIZE -#endif - -__attribute__( ( aligned( 32 ) ) ) -ETH_DMADescTypeDef DMARxDscrTab[ ETH_RXBUFNB ]; - -#if ( ipconfigZERO_COPY_RX_DRIVER == 0 ) - /* Ethernet Receive Buffer */ - uint8_t Rx_Buff[ ETH_RXBUFNB ][ ETH_RX_BUF_SIZE ] __attribute__ ((aligned (4))); -#endif - -/* Ethernet Tx DMA Descriptor */ -#ifndef ETH_TXBUFNB - #define ETH_TXBUFNB ENET_TXBUF_NUM -#endif - -#ifndef ETH_TX_BUF_SIZE - #define ETH_TX_BUF_SIZE ENET_TXBUF_SIZE -#endif - -__attribute__( ( aligned( 32 ) ) ) -ETH_DMADescTypeDef DMATxDscrTab[ ETH_TXBUFNB ]; - -#if ( ipconfigZERO_COPY_TX_DRIVER == 0 ) - /* Ethernet Transmit Buffer */ - uint8_t Tx_Buff[ ETH_TXBUFNB ][ ETH_TX_BUF_SIZE ] __attribute__ ((aligned (4))); -#endif - -/* DMATxDescToClear points to the next TX DMA descriptor - * that must be cleared by vClearTXBuffers(). */ -static __IO ETH_DMADescTypeDef * DMATxDescToClear; - -/* Holds the handle of the task used as a deferred interrupt processor. The - * handle is used so direct notifications can be sent to the task for all EMAC/DMA - * related interrupts. */ -static TaskHandle_t xEMACTaskHandle = NULL; - -/* For local use only: describe the PHY's properties: */ -const PhyProperties_t xPHYProperties = -{ - #if ( ipconfigETHERNET_AN_ENABLE != 0 ) - .ucSpeed = PHY_SPEED_AUTO, - .ucDuplex = PHY_DUPLEX_AUTO, - #else - #if ( ipconfigETHERNET_USE_100MB != 0 ) - .ucSpeed = PHY_SPEED_100, - #else - .ucSpeed = PHY_SPEED_10, - #endif - - #if ( ipconfigETHERNET_USE_FULL_DUPLEX != 0 ) - .ucDuplex = PHY_DUPLEX_FULL, - #else - .ucDuplex = PHY_DUPLEX_HALF, - #endif - #endif /* if ( ipconfigETHERNET_AN_ENABLE != 0 ) */ - - #if ( ipconfigETHERNET_AN_ENABLE != 0 ) && ( ipconfigETHERNET_AUTO_CROSS_ENABLE != 0 ) - .ucMDI_X = PHY_MDIX_AUTO, - #elif ( ipconfigETHERNET_CROSSED_LINK != 0 ) - .ucMDI_X = PHY_MDIX_CROSSED, - #else - .ucMDI_X = PHY_MDIX_DIRECT, - #endif -}; - +#ifdef STM32_PORT /*-----------------------------------------------------------*/ void HAL_ETH_RxCpltCallback( ETH_HandleTypeDef * heth ) @@ -1473,8 +1149,41 @@ static void vClearTXBuffers() HAL_StatusTypeDef HAL_ETH_Init( ETH_HandleTypeDef* pxETH ) { HAL_StatusTypeDef xResult = ARM_DRIVER_ERROR; + enet_enable(); if (SUCCESS == enet_init( pxETH->Init.AutoNegotiation /*ENET_AUTO_NEGOTIATION*/, pxETH->Init.ChecksumMode /* ENET_AUTOCHECKSUM_DROP_FAILFRAMES*/, pxETH->Init.RxMode /* ENET_RECEIVEALL*/)) xResult = ARM_DRIVER_OK; + enet_interrupt_enable(ETH_DMA_IT_R); + enet_interrupt_enable(ETH_DMA_IT_NIS); + return xResult; +} + + +BaseType_t _xNetworkInterfaceInitialise( void ) +{ + static ARM_ETH_LINK_INFO info; + BaseType_t xResult = pdFALSE; + + if(macIntialise() == ARM_DRIVER_OK && phyIntialise() == ARM_DRIVER_OK){ + + ARM_ETH_LINK_STATE link = Driver_ETH_PHY0.GetLinkState (); + + while(link != ARM_ETH_LINK_UP){ + link = Driver_ETH_PHY0.GetLinkState (); + } + + info = Driver_ETH_PHY0.GetLinkInfo (); + mac->Control(ARM_ETH_MAC_CONFIGURE, + info.speed << ARM_ETH_MAC_SPEED_Pos | + info.duplex << ARM_ETH_MAC_DUPLEX_Pos | + ARM_ETH_MAC_ADDRESS_BROADCAST); + mac->Control(ARM_ETH_MAC_CONTROL_TX, 1); + mac->Control(ARM_ETH_MAC_CONTROL_RX, 1); + + #warning "mac->Control(0x17, 0x23); check if this configuration fixes DP83848 Elasticity buffer problem. Refer to https://habr.com/ru/post/682172/" + mac->Control(REG_RBR, RBR_RMII_MODE | RBR_ELAST_BUF); + }else{ + FreeRTOS_debug_printf(("[NETWORK_INTERFACE] Failed macIntialise() or phyIntialise()\n")); + } return xResult; } @@ -1486,7 +1195,7 @@ BaseType_t xNetworkInterfaceInitialise( void ) #if ( ipconfigUSE_LLMNR != 0 ) || ( ipconfigUSE_MDNS != 0 ) BaseType_t xMACEntry = ETH_MAC_ADDRESS1; /* ETH_MAC_ADDRESS0 reserved for the primary MAC-address. */ #endif - + if( xMacInitStatus == eMACInit ) { xTXDescriptorSemaphore = xSemaphoreCreateCounting( ( UBaseType_t ) ETH_TXBUFNB, ( UBaseType_t ) ETH_TXBUFNB ); @@ -1531,9 +1240,10 @@ BaseType_t xNetworkInterfaceInitialise( void ) xETH.Init.MediaInterface = ETH_MEDIA_INTERFACE_MII; } #endif /* ipconfigUSE_RMII */ - + hal_eth_init_status = HAL_ETH_Init( &xETH ); - + _xNetworkInterfaceInitialise(); + vMACBProbePhy(); /* Only for inspection by debugger. */ ( void ) hal_eth_init_status; @@ -1597,8 +1307,8 @@ BaseType_t xNetworkInterfaceInitialise( void ) { if( xPhyObject.ulLinkStatusMask != 0U ) { - xETH.Instance->DMAIER |= ETH_DMA_ALL_INTS; - ENET_DMA_INTEN |= ETH_DMA_ALL_INTS; + xETH.Instance->DMAIER |= ETH_DMA_ALL_INTS; + //ENET_DMA_INTEN |= ETH_DMA_ALL_INTS; xResult = pdPASS; FreeRTOS_printf( ( "Link Status is high\n" ) ); } @@ -2564,60 +2274,382 @@ static void prvEMACHandlerTask( void * pvParameters ) } } /*-----------------------------------------------------------*/ -/** - \fn void ENET_IRQHandler(void) - \brief Ethernet IRQ Handler -*/ -void ENET_IRQHandler(void) -{ - portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; - - if (SET == enet_interrupt_flag_get( ENET_DMA_INT_FLAG_RS )) - { - enet_interrupt_flag_clear( ENET_DMA_INT_FLAG_RS_CLR ); - HAL_ETH_RxCpltCallback( &xETH ); - } - else if (SET == enet_interrupt_flag_get( ENET_DMA_INT_FLAG_TS )) - { - enet_interrupt_flag_clear( ENET_DMA_INT_FLAG_RS_CLR ); - HAL_ETH_TxCpltCallback( &xETH ); - } - else - { - portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); - } - -#ifdef DEBUG_RBU_IRQ - if (SET == enet_interrupt_flag_get(ENET_DMA_INT_FLAG_RBU)) - { - enet_interrupt_flag_clear(ENET_DMA_INT_FLAG_RBU_CLR); - vTaskNotifyGiveIndexedFromISR(vTaskToggleLed_Handle, 0, &pxHigherPriorityTaskWoken ); - } -#elif defined (DEBUG_TBU_IRQ) - if (SET == enet_interrupt_flag_get(ENET_DMA_INT_FLAG_TBU)) - { - enet_interrupt_flag_clear(ENET_DMA_INT_FLAG_TBU_CLR); - vTaskNotifyGiveFromISR(vTaskHelloWorld_Handle, &pxHigherPriorityTaskWoken ); - } -#elif defined (DEBUG_RBU_IRQ) - if (SET == enet_interrupt_flag_get(ENET_DMA_INT_FLAG_ET)) - { - enet_interrupt_flag_clear(ENET_DMA_INT_FLAG_ET_CLR); - vTaskNotifyGiveIndexedFromISR(vTaskHelloWorld_Handle, 1, &pxHigherPriorityTaskWoken ); - } -#endif - //portYIELD_FROM_ISR( xHigherPriorityTaskWoken ); -} -/*void ETH_IRQHandler( void ) -{ - HAL_ETH_IRQHandler( &xETH ); -}*/ /* * Some constants, hardware definitions and comments taken from ST's HAL driver * library, COPYRIGHT(c) 2015 STMicroelectronics. */ -#endif /*STM32_PORT*/ +#else /*STM32_PORT*/ +/*init the mac and phy*/ +BaseType_t xNetworkInterfaceInitialise( void ) +{ + static ARM_ETH_LINK_INFO info; + BaseType_t xResult = pdFALSE; + + if(macIntialise() == ARM_DRIVER_OK && phyIntialise() == ARM_DRIVER_OK){ + + ARM_ETH_LINK_STATE link = Driver_ETH_PHY0.GetLinkState (); + + while(link != ARM_ETH_LINK_UP){ + link = Driver_ETH_PHY0.GetLinkState (); + } + + info = Driver_ETH_PHY0.GetLinkInfo (); + mac->Control(ARM_ETH_MAC_CONFIGURE, + info.speed << ARM_ETH_MAC_SPEED_Pos | + info.duplex << ARM_ETH_MAC_DUPLEX_Pos | + ARM_ETH_MAC_ADDRESS_BROADCAST); + mac->Control(ARM_ETH_MAC_CONTROL_TX, 1); + mac->Control(ARM_ETH_MAC_CONTROL_RX, 1); + #warning "mac->Control(0x17, 0x23); check if this configuration fixes DP83848 Elasticity buffer problem. Refer to https://habr.com/ru/post/682172/" + mac->Control(REG_RBR, RBR_RMII_MODE | RBR_ELAST_BUF); +#ifndef CENTRALISED_DEFERRED_IRQ_HADLING + if (NULL == receiveHandler) + { + xTaskCreate( receiveHandlerTask, "receiveHandlerTask", 1000, NULL, tskIDLE_PRIORITY + 2, &receiveHandler ); + } + if ( receiveHandler != NULL) + xResult = pdPASS; + else + FreeRTOS_debug_printf(("[NETWORK_INTERFACE] Failed to create receiveHandlerTask()\n")); +#else /* CENTRALISED_DEFERRED_IRQ_HADLING */ + xResult = pdPASS; +#endif /* CENTRALISED_DEFERRED_IRQ_HADLING */ + }else{ + FreeRTOS_debug_printf(("[NETWORK_INTERFACE] Failed macIntialise() or phyIntialise()\n")); + } + return xResult; +} +/*-----------------------------------------------------------*/ + + +/* 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){ + + }else{ + //error + } +} + + +/* send frame */ +#if ( ipconfigZERO_COPY_TX_DRIVER == 0) +/*the Simple network interfaces ,just use Ethernet peripheral driver library functions to copy +data from the FreeRTOS+TCP buffer into the peripheral driver's own buffer.*/ +BaseType_t xNetworkInterfaceOutput( NetworkBufferDescriptor_t * const pxDescriptor,BaseType_t xReleaseAfterSend ){ + /* Simple network interfaces (as opposed to more efficient zero copy network + interfaces) just use Ethernet peripheral driver library functions to copy + data from the FreeRTOS+TCP buffer into the peripheral driver's own buffer. + This example assumes SendData() is a peripheral driver library function that + takes a pointer to the start of the data to be sent and the length of the + data to be sent as two separate parameters. The start of the data is located + by pxDescriptor->pucEthernetBuffer. The length of the data is located + by pxDescriptor->xDataLength. */ + sendData( pxDescriptor->pucEthernetBuffer, pxDescriptor->xDataLength ); + + /* Call the standard trace macro to log the send event. */ + iptraceNETWORK_INTERFACE_TRANSMIT(); + + if( xReleaseAfterSend != pdFALSE ) + { + /* It is assumed SendData() copies the data out of the FreeRTOS+TCP Ethernet + buffer. The Ethernet buffer is therefore no longer needed, and must be + freed for re-use. */ + vReleaseNetworkBufferAndDescriptor( pxDescriptor ); + } + + return pdTRUE; +} +#else /*( ipconfigZERO_COPY_TX_DRIVER == 0)*/ +#warning ipconfigZERO_COPY_TX_DRIVER==1 +/*the Simple network interfaces ,just use Ethernet peripheral driver library functions to copy +data from the FreeRTOS+TCP buffer into the peripheral driver's own buffer.*/ +BaseType_t xNetworkInterfaceOutput( NetworkBufferDescriptor_t * const pxDescriptor,BaseType_t xReleaseAfterSend ){ + /* Simple network interfaces (as opposed to more efficient zero copy network + interfaces) just use Ethernet peripheral driver library functions to copy + data from the FreeRTOS+TCP buffer into the peripheral driver's own buffer. + This example assumes SendData() is a peripheral driver library function that + takes a pointer to the start of the data to be sent and the length of the + data to be sent as two separate parameters. The start of the data is located + by pxDescriptor->pucEthernetBuffer. The length of the data is located + by pxDescriptor->xDataLength. */ + sendData( pxDescriptor->pucEthernetBuffer, pxDescriptor->xDataLength ); + + /* Call the standard trace macro to log the send event. */ + iptraceNETWORK_INTERFACE_TRANSMIT(); + + if( xReleaseAfterSend != pdFALSE ) + { + /* It is assumed SendData() copies the data out of the FreeRTOS+TCP Ethernet + buffer. The Ethernet buffer is therefore no longer needed, and must be + freed for re-use. */ + vReleaseNetworkBufferAndDescriptor( pxDescriptor ); + } + + return pdTRUE; +} +#endif /*( ipconfigZERO_COPY_TX_DRIVER == 0)*/ +/*-----------------------------------------------------------*/ +#ifndef CENTRALISED_DEFERRED_IRQ_HADLING +/*receive data func , will be notify after ARM_ETH_MAC_EVENT_RX_FRAME event*/ +#if (ipconfigZERO_COPY_RX_DRIVER==0) +static void receiveHandlerTask( void *pvParameters ){ + NetworkBufferDescriptor_t *receiveBufferDescriptor; + size_t xBytesReceived; + /* Used to indicate that xSendEventStructToIPTask() is being called becauseof an Ethernet receive event. */ + IPStackEvent_t xRxEvent; + + while(1){ + /* Wait for the Ethernet MAC interrupt to indicate that another packet + has been received. The task notification is used in a similar way to a + counting semaphore to count Rx events, but is a lot more efficient than + a semaphore. */ + ulTaskNotifyTake( pdFALSE, portMAX_DELAY ); + + /* See how much data was received. Here it is assumed ReceiveSize() is + a peripheral driver function that returns the number of bytes in the + received Ethernet frame. */ + xBytesReceived = mac->GetRxFrameSize(); + + if( xBytesReceived > 0 ){ + /* Allocate a network buffer descriptor that points to a buffer + large enough to hold the received frame. As this is the simple + rather than efficient example the received data will just be copied + into this buffer. */ + receiveBufferDescriptor = pxGetNetworkBufferWithDescriptor( xBytesReceived, 0 ); + if( receiveBufferDescriptor != NULL ){ + /* pxBufferDescriptor->pucEthernetBuffer now points to an Ethernet + buffer large enough to hold the received data. Copy the + received data into pcNetworkBuffer->pucEthernetBuffer. Here it + is assumed ReceiveData() is a peripheral driver function that + copies the received data into a buffer passed in as the function's + parameter. Remember! While is is a simple robust technique - + it is not efficient. An example that uses a zero copy technique + is provided further down this page. */ + mac->ReadFrame(receiveBufferDescriptor->pucEthernetBuffer,xBytesReceived); + receiveBufferDescriptor->xDataLength = xBytesReceived; + + /* See if the data contained in the received Ethernet frame needs + to be processed. NOTE! It is preferable to do this in + the interrupt service routine itself, which would remove the need + to unblock this task for packets that don't need processing. */ + if( eConsiderFrameForProcessing( receiveBufferDescriptor->pucEthernetBuffer )== eProcessBuffer ){ + /* The event about to be sent to the TCP/IP is an Rx event. */ + xRxEvent.eEventType = eNetworkRxEvent; + + /* pvData is used to point to the network buffer descriptor that + now references the received data. */ + xRxEvent.pvData = ( void * ) receiveBufferDescriptor; + + /* Send the data to the TCP/IP stack. */ + if( xSendEventStructToIPTask( &xRxEvent, 0 ) == pdFALSE ){ + /* The buffer could not be sent to the IP task so the buffer must be released. */ + vReleaseNetworkBufferAndDescriptor( receiveBufferDescriptor ); + + /* Make a call to the standard trace macro to log the occurrence. */ + iptraceETHERNET_RX_EVENT_LOST(); + }else{ + /* The message was successfully sent to the TCP/IP stack. + Call the standard trace macro to log the occurrence. */ + iptraceNETWORK_INTERFACE_RECEIVE(); + } + }else{ + /* The Ethernet frame can be dropped, but the Ethernet buffer + must be released. */ + vReleaseNetworkBufferAndDescriptor( receiveBufferDescriptor ); + } + + }else{ + /* The event was lost because a network buffer was not available. + Call the standard trace macro to log the occurrence. */ + iptraceETHERNET_RX_EVENT_LOST(); + } + } + } +} + +#else /*(ipconfigZERO_COPY_RX_DRIVER==0)*/ +#warning ipconfigZERO_COPY_RX_DRIVER==1 + /* The deferred interrupt handler is a standard RTOS task. FreeRTOS's centralised +deferred interrupt handling capabilities can also be used - however for additional +speed use BufferAllocation_1.c to perform the entire operation in the interrupt +handler. */ +typedef enet_descriptors_struct DMADescriptor_t; +extern enet_descriptors_struct *dma_current_rxdesc; +static void receiveHandlerTask( void *pvParameters ) +{ +NetworkBufferDescriptor_t *pxDescriptor; +size_t xBytesReceived; +DMADescriptor_t *pxDMARxDescriptor; +uint8_t *pucTemp; +/* Used to indicate that xSendEventStructToIPTask() is being called because +of an Ethernet receive event. */ +IPStackEvent_t xRxEvent; + + for( ;; ) + { + /* Wait for the Ethernet MAC interrupt to indicate that another packet + has been received. The task notification is used in a similar way to a + counting semaphore to count Rx events, but is a lot more efficient than + a semaphore. */ + ulTaskNotifyTake( pdFALSE, portMAX_DELAY ); + + /* This example assumes GetNextRxDescriptor() is an Ethernet MAC driver + library function that returns a pointer to the DMA descriptor (of type + DMADescriptor_t again) that references the Ethernet buffer containing the + received data. */ + pxDMARxDescriptor = (DMADescriptor_t *)enet_current_desc_address_get(ENET_RX_CURRENT_DESC);//(void*)dma_current_rxdesc-> buffer2_next_desc_addr;//GetNextRxDescriptor(); + + /* Allocate a new network buffer descriptor that references an Ethernet + frame large enough to hold the maximum network packet size (as defined + in the FreeRTOSIPConfig.h header file). */ + pxDescriptor = pxGetNetworkBufferWithDescriptor( ipTOTAL_ETHERNET_FRAME_SIZE, 0 ); + + /* Copy the pointer to the newly allocated Ethernet frame to a temporary + variable. */ + pucTemp = pxDescriptor->pucEthernetBuffer; + + /* This example assumes that the DMADescriptor_t type has a member + called pucEthernetBuffer that points to the Ethernet buffer containing + the received data, and a member called xDataLength that holds the length + of the received data. Update the newly allocated network buffer descriptor + to point to the Ethernet buffer that contains the received data. */ + pxDescriptor->pucEthernetBuffer = (uint8_t*)enet_desc_information_get(pxDMARxDescriptor, RXDESC_BUFFER_1_ADDR);//pxDMARxDescriptor->pucEthernetBuffer; + pxDescriptor->xDataLength = enet_rxframe_size_get();//enet_desc_information_get(pxDMARxDescriptor, RXDESC_FRAME_LENGTH);////pxDMARxDescriptor->xDataLength; + + /* Update the Ethernet Rx DMA descriptor to point to the newly allocated + Ethernet buffer. */ + pxDMARxDescriptor->buffer1_addr = (uint32_t)pucTemp; //pxDMARxDescriptor->puxEthernetBuffer = pucTemp; + + /* A pointer to the descriptor is stored at the front of the buffer, so + swap these too. */ + *( ( NetworkBufferDescriptor_t ** ) + ( pxDescriptor->pucEthernetBuffer - ipBUFFER_PADDING ) ) = pxDescriptor; + + *( ( NetworkBufferDescriptor_t ** ) + ( pxDMARxDescriptor->buffer1_addr - ipBUFFER_PADDING ) ) = (NetworkBufferDescriptor_t*)pxDMARxDescriptor;//( pxDMARxDescriptor->pucEthernetBuffer - ipBUFFER_PADDING ) ) = pxDMARxDescriptor; + + /* + * The network buffer descriptor now points to the Ethernet buffer that + * contains the received data, and the Ethernet DMA descriptor now points + * to a newly allocated (and empty) Ethernet buffer ready to receive more + * data. No data was copied. Only pointers to data were swapped. + * + * THE REST OF THE RECEIVE HANDLER FUNCTION FOLLOWS THE EXAMPLE PROVIDED + * FOR THE SIMPLE ETHERNET INTERFACE IMPLEMENTATION, whereby the network + * buffer descriptor is sent to the TCP/IP on the network event queue. + */ + + + + /* See if the data contained in the received Ethernet frame needs + to be processed. NOTE! It might be possible to do this in + the interrupt service routine itself, which would remove the need + to unblock this task for packets that don't need processing. */ + if( eConsiderFrameForProcessing( pxDescriptor->pucEthernetBuffer ) + == eProcessBuffer ) + { + /* The event about to be sent to the TCP/IP is an Rx event. */ + xRxEvent.eEventType = eNetworkRxEvent; + + /* pvData is used to point to the network buffer descriptor that + references the received data. */ + xRxEvent.pvData = ( void * ) pxDescriptor; + + /* Send the data to the TCP/IP stack. */ + if( xSendEventStructToIPTask( &xRxEvent, 0 ) == pdFALSE ) + { + /* The buffer could not be sent to the IP task so the buffer + must be released. */ + vReleaseNetworkBufferAndDescriptor( pxDescriptor ); + + /* Make a call to the standard trace macro to log the + occurrence. */ + iptraceETHERNET_RX_EVENT_LOST(); + } + else + { + /* The message was successfully sent to the TCP/IP stack. + Call the standard trace macro to log the occurrence. */ + iptraceNETWORK_INTERFACE_RECEIVE(); + } + } + else + { + /* The Ethernet frame can be dropped, but the Ethernet buffer + must be released. */ + vReleaseNetworkBufferAndDescriptor( pxDescriptor ); + } + } +} +#endif /*(ipconfigZERO_COPY_RX_DRIVER==0)*/ +#else /* CENTRALISED_DEFERRED_IRQ_HADLING*/ +void PendedReceiveHandler( void *pvParameter1, uint32_t ulParameter2 ) +{ + NetworkBufferDescriptor_t *receiveBufferDescriptor; + size_t xBytesReceived; + /* Used to indicate that xSendEventStructToIPTask() is being called becauseof an Ethernet receive event. */ + IPStackEvent_t xRxEvent; + + xBytesReceived = mac->GetRxFrameSize(); + if( xBytesReceived > 0 ){ + /* Allocate a network buffer descriptor that points to a buffer + large enough to hold the received frame. As this is the simple + rather than efficient example the received data will just be copied + into this buffer. */ + receiveBufferDescriptor = pxGetNetworkBufferWithDescriptor( xBytesReceived, 0 ); + if( receiveBufferDescriptor != NULL ){ + /* pxBufferDescriptor->pucEthernetBuffer now points to an Ethernet + buffer large enough to hold the received data. Copy the + received data into pcNetworkBuffer->pucEthernetBuffer. Here it + is assumed ReceiveData() is a peripheral driver function that + copies the received data into a buffer passed in as the function's + parameter. Remember! While is is a simple robust technique - + it is not efficient. An example that uses a zero copy technique + is provided further down this page. */ + mac->ReadFrame(receiveBufferDescriptor->pucEthernetBuffer,xBytesReceived); + receiveBufferDescriptor->xDataLength = xBytesReceived; + + /* See if the data contained in the received Ethernet frame needs + to be processed. NOTE! It is preferable to do this in + the interrupt service routine itself, which would remove the need + to unblock this task for packets that don't need processing. */ + if( eConsiderFrameForProcessing( receiveBufferDescriptor->pucEthernetBuffer )== eProcessBuffer ){ + /* The event about to be sent to the TCP/IP is an Rx event. */ + xRxEvent.eEventType = eNetworkRxEvent; + + /* pvData is used to point to the network buffer descriptor that + now references the received data. */ + xRxEvent.pvData = ( void * ) receiveBufferDescriptor; + + /* Send the data to the TCP/IP stack. */ + if( xSendEventStructToIPTask( &xRxEvent, 0 ) == pdFALSE ){ + /* The buffer could not be sent to the IP task so the buffer must be released. */ + vReleaseNetworkBufferAndDescriptor( receiveBufferDescriptor ); + + /* Make a call to the standard trace macro to log the occurrence. */ + iptraceETHERNET_RX_EVENT_LOST(); + }else{ + /* The message was successfully sent to the TCP/IP stack. + Call the standard trace macro to log the occurrence. */ + iptraceNETWORK_INTERFACE_RECEIVE(); + } + }else{ + /* The Ethernet frame can be dropped, but the Ethernet buffer + must be released. */ + vReleaseNetworkBufferAndDescriptor( receiveBufferDescriptor ); + } + + }else{ + /* The event was lost because a network buffer was not available. + Call the standard trace macro to log the occurrence. */ + iptraceETHERNET_RX_EVENT_LOST(); + } + } +} +#endif /* CENTRALISED_DEFERRED_IRQ_HADLING*/ +#endif /*STM32_PORT*/ diff --git a/Test_project_for_GD32107C-EVAL.uvguix.right b/Test_project_for_GD32107C-EVAL.uvguix.right index 9af047e..c59f42d 100644 --- a/Test_project_for_GD32107C-EVAL.uvguix.right +++ b/Test_project_for_GD32107C-EVAL.uvguix.right @@ -9,23 +9,30 @@ D:\Users\right\Documents\Keil\Projects\Test_project_for_GD32107C-EVAL\DemoTasks - + + + System Viewer\ENET_DMA + 35905 + + 214 + + 38003 Registers - 269 117 + 187 165 346 Code Coverage - 1171 393 + 1404 160 204 Performance Analyzer - 914 234 234 182 + 1564 @@ -40,13 +47,13 @@ 1506 Symbols - 71 71 71 + 106 106 106 1936 Watch 1 - 391 133 133 + 200 133 133 1937 @@ -58,7 +65,7 @@ 1935 Call Stack + Locals - 182 133 133 + 200 133 133 2506 @@ -93,25 +100,25 @@ 2 3 - -32000 - -32000 + -1 + -1 -1 -1 - 76 - 787 - 2067 - 737 + 97 + 195 + 1475 + 758 0 - 1608 - 0100000004000000010000000100000001000000010000000000000002000000000000000100000001000000000000002800000028000000010000000A00000000000000010000008F443A5C55736572735C72696768745C446F63756D656E74735C4B65696C5C50726F6A656374735C546573745F70726F6A6563745F666F725F47443332313037432D4556414C5C4672656552544F535C736F757263655C706F727461626C655C4E6574776F726B496E746572666163655C626F6172645F66616D696C795C4E6574776F726B496E746572666163652E6300000000124E6574776F726B496E746572666163652E6300000000C5D4F200FFFFFFFF4C443A5C55736572735C72696768745C446F63756D656E74735C4B65696C5C50726F6A656374735C546573745F70726F6A6563745F666F725F47443332313037432D4556414C5C6D61696E2E6300000000066D61696E2E6300000000FFDC7800FFFFFFFF65443A5C55736572735C72696768745C446F63756D656E74735C4B65696C5C50726F6A656374735C546573745F70726F6A6563745F666F725F47443332313037432D4556414C5C44656D6F5461736B735C53696D706C655443504563686F5365727665722E63000000001553696D706C655443504563686F5365727665722E6300000000BECEA100FFFFFFFF71443A5C55736572735C72696768745C446F63756D656E74735C4B65696C5C50726F6A656374735C546573745F70726F6A6563745F666F725F47443332313037432D4556414C5C5254455C4465766963655C474433324631303756435C737461727475705F67643332663130785F636C2E730000000015737461727475705F67643332663130785F636C2E7300000000F0A0A100FFFFFFFF6B443A5C55736572735C72696768745C446F63756D656E74735C4B65696C5C50726F6A656374735C546573745F70726F6A6563745F666F725F47443332313037432D4556414C5C5254455C4465766963655C474433324631303756435C67643332663130785F6770696F2E63000000000F67643332663130785F6770696F2E6300000000F7B88600FFFFFFFF5F443A5C55736572735C72696768745C446F63756D656E74735C4B65696C5C50726F6A656374735C546573745F70726F6A6563745F666F725F47443332313037432D4556414C5C5254455C52544F535C4672656552544F53436F6E6669672E6800000000104672656552544F53436F6E6669672E6800000000F6FA7D00FFFFFFFF70443A5C55736572735C72696768745C446F63756D656E74735C4B65696C5C50726F6A656374735C546573745F70726F6A6563745F666F725F47443332313037432D4556414C5C4672656552544F535C736F757263655C696E636C7564655C4672656552544F534950436F6E6669672E6800000000124672656552544F534950436F6E6669672E68000000005FC3CF00FFFFFFFF7B443A5C55736572735C72696768745C446F63756D656E74735C4B65696C5C50726F6A656374735C546573745F70726F6A6563745F666F725F47443332313037432D4556414C5C4672656552544F535C736F757263655C696E636C7564655C4672656552544F535F5443505F53746174655F48616E646C696E672E68000000001D4672656552544F535F5443505F53746174655F48616E646C696E672E6800000000D9ADC200FFFFFFFF68443A5C55736572735C72696768745C446F63756D656E74735C4B65696C5C50726F6A656374735C546573745F70726F6A6563745F666F725F47443332313037432D4556414C5C4672656552544F535C736F757263655C4672656552544F535F536F636B6574732E6300000000124672656552544F535F536F636B6574732E6300000000A5C2D700FFFFFFFF67443A5C55736572735C72696768745C446F63756D656E74735C4B65696C5C50726F6A656374735C546573745F70726F6A6563745F666F725F47443332313037432D4556414C5C4672656552544F535C736F757263655C4672656552544F535F5443505F49502E6300000000114672656552544F535F5443505F49502E6300000000B3A6BE00FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000E201000081000000000A0000A4030000 + 867 + 0100000004000000010000000100000001000000010000000000000002000000000000000100000001000000000000002800000028000000010000000500000002000000010000008F443A5C55736572735C72696768745C446F63756D656E74735C4B65696C5C50726F6A656374735C546573745F70726F6A6563745F666F725F47443332313037432D4556414C5C4672656552544F535C736F757263655C706F727461626C655C4E6574776F726B496E746572666163655C626F6172645F66616D696C795C4E6574776F726B496E746572666163652E6300000000124E6574776F726B496E746572666163652E6300000000C5D4F200FFFFFFFF71443A5C55736572735C72696768745C446F63756D656E74735C4B65696C5C50726F6A656374735C546573745F70726F6A6563745F666F725F47443332313037432D4556414C5C5254455C4465766963655C474433324631303756435C737461727475705F67643332663130785F636C2E730000000015737461727475705F67643332663130785F636C2E7300000000FFDC7800FFFFFFFF4C443A5C55736572735C72696768745C446F63756D656E74735C4B65696C5C50726F6A656374735C546573745F70726F6A6563745F666F725F47443332313037432D4556414C5C6D61696E2E6300000000066D61696E2E6300000000BECEA100FFFFFFFF58443A5C55736572735C72696768745C446F63756D656E74735C4B65696C5C50726F6A656374735C546573745F70726F6A6563745F666F725F47443332313037432D4556414C5C72665F7377697463685F6472697665722E63000000001272665F7377697463685F6472697665722E6300000000F0A0A100FFFFFFFF65443A5C55736572735C72696768745C446F63756D656E74735C4B65696C5C50726F6A656374735C546573745F70726F6A6563745F666F725F47443332313037432D4556414C5C44656D6F5461736B735C53696D706C655443504563686F5365727665722E63000000001553696D706C655443504563686F5365727665722E6300000000BCA8E100FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD5000100000000000000020000006E01000081000000000A000081040000 @@ -130,11 +137,11 @@ 0 16 - 000000005F000000DE01000082030000 + 000000005F0000006A0100005F040000 16 - 0000000081000000DE010000A4030000 + 00000000810000006A0100009B030000 @@ -150,7 +157,7 @@ 0 16 - 0300000083000000DB0100005F030000 + 0300000083000000670100003C040000 16 @@ -170,7 +177,7 @@ 0 16 - 0300000083000000DB0100005F030000 + 0300000083000000670100003C040000 16 @@ -450,7 +457,7 @@ 0 16 - 0300000083000000DB0100005F030000 + 0300000083000000670100003C040000 16 @@ -470,7 +477,7 @@ 0 16 - 0300000083000000DB0100005F030000 + 0300000083000000670100003C040000 16 @@ -490,7 +497,7 @@ 0 16 - 03000000AA030000FD09000002050000 + 0300000087040000FD09000002050000 16 @@ -530,7 +537,7 @@ 0 16 - 03000000AA030000FD09000002050000 + 03000000870400007D07000002050000 16 @@ -1150,7 +1157,7 @@ 0 16 - 0300000083000000DB0100005F030000 + 03000000830000006701000056030000 16 @@ -1170,7 +1177,7 @@ 0 16 - 03000000AA030000FD09000002050000 + 03000000870400007D07000002050000 16 @@ -1190,7 +1197,7 @@ 0 16 - 03000000AA030000FD09000002050000 + 03000000870400007D07000002050000 16 @@ -1250,7 +1257,7 @@ 0 16 - 03000000AA030000FD09000002050000 + 0300000087040000FD09000002050000 16 @@ -1270,7 +1277,7 @@ 0 16 - 03000000AA030000FD09000002050000 + 03000000870400007D07000002050000 16 @@ -1798,15 +1805,15 @@ - 3387 - 000000000B000000000000000010000001000000FFFFFFFFFFFFFFFFDE0100005F000000E20100008203000001000000020000100400000001000000BBFEFFFFB008000000000000000000000000000001000000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000FFFF02000B004354616262656450616E6500100000010000000000000081000000DE010000A4030000000000005F000000DE010000820300000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000020000000000000FFFFFFFFFFFFFFFF440100001D0100006A07000021010000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D6010000458900000180002000000000000044010000810000006A0700003F010000440100005F0000006A0700001D0100000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF260600005F0000002A060000D7020000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C30000018000400000000000002A060000810000006A070000F90200002A0600005F0000006A070000D702000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000080000000000000FFFFFFFFFFFFFFFF00000000B60200006A070000BA02000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB0900000180008000000000000000000000DC0200006A070000BB03000000000000BA0200006A0700009903000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFB5030000BA020000B90300009903000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF0000000082030000000A0000860300000100000001000010040000000100000012FCFFFFCD00000000000000000000000000000001000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF010000779400000180008000000100000000000000A8030000000A0000470500000000000086030000000A0000250500000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF31416C6C205265666572656E636573206F6620276970747261636545544845524E45545F52585F4556454E545F4C4F53542701000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + 3371 + 000000000B000000000000000010000001000000FFFFFFFFFFFFFFFF6A0100005F0000006E0100005F0400000100000002000010040000000100000024FEFFFF790B000000000000000000000000000001000000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000FFFF02000B004354616262656450616E65001000000100000000000000810000006A0100009B030000000000005F0000006A0100005F0400000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000020000000000000FFFFFFFFFFFFFFFF440100001D0100006A07000021010000000000000100000004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D6010000458900000180002000000000000044010000810000006A0700003F010000440100005F0000006A0700001D0100000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF260600005F0000002A060000D7020000000000000200000004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C30000018000400000000000002A060000810000006A070000F90200002A0600005F0000006A070000D702000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000080000000000000FFFFFFFFFFFFFFFF00000000B60200006A070000BA02000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB0900000180008000000000000000000000DC0200006A070000BB03000000000000BA0200006A0700009903000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFB5030000BA020000B90300009903000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF000000005F040000000A0000630400000100000001000010040000000100000032FEFFFF0702000000000000000000000000000001000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF0100007794000001800080000001000000000000009F03000080070000610400000000000063040000000A0000250500000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF21416C6C205265666572656E636573206F662027764D41434250726F62655068792701000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 59392 File - 2658 - 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000001F4652454552544F535F534F5F52455553455F4C495354454E5F534F434B4554960000000000000004001F4652454552544F535F534F5F52455553455F4C495354454E5F534F434B45540F625265757365536F636B6574203D200C625265757365536F636B65740C4761696E3A20536F636B657400000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65F1010000 + 2581 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000004000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000000A785068794F626A656374960000000000000002000A785068794F626A6563740E2F2A53544D33325F504F52542A2F0000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65F1010000 1423 @@ -1871,11 +1878,11 @@ 0 16 - 90010000AF0300006507000025050000 + 3F01000068030000280500003F040000 16 - 90010000D10300006908000047050000 + 3F01000070040000A807000047050000 @@ -1891,7 +1898,7 @@ 0 16 - 03000000830000008901000002050000 + 0300000083000000380100001C040000 16 @@ -1931,7 +1938,7 @@ 0 16 - 6C07000083000000FD09000002050000 + 2F050000830000007D0700001C040000 16 @@ -1951,7 +1958,7 @@ 0 16 - 6C07000083000000FD09000002050000 + 2F050000830000007D0700001C040000 16 @@ -1971,7 +1978,7 @@ 0 16 - 6C07000083000000F908000002050000 + 2F050000830000007D07000002050000 16 @@ -1991,7 +1998,7 @@ 0 16 - 6C07000083000000F908000002050000 + 2F050000830000007D07000002050000 16 @@ -2011,11 +2018,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2031,7 +2038,7 @@ 0 16 - 930100008300000066080000BE000000 + 4201000083000000A507000096000000 16 @@ -2051,7 +2058,7 @@ 0 16 - 6C07000083000000FD09000002050000 + 2F050000830000007D0700001C040000 16 @@ -2071,7 +2078,7 @@ 0 16 - 6C07000083000000FD09000002050000 + 2F050000830000007D0700001C040000 16 @@ -2091,7 +2098,7 @@ 0 16 - 6C07000083000000F908000002050000 + 2F050000830000007D07000002050000 16 @@ -2111,7 +2118,7 @@ 0 16 - 6C07000083000000FD09000002050000 + 2F050000830000007D0700001C040000 16 @@ -2131,7 +2138,7 @@ 0 16 - 6C07000083000000F908000002050000 + 2F050000830000007D07000002050000 16 @@ -2151,7 +2158,7 @@ 0 16 - 6C07000083000000F908000002050000 + 2F050000830000007D07000002050000 16 @@ -2171,7 +2178,7 @@ 0 16 - 6C07000083000000F908000002050000 + 2F050000830000007D07000002050000 16 @@ -2191,7 +2198,7 @@ 0 16 - 03000000830000008901000002050000 + 0300000083000000380100001C040000 16 @@ -2231,7 +2238,7 @@ 0 16 - 93010000D30300006207000002050000 + 420100008C030000250500001C040000 16 @@ -2251,7 +2258,7 @@ 0 16 - 93010000D30300006207000002050000 + 420100008C030000250500001C040000 16 @@ -2271,7 +2278,7 @@ 0 16 - 93010000D30300006608000002050000 + 420100008C030000A50700001C040000 16 @@ -2291,7 +2298,7 @@ 0 16 - 900100008000000065070000E1000000 + 3F0100008000000028050000B9000000 16 @@ -2311,7 +2318,7 @@ 0 16 - 930100008300000066080000BE000000 + 4201000083000000A507000096000000 16 @@ -2351,11 +2358,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2371,7 +2378,7 @@ 0 16 - 6C07000083000000F908000002050000 + 2F050000830000007D07000002050000 16 @@ -2391,7 +2398,7 @@ 0 16 - 930100008300000066080000BE000000 + 4201000083000000A507000096000000 16 @@ -2411,7 +2418,7 @@ 0 16 - 930100008300000066080000BE000000 + 4201000083000000A507000096000000 16 @@ -2431,7 +2438,7 @@ 0 16 - 930100008300000066080000BE000000 + 4201000083000000A507000096000000 16 @@ -2451,7 +2458,7 @@ 0 16 - 930100008300000066080000BE000000 + 4201000083000000A507000096000000 16 @@ -2471,11 +2478,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2491,11 +2498,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2511,11 +2518,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2531,11 +2538,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2551,11 +2558,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2571,11 +2578,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2591,11 +2598,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2611,11 +2618,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2631,11 +2638,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2651,11 +2658,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2671,11 +2678,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2691,11 +2698,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2711,11 +2718,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2731,11 +2738,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2751,11 +2758,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2771,11 +2778,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2791,11 +2798,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2811,11 +2818,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2831,11 +2838,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2851,17 +2858,17 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 35905 35905 - 0 + 1 0 0 0 @@ -2871,11 +2878,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D0700001C040000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -2891,7 +2898,7 @@ 0 16 - 03000000830000008901000002050000 + 0300000083000000380100001C040000 16 @@ -2911,7 +2918,7 @@ 0 16 - 93010000D30300006608000002050000 + 420100008C030000A50700001C040000 16 @@ -2931,7 +2938,7 @@ 0 16 - 93010000D30300006608000002050000 + 420100008C030000A50700001C040000 16 @@ -2951,7 +2958,7 @@ 0 16 - 6C07000083000000F908000002050000 + 2F050000830000007D07000002050000 16 @@ -2971,7 +2978,7 @@ 0 16 - 6C07000083000000F908000002050000 + 2F050000830000007D07000002050000 16 @@ -2991,7 +2998,7 @@ 0 16 - 93010000D30300006207000002050000 + 420100008C030000250500001C040000 16 @@ -3011,7 +3018,7 @@ 0 16 - 93010000D30300006608000002050000 + 420100008C030000A50700001C040000 16 @@ -3031,7 +3038,7 @@ 0 16 - 930100008300000066080000BE000000 + 4201000083000000A507000096000000 16 @@ -3051,11 +3058,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3071,11 +3078,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3091,11 +3098,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3111,11 +3118,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3131,11 +3138,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3151,11 +3158,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3171,11 +3178,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3191,11 +3198,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3211,11 +3218,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3231,11 +3238,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3251,11 +3258,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3271,11 +3278,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3291,11 +3298,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3311,11 +3318,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3331,11 +3338,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3351,11 +3358,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3371,11 +3378,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3391,11 +3398,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3411,11 +3418,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3431,11 +3438,11 @@ 0 16 - DB08000083000000FD0900006E040000 + 2F050000830000007D07000002050000 16 - 1C0800008802000025090000AB060000 + 820700000A050000AA08000090080000 @@ -3471,7 +3478,7 @@ 0 16 - 0000000025050000000A000042050000 + 000000003F040000800700005C040000 16 @@ -3531,7 +3538,7 @@ 0 16 - 6C07000083000000F908000002050000 + 2F050000830000007D07000002050000 16 @@ -3539,15 +3546,15 @@ - 3598 - 000000000C000000000000000080000001000000FFFFFFFFFFFFFFFF90010000AB03000065070000AF030000010000000100001004000000010000006BFCFFFFA000000000000000000000000000000001000000FFFFFFFF07000000C5000000C7000000B4010000D2010000CF01000077940000C6000000FFFF02000B004354616262656450616E65008000000100000090010000D1030000690800004705000090010000AF03000065070000250500000000000040820056070000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF27416C6C205265666572656E636573206F6620274672656552544F535F736574736F636B6F70742701000000CF01000001000000FFFFFFFFFFFFFFFF0642726F777365000000007794000001000000FFFFFFFFFFFFFFFF07436F6D6D616E6401000000C600000001000000FFFFFFFFFFFFFFFF0400000000000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000020000001000000FFFFFFFFFFFFFFFF90010000E100000065070000E5000000010000000100001004000000010000003CFFFFFFF703000000000000000000000000000001000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D6010000458900000180002000000100000090010000810000006908000003010000900100005F00000065070000E10000000000000040280056080000000B446973617373656D626C7901000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000001000000FFFFFFFFFFFFFFFF650700005F0000006907000025050000010000000200001004000000010000002CF9FFFF91010000FFFFFFFF0F0000008F07000090070000B9050000BA0500009307000094070000950700009607000091070000B5010000B801000038030000BB050000BC050000CB090000018000400000010000006D08000081000000000A000047050000690700005F000000000A00002505000000000000404100560F0000001343616C6C20537461636B202B204C6F63616C73010000008F07000001000000FFFFFFFFFFFFFFFF0757617463682031010000009007000001000000FFFFFFFFFFFFFFFF084D656D6F7279203101000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203201000000BA05000001000000FFFFFFFFFFFFFFFF0755415254202331010000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFF01000000000000000000000000000000000000000000000001000000FFFFFFFF8F07000001000000FFFFFFFF8F070000000000000040000000000000FFFFFFFFFFFFFFFFD40800005F000000D8080000910400000000000002000000040000000100000070F9FFFFB801000000000000000000000000000001000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000D808000081000000000A0000B3040000D80800005F000000000A00009104000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF03424B50000000003E8C000001000000FFFFFFFFFFFFFFFF03524355000000003F8C000001000000FFFFFFFFFFFFFFFF03504D5500000000408C000001000000FFFFFFFFFFFFFFFF0352544300000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000002000000000000000000000002000000FFFFFFFF9B0800005F0000009F0800008204000000000000020000000400000000000000000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000000000000FFFFFFFFFFFFFFFFE00000005F000000E4000000190500000000000002000000040000000100000093FEFFFFE6030000FFFFFFFF020000006D000000C4000000018000100000000000000000000081000000E00000003B050000000000005F000000E00000001905000000000000404100460200000005426F6F6B73000000006D00000001000000FFFFFFFFFFFFFFFF0954656D706C6174657300000000C400000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF6D00000001000000FFFFFFFF6D000000000000000010000001000000FFFFFFFFFFFFFFFF8C0100005F000000900100002505000001000000020000100400000001000000DDFDFFFF3B06000000000000000000000000000001000000FFFFFFFF03000000ED030000C3000000739400000180001000000100000000000000810000008C01000047050000000000005F0000008C010000250500000000000040410056030000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF09526567697374657273010000007394000001000000FFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000000000000000000 + 3356 + 000000000A000000000000000080000001000000FFFFFFFFFFFFFFFF3F01000064030000280500006803000001000000010000100400000001000000F3FDFFFF2802000000000000000000000000000001000000FFFFFFFF07000000C5000000C7000000B4010000D2010000CF01000077940000C6000000FFFF02000B004354616262656450616E6500800000010000003F01000070040000A8070000470500003F01000068030000280500003F0400000000000040820056070000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0E536F757263652042726F7773657200000000D201000001000000FFFFFFFFFFFFFFFF2F416C6C205265666572656E636573206F662027784E6574776F726B496E74657266616365496E697469616C6973652701000000CF01000001000000FFFFFFFFFFFFFFFF0642726F777365000000007794000001000000FFFFFFFFFFFFFFFF07436F6D6D616E6401000000C600000001000000FFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000020000001000000FFFFFFFFFFFFFFFF3F010000B900000028050000BD0000000100000001000010040000000100000080FFFFFF6003000000000000000000000000000001000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000018000200000010000003F01000081000000A8070000DB0000003F0100005F00000028050000B90000000000000040280056080000000B446973617373656D626C7901000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFF0000000000000000000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000001000000FFFFFFFFFFFFFFFF280500005F0000002C0500003F04000001000000020000100400000001000000DFF9FFFF95020000FFFFFFFF3A0000008F07000090070000B9050000BA0500009307000094070000950700009607000091070000B5010000B801000038030000BB050000BC050000CB090000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000001000000AC07000081000000000A0000470500002C0500005F000000800700003F04000000000000404100563A0000001343616C6C20537461636B202B204C6F63616C73010000008F07000001000000FFFFFFFFFFFFFFFF0757617463682031010000009007000001000000FFFFFFFFFFFFFFFF084D656D6F7279203101000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203201000000BA05000001000000FFFFFFFFFFFFFFFF0755415254202331010000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFF0753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF08454E45545F444D4101000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFF25000000000000000000000000000000000000000000000001000000FFFFFFFF8F07000001000000FFFFFFFF8F070000000000000010000000000000FFFFFFFFFFFFFFFFE00000005F000000E4000000190500000000000002000000040000000100000093FEFFFFE6030000FFFFFFFF020000006D000000C4000000018000100000000000000000000081000000E00000003B050000000000005F000000E00000001905000000000000404100460200000005426F6F6B73000000006D00000001000000FFFFFFFFFFFFFFFF0954656D706C6174657300000000C400000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF6D00000001000000FFFFFFFF6D000000000000000010000001000000FFFFFFFFFFFFFFFF3B0100005F0000003F0100003F0400000100000002000010040000000100000076FEFFFF3004000000000000000000000000000001000000FFFFFFFF03000000ED030000C3000000739400000180001000000100000000000000810000003B01000047050000000000005F0000003B0100003F0400000000000040410056030000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF09526567697374657273010000007394000001000000FFFFFFFFFFFFFFFF0100000000000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000000000000000000 59392 File - 2944 - 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000001F4652454552544F535F534F5F52455553455F4C495354454E5F534F434B4554960000000000000010001F4652454552544F535F534F5F52455553455F4C495354454E5F534F434B45540F625265757365536F636B6574203D200C625265757365536F636B65740C4761696E3A20536F636B6574001074736B49444C455F5052494F524954590469646C6514636F6E6669674D41585F5052494F5249544945530869646C655461736B1D697074726163654E4554574F524B5F4556454E545F52454345495645441D6970747261636545544845524E45545F52585F4556454E545F4C4F535426202369662028206970636F6E6669674841535F44454255475F5052494E5446203D3D20312029186970636F6E6669674841535F44454255475F5052494E544614784170706C69636174696F6E44484350486F6F6B156970636F6E6669675553455F444843505F484F4F4B115253542072656365697665642066726F6D00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000100150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65D5030000 + 2581 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000004000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000004000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000004000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000000A785068794F626A656374960000000000000002000A785068794F626A6563740E2F2A53544D33325F504F52542A2F0000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000004001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000100150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65D5030000 1423 @@ -3563,7 +3570,7 @@ Build 955 - 00200000000000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0000000000000000010000000000000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000000002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050FFFFFFFF00960000000000000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000000240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64E1010000 + 00200000000000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000010000000000000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000000002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050FFFFFFFF00960000000000000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000000240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64E1010000 583 @@ -3579,7 +3586,7 @@ Debug 2362 - 00200000010000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000004002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000020001002D0000000000000000000000000000000001000000010000000180F07F0000020001002E0000000000000000000000000000000001000000010000000180E8880000020000003700000000000000000000000000000000010000000100000001803B010000020001002F0000000000000000000000000000000001000000010000000180BB8A00000200010030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000002000100310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720000000000000000010000000000000001000000000000000000000001000000000013800F0100000200010032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000002000100330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7200000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000002000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72000000000000000001000000000000000100000000000000000000000100000000000000000005446562756787020000 + 00200000010000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000004002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000004002800000000000000000000000000000000010000000100000001801B80000000000400290000000000000000000000000000000001000000010000000180E57F0000000004002A00000000000000000000000000000000010000000100000001801C800000000004002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000004002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000020001002D0000000000000000000000000000000001000000010000000180F07F0000020001002E0000000000000000000000000000000001000000010000000180E8880000020000003700000000000000000000000000000000010000000100000001803B010000020001002F0000000000000000000000000000000001000000010000000180BB8A00000200010030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000002000100310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000010000000000000001000000000000000000000001000000000013800F0100000200010032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000002000100330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000100000000000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000002000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72010000000000000001000000000000000100000000000000000000000100000000000000000005446562756787020000 898 @@ -3592,8 +3599,8 @@ 0 - 2560 - 1440 + 1920 + 1200 @@ -3603,30 +3610,12 @@ 0 100 - 0 + 2 .\FreeRTOS\source\portable\NetworkInterface\board_family\NetworkInterface.c - 41 - 93 - 106 - 1 - - 0 - - - .\main.c - 58 - 357 - 378 - 1 - - 0 - - - .\DemoTasks\SimpleTCPEchoServer.c - 21 - 300 - 311 + 12 + 1314 + 1315 1 0 @@ -3634,62 +3623,35 @@ RTE/Device/GD32F107VC/startup_gd32f10x_cl.s 0 - 161 + 158 170 1 0 - RTE/Device/GD32F107VC/gd32f10x_gpio.c + .\main.c 0 - 269 - 278 + 375 + 376 1 0 - RTE/RTOS/FreeRTOSConfig.h - 47 - 137 - 156 + .\rf_switch_driver.c + 5 + 1 + 8 1 0 - FreeRTOS\source\include\FreeRTOSIPConfig.h - 42 - 67 - 87 - 1 - - 0 - - - FreeRTOS\source\include\FreeRTOS_TCP_State_Handling.h - 38 - 41 - 63 - 1 - - 0 - - - .\FreeRTOS\source\FreeRTOS_Sockets.c - 15 - 3838 - 3859 - 1 - - 0 - - - .\FreeRTOS\source\FreeRTOS_TCP_IP.c - 0 - 739 - 760 + .\DemoTasks\SimpleTCPEchoServer.c + 26 + 326 + 368 1 0 @@ -3698,9 +3660,9 @@ - .\DemoTasks\SimpleTCPEchoServer.c 183 - .\FreeRTOS\source\FreeRTOS_TCP_IP.c 759 - .\DemoTasks\SimpleTCPEchoServer.c 310 + .\FreeRTOS\source\portable\NetworkInterface\board_family\NetworkInterface.c 2016 + .\FreeRTOS\source\portable\NetworkInterface\board_family\NetworkInterface.c 2276 + .\FreeRTOS\source\portable\NetworkInterface\board_family\NetworkInterface.c 1312 diff --git a/Test_project_for_GD32107C-EVAL.uvoptx b/Test_project_for_GD32107C-EVAL.uvoptx index 3e48117..e6e6b4f 100644 --- a/Test_project_for_GD32107C-EVAL.uvoptx +++ b/Test_project_for_GD32107C-EVAL.uvoptx @@ -140,7 +140,7 @@ 0 CMSIS_AGDI - -X"Any" -UAny -O1230 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO23 -FD20000000 -FC1000 -FN1 -FF0GD32F10x_CL.FLM -FS08000000 -FL040000 -FP0($$Device:GD32F107VC$Flash\GD32F10x_CL.FLM) + -X"Any" -UAny -O1230 -S8 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(1BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO23 -FD20000000 -FC1000 -FN1 -FF0GD32F10x_CL.FLM -FS08000000 -FL040000 -FP0($$Device:GD32F107VC$Flash\GD32F10x_CL.FLM) 0 @@ -153,24 +153,7 @@ UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0GD32F10x_CL -FS08000000 -FL040000 -FP0($$Device:GD32F107VC$Flash\GD32F10x_CL.FLM)) - - - 0 - 0 - 323 - 1 -
0
- 0 - 0 - 0 - 0 - 0 - 0 - .\FreeRTOS\source\FreeRTOS_IP.c - - -
-
+ 0 @@ -308,7 +291,7 @@ - E:\Arm\Packs\ARM\CMSIS-FreeRTOS\10.5.1\CMSIS\RTOS2\FreeRTOS\FreeRTOS.scvd + C:\Users\User\AppData\Local\Arm\Packs\ARM\CMSIS-FreeRTOS\10.5.1\CMSIS\RTOS2\FreeRTOS\FreeRTOS.scvd ARM.CMSIS-FreeRTOS.10.5.1 1 @@ -320,7 +303,7 @@ 1 1 0 - 0 + 1 0 0 1 @@ -354,6 +337,12 @@ + + + System Viewer\ENET_DMA + 35905 + + @@ -451,7 +440,7 @@ FreeRTOS - 1 + 0 0 0 0 @@ -771,7 +760,7 @@ ::Device - 0 + 1 0 0 1 diff --git a/Test_project_for_GD32107C-EVAL.uvprojx b/Test_project_for_GD32107C-EVAL.uvprojx index f4827e6..c4ad78e 100644 --- a/Test_project_for_GD32107C-EVAL.uvprojx +++ b/Test_project_for_GD32107C-EVAL.uvprojx @@ -338,7 +338,7 @@ 0 0 - -D DEBUG -D STM32_PORT -Wno-pragma-pack -Wno-macro-redefined -U CENTRALISED_DEFERRED_IRQ_HADLING + -D DEBUG -U STM32_PORT -Wno-pragma-pack -Wno-macro-redefined -U CENTRALISED_DEFERRED_IRQ_HADLING DEBUG_LISTEN_SOCK .\FreeRTOS\source\portable\NetworkInterface\include;.\FreeRTOS\source\include;.\FreeRTOS\source\portable\Compiler\Keil;.\DemoTasks\include;..\GigaDevice_test;.\include;.\PHY diff --git a/main.c b/main.c index 2180250..310dd0d 100644 --- a/main.c +++ b/main.c @@ -22,11 +22,18 @@ #define LED2_USER_PORT GPIOC #define LED5_TICK_PORT GPIOE -#define RF_SWITCH_PORT GPIOE -#define RF_SWITCH_PIN_A GPIO_PIN_10 -#define RF_SWITCH_PIN_B GPIO_PIN_11 -#define RF_SWITCH_PIN_C GPIO_PIN_12 -#define RF_SWITCH_PIN_EN GPIO_PIN_13 + +#define RF_SWITCH1_PORT GPIOE +#define RF_SWITCH1_PIN_A GPIO_PIN_7 +#define RF_SWITCH1_PIN_B GPIO_PIN_8 +#define RF_SWITCH1_PIN_C GPIO_PIN_9 +#define RF_SWITCH1_PIN_EN GPIO_PIN_10 + +#define RF_SWITCH2_PORT GPIOE +#define RF_SWITCH2_PIN_A GPIO_PIN_11 +#define RF_SWITCH2_PIN_B GPIO_PIN_12 +#define RF_SWITCH2_PIN_C GPIO_PIN_13 +#define RF_SWITCH2_PIN_EN GPIO_PIN_14 #define LED2_USER GPIO_PIN_0 #define LED5_TICK GPIO_PIN_1 @@ -146,7 +153,7 @@ static const uint8_t ucDNSServerAddress[ 4 ] = /* Use by the pseudo random number generator. */ static UBaseType_t ulNextRand; -struct rf_switch_config rfSwitchConfig; +struct rf_switch_config rfSwitch1Config, rfSwitch2Config; /* * Just seeds the simple pseudo random number generator. */ @@ -279,8 +286,9 @@ static void vInitMCU(void) #ifndef STM32_PORT enet_descriptors_chain_init(ENET_DMA_TX); enet_descriptors_chain_init(ENET_DMA_RX); - enet_enable(); #endif + enet_enable(); + //nvic_irq_enable(ENET_IRQn, ipconfigMAC_INTERRUPT_PRIORITY, 0xFF); __disable_irq(); NVIC_ClearPendingIRQ(ENET_IRQn); @@ -367,7 +375,8 @@ static void prvMiscInitialisation( void ) int main(void) { vInitMCU(); - vRFSwitchInit(&rfSwitchConfig, RF_SWITCH_PORT, RF_SWITCH_PIN_A, RF_SWITCH_PORT, RF_SWITCH_PIN_B, RF_SWITCH_PORT, RF_SWITCH_PIN_C, RF_SWITCH_PORT, RF_SWITCH_PIN_EN); + vRFSwitchInit(&rfSwitch1Config, RF_SWITCH1_PORT, RF_SWITCH1_PIN_A, RF_SWITCH1_PORT, RF_SWITCH1_PIN_B, RF_SWITCH1_PORT, RF_SWITCH1_PIN_C, RF_SWITCH1_PORT, RF_SWITCH1_PIN_EN); + vRFSwitchInit(&rfSwitch2Config, RF_SWITCH2_PORT, RF_SWITCH2_PIN_A, RF_SWITCH2_PORT, RF_SWITCH2_PIN_B, RF_SWITCH2_PORT, RF_SWITCH2_PIN_C, RF_SWITCH2_PORT, RF_SWITCH2_PIN_EN); prvMiscInitialisation(); xTaskCreate( vTaskToggleLed, "ToggleLed", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, &vTaskToggleLed_Handle); xTaskCreate( vTaskHelloWorld, "HelloWorld", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, &vTaskHelloWorld_Handle);