diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/bin/openbtl_olimex_stm32e407.elf b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/bin/openbtl_olimex_stm32e407.elf index e5f2a67c..e843df6b 100644 Binary files a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/bin/openbtl_olimex_stm32e407.elf and b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/bin/openbtl_olimex_stm32e407.elf differ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/bin/openbtl_olimex_stm32e407.map b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/bin/openbtl_olimex_stm32e407.map index 9645b556..aa5dfcca 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/bin/openbtl_olimex_stm32e407.map +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/bin/openbtl_olimex_stm32e407.map @@ -1008,8 +1008,6 @@ Discarded input sections 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_AHB3PeriphClockCmd 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o - .text.RCC_AHB1PeriphResetCmd - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_AHB2PeriphResetCmd 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_AHB3PeriphResetCmd @@ -1306,24 +1304,10 @@ Discarded input sections 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_syscfg.o .text.SYSCFG_EXTILineConfig 0x00000000 0x40 THUMB Debug/../../obj/stm32f4xx_syscfg.o - .text.SYSCFG_ETH_MediaInterfaceConfig - 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_syscfg.o .text.SYSCFG_CompensationCellCmd 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_syscfg.o .text.SYSCFG_GetCompensationCellStatus 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_syscfg.o - .debug_frame 0x00000000 0x88 THUMB Debug/../../obj/stm32f4xx_syscfg.o - .debug_info 0x00000000 0x2b7 THUMB Debug/../../obj/stm32f4xx_syscfg.o - .debug_abbrev 0x00000000 0x177 THUMB Debug/../../obj/stm32f4xx_syscfg.o - .debug_loc 0x00000000 0xe6 THUMB Debug/../../obj/stm32f4xx_syscfg.o - .debug_aranges - 0x00000000 0x48 THUMB Debug/../../obj/stm32f4xx_syscfg.o - .debug_ranges 0x00000000 0x38 THUMB Debug/../../obj/stm32f4xx_syscfg.o - .debug_line 0x00000000 0x27d THUMB Debug/../../obj/stm32f4xx_syscfg.o - .debug_str 0x00000000 0x354 THUMB Debug/../../obj/stm32f4xx_syscfg.o - .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_syscfg.o - .ARM.attributes - 0x00000000 0x33 THUMB Debug/../../obj/stm32f4xx_syscfg.o .text 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_tim.o .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_tim.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_tim.o @@ -1600,6 +1584,209 @@ Discarded input sections .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_wwdg.o .ARM.attributes 0x00000000 0x33 THUMB Debug/../../obj/stm32f4xx_wwdg.o + .text 0x00000000 0x0 THUMB Debug/../../obj/stm32_eth.o + .data 0x00000000 0x0 THUMB Debug/../../obj/stm32_eth.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_HandleTxPkt + 0x00000000 0x12c THUMB Debug/../../obj/stm32_eth.o + .text.ETH_HandleRxPkt + 0x00000000 0x120 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DropRxPkt + 0x00000000 0x64 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_PHYLoopBackCmd + 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetFlowControlBusyStatus + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_InitiatePauseControlFrame + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_BackPressureActivationCmd + 0x00000000 0x28 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetMACFlagStatus + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetMACITStatus + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MACITConfig + 0x00000000 0x24 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MACAddressConfig + 0x00000000 0x34 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetMACAddress + 0x00000000 0x34 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MACAddressPerfectFilterCmd + 0x00000000 0x28 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MACAddressFilterConfig + 0x00000000 0x1c THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MACAddressMaskBytesFilterConfig + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescChainInit + 0x00000000 0xc4 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescRingInit + 0x00000000 0xc4 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetDMATxDescFlagStatus + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetDMATxDescCollisionCount + 0x00000000 0x8 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_SetDMATxDescOwnBit + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescTransmitITConfig + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescFrameSegmentConfig + 0x00000000 0x8 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescChecksumInsertionConfig + 0x00000000 0x8 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescCRCCmd + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescEndOfRingCmd + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescSecondAddressChainedCmd + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescShortFramePaddingCmd + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescTimeStampCmd + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescBufferSizeConfig + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMARxDescChainInit + 0x00000000 0xdc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMARxDescRingInit + 0x00000000 0x14c THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetDMARxDescFlagStatus + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_SetDMARxDescOwnBit + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetDMARxDescFrameLength + 0x00000000 0x8 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetRxPktSize + 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMARxDescReceiveITConfig + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMARxDescEndOfRingCmd + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMARxDescSecondAddressChainedCmd + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetDMARxDescBufferSize + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetDMAFlagStatus + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMAClearFlag + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetDMAITStatus + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMAClearITPendingBit + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetTransmitProcessState + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetReceiveProcessState + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetFlushTransmitFIFOStatus + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMAITConfig + 0x00000000 0x24 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetDMAOverflowStatus + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetRxOverflowMissedFrameCounter + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetBufferUnavailableMissedFrameCounter + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetCurrentTxDescStartAddress + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetCurrentRxDescStartAddress + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetCurrentTxBufferAddress + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetCurrentRxBufferAddress + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_ResumeDMATransmission + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_ResumeDMAReception + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_ResetWakeUpFrameFilterRegisterPointer + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_SetWakeUpFrameFilterRegister + 0x00000000 0x2c THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GlobalUnicastWakeUpCmd + 0x00000000 0x28 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetPMTFlagStatus + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_WakeUpFrameDetectionCmd + 0x00000000 0x28 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MagicPacketDetectionCmd + 0x00000000 0x28 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_PowerDownCmd + 0x00000000 0x28 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MMCCounterFreezeCmd + 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MMCResetOnReadCmd + 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MMCCounterRolloverCmd + 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MMCCountersReset + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MMCITConfig + 0x00000000 0x64 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetMMCITStatus + 0x00000000 0x60 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetMMCRegister + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_EnablePTPTimeStampAddend + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_EnablePTPTimeStampInterruptTrigger + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_EnablePTPTimeStampUpdate + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_InitializePTPTimeStamp + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_PTPUpdateMethodConfig + 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_PTPTimeStampCmd + 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetPTPFlagStatus + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_SetPTPSubSecondIncrement + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_SetPTPTimeStampUpdate + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_SetPTPTimeStampAddend + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_SetPTPTargetTime + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetPTPRegister + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMAPTPTxDescChainInit + 0x00000000 0x120 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMAPTPRxDescChainInit + 0x00000000 0x12c THUMB Debug/../../obj/stm32_eth.o + .text.ETH_HandlePTPTxPkt + 0x00000000 0x1dc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_HandlePTPRxPkt + 0x00000000 0x14c THUMB Debug/../../obj/stm32_eth.o + .bss.DMARxDescToGet + 0x00000000 0x4 THUMB Debug/../../obj/stm32_eth.o + .bss.DMAPTPTxDescToSet + 0x00000000 0x4 THUMB Debug/../../obj/stm32_eth.o + .bss.DMATxDescToSet + 0x00000000 0x4 THUMB Debug/../../obj/stm32_eth.o + .bss.DMAPTPRxDescToGet + 0x00000000 0x4 THUMB Debug/../../obj/stm32_eth.o + .text 0x00000000 0x0 THUMB Debug/../../obj/clock-arch.o + .data 0x00000000 0x0 THUMB Debug/../../obj/clock-arch.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/clock-arch.o + .text.clock_time + 0x00000000 0x8 THUMB Debug/../../obj/clock-arch.o + .debug_frame 0x00000000 0x2c THUMB Debug/../../obj/clock-arch.o + .debug_info 0x00000000 0xbc THUMB Debug/../../obj/clock-arch.o + .debug_abbrev 0x00000000 0x73 THUMB Debug/../../obj/clock-arch.o + .debug_loc 0x00000000 0x20 THUMB Debug/../../obj/clock-arch.o + .debug_aranges + 0x00000000 0x20 THUMB Debug/../../obj/clock-arch.o + .debug_ranges 0x00000000 0x10 THUMB Debug/../../obj/clock-arch.o + .debug_line 0x00000000 0xe8 THUMB Debug/../../obj/clock-arch.o + .debug_str 0x00000000 0x1a8 THUMB Debug/../../obj/clock-arch.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/clock-arch.o + .ARM.attributes + 0x00000000 0x33 THUMB Debug/../../obj/clock-arch.o + .text 0x00000000 0x0 THUMB Debug/../../obj/netdev.o + .data 0x00000000 0x0 THUMB Debug/../../obj/netdev.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/netdev.o .text 0x00000000 0x0 THUMB Debug/../../obj/hooks.o .data 0x00000000 0x0 THUMB Debug/../../obj/hooks.o .bss 0x00000000 0x0 THUMB Debug/../../obj/hooks.o @@ -1680,6 +1867,98 @@ Discarded input sections .text 0x00000000 0x0 THUMB Debug/../../obj/unicode.o .data 0x00000000 0x0 THUMB Debug/../../obj/unicode.o .bss 0x00000000 0x0 THUMB Debug/../../obj/unicode.o + .text 0x00000000 0x0 THUMB Debug/../../obj/uip.o + .data 0x00000000 0x0 THUMB Debug/../../obj/uip.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/uip.o + .text.uip_setipid + 0x00000000 0xc THUMB Debug/../../obj/uip.o + .text.uip_unlisten + 0x00000000 0x38 THUMB Debug/../../obj/uip.o + .text.uip_connect + 0x00000000 0x108 THUMB Debug/../../obj/uip.o + .text.uip_udpchksum + 0x00000000 0xc THUMB Debug/../../obj/uip.o + .text.uip_chksum + 0x00000000 0x18 THUMB Debug/../../obj/uip.o + .text 0x00000000 0x0 THUMB Debug/../../obj/uip_arp.o + .data 0x00000000 0x0 THUMB Debug/../../obj/uip_arp.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/uip_arp.o + .text.uip_arp_init + 0x00000000 0x40 THUMB Debug/../../obj/uip_arp.o + .text 0x00000000 0x0 THUMB Debug/../../obj/uip_timer.o + .data 0x00000000 0x0 THUMB Debug/../../obj/uip_timer.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/uip_timer.o + .text.timer_set + 0x00000000 0x10 THUMB Debug/../../obj/uip_timer.o + .text.timer_reset + 0x00000000 0xc THUMB Debug/../../obj/uip_timer.o + .text.timer_restart + 0x00000000 0xc THUMB Debug/../../obj/uip_timer.o + .text.timer_expired + 0x00000000 0x18 THUMB Debug/../../obj/uip_timer.o + .debug_frame 0x00000000 0x74 THUMB Debug/../../obj/uip_timer.o + .debug_info 0x00000000 0x144 THUMB Debug/../../obj/uip_timer.o + .debug_abbrev 0x00000000 0xf0 THUMB Debug/../../obj/uip_timer.o + .debug_loc 0x00000000 0xdb THUMB Debug/../../obj/uip_timer.o + .debug_aranges + 0x00000000 0x38 THUMB Debug/../../obj/uip_timer.o + .debug_ranges 0x00000000 0x28 THUMB Debug/../../obj/uip_timer.o + .debug_line 0x00000000 0x127 THUMB Debug/../../obj/uip_timer.o + .debug_str 0x00000000 0x189 THUMB Debug/../../obj/uip_timer.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/uip_timer.o + .ARM.attributes + 0x00000000 0x33 THUMB Debug/../../obj/uip_timer.o + .text 0x00000000 0x0 THUMB Debug/../../obj/uip-fw.o + .data 0x00000000 0x0 THUMB Debug/../../obj/uip-fw.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/uip-fw.o + .text.uip_fw_init + 0x00000000 0x34 THUMB Debug/../../obj/uip-fw.o + .text.uip_fw_output + 0x00000000 0xe8 THUMB Debug/../../obj/uip-fw.o + .text.uip_fw_forward + 0x00000000 0x1dc THUMB Debug/../../obj/uip-fw.o + .text.uip_fw_register + 0x00000000 0x10 THUMB Debug/../../obj/uip-fw.o + .text.uip_fw_default + 0x00000000 0xc THUMB Debug/../../obj/uip-fw.o + .text.uip_fw_periodic + 0x00000000 0x28 THUMB Debug/../../obj/uip-fw.o + .bss.netifs 0x00000000 0x4 THUMB Debug/../../obj/uip-fw.o + .bss.defaultnetif + 0x00000000 0x4 THUMB Debug/../../obj/uip-fw.o + .bss.fwcache 0x00000000 0x1c THUMB Debug/../../obj/uip-fw.o + .debug_frame 0x00000000 0x90 THUMB Debug/../../obj/uip-fw.o + .debug_info 0x00000000 0x71a THUMB Debug/../../obj/uip-fw.o + .debug_abbrev 0x00000000 0x295 THUMB Debug/../../obj/uip-fw.o + .debug_loc 0x00000000 0x18c THUMB Debug/../../obj/uip-fw.o + .debug_aranges + 0x00000000 0x48 THUMB Debug/../../obj/uip-fw.o + .debug_ranges 0x00000000 0x68 THUMB Debug/../../obj/uip-fw.o + .debug_line 0x00000000 0x246 THUMB Debug/../../obj/uip-fw.o + .debug_str 0x00000000 0x3bf THUMB Debug/../../obj/uip-fw.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/uip-fw.o + .ARM.attributes + 0x00000000 0x33 THUMB Debug/../../obj/uip-fw.o + .text 0x00000000 0x0 THUMB Debug/../../obj/uiplib.o + .data 0x00000000 0x0 THUMB Debug/../../obj/uiplib.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/uiplib.o + .text.uiplib_ipaddrconv + 0x00000000 0x370 THUMB Debug/../../obj/uiplib.o + .debug_frame 0x00000000 0x2c THUMB Debug/../../obj/uiplib.o + .debug_info 0x00000000 0xef THUMB Debug/../../obj/uiplib.o + .debug_abbrev 0x00000000 0x6f THUMB Debug/../../obj/uiplib.o + .debug_loc 0x00000000 0xf89 THUMB Debug/../../obj/uiplib.o + .debug_aranges + 0x00000000 0x20 THUMB Debug/../../obj/uiplib.o + .debug_ranges 0x00000000 0x10 THUMB Debug/../../obj/uiplib.o + .debug_line 0x00000000 0x177 THUMB Debug/../../obj/uiplib.o + .debug_str 0x00000000 0x1b5 THUMB Debug/../../obj/uiplib.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/uiplib.o + .ARM.attributes + 0x00000000 0x33 THUMB Debug/../../obj/uiplib.o + .text 0x00000000 0x0 THUMB Debug/../../obj/net.o + .data 0x00000000 0x0 THUMB Debug/../../obj/net.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/net.o .text 0x00000000 0x0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) .data 0x00000000 0x0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) .bss 0x00000000 0x0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) @@ -2054,8 +2333,6 @@ Discarded input sections 0x00000000 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) .text.libc.memcpy_small 0x00000000 0x1c C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) - .text.libc.memset - 0x00000000 0x70 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) .text.libc.__aeabi_memset 0x00000000 0x74 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) .text.libc.setjmp @@ -2424,11 +2701,11 @@ Memory Configuration Name Origin Length Attributes UNPLACED_SECTIONS 0xffffffff 0x00000000 xw -FLASH 0x08000000 0x00008000 xr +FLASH 0x08000000 0x0000c000 xr DATA_SRAM 0x10000000 0x00010000 xw SYSTEM 0x1fff0000 0x00007a10 xw OPTION 0x1fffc000 0x00000008 xw -RAM 0x20000000 0x00004000 xw +RAM 0x20000000 0x00006000 xw SRAM1 0x20000000 0x0001c000 xw SRAM2 0x2001c000 0x00004000 xw APB1 0x40000000 0x00008000 xw @@ -2450,9 +2727,9 @@ CM3_System_Control_Space 0xe000e000 0x00001000 xw Linker script and memory map - 0x08006abc __do_debug_operation = __do_debug_operation_mempoll + 0x08008fdc __do_debug_operation = __do_debug_operation_mempoll 0x08000000 __FLASH_segment_start__ = 0x8000000 - 0x08008000 __FLASH_segment_end__ = 0x8008000 + 0x0800c000 __FLASH_segment_end__ = 0x800c000 0x10000000 __DATA_SRAM_segment_start__ = 0x10000000 0x10010000 __DATA_SRAM_segment_end__ = 0x10010000 0x1fff0000 __SYSTEM_segment_start__ = 0x1fff0000 @@ -2460,7 +2737,7 @@ Linker script and memory map 0x1fffc000 __OPTION_segment_start__ = 0x1fffc000 0x1fffc008 __OPTION_segment_end__ = 0x1fffc008 0x20000000 __RAM_segment_start__ = 0x20000000 - 0x20004000 __RAM_segment_end__ = 0x20004000 + 0x20006000 __RAM_segment_end__ = 0x20006000 0x20000000 __SRAM1_segment_start__ = 0x20000000 0x2001c000 __SRAM1_segment_end__ = 0x2001c000 0x2001c000 __SRAM2_segment_start__ = 0x2001c000 @@ -2535,7 +2812,7 @@ Linker script and memory map 0x00000001 . = ASSERT (((__init_end__ >= __FLASH_segment_start__) && (__init_end__ <= __FLASH_segment_end__)), error: .init is too large to fit in FLASH memory segment) 0x08000328 __text_load_start__ = ALIGN (__init_end__, 0x4) -.text 0x08000328 0x67d8 +.text 0x08000328 0x8cf8 0x08000328 __text_start__ = . *(.text .text.* .glue_7t .glue_7 .gnu.linkonce.t.* .gcc_except_table .ARM.extab* .gnu.linkonce.armextab.*) .glue_7 0x00000000 0x0 linker stubs @@ -2644,356 +2921,468 @@ Linker script and memory map .text.RCC_APB2PeriphClockCmd 0x08001e38 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o 0x08001e38 RCC_APB2PeriphClockCmd - .text.RCC_APB2PeriphResetCmd + .text.RCC_AHB1PeriphResetCmd 0x08001e5c 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o - 0x08001e5c RCC_APB2PeriphResetCmd + 0x08001e5c RCC_AHB1PeriphResetCmd + .text.RCC_APB2PeriphResetCmd + 0x08001e80 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x08001e80 RCC_APB2PeriphResetCmd .text.SDIO_DeInit - 0x08001e80 0x1c THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001e80 SDIO_DeInit + 0x08001ea4 0x1c THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001ea4 SDIO_DeInit .text.SDIO_Init - 0x08001e9c 0x34 THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001e9c SDIO_Init + 0x08001ec0 0x34 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001ec0 SDIO_Init .text.SDIO_ClockCmd - 0x08001ed0 0xc THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001ed0 SDIO_ClockCmd + 0x08001ef4 0xc THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001ef4 SDIO_ClockCmd .text.SDIO_SetPowerState - 0x08001edc 0xc THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001edc SDIO_SetPowerState + 0x08001f00 0xc THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001f00 SDIO_SetPowerState .text.SDIO_GetPowerState - 0x08001ee8 0x10 THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001ee8 SDIO_GetPowerState + 0x08001f0c 0x10 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001f0c SDIO_GetPowerState .text.SDIO_SendCommand - 0x08001ef8 0x30 THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001ef8 SDIO_SendCommand + 0x08001f1c 0x30 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001f1c SDIO_SendCommand .text.SDIO_GetCommandResponse - 0x08001f28 0x10 THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001f28 SDIO_GetCommandResponse + 0x08001f4c 0x10 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001f4c SDIO_GetCommandResponse .text.SDIO_GetResponse - 0x08001f38 0x1c THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001f38 SDIO_GetResponse + 0x08001f5c 0x1c THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001f5c SDIO_GetResponse .text.SDIO_DataConfig - 0x08001f54 0x30 THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001f54 SDIO_DataConfig + 0x08001f78 0x30 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001f78 SDIO_DataConfig .text.SDIO_ReadData - 0x08001f84 0x10 THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001f84 SDIO_ReadData + 0x08001fa8 0x10 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001fa8 SDIO_ReadData .text.SDIO_WriteData - 0x08001f94 0x10 THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001f94 SDIO_WriteData + 0x08001fb8 0x10 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001fb8 SDIO_WriteData .text.SDIO_GetFlagStatus - 0x08001fa4 0x14 THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001fa4 SDIO_GetFlagStatus + 0x08001fc8 0x14 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001fc8 SDIO_GetFlagStatus .text.SDIO_ClearFlag - 0x08001fb8 0xc THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001fb8 SDIO_ClearFlag + 0x08001fdc 0xc THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001fdc SDIO_ClearFlag + .text.SYSCFG_ETH_MediaInterfaceConfig + 0x08001fe8 0xc THUMB Debug/../../obj/stm32f4xx_syscfg.o + 0x08001fe8 SYSCFG_ETH_MediaInterfaceConfig .text.USART_Init - 0x08001fc4 0x108 THUMB Debug/../../obj/stm32f4xx_usart.o - 0x08001fc4 USART_Init + 0x08001ff4 0x108 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x08001ff4 USART_Init .text.USART_Cmd - 0x080020cc 0x20 THUMB Debug/../../obj/stm32f4xx_usart.o - 0x080020cc USART_Cmd + 0x080020fc 0x20 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x080020fc USART_Cmd .text.USART_SendData - 0x080020ec 0xc THUMB Debug/../../obj/stm32f4xx_usart.o - 0x080020ec USART_SendData + 0x0800211c 0xc THUMB Debug/../../obj/stm32f4xx_usart.o + 0x0800211c USART_SendData .text.USART_ReceiveData - 0x080020f8 0xc THUMB Debug/../../obj/stm32f4xx_usart.o - 0x080020f8 USART_ReceiveData + 0x08002128 0xc THUMB Debug/../../obj/stm32f4xx_usart.o + 0x08002128 USART_ReceiveData .text.USART_GetFlagStatus - 0x08002104 0xc THUMB Debug/../../obj/stm32f4xx_usart.o - 0x08002104 USART_GetFlagStatus + 0x08002134 0xc THUMB Debug/../../obj/stm32f4xx_usart.o + 0x08002134 USART_GetFlagStatus + .text.ETH_DeInit + 0x08002140 0x1c THUMB Debug/../../obj/stm32_eth.o + 0x08002140 ETH_DeInit + .text.ETH_StructInit + 0x0800215c 0xa8 THUMB Debug/../../obj/stm32_eth.o + 0x0800215c ETH_StructInit + .text.ETH_ReadPHYRegister + 0x08002204 0x78 THUMB Debug/../../obj/stm32_eth.o + 0x08002204 ETH_ReadPHYRegister + .text.ETH_WritePHYRegister + 0x0800227c 0x70 THUMB Debug/../../obj/stm32_eth.o + 0x0800227c ETH_WritePHYRegister + .text.ETH_Init + 0x080022ec 0x2f0 THUMB Debug/../../obj/stm32_eth.o + 0x080022ec ETH_Init + .text.ETH_MACTransmissionCmd + 0x080025dc 0x28 THUMB Debug/../../obj/stm32_eth.o + 0x080025dc ETH_MACTransmissionCmd + .text.ETH_MACReceptionCmd + 0x08002604 0x28 THUMB Debug/../../obj/stm32_eth.o + 0x08002604 ETH_MACReceptionCmd + .text.ETH_SoftwareReset + 0x0800262c 0x14 THUMB Debug/../../obj/stm32_eth.o + 0x0800262c ETH_SoftwareReset + .text.ETH_GetSoftwareResetStatus + 0x08002640 0x10 THUMB Debug/../../obj/stm32_eth.o + 0x08002640 ETH_GetSoftwareResetStatus + .text.ETH_FlushTransmitFIFO + 0x08002650 0x14 THUMB Debug/../../obj/stm32_eth.o + 0x08002650 ETH_FlushTransmitFIFO + .text.ETH_DMATransmissionCmd + 0x08002664 0x28 THUMB Debug/../../obj/stm32_eth.o + 0x08002664 ETH_DMATransmissionCmd + .text.ETH_DMAReceptionCmd + 0x0800268c 0x28 THUMB Debug/../../obj/stm32_eth.o + 0x0800268c ETH_DMAReceptionCmd + .text.ETH_Start + 0x080026b4 0x28 THUMB Debug/../../obj/stm32_eth.o + 0x080026b4 ETH_Start + .text.netdev_init + 0x080026dc 0x294 THUMB Debug/../../obj/netdev.o + 0x080026dc netdev_init + .text.netdev_init_mac + 0x08002970 0x30 THUMB Debug/../../obj/netdev.o + 0x08002970 netdev_init_mac + .text.netdev_read + 0x080029a0 0x5c THUMB Debug/../../obj/netdev.o + 0x080029a0 netdev_read + .text.netdev_send + 0x080029fc 0x70 THUMB Debug/../../obj/netdev.o + 0x080029fc netdev_send .text.FileIsFirmwareUpdateRequestedHook - 0x08002110 0x48 THUMB Debug/../../obj/hooks.o - 0x08002110 FileIsFirmwareUpdateRequestedHook + 0x08002a6c 0x48 THUMB Debug/../../obj/hooks.o + 0x08002a6c FileIsFirmwareUpdateRequestedHook .text.FileGetFirmwareFilenameHook - 0x08002158 0xc THUMB Debug/../../obj/hooks.o - 0x08002158 FileGetFirmwareFilenameHook + 0x08002ab4 0xc THUMB Debug/../../obj/hooks.o + 0x08002ab4 FileGetFirmwareFilenameHook .text.FileFirmwareUpdateStartedHook - 0x08002164 0x38 THUMB Debug/../../obj/hooks.o - 0x08002164 FileFirmwareUpdateStartedHook + 0x08002ac0 0x38 THUMB Debug/../../obj/hooks.o + 0x08002ac0 FileFirmwareUpdateStartedHook .text.FileFirmwareUpdateCompletedHook - 0x0800219c 0x44 THUMB Debug/../../obj/hooks.o - 0x0800219c FileFirmwareUpdateCompletedHook + 0x08002af8 0x44 THUMB Debug/../../obj/hooks.o + 0x08002af8 FileFirmwareUpdateCompletedHook .text.FileFirmwareUpdateErrorHook - 0x080021e0 0x20 THUMB Debug/../../obj/hooks.o - 0x080021e0 FileFirmwareUpdateErrorHook + 0x08002b3c 0x20 THUMB Debug/../../obj/hooks.o + 0x08002b3c FileFirmwareUpdateErrorHook .text.FileFirmwareUpdateLogHook - 0x08002200 0x68 THUMB Debug/../../obj/hooks.o - 0x08002200 FileFirmwareUpdateLogHook - .text.main 0x08002268 0xe0 THUMB Debug/../../obj/main.o - 0x08002268 main + 0x08002b5c 0x68 THUMB Debug/../../obj/hooks.o + 0x08002b5c FileFirmwareUpdateLogHook + .text.main 0x08002bc4 0xe0 THUMB Debug/../../obj/main.o + 0x08002bc4 main .text.UnusedISR - 0x08002348 0x14 THUMB Debug/../../obj/vectors.o - 0x08002348 UnusedISR + 0x08002ca4 0x14 THUMB Debug/../../obj/vectors.o + 0x08002ca4 UnusedISR .text.CpuStartUserProgram - 0x0800235c 0x2c THUMB Debug/../../obj/cpu.o - 0x0800235c CpuStartUserProgram + 0x08002cb8 0x30 THUMB Debug/../../obj/cpu.o + 0x08002cb8 CpuStartUserProgram .text.CpuMemCopy - 0x08002388 0x60 THUMB Debug/../../obj/cpu.o - 0x08002388 CpuMemCopy + 0x08002ce8 0x60 THUMB Debug/../../obj/cpu.o + 0x08002ce8 CpuMemCopy .text.CpuReset - 0x080023e8 0x8 THUMB Debug/../../obj/cpu.o - 0x080023e8 CpuReset + 0x08002d48 0x8 THUMB Debug/../../obj/cpu.o + 0x08002d48 CpuReset .text.FlashGetSector - 0x080023f0 0x170 THUMB Debug/../../obj/flash.o + 0x08002d50 0x150 THUMB Debug/../../obj/flash.o .text.FlashWriteBlock - 0x08002560 0xa4 THUMB Debug/../../obj/flash.o + 0x08002ea0 0xa4 THUMB Debug/../../obj/flash.o .text.FlashInitBlock - 0x08002604 0x30 THUMB Debug/../../obj/flash.o + 0x08002f44 0x30 THUMB Debug/../../obj/flash.o .text.FlashSwitchBlock - 0x08002634 0x54 THUMB Debug/../../obj/flash.o + 0x08002f74 0x54 THUMB Debug/../../obj/flash.o .text.FlashAddToBlock - 0x08002688 0x130 THUMB Debug/../../obj/flash.o + 0x08002fc8 0x130 THUMB Debug/../../obj/flash.o .text.FlashInit - 0x080027b8 0x1c THUMB Debug/../../obj/flash.o - 0x080027b8 FlashInit + 0x080030f8 0x1c THUMB Debug/../../obj/flash.o + 0x080030f8 FlashInit .text.FlashWrite - 0x080027d4 0x64 THUMB Debug/../../obj/flash.o - 0x080027d4 FlashWrite + 0x08003114 0x64 THUMB Debug/../../obj/flash.o + 0x08003114 FlashWrite .text.FlashErase - 0x08002838 0x120 THUMB Debug/../../obj/flash.o - 0x08002838 FlashErase + 0x08003178 0x120 THUMB Debug/../../obj/flash.o + 0x08003178 FlashErase .text.FlashWriteChecksum - 0x08002958 0x5c THUMB Debug/../../obj/flash.o - 0x08002958 FlashWriteChecksum + 0x08003298 0x5c THUMB Debug/../../obj/flash.o + 0x08003298 FlashWriteChecksum .text.FlashVerifyChecksum - 0x080029b4 0x68 THUMB Debug/../../obj/flash.o - 0x080029b4 FlashVerifyChecksum + 0x080032f4 0x68 THUMB Debug/../../obj/flash.o + 0x080032f4 FlashVerifyChecksum .text.FlashDone - 0x08002a1c 0x50 THUMB Debug/../../obj/flash.o - 0x08002a1c FlashDone - .text.NvmInit 0x08002a6c 0x8 THUMB Debug/../../obj/nvm.o - 0x08002a6c NvmInit + 0x0800335c 0x50 THUMB Debug/../../obj/flash.o + 0x0800335c FlashDone + .text.FlashGetUserProgBaseAddress + 0x080033ac 0xc THUMB Debug/../../obj/flash.o + 0x080033ac FlashGetUserProgBaseAddress + .text.NvmInit 0x080033b8 0x8 THUMB Debug/../../obj/nvm.o + 0x080033b8 NvmInit .text.NvmWrite - 0x08002a74 0x8 THUMB Debug/../../obj/nvm.o - 0x08002a74 NvmWrite + 0x080033c0 0x8 THUMB Debug/../../obj/nvm.o + 0x080033c0 NvmWrite .text.NvmErase - 0x08002a7c 0x8 THUMB Debug/../../obj/nvm.o - 0x08002a7c NvmErase + 0x080033c8 0x8 THUMB Debug/../../obj/nvm.o + 0x080033c8 NvmErase .text.NvmVerifyChecksum - 0x08002a84 0x8 THUMB Debug/../../obj/nvm.o - 0x08002a84 NvmVerifyChecksum - .text.NvmDone 0x08002a8c 0x14 THUMB Debug/../../obj/nvm.o - 0x08002a8c NvmDone + 0x080033d0 0x8 THUMB Debug/../../obj/nvm.o + 0x080033d0 NvmVerifyChecksum + .text.NvmDone 0x080033d8 0x14 THUMB Debug/../../obj/nvm.o + 0x080033d8 NvmDone .text.TimerReset - 0x08002aa0 0x10 THUMB Debug/../../obj/timer.o - 0x08002aa0 TimerReset + 0x080033ec 0x10 THUMB Debug/../../obj/timer.o + 0x080033ec TimerReset .text.TimerInit - 0x08002ab0 0x30 THUMB Debug/../../obj/timer.o - 0x08002ab0 TimerInit + 0x080033fc 0x30 THUMB Debug/../../obj/timer.o + 0x080033fc TimerInit .text.TimerUpdate - 0x08002ae0 0x24 THUMB Debug/../../obj/timer.o - 0x08002ae0 TimerUpdate + 0x0800342c 0x24 THUMB Debug/../../obj/timer.o + 0x0800342c TimerUpdate .text.TimerGet - 0x08002b04 0x14 THUMB Debug/../../obj/timer.o - 0x08002b04 TimerGet + 0x08003450 0x14 THUMB Debug/../../obj/timer.o + 0x08003450 TimerGet .text.UartReceiveByte - 0x08002b18 0x34 THUMB Debug/../../obj/uart.o + 0x08003464 0x34 THUMB Debug/../../obj/uart.o .text.UartTransmitByte - 0x08002b4c 0x48 THUMB Debug/../../obj/uart.o + 0x08003498 0x48 THUMB Debug/../../obj/uart.o .text.UartInit - 0x08002b94 0x44 THUMB Debug/../../obj/uart.o - 0x08002b94 UartInit + 0x080034e0 0x44 THUMB Debug/../../obj/uart.o + 0x080034e0 UartInit .text.UartTransmitPacket - 0x08002bd8 0xe4 THUMB Debug/../../obj/uart.o - 0x08002bd8 UartTransmitPacket + 0x08003524 0xe4 THUMB Debug/../../obj/uart.o + 0x08003524 UartTransmitPacket .text.UartReceivePacket - 0x08002cbc 0xb0 THUMB Debug/../../obj/uart.o - 0x08002cbc UartReceivePacket - .text.CanInit 0x08002d6c 0x1b4 THUMB Debug/../../obj/can.o - 0x08002d6c CanInit + 0x08003608 0xb0 THUMB Debug/../../obj/uart.o + 0x08003608 UartReceivePacket + .text.CanInit 0x080036b8 0x1b4 THUMB Debug/../../obj/can.o + 0x080036b8 CanInit .text.CanTransmitPacket - 0x08002f20 0xac THUMB Debug/../../obj/can.o - 0x08002f20 CanTransmitPacket + 0x0800386c 0xac THUMB Debug/../../obj/can.o + 0x0800386c CanTransmitPacket .text.CanReceivePacket - 0x08002fcc 0x98 THUMB Debug/../../obj/can.o - 0x08002fcc CanReceivePacket + 0x08003918 0x98 THUMB Debug/../../obj/can.o + 0x08003918 CanReceivePacket .text.AssertFailure - 0x08003064 0x1c THUMB Debug/../../obj/assert.o - 0x08003064 AssertFailure + 0x080039b0 0x1c THUMB Debug/../../obj/assert.o + 0x080039b0 AssertFailure .text.BackDoorCheck - 0x08003080 0x50 THUMB Debug/../../obj/backdoor.o - 0x08003080 BackDoorCheck + 0x080039cc 0x54 THUMB Debug/../../obj/backdoor.o + 0x080039cc BackDoorCheck .text.BackDoorInit - 0x080030d0 0x24 THUMB Debug/../../obj/backdoor.o - 0x080030d0 BackDoorInit + 0x08003a20 0x24 THUMB Debug/../../obj/backdoor.o + 0x08003a20 BackDoorInit .text.BootInit - 0x080030f4 0x1c THUMB Debug/../../obj/boot.o - 0x080030f4 BootInit + 0x08003a44 0x1c THUMB Debug/../../obj/boot.o + 0x08003a44 BootInit .text.BootTask - 0x08003110 0x18 THUMB Debug/../../obj/boot.o - 0x08003110 BootTask - .text.ComInit 0x08003128 0x48 THUMB Debug/../../obj/com.o - 0x08003128 ComInit - .text.ComTask 0x08003170 0x58 THUMB Debug/../../obj/com.o - 0x08003170 ComTask - .text.ComFree 0x080031c8 0x4 THUMB Debug/../../obj/com.o - 0x080031c8 ComFree + 0x08003a60 0x18 THUMB Debug/../../obj/boot.o + 0x08003a60 BootTask + .text.ComInit 0x08003a78 0x54 THUMB Debug/../../obj/com.o + 0x08003a78 ComInit + .text.ComTask 0x08003acc 0x84 THUMB Debug/../../obj/com.o + 0x08003acc ComTask + .text.ComFree 0x08003b50 0x4 THUMB Debug/../../obj/com.o + 0x08003b50 ComFree .text.ComTransmitPacket - 0x080031cc 0x38 THUMB Debug/../../obj/com.o - 0x080031cc ComTransmitPacket + 0x08003b54 0x4c THUMB Debug/../../obj/com.o + 0x08003b54 ComTransmitPacket .text.ComGetActiveInterfaceMaxRxLen - 0x08003204 0x28 THUMB Debug/../../obj/com.o - 0x08003204 ComGetActiveInterfaceMaxRxLen + 0x08003ba0 0x20 THUMB Debug/../../obj/com.o + 0x08003ba0 ComGetActiveInterfaceMaxRxLen .text.ComGetActiveInterfaceMaxTxLen - 0x0800322c 0x28 THUMB Debug/../../obj/com.o - 0x0800322c ComGetActiveInterfaceMaxTxLen + 0x08003bc0 0x20 THUMB Debug/../../obj/com.o + 0x08003bc0 ComGetActiveInterfaceMaxTxLen .text.ComSetConnectEntryState - 0x08003254 0x10 THUMB Debug/../../obj/com.o - 0x08003254 ComSetConnectEntryState + 0x08003be0 0x10 THUMB Debug/../../obj/com.o + 0x08003be0 ComSetConnectEntryState .text.ComIsConnected - 0x08003264 0x8 THUMB Debug/../../obj/com.o - 0x08003264 ComIsConnected - .text.CopInit 0x0800326c 0x4 THUMB Debug/../../obj/cop.o - 0x0800326c CopInit + 0x08003bf0 0x8 THUMB Debug/../../obj/com.o + 0x08003bf0 ComIsConnected + .text.CopInit 0x08003bf8 0x4 THUMB Debug/../../obj/cop.o + 0x08003bf8 CopInit .text.CopService - 0x08003270 0x4 THUMB Debug/../../obj/cop.o - 0x08003270 CopService + 0x08003bfc 0x4 THUMB Debug/../../obj/cop.o + 0x08003bfc CopService .text.XcpProtectResources - 0x08003274 0x10 THUMB Debug/../../obj/xcp.o + 0x08003c00 0x10 THUMB Debug/../../obj/xcp.o .text.XcpSetCtoError - 0x08003284 0x1c THUMB Debug/../../obj/xcp.o - .text.XcpInit 0x080032a0 0x20 THUMB Debug/../../obj/xcp.o - 0x080032a0 XcpInit + 0x08003c10 0x1c THUMB Debug/../../obj/xcp.o + .text.XcpInit 0x08003c2c 0x20 THUMB Debug/../../obj/xcp.o + 0x08003c2c XcpInit .text.XcpIsConnected - 0x080032c0 0x14 THUMB Debug/../../obj/xcp.o - 0x080032c0 XcpIsConnected + 0x08003c4c 0x14 THUMB Debug/../../obj/xcp.o + 0x08003c4c XcpIsConnected .text.XcpPacketTransmitted - 0x080032d4 0x14 THUMB Debug/../../obj/xcp.o - 0x080032d4 XcpPacketTransmitted + 0x08003c60 0x14 THUMB Debug/../../obj/xcp.o + 0x08003c60 XcpPacketTransmitted .text.XcpPacketReceived - 0x080032e8 0x438 THUMB Debug/../../obj/xcp.o - 0x080032e8 XcpPacketReceived + 0x08003c74 0x438 THUMB Debug/../../obj/xcp.o + 0x08003c74 XcpPacketReceived .text.FileLibLongToIntString - 0x08003720 0x50 THUMB Debug/../../obj/file.o + 0x080040ac 0x50 THUMB Debug/../../obj/file.o .text.FileLibHexStringToByte - 0x08003770 0x70 THUMB Debug/../../obj/file.o + 0x080040fc 0x70 THUMB Debug/../../obj/file.o .text.FileLibByteNibbleToChar - 0x080037e0 0x1c THUMB Debug/../../obj/file.o + 0x0800416c 0x1c THUMB Debug/../../obj/file.o .text.FileLibByteToHexString - 0x080037fc 0x24 THUMB Debug/../../obj/file.o + 0x08004188 0x24 THUMB Debug/../../obj/file.o .text.FileInit - 0x08003820 0x30 THUMB Debug/../../obj/file.o - 0x08003820 FileInit + 0x080041ac 0x30 THUMB Debug/../../obj/file.o + 0x080041ac FileInit .text.FileIsIdle - 0x08003850 0x14 THUMB Debug/../../obj/file.o - 0x08003850 FileIsIdle + 0x080041dc 0x14 THUMB Debug/../../obj/file.o + 0x080041dc FileIsIdle .text.FileHandleFirmwareUpdateRequest - 0x08003864 0x3c THUMB Debug/../../obj/file.o - 0x08003864 FileHandleFirmwareUpdateRequest + 0x080041f0 0x3c THUMB Debug/../../obj/file.o + 0x080041f0 FileHandleFirmwareUpdateRequest .text.FileSrecGetLineType - 0x080038a0 0x44 THUMB Debug/../../obj/file.o - 0x080038a0 FileSrecGetLineType + 0x0800422c 0x44 THUMB Debug/../../obj/file.o + 0x0800422c FileSrecGetLineType .text.FileSrecVerifyChecksum - 0x080038e4 0x94 THUMB Debug/../../obj/file.o - 0x080038e4 FileSrecVerifyChecksum + 0x08004270 0x94 THUMB Debug/../../obj/file.o + 0x08004270 FileSrecVerifyChecksum .text.FileSrecParseLine - 0x08003978 0x1a4 THUMB Debug/../../obj/file.o - 0x08003978 FileSrecParseLine + 0x08004304 0x1a4 THUMB Debug/../../obj/file.o + 0x08004304 FileSrecParseLine .text.FileTask - 0x08003b1c 0x4b4 THUMB Debug/../../obj/file.o - 0x08003b1c FileTask - .text.mem_cpy 0x08003fd0 0x54 THUMB Debug/../../obj/ff.o - .text.mem_set 0x08004024 0x38 THUMB Debug/../../obj/ff.o - .text.chk_chr 0x0800405c 0x18 THUMB Debug/../../obj/ff.o + 0x080044a8 0x4b4 THUMB Debug/../../obj/file.o + 0x080044a8 FileTask + .text.mem_cpy 0x0800495c 0x54 THUMB Debug/../../obj/ff.o + .text.mem_set 0x080049b0 0x38 THUMB Debug/../../obj/ff.o + .text.chk_chr 0x080049e8 0x18 THUMB Debug/../../obj/ff.o .text.ld_clust - 0x08004074 0x20 THUMB Debug/../../obj/ff.o + 0x08004a00 0x20 THUMB Debug/../../obj/ff.o .text.st_clust - 0x08004094 0x18 THUMB Debug/../../obj/ff.o - .text.sum_sfn 0x080040ac 0xa4 THUMB Debug/../../obj/ff.o + 0x08004a20 0x18 THUMB Debug/../../obj/ff.o + .text.sum_sfn 0x08004a38 0xa4 THUMB Debug/../../obj/ff.o .text.validate - 0x08004150 0x44 THUMB Debug/../../obj/ff.o + 0x08004adc 0x44 THUMB Debug/../../obj/ff.o .text.check_fs - 0x08004194 0xa8 THUMB Debug/../../obj/ff.o + 0x08004b20 0xa8 THUMB Debug/../../obj/ff.o .text.chk_mounted - 0x0800423c 0x400 THUMB Debug/../../obj/ff.o + 0x08004bc8 0x400 THUMB Debug/../../obj/ff.o .text.get_fileinfo - 0x0800463c 0x248 THUMB Debug/../../obj/ff.o + 0x08004fc8 0x248 THUMB Debug/../../obj/ff.o .text.sync_window - 0x08004884 0xd8 THUMB Debug/../../obj/ff.o + 0x08005210 0xd8 THUMB Debug/../../obj/ff.o .text.move_window - 0x0800495c 0x3c THUMB Debug/../../obj/ff.o - .text.sync_fs 0x08004998 0xd4 THUMB Debug/../../obj/ff.o + 0x080052e8 0x3c THUMB Debug/../../obj/ff.o + .text.sync_fs 0x08005324 0xd4 THUMB Debug/../../obj/ff.o .text.clust2sect - 0x08004a6c 0x20 THUMB Debug/../../obj/ff.o - 0x08004a6c clust2sect - .text.get_fat 0x08004a8c 0x110 THUMB Debug/../../obj/ff.o - 0x08004a8c get_fat - .text.dir_sdi 0x08004b9c 0xac THUMB Debug/../../obj/ff.o - .text.put_fat 0x08004c48 0x134 THUMB Debug/../../obj/ff.o - 0x08004c48 put_fat + 0x080053f8 0x20 THUMB Debug/../../obj/ff.o + 0x080053f8 clust2sect + .text.get_fat 0x08005418 0x110 THUMB Debug/../../obj/ff.o + 0x08005418 get_fat + .text.dir_sdi 0x08005528 0xac THUMB Debug/../../obj/ff.o + .text.put_fat 0x080055d4 0x134 THUMB Debug/../../obj/ff.o + 0x080055d4 put_fat .text.create_chain - 0x08004d7c 0xc8 THUMB Debug/../../obj/ff.o + 0x08005708 0xc8 THUMB Debug/../../obj/ff.o .text.dir_next - 0x08004e44 0x150 THUMB Debug/../../obj/ff.o + 0x080057d0 0x150 THUMB Debug/../../obj/ff.o .text.dir_find - 0x08004f94 0x478 THUMB Debug/../../obj/ff.o + 0x08005920 0x478 THUMB Debug/../../obj/ff.o .text.follow_path - 0x0800540c 0x408 THUMB Debug/../../obj/ff.o + 0x08005d98 0x408 THUMB Debug/../../obj/ff.o .text.dir_remove - 0x08005814 0x5c THUMB Debug/../../obj/ff.o + 0x080061a0 0x5c THUMB Debug/../../obj/ff.o .text.dir_read - 0x08005870 0x2c4 THUMB Debug/../../obj/ff.o + 0x080061fc 0x2c4 THUMB Debug/../../obj/ff.o .text.remove_chain - 0x08005b34 0x7c THUMB Debug/../../obj/ff.o + 0x080064c0 0x7c THUMB Debug/../../obj/ff.o .text.gen_numname - 0x08005bb0 0x140 THUMB Debug/../../obj/ff.o - 0x08005bb0 gen_numname + 0x0800653c 0x140 THUMB Debug/../../obj/ff.o + 0x0800653c gen_numname .text.dir_register - 0x08005cf0 0x298 THUMB Debug/../../obj/ff.o - .text.f_mount 0x08005f88 0x34 THUMB Debug/../../obj/ff.o - 0x08005f88 f_mount - .text.f_open 0x08005fbc 0x1a4 THUMB Debug/../../obj/ff.o - 0x08005fbc f_open - .text.f_read 0x08006160 0x1c8 THUMB Debug/../../obj/ff.o - 0x08006160 f_read - .text.f_write 0x08006328 0x204 THUMB Debug/../../obj/ff.o - 0x08006328 f_write - .text.f_sync 0x0800652c 0xb4 THUMB Debug/../../obj/ff.o - 0x0800652c f_sync - .text.f_close 0x080065e0 0x18 THUMB Debug/../../obj/ff.o - 0x080065e0 f_close - .text.f_lseek 0x080065f8 0x1bc THUMB Debug/../../obj/ff.o - 0x080065f8 f_lseek - .text.f_stat 0x080067b4 0x50 THUMB Debug/../../obj/ff.o - 0x080067b4 f_stat + 0x0800667c 0x298 THUMB Debug/../../obj/ff.o + .text.f_mount 0x08006914 0x34 THUMB Debug/../../obj/ff.o + 0x08006914 f_mount + .text.f_open 0x08006948 0x1a4 THUMB Debug/../../obj/ff.o + 0x08006948 f_open + .text.f_read 0x08006aec 0x1c8 THUMB Debug/../../obj/ff.o + 0x08006aec f_read + .text.f_write 0x08006cb4 0x204 THUMB Debug/../../obj/ff.o + 0x08006cb4 f_write + .text.f_sync 0x08006eb8 0xb4 THUMB Debug/../../obj/ff.o + 0x08006eb8 f_sync + .text.f_close 0x08006f6c 0x18 THUMB Debug/../../obj/ff.o + 0x08006f6c f_close + .text.f_lseek 0x08006f84 0x1bc THUMB Debug/../../obj/ff.o + 0x08006f84 f_lseek + .text.f_stat 0x08007140 0x50 THUMB Debug/../../obj/ff.o + 0x08007140 f_stat .text.f_unlink - 0x08006804 0xd4 THUMB Debug/../../obj/ff.o - 0x08006804 f_unlink - .text.f_gets 0x080068d8 0x60 THUMB Debug/../../obj/ff.o - 0x080068d8 f_gets - .text.f_putc 0x08006938 0x38 THUMB Debug/../../obj/ff.o - 0x08006938 f_putc - .text.f_puts 0x08006970 0x38 THUMB Debug/../../obj/ff.o - 0x08006970 f_puts + 0x08007190 0xd4 THUMB Debug/../../obj/ff.o + 0x08007190 f_unlink + .text.f_gets 0x08007264 0x60 THUMB Debug/../../obj/ff.o + 0x08007264 f_gets + .text.f_putc 0x080072c4 0x38 THUMB Debug/../../obj/ff.o + 0x080072c4 f_putc + .text.f_puts 0x080072fc 0x38 THUMB Debug/../../obj/ff.o + 0x080072fc f_puts .text.ff_convert - 0x080069a8 0x78 THUMB Debug/../../obj/unicode.o - 0x080069a8 ff_convert + 0x08007334 0x78 THUMB Debug/../../obj/unicode.o + 0x08007334 ff_convert .text.ff_wtoupper - 0x08006a20 0x34 THUMB Debug/../../obj/unicode.o - 0x08006a20 ff_wtoupper + 0x080073ac 0x34 THUMB Debug/../../obj/unicode.o + 0x080073ac ff_wtoupper + .text.chksum 0x080073e0 0xc8 THUMB Debug/../../obj/uip.o + .text.uip_add32 + 0x080074a8 0x7c THUMB Debug/../../obj/uip.o + 0x080074a8 uip_add32 + .text.uip_add_rcv_nxt + 0x08007524 0x30 THUMB Debug/../../obj/uip.o + .text.uip_init + 0x08007554 0x38 THUMB Debug/../../obj/uip.o + 0x08007554 uip_init + .text.uip_listen + 0x0800758c 0x38 THUMB Debug/../../obj/uip.o + 0x0800758c uip_listen + .text.htons 0x080075c4 0xc THUMB Debug/../../obj/uip.o + 0x080075c4 htons + .text.upper_layer_chksum + 0x080075d0 0x40 THUMB Debug/../../obj/uip.o + .text.uip_tcpchksum + 0x08007610 0xc THUMB Debug/../../obj/uip.o + 0x08007610 uip_tcpchksum + .text.uip_ipchksum + 0x0800761c 0x24 THUMB Debug/../../obj/uip.o + 0x0800761c uip_ipchksum + .text.uip_process + 0x08007640 0xd28 THUMB Debug/../../obj/uip.o + 0x08007640 uip_process + .text.uip_send + 0x08008368 0x2c THUMB Debug/../../obj/uip.o + 0x08008368 uip_send + .text.uip_arp_update + 0x08008394 0x40c THUMB Debug/../../obj/uip_arp.o + .text.uip_arp_timer + 0x080087a0 0x74 THUMB Debug/../../obj/uip_arp.o + 0x080087a0 uip_arp_timer + .text.uip_arp_arpin + 0x08008814 0x14c THUMB Debug/../../obj/uip_arp.o + 0x08008814 uip_arp_arpin + .text.uip_arp_out + 0x08008960 0x314 THUMB Debug/../../obj/uip_arp.o + 0x08008960 uip_arp_out + .text.NetInit 0x08008c74 0x78 THUMB Debug/../../obj/net.o + 0x08008c74 NetInit + .text.NetTransmitPacket + 0x08008cec 0x80 THUMB Debug/../../obj/net.o + 0x08008cec NetTransmitPacket + .text.NetReceivePacket + 0x08008d6c 0x118 THUMB Debug/../../obj/net.o + 0x08008d6c NetReceivePacket + .text.NetApp 0x08008e84 0x80 THUMB Debug/../../obj/net.o + 0x08008e84 NetApp .text.libc.isdigit - 0x08006a54 0x10 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) - 0x08006a54 isdigit + 0x08008f04 0x10 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + 0x08008f04 isdigit .text.libc.toupper - 0x08006a64 0x10 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) - 0x08006a64 toupper + 0x08008f14 0x10 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + 0x08008f14 toupper .text.libc.memcpy - 0x08006a74 0x48 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) - 0x08006a74 __aeabi_memcpy - 0x08006a74 __aeabi_memcpy4 - 0x08006a74 __aeabi_memcpy8 - 0x08006a74 memcpy + 0x08008f24 0x48 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + 0x08008f24 __aeabi_memcpy + 0x08008f24 __aeabi_memcpy4 + 0x08008f24 __aeabi_memcpy8 + 0x08008f24 memcpy + .text.libc.memset + 0x08008f6c 0x70 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + 0x08008f6c memset .text.libdebugio.__do_debug_operation_mempoll - 0x08006abc 0x3c C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - 0x08006abc __do_debug_operation_mempoll + 0x08008fdc 0x3c C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + 0x08008fdc __do_debug_operation_mempoll .text.libc.__debug_io_lock - 0x08006af8 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) - 0x08006af8 __debug_io_lock + 0x08009018 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + 0x08009018 __debug_io_lock .text.libc.__debug_io_unlock - 0x08006afc 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) - 0x08006afc __debug_io_unlock - 0x08006b00 __text_end__ = (__text_start__ + SIZEOF (.text)) - 0x08006b00 __text_load_end__ = __text_end__ + 0x0800901c 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + 0x0800901c __debug_io_unlock + 0x08009020 __text_end__ = (__text_start__ + SIZEOF (.text)) + 0x08009020 __text_load_end__ = __text_end__ .vfp11_veneer 0x00000000 0x0 .vfp11_veneer 0x00000000 0x0 linker stubs @@ -3004,92 +3393,98 @@ Linker script and memory map .iplt 0x00000000 0x0 .iplt 0x00000000 0x0 THUMB Debug/../../obj/mmc.o 0x00000001 . = ASSERT (((__text_end__ >= __FLASH_segment_start__) && (__text_end__ <= __FLASH_segment_end__)), error: .text is too large to fit in FLASH memory segment) - 0x08006b00 __dtors_load_start__ = ALIGN (__text_end__, 0x4) + 0x08009020 __dtors_load_start__ = ALIGN (__text_end__, 0x4) -.dtors 0x08006b00 0x0 - 0x08006b00 __dtors_start__ = . +.dtors 0x08009020 0x0 + 0x08009020 __dtors_start__ = . *(SORT(.dtors.*)) *(.dtors) *(.fini_array .fini_array.*) - 0x08006b00 __dtors_end__ = (__dtors_start__ + SIZEOF (.dtors)) - 0x08006b00 __dtors_load_end__ = __dtors_end__ + 0x08009020 __dtors_end__ = (__dtors_start__ + SIZEOF (.dtors)) + 0x08009020 __dtors_load_end__ = __dtors_end__ 0x00000001 . = ASSERT (((__dtors_end__ >= __FLASH_segment_start__) && (__dtors_end__ <= __FLASH_segment_end__)), error: .dtors is too large to fit in FLASH memory segment) - 0x08006b00 __ctors_load_start__ = ALIGN (__dtors_end__, 0x4) + 0x08009020 __ctors_load_start__ = ALIGN (__dtors_end__, 0x4) -.ctors 0x08006b00 0x0 - 0x08006b00 __ctors_start__ = . +.ctors 0x08009020 0x0 + 0x08009020 __ctors_start__ = . *(SORT(.ctors.*)) *(.ctors) *(.init_array .init_array.*) - 0x08006b00 __ctors_end__ = (__ctors_start__ + SIZEOF (.ctors)) - 0x08006b00 __ctors_load_end__ = __ctors_end__ + 0x08009020 __ctors_end__ = (__ctors_start__ + SIZEOF (.ctors)) + 0x08009020 __ctors_load_end__ = __ctors_end__ 0x00000001 . = ASSERT (((__ctors_end__ >= __FLASH_segment_start__) && (__ctors_end__ <= __FLASH_segment_end__)), error: .ctors is too large to fit in FLASH memory segment) - 0x08006b00 __rodata_load_start__ = ALIGN (__ctors_end__, 0x4) + 0x08009020 __rodata_load_start__ = ALIGN (__ctors_end__, 0x4) -.rodata 0x08006b00 0xa10 - 0x08006b00 __rodata_start__ = . +.rodata 0x08009020 0xa78 + 0x08009020 __rodata_start__ = . *(.rodata .rodata.* .gnu.linkonce.r.*) + .rodata.str1.4 + 0x08009020 0x6b THUMB Debug/../../obj/netdev.o + 0x6c (size before relaxing) + *fill* 0x0800908b 0x1 00 .rodata.firmwareFilename - 0x08006b00 0x20 THUMB Debug/../../obj/hooks.o + 0x0800908c 0x20 THUMB Debug/../../obj/hooks.o .rodata.str1.4 - 0x08006b20 0xd THUMB Debug/../../obj/hooks.o + 0x080090ac 0xd THUMB Debug/../../obj/hooks.o 0x10 (size before relaxing) - *fill* 0x08006b2d 0x3 00 + *fill* 0x080090b9 0x3 00 .rodata.str1.4 - 0x08006b30 0x8c THUMB Debug/../../obj/vectors.o + 0x080090bc 0x8c THUMB Debug/../../obj/vectors.o .rodata.flashSectorNumToMask - 0x08006bbc 0x30 THUMB Debug/../../obj/flash.o + 0x08009148 0x30 THUMB Debug/../../obj/flash.o .rodata.flashLayout - 0x08006bec 0x78 THUMB Debug/../../obj/flash.o + 0x08009178 0x6c THUMB Debug/../../obj/flash.o .rodata.str1.4 - 0x08006c64 0x7e THUMB Debug/../../obj/uart.o + 0x080091e4 0x7e THUMB Debug/../../obj/uart.o 0x80 (size before relaxing) - *fill* 0x08006ce2 0x2 00 + *fill* 0x08009262 0x2 00 .rodata.str1.4 - 0x08006ce4 0x7d THUMB Debug/../../obj/can.o + 0x08009264 0x7d THUMB Debug/../../obj/can.o 0x80 (size before relaxing) - *fill* 0x08006d61 0x3 00 + *fill* 0x080092e1 0x3 00 .rodata.canTiming - 0x08006d64 0x24 THUMB Debug/../../obj/can.o + 0x080092e4 0x24 THUMB Debug/../../obj/can.o .rodata.xcpStationId - 0x08006d88 0x8 THUMB Debug/../../obj/xcp.o + 0x08009308 0x8 THUMB Debug/../../obj/xcp.o .rodata.str1.4 - 0x08006d90 0x219 THUMB Debug/../../obj/file.o + 0x08009310 0x219 THUMB Debug/../../obj/file.o 0x220 (size before relaxing) - *fill* 0x08006fa9 0x3 00 + *fill* 0x08009529 0x3 00 .rodata.str1.4 - 0x08006fac 0x14 THUMB Debug/../../obj/ff.o - .rodata.ExCvt 0x08006fc0 0x80 THUMB Debug/../../obj/ff.o + 0x0800952c 0x14 THUMB Debug/../../obj/ff.o + .rodata.ExCvt 0x08009540 0x80 THUMB Debug/../../obj/ff.o .rodata.LfnOfs - 0x08007040 0x10 THUMB Debug/../../obj/ff.o + 0x080095c0 0x10 THUMB Debug/../../obj/ff.o .rodata.tbl_lower.3809 - 0x08007050 0x1e0 THUMB Debug/../../obj/unicode.o - .rodata.Tbl 0x08007230 0x100 THUMB Debug/../../obj/unicode.o + 0x080095d0 0x1e0 THUMB Debug/../../obj/unicode.o + .rodata.Tbl 0x080097b0 0x100 THUMB Debug/../../obj/unicode.o .rodata.tbl_upper.3810 - 0x08007330 0x1e0 THUMB Debug/../../obj/unicode.o - 0x08007510 __rodata_end__ = (__rodata_start__ + SIZEOF (.rodata)) - 0x08007510 __rodata_load_end__ = __rodata_end__ + 0x080098b0 0x1e0 THUMB Debug/../../obj/unicode.o + .rodata.broadcast_ethaddr + 0x08009a90 0x8 THUMB Debug/../../obj/uip_arp.o + 0x08009a98 __rodata_end__ = (__rodata_start__ + SIZEOF (.rodata)) + 0x08009a98 __rodata_load_end__ = __rodata_end__ .rel.dyn 0x08000000 0x0 .rel.iplt 0x00000000 0x0 THUMB Debug/../../obj/mmc.o 0x00000001 . = ASSERT (((__rodata_end__ >= __FLASH_segment_start__) && (__rodata_end__ <= __FLASH_segment_end__)), error: .rodata is too large to fit in FLASH memory segment) - 0x08007510 __ARM.exidx_load_start__ = ALIGN (__rodata_end__, 0x4) + 0x08009a98 __ARM.exidx_load_start__ = ALIGN (__rodata_end__, 0x4) -.ARM.exidx 0x08007510 0x0 - 0x08007510 __ARM.exidx_start__ = . - 0x08007510 __exidx_start = __ARM.exidx_start__ +.ARM.exidx 0x08009a98 0x0 + 0x08009a98 __ARM.exidx_start__ = . + 0x08009a98 __exidx_start = __ARM.exidx_start__ *(.ARM.exidx .ARM.exidx.*) - 0x08007510 __ARM.exidx_end__ = (__ARM.exidx_start__ + SIZEOF (.ARM.exidx)) - 0x08007510 __exidx_end = __ARM.exidx_end__ - 0x08007510 __ARM.exidx_load_end__ = __ARM.exidx_end__ + 0x08009a98 __ARM.exidx_end__ = (__ARM.exidx_start__ + SIZEOF (.ARM.exidx)) + 0x08009a98 __exidx_end = __ARM.exidx_end__ + 0x08009a98 __ARM.exidx_load_end__ = __ARM.exidx_end__ 0x00000001 . = ASSERT (((__ARM.exidx_end__ >= __FLASH_segment_start__) && (__ARM.exidx_end__ <= __FLASH_segment_end__)), error: .ARM.exidx is too large to fit in FLASH memory segment) - 0x08007510 __fast_load_start__ = ALIGN (__ARM.exidx_end__, 0x4) + 0x08009a98 __fast_load_start__ = ALIGN (__ARM.exidx_end__, 0x4) -.fast 0x20000000 0x0 load address 0x08007510 +.fast 0x20000000 0x0 load address 0x08009a98 0x20000000 __fast_start__ = . *(.fast .fast.*) 0x20000000 __fast_end__ = (__fast_start__ + SIZEOF (.fast)) - 0x08007510 __fast_load_end__ = (__fast_load_start__ + SIZEOF (.fast)) + 0x08009a98 __fast_load_end__ = (__fast_load_start__ + SIZEOF (.fast)) 0x00000001 . = ASSERT (((__fast_load_end__ >= __FLASH_segment_start__) && (__fast_load_end__ <= __FLASH_segment_end__)), error: .fast is too large to fit in FLASH memory segment) .fast_run 0x20000000 0x0 @@ -3098,9 +3493,9 @@ Linker script and memory map 0x20000000 __fast_run_end__ = (__fast_run_start__ + SIZEOF (.fast_run)) 0x20000000 __fast_run_load_end__ = __fast_run_end__ 0x00000001 . = ASSERT (((__fast_run_end__ >= __RAM_segment_start__) && (__fast_run_end__ <= __RAM_segment_end__)), error: .fast_run is too large to fit in RAM memory segment) - 0x08007510 __data_load_start__ = ALIGN ((__fast_load_start__ + SIZEOF (.fast)), 0x4) + 0x08009a98 __data_load_start__ = ALIGN ((__fast_load_start__ + SIZEOF (.fast)), 0x4) -.data 0x20000000 0x19 load address 0x08007510 +.data 0x20000000 0x19 load address 0x08009a98 0x20000000 __data_start__ = . *(.data .data.* .gnu.linkonce.d.*) .data.DMAEndOfTransfer @@ -3112,13 +3507,13 @@ Linker script and memory map .data.comActiveInterface 0x20000018 0x1 THUMB Debug/../../obj/com.o 0x20000019 __data_end__ = (__data_start__ + SIZEOF (.data)) - 0x08007529 __data_load_end__ = (__data_load_start__ + SIZEOF (.data)) + 0x08009ab1 __data_load_end__ = (__data_load_start__ + SIZEOF (.data)) .igot.plt 0x00000000 0x0 .igot.plt 0x00000000 0x0 THUMB Debug/../../obj/mmc.o 0x00000001 . = ASSERT (((__data_load_end__ >= __FLASH_segment_start__) && (__data_load_end__ <= __FLASH_segment_end__)), error: .data is too large to fit in FLASH memory segment) -.data_run 0x20000000 0x19 load address 0x08007510 +.data_run 0x20000000 0x19 load address 0x08009a98 0x20000000 __data_run_start__ = . 0x20000019 . = MAX ((__data_run_start__ + SIZEOF (.data)), .) *fill* 0x20000000 0x19 00 @@ -3127,7 +3522,7 @@ Linker script and memory map 0x00000001 . = ASSERT (((__data_run_end__ >= __RAM_segment_start__) && (__data_run_end__ <= __RAM_segment_end__)), error: .data_run is too large to fit in RAM memory segment) 0x2000001c __bss_load_start__ = ALIGN (__data_run_end__, 0x4) -.bss 0x2000001c 0x1028 +.bss 0x2000001c 0x2558 0x2000001c __bss_start__ = . *(.bss .bss.* .gnu.linkonce.b.*) .bss.TransferError @@ -3150,121 +3545,193 @@ Linker script and memory map 0x200000d8 0x14 THUMB Debug/../../obj/mmc.o .bss.StopCondition 0x200000ec 0x4 THUMB Debug/../../obj/mmc.o - .bss.logfile 0x200000f0 0x228 THUMB Debug/../../obj/hooks.o + *fill* 0x200000f0 0x10 00 + .bss.EnetDmaRx + 0x20000100 0x80 THUMB Debug/../../obj/netdev.o + 0x20000100 EnetDmaRx + .bss.RxBuff 0x20000180 0x640 THUMB Debug/../../obj/netdev.o + 0x20000180 RxBuff + *fill* 0x200007c0 0x40 00 + .bss.EnetDmaTx + 0x20000800 0x80 THUMB Debug/../../obj/netdev.o + 0x20000800 EnetDmaTx + .bss.TxBuff 0x20000880 0x640 THUMB Debug/../../obj/netdev.o + 0x20000880 TxBuff + .bss.logfile 0x20000ec0 0x228 THUMB Debug/../../obj/hooks.o .bss.bootBlockInfo - 0x20000318 0x204 THUMB Debug/../../obj/flash.o + 0x200010e8 0x204 THUMB Debug/../../obj/flash.o .bss.blockInfo - 0x2000051c 0x204 THUMB Debug/../../obj/flash.o + 0x200012ec 0x204 THUMB Debug/../../obj/flash.o .bss.millisecond_counter - 0x20000720 0x4 THUMB Debug/../../obj/timer.o - .bss.xcpCtoReqPacket.7332 - 0x20000724 0x44 THUMB Debug/../../obj/uart.o - .bss.xcpCtoRxInProgress.7334 - 0x20000768 0x1 THUMB Debug/../../obj/uart.o - .bss.xcpCtoRxLength.7333 - 0x20000769 0x1 THUMB Debug/../../obj/uart.o - *fill* 0x2000076a 0x2 00 + 0x200014f0 0x4 THUMB Debug/../../obj/timer.o + .bss.xcpCtoReqPacket.7334 + 0x200014f4 0x44 THUMB Debug/../../obj/uart.o + .bss.xcpCtoRxLength.7335 + 0x20001538 0x1 THUMB Debug/../../obj/uart.o + .bss.xcpCtoRxInProgress.7336 + 0x20001539 0x1 THUMB Debug/../../obj/uart.o + *fill* 0x2000153a 0x2 00 .bss.assert_failure_file - 0x2000076c 0x4 THUMB Debug/../../obj/assert.o + 0x2000153c 0x4 THUMB Debug/../../obj/assert.o .bss.assert_failure_line - 0x20000770 0x4 THUMB Debug/../../obj/assert.o + 0x20001540 0x4 THUMB Debug/../../obj/assert.o .bss.backdoorOpen - 0x20000774 0x1 THUMB Debug/../../obj/backdoor.o - *fill* 0x20000775 0x3 00 + 0x20001544 0x1 THUMB Debug/../../obj/backdoor.o + *fill* 0x20001545 0x3 00 .bss.backdoorOpenTime - 0x20000778 0x4 THUMB Debug/../../obj/backdoor.o + 0x20001548 0x4 THUMB Debug/../../obj/backdoor.o .bss.comEntryStateConnect - 0x2000077c 0x1 THUMB Debug/../../obj/com.o - *fill* 0x2000077d 0x3 00 - .bss.xcpCtoReqPacket.3953 - 0x20000780 0x40 THUMB Debug/../../obj/com.o - .bss.xcpInfo 0x200007c0 0x4c THUMB Debug/../../obj/xcp.o + 0x2000154c 0x1 THUMB Debug/../../obj/com.o + *fill* 0x2000154d 0x3 00 + .bss.xcpCtoReqPacket.3969 + 0x20001550 0x40 THUMB Debug/../../obj/com.o + .bss.xcpInfo 0x20001590 0x4c THUMB Debug/../../obj/xcp.o .bss.loggingStr - 0x2000080c 0x40 THUMB Debug/../../obj/file.o + 0x200015dc 0x40 THUMB Debug/../../obj/file.o .bss.firmwareUpdateState - 0x2000084c 0x1 THUMB Debug/../../obj/file.o - *fill* 0x2000084d 0x3 00 + 0x2000161c 0x1 THUMB Debug/../../obj/file.o + *fill* 0x2000161d 0x3 00 .bss.eraseInfo - 0x20000850 0x8 THUMB Debug/../../obj/file.o + 0x20001620 0x8 THUMB Debug/../../obj/file.o .bss.fatFsObjects - 0x20000858 0x458 THUMB Debug/../../obj/file.o + 0x20001628 0x458 THUMB Debug/../../obj/file.o .bss.lineParseObject - 0x20000cb0 0x184 THUMB Debug/../../obj/file.o - .bss.LfnBuf 0x20000e34 0x200 THUMB Debug/../../obj/ff.o - .bss.Fsid 0x20001034 0x2 THUMB Debug/../../obj/ff.o - *fill* 0x20001036 0x2 00 - .bss.FatFs 0x20001038 0x4 THUMB Debug/../../obj/ff.o + 0x20001a80 0x184 THUMB Debug/../../obj/file.o + .bss.LfnBuf 0x20001c04 0x200 THUMB Debug/../../obj/ff.o + .bss.Fsid 0x20001e04 0x2 THUMB Debug/../../obj/ff.o + *fill* 0x20001e06 0x2 00 + .bss.FatFs 0x20001e08 0x4 THUMB Debug/../../obj/ff.o + .bss.uip_conn 0x20001e0c 0x4 THUMB Debug/../../obj/uip.o + 0x20001e0c uip_conn + .bss.uip_conns + 0x20001e10 0x68 THUMB Debug/../../obj/uip.o + 0x20001e10 uip_conns + .bss.uip_netmask + 0x20001e78 0x4 THUMB Debug/../../obj/uip.o + 0x20001e78 uip_netmask + .bss.uip_len 0x20001e7c 0x2 THUMB Debug/../../obj/uip.o + 0x20001e7c uip_len + .bss.ipid 0x20001e7e 0x2 THUMB Debug/../../obj/uip.o + .bss.uip_draddr + 0x20001e80 0x4 THUMB Debug/../../obj/uip.o + 0x20001e80 uip_draddr + .bss.uip_slen 0x20001e84 0x2 THUMB Debug/../../obj/uip.o + 0x20001e84 uip_slen + *fill* 0x20001e86 0x2 00 + .bss.uip_buf 0x20001e88 0x644 THUMB Debug/../../obj/uip.o + 0x20001e88 uip_buf + .bss.uip_appdata + 0x200024cc 0x4 THUMB Debug/../../obj/uip.o + 0x200024cc uip_appdata + .bss.iss 0x200024d0 0x4 THUMB Debug/../../obj/uip.o + .bss.uip_hostaddr + 0x200024d4 0x4 THUMB Debug/../../obj/uip.o + 0x200024d4 uip_hostaddr + .bss.uip_flags + 0x200024d8 0x1 THUMB Debug/../../obj/uip.o + 0x200024d8 uip_flags + *fill* 0x200024d9 0x3 00 + .bss.uip_acc32 + 0x200024dc 0x4 THUMB Debug/../../obj/uip.o + 0x200024dc uip_acc32 + .bss.lastport 0x200024e0 0x2 THUMB Debug/../../obj/uip.o + .bss.tmp16 0x200024e2 0x2 THUMB Debug/../../obj/uip.o + .bss.uip_ethaddr + 0x200024e4 0x8 THUMB Debug/../../obj/uip.o + 0x200024e4 uip_ethaddr + .bss.c 0x200024ec 0x1 THUMB Debug/../../obj/uip.o + *fill* 0x200024ed 0x3 00 + .bss.uip_listenports + 0x200024f0 0x4 THUMB Debug/../../obj/uip.o + 0x200024f0 uip_listenports + .bss.uip_sappdata + 0x200024f4 0x4 THUMB Debug/../../obj/uip.o + 0x200024f4 uip_sappdata + .bss.opt 0x200024f8 0x1 THUMB Debug/../../obj/uip.o + .bss.i 0x200024f9 0x1 THUMB Debug/../../obj/uip_arp.o + .bss.tmpage 0x200024fa 0x1 THUMB Debug/../../obj/uip_arp.o + *fill* 0x200024fb 0x1 00 + .bss.arp_table + 0x200024fc 0x60 THUMB Debug/../../obj/uip_arp.o + .bss.c 0x2000255c 0x1 THUMB Debug/../../obj/uip_arp.o + .bss.arptime 0x2000255d 0x1 THUMB Debug/../../obj/uip_arp.o + *fill* 0x2000255e 0x2 00 + .bss.ipaddr 0x20002560 0x4 THUMB Debug/../../obj/uip_arp.o + .bss.ARPTimerTimeOut + 0x20002564 0x4 THUMB Debug/../../obj/net.o + .bss.periodicTimerTimeOut + 0x20002568 0x4 THUMB Debug/../../obj/net.o .bss.libdebugio.dbgCommWord - 0x2000103c 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - 0x2000103c dbgCommWord + 0x2000256c 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + 0x2000256c dbgCommWord .bss.libdebugio.dbgCntrlWord_mempoll - 0x20001040 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - 0x20001040 dbgCntrlWord_mempoll + 0x20002570 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + 0x20002570 dbgCntrlWord_mempoll *(COMMON) - 0x20001044 __bss_end__ = (__bss_start__ + SIZEOF (.bss)) - 0x20001044 __bss_load_end__ = __bss_end__ + 0x20002574 __bss_end__ = (__bss_start__ + SIZEOF (.bss)) + 0x20002574 __bss_load_end__ = __bss_end__ 0x00000001 . = ASSERT (((__bss_end__ >= __RAM_segment_start__) && (__bss_end__ <= __RAM_segment_end__)), error: .bss is too large to fit in RAM memory segment) - 0x20001044 __non_init_load_start__ = ALIGN (__bss_end__, 0x4) + 0x20002574 __non_init_load_start__ = ALIGN (__bss_end__, 0x4) -.non_init 0x20001044 0x0 - 0x20001044 __non_init_start__ = . +.non_init 0x20002574 0x0 + 0x20002574 __non_init_start__ = . *(.non_init .non_init.*) - 0x20001044 __non_init_end__ = (__non_init_start__ + SIZEOF (.non_init)) - 0x20001044 __non_init_load_end__ = __non_init_end__ + 0x20002574 __non_init_end__ = (__non_init_start__ + SIZEOF (.non_init)) + 0x20002574 __non_init_load_end__ = __non_init_end__ 0x00000001 . = ASSERT (((__non_init_end__ >= __RAM_segment_start__) && (__non_init_end__ <= __RAM_segment_end__)), error: .non_init is too large to fit in RAM memory segment) - 0x20001044 __heap_load_start__ = ALIGN (__non_init_end__, 0x4) + 0x20002574 __heap_load_start__ = ALIGN (__non_init_end__, 0x4) -.heap 0x20001044 0x800 - 0x20001044 __heap_start__ = . +.heap 0x20002574 0x800 + 0x20002574 __heap_start__ = . *(.heap .heap.*) - 0x20001844 . = ALIGN (MAX ((__heap_start__ + __HEAPSIZE__), .), 0x4) - *fill* 0x20001044 0x800 00 - 0x20001844 __heap_end__ = (__heap_start__ + SIZEOF (.heap)) - 0x20001844 __heap_load_end__ = __heap_end__ + 0x20002d74 . = ALIGN (MAX ((__heap_start__ + __HEAPSIZE__), .), 0x4) + *fill* 0x20002574 0x800 00 + 0x20002d74 __heap_end__ = (__heap_start__ + SIZEOF (.heap)) + 0x20002d74 __heap_load_end__ = __heap_end__ 0x00000001 . = ASSERT (((__heap_end__ >= __RAM_segment_start__) && (__heap_end__ <= __RAM_segment_end__)), error: .heap is too large to fit in RAM memory segment) - 0x20001844 __stack_load_start__ = ALIGN (__heap_end__, 0x4) + 0x20002d74 __stack_load_start__ = ALIGN (__heap_end__, 0x4) -.stack 0x20001844 0x800 - 0x20001844 __stack_start__ = . +.stack 0x20002d74 0x800 + 0x20002d74 __stack_start__ = . *(.stack .stack.*) - 0x20002044 . = ALIGN (MAX ((__stack_start__ + __STACKSIZE__), .), 0x4) - *fill* 0x20001844 0x800 00 - 0x20002044 __stack_end__ = (__stack_start__ + SIZEOF (.stack)) - 0x20002044 __stack_load_end__ = __stack_end__ + 0x20003574 . = ALIGN (MAX ((__stack_start__ + __STACKSIZE__), .), 0x4) + *fill* 0x20002d74 0x800 00 + 0x20003574 __stack_end__ = (__stack_start__ + SIZEOF (.stack)) + 0x20003574 __stack_load_end__ = __stack_end__ 0x00000001 . = ASSERT (((__stack_end__ >= __RAM_segment_start__) && (__stack_end__ <= __RAM_segment_end__)), error: .stack is too large to fit in RAM memory segment) - 0x20002044 __stack_process_load_start__ = ALIGN (__stack_end__, 0x4) + 0x20003574 __stack_process_load_start__ = ALIGN (__stack_end__, 0x4) -.stack_process 0x20002044 0x0 - 0x20002044 __stack_process_start__ = . +.stack_process 0x20003574 0x0 + 0x20003574 __stack_process_start__ = . *(.stack_process .stack_process.*) - 0x20002044 . = ALIGN (MAX ((__stack_process_start__ + __STACKSIZE_PROCESS__), .), 0x4) - 0x20002044 __stack_process_end__ = (__stack_process_start__ + SIZEOF (.stack_process)) - 0x20002044 __stack_process_load_end__ = __stack_process_end__ + 0x20003574 . = ALIGN (MAX ((__stack_process_start__ + __STACKSIZE_PROCESS__), .), 0x4) + 0x20003574 __stack_process_end__ = (__stack_process_start__ + SIZEOF (.stack_process)) + 0x20003574 __stack_process_load_end__ = __stack_process_end__ 0x00000001 . = ASSERT (((__stack_process_end__ >= __RAM_segment_start__) && (__stack_process_end__ <= __RAM_segment_end__)), error: .stack_process is too large to fit in RAM memory segment) - 0x20002044 __tbss_load_start__ = ALIGN (__stack_process_end__, 0x4) + 0x20003574 __tbss_load_start__ = ALIGN (__stack_process_end__, 0x4) -.tbss 0x20002044 0x0 - 0x20002044 __tbss_start__ = . +.tbss 0x20003574 0x0 + 0x20003574 __tbss_start__ = . *(.tbss .tbss.*) - 0x20002044 __tbss_end__ = (__tbss_start__ + SIZEOF (.tbss)) - 0x20002044 __tbss_load_end__ = __tbss_end__ + 0x20003574 __tbss_end__ = (__tbss_start__ + SIZEOF (.tbss)) + 0x20003574 __tbss_load_end__ = __tbss_end__ 0x00000001 . = ASSERT (((__tbss_end__ >= __RAM_segment_start__) && (__tbss_end__ <= __RAM_segment_end__)), error: .tbss is too large to fit in RAM memory segment) - 0x0800752c __tdata_load_start__ = ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) + 0x08009ab4 __tdata_load_start__ = ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) -.tdata 0x20002044 0x0 load address 0x0800752c - 0x20002044 __tdata_start__ = . +.tdata 0x20003574 0x0 load address 0x08009ab4 + 0x20003574 __tdata_start__ = . *(.tdata .tdata.*) - 0x20002044 __tdata_end__ = (__tdata_start__ + SIZEOF (.tdata)) - 0x0800752c __tdata_load_end__ = (__tdata_load_start__ + SIZEOF (.tdata)) - 0x0800752c __FLASH_segment_used_end__ = (ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) + SIZEOF (.tdata)) + 0x20003574 __tdata_end__ = (__tdata_start__ + SIZEOF (.tdata)) + 0x08009ab4 __tdata_load_end__ = (__tdata_load_start__ + SIZEOF (.tdata)) + 0x08009ab4 __FLASH_segment_used_end__ = (ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) + SIZEOF (.tdata)) 0x00000001 . = ASSERT (((__tdata_load_end__ >= __FLASH_segment_start__) && (__tdata_load_end__ <= __FLASH_segment_end__)), error: .tdata is too large to fit in FLASH memory segment) -.tdata_run 0x20002044 0x0 - 0x20002044 __tdata_run_start__ = . - 0x20002044 . = MAX ((__tdata_run_start__ + SIZEOF (.tdata)), .) - 0x20002044 __tdata_run_end__ = (__tdata_run_start__ + SIZEOF (.tdata_run)) - 0x20002044 __tdata_run_load_end__ = __tdata_run_end__ - 0x20002044 __RAM_segment_used_end__ = (ALIGN (__tbss_end__, 0x4) + SIZEOF (.tdata_run)) +.tdata_run 0x20003574 0x0 + 0x20003574 __tdata_run_start__ = . + 0x20003574 . = MAX ((__tdata_run_start__ + SIZEOF (.tdata)), .) + 0x20003574 __tdata_run_end__ = (__tdata_run_start__ + SIZEOF (.tdata_run)) + 0x20003574 __tdata_run_load_end__ = __tdata_run_end__ + 0x20003574 __RAM_segment_used_end__ = (ALIGN (__tbss_end__, 0x4) + SIZEOF (.tdata_run)) 0x00000001 . = ASSERT (((__tdata_run_end__ >= __RAM_segment_start__) && (__tdata_run_end__ <= __RAM_segment_end__)), error: .tdata_run is too large to fit in RAM memory segment) START GROUP LOAD THUMB Debug/../../obj/mmc.o @@ -3300,6 +3767,9 @@ LOAD THUMB Debug/../../obj/stm32f4xx_syscfg.o LOAD THUMB Debug/../../obj/stm32f4xx_tim.o LOAD THUMB Debug/../../obj/stm32f4xx_usart.o LOAD THUMB Debug/../../obj/stm32f4xx_wwdg.o +LOAD THUMB Debug/../../obj/stm32_eth.o +LOAD THUMB Debug/../../obj/clock-arch.o +LOAD THUMB Debug/../../obj/netdev.o LOAD THUMB Debug/../../obj/hooks.o LOAD THUMB Debug/../../obj/main.o LOAD THUMB Debug/../../obj/cstart.o @@ -3319,6 +3789,12 @@ LOAD THUMB Debug/../../obj/xcp.o LOAD THUMB Debug/../../obj/file.o LOAD THUMB Debug/../../obj/ff.o LOAD THUMB Debug/../../obj/unicode.o +LOAD THUMB Debug/../../obj/uip.o +LOAD THUMB Debug/../../obj/uip_arp.o +LOAD THUMB Debug/../../obj/uip_timer.o +LOAD THUMB Debug/../../obj/uip-fw.o +LOAD THUMB Debug/../../obj/uiplib.o +LOAD THUMB Debug/../../obj/net.o LOAD C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libcm_v7em_t_le_eabi.a LOAD C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libm_v7em_t_le_eabi.a LOAD C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a @@ -3329,128 +3805,152 @@ LOAD C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib END GROUP OUTPUT(C:/Work/software/OpenBLT/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/ide/../bin/openbtl_olimex_stm32e407.elf elf32-littlearm) -.debug_frame 0x00000000 0x3bec +.debug_frame 0x00000000 0x4778 .debug_frame 0x00000000 0x4e0 THUMB Debug/../../obj/mmc.o .debug_frame 0x000004e0 0x38 THUMB Debug/../../obj/system_stm32f4xx.o .debug_frame 0x00000518 0x2c8 THUMB Debug/../../obj/stm32f4xx_flash.o .debug_frame 0x000007e0 0x124 THUMB Debug/../../obj/stm32f4xx_gpio.o .debug_frame 0x00000904 0x30c THUMB Debug/../../obj/stm32f4xx_rcc.o .debug_frame 0x00000c10 0x228 THUMB Debug/../../obj/stm32f4xx_sdio.o - .debug_frame 0x00000e38 0x224 THUMB Debug/../../obj/stm32f4xx_usart.o - .debug_frame 0x0000105c 0xb8 THUMB Debug/../../obj/hooks.o - .debug_frame 0x00001114 0x34 THUMB Debug/../../obj/main.o - .debug_frame 0x00001148 0x2c THUMB Debug/../../obj/vectors.o - .debug_frame 0x00001174 0x6c THUMB Debug/../../obj/cpu.o - .debug_frame 0x000011e0 0x154 THUMB Debug/../../obj/flash.o - .debug_frame 0x00001334 0x9c THUMB Debug/../../obj/nvm.o - .debug_frame 0x000013d0 0x68 THUMB Debug/../../obj/timer.o - .debug_frame 0x00001438 0xb4 THUMB Debug/../../obj/uart.o - .debug_frame 0x000014ec 0x6c THUMB Debug/../../obj/can.o - .debug_frame 0x00001558 0x2c THUMB Debug/../../obj/assert.o - .debug_frame 0x00001584 0x48 THUMB Debug/../../obj/backdoor.o - .debug_frame 0x000015cc 0x48 THUMB Debug/../../obj/boot.o - .debug_frame 0x00001614 0xec THUMB Debug/../../obj/com.o - .debug_frame 0x00001700 0x30 THUMB Debug/../../obj/cop.o - .debug_frame 0x00001730 0x80 THUMB Debug/../../obj/xcp.o - .debug_frame 0x000017b0 0x154 THUMB Debug/../../obj/file.o - .debug_frame 0x00001904 0x688 THUMB Debug/../../obj/ff.o - .debug_frame 0x00001f8c 0x30 THUMB Debug/../../obj/unicode.o - .debug_frame 0x00001fbc 0x12e0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) - .debug_frame 0x0000329c 0x120 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) - .debug_frame 0x000033bc 0x790 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - .debug_frame 0x00003b4c 0xa0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + .debug_frame 0x00000e38 0x88 THUMB Debug/../../obj/stm32f4xx_syscfg.o + .debug_frame 0x00000ec0 0x224 THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_frame 0x000010e4 0x76c THUMB Debug/../../obj/stm32_eth.o + .debug_frame 0x00001850 0x94 THUMB Debug/../../obj/netdev.o + .debug_frame 0x000018e4 0xb8 THUMB Debug/../../obj/hooks.o + .debug_frame 0x0000199c 0x34 THUMB Debug/../../obj/main.o + .debug_frame 0x000019d0 0x2c THUMB Debug/../../obj/vectors.o + .debug_frame 0x000019fc 0x6c THUMB Debug/../../obj/cpu.o + .debug_frame 0x00001a68 0x164 THUMB Debug/../../obj/flash.o + .debug_frame 0x00001bcc 0x9c THUMB Debug/../../obj/nvm.o + .debug_frame 0x00001c68 0x68 THUMB Debug/../../obj/timer.o + .debug_frame 0x00001cd0 0xb4 THUMB Debug/../../obj/uart.o + .debug_frame 0x00001d84 0x6c THUMB Debug/../../obj/can.o + .debug_frame 0x00001df0 0x2c THUMB Debug/../../obj/assert.o + .debug_frame 0x00001e1c 0x48 THUMB Debug/../../obj/backdoor.o + .debug_frame 0x00001e64 0x48 THUMB Debug/../../obj/boot.o + .debug_frame 0x00001eac 0xec THUMB Debug/../../obj/com.o + .debug_frame 0x00001f98 0x30 THUMB Debug/../../obj/cop.o + .debug_frame 0x00001fc8 0x80 THUMB Debug/../../obj/xcp.o + .debug_frame 0x00002048 0x154 THUMB Debug/../../obj/file.o + .debug_frame 0x0000219c 0x688 THUMB Debug/../../obj/ff.o + .debug_frame 0x00002824 0x30 THUMB Debug/../../obj/unicode.o + .debug_frame 0x00002854 0x1b0 THUMB Debug/../../obj/uip.o + .debug_frame 0x00002a04 0xbc THUMB Debug/../../obj/uip_arp.o + .debug_frame 0x00002ac0 0x88 THUMB Debug/../../obj/net.o + .debug_frame 0x00002b48 0x12e0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + .debug_frame 0x00003e28 0x120 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + .debug_frame 0x00003f48 0x790 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_frame 0x000046d8 0xa0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) -.debug_info 0x00000000 0x107de +.debug_info 0x00000000 0x15b62 .debug_info 0x00000000 0x35cb THUMB Debug/../../obj/mmc.o .debug_info 0x000035cb 0x61d THUMB Debug/../../obj/system_stm32f4xx.o .debug_info 0x00003be8 0x8a0 THUMB Debug/../../obj/stm32f4xx_flash.o .debug_info 0x00004488 0x809 THUMB Debug/../../obj/stm32f4xx_gpio.o .debug_info 0x00004c91 0xda0 THUMB Debug/../../obj/stm32f4xx_rcc.o .debug_info 0x00005a31 0x8e0 THUMB Debug/../../obj/stm32f4xx_sdio.o - .debug_info 0x00006311 0xc4b THUMB Debug/../../obj/stm32f4xx_usart.o - .debug_info 0x00006f5c 0x838 THUMB Debug/../../obj/hooks.o - .debug_info 0x00007794 0x509 THUMB Debug/../../obj/main.o - .debug_info 0x00007c9d 0x10a THUMB Debug/../../obj/cstart.o - .debug_info 0x00007da7 0x13f THUMB Debug/../../obj/vectors.o - .debug_info 0x00007ee6 0x1dd THUMB Debug/../../obj/cpu.o - .debug_info 0x000080c3 0xa0b THUMB Debug/../../obj/flash.o - .debug_info 0x00008ace 0x252 THUMB Debug/../../obj/nvm.o - .debug_info 0x00008d20 0x195 THUMB Debug/../../obj/timer.o - .debug_info 0x00008eb5 0x66d THUMB Debug/../../obj/uart.o - .debug_info 0x00009522 0x581 THUMB Debug/../../obj/can.o - .debug_info 0x00009aa3 0x10a THUMB Debug/../../obj/assert.o - .debug_info 0x00009bad 0x15f THUMB Debug/../../obj/backdoor.o - .debug_info 0x00009d0c 0x177 THUMB Debug/../../obj/boot.o - .debug_info 0x00009e83 0x3ed THUMB Debug/../../obj/com.o - .debug_info 0x0000a270 0x9a THUMB Debug/../../obj/cop.o - .debug_info 0x0000a30a 0x8ac THUMB Debug/../../obj/xcp.o - .debug_info 0x0000abb6 0x1226 THUMB Debug/../../obj/file.o - .debug_info 0x0000bddc 0x3562 THUMB Debug/../../obj/ff.o - .debug_info 0x0000f33e 0x169 THUMB Debug/../../obj/unicode.o - .debug_info 0x0000f4a7 0xd02 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) - .debug_info 0x000101a9 0x55f C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - .debug_info 0x00010708 0xd6 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + .debug_info 0x00006311 0x2b7 THUMB Debug/../../obj/stm32f4xx_syscfg.o + .debug_info 0x000065c8 0xc4b THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_info 0x00007213 0x1ffe THUMB Debug/../../obj/stm32_eth.o + .debug_info 0x00009211 0x15cf THUMB Debug/../../obj/netdev.o + .debug_info 0x0000a7e0 0x838 THUMB Debug/../../obj/hooks.o + .debug_info 0x0000b018 0x509 THUMB Debug/../../obj/main.o + .debug_info 0x0000b521 0x10a THUMB Debug/../../obj/cstart.o + .debug_info 0x0000b62b 0x13f THUMB Debug/../../obj/vectors.o + .debug_info 0x0000b76a 0x1fd THUMB Debug/../../obj/cpu.o + .debug_info 0x0000b967 0xa1c THUMB Debug/../../obj/flash.o + .debug_info 0x0000c383 0x252 THUMB Debug/../../obj/nvm.o + .debug_info 0x0000c5d5 0x195 THUMB Debug/../../obj/timer.o + .debug_info 0x0000c76a 0x66d THUMB Debug/../../obj/uart.o + .debug_info 0x0000cdd7 0x581 THUMB Debug/../../obj/can.o + .debug_info 0x0000d358 0x10a THUMB Debug/../../obj/assert.o + .debug_info 0x0000d462 0x15f THUMB Debug/../../obj/backdoor.o + .debug_info 0x0000d5c1 0x177 THUMB Debug/../../obj/boot.o + .debug_info 0x0000d738 0x475 THUMB Debug/../../obj/com.o + .debug_info 0x0000dbad 0x9a THUMB Debug/../../obj/cop.o + .debug_info 0x0000dc47 0x8ac THUMB Debug/../../obj/xcp.o + .debug_info 0x0000e4f3 0x1226 THUMB Debug/../../obj/file.o + .debug_info 0x0000f719 0x3562 THUMB Debug/../../obj/ff.o + .debug_info 0x00012c7b 0x169 THUMB Debug/../../obj/unicode.o + .debug_info 0x00012de4 0xd12 THUMB Debug/../../obj/uip.o + .debug_info 0x00013af6 0x6b3 THUMB Debug/../../obj/uip_arp.o + .debug_info 0x000141a9 0x682 THUMB Debug/../../obj/net.o + .debug_info 0x0001482b 0xd02 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + .debug_info 0x0001552d 0x55f C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_info 0x00015a8c 0xd6 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) -.debug_abbrev 0x00000000 0x2a15 +.debug_abbrev 0x00000000 0x381e .debug_abbrev 0x00000000 0x370 THUMB Debug/../../obj/mmc.o .debug_abbrev 0x00000370 0x158 THUMB Debug/../../obj/system_stm32f4xx.o .debug_abbrev 0x000004c8 0x1a9 THUMB Debug/../../obj/stm32f4xx_flash.o .debug_abbrev 0x00000671 0x210 THUMB Debug/../../obj/stm32f4xx_gpio.o .debug_abbrev 0x00000881 0x229 THUMB Debug/../../obj/stm32f4xx_rcc.o .debug_abbrev 0x00000aaa 0x1d9 THUMB Debug/../../obj/stm32f4xx_sdio.o - .debug_abbrev 0x00000c83 0x1fc THUMB Debug/../../obj/stm32f4xx_usart.o - .debug_abbrev 0x00000e7f 0x208 THUMB Debug/../../obj/hooks.o - .debug_abbrev 0x00001087 0x1b6 THUMB Debug/../../obj/main.o - .debug_abbrev 0x0000123d 0x14 THUMB Debug/../../obj/cstart.o - .debug_abbrev 0x00001251 0xf6 THUMB Debug/../../obj/vectors.o - .debug_abbrev 0x00001347 0xe8 THUMB Debug/../../obj/cpu.o - .debug_abbrev 0x0000142f 0x2c7 THUMB Debug/../../obj/flash.o - .debug_abbrev 0x000016f6 0xf8 THUMB Debug/../../obj/nvm.o - .debug_abbrev 0x000017ee 0xf8 THUMB Debug/../../obj/timer.o - .debug_abbrev 0x000018e6 0x1fe THUMB Debug/../../obj/uart.o - .debug_abbrev 0x00001ae4 0x20b THUMB Debug/../../obj/can.o - .debug_abbrev 0x00001cef 0x9d THUMB Debug/../../obj/assert.o - .debug_abbrev 0x00001d8c 0x91 THUMB Debug/../../obj/backdoor.o - .debug_abbrev 0x00001e1d 0x62 THUMB Debug/../../obj/boot.o - .debug_abbrev 0x00001e7f 0x1cb THUMB Debug/../../obj/com.o - .debug_abbrev 0x0000204a 0x44 THUMB Debug/../../obj/cop.o - .debug_abbrev 0x0000208e 0x265 THUMB Debug/../../obj/xcp.o - .debug_abbrev 0x000022f3 0x212 THUMB Debug/../../obj/file.o - .debug_abbrev 0x00002505 0x337 THUMB Debug/../../obj/ff.o - .debug_abbrev 0x0000283c 0xa8 THUMB Debug/../../obj/unicode.o - .debug_abbrev 0x000028e4 0xcb C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) - .debug_abbrev 0x000029af 0x3e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - .debug_abbrev 0x000029ed 0x28 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + .debug_abbrev 0x00000c83 0x177 THUMB Debug/../../obj/stm32f4xx_syscfg.o + .debug_abbrev 0x00000dfa 0x1fc THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_abbrev 0x00000ff6 0x28e THUMB Debug/../../obj/stm32_eth.o + .debug_abbrev 0x00001284 0x335 THUMB Debug/../../obj/netdev.o + .debug_abbrev 0x000015b9 0x208 THUMB Debug/../../obj/hooks.o + .debug_abbrev 0x000017c1 0x1b6 THUMB Debug/../../obj/main.o + .debug_abbrev 0x00001977 0x14 THUMB Debug/../../obj/cstart.o + .debug_abbrev 0x0000198b 0xf6 THUMB Debug/../../obj/vectors.o + .debug_abbrev 0x00001a81 0xe8 THUMB Debug/../../obj/cpu.o + .debug_abbrev 0x00001b69 0x2e1 THUMB Debug/../../obj/flash.o + .debug_abbrev 0x00001e4a 0xf8 THUMB Debug/../../obj/nvm.o + .debug_abbrev 0x00001f42 0xf8 THUMB Debug/../../obj/timer.o + .debug_abbrev 0x0000203a 0x1fe THUMB Debug/../../obj/uart.o + .debug_abbrev 0x00002238 0x20b THUMB Debug/../../obj/can.o + .debug_abbrev 0x00002443 0x9d THUMB Debug/../../obj/assert.o + .debug_abbrev 0x000024e0 0x91 THUMB Debug/../../obj/backdoor.o + .debug_abbrev 0x00002571 0x62 THUMB Debug/../../obj/boot.o + .debug_abbrev 0x000025d3 0x1cb THUMB Debug/../../obj/com.o + .debug_abbrev 0x0000279e 0x44 THUMB Debug/../../obj/cop.o + .debug_abbrev 0x000027e2 0x265 THUMB Debug/../../obj/xcp.o + .debug_abbrev 0x00002a47 0x212 THUMB Debug/../../obj/file.o + .debug_abbrev 0x00002c59 0x337 THUMB Debug/../../obj/ff.o + .debug_abbrev 0x00002f90 0xa8 THUMB Debug/../../obj/unicode.o + .debug_abbrev 0x00003038 0x293 THUMB Debug/../../obj/uip.o + .debug_abbrev 0x000032cb 0x1df THUMB Debug/../../obj/uip_arp.o + .debug_abbrev 0x000034aa 0x243 THUMB Debug/../../obj/net.o + .debug_abbrev 0x000036ed 0xcb C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + .debug_abbrev 0x000037b8 0x3e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_abbrev 0x000037f6 0x28 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) -.debug_loc 0x00000000 0xed86 +.debug_loc 0x00000000 0x1173d .debug_loc 0x00000000 0x2289 THUMB Debug/../../obj/mmc.o .debug_loc 0x00002289 0x1a7 THUMB Debug/../../obj/system_stm32f4xx.o .debug_loc 0x00002430 0x83a THUMB Debug/../../obj/stm32f4xx_flash.o .debug_loc 0x00002c6a 0x445 THUMB Debug/../../obj/stm32f4xx_gpio.o .debug_loc 0x000030af 0xdb0 THUMB Debug/../../obj/stm32f4xx_rcc.o .debug_loc 0x00003e5f 0x2f8 THUMB Debug/../../obj/stm32f4xx_sdio.o - .debug_loc 0x00004157 0xaeb THUMB Debug/../../obj/stm32f4xx_usart.o - .debug_loc 0x00004c42 0xeb THUMB Debug/../../obj/hooks.o - .debug_loc 0x00004d2d 0x2c THUMB Debug/../../obj/main.o - .debug_loc 0x00004d59 0x20 THUMB Debug/../../obj/vectors.o - .debug_loc 0x00004d79 0x172 THUMB Debug/../../obj/cpu.o - .debug_loc 0x00004eeb 0x8ed THUMB Debug/../../obj/flash.o - .debug_loc 0x000057d8 0x145 THUMB Debug/../../obj/nvm.o - .debug_loc 0x0000591d 0x40 THUMB Debug/../../obj/timer.o - .debug_loc 0x0000595d 0x191 THUMB Debug/../../obj/uart.o - .debug_loc 0x00005aee 0x191 THUMB Debug/../../obj/can.o - .debug_loc 0x00005c7f 0x71 THUMB Debug/../../obj/assert.o - .debug_loc 0x00005cf0 0x40 THUMB Debug/../../obj/backdoor.o - .debug_loc 0x00005d30 0x40 THUMB Debug/../../obj/boot.o - .debug_loc 0x00005d70 0x109 THUMB Debug/../../obj/com.o - .debug_loc 0x00005e79 0x296 THUMB Debug/../../obj/xcp.o - .debug_loc 0x0000610f 0x97a THUMB Debug/../../obj/file.o - .debug_loc 0x00006a89 0x68fe THUMB Debug/../../obj/ff.o - .debug_loc 0x0000d387 0x179 THUMB Debug/../../obj/unicode.o - .debug_loc 0x0000d500 0x1092 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) - .debug_loc 0x0000e592 0x7f4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_loc 0x00004157 0xe6 THUMB Debug/../../obj/stm32f4xx_syscfg.o + .debug_loc 0x0000423d 0xaeb THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_loc 0x00004d28 0x1bd0 THUMB Debug/../../obj/stm32_eth.o + .debug_loc 0x000068f8 0xaa THUMB Debug/../../obj/netdev.o + .debug_loc 0x000069a2 0xeb THUMB Debug/../../obj/hooks.o + .debug_loc 0x00006a8d 0x2c THUMB Debug/../../obj/main.o + .debug_loc 0x00006ab9 0x20 THUMB Debug/../../obj/vectors.o + .debug_loc 0x00006ad9 0x16f THUMB Debug/../../obj/cpu.o + .debug_loc 0x00006c48 0x8d5 THUMB Debug/../../obj/flash.o + .debug_loc 0x0000751d 0x145 THUMB Debug/../../obj/nvm.o + .debug_loc 0x00007662 0x40 THUMB Debug/../../obj/timer.o + .debug_loc 0x000076a2 0x191 THUMB Debug/../../obj/uart.o + .debug_loc 0x00007833 0x191 THUMB Debug/../../obj/can.o + .debug_loc 0x000079c4 0x71 THUMB Debug/../../obj/assert.o + .debug_loc 0x00007a35 0x40 THUMB Debug/../../obj/backdoor.o + .debug_loc 0x00007a75 0x40 THUMB Debug/../../obj/boot.o + .debug_loc 0x00007ab5 0xcb THUMB Debug/../../obj/com.o + .debug_loc 0x00007b80 0x296 THUMB Debug/../../obj/xcp.o + .debug_loc 0x00007e16 0x97a THUMB Debug/../../obj/file.o + .debug_loc 0x00008790 0x68fe THUMB Debug/../../obj/ff.o + .debug_loc 0x0000f08e 0x179 THUMB Debug/../../obj/unicode.o + .debug_loc 0x0000f207 0x64e THUMB Debug/../../obj/uip.o + .debug_loc 0x0000f855 0x4c4 THUMB Debug/../../obj/uip_arp.o + .debug_loc 0x0000fd19 0x19e THUMB Debug/../../obj/net.o + .debug_loc 0x0000feb7 0x1092 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + .debug_loc 0x00010f49 0x7f4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) -.debug_aranges 0x00000000 0x13b0 +.debug_aranges 0x00000000 0x1878 .debug_aranges 0x00000000 0x140 THUMB Debug/../../obj/mmc.o .debug_aranges @@ -3464,169 +3964,205 @@ OUTPUT(C:/Work/software/OpenBLT/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossw .debug_aranges 0x00000488 0x108 THUMB Debug/../../obj/stm32f4xx_sdio.o .debug_aranges - 0x00000590 0x100 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000590 0x48 THUMB Debug/../../obj/stm32f4xx_syscfg.o .debug_aranges - 0x00000690 0x48 THUMB Debug/../../obj/hooks.o + 0x000005d8 0x100 THUMB Debug/../../obj/stm32f4xx_usart.o .debug_aranges - 0x000006d8 0x20 THUMB Debug/../../obj/main.o + 0x000006d8 0x330 THUMB Debug/../../obj/stm32_eth.o .debug_aranges - 0x000006f8 0x20 THUMB Debug/../../obj/cstart.o + 0x00000a08 0x38 THUMB Debug/../../obj/netdev.o .debug_aranges - 0x00000718 0x20 THUMB Debug/../../obj/vectors.o + 0x00000a40 0x48 THUMB Debug/../../obj/hooks.o .debug_aranges - 0x00000738 0x30 THUMB Debug/../../obj/cpu.o + 0x00000a88 0x20 THUMB Debug/../../obj/main.o .debug_aranges - 0x00000768 0x70 THUMB Debug/../../obj/flash.o + 0x00000aa8 0x20 THUMB Debug/../../obj/cstart.o .debug_aranges - 0x000007d8 0x40 THUMB Debug/../../obj/nvm.o + 0x00000ac8 0x20 THUMB Debug/../../obj/vectors.o .debug_aranges - 0x00000818 0x38 THUMB Debug/../../obj/timer.o + 0x00000ae8 0x30 THUMB Debug/../../obj/cpu.o .debug_aranges - 0x00000850 0x40 THUMB Debug/../../obj/uart.o + 0x00000b18 0x78 THUMB Debug/../../obj/flash.o .debug_aranges - 0x00000890 0x30 THUMB Debug/../../obj/can.o + 0x00000b90 0x40 THUMB Debug/../../obj/nvm.o .debug_aranges - 0x000008c0 0x20 THUMB Debug/../../obj/assert.o + 0x00000bd0 0x38 THUMB Debug/../../obj/timer.o .debug_aranges - 0x000008e0 0x28 THUMB Debug/../../obj/backdoor.o + 0x00000c08 0x40 THUMB Debug/../../obj/uart.o .debug_aranges - 0x00000908 0x28 THUMB Debug/../../obj/boot.o + 0x00000c48 0x30 THUMB Debug/../../obj/can.o .debug_aranges - 0x00000930 0x68 THUMB Debug/../../obj/com.o + 0x00000c78 0x20 THUMB Debug/../../obj/assert.o .debug_aranges - 0x00000998 0x28 THUMB Debug/../../obj/cop.o + 0x00000c98 0x28 THUMB Debug/../../obj/backdoor.o .debug_aranges - 0x000009c0 0x48 THUMB Debug/../../obj/xcp.o + 0x00000cc0 0x28 THUMB Debug/../../obj/boot.o .debug_aranges - 0x00000a08 0x70 THUMB Debug/../../obj/file.o + 0x00000ce8 0x68 THUMB Debug/../../obj/com.o .debug_aranges - 0x00000a78 0x190 THUMB Debug/../../obj/ff.o + 0x00000d50 0x28 THUMB Debug/../../obj/cop.o .debug_aranges - 0x00000c08 0x28 THUMB Debug/../../obj/unicode.o + 0x00000d78 0x48 THUMB Debug/../../obj/xcp.o .debug_aranges - 0x00000c30 0x508 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + 0x00000dc0 0x70 THUMB Debug/../../obj/file.o .debug_aranges - 0x00001138 0x218 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + 0x00000e30 0x190 THUMB Debug/../../obj/ff.o .debug_aranges - 0x00001350 0x60 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + 0x00000fc0 0x28 THUMB Debug/../../obj/unicode.o + .debug_aranges + 0x00000fe8 0x98 THUMB Debug/../../obj/uip.o + .debug_aranges + 0x00001080 0x40 THUMB Debug/../../obj/uip_arp.o + .debug_aranges + 0x000010c0 0x38 THUMB Debug/../../obj/net.o + .debug_aranges + 0x000010f8 0x508 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + .debug_aranges + 0x00001600 0x218 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_aranges + 0x00001818 0x60 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) -.debug_ranges 0x00000000 0x1480 +.debug_ranges 0x00000000 0x18e8 .debug_ranges 0x00000000 0x1f0 THUMB Debug/../../obj/mmc.o .debug_ranges 0x000001f0 0x18 THUMB Debug/../../obj/system_stm32f4xx.o .debug_ranges 0x00000208 0x108 THUMB Debug/../../obj/stm32f4xx_flash.o .debug_ranges 0x00000310 0x78 THUMB Debug/../../obj/stm32f4xx_gpio.o .debug_ranges 0x00000388 0x170 THUMB Debug/../../obj/stm32f4xx_rcc.o .debug_ranges 0x000004f8 0xf8 THUMB Debug/../../obj/stm32f4xx_sdio.o - .debug_ranges 0x000005f0 0xf0 THUMB Debug/../../obj/stm32f4xx_usart.o - .debug_ranges 0x000006e0 0x38 THUMB Debug/../../obj/hooks.o - .debug_ranges 0x00000718 0x10 THUMB Debug/../../obj/main.o - .debug_ranges 0x00000728 0x10 THUMB Debug/../../obj/vectors.o - .debug_ranges 0x00000738 0x20 THUMB Debug/../../obj/cpu.o - .debug_ranges 0x00000758 0x90 THUMB Debug/../../obj/flash.o - .debug_ranges 0x000007e8 0x30 THUMB Debug/../../obj/nvm.o - .debug_ranges 0x00000818 0x28 THUMB Debug/../../obj/timer.o - .debug_ranges 0x00000840 0x30 THUMB Debug/../../obj/uart.o - .debug_ranges 0x00000870 0x50 THUMB Debug/../../obj/can.o - .debug_ranges 0x000008c0 0x10 THUMB Debug/../../obj/assert.o - .debug_ranges 0x000008d0 0x18 THUMB Debug/../../obj/backdoor.o - .debug_ranges 0x000008e8 0x18 THUMB Debug/../../obj/boot.o - .debug_ranges 0x00000900 0x58 THUMB Debug/../../obj/com.o - .debug_ranges 0x00000958 0x18 THUMB Debug/../../obj/cop.o - .debug_ranges 0x00000970 0x80 THUMB Debug/../../obj/xcp.o - .debug_ranges 0x000009f0 0x60 THUMB Debug/../../obj/file.o - .debug_ranges 0x00000a50 0x2c8 THUMB Debug/../../obj/ff.o - .debug_ranges 0x00000d18 0x18 THUMB Debug/../../obj/unicode.o - .debug_ranges 0x00000d30 0x4f8 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) - .debug_ranges 0x00001228 0x208 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - .debug_ranges 0x00001430 0x50 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + .debug_ranges 0x000005f0 0x38 THUMB Debug/../../obj/stm32f4xx_syscfg.o + .debug_ranges 0x00000628 0xf0 THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_ranges 0x00000718 0x320 THUMB Debug/../../obj/stm32_eth.o + .debug_ranges 0x00000a38 0x28 THUMB Debug/../../obj/netdev.o + .debug_ranges 0x00000a60 0x38 THUMB Debug/../../obj/hooks.o + .debug_ranges 0x00000a98 0x10 THUMB Debug/../../obj/main.o + .debug_ranges 0x00000aa8 0x10 THUMB Debug/../../obj/vectors.o + .debug_ranges 0x00000ab8 0x20 THUMB Debug/../../obj/cpu.o + .debug_ranges 0x00000ad8 0x98 THUMB Debug/../../obj/flash.o + .debug_ranges 0x00000b70 0x30 THUMB Debug/../../obj/nvm.o + .debug_ranges 0x00000ba0 0x28 THUMB Debug/../../obj/timer.o + .debug_ranges 0x00000bc8 0x30 THUMB Debug/../../obj/uart.o + .debug_ranges 0x00000bf8 0x50 THUMB Debug/../../obj/can.o + .debug_ranges 0x00000c48 0x10 THUMB Debug/../../obj/assert.o + .debug_ranges 0x00000c58 0x18 THUMB Debug/../../obj/backdoor.o + .debug_ranges 0x00000c70 0x18 THUMB Debug/../../obj/boot.o + .debug_ranges 0x00000c88 0x58 THUMB Debug/../../obj/com.o + .debug_ranges 0x00000ce0 0x18 THUMB Debug/../../obj/cop.o + .debug_ranges 0x00000cf8 0x80 THUMB Debug/../../obj/xcp.o + .debug_ranges 0x00000d78 0x60 THUMB Debug/../../obj/file.o + .debug_ranges 0x00000dd8 0x2c8 THUMB Debug/../../obj/ff.o + .debug_ranges 0x000010a0 0x18 THUMB Debug/../../obj/unicode.o + .debug_ranges 0x000010b8 0x88 THUMB Debug/../../obj/uip.o + .debug_ranges 0x00001140 0x30 THUMB Debug/../../obj/uip_arp.o + .debug_ranges 0x00001170 0x28 THUMB Debug/../../obj/net.o + .debug_ranges 0x00001198 0x4f8 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + .debug_ranges 0x00001690 0x208 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_ranges 0x00001898 0x50 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) -.debug_line 0x00000000 0x609d +.debug_line 0x00000000 0x7e07 .debug_line 0x00000000 0xb5b THUMB Debug/../../obj/mmc.o .debug_line 0x00000b5b 0x21c THUMB Debug/../../obj/system_stm32f4xx.o .debug_line 0x00000d77 0x49f THUMB Debug/../../obj/stm32f4xx_flash.o .debug_line 0x00001216 0x3ae THUMB Debug/../../obj/stm32f4xx_gpio.o .debug_line 0x000015c4 0x590 THUMB Debug/../../obj/stm32f4xx_rcc.o .debug_line 0x00001b54 0x45f THUMB Debug/../../obj/stm32f4xx_sdio.o - .debug_line 0x00001fb3 0x4a2 THUMB Debug/../../obj/stm32f4xx_usart.o - .debug_line 0x00002455 0x2d5 THUMB Debug/../../obj/hooks.o - .debug_line 0x0000272a 0x269 THUMB Debug/../../obj/main.o - .debug_line 0x00002993 0x17f THUMB Debug/../../obj/cstart.o - .debug_line 0x00002b12 0x10a THUMB Debug/../../obj/vectors.o - .debug_line 0x00002c1c 0x150 THUMB Debug/../../obj/cpu.o - .debug_line 0x00002d6c 0x391 THUMB Debug/../../obj/flash.o - .debug_line 0x000030fd 0x137 THUMB Debug/../../obj/nvm.o - .debug_line 0x00003234 0x1a3 THUMB Debug/../../obj/timer.o - .debug_line 0x000033d7 0x305 THUMB Debug/../../obj/uart.o - .debug_line 0x000036dc 0x1a0 THUMB Debug/../../obj/can.o - .debug_line 0x0000387c 0xdf THUMB Debug/../../obj/assert.o - .debug_line 0x0000395b 0x117 THUMB Debug/../../obj/backdoor.o - .debug_line 0x00003a72 0x11b THUMB Debug/../../obj/boot.o - .debug_line 0x00003b8d 0x1b1 THUMB Debug/../../obj/com.o - .debug_line 0x00003d3e 0xaf THUMB Debug/../../obj/cop.o - .debug_line 0x00003ded 0x200 THUMB Debug/../../obj/xcp.o - .debug_line 0x00003fed 0x3d7 THUMB Debug/../../obj/file.o - .debug_line 0x000043c4 0xfc5 THUMB Debug/../../obj/ff.o - .debug_line 0x00005389 0x19d THUMB Debug/../../obj/unicode.o - .debug_line 0x00005526 0x5b3 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) - .debug_line 0x00005ad9 0x550 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - .debug_line 0x00006029 0x74 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + .debug_line 0x00001fb3 0x27d THUMB Debug/../../obj/stm32f4xx_syscfg.o + .debug_line 0x00002230 0x4a2 THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_line 0x000026d2 0xcd9 THUMB Debug/../../obj/stm32_eth.o + .debug_line 0x000033ab 0x3b3 THUMB Debug/../../obj/netdev.o + .debug_line 0x0000375e 0x2d5 THUMB Debug/../../obj/hooks.o + .debug_line 0x00003a33 0x269 THUMB Debug/../../obj/main.o + .debug_line 0x00003c9c 0x17f THUMB Debug/../../obj/cstart.o + .debug_line 0x00003e1b 0x10a THUMB Debug/../../obj/vectors.o + .debug_line 0x00003f25 0x15b THUMB Debug/../../obj/cpu.o + .debug_line 0x00004080 0x3a0 THUMB Debug/../../obj/flash.o + .debug_line 0x00004420 0x137 THUMB Debug/../../obj/nvm.o + .debug_line 0x00004557 0x1a3 THUMB Debug/../../obj/timer.o + .debug_line 0x000046fa 0x305 THUMB Debug/../../obj/uart.o + .debug_line 0x000049ff 0x1a0 THUMB Debug/../../obj/can.o + .debug_line 0x00004b9f 0xdf THUMB Debug/../../obj/assert.o + .debug_line 0x00004c7e 0x117 THUMB Debug/../../obj/backdoor.o + .debug_line 0x00004d95 0x11b THUMB Debug/../../obj/boot.o + .debug_line 0x00004eb0 0x1bf THUMB Debug/../../obj/com.o + .debug_line 0x0000506f 0xaf THUMB Debug/../../obj/cop.o + .debug_line 0x0000511e 0x200 THUMB Debug/../../obj/xcp.o + .debug_line 0x0000531e 0x3d7 THUMB Debug/../../obj/file.o + .debug_line 0x000056f5 0xfc5 THUMB Debug/../../obj/ff.o + .debug_line 0x000066ba 0x19d THUMB Debug/../../obj/unicode.o + .debug_line 0x00006857 0x57e THUMB Debug/../../obj/uip.o + .debug_line 0x00006dd5 0x2a6 THUMB Debug/../../obj/uip_arp.o + .debug_line 0x0000707b 0x215 THUMB Debug/../../obj/net.o + .debug_line 0x00007290 0x5b3 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + .debug_line 0x00007843 0x550 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_line 0x00007d93 0x74 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) -.debug_str 0x00000000 0x4ca0 - .debug_str 0x00000000 0x1460 THUMB Debug/../../obj/mmc.o +.debug_str 0x00000000 0x698f + .debug_str 0x00000000 0x145b THUMB Debug/../../obj/mmc.o 0x1526 (size before relaxing) - .debug_str 0x00001460 0x276 THUMB Debug/../../obj/system_stm32f4xx.o + .debug_str 0x0000145b 0x276 THUMB Debug/../../obj/system_stm32f4xx.o 0x3f7 (size before relaxing) - .debug_str 0x000016d6 0x424 THUMB Debug/../../obj/stm32f4xx_flash.o + .debug_str 0x000016d1 0x424 THUMB Debug/../../obj/stm32f4xx_flash.o 0x5f1 (size before relaxing) - .debug_str 0x00001afa 0x1c8 THUMB Debug/../../obj/stm32f4xx_gpio.o + .debug_str 0x00001af5 0x1c2 THUMB Debug/../../obj/stm32f4xx_gpio.o 0x508 (size before relaxing) - .debug_str 0x00001cc2 0x59f THUMB Debug/../../obj/stm32f4xx_rcc.o + .debug_str 0x00001cb7 0x59f THUMB Debug/../../obj/stm32f4xx_rcc.o 0x8b7 (size before relaxing) - .debug_str 0x00002261 0x21d THUMB Debug/../../obj/stm32f4xx_sdio.o + .debug_str 0x00002256 0x21d THUMB Debug/../../obj/stm32f4xx_sdio.o 0x6a0 (size before relaxing) - .debug_str 0x0000247e 0x488 THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_str 0x00002473 0x1b4 THUMB Debug/../../obj/stm32f4xx_syscfg.o + 0x354 (size before relaxing) + .debug_str 0x00002627 0x488 THUMB Debug/../../obj/stm32f4xx_usart.o 0x70d (size before relaxing) - .debug_str 0x00002906 0x3a1 THUMB Debug/../../obj/hooks.o + .debug_str 0x00002aaf 0x12bb THUMB Debug/../../obj/stm32_eth.o + 0x1565 (size before relaxing) + .debug_str 0x00003d6a 0x227 THUMB Debug/../../obj/netdev.o + 0xcb6 (size before relaxing) + .debug_str 0x00003f91 0x398 THUMB Debug/../../obj/hooks.o 0x5b9 (size before relaxing) - .debug_str 0x00002ca7 0x81 THUMB Debug/../../obj/main.o + .debug_str 0x00004329 0x81 THUMB Debug/../../obj/main.o 0x40e (size before relaxing) - .debug_str 0x00002d28 0xd4 THUMB Debug/../../obj/vectors.o + .debug_str 0x000043aa 0xbb THUMB Debug/../../obj/vectors.o 0x1ea (size before relaxing) - .debug_str 0x00002dfc 0x113 THUMB Debug/../../obj/cpu.o - 0x23e (size before relaxing) - .debug_str 0x00002f0f 0x221 THUMB Debug/../../obj/flash.o - 0x4da (size before relaxing) - .debug_str 0x00003130 0x9f THUMB Debug/../../obj/nvm.o + .debug_str 0x00004465 0x12f THUMB Debug/../../obj/cpu.o + 0x25a (size before relaxing) + .debug_str 0x00004594 0x221 THUMB Debug/../../obj/flash.o + 0x4f6 (size before relaxing) + .debug_str 0x000047b5 0x9f THUMB Debug/../../obj/nvm.o 0x240 (size before relaxing) - .debug_str 0x000031cf 0xca THUMB Debug/../../obj/timer.o + .debug_str 0x00004854 0xca THUMB Debug/../../obj/timer.o 0x235 (size before relaxing) - .debug_str 0x00003299 0x11e THUMB Debug/../../obj/uart.o + .debug_str 0x0000491e 0x11e THUMB Debug/../../obj/uart.o 0x428 (size before relaxing) - .debug_str 0x000033b7 0x19a THUMB Debug/../../obj/can.o + .debug_str 0x00004a3c 0x19a THUMB Debug/../../obj/can.o 0x33f (size before relaxing) - .debug_str 0x00003551 0x9b THUMB Debug/../../obj/assert.o + .debug_str 0x00004bd6 0x9b THUMB Debug/../../obj/assert.o 0x1df (size before relaxing) - .debug_str 0x000035ec 0xe8 THUMB Debug/../../obj/backdoor.o + .debug_str 0x00004c71 0xe8 THUMB Debug/../../obj/backdoor.o 0x226 (size before relaxing) - .debug_str 0x000036d4 0x9b THUMB Debug/../../obj/boot.o + .debug_str 0x00004d59 0x9b THUMB Debug/../../obj/boot.o 0x1fe (size before relaxing) - .debug_str 0x0000376f 0x1cf THUMB Debug/../../obj/com.o - 0x396 (size before relaxing) - .debug_str 0x0000393e 0x70 THUMB Debug/../../obj/cop.o + .debug_str 0x00004df4 0x1fa THUMB Debug/../../obj/com.o + 0x3c1 (size before relaxing) + .debug_str 0x00004fee 0x70 THUMB Debug/../../obj/cop.o 0x190 (size before relaxing) - .debug_str 0x000039ae 0x224 THUMB Debug/../../obj/xcp.o + .debug_str 0x0000505e 0x21d THUMB Debug/../../obj/xcp.o 0x444 (size before relaxing) - .debug_str 0x00003bd2 0x31b THUMB Debug/../../obj/file.o + .debug_str 0x0000527b 0x31b THUMB Debug/../../obj/file.o 0x7e9 (size before relaxing) - .debug_str 0x00003eed 0x31a THUMB Debug/../../obj/ff.o + .debug_str 0x00005596 0x31a THUMB Debug/../../obj/ff.o 0x758 (size before relaxing) - .debug_str 0x00004207 0xa5 THUMB Debug/../../obj/unicode.o + .debug_str 0x000058b0 0xa5 THUMB Debug/../../obj/unicode.o 0x171 (size before relaxing) - .debug_str 0x000042ac 0x56f C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + .debug_str 0x00005955 0x3ff THUMB Debug/../../obj/uip.o + 0x5ca (size before relaxing) + .debug_str 0x00005d54 0x184 THUMB Debug/../../obj/uip_arp.o + 0x37a (size before relaxing) + .debug_str 0x00005ed8 0xc3 THUMB Debug/../../obj/net.o + 0x413 (size before relaxing) + .debug_str 0x00005f9b 0x56f C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) 0x655 (size before relaxing) - .debug_str 0x0000481b 0x3b3 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_str 0x0000650a 0x3b3 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) 0x3fc (size before relaxing) - .debug_str 0x00004bce 0xd2 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + .debug_str 0x000068bd 0xd2 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) 0x11b (size before relaxing) .comment 0x00000000 0x4e @@ -3637,7 +4173,10 @@ OUTPUT(C:/Work/software/OpenBLT/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossw .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_gpio.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_rcc.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_sdio.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_syscfg.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_usart.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32_eth.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/netdev.o .comment 0x00000000 0x4f THUMB Debug/../../obj/hooks.o .comment 0x00000000 0x4f THUMB Debug/../../obj/main.o .comment 0x00000000 0x4f THUMB Debug/../../obj/vectors.o @@ -3656,6 +4195,9 @@ OUTPUT(C:/Work/software/OpenBLT/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossw .comment 0x00000000 0x4f THUMB Debug/../../obj/file.o .comment 0x00000000 0x4f THUMB Debug/../../obj/ff.o .comment 0x00000000 0x4f THUMB Debug/../../obj/unicode.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/uip.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/uip_arp.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/net.o .comment 0x00000000 0x4f C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) .comment 0x00000000 0x4f C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) .comment 0x00000000 0x4f C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) @@ -3675,50 +4217,62 @@ OUTPUT(C:/Work/software/OpenBLT/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossw .ARM.attributes 0x000000ff 0x33 THUMB Debug/../../obj/stm32f4xx_sdio.o .ARM.attributes - 0x00000132 0x33 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000132 0x33 THUMB Debug/../../obj/stm32f4xx_syscfg.o .ARM.attributes - 0x00000165 0x33 THUMB Debug/../../obj/hooks.o + 0x00000165 0x33 THUMB Debug/../../obj/stm32f4xx_usart.o .ARM.attributes - 0x00000198 0x33 THUMB Debug/../../obj/main.o + 0x00000198 0x33 THUMB Debug/../../obj/stm32_eth.o .ARM.attributes - 0x000001cb 0x27 THUMB Debug/../../obj/cstart.o + 0x000001cb 0x33 THUMB Debug/../../obj/netdev.o .ARM.attributes - 0x000001f2 0x33 THUMB Debug/../../obj/vectors.o + 0x000001fe 0x33 THUMB Debug/../../obj/hooks.o .ARM.attributes - 0x00000225 0x33 THUMB Debug/../../obj/cpu.o + 0x00000231 0x33 THUMB Debug/../../obj/main.o .ARM.attributes - 0x00000258 0x33 THUMB Debug/../../obj/flash.o + 0x00000264 0x27 THUMB Debug/../../obj/cstart.o .ARM.attributes - 0x0000028b 0x33 THUMB Debug/../../obj/nvm.o + 0x0000028b 0x33 THUMB Debug/../../obj/vectors.o .ARM.attributes - 0x000002be 0x33 THUMB Debug/../../obj/timer.o + 0x000002be 0x33 THUMB Debug/../../obj/cpu.o .ARM.attributes - 0x000002f1 0x33 THUMB Debug/../../obj/uart.o + 0x000002f1 0x33 THUMB Debug/../../obj/flash.o .ARM.attributes - 0x00000324 0x33 THUMB Debug/../../obj/can.o + 0x00000324 0x33 THUMB Debug/../../obj/nvm.o .ARM.attributes - 0x00000357 0x33 THUMB Debug/../../obj/assert.o + 0x00000357 0x33 THUMB Debug/../../obj/timer.o .ARM.attributes - 0x0000038a 0x33 THUMB Debug/../../obj/backdoor.o + 0x0000038a 0x33 THUMB Debug/../../obj/uart.o .ARM.attributes - 0x000003bd 0x33 THUMB Debug/../../obj/boot.o + 0x000003bd 0x33 THUMB Debug/../../obj/can.o .ARM.attributes - 0x000003f0 0x33 THUMB Debug/../../obj/com.o + 0x000003f0 0x33 THUMB Debug/../../obj/assert.o .ARM.attributes - 0x00000423 0x33 THUMB Debug/../../obj/cop.o + 0x00000423 0x33 THUMB Debug/../../obj/backdoor.o .ARM.attributes - 0x00000456 0x33 THUMB Debug/../../obj/xcp.o + 0x00000456 0x33 THUMB Debug/../../obj/boot.o .ARM.attributes - 0x00000489 0x33 THUMB Debug/../../obj/file.o + 0x00000489 0x33 THUMB Debug/../../obj/com.o .ARM.attributes - 0x000004bc 0x33 THUMB Debug/../../obj/ff.o + 0x000004bc 0x33 THUMB Debug/../../obj/cop.o .ARM.attributes - 0x000004ef 0x33 THUMB Debug/../../obj/unicode.o + 0x000004ef 0x33 THUMB Debug/../../obj/xcp.o .ARM.attributes - 0x00000522 0x2e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + 0x00000522 0x33 THUMB Debug/../../obj/file.o .ARM.attributes - 0x00000550 0x1e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + 0x00000555 0x33 THUMB Debug/../../obj/ff.o .ARM.attributes - 0x0000056e 0x2e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + 0x00000588 0x33 THUMB Debug/../../obj/unicode.o .ARM.attributes - 0x0000059c 0x2e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + 0x000005bb 0x33 THUMB Debug/../../obj/uip.o + .ARM.attributes + 0x000005ee 0x33 THUMB Debug/../../obj/uip_arp.o + .ARM.attributes + 0x00000621 0x33 THUMB Debug/../../obj/net.o + .ARM.attributes + 0x00000654 0x2e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + .ARM.attributes + 0x00000682 0x1e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + .ARM.attributes + 0x000006a0 0x2e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .ARM.attributes + 0x000006ce 0x2e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/bin/openbtl_olimex_stm32e407.srec b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/bin/openbtl_olimex_stm32e407.srec index ea822848..5534d261 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/bin/openbtl_olimex_stm32e407.srec +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/bin/openbtl_olimex_stm32e407.srec @@ -1,29 +1,29 @@ S02B0000433A2F576F726B2F736F6674776172652F4F70656E424C542F5461726765742F44656D6F2F41524DEF -S315080000004420002017020008492300084923000855 -S315080000104923000849230008492300084923000802 -S3150800002049230008492300084923000849230008F2 -S3150800003049230008492300084923000849230008E2 -S3150800004049230008492300084923000849230008D2 -S3150800005049230008492300084923000849230008C2 -S3150800006049230008492300084923000849230008B2 -S3150800007049230008492300084923000849230008A2 -S315080000804923000849230008492300084923000892 -S315080000904923000849230008492300084923000882 -S315080000A04923000849230008492300084923000872 -S315080000B04923000849230008492300084923000862 -S315080000C04923000849230008492300084923000852 -S315080000D04923000849230008492300084923000842 -S315080000E04923000849230008492300084923000832 -S315080000F04923000849230008492300084923000822 -S315080001004923000849230008492300084923000811 -S315080001104923000849230008492300084923000801 -S3150800012049230008492300084923000849230008F1 -S3150800013049230008492300084923000849230008E1 -S3150800014049230008492300084923000849230008D1 -S3150800015049230008492300084923000849230008C1 -S3150800016049230008492300084923000849230008B1 -S3150800017049230008492300084923000849230008A1 -S30D08000180492300084923000881 +S315080000007435002017020008A52C0008A52C000846 +S31508000010A52C0008A52C0008A52C0008A52C00086E +S31508000020A52C0008A52C0008A52C0008A52C00085E +S31508000030A52C0008A52C0008A52C0008A52C00084E +S31508000040A52C0008A52C0008A52C0008A52C00083E +S31508000050A52C0008A52C0008A52C0008A52C00082E +S31508000060A52C0008A52C0008A52C0008A52C00081E +S31508000070A52C0008A52C0008A52C0008A52C00080E +S31508000080A52C0008A52C0008A52C0008A52C0008FE +S31508000090A52C0008A52C0008A52C0008A52C0008EE +S315080000A0A52C0008A52C0008A52C0008A52C0008DE +S315080000B0A52C0008A52C0008A52C0008A52C0008CE +S315080000C0A52C0008A52C0008A52C0008A52C0008BE +S315080000D0A52C0008A52C0008A52C0008A52C0008AE +S315080000E0A52C0008A52C0008A52C0008A52C00089E +S315080000F0A52C0008A52C0008A52C0008A52C00088E +S31508000100A52C0008A52C0008A52C0008A52C00087D +S31508000110A52C0008A52C0008A52C0008A52C00086D +S31508000120A52C0008A52C0008A52C0008A52C00085D +S31508000130A52C0008A52C0008A52C0008A52C00084D +S31508000140A52C0008A52C0008A52C0008A52C00083D +S31508000150A52C0008A52C0008A52C0008A52C00082D +S31508000160A52C0008A52C0008A52C0008A52C00081D +S31508000170A52C0008A52C0008A52C0008A52C00080D +S30D08000180A52C0008A52C0008B7 S3150800018872B64D484D4901604D49072291438D463F S315080001984C484D494D4A00F07DF84D484D494E4A60 S315080001A800F078F84D484E494E4A00F073F84E4824 @@ -32,7 +32,7 @@ S315080001C869F84F484F49504A00F064F84F48504973 S315080001D8002200F06AF84F484F49091A082903DB34 S315080001E8002202600430016040484149884205D02F S315080001F80268043003B4904703BCF7E70020864634 -S31508000208EC4603F023F800200021444A904772B6CA +S31508000208EC4603F0E9FC00200021444A904772B600 S315080002182B49072291438D462A482B492B4A00F039 S3150800022839F82B482B492C4A00F034F82B482C4926 S315080002382C4A00F02FF82C482C492D4A00F02AF8A9 @@ -44,24 +44,24 @@ S3150800028803BCF7E700208646EC4600200021234AEF S315080002989047FEE7884207D0521A05D003780130FE S315080002A80B700131013AF9D17047884202D00270C1 S315080002B80130FAE77047000008ED00E00000000882 -S315080002C844200020107500080000002019000020AE -S315080002D82803000828030008006B000810750008A2 -S315080002E80000002000000020006B0008006B0008D2 -S315080002F8006B0008006B0008006B0008006B00081C -S31508000308006B0008006B0008107500081C00002028 -S3150800031844100020441000204418002069220008D0 +S315080002C874350020989A00080000002019000020BC +S315080002D8280300082803000820900008989A0008B0 +S315080002E80000002000000020209000082090000848 +S315080002F82090000820900008209000082090000808 +S315080003082090000820900008989A00081C000020F1 +S315080003187425002074250020742D0020C52B00089C S3150800032808B54FF43053C4F20103586B10F0450F63 S3150800033807D14FF43052C4F20102506B10F0450F42 -S31508000348FBD010F0040F06D04FF0040001F030FE81 +S31508000348FBD010F0040F06D04FF0040001F042FE6F S315080003584FF0030008BD10F0010F06D04FF001005A -S3150800036801F026FE4FF0010008BD40F2FF5001F0EB -S315080003781FFE4FF0000008BD10B504464FF4305371 +S3150800036801F038FE4FF0010008BD40F2FF5001F0D9 +S3150800037831FE4FF0000008BD10B504464FF430535F S31508000388C4F20103586B10F0450F07D14FF43052E9 S31508000398C4F20102506B10F0450FFBD010F0040FA1 -S315080003A806D04FF0040001F003FE4FF0030010BD1D -S315080003B810F0010F06D04FF0010001F0F9FD4FF0DB -S315080003C8010010BD01F0ACFDA0424AD140F2FF5031 -S315080003D801F0EEFD4FF0000001F0AAFD4EF208010B +S315080003A806D04FF0040001F015FE4FF0030010BD0B +S315080003B810F0010F06D04FF0010001F00BFE4FF0C8 +S315080003C8010010BD01F0BEFDA0424AD140F2FF501F +S315080003D801F000FE4FF0000001F0BCFD4EF20801E6 S315080003E8CFF6FF51014000293ED000283FDB10F028 S315080003F8804F3FD110F0005F3FD110F0805F3FD1AA S3150800040810F0006F3FD110F0806F3FD110F0807F59 @@ -78,47 +78,47 @@ S315080004A8100010BD4FF0110010BD4FF0120010BD1E S315080004B84FF0130010BD4FF0140010BD4FF0150093 S315080004C810BD4FF0160010BD4FF0170010BD4FF0C5 S315080004D8180010BD4FF0190010BD00BF2DE9F041F6 -S315080004E882B004464FF0000001F022FD10F0007FAC +S315080004E882B004464FF0000001F034FD10F0007F9A S315080004F840F042814FF000020092019240F2D80380 S315080005081846C2F200004FF0080101604FF01005C6 S3150800051845604FF040038360C2604FF48062026111 -S3150800052801F0E6FC2846FFF727FF0146002840F0B9 +S3150800052801F0F8FC2846FFF727FF0146002840F0A7 S315080005382B8140F2D800C2F2000040F27801C2F2DC S3150800054800010B6803FA05F303604FF037054560A9 S315080005584FF0400282604FF00001C1604FF480639B -S31508000568036101F0C5FC2846FFF706FF0146002887 +S31508000568036101F0D7FC2846FFF706FF0146002875 S3150800057840F00A8140F22000C2F200004FF0FF3531 S3150800058805604FF0080646604FF0300282604FF06B S315080005980201C1604FF0000505614FF00103436190 -S315080005A801F0D4FC40F2D800C2F2000005604FF012 +S315080005A801F0E6FC40F2D800C2F2000005604FF000 S315080005B8330646604FF040028260C5604FF480619A -S315080005C8016101F095FC3046FFF7D6FE0146002882 +S315080005C8016101F0A7FC3046FFF7D6FE0146002870 S315080005D840F0DA80ADF104084FF43055C4F201054D -S315080005E840F22A664FF4001707E0384601F0D6FCB1 -S315080005F818B101F0C3FC48F8040F6B6B3342F4D00A -S315080006084FF0080001F0CAFC30B14FF0080001F0BD -S31508000618CFFC4FF00401B7E04FF0020001F0BEFC32 -S3150800062830B14FF0020001F0C3FC4FF00201ABE015 -S315080006384FF0200001F0B2FC30B14FF0200001F075 -S31508000648B7FC4FF006019FE04FF4007001F0A6FCD6 -S3150800065830B14FF4007001F0ABFC4FF0070193E09E -S3150800066840F2FF5001F0A4FC00984FEA006242EA03 +S315080005E840F22A664FF4001707E0384601F0E8FC9F +S315080005F818B101F0D5FC48F8040F6B6B3342F4D0F8 +S315080006084FF0080001F0DCFC30B14FF0080001F0AB +S31508000618E1FC4FF00401B7E04FF0020001F0D0FC0E +S3150800062830B14FF0020001F0D5FC4FF00201ABE003 +S315080006384FF0200001F0C4FC30B14FF0200001F063 +S31508000648C9FC4FF006019FE04FF4007001F0B8FCB2 +S3150800065830B14FF4007001F0BDFC4FF0070193E08C +S3150800066840F2FF5001F0B6FC00984FEA006242EAF1 S31508000678106300F47F4143EA012300F47F0043EA4C S315080006881022012C3DD112F4802F78D040F2D804DC S315080006982046C2F2000040F27803C2F200031A6844 S315080006A84FEA024101604FF0370444604FF04003B7 S315080006B883604FF00002C2604FF48061016101F067 -S315080006C817FC2046FFF758FE014600285CD140F281 +S315080006C829FC2046FFF758FE014600285CD140F26F S315080006D8D800C2F200004FF0020404604FF0060486 S315080006E844604FF0400383604FF00002C2604FF445 -S315080006F88061016101F0FCFB2046FFF73DFE0146DB +S315080006F88061016101F00EFC2046FFF73DFE0146C8 S3150800070842E012F4803F3DD040F2D8042046C2F2B7 S31508000718000040F27803C2F200031A684FEA024161 S3150800072801604FF0370444604FF0400383604FF090 -S315080007380002C2604FF48061016101F0D9FB2046CE +S315080007380002C2604FF48061016101F0EBFB2046BC S31508000748FFF71AFE0146F8B940F2D800C2F20000CF S315080007584FF0000303604FF0060444604FF0400270 -S315080007688260C3604FF48061016101F0C1FB2046D5 +S315080007688260C3604FF48061016101F0D3FB2046C3 S31508000778FFF702FE014607E04FF00E0104E04FF0CE S31508000788250101E04FF02501084602B0BDE8F081D1 S3150800079800B583B04FF001038DF807304FF40060B9 @@ -126,77 +126,77 @@ S315080007A8C4F202004FF4006101F090FA18B94FF04C S315080007B800008DF807009DF8070003B000BD00BFCC S315080007C82DE9F04782B04FF000048DF8074040F253 S315080007D86000C2F200004FF07603037504604460B7 -S315080007E88460C460046101F055FB4FF0030001F012 -S315080007F871FB4FF0010001F067FB40F2D800C2F226 +S315080007E88460C460046101F067FB4FF0030001F000 +S315080007F883FB4FF0010001F079FB40F2D800C2F202 S315080008080000046044608460C4604FF4806101613C -S3150800081801F06EFB4FF480354FF0800609E005F1CC -S31508000828FF34251E304601F0B9FB002800F02B815D -S3150800083804E0304601F0B2FB0028F0D04DB140F292 -S31508000848FF5001F0B5FB4FF0000004E04FF003003D +S3150800081801F080FB4FF480354FF0800609E005F1BA +S31508000828FF34251E304601F0CBFB002800F02B814B +S3150800083804E0304601F0C4FB0028F0D04DB140F280 +S31508000848FF5001F0C7FB4FF0000004E04FF003002B S3150800085801E04FF003008DF807009DF8072012B154 S315080008689DF8070008E140F2D800C2F200004FF4EC S31508000878D57404604FF0080545604FF0400383605F -S315080008884FF00001C1604FF48062026101F030FB4D +S315080008884FF00001C1604FF48062026101F042FB3B S315080008984FF43050C4F20100436B13F0450F14D1DE S315080008A84FF480314FF43054C4F2010401F1FF3596 S315080008B82946636B13F0450F06D105F1FF31636BC3 S315080008C813F0450F00F0DB8011B113F0040F06D0C2 -S315080008D84FF0040001F06CFB4FF003020BE013F035 -S315080008E8400F06D04FF0400001F062FB4FF00002BF +S315080008D84FF0040001F07EFB4FF003020BE013F023 +S315080008E8400F06D04FF0400001F074FB4FF00002AD S315080008F801E04FF000028DF807209DF8070048B977 S3150800090840F24805C2F200054FF001022A604FF08E S31508000918804518E040F2D8042046C2F200004FF09D S31508000928000505604FF0370444604FF040018160C8 -S31508000938C5604FF48063036101F0DAFA2046FFF7D1 +S31508000938C5604FF48063036101F0ECFA2046FFF7BF S315080009481BFD8DF8070040F2D800C2F200004FF0F0 S31508000958000303604FF0370444604FF0400181609C -S31508000968C3604FF48062026101F0C2FA2046FFF7BD +S31508000968C3604FF48062026101F0D4FA2046FFF7AB S3150800097803FD8DF807009DF8070000287AD14FF087 S31508000988000740F2D804C2F20004B846B94645F052 S31508000998004646F4801A4FF43055C4F20105C4F8E7 S315080009A800904FF0370666604FF04003A360C4F81E -S315080009B80C904FF480612161204601F099FA30467F +S315080009B80C904FF480612161204601F0ABFA30466D S315080009C8FFF7DAFC8DF807009DF8072012B19DF8A5 S315080009D8070051E0C4F800A04FF0290060604FF006 S315080009E84003A360C4F80C804FF480612161204657 -S315080009F801F07EFA6A6B12F0450F03D16A6B12F0A2 +S315080009F801F090FA6A6B12F0450F03D16A6B12F090 S31508000A08450FFBD012F0040F06D04FF0040001F092 -S31508000A18CFFA4FF0030004E040F2FF5001F0C8FA9D +S31508000A18E1FA4FF0030004E040F2FF5001F0DAFA79 S31508000A2840468DF807009DF8073013B19DF8070072 -S31508000A3822E0404601F07CFA07F10107002804DBAA +S31508000A3822E0404601F08EFA07F10107002804DB98 S31508000A484FF6FF739F42AAD103E04FF6FE718F4215 S31508000A5806D94FF01B018DF807109DF807000BE023 S31508000A6810F0804F06D040F24800C2F200004FF05E S31508000A78020202609DF8070002B0BDE8F087002967 S31508000A887FF414AF24E7651E7FF4D3AEDEE600BF15 -S31508000A9838B501F025FA002800F0D78040F2480357 +S31508000A9838B501F037FA002800F0D78040F2480345 S31508000AA8C2F200031868042800F0D28040F2D80081 S31508000AB8C2F200004FF0000101604FF002024260E6 S31508000AC84FF0C0048460C1604FF48063036101F08D -S31508000AD80FFAFFF725FC0446002840F0C48001F009 -S31508000AE827FA40F24C05C2F2000528604FF00400C8 -S31508000AF801F01EFA68604FF0080001F019FAA860BC -S31508000B084FF00C0001F014FAE86040F24800C2F20F +S31508000AD821FAFFF725FC0446002840F0C48001F0F7 +S31508000AE839FA40F24C05C2F2000528604FF00400B6 +S31508000AF801F030FA68604FF0080001F02BFAA86098 +S31508000B084FF00C0001F026FAE86040F24800C2F2FD S31508000B1800000168012903D9062901D0022956D1FE S31508000B2840F2D800C2F200004FF0000101604FF011 S31508000B38030242604FF040038360C1604FF480614E -S31508000B48016101F0D5F94FF43050C4F20100436B46 +S31508000B48016101F0E7F94FF43050C4F20100436B34 S31508000B5813F0450F07D14FF43052C4F20102536B14 S31508000B6813F0450FFBD013F0040F06D04FF004001E -S31508000B7801F01EFA4FF0030475E013F0010F06D0D2 -S31508000B884FF0010001F014FA4FF001046BE001F090 -S31508000B98C7F9032818BF102465D140F2FF5001F0A1 -S31508000BA807FA4FF0000001F0C3F910F4604F02D1BC +S31508000B7801F030FA4FF0030475E013F0010F06D0C0 +S31508000B884FF0010001F026FA4FF001046BE001F07E +S31508000B98D9F9032818BF102465D140F2FF5001F08F +S31508000BA819FA4FF0000001F0D5F910F4604F02D198 S31508000BB84FEA10430DE010F4005F4CD110F4804F53 S31508000BC84CD110F4004F4CD14FF0010301E04FF01F S31508000BD8010340F24801C2F200010868042842D01D S31508000BE840F27804C2F20004236040F2D800C2F248 S31508000BF800004FEA034202604FF0090343604FF0D2 S31508000C08C00181604FF00004C4604FF4806202613D -S31508000C1801F06EF9FFF784FB044620BB01F088F95A +S31508000C1801F080F9FFF784FB044620BB01F09AF936 S31508000C2840F23805C2F2000528604FF0040001F0CA -S31508000C387FF968604FF0080001F07AF9A8604FF06C -S31508000C480C0001F075F9E8600DE04FF025040AE09C +S31508000C3891F968604FF0080001F08CF9A8604FF048 +S31508000C480C0001F087F9E8600DE04FF025040AE08A S31508000C584FF0000407E04FF0130404E04FF01004C7 S31508000C6801E04FF00F04204638BD00BF70B40146B6 S31508000C7840F24803C2F200031C6880F8564040F266 @@ -251,13 +251,13 @@ S31508000F7800031968032933D0022934D8B0F5805FED S31508000F8834D0B0F5006F16D14FF00100FFF7A6FA76 S31508000F98044668BB40F26000C2F200004FF0000346 S31508000FA803750360436083604FF40061C1600361A1 -S31508000FB800F070FF1CE04FF00000FFF78FFA0446B8 +S31508000FB800F082FF1CE04FF00000FFF78FFA0446A6 S31508000FC8B0B940F26000C2F200004FF000020275A4 -S31508000FD8026042608260C260026100F05BFF07E05F +S31508000FD8026042608260C260026100F06DFF07E04D S31508000FE84FF0270404E04FF0000401E04FF027040F S31508000FF8204610BD10B540F2D803C2F200031860A7 S315080010084FF007045C604FF040029A604FF000000A -S31508001018D8604FF480611961184600F069FF2046C8 +S31508001018D8604FF480611961184600F07BFF2046B6 S31508001028FFF7AAF910BD00BF2DE9F04184B04FF0CB S3150800103800068DF80F604FF00C004FF0010100F024 S31508001048D3FE4FF40064C4F2020420464FF00801A8 @@ -273,11 +273,11 @@ S315080010D83846694400F04AFD4FF4805001908DF86F S315080010E80B60204601A900F041FD4FF400670197FF S315080010F88DF808808DF80B60204601A900F036FDAA S315080011083846294600F094FE4FF48000294600F038 -S315080011186BFE00F0B1FEFFF753FB8DF80F009DF844 +S315080011186BFE00F0C3FEFFF753FB8DF80F009DF832 S315080011280F2012B19DF80F003BE0FFF7B1FC8DF8D0 S315080011380F009DF80F3013B19DF80F0031E040F20B S315080011486000C2F200004FF00001017501604160BD -S315080011588160C160016100F09DFE40F28000C2F224 +S315080011588160C160016100F0AFFE40F28000C2F212 S315080011680000FFF783FD8DF80F009DF80F0068B99A S3150800117840F28002C2F20002B2F854304FEA034045 S315080011884FF00001FFF736FF8DF80F009DF80F1096 @@ -290,33 +290,33 @@ S315080011E840F24801C2F200010C68022C05D14FEA08 S315080011F8562646EAC3564FF40072914640F2D8007E S31508001208C2F2000002604FF0100343604FF0400539 S3150800121885604FF00001C1604FF48064046100F0F6 -S3150800122867FE4FF480344FF0800508E004F1FF3478 -S31508001238284600F0B3FE002800F0CB8004E02846D4 -S3150800124800F0ACFE0028F1D04FF01000FFF794F834 +S3150800122879FE4FF480344FF0800508E004F1FF3466 +S31508001238284600F0C5FE002800F0CB8004E02846C2 +S3150800124800F0BEFE0028F1D04FF01000FFF794F822 S315080012588046002840F0AA8040F22000C2F200002A S315080012684FF0FF320260C0F804904FF09003836095 S315080012784FF00205C5604FF0000505614FF0010102 -S31508001288416100F063FE40F2D800C2F20000066031 +S31508001288416100F075FE40F2D800C2F2000006601F S315080012984FF0110444604FF040028260C5604FF475 -S315080012A88063036100F024FE2046FFF765F8804650 +S315080012A88063036100F036FE2046FFF765F880463E S315080012B800287BD13C464FF43055C4F2010540F26C -S315080012C82A664FF400471DE0384600F067FEC8B1A5 -S315080012D800F054FE206000F051FE606000F04EFEFB -S315080012E8A06000F04BFEE06000F048FE206100F0C8 -S315080012F845FE606100F042FEA06100F03FFEE06135 +S315080012C82A664FF400471DE0384600F079FEC8B193 +S315080012D800F066FE206000F063FE606000F060FEC5 +S315080012E8A06000F05DFEE06000F05AFE206100F0A4 +S315080012F857FE606100F054FEA06100F051FEE061FF S3150800130804F12004696B3142DED04FF0080000F082 -S3150800131845FE30B14FF0080000F04AFE4FF00408C9 -S3150800132844E04FF0020000F039FE30B14FF00200F9 -S3150800133800F03EFE4FF0020838E04FF0200000F0BB -S315080013482DFE30B14FF0200000F032FE4FF00608AF -S315080013582CE04FF4007000F021FE90B14FF40070B5 -S3150800136800F026FE4FF0070820E000F007FE2546A5 -S3150800137845F8040B07F1FF37304600F00FFEC0B9F1 -S3150800138809E04FF0FF374FF40016304600F006FE26 -S3150800139808B1002FE9D140F2FF5000F009FE40F2EB +S3150800131857FE30B14FF0080000F05CFE4FF00408A5 +S3150800132844E04FF0020000F04BFE30B14FF00200E7 +S3150800133800F050FE4FF0020838E04FF0200000F0A9 +S315080013483FFE30B14FF0200000F044FE4FF006088B +S315080013582CE04FF4007000F033FE90B14FF40070A3 +S3150800136800F038FE4FF0070820E000F019FE254681 +S3150800137845F8040B07F1FF37304600F021FEC0B9DF +S3150800138809E04FF0FF374FF40016304600F018FE14 +S3150800139808B1002FE9D140F2FF5000F01BFE40F2D9 S315080013A80000C2F200004FF0000202604046BDE8A5 -S315080013B8F88300F0E3FD6060304600F0EFFD002892 -S315080013C8E9D000F0DBFD686005F10804A7F102071B +S315080013B8F88300F0F5FD6060304600F001FE00286D +S315080013C8E9D000F0EDFD686005F10804A7F1020709 S315080013D8DBE7013C7FF433AF36E700BF2DE9F04F72 S315080013E885B082461646BDF838404FF0000140F2EF S315080013F81C02C2F20002117040F25C00C2F2000040 @@ -325,42 +325,42 @@ S31508001418C4F20102D16240F24801C2F2000108682A S31508001428022805D14FEA562646EAC3564FF40074F1 S31508001438254640F2D8031846C2F2000004604FF069 S31508001448100444604FF0400282604FF00001C1600A -S315080014584FF48063036100F04BFD2046FEF78CFFCE +S315080014584FF48063036100F05DFD2046FEF78CFFBC S315080014688346002840F0D38040F2D800C2F2000034 S3150800147806604FF0180444604FF0400282604FF04F -S315080014880001C1604FF48063036100F031FD204616 +S315080014880001C1604FF48063036100F043FD204604 S31508001498FEF772FF8346002840F0B98040F2200024 S315080014A8C2F200004FF0FF37076045604FF090061C S315080014B886604FF00004C46004614FF0010242617F -S315080014C800F044FD02944FF43056C4F2010640F287 -S315080014D81A674FF4804960E0484600F05FFD002827 +S315080014C800F056FD02944FF43056C4F2010640F275 +S315080014D81A674FF4804960E0484600F071FD002815 S315080014E85BD0029AC2F500701F2830D8830801938A S315080014F853D055464FF000046FEA0400019A811844 -S3150800150801F001030393DAF8000000F03FFD04F147 +S3150800150801F001030393DAF8000000F051FD04F135 S3150800151801040AF10408019884427CD10FE0454683 -S3150800152855F8040B00F032FDD8F8040000F02EFD3B +S3150800152855F8040B00F044FDD8F8040000F040FD17 S3150800153804F1020405F10408019B9C42EFD10198C5 S315080015480AEB800A029A02EB8001029125E0DAF892 -S31508001558000000F01BFDDAF8040000F017FDDAF8C1 -S31508001568080000F013FDDAF80C0000F00FFDDAF8B1 -S31508001578100000F00BFDDAF8140000F007FDDAF8A1 -S31508001588180000F003FDDAF81C0000F0FFFC0AF169 +S31508001558000000F02DFDDAF8040000F029FDDAF89D +S31508001568080000F025FDDAF80C0000F021FDDAF88D +S31508001578100000F01DFDDAF8140000F019FDDAF87D +S31508001588180000F015FDDAF81C0000F011FD0AF144 S31508001598200A029901F120010291706B38429BD00A -S315080015A84FF0080000F0FAFC30B14FF0080000F0E0 -S315080015B8FFFC4FF0040B2AE04FF0020000F0EEFCA7 -S315080015C830B14FF0020000F0F3FC4FF0020B1EE0BA -S315080015D84FF0100000F0E2FC30B14FF0100000F0B8 -S315080015E8E7FC4FF0050B12E04FF4007000F0D6FC4C -S315080015F830B14FF4007000F0DBFC4FF0070B06E043 +S315080015A84FF0080000F00CFD30B14FF0080000F0CD +S315080015B811FD4FF0040B2AE04FF0020000F000FD81 +S315080015C830B14FF0020000F005FD4FF0020B1EE0A7 +S315080015D84FF0100000F0F4FC30B14FF0100000F0A6 +S315080015E8F9FC4FF0050B12E04FF4007000F0E8FC28 +S315080015F830B14FF4007000F0EDFC4FF0070B06E031 S3150800160840F20001C2F200014FF000030B60584691 S3150800161805B0BDE8F08F039A002A80D0DAF80400EE -S3150800162800F0B4FC04F1010408F1040801998C429D +S3150800162800F0C6FC04F1010408F1040801998C428B S315080016387FF475AF83E700BF38B5054618B340F29F S31508001648D8031846C2F2000040F27802C2F2000235 S3150800165811684FEA014404604FF00D0444604FF0E6 S31508001668400383604FF00002C2604FF48061016155 -S3150800167800F03EFC2046FEF77FFE044628B900F037 -S3150800168857FC286001E04FF02604204638BD00BF05 +S3150800167800F050FC2046FEF77FFE044628B900F025 +S3150800168869FC286001E04FF02604204638BD00BFF3 S3150800169800B583B04FF000030193FFF779F80128E6 S315080016A818BFFF2009D101A8FFF7C6FF18B9019886 S315080016B8C0F3432001E04FF0FF0003B000BD00BFB0 @@ -376,13 +376,13 @@ S3150800174840F20402C2F20002107808BD2DE9B0433F S31508001758ADF5027D88461746C8B120E04FF0000966 S315080017684FF40075E219009502A84FEA42224B4643 S31508001778FFF71AFDB0B9FFF7A3FF0128FBD008EB5E -S31508001788442002A92A4605F071F98CB90DE003F13F +S31508001788442002A92A4607F0C9FB8CB90DE003F1E3 S31508001798FF34E4B2002BE1D14FF001000CE04FF022 S315080017A8010009E04FF0010006E04FF0000003E0F1 S315080017B804F1FF30C4B2D5E70DF5027DBDE8B08364 S315080017C82DE9F043ADF5037D0F469046E8B124E0D0 S315080017D84FF400754FF0000902A807EB44212A4682 -S315080017E805F044F904EB0802009502A84FEA4222DC +S315080017E807F09CFB04EB0802009502A84FEA422280 S315080017F84B46FFF7F3FD064608B1052810D1FFF753 S315080018085FFF0128FBD08CB90DE003F1FF34E4B281 S31508001818002BDDD14FF001000CE04FF0010009E084 @@ -485,1394 +485,1995 @@ S31508001E186051C4F202010B6C1843086470474FF40A S31508001E286053C4F202031A6C22EA00001864704769 S31508001E3839B14FF46051C4F202014B6C1843486437 S31508001E4870474FF46053C4F202035A6C22EA000042 -S31508001E585864704739B14FF46051C4F202014B6AAD -S31508001E681843486270474FF46053C4F202035A6A2B -S31508001E7822EA00005862704708B54FF400604FF030 -S31508001E880101FFF7E7FF4FF400604FF00001FFF785 -S31508001E98E1FF08BD10B44FF43053C4F201035C687F -S31508001EA8416882681143C26811430268114302698E -S31508001EB80A4324F4FD4424F07F042243007D0243A8 -S31508001EC85A6010BC704700BF48F2A003C4F2252325 -S31508001ED8186070474FF43053C4F20103186070470E -S31508001EE84FF43053C4F20103186800F00300704732 -S31508001EF810B402684FF43053C4F201039A60DC68E0 -S31508001F0824F4FF6121F00704826841681143C26816 -S31508001F181143006901432143D96010BC704700BFCB -S31508001F284FF43053C4F201031869C0B2704700BFB2 -S31508001F3882B04FF00003019342F61441C4F201013E -S31508001F4840180190019A106802B0704710B40268E8 -S31508001F584FF43053C4F201035A6241689962DC6A45 -S31508001F6824F0F704C268816811430269114340697D -S31508001F7801432143D96210BC704700BF4FF4305360 -S31508001F88C4F20103D3F88000704700BF4FF43053FA -S31508001F98C4F20103C3F88000704700BF4FF43053FA -S31508001FA8C4F20103596B08420CBF00200120704790 -S31508001FB84FF43053C4F201039863704730B585B0BF -S31508001FC804460D46038A23F440504FEA00414FEA77 -S31508001FD81143EA8813432382A08920F4B05121F0DB -S31508001FE80C034FEA03424FEA12402989AB8841EAB3 -S31508001FF8030269890A4393B21843A081A28A22F484 -S3150800200840714FEA01434FEA1340AA891043A08258 -S315080020186846FFF77DFE4FF48051C4F201018C42F1 -S3150800202805D04FF4A053C4F201039C4201D103988A -S3150800203800E00298A28911B2002909DA00EB8001AA -S3150800204801EB81002B684FEA4305B0FBF5F208E07F -S3150800205800EB800303EB83002D684FEA8502B0FB8B -S31508002068F2F248F21F51C5F2EB11A1FB02104FEA32 -S3150800207850134FEA03154FF0640103FB1122A08998 -S3150800208803B2002B0DDA4FEAC20202F1320248F215 -S315080020981F51C5F2EB11A1FB0220C0F342132B43D3 -S315080020A80CE04FEA021202F1320248F21F51C5F259 -S315080020B8EB11A1FB0220C0F343132B439BB22381E8 -S315080020C805B030BD29B181898AB242F400538381AB -S315080020D87047838923F400514FEA01424FEA1243B5 -S315080020E8838170474FEAC1514FEAD15282807047BF -S315080020F880884FEAC0514FEAD15070470388194281 -S315080021080CBF00200120704700B589B04FF00003C6 -S3150800211800930193029303930493059306930793F5 -S3150800212846F60030C0F60000694604F03FFB40B9A1 -S31508002138009848B19DF8081081F01002C2F3001003 -S3150800214804E04FF0000001E04FF0000009B000BDC0 -S3150800215846F60030C0F60000704700BF08B540F2E2 -S31508002168F000C2F200004FF0000380F8243246F669 -S315080021782031C0F600014FF00A0203F01BFF38B9F8 -S3150800218840F2F000C2F200004FF0010280F8242263 -S3150800219808BD00BF38B540F2F003C2F2000393F851 -S315080021A82402012805D140F2F000C2F2000004F02A -S315080021B813FA4FF4A054C4F201044FF04005204620 -S315080021C82946FFF79BFF0028F9D046F60030C0F6E7 -S315080021D8000004F013FB38BD08B540F2F003C2F25C -S315080021E8000393F82402012805D140F2F000C2F250 -S315080021F8000004F0F1F908BD70B5064640F2F00390 -S31508002208C2F2000393F82402012812D1304640F29C -S31508002218F001C2F2000104F0A7FB002809DA40F22F -S31508002228F000C2F200004FF0000180F8241204F012 -S31508002238D3F9317891B14FF4A054C4F201044FF0A0 -S3150800224880052046FFF74EFF20462946FFF756FF2A -S315080022580028F9D016F8011F0029F2D170BD00BF71 -S3150800226880B582B072B6FFF729FB4FF020004FF011 -S315080022780101FFF7DDFD4FF004004FF00101FFF7FC -S31508002288B3FD4FF40065C4F2020528464FF006016F -S315080022984FF00802FFF720FD28464FF007014FF0D8 -S315080022A80802FFF719FD4FF000078DF806704FF082 -S315080022B801068DF807604FF002048DF804404FF0C8 -S315080022C8400300938DF8054028466946FFF74EFCFB -S315080022D88DF804404FF08000009028466946FFF7BD -S315080022E845FC20463146FFF77FFD4FF48065C4F26A -S315080022F8020528464FF005014FF00902FFF7ECFCE6 -S3150800230828464FF006014FF00902FFF7E5FC4FF0A3 -S31508002318600100918DF804408DF805408DF8067027 -S315080023288DF8076028466946FFF720FC4FF0C0601D -S315080023383146FFF76BFD00F0D9FE00F0E5FEFCE735 -S3150800234808B546F63030C0F600004FF03D0100F0FB -S3150800235885FE08BD08B500F091FB80B100F030FF96 -S3150800236800F09AFB4EF60853CEF200034FF40042EB -S315080023781A6048F20400C0F600000168884708BDDC -S31508002388F8B5044602F1FF37BFB2F2B100F101030E -S31508002398DF190E1A6FEA0000391801F00105A25D67 -S315080023A804F8012B00F060FFBC420FD1F8BDA05D10 -S315080023B8254605F8010B00F057FFA95D617005F180 -S315080023C8010400F051FFBC42F1D1F8BD002DEED052 -S315080023D8A35D04F8013B00F047FFBC42E7D1F8BD0E -S315080023E808B5FDF714FF08BD10B5044600F03CFF14 -S315080023F847F6FF73C0F600039C4205D94BF6FF70F3 -S31508002408C0F6000084427DD900F02EFF4BF6FF7116 -S31508002418C0F600018C4205D94FF6FF72C0F60002D5 -S31508002428944272D900F020FF4FF6FF73C0F60003F6 -S315080024389C4205D94FF6FF70C0F60100844267D959 -S3150800244800F012FF4FF6FF71C0F601018C4205D95C -S315080024584FF6FF72C0F6030294425CD900F004FFF7 -S315080024684FF6FF73C0F603039C4205D94FF6FF7073 -S31508002478C0F60500844251D900F0F6FE4FF6FF7102 -S31508002488C0F605018C4205D94FF6FF72C0F6070259 -S31508002498944246D900F0E8FE4FF6FF73C0F60703E4 -S315080024A89C4205D94FF6FF70C0F6090084423BD90D -S315080024B800F0DAFE4FF6FF71C0F609018C4205D91D -S315080024C84FF6FF72C0F60B02944230D900F0CCFEE4 -S315080024D84FF6FF73C0F60B039C4205D94FF6FF70FB -S315080024E8C0F60D00844225D900F0BEFE4FF6FF71EE -S315080024F8C0F60D018C4229D9B4F1016F38BF0921FC -S315080025081AD326E04FF0000116E04FF0010113E058 -S315080025184FF0020110E04FF003010DE04FF00401FF -S315080025280AE04FF0050107E04FF0060104E04FF016 -S31508002538070101E04FF0080101EB410346F6EC32CA -S31508002548C0F6000202EB8300007A10BD4FF0FF00C8 -S3150800255810BD4FF0FF0010BD2DE9F0410546006893 -S31508002568FFF742FFFF283BD0FFF73AFA4FF0F30090 -S31508002578FFF756FAFFF75AFA012818BF002404D1BC -S31508002588FFF744FA4FF000042CE02F6804EB07081D -S315080025982B195E6800F068FE40463146FFF78EFA4A -S315080025A8082815D1E059B04215D104F104042F685A -S315080025B804EB07082A19566800F056FE40463146C5 -S315080025C8FFF77CFA082810D002E04FF0010404E06F -S315080025D84FF0000401E04FF00004FFF717FA01E096 -S315080025E84FF000042046BDE8F081E359B342F2D122 -S315080025F804F10404B4F5007FC7D1E6E708B54FEA45 -S31508002608C1534FEAD3525AB903688B420BD040F8E4 -S31508002618041B4FF40072FFF7B3FE4FF0010008BD24 -S315080026284FF0000008BD4FF0010008BD38B5044654 -S315080026380D4640F21833C2F2000398420AD04FF406 -S315080026480040C0F60000814209D02046FFF784FF03 -S3150800265848B911E040F21C54C2F2000403E040F203 -S315080026681834C2F2000420462946FFF7C7FF002897 -S3150800267814BF2046002038BD4FF0000038BD00BF03 -S315080026882DE9F04704460D4616461F464FEA5129D6 -S315080026984FEA49290368B3F1FF3F04D14946FFF7D2 -S315080026A8ADFF00283FD02068484506D02046494651 -S315080026B8FFF7BCFF0446002839D021686D1A65194A -S315080026C805F1040540F2FF1809F5007907F1FF3A04 -S315080026D80AF0010A00F0C8FD04F10402AB1A4345E2 -S315080026E836D92CE000F0C0FD04F10400291A41454A -S315080026F807D920464946FFF799FF0446D8B100F19D -S31508002708040516F8012B05F8012B07F1FF3700F029 -S31508002718ABFD04F10403E81A404542D938E04FF006 -S315080027280100BDE8F0874FF00000BDE8F0874FF0DC -S315080027380000BDE8F0874FF00000BDE8F0872046A6 -S315080027484946FFF773FF04460028F4D000F104054C -S3150800275816F8010B05F8010B013FE0D0BAF1000F96 -S31508002768C0D000F081FD04F104016A1A424508D96F -S3150800277820464946FFF75AFF04460028DBD000F1F1 -S31508002788040516F8013B05F8013B013FAAD1C6E73F -S3150800279820464946FFF74AFF04460028CBD000F1F1 -S315080027A8040516F8011B05F8011B013F9AD1B6E77F -S315080027B84FF0FF3340F21C52C2F20002136040F297 -S315080027C81830C2F200000360704700BF70B50446AF -S315080027D80D461646FFF708FEFF2823D004F1FF30FA -S315080027E84019FFF701FEFF281FD04FEA54224FF47D -S315080027F80043C0F60003B3EB422F09D140F2183064 -S31508002808C2F20000214632462B46FFF739FF70BD53 -S3150800281840F21C50C2F20000214632462B46FFF70A -S315080028282FFF70BD4FF0000070BD4FF0000070BD5F -S315080028382DE9F04106460C46FFF7D6FD054606F192 -S31508002848FF300019FFF7D0FD0446FF2D59D0FF28A1 -S315080028585BD0854249D8012D4BD90B284DD8FFF7AF -S31508002868BFF84FF0F300FFF7DBF8FFF7DFF80128AA -S3150800287805D1FFF7CBF84FF00000BDE8F08146F622 -S31508002888BC36C0F600064FF00207631B03F00108C2 -S3150800289800F0EAFC36F815003946FFF72FF908283C -S315080028A837D008E000F0E0FC36F815003946FFF79F -S315080028B825F9082805D0FFF7A9F84FF00000BDE864 -S315080028C8F08105F1010505F0FF0500F0CDFC36F8A5 -S315080028D815003946FFF712F9082832D0EBE7FFF753 -S315080028E895F84FF00100BDE8F0814FF00000BDE80B -S315080028F8F0814FF00000BDE8F0814FF00000BDE818 -S31508002908F0814FF00000BDE8F0814FF00000BDE807 -S31508002918F08105F10105EDB2AC42E0D34FFA88F132 -S315080029280029BFD000F0A0FC36F815003946FFF795 -S31508002938E5F80828BFD105F10105EDB2AC42B1D2D8 -S31508002948CDE705F10105EDB2AC42ABD2C7E700BF4A -S3150800295800B583B040F21833C2F200031868B0F124 -S31508002968FF3F1ED040F21833C2F2000399685A682E -S315080029788818D96840181A698118586909189A6907 -S315080029888818DB69C118C1F1000002AA42F8040DCB -S3150800299848F28810C0F600004FF00401FFF716FF4A -S315080029A801E04FF0010003B000BD00BF48F2040281 -S315080029B8C0F600024FF40043C0F600031068196811 -S315080029C8421848F20803C0F600031868111848F2B6 -S315080029D80C02C0F600021368C81848F21001C0F6BF -S315080029E800010A68801848F21403C0F6000319683B -S315080029F8421848F21800C0F600000368D11848F2D1 -S31508002A088812C0F6000210680B18D3F1010038BF07 -S31508002A180020704708B540F21833C2F20003186858 -S31508002A28B0F1FF3F06D040F21830C2F20000FFF7B7 -S31508002A3893FD88B140F21C51C2F200010A68B2F14E -S31508002A48FF3F0CD040F21C50C2F20000FFF784FD8D -S31508002A58003018BF012008BD4FF0000008BD4FF030 -S31508002A68010008BD08B5FFF7A3FE08BD08B5FFF7BE -S31508002A78ADFE08BD08B5FFF7DBFE08BD08B5FFF7CC -S31508002A8895FF08BD08B5FFF763FF10B1FFF7C2FF4A -S31508002A9808BD4FF0000008BD4EF21003CEF2000341 -S31508002AA84FF000021A60704708B5FFF7F5FF4EF2B7 -S31508002AB81003CEF2000349F23F02C0F202025A603E -S31508002AC84FF0000098604FF00501196040F2207336 -S31508002AD8C2F20003186008BD4EF21003CEF20003D6 -S31508002AE8186810F4803F07D040F22071C2F200013E -S31508002AF80A6802F101020A60704700BF08B5FFF7C5 -S31508002B08EBFF40F22073C2F20003186808BD00BF45 -S31508002B1810B504464FF4A050C4F201004FF0200146 -S31508002B28FFF7ECFA012809D14FF4A050C4F20100C6 -S31508002B38FFF7DEFA20704FF0010010BD4FF00000D5 -S31508002B4810BD00BF38B504464FF4A050C4F20100C2 -S31508002B584FF08001FFF7D2FAA8B14FF4A050C4F29B -S31508002B6801002146FFF7BEFA4FF4A054C4F2010447 -S31508002B784FF0800520462946FFF7C0FA0028F9D005 -S31508002B884FF0010038BD4FF0000038BD10B584B0CD -S31508002B984FF4614300934FF00000ADF80400ADF818 -S31508002BA80600ADF80800ADF80C004FF00C01ADF8BA -S31508002BB80A104FF4A054C4F2010420466946FFF7E8 -S31508002BC8FDF920464FF00101FFF77CFA04B010BD65 -S31508002BD82DE9F84305460C46402907D946F66440C8 -S31508002BE8C0F600004FF0770100F038FA2046FFF7E4 -S31508002BF8A9FF012807D046F66440C0F600004FF042 -S31508002C087B0100F02BFA264644B346F66447C0F61D -S31508002C1800074FF084084FF0000406F1FF3303F06D -S31508002C28010900F021FB285DFFF78CFF012817D161 -S31508002C381AE000F019FB285DFFF784FF012803D086 -S31508002C483846414600F00AFA04F1010400F00CFB84 -S31508002C58285DFFF777FF012820D123E0BDE8F88330 -S31508002C683846414600F0FAF904F10104012EF5D96F -S31508002C780FFA89F00028DCD000F0F6FA285DFFF78D -S31508002C8861FF012803D03846414600F0E7F904F108 -S31508002C980104A1B2B142CCD3BDE8F883384641460F -S31508002CA800F0DCF904F10104A2B2B242C1D3BDE8CE -S31508002CB8F88300BF10B5044640F26873C2F20003F1 -S31508002CC81878B0B940F22470C2F20000FFF720FF66 -S31508002CD801283CD140F26873C2F200034FF00100A4 -S31508002CE818704FF0000040F26971C2F200010870CE -S31508002CF810BD40F26971C2F200010A7802F10102B8 -S31508002D0840F22473C2F200039818FFF701FF01285E -S31508002D1820D140F26970C2F20000017801F1010180 -S31508002D28CAB2027040F22473C2F2000318789042BD -S31508002D3813D120460A49FFF723FB40F26871C2F20D -S31508002D4800014FF000020A704FF0010010BD4FF065 -S31508002D58000010BD4FF0000010BD4FF0000010BD78 -S31508002D68250700202DE9F84F4FF0000246F6645073 -S31508002D78C0F600004FF4FA714AF2104340F2FF39E0 -S31508002D8812F800C0841864780CEB040808FB0116CE -S31508002D9893FBF6FA06FB1A3636B955460AF1FF3892 -S31508002DA81FFA88F8C84512D902F1020210F802C0BB -S31508002DB8861874780CEB040A0AFB011893FBF8F6D4 -S31508002DC808FB163ABAF1000F40F0A08095E0E346F2 -S31508002DD827464FF4D040C4F200004FF00002426183 -S31508002DE8016841F400430360066816F4004F09D0E9 -S31508002DF84FF4D044C4F2000400F036FA206810F400 -S31508002E08004FF9D14FF4D041C4F200010A6822F004 -S31508002E1802030B600E6846F001000860496811F065 -S31508002E28010F09D14FF4D044C4F2000400F01CFA8B -S31508002E38626812F0010FF9D00BF1FF3307F1FF377B -S31508002E484FEA075747EA034605F1FF3535434FF476 -S31508002E58D040C4F20000C561016821F00102026091 -S31508002E68436813F0010F09D04FF4D044C4F20004A4 -S31508002E7800F0FAF9606810F0010FF9D14FF4C8416B -S31508002E88C4F20001D1F8002242F00103C1F8003269 -S31508002E98D1F81C0220F48042C1F81C22D1F80C3261 -S31508002EA843F48040C1F80C024FF00002C1F8B02282 -S31508002EB8C1F8B422D1F8043223F48040C1F80402D8 -S31508002EC8D1F8142222F48043C1F81432D1F81C022E -S31508002ED840F48042C1F81C22D1F8003223F00100E0 -S31508002EE8C1F80002BDE8F88F46F6E440C0F60000CF -S31508002EF84FF0F00100F0B2F86BE793FBF8F505F12F -S31508002F08FF381FFA88F8C8457FF661AF02F1020252 -S31508002F18242A7FF435AFE7E738B504460D464FF45B -S31508002F28D043C4F20003986810F0806F07D146F6BC -S31508002F38E440C0F600004FF4A27100F08FF84FF491 -S31508002F48D043C4F20003D3F8802102F00101C3F884 -S31508002F588011D3F8800140F07C4242F40011C3F88E -S31508002F688011C3F88451E078A2784FEA024141EA11 -S31508002F78006022781043617840EA0120C3F8880186 -S31508002F88E179A2794FEA024040EA016221790A43C7 -S31508002F98607942EA0022C3F88C21D3F8801141F0FF -S31508002FA80100C3F880019B6813F0806F09D14FF4BC -S31508002FB8D044C4F2000400F057F9A26812F0806FF2 -S31508002FC8F9D038BD4FF4D043C4F20003D96811F0DC -S31508002FD8030F40D04FF4D042C4F20002D2F8B01121 -S31508002FE840F26763B3EB515F2AD14FF4D041C4F27C -S31508002FF80001D1F8B8210270D1F8B8314FEA132286 -S315080030084270D1F8B8314FEA13428270D1F8B83114 -S315080030184FEA1362C270D1F8BC310371D1F8BC21EA -S315080030284FEA12234371D1F8BC214FEA1243837140 -S31508003038D1F8BC114FEA1162C2714FF0010001E0E4 -S315080030484FF000004FF4D043C4F20003D96841F0AA -S315080030582002DA6070474FF00000704708B540F262 -S315080030686C73C2F20003186040F27070C2F2000076 -S31508003078016000F0F9F8FCE708B500F0EFF8012858 -S3150800308820D000F0E1FBE8B140F27473C2F2000305 -S315080030981878012816D1FFF731FD40F27871C2F287 -S315080030A800010A6802F1320290420BD340F27473A7 -S315080030B8C2F200034FF00000187000F0CFFB08B901 -S315080030C8FFF748F908BD00BF08B540F27473C2F2A5 -S315080030D800034FF001021A70FFF710FD40F27871ED -S315080030E8C2F200010860FFF7C7FF08BD08B500F07F -S315080030F8B9F8FFF7D9FCFFF7B5FC00F08DFB00F02F -S315080031080FF8FFF7E1FF08BD08B500F0ADF8FFF7BF -S31508003118E3FC00F0FFFC00F027F8FFF7ADFF08BD59 -S3150800312830B583B04FF0FF038DF804304FF0000533 -S315080031388DF8055000F0B0F8FFF714FE40F21804B1 -S31508003148C2F200044FF001002070FFF71FFD25703A -S3150800315840F27C71C2F200010A78012A02D101A85C -S3150800316800F0BEF803B030BD08B540F28070C2F270 -S315080031780000FFF727FF01280CD140F21803C2F216 -S3150800318800034FF001021A7040F28070C2F2000084 -S3150800319800F0A6F840F28070C2F20000FFF78AFD38 -S315080031A801280CD140F21800C2F200004FF00001C5 -S315080031B8017040F28070C2F2000000F091F808BD74 -S315080031C8704700BF38B505460C4640F21803C2F2E8 -S315080031D800031878012803D12846C9B2FFF79CFED0 -S315080031E840F21801C2F200010A781AB92846E1B273 -S315080031F8FFF7EEFC00F06AF838BD00BF40F2180386 -S31508003208C2F200031878022806D0032807D0012836 -S315080032180CBF0820402070474FF0000070474FF059 -S315080032280000704740F21803C2F200031878022813 -S3150800323806D0032807D001280CBF0820402070476D -S315080032484FF0000070474FF00000704740F27C735B -S31508003258C2F200034FF001021A70704708B500F071 -S315080032682BF808BD704700BF704700BF40F2C0730F -S31508003278C2F200034FF000025A70704740F2C0735A -S31508003288C2F200034FF0FE02DA7018714FF002001E -S31508003298A3F84400704700BF40F2C073C2F20003A7 -S315080032A84FF000021A709A6483F84320A3F8442062 -S315080032B89A705A70704700BF40F2C073C2F2000392 -S315080032C81878003018BF0120704700BF40F2C07355 -S315080032D8C2F200034FF0000283F84320704700BF8C -S315080032E838B504460378FF2B2BD100F0ADFA20B980 -S315080032F84FF01000FFF7C2FFE0E1FFF7B7FF40F213 -S31508003308C074C2F200044FF0010525704FF0FF02A1 -S31508003318E2704FF0100323714FF000006071FFF759 -S315080033286DFFA071FFF77EFFE071FFF77BFF4FEA9D -S31508003338102121726572A5724FF00802A4F844207C -S31508003348BCE140F2C072C2F200021078012840F0CF -S31508003358D681A3F1C903352B00F2AC81DFE813F057 -S315080033680601AA01AA01A501AA01AA0197012D0128 -S315080033787D016701AA01AA01AA01AA01AA01AA014F -S31508003388AA01AA01AA01AA01AA01AA01AA01AA01CF -S31508003398AA01AA01AA01AA01AA01AA01AA01AA01BF -S315080033A8AA01AA01AA01AA01AA01AA01AA01AA01AF -S315080033B8AA01AA018B00590036007D00AA01AA01B4 -S315080033C8AA01C200AA01DC00E100F5006578FFF74A -S315080033D815FF00F1FF30854204DD4FF02200FFF7A4 -S315080033E84DFF6BE140F2C075C2F2000505F1040015 -S315080033F8A96C6278FEF7C4FF4FF0FF01E97062789E -S31508003408AB6CD018A864617801F10101A5F84410DD -S3150800341854E16578FFF7F2FE00F1FF32954204DDC4 -S315080034284FF02200FFF72AFF48E1616840F2C075AD -S31508003438C2F20005A96405F104006278FEF7A0FF48 -S315080034484FF0FF03EB706078A96C4218AA6463789A -S3150800345803F10103A5F8443030E140F2C070C2F226 -S3150800346800004FF0FF01C170636883644FF00102E2 -S31508003478A0F8442022E140F2C070C2F200004FF0E2 -S31508003488FF01C170836C6468C4B1E4186FEA03026B -S31508003498101900F0010213F8011BA34240F030810D -S315080034A80EE01A4612F8010B09185B7853FA81F0F0 -S315080034B8C1B202F10103A342F3D101E04FF00001C2 -S315080034C840F2C073C2F20003C3F807104FF00102B6 -S315080034D81A714FF00001597199714FF00800A3F855 -S315080034E84400EBE040F2C070C2F200004FF0FF0360 -S315080034F8C37046F68852C0F6000282644FF000018F -S315080035080171417181714FF00703C0F807304FF018 -S315080035180802A0F84420D1E04FF00000FFF7AEFEFD -S31508003528CCE040F2C070C2F200004FF0FF01C17053 -S315080035384FF000030371427842718371C3710372B5 -S315080035484FF00601A0F84410B8E040F2C074C2F281 -S3150800355800044FF000012170FFF788FE4FF0FF03C3 -S31508003568E3704FF00102A4F84420A7E040F2C075C2 -S31508003578C2F20005AD6CFFF741FE00F1FF3128469F -S3150800358804F10102FFF772FA20B94FF03100FFF78C -S3150800359875FE93E040F2C074C2F200044FF0FF03D0 -S315080035A8E370A56CFFF72AFE05F1FF352818A06415 -S315080035B84FF00101A4F8441080E06578FFF71EFE75 -S315080035C8A0F10200854204DD4FF02200FFF756FEFF -S315080035D874E040F2C071C2F200014FF0FF02CA70EF -S315080035E84FF00100A1F84400617841B9FFF74AFA9B -S315080035F8002863D14FF03100FFF740FE5EE040F245 -S31508003608C073C2F20003986C04F10202FFF72EFA9F -S3150800361820B94FF03100FFF731FE4FE040F2C07095 -S31508003628C2F200006178826C8B18836446E040F227 -S31508003638C074C2F200044FF0FF05E5704FF00005AC -S3150800364825716571FFF7DAFDA071E5712572657256 -S315080036584FF00703A4F8443030E040F2C072C2F2D3 -S315080036680002906C6168FFF705FA20B94FF031003F -S31508003678FFF704FE22E040F2C071C2F200014FF0E3 -S31508003688FF00C8704FF00103A1F8443016E0FEF7B2 -S31508003698A7FE40F2C070C2F200004FF0FF01C170E9 -S315080036A84FF00102A0F8442008E04FF03100FFF778 -S315080036B8E5FD03E04FF02000FFF7E0FD40F2C07398 -S315080036C8C2F2000393F84300012803D14FF0100013 -S315080036D8FFF7D4FD40F2C071C2F20001B1F84410F8 -S315080036E80AB2002A0BDD40F2C070C2F200004FF0A1 -S315080036F8010380F8433000F10300FFF763FD38BD86 -S31508003708002A3FF4CEAE13F8010B0918C9B2A34232 -S315080037187FF4C7AED4E600BF30B402464CF6CD44B3 -S31508003728CCF6CC4401F10101A4FB0223DA08F9D14D -S315080037384FF0000501F8015902464CF6CD45CCF67E -S31508003748CC450846A5FB02434FEAD30303EB83049B -S31508003758A2EB440202F1300201F801291A46002BAD -S31508003768EFD130BC704700BF38B50546007803F07E -S3150800377875F9C0B2A0F13004E4B2162C20D8A0F12D -S315080037883A02D1B206291ED9092C84BFA0F13704FA -S31508003798E4B2687803F062F9C0B2A0F13003D9B28E -S315080037A8162913D8A0F13A02D3B2062B11D909293A -S315080037B884BFA0F13701C9B201EB0414E0B238BDE1 -S315080037C84FF0000038BD4FF0000038BD4FF000003C -S315080037D838BD4FF0000038BD08B500F00F030928BA -S315080037E802D903F1370008BD03F1300003F036F9B2 -S315080037F8C0B208BD38B505460C464FEA1010FFF7A3 -S31508003808EBFF207005F00F00FFF7E6FF60704FF03A -S315080038180003A370204638BD08B54FF0000040F6EF -S315080038284C03C2F20003187040F65801C2F20001B0 -S3150800383802F0A6FB38B146F69050C0F600004FF0E5 -S315080038487C01FFF70BFC08BD40F64C03C2F20003E7 -S315080038581878D0F1010038BF0020704708B5FFF77F -S31508003868FDFC01280FD040F64C03C2F20003187875 -S3150800387860B9FEF749FC01280BD140F64C01C2F2A3 -S315080038880001087008BD4FF0000008BD4FF00000A1 -S3150800389808BD4FF0000008BD10B50446007803F0CF -S315080038A8DDF853280DD1607803F0D0F860B1607858 -S315080038B831280CD032280DD0332814BF0320022013 -S315080038C810BD4FF0030010BD4FF0030010BD4FF0B8 -S315080038D8000010BD4FF0010010BD00BFF8B5044642 -S315080038E800F10200FFF740FF0646054604F1040406 -S315080038F800F001072046FFF737FF3018C6B205F172 -S31508003908FF318DB204F10204012D21D815E02046B5 -S31508003918FFF72AFF3018C6B205F1FF3504F102048D -S31508003928ADB22046FFF720FF3118CEB205F1FF32B7 -S3150800393895B204F10204012DE9D82046FFF714FFD1 -S315080039486FEA0603DEB2864214BF00200120F8BDDE -S315080039583FB2002FDBD02046FFF706FF3218D6B253 -S3150800396805F1FF339DB204F10204012DCFD8E4E72F -S315080039782DE9F04104461546884601B138B946F698 -S315080039889050C0F6000040F23621FFF767FB204644 -S31508003998FFF782FF0646032800F0B0802046FFF7A7 -S315080039A89DFF002800F0AD80012E34D01EB1022EEE -S315080039B840F0AA8065E004F10200FFF7D5FE074645 -S315080039C804F10400FFF7D0FE4FEA0026C8F80060A5 -S315080039D804F10600FFF7C8FE3118C8F8001004F10C -S315080039E80804A7F10307BFB2002D00F08F800FFA6D -S315080039F887F8B8F1000F40F389804FF00006204693 -S31508003A08FFF7B2FEA85504F1020406F10106B6B29C -S31508003A184645F4DB7AE004F10200FFF7A5FE0746FF -S31508003A2804F10400FFF7A0FE4FEA0046C8F8006054 -S31508003A3804F10600FFF798FE06EB0026C8F80060B2 -S31508003A4804F10800FFF790FE3218C8F8002004F1C0 -S31508003A580A04A7F10407BFB2002D57D00FFA87F852 -S31508003A68B8F1000F52DD4FF000062046FFF77CFE3E -S31508003A78A85504F1020406F10106B6B24645F4DB78 -S31508003A8844E004F10200FFF76FFE074604F104005C -S31508003A98FFF76AFE4FEA0066C8F8006004F10600F8 -S31508003AA8FFF762FE06EB0046C8F8006004F1080056 -S31508003AB8FFF75AFE06EB0026C8F8006004F10A006C -S31508003AC8FFF752FE3018C8F8000004F10C04A7F1F5 -S31508003AD80507BFB2D5B10FFA87F8B8F1000F15DD9B -S31508003AE84FF000062046FFF73FFEA85504F10204EA -S31508003AF806F10106B6B24645F4DB07E04FF00007C3 -S31508003B0804E04FF6FF7701E04FF0000738B2BDE84A -S31508003B18F08100BF70B540F64C03C2F2000318786E -S31508003B28002800F04D82012843D1FEF717FB46F618 -S31508003B380460C0F60000FEF75FFB46F62860C0F68C -S31508003B480000FEF759FBFEF703FB0146C6484FF08F -S31508003B58010202F02FFA50B146F65060C0F600008E -S31508003B68FEF74AFB4FF00100FEF736FB70BD46F636 -S31508003B785860C0F60000FEF73FFB46F66060C0F6E0 -S31508003B880000FEF739FB46F68460C0F60000FEF72B -S31508003B9833FB40F65003C2F200034FF000021A60E6 -S31508003BA85A6040F64C00C2F200004FF0020101705C -S31508003BB870BD022840F0088140F65804C2F2000495 -S31508003BC840F6B040C2F200004FF4807104F50D7259 -S31508003BD802F07EFE94F93A12002915DA46F6506084 -S31508003BE8C0F60000FEF708FB4FF00200FEF7F4FAED -S31508003BF804F50D7002F0F0FC40F64C00C2F2000025 -S31508003C084FF00001017070BD18B340F6B046C2F215 -S31508003C180006304606F5C0714FF00002FFF7A8FE09 -S31508003C280646B0F1FF3F14D146F65060C0F60000CC -S31508003C38FEF7E2FA4FF00300FEF7CEFA8A4802F0DA -S31508003C48CBFC40F64C03C2F200034FF000021A7090 -S31508003C5870BD32B2002A2CDD40F65003C2F20003CA -S31508003C68586868B940F65001C2F2000140F6B043F8 -S31508003C78C2F20003D3F88001086036B24E6018E035 -S31508003C8840F6B041C2F20001D1F8802140F650034F -S31508003C98C2F2000319688A4204D240F65003C2F2F7 -S31508003CA800031A6000FA86F040F65002C2F20002D3 -S31508003CB8506040F65801C2F20001D1F83C22D1F80A -S31508003CC840329A4240F07C8167484FF0000102F082 -S31508003CD88FFCA0B146F65060C0F60000FEF78CFAD5 -S31508003CE84FF00400FEF778FA5F4802F075FC40F6D4 -S31508003CF84C00C2F200004FF00001017070BD46F694 -S31508003D085860C0F60000FEF777FA46F6B460C0F6C3 -S31508003D180000FEF771FA40F65004C2F2000440F6B5 -S31508003D280C05C2F2000560682946FFF7F5FC284627 -S31508003D38FEF762FA46F6C060C0F60000FEF75CFABF -S31508003D48E0782946FFF756FDA07805F10201FFF746 -S31508003D5851FD607805F10401FFF74CFD207805F15F -S31508003D680601FFF747FD2846FEF746FA46F6647049 -S31508003D78C0F60000FEF740FA20686168FEF77AFE8A -S31508003D88A0B946F65060C0F60000FEF735FA4FF0BF -S31508003D980500FEF721FA344802F01EFC40F64C03EB -S31508003DA8C2F200034FF000021A7070BD46F658605A -S31508003DB8C0F60000FEF720FA40F64C00C2F20000F2 -S31508003DC84FF00301017070BD032840F0F98040F6F2 -S31508003DD85804C2F2000440F6B040C2F200004FF49C -S31508003DE8807104F50D7202F073FD94F93A120029F0 -S31508003DF815DA46F6DC60C0F60000FEF7FDF94FF066 -S31508003E080200FEF7E9F904F50D7002F0E5FB40F645 -S31508003E184C03C2F200034FF00000187070BD28B3B7 -S31508003E2840F6B042C2F20002104602F5C07102F529 -S31508003E388072FFF79DFD0546B0F1FF3F16D146F69D -S31508003E480070C0F60000FEF7D7F94FF00300FEF73A -S31508003E58C3F9054802F0C0FB40F64C01C2F200015E -S31508003E684FF000020A7070BD8C0A00202BB2002B96 -S31508003E785EDD46F62470C0F60000FEF7BDF92EB2E0 -S31508003E8840F60C04C2F2000430462146FFF744FC0B -S31508003E982046FEF7B1F946F63470C0F60000FEF77C -S31508003EA8ABF940F6B045C2F2000595F883012146FC -S31508003EB8FFF7A0FC95F8820104F10201FFF79AFCC6 -S31508003EC895F8810104F10401FFF794FC95F880013F -S31508003ED804F10601FFF78EFC2046FEF78DF946F633 -S31508003EE86470C0F60000FEF787F9D5F880013146F8 -S31508003EF805F58072FEF7BAFDA0B946F65060C0F619 -S31508003F080000FEF779F94FF00600FEF765F92D4827 -S31508003F1802F062FB40F64C03C2F200034FF00000C1 -S31508003F28187070BD46F65860C0F60000FEF764F9CA -S31508003F3840F65800C2F20000D0F83C12D0F84022E9 -S31508003F4891423DD146F64C70C0F60000FEF754F98A -S31508003F58FEF798FDA0B946F65060C0F60000FEF7D1 -S31508003F684BF94FF00700FEF737F9164802F034FB0D -S31508003F7840F64C01C2F200014FF000020A7070BD0B -S31508003F8846F65860C0F60000FEF736F946F6687039 -S31508003F98C0F60000FEF730F90A4802F01DFB46F69F -S31508003FA88070C0F60000FEF727F940F64C03C2F207 -S31508003FB800034FF000001870FEF7ECF8FEF7CAF990 -S31508003FC870BD00BF8C0A002010B4E2B182186FEAEF -S31508003FD80004131903F0010401F1FF3111F8013F38 -S31508003FE800F8013B904210D10DE001F1010449782F -S31508003FF8034603F8011B04F101016478447003F1D0 -S3150800400801009042F1D110BC7047002CEDD011F890 -S31508004018013F00F8013B9042E7D1F4E792B18218D4 -S315080040286FEA0003D31803F0010300F8011B904256 -S3150800403809D17047034603F8011B417003F10100D3 -S315080040489042F7D17047002BF4D000F8011B904234 -S31508004058F0D17047037833B18B4204D010F8013F8A -S315080040680BB18B42FAD11846704700BFCA7E8B7EC1 -S3150800407843EA02230078032805D1487D097D41EAE9 -S31508004088002243EA02431846704700BF8176C1F307 -S315080040980723C3764FEA114101754FEA1122427583 -S315080040A8704700BF03784FEAC31242EA53014378C0 -S315080040B8CA18D1B24FEAC11343EA5101827852FAB3 -S315080040C881F3D9B24FEAC11242EA5103C17851FACB -S315080040D883F2D3B24FEAC31141EA5303027952FA7B -S315080040E883F1CBB24FEAC31242EA5301437953FA32 -S315080040F881F2D1B24FEAC11343EA5101827952FAE1 -S3150800410881F3D9B24FEAC11242EA5103C17951FA89 -S3150800411883F2D3B24FEAC31141EA5303027A52FA39 -S3150800412883F1CBB24FEAC31242EA5301437A53FAF0 -S3150800413881F2D1B24FEAC11343EA5101807A50FAA3 -S3150800414881F2D0B2704700BF08B5024688B1036845 -S3150800415893B1197899B1D8889288904212D158782B -S31508004168FDF7DAFA00F00103002B14BF032000203C -S3150800417808BD4FF0090008BD4FF0090008BD4FF00B -S31508004188090008BD4FF0090008BD00BF10B5044670 -S315080041980A46407804F134014FF00103FDF7D6FAD0 -S315080041A800283ED194F8332294F8323243EA0220A2 -S315080041B801B24AF65522CFF6FF72914234D194F8E5 -S315080041C86D0094F86C304FEA034141EA006294F8AE -S315080041D86A0042EA000394F86B1043EA012222F0C7 -S315080041E87F4044F24613C0F2540398421FD094F80D -S315080041F8891094F888204FEA024040EA016194F849 -S31508004208863041EA030294F8870042EA002121F041 -S315080042187F4244F24613C0F25403D01A18BF01204D -S3150800422810BD4FF0030010BD4FF0020010BD4FF04F -S31508004238000010BD2DE9F041154603681C78A4F165 -S315080042483004092C00F2E5815A783A2A40F0E181CF -S3150800425803F1020303604FF000030B60002C40F0E3 -S315080042688C8141F23804C2F200042468002C00F05C -S3150800427888810C60217889B16078FDF74DFA10F0CD -S31508004288010F0BD1002D00F0808100F00401C8B29F -S31508004298002814BF0A200020BDE8F0814FF000006E -S315080042A820706070FDF71AFA10F0010F40F071815E -S315080042B82DB100F00402D0B2002840F06E812046E5 -S315080042C84FF00001FFF762FF012819D194F8F6317B -S315080042D8002B00F0668194F8FD5194F8FC114FEA1A -S315080042E8014242EA056094F8FA3140EA030194F873 -S315080042F8FB5141EA052520462946FFF747FF01E015 -S315080043084FF00005032800F05081002840F051813D -S3150800431894F8402094F83F0040EA022319B2B1F510 -S31508004328007F40F04A8194F84B2094F84A0050EAF6 -S3150800433802210FD194F85B1094F85A304FEA0342D9 -S3150800434842EA016094F8581040EA010394F85920A3 -S3150800435843EA0221E16194F84420E27002F1FF3051 -S31508004368C3B2012B00F22D8194F84130A370002BBB -S3150800437800F02B8103F1FF30184240F02A8194F8A7 -S31508004388466094F8450040EA0626B0B2208116F041 -S315080043980F0F40F0228194F8487094F8476056EA5F -S315080043A807260ED194F8577094F856604FEA0646D1 -S315080043B846EA076794F854603E4394F8557046EA07 -S315080043C8072694F843C094F8427057EA0C2700F079 -S315080043D8088102FB01FC07EB101262449642C0F002 -S315080043E80481B61AB6FBF3F3002B00F0028140F6F7 -S315080043F8F576B3428CBF022601264FF6F578434573 -S3150800440800F20B8103F10203A3612562EF196762C3 -S315080044185219E262032E15D1002840F0EE8094F86E -S31508004428630094F862204FEA024242EA006094F870 -S315080044386020024394F8610042EA0022A2624FEA29 -S31508004448830011E0002800F0DC806744A762022E8A -S3150800445802D14FEA430007E04FF0030000FB03F2DE -S3150800446803F0010303EB520000F2FF13B1EB532FDD -S31508004478C0F0CB804FF0FF3121614FF00000E060BB -S31508004488032E6CD1607194F8652094F8643043EA79 -S3150800449802216A186261607804F134014FF0010359 -S315080044A8FDF754F900285AD194F8330294F83222C1 -S315080044B842EA002319B24AF65520CFF6FF70814220 -S315080044C84DD194F8372094F836304FEA034141EA3B -S315080044D8026094F8342040EA020394F8351043EA57 -S315080044E8012045F25222C4F26112904237D194F85B -S315080044F81B1294F81A324FEA034040EA016294F80C -S31508004508181242EA010394F8190243EA002247F20C -S315080045187221C6F241118A4221D194F8230294F8ED -S3150800452822324FEA034242EA006194F8200241EA3D -S31508004538000394F8212243EA0221E16094F81F0255 -S3150800454894F81E324FEA034242EA006194F81C02C4 -S3150800455841EA000394F81D2243EA022121612670E4 -S315080045683348038803F101039AB20280E2804FF0C8 -S31508004578000020632071BDE8F0814FF00B00BDE80C -S31508004588F0814FF00C00BDE8F0814FF00000BDE85F -S31508004598F0814FF00300BDE8F0814FF00A00BDE84E -S315080045A8F0814FF00D00BDE8F0814FF00100BDE83D -S315080045B8F0814FF00D00BDE8F0814FF00D00BDE821 -S315080045C8F0814FF00D00BDE8F0814FF00D00BDE811 -S315080045D8F0814FF00D00BDE8F0814FF00D00BDE801 -S315080045E8F0814FF00D00BDE8F0814FF00D00BDE8F1 -S315080045F8F0814FF00D00BDE8F0814FF00D00BDE8E1 -S31508004608F0814FF00D00BDE8F0814FF00D00BDE8D0 -S31508004618F0814FF00000086023E603F10203A36166 -S315080046282562EF1967625619E6624FF00306F3E644 -S31508004638341000202DE9F0410C4601F109020369FE -S31508004648002B00F0E28043691E7B1978202900F0C8 -S315080046588A80052914BF0A46E52206F0080505F0EA -S31508004668FF0135B1A2F14105EDB2192D9CBF2032E3 -S31508004678D2B2627204F10A025D78202D73D0052D34 -S3150800468808BFE52531B1A5F14102D2B2192A9CBF66 -S315080046982035EDB2A57204F10B029D78202D62D063 -S315080046A8052D08BFE52531B1A5F14102D2B2192A6F -S315080046B89CBF2035EDB2E57204F10C02DD78202D99 -S315080046C851D0052D08BFE52531B1A5F14102D2B271 -S315080046D8192A9CBF2035EDB2257304F10D021D7900 -S315080046E8202D40D0052D08BFE52531B1A5F1410299 -S315080046F8D2B2192A9CBF2035EDB2657304F10E02B1 -S315080047085D79202D2FD0052D08BFE52531B1A5F1F6 -S315080047184102D2B2192A9CBF2035EDB2A57304F11D -S315080047280F029D79202D1ED0052D08BFE52531B12C -S31508004738A5F14102D2B2192A9CBF2035EDB2E5731C -S3150800474804F11002DD79202D0DD0052D08BFE525C9 -S3150800475831B1A5F14101CAB2192A9CBF2035EDB27B -S31508004768257404F111021D7A202D36D015464FF00E -S315080047782E0105F8011B197A20292DD006F01006F6 -S3150800478806F0FF0536B1A1F14106F6B2192E9CBF0F -S315080047982031C9B2517002F10206597A20290DD082 -S315080047A835B1A1F14106F6B2192E9CBF2031C9B21E -S315080047B8917002F10306997A202901D132460CE054 -S315080047C835B1A1F14105EEB2192E9CBF2031C9B207 -S315080047D8D17002F1040200E02A46D97A2172DD7FF7 -S315080047E89E7F4FEA064141EA05661D7F2E43597F9B -S315080047F846EA012626605D7E197E41EA0526A680D8 -S31508004808D97D9B7D43EA0126E6804FF000011170A9 -S31508004818A6698EB3E2697AB30569E5B1018C4FF6E4 -S31508004828FF7399421AD0C7693888D0B14FF0000586 -S31508004838A846414602F0B4F80146A8B1E06900F175 -S31508004848FF32AA4213D9715505F1010537F8020F47 -S315080048580028EED10DE04FF000050AE04FF00005FC -S3150800486807E04FF0000504E04FF0000501E04FF0BF -S3150800487800054FF000037355BDE8F0812DE9F843AC -S3150800488804460379002B40D0076B00F134054078BD -S3150800489829463A464FF00103FCF792FF002838D11B -S315080048A84FF000002071616A8F4236D3E2698B188F -S315080048B89F4236D2E678012E37D94FF0010806EA24 -S315080048C80809BF18607829463A464346FCF778FF30 -S315080048D806F1FF3646452CD113E0E269BF18607821 -S315080048E829463A464346FCF76BFFE369FF186078A2 -S315080048F829463A464346FCF763FFA6F10206012E07 -S31508004908EBD14FF00000BDE8F8834FF00000BDE892 -S31508004918F8834FF00100BDE8F8834FF00000BDE8C2 -S31508004928F8834FF00000BDE8F8834FF00000BDE8B3 -S31508004938F883B9F1000FD0D0E1697F186078294665 -S315080049483A464346FCF73CFF06F1FF36012EC4D12A -S31508004958D7E700BF38B504460D46036B8B420DD022 -S31508004968FFF78CFF68B9607804F134012A464FF0DE -S315080049780103FCF7EBFE38B9256338BD4FF0000094 -S3150800498838BD4FF0010038BD4FF0010038BD00BFF3 -S3150800499870B50446FFF772FF034600285FD12378EF -S315080049A8032B53D16079002850D04FF000052563B2 -S315080049B804F13406304629464FF40072FFF72EFBF9 -S315080049C84FF0550184F832124FF0AA0284F83322C0 -S315080049D84FF0520384F8343084F835304FF06100CC -S315080049E884F836004FF0410284F837204FF07201F8 -S315080049F884F8181284F8191284F81A2284F81B0203 -S31508004A08236984F81C32C3F3072084F81D024FEA89 -S31508004A18134284F81E224FEA136184F81F12E368CA -S31508004A2884F82032C3F3072084F821024FEA134298 -S31508004A3884F822224FEA136184F8231260783146F3 -S31508004A4862694FF00103FCF7BBFE657160784FF0A9 -S31508004A5800010A46FCF7F2FE031C18BF0123184694 -S31508004A6870BD00BFA1F102018369A3F1020399424F -S31508004A7804D28278C06A02FB010070474FF0000032 -S31508004A88704700BFF8B505460C4601296DD98369F4 -S31508004A9899426DD20078022832D0032845D00128D9 -S31508004AA869D101EB5106696A284601EB5621FFF7D9 -S31508004AB851FF002862D14FEAC6524FEAD257EB197E -S31508004AC893F8347006F10106696A284601EB5621FF -S31508004AD8FFF740FF002854D14FEAC6564FEAD65684 -S31508004AE8AD1995F8340047EA002214F0010F02D0F0 -S31508004AF84FEA1210F8BD4FEA02534FEA1350F8BDB1 -S31508004B086A6A284602EB1121FFF724FF00283BD1E1 -S31508004B184FEA04644FEAD4502B1893F834102C182B -S31508004B2894F8352041EA0220F8BD696A284601EB5F -S31508004B38D411FFF70FFF002829D14FEA44644FEA3A -S31508004B48D4516B1893F8360093F837204FEA026465 -S31508004B5844EA004293F8353042EA03206C1894F880 -S31508004B683410084320F07040F8BD4FF00100F8BD36 -S31508004B784FF00100F8BD4FF0FF30F8BD4FF0FF3099 -S31508004B88F8BD4FF0FF30F8BD4FF0FF30F8BD4FF0D5 -S31508004B98FF30F8BD70B504460D46E18081680129E5 -S31508004BA83CD003689A6991423BD279B918780328A8 -S31508004BB801D1996A51B94FF00000E0601A89AA42F2 -S31508004BC832D99B6A03EB151121611CE09E784FEADE -S31508004BD80616B54210D32068FFF754FF0146B0F110 -S31508004BE8FF3F24D0012825D923689A69904224D200 -S31508004BF8AD1BADB2AE42EED9E1602068FFF732FFD1 -S31508004C0800EB1511216105F00F05206800EB451228 -S31508004C1802F1340262614FF0000070BD4FF00200E5 -S31508004C2870BD4FF0020070BD4FF0020070BD4FF026 -S31508004C38010070BD4FF0020070BD4FF0020070BD54 -S31508004C48F8B505460C461646012940F28C80836954 -S31508004C58994280F08B800078022845D0032858D0DE -S31508004C6801287AD101EB5107696A284601EB5721D1 -S31508004C78FFF770FE0346002871D14FEAC7524FEA7C -S31508004C88D25314F0010409D0E91891F8342002F037 -S31508004C980F00F1B240EA0112D0B200E0F0B2EB1808 -S31508004CA883F8340007F101074FF001002871696A93 -S31508004CB8284601EB5721FFF74DFE034600284ED13B -S31508004CC84FEAC7574FEAD75014B1C6F3071607E095 -S31508004CD82A1892F8341021F00F07C6F303263E4324 -S31508004CE82F1887F834603AE06B6A284603EB1121D7 -S31508004CF8FFF730FE034690BB4FEA04644FEAD452E6 -S31508004D08A91881F834600C46C6F3072681F8356079 -S31508004D1825E06B6A284603EBD111FFF71BFE03460D -S31508004D28E8B94FEA44644FEAD4502A1892F837107B -S31508004D384FEA01612C1801F07040064384F8346084 -S31508004D48C6F3072182F835104FEA164082F836006E -S31508004D584FEA166682F8376001E04FF002034FF013 -S31508004D680100287104E04FF0020301E04FF0020346 -S31508004D781846F8BD2DE9F0410546884631B9C66892 -S31508004D8876B183699E4228BF01260BE0FFF77AFEB3 -S31508004D980346012845D9AA6990424CD3464601E0FC -S31508004DA84FF0010634464FF0020704F10104A869DA -S31508004DB8844202D3012E37D93C4628462146FFF7B6 -S31508004DC861FE034638B1B0F1FF3F34D0012832D02E -S31508004DD8B442EAD12BE02646284621466FF07042AF -S31508004DE8FFF72EFF0146B0B9B8F1000F06D02846DE -S31508004DF841462246FFF724FF014660B9EE602A6954 -S31508004E08B2F1FF3F16D002F1FF3028614FF00101D9 -S31508004E18697123460FE0012914BF01234FF0FF33B8 -S31508004E2809E04FF0010306E04FF0000303E04FF0F6 -S31508004E38000300E023461846BDE8F0812DE9F8434B -S31508004E4804460E46C58805F10105ADB2002D70D099 -S31508004E580369002B71D015F00F075FD103F1010321 -S31508004E680361C16821B903681989A94269D955E056 -S31508004E780068827802F1FF3313EA15134ED1FFF75B -S31508004E8801FE8046012860D9B0F1FF3F61D020684D -S31508004E98816988453BD3002E5FD0E168FFF76AFF32 -S31508004EA8804600285DD001285FD0B0F1FF3F60D06A -S31508004EB82068FFF7E3FC00285FD1206800F134007A -S31508004EC84FF000014FF40072FFF7A8F8266830463D -S31508004ED84146FFF7C7FD30634FF000064FF001095A -S31508004EE80EE080F804902068FFF7C8FC002848D12F -S31508004EF82068026B02F10102026306F10106F6B2A6 -S31508004F0820688278B242ECD8036B991B0163C4F80F -S31508004F180C8020684146FFF7A5FD2061E5802068DA -S31508004F2800EB471202F1340262614FF00000BDE857 -S31508004F38F8834FF00400BDE8F8834FF00400BDE895 -S31508004F48F8834FF00400BDE8F8834FF00200BDE887 -S31508004F58F8834FF00100BDE8F8834FF00400BDE878 -S31508004F68F8834FF00700BDE8F8834FF00200BDE864 -S31508004F78F8834FF00100BDE8F8834FF00100BDE85B -S31508004F88F8834FF00100BDE8F88300BF2DE9F04F1C -S31508004F9883B004464FF00001FFF7FCFD07460028DA -S31508004FA840F02C824FF0FF0BD846DA464FF000093E -S31508004FB820682169FFF7CEFC0746002840F01E82C4 -S31508004FC865692E78002E00F00B82EB7A03F03F0213 -S31508004FD8E52E00F0E18103F00800C1B219B10F2AE5 -S31508004FE840F0DC8102E00F2A40F09881E769002F3B -S31508004FF800F0ED8106F04003DAB232B195F80DB04B -S3150800500806F0BF06E188218404E0B04518BFD046FB -S3150800501840F0DD81687B0090584540F0C1812B78C7 -S3150800502823F0400202F1FF3101EB410001EB800356 -S315080050380193AA78697841EA022001F0EDFC8046D6 -S315080050480198FE2800F2D68100F1010B37F8100006 -S3150800505801F0E2FC804540F0CD812A79EB7843EAF5 -S315080050680220B8F1000F04D14FF6FF71884211D01B -S31508005078C0E101F0D1FC8046BBF1FE0F00F2BA810F -S3150800508837F81B00019A02F1020B01F0C5FC8045AE -S3150800509840F0B081A8796B7943EA0020B8F1000F8F -S315080050A804D14FF6FF71884210D0A3E101F0B4FC91 -S315080050B88046BBF1FE0F00F29D8137F81B000BF105 -S315080050C8010B01F0A9FC804540F094812A7AE87919 -S315080050D840EA0220B8F1000F04D14FF6FF73984250 -S315080050E810D087E101F098FC8046BBF1FE0F00F26C -S315080050F8818137F81B000BF1010B01F08DFC804507 -S3150800510840F07881A97A6A7A42EA0120B8F1000F54 -S3150800511804D14FF6FF73984210D06BE101F07CFC7E -S315080051288046BBF1FE0F00F2658137F81B000BF1CC -S31508005138010B01F071FC804540F05C81E87BA97B96 -S3150800514841EA0020B8F1000F04D14FF6FF729042E9 -S3150800515810D04FE101F060FC8046BBF1FE0F00F26B -S31508005168498137F81B000BF1010B01F055FC804506 -S3150800517840F04081687C2B7C43EA0020B8F1000F98 -S3150800518804D14FF6FF71884210D033E101F044FC90 -S315080051988046BBF1FE0F00F22D8137F81B000BF194 -S315080051A8010B01F039FC804540F02481EA7CA87C93 -S315080051B840EA0220B8F1000F04D14FF6FF7398426F -S315080051C810D017E101F028FC8046BBF1FE0F00F26B -S315080051D8118137F81B000BF1010B01F01DFC804506 -S315080051E840F00881697D2A7D42EA0120B8F1000F5E -S315080051F804D14FF6FF73984210D0FBE001F00CFC7F -S315080052088046BBF1FE0F00F2F58037F81B000BF15C -S31508005218010B01F001FC804540F0EC80E87DA97D92 -S3150800522841EA0020B8F1000F04D14FF6FF72904208 -S3150800523810D0DFE001F0F0FB8046BBF1FE0F00F26C -S31508005248D98037F81B000BF1010B01F0E5FB804507 -S3150800525840F0D080687E2B7E43EA0020B8F1000F24 -S3150800526804D14FF6FF71884210D0C3E001F0D4FB91 -S315080052788046BBF1FE0F00F2BD8037F81B000BF124 -S31508005288010B01F0C9FB804540F0B4806A7F287F8E -S3150800529840EA0220B8F1000F04D14FF6FF7398428E -S315080052A810D0A7E001F0B8FB8046BBF1FE0F00F26C -S315080052B8A18037F81B000BF1010B01F0ADFB804507 -S315080052C840F09880E97FAA7F42EA0120B8F1000FEA -S315080052D810D001F0A1FB8046BBF1FE0F00F28A80D0 -S315080052E80BF10100019037F81B0001F095FB80458A -S315080052F805D07FE04FF6FF77B84274D07AE02B786E -S3150800530803F04001CAB2002A6DD0B8F1000F6AD07E -S31508005318019837F81070002F65D06BE0B8F1000FC8 -S3150800532804D12846FEF7BEFE584567D04FF0FF332E -S315080053382384A069C27A12F0010F33D12978037839 -S31508005348994231D16978427891422FD1AB788178E0 -S315080053588B422DD1EB78C27893422BD129790379E0 -S31508005368994229D169794279914227D1AB798179CC -S315080053788B4225D1EB79C279934223D1297A037ACC -S31508005388994221D1697A427A91421FD1A97A807ABB -S31508005398814233D0D0461AE0D04618E0D04616E007 -S315080053A8D04614E0D04612E0D04610E0D0460EE0CB -S315080053B8D0460CE0D0460AE0D04608E0D04606E0DB -S315080053C8D04604E0D04602E0D04600E0D046204663 -S315080053D84946FFF733FD074600283FF4E9AD0DE0D7 -S315080053E84FF004070AE006F1FF365FFA86F8DDF89B -S315080053F800B0ECE7DDF800B0D046E8E7384603B079 -S31508005408BDE8F08F2DE9F04F87B001908B460B78F1 -S315080054182F2B01D05C2B01D10BF1010B4FF00000AB -S31508005428019988609BF800201F2A0AD808464FF079 -S315080054380001FFF7AFFB02464FF0000301994B61E5 -S3150800544898E146F6AC74C0F60004039446F6B876B6 -S31508005458C0F60006049646F6C073C0F60003059320 -S315080054685E461BF8010B2F28FAD05C28F8D001995C -S31508005478CA69029230781F2840F256812F2800F010 -S3150800548845815C2800F047811746A7F1020735468B -S315080054984FF00104A34613E02F2B00F040815C2B44 -S315080054A800F03D81B2F5807F00F059819246144696 -S315080054B8594601F075FA8046002840F08D814EE17C -S315080054C8594601F06DFA8046002800F048817F2881 -S315080054D806D803984146FEF7BDFD002840F03F81EF -S315080054E807F10209A7F8028015F8013F184604F1E2 -S315080054F801021F2BD0D81BE1002C00F0308104F1E3 -S31508005508FF3000F00101029B03EB440232F8020D5A -S31508005518202840F0478148E132F8023D202B01D087 -S315080055282E2B08D104F1FF30041E32F8021D20295B -S3150800553840F04B814CE12746002C00F01081029A76 -S3150800554802EB44084FF0000522F81450019B9869AD -S315080055584FF020014FF00B02FEF760FD029AA2F108 -S31508005568020201E005F1010532F8020F2028F9D0F8 -S315080055782E28F7D0002D00F0E08046F00306DCE080 -S3150800558804F1FF30044628B94FF008094FF000081F -S31508005598C24607E0A8F1020737F8021C2E2940F090 -S315080055A8F780F1E7029B33F8157005F10105002F1E -S315080055B85AD0202F04D02E2F05D1AC4200F0D28025 -S315080055C846F00306EEE7C84502D2AC4217D1C1E059 -S315080055D8B9F10B0F03D146F00306504647E0AC4233 -S315080055E803D046F00306A54240D84FEA8A0A5FFA6E -S315080055F88AFA25464FF00B094FF00808D2E77F2F9D -S315080056080FD938464FF0000101F0CAF907460028B5 -S3150800561800F0AD800598C11911F8807C46F002069D -S3150800562827B104983946FEF715FD20B146F003065A -S315080056384FF05F0711E0A7F1410293B2192B02D880 -S315080056484AF0020A09E0A7F1610081B2192904D8CB -S315080056584AF0010AA7F12007BFB2019A936903F82D -S31508005668087008F101089DE7504600E05046019980 -S315080056788B691A78E52A04BF05221A70B9F1080F4A -S3150800568804BF80005FFA80FA0AF00C000C2803D0E1 -S315080056980AF00301032901D146F0020606F00203BF -S315080056A8DAB252B90AF0030ABAF1010F08BF46F08E -S315080056B81006042808BF46F0080601988169CE72C4 -S315080056C8FFF764FC019B9A69D37A024640B104281D -S315080056D850D103F00403D8B2002808BF052249E0D0 -S315080056E803F00400C1B2002944D1019A5169CB7A62 -S315080056F803F01000C2B232B1019C2068FEF7B6FC6E -S31508005708019EB060ACE64FF0050233E04FF00004A6 -S315080057184FF0010203E04FF000044FF0010206EBD8 -S31508005728020B4FF00006E7E64FF000044FF00102BF -S3150800573806EB020B4FF00406DEE607F1FF3702997F -S3150800574831F817202E2A3FF41FAF14F0010F7FF403 -S3150800575817AF13E0B9F10B0F7FF447AF3BE74FF0EC -S31508005768060207E0B9F10B0F7FF43FAF33E746F0BF -S3150800577802065BE7104607B0BDE8F08F04F1FF3470 -S31508005788A8F1020838F8023C2E2B7FF4F9AEFBE69E -S3150800579800F1FF34A7F1020838F8022C2E2A7FF404 -S315080057A8EFAEF1E62E287FF4C6AE013CD7D0002925 -S315080057B83FF4B2AE32F8021D202902D02E297FF412 -S315080057C8BAAE013C7FF4A8AEC9E72E297FF4B3AE7A -S315080057D8441E7FF4A1AEC2E77F2805D80398414640 -S315080057E8FEF738FC0028BAD109F10207A9F80280A1 -S315080057F815F8011F084604F101021F2998D92F290F -S315080058088DD05C298BD00AF1010459E62DE9F041BF -S315080058180446C588018C4FF6FF73994208BF294686 -S31508005828FFF7B8F90346E0B94FF0E5074FF0010668 -S315080058384FF0000820682169FFF78CF8034668B915 -S315080058486269177020680671E188A94209D220465C -S315080058584146FFF7F3FA03460028EBD0042B08BFA6 -S3150800586802231846BDE8F0812DE9F84F0446894613 -S315080058784FF0FF0A56464FF00405D0464FF000078A -S315080058884FF6FF7B3AE12068FFF764F805460028DB -S3150800589840F0398160690378002B00F04081C27AAC -S315080058A8E52B00F01E812E2B00F01D8102F03F0229 -S315080058B8082A14BF00210121494540F016810F2AFC -S315080058C840F0068103F04001CDB235B190F80DA03D -S315080058D803F0BF03E688268404E09E4218BF4646BE -S315080058E840F00681417B514540F00181E66902781E -S315080058F802F03F0505F1FF3202EB420E02EB8E0E6F -S315080059088578427842EA0525BEF1FE0F00F2048141 -S3150800591826F81E500EF1010290F804A090F803C06C -S315080059284CEA0A2A15B9DA4508D0F5E0FE2A00F243 -S31508005938F38026F812A00EF10202554690F806C022 -S3150800594890F805E04EEA0C2A15B9DA4508D0E3E0DE -S31508005958FE2A00F2E18026F812A002F10102554655 -S3150800596890F808C090F807E04EEA0C2A15B9DA4507 -S3150800597808D0D1E0FE2A00F2CF8026F812A002F15C -S315080059880102554690F80AC090F809E04EEA0C2A32 -S3150800599815B9DA4508D0BFE0FE2A00F2BD8026F818 -S315080059A812A002F10102554690F80FC090F80EE0D1 -S315080059B84EEA0C2A15B9DA4508D0ADE0FE2A00F2F7 -S315080059C8AB8026F812A002F10102554690F811C0DC -S315080059D890F810E04EEA0C2A15B9DA4508D09BE08B -S315080059E8FE2A00F2998026F812A002F1010255460D -S315080059F890F813C090F812E04EEA0C2A15B9DA4561 -S31508005A0808D089E0FE2A00F2878026F812A002F15B -S31508005A180102554690F815C090F814E04EEA0C2A8B -S31508005A2815B9DA4507D077E0FE2A75D826F812A000 -S31508005A3802F10102554690F817C090F816E04EEAAA -S31508005A480C2A15B9DA4507D066E0FE2A64D826F87E -S31508005A5812A002F10102554690F819C090F818E00C -S31508005A684EEA0C2A15B9DA4507D055E0FE2A53D866 -S31508005A7826F812A002F10102554690F81DC090F8C2 -S31508005A881CE04EEA0C2A15B9DA4507D044E0FE2A86 -S31508005A9842D826F812A002F10102554690F81FC00E -S31508005AA890F81EE04EEA0C2A35B1FE2A34D826F8B4 -S31508005AB812A002F1010201E0DA452DD1007800F0C2 -S31508005AC84005E8B218B3FE2A26D826F812701EE052 -S31508005AD81EB9FEF7E7FA504524D04FF6FF70208422 -S31508005AE820E0464604E0464602E0464600E04646CA -S31508005AF820463946FFF7A2F9054620B92169002943 -S31508005B087FF4C1AE75B14FF0000121610AE003F1D7 -S31508005B18FF33DEB28A46EBE78A464646E8E74FF0A1 -S31508005B280405F0E72846BDE8F88F00BF2DE9F041DF -S31508005B3804460E46012926D98369994226D24FF08A -S31508005B4800074FF0010820463146FEF79BFF054639 -S31508005B58F8B1012820D0B0F1FF3F20D020463146C1 -S31508005B683A46FFF76DF80146D8B92069B0F1FF3F04 -S31508005B7804D000F10100206184F805802E46A26948 -S31508005B88AA42E0D80DE04FF002010AE04FF0020100 -S31508005B9807E04FF0000104E04FF0020101E04FF082 -S31508005BA801010846BDE8F08170B582B0054616467B -S31508005BB81C464FF00B02FEF707FA052C0DD9A6F17D -S31508005BC802024FEA540343EAC43432F8020F10FAC1 -S31508005BD884F18CB25688002EF3D14FF0070204F0F0 -S31508005BE80F0000F13003392B88BF00F137030DF891 -S31508005BF8023002F1FF322409F1D1164602A98818A3 -S31508005C084FF07E0300F8083C92B12C78202C12D06D -S31508005C1829464FF0000312F0010F56D003F1010090 -S31508005C280346B04209D011F8014F202C54D104E09C -S31508005C384FF0000301E04FF000034FF02000C3F1D6 -S31508005C48070101F00104072A19D811E0072A06D81E -S31508005C5802ACA11811F8081C02F1010200E001467D -S31508005C68E95403F10103072A28D820E002B070BDD9 -S31508005C7802AEB11811F8081C02F1010200E001464B -S31508005C88E95403F10103072BF0D8002CDED0072AC4 -S31508005C9806D802ACA11811F8081C02F1010200E0A6 -S31508005CA80146E95403F10103072BCFD9DEE702AE13 -S31508005CB8B11811F8081C02F1010200E00146E9547E -S31508005CC803F10103072BC1D9D0E703F1010311F842 -S31508005CD8010F2028A2D1B0E700F1010311F8010F3E -S31508005CE820289BD1A9E700BF2DE9F04F87B00446C5 -S31508005CF88769C66903A839464FF00C02FEF764F9A6 -S31508005D089DF8173013F0010F2FD04FF00000F872E6 -S31508005D18E0614FF00105384603A932462B46FFF7DE -S31508005D2843FF2046FFF732F9814698B905F1010580 -S31508005D38ADB2384603A932462B46FFF735FF20464B -S31508005D48FFF724F98146002800F0038102E04FF0A6 -S31508005D580709FAE0642D00F0DB80B9F1040F40F07A -S31508005D68F4809DF81710F972E6619DF8172002F07D -S31508005D780207FBB2DBB1308848B14FF0000303F1E4 -S31508005D8801039BB236F813100029F8D101E04FF049 -S31508005D98000303F119034EF64F42C4F6C46282FBA8 -S31508005DA803174FEAE370C0EBA7039FB201E04FF071 -S31508005DB8010720464FF00001FEF7ECFE8146002851 -S31508005DC840F0C3804FF00005A8464FF0010620684A -S31508005DD82169FEF7BFFD8146002840F0B680616953 -S31508005DE80A78E52A00D022B905F10105AF4201D1A2 -S31508005DF891E0454620463146FFF720F881460028B7 -S31508005E08E5D0A2E0E088C31B204699B2FEF7C2FE99 -S31508005E188146002840F09980A069FEF743F9019069 -S31508005E284FF000084FF6FF7547F24006C0F6000621 -S31508005E3820682169FEF78EFD8146002840F0858096 -S31508005E48D4F81C9061695FFA87FB019A4A734FF088 -S31508005E580F00C87281F80C8081F81A8081F81B80B7 -S31508005E680BF1FF3303EB430203EB82004FF0010209 -S31508005E7843464FF0FF0A02E02B4602F10102AB4205 -S31508005E884ED039F8103000F1010006EB020C1CF868 -S31508005E9801EC01F80E308E444FEA132C8EF801C037 -S31508005EA8002B48D00C2AE8D9AB4202D039F81000A2 -S31508005EB818B947F0400B5FFA8BFB81F800B02268E7 -S31508005EC84FF00101117120464146FEF7B7FF81469A -S31508005ED800283AD107F1FF37BFB2002FA8D12DE025 -S31508005EE860694FF000014FF02002FEF797F86069E5 -S31508005EF8A1694FF00B02FEF767F86369A069C27AD1 -S31508005F0802F01801197323684FF0010018711CE094 -S31508005F184FF0070919E007F1FF37BFB277B171E704 -S31508005F2806EB020E1EF801CC01F80CA001EB0C0ECC -S31508005F388EF801A0B6E70C2A9ED9BAE72068216927 -S31508005F48FEF708FD81460028CAD0484607B0BDE8CE -S31508005F58F08F05F10105ADB2384603A932462B463E -S31508005F68FFF722FE2046FFF711F8814600287FF43E -S31508005F78F1AE05F10105ADB2642D7FF4CCAEE6E6C7 -S31508005F88A0B941F23803C2F20003186810B14FF0FD -S31508005F980002027011B14FF000030B7041F238008D -S31508005FA8C2F2000001604FF0000070474FF00B0086 -S31508005FB8704700BF2DE9F0438FB001911646054694 -S31508005FC8002800F0A5804FF00003036001A805A982 -S31508005FD802F01E02FEF72EF90446002840F0B780A4 -S31508005FE806F01F0802A80B9040F63461C2F20001B9 -S31508005FF80C9105A80199FFF705FA0A9F014600289A -S3150800600840F08F80002F40F0868088E059B1042937 -S3150800601840F0928005A8FFF767FE48F008080A9F2F -S3150800602850B1044693E0FB7A13F0110F7ED106F0BF -S315080060380402D6B2002E7CD108F00800C6B2002E9B -S3150800604841D0FBF735FCB873C0F30723FB734FEA57 -S3150800605810423A744FEA106179744FF00006FE72DE -S315080060683E777E77BE77FE7705983946FDF7FEFFB9 -S31508006078814638463146FEF709F805984FF0010378 -S315080060880371B9F1000F1ED0066B4946FFF74EFD9E -S31508006098002853D1059809F1FF31C1603146FEF74A -S315080060A859FC01460DE0FB7A03F01002D0B200282D -S315080060B846D106F00206F6B22EB113F0010F42D108 -S315080060C801E0002942D108F00800C6B20EB148F02E -S315080060D82008059E336BEB612F6285F806803046EB -S315080060E83946FDF7C3FF2861FA7FB97F4FEA0140B1 -S315080060F840EA02633A7F1343797F43EA0120E8605E -S315080061084FF00003AB60AB612E60F288AA801EE0F0 -S315080061184FF009041BE016F01C0F84D1C3E74FF0B3 -S31508006128060116F01C0F7FF471AFCAE74FF0070493 -S315080061380DE04FF008040AE00C4608E0044606E0BD -S315080061484FF0040403E04FF0070400E00C4620462D -S315080061580FB0BDE8F08300BF2DE9F04F83B00446C1 -S31508006168884691461E464FF000033360FDF7ECFF5C -S315080061780746002840F0D080A07910F0800F40F03C -S31508006188C68010F0010F00F0C580E568A1686D1A91 -S31508006198A94538BF4D46002D00F0BE8004F12402FB -S315080061A800920197A7684FEAC7534FEAD3500028C9 -S315080061B840F08D80206890F802A00AF1FF3101EAC4 -S315080061C8572212F0FF0A19D10FB9206902E061694E -S315080061D8FEF758FC012806D8A77967F07F00A07152 -S315080061E84FF0020798E0B0F1FF3F06D1A37963F0B4 -S315080061F87F02A2714FF001078EE060612768384672 -S315080062086169FEF72FFC814630B9A07960F07F01F5 -S31508006218A1714FF002077FE000EB0A095FEA552BE8 -S3150800622829D0BB780BEB0A029A4288BFCAEB030B44 -S31508006238787841464A465FFA8BF3FBF787FA30B116 -S31508006248A27962F07F07A7714FF0010764E0A77982 -S3150800625807F04000C1B259B1A369C9EB03029345D7 -S3150800626806D908EB422000994FF40072FDF7ACFEF8 -S315080062784FEA4B2B3CE0A2694A4526D0A37903F09E -S315080062884000C1B289B1787800994FF00103FBF74D -S3150800629897FA30B1A07960F07F01A1714FF0010734 -S315080062A83AE0A27922F04007A7712368587800993E -S315080062B84A464FF00103FBF749FA30B1A77967F068 -S315080062C87F03A3714FF0010726E0C4F81890A06869 -S315080062D84FEAC0514FEAD152C2F5007B5D4538BF37 -S315080062E8AB46A118404601F124015A46FDF76CFE53 -S315080062F8D844A76807EB0B00A060316801EB0B03CD -S315080063083360B5EB0B057FF44DAF019F04E04FF002 -S31508006318020701E04FF00707384603B0BDE8F08FDB -S315080063282DE9F04F83B00446884615461E464FF0B9 -S3150800633800033360FDF708FF0746002840F0EE80A3 -S31508006348A07910F0800F40F0E48000F00201CAB28C -S31508006358002A00F0E180E368DD4280F0D080002D55 -S3150800636800F0CD8004F1240000900197A7684FEA51 -S31508006378C7514FEAD152002A40F09C80206890F80D -S3150800638802B00BF1FF3303EA572111F0FF0B24D1B2 -S3150800639847B927696FB94FF00001FEF7EBFC0746C6 -S315080063A8206103E06169FEF7E5FC0746002F00F067 -S315080063B8A580012F06D1A77967F07F00A0714FF055 -S315080063C80207ABE0B7F1FF3F06D1A27962F07F0377 -S315080063D8A3714FF00107A1E06761A07900F04002B8 -S315080063E8D3B29BB1216848780099A2694FF0010396 -S315080063F8FBF7E6F930B1A07960F07F01A1714FF09B -S3150800640801078BE0A77927F04000A071276838466E -S315080064186169FEF727FB814630B9A37963F07F07E0 -S31508006428A7714FF0020779E000EB0B095FEA552AD6 -S3150800643828D0B9780AEB0B028A4288BFCBEB010A47 -S31508006448787841464A465FFA8AF3FBF7B9F930B1D4 -S31508006458A17961F07F02A2714FF001075EE0A36996 -S31508006468C9EB0307BA450AD9009808EB47214FF440 -S315080064780072FDF7A9FDA07920F04001A1714FEA45 -S315080064884A2A2CE0A2694A4512D0A168E3689942CB -S315080064980ED2787800994A464FF00103FBF756F969 -S315080064A830B1A07960F07F07A7714FF0010735E092 -S315080064B8C4F81890A0684FEAC0574FEAD752C2F5F1 -S315080064C8007A554538BFAA46A01800F12400414667 -S315080064D85246FDF779FDA17941F04003A371D044EE -S315080064E8A26802EB0A03A360376807EB0A00306064 -S315080064F8B5EB0A057FF43AAF019F00E0019FA16852 -S31508006508E268914288BFE160A37943F02000A07150 -S3150800651804E04FF0020701E04FF00707384603B0DA -S31508006528BDE8F08F38B50446FDF70EFE0346002889 -S3150800653850D1A27902F02001C8B200284AD002F048 -S315080065484003DAB272B1214651F8240B4078A269A1 -S315080065584FF00103FBF734F9002839D1A17921F066 -S315080065684003A3712068E169FEF7F4F9034688BB7E -S31508006578256AEA7A42F02000E872E1682977A38951 -S315080065884FEA13226A77E089A877E17BE9772846F4 -S315080065982169FDF77BFDFBF78BF9A875C0F307237F -S315080065A8EB754FEA10422A764FEA106068764FF084 -S315080065B80001A974E974A37923F02002A27120685E -S315080065C84FF0010101712068FEF7E2F9034601E080 -S315080065D84FF00103184638BD10B50446FFF7A2FF69 -S315080065E8034610B94FF000022260184610BD00BFD6 -S315080065F8F8B504460D46FDF7A7FD0746002840F0FE -S31508006608D380A37913F0800F40F0CC80E268AA42C1 -S3150800661805D203F00200C1B2002908BF1546A268D0 -S315080066284FF00003A360002D00F0BE80206886782E -S315080066384FEA462682B102F1FF3205F1FF31B1FB76 -S31508006648F6F1B2FBF6F3994206D3C6F100031A40EF -S31508006658A260AD1A616919E02169B1B9FEF78AFB2A -S315080066680146012806D1A27962F07F01A1714FF08F -S31508006678020799E0B0F1FF3F06D1A77967F07F00D6 -S31508006688A0714FF001078FE020616161002946D0AB -S31508006698B5422ED9A07900F00202D3B22BB12068F0 -S315080066A8FEF768FB014620B922E02068FEF7EAF9FA -S315080066B80146B1F1FF3F06D1A27962F07F03A371C3 -S315080066C84FF0010770E0012903D9206882699142D1 -S315080066D806D3A77967F07F01A1714FF0020763E037 -S315080066E86161A3689819A060AD1BAE42D2D300E0D9 -S315080066F83546A0684219A2604FEAC5534FEAD350F7 -S3150800670880B12068FEF7AEF930B9A07960F07F0746 -S31508006718A7714FF0020747E000EB552504E04FF054 -S31508006728000501E04FF00005A2684FEAC2534FEA98 -S31508006738D35068B3A269AA422AD0A17901F04003C6 -S31508006748D8B298B1214651F8243B58784FF001033E -S31508006758FBF736F830B1A27962F07F01A1714FF0E4 -S31508006768010721E0A27922F04001A171214651F8DA -S31508006778240B40782A464FF00103FAF7E7FF30B1B1 -S31508006788A77967F07F03A3714FF001070CE0A561AD -S31508006798A368E268934207D9E360A17941F020002B -S315080067A8A07101E04FF002073846F8BD30B58FB042 -S315080067B80EAB43F8340D0D46184605A94FF00002EE -S315080067C8FDF738FD0446A8B902A80B9040F63461CF -S315080067D8C2F200010C9105A80199FEF713FE0446BA -S315080067E840B90A9A22B105A82946FDF723FF01E010 -S315080067F84FF0060420460FB030BD00BF30B599B03B -S3150800680818AB43F85C0D18460FA94FF00102FDF7BF -S3150800681811FD0246002857D103A8159040F63461A1 -S31508006828C2F2000116910FA80199FEF7EBFD024680 -S31508006838002849D1149959B3CC7A14F0010F2AD1F2 -S315080068482CE0012D34D906A80FA94FF02402FDF72C -S31508006858BBFB089506A84FF00201FEF79BF902460E -S31508006868002831D106A84FF00001FEF7FDFF0246C1 -S3150800687840B304281FD027E02DB10F982946FFF703 -S3150800688855F9024600BB0F98FEF782F802461BE048 -S315080068984FF0060218E04FF0070215E00F98FDF7CB -S315080068A8E5FB054604F01004E4B2002CC9D102E061 -S315080068B84FF0020208E00FA8FEF7A8FF02460028D4 -S315080068C8DAD001E04FF00702104619B030BD00BF14 -S315080068D82DE9F04782B08246914604464FF00005F6 -S315080068E801F1FF374FF0010814E0484601A942466E -S315080068F86B46FFF731FC009B012B0ED19DF804006F -S315080069080D2808D0307004F10104264605F1010562 -S315080069180A2802D02646AF42E7DC4FF0000131705C -S315080069288D4214BF5046084602B0BDE8F08700BF3E -S3150800693830B583B004460D460A2803D14FF00D003A -S31508006948FFF7F6FF02A901F8084D284669464FF0F1 -S31508006958010201ABFFF7E4FC0198012814BF4FF0C8 -S31508006968FF30012003B030BD70B505460E460078E5 -S3150800697870B14FF000043146FFF7DAFFB0F1FF3F78 -S3150800698809D004F1010415F8010F0028F3D104E031 -S315080069984FF0000401E04FF0FF34204670BD00BFF9 -S315080069A87F282DD911B9C7280BD121E0FF2825D86A -S315080069B8A0F1800047F23022C0F6000232F8100033 -S315080069C870474FF0010347F23022C0F6000232F84A -S315080069D8021F814215D10DE032F8021F814209D003 -S315080069E803F101039BB232F8021F81420DD101E07F -S315080069F84FF0000303F18000C0B270474FF0000063 -S31508006A08704703F101039BB2E6E703F101039BB262 -S31508006A18802BE1D1EEE700BF61280ED047F250017E -S31508006A28C0F600014FF0000202F1010231F8023FF8 -S31508006A385BB18342F8D113B970474FF0000247F2A9 -S31508006A483030C0F6000030F812007047A0F1300068 -S31508006A5809288CBF00200120704700BFA0F16103F8 -S31508006A68D9B2192998BF2038704700BF844640EA2A -S31508006A78010313F0030F40F01080242AC0F00D809C -S31508006A882DE9F00FB1E8F80FA0E8F80FA2F12402F3 -S31508006A98242ABFF4F7AFBDE8F00F002A00F00780F4 -S31508006AA811F8013B00F8013B013A7FF4F9AF60465B -S31508006AB8704700BF38B504460D4600F019F841F28C -S31508006AC83C03C2F200031D6044F0800441F2400012 -S31508006AD8C2F200000460024611680029FCD100F0E1 -S31508006AE809F841F23C03C2F20003186838BD00BF32 -S30D08006AF8704700BF704700BF9C -S31508006B002F64656D6F70726F675F6F6C696D6578FE -S31508006B105F73746D3332653430372E737265630074 -S31508006B202F626F6F746C6F672E74787400000000A4 -S31508006B30433A2F576F726B2F736F6674776172655E -S31508006B402F4F70656E424C542F5461726765742FCF -S31508006B5044656D6F2F41524D434D345F53544D3349 -S31508006B60325F4F6C696D65785F53544D33324534E7 -S31508006B7030375F43726F7373776F726B732F426F21 -S31508006B806F742F6964652F2E2E2F2E2E2F2E2E2FE3 -S31508006B902E2E2F536F757263652F41524D434D3418 -S31508006BA05F53544D33322F43726F7373776F726B23 -S31508006BB0732F766563746F72732E63000000080086 -S31508006BC01000180020002800300038004000480057 -S31508006BD0500058008000880090009800A000A80087 -S31508006BE0B000B800C000C800D000D8000080000877 -S31508006BF0004000000200000000C00008004000003D -S31508006C000300000000000108000001000400000065 -S31508006C100000020800000200050000000000040849 -S31508006C20000002000600000000000608000002003E -S31508006C300700000000000808000002000800000025 -S31508006C4000000A08000002000900000000000C0805 -S31508006C50000002000A00000000000E080000020002 -S31508006C600B000000433A2F576F726B2F736F6674D1 -S31508006C70776172652F4F70656E424C542F5461725E -S31508006C806765742F44656D6F2F41524D434D345FD0 -S31508006C9053544D33325F4F6C696D65785F53544D6D -S31508006CA03332453430375F43726F7373776F726B65 -S31508006CB0732F426F6F742F6964652F2E2E2F2E2E19 -S31508006CC02F2E2E2F2E2E2F536F757263652F41523E -S31508006CD04D434D345F53544D33322F756172742EC4 -S31508006CE063000000433A2F576F726B2F736F6674F9 -S31508006CF0776172652F4F70656E424C542F546172DE -S31508006D006765742F44656D6F2F41524D434D345F4F -S31508006D1053544D33325F4F6C696D65785F53544DEC -S31508006D203332453430375F43726F7373776F726BE4 -S31508006D30732F426F6F742F6964652F2E2E2F2E2E98 -S31508006D402F2E2E2F2E2E2F536F757263652F4152BD -S31508006D504D434D345F53544D33322F63616E2E636A -S31508006D6000000000050206020603070308030903DC -S31508006D7009040A040B040C040C050D050E050F0581 -S31508006D800F061006100710084F70656E424C540027 -S31508006D90433A2F576F726B2F736F667477617265FC -S31508006DA02F4F70656E424C542F5461726765742F6D -S31508006DB044656D6F2F41524D434D345F53544D33E7 -S31508006DC0325F4F6C696D65785F53544D3332453485 -S31508006DD030375F43726F7373776F726B732F426FBF -S31508006DE06F742F6964652F2E2E2F2E2E2F2E2E2F81 -S31508006DF02E2E2F536F757263652F66696C652E6329 -S31508006E00000000004669726D7761726520757064CE -S31508006E10617465207265717565737420646574653F -S31508006E20637465640A0D00004F70656E696E6720AD -S31508006E306669726D776172652066696C6520666F32 -S31508006E40722072656164696E672E2E2E000000003E -S31508006E504552524F520A0D004F4B0A0D00000000D2 -S31508006E605374617274696E67207468652070726FF6 -S31508006E706772616D6D696E672073657175656E639E -S31508006E80650A0D0050617273696E67206669726DD6 -S31508006E90776172652066696C6520746F206F62740D -S31508006EA061696E2065726173652073697A652E2E35 -S31508006EB02E00000045726173696E672000000000AD -S31508006EC02062797465732066726F6D206D656D6FCB -S31508006ED07279206174203078000000005265616480 -S31508006EE0696E67206C696E652066726F6D206669CB -S31508006EF06C652E2E2E4552524F520A0D0000000088 -S31508006F00496E76616C696420636865636B73756D39 -S31508006F1020666F756E642E2E2E4552524F520A0DFC -S31508006F200000000050726F6772616D6D696E6720B0 -S31508006F300000000020627974657320746F206D6507 -S31508006F406D6F727920617420307800005772697409 -S31508006F50696E672070726F6772616D20636865631A -S31508006F606B73756D2E2E2E00436C6F73696E6720DA -S31508006F706669726D776172652066696C650A0D00CF -S31508006F804669726D776172652075706461746520F3 -S31508006F907375636365737366756C6C7920636F6D5F -S31508006FA0706C657465640A0D00000000222A3A3C7C -S31508006FB03E3F7C7F000000002B2C3B3D5B5D0000C4 -S31508006FC0809A90418E418F804545454949498E8F23 -S31508006FD09092924F994F555559999A9B9C9D9E9F71 -S31508006FE041494F55A5A5A6A7A8A9AAABAC21AEAFFE -S31508006FF0B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF0B -S31508007000C0C1C2C3C4C5C6C7C8C9CACBCCCDCECFFA -S31508007010D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFEA -S31508007020E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFDA -S31508007030F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFFCA -S3150800704001030507090E10121416181C1E0000006D -S3150800705061006200630064006500660067006800FE -S3150800706069006A006B006C006D006E006F007000AE -S31508007070710072007300740075007600770078005E -S3150800708079007A00A100A200A300A500AC00AF0019 -S31508007090E000E100E200E300E400E500E600E700C6 -S315080070A0E800E900EA00EB00EC00ED00EE00EF0076 -S315080070B0F000F100F200F300F400F500F600F80025 -S315080070C0F900FA00FB00FC00FD00FE00FF000101CC -S315080070D003010501070109010B010D010F0111014A -S315080070E013011501170119011B011D011F012101BA -S315080070F023012501270129012B012D012F0131012A -S315080071003301350137013A013C013E014001420194 -S315080071104401460148014B014D014F0151015301FC -S315080071205501570159015B015D015F016101630169 -S315080071306501670169016B016D016F0171017301D9 -S31508007140750177017A017C017E019201B103B203D0 -S31508007150B303B403B503B603B703B803B903BA0355 -S31508007160BB03BC03BD03BE03BF03C003C103C30304 -S31508007170C403C503C603C703C803C903CA03300447 -S31508007180310432043304340435043604370438042D -S3150800719039043A043B043C043D043E043F044004DD -S315080071A0410442044304440445044604470448048D -S315080071B049044A044B044C044D044E044F0451043C -S315080071C052045304540455045604570458045904E5 -S315080071D05A045B045C045E045F0470217121722109 -S315080071E073217421752176217721782179217A21D5 -S315080071F07B217C217D217E217F2141FF42FF43FFA8 -S3150800720044FF45FF46FF47FF48FF49FF4AFF4BFF3C -S315080072104CFF4DFF4EFF4FFF50FF51FF52FF53FFEC -S3150800722054FF55FF56FF57FF58FF59FF5AFF0000F6 -S31508007230C700FC00E900E200E400E000E500E70022 -S31508007240EA00EB00E800EF00EE00EC00C400C50021 -S31508007250C900E600C600F400F600F200FB00F900DB -S31508007260FF00D600DC00A200A300A500A72092011B -S31508007270E100ED00F300FA00F100D100AA00BA001F -S31508007280BF001023AC00BD00BC00A100AB00BB00D2 -S3150800729091259225932502252425612562255625C3 -S315080072A055256325512557255D255C255B25102524 -S315080072B0142534252C251C2500253C255E255F250F -S315080072C05A25542569256625602550256C25672588 -S315080072D068256425652559255825522553256B2586 -S315080072E06A2518250C25882584258C259025802532 -S315080072F0B103DF009303C003A303C303B500C403AC -S31508007300A6039803A903B4031E22C603B5032922BC -S315080073106122B1006522642220232123F700482236 -S31508007320B0001922B7001A227F20B200A025A000BB -S31508007330410042004300440045004600470048001B -S3150800734049004A004B004C004D004E004F005000CB -S31508007350510052005300540055005600570058007B -S3150800736059005A002100E0FFE1FFE5FFE2FFE3FFD5 -S31508007370C000C100C200C300C400C500C600C700E3 -S31508007380C800C900CA00CB00CC00CD00CE00CF0093 -S31508007390D000D100D200D300D400D500D600D80042 -S315080073A0D900DA00DB00DC00DD00DE007801000130 -S315080073B002010401060108010A010C010E0110016F -S315080073C012011401160118011A011C011E012001DF -S315080073D022012401260128012A012C012E0130014F -S315080073E032013401360139013B013D013F014101BA -S315080073F04301450147014A014C014E015001520122 -S315080074005401560158015A015C015E01600162018E -S315080074106401660168016A016C016E0170017201FE -S315080074207401760179017B017D0191019103920333 -S3150800743093039403950396039703980399039A0372 -S315080074409B039C039D039E039F03A003A103A30321 -S31508007450A403A503A603A703A803A903AA03100464 -S31508007460110412041304140415041604170418044A -S3150800747019041A041B041C041D041E041F042004FA -S3150800748021042204230424042504260427042804AA -S3150800749029042A042B042C042D042E042F04010489 -S315080074A00204030404040504060407040804090482 -S315080074B00A040B040C040E040F04602161216221E6 -S315080074C063216421652166216721682169216A2172 -S315080074D06B216C216D216E216F2121FF22FF23FF75 -S315080074E024FF25FF26FF27FF28FF29FF2AFF2BFF5A -S315080074F02CFF2DFF2EFF2FFF30FF31FF32FF33FF0A -S3150800750034FF35FF36FF37FF38FF39FF3AFF0000F3 -S315080075100100000001000000000000000102030451 -S30E0800752001020304060708090428 +S31508001E585864704739B14FF46051C4F202010B69EE +S31508001E681843086170474FF46053C4F202031A69AD +S31508001E7822EA00001861704739B14FF46051C4F27C +S31508001E8802014B6A1843486270474FF46053C4F21C +S31508001E9802035A6A22EA00005862704708B54FF4E6 +S31508001EA800604FF00101FFF7E7FF4FF400604FF0BD +S31508001EB80001FFF7E1FF08BD10B44FF43053C4F230 +S31508001EC801035C68416882681143C2681143026865 +S31508001ED8114302690A4324F4FD4424F07F0422438B +S31508001EE8007D02435A6010BC704700BF48F2A00341 +S31508001EF8C4F22523186070474FF43053C4F201031F +S31508001F08186070474FF43053C4F20103186800F09C +S31508001F180300704710B402684FF43053C4F2010343 +S31508001F289A60DC6824F4FF6121F007048268416836 +S31508001F381143C2681143006901432143D96010BCA3 +S31508001F48704700BF4FF43053C4F201031869C0B292 +S31508001F58704700BF82B04FF00003019342F6144160 +S31508001F68C4F2010140180190019A106802B070473E +S31508001F7810B402684FF43053C4F201035A62416838 +S31508001F889962DC6A24F0F704C26881681143026919 +S31508001F981143406901432143D96210BC704700BF09 +S31508001FA84FF43053C4F20103D3F88000704700BFDA +S31508001FB84FF43053C4F20103C3F88000704700BFDA +S31508001FC84FF43053C4F20103596B08420CBF002082 +S31508001FD8012070474FF43053C4F2010398637047E1 +S31508001FE84FF0DC03C4F227231860704730B585B074 +S31508001FF804460D46038A23F440504FEA00414FEA47 +S315080020081143EA8813432382A08920F4B05121F0AA +S315080020180C034FEA03424FEA12402989AB8841EA82 +S31508002028030269890A4393B21843A081A28A22F453 +S3150800203840714FEA01434FEA1340AA891043A08228 +S315080020486846FFF765FE4FF48051C4F201018C42D9 +S3150800205805D04FF4A053C4F201039C4201D103985A +S3150800206800E00298A28911B2002909DA00EB80017A +S3150800207801EB81002B684FEA4305B0FBF5F208E04F +S3150800208800EB800303EB83002D684FEA8502B0FB5B +S31508002098F2F248F21F51C5F2EB11A1FB02104FEA02 +S315080020A850134FEA03154FF0640103FB1122A08968 +S315080020B803B2002B0DDA4FEAC20202F1320248F2E5 +S315080020C81F51C5F2EB11A1FB0220C0F342132B43A3 +S315080020D80CE04FEA021202F1320248F21F51C5F229 +S315080020E8EB11A1FB0220C0F343132B439BB22381B8 +S315080020F805B030BD29B181898AB242F4005383817B +S315080021087047838923F400514FEA01424FEA124384 +S31508002118838170474FEAC1514FEAD152828070478E +S3150800212880884FEAC0514FEAD15070470388194250 +S315080021380CBF00200120704708B54FF000704FF01B +S315080021480101FFF787FE4FF000704FF00001FFF717 +S3150800215881FE08BD4FF00003036043608360C360D7 +S31508002168036143618361C361036243628362C36235 +S31508002178036343638363C3634FF0400202644FF00B +S31508002188200141648364C364036543658365C36545 +S3150800219803664FF0800242668366C3660367436731 +S315080021A88367C3674FF08061C0F880104FF00072EC +S315080021B8C0F884204FF08071C0F888104FF40011D9 +S315080021C8C0F88C10C0F89030C0F89430C0F8983031 +S315080021D8C0F89C30C0F8A030C0F8A420C0F8A830D1 +S315080021E84FF40032C0F8AC204FF48071C0F8B01034 +S315080021F8C0F8B430C0F8B830704700BF82B04FF0A6 +S31508002208000301934FF40043C4F202031A6902F06B +S315080022181C024FEAC06042EA10424FEA811101F4F3 +S31508002228F860024342F001021A614FF40040C4F212 +S3150800223802004FF6FE71C0F20401019B03F1010387 +S315080022480193026912F0010F02D0019B8B42F4D95F +S3150800225801984FF6FF71C0F20401884206D04FF480 +S315080022680042C4F20202536998B201E04FF0000036 +S3150800227802B0704710B483B04FF0000301934FF4CF +S315080022880043C4F202031C6904F01C0444F0030466 +S315080022984FEAC06044EA10444FEA811101F4F86035 +S315080022A804435A611C614FF40042C4F202024FF615 +S315080022B8FE71C0F20401019B03F101030193106941 +S315080022C810F0010F02D0019B8B42F4D9019A4FF600 +S315080022D8FF71C0F20401501A18BF012003B010BCE0 +S315080022E8704700BFF0B587B004460D464FF00003A7 +S315080022F8059300934FF40040C4F20200066926F0DD +S315080023081C0601A8FFF704FD02994FF45342CFF6BD +S31508002318CE628B184EF2BF10C0F2E400834202D890 +S3150800232846F008061AE04FF24012CFF6E9528B1823 +S3150800233847F63F00C0F27D10834202D846F00C06E5 +S315080023480CE04FF4F242CFF66C4289184FF4B443C6 +S31508002358C0F26223994288BF46F004064FF400404B +S31508002368C4F20200066128464FF000014FF4004205 +S31508002378FFF780FF002800F01C814FF08062059265 +S31508002388059931B1059B03F1FF300590059A002A96 +S31508002398F8D12168002963D04FF001074FF6FE7679 +S315080023A8C0F20406009800F1010000902846394654 +S315080023B8FFF724FF00F0040293B213B90099B1425B +S315080023C8F0D900984FF6FF72C0F20402904200F066 +S315080023D8F3804FF00001009128464FF48052FFF72A +S315080023E849FF002800F0EB804FF001074FF6FE760C +S315080023F8C0F20406009B03F10103009328463946F8 +S31508002408FFF7FCFE00F0200188B210B9009AB24224 +S31508002418F0D900994FF6FF73C0F20403994200F009 +S31508002428D1804FF00000009028464FF01001FFF7C2 +S31508002438E5FE00F0040291B219B14FF40062226277 +S3150800244802E04FF00003236200F0020081B219B1DE +S315080024584FF0000262611EE04FF4804363611AE0A0 +S315080024686369206A4FEAD00242EA530328464FF0C6 +S3150800247800019AB2FFF7FEFE002800F0A6806FF06A +S315080024887F410591059830B1059A02F1FF33059306 +S3150800249805990029F8D14FF40043C4F202031868D5 +S315080024A848F20F12CFF620720240A0686168084306 +S315080024B8E16808432169084361690843A169084333 +S315080024C8E1690843216A0843616A0843A16A08431F +S315080024D8E16A0843216B0843616B084302431A60A3 +S315080024E8E16BA06B0143226C1143606C0143A26C3B +S315080024F81143E06C0143226D1143606D0143596035 +S31508002508A26D9A60E06DD8609869A16E626E1143F3 +S31508002518E26E1143226F1143626F11434FF64172FF +S31508002528024041EA0200216E40EA01429A61E06FE0 +S31508002538A16F40EA0102DA6103F58053986943F608 +S315080025482372CFF6DE020240D4F88400D4F880104D +S315080025580843D4F888100843D4F88C100843D4F8EC +S3150800256890100843D4F894100843D4F898100843F0 +S31508002578D4F89C100843D4F8A010084302439A617B +S31508002588D4F8A410D4F8A800014341F40001D4F8FB +S31508002598AC201143D4F8B0000143D4F8B82041EA76 +S315080025A80200D4F8B41040EA81021A604FF001001C +S315080025B80DE04FF000000AE04FF0000007E04FF08A +S315080025C8000004E04FF0000001E04FF0000007B0FB +S315080025D8F0BD00BF40B14FF40041C4F202010B68D8 +S315080025E843F008020A6070474FF40043C4F2020336 +S315080025F81A6822F008001860704700BF40B14FF407 +S315080026080041C4F202010B6843F004020A607047ED +S315080026184FF40043C4F202031A6822F00400186053 +S31508002628704700BF4FF41043C4F202031A6842F019 +S3150800263801001860704700BF4FF41043C4F2020344 +S31508002648186800F0010070474FF41043C4F20203FB +S315080026589A6942F480109861704700BF40B14FF4F8 +S315080026681041C4F202018B6943F400528A6170472B +S315080026784FF41043C4F202039A6922F40050986191 +S31508002688704700BF40B14FF41041C4F202018B698C +S3150800269843F002028A6170474FF41043C4F20203FA +S315080026A89A6922F002009861704700BF08B54FF092 +S315080026B80100FFF78FFFFFF7C7FF4FF00100FFF78D +S315080026C89DFF4FF00100FFF7C9FF4FF00100FFF724 +S315080026D8D9FF08BD2DE9F04FB3B04FF0F0504FF0D1 +S315080026E80101FFF781FB4FF047004FF00101FFF7A3 +S315080026F87BFB4FF480404FF00101FFF799FB4FF041 +S315080027080100FFF76DFC4FF08E0330934FF000067B +S315080027188DF8C6604FF002058DF8C4508DF8C7606D +S315080027288DF8C5503746C4F20207384630A9FFF770 +S315080027381DFA38464FF001014FF00B02FFF7CCFAA5 +S31508002748384629464FF00B02FFF7C6FA38464FF0C7 +S3150800275803014FF00B02FFF7BFFA38464FF007019F +S315080027684FF00B02FFF7B8FA4FF4006030908DF877 +S31508002778C6608DF8C4508DF8C7608DF8C5504FF4FB +S31508002788C057C4F20207384630A9FFF7EFF93846AA +S315080027984FF00B010A46FFF79FFA4FF032013091C6 +S315080027A88DF8C6608DF8C4508DF8C7608DF8C55089 +S315080027B84FF40068C4F20208404630A9FFF7D6F974 +S315080027C840464FF001014FF00B02FFF785FA4046E5 +S315080027D84FF004014FF00B02FFF77EFA40464FF020 +S315080027E805014FF00B02FFF777FA4FF4C042309213 +S315080027F88DF8C6608DF8C4508DF8C7608DF8C55039 +S31508002808384630A9FFF7B2F938464FF00D014FF0B0 +S315080028180B02FFF761FA38464FF00E014FF00B022C +S31508002828FFF75AFAFFF788FCFFF7FCFEFFF704FFE5 +S315080028380128FBD001A8FFF78DFC4FF0000501958C +S3150800284808954FF400730B930C954FF000460F96B6 +S315080028584FF0200012901495159516954FF40067B9 +S3150800286809974FF4804106914FF0020A4FF0030981 +S3150800287841F21967C0F222074CF2F108C0F20708BC +S31508002888AEB230465146FFF7B9FC60F31F443046EE +S315080028984946FFF7B3FC60F30F04BC4214D044451D +S315080028A812D005F1010B5D461FFA8BF630465146E4 +S315080028B8FFF7A4FC60F31F4430464946FFF79EFC21 +S315080028C860F30F04BC4247D1202D07D949F22000EE +S315080028D8C0F600004FF4A17101F066F801A8A9B284 +S315080028E8FFF700FD38B949F22000C0F6000040F2AB +S315080028F8471101F059F840F60003C2F2000340F602 +S315080029088002C2F200029A60DB604FF000021A6089 +S315080029185A604FF41041C4F202010B6140F20013E9 +S31508002928C2F2000340F28010C2F2000098601A60F2 +S31508002938DB605A604FF040025A719A884FF4C860B3 +S3150800294860F30C029A804FF08002DA70CB60FFF7CA +S31508002958ADFE33B0BDE8F08F4445B5D00BF101059F +S31508002968202D8DD1BAE700BF42F2E443C2F2000334 +S315080029784FF008021A704FF0000058704FF0270100 +S3150800298899704FF06902DA704FF05B0018714FF0D2 +S3150800299845015971704700BF38B540F20013C2F2B5 +S315080029A80003D87810F0800F1FD140F20015C2F244 +S315080029B800056C884FEA84414FEA914441F68860DD +S315080029C8C2F2000040F28011C2F20001224606F067 +S315080029D8A5FAEA7842F08003EB704FF41040C4F287 +S315080029E802004FF00101816001E04FF00004204623 +S315080029F838BD00BF38B540F60003C2F20003D878E0 +S31508002A0810F0800F2CD140F68005C2F2000541F679 +S31508002A187C64C2F20004284641F68861C2F20001C5 +S31508002A28228806F07BFA40F60003C2F200039D608E +S31508002A384FF000021A604FF0100199705A6020880A +S31508002A484FEA00524FEA125199804FF0B000D870F9 +S31508002A584FF41043C4F202034FF001025A6038BD1E +S31508002A68FEE700BF00B589B04FF000030093019355 +S31508002A7802930393049305930693079349F28C00EC +S31508002A88C0F60000694604F057FB40B9009848B1FB +S31508002A989DF8081081F01002C2F3001004E04FF008 +S31508002AA8000001E04FF0000009B000BD49F28C00B3 +S31508002AB8C0F60000704700BF08B540F6C060C2F20D +S31508002AC800004FF0000380F8243249F2AC01C0F642 +S31508002AD800014FF00A0203F033FF38B940F6C06028 +S31508002AE8C2F200004FF0010280F8242208BD00BF98 +S31508002AF838B540F6C063C2F2000393F824020128E9 +S31508002B0805D140F6C060C2F2000004F02BFA4FF473 +S31508002B18A054C4F201044FF0400520462946FFF7A1 +S31508002B2805FB0028F9D049F28C00C0F6000004F02D +S31508002B382BFB38BD08B540F6C063C2F2000393F80C +S31508002B482402012805D140F6C060C2F2000004F04C +S31508002B5809FA08BD70B5064640F6C063C2F2000316 +S31508002B6893F82402012812D1304640F6C061C2F211 +S31508002B78000104F0BFFB002809DA40F6C060C2F27B +S31508002B8800004FF0000180F8241204F0EBF93178C0 +S31508002B9891B14FF4A054C4F201044FF080052046C1 +S31508002BA8FFF7B8FA20462946FFF7C0FA0028F9D0F1 +S31508002BB816F8011F0029F2D170BD00BF80B582B092 +S31508002BC872B6FEF77BFE4FF020004FF00101FFF7C3 +S31508002BD82FF94FF004004FF00101FFF705F94FF4FC +S31508002BE80065C4F2020528464FF006014FF00802B0 +S31508002BF8FFF772F828464FF007014FF00802FFF76B +S31508002C086BF84FF000078DF806704FF001068DF83F +S31508002C1807604FF002048DF804404FF04003009314 +S31508002C288DF8054028466946FEF7A0FF8DF804404A +S31508002C384FF08000009028466946FEF797FF204621 +S31508002C483146FFF7D1F84FF48065C4F202052846E5 +S31508002C584FF005014FF00902FFF73EF828464FF0F6 +S31508002C6806014FF00902FFF737F84FF060010091A7 +S31508002C788DF804408DF805408DF806708DF80760C4 +S31508002C8828466946FEF772FF4FF0C0603146FFF7DF +S31508002C98BDF800F0D3FE00F0DFFEFCE708B549F200 +S31508002CA8BC00C0F600004FF03D0100F07DFE08BDEF +S31508002CB808B500F089FB90B100F046FF00F092FBDA +S31508002CC800F070FB20F0604020F07F014EF60853B4 +S31508002CD8CEF20003196000F065FB4268904708BD0C +S31508002CE8F8B5044602F1FF37BFB2F2B100F10103A5 +S31508002CF8DF190E1A6FEA0000391801F00105A25DFE +S31508002D0804F8012B00F076FFBC420FD1F8BDA05D90 +S31508002D18254605F8010B00F06DFFA95D617005F100 +S31508002D28010400F067FFBC42F1D1F8BD002DEED0D2 +S31508002D38A35D04F8013B00F05DFFBC42E7D1F8BD8E +S31508002D4808B5FDF764FA08BD10B5044600F052FF49 +S31508002D584BF6FF73C0F600039C4205D94FF6FF7081 +S31508002D68C0F6000084426FD900F044FF4FF6FF71A1 +S31508002D78C0F600018C4205D94FF6FF72C0F601026B +S31508002D88944264D900F036FF4FF6FF73C0F6010384 +S31508002D989C4205D94FF6FF70C0F60300844259D9FC +S31508002DA800F028FF4FF6FF71C0F603018C4205D9DB +S31508002DB84FF6FF72C0F6050294424ED900F01AFF84 +S31508002DC84FF6FF73C0F605039C4205D94FF6FF7008 +S31508002DD8C0F60700844243D900F00CFF4FF6FF718E +S31508002DE8C0F607018C4205D94FF6FF72C0F60902EC +S31508002DF8944238D900F0FEFE4FF6FF73C0F6090371 +S31508002E089C4205D94FF6FF70C0F60B0084422DD9AF +S31508002E1800F0F0FE4FF6FF71C0F60B018C4205D99B +S31508002E284FF6FF72C0F60D02944222D900F0E2FE70 +S31508002E384FF6FF73C0F60D039C4226D9B4F1016F0D +S31508002E4838BF082317D323E04FF0000313E04FF0E9 +S31508002E58010310E04FF002030DE04FF003030AE008 +S31508002E684FF0040307E04FF0050304E04FF00603AC +S31508002E7801E04FF0070303EB430049F27811C0F667 +S31508002E88000101EB8002107A10BD4FF0FF0010BD5B +S31508002E984FF0FF0010BD00BF2DE9F0410546006858 +S31508002EA8FFF752FFFF283BD0FEF79AFD4FF0F300D5 +S31508002EB8FEF7B6FDFEF7BAFD012818BF002404D1AF +S31508002EC8FEF7A4FD4FF000042CE02F6804EB070872 +S31508002ED82B195E6800F08EFE40463146FEF7EEFD79 +S31508002EE8082815D1E059B04215D104F104042F6811 +S31508002EF804EB07082A19566800F07CFE4046314656 +S31508002F08FEF7DCFD082810D002E04FF0010404E0C3 +S31508002F184FF0000401E04FF00004FEF777FD01E0EA +S31508002F284FF000042046BDE8F081E359B342F2D1D8 +S31508002F3804F10404B4F5007FC7D1E6E708B54FEAFB +S31508002F48C1534FEAD3525AB903688B420BD040F89B +S31508002F58041B4FF40072FFF7C3FE4FF0010008BDCB +S31508002F684FF0000008BD4FF0010008BD38B504460B +S31508002F780D4641F2E803C2F2000398420AD04FF41C +S31508002F884040C0F60000814209D02046FFF784FF7A +S31508002F9848B911E041F2EC24C2F2000403E041F218 +S31508002FA8E804C2F2000420462946FFF7C7FF0028AE +S31508002FB814BF2046002038BD4FF0000038BD00BFBA +S31508002FC82DE9F04704460D4616461F464FEA51298D +S31508002FD84FEA49290368B3F1FF3F04D14946FFF789 +S31508002FE8ADFF00283FD02068484506D02046494608 +S31508002FF8FFF7BCFF0446002839D021686D1A651901 +S3150800300805F1040540F2FF1809F5007907F1FF3ABA +S315080030180AF0010A00F0EEFD04F10402AB1A434572 +S3150800302836D92CE000F0E6FD04F10400291A4145DA +S3150800303807D920464946FFF799FF0446D8B100F153 +S31508003048040516F8012B05F8012B07F1FF3700F0E0 +S31508003058D1FD04F10403E81A404542D938E04FF097 +S315080030680100BDE8F0874FF00000BDE8F0874FF093 +S315080030780000BDE8F0874FF00000BDE8F08720465D +S315080030884946FFF773FF04460028F4D000F1040503 +S3150800309816F8010B05F8010B013FE0D0BAF1000F4D +S315080030A8C0D000F0A7FD04F104016A1A424508D900 +S315080030B820464946FFF75AFF04460028DBD000F1A8 +S315080030C8040516F8013B05F8013B013FAAD1C6E7F6 +S315080030D820464946FFF74AFF04460028CBD000F1A8 +S315080030E8040516F8011B05F8011B013F9AD1B6E736 +S315080030F84FF0FF3341F2EC22C2F20002136041F2AC +S31508003108E800C2F200000360704700BF70B50446C5 +S315080031180D461646FFF718FEFF2823D004F1FF30A0 +S315080031284019FFF711FEFF281FD04FEA54224FF423 +S315080031384043C0F60003B3EB422F09D141F2E80039 +S31508003148C2F20000214632462B46FFF739FF70BD0A +S3150800315841F2EC20C2F20000214632462B46FFF720 +S315080031682FFF70BD4FF0000070BD4FF0000070BD16 +S315080031782DE9F04106460D46FFF7E6FD044606F139 +S31508003188FF304019FFF7E0FD0546FF2C59D0FF2808 +S315080031985BD0844249D8022C4BD90B284DD8FEF768 +S315080031A81FFC4FF0F300FEF73BFCFEF73FFC012837 +S315080031B805D1FEF72BFC4FF00000BDE8F08149F277 +S315080031C84816C0F600064FF002072B1B03F0010845 +S315080031D800F010FD36F814003946FEF78FFC08286B +S315080031E837D008E000F006FD36F814003946FEF731 +S315080031F885FC082805D0FEF709FC4FF00000BDE855 +S31508003208F08104F1010404F0FF0400F0F3FC36F839 +S3150800321814003946FEF772FC082832D0EBE7FEF7A9 +S31508003228F5FB4FF00100BDE8F0814FF00000BDE85E +S31508003238F0814FF00000BDE8F0814FF00000BDE8CE +S31508003248F0814FF00000BDE8F0814FF00000BDE8BE +S31508003258F08104F10104E4B2A542E0D34FFA88F1FB +S315080032680029BFD000F0C6FC36F814003946FEF728 +S3150800327845FC0828BFD104F10104E4B2A542B1D23D +S31508003288CDE704F10104E4B2A542ABD2C7E700BF13 +S3150800329800B583B041F2E803C2F200031868B0F13A +S315080032A8FF3F1ED041F2E803C2F2000399685A6844 +S315080032B88818D96840181A698118586909189A69BE +S315080032C88818DB69C118C1F1000002AA42F8040D82 +S315080032D84CF28810C0F600004FF00401FFF716FFFD +S315080032E801E04FF0010003B000BD00BF4CF2040234 +S315080032F8C0F600024FF44043C0F600031068196888 +S3150800330842184CF20803C0F60003186811184CF264 +S315080033180C02C0F600021368C8184CF21001C0F671 +S3150800332800010A6880184CF21403C0F600031968ED +S3150800333842184CF21800C0F600000368D1184CF27F +S315080033488812C0F6000210680B18D3F1010038BFBE +S315080033580020704708B541F2E803C2F2000318686E +S31508003368B0F1FF3F06D041F2E800C2F20000FFF7CD +S3150800337893FD88B141F2EC21C2F200010A68B2F164 +S31508003388FF3F0CD041F2EC20C2F20000FFF784FDA3 +S31508003398003018BF012008BD4FF0000008BD4FF0E7 +S315080033A8010008BD4FF44040C0F60000704700BF52 +S315080033B808B5FFF79DFE08BD08B5FFF7A7FE08BDC7 +S315080033C808B5FFF7D5FE08BD08B5FFF78FFF08BD96 +S315080033D808B5FFF75DFF10B1FFF7BCFF08BD4FF052 +S315080033E8000008BD4EF21003CEF200034FF00002AB +S315080033F81A60704708B5FFF7F5FF4EF21003CEF2CC +S31508003408000349F23F02C0F202025A604FF0000078 +S3150800341898604FF00501196041F2F043C2F20003C3 +S31508003428186008BD4EF21003CEF20003186810F4AF +S31508003438803F07D041F2F041C2F200010A6802F162 +S3150800344801020A60704700BF08B5FFF7EBFF41F2B3 +S31508003458F043C2F20003186808BD00BF10B5044659 +S315080034684FF4A050C4F201004FF02001FEF75EFEAB +S31508003478012809D14FF4A050C4F20100FEF750FE06 +S3150800348820704FF0010010BD4FF0000010BD00BFBE +S3150800349838B504464FF4A050C4F201004FF0800135 +S315080034A8FEF744FEA8B14FF4A050C4F20100214625 +S315080034B8FEF730FE4FF4A054C4F201044FF080051D +S315080034C820462946FEF732FE0028F9D04FF00100BB +S315080034D838BD4FF0000038BD10B584B04FF46143CD +S315080034E800934FF00000ADF80400ADF80600ADF8FB +S315080034F80800ADF80C004FF00C01ADF80A104FF4AF +S31508003508A054C4F2010420466946FEF76FFD20461A +S315080035184FF00101FEF7EEFD04B010BD2DE9F843A2 +S3150800352805460C46402907D949F2E410C0F60000BA +S315080035384FF0770100F038FA2046FFF7A9FF01286F +S3150800354807D049F2E410C0F600004FF07B0100F0FE +S315080035582BFA264644B349F2E417C0F600074FF09B +S3150800356884084FF0000406F1FF3303F0010900F060 +S3150800357841FB285DFFF78CFF012817D11AE000F0F8 +S3150800358839FB285DFFF784FF012803D038464146F2 +S3150800359800F00AFA04F1010400F02CFB285DFFF795 +S315080035A877FF012820D123E0BDE8F883384641464D +S315080035B800F0FAF904F10104012EF5D90FFA89F099 +S315080035C80028DCD000F016FB285DFFF761FF01280C +S315080035D803D03846414600F0E7F904F10104A1B2E0 +S315080035E8B142CCD3BDE8F8833846414600F0DCF949 +S315080035F804F10104A2B2B242C1D3BDE8F88300BF00 +S3150800360810B5044641F23953C2F200031878B0B926 +S3150800361841F2F440C2F20000FFF720FF01283CD12E +S3150800362841F23953C2F200034FF0010018704FF007 +S31508003638000041F23851C2F20001087010BD41F28B +S315080036483851C2F200010A7802F1010241F2F44344 +S31508003658C2F200039818FFF701FF012820D141F2AA +S315080036683850C2F20000017801F10101CAB20270AD +S3150800367841F2F443C2F200031878904213D1204667 +S315080036880A49FFF72DFB41F23951C2F200014FF002 +S3150800369800020A704FF0010010BD4FF0000010BD7F +S315080036A84FF0000010BD4FF0000010BDF5140020C3 +S315080036B82DE9F84F4FF0000249F2E420C0F6000061 +S315080036C84FF4FA714AF2104340F2FF3912F800C073 +S315080036D8841864780CEB040808FB011693FBF6FAC1 +S315080036E806FB1A3636B955460AF1FF381FFA88F81E +S315080036F8C84512D902F1020210F802C08618747871 +S315080037080CEB040A0AFB011893FBF8F608FB163AB1 +S31508003718BAF1000F40F0A08095E0E34627464FF43B +S31508003728D040C4F200004FF000024261016841F43B +S3150800373800430360066816F4004F09D04FF4D044D6 +S31508003748C4F2000400F056FA206810F4004FF9D1C4 +S315080037584FF4D041C4F200010A6822F002030B6054 +S315080037680E6846F001000860496811F0010F09D192 +S315080037784FF4D044C4F2000400F03CFA626812F030 +S31508003788010FF9D00BF1FF3307F1FF374FEA075757 +S3150800379847EA034605F1FF3535434FF4D040C4F2EE +S315080037A80000C561016821F001020260436813F050 +S315080037B8010F09D04FF4D044C4F2000400F01AFAF5 +S315080037C8606810F0010FF9D14FF4C841C4F200013E +S315080037D8D1F8002242F00103C1F80032D1F81C02E0 +S315080037E820F48042C1F81C22D1F80C3243F48040F8 +S315080037F8C1F80C024FF00002C1F8B022C1F8B42291 +S31508003808D1F8043223F48040C1F80402D1F814220E +S3150800381822F48043C1F81432D1F81C0240F48042DD +S31508003828C1F81C22D1F8003223F00100C1F80002C1 +S31508003838BDE8F88F49F26420C0F600004FF0F001A1 +S3150800384800F0B2F86BE793FBF8F505F1FF381FFAB5 +S3150800385888F8C8457FF661AF02F10202242A7FF488 +S3150800386835AFE7E738B504460D464FF4D043C4F2FA +S315080038780003986810F0806F07D149F26420C0F6F3 +S3150800388800004FF4A27100F08FF84FF4D043C4F249 +S315080038980003D3F8802102F00101C3F88011D3F898 +S315080038A8800140F07C4242F40011C3F88011C3F845 +S315080038B88451E078A2784FEA024141EA006022780A +S315080038C81043617840EA0120C3F88801E179A279B2 +S315080038D84FEA024040EA016221790A43607942EADE +S315080038E80022C3F88C21D3F8801141F00100C3F8EF +S315080038F880019B6813F0806F09D14FF4D044C4F255 +S31508003908000400F077F9A26812F0806FF9D038BD84 +S315080039184FF4D043C4F20003D96811F0030F40D01E +S315080039284FF4D042C4F20002D2F8B01140F26763ED +S31508003938B3EB515F2AD14FF4D041C4F20001D1F854 +S31508003948B8210270D1F8B8314FEA13224270D1F87B +S31508003958B8314FEA13428270D1F8B8314FEA136288 +S31508003968C270D1F8BC310371D1F8BC214FEA1223D1 +S315080039784371D1F8BC214FEA12438371D1F8BC11BF +S315080039884FEA1162C2714FF0010001E04FF00000E2 +S315080039984FF4D043C4F20003D96841F02002DA6034 +S315080039A870474FF00000704708B541F23C53C2F221 +S315080039B80003186041F24050C2F20000016000F0AE +S315080039C819F9FCE708B500F00FF9012822D000F02C +S315080039D801FCF8B141F24453C2F2000318780128F1 +S315080039E818D1FFF731FD41F24851C2F200010A68C1 +S315080039F802F51C5303F1100398420BD341F24450C5 +S31508003A08C2F200004FF00001017000F0EDFB08B9A2 +S31508003A18FFF74EF908BD00BF08B541F24453C2F294 +S31508003A2800034FF001021A70FFF70EFD41F24851E4 +S31508003A38C2F200010860FFF7C5FF08BD08B500F027 +S31508003A48D7F8FFF7D7FCFFF7B3FC00F0ABFB00F09D +S31508003A580FF8FFF7E1FF08BD08B500F0CBF8FFF748 +S31508003A68E1FC00F01DFD00F02DF8FFF7ABFF08BDDF +S31508003A7830B583B04FF0FF038DF804304FF00005DA +S31508003A888DF8055000F0CEF8FFF712FE40F218043C +S31508003A98C2F200044FF001002070FFF71DFD2570E3 +S31508003AA805F0E4F84FF00301217041F24C52C2F2D6 +S31508003AB800021378012B02D101A800F0D7F803B049 +S31508003AC830BD00BF08B541F25050C2F20000FFF7FA +S31508003AD81FFF01280CD140F21803C2F200034FF069 +S31508003AE801021A7041F25050C2F2000000F0BEF806 +S31508003AF841F25050C2F20000FFF782FD01280CD1AE +S31508003B0840F21800C2F200004FF00001017041F2BD +S31508003B185050C2F2000000F0A9F841F25050C2F223 +S31508003B28000005F01FF901280CD140F21803C2F26B +S31508003B3800034FF003021A7041F25050C2F2000017 +S31508003B4800F094F808BD00BF704700BF38B50546B1 +S31508003B580C4640F21803C2F200031878012803D16C +S31508003B682846C9B2FFF77EFE40F21801C2F20001E4 +S31508003B780A781AB92846E1B2FFF7D0FC40F21803CA +S31508003B88C2F200031878032803D12846E1B205F0E3 +S31508003B98A9F800F061F838BD40F21803C2F200032C +S31508003BA81878012804D0022814BF4020002070473E +S31508003BB84FF00800704700BF40F21803C2F200032E +S31508003BC81878012804D0022814BF4020002070471E +S31508003BD84FF00800704700BF41F24C53C2F2000389 +S31508003BE84FF001021A70704708B500F02BF808BDA7 +S31508003BF8704700BF704700BF41F29053C2F20003F6 +S31508003C084FF000025A70704741F29053C2F200030F +S31508003C184FF0FE02DA7018714FF00200A3F844005C +S31508003C28704700BF41F29053C2F200034FF00002FA +S31508003C381A709A6483F84320A3F844209A705A7035 +S31508003C48704700BF41F29053C2F20003187800305B +S31508003C5818BF0120704700BF41F29053C2F2000313 +S31508003C684FF0000283F84320704700BF38B5044672 +S31508003C780378FF2B2BD100F0ADFA20B94FF01000CE +S31508003C88FFF7C2FFE0E1FFF7B7FF41F29054C2F22F +S31508003C9800044FF0010525704FF0FF02E2704FF05F +S31508003CA8100323714FF000006071FFF775FFA071CC +S31508003CB8FFF782FFE071FFF77FFF4FEA10212172B5 +S31508003CC86572A5724FF00802A4F84420BCE141F2D7 +S31508003CD89052C2F200021078012840F0D681A3F16A +S31508003CE8C903352B00F2AC81DFE813F00601AA01F7 +S31508003CF8AA01A501AA01AA0197012D017D0167015B +S31508003D08AA01AA01AA01AA01AA01AA01AA01AA0145 +S31508003D18AA01AA01AA01AA01AA01AA01AA01AA0135 +S31508003D28AA01AA01AA01AA01AA01AA01AA01AA0125 +S31508003D38AA01AA01AA01AA01AA01AA01AA01AA0115 +S31508003D488B00590036007D00AA01AA01AA01C20003 +S31508003D58AA01DC00E100F5006578FFF71DFF00F110 +S31508003D68FF30854204DD4FF02200FFF74DFF6BE177 +S31508003D7841F29055C2F2000505F10400A96C627873 +S31508003D88FEF7AEFF4FF0FF01E9706278AB6CD0180A +S31508003D98A864617801F10101A5F8441054E1657831 +S31508003DA8FFF7FAFE00F1FF32954204DD4FF02200D4 +S31508003DB8FFF72AFF48E1616841F29055C2F200050B +S31508003DC8A96405F104006278FEF78AFF4FF0FF033D +S31508003DD8EB706078A96C4218AA64637803F101034A +S31508003DE8A5F8443030E141F29050C2F200004FF095 +S31508003DF8FF01C170636883644FF00102A0F844208C +S31508003E0822E141F29050C2F200004FF0FF01C17062 +S31508003E18836C6468C4B1E4186FEA0302101900F0E9 +S31508003E28010213F8011BA34240F030810EE01A463E +S31508003E3812F8010B09185B7853FA81F0C1B202F13E +S31508003E480103A342F3D101E04FF0000141F2905378 +S31508003E58C2F20003C3F807104FF001021A714FF0B7 +S31508003E680001597199714FF00800A3F84400EBE076 +S31508003E7841F29050C2F200004FF0FF03C37049F2B6 +S31508003E880832C0F6000282644FF0000101714171E0 +S31508003E9881714FF00703C0F807304FF00802A0F801 +S31508003EA84420D1E04FF00000FFF7AEFECCE041F227 +S31508003EB89050C2F200004FF0FF01C1704FF00003A6 +S31508003EC80371427842718371C37103724FF0060118 +S31508003ED8A0F84410B8E041F29054C2F200044FF03A +S31508003EE800012170FFF788FE4FF0FF03E3704FF0DB +S31508003EF80102A4F84420A7E041F29055C2F2000551 +S31508003F08AD6CFFF749FE00F1FF31284604F10102BE +S31508003F18FFF752FA20B94FF03100FFF775FE93E024 +S31508003F2841F29054C2F200044FF0FF03E370A56C07 +S31508003F38FFF732FE05F1FF352818A0644FF0010196 +S31508003F48A4F8441080E06578FFF726FEA0F1020081 +S31508003F58854204DD4FF02200FFF756FE74E041F271 +S31508003F689051C2F200014FF0FF02CA704FF00100EB +S31508003F78A1F84400617841B9FFF72AFA002863D105 +S31508003F884FF03100FFF740FE5EE041F29053C2F26F +S31508003F980003986C04F10202FFF70EFA20B94FF0F5 +S31508003FA83100FFF731FE4FE041F29050C2F20000AF +S31508003FB86178826C8B18836446E041F29054C2F2A9 +S31508003FC800044FF0FF05E5704FF00005257165718F +S31508003FD8FFF7E2FDA071E571257265724FF00703D8 +S31508003FE8A4F8443030E041F29052C2F20002906CD4 +S31508003FF86168FFF7E5F920B94FF03100FFF704FECD +S3150800400822E041F29051C2F200014FF0FF00C87059 +S315080040184FF00103A1F8443016E0FEF791FE41F28D +S315080040289050C2F200004FF0FF01C1704FF0010234 +S31508004038A0F8442008E04FF03100FFF7E5FD03E05B +S315080040484FF02000FFF7E0FD41F29053C2F200035B +S3150800405893F84300012803D14FF01000FFF7D4FD69 +S3150800406841F29051C2F20001B1F844100AB2002A8E +S315080040780BDD41F29050C2F200004FF0010380F8C0 +S31508004088433000F10300FFF761FD38BD002A3FF40D +S31508004098CEAE13F8010B0918C9B2A3427FF4C7AE0E +S315080040A8D4E600BF30B402464CF6CD44CCF6CC4430 +S315080040B801F10101A4FB0223DA08F9D14FF0000542 +S315080040C801F8015902464CF6CD45CCF6CC450846CA +S315080040D8A5FB02434FEAD30303EB8304A2EB44028E +S315080040E802F1300201F801291A46002BEFD130BC3B +S315080040F8704700BF38B50546007804F007FFC0B218 +S31508004108A0F13004E4B2162C20D8A0F13A02D1B2B4 +S3150800411806291ED9092C84BFA0F13704E4B26878A9 +S3150800412804F0F4FEC0B2A0F13003D9B2162913D8A8 +S31508004138A0F13A02D3B2062B11D9092984BFA0F1F6 +S315080041483701C9B201EB0414E0B238BD4FF00000DC +S3150800415838BD4FF0000038BD4FF0000038BD4FF0AD +S31508004168000038BD08B500F00F03092802D903F185 +S31508004178370008BD03F1300004F0C8FEC0B208BD18 +S3150800418838B505460C464FEA1010FFF7EBFF2070C6 +S3150800419805F00F00FFF7E6FF60704FF00003A37005 +S315080041A8204638BD08B54FF0000041F21C63C2F23C +S315080041B80003187041F22861C2F2000102F0A6FB5A +S315080041C838B149F21030C0F600004FF07C01FFF70D +S315080041D8EBFB08BD41F21C63C2F200031878D0F164 +S315080041E8010038BF0020704708B5FFF7FDFC012815 +S315080041F80FD041F21C63C2F20003187860B9FEF7C3 +S3150800420831FC01280BD141F21C61C2F20001087089 +S3150800421808BD4FF0000008BD4FF0000008BD4FF07C +S31508004228000008BD10B50446007804F06FFE532850 +S315080042380DD1607804F062FE60B1607831280CD040 +S3150800424832280DD0332814BF0320022010BD4FF0A2 +S31508004258030010BD4FF0030010BD4FF0000010BD5D +S315080042684FF0010010BD00BFF8B5044600F1020082 +S31508004278FFF740FF0646054604F1040400F0010767 +S315080042882046FFF737FF3018C6B205F1FF318DB261 +S3150800429804F10204012D21D815E02046FFF72AFF6C +S315080042A83018C6B205F1FF3504F10204ADB220464E +S315080042B8FFF720FF3118CEB205F1FF3295B204F1A7 +S315080042C80204012DE9D82046FFF714FF6FEA060312 +S315080042D8DEB2864214BF00200120F8BD3FB2002F87 +S315080042E8DBD02046FFF706FF3218D6B205F1FF33B2 +S315080042F89DB204F10204012DCFD8E4E72DE9F04177 +S3150800430804461546884601B138B949F21030C0F650 +S31508004318000040F23621FFF747FB2046FFF782FFE9 +S315080043280646032800F0B0802046FFF79DFF0028C0 +S3150800433800F0AD80012E34D01EB1022E40F0AA80BE +S3150800434865E004F10200FFF7D5FE074604F104000C +S31508004358FFF7D0FE4FEA0026C8F8006004F1060009 +S31508004368FFF7C8FE3118C8F8001004F10804A7F1C9 +S315080043780307BFB2002D00F08F800FFA87F8B8F14F +S31508004388000F40F389804FF000062046FFF7B2FE7B +S31508004398A85504F1020406F10106B6B24645F4DB4F +S315080043A87AE004F10200FFF7A5FE074604F10400C7 +S315080043B8FFF7A0FE4FEA0046C8F8006004F10600B9 +S315080043C8FFF798FE06EB0026C8F8006004F1080017 +S315080043D8FFF790FE3218C8F8002004F10A04A7F17E +S315080043E80407BFB2002D57D00FFA87F8B8F1000FA7 +S315080043F852DD4FF000062046FFF77CFEA85504F16B +S31508004408020406F10106B6B24645F4DB44E004F1B7 +S315080044180200FFF76FFE074604F10400FFF76AFE7D +S315080044284FEA0066C8F8006004F10600FFF762FE66 +S3150800443806EB0046C8F8006004F10800FFF75AFEC4 +S3150800444806EB0026C8F8006004F10A00FFF752FEDA +S315080044583018C8F8000004F10C04A7F10507BFB224 +S31508004468D5B10FFA87F8B8F1000F15DD4FF0000639 +S315080044782046FFF73FFEA85504F1020406F1010697 +S31508004488B6B24645F4DB07E04FF0000704E04FF6FE +S31508004498FF7701E04FF0000738B2BDE8F08100BFAA +S315080044A870B541F21C63C2F200031878002800F0C0 +S315080044B84D82012843D1FEF7FFFA49F28430C0F647 +S315080044C80000FEF747FB49F2A830C0F60000FEF7E1 +S315080044D841FBFEF7EBFA0146C6484FF0010202F027 +S315080044E82FFA50B149F2D030C0F60000FEF732FB79 +S315080044F84FF00100FEF71EFB70BD49F2D830C0F632 +S315080045080000FEF727FB49F2E030C0F60000FEF788 +S3150800451821FB49F20440C0F60000FEF71BFB41F2F6 +S315080045282063C2F200034FF000021A605A6041F293 +S315080045381C60C2F200004FF00201017070BD02282B +S3150800454840F0088141F22864C2F2000441F680204E +S31508004558C2F200004FF4807104F50D7202F07EFE77 +S3150800456894F93A12002915DA49F2D030C0F6000053 +S31508004578FEF7F0FA4FF00200FEF7DCFA04F50D70C4 +S3150800458802F0F0FC41F21C60C2F200004FF0000194 +S31508004598017070BD18B341F68026C2F2000630468F +S315080045A806F5C0714FF00002FFF7A8FE0646B0F1FF +S315080045B8FF3F14D149F2D030C0F60000FEF7CAFA18 +S315080045C84FF00300FEF7B6FA8A4802F0CBFC41F230 +S315080045D81C63C2F200034FF000021A7070BD32B2B3 +S315080045E8002A2CDD41F22063C2F20003586868B934 +S315080045F841F22061C2F2000141F68023C2F20003AB +S31508004608D3F88001086036B24E6018E041F680217A +S31508004618C2F20001D1F8802141F22063C2F20003F8 +S3150800462819688A4204D241F22063C2F200031A606A +S3150800463800FA86F041F22062C2F20002506041F2A6 +S315080046482861C2F20001D1F83C22D1F840329A42D8 +S3150800465840F07C8167484FF0000102F08FFCA0B15A +S3150800466849F2D030C0F60000FEF774FA4FF004009D +S31508004678FEF760FA5F4802F075FC41F21C60C2F268 +S3150800468800004FF00001017070BD49F2D830C0F63D +S315080046980000FEF75FFA49F23440C0F60000FEF75C +S315080046A859FA41F22064C2F2000441F2DC55C2F21A +S315080046B8000560682946FFF7F5FC2846FEF74AFA1A +S315080046C849F24040C0F60000FEF744FAE078294669 +S315080046D8FFF756FDA07805F10201FFF751FD60784E +S315080046E805F10401FFF74CFD207805F10601FFF7EF +S315080046F847FD2846FEF72EFA49F2E440C0F60000C0 +S31508004708FEF728FA20686168FEF75AFEA0B949F24A +S31508004718D030C0F60000FEF71DFA4FF00500FEF788 +S3150800472809FA344802F01EFC41F21C63C2F200037F +S315080047384FF000021A7070BD49F2D830C0F6000072 +S31508004748FEF708FA41F21C60C2F200004FF00301B6 +S31508004758017070BD032840F0F98041F22864C2F25E +S31508004768000441F68020C2F200004FF4807104F577 +S315080047780D7202F073FD94F93A12002915DA49F216 +S315080047885C40C0F60000FEF7E5F94FF00200FEF7B8 +S31508004798D1F904F50D7002F0E5FB41F21C63C2F28B +S315080047A800034FF00000187070BD28B341F6802248 +S315080047B8C2F20002104602F5C07102F58072FFF7D0 +S315080047C89DFD0546B0F1FF3F16D149F28040C0F677 +S315080047D80000FEF7BFF94FF00300FEF7ABF90548EE +S315080047E802F0C0FB41F21C61C2F200014FF0000260 +S315080047F80A7070BD5C1800202BB2002B5EDD49F2EA +S31508004808A440C0F60000FEF7A5F92EB241F2DC5422 +S31508004818C2F2000430462146FFF744FC2046FEF75C +S3150800482899F949F2B440C0F60000FEF793F941F643 +S315080048388025C2F2000595F883012146FFF7A0FCFA +S3150800484895F8820104F10201FFF79AFC95F88101AF +S3150800485804F10401FFF794FC95F8800104F10601B8 +S31508004868FFF78EFC2046FEF775F949F2E440C0F6D4 +S315080048780000FEF76FF9D5F88001314605F5807214 +S31508004888FEF79AFDA0B949F2D030C0F60000FEF747 +S3150800489861F94FF00600FEF74DF92D4802F062FB64 +S315080048A841F21C63C2F200034FF00000187070BD95 +S315080048B849F2D830C0F60000FEF74CF941F22860F4 +S315080048C8C2F20000D0F83C12D0F8402291423DD1FD +S315080048D849F2CC40C0F60000FEF73CF9FEF778FD31 +S315080048E8A0B949F2D030C0F60000FEF733F94FF008 +S315080048F80700FEF71FF9164802F034FB41F21C615F +S31508004908C2F200014FF000020A7070BD49F2D830B1 +S31508004918C0F60000FEF71EF949F2E840C0F60000A6 +S31508004928FEF718F90A4802F01DFB49F20050C0F6CE +S315080049380000FEF70FF941F21C63C2F200034FF0BC +S3150800494800001870FEF7D4F8FEF7B2F970BD00BF7C +S315080049585C18002010B4E2B182186FEA0004131933 +S3150800496803F0010401F1FF3111F8013F00F8013B9A +S31508004978904210D10DE001F101044978034603F885 +S31508004988011B04F101016478447003F101009042A7 +S31508004998F1D110BC7047002CEDD011F8013F00F892 +S315080049A8013B9042E7D1F4E792B182186FEA000317 +S315080049B8D31803F0010300F8011B904209D1704788 +S315080049C8034603F8011B417003F101009042F7D131 +S315080049D87047002BF4D000F8011B9042F0D17047BD +S315080049E8037833B18B4204D010F8013F0BB18B42E0 +S315080049F8FAD11846704700BFCA7E8B7E43EA02235F +S31508004A080078032805D1487D097D41EA002243EA52 +S31508004A1802431846704700BF8176C1F30723C37659 +S31508004A284FEA114101754FEA11224275704700BFD6 +S31508004A3803784FEAC31242EA53014378CA18D1B237 +S31508004A484FEAC11343EA5101827852FA81F3D9B27F +S31508004A584FEAC11242EA5103C17851FA83F2D3B236 +S31508004A684FEAC31141EA5303027952FA83F1CBB2EA +S31508004A784FEAC31242EA5301437953FA81F2D1B293 +S31508004A884FEAC11343EA5101827952FA81F3D9B23E +S31508004A984FEAC11242EA5103C17951FA83F2D3B2F5 +S31508004AA84FEAC31141EA5303027A52FA83F1CBB2A9 +S31508004AB84FEAC31242EA5301437A53FA81F2D1B252 +S31508004AC84FEAC11343EA5101807A50FA81F2D0B20B +S31508004AD8704700BF08B5024688B1036893B11978CC +S31508004AE899B1D8889288904212D15878FCF714FE62 +S31508004AF800F00103002B14BF0320002008BD4FF067 +S31508004B08090008BD4FF0090008BD4FF0090008BDA7 +S31508004B184FF0090008BD00BF10B504460A4640789C +S31508004B2804F134014FF00103FCF710FE00283ED1CA +S31508004B3894F8332294F8323243EA022001B24AF64C +S31508004B485522CFF6FF72914234D194F86D0094F845 +S31508004B586C304FEA034141EA006294F86A0042EA77 +S31508004B68000394F86B1043EA012222F07F4044F2CE +S31508004B784613C0F2540398421FD094F8891094F843 +S31508004B8888204FEA024040EA016194F8863041EAF3 +S31508004B98030294F8870042EA002121F07F4244F292 +S31508004BA84613C0F25403D01A18BF012010BD4FF09F +S31508004BB8030010BD4FF0020010BD4FF0000010BDF5 +S31508004BC82DE9F041154603681C78A4F13004092C30 +S31508004BD800F2E5815A783A2A40F0E18103F10203A6 +S31508004BE803604FF000030B60002C40F08C8141F6FF +S31508004BF80864C2F200042468002C00F088810C605E +S31508004C08217889B16078FCF787FD10F0010F0BD180 +S31508004C18002D00F0808100F00401C8B2002814BFF6 +S31508004C280A200020BDE8F0814FF00000207060706F +S31508004C38FCF754FD10F0010F40F071812DB100F01A +S31508004C480402D0B2002840F06E8120464FF00001D9 +S31508004C58FFF762FF012819D194F8F631002B00F006 +S31508004C68668194F8FD5194F8FC114FEA014242EA2C +S31508004C78056094F8FA3140EA030194F8FB5141EAD1 +S31508004C88052520462946FFF747FF01E04FF00005AE +S31508004C98032800F05081002840F0518194F84020FC +S31508004CA894F83F0040EA022319B2B1F5007F40F0B4 +S31508004CB84A8194F84B2094F84A0050EA02210FD109 +S31508004CC894F85B1094F85A304FEA034242EA0160B6 +S31508004CD894F8581040EA010394F8592043EA022147 +S31508004CE8E16194F84420E27002F1FF30C3B2012B67 +S31508004CF800F22D8194F84130A370002B00F02B8127 +S31508004D0803F1FF30184240F02A8194F8466094F877 +S31508004D18450040EA0626B0B2208116F00F0F40F08B +S31508004D28228194F8487094F8476056EA07260ED107 +S31508004D3894F8577094F856604FEA064646EA0767A5 +S31508004D4894F854603E4394F8557046EA072694F852 +S31508004D5843C094F8427057EA0C2700F0088102FB12 +S31508004D6801FC07EB101262449642C0F00481B61A99 +S31508004D78B6FBF3F3002B00F0028140F6F576B34252 +S31508004D888CBF022601264FF6F578434500F20B81BB +S31508004D9803F10203A3612562EF1967625219E262F9 +S31508004DA8032E15D1002840F0EE8094F8630094F895 +S31508004DB862204FEA024242EA006094F86020024301 +S31508004DC894F8610042EA0022A2624FEA830011E0E1 +S31508004DD8002800F0DC806744A762022E02D14FEA59 +S31508004DE8430007E04FF0030000FB03F203F001035A +S31508004DF803EB520000F2FF13B1EB532FC0F0CB8040 +S31508004E084FF0FF3121614FF00000E060032E6CD1AE +S31508004E18607194F8652094F8643043EA02216A18A8 +S31508004E286261607804F134014FF00103FCF78EFCE7 +S31508004E3800285AD194F8330294F8322242EA002319 +S31508004E4819B24AF65520CFF6FF7081424DD194F82B +S31508004E58372094F836304FEA034141EA026094F85D +S31508004E68342040EA020394F8351043EA012045F253 +S31508004E785222C4F26112904237D194F81B1294F860 +S31508004E881A324FEA034040EA016294F8181242EAD5 +S31508004E98010394F8190243EA002247F27221C6F27E +S31508004EA841118A4221D194F8230294F822324FEA12 +S31508004EB8034242EA006194F8200241EA000394F8A2 +S31508004EC8212243EA0221E16094F81F0294F81E326F +S31508004ED84FEA034242EA006194F81C0241EA0003D9 +S31508004EE894F81D2243EA0221216126703348038873 +S31508004EF803F101039AB20280E2804FF000002063B2 +S31508004F082071BDE8F0814FF00B00BDE8F0814FF045 +S31508004F180C00BDE8F0814FF00000BDE8F0814FF0C5 +S31508004F280300BDE8F0814FF00A00BDE8F0814FF0B4 +S31508004F380D00BDE8F0814FF00100BDE8F0814FF0A3 +S31508004F480D00BDE8F0814FF00D00BDE8F0814FF087 +S31508004F580D00BDE8F0814FF00D00BDE8F0814FF077 +S31508004F680D00BDE8F0814FF00D00BDE8F0814FF067 +S31508004F780D00BDE8F0814FF00D00BDE8F0814FF057 +S31508004F880D00BDE8F0814FF00D00BDE8F0814FF047 +S31508004F980D00BDE8F0814FF00D00BDE8F0814FF037 +S31508004FA80000086023E603F10203A3612562EF19EE +S31508004FB867625619E6624FF00306F3E6041E0020F8 +S31508004FC82DE9F0410C4601F109020369002B00F0AE +S31508004FD8E28043691E7B1978202900F08A80052912 +S31508004FE814BF0A46E52206F0080505F0FF0135B1A3 +S31508004FF8A2F14105EDB2192D9CBF2032D2B26272D8 +S3150800500804F10A025D78202D73D0052D08BFE52521 +S3150800501831B1A5F14102D2B2192A9CBF2035EDB2A9 +S31508005028A57204F10B029D78202D62D0052D08BFC4 +S31508005038E52531B1A5F14102D2B2192A9CBF20351E +S31508005048EDB2E57204F10C02DD78202D51D0052D5C +S3150800505808BFE52531B1A5F14102D2B2192A9CBF8C +S315080050682035EDB2257304F10D021D79202D40D0A7 +S31508005078052D08BFE52531B1A5F14102D2B2192A95 +S315080050889CBF2035EDB2657304F10E025D79202DBB +S315080050982FD0052D08BFE52531B1A5F14102D2B2B9 +S315080050A8192A9CBF2035EDB2A57304F10F029D7924 +S315080050B8202D1ED0052D08BFE52531B1A5F14102E1 +S315080050C8D2B2192A9CBF2035EDB2E57304F1100255 +S315080050D8DD79202D0DD0052D08BFE52531B1A5F1BF +S315080050E84101CAB2192A9CBF2035EDB2257404F1CC +S315080050F811021D7A202D36D015464FF02E0105F8D7 +S31508005108011B197A20292DD006F0100606F0FF058E +S3150800511836B1A1F14106F6B2192E9CBF2031C9B2A3 +S31508005128517002F10206597A20290DD035B1A1F13C +S315080051384106F6B2192E9CBF2031C9B2917002F108 +S315080051480306997A202901D132460CE035B1A1F136 +S315080051584105EEB2192E9CBF2031C9B2D17002F1B1 +S31508005168040200E02A46D97A2172DD7F9E7F4FEA3B +S31508005178064141EA05661D7F2E43597F46EA012600 +S3150800518826605D7E197E41EA0526A680D97D9B7D27 +S3150800519843EA0126E6804FF000011170A6698EB32E +S315080051A8E2697AB30569E5B1018C4FF6FF7399424E +S315080051B81AD0C7693888D0B14FF00005A8464146C5 +S315080051C802F0B4F80146A8B1E06900F1FF32AA4234 +S315080051D813D9715505F1010537F8020F0028EED1E4 +S315080051E80DE04FF000050AE04FF0000507E04FF024 +S315080051F8000504E04FF0000501E04FF000054FF008 +S3150800520800037355BDE8F0812DE9F8430446037990 +S31508005218002B40D0076B00F13405407829463A46FA +S315080052284FF00103FCF7CCFA002838D14FF00000FC +S315080052382071616A8F4236D3E2698B189F4236D24B +S31508005248E678012E37D94FF0010806EA0809BF188B +S31508005258607829463A464346FCF7B2FA06F1FF361D +S3150800526846452CD113E0E269BF18607829463A46C4 +S315080052784346FCF7A5FAE369FF18607829463A46D3 +S315080052884346FCF79DFAA6F10206012EEBD14FF02C +S315080052980000BDE8F8834FF00000BDE8F8834FF03A +S315080052A80100BDE8F8834FF00000BDE8F8834FF029 +S315080052B80000BDE8F8834FF00000BDE8F883B9F1AF +S315080052C8000FD0D0E1697F18607829463A464346E8 +S315080052D8FCF776FA06F1FF36012EC4D1D7E700BFE8 +S315080052E838B504460D46036B8B420DD0FFF78CFF85 +S315080052F868B9607804F134012A464FF00103FCF7CF +S3150800530825FA38B9256338BD4FF0000038BD4FF087 +S31508005318010038BD4FF0010038BD00BF70B504461E +S31508005328FFF772FF034600285FD12378032B53D172 +S315080053386079002850D04FF00005256304F134063B +S31508005348304629464FF40072FFF72EFB4FF05501F9 +S3150800535884F832124FF0AA0284F833224FF0520327 +S3150800536884F8343084F835304FF0610084F8360014 +S315080053784FF0410284F837204FF0720184F818126A +S3150800538884F8191284F81A2284F81B02236984F807 +S315080053981C32C3F3072084F81D024FEA134284F827 +S315080053A81E224FEA136184F81F12E36884F8203234 +S315080053B8C3F3072084F821024FEA134284F822220D +S315080053C84FEA136184F823126078314662694FF010 +S315080053D80103FCF7F5F9657160784FF000010A4694 +S315080053E8FCF72CFA031C18BF0123184670BD00BF2A +S315080053F8A1F102018369A3F10203994204D28278D2 +S31508005408C06A02FB010070474FF00000704700BFF2 +S31508005418F8B505460C4601296DD9836999426DD2B6 +S315080054280078022832D0032845D0012869D101EB33 +S315080054385106696A284601EB5621FFF751FF0028ED +S3150800544862D14FEAC6524FEAD257EB1993F834702D +S3150800545806F10106696A284601EB5621FFF740FF5F +S31508005468002854D14FEAC6564FEAD656AD1995F8CC +S31508005478340047EA002214F0010F02D04FEA12104E +S31508005488F8BD4FEA02534FEA1350F8BD6A6A284630 +S3150800549802EB1121FFF724FF00283BD14FEA0464E9 +S315080054A84FEAD4502B1893F834102C1894F8352052 +S315080054B841EA0220F8BD696A284601EBD411FFF7CC +S315080054C80FFF002829D14FEA44644FEAD4516B18D4 +S315080054D893F8360093F837204FEA026444EA004204 +S315080054E893F8353042EA03206C1894F834100843C8 +S315080054F820F07040F8BD4FF00100F8BD4FF00100EC +S31508005508F8BD4FF0FF30F8BD4FF0FF30F8BD4FF04B +S31508005518FF30F8BD4FF0FF30F8BD4FF0FF30F8BD4B +S3150800552870B504460D46E180816801293CD00368B8 +S315080055389A6991423BD279B91878032801D1996AB0 +S3150800554851B94FF00000E0601A89AA4232D99B6A1D +S3150800555803EB151121611CE09E784FEA0616B54241 +S3150800556810D32068FFF754FF0146B0F1FF3F24D057 +S31508005578012825D923689A69904224D2AD1BADB271 +S31508005588AE42EED9E1602068FFF732FF00EB15114D +S31508005598216105F00F05206800EB451202F1340277 +S315080055A862614FF0000070BD4FF0020070BD4FF009 +S315080055B8020070BD4FF0020070BD4FF0010070BDCB +S315080055C84FF0020070BD4FF0020070BDF8B50546F1 +S315080055D80C461646012940F28C808369994280F068 +S315080055E88B800078022845D0032858D001287AD11C +S315080055F801EB5107696A284601EB5721FFF770FE48 +S315080056080346002871D14FEAC7524FEAD25314F01D +S31508005618010409D0E91891F8342002F00F00F1B214 +S3150800562840EA0112D0B200E0F0B2EB1883F8340071 +S3150800563807F101074FF001002871696A284601EB4E +S315080056485721FFF74DFE034600284ED14FEAC757A4 +S315080056584FEAD75014B1C6F3071607E02A1892F886 +S31508005668341021F00F07C6F303263E432F1887F890 +S3150800567834603AE06B6A284603EB1121FFF730FEDF +S31508005688034690BB4FEA04644FEAD452A91881F836 +S3150800569834600C46C6F3072681F8356025E06B6A40 +S315080056A8284603EBD111FFF71BFE0346E8B94FEA74 +S315080056B844644FEAD4502A1892F837104FEA016121 +S315080056C82C1801F07040064384F83460C6F30721A5 +S315080056D882F835104FEA164082F836004FEA166601 +S315080056E882F8376001E04FF002034FF00100287195 +S315080056F804E04FF0020301E04FF002031846F8BD34 +S315080057082DE9F0410546884631B9C66876B18369F8 +S315080057189E4228BF01260BE0FFF77AFE03460128BA +S3150800572845D9AA6990424CD3464601E04FF001068E +S3150800573834464FF0020704F10104A869844202D3EB +S31508005748012E37D93C4628462146FFF761FE03460F +S3150800575838B1B0F1FF3F34D0012832D0B442EAD18B +S315080057682BE02646284621466FF07042FFF72EFFA3 +S315080057780146B0B9B8F1000F06D028464146224678 +S31508005788FFF724FF014660B9EE602A69B2F1FF3FC8 +S3150800579816D002F1FF3028614FF0010169712346DE +S315080057A80FE0012914BF01234FF0FF3309E04FF03A +S315080057B8010306E04FF0000303E04FF0000300E0A2 +S315080057C823461846BDE8F0812DE9F84304460E46F7 +S315080057D8C58805F10105ADB2002D70D00369002B07 +S315080057E871D015F00F075FD103F101030361C16892 +S315080057F821B903681989A94269D955E000688278E8 +S3150800580802F1FF3313EA15134ED1FFF701FE80465E +S31508005818012860D9B0F1FF3F61D0206881698845C1 +S315080058283BD3002E5FD0E168FFF76AFF8046002861 +S315080058385DD001285FD0B0F1FF3F60D02068FFF740 +S31508005848E3FC00285FD1206800F134004FF000011E +S315080058584FF40072FFF7A8F8266830464146FFF766 +S31508005868C7FD30634FF000064FF001090EE080F8D7 +S3150800587804902068FFF7C8FC002848D12068026B06 +S3150800588802F10102026306F10106F6B2206882787F +S31508005898B242ECD8036B991B0163C4F80C802068E4 +S315080058A84146FFF7A5FD2061E580206800EB471211 +S315080058B802F1340262614FF00000BDE8F8834FF048 +S315080058C80400BDE8F8834FF00400BDE8F8834FF0FC +S315080058D80400BDE8F8834FF00200BDE8F8834FF0EE +S315080058E80100BDE8F8834FF00400BDE8F8834FF0DF +S315080058F80700BDE8F8834FF00200BDE8F8834FF0CB +S315080059080100BDE8F8834FF00100BDE8F8834FF0C1 +S315080059180100BDE8F88300BF2DE9F04F83B00446BF +S315080059284FF00001FFF7FCFD0746002840F02C82DF +S315080059384FF0FF0BD846DA464FF000092068216970 +S31508005948FFF7CEFC0746002840F01E8265692E78C8 +S31508005958002E00F00B82EB7A03F03F02E52E00F0EA +S31508005968E18103F00800C1B219B10F2A40F0DC81C1 +S3150800597802E00F2A40F09881E769002F00F0ED81D0 +S3150800598806F04003DAB232B195F80DB006F0BF0654 +S31508005998E188218404E0B04518BFD04640F0DD818F +S315080059A8687B0090584540F0C1812B7823F0400267 +S315080059B802F1FF3101EB410001EB80030193AA785C +S315080059C8697841EA022001F0EDFC80460198FE2834 +S315080059D800F2D68100F1010B37F8100001F0E2FC5D +S315080059E8804540F0CD812A79EB7843EA0220B8F160 +S315080059F8000F04D14FF6FF71884211D0C0E101F0BB +S31508005A08D1FC8046BBF1FE0F00F2BA8137F81B00BD +S31508005A18019A02F1020B01F0C5FC804540F0B081FD +S31508005A28A8796B7943EA0020B8F1000F04D14FF63C +S31508005A38FF71884210D0A3E101F0B4FC8046BBF19F +S31508005A48FE0F00F29D8137F81B000BF1010B01F0E0 +S31508005A58A9FC804540F094812A7AE87940EA022030 +S31508005A68B8F1000F04D14FF6FF73984210D087E1BA +S31508005A7801F098FC8046BBF1FE0F00F2818137F8E9 +S31508005A881B000BF1010B01F08DFC804540F0788175 +S31508005A98A97A6A7A42EA0120B8F1000F04D14FF6CA +S31508005AA8FF73984210D06BE101F07CFC8046BBF18D +S31508005AB8FE0F00F2658137F81B000BF1010B01F0A8 +S31508005AC871FC804540F05C81E87BA97B41EA0020AF +S31508005AD8B8F1000F04D14FF6FF72904210D04FE18B +S31508005AE801F060FC8046BBF1FE0F00F2498137F8E9 +S31508005AF81B000BF1010B01F055FC804540F0408175 +S31508005B08687C2B7C43EA0020B8F1000F04D14FF6D5 +S31508005B18FF71884210D033E101F044FC8046BBF19E +S31508005B28FE0F00F22D8137F81B000BF1010B01F06F +S31508005B3839FC804540F02481EA7CA87C40EA0220AA +S31508005B48B8F1000F04D14FF6FF73984210D017E149 +S31508005B5801F028FC8046BBF1FE0F00F2118137F8E8 +S31508005B681B000BF1010B01F01DFC804540F0088174 +S31508005B78697D2A7D42EA0120B8F1000F04D14FF663 +S31508005B88FF73984210D0FBE001F00CFC8046BBF18D +S31508005B98FE0F00F2F58037F81B000BF1010B01F038 +S31508005BA801FC804540F0EC80E87DA97D41EA0020AB +S31508005BB8B8F1000F04D14FF6FF72904210D0DFE01B +S31508005BC801F0F0FB8046BBF1FE0F00F2D98037F8EA +S31508005BD81B000BF1010B01F0E5FB804540F0D08076 +S31508005BE8687E2B7E43EA0020B8F1000F04D14FF6F1 +S31508005BF8FF71884210D0C3E001F0D4FB8046BBF1A0 +S31508005C08FE0F00F2BD8037F81B000BF1010B01F0FF +S31508005C18C9FB804540F0B4806A7F287F40EA0220A5 +S31508005C28B8F1000F04D14FF6FF73984210D0A7E0D9 +S31508005C3801F0B8FB8046BBF1FE0F00F2A18037F8E9 +S31508005C481B000BF1010B01F0ADFB804540F0988075 +S31508005C58E97FAA7F42EA0120B8F1000F10D001F0C7 +S31508005C68A1FB8046BBF1FE0F00F28A800BF101000A +S31508005C78019037F81B0001F095FB804505D07FE0B9 +S31508005C884FF6FF77B84274D07AE02B7803F04001D4 +S31508005C98CAB2002A6DD0B8F1000F6AD0019837F851 +S31508005CA81070002F65D06BE0B8F1000F04D12846B4 +S31508005CB8FEF7BEFE584567D04FF0FF332384A06928 +S31508005CC8C27A12F0010F33D129780378994231D173 +S31508005CD86978427891422FD1AB7881788B422DD159 +S31508005CE8EB78C27893422BD129790379994229D13D +S31508005CF869794279914227D1AB7981798B4225D145 +S31508005D08EB79C279934223D1297A037A994221D128 +S31508005D18697A427A91421FD1A97A807A814233D028 +S31508005D28D0461AE0D04618E0D04616E0D04614E029 +S31508005D38D04612E0D04610E0D0460EE0D0460CE039 +S31508005D48D0460AE0D04608E0D04606E0D04604E049 +S31508005D58D04602E0D04600E0D04620464946FFF73E +S31508005D6833FD074600283FF4E9AD0DE04FF0040778 +S31508005D780AE006F1FF365FFA86F8DDF800B0ECE7C8 +S31508005D88DDF800B0D046E8E7384603B0BDE8F08F3E +S31508005D982DE9F04F87B001908B460B782F2B01D051 +S31508005DA85C2B01D10BF1010B4FF0000001998860BB +S31508005DB89BF800201F2A0AD808464FF00001FFF76B +S31508005DC8AFFB02464FF0000301994B6198E149F28F +S31508005DD82C54C0F60004039449F23856C0F6000657 +S31508005DE8049649F24053C0F6000305935E461BF82D +S31508005DF8010B2F28FAD05C28F8D00199CA690292B3 +S31508005E0830781F2840F256812F2800F045815C28F3 +S31508005E1800F047811746A7F1020735464FF00104F7 +S31508005E28A34613E02F2B00F040815C2B00F03D8140 +S31508005E38B2F5807F00F0598192461446594601F01A +S31508005E4875FA8046002840F08D814EE1594601F0E2 +S31508005E586DFA8046002800F048817F2806D80398FE +S31508005E684146FEF7BDFD002840F03F8107F10209CB +S31508005E78A7F8028015F8013F184604F101021F2BFE +S31508005E88D0D81BE1002C00F0308104F1FF3000F077 +S31508005E980101029B03EB440232F8020D202840F068 +S31508005EA8478148E132F8023D202B01D02E2B08D134 +S31508005EB804F1FF30041E32F8021D202940F04B81F8 +S31508005EC84CE12746002C00F01081029A02EB4408A0 +S31508005ED84FF0000522F81450019B98694FF02001ED +S31508005EE84FF00B02FEF760FD029AA2F1020201E0EA +S31508005EF805F1010532F8020F2028F9D02E28F7D027 +S31508005F08002D00F0E08046F00306DCE004F1FF30DF +S31508005F18044628B94FF008094FF00008C24607E0BA +S31508005F28A8F1020737F8021C2E2940F0F780F1E796 +S31508005F38029B33F8157005F10105002F5AD0202F5A +S31508005F4804D02E2F05D1AC4200F0D28046F00306C5 +S31508005F58EEE7C84502D2AC4217D1C1E0B9F10B0F3A +S31508005F6803D146F00306504647E0AC4203D046F054 +S31508005F780306A54240D84FEA8A0A5FFA8AFA2546EE +S31508005F884FF00B094FF00808D2E77F2F0FD938468C +S31508005F984FF0000101F0CAF90746002800F0AD8065 +S31508005FA80598C11911F8807C46F0020627B10498AD +S31508005FB83946FEF715FD20B146F003064FF05F0790 +S31508005FC811E0A7F1410293B2192B02D84AF0020A46 +S31508005FD809E0A7F1610081B2192904D84AF0010A33 +S31508005FE8A7F12007BFB2019A936903F8087008F168 +S31508005FF801089DE7504600E0504601998B691A78D2 +S31508006008E52A04BF05221A70B9F1080F04BF8000F3 +S315080060185FFA80FA0AF00C000C2803D00AF003018C +S31508006028032901D146F0020606F00203DAB252B98C +S315080060380AF0030ABAF1010F08BF46F01006042849 +S3150800604808BF46F0080601988169CE72FFF764FC16 +S31508006058019B9A69D37A024640B1042850D103F0C5 +S315080060680403D8B2002808BF052249E003F0040053 +S31508006078C1B2002944D1019A5169CB7A03F01000BC +S31508006088C2B232B1019C2068FEF7B6FC019EB06028 +S31508006098ACE64FF0050233E04FF000044FF001027A +S315080060A803E04FF000044FF0010206EB020B4FF035 +S315080060B80006E7E64FF000044FF0010206EB020B74 +S315080060C84FF00406DEE607F1FF37029931F8172084 +S315080060D82E2A3FF41FAF14F0010F7FF417AF13E011 +S315080060E8B9F10B0F7FF447AF3BE74FF0060207E01D +S315080060F8B9F10B0F7FF43FAF33E746F002065BE7CB +S31508006108104607B0BDE8F08F04F1FF34A8F102087D +S3150800611838F8023C2E2B7FF4F9AEFBE600F1FF3483 +S31508006128A7F1020838F8022C2E2A7FF4EFAEF1E61A +S315080061382E287FF4C6AE013CD7D000293FF4B2AE6C +S3150800614832F8021D202902D02E297FF4BAAE013C66 +S315080061587FF4A8AEC9E72E297FF4B3AE441E7FF4B0 +S31508006168A1AEC2E77F2805D803984146FEF738FC52 +S315080061780028BAD109F10207A9F8028015F8011F03 +S31508006188084604F101021F2998D92F298DD05C29C0 +S315080061988BD00AF1010459E62DE9F0410446C58871 +S315080061A8018C4FF6FF73994208BF2946FFF7B8F9DD +S315080061B80346E0B94FF0E5074FF001064FF000082F +S315080061C820682169FFF78CF8034668B96269177071 +S315080061D820680671E188A94209D220464146FFF798 +S315080061E8F3FA03460028EBD0042B08BF0223184607 +S315080061F8BDE8F0812DE9F84F044689464FF0FF0AB5 +S3150800620856464FF00405D0464FF000074FF6FF7B79 +S315080062183AE12068FFF764F80546002840F0398116 +S3150800622860690378002B00F04081C27AE52B00F0FC +S315080062381E812E2B00F01D8102F03F02082A14BF8A +S3150800624800210121494540F016810F2A40F00681B0 +S3150800625803F04001CDB235B190F80DA003F0BF03A5 +S31508006268E688268404E09E4218BF464640F0068122 +S31508006278417B514540F00181E669027802F03F0505 +S3150800628805F1FF3202EB420E02EB8E0E8578427854 +S3150800629842EA0525BEF1FE0F00F2048126F81E50D3 +S315080062A80EF1010290F804A090F803C04CEA0A2AF5 +S315080062B815B9DA4508D0F5E0FE2A00F2F38026F883 +S315080062C812A00EF10202554690F806C090F805E0AD +S315080062D84EEA0C2A15B9DA4508D0E3E0FE2A00F298 +S315080062E8E18026F812A002F10102554690F808C086 +S315080062F890F807E04EEA0C2A15B9DA4508D0D1E035 +S31508006308FE2A00F2CF8026F812A002F101025546AD +S3150800631890F80AC090F809E04EEA0C2A15B9DA4549 +S3150800632808D0BFE0FE2A00F2BD8026F812A002F1C6 +S315080063380102554690F80FC090F80EE04EEA0C2A6E +S3150800634815B9DA4508D0ADE0FE2A00F2AB8026F882 +S3150800635812A002F10102554690F811C090F810E013 +S315080063684EEA0C2A15B9DA4508D09BE0FE2A00F24F +S31508006378998026F812A002F10102554690F813C032 +S3150800638890F812E04EEA0C2A15B9DA4508D089E0E1 +S31508006398FE2A00F2878026F812A002F10102554665 +S315080063A890F815C090F814E04EEA0C2A15B9DA45A3 +S315080063B807D077E0FE2A75D826F812A002F101025E +S315080063C8554690F817C090F816E04EEA0C2A15B903 +S315080063D8DA4507D066E0FE2A64D826F812A002F144 +S315080063E80102554690F819C090F818E04EEA0C2AAA +S315080063F815B9DA4507D055E0FE2A53D826F812A06B +S3150800640802F10102554690F81DC090F81CE04EEAC4 +S315080064180C2A15B9DA4507D044E0FE2A42D826F8E8 +S3150800642812A002F10102554690F81FC090F81EE026 +S315080064384EEA0C2A35B1FE2A34D826F812A002F1FB +S31508006448010201E0DA452DD1007800F04005E8B2EE +S3150800645818B3FE2A26D826F812701EE01EB9FEF7CB +S31508006468E7FA504524D04FF6FF70208420E04646C8 +S3150800647804E0464602E0464600E0464620463946D7 +S31508006488FFF7A2F9054620B9216900297FF4C1AEAC +S3150800649875B14FF0000121610AE003F1FF33DEB25E +S315080064A88A46EBE78A464646E8E74FF00405F0E7EA +S315080064B82846BDE8F88F00BF2DE9F04104460E4688 +S315080064C8012926D98369994226D24FF000074FF049 +S315080064D8010820463146FEF79BFF0546F8B1012814 +S315080064E820D0B0F1FF3F20D0204631463A46FFF784 +S315080064F86DF80146D8B92069B0F1FF3F04D000F11C +S315080065080100206184F805802E46A269AA42E0D8CF +S315080065180DE04FF002010AE04FF0020107E04FF0E4 +S31508006528000104E04FF0020101E04FF001010846BE +S31508006538BDE8F08170B582B0054616461C464FF090 +S315080065480B02FEF707FA052C0DD9A6F102024FEA47 +S31508006558540343EAC43432F8020F10FA84F18CB2B1 +S315080065685688002EF3D14FF0070204F00F0000F109 +S315080065783003392B88BF00F137030DF8023002F1D2 +S31508006588FF322409F1D1164602A988184FF07E036E +S3150800659800F8083C92B12C78202C12D029464FF0E6 +S315080065A8000312F0010F56D003F101000346B0426A +S315080065B809D011F8014F202C54D104E04FF00003FC +S315080065C801E04FF000034FF02000C3F1070101F086 +S315080065D80104072A19D811E0072A06D802ACA11817 +S315080065E811F8081C02F1010200E00146E95403F11A +S315080065F80103072A28D820E002B070BD02AEB118F8 +S3150800660811F8081C02F1010200E00146E95403F1F9 +S315080066180103072BF0D8002CDED0072A06D802ACCF +S31508006628A11811F8081C02F1010200E00146E95414 +S3150800663803F10103072BCFD9DEE702AEB11811F82B +S31508006648081C02F1010200E00146E95403F10103BE +S31508006658072BC1D9D0E703F1010311F8010F202848 +S31508006668A2D1B0E700F1010311F8010F20289BD148 +S31508006678A9E700BF2DE9F04F87B004468769C669C0 +S3150800668803A839464FF00C02FEF764F99DF817304F +S3150800669813F0010F2FD04FF00000F872E0614FF0A9 +S315080066A80105384603A932462B46FFF743FF20461D +S315080066B8FFF732F9814698B905F10105ADB23846B2 +S315080066C803A932462B46FFF735FF2046FFF724F97C +S315080066D88146002800F0038102E04FF00709FAE036 +S315080066E8642D00F0DB80B9F1040F40F0F4809DF8C2 +S315080066F81710F972E6619DF8172002F00207FBB237 +S31508006708DBB1308848B14FF0000303F101039BB2AF +S3150800671836F813100029F8D101E04FF0000303F109 +S3150800672819034EF64F42C4F6C46282FB03174FEAB2 +S31508006738E370C0EBA7039FB201E04FF001072046BC +S315080067484FF00001FEF7ECFE8146002840F0C380B2 +S315080067584FF00005A8464FF0010620682169FEF7A4 +S31508006768BFFD8146002840F0B68061690A78E52AA7 +S3150800677800D022B905F10105AF4201D191E045469D +S3150800678820463146FFF720F881460028E5D0A2E0E2 +S31508006798E088C31B204699B2FEF7C2FE8146002848 +S315080067A840F09980A069FEF743F901904FF0000878 +S315080067B84FF6FF7549F2C056C0F6000620682169EB +S315080067C8FEF78EFD8146002840F08580D4F81C9097 +S315080067D861695FFA87FB019A4A734FF00F00C8721E +S315080067E881F80C8081F81A8081F81B800BF1FF3339 +S315080067F803EB430203EB82004FF0010243464FF0D6 +S31508006808FF0A02E02B4602F10102AB424ED039F8E4 +S31508006818103000F1010006EB020C1CF801EC01F837 +S315080068280E308E444FEA132C8EF801C0002B48D040 +S315080068380C2AE8D9AB4202D039F8100018B947F043 +S31508006848400B5FFA8BFB81F800B022684FF0010114 +S31508006858117120464146FEF7B7FF814600283AD10E +S3150800686807F1FF37BFB2002FA8D12DE060694FF0B6 +S3150800687800014FF02002FEF797F86069A1694FF00A +S315080068880B02FEF767F86369A069C27A02F0180175 +S31508006898197323684FF0010018711CE04FF00709B7 +S315080068A819E007F1FF37BFB277B171E706EB020EB9 +S315080068B81EF801CC01F80CA001EB0C0E8EF801A00D +S315080068C8B6E70C2A9ED9BAE720682169FEF708FDBB +S315080068D881460028CAD0484607B0BDE8F08F05F1BA +S315080068E80105ADB2384603A932462B46FFF722FE04 +S315080068F82046FFF711F8814600287FF4F1AE05F126 +S315080069080105ADB2642D7FF4CCAEE6E6A0B941F632 +S315080069180863C2F20003186810B14FF0000202704B +S3150800692811B14FF000030B7041F60860C2F200007F +S3150800693801604FF0000070474FF00B00704700BF2A +S315080069482DE9F0438FB0019116460546002800F058 +S31508006958A5804FF00003036001A805A902F01E02EE +S31508006968FEF72EF90446002840F0B78006F01F08FF +S3150800697802A80B9041F60441C2F200010C9105A841 +S315080069880199FFF705FA0A9F0146002840F08F800B +S31508006998002F40F0868088E059B1042940F092809B +S315080069A805A8FFF767FE48F008080A9F50B104468D +S315080069B893E0FB7A13F0110F7ED106F00402D6B2E3 +S315080069C8002E7CD108F00800C6B2002E41D0FAF78E +S315080069D86FFFB873C0F30723FB734FEA10423A7484 +S315080069E84FEA106179744FF00006FE723E777E779B +S315080069F8BE77FE7705983946FDF7FEFF8146384685 +S31508006A083146FEF709F805984FF001030371B9F105 +S31508006A18000F1ED0066B4946FFF74EFD002853D1D6 +S31508006A28059809F1FF31C1603146FEF759FC014660 +S31508006A380DE0FB7A03F01002D0B2002846D106F022 +S31508006A480206F6B22EB113F0010F42D101E0002971 +S31508006A5842D108F00800C6B20EB148F02008059ED3 +S31508006A68336BEB612F6285F8068030463946FDF7A9 +S31508006A78C3FF2861FA7FB97F4FEA014040EA0263FB +S31508006A883A7F1343797F43EA0120E8604FF0000311 +S31508006A98AB60AB612E60F288AA801EE04FF009044D +S31508006AA81BE016F01C0F84D1C3E74FF0060116F059 +S31508006AB81C0F7FF471AFCAE74FF007040DE04FF0DB +S31508006AC808040AE00C4608E0044606E04FF0040409 +S31508006AD803E04FF0070400E00C4620460FB0BDE877 +S31508006AE8F08300BF2DE9F04F83B0044688469146E7 +S31508006AF81E464FF000033360FDF7ECFF07460028F3 +S31508006B0840F0D080A07910F0800F40F0C68010F0D1 +S31508006B18010F00F0C580E568A1686D1AA94538BF58 +S31508006B284D46002D00F0BE8004F12402009201971C +S31508006B38A7684FEAC7534FEAD350002840F08D801C +S31508006B48206890F802A00AF1FF3101EA572212F0EC +S31508006B58FF0A19D10FB9206902E06169FEF758FCE6 +S31508006B68012806D8A77967F07F00A0714FF00207B9 +S31508006B7898E0B0F1FF3F06D1A37963F07F02A271CE +S31508006B884FF001078EE06061276838466169FEF7AD +S31508006B982FFC814630B9A07960F07F01A1714FF0CA +S31508006BA802077FE000EB0A095FEA552B29D0BB7874 +S31508006BB80BEB0A029A4288BFCAEB030B7878414660 +S31508006BC84A465FFA8BF3FAF7C1FD30B1A27962F04B +S31508006BD87F07A7714FF0010764E0A77907F040001F +S31508006BE8C1B259B1A369C9EB0302934506D908EBA3 +S31508006BF8422000994FF40072FDF7ACFE4FEA4B2B82 +S31508006C083CE0A2694A4526D0A37903F04000C1B200 +S31508006C1889B1787800994FF00103FAF7D1FD30B1B8 +S31508006C28A07960F07F01A1714FF001073AE0A279D7 +S31508006C3822F04007A7712368587800994A464FF00A +S31508006C480103FAF783FD30B1A77967F07F03A371CB +S31508006C584FF0010726E0C4F81890A0684FEAC0511B +S31508006C684FEAD152C2F5007B5D4538BFAB46A1183D +S31508006C78404601F124015A46FDF76CFED844A76838 +S31508006C8807EB0B00A060316801EB0B033360B5EB2B +S31508006C980B057FF44DAF019F04E04FF0020701E0B2 +S31508006CA84FF00707384603B0BDE8F08F2DE9F04FD7 +S31508006CB883B00446884615461E464FF000033360DF +S31508006CC8FDF708FF0746002840F0EE80A07910F087 +S31508006CD8800F40F0E48000F00201CAB2002A00F0F2 +S31508006CE8E180E368DD4280F0D080002D00F0CD8099 +S31508006CF804F1240000900197A7684FEAC7514FEAA4 +S31508006D08D152002A40F09C80206890F802B00BF116 +S31508006D18FF3303EA572111F0FF0B24D147B9276936 +S31508006D286FB94FF00001FEF7EBFC0746206103E058 +S31508006D386169FEF7E5FC0746002F00F0A580012FDC +S31508006D4806D1A77967F07F00A0714FF00207ABE07C +S31508006D58B7F1FF3F06D1A27962F07F03A3714FF01E +S31508006D680107A1E06761A07900F04002D3B29BB1A0 +S31508006D78216848780099A2694FF00103FAF720FDBF +S31508006D8830B1A07960F07F01A1714FF001078BE05F +S31508006D98A77927F04000A071276838466169FEF789 +S31508006DA827FB814630B9A37963F07F07A7714FF0AF +S31508006DB8020779E000EB0B095FEA552A28D0B9786B +S31508006DC80AEB0B028A4288BFCBEB010A7878414660 +S31508006DD84A465FFA8AF3FAF7F3FC30B1A17961F00B +S31508006DE87F02A2714FF001075EE0A369C9EB0307AA +S31508006DF8BA450AD9009808EB47214FF40072FDF7FF +S31508006E08A9FDA07920F04001A1714FEA4A2A2CE091 +S31508006E18A2694A4512D0A168E36899420ED27878E1 +S31508006E2800994A464FF00103FAF790FC30B1A07969 +S31508006E3860F07F07A7714FF0010735E0C4F818908E +S31508006E48A0684FEAC0574FEAD752C2F5007A5545A7 +S31508006E5838BFAA46A01800F1240041465246FDF755 +S31508006E6879FDA17941F04003A371D044A26802EBE9 +S31508006E780A03A360376807EB0A003060B5EB0A0512 +S31508006E887FF43AAF019F00E0019FA168E26891424A +S31508006E9888BFE160A37943F02000A07104E04FF0B1 +S31508006EA8020701E04FF00707384603B0BDE8F08F40 +S31508006EB838B50446FDF70EFE0346002850D1A279D8 +S31508006EC802F02001C8B200284AD002F04003DAB21C +S31508006ED872B1214651F8240B4078A2694FF0010394 +S31508006EE8FAF76EFC002839D1A17921F04003A3717D +S31508006EF82068E169FEF7F4F9034688BB256AEA7A49 +S31508006F0842F02000E872E1682977A3894FEA13223C +S31508006F186A77E089A877E17BE97728462169FDF74A +S31508006F287BFDFAF7C5FCA875C0F30723EB754FEA8E +S31508006F3810422A764FEA106068764FF00001A97465 +S31508006F48E974A37923F02002A27120684FF00101A1 +S31508006F5801712068FEF7E2F9034601E04FF00103E4 +S31508006F68184638BD10B50446FFF7A2FF034610B900 +S31508006F784FF000022260184610BD00BFF8B5044657 +S31508006F880D46FDF7A7FD0746002840F0D380A379EC +S31508006F9813F0800F40F0CC80E268AA4205D203F0CD +S31508006FA80200C1B2002908BF1546A2684FF00003BF +S31508006FB8A360002D00F0BE80206886784FEA462632 +S31508006FC882B102F1FF3205F1FF31B1FBF6F1B2FBEE +S31508006FD8F6F3994206D3C6F100031A40A260AD1A21 +S31508006FE8616919E02169B1B9FEF78AFB01460128EA +S31508006FF806D1A27962F07F01A1714FF0020799E0E4 +S31508007008B0F1FF3F06D1A77967F07F00A0714FF06E +S3150800701801078FE020616161002946D0B5422ED963 +S31508007028A07900F00202D3B22BB12068FEF768FBFC +S31508007038014620B922E02068FEF7EAF90146B1F1CF +S31508007048FF3F06D1A27962F07F03A3714FF00107CB +S3150800705870E0012903D920688269914206D3A77985 +S3150800706867F07F01A1714FF0020763E06161A368C9 +S315080070789819A060AD1BAE42D2D300E03546A06889 +S315080070884219A2604FEAC5534FEAD35080B1206827 +S31508007098FEF7AEF930B9A07960F07F07A7714FF00F +S315080070A8020747E000EB552504E04FF0000501E02C +S315080070B84FF00005A2684FEAC2534FEAD35068B3A7 +S315080070C8A269AA422AD0A17901F04003D8B298B198 +S315080070D8214651F8243B58784FF00103FAF770FB1C +S315080070E830B1A27962F07F01A1714FF0010721E062 +S315080070F8A27922F04001A171214651F8240B407863 +S315080071082A464FF00103FAF721FB30B1A77967F051 +S315080071187F03A3714FF001070CE0A561A368E26835 +S31508007128934207D9E360A17941F02000A07101E0F4 +S315080071384FF002073846F8BD30B58FB00EAB43F8A6 +S31508007148340D0D46184605A94FF00002FDF738FD1F +S315080071580446A8B902A80B9041F60441C2F20001F8 +S315080071680C9105A80199FEF713FE044640B90A9A38 +S3150800717822B105A82946FDF723FF01E04FF00604CA +S3150800718820460FB030BD00BF30B599B018AB43F8EC +S315080071985C0D18460FA94FF00102FDF711FD0246CE +S315080071A8002857D103A8159041F60441C2F20001F8 +S315080071B816910FA80199FEF7EBFD0246002849D15A +S315080071C8149959B3CC7A14F0010F2AD12CE0012D61 +S315080071D834D906A80FA94FF02402FDF7BBFB08957A +S315080071E806A84FF00201FEF79BF90246002831D19E +S315080071F806A84FF00001FEF7FDFF024640B3042833 +S315080072081FD027E02DB10F982946FFF755F90246F2 +S3150800721800BB0F98FEF782F802461BE04FF00602FD +S3150800722818E04FF0070215E00F98FDF7E5FB05464D +S3150800723804F01004E4B2002CC9D102E04FF00202AF +S3150800724808E00FA8FEF7A8FF02460028DAD001E0F2 +S315080072584FF00702104619B030BD00BF2DE9F047B8 +S3150800726882B08246914604464FF0000501F1FF3781 +S315080072784FF0010814E0484601A942466B46FFF755 +S3150800728831FC009B012B0ED19DF804000D2808D06F +S31508007298307004F10104264605F101050A2802D0D2 +S315080072A82646AF42E7DC4FF0000131708D4214BF25 +S315080072B85046084602B0BDE8F08700BF30B583B02F +S315080072C804460D460A2803D14FF00D00FFF7F6FFCE +S315080072D802A901F8084D284669464FF0010201AB94 +S315080072E8FFF7E4FC0198012814BF4FF0FF3001208E +S315080072F803B030BD70B505460E46007870B14FF03C +S3150800730800043146FFF7DAFFB0F1FF3F09D004F170 +S31508007318010415F8010F0028F3D104E04FF0000422 +S3150800732801E04FF0FF34204670BD00BF7F282DD9F5 +S3150800733811B9C7280BD121E0FF2825D8A0F180006C +S3150800734849F2B072C0F6000232F8100070474FF0E2 +S31508007358010349F2B072C0F6000232F8021F8142F0 +S3150800736815D10DE032F8021F814209D003F1010355 +S315080073789BB232F8021F81420DD101E04FF000039B +S3150800738803F18000C0B270474FF00000704703F160 +S3150800739801039BB2E6E703F101039BB2802BE1D117 +S315080073A8EEE700BF61280ED049F2D051C0F60001B9 +S315080073B84FF0000202F1010231F8023F5BB1834245 +S315080073C8F8D113B970474FF0000249F6B000C0F675 +S315080073D8000030F81200704770B402F1FF328C18BA +S315080073E8A1422ED20B466FEA01056619C6F3400676 +S315080073F80D784A7802EB052292B2801880B282424A +S315080074082FD92BE01D785A7802EB0525AAB28018E1 +S3150800741880B2824284BF013080B203F102029D78AD +S31508007428537803EB05239BB2C01880B2834231D93F +S315080074382DE06FEA0102A31823F0010202F1020205 +S315080074488918A14208D109784FEA0123181880B289 +S31508007458834284BF013080B270BC704700F10100D6 +S3150800746880B203F102039C42E3D9002ECAD01D78E4 +S315080074785A7802EB052292B2801880B2824284BFFB +S31508007488013080B203F102039C42BBD8D1E700F170 +S31508007498010080B202F102039C42B3D8C9E700BFD3 +S315080074A870B4C4780A19D4B242F2DC43C2F20003B3 +S315080074B8DC704FEA11258678AA19D2B29A704678EE +S315080074C85E700078187095420FD906F10106F6B273 +S315080074D842F2DC43C2F200035E7036B900F10100DD +S315080074E842F2DC43C2F200031870C9B28C4212DABF +S315080074F802F10102D2B242F2DC40C2F20000827006 +S315080075084AB9437803F10103DAB242701AB9017825 +S3150800751801F10101017070BC704700BF10B5014642 +S31508007528084C206800F10800FFF7BAFF2368064AE6 +S31508007538117819725078587291789972D278DA72E5 +S3150800754810BD00BF0C1E0020DC2400204FF00003ED +S3150800755842F2F041C2F200010B8041F61060C2F215 +S315080075680000437642F2EC43C2F200034FF00102F0 +S315080075781A7042F2E041C2F200014FF480600880B6 +S31508007588704700BF42F2EC43C2F200034FF0000214 +S315080075981A7042F2F041C2F200010B882BB942F286 +S315080075A8F041C2F200010880704742F2EC40C2F28C +S315080075B800004FF001020270704700BF4FEA10231F +S315080075C843EA002080B2704738B541F68864C2F2AB +S315080075D80004657CA5F11405237C05EB03218DB20F +S315080075E8401980B204F11A014FF00802FFF7F4FEB9 +S315080075F804F122012A46FFF7EFFE10B1FFF7DEFF76 +S3150800760838BD4FF6FF7038BD08B54FF00600FFF7CE +S31508007618DBFF08BD08B54FF0000006494FF0140215 +S31508007628FFF7DAFE10B1FFF7C9FF08BD4FF6FF707E +S3150800763808BD00BF961E002038B541F60C63C2F295 +S3150800764800031C68A84942F2CC42C2F20002116043 +S3150800765842F2F443C2F200031960032814D1637E88 +S3150800766803F00F00032840F05986228A002A40F0C2 +S31508007678558642F2D841C2F200014FF008030B7052 +S3150800768801F0FCFB00F08FBC022840F0AC8042F207 +S31508007698D042C2F20002D37803F10103D8B2D070FF +S315080076A8C0B942F2D041C2F200018A7802F1010259 +S315080076B8D3B28B7073B942F2D040C2F20000417857 +S315080076C801F10101CAB2427022B90346007800F1F5 +S315080076D8010018704FF0000141F67C62C2F2000200 +S315080076E8118041F68463C2F200031980607E072878 +S315080076F801D005280CD1A07E00F10100C2B2A276FD +S31508007708782A40F00B864FF00001617600F006BE35 +S31508007718002800F00386218A002955D0A27E02F1A6 +S31508007728FF31A176002A40F0F985E37E082B06D0BA +S3150800773800F1FF32D1B2012917D8052B15D14FF020 +S315080077480000607642F2D845C2F200054FF0800282 +S315080077582A7001F093FB41F68861C2F200014FF0E6 +S31508007768140381F82F3000F042BD042B9DBF032176 +S315080077789940C9B23021A17603F10103E37600F0F6 +S315080077880F0000F1FF33072B00F2C885DFE813F076 +S31508007798DC0108001100BD03C605BD03C605BD0307 +S315080077A841F68863C2F200034FF0000583F82F50AC +S315080077B8D2E142F2D841C2F200014FF00400087043 +S315080077C801F05CFB00F047BC00F00F02032A40F00A +S315080077D8A58542F2D843C2F200034FF00800187094 +S315080077E801F04CFBDFE341F68860C2F20000817BBA +S315080077F8452940F0938541F68863C2F200031A7C4E +S31508007808587C00EB022341F67C61C2F200010A8823 +S31508007818934200F383859CB241F67C60C2F200006D +S31508007828048041F68863C2F20003197D11F03F0F00 +S3150800783840F0748541F68862C2F20002507D00283D +S3150800784840F06C8542F2D445C2F200052D882DB960 +S3150800785842F2D443C2F200035988A1B141F68862BC +S31508007868C2F20002D08BA84240F0588541F68863D8 +S31508007878C2F20003198C42F2D442C2F200025088BE +S31508007888814240F04B85FFF7C5FE4FF6FF739842D5 +S3150800789840F0448541F68861C2F20001CA7D062A8D +S315080078A828D0012A40F03A85104890F82230082B4B +S315080078B840F034850D494FF0000281F82220888C63 +S315080078C84FF6F67398428CBF093008300749888402 +S315080078D80648428BC283838B0384458304494A88B6 +S315080078E8828300F013BD00BFBE1E0020881E00203C +S315080078F8D4240020FFF788FE4FF6FF73984240F01D +S315080079080D85B548417EC1B1B44A908CB24B9A8868 +S31508007918904212D1B148428CAF4BD88882420CD1DA +S31508007928AE4A508BAC4B1A88904206D1AB48828B2C +S31508007938A94B5888824200F03581A84991F82F202A +S3150800794802F03F03022B0FD1A448828CA4490A806F +S31508007958A44B4FF000001870A3490B88934262D0D5 +S31508007968A0484FF0010202709C4991F82F0000F0D8 +S315080079780403DAB2002A40F0D184984B4FF0140475 +S3150800798883F82F40994D4FF0280129804FF0500071 +S3150800799883F82E0093F8294093F82D2083F8292098 +S315080079A893F8280093F82C5083F8285083F82C006D +S315080079B893F8271093F82B2083F8272083F82B10A1 +S315080079C893F82620874D2A7093F82A5083F826506C +S315080079D883F82A2004F10104E4B283F82D4084B917 +S315080079E800F10103DDB27D4880F82C504DB901F14C +S315080079F80101CCB280F82B401CB902F1010280F8CB +S31508007A082A207648428C76490A80848C4484828463 +S31508007A18438BC383858B0584754A118841835488AB +S31508007A28848300F03EBC6C494B7E23B1072B40F09B +S31508007A38888400F080BC684B6E490B604FF00300E1 +S31508007A48987618764FF000049C754FF00405DD7596 +S31508007A58DC769A80614C628CDA80618B1980A08BFF +S31508007A6858804FF001005876634D2A781A7369785A +S31508007A785973AA789A73ED78DD73188294F82910E1 +S31508007A88D97294F828209A7294F827505D7294F857 +S31508007A9826101972FFF742FD94F82E3003F0F00409 +S31508007AA8502C50DD4FEA1310A0F105024FEA820464 +S31508007AB8524D2A784FF0000348483BE0C21892F81E +S31508007AC836202AB947490B704C4C2270424C3BE089 +S31508007AD8012A03D103F10103DBB22BE0022A1DD1E7 +S31508007AE8451895F83750042D18D13E4A1370434D5A +S31508007AF84FF002032B703948411891F8384091F82D +S31508007B08392042EA0425364B1D8040F20A60854230 +S31508007B1828BF0546304C6582A58215E0411891F8BC +S31508007B2837502DB92F480370344C22702A4C0BE075 +S31508007B38EB18DBB21946A342C0DB2A4C23702F4B3D +S31508007B481A70254C00E0244C41F68861C2F20001FF +S31508007B584FF0100281F82F2041F68860C2F2000023 +S31508007B6890F82F3043F0020580F82F504FF00201A5 +S31508007B7880F836104FF0040280F837204FF00603D5 +S31508007B8880F838304FF00A0580F8395041F67C629B +S31508007B98C2F200024FF02C0111804FF0600380F802 +S31508007BA82E3033E30C4A134B1A6015484FF000027F +S31508007BB802700A4B93F82F3003F00400C2B20AB3D6 +S31508007BC8054B4FF000025A760D484FF02001017018 +S31508007BD801F054F9A2E300BF101E0020881E0020F9 +S31508007BE8E2240020EC240020F02400207C1E00203B +S31508007BF8D42400200C1E0020D0240020F8240020BD +S31508007C08D8240020A04890F82E204FEA12104FEAF0 +S31508007C1880029E480270A4F11404A21A92B29C48E3 +S31508007C28028001F00F01022903D103F03F00122850 +S31508007C3811D012B913F0030F0DD0934AD18C954879 +S31508007C480289914240F0CD828F49088D914A51891F +S31508007C58884240F0C68203F01003D8B200284FD0F5 +S31508007C688C4A118A00294BD002F10C00FFF718FC40 +S31508007C78854C94F82A4088490B78A34240D1824813 +S31508007C8890F82B00844A5178814239D17E4B93F873 +S31508007C982C10814A93788B4232D17B4A92F82D2050 +S31508007CA87D4BDB7893422BD17A4B1C7358739973A7 +S31508007CB8DA73D87ED0B9774B987D197E9A7E891A59 +S31508007CC8A1EBD002D1B2CAB20818C0B2987512F0A0 +S31508007CD8800F1CBF4A42D2B26E4BD97DA1EB9101E7 +S31508007CE88A18D1B2D97501EBD00018766B4B4FF0CC +S31508007CF801021A706749087E88764FF000030B82DE +S31508007D08644A537E03F00F0101F1FF30072800F299 +S31508007D180583DFE810F008002A00CD00EE013702D7 +S31508007D2858026602DD015D4A117811F0010F00F06C +S31508007D38F582584C4FF003006076584B4FF04002D6 +S31508007D481A704FF000012182514C208828B1534BF4 +S31508007D584FF042021A70FFF7E1FB51484FF0000155 +S31508007D68018001F08BF84B4C1DE14C4A137813F04F +S31508007D78010F7DD0444991F82F0000F03F02122ADE +S31508007D8876D1414890F82E3003F0F002502A4CDD9F +S31508007D984FEA1311A1F105044FEA84044148027811 +S31508007DA84FF00003384839E0C21892F8362022B94D +S31508007DB8364803703B4B1A7037E0012A03D103F1A2 +S31508007DC80103DBB22AE0022A1DD1451895F8375077 +S31508007DD8042D18D12D4A1370324B4FF00200187033 +S31508007DE8294C611891F8382091F8393043EA02206D +S31508007DF82D4C208040F20A61884238BF0146254A40 +S31508007E085182918211E0411891F8371021B91F481B +S31508007E180370244C227008E0CB18DBB21946A3423B +S31508007E28C2DB1A4C23701F4B1A701A4C4FF0030109 +S31508007E386176154890F82620227290F827306372E2 +S31508007E4890F82810A17290F82900E0724FF0010006 +S31508007E58FFF764FB114B4FF042021A704FF000010E +S31508007E6821820B4801800E4B198001F007F89AE029 +S31508007E780A4B4FF02001197001F000F80B48036807 +S31508007E884FF000025A766FE5881E0020EC24002081 +S31508007E987C1E0020101E0020DC240020D824002088 +S31508007EA8841E0020F8240020E22400200C1E00204E +S31508007EB8AD4890F82F2012F0010F2FD003F01001CB +S31508007EC8C8B258BBA94B188A002840F02782A84D83 +S31508007ED82A8802F1010290B2FFF720FBA54C237805 +S31508007EE843F010012170288818B143F01205A14AF9 +S31508007EF8157000F0C3FF9D4C4FF0010323824FF025 +S31508007F08080161764FF00000E07641F68865C2F20E +S31508007F1800054FF0110285F82F2068E102F02002CB +S31508007F28D1B281B1904D95F834404FEA042095F8BE +S31508007F383510914A40EA01051468641914608C4A98 +S31508007F481088411B11808A4A108850B103F0100323 +S31508007F58D9B231B9874B1A7842F002011970FFF77E +S31508007F68DDFA814890F8302090F8313003EB022189 +S31508007F7888B2824A10807D4B998A884200D808B907 +S31508007F887E4801807D4A1188784B5982794802785B +S31508007F9812F0030F00F0C281794C4FF000012180DE +S31508007FA800F06CFF714C42F2D840C2F2000001782A +S31508007FB801F02002D3B283B14FF0000041F6846184 +S31508007FC8C2F200010880607641F68865C2F20005AB +S31508007FD84FF0140285F82F2009E101F01000C2B20B +S31508007FE8B2B14FF0000541F68461C2F200010D8076 +S31508007FF84FF0010020824FF004036376E57641F6D8 +S315080080088865C2F200054FF0110285F82F20EEE0C8 +S3150800801841F68463C2F200031888C8B111F0010F4B +S3150800802803D04FF00003238201E0218A59B9618AF7 +S31508008038884284BF5248018041F68460C2F2000033 +S315080080480288228204E041F68462C2F200021180A4 +S315080080584FF00003E37642F2F441C2F200010868E1 +S3150800806842F2CC42C2F20002106041F68463C2F2C0 +S315080080780003198889B1208A78B100F1280041F6E9 +S315080080887C65C2F20005288041F68860C2F20000C5 +S315080080984FF0180380F82F30B0E042F2D842C2F207 +S315080080A80002137803F00201C8B2002800F03681EE +S315080080B841F67C65C2F200054FF028032B8041F68D +S315080080C88861C2F200014FF0100281F82F2095E06E +S315080080D8284A137813F0010F00F0208123494FF03E +S315080080E800004876234B4FF010021A7000F0C6FEBF +S315080080F814E11F48008808B1FFF710FA1A4B93F8DD +S315080081082F1011F0010F1CD01A4D2C7814F0010FFE +S3150800811808D0164B4FF007025A764FF000059D76A1 +S315080081281D8203E011494FF0060048764FF001001A +S31508008138FFF7F4F90F4C4FF01001217000F09EFE7E +S315080081484FE00C4A107810F0010F07D007484FF097 +S31508008158050242764FF000030382DFE0044B1988D4 +S3150800816800293ED1DAE000BF881E0020101E002034 +S315080081787C1E0020D8240020CC240020E2240020DD +S31508008188841E00207148008808B1FFF7C7F9704BAC +S3150800819893F82F2012F0010F11D06E4D4FF00704F7 +S315080081A86C764FF00003AB764FF00100FFF7B6F98F +S315080081B869494FF010020A7000F060FE11E0634941 +S315080081C8088870B9AAE06449087810F0010F00F029 +S315080081D8A580604B4FF007025A764FF00001997652 +S315080081E89CE05B4D4FF0100485F82F40594C41F63A +S315080081F87C60C2F200004FF02803038041F68861CC +S31508008208C2F200014FF0500581F82E50227A41F645 +S315080082188860C2F2000080F82A20637A80F82B303A +S31508008228A17A80F82C10E57A80F82D50227B80F800 +S315080082382620637B80F82730A17B80F82810E57B09 +S3150800824880F829504FF00602C275A3884384E1884E +S31508008258818442F2D445C2F200052A8842836B8893 +S3150800826883832188C18365880584647E04F01000A9 +S31508008278C2B252B141F68864C2F200044FF0000057 +S3150800828884F8310084F830000BE041F68863C2F2BE +S3150800829800034FF0060183F830104FF00A0583F8FB +S315080082A8315041F68864C2F200044FF04002A275C4 +S315080082B841F67C63C2F2000319884FEA1125257432 +S315080082C861744FF0000584F8355084F83450658693 +S315080082D8FFF79AF96FEA000060864FF04502A27325 +S315080082E8E5736575257541F67E61C2F200010B884E +S315080082F803F1010398B208804FEA1022A274E074C9 +S315080083082583FFF787F96FEA0001218342F2D843EC +S31508008318C2F200034FF00000187038BD4FF0000392 +S3150800832841F67C61C2F200010B8042F2D840C2F2E3 +S315080083380000037038BD094C4FF001052570FFF79A +S315080083487ABB06484FF001020270E7E77C1E002058 +S31508008358881E0020101E0020D8240020EC240020A7 +S3150800836808B503460A1E0FDD41F68461C2F200010C +S315080083780A8042F2F440C2F200000068834203D041 +S31508008388194692B200F0CAFD08BD00BF70B503468B +S315080083980D4642F2F942C2F200024FF0000111708E +S315080083A842F2FC40C2F20000048864B142F2FC4280 +S315080083B8C2F20002518831B11888A04203D15C88FC +S315080083C88C4200F0888042F2FC42C2F2000294898C +S315080083D85CB142F2FC41C2F20001C98929B1188888 +S315080083E8A04202D15A888A427CD042F2FC44C2F2A0 +S315080083F80004228B5AB142F2FC41C2F200014C8BAE +S315080084082CB11888904202D15A88A2426ED042F2FC +S31508008418FC41C2F200018C8C5CB142F2FC40C2F20B +S315080084280000C18C29B11A88A24202D15C888C4204 +S3150800843860D042F2FC40C2F20000028E5AB142F203 +S31508008448FC41C2F200014C8E2CB11888904202D128 +S315080084585A88A24252D042F2FC41C2F200018C8FDD +S315080084685CB142F2FC40C2F20000C18F29B11A88F9 +S31508008478A24202D15C888C4244D042F2FC40C2F245 +S315080084880000B0F8482062B142F2FC41C2F200018D +S31508008498B1F84A402CB11888904202D15A88A242AB +S315080084A834D042F2FC41C2F20001B1F85440002C23 +S315080084B842D042F2FC40C2F20000B0F85610002939 +S315080084C83AD01A88A24237D15C888C4234D14FF008 +S315080084D80700AA4C1DE04FF0000042F2FC44C2F225 +S315080084E8000416E04FF00100A54C12E04FF0020018 +S315080084F8A44C0EE04FF00300A34C0AE04FF004002A +S31508008508A24C06E04FF00500A14C02E04FF0060029 +S31508008518A04C42F2F942C2F20002107004F10400BB +S3150800852829464FF0060200F0F9FC42F25D53C2F202 +S3150800853800031978A17270BD42F2FC40C2F200002D +S31508008548018831B942F2FC42C2F200025488002C72 +S315080085585FD042F2FC40C2F20000818931B942F28A +S31508008568FC42C2F20002D489002C59D042F2FC40DF +S31508008578C2F20000018B31B942F2FC42C2F2000293 +S31508008588548B002C50D042F2FC40C2F20000818C79 +S3150800859831B942F2FC42C2F20002D48C002C47D010 +S315080085A842F2FC40C2F20000018E31B942F2FC42A6 +S315080085B8C2F20002548E002C3ED042F2FC40C2F2AF +S315080085C80000818F29B942F2FC42C2F20002D48F18 +S315080085D8B4B342F2FC40C2F20000B0F8481031B910 +S315080085E842F2FC42C2F20002B2F84A4064B342F2CE +S315080085F8FC40C2F20000B0F8541071BB42F2FC42CB +S31508008608C2F20002B2F856403CBB4FF007005B4C7A +S315080086181DE04FF0000042F2FC44C2F2000416E0E6 +S315080086284FF00100564C12E04FF00200554C0EE090 +S315080086384FF00300544C0AE04FF00400534C06E090 +S315080086484FF00500524C02E04FF00600514C42F23A +S31508008658F942C2F2000210707BE04FF0000442F2C1 +S315080086685D56C2F200063078224642F2FC41C2F252 +S3150800867800018E7A811BA142C4BF0A46D2B242F2D1 +S31508008688FC46C2F20006B17D461A964202DDF2B2EF +S315080086984FF0010442F2FC41C2F2000191F822604F +S315080086A8811B914202DDCAB24FF0020442F2FC462F +S315080086B8C2F2000696F82E10461A964202DDF2B263 +S315080086C84FF0030442F2FC41C2F2000191F83A6005 +S315080086D8811B914202DDCAB24FF0040442F2FC46FD +S315080086E8C2F2000696F84610461A964202DDF2B21B +S315080086F84FF0050442F2FC41C2F2000191F85260BB +S31508008708811B914202DDCAB24FF0060442F2FC46CA +S31508008718C2F2000696F85E10461A964202DDF2B2D2 +S315080087284FF0070442F2FA41C2F200010A7042F217 +S315080087385C50C2F20000047042F2F942C2F200022A +S31508008748147004EB440442F2FC41C2F2000101EB46 +S315080087588404204619464FF0040200F0DFFB04F1B2 +S31508008768040029464FF0060200F0D8FB42F25D5392 +S31508008778C2F200031978A17270BD00BF5025002007 +S315080087880825002014250020202500202C25002057 +S3150800879838250020442500202DE9F04142F25D5392 +S315080087A8C2F200031A7802F101021A704FF00001AA +S315080087B842F2F940C2F20000017042F2FC45C2F2E8 +S315080087C8000542F25D56C2F2000688464FF00407D5 +S315080087D8044601EB410105EB8100428835F8213052 +S315080087E842EA03018AB242B13178837ACA1A772AE9 +S315080087F803DD41463A4600F0B5FB207800F1010052 +S31508008808C1B221700729E4D9BDE8F081F8B541F667 +S315080088187C63C2F200031888292807D841F67C63C6 +S31508008828C2F200034FF000021A80F8BD41F67C61D7 +S31508008838C2F200014FF000020A8041F68863C2F2CC +S315080088480003988AB0F5807F03D0B0F5007F7FD102 +S3150800885860E041F68861C2F20001CA8C42F2D4434C +S31508008868C2F200031888824272D141F68861C2F2C0 +S3150800887800010A8D42F2D443C2F2000358888242A4 +S3150800888866D13448A0F106052946FFF77FFD41F66B +S315080088988864C2F200044FF0000626754FF00207F6 +S315080088A8677504F12006304629464FF0060200F09F +S315080088B835FB42F2E447C2F20007284639464FF02C +S315080088C8060200F02BFB04F1060039464FF00602B3 +S315080088D800F024FB204631464FF0060200F01EFB46 +S315080088E8A18BE184E28B228542F2D443C2F20003CB +S315080088F81888A0835988E1834FF0080222734FF03D +S315080089080603637341F67C60C2F200004FF02A0141 +S315080089180180F8BD41F68861C2F20001CA8C42F2AC +S31508008928D443C2F200031888824211D141F68861FD +S31508008938C2F200010A8D42F2D443C2F200035888F3 +S31508008948824205D103490846A1F10601FFF71EFD33 +S31508008958F8BD00BFA41E002038B541F68863C2F2E8 +S315080089680003DB8B4FF6FF72934215D141F68860F8 +S31508008978C2F20000018C4FF6FF7291420CD141F603 +S315080089888860C2F2000049F69021C0F600014FF04F +S31508008998060200F0C3FA3DE142F2D440C2F20000F2 +S315080089A8018883EA010041F67862C2F2000211885A +S315080089B8084211D141F68860C2F20000028C42F2E0 +S315080089C8D441C2F200014888504041F67861C2F2A3 +S315080089D80001498808420CD042F26053C2F20003EB +S315080089E841F68062C2F200021188198050885880C0 +S315080089F805E042F26050C2F200000380428042F26B +S31508008A086052C2F200021388508842F2FC41C2F250 +S31508008A1800010A889A4206D142F2FC41C2F20001D4 +S31508008A284A88824269D042F2FC41C2F200018A8928 +S31508008A389A4206D142F2FC41C2F20001CA89824230 +S31508008A4862D042F2FC41C2F200010A8B9A4206D170 +S31508008A5842F2FC41C2F200014A8B824258D042F2E5 +S31508008A68FC41C2F200018A8C9A4206D142F2FC41C4 +S31508008A78C2F20001CA8C82424ED042F2FC41C2F2CE +S31508008A8800010A8E9A4206D142F2FC41C2F200015E +S31508008A984A8E824244D042F2FC41C2F200018A8FD1 +S31508008AA89A4206D142F2FC41C2F20001CA8F8242BA +S31508008AB83AD042F2FC41C2F20001B1F848209A4283 +S31508008AC807D142F2FC41C2F20001B1F84A208242BB +S31508008AD82ED042F2FC41C2F20001B1F854209A4263 +S31508008AE839D142F2FC43C2F20003B3F85610814268 +S31508008AF831D14FF0070055491DE04FF0000042F20A +S31508008B08FC41C2F2000116E04FF00100504912E09C +S31508008B184FF002004F490EE04FF003004E490AE0B5 +S31508008B284FF004004D4906E04FF005004C4902E0B5 +S31508008B384FF006004B4942F2F943C2F20003187097 +S31508008B4841F68860C2F2000001F104014FF00602FE +S31508008B5800F0E4F95EE042F2F944C2F200044FF08C +S31508008B680805257041F68864C2F2000420464FF0CD +S31508008B78FF014FF0060200F0F5F904F120004FF066 +S31508008B8800014FF0060200F0EDF942F2E445C2F2A0 +S31508008B98000504F1060029464FF0060200F0BEF962 +S31508008BA804F1160029464FF0060200F0B7F942F21A +S31508008BB86050C2F200000288E2844388238542F2A4 +S31508008BC8D441C2F200010888A0834A88E2834FF09C +S31508008BD8000323754FF001016175A373E1734FF024 +S31508008BE80800207463744FF00602A2744FF0040359 +S31508008BF8E3742073627304F1360442F2CC41C2F27C +S31508008C0800010C6041F67C60C2F200004FF02A02AF +S31508008C18028038BD144842F2E441C2F200014FF01E +S31508008C28060200F07BF941F68861C2F200014FF0AE +S31508008C3808020A734FF00000487341F67C63C2F2D3 +S31508008C480003198801F10E01198038BD5025002046 +S31508008C580825002014250020202500202C25002082 +S31508008C6838250020442500208E1E002008B5F9F76F +S31508008C7831FDFAF7E9FB00F5FA7042F26853C2F2D9 +S31508008C8800031860FAF7E0FB00F51C5101F1100122 +S31508008C9842F26452C2F200021160FEF757FC42F231 +S31508008CA8D440C2F200004FF6A962028043F6137355 +S31508008CB8438041F67860C2F200004FF6FF710180E2 +S31508008CC84FF00003438041F68060C2F2000002803C +S31508008CD840F2131242804EF60300FEF753FCF9F7EA +S31508008CE843FE08BDF8B541F60C63C2F200031E68D8 +S31508008CF8F26932628E46F1B101F1FF318CB206F1A2 +S31508008D081C024FF0000304F1010704F00101C55CD9 +S31508008D18D418257203F10103BB4219D10BE0C55CCF +S31508008D28D418257203F10103C55CD418257203F11A +S31508008D380103BB42F3D10EF10401A6F8641006F14B +S31508008D482000FFF70DFBF06900F10100F061F8BD9E +S31508008D580029E4D0C45CD1180C7203F10103BB42A4 +S31508008D68DDD1E8E710B5F9F717FE002841D041F636 +S31508008D787C62C2F20002108041F68860C2F20000E6 +S31508008D8884894FF40060FEF719FC844215D14FF028 +S31508008D980100FEF751FC41F67C63C2F200031A880B +S31508008DA83AB3FFF7D9FDF9F725FE41F67C60C2F21A +S31508008DB800004FF0000101801BE041F68861C2F20D +S31508008DC800018C8940F60600FEF7F8FB844210D1AC +S31508008DD8FFF71CFD41F67C63C2F200031A8842B10C +S31508008DE8F9F708FE41F67C60C2F200004FF0000170 +S31508008DF80180FAF729FB42F26853C2F200031A689F +S31508008E08904224D302F5FA7042F26851C2F2000180 +S31508008E18086041F60C63C2F2000341F61062C2F21A +S31508008E2800021A604FF00200FEF706FC41F67C6065 +S31508008E38C2F20000018851B1FFF78EFDF9F7DAFD95 +S31508008E4841F67C63C2F200034FF000021A80FAF773 +S31508008E58FBFA42F26451C2F200010B6898420AD33F +S31508008E6803F51C5000F1100042F26452C2F20002E7 +S31508008E781060FFF791FC4FF0000010BD10B541F6E1 +S31508008E880C63C2F200031C6842F2D840C2F2000022 +S31508008E98017801F04002D3B23BB14FF00100E0611E +S31508008EA84FF00001A4F8641010BD11F0010F1CBFA3 +S31508008EB80023A4F8643001F00400C1B231B1B4F853 +S31508008EC8641019B104F12000FFF74AFA42F2D842B1 +S31508008ED8C2F20002137803F00200C1B261B14FF082 +S31508008EE80002A4F8642042F2CC43C2F200031868D0 +S31508008EF800F10400FAF7BAFE10BD00BFA0F1300071 +S31508008F0809288CBF00200120704700BFA0F1610323 +S31508008F18D9B2192998BF2038704700BF844640EA55 +S31508008F28010313F0030F40F01080242AC0F00D80C7 +S31508008F382DE9F00FB1E8F80FA0E8F80FA2F124021E +S31508008F48242ABFF4F7AFBDE8F00F002A00F007801F +S31508008F5811F8013B00F8013B013A7FF4F9AF604686 +S31508008F68704700BF8446002A00F0328010F0030FCD +S31508008F7800F0078000F8011B013A00F02980FFF786 +S31508008F88F5BF282AC0F01F80A2F128022DE9F00FA4 +S31508008F9801F0FF0141EA012141EA014141EA016183 +S31508008FA80B460C460D460E460F46884689468A469F +S31508008FB88B46A0E8FA0F283ABFF4FBAFBDE8F00FD6 +S31508008FC8283200F0058000F8011B013A7FF4FBAF50 +S31508008FD86046704738B504460D4600F019F842F25F +S31508008FE86C53C2F200031D6044F0800442F27050CC +S31508008FF8C2F200000460024611680029FCD100F09C +S3150800900809F842F26C53C2F20003186838BD00BF6B +S30D08009018704700BF704700BF56 +S31508009020433A2F576F726B2F736F66747761726549 +S315080090302F4F70656E424C542F5461726765742FBA +S3150800904044656D6F2F41524D434D345F53544D3334 +S31508009050325F4F6C696D65785F53544D33324534D2 +S3150800906030375F43726F7373776F726B732F426F0C +S315080090706F742F6964652F2E2E2F6C69622F7569A0 +S31508009080702F6E65746465762E6300002F64656DB7 +S315080090906F70726F675F6F6C696D65785F73746DFB +S315080090A03332653430372E73726563002F626F6F03 +S315080090B0746C6F672E74787400000000433A2F575B +S315080090C06F726B2F736F6674776172652F4F706559 +S315080090D06E424C542F5461726765742F44656D6FE8 +S315080090E02F41524D434D345F53544D33325F4F6CCD +S315080090F0696D65785F53544D3332453430375F4375 +S31508009100726F7373776F726B732F426F6F742F69F9 +S3150800911064652F2E2E2F2E2E2F2E2E2F2E2E2F53CA +S315080091206F757263652F41524D434D345F53544DED +S3150800913033322F43726F7373776F726B732F766543 +S3150800914063746F72732E6300000008001000180025 +S315080091502000280030003800400048005000580021 +S315080091608000880090009800A000A800B000B80011 +S31508009170C000C800D000D80000C0000800400000A9 +S3150800918003000000000001080000010004000000C0 +S3150800919000000208000002000500000000000408A4 +S315080091A00000020006000000000006080000020099 +S315080091B00700000000000808000002000800000080 +S315080091C000000A08000002000900000000000C0860 +S315080091D0000002000A00000000000E08000002005D +S315080091E00B000000433A2F576F726B2F736F66742C +S315080091F0776172652F4F70656E424C542F546172B9 +S315080092006765742F44656D6F2F41524D434D345F2A +S3150800921053544D33325F4F6C696D65785F53544DC7 +S315080092203332453430375F43726F7373776F726BBF +S31508009230732F426F6F742F6964652F2E2E2F2E2E73 +S315080092402F2E2E2F2E2E2F536F757263652F415298 +S315080092504D434D345F53544D33322F756172742E1E +S3150800926063000000433A2F576F726B2F736F667453 +S31508009270776172652F4F70656E424C542F54617238 +S315080092806765742F44656D6F2F41524D434D345FAA +S3150800929053544D33325F4F6C696D65785F53544D47 +S315080092A03332453430375F43726F7373776F726B3F +S315080092B0732F426F6F742F6964652F2E2E2F2E2EF3 +S315080092C02F2E2E2F2E2E2F536F757263652F415218 +S315080092D04D434D345F53544D33322F63616E2E63C5 +S315080092E00000000005020602060307030803090337 +S315080092F009040A040B040C040C050D050E050F05DC +S315080093000F061006100710084F70656E424C540081 +S31508009310433A2F576F726B2F736F66747761726556 +S315080093202F4F70656E424C542F5461726765742FC7 +S3150800933044656D6F2F41524D434D345F53544D3341 +S31508009340325F4F6C696D65785F53544D33324534DF +S3150800935030375F43726F7373776F726B732F426F19 +S315080093606F742F6964652F2E2E2F2E2E2F2E2E2FDB +S315080093702E2E2F536F757263652F66696C652E6383 +S31508009380000000004669726D776172652075706429 +S31508009390617465207265717565737420646574659A +S315080093A0637465640A0D00004F70656E696E672008 +S315080093B06669726D776172652066696C6520666F8D +S315080093C0722072656164696E672E2E2E0000000099 +S315080093D04552524F520A0D004F4B0A0D000000002D +S315080093E05374617274696E67207468652070726F51 +S315080093F06772616D6D696E672073657175656E63F9 +S31508009400650A0D0050617273696E67206669726D30 +S31508009410776172652066696C6520746F206F627467 +S3150800942061696E2065726173652073697A652E2E8F +S315080094302E00000045726173696E67200000000007 +S315080094402062797465732066726F6D206D656D6F25 +S3150800945072792061742030780000000052656164DA +S31508009460696E67206C696E652066726F6D20666925 +S315080094706C652E2E2E4552524F520A0D00000000E2 +S31508009480496E76616C696420636865636B73756D94 +S3150800949020666F756E642E2E2E4552524F520A0D57 +S315080094A00000000050726F6772616D6D696E67200B +S315080094B00000000020627974657320746F206D6562 +S315080094C06D6F727920617420307800005772697464 +S315080094D0696E672070726F6772616D206368656375 +S315080094E06B73756D2E2E2E00436C6F73696E672035 +S315080094F06669726D776172652066696C650A0D002A +S315080095004669726D7761726520757064617465204D +S315080095107375636365737366756C6C7920636F6DB9 +S31508009520706C657465640A0D00000000222A3A3CD6 +S315080095303E3F7C7F000000002B2C3B3D5B5D00001E +S31508009540809A90418E418F804545454949498E8F7D +S315080095509092924F994F555559999A9B9C9D9E9FCB +S3150800956041494F55A5A5A6A7A8A9AAABAC21AEAF58 +S31508009570B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF65 +S31508009580C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF55 +S31508009590D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF45 +S315080095A0E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF35 +S315080095B0F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF25 +S315080095C001030507090E10121416181C1E000000C8 +S315080095D06100620063006400650066006700680059 +S315080095E069006A006B006C006D006E006F00700009 +S315080095F071007200730074007500760077007800B9 +S3150800960079007A00A100A200A300A500AC00AF0073 +S31508009610E000E100E200E300E400E500E600E70020 +S31508009620E800E900EA00EB00EC00ED00EE00EF00D0 +S31508009630F000F100F200F300F400F500F600F8007F +S31508009640F900FA00FB00FC00FD00FE00FF00010126 +S3150800965003010501070109010B010D010F011101A4 +S3150800966013011501170119011B011D011F01210114 +S3150800967023012501270129012B012D012F01310184 +S315080096803301350137013A013C013E0140014201EF +S315080096904401460148014B014D014F015101530157 +S315080096A05501570159015B015D015F0161016301C4 +S315080096B06501670169016B016D016F017101730134 +S315080096C0750177017A017C017E019201B103B2032B +S315080096D0B303B403B503B603B703B803B903BA03B0 +S315080096E0BB03BC03BD03BE03BF03C003C103C3035F +S315080096F0C403C503C603C703C803C903CA033004A2 +S315080097003104320433043404350436043704380487 +S3150800971039043A043B043C043D043E043F04400437 +S3150800972041044204430444044504460447044804E7 +S3150800973049044A044B044C044D044E044F04510496 +S31508009740520453045404550456045704580459043F +S315080097505A045B045C045E045F0470217121722163 +S3150800976073217421752176217721782179217A212F +S315080097707B217C217D217E217F2141FF42FF43FF02 +S3150800978044FF45FF46FF47FF48FF49FF4AFF4BFF97 +S315080097904CFF4DFF4EFF4FFF50FF51FF52FF53FF47 +S315080097A054FF55FF56FF57FF58FF59FF5AFF000051 +S315080097B0C700FC00E900E200E400E000E500E7007D +S315080097C0EA00EB00E800EF00EE00EC00C400C5007C +S315080097D0C900E600C600F400F600F200FB00F90036 +S315080097E0FF00D600DC00A200A300A500A720920176 +S315080097F0E100ED00F300FA00F100D100AA00BA007A +S31508009800BF001023AC00BD00BC00A100AB00BB002C +S31508009810912592259325022524256125622556251D +S3150800982055256325512557255D255C255B2510257E +S31508009830142534252C251C2500253C255E255F2569 +S315080098405A25542569256625602550256C256725E2 +S3150800985068256425652559255825522553256B25E0 +S315080098606A2518250C25882584258C25902580258C +S31508009870B103DF009303C003A303C303B500C40306 +S31508009880A6039803A903B4031E22C603B503292217 +S315080098906122B1006522642220232123F700482291 +S315080098A0B0001922B7001A227F20B200A025A00016 +S315080098B04100420043004400450046004700480076 +S315080098C049004A004B004C004D004E004F00500026 +S315080098D051005200530054005500560057005800D6 +S315080098E059005A002100E0FFE1FFE5FFE2FFE3FF30 +S315080098F0C000C100C200C300C400C500C600C7003E +S31508009900C800C900CA00CB00CC00CD00CE00CF00ED +S31508009910D000D100D200D300D400D500D600D8009C +S31508009920D900DA00DB00DC00DD00DE00780100018A +S3150800993002010401060108010A010C010E011001C9 +S3150800994012011401160118011A011C011E01200139 +S3150800995022012401260128012A012C012E013001A9 +S3150800996032013401360139013B013D013F01410114 +S315080099704301450147014A014C014E01500152017C +S315080099805401560158015A015C015E0160016201E9 +S315080099906401660168016A016C016E017001720159 +S315080099A07401760179017B017D019101910392038E +S315080099B093039403950396039703980399039A03CD +S315080099C09B039C039D039E039F03A003A103A3037C +S315080099D0A403A503A603A703A803A903AA031004BF +S315080099E011041204130414041504160417041804A5 +S315080099F019041A041B041C041D041E041F04200455 +S31508009A002104220423042404250426042704280404 +S31508009A1029042A042B042C042D042E042F040104E3 +S31508009A2002040304040405040604070408040904DC +S31508009A300A040B040C040E040F0460216121622140 +S31508009A4063216421652166216721682169216A21CC +S31508009A506B216C216D216E216F2121FF22FF23FFCF +S31508009A6024FF25FF26FF27FF28FF29FF2AFF2BFFB4 +S31508009A702CFF2DFF2EFF2FFF30FF31FF32FF33FF64 +S31508009A8034FF35FF36FF37FF38FF39FF3AFF00004E +S30D08009A90FFFFFFFFFFFF0000C6 +S31508009A9801000000010000000000000001020304A4 +S30E08009AA80102030406070809047B S70508000217D9 diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/blt_conf.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/blt_conf.h index 0ad3490b..3acb7769 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/blt_conf.h +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/blt_conf.h @@ -108,6 +108,82 @@ #define BOOT_COM_UART_CHANNEL_INDEX (5) +/* The NET communication interface for firmware updates via TCP/IP is selected by setting + * the BOOT_COM_NET_ENABLE configurable to 1. The maximum amount of data bytes in a + * message for data transmission and reception is set through BOOT_COM_NET_TX_MAX_DATA + * and BOOT_COM_NET_RX_MAX_DATA, respectively. The default IP address is configured + * with the macros BOOT_COM_NET_IPADDRx. The default netmask is configued with the macros + * BOOT_COM_NET_NETMASKx. The default gateway is configured with the macros + * BOOT_COM_NET_GATEWAYx. The bootloader acts and a TCP/IP server. The port the server + * listen on for connections is configured with BOOT_COM_NET_PORT. + */ +/** \brief Enable/disable the NET transport layer. */ +#define BOOT_COM_NET_ENABLE (1) +/** \brief Configure number of bytes in the target->host data packet. */ +#define BOOT_COM_NET_TX_MAX_DATA (64) +/** \brief Configure number of bytes in the host->target data packet. */ +#define BOOT_COM_NET_RX_MAX_DATA (64) +/** \brief Configure the port that the TCP/IP server listens on */ +#define BOOT_COM_NET_PORT (1000) +/** \brief Configure the 1st byte of the IP address */ +#define BOOT_COM_NET_IPADDR0 (169) +/** \brief Configure the 2nd byte of the IP address */ +#define BOOT_COM_NET_IPADDR1 (254) +/** \brief Configure the 3rd byte of the IP address */ +#define BOOT_COM_NET_IPADDR2 (19) +/** \brief Configure the 4th byte of the IP address */ +#define BOOT_COM_NET_IPADDR3 (63) +/** \brief Configure the 1st byte of the network mask */ +#define BOOT_COM_NET_NETMASK0 (255) +/** \brief Configure the 2nd byte of the network mask */ +#define BOOT_COM_NET_NETMASK1 (255) +/** \brief Configure the 3rd byte of the network mask */ +#define BOOT_COM_NET_NETMASK2 (0) +/** \brief Configure the 4th byte of the network mask */ +#define BOOT_COM_NET_NETMASK3 (0) +/** \brief Configure the 1st byte of the gateway address */ +#define BOOT_COM_NET_GATEWAY0 (169) +/** \brief Configure the 2nd byte of the gateway address */ +#define BOOT_COM_NET_GATEWAY1 (254) +/** \brief Configure the 3rd byte of the gateway address */ +#define BOOT_COM_NET_GATEWAY2 (19) +/** \brief Configure the 4th byte of the gateway address */ +#define BOOT_COM_NET_GATEWAY3 (1) +/** \brief Enable/disable a hook function that is called when the IP address is about + * to be set. This allows a dynamic override of the BOOT_COM_NET_IPADDRx values. + */ +#define BOOT_COM_NET_IPADDR_HOOK_ENABLE (0) +/** \brief Enable/disable a hook function that is called when the netmask is about + * to be set. This allows a dynamic override of the BOOT_COM_NET_NETMASKx values. + */ +#define BOOT_COM_NET_NETMASK_HOOK_ENABLE (0) +/** \brief Enable/disable a hook function that is called when the gateway address is + * about to be set. This allows a dynamic override of the BOOT_COM_NET_GATEWAYx + * values. + */ +#define BOOT_COM_NET_GATEWAY_HOOK_ENABLE (0) + + +/**************************************************************************************** +* B A C K D O O R C O N F I G U R A T I O N +****************************************************************************************/ +#if (BOOT_COM_NET_ENABLE > 0) +/* Override the default time that the backdoor is open if firmware updates via TCP/IP + * are supported. in this case a reactivation of the bootloader results in a re- + * initialization of the ethernet MAC. when directly connected to the ethernet port of + * a PC this will go relatively fast (depending on what MS Windows is being used), but + * when connected to the network via a router this can take several seconds. feel free to + * shorten/lengthen this time for finetuning. the only downside of a long backdoor open + * time is that the starting of the user program will also be delayed for this time. + * + * Also note that when the target is directly connected to the ethernet port of a PC, + * the checkbox "Automatically retry socket connection" should be checked in the + * Microboot settings. if connecting via a router the uncheck this checkbox. + */ +#define BACKDOOR_ENTRY_TIMEOUT_MS (10000) +#endif + + /**************************************************************************************** * F I L E S Y S T E M I N T E R F A C E C O N F I G U R A T I O N ****************************************************************************************/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/ide/stm32f407_crossworks.hzp b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/ide/stm32f407_crossworks.hzp index 969b3fdd..742ba27c 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/ide/stm32f407_crossworks.hzp +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/ide/stm32f407_crossworks.hzp @@ -1,7 +1,7 @@ - + @@ -79,6 +79,17 @@ + + + + + + + + + + + @@ -128,7 +139,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/ide/stm32f407_crossworks.hzs b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/ide/stm32f407_crossworks.hzs index 62341ea5..7c9710fb 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/ide/stm32f407_crossworks.hzs +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/ide/stm32f407_crossworks.hzs @@ -64,7 +64,7 @@ - + - + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/ethernetlib/inc/stm32_eth.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/ethernetlib/inc/stm32_eth.h new file mode 100644 index 00000000..578d8baa --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/ethernetlib/inc/stm32_eth.h @@ -0,0 +1,1610 @@ +/** + ****************************************************************************** + * @file stm32_eth.h + * @author MCD Application Team + * @version V1.0.0 + * @date 06/19/2009 + * @brief This file contains all the functions prototypes for the Ethernet + * firmware library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32_ETH_H +#define __STM32_ETH_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" /* STM32 registers */ + +/** @addtogroup STM32_ETH_Driver + * @{ + */ + +/** @defgroup ETH_Exported_Types + * @{ + */ + +/** + * @brief ETH MAC Init structure definition + */ +typedef struct { +/** + * @brief / * MAC + */ + uint32_t ETH_AutoNegotiation; /*!< Selects or not the AutoNegotiation with the external PHY */ + uint32_t ETH_Watchdog; /*!< Enable/disable Watchdog timer */ + uint32_t ETH_Jabber; /*!< Enable/disable Jabber timer */ + uint32_t ETH_InterFrameGap; /*!< Selects minimum IFG between frames during transmission */ + uint32_t ETH_CarrierSense; /*!< Enable/disable Carrier Sense */ + uint32_t ETH_Speed; /*!< Indicates the Ethernet speed: 10/100 Mbps */ + uint32_t ETH_ReceiveOwn; /*!< Enable/disable the reception of frames when the TX_EN signal is asserted in Half-Duplex mode */ + uint32_t ETH_LoopbackMode; /*!< Enable/disable internal MAC MII Loopback mode */ + uint32_t ETH_Mode; /*!< Selects the MAC duplex mode: Half-Duplex or Full-Duplex mode */ + uint32_t ETH_ChecksumOffload; /*!< Enable/disable the calculation of complement sum of all received Ethernet frame payloads */ + uint32_t ETH_RetryTransmission; /*!< Enable/disable the MAC attempt retries transmission, based on the settings of BL, when a colision occurs (Half-Duplex mode) */ + uint32_t ETH_AutomaticPadCRCStrip; /*!< Enable/disable Automatic MAC Pad/CRC Stripping */ + uint32_t ETH_BackOffLimit; /*!< Selects the BackOff limit value */ + uint32_t ETH_DeferralCheck; /*!< Enable/disable deferral check function (Half-Duplex mode) */ + uint32_t ETH_ReceiveAll; /*!< Enable/disable all frames reception by the MAC (No fitering)*/ + uint32_t ETH_SourceAddrFilter; /*!< Selects EnableNormal/EnableInverse/disable Source Address Filter comparison */ + uint32_t ETH_PassControlFrames; /*!< Selects None/All/FilterPass of all control frames (including unicast and multicast PAUSE frames) */ + uint32_t ETH_BroadcastFramesReception; /*!< Enable/disable reception of Broadcast Frames */ + uint32_t ETH_DestinationAddrFilter; /*!< Selects EnableNormal/EnableInverse destination filter for both unicast and multicast frames */ + uint32_t ETH_PromiscuousMode; /*!< Enable/disable Promiscuous Mode */ + uint32_t ETH_MulticastFramesFilter; /*!< Selects the Multicast Frames filter: None/HashTableFilter/PerfectFilter/PerfectHashTableFilter */ + uint32_t ETH_UnicastFramesFilter; /*!< Selects the Unicast Frames filter: HashTableFilter/PerfectFilter/PerfectHashTableFilter */ + uint32_t ETH_HashTableHigh; /*!< This field contains the higher 32 bits of Hash table. */ + uint32_t ETH_HashTableLow; /*!< This field contains the lower 32 bits of Hash table. */ + uint32_t ETH_PauseTime; /*!< This field holds the value to be used in the Pause Time field in the transmit control frame */ + uint32_t ETH_ZeroQuantaPause; /*!< Enable/disable the automatic generation of Zero-Quanta Pause Control frames */ + uint32_t ETH_PauseLowThreshold; /*!< This field configures the threshold of the PAUSE to be checked for automatic retransmission of PAUSE Frame */ + uint32_t ETH_UnicastPauseFrameDetect; /*!< Enable/disable MAC to detect the Pause frames (with MAC Address0 unicast address and unique multicast address) */ + uint32_t ETH_ReceiveFlowControl; /*!< Enable/disable the MAC to decode the received Pause frame and disable its transmitter for a specified (Pause Time) time */ + uint32_t ETH_TransmitFlowControl; /*!< Enable/disable the MAC to transmit Pause frames (Full-Duplex mode) or the MAC back-pressure operation (Half-Duplex mode) */ + uint32_t ETH_VLANTagComparison; /*!< Selects the 12-bit VLAN identifier or the complete 16-bit VLAN tag for comparison and filtering */ + uint32_t ETH_VLANTagIdentifier; /*!< VLAN tag identifier for receive frames */ + +/** + * @brief / * DMA + */ + uint32_t ETH_DropTCPIPChecksumErrorFrame; /*!< Enable/disable Dropping of TCP/IP Checksum Error Frames */ + uint32_t ETH_ReceiveStoreForward; /*!< Enable/disable Receive store and forward */ + uint32_t ETH_FlushReceivedFrame; /*!< Enable/disable flushing of received frames */ + uint32_t ETH_TransmitStoreForward; /*!< Enable/disable Transmit store and forward */ + uint32_t ETH_TransmitThresholdControl; /*!< Selects the Transmit Threshold Control */ + uint32_t ETH_ForwardErrorFrames; /*!< Enable/disable forward to DMA of all frames except runt error frames */ + uint32_t ETH_ForwardUndersizedGoodFrames; /*!< Enable/disable Rx FIFO to forward Undersized frames (frames with no Error and length less than 64 bytes) including pad-bytes and CRC) */ + uint32_t ETH_ReceiveThresholdControl; /*!< Selects the threshold level of the Receive FIFO */ + uint32_t ETH_SecondFrameOperate; /*!< Enable/disable the DMA process of a second frame of Transmit data even before status for first frame is obtained */ + uint32_t ETH_AddressAlignedBeats; /*!< Enable/disable Address Aligned Beats */ + uint32_t ETH_FixedBurst; /*!< Enable/disable the AHB Master interface fixed burst transfers */ + uint32_t ETH_RxDMABurstLength; /*!< Indicate the maximum number of beats to be transferred in one Rx DMA transaction */ + uint32_t ETH_TxDMABurstLength; /*!< Indicate the maximum number of beats to be transferred in one Tx DMA transaction */ + uint32_t ETH_DescriptorSkipLength; /*!< Specifies the number of word to skip between two unchained descriptors (Ring mode) */ + uint32_t ETH_DMAArbitration; /*!< Selects DMA Tx/Rx arbitration */ +}ETH_InitTypeDef; + +/**--------------------------------------------------------------------------**/ +/** + * @brief DMA descriptors types + */ +/**--------------------------------------------------------------------------**/ + +/** + * @brief ETH DMA Desciptors data structure definition + */ +typedef struct { + uint32_t Status; /*!< Status */ + uint32_t ControlBufferSize; /*!< Control and Buffer1, Buffer2 lengths */ + uint32_t Buffer1Addr; /*!< Buffer1 address pointer */ + uint32_t Buffer2NextDescAddr; /*!< Buffer2 or next descriptor address pointer */ +} ETH_DMADESCTypeDef; + +/** + * @} + */ + +/** @defgroup ETH_Exported_Constants + * @{ + */ +/**--------------------------------------------------------------------------**/ +/** + * @brief ETH Frames defines + */ +/**--------------------------------------------------------------------------**/ + +/** @defgroup ENET_Buffers_setting + * @{ + */ +#define ETH_MAX_PACKET_SIZE 1520 /*!< ETH_HEADER + ETH_EXTRA + MAX_ETH_PAYLOAD + ETH_CRC */ +#define ETH_HEADER 14 /*!< 6 byte Dest addr, 6 byte Src addr, 2 byte length/type */ +#define ETH_CRC 4 /*!< Ethernet CRC */ +#define ETH_EXTRA 2 /*!< Extra bytes in some cases */ +#define VLAN_TAG 4 /*!< optional 802.1q VLAN Tag */ +#define MIN_ETH_PAYLOAD 46 /*!< Minimum Ethernet payload size */ +#define MAX_ETH_PAYLOAD 1500 /*!< Maximum Ethernet payload size */ +#define JUMBO_FRAME_PAYLOAD 9000 /*!< Jumbo frame payload size */ + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet DMA descriptors registers bits definition + */ +/**--------------------------------------------------------------------------**/ + +/* DMA Tx Desciptor -----------------------------------------------------------*/ +/**---------------------------------------------------------------------------------------------- + TDES0 | OWN(31) | CTRL[30:26] | Reserved[25:24] | CTRL[23:20] | Reserved[19:17] | Status[16:0] | + ----------------------------------------------------------------------------------------------- + TDES1 | Reserved[31:29] | Buffer2 ByteCount[28:16] | Reserved[15:13] | Buffer1 ByteCount[12:0] | + ----------------------------------------------------------------------------------------------- + TDES2 | Buffer1 Address [31:0] | + ----------------------------------------------------------------------------------------------- + TDES3 | Buffer2 Address [31:0] / Next Desciptor Address [31:0] | + ---------------------------------------------------------------------------------------------**/ + +/** + * @brief Bit definition of TDES0 register: DMA Tx descriptor status register + */ +#define ETH_DMATxDesc_OWN ((uint32_t)0x80000000) /*!< OWN bit: descriptor is owned by DMA engine */ +#define ETH_DMATxDesc_IC ((uint32_t)0x40000000) /*!< Interrupt on Completion */ +#define ETH_DMATxDesc_LS ((uint32_t)0x20000000) /*!< Last Segment */ +#define ETH_DMATxDesc_FS ((uint32_t)0x10000000) /*!< First Segment */ +#define ETH_DMATxDesc_DC ((uint32_t)0x08000000) /*!< Disable CRC */ +#define ETH_DMATxDesc_DP ((uint32_t)0x04000000) /*!< Disable Padding */ +#define ETH_DMATxDesc_TTSE ((uint32_t)0x02000000) /*!< Transmit Time Stamp Enable */ +#define ETH_DMATxDesc_CIC ((uint32_t)0x00C00000) /*!< Checksum Insertion Control: 4 cases */ +#define ETH_DMATxDesc_CIC_ByPass ((uint32_t)0x00000000) /*!< Do Nothing: Checksum Engine is bypassed */ +#define ETH_DMATxDesc_CIC_IPV4Header ((uint32_t)0x00400000) /*!< IPV4 header Checksum Insertion */ +#define ETH_DMATxDesc_CIC_TCPUDPICMP_Segment ((uint32_t)0x00800000) /*!< TCP/UDP/ICMP Checksum Insertion calculated over segment only */ +#define ETH_DMATxDesc_CIC_TCPUDPICMP_Full ((uint32_t)0x00C00000) /*!< TCP/UDP/ICMP Checksum Insertion fully calculated */ +#define ETH_DMATxDesc_TER ((uint32_t)0x00200000) /*!< Transmit End of Ring */ +#define ETH_DMATxDesc_TCH ((uint32_t)0x00100000) /*!< Second Address Chained */ +#define ETH_DMATxDesc_TTSS ((uint32_t)0x00020000) /*!< Tx Time Stamp Status */ +#define ETH_DMATxDesc_IHE ((uint32_t)0x00010000) /*!< IP Header Error */ +#define ETH_DMATxDesc_ES ((uint32_t)0x00008000) /*!< Error summary: OR of the following bits: UE || ED || EC || LCO || NC || LCA || FF || JT */ +#define ETH_DMATxDesc_JT ((uint32_t)0x00004000) /*!< Jabber Timeout */ +#define ETH_DMATxDesc_FF ((uint32_t)0x00002000) /*!< Frame Flushed: DMA/MTL flushed the frame due to SW flush */ +#define ETH_DMATxDesc_PCE ((uint32_t)0x00001000) /*!< Payload Checksum Error */ +#define ETH_DMATxDesc_LCA ((uint32_t)0x00000800) /*!< Loss of Carrier: carrier lost during tramsmission */ +#define ETH_DMATxDesc_NC ((uint32_t)0x00000400) /*!< No Carrier: no carrier signal from the tranceiver */ +#define ETH_DMATxDesc_LCO ((uint32_t)0x00000200) /*!< Late Collision: transmission aborted due to collision */ +#define ETH_DMATxDesc_EC ((uint32_t)0x00000100) /*!< Excessive Collision: transmission aborted after 16 collisions */ +#define ETH_DMATxDesc_VF ((uint32_t)0x00000080) /*!< VLAN Frame */ +#define ETH_DMATxDesc_CC ((uint32_t)0x00000078) /*!< Collision Count */ +#define ETH_DMATxDesc_ED ((uint32_t)0x00000004) /*!< Excessive Deferral */ +#define ETH_DMATxDesc_UF ((uint32_t)0x00000002) /*!< Underflow Error: late data arrival from the memory */ +#define ETH_DMATxDesc_DB ((uint32_t)0x00000001) /*!< Deferred Bit */ + +/** + * @brief Bit definition of TDES1 register + */ +#define ETH_DMATxDesc_TBS2 ((uint32_t)0x1FFF0000) /*!< Transmit Buffer2 Size */ +#define ETH_DMATxDesc_TBS1 ((uint32_t)0x00001FFF) /*!< Transmit Buffer1 Size */ + +/** + * @brief Bit definition of TDES2 register + */ +#define ETH_DMATxDesc_B1AP ((uint32_t)0xFFFFFFFF) /*!< Buffer1 Address Pointer */ + +/** + * @brief Bit definition of TDES3 register + */ +#define ETH_DMATxDesc_B2AP ((uint32_t)0xFFFFFFFF) /*!< Buffer2 Address Pointer */ + +/** + * @} + */ + + +/** @defgroup DMA_Rx_descriptor + * @{ + */ + +/**-------------------------------------------------------------------------------------------------------------------- + RDES0 | OWN(31) | Status [30:0] | + --------------------------------------------------------------------------------------------------------------------- + RDES1 | CTRL(31) | Reserved[30:29] | Buffer2 ByteCount[28:16] | CTRL[15:14] | Reserved(13) | Buffer1 ByteCount[12:0] | + --------------------------------------------------------------------------------------------------------------------- + RDES2 | Buffer1 Address [31:0] | + --------------------------------------------------------------------------------------------------------------------- + RDES3 | Buffer2 Address [31:0] / Next Desciptor Address [31:0] | + -------------------------------------------------------------------------------------------------------------------**/ + +/** + * @brief Bit definition of RDES0 register: DMA Rx descriptor status register + */ +#define ETH_DMARxDesc_OWN ((uint32_t)0x80000000) /*!< OWN bit: descriptor is owned by DMA engine */ +#define ETH_DMARxDesc_AFM ((uint32_t)0x40000000) /*!< DA Filter Fail for the rx frame */ +#define ETH_DMARxDesc_FL ((uint32_t)0x3FFF0000) /*!< Receive descriptor frame length */ +#define ETH_DMARxDesc_ES ((uint32_t)0x00008000) /*!< Error summary: OR of the following bits: DE || OE || IPC || LC || RWT || RE || CE */ +#define ETH_DMARxDesc_DE ((uint32_t)0x00004000) /*!< Desciptor error: no more descriptors for receive frame */ +#define ETH_DMARxDesc_SAF ((uint32_t)0x00002000) /*!< SA Filter Fail for the received frame */ +#define ETH_DMARxDesc_LE ((uint32_t)0x00001000) /*!< Frame size not matching with length field */ +#define ETH_DMARxDesc_OE ((uint32_t)0x00000800) /*!< Overflow Error: Frame was damaged due to buffer overflow */ +#define ETH_DMARxDesc_VLAN ((uint32_t)0x00000400) /*!< VLAN Tag: received frame is a VLAN frame */ +#define ETH_DMARxDesc_FS ((uint32_t)0x00000200) /*!< First descriptor of the frame */ +#define ETH_DMARxDesc_LS ((uint32_t)0x00000100) /*!< Last descriptor of the frame */ +#define ETH_DMARxDesc_IPV4HCE ((uint32_t)0x00000080) /*!< IPC Checksum Error: Rx Ipv4 header checksum error */ +#define ETH_DMARxDesc_LC ((uint32_t)0x00000040) /*!< Late collision occurred during reception */ +#define ETH_DMARxDesc_FT ((uint32_t)0x00000020) /*!< Frame type - Ethernet, otherwise 802.3 */ +#define ETH_DMARxDesc_RWT ((uint32_t)0x00000010) /*!< Receive Watchdog Timeout: watchdog timer expired during reception */ +#define ETH_DMARxDesc_RE ((uint32_t)0x00000008) /*!< Receive error: error reported by MII interface */ +#define ETH_DMARxDesc_DBE ((uint32_t)0x00000004) /*!< Dribble bit error: frame contains non int multiple of 8 bits */ +#define ETH_DMARxDesc_CE ((uint32_t)0x00000002) /*!< CRC error */ +#define ETH_DMARxDesc_MAMPCE ((uint32_t)0x00000001) /*!< Rx MAC Address/Payload Checksum Error: Rx MAC address matched/ Rx Payload Checksum Error */ + +/** + * @brief Bit definition of RDES1 register + */ +#define ETH_DMARxDesc_DIC ((uint32_t)0x80000000) /*!< Disable Interrupt on Completion */ +#define ETH_DMARxDesc_RBS2 ((uint32_t)0x1FFF0000) /*!< Receive Buffer2 Size */ +#define ETH_DMARxDesc_RER ((uint32_t)0x00008000) /*!< Receive End of Ring */ +#define ETH_DMARxDesc_RCH ((uint32_t)0x00004000) /*!< Second Address Chained */ +#define ETH_DMARxDesc_RBS1 ((uint32_t)0x00001FFF) /*!< Receive Buffer1 Size */ + +/** + * @brief Bit definition of RDES2 register + */ +#define ETH_DMARxDesc_B1AP ((uint32_t)0xFFFFFFFF) /*!< Buffer1 Address Pointer */ + +/** + * @brief Bit definition of RDES3 register + */ +#define ETH_DMARxDesc_B2AP ((uint32_t)0xFFFFFFFF) /*!< Buffer2 Address Pointer */ + +/**--------------------------------------------------------------------------**/ +/** + * @brief Desciption of common PHY registers + */ +/**--------------------------------------------------------------------------**/ + +/** + * @} + */ + +/** @defgroup PHY_Read_write_Timeouts + * @{ + */ +#define PHY_READ_TO ((uint32_t)0x0004FFFF) +#define PHY_WRITE_TO ((uint32_t)0x0004FFFF) + +/** + * @} + */ + +/** @defgroup PHY_Reset_Delay + * @{ + */ +#define PHY_ResetDelay ((uint32_t)0x04000000) + +/** + * @} + */ + +/** @defgroup PHY_Config_Delay + * @{ + */ +#define PHY_ConfigDelay ((uint32_t)0x00FFFFFF) + +/** + * @} + */ + +/** @defgroup PHY_Register_address + * @{ + */ +#define PHY_BCR 0 /*!< Tranceiver Basic Control Register */ +#define PHY_BSR 1 /*!< Tranceiver Basic Status Register */ + +/** + * @} + */ + +/** @defgroup PHY_basic_Control_register + * @{ + */ +#define PHY_Reset ((u16)0x8000) /*!< PHY Reset */ +#define PHY_Loopback ((u16)0x4000) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((u16)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((u16)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((u16)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((u16)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AutoNegotiation ((u16)0x1000) /*!< Enable auto-negotiation function */ +#define PHY_Restart_AutoNegotiation ((u16)0x0200) /*!< Restart auto-negotiation function */ +#define PHY_Powerdown ((u16)0x0800) /*!< Select the power down mode */ +#define PHY_Isolate ((u16)0x0400) /*!< Isolate PHY from MII */ + +/** + * @} + */ + +/** @defgroup PHY_basic_status_register + * @{ + */ +#define PHY_AutoNego_Complete ((u16)0x0020) /*!< Auto-Negotioation process completed */ +#define PHY_Linked_Status ((u16)0x0004) /*!< Valid link established */ +#define PHY_Jabber_detection ((u16)0x0002) /*!< Jabber condition detected */ + +/** + * @} + */ + +/** @defgroup PHY_status_register + * @{ + */ +/* The PHY status register value change from a PHY to another so the user have + to update this value depending on the used external PHY */ +/** + * @brief For LAN8700 + */ +//#define PHY_SR 31 /*!< Tranceiver Status Register */ +/** + * @brief For DP83848 + */ +#define PHY_SR 16 /*!< Tranceiver Status Register */ + +/* The Speed and Duplex mask values change from a PHY to another so the user have to update + this value depending on the used external PHY */ +/** + * @brief For LAN8700 + */ +//#define PHY_Speed_Status ((u16)0x0004) /*!< Configured information of Speed: 10Mbps */ +//#define PHY_Duplex_Status ((u16)0x0010) /*!< Configured information of Duplex: Full-duplex */ + +/** + * @brief For DP83848 + */ +#define PHY_Speed_Status ((u16)0x0002) /*!< Configured information of Speed: 10Mbps */ +#define PHY_Duplex_Status ((u16)0x0004) /*!< Configured information of Duplex: Full-duplex */ +#define IS_ETH_PHY_ADDRESS(ADDRESS) ((ADDRESS) <= 0x20) +#define IS_ETH_PHY_REG(REG) (((REG) == PHY_BCR) || \ + ((REG) == PHY_BSR) || \ + ((REG) == PHY_SR)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief MAC defines + */ +/**--------------------------------------------------------------------------**/ + +/** + * @} + */ + +/** @defgroup ETH_AutoNegotiation + * @{ + */ +#define ETH_AutoNegotiation_Enable ((uint32_t)0x00000001) +#define ETH_AutoNegotiation_Disable ((uint32_t)0x00000000) +#define IS_ETH_AUTONEGOTIATION(CMD) (((CMD) == ETH_AutoNegotiation_Enable) || \ + ((CMD) == ETH_AutoNegotiation_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_watchdog + * @{ + */ +#define ETH_Watchdog_Enable ((uint32_t)0x00000000) +#define ETH_Watchdog_Disable ((uint32_t)0x00800000) +#define IS_ETH_WATCHDOG(CMD) (((CMD) == ETH_Watchdog_Enable) || \ + ((CMD) == ETH_Watchdog_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Jabber + * @{ + */ +#define ETH_Jabber_Enable ((uint32_t)0x00000000) +#define ETH_Jabber_Disable ((uint32_t)0x00400000) +#define IS_ETH_JABBER(CMD) (((CMD) == ETH_Jabber_Enable) || \ + ((CMD) == ETH_Jabber_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Inter_Frame_Gap + * @{ + */ +#define ETH_InterFrameGap_96Bit ((uint32_t)0x00000000) /*!< minimum IFG between frames during transmission is 96Bit */ +#define ETH_InterFrameGap_88Bit ((uint32_t)0x00020000) /*!< minimum IFG between frames during transmission is 88Bit */ +#define ETH_InterFrameGap_80Bit ((uint32_t)0x00040000) /*!< minimum IFG between frames during transmission is 80Bit */ +#define ETH_InterFrameGap_72Bit ((uint32_t)0x00060000) /*!< minimum IFG between frames during transmission is 72Bit */ +#define ETH_InterFrameGap_64Bit ((uint32_t)0x00080000) /*!< minimum IFG between frames during transmission is 64Bit */ +#define ETH_InterFrameGap_56Bit ((uint32_t)0x000A0000) /*!< minimum IFG between frames during transmission is 56Bit */ +#define ETH_InterFrameGap_48Bit ((uint32_t)0x000C0000) /*!< minimum IFG between frames during transmission is 48Bit */ +#define ETH_InterFrameGap_40Bit ((uint32_t)0x000E0000) /*!< minimum IFG between frames during transmission is 40Bit */ +#define IS_ETH_INTER_FRAME_GAP(GAP) (((GAP) == ETH_InterFrameGap_96Bit) || \ + ((GAP) == ETH_InterFrameGap_88Bit) || \ + ((GAP) == ETH_InterFrameGap_80Bit) || \ + ((GAP) == ETH_InterFrameGap_72Bit) || \ + ((GAP) == ETH_InterFrameGap_64Bit) || \ + ((GAP) == ETH_InterFrameGap_56Bit) || \ + ((GAP) == ETH_InterFrameGap_48Bit) || \ + ((GAP) == ETH_InterFrameGap_40Bit)) + +/** + * @} + */ + +/** @defgroup ETH_Carrier_Sense + * @{ + */ +#define ETH_CarrierSense_Enable ((uint32_t)0x00000000) +#define ETH_CarrierSense_Disable ((uint32_t)0x00010000) +#define IS_ETH_CARRIER_SENSE(CMD) (((CMD) == ETH_CarrierSense_Enable) || \ + ((CMD) == ETH_CarrierSense_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Speed + * @{ + */ +#define ETH_Speed_10M ((uint32_t)0x00000000) +#define ETH_Speed_100M ((uint32_t)0x00004000) +#define IS_ETH_SPEED(SPEED) (((SPEED) == ETH_Speed_10M) || \ + ((SPEED) == ETH_Speed_100M)) + +/** + * @} + */ + +/** @defgroup ETH_Receive_Own + * @{ + */ +#define ETH_ReceiveOwn_Enable ((uint32_t)0x00000000) +#define ETH_ReceiveOwn_Disable ((uint32_t)0x00002000) +#define IS_ETH_RECEIVE_OWN(CMD) (((CMD) == ETH_ReceiveOwn_Enable) || \ + ((CMD) == ETH_ReceiveOwn_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Loop_back_Mode + * @{ + */ +#define ETH_LoopbackMode_Enable ((uint32_t)0x00001000) +#define ETH_LoopbackMode_Disable ((uint32_t)0x00000000) +#define IS_ETH_LOOPBACK_MODE(CMD) (((CMD) == ETH_LoopbackMode_Enable) || \ + ((CMD) == ETH_LoopbackMode_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Duplex_mode + * @{ + */ +#define ETH_Mode_FullDuplex ((uint32_t)0x00000800) +#define ETH_Mode_HalfDuplex ((uint32_t)0x00000000) +#define IS_ETH_DUPLEX_MODE(MODE) (((MODE) == ETH_Mode_FullDuplex) || \ + ((MODE) == ETH_Mode_HalfDuplex)) + +/** + * @} + */ + +/** @defgroup ETH_Checksum_Offload + * @{ + */ +#define ETH_ChecksumOffload_Enable ((uint32_t)0x00000400) +#define ETH_ChecksumOffload_Disable ((uint32_t)0x00000000) +#define IS_ETH_CHECKSUM_OFFLOAD(CMD) (((CMD) == ETH_ChecksumOffload_Enable) || \ + ((CMD) == ETH_ChecksumOffload_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Retry_Transmission + * @{ + */ +#define ETH_RetryTransmission_Enable ((uint32_t)0x00000000) +#define ETH_RetryTransmission_Disable ((uint32_t)0x00000200) +#define IS_ETH_RETRY_TRANSMISSION(CMD) (((CMD) == ETH_RetryTransmission_Enable) || \ + ((CMD) == ETH_RetryTransmission_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Automatic_Pad_CRC_Strip + * @{ + */ +#define ETH_AutomaticPadCRCStrip_Enable ((uint32_t)0x00000080) +#define ETH_AutomaticPadCRCStrip_Disable ((uint32_t)0x00000000) +#define IS_ETH_AUTOMATIC_PADCRC_STRIP(CMD) (((CMD) == ETH_AutomaticPadCRCStrip_Enable) || \ + ((CMD) == ETH_AutomaticPadCRCStrip_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Back-Off_limit + * @{ + */ +#define ETH_BackOffLimit_10 ((uint32_t)0x00000000) +#define ETH_BackOffLimit_8 ((uint32_t)0x00000020) +#define ETH_BackOffLimit_4 ((uint32_t)0x00000040) +#define ETH_BackOffLimit_1 ((uint32_t)0x00000060) +#define IS_ETH_BACKOFF_LIMIT(LIMIT) (((LIMIT) == ETH_BackOffLimit_10) || \ + ((LIMIT) == ETH_BackOffLimit_8) || \ + ((LIMIT) == ETH_BackOffLimit_4) || \ + ((LIMIT) == ETH_BackOffLimit_1)) + +/** + * @} + */ + +/** @defgroup ETH_Deferral_Check + * @{ + */ +#define ETH_DeferralCheck_Enable ((uint32_t)0x00000010) +#define ETH_DeferralCheck_Disable ((uint32_t)0x00000000) +#define IS_ETH_DEFERRAL_CHECK(CMD) (((CMD) == ETH_DeferralCheck_Enable) || \ + ((CMD) == ETH_DeferralCheck_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Receive_All + * @{ + */ +#define ETH_ReceiveAll_Enable ((uint32_t)0x80000000) +#define ETH_ReceiveAll_Disable ((uint32_t)0x00000000) +#define IS_ETH_RECEIVE_ALL(CMD) (((CMD) == ETH_ReceiveAll_Enable) || \ + ((CMD) == ETH_ReceiveAll_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Source_Addr_Filter + * @{ + */ +#define ETH_SourceAddrFilter_Normal_Enable ((uint32_t)0x00000200) +#define ETH_SourceAddrFilter_Inverse_Enable ((uint32_t)0x00000300) +#define ETH_SourceAddrFilter_Disable ((uint32_t)0x00000000) +#define IS_ETH_SOURCE_ADDR_FILTER(CMD) (((CMD) == ETH_SourceAddrFilter_Normal_Enable) || \ + ((CMD) == ETH_SourceAddrFilter_Inverse_Enable) || \ + ((CMD) == ETH_SourceAddrFilter_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Pass_Control_Frames + * @{ + */ +#define ETH_PassControlFrames_BlockAll ((uint32_t)0x00000040) /*!< MAC filters all control frames from reaching the application */ +#define ETH_PassControlFrames_ForwardAll ((uint32_t)0x00000080) /*!< MAC forwards all control frames to application even if they fail the Address Filter */ +#define ETH_PassControlFrames_ForwardPassedAddrFilter ((uint32_t)0x000000C0) /*!< MAC forwards control frames that pass the Address Filter. */ +#define IS_ETH_CONTROL_FRAMES(PASS) (((PASS) == ETH_PassControlFrames_BlockAll) || \ + ((PASS) == ETH_PassControlFrames_ForwardAll) || \ + ((PASS) == ETH_PassControlFrames_ForwardPassedAddrFilter)) + +/** + * @} + */ + +/** @defgroup ETH_Broadcast_Frames_Reception + * @{ + */ +#define ETH_BroadcastFramesReception_Enable ((uint32_t)0x00000000) +#define ETH_BroadcastFramesReception_Disable ((uint32_t)0x00000020) +#define IS_ETH_BROADCAST_FRAMES_RECEPTION(CMD) (((CMD) == ETH_BroadcastFramesReception_Enable) || \ + ((CMD) == ETH_BroadcastFramesReception_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Destination_Addr_Filter + * @{ + */ +#define ETH_DestinationAddrFilter_Normal ((uint32_t)0x00000000) +#define ETH_DestinationAddrFilter_Inverse ((uint32_t)0x00000008) +#define IS_ETH_DESTINATION_ADDR_FILTER(FILTER) (((FILTER) == ETH_DestinationAddrFilter_Normal) || \ + ((FILTER) == ETH_DestinationAddrFilter_Inverse)) + +/** + * @} + */ + +/** @defgroup ETH_Promiscuous_Mode + * @{ + */ +#define ETH_PromiscuousMode_Enable ((uint32_t)0x00000001) +#define ETH_PromiscuousMode_Disable ((uint32_t)0x00000000) +#define IS_ETH_PROMISCUOUS_MODE(CMD) (((CMD) == ETH_PromiscuousMode_Enable) || \ + ((CMD) == ETH_PromiscuousMode_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_multicast_frames_filter + * @{ + */ +#define ETH_MulticastFramesFilter_PerfectHashTable ((uint32_t)0x00000404) +#define ETH_MulticastFramesFilter_HashTable ((uint32_t)0x00000004) +#define ETH_MulticastFramesFilter_Perfect ((uint32_t)0x00000000) +#define ETH_MulticastFramesFilter_None ((uint32_t)0x00000010) +#define IS_ETH_MULTICAST_FRAMES_FILTER(FILTER) (((FILTER) == ETH_MulticastFramesFilter_PerfectHashTable) || \ + ((FILTER) == ETH_MulticastFramesFilter_HashTable) || \ + ((FILTER) == ETH_MulticastFramesFilter_Perfect) || \ + ((FILTER) == ETH_MulticastFramesFilter_None)) + + +/** + * @} + */ + +/** @defgroup ETH_unicast_frames_filter + * @{ + */ +#define ETH_UnicastFramesFilter_PerfectHashTable ((uint32_t)0x00000402) +#define ETH_UnicastFramesFilter_HashTable ((uint32_t)0x00000002) +#define ETH_UnicastFramesFilter_Perfect ((uint32_t)0x00000000) +#define IS_ETH_UNICAST_FRAMES_FILTER(FILTER) (((FILTER) == ETH_UnicastFramesFilter_PerfectHashTable) || \ + ((FILTER) == ETH_UnicastFramesFilter_HashTable) || \ + ((FILTER) == ETH_UnicastFramesFilter_Perfect)) + +/** + * @} + */ + +/** @defgroup ETH_Pause_Time + * @{ + */ +#define IS_ETH_PAUSE_TIME(TIME) ((TIME) <= 0xFFFF) + +/** + * @} + */ + +/** @defgroup ETH_Zero_Quanta_Pause + * @{ + */ +#define ETH_ZeroQuantaPause_Enable ((uint32_t)0x00000000) +#define ETH_ZeroQuantaPause_Disable ((uint32_t)0x00000080) +#define IS_ETH_ZEROQUANTA_PAUSE(CMD) (((CMD) == ETH_ZeroQuantaPause_Enable) || \ + ((CMD) == ETH_ZeroQuantaPause_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Pause_Low_Threshold + * @{ + */ +#define ETH_PauseLowThreshold_Minus4 ((uint32_t)0x00000000) /*!< Pause time minus 4 slot times */ +#define ETH_PauseLowThreshold_Minus28 ((uint32_t)0x00000010) /*!< Pause time minus 28 slot times */ +#define ETH_PauseLowThreshold_Minus144 ((uint32_t)0x00000020) /*!< Pause time minus 144 slot times */ +#define ETH_PauseLowThreshold_Minus256 ((uint32_t)0x00000030) /*!< Pause time minus 256 slot times */ +#define IS_ETH_PAUSE_LOW_THRESHOLD(THRESHOLD) (((THRESHOLD) == ETH_PauseLowThreshold_Minus4) || \ + ((THRESHOLD) == ETH_PauseLowThreshold_Minus28) || \ + ((THRESHOLD) == ETH_PauseLowThreshold_Minus144) || \ + ((THRESHOLD) == ETH_PauseLowThreshold_Minus256)) + +/** + * @} + */ + +/** @defgroup ETH_Unicast_Pause_Frame_Detect + * @{ + */ +#define ETH_UnicastPauseFrameDetect_Enable ((uint32_t)0x00000008) +#define ETH_UnicastPauseFrameDetect_Disable ((uint32_t)0x00000000) +#define IS_ETH_UNICAST_PAUSE_FRAME_DETECT(CMD) (((CMD) == ETH_UnicastPauseFrameDetect_Enable) || \ + ((CMD) == ETH_UnicastPauseFrameDetect_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Receive_Flow_Control + * @{ + */ +#define ETH_ReceiveFlowControl_Enable ((uint32_t)0x00000004) +#define ETH_ReceiveFlowControl_Disable ((uint32_t)0x00000000) +#define IS_ETH_RECEIVE_FLOWCONTROL(CMD) (((CMD) == ETH_ReceiveFlowControl_Enable) || \ + ((CMD) == ETH_ReceiveFlowControl_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Transmit_Flow_Control + * @{ + */ +#define ETH_TransmitFlowControl_Enable ((uint32_t)0x00000002) +#define ETH_TransmitFlowControl_Disable ((uint32_t)0x00000000) +#define IS_ETH_TRANSMIT_FLOWCONTROL(CMD) (((CMD) == ETH_TransmitFlowControl_Enable) || \ + ((CMD) == ETH_TransmitFlowControl_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_VLAN_Tag_Comparison + * @{ + */ +#define ETH_VLANTagComparison_12Bit ((uint32_t)0x00010000) +#define ETH_VLANTagComparison_16Bit ((uint32_t)0x00000000) +#define IS_ETH_VLAN_TAG_COMPARISON(COMPARISON) (((COMPARISON) == ETH_VLANTagComparison_12Bit) || \ + ((COMPARISON) == ETH_VLANTagComparison_16Bit)) +#define IS_ETH_VLAN_TAG_IDENTIFIER(IDENTIFIER) ((IDENTIFIER) <= 0xFFFF) + +/** + * @} + */ + +/** @defgroup ETH_MAC_Flags + * @{ + */ +#define ETH_MAC_FLAG_TST ((uint32_t)0x00000200) /*!< Time stamp trigger flag (on MAC) */ +#define ETH_MAC_FLAG_MMCT ((uint32_t)0x00000040) /*!< MMC transmit flag */ +#define ETH_MAC_FLAG_MMCR ((uint32_t)0x00000020) /*!< MMC receive flag */ +#define ETH_MAC_FLAG_MMC ((uint32_t)0x00000010) /*!< MMC flag (on MAC) */ +#define ETH_MAC_FLAG_PMT ((uint32_t)0x00000008) /*!< PMT flag (on MAC) */ +#define IS_ETH_MAC_GET_FLAG(FLAG) (((FLAG) == ETH_MAC_FLAG_TST) || ((FLAG) == ETH_MAC_FLAG_MMCT) || \ + ((FLAG) == ETH_MAC_FLAG_MMCR) || ((FLAG) == ETH_MAC_FLAG_MMC) || \ + ((FLAG) == ETH_MAC_FLAG_PMT)) +/** + * @} + */ + +/** @defgroup ETH_MAC_Interrupts + * @{ + */ +#define ETH_MAC_IT_TST ((uint32_t)0x00000200) /*!< Time stamp trigger interrupt (on MAC) */ +#define ETH_MAC_IT_MMCT ((uint32_t)0x00000040) /*!< MMC transmit interrupt */ +#define ETH_MAC_IT_MMCR ((uint32_t)0x00000020) /*!< MMC receive interrupt */ +#define ETH_MAC_IT_MMC ((uint32_t)0x00000010) /*!< MMC interrupt (on MAC) */ +#define ETH_MAC_IT_PMT ((uint32_t)0x00000008) /*!< PMT interrupt (on MAC) */ +#define IS_ETH_MAC_IT(IT) ((((IT) & (uint32_t)0xFFFFFDF7) == 0x00) && ((IT) != 0x00)) +#define IS_ETH_MAC_GET_IT(IT) (((IT) == ETH_MAC_IT_TST) || ((IT) == ETH_MAC_IT_MMCT) || \ + ((IT) == ETH_MAC_IT_MMCR) || ((IT) == ETH_MAC_IT_MMC) || \ + ((IT) == ETH_MAC_IT_PMT)) +/** + * @} + */ + +/** @defgroup ETH_MAC_addresses + * @{ + */ +#define ETH_MAC_Address0 ((uint32_t)0x00000000) +#define ETH_MAC_Address1 ((uint32_t)0x00000008) +#define ETH_MAC_Address2 ((uint32_t)0x00000010) +#define ETH_MAC_Address3 ((uint32_t)0x00000018) +#define IS_ETH_MAC_ADDRESS0123(ADDRESS) (((ADDRESS) == ETH_MAC_Address0) || \ + ((ADDRESS) == ETH_MAC_Address1) || \ + ((ADDRESS) == ETH_MAC_Address2) || \ + ((ADDRESS) == ETH_MAC_Address3)) +#define IS_ETH_MAC_ADDRESS123(ADDRESS) (((ADDRESS) == ETH_MAC_Address1) || \ + ((ADDRESS) == ETH_MAC_Address2) || \ + ((ADDRESS) == ETH_MAC_Address3)) +/** + * @} + */ + +/** @defgroup ETH_MAC_addresses_filter:_SA_DA_filed_of_received_frames + * @{ + */ +#define ETH_MAC_AddressFilter_SA ((uint32_t)0x00000000) +#define ETH_MAC_AddressFilter_DA ((uint32_t)0x00000008) +#define IS_ETH_MAC_ADDRESS_FILTER(FILTER) (((FILTER) == ETH_MAC_AddressFilter_SA) || \ + ((FILTER) == ETH_MAC_AddressFilter_DA)) +/** + * @} + */ + +/** @defgroup ETH_MAC_addresses_filter:_Mask_bytes + * @{ + */ +#define ETH_MAC_AddressMask_Byte6 ((uint32_t)0x20000000) /*!< Mask MAC Address high reg bits [15:8] */ +#define ETH_MAC_AddressMask_Byte5 ((uint32_t)0x10000000) /*!< Mask MAC Address high reg bits [7:0] */ +#define ETH_MAC_AddressMask_Byte4 ((uint32_t)0x08000000) /*!< Mask MAC Address low reg bits [31:24] */ +#define ETH_MAC_AddressMask_Byte3 ((uint32_t)0x04000000) /*!< Mask MAC Address low reg bits [23:16] */ +#define ETH_MAC_AddressMask_Byte2 ((uint32_t)0x02000000) /*!< Mask MAC Address low reg bits [15:8] */ +#define ETH_MAC_AddressMask_Byte1 ((uint32_t)0x01000000) /*!< Mask MAC Address low reg bits [70] */ +#define IS_ETH_MAC_ADDRESS_MASK(MASK) (((MASK) == ETH_MAC_AddressMask_Byte6) || \ + ((MASK) == ETH_MAC_AddressMask_Byte5) || \ + ((MASK) == ETH_MAC_AddressMask_Byte4) || \ + ((MASK) == ETH_MAC_AddressMask_Byte3) || \ + ((MASK) == ETH_MAC_AddressMask_Byte2) || \ + ((MASK) == ETH_MAC_AddressMask_Byte1)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet DMA Desciptors defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_DMA_Tx_descriptor_flags + * @{ + */ +#define IS_ETH_DMATxDESC_GET_FLAG(FLAG) (((FLAG) == ETH_DMATxDesc_OWN) || \ + ((FLAG) == ETH_DMATxDesc_IC) || \ + ((FLAG) == ETH_DMATxDesc_LS) || \ + ((FLAG) == ETH_DMATxDesc_FS) || \ + ((FLAG) == ETH_DMATxDesc_DC) || \ + ((FLAG) == ETH_DMATxDesc_DP) || \ + ((FLAG) == ETH_DMATxDesc_TTSE) || \ + ((FLAG) == ETH_DMATxDesc_TER) || \ + ((FLAG) == ETH_DMATxDesc_TCH) || \ + ((FLAG) == ETH_DMATxDesc_TTSS) || \ + ((FLAG) == ETH_DMATxDesc_IHE) || \ + ((FLAG) == ETH_DMATxDesc_ES) || \ + ((FLAG) == ETH_DMATxDesc_JT) || \ + ((FLAG) == ETH_DMATxDesc_FF) || \ + ((FLAG) == ETH_DMATxDesc_PCE) || \ + ((FLAG) == ETH_DMATxDesc_LCA) || \ + ((FLAG) == ETH_DMATxDesc_NC) || \ + ((FLAG) == ETH_DMATxDesc_LCO) || \ + ((FLAG) == ETH_DMATxDesc_EC) || \ + ((FLAG) == ETH_DMATxDesc_VF) || \ + ((FLAG) == ETH_DMATxDesc_CC) || \ + ((FLAG) == ETH_DMATxDesc_ED) || \ + ((FLAG) == ETH_DMATxDesc_UF) || \ + ((FLAG) == ETH_DMATxDesc_DB)) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Tx_descriptor_segment + * @{ + */ +#define ETH_DMATxDesc_LastSegment ((uint32_t)0x40000000) /*!< Last Segment */ +#define ETH_DMATxDesc_FirstSegment ((uint32_t)0x20000000) /*!< First Segment */ +#define IS_ETH_DMA_TXDESC_SEGMENT(SEGMENT) (((SEGMENT) == ETH_DMATxDesc_LastSegment) || \ + ((SEGMENT) == ETH_DMATxDesc_FirstSegment)) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Tx_descriptor_Checksum_Insertion_Control + * @{ + */ +#define ETH_DMATxDesc_ChecksumByPass ((uint32_t)0x00000000) /*!< Checksum engine bypass */ +#define ETH_DMATxDesc_ChecksumIPV4Header ((uint32_t)0x00400000) /*!< IPv4 header checksum insertion */ +#define ETH_DMATxDesc_ChecksumTCPUDPICMPSegment ((uint32_t)0x00800000) /*!< TCP/UDP/ICMP checksum insertion. Pseudo header checksum is assumed to be present */ +#define ETH_DMATxDesc_ChecksumTCPUDPICMPFull ((uint32_t)0x00C00000) /*!< TCP/UDP/ICMP checksum fully in hardware including pseudo header */ +#define IS_ETH_DMA_TXDESC_CHECKSUM(CHECKSUM) (((CHECKSUM) == ETH_DMATxDesc_ChecksumByPass) || \ + ((CHECKSUM) == ETH_DMATxDesc_ChecksumIPV4Header) || \ + ((CHECKSUM) == ETH_DMATxDesc_ChecksumTCPUDPICMPSegment) || \ + ((CHECKSUM) == ETH_DMATxDesc_ChecksumTCPUDPICMPFull)) +/** + * @brief ETH DMA Tx Desciptor buffer size + */ +#define IS_ETH_DMATxDESC_BUFFER_SIZE(SIZE) ((SIZE) <= 0x1FFF) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Rx_descriptor_flags + * @{ + */ +#define IS_ETH_DMARxDESC_GET_FLAG(FLAG) (((FLAG) == ETH_DMARxDesc_OWN) || \ + ((FLAG) == ETH_DMARxDesc_AFM) || \ + ((FLAG) == ETH_DMARxDesc_ES) || \ + ((FLAG) == ETH_DMARxDesc_DE) || \ + ((FLAG) == ETH_DMARxDesc_SAF) || \ + ((FLAG) == ETH_DMARxDesc_LE) || \ + ((FLAG) == ETH_DMARxDesc_OE) || \ + ((FLAG) == ETH_DMARxDesc_VLAN) || \ + ((FLAG) == ETH_DMARxDesc_FS) || \ + ((FLAG) == ETH_DMARxDesc_LS) || \ + ((FLAG) == ETH_DMARxDesc_IPV4HCE) || \ + ((FLAG) == ETH_DMARxDesc_LC) || \ + ((FLAG) == ETH_DMARxDesc_FT) || \ + ((FLAG) == ETH_DMARxDesc_RWT) || \ + ((FLAG) == ETH_DMARxDesc_RE) || \ + ((FLAG) == ETH_DMARxDesc_DBE) || \ + ((FLAG) == ETH_DMARxDesc_CE) || \ + ((FLAG) == ETH_DMARxDesc_MAMPCE)) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Rx_descriptor_buffers_ + * @{ + */ +#define ETH_DMARxDesc_Buffer1 ((uint32_t)0x00000000) /*!< DMA Rx Desc Buffer1 */ +#define ETH_DMARxDesc_Buffer2 ((uint32_t)0x00000001) /*!< DMA Rx Desc Buffer2 */ +#define IS_ETH_DMA_RXDESC_BUFFER(BUFFER) (((BUFFER) == ETH_DMARxDesc_Buffer1) || \ + ((BUFFER) == ETH_DMARxDesc_Buffer2)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet DMA defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_Drop_TCP_IP_Checksum_Error_Frame + * @{ + */ +#define ETH_DropTCPIPChecksumErrorFrame_Enable ((uint32_t)0x00000000) +#define ETH_DropTCPIPChecksumErrorFrame_Disable ((uint32_t)0x04000000) +#define IS_ETH_DROP_TCPIP_CHECKSUM_FRAME(CMD) (((CMD) == ETH_DropTCPIPChecksumErrorFrame_Enable) || \ + ((CMD) == ETH_DropTCPIPChecksumErrorFrame_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Receive_Store_Forward + * @{ + */ +#define ETH_ReceiveStoreForward_Enable ((uint32_t)0x02000000) +#define ETH_ReceiveStoreForward_Disable ((uint32_t)0x00000000) +#define IS_ETH_RECEIVE_STORE_FORWARD(CMD) (((CMD) == ETH_ReceiveStoreForward_Enable) || \ + ((CMD) == ETH_ReceiveStoreForward_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Flush_Received_Frame + * @{ + */ +#define ETH_FlushReceivedFrame_Enable ((uint32_t)0x00000000) +#define ETH_FlushReceivedFrame_Disable ((uint32_t)0x01000000) +#define IS_ETH_FLUSH_RECEIVE_FRAME(CMD) (((CMD) == ETH_FlushReceivedFrame_Enable) || \ + ((CMD) == ETH_FlushReceivedFrame_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Transmit_Store_Forward + * @{ + */ +#define ETH_TransmitStoreForward_Enable ((uint32_t)0x00200000) +#define ETH_TransmitStoreForward_Disable ((uint32_t)0x00000000) +#define IS_ETH_TRANSMIT_STORE_FORWARD(CMD) (((CMD) == ETH_TransmitStoreForward_Enable) || \ + ((CMD) == ETH_TransmitStoreForward_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Transmit_Threshold_Control + * @{ + */ +#define ETH_TransmitThresholdControl_64Bytes ((uint32_t)0x00000000) /*!< threshold level of the MTL Transmit FIFO is 64 Bytes */ +#define ETH_TransmitThresholdControl_128Bytes ((uint32_t)0x00004000) /*!< threshold level of the MTL Transmit FIFO is 128 Bytes */ +#define ETH_TransmitThresholdControl_192Bytes ((uint32_t)0x00008000) /*!< threshold level of the MTL Transmit FIFO is 192 Bytes */ +#define ETH_TransmitThresholdControl_256Bytes ((uint32_t)0x0000C000) /*!< threshold level of the MTL Transmit FIFO is 256 Bytes */ +#define ETH_TransmitThresholdControl_40Bytes ((uint32_t)0x00010000) /*!< threshold level of the MTL Transmit FIFO is 40 Bytes */ +#define ETH_TransmitThresholdControl_32Bytes ((uint32_t)0x00014000) /*!< threshold level of the MTL Transmit FIFO is 32 Bytes */ +#define ETH_TransmitThresholdControl_24Bytes ((uint32_t)0x00018000) /*!< threshold level of the MTL Transmit FIFO is 24 Bytes */ +#define ETH_TransmitThresholdControl_16Bytes ((uint32_t)0x0001C000) /*!< threshold level of the MTL Transmit FIFO is 16 Bytes */ +#define IS_ETH_TRANSMIT_THRESHOLD_CONTROL(THRESHOLD) (((THRESHOLD) == ETH_TransmitThresholdControl_64Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_128Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_192Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_256Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_40Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_32Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_24Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_16Bytes)) +/** + * @} + */ + +/** @defgroup ETH_Forward_Error_Frames + * @{ + */ +#define ETH_ForwardErrorFrames_Enable ((uint32_t)0x00000080) +#define ETH_ForwardErrorFrames_Disable ((uint32_t)0x00000000) +#define IS_ETH_FORWARD_ERROR_FRAMES(CMD) (((CMD) == ETH_ForwardErrorFrames_Enable) || \ + ((CMD) == ETH_ForwardErrorFrames_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Forward_Undersized_Good_Frames + * @{ + */ +#define ETH_ForwardUndersizedGoodFrames_Enable ((uint32_t)0x00000040) +#define ETH_ForwardUndersizedGoodFrames_Disable ((uint32_t)0x00000000) +#define IS_ETH_FORWARD_UNDERSIZED_GOOD_FRAMES(CMD) (((CMD) == ETH_ForwardUndersizedGoodFrames_Enable) || \ + ((CMD) == ETH_ForwardUndersizedGoodFrames_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Receive_Threshold_Control + * @{ + */ +#define ETH_ReceiveThresholdControl_64Bytes ((uint32_t)0x00000000) /*!< threshold level of the MTL Receive FIFO is 64 Bytes */ +#define ETH_ReceiveThresholdControl_32Bytes ((uint32_t)0x00000008) /*!< threshold level of the MTL Receive FIFO is 32 Bytes */ +#define ETH_ReceiveThresholdControl_96Bytes ((uint32_t)0x00000010) /*!< threshold level of the MTL Receive FIFO is 96 Bytes */ +#define ETH_ReceiveThresholdControl_128Bytes ((uint32_t)0x00000018) /*!< threshold level of the MTL Receive FIFO is 128 Bytes */ +#define IS_ETH_RECEIVE_THRESHOLD_CONTROL(THRESHOLD) (((THRESHOLD) == ETH_ReceiveThresholdControl_64Bytes) || \ + ((THRESHOLD) == ETH_ReceiveThresholdControl_32Bytes) || \ + ((THRESHOLD) == ETH_ReceiveThresholdControl_96Bytes) || \ + ((THRESHOLD) == ETH_ReceiveThresholdControl_128Bytes)) +/** + * @} + */ + +/** @defgroup ETH_Second_Frame_Operate + * @{ + */ +#define ETH_SecondFrameOperate_Enable ((uint32_t)0x00000004) +#define ETH_SecondFrameOperate_Disable ((uint32_t)0x00000000) +#define IS_ETH_SECOND_FRAME_OPERATE(CMD) (((CMD) == ETH_SecondFrameOperate_Enable) || \ + ((CMD) == ETH_SecondFrameOperate_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Address_Aligned_Beats + * @{ + */ +#define ETH_AddressAlignedBeats_Enable ((uint32_t)0x02000000) +#define ETH_AddressAlignedBeats_Disable ((uint32_t)0x00000000) +#define IS_ETH_ADDRESS_ALIGNED_BEATS(CMD) (((CMD) == ETH_AddressAlignedBeats_Enable) || \ + ((CMD) == ETH_AddressAlignedBeats_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Fixed_Burst + * @{ + */ +#define ETH_FixedBurst_Enable ((uint32_t)0x00010000) +#define ETH_FixedBurst_Disable ((uint32_t)0x00000000) +#define IS_ETH_FIXED_BURST(CMD) (((CMD) == ETH_FixedBurst_Enable) || \ + ((CMD) == ETH_FixedBurst_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Rx_DMA_Burst_Length + * @{ + */ +#define ETH_RxDMABurstLength_1Beat ((uint32_t)0x00020000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 1 */ +#define ETH_RxDMABurstLength_2Beat ((uint32_t)0x00040000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 2 */ +#define ETH_RxDMABurstLength_4Beat ((uint32_t)0x00080000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 4 */ +#define ETH_RxDMABurstLength_8Beat ((uint32_t)0x00100000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 8 */ +#define ETH_RxDMABurstLength_16Beat ((uint32_t)0x00200000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 16 */ +#define ETH_RxDMABurstLength_32Beat ((uint32_t)0x00400000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 32 */ +#define ETH_RxDMABurstLength_4xPBL_4Beat ((uint32_t)0x01020000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 4 */ +#define ETH_RxDMABurstLength_4xPBL_8Beat ((uint32_t)0x01040000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 8 */ +#define ETH_RxDMABurstLength_4xPBL_16Beat ((uint32_t)0x01080000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 16 */ +#define ETH_RxDMABurstLength_4xPBL_32Beat ((uint32_t)0x01100000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 32 */ +#define ETH_RxDMABurstLength_4xPBL_64Beat ((uint32_t)0x01200000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 64 */ +#define ETH_RxDMABurstLength_4xPBL_128Beat ((uint32_t)0x01400000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 128 */ +#define IS_ETH_RXDMA_BURST_LENGTH(LENGTH) (((LENGTH) == ETH_RxDMABurstLength_1Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_2Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_8Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_16Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_32Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_4Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_8Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_16Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_32Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_64Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_128Beat)) + +/** + * @} + */ + +/** @defgroup ETH_Tx_DMA_Burst_Length + * @{ + */ +#define ETH_TxDMABurstLength_1Beat ((uint32_t)0x00000100) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 1 */ +#define ETH_TxDMABurstLength_2Beat ((uint32_t)0x00000200) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 2 */ +#define ETH_TxDMABurstLength_4Beat ((uint32_t)0x00000400) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ +#define ETH_TxDMABurstLength_8Beat ((uint32_t)0x00000800) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ +#define ETH_TxDMABurstLength_16Beat ((uint32_t)0x00001000) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ +#define ETH_TxDMABurstLength_32Beat ((uint32_t)0x00002000) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ +#define ETH_TxDMABurstLength_4xPBL_4Beat ((uint32_t)0x01000100) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ +#define ETH_TxDMABurstLength_4xPBL_8Beat ((uint32_t)0x01000200) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ +#define ETH_TxDMABurstLength_4xPBL_16Beat ((uint32_t)0x01000400) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ +#define ETH_TxDMABurstLength_4xPBL_32Beat ((uint32_t)0x01000800) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ +#define ETH_TxDMABurstLength_4xPBL_64Beat ((uint32_t)0x01001000) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 64 */ +#define ETH_TxDMABurstLength_4xPBL_128Beat ((uint32_t)0x01002000) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 128 */ +#define IS_ETH_TXDMA_BURST_LENGTH(LENGTH) (((LENGTH) == ETH_TxDMABurstLength_1Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_2Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_8Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_16Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_32Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_4Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_8Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_16Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_32Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_64Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_128Beat)) +/** + * @brief ETH DMA Desciptor SkipLength + */ +#define IS_ETH_DMA_DESC_SKIP_LENGTH(LENGTH) ((LENGTH) <= 0x1F) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Arbitration + * @{ + */ +#define ETH_DMAArbitration_RoundRobin_RxTx_1_1 ((uint32_t)0x00000000) +#define ETH_DMAArbitration_RoundRobin_RxTx_2_1 ((uint32_t)0x00004000) +#define ETH_DMAArbitration_RoundRobin_RxTx_3_1 ((uint32_t)0x00008000) +#define ETH_DMAArbitration_RoundRobin_RxTx_4_1 ((uint32_t)0x0000C000) +#define ETH_DMAArbitration_RxPriorTx ((uint32_t)0x00000002) +#define IS_ETH_DMA_ARBITRATION_ROUNDROBIN_RXTX(RATIO) (((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_1_1) || \ + ((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_2_1) || \ + ((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_3_1) || \ + ((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_4_1) || \ + ((RATIO) == ETH_DMAArbitration_RxPriorTx)) +/** + * @} + */ + +/** @defgroup ETH_DMA_Flags + * @{ + */ +#define ETH_DMA_FLAG_TST ((uint32_t)0x20000000) /*!< Time-stamp trigger interrupt (on DMA) */ +#define ETH_DMA_FLAG_PMT ((uint32_t)0x10000000) /*!< PMT interrupt (on DMA) */ +#define ETH_DMA_FLAG_MMC ((uint32_t)0x08000000) /*!< MMC interrupt (on DMA) */ +#define ETH_DMA_FLAG_DataTransferError ((uint32_t)0x00800000) /*!< Error bits 0-Rx DMA, 1-Tx DMA */ +#define ETH_DMA_FLAG_ReadWriteError ((uint32_t)0x01000000) /*!< Error bits 0-write trnsf, 1-read transfr */ +#define ETH_DMA_FLAG_AccessError ((uint32_t)0x02000000) /*!< Error bits 0-data buffer, 1-desc. access */ +#define ETH_DMA_FLAG_NIS ((uint32_t)0x00010000) /*!< Normal interrupt summary flag */ +#define ETH_DMA_FLAG_AIS ((uint32_t)0x00008000) /*!< Abnormal interrupt summary flag */ +#define ETH_DMA_FLAG_ER ((uint32_t)0x00004000) /*!< Early receive flag */ +#define ETH_DMA_FLAG_FBE ((uint32_t)0x00002000) /*!< Fatal bus error flag */ +#define ETH_DMA_FLAG_ET ((uint32_t)0x00000400) /*!< Early transmit flag */ +#define ETH_DMA_FLAG_RWT ((uint32_t)0x00000200) /*!< Receive watchdog timeout flag */ +#define ETH_DMA_FLAG_RPS ((uint32_t)0x00000100) /*!< Receive process stopped flag */ +#define ETH_DMA_FLAG_RBU ((uint32_t)0x00000080) /*!< Receive buffer unavailable flag */ +#define ETH_DMA_FLAG_R ((uint32_t)0x00000040) /*!< Receive flag */ +#define ETH_DMA_FLAG_TU ((uint32_t)0x00000020) /*!< Underflow flag */ +#define ETH_DMA_FLAG_RO ((uint32_t)0x00000010) /*!< Overflow flag */ +#define ETH_DMA_FLAG_TJT ((uint32_t)0x00000008) /*!< Transmit jabber timeout flag */ +#define ETH_DMA_FLAG_TBU ((uint32_t)0x00000004) /*!< Transmit buffer unavailable flag */ +#define ETH_DMA_FLAG_TPS ((uint32_t)0x00000002) /*!< Transmit process stopped flag */ +#define ETH_DMA_FLAG_T ((uint32_t)0x00000001) /*!< Transmit flag */ + +#define IS_ETH_DMA_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFE1800) == 0x00) && ((FLAG) != 0x00)) +#define IS_ETH_DMA_GET_FLAG(FLAG) (((FLAG) == ETH_DMA_FLAG_TST) || ((FLAG) == ETH_DMA_FLAG_PMT) || \ + ((FLAG) == ETH_DMA_FLAG_MMC) || ((FLAG) == ETH_DMA_FLAG_DataTransferError) || \ + ((FLAG) == ETH_DMA_FLAG_ReadWriteError) || ((FLAG) == ETH_DMA_FLAG_AccessError) || \ + ((FLAG) == ETH_DMA_FLAG_NIS) || ((FLAG) == ETH_DMA_FLAG_AIS) || \ + ((FLAG) == ETH_DMA_FLAG_ER) || ((FLAG) == ETH_DMA_FLAG_FBE) || \ + ((FLAG) == ETH_DMA_FLAG_ET) || ((FLAG) == ETH_DMA_FLAG_RWT) || \ + ((FLAG) == ETH_DMA_FLAG_RPS) || ((FLAG) == ETH_DMA_FLAG_RBU) || \ + ((FLAG) == ETH_DMA_FLAG_R) || ((FLAG) == ETH_DMA_FLAG_TU) || \ + ((FLAG) == ETH_DMA_FLAG_RO) || ((FLAG) == ETH_DMA_FLAG_TJT) || \ + ((FLAG) == ETH_DMA_FLAG_TBU) || ((FLAG) == ETH_DMA_FLAG_TPS) || \ + ((FLAG) == ETH_DMA_FLAG_T)) +/** + * @} + */ + +/** @defgroup ETH_DMA_Interrupts + * @{ + */ +#define ETH_DMA_IT_TST ((uint32_t)0x20000000) /*!< Time-stamp trigger interrupt (on DMA) */ +#define ETH_DMA_IT_PMT ((uint32_t)0x10000000) /*!< PMT interrupt (on DMA) */ +#define ETH_DMA_IT_MMC ((uint32_t)0x08000000) /*!< MMC interrupt (on DMA) */ +#define ETH_DMA_IT_NIS ((uint32_t)0x00010000) /*!< Normal interrupt summary */ +#define ETH_DMA_IT_AIS ((uint32_t)0x00008000) /*!< Abnormal interrupt summary */ +#define ETH_DMA_IT_ER ((uint32_t)0x00004000) /*!< Early receive interrupt */ +#define ETH_DMA_IT_FBE ((uint32_t)0x00002000) /*!< Fatal bus error interrupt */ +#define ETH_DMA_IT_ET ((uint32_t)0x00000400) /*!< Early transmit interrupt */ +#define ETH_DMA_IT_RWT ((uint32_t)0x00000200) /*!< Receive watchdog timeout interrupt */ +#define ETH_DMA_IT_RPS ((uint32_t)0x00000100) /*!< Receive process stopped interrupt */ +#define ETH_DMA_IT_RBU ((uint32_t)0x00000080) /*!< Receive buffer unavailable interrupt */ +#define ETH_DMA_IT_R ((uint32_t)0x00000040) /*!< Receive interrupt */ +#define ETH_DMA_IT_TU ((uint32_t)0x00000020) /*!< Underflow interrupt */ +#define ETH_DMA_IT_RO ((uint32_t)0x00000010) /*!< Overflow interrupt */ +#define ETH_DMA_IT_TJT ((uint32_t)0x00000008) /*!< Transmit jabber timeout interrupt */ +#define ETH_DMA_IT_TBU ((uint32_t)0x00000004) /*!< Transmit buffer unavailable interrupt */ +#define ETH_DMA_IT_TPS ((uint32_t)0x00000002) /*!< Transmit process stopped interrupt */ +#define ETH_DMA_IT_T ((uint32_t)0x00000001) /*!< Transmit interrupt */ + +#define IS_ETH_DMA_IT(IT) ((((IT) & (uint32_t)0xFFFE1800) == 0x00) && ((IT) != 0x00)) +#define IS_ETH_DMA_GET_IT(IT) (((IT) == ETH_DMA_IT_TST) || ((IT) == ETH_DMA_IT_PMT) || \ + ((IT) == ETH_DMA_IT_MMC) || ((IT) == ETH_DMA_IT_NIS) || \ + ((IT) == ETH_DMA_IT_AIS) || ((IT) == ETH_DMA_IT_ER) || \ + ((IT) == ETH_DMA_IT_FBE) || ((IT) == ETH_DMA_IT_ET) || \ + ((IT) == ETH_DMA_IT_RWT) || ((IT) == ETH_DMA_IT_RPS) || \ + ((IT) == ETH_DMA_IT_RBU) || ((IT) == ETH_DMA_IT_R) || \ + ((IT) == ETH_DMA_IT_TU) || ((IT) == ETH_DMA_IT_RO) || \ + ((IT) == ETH_DMA_IT_TJT) || ((IT) == ETH_DMA_IT_TBU) || \ + ((IT) == ETH_DMA_IT_TPS) || ((IT) == ETH_DMA_IT_T)) + +/** + * @} + */ + +/** @defgroup ETH_DMA_transmit_process_state_ + * @{ + */ +#define ETH_DMA_TransmitProcess_Stopped ((uint32_t)0x00000000) /*!< Stopped - Reset or Stop Tx Command issued */ +#define ETH_DMA_TransmitProcess_Fetching ((uint32_t)0x00100000) /*!< Running - fetching the Tx descriptor */ +#define ETH_DMA_TransmitProcess_Waiting ((uint32_t)0x00200000) /*!< Running - waiting for status */ +#define ETH_DMA_TransmitProcess_Reading ((uint32_t)0x00300000) /*!< Running - reading the data from host memory */ +#define ETH_DMA_TransmitProcess_Suspended ((uint32_t)0x00600000) /*!< Suspended - Tx Desciptor unavailabe */ +#define ETH_DMA_TransmitProcess_Closing ((uint32_t)0x00700000) /*!< Running - closing Rx descriptor */ + +/** + * @} + */ + + +/** @defgroup ETH_DMA_receive_process_state_ + * @{ + */ +#define ETH_DMA_ReceiveProcess_Stopped ((uint32_t)0x00000000) /*!< Stopped - Reset or Stop Rx Command issued */ +#define ETH_DMA_ReceiveProcess_Fetching ((uint32_t)0x00020000) /*!< Running - fetching the Rx descriptor */ +#define ETH_DMA_ReceiveProcess_Waiting ((uint32_t)0x00060000) /*!< Running - waiting for packet */ +#define ETH_DMA_ReceiveProcess_Suspended ((uint32_t)0x00080000) /*!< Suspended - Rx Desciptor unavailable */ +#define ETH_DMA_ReceiveProcess_Closing ((uint32_t)0x000A0000) /*!< Running - closing descriptor */ +#define ETH_DMA_ReceiveProcess_Queuing ((uint32_t)0x000E0000) /*!< Running - queuing the recieve frame into host memory */ + +/** + * @} + */ + +/** @defgroup ETH_DMA_overflow_ + * @{ + */ +#define ETH_DMA_Overflow_RxFIFOCounter ((uint32_t)0x10000000) /*!< Overflow bit for FIFO overflow counter */ +#define ETH_DMA_Overflow_MissedFrameCounter ((uint32_t)0x00010000) /*!< Overflow bit for missed frame counter */ +#define IS_ETH_DMA_GET_OVERFLOW(OVERFLOW) (((OVERFLOW) == ETH_DMA_Overflow_RxFIFOCounter) || \ + ((OVERFLOW) == ETH_DMA_Overflow_MissedFrameCounter)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet PMT defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_PMT_Flags + * @{ + */ +#define ETH_PMT_FLAG_WUFFRPR ((uint32_t)0x80000000) /*!< Wake-Up Frame Filter Register Poniter Reset */ +#define ETH_PMT_FLAG_WUFR ((uint32_t)0x00000040) /*!< Wake-Up Frame Received */ +#define ETH_PMT_FLAG_MPR ((uint32_t)0x00000020) /*!< Magic Packet Received */ +#define IS_ETH_PMT_GET_FLAG(FLAG) (((FLAG) == ETH_PMT_FLAG_WUFR) || \ + ((FLAG) == ETH_PMT_FLAG_MPR)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet MMC defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_MMC_Tx_Interrupts + * @{ + */ +#define ETH_MMC_IT_TGF ((uint32_t)0x00200000) /*!< When Tx good frame counter reaches half the maximum value */ +#define ETH_MMC_IT_TGFMSC ((uint32_t)0x00008000) /*!< When Tx good multi col counter reaches half the maximum value */ +#define ETH_MMC_IT_TGFSC ((uint32_t)0x00004000) /*!< When Tx good single col counter reaches half the maximum value */ + +/** + * @} + */ + +/** @defgroup ETH_MMC_Rx_Interrupts + * @{ + */ +#define ETH_MMC_IT_RGUF ((uint32_t)0x10020000) /*!< When Rx good unicast frames counter reaches half the maximum value */ +#define ETH_MMC_IT_RFAE ((uint32_t)0x10000040) /*!< When Rx alignment error counter reaches half the maximum value */ +#define ETH_MMC_IT_RFCE ((uint32_t)0x10000020) /*!< When Rx crc error counter reaches half the maximum value */ +#define IS_ETH_MMC_IT(IT) (((((IT) & (uint32_t)0xFFDF3FFF) == 0x00) || (((IT) & (uint32_t)0xEFFDFF9F) == 0x00)) && \ + ((IT) != 0x00)) +#define IS_ETH_MMC_GET_IT(IT) (((IT) == ETH_MMC_IT_TGF) || ((IT) == ETH_MMC_IT_TGFMSC) || \ + ((IT) == ETH_MMC_IT_TGFSC) || ((IT) == ETH_MMC_IT_RGUF) || \ + ((IT) == ETH_MMC_IT_RFAE) || ((IT) == ETH_MMC_IT_RFCE)) +/** + * @} + */ + +/** @defgroup ETH_MMC_Registers + * @{ + */ +#define ETH_MMCCR ((uint32_t)0x00000100) /*!< MMC CR register */ +#define ETH_MMCRIR ((uint32_t)0x00000104) /*!< MMC RIR register */ +#define ETH_MMCTIR ((uint32_t)0x00000108) /*!< MMC TIR register */ +#define ETH_MMCRIMR ((uint32_t)0x0000010C) /*!< MMC RIMR register */ +#define ETH_MMCTIMR ((uint32_t)0x00000110) /*!< MMC TIMR register */ +#define ETH_MMCTGFSCCR ((uint32_t)0x0000014C) /*!< MMC TGFSCCR register */ +#define ETH_MMCTGFMSCCR ((uint32_t)0x00000150) /*!< MMC TGFMSCCR register */ +#define ETH_MMCTGFCR ((uint32_t)0x00000168) /*!< MMC TGFCR register */ +#define ETH_MMCRFCECR ((uint32_t)0x00000194) /*!< MMC RFCECR register */ +#define ETH_MMCRFAECR ((uint32_t)0x00000198) /*!< MMC RFAECR register */ +#define ETH_MMCRGUFCR ((uint32_t)0x000001C4) /*!< MMC RGUFCR register */ + +/** + * @brief ETH MMC registers + */ +#define IS_ETH_MMC_REGISTER(REG) (((REG) == ETH_MMCCR) || ((REG) == ETH_MMCRIR) || \ + ((REG) == ETH_MMCTIR) || ((REG) == ETH_MMCRIMR) || \ + ((REG) == ETH_MMCTIMR) || ((REG) == ETH_MMCTGFSCCR) || \ + ((REG) == ETH_MMCTGFMSCCR) || ((REG) == ETH_MMCTGFCR) || \ + ((REG) == ETH_MMCRFCECR) || ((REG) == ETH_MMCRFAECR) || \ + ((REG) == ETH_MMCRGUFCR)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet PTP defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_PTP_time_update_method + * @{ + */ +#define ETH_PTP_FineUpdate ((uint32_t)0x00000001) /*!< Fine Update method */ +#define ETH_PTP_CoarseUpdate ((uint32_t)0x00000000) /*!< Coarse Update method */ +#define IS_ETH_PTP_UPDATE(UPDATE) (((UPDATE) == ETH_PTP_FineUpdate) || \ + ((UPDATE) == ETH_PTP_CoarseUpdate)) + +/** + * @} + */ + + +/** @defgroup ETH_PTP_Flags + * @{ + */ +#define ETH_PTP_FLAG_TSARU ((uint32_t)0x00000020) /*!< Addend Register Update */ +#define ETH_PTP_FLAG_TSITE ((uint32_t)0x00000010) /*!< Time Stamp Interrupt Trigger */ +#define ETH_PTP_FLAG_TSSTU ((uint32_t)0x00000008) /*!< Time Stamp Update */ +#define ETH_PTP_FLAG_TSSTI ((uint32_t)0x00000004) /*!< Time Stamp Initialize */ +#define IS_ETH_PTP_GET_FLAG(FLAG) (((FLAG) == ETH_PTP_FLAG_TSARU) || \ + ((FLAG) == ETH_PTP_FLAG_TSITE) || \ + ((FLAG) == ETH_PTP_FLAG_TSSTU) || \ + ((FLAG) == ETH_PTP_FLAG_TSSTI)) +/** + * @brief ETH PTP subsecond increment + */ +#define IS_ETH_PTP_SUBSECOND_INCREMENT(SUBSECOND) ((SUBSECOND) <= 0xFF) + +/** + * @} + */ + + +/** @defgroup ETH_PTP_time_sign + * @{ + */ +#define ETH_PTP_PositiveTime ((uint32_t)0x00000000) /*!< Positive time value */ +#define ETH_PTP_NegativeTime ((uint32_t)0x80000000) /*!< Negative time value */ +#define IS_ETH_PTP_TIME_SIGN(SIGN) (((SIGN) == ETH_PTP_PositiveTime) || \ + ((SIGN) == ETH_PTP_NegativeTime)) + +/** + * @brief ETH PTP time stamp low update + */ +#define IS_ETH_PTP_TIME_STAMP_UPDATE_SUBSECOND(SUBSECOND) ((SUBSECOND) <= 0x7FFFFFFF) + +/** + * @brief ETH PTP registers + */ +#define ETH_PTPTSCR ((uint32_t)0x00000700) /*!< PTP TSCR register */ +#define ETH_PTPSSIR ((uint32_t)0x00000704) /*!< PTP SSIR register */ +#define ETH_PTPTSHR ((uint32_t)0x00000708) /*!< PTP TSHR register */ +#define ETH_PTPTSLR ((uint32_t)0x0000070C) /*!< PTP TSLR register */ +#define ETH_PTPTSHUR ((uint32_t)0x00000710) /*!< PTP TSHUR register */ +#define ETH_PTPTSLUR ((uint32_t)0x00000714) /*!< PTP TSLUR register */ +#define ETH_PTPTSAR ((uint32_t)0x00000718) /*!< PTP TSAR register */ +#define ETH_PTPTTHR ((uint32_t)0x0000071C) /*!< PTP TTHR register */ +#define ETH_PTPTTLR ((uint32_t)0x00000720) /* PTP TTLR register */ +#define IS_ETH_PTP_REGISTER(REG) (((REG) == ETH_PTPTSCR) || ((REG) == ETH_PTPSSIR) || \ + ((REG) == ETH_PTPTSHR) || ((REG) == ETH_PTPTSLR) || \ + ((REG) == ETH_PTPTSHUR) || ((REG) == ETH_PTPTSLUR) || \ + ((REG) == ETH_PTPTSAR) || ((REG) == ETH_PTPTTHR) || \ + ((REG) == ETH_PTPTTLR)) + +/** + * @} + */ + + +/** + * @} + */ + +/** @defgroup ETH_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup ETH_Exported_Functions + * @{ + */ +void ETH_DeInit(void); +uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, u16 PHYAddress); +void ETH_StructInit(ETH_InitTypeDef* ETH_InitStruct); +void ETH_SoftwareReset(void); +FlagStatus ETH_GetSoftwareResetStatus(void); +void ETH_Start(void); +uint32_t ETH_HandleTxPkt(u8 *ppkt, u16 FrameLength); +uint32_t ETH_HandleRxPkt(u8 *ppkt); +uint32_t ETH_GetRxPktSize(void); +void ETH_DropRxPkt(void); + +/** + * @brief PHY + */ +u16 ETH_ReadPHYRegister(u16 PHYAddress, u16 PHYReg); +uint32_t ETH_WritePHYRegister(u16 PHYAddress, u16 PHYReg, u16 PHYValue); +uint32_t ETH_PHYLoopBackCmd(u16 PHYAddress, FunctionalState NewState); + +/** + * @brief MAC + */ +void ETH_MACTransmissionCmd(FunctionalState NewState); +void ETH_MACReceptionCmd(FunctionalState NewState); +FlagStatus ETH_GetFlowControlBusyStatus(void); +void ETH_InitiatePauseControlFrame(void); +void ETH_BackPressureActivationCmd(FunctionalState NewState); +FlagStatus ETH_GetMACFlagStatus(uint32_t ETH_MAC_FLAG); +ITStatus ETH_GetMACITStatus(uint32_t ETH_MAC_IT); +void ETH_MACITConfig(uint32_t ETH_MAC_IT, FunctionalState NewState); +void ETH_MACAddressConfig(uint32_t MacAddr, u8 *Addr); +void ETH_GetMACAddress(uint32_t MacAddr, u8 *Addr); +void ETH_MACAddressPerfectFilterCmd(uint32_t MacAddr, FunctionalState NewState); +void ETH_MACAddressFilterConfig(uint32_t MacAddr, uint32_t Filter); +void ETH_MACAddressMaskBytesFilterConfig(uint32_t MacAddr, uint32_t MaskByte); + +/** + * @brief DMA Tx/Rx descriptors + */ +void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, u8 *TxBuff, uint32_t TxBuffCount); +void ETH_DMATxDescRingInit(ETH_DMADESCTypeDef *DMATxDescTab, u8 *TxBuff1, u8 *TxBuff2, uint32_t TxBuffCount); +FlagStatus ETH_GetDMATxDescFlagStatus(ETH_DMADESCTypeDef *DMATxDesc, uint32_t ETH_DMATxDescFlag); +uint32_t ETH_GetDMATxDescCollisionCount(ETH_DMADESCTypeDef *DMATxDesc); +void ETH_SetDMATxDescOwnBit(ETH_DMADESCTypeDef *DMATxDesc); +void ETH_DMATxDescTransmitITConfig(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescFrameSegmentConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_FrameSegment); +void ETH_DMATxDescChecksumInsertionConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_Checksum); +void ETH_DMATxDescCRCCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescShortFramePaddingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescTimeStampCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescBufferSizeConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t BufferSize1, uint32_t BufferSize2); +void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, u8 *RxBuff, uint32_t RxBuffCount); +void ETH_DMARxDescRingInit(ETH_DMADESCTypeDef *DMARxDescTab, u8 *RxBuff1, u8 *RxBuff2, uint32_t RxBuffCount); +FlagStatus ETH_GetDMARxDescFlagStatus(ETH_DMADESCTypeDef *DMARxDesc, uint32_t ETH_DMARxDescFlag); +void ETH_SetDMARxDescOwnBit(ETH_DMADESCTypeDef *DMARxDesc); +uint32_t ETH_GetDMARxDescFrameLength(ETH_DMADESCTypeDef *DMARxDesc); +void ETH_DMARxDescReceiveITConfig(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState); +void ETH_DMARxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState); +void ETH_DMARxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState); +uint32_t ETH_GetDMARxDescBufferSize(ETH_DMADESCTypeDef *DMARxDesc, uint32_t DMARxDesc_Buffer); + +/** + * @brief DMA + */ +FlagStatus ETH_GetDMAFlagStatus(uint32_t ETH_DMA_FLAG); +void ETH_DMAClearFlag(uint32_t ETH_DMA_FLAG); +ITStatus ETH_GetDMAITStatus(uint32_t ETH_DMA_IT); +void ETH_DMAClearITPendingBit(uint32_t ETH_DMA_IT); +uint32_t ETH_GetTransmitProcessState(void); +uint32_t ETH_GetReceiveProcessState(void); +void ETH_FlushTransmitFIFO(void); +FlagStatus ETH_GetFlushTransmitFIFOStatus(void); +void ETH_DMATransmissionCmd(FunctionalState NewState); +void ETH_DMAReceptionCmd(FunctionalState NewState); +void ETH_DMAITConfig(uint32_t ETH_DMA_IT, FunctionalState NewState); +FlagStatus ETH_GetDMAOverflowStatus(uint32_t ETH_DMA_Overflow); +uint32_t ETH_GetRxOverflowMissedFrameCounter(void); +uint32_t ETH_GetBufferUnavailableMissedFrameCounter(void); +uint32_t ETH_GetCurrentTxDescStartAddress(void); +uint32_t ETH_GetCurrentRxDescStartAddress(void); +uint32_t ETH_GetCurrentTxBufferAddress(void); +uint32_t ETH_GetCurrentRxBufferAddress(void); +void ETH_ResumeDMATransmission(void); +void ETH_ResumeDMAReception(void); + +/** + * @brief PMT + */ +void ETH_ResetWakeUpFrameFilterRegisterPointer(void); +void ETH_SetWakeUpFrameFilterRegister(uint32_t *Buffer); +void ETH_GlobalUnicastWakeUpCmd(FunctionalState NewState); +FlagStatus ETH_GetPMTFlagStatus(uint32_t ETH_PMT_FLAG); +void ETH_WakeUpFrameDetectionCmd(FunctionalState NewState); +void ETH_MagicPacketDetectionCmd(FunctionalState NewState); +void ETH_PowerDownCmd(FunctionalState NewState); + +/** + * @brief MMC + */ +void ETH_MMCCounterFreezeCmd(FunctionalState NewState); +void ETH_MMCResetOnReadCmd(FunctionalState NewState); +void ETH_MMCCounterRolloverCmd(FunctionalState NewState); +void ETH_MMCCountersReset(void); +void ETH_MMCITConfig(uint32_t ETH_MMC_IT, FunctionalState NewState); +ITStatus ETH_GetMMCITStatus(uint32_t ETH_MMC_IT); +uint32_t ETH_GetMMCRegister(uint32_t ETH_MMCReg); + +/** + * @brief PTP + */ +uint32_t ETH_HandlePTPTxPkt(u8 *ppkt, u16 FrameLength, uint32_t *PTPTxTab); +uint32_t ETH_HandlePTPRxPkt(u8 *ppkt, uint32_t *PTPRxTab); +void ETH_DMAPTPTxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, ETH_DMADESCTypeDef *DMAPTPTxDescTab, u8* TxBuff, uint32_t TxBuffCount); +void ETH_DMAPTPRxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, ETH_DMADESCTypeDef *DMAPTPRxDescTab, u8 *RxBuff, uint32_t RxBuffCount); +void ETH_EnablePTPTimeStampAddend(void); +void ETH_EnablePTPTimeStampInterruptTrigger(void); +void ETH_EnablePTPTimeStampUpdate(void); +void ETH_InitializePTPTimeStamp(void); +void ETH_PTPUpdateMethodConfig(uint32_t UpdateMethod); +void ETH_PTPTimeStampCmd(FunctionalState NewState); +FlagStatus ETH_GetPTPFlagStatus(uint32_t ETH_PTP_FLAG); +void ETH_SetPTPSubSecondIncrement(uint32_t SubSecondValue); +void ETH_SetPTPTimeStampUpdate(uint32_t Sign, uint32_t SecondValue, uint32_t SubSecondValue); +void ETH_SetPTPTimeStampAddend(uint32_t Value); +void ETH_SetPTPTargetTime(uint32_t HighValue, uint32_t LowValue); +uint32_t ETH_GetPTPRegister(uint32_t ETH_PTPReg); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32_ETH_H */ +/** + * @} + */ + + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/ethernetlib/src/stm32_eth.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/ethernetlib/src/stm32_eth.c new file mode 100644 index 00000000..119b4dbf --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/ethernetlib/src/stm32_eth.c @@ -0,0 +1,3056 @@ +/** + ****************************************************************************** + * @file stm32_eth.c + * @author MCD Application Team + * @version V1.0.0 + * @date 06/19/2009 + * @brief This file provides all the ETH firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32_eth.h" +#include "stm32f4xx_rcc.h" + +/** @addtogroup STM32_ETH_Driver + * @brief ETH driver modules + * @{ + */ + +/** @defgroup ETH_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup ETH_Private_Defines + * @{ + */ +/* Global pointers on Tx and Rx descriptor used to track transmit and receive descriptors */ +ETH_DMADESCTypeDef *DMATxDescToSet; +ETH_DMADESCTypeDef *DMARxDescToGet; +ETH_DMADESCTypeDef *DMAPTPTxDescToSet; +ETH_DMADESCTypeDef *DMAPTPRxDescToGet; + +/* ETHERNET MAC address offsets */ +#define ETH_MAC_AddrHighBase (ETH_MAC_BASE + 0x40) /* ETHERNET MAC address high offset */ +#define ETH_MAC_AddrLowBase (ETH_MAC_BASE + 0x44) /* ETHERNET MAC address low offset */ +/* ETHERNET MACMIIAR register Mask */ +#define MACMIIAR_CR_Mask ((uint32_t)0xFFFFFFE3) +/* ETHERNET MACCR register Mask */ +#define MACCR_CLEAR_Mask ((uint32_t)0xFF20810F) +/* ETHERNET MACFCR register Mask */ +#define MACFCR_CLEAR_Mask ((uint32_t)0x0000FF41) +/* ETHERNET DMAOMR register Mask */ +#define DMAOMR_CLEAR_Mask ((uint32_t)0xF8DE3F23) +/* ETHERNET Remote Wake-up frame register length */ +#define ETH_WakeupRegisterLength 8 +/* ETHERNET Missed frames counter Shift */ +#define ETH_DMA_RxOverflowMissedFramesCounterShift 17 +/* ETHERNET DMA Tx descriptors Collision Count Shift */ +#define ETH_DMATxDesc_CollisionCountShift 3 +/* ETHERNET DMA Tx descriptors Buffer2 Size Shift */ +#define ETH_DMATxDesc_BufferSize2Shift 16 +/* ETHERNET DMA Rx descriptors Frame Length Shift */ +#define ETH_DMARxDesc_FrameLengthShift 16 +/* ETHERNET DMA Rx descriptors Buffer2 Size Shift */ +#define ETH_DMARxDesc_Buffer2SizeShift 16 +/* ETHERNET errors */ +#define ETH_ERROR ((uint32_t)0) +#define ETH_SUCCESS ((uint32_t)1) +/** + * @} + */ + +/** @defgroup ETH_Private_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup ETH_Private_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup ETH_Private_FunctionPrototypes + * @{ + */ +/** + * @} + */ + +/** @defgroup ETH_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the ETHERNET peripheral registers to their + * default reset values. + * @param None + * @retval : None + */ +void ETH_DeInit(void) +{ + RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, ENABLE); + RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, DISABLE); +} + +/** + * @brief Initializes the ETHERNET peripheral according to the specified + * parameters in the ETH_InitStruct . + * @param ETH_InitStruct: pointer to a ETH_InitTypeDef structure + * that contains the configuration information for the + * specified ETHERNET peripheral. + * @param PHYAddress: external PHY address + * @retval : ETH_ERROR: Ethernet initialization failed + * ETH_SUCCESS: Ethernet successfully initialized + */ +uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, uint16_t PHYAddress) +{ + uint32_t RegValue = 0, tmpreg = 0; + __IO uint32_t i = 0; + RCC_ClocksTypeDef rcc_clocks; + uint32_t hclk = 120000000; + __IO uint32_t timeout = 0; + /* Check the parameters */ + /* MAC --------------------------*/ + assert_param(IS_ETH_AUTONEGOTIATION(ETH_InitStruct->ETH_AutoNegotiation)); + assert_param(IS_ETH_WATCHDOG(ETH_InitStruct->ETH_Watchdog)); + assert_param(IS_ETH_JABBER(ETH_InitStruct->ETH_Jabber)); + assert_param(IS_ETH_INTER_FRAME_GAP(ETH_InitStruct->ETH_InterFrameGap)); + assert_param(IS_ETH_CARRIER_SENSE(ETH_InitStruct->ETH_CarrierSense)); + assert_param(IS_ETH_SPEED(ETH_InitStruct->ETH_Speed)); + assert_param(IS_ETH_RECEIVE_OWN(ETH_InitStruct->ETH_ReceiveOwn)); + assert_param(IS_ETH_LOOPBACK_MODE(ETH_InitStruct->ETH_LoopbackMode)); + assert_param(IS_ETH_DUPLEX_MODE(ETH_InitStruct->ETH_Mode)); + assert_param(IS_ETH_CHECKSUM_OFFLOAD(ETH_InitStruct->ETH_ChecksumOffload)); + assert_param(IS_ETH_RETRY_TRANSMISSION(ETH_InitStruct->ETH_RetryTransmission)); + assert_param(IS_ETH_AUTOMATIC_PADCRC_STRIP(ETH_InitStruct->ETH_AutomaticPadCRCStrip)); + assert_param(IS_ETH_BACKOFF_LIMIT(ETH_InitStruct->ETH_BackOffLimit)); + assert_param(IS_ETH_DEFERRAL_CHECK(ETH_InitStruct->ETH_DeferralCheck)); + assert_param(IS_ETH_RECEIVE_ALL(ETH_InitStruct->ETH_ReceiveAll)); + assert_param(IS_ETH_SOURCE_ADDR_FILTER(ETH_InitStruct->ETH_SourceAddrFilter)); + assert_param(IS_ETH_CONTROL_FRAMES(ETH_InitStruct->ETH_PassControlFrames)); + assert_param(IS_ETH_BROADCAST_FRAMES_RECEPTION(ETH_InitStruct->ETH_BroadcastFramesReception)); + assert_param(IS_ETH_DESTINATION_ADDR_FILTER(ETH_InitStruct->ETH_DestinationAddrFilter)); + assert_param(IS_ETH_PROMISCUOUS_MODE(ETH_InitStruct->ETH_PromiscuousMode)); + assert_param(IS_ETH_MULTICAST_FRAMES_FILTER(ETH_InitStruct->ETH_MulticastFramesFilter)); + assert_param(IS_ETH_UNICAST_FRAMES_FILTER(ETH_InitStruct->ETH_UnicastFramesFilter)); + assert_param(IS_ETH_PAUSE_TIME(ETH_InitStruct->ETH_PauseTime)); + assert_param(IS_ETH_ZEROQUANTA_PAUSE(ETH_InitStruct->ETH_ZeroQuantaPause)); + assert_param(IS_ETH_PAUSE_LOW_THRESHOLD(ETH_InitStruct->ETH_PauseLowThreshold)); + assert_param(IS_ETH_UNICAST_PAUSE_FRAME_DETECT(ETH_InitStruct->ETH_UnicastPauseFrameDetect)); + assert_param(IS_ETH_RECEIVE_FLOWCONTROL(ETH_InitStruct->ETH_ReceiveFlowControl)); + assert_param(IS_ETH_TRANSMIT_FLOWCONTROL(ETH_InitStruct->ETH_TransmitFlowControl)); + assert_param(IS_ETH_VLAN_TAG_COMPARISON(ETH_InitStruct->ETH_VLANTagComparison)); + assert_param(IS_ETH_VLAN_TAG_IDENTIFIER(ETH_InitStruct->ETH_VLANTagIdentifier)); + /* DMA --------------------------*/ + assert_param(IS_ETH_DROP_TCPIP_CHECKSUM_FRAME(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame)); + assert_param(IS_ETH_RECEIVE_STORE_FORWARD(ETH_InitStruct->ETH_ReceiveStoreForward)); + assert_param(IS_ETH_FLUSH_RECEIVE_FRAME(ETH_InitStruct->ETH_FlushReceivedFrame)); + assert_param(IS_ETH_TRANSMIT_STORE_FORWARD(ETH_InitStruct->ETH_TransmitStoreForward)); + assert_param(IS_ETH_TRANSMIT_THRESHOLD_CONTROL(ETH_InitStruct->ETH_TransmitThresholdControl)); + assert_param(IS_ETH_FORWARD_ERROR_FRAMES(ETH_InitStruct->ETH_ForwardErrorFrames)); + assert_param(IS_ETH_FORWARD_UNDERSIZED_GOOD_FRAMES(ETH_InitStruct->ETH_ForwardUndersizedGoodFrames)); + assert_param(IS_ETH_RECEIVE_THRESHOLD_CONTROL(ETH_InitStruct->ETH_ReceiveThresholdControl)); + assert_param(IS_ETH_SECOND_FRAME_OPERATE(ETH_InitStruct->ETH_SecondFrameOperate)); + assert_param(IS_ETH_ADDRESS_ALIGNED_BEATS(ETH_InitStruct->ETH_AddressAlignedBeats)); + assert_param(IS_ETH_FIXED_BURST(ETH_InitStruct->ETH_FixedBurst)); + assert_param(IS_ETH_RXDMA_BURST_LENGTH(ETH_InitStruct->ETH_RxDMABurstLength)); + assert_param(IS_ETH_TXDMA_BURST_LENGTH(ETH_InitStruct->ETH_TxDMABurstLength)); + assert_param(IS_ETH_DMA_DESC_SKIP_LENGTH(ETH_InitStruct->ETH_DescriptorSkipLength)); + assert_param(IS_ETH_DMA_ARBITRATION_ROUNDROBIN_RXTX(ETH_InitStruct->ETH_DMAArbitration)); + /*-------------------------------- MAC Config ------------------------------*/ + /*---------------------- ETHERNET MACMIIAR Configuration -------------------*/ + /* Get the ETHERNET MACMIIAR value */ + tmpreg = ETH->MACMIIAR; + /* Clear CSR Clock Range CR[2:0] bits */ + tmpreg &= MACMIIAR_CR_Mask; + /* Get hclk frequency value */ + RCC_GetClocksFreq(&rcc_clocks); + hclk = rcc_clocks.HCLK_Frequency; + /* Set CR bits depending on hclk value */ + if((hclk >= 20000000)&&(hclk < 35000000)) + { + /* CSR Clock Range between 20-35 MHz */ + tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div16; + } + else if((hclk >= 35000000)&&(hclk < 60000000)) + { + /* CSR Clock Range between 35-60 MHz */ + tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div26; + } + else if((hclk >= 60000000)&&(hclk <= 100000000)) + { + /* CSR Clock Range between 60-100 MHz */ + tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div42; + } + else /*if((hclk >= 100000000)&&(hclk <= 120000000)) */ + { + /* CSR Clock Range between 100-120 MHz */ + tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div62; + } + /* Write to ETHERNET MAC MIIAR: Configure the ETHERNET CSR Clock Range */ + ETH->MACMIIAR = (uint32_t)tmpreg; + /*-------------------- PHY initialization and configuration ----------------*/ + /* Put the PHY in reset mode */ + if(!(ETH_WritePHYRegister(PHYAddress, PHY_BCR, PHY_Reset))) + { + /* Return ERROR in case of write timeout */ + return ETH_ERROR; + } + + /* Delay to assure PHY reset */ + for(i = PHY_ResetDelay; i != 0; i--) + { + } + + if(ETH_InitStruct->ETH_AutoNegotiation != ETH_AutoNegotiation_Disable) + { + /* We wait for linked satus... */ + do + { + timeout++; + } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_READ_TO) + { + return ETH_ERROR; + } + /* Reset Timeout counter */ + timeout = 0; + + /* Enable Auto-Negotiation */ + if(!(ETH_WritePHYRegister(PHYAddress, PHY_BCR, PHY_AutoNegotiation))) + { + /* Return ERROR in case of write timeout */ + return ETH_ERROR; + } + + /* Wait until the autonegotiation will be completed */ + do + { + timeout++; + } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_READ_TO) + { + return ETH_ERROR; + } + /* Reset Timeout counter */ + timeout = 0; + + /* Read the result of the autonegotiation */ + RegValue = ETH_ReadPHYRegister(PHYAddress, PHY_SR); + + /* Configure the MAC with the Duplex Mode fixed by the autonegotiation process */ + if((RegValue & PHY_Duplex_Status) != (uint32_t)RESET) + { + /* Set Ethernet duplex mode to FullDuplex following the autonegotiation */ + ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex; + + } + else + { + /* Set Ethernet duplex mode to HalfDuplex following the autonegotiation */ + ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex; + } + /* Configure the MAC with the speed fixed by the autonegotiation process */ + if(RegValue & PHY_Speed_Status) + { + /* Set Ethernet speed to 10M following the autonegotiation */ + ETH_InitStruct->ETH_Speed = ETH_Speed_10M; + } + else + { + /* Set Ethernet speed to 100M following the autonegotiation */ + ETH_InitStruct->ETH_Speed = ETH_Speed_100M; + } + } + else + { + if(!ETH_WritePHYRegister(PHYAddress, PHY_BCR, ((uint16_t)(ETH_InitStruct->ETH_Mode >> 3) | + (uint16_t)(ETH_InitStruct->ETH_Speed >> 1)))) + { + /* Return ERROR in case of write timeout */ + return ETH_ERROR; + } + /* Delay to assure PHY configuration */ + for(i = PHY_ConfigDelay; i != 0; i--) + { + } + } + /*------------------------ ETHERNET MACCR Configuration --------------------*/ + /* Get the ETHERNET MACCR value */ + tmpreg = ETH->MACCR; + /* Clear WD, PCE, PS, TE and RE bits */ + tmpreg &= MACCR_CLEAR_Mask; + /* Set the WD bit according to ETH_Watchdog value */ + /* Set the JD: bit according to ETH_Jabber value */ + /* Set the IFG bit according to ETH_InterFrameGap value */ + /* Set the DCRS bit according to ETH_CarrierSense value */ + /* Set the FES bit according to ETH_Speed value */ + /* Set the DO bit according to ETH_ReceiveOwn value */ + /* Set the LM bit according to ETH_LoopbackMode value */ + /* Set the DM bit according to ETH_Mode value */ + /* Set the IPC bit according to ETH_ChecksumOffload value */ + /* Set the DR bit according to ETH_RetryTransmission value */ + /* Set the ACS bit according to ETH_AutomaticPadCRCStrip value */ + /* Set the BL bit according to ETH_BackOffLimit value */ + /* Set the DC bit according to ETH_DeferralCheck value */ + tmpreg |= (uint32_t)(ETH_InitStruct->ETH_Watchdog | + ETH_InitStruct->ETH_Jabber | + ETH_InitStruct->ETH_InterFrameGap | + ETH_InitStruct->ETH_CarrierSense | + ETH_InitStruct->ETH_Speed | + ETH_InitStruct->ETH_ReceiveOwn | + ETH_InitStruct->ETH_LoopbackMode | + ETH_InitStruct->ETH_Mode | + ETH_InitStruct->ETH_ChecksumOffload | + ETH_InitStruct->ETH_RetryTransmission | + ETH_InitStruct->ETH_AutomaticPadCRCStrip | + ETH_InitStruct->ETH_BackOffLimit | + ETH_InitStruct->ETH_DeferralCheck); + /* Write to ETHERNET MACCR */ + ETH->MACCR = (uint32_t)tmpreg; + + /*----------------------- ETHERNET MACFFR Configuration --------------------*/ + /* Set the RA bit according to ETH_ReceiveAll value */ + /* Set the SAF and SAIF bits according to ETH_SourceAddrFilter value */ + /* Set the PCF bit according to ETH_PassControlFrames value */ + /* Set the DBF bit according to ETH_BroadcastFramesReception value */ + /* Set the DAIF bit according to ETH_DestinationAddrFilter value */ + /* Set the PR bit according to ETH_PromiscuousMode value */ + /* Set the PM, HMC and HPF bits according to ETH_MulticastFramesFilter value */ + /* Set the HUC and HPF bits according to ETH_UnicastFramesFilter value */ + /* Write to ETHERNET MACFFR */ + ETH->MACFFR = (uint32_t)(ETH_InitStruct->ETH_ReceiveAll | + ETH_InitStruct->ETH_SourceAddrFilter | + ETH_InitStruct->ETH_PassControlFrames | + ETH_InitStruct->ETH_BroadcastFramesReception | + ETH_InitStruct->ETH_DestinationAddrFilter | + ETH_InitStruct->ETH_PromiscuousMode | + ETH_InitStruct->ETH_MulticastFramesFilter | + ETH_InitStruct->ETH_UnicastFramesFilter); + /*--------------- ETHERNET MACHTHR and MACHTLR Configuration ---------------*/ + /* Write to ETHERNET MACHTHR */ + ETH->MACHTHR = (uint32_t)ETH_InitStruct->ETH_HashTableHigh; + /* Write to ETHERNET MACHTLR */ + ETH->MACHTLR = (uint32_t)ETH_InitStruct->ETH_HashTableLow; + /*----------------------- ETHERNET MACFCR Configuration --------------------*/ + /* Get the ETHERNET MACFCR value */ + tmpreg = ETH->MACFCR; + /* Clear xx bits */ + tmpreg &= MACFCR_CLEAR_Mask; + + /* Set the PT bit according to ETH_PauseTime value */ + /* Set the DZPQ bit according to ETH_ZeroQuantaPause value */ + /* Set the PLT bit according to ETH_PauseLowThreshold value */ + /* Set the UP bit according to ETH_UnicastPauseFrameDetect value */ + /* Set the RFE bit according to ETH_ReceiveFlowControl value */ + /* Set the TFE bit according to ETH_TransmitFlowControl value */ + tmpreg |= (uint32_t)((ETH_InitStruct->ETH_PauseTime << 16) | + ETH_InitStruct->ETH_ZeroQuantaPause | + ETH_InitStruct->ETH_PauseLowThreshold | + ETH_InitStruct->ETH_UnicastPauseFrameDetect | + ETH_InitStruct->ETH_ReceiveFlowControl | + ETH_InitStruct->ETH_TransmitFlowControl); + /* Write to ETHERNET MACFCR */ + ETH->MACFCR = (uint32_t)tmpreg; + /*----------------------- ETHERNET MACVLANTR Configuration -----------------*/ + /* Set the ETV bit according to ETH_VLANTagComparison value */ + /* Set the VL bit according to ETH_VLANTagIdentifier value */ + ETH->MACVLANTR = (uint32_t)(ETH_InitStruct->ETH_VLANTagComparison | + ETH_InitStruct->ETH_VLANTagIdentifier); + + /*-------------------------------- DMA Config ------------------------------*/ + /*----------------------- ETHERNET DMAOMR Configuration --------------------*/ + /* Get the ETHERNET DMAOMR value */ + tmpreg = ETH->DMAOMR; + /* Clear xx bits */ + tmpreg &= DMAOMR_CLEAR_Mask; + + /* Set the DT bit according to ETH_DropTCPIPChecksumErrorFrame value */ + /* Set the RSF bit according to ETH_ReceiveStoreForward value */ + /* Set the DFF bit according to ETH_FlushReceivedFrame value */ + /* Set the TSF bit according to ETH_TransmitStoreForward value */ + /* Set the TTC bit according to ETH_TransmitThresholdControl value */ + /* Set the FEF bit according to ETH_ForwardErrorFrames value */ + /* Set the FUF bit according to ETH_ForwardUndersizedGoodFrames value */ + /* Set the RTC bit according to ETH_ReceiveThresholdControl value */ + /* Set the OSF bit according to ETH_SecondFrameOperate value */ + tmpreg |= (uint32_t)(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame | + ETH_InitStruct->ETH_ReceiveStoreForward | + ETH_InitStruct->ETH_FlushReceivedFrame | + ETH_InitStruct->ETH_TransmitStoreForward | + ETH_InitStruct->ETH_TransmitThresholdControl | + ETH_InitStruct->ETH_ForwardErrorFrames | + ETH_InitStruct->ETH_ForwardUndersizedGoodFrames | + ETH_InitStruct->ETH_ReceiveThresholdControl | + ETH_InitStruct->ETH_SecondFrameOperate); + /* Write to ETHERNET DMAOMR */ + ETH->DMAOMR = (uint32_t)tmpreg; + + /*----------------------- ETHERNET DMABMR Configuration --------------------*/ + /* Set the AAL bit according to ETH_AddressAlignedBeats value */ + /* Set the FB bit according to ETH_FixedBurst value */ + /* Set the RPBL and 4*PBL bits according to ETH_RxDMABurstLength value */ + /* Set the PBL and 4*PBL bits according to ETH_TxDMABurstLength value */ + /* Set the DSL bit according to ETH_DesciptorSkipLength value */ + /* Set the PR and DA bits according to ETH_DMAArbitration value */ + ETH->DMABMR = (uint32_t)(ETH_InitStruct->ETH_AddressAlignedBeats | + ETH_InitStruct->ETH_FixedBurst | + ETH_InitStruct->ETH_RxDMABurstLength | /* !! if 4xPBL is selected for Tx or Rx it is applied for the other */ + ETH_InitStruct->ETH_TxDMABurstLength | + (ETH_InitStruct->ETH_DescriptorSkipLength << 2) | + ETH_InitStruct->ETH_DMAArbitration | + ETH_DMABMR_USP); /* Enable use of separate PBL for Rx and Tx */ + /* Return Ethernet configuration success */ + return ETH_SUCCESS; +} + +/** + * @brief Fills each ETH_InitStruct member with its default value. + * @param ETH_InitStruct: pointer to a ETH_InitTypeDef structure + * which will be initialized. + * @retval : None + */ +void ETH_StructInit(ETH_InitTypeDef* ETH_InitStruct) +{ + /* ETH_InitStruct members default value */ + /*------------------------ MAC -----------------------------------*/ + ETH_InitStruct->ETH_AutoNegotiation = ETH_AutoNegotiation_Disable; + ETH_InitStruct->ETH_Watchdog = ETH_Watchdog_Enable; + ETH_InitStruct->ETH_Jabber = ETH_Jabber_Enable; + ETH_InitStruct->ETH_InterFrameGap = ETH_InterFrameGap_96Bit; + ETH_InitStruct->ETH_CarrierSense = ETH_CarrierSense_Enable; + ETH_InitStruct->ETH_Speed = ETH_Speed_10M; + ETH_InitStruct->ETH_ReceiveOwn = ETH_ReceiveOwn_Enable; + ETH_InitStruct->ETH_LoopbackMode = ETH_LoopbackMode_Disable; + ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex; + ETH_InitStruct->ETH_ChecksumOffload = ETH_ChecksumOffload_Disable; + ETH_InitStruct->ETH_RetryTransmission = ETH_RetryTransmission_Enable; + ETH_InitStruct->ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable; + ETH_InitStruct->ETH_BackOffLimit = ETH_BackOffLimit_10; + ETH_InitStruct->ETH_DeferralCheck = ETH_DeferralCheck_Disable; + ETH_InitStruct->ETH_ReceiveAll = ETH_ReceiveAll_Disable; + ETH_InitStruct->ETH_SourceAddrFilter = ETH_SourceAddrFilter_Disable; + ETH_InitStruct->ETH_PassControlFrames = ETH_PassControlFrames_BlockAll; + ETH_InitStruct->ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable; + ETH_InitStruct->ETH_DestinationAddrFilter = ETH_DestinationAddrFilter_Normal; + ETH_InitStruct->ETH_PromiscuousMode = ETH_PromiscuousMode_Disable; + ETH_InitStruct->ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect; + ETH_InitStruct->ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect; + ETH_InitStruct->ETH_HashTableHigh = 0x0; + ETH_InitStruct->ETH_HashTableLow = 0x0; + ETH_InitStruct->ETH_PauseTime = 0x0; + ETH_InitStruct->ETH_ZeroQuantaPause = ETH_ZeroQuantaPause_Disable; + ETH_InitStruct->ETH_PauseLowThreshold = ETH_PauseLowThreshold_Minus4; + ETH_InitStruct->ETH_UnicastPauseFrameDetect = ETH_UnicastPauseFrameDetect_Disable; + ETH_InitStruct->ETH_ReceiveFlowControl = ETH_ReceiveFlowControl_Disable; + ETH_InitStruct->ETH_TransmitFlowControl = ETH_TransmitFlowControl_Disable; + ETH_InitStruct->ETH_VLANTagComparison = ETH_VLANTagComparison_16Bit; + ETH_InitStruct->ETH_VLANTagIdentifier = 0x0; + /*------------------------ DMA -----------------------------------*/ + ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable; + ETH_InitStruct->ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable; + ETH_InitStruct->ETH_FlushReceivedFrame = ETH_FlushReceivedFrame_Disable; + ETH_InitStruct->ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable; + ETH_InitStruct->ETH_TransmitThresholdControl = ETH_TransmitThresholdControl_64Bytes; + ETH_InitStruct->ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable; + ETH_InitStruct->ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable; + ETH_InitStruct->ETH_ReceiveThresholdControl = ETH_ReceiveThresholdControl_64Bytes; + ETH_InitStruct->ETH_SecondFrameOperate = ETH_SecondFrameOperate_Disable; + ETH_InitStruct->ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable; + ETH_InitStruct->ETH_FixedBurst = ETH_FixedBurst_Disable; + ETH_InitStruct->ETH_RxDMABurstLength = ETH_RxDMABurstLength_1Beat; + ETH_InitStruct->ETH_TxDMABurstLength = ETH_TxDMABurstLength_1Beat; + ETH_InitStruct->ETH_DescriptorSkipLength = 0x0; + ETH_InitStruct->ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_1_1; +} + +/** + * @brief Enables ENET MAC and DMA reception/transmission + * @param None + * @retval : None + */ +void ETH_Start(void) +{ + /* Enable transmit state machine of the MAC for transmission on the MII */ + ETH_MACTransmissionCmd(ENABLE); + /* Flush Transmit FIFO */ + ETH_FlushTransmitFIFO(); + /* Enable receive state machine of the MAC for reception from the MII */ + ETH_MACReceptionCmd(ENABLE); + + /* Start DMA transmission */ + ETH_DMATransmissionCmd(ENABLE); + /* Start DMA reception */ + ETH_DMAReceptionCmd(ENABLE); +} + +/** + * @brief Transmits a packet, from application buffer, pointed by ppkt. + * @param ppkt: pointer to application packet buffer to transmit. + * @param FrameLength: Tx Packet size. + * @retval : ETH_ERROR: in case of Tx desc owned by DMA + * ETH_SUCCESS: for correct transmission + */ +uint32_t ETH_HandleTxPkt(uint8_t *ppkt, uint16_t FrameLength) +{ + uint32_t offset = 0; + + /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */ + if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (uint32_t)RESET) + { + /* Return ERROR: OWN bit set */ + return ETH_ERROR; + } + + /* Copy the frame to be sent into memory pointed by the current ETHERNET DMA Tx descriptor */ + for(offset=0; offsetBuffer1Addr) + offset)) = (*(ppkt + offset)); + } + + /* Setting the Frame Length: bits[12:0] */ + DMATxDescToSet->ControlBufferSize = (FrameLength & ETH_DMATxDesc_TBS1); + /* Setting the last segment and first segment bits (in this case a frame is transmitted in one descriptor) */ + DMATxDescToSet->Status |= ETH_DMATxDesc_LS | ETH_DMATxDesc_FS; + /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMATxDescToSet->Status |= ETH_DMATxDesc_OWN; + /* When Tx Buffer unavailable flag is set: clear it and resume transmission */ + if ((ETH->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET) + { + /* Clear TBUS ETHERNET DMA flag */ + ETH->DMASR = ETH_DMASR_TBUS; + /* Resume DMA transmission*/ + ETH->DMATPDR = 0; + } + + /* Update the ETHERNET DMA global Tx descriptor with next Tx decriptor */ + /* Chained Mode */ + if((DMATxDescToSet->Status & ETH_DMATxDesc_TCH) != (uint32_t)RESET) + { + /* Selects the next DMA Tx descriptor list for next buffer to send */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) (DMATxDescToSet->Buffer2NextDescAddr); + } + else /* Ring Mode */ + { + if((DMATxDescToSet->Status & ETH_DMATxDesc_TER) != (uint32_t)RESET) + { + /* Selects the first DMA Tx descriptor for next buffer to send: last Tx descriptor was used */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) (ETH->DMATDLAR); + } + else + { + /* Selects the next DMA Tx descriptor list for next buffer to send */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) ((uint32_t)DMATxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** + * @brief Receives a packet and copies it to memory pointed by ppkt. + * @param ppkt: pointer to application packet receive buffer. + * @retval : ETH_ERROR: if there is error in reception + * framelength: received packet size if packet reception is correct + */ +uint32_t ETH_HandleRxPkt(uint8_t *ppkt) +{ + uint32_t offset = 0, framelength = 0; + /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */ + if((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) != (uint32_t)RESET) + { + /* Return error: OWN bit set */ + return ETH_ERROR; + } + + if(((DMARxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)) + { + /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */ + framelength = ((DMARxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARxDesc_FrameLengthShift) - 4; + /* Copy the received frame into buffer from memory pointed by the current ETHERNET DMA Rx descriptor */ + for(offset=0; offsetBuffer1Addr) + offset)); + } + } + else + { + /* Return ERROR */ + framelength = ETH_ERROR; + } + /* Set Own bit of the Rx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMARxDescToGet->Status = ETH_DMARxDesc_OWN; + + /* When Rx Buffer unavailable flag is set: clear it and resume reception */ + if ((ETH->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET) + { + /* Clear RBUS ETHERNET DMA flag */ + ETH->DMASR = ETH_DMASR_RBUS; + /* Resume DMA reception */ + ETH->DMARPDR = 0; + } + + /* Update the ETHERNET DMA global Rx descriptor with next Rx decriptor */ + /* Chained Mode */ + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RCH) != (uint32_t)RESET) + { + /* Selects the next DMA Rx descriptor list for next buffer to read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr); + } + else /* Ring Mode */ + { + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RER) != (uint32_t)RESET) + { + /* Selects the first DMA Rx descriptor for next buffer to read: last Rx descriptor was used */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (ETH->DMARDLAR); + } + else + { + /* Selects the next DMA Rx descriptor list for next buffer to read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) ((uint32_t)DMARxDescToGet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + + /* Return Frame Length/ERROR */ + return (framelength); +} + +/** + * @brief Get the size of received the received packet. + * @param None + * @retval : framelength: received packet size + */ +uint32_t ETH_GetRxPktSize(void) +{ + uint32_t frameLength = 0; + if(((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)) + { + /* Get the size of the packet: including 4 bytes of the CRC */ + frameLength = ETH_GetDMARxDescFrameLength(DMARxDescToGet); + } + + /* Return Frame Length */ + return frameLength; +} + +/** + * @brief Drop a Received packet (too small packet, etc...) + * @param None + * @retval : None + */ +void ETH_DropRxPkt(void) +{ + /* Set Own bit of the Rx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMARxDescToGet->Status = ETH_DMARxDesc_OWN; + /* Chained Mode */ + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RCH) != (uint32_t)RESET) + { + /* Selects the next DMA Rx descriptor list for next buffer read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr); + } + else /* Ring Mode */ + { + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RER) != (uint32_t)RESET) + { + /* Selects the next DMA Rx descriptor list for next buffer read: this will + be the first Rx descriptor in this case */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (ETH->DMARDLAR); + } + else + { + /* Selects the next DMA Rx descriptor list for next buffer read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) ((uint32_t)DMARxDescToGet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } +} + +/*--------------------------------- PHY ------------------------------------*/ +/** + * @brief Read a PHY register + * @param PHYAddress: PHY device address, is the index of one of supported + * 32 PHY devices. + * This parameter can be one of the following values: 0,..,31 + * @param PHYReg: PHY register address, is the index of one of the 32 + * PHY register. + * This parameter can be one of the following values: + * @arg PHY_BCR : Tranceiver Basic Control Register + * @arg PHY_BSR : Tranceiver Basic Status Register + * @arg PHY_SR : Tranceiver Status Register + * @arg More PHY register could be read depending on the used PHY + * @retval : ETH_ERROR: in case of timeout + * MAC MIIDR register value: Data read from the selected PHY register (correct read ) + */ +uint16_t ETH_ReadPHYRegister(uint16_t PHYAddress, uint16_t PHYReg) +{ + uint32_t tmpreg = 0; +__IO uint32_t timeout = 0; + /* Check the parameters */ + assert_param(IS_ETH_PHY_ADDRESS(PHYAddress)); + assert_param(IS_ETH_PHY_REG(PHYReg)); + + /* Get the ETHERNET MACMIIAR value */ + tmpreg = ETH->MACMIIAR; + /* Keep only the CSR Clock Range CR[2:0] bits value */ + tmpreg &= ~MACMIIAR_CR_Mask; + /* Prepare the MII address register value */ + tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */ + tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */ + tmpreg &= ~ETH_MACMIIAR_MW; /* Set the read mode */ + tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */ + /* Write the result value into the MII Address register */ + ETH->MACMIIAR = tmpreg; + /* Check for the Busy flag */ + do + { + timeout++; + tmpreg = ETH->MACMIIAR; + } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_READ_TO) + { + return (uint16_t)ETH_ERROR; + } + + /* Return data register value */ + return (uint16_t)(ETH->MACMIIDR); +} + +/** + * @brief Write to a PHY register + * @param PHYAddress: PHY device address, is the index of one of supported + * 32 PHY devices. + * This parameter can be one of the following values: 0,..,31 + * @param PHYReg: PHY register address, is the index of one of the 32 + * PHY register. + * This parameter can be one of the following values: + * @arg PHY_BCR : Tranceiver Control Register + * @arg More PHY register could be written depending on the used PHY + * @param PHYValue: the value to write + * @retval : ETH_ERROR: in case of timeout + * ETH_SUCCESS: for correct write + */ +uint32_t ETH_WritePHYRegister(uint16_t PHYAddress, uint16_t PHYReg, uint16_t PHYValue) +{ + uint32_t tmpreg = 0; + __IO uint32_t timeout = 0; + /* Check the parameters */ + assert_param(IS_ETH_PHY_ADDRESS(PHYAddress)); + assert_param(IS_ETH_PHY_REG(PHYReg)); + + /* Get the ETHERNET MACMIIAR value */ + tmpreg = ETH->MACMIIAR; + /* Keep only the CSR Clock Range CR[2:0] bits value */ + tmpreg &= ~MACMIIAR_CR_Mask; + /* Prepare the MII register address value */ + tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */ + tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */ + tmpreg |= ETH_MACMIIAR_MW; /* Set the write mode */ + tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */ + /* Give the value to the MII data register */ + ETH->MACMIIDR = PHYValue; + /* Write the result value into the MII Address register */ + ETH->MACMIIAR = tmpreg; + /* Check for the Busy flag */ + do + { + timeout++; + tmpreg = ETH->MACMIIAR; + } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_WRITE_TO)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_WRITE_TO) + { + return ETH_ERROR; + } + + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** + * @brief Enables or disables the PHY loopBack mode. + * @param PHYAddress: PHY device address, is the index of one of supported + * 32 PHY devices. + * This parameter can be one of the following values: + * @param NewState: new state of the PHY loopBack mode. + * This parameter can be: ENABLE or DISABLE. + * Note: Don't be confused with ETH_MACLoopBackCmd function + * which enables internal loopback at MII level + * @retval : ETH_ERROR: in case of bad PHY configuration + * ETH_SUCCESS: for correct PHY configuration + */ +uint32_t ETH_PHYLoopBackCmd(uint16_t PHYAddress, FunctionalState NewState) +{ + uint16_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_ETH_PHY_ADDRESS(PHYAddress)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* Get the PHY configuration to update it */ + tmpreg = ETH_ReadPHYRegister(PHYAddress, PHY_BCR); + + if (NewState != DISABLE) + { + /* Enable the PHY loopback mode */ + tmpreg |= PHY_Loopback; + } + else + { + /* Disable the PHY loopback mode: normal mode */ + tmpreg &= (uint16_t)(~(uint16_t)PHY_Loopback); + } + /* Update the PHY control register with the new configuration */ + if(ETH_WritePHYRegister(PHYAddress, PHY_BCR, tmpreg) != (uint32_t)RESET) + { + return ETH_SUCCESS; + } + else + { + /* Return SUCCESS */ + return ETH_ERROR; + } +} + +/*--------------------------------- MAC ------------------------------------*/ +/** + * @brief Enables or disables the MAC transmission. + * @param NewState: new state of the MAC transmission. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MACTransmissionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC transmission */ + ETH->MACCR |= ETH_MACCR_TE; + } + else + { + /* Disable the MAC transmission */ + ETH->MACCR &= ~ETH_MACCR_TE; + } +} + +/** + * @brief Enables or disables the MAC reception. + * @param NewState: new state of the MAC reception. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MACReceptionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC reception */ + ETH->MACCR |= ETH_MACCR_RE; + } + else + { + /* Disable the MAC reception */ + ETH->MACCR &= ~ETH_MACCR_RE; + } +} + +/** + * @brief Checks whether the ETHERNET flow control busy bit is set or not. + * @param None + * @retval : The new state of flow control busy status bit (SET or RESET). + */ +FlagStatus ETH_GetFlowControlBusyStatus(void) +{ + FlagStatus bitstatus = RESET; + /* The Flow Control register should not be written to until this bit is cleared */ + if ((ETH->MACFCR & ETH_MACFCR_FCBBPA) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Initiate a Pause Control Frame (Full-duplex only). + * @param None + * @retval : None + */ +void ETH_InitiatePauseControlFrame(void) +{ + /* When Set In full duplex MAC initiates pause control frame */ + ETH->MACFCR |= ETH_MACFCR_FCBBPA; +} + +/** + * @brief Enables or disables the MAC BackPressure operation activation (Half-duplex only). + * @param NewState: new state of the MAC BackPressure operation activation. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_BackPressureActivationCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Activate the MAC BackPressure operation */ + /* In Half duplex: during backpressure, when the MAC receives a new frame, + the transmitter starts sending a JAM pattern resulting in a collision */ + ETH->MACFCR |= ETH_MACFCR_FCBBPA; + } + else + { + /* Desactivate the MAC BackPressure operation */ + ETH->MACFCR &= ~ETH_MACFCR_FCBBPA; + } +} + +/** + * @brief Checks whether the specified ETHERNET MAC flag is set or not. + * @param ETH_MAC_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_MAC_FLAG_TST : Time stamp trigger flag + * @arg ETH_MAC_FLAG_MMCT : MMC transmit flag + * @arg ETH_MAC_FLAG_MMCR : MMC receive flag + * @arg ETH_MAC_FLAG_MMC : MMC flag + * @arg ETH_MAC_FLAG_PMT : PMT flag + * @retval : The new state of ETHERNET MAC flag (SET or RESET). + */ +FlagStatus ETH_GetMACFlagStatus(uint32_t ETH_MAC_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_MAC_GET_FLAG(ETH_MAC_FLAG)); + if ((ETH->MACSR & ETH_MAC_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Checks whether the specified ETHERNET MAC interrupt has occurred or not. + * @param ETH_MAC_IT: specifies the interrupt source to check. + * This parameter can be one of the following values: + * @arg ETH_MAC_IT_TST : Time stamp trigger interrupt + * @arg ETH_MAC_IT_MMCT : MMC transmit interrupt + * @arg ETH_MAC_IT_MMCR : MMC receive interrupt + * @arg ETH_MAC_IT_MMC : MMC interrupt + * @arg ETH_MAC_IT_PMT : PMT interrupt + * @retval : The new state of ETHERNET MAC interrupt (SET or RESET). + */ +ITStatus ETH_GetMACITStatus(uint32_t ETH_MAC_IT) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_MAC_GET_IT(ETH_MAC_IT)); + if ((ETH->MACSR & ETH_MAC_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Enables or disables the specified ETHERNET MAC interrupts. + * @param ETH_MAC_IT: specifies the ETHERNET MAC interrupt sources to be + * enabled or disabled. + * This parameter can be any combination of the following values: + * @arg ETH_MAC_IT_TST : Time stamp trigger interrupt + * @arg ETH_MAC_IT_PMT : PMT interrupt + * @param NewState: new state of the specified ETHERNET MAC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MACITConfig(uint32_t ETH_MAC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ETH_MAC_IT(ETH_MAC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET MAC interrupts */ + ETH->MACIMR &= (~(uint32_t)ETH_MAC_IT); + } + else + { + /* Disable the selected ETHERNET MAC interrupts */ + ETH->MACIMR |= ETH_MAC_IT; + } +} + +/** + * @brief Configures the selected MAC address. + * @param MacAddr: The MAC addres to configure. + * This parameter can be one of the following values: + * @arg ETH_MAC_Address0 : MAC Address0 + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param Addr: Pointer on MAC address buffer data (6 bytes). + * @retval : None + */ +void ETH_MACAddressConfig(uint32_t MacAddr, uint8_t *Addr) +{ + uint32_t tmpreg; + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS0123(MacAddr)); + + /* Calculate the selectecd MAC address high register */ + tmpreg = ((uint32_t)Addr[5] << 8) | (uint32_t)Addr[4]; + /* Load the selectecd MAC address high register */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) = tmpreg; + /* Calculate the selectecd MAC address low register */ + tmpreg = ((uint32_t)Addr[3] << 24) | ((uint32_t)Addr[2] << 16) | ((uint32_t)Addr[1] << 8) | Addr[0]; + + /* Load the selectecd MAC address low register */ + (*(__IO uint32_t *) (ETH_MAC_AddrLowBase + MacAddr)) = tmpreg; +} + +/** + * @brief Get the selected MAC address. + * @param MacAddr: The MAC addres to return. + * This parameter can be one of the following values: + * @arg ETH_MAC_Address0 : MAC Address0 + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param Addr: Pointer on MAC address buffer data (6 bytes). + * @retval : None + */ +void ETH_GetMACAddress(uint32_t MacAddr, uint8_t *Addr) +{ + uint32_t tmpreg; + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS0123(MacAddr)); + + /* Get the selectecd MAC address high register */ + tmpreg =(*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)); + + /* Calculate the selectecd MAC address buffer */ + Addr[5] = ((tmpreg >> 8) & (uint8_t)0xFF); + Addr[4] = (tmpreg & (uint8_t)0xFF); + /* Load the selectecd MAC address low register */ + tmpreg =(*(__IO uint32_t *) (ETH_MAC_AddrLowBase + MacAddr)); + /* Calculate the selectecd MAC address buffer */ + Addr[3] = ((tmpreg >> 24) & (uint8_t)0xFF); + Addr[2] = ((tmpreg >> 16) & (uint8_t)0xFF); + Addr[1] = ((tmpreg >> 8 ) & (uint8_t)0xFF); + Addr[0] = (tmpreg & (uint8_t)0xFF); +} + +/** + * @brief Enables or disables the Address filter module uses the specified + * ETHERNET MAC address for perfect filtering + * @param MacAddr: specifies the ETHERNET MAC address to be used for prfect filtering. + * This parameter can be one of the following values: + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param NewState: new state of the specified ETHERNET MAC address use. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MACAddressPerfectFilterCmd(uint32_t MacAddr, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS123(MacAddr)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET MAC address for perfect filtering */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) |= ETH_MACA1HR_AE; + } + else + { + /* Disable the selected ETHERNET MAC address for perfect filtering */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) &=(~(uint32_t)ETH_MACA1HR_AE); + } +} + +/** + * @brief Set the filter type for the specified ETHERNET MAC address + * @param MacAddr: specifies the ETHERNET MAC address + * This parameter can be one of the following values: + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param Filter: specifies the used frame received field for comparaison + * This parameter can be one of the following values: + * @arg ETH_MAC_AddressFilter_SA : MAC Address is used to compare + * with the SA fields of the received frame. + * @arg ETH_MAC_AddressFilter_DA : MAC Address is used to compare + * with the DA fields of the received frame. + * @retval : None + */ +void ETH_MACAddressFilterConfig(uint32_t MacAddr, uint32_t Filter) +{ + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS123(MacAddr)); + assert_param(IS_ETH_MAC_ADDRESS_FILTER(Filter)); + + if (Filter != ETH_MAC_AddressFilter_DA) + { + /* The selected ETHERNET MAC address is used to compare with the SA fields of the + received frame. */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) |= ETH_MACA1HR_SA; + } + else + { + /* The selected ETHERNET MAC address is used to compare with the DA fields of the + received frame. */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) &=(~(uint32_t)ETH_MACA1HR_SA); + } +} + +/** + * @brief Set the filter type for the specified ETHERNET MAC address + * @param MacAddr: specifies the ETHERNET MAC address + * This parameter can be one of the following values: + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param MaskByte: specifies the used address bytes for comparaison + * This parameter can be any combination of the following values: + * @arg ETH_MAC_AddressMask_Byte6 : Mask MAC Address high reg bits [15:8]. + * @arg ETH_MAC_AddressMask_Byte5 : Mask MAC Address high reg bits [7:0]. + * @arg ETH_MAC_AddressMask_Byte4 : Mask MAC Address low reg bits [31:24]. + * @arg ETH_MAC_AddressMask_Byte3 : Mask MAC Address low reg bits [23:16]. + * @arg ETH_MAC_AddressMask_Byte2 : Mask MAC Address low reg bits [15:8]. + * @arg ETH_MAC_AddressMask_Byte1 : Mask MAC Address low reg bits [7:0]. + * @retval : None + */ +void ETH_MACAddressMaskBytesFilterConfig(uint32_t MacAddr, uint32_t MaskByte) +{ + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS123(MacAddr)); + assert_param(IS_ETH_MAC_ADDRESS_MASK(MaskByte)); + + /* Clear MBC bits in the selected MAC address high register */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) &=(~(uint32_t)ETH_MACA1HR_MBC); + /* Set the selected Filetr mask bytes */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) |= MaskByte; +} +/*------------------------ DMA Tx/Rx Desciptors -----------------------------*/ + +/** + * @brief Initializes the DMA Tx descriptors in chain mode. + * @param DMATxDescTab: Pointer on the first Tx desc list + * @param TxBuff: Pointer on the first TxBuffer list + * @param TxBuffCount: Number of the used Tx desc in the list + * @retval : None + */ +void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t* TxBuff, uint32_t TxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMATxDesc; + + /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */ + DMATxDescToSet = DMATxDescTab; + /* Fill each DMATxDesc descriptor with the right values */ + for(i=0; i < TxBuffCount; i++) + { + /* Get the pointer on the ith member of the Tx Desc list */ + DMATxDesc = DMATxDescTab + i; + /* Set Second Address Chained bit */ + DMATxDesc->Status = ETH_DMATxDesc_TCH; + + /* Set Buffer1 address pointer */ + DMATxDesc->Buffer1Addr = (uint32_t)(&TxBuff[i*ETH_MAX_PACKET_SIZE]); + + /* Initialize the next descriptor with the Next Desciptor Polling Enable */ + if(i < (TxBuffCount-1)) + { + /* Set next descriptor address register with next descriptor base address */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t)(DMATxDescTab+i+1); + } + else + { + /* For last descriptor, set next descriptor address register equal to the first descriptor base address */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t) DMATxDescTab; + } + } + + /* Set Transmit Desciptor List Address Register */ + ETH->DMATDLAR = (uint32_t) DMATxDescTab; +} + +/** + * @brief Initializes the DMA Tx descriptors in ring mode. + * @param DMATxDescTab: Pointer on the first Tx desc list + * @param TxBuff1: Pointer on the first TxBuffer1 list + * @param TxBuff2: Pointer on the first TxBuffer2 list + * @param TxBuffCount: Number of the used Tx desc in the list + * Note: see decriptor skip length defined in ETH_DMA_InitStruct + * for the number of Words to skip between two unchained descriptors. + * @retval : None + */ +void ETH_DMATxDescRingInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t *TxBuff1, uint8_t *TxBuff2, uint32_t TxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMATxDesc; + + /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */ + DMATxDescToSet = DMATxDescTab; + /* Fill each DMATxDesc descriptor with the right values */ + for(i=0; i < TxBuffCount; i++) + { + /* Get the pointer on the ith member of the Tx Desc list */ + DMATxDesc = DMATxDescTab + i; + /* Set Buffer1 address pointer */ + DMATxDesc->Buffer1Addr = (uint32_t)(&TxBuff1[i*ETH_MAX_PACKET_SIZE]); + + /* Set Buffer2 address pointer */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t)(&TxBuff2[i*ETH_MAX_PACKET_SIZE]); + + /* Set Transmit End of Ring bit for last descriptor: The DMA returns to the base + address of the list, creating a Desciptor Ring */ + if(i == (TxBuffCount-1)) + { + /* Set Transmit End of Ring bit */ + DMATxDesc->Status = ETH_DMATxDesc_TER; + } + } + + /* Set Transmit Desciptor List Address Register */ + ETH->DMATDLAR = (uint32_t) DMATxDescTab; +} + +/** + * @brief Checks whether the specified ETHERNET DMA Tx Desc flag is set or not. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param ETH_DMATxDescFlag: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_DMATxDesc_OWN : OWN bit: descriptor is owned by DMA engine + * @arg ETH_DMATxDesc_IC : Interrupt on completetion + * @arg ETH_DMATxDesc_LS : Last Segment + * @arg ETH_DMATxDesc_FS : First Segment + * @arg ETH_DMATxDesc_DC : Disable CRC + * @arg ETH_DMATxDesc_DP : Disable Pad + * @arg ETH_DMATxDesc_TTSE: Transmit Time Stamp Enable + * @arg ETH_DMATxDesc_TER : Transmit End of Ring + * @arg ETH_DMATxDesc_TCH : Second Address Chained + * @arg ETH_DMATxDesc_TTSS: Tx Time Stamp Status + * @arg ETH_DMATxDesc_IHE : IP Header Error + * @arg ETH_DMATxDesc_ES : Error summary + * @arg ETH_DMATxDesc_JT : Jabber Timeout + * @arg ETH_DMATxDesc_FF : Frame Flushed: DMA/MTL flushed the frame due to SW flush + * @arg ETH_DMATxDesc_PCE : Payload Checksum Error + * @arg ETH_DMATxDesc_LCA : Loss of Carrier: carrier lost during tramsmission + * @arg ETH_DMATxDesc_NC : No Carrier: no carrier signal from the tranceiver + * @arg ETH_DMATxDesc_LCO : Late Collision: transmission aborted due to collision + * @arg ETH_DMATxDesc_EC : Excessive Collision: transmission aborted after 16 collisions + * @arg ETH_DMATxDesc_VF : VLAN Frame + * @arg ETH_DMATxDesc_CC : Collision Count + * @arg ETH_DMATxDesc_ED : Excessive Deferral + * @arg ETH_DMATxDesc_UF : Underflow Error: late data arrival from the memory + * @arg ETH_DMATxDesc_DB : Deferred Bit + * @retval : The new state of ETH_DMATxDescFlag (SET or RESET). + */ +FlagStatus ETH_GetDMATxDescFlagStatus(ETH_DMADESCTypeDef *DMATxDesc, uint32_t ETH_DMATxDescFlag) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMATxDESC_GET_FLAG(ETH_DMATxDescFlag)); + + if ((DMATxDesc->Status & ETH_DMATxDescFlag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Returns the specified ETHERNET DMA Tx Desc collision count. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @retval : The Transmit descriptor collision counter value. + */ +uint32_t ETH_GetDMATxDescCollisionCount(ETH_DMADESCTypeDef *DMATxDesc) +{ + /* Return the Receive descriptor frame length */ + return ((DMATxDesc->Status & ETH_DMATxDesc_CC) >> ETH_DMATxDesc_CollisionCountShift); +} + +/** + * @brief Set the specified DMA Tx Desc Own bit. + * @param DMATxDesc: Pointer on a Tx desc + * @retval : None + */ +void ETH_SetDMATxDescOwnBit(ETH_DMADESCTypeDef *DMATxDesc) +{ + /* Set the DMA Tx Desc Own bit */ + DMATxDesc->Status |= ETH_DMATxDesc_OWN; +} + +/** + * @brief Enables or disables the specified DMA Tx Desc Transmit interrupt. + * @param DMATxDesc: Pointer on a Tx desc + * @param NewState: new state of the DMA Tx Desc transmit interrupt. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescTransmitITConfig(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA Tx Desc Transmit interrupt */ + DMATxDesc->Status |= ETH_DMATxDesc_IC; + } + else + { + /* Disable the DMA Tx Desc Transmit interrupt */ + DMATxDesc->Status &=(~(uint32_t)ETH_DMATxDesc_IC); + } +} + +/** + * @brief Enables or disables the specified DMA Tx Desc Transmit interrupt. + * @param DMATxDesc: Pointer on a Tx desc + * @param DMATxDesc_FrameSegment: specifies is the actual Tx desc contain last or first segment. + * This parameter can be one of the following values: + * @arg ETH_DMATxDesc_LastSegment : actual Tx desc contain last segment + * @arg ETH_DMATxDesc_FirstSegment : actual Tx desc contain first segment + * @retval : None + */ +void ETH_DMATxDescFrameSegmentConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_FrameSegment) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_TXDESC_SEGMENT(DMATxDesc_FrameSegment)); + + /* Selects the DMA Tx Desc Frame segment */ + DMATxDesc->Status |= DMATxDesc_FrameSegment; +} + +/** + * @brief Selects the specified ETHERNET DMA Tx Desc Checksum Insertion. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param DMATxDesc_Checksum: specifies is the DMA Tx desc checksum insertion. + * This parameter can be one of the following values: + * @arg ETH_DMATxDesc_ChecksumByPass : Checksum bypass + * @arg ETH_DMATxDesc_ChecksumIPV4Header : IPv4 header checksum + * @arg ETH_DMATxDesc_ChecksumTCPUDPICMPSegment : TCP/UDP/ICMP checksum. Pseudo header checksum is assumed to be present + * @arg ETH_DMATxDesc_ChecksumTCPUDPICMPFull : TCP/UDP/ICMP checksum fully in hardware including pseudo header + * @retval : None + */ +void ETH_DMATxDescChecksumInsertionConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_Checksum) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_TXDESC_CHECKSUM(DMATxDesc_Checksum)); + + /* Set the selected DMA Tx desc checksum insertion control */ + DMATxDesc->Status |= DMATxDesc_Checksum; +} + +/** + * @brief Enables or disables the DMA Tx Desc CRC. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc CRC. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescCRCCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc CRC */ + DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_DC); + } + else + { + /* Disable the selected DMA Tx Desc CRC */ + DMATxDesc->Status |= ETH_DMATxDesc_DC; + } +} + +/** + * @brief Enables or disables the DMA Tx Desc end of ring. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc end of ring. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc end of ring */ + DMATxDesc->Status |= ETH_DMATxDesc_TER; + } + else + { + /* Disable the selected DMA Tx Desc end of ring */ + DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_TER); + } +} + +/** + * @brief Enables or disables the DMA Tx Desc second address chained. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc second address chained. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc second address chained */ + DMATxDesc->Status |= ETH_DMATxDesc_TCH; + } + else + { + /* Disable the selected DMA Tx Desc second address chained */ + DMATxDesc->Status &=(~(uint32_t)ETH_DMATxDesc_TCH); + } +} + +/** + * @brief Enables or disables the DMA Tx Desc padding for frame shorter than 64 bytes. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc padding for + * frame shorter than 64 bytes. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescShortFramePaddingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc padding for frame shorter than 64 bytes */ + DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_DP); + } + else + { + /* Disable the selected DMA Tx Desc padding for frame shorter than 64 bytes*/ + DMATxDesc->Status |= ETH_DMATxDesc_DP; + } +} + +/** + * @brief Enables or disables the DMA Tx Desc time stamp. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc time stamp. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescTimeStampCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc time stamp */ + DMATxDesc->Status |= ETH_DMATxDesc_TTSE; + } + else + { + /* Disable the selected DMA Tx Desc time stamp */ + DMATxDesc->Status &=(~(uint32_t)ETH_DMATxDesc_TTSE); + } +} + +/** + * @brief Configures the specified DMA Tx Desc buffer1 and buffer2 sizes. + * @param DMATxDesc: Pointer on a Tx desc + * @param BufferSize1: specifies the Tx desc buffer1 size. + * @param BufferSize2: specifies the Tx desc buffer2 size (put "0" if not used). + * @retval : None + */ +void ETH_DMATxDescBufferSizeConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t BufferSize1, uint32_t BufferSize2) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMATxDESC_BUFFER_SIZE(BufferSize1)); + assert_param(IS_ETH_DMATxDESC_BUFFER_SIZE(BufferSize2)); + + /* Set the DMA Tx Desc buffer1 and buffer2 sizes values */ + DMATxDesc->ControlBufferSize |= (BufferSize1 | (BufferSize2 << ETH_DMATxDesc_BufferSize2Shift)); +} + +/** + * @brief Initializes the DMA Rx descriptors in chain mode. + * @param DMARxDescTab: Pointer on the first Rx desc list + * @param RxBuff: Pointer on the first RxBuffer list + * @param RxBuffCount: Number of the used Rx desc in the list + * @retval : None + */ +void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMARxDesc; + + /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */ + DMARxDescToGet = DMARxDescTab; + /* Fill each DMARxDesc descriptor with the right values */ + for(i=0; i < RxBuffCount; i++) + { + /* Get the pointer on the ith member of the Rx Desc list */ + DMARxDesc = DMARxDescTab+i; + /* Set Own bit of the Rx descriptor Status */ + DMARxDesc->Status = ETH_DMARxDesc_OWN; + + /* Set Buffer1 size and Second Address Chained bit */ + DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_MAX_PACKET_SIZE; + /* Set Buffer1 address pointer */ + DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff[i*ETH_MAX_PACKET_SIZE]); + + /* Initialize the next descriptor with the Next Desciptor Polling Enable */ + if(i < (RxBuffCount-1)) + { + /* Set next descriptor address register with next descriptor base address */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab+i+1); + } + else + { + /* For last descriptor, set next descriptor address register equal to the first descriptor base address */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab); + } + } + + /* Set Receive Desciptor List Address Register */ + ETH->DMARDLAR = (uint32_t) DMARxDescTab; +} + +/** + * @brief Initializes the DMA Rx descriptors in ring mode. + * @param DMARxDescTab: Pointer on the first Rx desc list + * @param RxBuff1: Pointer on the first RxBuffer1 list + * @param RxBuff2: Pointer on the first RxBuffer2 list + * @param RxBuffCount: Number of the used Rx desc in the list + * Note: see decriptor skip length defined in ETH_DMA_InitStruct + * for the number of Words to skip between two unchained descriptors. + * @retval : None + */ +void ETH_DMARxDescRingInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff1, uint8_t *RxBuff2, uint32_t RxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMARxDesc; + /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */ + DMARxDescToGet = DMARxDescTab; + /* Fill each DMARxDesc descriptor with the right values */ + for(i=0; i < RxBuffCount; i++) + { + /* Get the pointer on the ith member of the Rx Desc list */ + DMARxDesc = DMARxDescTab+i; + /* Set Own bit of the Rx descriptor Status */ + DMARxDesc->Status = ETH_DMARxDesc_OWN; + /* Set Buffer1 size */ + DMARxDesc->ControlBufferSize = ETH_MAX_PACKET_SIZE; + /* Set Buffer1 address pointer */ + DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff1[i*ETH_MAX_PACKET_SIZE]); + + /* Set Buffer2 address pointer */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(&RxBuff2[i*ETH_MAX_PACKET_SIZE]); + + /* Set Receive End of Ring bit for last descriptor: The DMA returns to the base + address of the list, creating a Desciptor Ring */ + if(i == (RxBuffCount-1)) + { + /* Set Receive End of Ring bit */ + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_RER; + } + } + + /* Set Receive Desciptor List Address Register */ + ETH->DMARDLAR = (uint32_t) DMARxDescTab; +} + +/** + * @brief Checks whether the specified ETHERNET Rx Desc flag is set or not. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @param ETH_DMARxDescFlag: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_DMARxDesc_OWN: OWN bit: descriptor is owned by DMA engine + * @arg ETH_DMARxDesc_AFM: DA Filter Fail for the rx frame + * @arg ETH_DMARxDesc_ES: Error summary + * @arg ETH_DMARxDesc_DE: Desciptor error: no more descriptors for receive frame + * @arg ETH_DMARxDesc_SAF: SA Filter Fail for the received frame + * @arg ETH_DMARxDesc_LE: Frame size not matching with length field + * @arg ETH_DMARxDesc_OE: Overflow Error: Frame was damaged due to buffer overflow + * @arg ETH_DMARxDesc_VLAN: VLAN Tag: received frame is a VLAN frame + * @arg ETH_DMARxDesc_FS: First descriptor of the frame + * @arg ETH_DMARxDesc_LS: Last descriptor of the frame + * @arg ETH_DMARxDesc_IPV4HCE: IPC Checksum Error/Giant Frame: Rx Ipv4 header checksum error + * @arg ETH_DMARxDesc_LC: Late collision occurred during reception + * @arg ETH_DMARxDesc_FT: Frame type - Ethernet, otherwise 802.3 + * @arg ETH_DMARxDesc_RWT: Receive Watchdog Timeout: watchdog timer expired during reception + * @arg ETH_DMARxDesc_RE: Receive error: error reported by MII interface + * @arg ETH_DMARxDesc_DE: Dribble bit error: frame contains non int multiple of 8 bits + * @arg ETH_DMARxDesc_CE: CRC error + * @arg ETH_DMARxDesc_MAMPCE: Rx MAC Address/Payload Checksum Error: Rx MAC address matched/ Rx Payload Checksum Error + * @retval : The new state of ETH_DMARxDescFlag (SET or RESET). + */ +FlagStatus ETH_GetDMARxDescFlagStatus(ETH_DMADESCTypeDef *DMARxDesc, uint32_t ETH_DMARxDescFlag) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMARxDESC_GET_FLAG(ETH_DMARxDescFlag)); + if ((DMARxDesc->Status & ETH_DMARxDescFlag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Set the specified DMA Rx Desc Own bit. + * @param DMARxDesc: Pointer on a Rx desc + * @retval : None + */ +void ETH_SetDMARxDescOwnBit(ETH_DMADESCTypeDef *DMARxDesc) +{ + /* Set the DMA Rx Desc Own bit */ + DMARxDesc->Status |= ETH_DMARxDesc_OWN; +} + +/** + * @brief Returns the specified DMA Rx Desc frame length. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @retval : The Rx descriptor received frame length. + */ +uint32_t ETH_GetDMARxDescFrameLength(ETH_DMADESCTypeDef *DMARxDesc) +{ + /* Return the Receive descriptor frame length */ + return ((DMARxDesc->Status & ETH_DMARxDesc_FL) >> ETH_DMARxDesc_FrameLengthShift); +} + +/** + * @brief Enables or disables the specified DMA Rx Desc receive interrupt. + * @param DMARxDesc: Pointer on a Rx desc + * @param NewState: new state of the specified DMA Rx Desc interrupt. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMARxDescReceiveITConfig(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA Rx Desc receive interrupt */ + DMARxDesc->ControlBufferSize &=(~(uint32_t)ETH_DMARxDesc_DIC); + } + else + { + /* Disable the DMA Rx Desc receive interrupt */ + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_DIC; + } +} + +/** + * @brief Enables or disables the DMA Rx Desc end of ring. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @param NewState: new state of the specified DMA Rx Desc end of ring. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMARxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Rx Desc end of ring */ + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_RER; + } + else + { + /* Disable the selected DMA Rx Desc end of ring */ + DMARxDesc->ControlBufferSize &=(~(uint32_t)ETH_DMARxDesc_RER); + } +} + +/** + * @brief Enables or disables the DMA Rx Desc second address chained. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @param NewState: new state of the specified DMA Rx Desc second address chained. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMARxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Rx Desc second address chained */ + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_RCH; + } + else + { + /* Disable the selected DMA Rx Desc second address chained */ + DMARxDesc->ControlBufferSize &=(~(uint32_t)ETH_DMARxDesc_RCH); + } +} + +/** + * @brief Returns the specified ETHERNET DMA Rx Desc buffer size. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @param DMARxDesc_Buffer: specifies the DMA Rx Desc buffer. + * This parameter can be any one of the following values: + * @arg ETH_DMARxDesc_Buffer1 : DMA Rx Desc Buffer1 + * @arg ETH_DMARxDesc_Buffer2 : DMA Rx Desc Buffer2 + * @retval : The Receive descriptor frame length. + */ +uint32_t ETH_GetDMARxDescBufferSize(ETH_DMADESCTypeDef *DMARxDesc, uint32_t DMARxDesc_Buffer) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_RXDESC_BUFFER(DMARxDesc_Buffer)); + + if(DMARxDesc_Buffer != ETH_DMARxDesc_Buffer1) + { + /* Return the DMA Rx Desc buffer2 size */ + return ((DMARxDesc->ControlBufferSize & ETH_DMARxDesc_RBS2) >> ETH_DMARxDesc_Buffer2SizeShift); + } + else + { + /* Return the DMA Rx Desc buffer1 size */ + return (DMARxDesc->ControlBufferSize & ETH_DMARxDesc_RBS1); + } +} + +/*--------------------------------- DMA ------------------------------------*/ +/** + * @brief Resets all MAC subsystem internal registers and logic. + * @param None + * @retval : None + */ +void ETH_SoftwareReset(void) +{ + /* Set the SWR bit: resets all MAC subsystem internal registers and logic */ + /* After reset all the registers holds their respective reset values */ + ETH->DMABMR |= ETH_DMABMR_SR; +} + +/** + * @brief Checks whether the ETHERNET software reset bit is set or not. + * @param None + * @retval : The new state of DMA Bus Mode register SR bit (SET or RESET). + */ +FlagStatus ETH_GetSoftwareResetStatus(void) +{ + FlagStatus bitstatus = RESET; + if((ETH->DMABMR & ETH_DMABMR_SR) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Checks whether the specified ETHERNET DMA flag is set or not. + * @param ETH_DMA_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_DMA_FLAG_TST : Time-stamp trigger flag + * @arg ETH_DMA_FLAG_PMT : PMT flag + * @arg ETH_DMA_FLAG_MMC : MMC flag + * @arg ETH_DMA_FLAG_DataTransferError : Error bits 0-data buffer, 1-desc. access + * @arg ETH_DMA_FLAG_ReadWriteError : Error bits 0-write trnsf, 1-read transfr + * @arg ETH_DMA_FLAG_AccessError : Error bits 0-Rx DMA, 1-Tx DMA + * @arg ETH_DMA_FLAG_NIS : Normal interrupt summary flag + * @arg ETH_DMA_FLAG_AIS : Abnormal interrupt summary flag + * @arg ETH_DMA_FLAG_ER : Early receive flag + * @arg ETH_DMA_FLAG_FBE : Fatal bus error flag + * @arg ETH_DMA_FLAG_ET : Early transmit flag + * @arg ETH_DMA_FLAG_RWT : Receive watchdog timeout flag + * @arg ETH_DMA_FLAG_RPS : Receive process stopped flag + * @arg ETH_DMA_FLAG_RBU : Receive buffer unavailable flag + * @arg ETH_DMA_FLAG_R : Receive flag + * @arg ETH_DMA_FLAG_TU : Underflow flag + * @arg ETH_DMA_FLAG_RO : Overflow flag + * @arg ETH_DMA_FLAG_TJT : Transmit jabber timeout flag + * @arg ETH_DMA_FLAG_TBU : Transmit buffer unavailable flag + * @arg ETH_DMA_FLAG_TPS : Transmit process stopped flag + * @arg ETH_DMA_FLAG_T : Transmit flag + * @retval : The new state of ETH_DMA_FLAG (SET or RESET). + */ +FlagStatus ETH_GetDMAFlagStatus(uint32_t ETH_DMA_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMA_GET_IT(ETH_DMA_FLAG)); + if ((ETH->DMASR & ETH_DMA_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the ETHERNET’s DMA pending flag. + * @param ETH_DMA_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg ETH_DMA_FLAG_NIS : Normal interrupt summary flag + * @arg ETH_DMA_FLAG_AIS : Abnormal interrupt summary flag + * @arg ETH_DMA_FLAG_ER : Early receive flag + * @arg ETH_DMA_FLAG_FBE : Fatal bus error flag + * @arg ETH_DMA_FLAG_ETI : Early transmit flag + * @arg ETH_DMA_FLAG_RWT : Receive watchdog timeout flag + * @arg ETH_DMA_FLAG_RPS : Receive process stopped flag + * @arg ETH_DMA_FLAG_RBU : Receive buffer unavailable flag + * @arg ETH_DMA_FLAG_R : Receive flag + * @arg ETH_DMA_FLAG_TU : Transmit Underflow flag + * @arg ETH_DMA_FLAG_RO : Receive Overflow flag + * @arg ETH_DMA_FLAG_TJT : Transmit jabber timeout flag + * @arg ETH_DMA_FLAG_TBU : Transmit buffer unavailable flag + * @arg ETH_DMA_FLAG_TPS : Transmit process stopped flag + * @arg ETH_DMA_FLAG_T : Transmit flag + * @retval : None + */ +void ETH_DMAClearFlag(uint32_t ETH_DMA_FLAG) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_FLAG(ETH_DMA_FLAG)); + + /* Clear the selected ETHERNET DMA FLAG */ + ETH->DMASR = (uint32_t) ETH_DMA_FLAG; +} + +/** + * @brief Checks whether the specified ETHERNET DMA interrupt has occured or not. + * @param ETH_DMA_IT: specifies the interrupt source to check. + * This parameter can be one of the following values: + * @arg ETH_DMA_IT_TST : Time-stamp trigger interrupt + * @arg ETH_DMA_IT_PMT : PMT interrupt + * @arg ETH_DMA_IT_MMC : MMC interrupt + * @arg ETH_DMA_IT_NIS : Normal interrupt summary + * @arg ETH_DMA_IT_AIS : Abnormal interrupt summary + * @arg ETH_DMA_IT_ER : Early receive interrupt + * @arg ETH_DMA_IT_FBE : Fatal bus error interrupt + * @arg ETH_DMA_IT_ET : Early transmit interrupt + * @arg ETH_DMA_IT_RWT : Receive watchdog timeout interrupt + * @arg ETH_DMA_IT_RPS : Receive process stopped interrupt + * @arg ETH_DMA_IT_RBU : Receive buffer unavailable interrupt + * @arg ETH_DMA_IT_R : Receive interrupt + * @arg ETH_DMA_IT_TU : Underflow interrupt + * @arg ETH_DMA_IT_RO : Overflow interrupt + * @arg ETH_DMA_IT_TJT : Transmit jabber timeout interrupt + * @arg ETH_DMA_IT_TBU : Transmit buffer unavailable interrupt + * @arg ETH_DMA_IT_TPS : Transmit process stopped interrupt + * @arg ETH_DMA_IT_T : Transmit interrupt + * @retval : The new state of ETH_DMA_IT (SET or RESET). + */ +ITStatus ETH_GetDMAITStatus(uint32_t ETH_DMA_IT) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMA_GET_IT(ETH_DMA_IT)); + if ((ETH->DMASR & ETH_DMA_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the ETHERNET’s DMA IT pending bit. + * @param ETH_DMA_IT: specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg ETH_DMA_IT_NIS : Normal interrupt summary + * @arg ETH_DMA_IT_AIS : Abnormal interrupt summary + * @arg ETH_DMA_IT_ER : Early receive interrupt + * @arg ETH_DMA_IT_FBE : Fatal bus error interrupt + * @arg ETH_DMA_IT_ETI : Early transmit interrupt + * @arg ETH_DMA_IT_RWT : Receive watchdog timeout interrupt + * @arg ETH_DMA_IT_RPS : Receive process stopped interrupt + * @arg ETH_DMA_IT_RBU : Receive buffer unavailable interrupt + * @arg ETH_DMA_IT_R : Receive interrupt + * @arg ETH_DMA_IT_TU : Transmit Underflow interrupt + * @arg ETH_DMA_IT_RO : Receive Overflow interrupt + * @arg ETH_DMA_IT_TJT : Transmit jabber timeout interrupt + * @arg ETH_DMA_IT_TBU : Transmit buffer unavailable interrupt + * @arg ETH_DMA_IT_TPS : Transmit process stopped interrupt + * @arg ETH_DMA_IT_T : Transmit interrupt + * @retval : None + */ +void ETH_DMAClearITPendingBit(uint32_t ETH_DMA_IT) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_IT(ETH_DMA_IT)); + + /* Clear the selected ETHERNET DMA IT */ + ETH->DMASR = (uint32_t) ETH_DMA_IT; +} + +/** + * @brief Returns the ETHERNET DMA Transmit Process State. + * @param None + * @retval : The new ETHERNET DMA Transmit Process State: + * This can be one of the following values: + * - ETH_DMA_TransmitProcess_Stopped : Stopped - Reset or Stop Tx Command issued + * - ETH_DMA_TransmitProcess_Fetching : Running - fetching the Tx descriptor + * - ETH_DMA_TransmitProcess_Waiting : Running - waiting for status + * - ETH_DMA_TransmitProcess_Reading : unning - reading the data from host memory + * - ETH_DMA_TransmitProcess_Suspended : Suspended - Tx Desciptor unavailabe + * - ETH_DMA_TransmitProcess_Closing : Running - closing Rx descriptor + */ +uint32_t ETH_GetTransmitProcessState(void) +{ + return ((uint32_t)(ETH->DMASR & ETH_DMASR_TS)); +} + +/** + * @brief Returns the ETHERNET DMA Receive Process State. + * @param None + * @retval : The new ETHERNET DMA Receive Process State: + * This can be one of the following values: + * - ETH_DMA_ReceiveProcess_Stopped : Stopped - Reset or Stop Rx Command issued + * - ETH_DMA_ReceiveProcess_Fetching : Running - fetching the Rx descriptor + * - ETH_DMA_ReceiveProcess_Waiting : Running - waiting for packet + * - ETH_DMA_ReceiveProcess_Suspended : Suspended - Rx Desciptor unavailable + * - ETH_DMA_ReceiveProcess_Closing : Running - closing descriptor + * - ETH_DMA_ReceiveProcess_Queuing : Running - queuing the recieve frame into host memory + */ +uint32_t ETH_GetReceiveProcessState(void) +{ + return ((uint32_t)(ETH->DMASR & ETH_DMASR_RS)); +} + +/** + * @brief Clears the ETHERNET transmit FIFO. + * @param None + * @retval : None + */ +void ETH_FlushTransmitFIFO(void) +{ + /* Set the Flush Transmit FIFO bit */ + ETH->DMAOMR |= ETH_DMAOMR_FTF; +} + +/** + * @brief Checks whether the ETHERNET transmit FIFO bit is cleared or not. + * @param None + * @retval : The new state of ETHERNET flush transmit FIFO bit (SET or RESET). + */ +FlagStatus ETH_GetFlushTransmitFIFOStatus(void) +{ + FlagStatus bitstatus = RESET; + if ((ETH->DMAOMR & ETH_DMAOMR_FTF) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Enables or disables the DMA transmission. + * @param NewState: new state of the DMA transmission. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATransmissionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA transmission */ + ETH->DMAOMR |= ETH_DMAOMR_ST; + } + else + { + /* Disable the DMA transmission */ + ETH->DMAOMR &= ~ETH_DMAOMR_ST; + } +} + +/** + * @brief Enables or disables the DMA reception. + * @param NewState: new state of the DMA reception. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMAReceptionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA reception */ + ETH->DMAOMR |= ETH_DMAOMR_SR; + } + else + { + /* Disable the DMA reception */ + ETH->DMAOMR &= ~ETH_DMAOMR_SR; + } +} + +/** + * @brief Enables or disables the specified ETHERNET DMA interrupts. + * @param ETH_DMA_IT: specifies the ETHERNET DMA interrupt sources to be + * enabled or disabled. + * This parameter can be any combination of the following values: + * @arg ETH_DMA_IT_NIS : Normal interrupt summary + * @arg ETH_DMA_IT_AIS : Abnormal interrupt summary + * @arg ETH_DMA_IT_ER : Early receive interrupt + * @arg ETH_DMA_IT_FBE : Fatal bus error interrupt + * @arg ETH_DMA_IT_ET : Early transmit interrupt + * @arg ETH_DMA_IT_RWT : Receive watchdog timeout interrupt + * @arg ETH_DMA_IT_RPS : Receive process stopped interrupt + * @arg ETH_DMA_IT_RBU : Receive buffer unavailable interrupt + * @arg ETH_DMA_IT_R : Receive interrupt + * @arg ETH_DMA_IT_TU : Underflow interrupt + * @arg ETH_DMA_IT_RO : Overflow interrupt + * @arg ETH_DMA_IT_TJT : Transmit jabber timeout interrupt + * @arg ETH_DMA_IT_TBU : Transmit buffer unavailable interrupt + * @arg ETH_DMA_IT_TPS : Transmit process stopped interrupt + * @arg ETH_DMA_IT_T : Transmit interrupt + * @param NewState: new state of the specified ETHERNET DMA interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMAITConfig(uint32_t ETH_DMA_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_IT(ETH_DMA_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET DMA interrupts */ + ETH->DMAIER |= ETH_DMA_IT; + } + else + { + /* Disable the selected ETHERNET DMA interrupts */ + ETH->DMAIER &=(~(uint32_t)ETH_DMA_IT); + } +} + +/** + * @brief Checks whether the specified ETHERNET DMA overflow flag is set or not. + * @param ETH_DMA_Overflow: specifies the DMA overflow flag to check. + * This parameter can be one of the following values: + * @arg ETH_DMA_Overflow_RxFIFOCounter : Overflow for FIFO Overflow Counter + * @arg ETH_DMA_Overflow_MissedFrameCounter : Overflow for Missed Frame Counter + * @retval : The new state of ETHERNET DMA overflow Flag (SET or RESET). + */ +FlagStatus ETH_GetDMAOverflowStatus(uint32_t ETH_DMA_Overflow) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMA_GET_OVERFLOW(ETH_DMA_Overflow)); + + if ((ETH->DMAMFBOCR & ETH_DMA_Overflow) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Get the ETHERNET DMA Rx Overflow Missed Frame Counter value. + * @param None + * @retval : The value of Rx overflow Missed Frame Counter. + */ +uint32_t ETH_GetRxOverflowMissedFrameCounter(void) +{ + return ((uint32_t)((ETH->DMAMFBOCR & ETH_DMAMFBOCR_MFA)>>ETH_DMA_RxOverflowMissedFramesCounterShift)); +} + +/** + * @brief Get the ETHERNET DMA Buffer Unavailable Missed Frame Counter value. + * @param None + * @retval : The value of Buffer unavailable Missed Frame Counter. + */ +uint32_t ETH_GetBufferUnavailableMissedFrameCounter(void) +{ + return ((uint32_t)(ETH->DMAMFBOCR) & ETH_DMAMFBOCR_MFC); +} + +/** + * @brief Get the ETHERNET DMA DMACHTDR register value. + * @param None + * @retval : The value of the current Tx desc start address. + */ +uint32_t ETH_GetCurrentTxDescStartAddress(void) +{ + return ((uint32_t)(ETH->DMACHTDR)); +} + +/** + * @brief Get the ETHERNET DMA DMACHRDR register value. + * @param None + * @retval : The value of the current Rx desc start address. + */ +uint32_t ETH_GetCurrentRxDescStartAddress(void) +{ + return ((uint32_t)(ETH->DMACHRDR)); +} + +/** + * @brief Get the ETHERNET DMA DMACHTBAR register value. + * @param None + * @retval : The value of the current Tx desc buffer address. + */ +uint32_t ETH_GetCurrentTxBufferAddress(void) +{ + return ((uint32_t)(ETH->DMACHTBAR)); +} + +/** + * @brief Get the ETHERNET DMA DMACHRBAR register value. + * @param None + * @retval : The value of the current Rx desc buffer address. + */ +uint32_t ETH_GetCurrentRxBufferAddress(void) +{ + return ((uint32_t)(ETH->DMACHRBAR)); +} + +/** + * @brief Resumes the DMA Transmission by writing to the DmaTxPollDemand + * register: (the data written could be anything). This forces + * the DMA to resume transmission. + * @param None + * @retval : None. + */ +void ETH_ResumeDMATransmission(void) +{ + ETH->DMATPDR = 0; +} + +/** + * @brief Resumes the DMA Transmission by writing to the DmaRxPollDemand + * register: (the data written could be anything). This forces + * the DMA to resume reception. + * @param None + * @retval : None. + */ +void ETH_ResumeDMAReception(void) +{ + ETH->DMARPDR = 0; +} + +/*--------------------------------- PMT ------------------------------------*/ +/** + * @brief Reset Wakeup frame filter register pointer. + * @param None + * @retval : None + */ +void ETH_ResetWakeUpFrameFilterRegisterPointer(void) +{ + /* Resets the Remote Wake-up Frame Filter register pointer to 0x0000 */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_WFFRPR; +} + +/** + * @brief Populates the remote wakeup frame registers. + * @param Buffer: Pointer on remote WakeUp Frame Filter Register buffer + * data (8 words). + * @retval : None + */ +void ETH_SetWakeUpFrameFilterRegister(uint32_t *Buffer) +{ + uint32_t i = 0; + + /* Fill Remote Wake-up Frame Filter register with Buffer data */ + for(i =0; iMACRWUFFR = Buffer[i]; + } +} + +/** + * @brief Enables or disables any unicast packet filtered by the MAC + * (DAF) address recognition to be a wake-up frame. + * @param NewState: new state of the MAC Global Unicast Wake-Up. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_GlobalUnicastWakeUpCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC Global Unicast Wake-Up */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_GU; + } + else + { + /* Disable the MAC Global Unicast Wake-Up */ + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_GU; + } +} + +/** + * @brief Checks whether the specified ETHERNET PMT flag is set or not. + * @param ETH_PMT_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_PMT_FLAG_WUFFRPR : Wake-Up Frame Filter Register Poniter Reset + * @arg ETH_PMT_FLAG_WUFR : Wake-Up Frame Received + * @arg ETH_PMT_FLAG_MPR : Magic Packet Received + * @retval : The new state of ETHERNET PMT Flag (SET or RESET). + */ +FlagStatus ETH_GetPMTFlagStatus(uint32_t ETH_PMT_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_PMT_GET_FLAG(ETH_PMT_FLAG)); + + if ((ETH->MACPMTCSR & ETH_PMT_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Enables or disables the MAC Wake-Up Frame Detection. + * @param NewState: new state of the MAC Wake-Up Frame Detection. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_WakeUpFrameDetectionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC Wake-Up Frame Detection */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_WFE; + } + else + { + /* Disable the MAC Wake-Up Frame Detection */ + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_WFE; + } +} + +/** + * @brief Enables or disables the MAC Magic Packet Detection. + * @param NewState: new state of the MAC Magic Packet Detection. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MagicPacketDetectionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC Magic Packet Detection */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_MPE; + } + else + { + /* Disable the MAC Magic Packet Detection */ + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_MPE; + } +} + +/** + * @brief Enables or disables the MAC Power Down. + * @param NewState: new state of the MAC Power Down. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_PowerDownCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC Power Down */ + /* This puts the MAC in power down mode */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_PD; + } + else + { + /* Disable the MAC Power Down */ + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_PD; + } +} + +/*--------------------------------- MMC ------------------------------------*/ +/** + * @brief Enables or disables the MMC Counter Freeze. + * @param NewState: new state of the MMC Counter Freeze. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MMCCounterFreezeCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MMC Counter Freeze */ + ETH->MMCCR |= ETH_MMCCR_MCF; + } + else + { + /* Disable the MMC Counter Freeze */ + ETH->MMCCR &= ~ETH_MMCCR_MCF; + } +} + +/** + * @brief Enables or disables the MMC Reset On Read. + * @param NewState: new state of the MMC Reset On Read. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MMCResetOnReadCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MMC Counter reset on read */ + ETH->MMCCR |= ETH_MMCCR_ROR; + } + else + { + /* Disable the MMC Counter reset on read */ + ETH->MMCCR &= ~ETH_MMCCR_ROR; + } +} + +/** + * @brief Enables or disables the MMC Counter Stop Rollover. + * @param NewState: new state of the MMC Counter Stop Rollover. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MMCCounterRolloverCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Disable the MMC Counter Stop Rollover */ + ETH->MMCCR &= ~ETH_MMCCR_CSR; + } + else + { + /* Enable the MMC Counter Stop Rollover */ + ETH->MMCCR |= ETH_MMCCR_CSR; + } +} + +/** + * @brief Resets the MMC Counters. + * @param None + * @retval : None + */ +void ETH_MMCCountersReset(void) +{ + /* Resets the MMC Counters */ + ETH->MMCCR |= ETH_MMCCR_CR; +} + +/** + * @brief Enables or disables the specified ETHERNET MMC interrupts. + * @param ETH_MMC_IT: specifies the ETHERNET MMC interrupt + * sources to be enabled or disabled. + * This parameter can be any combination of Tx interrupt or + * any combination of Rx interrupt (but not both)of the following values: + * @arg ETH_MMC_IT_TGF : When Tx good frame counter reaches half the maximum value + * @arg ETH_MMC_IT_TGFMSC: When Tx good multi col counter reaches half the maximum value + * @arg ETH_MMC_IT_TGFSC : When Tx good single col counter reaches half the maximum value + * @arg ETH_MMC_IT_RGUF : When Rx good unicast frames counter reaches half the maximum value + * @arg ETH_MMC_IT_RFAE : When Rx alignment error counter reaches half the maximum value + * @arg ETH_MMC_IT_RFCE : When Rx crc error counter reaches half the maximum value + * @param NewState: new state of the specified ETHERNET MMC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MMCITConfig(uint32_t ETH_MMC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ETH_MMC_IT(ETH_MMC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if ((ETH_MMC_IT & (uint32_t)0x10000000) != (uint32_t)RESET) + { + /* Remove egister mak from IT */ + ETH_MMC_IT &= 0xEFFFFFFF; + + /* ETHERNET MMC Rx interrupts selected */ + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET MMC interrupts */ + ETH->MMCRIMR &=(~(uint32_t)ETH_MMC_IT); + } + else + { + /* Disable the selected ETHERNET MMC interrupts */ + ETH->MMCRIMR |= ETH_MMC_IT; + } + } + else + { + /* ETHERNET MMC Tx interrupts selected */ + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET MMC interrupts */ + ETH->MMCTIMR &=(~(uint32_t)ETH_MMC_IT); + } + else + { + /* Disable the selected ETHERNET MMC interrupts */ + ETH->MMCTIMR |= ETH_MMC_IT; + } + } +} + +/** + * @brief Checks whether the specified ETHERNET MMC IT is set or not. + * @param ETH_MMC_IT: specifies the ETHERNET MMC interrupt. + * This parameter can be one of the following values: + * @arg ETH_MMC_IT_TxFCGC: When Tx good frame counter reaches half the maximum value + * @arg ETH_MMC_IT_TxMCGC: When Tx good multi col counter reaches half the maximum value + * @arg ETH_MMC_IT_TxSCGC: When Tx good single col counter reaches half the maximum value + * @arg ETH_MMC_IT_RxUGFC: When Rx good unicast frames counter reaches half the maximum value + * @arg ETH_MMC_IT_RxAEC : When Rx alignment error counter reaches half the maximum value + * @arg ETH_MMC_IT_RxCEC : When Rx crc error counter reaches half the maximum value + * @retval : The value of ETHERNET MMC IT (SET or RESET). + */ +ITStatus ETH_GetMMCITStatus(uint32_t ETH_MMC_IT) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_MMC_GET_IT(ETH_MMC_IT)); + + if ((ETH_MMC_IT & (uint32_t)0x10000000) != (uint32_t)RESET) + { + /* ETHERNET MMC Rx interrupts selected */ + /* Check if the ETHERNET MMC Rx selected interrupt is enabled and occured */ + if ((((ETH->MMCRIR & ETH_MMC_IT) != (uint32_t)RESET)) && ((ETH->MMCRIMR & ETH_MMC_IT) != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else + { + /* ETHERNET MMC Tx interrupts selected */ + /* Check if the ETHERNET MMC Tx selected interrupt is enabled and occured */ + if ((((ETH->MMCTIR & ETH_MMC_IT) != (uint32_t)RESET)) && ((ETH->MMCRIMR & ETH_MMC_IT) != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + + return bitstatus; +} + +/** + * @brief Get the specified ETHERNET MMC register value. + * @param ETH_MMCReg: specifies the ETHERNET MMC register. + * This parameter can be one of the following values: + * @arg ETH_MMCCR : MMC CR register + * @arg ETH_MMCRIR : MMC RIR register + * @arg ETH_MMCTIR : MMC TIR register + * @arg ETH_MMCRIMR : MMC RIMR register + * @arg ETH_MMCTIMR : MMC TIMR register + * @arg ETH_MMCTGFSCCR : MMC TGFSCCR register + * @arg ETH_MMCTGFMSCCR: MMC TGFMSCCR register + * @arg ETH_MMCTGFCR : MMC TGFCR register + * @arg ETH_MMCRFCECR : MMC RFCECR register + * @arg ETH_MMCRFAECR : MMC RFAECR register + * @arg ETH_MMCRGUFCR : MMC RGUFCRregister + * @retval : The value of ETHERNET MMC Register value. + */ +uint32_t ETH_GetMMCRegister(uint32_t ETH_MMCReg) +{ + /* Check the parameters */ + assert_param(IS_ETH_MMC_REGISTER(ETH_MMCReg)); + + /* Return the selected register value */ + return (*(__IO uint32_t *)(ETH_MAC_BASE + ETH_MMCReg)); +} +/*--------------------------------- PTP ------------------------------------*/ + +/** + * @brief Updated the PTP block for fine correction with the Time Stamp + * Addend register value. + * @param None + * @retval : None + */ +void ETH_EnablePTPTimeStampAddend(void) +{ + /* Enable the PTP block update with the Time Stamp Addend register value */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSARU; +} + +/** + * @brief Enable the PTP Time Stamp interrupt trigger + * @param None + * @retval : None + */ +void ETH_EnablePTPTimeStampInterruptTrigger(void) +{ + /* Enable the PTP target time interrupt */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSITE; +} + +/** + * @brief Updated the PTP system time with the Time Stamp Update register + * value. + * @param None + * @retval : None + */ +void ETH_EnablePTPTimeStampUpdate(void) +{ + /* Enable the PTP system time update with the Time Stamp Update register value */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSSTU; +} + +/** + * @brief Initialize the PTP Time Stamp + * @param None + * @retval : None + */ +void ETH_InitializePTPTimeStamp(void) +{ + /* Initialize the PTP Time Stamp */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSSTI; +} + +/** + * @brief Selects the PTP Update method + * @param UpdateMethod: the PTP Update method + * This parameter can be one of the following values: + * @arg ETH_PTP_FineUpdate : Fine Update method + * @arg ETH_PTP_CoarseUpdate : Coarse Update method + * @retval : None + */ +void ETH_PTPUpdateMethodConfig(uint32_t UpdateMethod) +{ + /* Check the parameters */ + assert_param(IS_ETH_PTP_UPDATE(UpdateMethod)); + + if (UpdateMethod != ETH_PTP_CoarseUpdate) + { + /* Enable the PTP Fine Update method */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSFCU; + } + else + { + /* Disable the PTP Coarse Update method */ + ETH->PTPTSCR &= (~(uint32_t)ETH_PTPTSCR_TSFCU); + } +} + +/** + * @brief Enables or disables the PTP time stamp for transmit and receive frames. + * @param NewState: new state of the PTP time stamp for transmit and receive frames + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_PTPTimeStampCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the PTP time stamp for transmit and receive frames */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSE; + } + else + { + /* Disable the PTP time stamp for transmit and receive frames */ + ETH->PTPTSCR &= (~(uint32_t)ETH_PTPTSCR_TSE); + } +} + +/** + * @brief Checks whether the specified ETHERNET PTP flag is set or not. + * @param ETH_PTP_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_PTP_FLAG_TSARU : Addend Register Update + * @arg ETH_PTP_FLAG_TSITE : Time Stamp Interrupt Trigger Enable + * @arg ETH_PTP_FLAG_TSSTU : Time Stamp Update + * @arg ETH_PTP_FLAG_TSSTI : Time Stamp Initialize + * @retval : The new state of ETHERNET PTP Flag (SET or RESET). + */ +FlagStatus ETH_GetPTPFlagStatus(uint32_t ETH_PTP_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_PTP_GET_FLAG(ETH_PTP_FLAG)); + + if ((ETH->PTPTSCR & ETH_PTP_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Sets the system time Sub-Second Increment value. + * @param SubSecondValue: specifies the PTP Sub-Second Increment Register value. + * @retval : None + */ +void ETH_SetPTPSubSecondIncrement(uint32_t SubSecondValue) +{ + /* Check the parameters */ + assert_param(IS_ETH_PTP_SUBSECOND_INCREMENT(SubSecondValue)); + /* Set the PTP Sub-Second Increment Register */ + ETH->PTPSSIR = SubSecondValue; +} + +/** + * @brief Sets the Time Stamp update sign and values. + * @param Sign: specifies the PTP Time update value sign. + * This parameter can be one of the following values: + * @arg ETH_PTP_PositiveTime : positive time value. + * @arg ETH_PTP_NegativeTime : negative time value. + * @param SecondValue: specifies the PTP Time update second value. + * @param SubSecondValue: specifies the PTP Time update sub-second value. + * this is a 31 bit value. bit32 correspond to the sign. + * @retval : None + */ +void ETH_SetPTPTimeStampUpdate(uint32_t Sign, uint32_t SecondValue, uint32_t SubSecondValue) +{ + /* Check the parameters */ + assert_param(IS_ETH_PTP_TIME_SIGN(Sign)); + assert_param(IS_ETH_PTP_TIME_STAMP_UPDATE_SUBSECOND(SubSecondValue)); + /* Set the PTP Time Update High Register */ + ETH->PTPTSHUR = SecondValue; + + /* Set the PTP Time Update Low Register with sign */ + ETH->PTPTSLUR = Sign | SubSecondValue; +} + +/** + * @brief Sets the Time Stamp Addend value. + * @param Value: specifies the PTP Time Stamp Addend Register value. + * @retval : None + */ +void ETH_SetPTPTimeStampAddend(uint32_t Value) +{ + /* Set the PTP Time Stamp Addend Register */ + ETH->PTPTSAR = Value; +} + +/** + * @brief Sets the Target Time registers values. + * @param HighValue: specifies the PTP Target Time High Register value. + * @param LowValue: specifies the PTP Target Time Low Register value. + * @retval : None + */ +void ETH_SetPTPTargetTime(uint32_t HighValue, uint32_t LowValue) +{ + /* Set the PTP Target Time High Register */ + ETH->PTPTTHR = HighValue; + /* Set the PTP Target Time Low Register */ + ETH->PTPTTLR = LowValue; +} + +/** + * @brief Get the specified ETHERNET PTP register value. + * @param ETH_PTPReg: specifies the ETHERNET PTP register. + * This parameter can be one of the following values: + * @arg ETH_PTPTSCR : Sub-Second Increment Register + * @arg ETH_PTPSSIR : Sub-Second Increment Register + * @arg ETH_PTPTSHR : Time Stamp High Register + * @arg ETH_PTPTSLR : Time Stamp Low Register + * @arg ETH_PTPTSHUR : Time Stamp High Update Register + * @arg ETH_PTPTSLUR : Time Stamp Low Update Register + * @arg ETH_PTPTSAR : Time Stamp Addend Register + * @arg ETH_PTPTTHR : Target Time High Register + * @arg ETH_PTPTTLR : Target Time Low Register + * @retval : The value of ETHERNET PTP Register value. + */ +uint32_t ETH_GetPTPRegister(uint32_t ETH_PTPReg) +{ + /* Check the parameters */ + assert_param(IS_ETH_PTP_REGISTER(ETH_PTPReg)); + + /* Return the selected register value */ + return (*(__IO uint32_t *)(ETH_MAC_BASE + ETH_PTPReg)); +} + +/** + * @brief Initializes the DMA Tx descriptors in chain mode with PTP. + * @param DMATxDescTab: Pointer on the first Tx desc list + * @param DMAPTPTxDescTab: Pointer on the first PTP Tx desc list + * @param TxBuff: Pointer on the first TxBuffer list + * @param TxBuffCount: Number of the used Tx desc in the list + * @retval : None + */ +void ETH_DMAPTPTxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, ETH_DMADESCTypeDef *DMAPTPTxDescTab, uint8_t* TxBuff, uint32_t TxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMATxDesc; + + /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */ + DMATxDescToSet = DMATxDescTab; + DMAPTPTxDescToSet = DMAPTPTxDescTab; + /* Fill each DMATxDesc descriptor with the right values */ + for(i=0; i < TxBuffCount; i++) + { + /* Get the pointer on the ith member of the Tx Desc list */ + DMATxDesc = DMATxDescTab+i; + /* Set Second Address Chained bit and enable PTP */ + DMATxDesc->Status = ETH_DMATxDesc_TCH | ETH_DMATxDesc_TTSE; + + /* Set Buffer1 address pointer */ + DMATxDesc->Buffer1Addr =(uint32_t)(&TxBuff[i*ETH_MAX_PACKET_SIZE]); + + /* Initialize the next descriptor with the Next Desciptor Polling Enable */ + if(i < (TxBuffCount-1)) + { + /* Set next descriptor address register with next descriptor base address */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t)(DMATxDescTab+i+1); + } + else + { + /* For last descriptor, set next descriptor address register equal to the first descriptor base address */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t) DMATxDescTab; + } + /* make DMAPTPTxDescTab points to the same addresses as DMATxDescTab */ + (&DMAPTPTxDescTab[i])->Buffer1Addr = DMATxDesc->Buffer1Addr; + (&DMAPTPTxDescTab[i])->Buffer2NextDescAddr = DMATxDesc->Buffer2NextDescAddr; + } + /* Store on the last DMAPTPTxDescTab desc status record the first list address */ + (&DMAPTPTxDescTab[i-1])->Status = (uint32_t) DMAPTPTxDescTab; + + /* Set Transmit Desciptor List Address Register */ + ETH->DMATDLAR = (uint32_t) DMATxDescTab; +} + +/** + * @brief Initializes the DMA Rx descriptors in chain mode. + * @param DMARxDescTab: Pointer on the first Rx desc list + * @param DMAPTPRxDescTab: Pointer on the first PTP Rx desc list + * @param RxBuff: Pointer on the first RxBuffer list + * @param RxBuffCount: Number of the used Rx desc in the list + * @retval : None + */ +void ETH_DMAPTPRxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, ETH_DMADESCTypeDef *DMAPTPRxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMARxDesc; + + /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */ + DMARxDescToGet = DMARxDescTab; + DMAPTPRxDescToGet = DMAPTPRxDescTab; + /* Fill each DMARxDesc descriptor with the right values */ + for(i=0; i < RxBuffCount; i++) + { + /* Get the pointer on the ith member of the Rx Desc list */ + DMARxDesc = DMARxDescTab+i; + /* Set Own bit of the Rx descriptor Status */ + DMARxDesc->Status = ETH_DMARxDesc_OWN; + + /* Set Buffer1 size and Second Address Chained bit */ + DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_MAX_PACKET_SIZE; + /* Set Buffer1 address pointer */ + DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff[i*ETH_MAX_PACKET_SIZE]); + + /* Initialize the next descriptor with the Next Desciptor Polling Enable */ + if(i < (RxBuffCount-1)) + { + /* Set next descriptor address register with next descriptor base address */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab+i+1); + } + else + { + /* For last descriptor, set next descriptor address register equal to the first descriptor base address */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab); + } + /* Make DMAPTPRxDescTab points to the same addresses as DMARxDescTab */ + (&DMAPTPRxDescTab[i])->Buffer1Addr = DMARxDesc->Buffer1Addr; + (&DMAPTPRxDescTab[i])->Buffer2NextDescAddr = DMARxDesc->Buffer2NextDescAddr; + } + /* Store on the last DMAPTPRxDescTab desc status record the first list address */ + (&DMAPTPRxDescTab[i-1])->Status = (uint32_t) DMAPTPRxDescTab; + + /* Set Receive Desciptor List Address Register */ + ETH->DMARDLAR = (uint32_t) DMARxDescTab; +} + +/** + * @brief Transmits a packet, from application buffer, pointed by ppkt with + * Time Stamp values. + * @param ppkt: pointer to application packet buffer to transmit. + * @param FrameLength: Tx Packet size. + * @param PTPTxTab: Pointer on the first PTP Tx table to store Time stamp values. + * @retval : ETH_ERROR: in case of Tx desc owned by DMA + * ETH_SUCCESS: for correct transmission + */ +uint32_t ETH_HandlePTPTxPkt(uint8_t *ppkt, uint16_t FrameLength, uint32_t *PTPTxTab) +{ + uint32_t offset = 0, timeout = 0; + /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */ + if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (uint32_t)RESET) + { + /* Return ERROR: OWN bit set */ + return ETH_ERROR; + } + /* Copy the frame to be sent into memory pointed by the current ETHERNET DMA Tx descriptor */ + for(offset=0; offsetBuffer1Addr) + offset)) = (*(ppkt + offset)); + } + /* Setting the Frame Length: bits[12:0] */ + DMATxDescToSet->ControlBufferSize = (FrameLength & (uint32_t)0x1FFF); + /* Setting the last segment and first segment bits (in this case a frame is transmitted in one descriptor) */ + DMATxDescToSet->Status |= ETH_DMATxDesc_LS | ETH_DMATxDesc_FS; + /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMATxDescToSet->Status |= ETH_DMATxDesc_OWN; + /* When Tx Buffer unavailable flag is set: clear it and resume transmission */ + if ((ETH->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET) + { + /* Clear TBUS ETHERNET DMA flag */ + ETH->DMASR = ETH_DMASR_TBUS; + /* Resume DMA transmission*/ + ETH->DMATPDR = 0; + } + /* Wait for ETH_DMATxDesc_TTSS flag to be set */ + do + { + timeout++; + } while (!(DMATxDescToSet->Status & ETH_DMATxDesc_TTSS) && (timeout < 0xFFFF)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_READ_TO) + { + return ETH_ERROR; + } + /* Clear the DMATxDescToSet status register TTSS flag */ + DMATxDescToSet->Status &= ~ETH_DMATxDesc_TTSS; + *PTPTxTab++ = DMATxDescToSet->Buffer1Addr; + *PTPTxTab = DMATxDescToSet->Buffer2NextDescAddr; + /* Update the ENET DMA current descriptor */ + /* Chained Mode */ + if((DMATxDescToSet->Status & ETH_DMATxDesc_TCH) != (uint32_t)RESET) + { + /* Selects the next DMA Tx descriptor list for next buffer read */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) (DMAPTPTxDescToSet->Buffer2NextDescAddr); + if(DMAPTPTxDescToSet->Status != 0) + { + DMAPTPTxDescToSet = (ETH_DMADESCTypeDef*) (DMAPTPTxDescToSet->Status); + } + else + { + DMAPTPTxDescToSet++; + } + } + else /* Ring Mode */ + { + if((DMATxDescToSet->Status & ETH_DMATxDesc_TER) != (uint32_t)RESET) + { + /* Selects the next DMA Tx descriptor list for next buffer read: this will + be the first Tx descriptor in this case */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) (ETH->DMATDLAR); + DMAPTPTxDescToSet = (ETH_DMADESCTypeDef*) (ETH->DMATDLAR); + } + else + { + /* Selects the next DMA Tx descriptor list for next buffer read */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) ((uint32_t)DMATxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + DMAPTPTxDescToSet = (ETH_DMADESCTypeDef*) ((uint32_t)DMAPTPTxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** + * @brief Receives a packet and copies it to memory pointed by ppkt with + * Time Stamp values. + * @param ppkt: pointer to application packet receive buffer. + * @param PTPRxTab: Pointer on the first PTP Rx table to store Time stamp values. + * @retval : ETH_ERROR: if there is error in reception + * framelength: received packet size if packet reception is correct + */ +uint32_t ETH_HandlePTPRxPkt(uint8_t *ppkt, uint32_t *PTPRxTab) +{ + uint32_t offset = 0, framelength = 0; + /* Check if the descriptor is owned by the ENET or CPU */ + if((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) != (uint32_t)RESET) + { + /* Return error: OWN bit set */ + return ETH_ERROR; + } + if(((DMARxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)) + { + /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */ + framelength = ((DMARxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARxDesc_FrameLengthShift) - 4; + /* Copy the received frame into buffer from memory pointed by the current ETHERNET DMA Rx descriptor */ + for(offset=0; offsetBuffer1Addr) + offset)); + } + } + else + { + /* Return ERROR */ + framelength = ETH_ERROR; + } + /* When Rx Buffer unavailable flag is set: clear it and resume reception */ + if ((ETH->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET) + { + /* Clear RBUS ETHERNET DMA flag */ + ETH->DMASR = ETH_DMASR_RBUS; + /* Resume DMA reception */ + ETH->DMARPDR = 0; + } + *PTPRxTab++ = DMARxDescToGet->Buffer1Addr; + *PTPRxTab = DMARxDescToGet->Buffer2NextDescAddr; + /* Set Own bit of the Rx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMARxDescToGet->Status |= ETH_DMARxDesc_OWN; + /* Update the ETHERNET DMA global Rx descriptor with next Rx decriptor */ + /* Chained Mode */ + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RCH) != (uint32_t)RESET) + { + /* Selects the next DMA Rx descriptor list for next buffer read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMAPTPRxDescToGet->Buffer2NextDescAddr); + if(DMAPTPRxDescToGet->Status != 0) + { + DMAPTPRxDescToGet = (ETH_DMADESCTypeDef*) (DMAPTPRxDescToGet->Status); + } + else + { + DMAPTPRxDescToGet++; + } + } + else /* Ring Mode */ + { + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RER) != (uint32_t)RESET) + { + /* Selects the first DMA Rx descriptor for next buffer to read: last Rx descriptor was used */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (ETH->DMARDLAR); + } + else + { + /* Selects the next DMA Rx descriptor list for next buffer to read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) ((uint32_t)DMARxDescToGet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + /* Return Frame Length/ERROR */ + return (framelength); +} +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/uip/clock-arch.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/uip/clock-arch.c new file mode 100644 index 00000000..1e213136 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/uip/clock-arch.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: clock-arch.c,v 1.2 2006/06/12 08:00:31 adam Exp $ + */ + +/** + * \file + * Implementation of architecture-specific clock functionality + * \author + * Adam Dunkels + */ + +#include "clock-arch.h" +#include "boot.h" + +/*---------------------------------------------------------------------------*/ +clock_time_t +clock_time(void) +{ + return (clock_time_t)TimerGet(); +} +/*---------------------------------------------------------------------------*/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/uip/clock-arch.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/uip/clock-arch.h new file mode 100644 index 00000000..aa97f0e7 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/uip/clock-arch.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: clock-arch.h,v 1.2 2006/06/12 08:00:31 adam Exp $ + */ + +#ifndef __CLOCK_ARCH_H__ +#define __CLOCK_ARCH_H__ + +typedef int clock_time_t; +#define CLOCK_CONF_SECOND 1000 + +#endif /* __CLOCK_ARCH_H__ */ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/uip/netdev.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/uip/netdev.c new file mode 100644 index 00000000..09d0d2a7 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/uip/netdev.c @@ -0,0 +1,451 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Author: Adam Dunkels + * + * $Id: netdev.c,v 1.8 2006/06/07 08:39:58 adam Exp $ + */ + + +/*---------------------------------------------------------------------------*/ +#include "uip.h" +#include "uip_arp.h" +#include "boot.h" +#include "stm32f4xx.h" /* STM32 registers */ +#include "stm32f4xx_conf.h" /* STM32 peripheral drivers */ +#include "stm32_eth.h" /* STM32 ethernet library */ +#include /* for memcpy */ + + +/*---------------------------------------------------------------------------*/ +#define NETDEV_DEFAULT_MACADDR0 (0x08) +#define NETDEV_DEFAULT_MACADDR1 (0x00) +#define NETDEV_DEFAULT_MACADDR2 (0x27) +#define NETDEV_DEFAULT_MACADDR3 (0x69) +#define NETDEV_DEFAULT_MACADDR4 (0x5B) +#define NETDEV_DEFAULT_MACADDR5 (0x45) + + +/*---------------------------------------------------------------------------*/ +static void netdev_TxDscrInit(void); +static void netdev_RxDscrInit(void); + +/*---------------------------------------------------------------------------*/ +typedef union _TranDesc0_t +{ + uint32_t Data; + struct { + uint32_t DB : 1; + uint32_t UF : 1; + uint32_t ED : 1; + uint32_t CC : 4; + uint32_t VF : 1; + uint32_t EC : 1; + uint32_t LC : 1; + uint32_t NC : 1; + uint32_t LSC : 1; + uint32_t IPE : 1; + uint32_t FF : 1; + uint32_t JT : 1; + uint32_t ES : 1; + uint32_t IHE : 1; + uint32_t : 3; + uint32_t TCH : 1; + uint32_t TER : 1; + uint32_t CIC : 2; + uint32_t : 2; + uint32_t DP : 1; + uint32_t DC : 1; + uint32_t FS : 1; + uint32_t LSEG : 1; + uint32_t IC : 1; + uint32_t OWN : 1; + }; +} TranDesc0_t, * pTranDesc0_t; + +typedef union _TranDesc1_t +{ + uint32_t Data; + struct { + uint32_t TBS1 :13; + uint32_t : 3; + uint32_t TBS2 :12; + uint32_t : 3; + }; +} TranDesc1_t, * pTranDesc1_t; + +typedef union _RecDesc0_t +{ + uint32_t Data; + struct { + uint32_t RMAM_PCE : 1; + uint32_t CE : 1; + uint32_t DE : 1; + uint32_t RE : 1; + uint32_t RWT : 1; + uint32_t FT : 1; + uint32_t LC : 1; + uint32_t IPHCE : 1; + uint32_t LS : 1; + uint32_t FS : 1; + uint32_t VLAN : 1; + uint32_t OE : 1; + uint32_t LE : 1; + uint32_t SAF : 1; + uint32_t DERR : 1; + uint32_t ES : 1; + uint32_t FL :14; + uint32_t AFM : 1; + uint32_t OWN : 1; + }; +} RecDesc0_t, * pRecDesc0_t; + +typedef union _recDesc1_t +{ + uint32_t Data; + struct { + uint32_t RBS1 :13; + uint32_t : 1; + uint32_t RCH : 1; + uint32_t RER : 1; + uint32_t RBS2 :14; + uint32_t DIC : 1; + }; +} RecDesc1_t, * pRecDesc1_t; + +typedef union _EnetDmaDesc_t +{ + uint32_t Data[4]; + // Rx DMA descriptor + struct + { + RecDesc0_t RxDesc0; + RecDesc1_t RxDesc1; + uint32_t * pBuffer; + union + { + uint32_t * pBuffer2; + union _EnetDmaDesc_t * pEnetDmaNextDesc; + }; + } Rx; + // Tx DMA descriptor + struct + { + TranDesc0_t TxDesc0; + TranDesc1_t TxDesc1; + uint32_t * pBuffer1; + union + { + uint32_t * pBuffer2; + union _EnetDmaDesc_t * pEnetDmaNextDesc; + }; + } Tx; +} EnetDmaDesc_t, * pEnetDmaDesc_t; + + +/*---------------------------------------------------------------------------*/ +uint8_t RxBuff[UIP_CONF_BUFFER_SIZE] __attribute__ ((aligned (4))); +uint8_t TxBuff[UIP_CONF_BUFFER_SIZE] __attribute__ ((aligned (4))); + +EnetDmaDesc_t EnetDmaRx __attribute__((aligned (128))); +EnetDmaDesc_t EnetDmaTx __attribute__ ((aligned (128))); + + +/*---------------------------------------------------------------------------*/ +void netdev_init(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + ETH_InitTypeDef ETH_InitStructure; + + /* Enable ETHERNET clocks */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx | + RCC_AHB1Periph_ETH_MAC_Rx | RCC_AHB1Periph_ETH_MAC_PTP, ENABLE); + + + /* Enable GPIOs clocks */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | + RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOG, ENABLE); + + /* Enable SYSCFG clock */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); + /*Select RMII Interface*/ + SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII); + + /* ETHERNET pins configuration */ + /* PA + ETH_RMII_REF_CLK: PA1 + ETH_RMII_MDIO: PA2 + ETH_RMII_MDINT: PA3 + ETH_RMII_CRS_DV: PA7 + */ + + /* Configure PA1, PA2, PA3 and PA7*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + /* Connect PA1, PA2, PA3 and PA7 to ethernet module*/ + GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH); + + /* PB + ETH_RMII_TX_EN: PG11 + */ + + /* Configure PG11*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOG, &GPIO_InitStructure); + + /* Connect PG11 to ethernet module*/ + GPIO_PinAFConfig(GPIOG, GPIO_PinSource11, GPIO_AF_ETH); + + /* PC + ETH_RMII_MDC: PC1 + ETH_RMII_RXD0: PC4 + ETH_RMII_RXD1: PC5 + */ + + /* Configure PC1, PC4 and PC5*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + /* Connect PC1, PC4 and PC5 to ethernet module*/ + GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH); + + /* PG + ETH_RMII_TXD0: PG13 + ETH_RMII_TXD1: PG14 + */ + + /* Configure PG13 and PG14*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOG, &GPIO_InitStructure); + + /* Connect PG13 and PG14 to ethernet module*/ + GPIO_PinAFConfig(GPIOG, GPIO_PinSource13, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOG, GPIO_PinSource14, GPIO_AF_ETH); + + /* Reset ETHERNET on AHB Bus */ + ETH_DeInit(); + + /* Software reset */ + ETH_SoftwareReset(); + + /* Wait for software reset */ + while(ETH_GetSoftwareResetStatus()==SET); + + /* ETHERNET Configuration ------------------------------------------------------*/ + /* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */ + ETH_StructInit(Ð_InitStructure); + + /* Fill ETH_InitStructure parametrs */ + /*------------------------ MAC -----------------------------------*/ + ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable ; + ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable; + ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable; + ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable; + ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Enable; + ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable; + ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable; + ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect; + ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect; + ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex; + ETH_InitStructure.ETH_Speed = ETH_Speed_100M; + + unsigned int PhyAddr; + union { + uint32_t HI_LO; + struct + { + uint16_t LO; + uint16_t HI; + }; + } PHYID; + for(PhyAddr = 0; 32 > PhyAddr; PhyAddr++) + { + // datasheet for the ks8721bl ethernet controller (http://www.micrel.com/_PDF/Ethernet/datasheets/ks8721bl-sl.pdf) + // page 20 --> PHY Identifier 1 and 2 + PHYID.HI = ETH_ReadPHYRegister(PhyAddr,2); // 0x0022 + PHYID.LO = ETH_ReadPHYRegister(PhyAddr,3); // 0x1619 + if ((0x00221619 == PHYID.HI_LO) || (0x0007C0F1 == PHYID.HI_LO)) + break; + } + if (32 < PhyAddr) + { + ASSERT_RT(BLT_FALSE); + } + /* Configure Ethernet */ + if(0 == ETH_Init(Ð_InitStructure, PhyAddr)) + { + ASSERT_RT(BLT_FALSE); + } + + netdev_TxDscrInit(); + netdev_RxDscrInit(); + ETH_Start(); +} + + +/*---------------------------------------------------------------------------*/ +void netdev_init_mac(void) +{ + struct uip_eth_addr macAddress; + + /* set the default MAC address */ + macAddress.addr[0] = NETDEV_DEFAULT_MACADDR0; + macAddress.addr[1] = NETDEV_DEFAULT_MACADDR1; + macAddress.addr[2] = NETDEV_DEFAULT_MACADDR2; + macAddress.addr[3] = NETDEV_DEFAULT_MACADDR3; + macAddress.addr[4] = NETDEV_DEFAULT_MACADDR4; + macAddress.addr[5] = NETDEV_DEFAULT_MACADDR5; + uip_setethaddr(macAddress); +} + + +/*---------------------------------------------------------------------------*/ +unsigned int netdev_read(void) +{ + uint32_t size; + /*check for validity*/ + if(0 == EnetDmaRx.Rx.RxDesc0.OWN) + { + /*Get the size of the packet*/ + size = EnetDmaRx.Rx.RxDesc0.FL; // CRC + memcpy(uip_buf, RxBuff, size); //string.h library*/ + } + else + { + return 0; + } + /* Give the buffer back to ENET */ + EnetDmaRx.Rx.RxDesc0.OWN = 1; + /* Start the receive operation */ + ETH->DMARPDR = 1; + /* Return no error */ + return size; +} + + +/*---------------------------------------------------------------------------*/ +void netdev_send(void) +{ + while(EnetDmaTx.Tx.TxDesc0.OWN); + + /* Copy the application buffer to the driver buffer + Using this MEMCOPY_L2L_BY4 makes the copy routine faster + than memcpy */ + memcpy(TxBuff, uip_buf, uip_len); + + /* Assign ENET address to Temp Tx Array */ + EnetDmaTx.Tx.pBuffer1 = (uint32_t *)TxBuff; + + /* Setting the Frame Length*/ + EnetDmaTx.Tx.TxDesc0.Data = 0; + EnetDmaTx.Tx.TxDesc0.TCH = 1; + EnetDmaTx.Tx.TxDesc0.LSEG = 1; + EnetDmaTx.Tx.TxDesc0.FS = 1; + EnetDmaTx.Tx.TxDesc0.DC = 0; + EnetDmaTx.Tx.TxDesc0.DP = 0; + + EnetDmaTx.Tx.TxDesc1.Data = 0; + EnetDmaTx.Tx.TxDesc1.TBS1 = (uip_len&0xFFF); + + /* Start the ENET by setting the VALID bit in dmaPackStatus of current descr*/ + EnetDmaTx.Tx.TxDesc0.OWN = 1; + + /* Start the transmit operation */ + ETH->DMATPDR = 1; +} + + +/*---------------------------------------------------------------------------*/ +static void netdev_RxDscrInit(void) +{ + /* Initialization */ + /* Assign temp Rx array to the ENET buffer */ + EnetDmaRx.Rx.pBuffer = (uint32_t *)RxBuff; + + /* Initialize RX ENET Status and control */ + EnetDmaRx.Rx.RxDesc0.Data = 0; + + /* Initialize the next descriptor- In our case its single descriptor */ + EnetDmaRx.Rx.pEnetDmaNextDesc = &EnetDmaRx; + + EnetDmaRx.Rx.RxDesc1.Data = 0; + EnetDmaRx.Rx.RxDesc1.RER = 0; // end of ring + EnetDmaRx.Rx.RxDesc1.RCH = 1; // end of ring + + /* Set the max packet size */ + EnetDmaRx.Rx.RxDesc1.RBS1 = UIP_CONF_BUFFER_SIZE; + + /* Setting the VALID bit */ + EnetDmaRx.Rx.RxDesc0.OWN = 1; + /* Setting the RX NEXT Descriptor Register inside the ENET */ + ETH->DMARDLAR = (uint32_t)&EnetDmaRx; +} + + +/*---------------------------------------------------------------------------*/ +static void netdev_TxDscrInit(void) +{ + /* ENET Start Address */ + EnetDmaTx.Tx.pBuffer1 = (uint32_t *)TxBuff; + + /* Next Descriptor Address */ + EnetDmaTx.Tx.pEnetDmaNextDesc = &EnetDmaTx; + + /* Initialize ENET status and control */ + EnetDmaTx.Tx.TxDesc0.TCH = 1; + EnetDmaTx.Tx.TxDesc0.Data = 0; + EnetDmaTx.Tx.TxDesc1.Data = 0; + /* Tx next set to Tx descriptor base */ + ETH->DMATDLAR = (uint32_t)&EnetDmaTx; + +} diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/uip/netdev.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/uip/netdev.h new file mode 100644 index 00000000..4ea59ce5 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/uip/netdev.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Adam Dunkels. + * 4. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: netdev.h,v 1.1 2002/01/10 06:22:56 adam Exp $ + * + */ + +#ifndef __NETDEV_H__ +#define __NETDEV_H__ + +void netdev_init(void); +void netdev_init_mac(void); +unsigned int netdev_read(void); +void netdev_send(void); + +#endif /* __NETDEV_H__ */ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/uip/uip-conf.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/uip/uip-conf.h new file mode 100644 index 00000000..fd9ba0dd --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/uip/uip-conf.h @@ -0,0 +1,151 @@ +/** + * \addtogroup uipopt + * @{ + */ + +/** + * \name Project-specific configuration options + * @{ + * + * uIP has a number of configuration options that can be overridden + * for each project. These are kept in a project-specific uip-conf.h + * file and all configuration names have the prefix UIP_CONF. + */ + +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: uip-conf.h,v 1.6 2006/06/12 08:00:31 adam Exp $ + */ + +/** + * \file + * An example uIP configuration file + * \author + * Adam Dunkels + */ + +#ifndef __UIP_CONF_H__ +#define __UIP_CONF_H__ + + +/** + * 8 bit datatype + * + * This typedef defines the 8-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef unsigned char u8_t; + +/** + * 16 bit datatype + * + * This typedef defines the 16-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef unsigned short u16_t; + +/** + * Statistics datatype + * + * This typedef defines the dataype used for keeping statistics in + * uIP. + * + * \hideinitializer + */ +typedef unsigned short uip_stats_t; + +/** + * Maximum number of TCP connections. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_CONNECTIONS 1 + +/** + * Maximum number of listening TCP ports. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_LISTENPORTS 1 + +/** + * uIP buffer size. + * + * \hideinitializer + */ +#define UIP_CONF_BUFFER_SIZE 1600 + +/** + * CPU byte order. + * + * \hideinitializer + */ +#define UIP_CONF_BYTE_ORDER LITTLE_ENDIAN + +/** + * Logging on or off + * + * \hideinitializer + */ +#define UIP_CONF_LOGGING 0 + +/** + * UDP support on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP 0 + +/** + * UDP checksums on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP_CHECKSUMS 1 + +/** + * uIP statistics on or off + * + * \hideinitializer + */ +#define UIP_CONF_STATISTICS 0 + +/* Here we include the header file for the application(s) we use in + our project. */ +#include "boot.h" +#include "net.h" + +#endif /* __UIP_CONF_H__ */ + +/** @} */ +/** @} */ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/bin/demoprog_olimex_stm32e407.elf b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/bin/demoprog_olimex_stm32e407.elf index 7c2bf8ff..2764b8f5 100644 Binary files a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/bin/demoprog_olimex_stm32e407.elf and b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/bin/demoprog_olimex_stm32e407.elf differ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/bin/demoprog_olimex_stm32e407.map b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/bin/demoprog_olimex_stm32e407.map index 84fd44ac..53443c5b 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/bin/demoprog_olimex_stm32e407.map +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/bin/demoprog_olimex_stm32e407.map @@ -1,5 +1,7 @@ Archive member included because of file (symbol) +C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + THUMB Debug/../../obj/netdev.o (memcpy) C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) (__do_debug_operation_mempoll) C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) @@ -961,8 +963,6 @@ Discarded input sections 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_AHB3PeriphClockCmd 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o - .text.RCC_AHB1PeriphResetCmd - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_AHB2PeriphResetCmd 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_AHB3PeriphResetCmd @@ -1297,24 +1297,10 @@ Discarded input sections 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_syscfg.o .text.SYSCFG_EXTILineConfig 0x00000000 0x40 THUMB Debug/../../obj/stm32f4xx_syscfg.o - .text.SYSCFG_ETH_MediaInterfaceConfig - 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_syscfg.o .text.SYSCFG_CompensationCellCmd 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_syscfg.o .text.SYSCFG_GetCompensationCellStatus 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_syscfg.o - .debug_frame 0x00000000 0x88 THUMB Debug/../../obj/stm32f4xx_syscfg.o - .debug_info 0x00000000 0x2b7 THUMB Debug/../../obj/stm32f4xx_syscfg.o - .debug_abbrev 0x00000000 0x177 THUMB Debug/../../obj/stm32f4xx_syscfg.o - .debug_loc 0x00000000 0xe6 THUMB Debug/../../obj/stm32f4xx_syscfg.o - .debug_aranges - 0x00000000 0x48 THUMB Debug/../../obj/stm32f4xx_syscfg.o - .debug_ranges 0x00000000 0x38 THUMB Debug/../../obj/stm32f4xx_syscfg.o - .debug_line 0x00000000 0x27d THUMB Debug/../../obj/stm32f4xx_syscfg.o - .debug_str 0x00000000 0x354 THUMB Debug/../../obj/stm32f4xx_syscfg.o - .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_syscfg.o - .ARM.attributes - 0x00000000 0x33 THUMB Debug/../../obj/stm32f4xx_syscfg.o .text 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_tim.o .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_tim.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_tim.o @@ -1593,6 +1579,209 @@ Discarded input sections .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_wwdg.o .ARM.attributes 0x00000000 0x33 THUMB Debug/../../obj/stm32f4xx_wwdg.o + .text 0x00000000 0x0 THUMB Debug/../../obj/stm32_eth.o + .data 0x00000000 0x0 THUMB Debug/../../obj/stm32_eth.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_HandleTxPkt + 0x00000000 0x12c THUMB Debug/../../obj/stm32_eth.o + .text.ETH_HandleRxPkt + 0x00000000 0x120 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DropRxPkt + 0x00000000 0x64 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_PHYLoopBackCmd + 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetFlowControlBusyStatus + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_InitiatePauseControlFrame + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_BackPressureActivationCmd + 0x00000000 0x28 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetMACFlagStatus + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetMACITStatus + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MACITConfig + 0x00000000 0x24 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MACAddressConfig + 0x00000000 0x34 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetMACAddress + 0x00000000 0x34 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MACAddressPerfectFilterCmd + 0x00000000 0x28 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MACAddressFilterConfig + 0x00000000 0x1c THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MACAddressMaskBytesFilterConfig + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescChainInit + 0x00000000 0xc4 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescRingInit + 0x00000000 0xc4 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetDMATxDescFlagStatus + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetDMATxDescCollisionCount + 0x00000000 0x8 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_SetDMATxDescOwnBit + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescTransmitITConfig + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescFrameSegmentConfig + 0x00000000 0x8 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescChecksumInsertionConfig + 0x00000000 0x8 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescCRCCmd + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescEndOfRingCmd + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescSecondAddressChainedCmd + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescShortFramePaddingCmd + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescTimeStampCmd + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATxDescBufferSizeConfig + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMARxDescChainInit + 0x00000000 0xdc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMARxDescRingInit + 0x00000000 0x14c THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetDMARxDescFlagStatus + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_SetDMARxDescOwnBit + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetDMARxDescFrameLength + 0x00000000 0x8 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetRxPktSize + 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMARxDescReceiveITConfig + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMARxDescEndOfRingCmd + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMARxDescSecondAddressChainedCmd + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetDMARxDescBufferSize + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetDMAFlagStatus + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMAClearFlag + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetDMAITStatus + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMAClearITPendingBit + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetTransmitProcessState + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetReceiveProcessState + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetFlushTransmitFIFOStatus + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMAITConfig + 0x00000000 0x24 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetDMAOverflowStatus + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetRxOverflowMissedFrameCounter + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetBufferUnavailableMissedFrameCounter + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetCurrentTxDescStartAddress + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetCurrentRxDescStartAddress + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetCurrentTxBufferAddress + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetCurrentRxBufferAddress + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_ResumeDMATransmission + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_ResumeDMAReception + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_ResetWakeUpFrameFilterRegisterPointer + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_SetWakeUpFrameFilterRegister + 0x00000000 0x2c THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GlobalUnicastWakeUpCmd + 0x00000000 0x28 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetPMTFlagStatus + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_WakeUpFrameDetectionCmd + 0x00000000 0x28 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MagicPacketDetectionCmd + 0x00000000 0x28 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_PowerDownCmd + 0x00000000 0x28 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MMCCounterFreezeCmd + 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MMCResetOnReadCmd + 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MMCCounterRolloverCmd + 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MMCCountersReset + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MMCITConfig + 0x00000000 0x64 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetMMCITStatus + 0x00000000 0x60 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetMMCRegister + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_EnablePTPTimeStampAddend + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_EnablePTPTimeStampInterruptTrigger + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_EnablePTPTimeStampUpdate + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_InitializePTPTimeStamp + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_PTPUpdateMethodConfig + 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_PTPTimeStampCmd + 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetPTPFlagStatus + 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_SetPTPSubSecondIncrement + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_SetPTPTimeStampUpdate + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_SetPTPTimeStampAddend + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_SetPTPTargetTime + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetPTPRegister + 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMAPTPTxDescChainInit + 0x00000000 0x120 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMAPTPRxDescChainInit + 0x00000000 0x12c THUMB Debug/../../obj/stm32_eth.o + .text.ETH_HandlePTPTxPkt + 0x00000000 0x1dc THUMB Debug/../../obj/stm32_eth.o + .text.ETH_HandlePTPRxPkt + 0x00000000 0x14c THUMB Debug/../../obj/stm32_eth.o + .bss.DMARxDescToGet + 0x00000000 0x4 THUMB Debug/../../obj/stm32_eth.o + .bss.DMAPTPTxDescToSet + 0x00000000 0x4 THUMB Debug/../../obj/stm32_eth.o + .bss.DMATxDescToSet + 0x00000000 0x4 THUMB Debug/../../obj/stm32_eth.o + .bss.DMAPTPRxDescToGet + 0x00000000 0x4 THUMB Debug/../../obj/stm32_eth.o + .text 0x00000000 0x0 THUMB Debug/../../obj/clock-arch.o + .data 0x00000000 0x0 THUMB Debug/../../obj/clock-arch.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/clock-arch.o + .text.clock_time + 0x00000000 0x8 THUMB Debug/../../obj/clock-arch.o + .debug_frame 0x00000000 0x2c THUMB Debug/../../obj/clock-arch.o + .debug_info 0x00000000 0xcf THUMB Debug/../../obj/clock-arch.o + .debug_abbrev 0x00000000 0x8b THUMB Debug/../../obj/clock-arch.o + .debug_loc 0x00000000 0x20 THUMB Debug/../../obj/clock-arch.o + .debug_aranges + 0x00000000 0x20 THUMB Debug/../../obj/clock-arch.o + .debug_ranges 0x00000000 0x10 THUMB Debug/../../obj/clock-arch.o + .debug_line 0x00000000 0x14e THUMB Debug/../../obj/clock-arch.o + .debug_str 0x00000000 0x1c5 THUMB Debug/../../obj/clock-arch.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/clock-arch.o + .ARM.attributes + 0x00000000 0x33 THUMB Debug/../../obj/clock-arch.o + .text 0x00000000 0x0 THUMB Debug/../../obj/netdev.o + .data 0x00000000 0x0 THUMB Debug/../../obj/netdev.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/netdev.o .text 0x00000000 0x0 THUMB Debug/../../obj/boot.o .data 0x00000000 0x0 THUMB Debug/../../obj/boot.o .bss 0x00000000 0x0 THUMB Debug/../../obj/boot.o @@ -1626,6 +1815,119 @@ Discarded input sections .text 0x00000000 0x0 THUMB Debug/../../obj/vectors.o .data 0x00000000 0x0 THUMB Debug/../../obj/vectors.o .bss 0x00000000 0x0 THUMB Debug/../../obj/vectors.o + .text 0x00000000 0x0 THUMB Debug/../../obj/net.o + .data 0x00000000 0x0 THUMB Debug/../../obj/net.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/net.o + .text 0x00000000 0x0 THUMB Debug/../../obj/uip.o + .data 0x00000000 0x0 THUMB Debug/../../obj/uip.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/uip.o + .text.uip_setipid + 0x00000000 0xc THUMB Debug/../../obj/uip.o + .text.uip_unlisten + 0x00000000 0x38 THUMB Debug/../../obj/uip.o + .text.uip_connect + 0x00000000 0x108 THUMB Debug/../../obj/uip.o + .text.uip_udpchksum + 0x00000000 0xc THUMB Debug/../../obj/uip.o + .text.uip_chksum + 0x00000000 0x18 THUMB Debug/../../obj/uip.o + .text.uip_send + 0x00000000 0x2c THUMB Debug/../../obj/uip.o + .text 0x00000000 0x0 THUMB Debug/../../obj/uip_arp.o + .data 0x00000000 0x0 THUMB Debug/../../obj/uip_arp.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/uip_arp.o + .text.uip_arp_init + 0x00000000 0x40 THUMB Debug/../../obj/uip_arp.o + .text 0x00000000 0x0 THUMB Debug/../../obj/uip_timer.o + .data 0x00000000 0x0 THUMB Debug/../../obj/uip_timer.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/uip_timer.o + .text.timer_set + 0x00000000 0x10 THUMB Debug/../../obj/uip_timer.o + .text.timer_reset + 0x00000000 0xc THUMB Debug/../../obj/uip_timer.o + .text.timer_restart + 0x00000000 0xc THUMB Debug/../../obj/uip_timer.o + .text.timer_expired + 0x00000000 0x18 THUMB Debug/../../obj/uip_timer.o + .debug_frame 0x00000000 0x74 THUMB Debug/../../obj/uip_timer.o + .debug_info 0x00000000 0x144 THUMB Debug/../../obj/uip_timer.o + .debug_abbrev 0x00000000 0xf0 THUMB Debug/../../obj/uip_timer.o + .debug_loc 0x00000000 0xdb THUMB Debug/../../obj/uip_timer.o + .debug_aranges + 0x00000000 0x38 THUMB Debug/../../obj/uip_timer.o + .debug_ranges 0x00000000 0x28 THUMB Debug/../../obj/uip_timer.o + .debug_line 0x00000000 0x127 THUMB Debug/../../obj/uip_timer.o + .debug_str 0x00000000 0x189 THUMB Debug/../../obj/uip_timer.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/uip_timer.o + .ARM.attributes + 0x00000000 0x33 THUMB Debug/../../obj/uip_timer.o + .text 0x00000000 0x0 THUMB Debug/../../obj/uip-fw.o + .data 0x00000000 0x0 THUMB Debug/../../obj/uip-fw.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/uip-fw.o + .text.uip_fw_init + 0x00000000 0x34 THUMB Debug/../../obj/uip-fw.o + .text.uip_fw_output + 0x00000000 0xe8 THUMB Debug/../../obj/uip-fw.o + .text.uip_fw_forward + 0x00000000 0x1dc THUMB Debug/../../obj/uip-fw.o + .text.uip_fw_register + 0x00000000 0x10 THUMB Debug/../../obj/uip-fw.o + .text.uip_fw_default + 0x00000000 0xc THUMB Debug/../../obj/uip-fw.o + .text.uip_fw_periodic + 0x00000000 0x28 THUMB Debug/../../obj/uip-fw.o + .bss.netifs 0x00000000 0x4 THUMB Debug/../../obj/uip-fw.o + .bss.defaultnetif + 0x00000000 0x4 THUMB Debug/../../obj/uip-fw.o + .bss.fwcache 0x00000000 0x1c THUMB Debug/../../obj/uip-fw.o + .debug_frame 0x00000000 0x90 THUMB Debug/../../obj/uip-fw.o + .debug_info 0x00000000 0x6f7 THUMB Debug/../../obj/uip-fw.o + .debug_abbrev 0x00000000 0x295 THUMB Debug/../../obj/uip-fw.o + .debug_loc 0x00000000 0x18c THUMB Debug/../../obj/uip-fw.o + .debug_aranges + 0x00000000 0x48 THUMB Debug/../../obj/uip-fw.o + .debug_ranges 0x00000000 0x68 THUMB Debug/../../obj/uip-fw.o + .debug_line 0x00000000 0x246 THUMB Debug/../../obj/uip-fw.o + .debug_str 0x00000000 0x389 THUMB Debug/../../obj/uip-fw.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/uip-fw.o + .ARM.attributes + 0x00000000 0x33 THUMB Debug/../../obj/uip-fw.o + .text 0x00000000 0x0 THUMB Debug/../../obj/uiplib.o + .data 0x00000000 0x0 THUMB Debug/../../obj/uiplib.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/uiplib.o + .text.uiplib_ipaddrconv + 0x00000000 0x370 THUMB Debug/../../obj/uiplib.o + .debug_frame 0x00000000 0x2c THUMB Debug/../../obj/uiplib.o + .debug_info 0x00000000 0xc5 THUMB Debug/../../obj/uiplib.o + .debug_abbrev 0x00000000 0x64 THUMB Debug/../../obj/uiplib.o + .debug_loc 0x00000000 0xf89 THUMB Debug/../../obj/uiplib.o + .debug_aranges + 0x00000000 0x20 THUMB Debug/../../obj/uiplib.o + .debug_ranges 0x00000000 0x10 THUMB Debug/../../obj/uiplib.o + .debug_line 0x00000000 0x177 THUMB Debug/../../obj/uiplib.o + .debug_str 0x00000000 0x177 THUMB Debug/../../obj/uiplib.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/uiplib.o + .ARM.attributes + 0x00000000 0x33 THUMB Debug/../../obj/uiplib.o + .text.libc 0x00000000 0x0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + .data.libc 0x00000000 0x0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + .bss.libc 0x00000000 0x0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + .text.libc.longjmp + 0x00000000 0x14 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + .text.libc.memcpy_fast + 0x00000000 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + .text.libc.memcpy_small + 0x00000000 0x1c C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + .text.libc.__aeabi_memset + 0x00000000 0x74 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + .text.libc.setjmp + 0x00000000 0xc C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + .text.libc.strcpy + 0x00000000 0x4c C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + .text.libc.strcmp + 0x00000000 0x58 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + .text.libc.strlen + 0x00000000 0x70 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) .text 0x00000000 0x0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) .data 0x00000000 0x0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) .bss 0x00000000 0x0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) @@ -1788,7 +2090,7 @@ Memory Configuration Name Origin Length Attributes UNPLACED_SECTIONS 0xffffffff 0x00000000 xw -FLASH 0x08008000 0x000f8000 xr +FLASH 0x0800c000 0x000f4000 xr DATA_SRAM 0x10000000 0x00010000 xw SYSTEM 0x1fff0000 0x00007a10 xw OPTION 0x1fffc000 0x00000008 xw @@ -1814,8 +2116,8 @@ CM3_System_Control_Space 0xe000e000 0x00001000 xw Linker script and memory map - 0x080090a4 __do_debug_operation = __do_debug_operation_mempoll - 0x08008000 __FLASH_segment_start__ = 0x8008000 + 0x0800f4c4 __do_debug_operation = __do_debug_operation_mempoll + 0x0800c000 __FLASH_segment_start__ = 0x800c000 0x08100000 __FLASH_segment_end__ = 0x8100000 0x10000000 __DATA_SRAM_segment_start__ = 0x10000000 0x10010000 __DATA_SRAM_segment_end__ = 0x10010000 @@ -1875,141 +2177,250 @@ Linker script and memory map 0x20000000 __vectors_ram_end__ = (__vectors_ram_start__ + SIZEOF (.vectors_ram)) 0x20000000 __vectors_ram_load_end__ = __vectors_ram_end__ 0x00000001 . = ASSERT (((__vectors_ram_end__ >= __RAM_segment_start__) && (__vectors_ram_end__ <= __RAM_segment_end__)), error: .vectors_ram is too large to fit in RAM memory segment) - 0x08008000 __vectors_load_start__ = ALIGN (__FLASH_segment_start__, 0x100) + 0x0800c000 __vectors_load_start__ = ALIGN (__FLASH_segment_start__, 0x100) -.vectors 0x08008000 0x18c - 0x08008000 __vectors_start__ = . +.vectors 0x0800c000 0x18c + 0x0800c000 __vectors_start__ = . *(.vectors .vectors.*) - .vectors 0x08008000 0x18c THUMB Debug/../../obj/vectors.o - 0x08008000 _vectors - 0x0800818c __vectors_end__ = (__vectors_start__ + SIZEOF (.vectors)) - 0x0800818c __vectors_load_end__ = __vectors_end__ + .vectors 0x0800c000 0x18c THUMB Debug/../../obj/vectors.o + 0x0800c000 _vectors + 0x0800c18c __vectors_end__ = (__vectors_start__ + SIZEOF (.vectors)) + 0x0800c18c __vectors_load_end__ = __vectors_end__ 0x00000001 . = ASSERT (((__vectors_end__ >= __FLASH_segment_start__) && (__vectors_end__ <= __FLASH_segment_end__)), error: .vectors is too large to fit in FLASH memory segment) - 0x0800818c __init_load_start__ = ALIGN (__vectors_end__, 0x4) + 0x0800c18c __init_load_start__ = ALIGN (__vectors_end__, 0x4) -.init 0x0800818c 0x154 - 0x0800818c __init_start__ = . +.init 0x0800c18c 0x154 + 0x0800c18c __init_start__ = . *(.init .init.*) - .init 0x0800818c 0x154 THUMB Debug/../../obj/cstart.o - 0x0800818c _start - 0x0800820e exit - 0x08008232 reset_handler - 0x080082e0 __init_end__ = (__init_start__ + SIZEOF (.init)) - 0x080082e0 __init_load_end__ = __init_end__ + .init 0x0800c18c 0x154 THUMB Debug/../../obj/cstart.o + 0x0800c18c _start + 0x0800c20e exit + 0x0800c232 reset_handler + 0x0800c2e0 __init_end__ = (__init_start__ + SIZEOF (.init)) + 0x0800c2e0 __init_load_end__ = __init_end__ 0x00000001 . = ASSERT (((__init_end__ >= __FLASH_segment_start__) && (__init_end__ <= __FLASH_segment_end__)), error: .init is too large to fit in FLASH memory segment) - 0x080082e0 __text_load_start__ = ALIGN (__init_end__, 0x4) + 0x0800c2e0 __text_load_start__ = ALIGN (__init_end__, 0x4) -.text 0x080082e0 0xe08 - 0x080082e0 __text_start__ = . +.text 0x0800c2e0 0x3228 + 0x0800c2e0 __text_start__ = . *(.text .text.* .glue_7t .glue_7 .gnu.linkonce.t.* .gcc_except_table .ARM.extab* .gnu.linkonce.armextab.*) .glue_7 0x00000000 0x0 linker stubs .glue_7t 0x00000000 0x0 linker stubs .text.SystemInit - 0x080082e0 0x118 THUMB Debug/../../obj/system_stm32f4xx.o - 0x080082e0 SystemInit + 0x0800c2e0 0x118 THUMB Debug/../../obj/system_stm32f4xx.o + 0x0800c2e0 SystemInit .text.CAN_DeInit - 0x080083f8 0x44 THUMB Debug/../../obj/stm32f4xx_can.o - 0x080083f8 CAN_DeInit + 0x0800c3f8 0x44 THUMB Debug/../../obj/stm32f4xx_can.o + 0x0800c3f8 CAN_DeInit .text.CAN_Init - 0x0800843c 0x11c THUMB Debug/../../obj/stm32f4xx_can.o - 0x0800843c CAN_Init + 0x0800c43c 0x11c THUMB Debug/../../obj/stm32f4xx_can.o + 0x0800c43c CAN_Init .text.CAN_FilterInit - 0x08008558 0x134 THUMB Debug/../../obj/stm32f4xx_can.o - 0x08008558 CAN_FilterInit + 0x0800c558 0x134 THUMB Debug/../../obj/stm32f4xx_can.o + 0x0800c558 CAN_FilterInit .text.CAN_StructInit - 0x0800868c 0x28 THUMB Debug/../../obj/stm32f4xx_can.o - 0x0800868c CAN_StructInit + 0x0800c68c 0x28 THUMB Debug/../../obj/stm32f4xx_can.o + 0x0800c68c CAN_StructInit .text.CAN_Receive - 0x080086b4 0xbc THUMB Debug/../../obj/stm32f4xx_can.o - 0x080086b4 CAN_Receive + 0x0800c6b4 0xbc THUMB Debug/../../obj/stm32f4xx_can.o + 0x0800c6b4 CAN_Receive .text.CAN_MessagePending - 0x08008770 0x1c THUMB Debug/../../obj/stm32f4xx_can.o - 0x08008770 CAN_MessagePending + 0x0800c770 0x1c THUMB Debug/../../obj/stm32f4xx_can.o + 0x0800c770 CAN_MessagePending .text.GPIO_Init - 0x0800878c 0x160 THUMB Debug/../../obj/stm32f4xx_gpio.o - 0x0800878c GPIO_Init + 0x0800c78c 0x160 THUMB Debug/../../obj/stm32f4xx_gpio.o + 0x0800c78c GPIO_Init .text.GPIO_SetBits - 0x080088ec 0x4 THUMB Debug/../../obj/stm32f4xx_gpio.o - 0x080088ec GPIO_SetBits + 0x0800c8ec 0x4 THUMB Debug/../../obj/stm32f4xx_gpio.o + 0x0800c8ec GPIO_SetBits .text.GPIO_ResetBits - 0x080088f0 0x4 THUMB Debug/../../obj/stm32f4xx_gpio.o - 0x080088f0 GPIO_ResetBits + 0x0800c8f0 0x4 THUMB Debug/../../obj/stm32f4xx_gpio.o + 0x0800c8f0 GPIO_ResetBits .text.GPIO_PinAFConfig - 0x080088f4 0x38 THUMB Debug/../../obj/stm32f4xx_gpio.o - 0x080088f4 GPIO_PinAFConfig + 0x0800c8f4 0x38 THUMB Debug/../../obj/stm32f4xx_gpio.o + 0x0800c8f4 GPIO_PinAFConfig .text.RCC_GetClocksFreq - 0x0800892c 0xd8 THUMB Debug/../../obj/stm32f4xx_rcc.o - 0x0800892c RCC_GetClocksFreq + 0x0800c92c 0xd8 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x0800c92c RCC_GetClocksFreq .text.RCC_AHB1PeriphClockCmd - 0x08008a04 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o - 0x08008a04 RCC_AHB1PeriphClockCmd + 0x0800ca04 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x0800ca04 RCC_AHB1PeriphClockCmd .text.RCC_APB1PeriphClockCmd - 0x08008a28 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o - 0x08008a28 RCC_APB1PeriphClockCmd + 0x0800ca28 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x0800ca28 RCC_APB1PeriphClockCmd .text.RCC_APB2PeriphClockCmd - 0x08008a4c 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o - 0x08008a4c RCC_APB2PeriphClockCmd + 0x0800ca4c 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x0800ca4c RCC_APB2PeriphClockCmd + .text.RCC_AHB1PeriphResetCmd + 0x0800ca70 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x0800ca70 RCC_AHB1PeriphResetCmd .text.RCC_APB1PeriphResetCmd - 0x08008a70 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o - 0x08008a70 RCC_APB1PeriphResetCmd + 0x0800ca94 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x0800ca94 RCC_APB1PeriphResetCmd + .text.SYSCFG_ETH_MediaInterfaceConfig + 0x0800cab8 0xc THUMB Debug/../../obj/stm32f4xx_syscfg.o + 0x0800cab8 SYSCFG_ETH_MediaInterfaceConfig .text.USART_Init - 0x08008a94 0x108 THUMB Debug/../../obj/stm32f4xx_usart.o - 0x08008a94 USART_Init + 0x0800cac4 0x108 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x0800cac4 USART_Init .text.USART_Cmd - 0x08008b9c 0x20 THUMB Debug/../../obj/stm32f4xx_usart.o - 0x08008b9c USART_Cmd + 0x0800cbcc 0x20 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x0800cbcc USART_Cmd .text.USART_ReceiveData - 0x08008bbc 0xc THUMB Debug/../../obj/stm32f4xx_usart.o - 0x08008bbc USART_ReceiveData + 0x0800cbec 0xc THUMB Debug/../../obj/stm32f4xx_usart.o + 0x0800cbec USART_ReceiveData .text.USART_GetFlagStatus - 0x08008bc8 0xc THUMB Debug/../../obj/stm32f4xx_usart.o - 0x08008bc8 USART_GetFlagStatus - .text.BootActivate - 0x08008bd4 0x28 THUMB Debug/../../obj/boot.o + 0x0800cbf8 0xc THUMB Debug/../../obj/stm32f4xx_usart.o + 0x0800cbf8 USART_GetFlagStatus + .text.ETH_DeInit + 0x0800cc04 0x1c THUMB Debug/../../obj/stm32_eth.o + 0x0800cc04 ETH_DeInit + .text.ETH_StructInit + 0x0800cc20 0xa8 THUMB Debug/../../obj/stm32_eth.o + 0x0800cc20 ETH_StructInit + .text.ETH_ReadPHYRegister + 0x0800ccc8 0x78 THUMB Debug/../../obj/stm32_eth.o + 0x0800ccc8 ETH_ReadPHYRegister + .text.ETH_WritePHYRegister + 0x0800cd40 0x70 THUMB Debug/../../obj/stm32_eth.o + 0x0800cd40 ETH_WritePHYRegister + .text.ETH_Init + 0x0800cdb0 0x2f0 THUMB Debug/../../obj/stm32_eth.o + 0x0800cdb0 ETH_Init + .text.ETH_MACTransmissionCmd + 0x0800d0a0 0x28 THUMB Debug/../../obj/stm32_eth.o + 0x0800d0a0 ETH_MACTransmissionCmd + .text.ETH_MACReceptionCmd + 0x0800d0c8 0x28 THUMB Debug/../../obj/stm32_eth.o + 0x0800d0c8 ETH_MACReceptionCmd + .text.ETH_SoftwareReset + 0x0800d0f0 0x14 THUMB Debug/../../obj/stm32_eth.o + 0x0800d0f0 ETH_SoftwareReset + .text.ETH_GetSoftwareResetStatus + 0x0800d104 0x10 THUMB Debug/../../obj/stm32_eth.o + 0x0800d104 ETH_GetSoftwareResetStatus + .text.ETH_FlushTransmitFIFO + 0x0800d114 0x14 THUMB Debug/../../obj/stm32_eth.o + 0x0800d114 ETH_FlushTransmitFIFO + .text.ETH_DMATransmissionCmd + 0x0800d128 0x28 THUMB Debug/../../obj/stm32_eth.o + 0x0800d128 ETH_DMATransmissionCmd + .text.ETH_DMAReceptionCmd + 0x0800d150 0x28 THUMB Debug/../../obj/stm32_eth.o + 0x0800d150 ETH_DMAReceptionCmd + .text.ETH_Start + 0x0800d178 0x28 THUMB Debug/../../obj/stm32_eth.o + 0x0800d178 ETH_Start + .text.netdev_init + 0x0800d1a0 0x26c THUMB Debug/../../obj/netdev.o + 0x0800d1a0 netdev_init + .text.netdev_init_mac + 0x0800d40c 0x30 THUMB Debug/../../obj/netdev.o + 0x0800d40c netdev_init_mac + .text.netdev_read + 0x0800d43c 0x5c THUMB Debug/../../obj/netdev.o + 0x0800d43c netdev_read + .text.netdev_send + 0x0800d498 0x70 THUMB Debug/../../obj/netdev.o + 0x0800d498 netdev_send .text.UartReceiveByte - 0x08008bfc 0x34 THUMB Debug/../../obj/boot.o + 0x0800d508 0x34 THUMB Debug/../../obj/boot.o .text.BootComInit - 0x08008c30 0x224 THUMB Debug/../../obj/boot.o - 0x08008c30 BootComInit + 0x0800d53c 0x224 THUMB Debug/../../obj/boot.o + 0x0800d53c BootComInit + .text.BootActivate + 0x0800d760 0x28 THUMB Debug/../../obj/boot.o + 0x0800d760 BootActivate .text.BootComCheckActivationRequest - 0x08008e54 0xf0 THUMB Debug/../../obj/boot.o - 0x08008e54 BootComCheckActivationRequest + 0x0800d788 0xf0 THUMB Debug/../../obj/boot.o + 0x0800d788 BootComCheckActivationRequest .text.IrqInterruptEnable - 0x08008f44 0x4 THUMB Debug/../../obj/irq.o - 0x08008f44 IrqInterruptEnable - .text.LedInit 0x08008f48 0x50 THUMB Debug/../../obj/led.o - 0x08008f48 LedInit + 0x0800d878 0x4 THUMB Debug/../../obj/irq.o + 0x0800d878 IrqInterruptEnable + .text.LedInit 0x0800d87c 0x50 THUMB Debug/../../obj/led.o + 0x0800d87c LedInit .text.LedToggle - 0x08008f98 0x70 THUMB Debug/../../obj/led.o - 0x08008f98 LedToggle - .text.main 0x08009008 0x20 THUMB Debug/../../obj/main.o - 0x08009008 main + 0x0800d8cc 0x70 THUMB Debug/../../obj/led.o + 0x0800d8cc LedToggle + .text.main 0x0800d93c 0x28 THUMB Debug/../../obj/main.o + 0x0800d93c main .text.TimerSet - 0x08009028 0xc THUMB Debug/../../obj/timer.o - 0x08009028 TimerSet + 0x0800d964 0xc THUMB Debug/../../obj/timer.o + 0x0800d964 TimerSet .text.TimerInit - 0x08009034 0x4c THUMB Debug/../../obj/timer.o - 0x08009034 TimerInit + 0x0800d970 0x4c THUMB Debug/../../obj/timer.o + 0x0800d970 TimerInit .text.TimerGet - 0x08009080 0xc THUMB Debug/../../obj/timer.o - 0x08009080 TimerGet + 0x0800d9bc 0xc THUMB Debug/../../obj/timer.o + 0x0800d9bc TimerGet .text.TimerISRHandler - 0x0800908c 0x14 THUMB Debug/../../obj/timer.o - 0x0800908c TimerISRHandler + 0x0800d9c8 0x14 THUMB Debug/../../obj/timer.o + 0x0800d9c8 TimerISRHandler .text.UnusedISR - 0x080090a0 0x4 THUMB Debug/../../obj/vectors.o - 0x080090a0 UnusedISR + 0x0800d9dc 0x4 THUMB Debug/../../obj/vectors.o + 0x0800d9dc UnusedISR + .text.NetInit 0x0800d9e0 0x78 THUMB Debug/../../obj/net.o + 0x0800d9e0 NetInit + .text.NetApp 0x0800da58 0x38 THUMB Debug/../../obj/net.o + 0x0800da58 NetApp + .text.NetTask 0x0800da90 0x114 THUMB Debug/../../obj/net.o + 0x0800da90 NetTask + .text.chksum 0x0800dba4 0xc8 THUMB Debug/../../obj/uip.o + .text.uip_add32 + 0x0800dc6c 0x7c THUMB Debug/../../obj/uip.o + 0x0800dc6c uip_add32 + .text.uip_add_rcv_nxt + 0x0800dce8 0x30 THUMB Debug/../../obj/uip.o + .text.uip_init + 0x0800dd18 0x38 THUMB Debug/../../obj/uip.o + 0x0800dd18 uip_init + .text.uip_listen + 0x0800dd50 0x38 THUMB Debug/../../obj/uip.o + 0x0800dd50 uip_listen + .text.htons 0x0800dd88 0xc THUMB Debug/../../obj/uip.o + 0x0800dd88 htons + .text.upper_layer_chksum + 0x0800dd94 0x40 THUMB Debug/../../obj/uip.o + .text.uip_tcpchksum + 0x0800ddd4 0xc THUMB Debug/../../obj/uip.o + 0x0800ddd4 uip_tcpchksum + .text.uip_ipchksum + 0x0800dde0 0x24 THUMB Debug/../../obj/uip.o + 0x0800dde0 uip_ipchksum + .text.uip_process + 0x0800de04 0xd28 THUMB Debug/../../obj/uip.o + 0x0800de04 uip_process + .text.uip_arp_update + 0x0800eb2c 0x40c THUMB Debug/../../obj/uip_arp.o + .text.uip_arp_timer + 0x0800ef38 0x74 THUMB Debug/../../obj/uip_arp.o + 0x0800ef38 uip_arp_timer + .text.uip_arp_arpin + 0x0800efac 0x14c THUMB Debug/../../obj/uip_arp.o + 0x0800efac uip_arp_arpin + .text.uip_arp_out + 0x0800f0f8 0x314 THUMB Debug/../../obj/uip_arp.o + 0x0800f0f8 uip_arp_out + .text.libc.memcpy + 0x0800f40c 0x48 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + 0x0800f40c __aeabi_memcpy + 0x0800f40c __aeabi_memcpy4 + 0x0800f40c __aeabi_memcpy8 + 0x0800f40c memcpy + .text.libc.memset + 0x0800f454 0x70 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + 0x0800f454 memset .text.libdebugio.__do_debug_operation_mempoll - 0x080090a4 0x3c C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - 0x080090a4 __do_debug_operation_mempoll + 0x0800f4c4 0x3c C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + 0x0800f4c4 __do_debug_operation_mempoll .text.libc.__debug_io_lock - 0x080090e0 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) - 0x080090e0 __debug_io_lock + 0x0800f500 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + 0x0800f500 __debug_io_lock .text.libc.__debug_io_unlock - 0x080090e4 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) - 0x080090e4 __debug_io_unlock - 0x080090e8 __text_end__ = (__text_start__ + SIZEOF (.text)) - 0x080090e8 __text_load_end__ = __text_end__ + 0x0800f504 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + 0x0800f504 __debug_io_unlock + 0x0800f508 __text_end__ = (__text_start__ + SIZEOF (.text)) + 0x0800f508 __text_load_end__ = __text_end__ .vfp11_veneer 0x00000000 0x0 .vfp11_veneer 0x00000000 0x0 linker stubs @@ -2020,56 +2431,58 @@ Linker script and memory map .iplt 0x00000000 0x0 .iplt 0x00000000 0x0 THUMB Debug/../../obj/system_stm32f4xx.o 0x00000001 . = ASSERT (((__text_end__ >= __FLASH_segment_start__) && (__text_end__ <= __FLASH_segment_end__)), error: .text is too large to fit in FLASH memory segment) - 0x080090e8 __dtors_load_start__ = ALIGN (__text_end__, 0x4) + 0x0800f508 __dtors_load_start__ = ALIGN (__text_end__, 0x4) -.dtors 0x080090e8 0x0 - 0x080090e8 __dtors_start__ = . +.dtors 0x0800f508 0x0 + 0x0800f508 __dtors_start__ = . *(SORT(.dtors.*)) *(.dtors) *(.fini_array .fini_array.*) - 0x080090e8 __dtors_end__ = (__dtors_start__ + SIZEOF (.dtors)) - 0x080090e8 __dtors_load_end__ = __dtors_end__ + 0x0800f508 __dtors_end__ = (__dtors_start__ + SIZEOF (.dtors)) + 0x0800f508 __dtors_load_end__ = __dtors_end__ 0x00000001 . = ASSERT (((__dtors_end__ >= __FLASH_segment_start__) && (__dtors_end__ <= __FLASH_segment_end__)), error: .dtors is too large to fit in FLASH memory segment) - 0x080090e8 __ctors_load_start__ = ALIGN (__dtors_end__, 0x4) + 0x0800f508 __ctors_load_start__ = ALIGN (__dtors_end__, 0x4) -.ctors 0x080090e8 0x0 - 0x080090e8 __ctors_start__ = . +.ctors 0x0800f508 0x0 + 0x0800f508 __ctors_start__ = . *(SORT(.ctors.*)) *(.ctors) *(.init_array .init_array.*) - 0x080090e8 __ctors_end__ = (__ctors_start__ + SIZEOF (.ctors)) - 0x080090e8 __ctors_load_end__ = __ctors_end__ + 0x0800f508 __ctors_end__ = (__ctors_start__ + SIZEOF (.ctors)) + 0x0800f508 __ctors_load_end__ = __ctors_end__ 0x00000001 . = ASSERT (((__ctors_end__ >= __FLASH_segment_start__) && (__ctors_end__ <= __FLASH_segment_end__)), error: .ctors is too large to fit in FLASH memory segment) - 0x080090e8 __rodata_load_start__ = ALIGN (__ctors_end__, 0x4) + 0x0800f508 __rodata_load_start__ = ALIGN (__ctors_end__, 0x4) -.rodata 0x080090e8 0x24 - 0x080090e8 __rodata_start__ = . +.rodata 0x0800f508 0x2c + 0x0800f508 __rodata_start__ = . *(.rodata .rodata.* .gnu.linkonce.r.*) .rodata.canTiming - 0x080090e8 0x24 THUMB Debug/../../obj/boot.o - 0x0800910c __rodata_end__ = (__rodata_start__ + SIZEOF (.rodata)) - 0x0800910c __rodata_load_end__ = __rodata_end__ + 0x0800f508 0x24 THUMB Debug/../../obj/boot.o + .rodata.broadcast_ethaddr + 0x0800f52c 0x8 THUMB Debug/../../obj/uip_arp.o + 0x0800f534 __rodata_end__ = (__rodata_start__ + SIZEOF (.rodata)) + 0x0800f534 __rodata_load_end__ = __rodata_end__ -.rel.dyn 0x08008000 0x0 +.rel.dyn 0x0800c000 0x0 .rel.iplt 0x00000000 0x0 THUMB Debug/../../obj/system_stm32f4xx.o 0x00000001 . = ASSERT (((__rodata_end__ >= __FLASH_segment_start__) && (__rodata_end__ <= __FLASH_segment_end__)), error: .rodata is too large to fit in FLASH memory segment) - 0x0800910c __ARM.exidx_load_start__ = ALIGN (__rodata_end__, 0x4) + 0x0800f534 __ARM.exidx_load_start__ = ALIGN (__rodata_end__, 0x4) -.ARM.exidx 0x0800910c 0x0 - 0x0800910c __ARM.exidx_start__ = . - 0x0800910c __exidx_start = __ARM.exidx_start__ +.ARM.exidx 0x0800f534 0x0 + 0x0800f534 __ARM.exidx_start__ = . + 0x0800f534 __exidx_start = __ARM.exidx_start__ *(.ARM.exidx .ARM.exidx.*) - 0x0800910c __ARM.exidx_end__ = (__ARM.exidx_start__ + SIZEOF (.ARM.exidx)) - 0x0800910c __exidx_end = __ARM.exidx_end__ - 0x0800910c __ARM.exidx_load_end__ = __ARM.exidx_end__ + 0x0800f534 __ARM.exidx_end__ = (__ARM.exidx_start__ + SIZEOF (.ARM.exidx)) + 0x0800f534 __exidx_end = __ARM.exidx_end__ + 0x0800f534 __ARM.exidx_load_end__ = __ARM.exidx_end__ 0x00000001 . = ASSERT (((__ARM.exidx_end__ >= __FLASH_segment_start__) && (__ARM.exidx_end__ <= __FLASH_segment_end__)), error: .ARM.exidx is too large to fit in FLASH memory segment) - 0x0800910c __fast_load_start__ = ALIGN (__ARM.exidx_end__, 0x4) + 0x0800f534 __fast_load_start__ = ALIGN (__ARM.exidx_end__, 0x4) -.fast 0x20000000 0x0 load address 0x0800910c +.fast 0x20000000 0x0 load address 0x0800f534 0x20000000 __fast_start__ = . *(.fast .fast.*) 0x20000000 __fast_end__ = (__fast_start__ + SIZEOF (.fast)) - 0x0800910c __fast_load_end__ = (__fast_load_start__ + SIZEOF (.fast)) + 0x0800f534 __fast_load_end__ = (__fast_load_start__ + SIZEOF (.fast)) 0x00000001 . = ASSERT (((__fast_load_end__ >= __FLASH_segment_start__) && (__fast_load_end__ <= __FLASH_segment_end__)), error: .fast is too large to fit in FLASH memory segment) .fast_run 0x20000000 0x0 @@ -2078,9 +2491,9 @@ Linker script and memory map 0x20000000 __fast_run_end__ = (__fast_run_start__ + SIZEOF (.fast_run)) 0x20000000 __fast_run_load_end__ = __fast_run_end__ 0x00000001 . = ASSERT (((__fast_run_end__ >= __RAM_segment_start__) && (__fast_run_end__ <= __RAM_segment_end__)), error: .fast_run is too large to fit in RAM memory segment) - 0x0800910c __data_load_start__ = ALIGN ((__fast_load_start__ + SIZEOF (.fast)), 0x4) + 0x0800f534 __data_load_start__ = ALIGN ((__fast_load_start__ + SIZEOF (.fast)), 0x4) -.data 0x20000000 0x14 load address 0x0800910c +.data 0x20000000 0x14 load address 0x0800f534 0x20000000 __data_start__ = . *(.data .data.* .gnu.linkonce.d.*) .data.SystemCoreClock @@ -2089,13 +2502,13 @@ Linker script and memory map .data.APBAHBPrescTable 0x20000004 0x10 THUMB Debug/../../obj/stm32f4xx_rcc.o 0x20000014 __data_end__ = (__data_start__ + SIZEOF (.data)) - 0x08009120 __data_load_end__ = (__data_load_start__ + SIZEOF (.data)) + 0x0800f548 __data_load_end__ = (__data_load_start__ + SIZEOF (.data)) .igot.plt 0x00000000 0x0 .igot.plt 0x00000000 0x0 THUMB Debug/../../obj/system_stm32f4xx.o 0x00000001 . = ASSERT (((__data_load_end__ >= __FLASH_segment_start__) && (__data_load_end__ <= __FLASH_segment_end__)), error: .data is too large to fit in FLASH memory segment) -.data_run 0x20000000 0x14 load address 0x0800910c +.data_run 0x20000000 0x14 load address 0x0800f534 0x20000000 __data_run_start__ = . 0x20000014 . = MAX ((__data_run_start__ + SIZEOF (.data)), .) *fill* 0x20000000 0x14 00 @@ -2104,94 +2517,166 @@ Linker script and memory map 0x00000001 . = ASSERT (((__data_run_end__ >= __RAM_segment_start__) && (__data_run_end__ <= __RAM_segment_end__)), error: .data_run is too large to fit in RAM memory segment) 0x20000014 __bss_load_start__ = ALIGN (__data_run_end__, 0x4) -.bss 0x20000014 0x5c +.bss 0x20000014 0x15a0 0x20000014 __bss_start__ = . *(.bss .bss.* .gnu.linkonce.b.*) - .bss.xcpCtoReqPacket.7036 - 0x20000014 0x44 THUMB Debug/../../obj/boot.o - .bss.xcpCtoRxLength.7037 - 0x20000058 0x1 THUMB Debug/../../obj/boot.o - .bss.xcpCtoRxInProgress.7038 - 0x20000059 0x1 THUMB Debug/../../obj/boot.o - *fill* 0x2000005a 0x2 00 - .bss.timer_counter_last.7017 - 0x2000005c 0x4 THUMB Debug/../../obj/led.o - .bss.led_toggle_state.7016 - 0x20000060 0x1 THUMB Debug/../../obj/led.o - *fill* 0x20000061 0x3 00 + *fill* 0x20000014 0x6c 00 + .bss.EnetDmaRx + 0x20000080 0x80 THUMB Debug/../../obj/netdev.o + 0x20000080 EnetDmaRx + .bss.RxBuff 0x20000100 0x640 THUMB Debug/../../obj/netdev.o + 0x20000100 RxBuff + *fill* 0x20000740 0x40 00 + .bss.EnetDmaTx + 0x20000780 0x80 THUMB Debug/../../obj/netdev.o + 0x20000780 EnetDmaTx + .bss.TxBuff 0x20000800 0x640 THUMB Debug/../../obj/netdev.o + 0x20000800 TxBuff + .bss.xcpCtoReqPacket.7047 + 0x20000e40 0x44 THUMB Debug/../../obj/boot.o + .bss.xcpCtoRxLength.7048 + 0x20000e84 0x1 THUMB Debug/../../obj/boot.o + .bss.xcpCtoRxInProgress.7049 + 0x20000e85 0x1 THUMB Debug/../../obj/boot.o + *fill* 0x20000e86 0x2 00 + .bss.timer_counter_last.7028 + 0x20000e88 0x4 THUMB Debug/../../obj/led.o + .bss.led_toggle_state.7027 + 0x20000e8c 0x1 THUMB Debug/../../obj/led.o + *fill* 0x20000e8d 0x3 00 .bss.millisecond_counter - 0x20000064 0x4 THUMB Debug/../../obj/timer.o + 0x20000e90 0x4 THUMB Debug/../../obj/timer.o + .bss.ARPTimerTimeOut + 0x20000e94 0x4 THUMB Debug/../../obj/net.o + .bss.periodicTimerTimeOut + 0x20000e98 0x4 THUMB Debug/../../obj/net.o + .bss.uip_conn 0x20000e9c 0x4 THUMB Debug/../../obj/uip.o + 0x20000e9c uip_conn + .bss.uip_conns + 0x20000ea0 0x20 THUMB Debug/../../obj/uip.o + 0x20000ea0 uip_conns + .bss.uip_netmask + 0x20000ec0 0x4 THUMB Debug/../../obj/uip.o + 0x20000ec0 uip_netmask + .bss.uip_len 0x20000ec4 0x2 THUMB Debug/../../obj/uip.o + 0x20000ec4 uip_len + .bss.ipid 0x20000ec6 0x2 THUMB Debug/../../obj/uip.o + .bss.uip_draddr + 0x20000ec8 0x4 THUMB Debug/../../obj/uip.o + 0x20000ec8 uip_draddr + .bss.uip_slen 0x20000ecc 0x2 THUMB Debug/../../obj/uip.o + 0x20000ecc uip_slen + *fill* 0x20000ece 0x2 00 + .bss.uip_buf 0x20000ed0 0x644 THUMB Debug/../../obj/uip.o + 0x20000ed0 uip_buf + .bss.uip_appdata + 0x20001514 0x4 THUMB Debug/../../obj/uip.o + 0x20001514 uip_appdata + .bss.iss 0x20001518 0x4 THUMB Debug/../../obj/uip.o + .bss.uip_hostaddr + 0x2000151c 0x4 THUMB Debug/../../obj/uip.o + 0x2000151c uip_hostaddr + .bss.uip_flags + 0x20001520 0x1 THUMB Debug/../../obj/uip.o + 0x20001520 uip_flags + *fill* 0x20001521 0x3 00 + .bss.uip_acc32 + 0x20001524 0x4 THUMB Debug/../../obj/uip.o + 0x20001524 uip_acc32 + .bss.lastport 0x20001528 0x2 THUMB Debug/../../obj/uip.o + .bss.tmp16 0x2000152a 0x2 THUMB Debug/../../obj/uip.o + .bss.uip_ethaddr + 0x2000152c 0x8 THUMB Debug/../../obj/uip.o + 0x2000152c uip_ethaddr + .bss.c 0x20001534 0x1 THUMB Debug/../../obj/uip.o + *fill* 0x20001535 0x3 00 + .bss.uip_listenports + 0x20001538 0x4 THUMB Debug/../../obj/uip.o + 0x20001538 uip_listenports + .bss.uip_sappdata + 0x2000153c 0x4 THUMB Debug/../../obj/uip.o + 0x2000153c uip_sappdata + .bss.opt 0x20001540 0x1 THUMB Debug/../../obj/uip.o + .bss.i 0x20001541 0x1 THUMB Debug/../../obj/uip_arp.o + .bss.tmpage 0x20001542 0x1 THUMB Debug/../../obj/uip_arp.o + *fill* 0x20001543 0x1 00 + .bss.arp_table + 0x20001544 0x60 THUMB Debug/../../obj/uip_arp.o + .bss.c 0x200015a4 0x1 THUMB Debug/../../obj/uip_arp.o + .bss.arptime 0x200015a5 0x1 THUMB Debug/../../obj/uip_arp.o + *fill* 0x200015a6 0x2 00 + .bss.ipaddr 0x200015a8 0x4 THUMB Debug/../../obj/uip_arp.o .bss.libdebugio.dbgCommWord - 0x20000068 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - 0x20000068 dbgCommWord + 0x200015ac 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + 0x200015ac dbgCommWord .bss.libdebugio.dbgCntrlWord_mempoll - 0x2000006c 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - 0x2000006c dbgCntrlWord_mempoll + 0x200015b0 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + 0x200015b0 dbgCntrlWord_mempoll *(COMMON) - 0x20000070 __bss_end__ = (__bss_start__ + SIZEOF (.bss)) - 0x20000070 __bss_load_end__ = __bss_end__ + 0x200015b4 __bss_end__ = (__bss_start__ + SIZEOF (.bss)) + 0x200015b4 __bss_load_end__ = __bss_end__ 0x00000001 . = ASSERT (((__bss_end__ >= __RAM_segment_start__) && (__bss_end__ <= __RAM_segment_end__)), error: .bss is too large to fit in RAM memory segment) - 0x20000070 __non_init_load_start__ = ALIGN (__bss_end__, 0x4) + 0x200015b4 __non_init_load_start__ = ALIGN (__bss_end__, 0x4) -.non_init 0x20000070 0x0 - 0x20000070 __non_init_start__ = . +.non_init 0x200015b4 0x0 + 0x200015b4 __non_init_start__ = . *(.non_init .non_init.*) - 0x20000070 __non_init_end__ = (__non_init_start__ + SIZEOF (.non_init)) - 0x20000070 __non_init_load_end__ = __non_init_end__ + 0x200015b4 __non_init_end__ = (__non_init_start__ + SIZEOF (.non_init)) + 0x200015b4 __non_init_load_end__ = __non_init_end__ 0x00000001 . = ASSERT (((__non_init_end__ >= __RAM_segment_start__) && (__non_init_end__ <= __RAM_segment_end__)), error: .non_init is too large to fit in RAM memory segment) - 0x20000070 __heap_load_start__ = ALIGN (__non_init_end__, 0x4) + 0x200015b4 __heap_load_start__ = ALIGN (__non_init_end__, 0x4) -.heap 0x20000070 0x800 - 0x20000070 __heap_start__ = . +.heap 0x200015b4 0x800 + 0x200015b4 __heap_start__ = . *(.heap .heap.*) - 0x20000870 . = ALIGN (MAX ((__heap_start__ + __HEAPSIZE__), .), 0x4) - *fill* 0x20000070 0x800 00 - 0x20000870 __heap_end__ = (__heap_start__ + SIZEOF (.heap)) - 0x20000870 __heap_load_end__ = __heap_end__ + 0x20001db4 . = ALIGN (MAX ((__heap_start__ + __HEAPSIZE__), .), 0x4) + *fill* 0x200015b4 0x800 00 + 0x20001db4 __heap_end__ = (__heap_start__ + SIZEOF (.heap)) + 0x20001db4 __heap_load_end__ = __heap_end__ 0x00000001 . = ASSERT (((__heap_end__ >= __RAM_segment_start__) && (__heap_end__ <= __RAM_segment_end__)), error: .heap is too large to fit in RAM memory segment) - 0x20000870 __stack_load_start__ = ALIGN (__heap_end__, 0x4) + 0x20001db4 __stack_load_start__ = ALIGN (__heap_end__, 0x4) -.stack 0x20000870 0x800 - 0x20000870 __stack_start__ = . +.stack 0x20001db4 0x800 + 0x20001db4 __stack_start__ = . *(.stack .stack.*) - 0x20001070 . = ALIGN (MAX ((__stack_start__ + __STACKSIZE__), .), 0x4) - *fill* 0x20000870 0x800 00 - 0x20001070 __stack_end__ = (__stack_start__ + SIZEOF (.stack)) - 0x20001070 __stack_load_end__ = __stack_end__ + 0x200025b4 . = ALIGN (MAX ((__stack_start__ + __STACKSIZE__), .), 0x4) + *fill* 0x20001db4 0x800 00 + 0x200025b4 __stack_end__ = (__stack_start__ + SIZEOF (.stack)) + 0x200025b4 __stack_load_end__ = __stack_end__ 0x00000001 . = ASSERT (((__stack_end__ >= __RAM_segment_start__) && (__stack_end__ <= __RAM_segment_end__)), error: .stack is too large to fit in RAM memory segment) - 0x20001070 __stack_process_load_start__ = ALIGN (__stack_end__, 0x4) + 0x200025b4 __stack_process_load_start__ = ALIGN (__stack_end__, 0x4) -.stack_process 0x20001070 0x0 - 0x20001070 __stack_process_start__ = . +.stack_process 0x200025b4 0x0 + 0x200025b4 __stack_process_start__ = . *(.stack_process .stack_process.*) - 0x20001070 . = ALIGN (MAX ((__stack_process_start__ + __STACKSIZE_PROCESS__), .), 0x4) - 0x20001070 __stack_process_end__ = (__stack_process_start__ + SIZEOF (.stack_process)) - 0x20001070 __stack_process_load_end__ = __stack_process_end__ + 0x200025b4 . = ALIGN (MAX ((__stack_process_start__ + __STACKSIZE_PROCESS__), .), 0x4) + 0x200025b4 __stack_process_end__ = (__stack_process_start__ + SIZEOF (.stack_process)) + 0x200025b4 __stack_process_load_end__ = __stack_process_end__ 0x00000001 . = ASSERT (((__stack_process_end__ >= __RAM_segment_start__) && (__stack_process_end__ <= __RAM_segment_end__)), error: .stack_process is too large to fit in RAM memory segment) - 0x20001070 __tbss_load_start__ = ALIGN (__stack_process_end__, 0x4) + 0x200025b4 __tbss_load_start__ = ALIGN (__stack_process_end__, 0x4) -.tbss 0x20001070 0x0 - 0x20001070 __tbss_start__ = . +.tbss 0x200025b4 0x0 + 0x200025b4 __tbss_start__ = . *(.tbss .tbss.*) - 0x20001070 __tbss_end__ = (__tbss_start__ + SIZEOF (.tbss)) - 0x20001070 __tbss_load_end__ = __tbss_end__ + 0x200025b4 __tbss_end__ = (__tbss_start__ + SIZEOF (.tbss)) + 0x200025b4 __tbss_load_end__ = __tbss_end__ 0x00000001 . = ASSERT (((__tbss_end__ >= __RAM_segment_start__) && (__tbss_end__ <= __RAM_segment_end__)), error: .tbss is too large to fit in RAM memory segment) - 0x08009120 __tdata_load_start__ = ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) + 0x0800f548 __tdata_load_start__ = ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) -.tdata 0x20001070 0x0 load address 0x08009120 - 0x20001070 __tdata_start__ = . +.tdata 0x200025b4 0x0 load address 0x0800f548 + 0x200025b4 __tdata_start__ = . *(.tdata .tdata.*) - 0x20001070 __tdata_end__ = (__tdata_start__ + SIZEOF (.tdata)) - 0x08009120 __tdata_load_end__ = (__tdata_load_start__ + SIZEOF (.tdata)) - 0x08009120 __FLASH_segment_used_end__ = (ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) + SIZEOF (.tdata)) + 0x200025b4 __tdata_end__ = (__tdata_start__ + SIZEOF (.tdata)) + 0x0800f548 __tdata_load_end__ = (__tdata_load_start__ + SIZEOF (.tdata)) + 0x0800f548 __FLASH_segment_used_end__ = (ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) + SIZEOF (.tdata)) 0x00000001 . = ASSERT (((__tdata_load_end__ >= __FLASH_segment_start__) && (__tdata_load_end__ <= __FLASH_segment_end__)), error: .tdata is too large to fit in FLASH memory segment) -.tdata_run 0x20001070 0x0 - 0x20001070 __tdata_run_start__ = . - 0x20001070 . = MAX ((__tdata_run_start__ + SIZEOF (.tdata)), .) - 0x20001070 __tdata_run_end__ = (__tdata_run_start__ + SIZEOF (.tdata_run)) - 0x20001070 __tdata_run_load_end__ = __tdata_run_end__ - 0x20001070 __RAM_segment_used_end__ = (ALIGN (__tbss_end__, 0x4) + SIZEOF (.tdata_run)) +.tdata_run 0x200025b4 0x0 + 0x200025b4 __tdata_run_start__ = . + 0x200025b4 . = MAX ((__tdata_run_start__ + SIZEOF (.tdata)), .) + 0x200025b4 __tdata_run_end__ = (__tdata_run_start__ + SIZEOF (.tdata_run)) + 0x200025b4 __tdata_run_load_end__ = __tdata_run_end__ + 0x200025b4 __RAM_segment_used_end__ = (ALIGN (__tbss_end__, 0x4) + SIZEOF (.tdata_run)) 0x00000001 . = ASSERT (((__tdata_run_end__ >= __RAM_segment_start__) && (__tdata_run_end__ <= __RAM_segment_end__)), error: .tdata_run is too large to fit in RAM memory segment) START GROUP LOAD THUMB Debug/../../obj/system_stm32f4xx.o @@ -2226,6 +2711,9 @@ LOAD THUMB Debug/../../obj/stm32f4xx_syscfg.o LOAD THUMB Debug/../../obj/stm32f4xx_tim.o LOAD THUMB Debug/../../obj/stm32f4xx_usart.o LOAD THUMB Debug/../../obj/stm32f4xx_wwdg.o +LOAD THUMB Debug/../../obj/stm32_eth.o +LOAD THUMB Debug/../../obj/clock-arch.o +LOAD THUMB Debug/../../obj/netdev.o LOAD THUMB Debug/../../obj/boot.o LOAD THUMB Debug/../../obj/cstart.o LOAD THUMB Debug/../../obj/irq.o @@ -2233,6 +2721,12 @@ LOAD THUMB Debug/../../obj/led.o LOAD THUMB Debug/../../obj/main.o LOAD THUMB Debug/../../obj/timer.o LOAD THUMB Debug/../../obj/vectors.o +LOAD THUMB Debug/../../obj/net.o +LOAD THUMB Debug/../../obj/uip.o +LOAD THUMB Debug/../../obj/uip_arp.o +LOAD THUMB Debug/../../obj/uip_timer.o +LOAD THUMB Debug/../../obj/uip-fw.o +LOAD THUMB Debug/../../obj/uiplib.o LOAD C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libcm_v7em_t_le_eabi.a LOAD C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libm_v7em_t_le_eabi.a LOAD C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a @@ -2243,66 +2737,91 @@ LOAD C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib END GROUP OUTPUT(C:/Work/software/OpenBLT/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/ide/../bin/demoprog_olimex_stm32e407.elf elf32-littlearm) -.debug_frame 0x00000000 0x1274 +.debug_frame 0x00000000 0x1eec .debug_frame 0x00000000 0x38 THUMB Debug/../../obj/system_stm32f4xx.o .debug_frame 0x00000038 0x1e4 THUMB Debug/../../obj/stm32f4xx_can.o .debug_frame 0x0000021c 0x124 THUMB Debug/../../obj/stm32f4xx_gpio.o .debug_frame 0x00000340 0x30c THUMB Debug/../../obj/stm32f4xx_rcc.o - .debug_frame 0x0000064c 0x224 THUMB Debug/../../obj/stm32f4xx_usart.o - .debug_frame 0x00000870 0x8c THUMB Debug/../../obj/boot.o - .debug_frame 0x000008fc 0x40 THUMB Debug/../../obj/irq.o - .debug_frame 0x0000093c 0x50 THUMB Debug/../../obj/led.o - .debug_frame 0x0000098c 0x2c THUMB Debug/../../obj/main.o - .debug_frame 0x000009b8 0x6c THUMB Debug/../../obj/timer.o - .debug_frame 0x00000a24 0x20 THUMB Debug/../../obj/vectors.o - .debug_frame 0x00000a44 0x790 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - .debug_frame 0x000011d4 0xa0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + .debug_frame 0x0000064c 0x88 THUMB Debug/../../obj/stm32f4xx_syscfg.o + .debug_frame 0x000006d4 0x224 THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_frame 0x000008f8 0x76c THUMB Debug/../../obj/stm32_eth.o + .debug_frame 0x00001064 0x94 THUMB Debug/../../obj/netdev.o + .debug_frame 0x000010f8 0x8c THUMB Debug/../../obj/boot.o + .debug_frame 0x00001184 0x40 THUMB Debug/../../obj/irq.o + .debug_frame 0x000011c4 0x50 THUMB Debug/../../obj/led.o + .debug_frame 0x00001214 0x2c THUMB Debug/../../obj/main.o + .debug_frame 0x00001240 0x6c THUMB Debug/../../obj/timer.o + .debug_frame 0x000012ac 0x20 THUMB Debug/../../obj/vectors.o + .debug_frame 0x000012cc 0x64 THUMB Debug/../../obj/net.o + .debug_frame 0x00001330 0x1b0 THUMB Debug/../../obj/uip.o + .debug_frame 0x000014e0 0xbc THUMB Debug/../../obj/uip_arp.o + .debug_frame 0x0000159c 0x120 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + .debug_frame 0x000016bc 0x790 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_frame 0x00001e4c 0xa0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) -.debug_info 0x00000000 0x5ba0 +.debug_info 0x00000000 0xac5a .debug_info 0x00000000 0x473 THUMB Debug/../../obj/system_stm32f4xx.o .debug_info 0x00000473 0xdf4 THUMB Debug/../../obj/stm32f4xx_can.o .debug_info 0x00001267 0x809 THUMB Debug/../../obj/stm32f4xx_gpio.o .debug_info 0x00001a70 0xda0 THUMB Debug/../../obj/stm32f4xx_rcc.o - .debug_info 0x00002810 0xc4b THUMB Debug/../../obj/stm32f4xx_usart.o - .debug_info 0x0000345b 0x1160 THUMB Debug/../../obj/boot.o - .debug_info 0x000045bb 0xe2 THUMB Debug/../../obj/cstart.o - .debug_info 0x0000469d 0x127 THUMB Debug/../../obj/irq.o - .debug_info 0x000047c4 0x3ec THUMB Debug/../../obj/led.o - .debug_info 0x00004bb0 0x144 THUMB Debug/../../obj/main.o - .debug_info 0x00004cf4 0x775 THUMB Debug/../../obj/timer.o - .debug_info 0x00005469 0x102 THUMB Debug/../../obj/vectors.o - .debug_info 0x0000556b 0x55f C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - .debug_info 0x00005aca 0xd6 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + .debug_info 0x00002810 0x2b7 THUMB Debug/../../obj/stm32f4xx_syscfg.o + .debug_info 0x00002ac7 0xc4b THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_info 0x00003712 0x1ffe THUMB Debug/../../obj/stm32_eth.o + .debug_info 0x00005710 0x1550 THUMB Debug/../../obj/netdev.o + .debug_info 0x00006c60 0x1161 THUMB Debug/../../obj/boot.o + .debug_info 0x00007dc1 0xe2 THUMB Debug/../../obj/cstart.o + .debug_info 0x00007ea3 0x127 THUMB Debug/../../obj/irq.o + .debug_info 0x00007fca 0x3ec THUMB Debug/../../obj/led.o + .debug_info 0x000083b6 0x16a THUMB Debug/../../obj/main.o + .debug_info 0x00008520 0x775 THUMB Debug/../../obj/timer.o + .debug_info 0x00008c95 0x102 THUMB Debug/../../obj/vectors.o + .debug_info 0x00008d97 0x551 THUMB Debug/../../obj/net.o + .debug_info 0x000092e8 0xca9 THUMB Debug/../../obj/uip.o + .debug_info 0x00009f91 0x694 THUMB Debug/../../obj/uip_arp.o + .debug_info 0x0000a625 0x55f C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_info 0x0000ab84 0xd6 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) -.debug_abbrev 0x00000000 0x126c +.debug_abbrev 0x00000000 0x1f76 .debug_abbrev 0x00000000 0x158 THUMB Debug/../../obj/system_stm32f4xx.o .debug_abbrev 0x00000158 0x23e THUMB Debug/../../obj/stm32f4xx_can.o .debug_abbrev 0x00000396 0x210 THUMB Debug/../../obj/stm32f4xx_gpio.o .debug_abbrev 0x000005a6 0x229 THUMB Debug/../../obj/stm32f4xx_rcc.o - .debug_abbrev 0x000007cf 0x1fc THUMB Debug/../../obj/stm32f4xx_usart.o - .debug_abbrev 0x000009cb 0x2d6 THUMB Debug/../../obj/boot.o - .debug_abbrev 0x00000ca1 0x14 THUMB Debug/../../obj/cstart.o - .debug_abbrev 0x00000cb5 0x8d THUMB Debug/../../obj/irq.o - .debug_abbrev 0x00000d42 0x17d THUMB Debug/../../obj/led.o - .debug_abbrev 0x00000ebf 0x9c THUMB Debug/../../obj/main.o - .debug_abbrev 0x00000f5b 0x1db THUMB Debug/../../obj/timer.o - .debug_abbrev 0x00001136 0xd0 THUMB Debug/../../obj/vectors.o - .debug_abbrev 0x00001206 0x3e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - .debug_abbrev 0x00001244 0x28 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + .debug_abbrev 0x000007cf 0x177 THUMB Debug/../../obj/stm32f4xx_syscfg.o + .debug_abbrev 0x00000946 0x1fc THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_abbrev 0x00000b42 0x28e THUMB Debug/../../obj/stm32_eth.o + .debug_abbrev 0x00000dd0 0x32a THUMB Debug/../../obj/netdev.o + .debug_abbrev 0x000010fa 0x2d8 THUMB Debug/../../obj/boot.o + .debug_abbrev 0x000013d2 0x14 THUMB Debug/../../obj/cstart.o + .debug_abbrev 0x000013e6 0x8d THUMB Debug/../../obj/irq.o + .debug_abbrev 0x00001473 0x17d THUMB Debug/../../obj/led.o + .debug_abbrev 0x000015f0 0x9c THUMB Debug/../../obj/main.o + .debug_abbrev 0x0000168c 0x1db THUMB Debug/../../obj/timer.o + .debug_abbrev 0x00001867 0xd0 THUMB Debug/../../obj/vectors.o + .debug_abbrev 0x00001937 0x17a THUMB Debug/../../obj/net.o + .debug_abbrev 0x00001ab1 0x293 THUMB Debug/../../obj/uip.o + .debug_abbrev 0x00001d44 0x1cc THUMB Debug/../../obj/uip_arp.o + .debug_abbrev 0x00001f10 0x3e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_abbrev 0x00001f4e 0x28 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) -.debug_loc 0x00000000 0x3734 +.debug_loc 0x00000000 0x607f .debug_loc 0x00000000 0x1a7 THUMB Debug/../../obj/system_stm32f4xx.o .debug_loc 0x000001a7 0xf06 THUMB Debug/../../obj/stm32f4xx_can.o .debug_loc 0x000010ad 0x445 THUMB Debug/../../obj/stm32f4xx_gpio.o .debug_loc 0x000014f2 0xdb0 THUMB Debug/../../obj/stm32f4xx_rcc.o - .debug_loc 0x000022a2 0xaeb THUMB Debug/../../obj/stm32f4xx_usart.o - .debug_loc 0x00002d8d 0x109 THUMB Debug/../../obj/boot.o - .debug_loc 0x00002e96 0x6a THUMB Debug/../../obj/led.o - .debug_loc 0x00002f00 0x20 THUMB Debug/../../obj/main.o - .debug_loc 0x00002f20 0x20 THUMB Debug/../../obj/timer.o - .debug_loc 0x00002f40 0x7f4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_loc 0x000022a2 0xe6 THUMB Debug/../../obj/stm32f4xx_syscfg.o + .debug_loc 0x00002388 0xaeb THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_loc 0x00002e73 0x1bd0 THUMB Debug/../../obj/stm32_eth.o + .debug_loc 0x00004a43 0xaa THUMB Debug/../../obj/netdev.o + .debug_loc 0x00004aed 0x109 THUMB Debug/../../obj/boot.o + .debug_loc 0x00004bf6 0x6a THUMB Debug/../../obj/led.o + .debug_loc 0x00004c60 0x20 THUMB Debug/../../obj/main.o + .debug_loc 0x00004c80 0x20 THUMB Debug/../../obj/timer.o + .debug_loc 0x00004ca0 0xd9 THUMB Debug/../../obj/net.o + .debug_loc 0x00004d79 0x64e THUMB Debug/../../obj/uip.o + .debug_loc 0x000053c7 0x4c4 THUMB Debug/../../obj/uip_arp.o + .debug_loc 0x0000588b 0x7f4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) -.debug_aranges 0x00000000 0x7b8 +.debug_aranges 0x00000000 0xc70 .debug_aranges 0x00000000 0x28 THUMB Debug/../../obj/system_stm32f4xx.o .debug_aranges @@ -2312,83 +2831,119 @@ OUTPUT(C:/Work/software/OpenBLT/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossw .debug_aranges 0x00000190 0x180 THUMB Debug/../../obj/stm32f4xx_rcc.o .debug_aranges - 0x00000310 0x100 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000310 0x48 THUMB Debug/../../obj/stm32f4xx_syscfg.o .debug_aranges - 0x00000410 0x38 THUMB Debug/../../obj/boot.o + 0x00000358 0x100 THUMB Debug/../../obj/stm32f4xx_usart.o .debug_aranges - 0x00000448 0x20 THUMB Debug/../../obj/cstart.o + 0x00000458 0x330 THUMB Debug/../../obj/stm32_eth.o .debug_aranges - 0x00000468 0x30 THUMB Debug/../../obj/irq.o + 0x00000788 0x38 THUMB Debug/../../obj/netdev.o .debug_aranges - 0x00000498 0x28 THUMB Debug/../../obj/led.o + 0x000007c0 0x38 THUMB Debug/../../obj/boot.o .debug_aranges - 0x000004c0 0x20 THUMB Debug/../../obj/main.o + 0x000007f8 0x20 THUMB Debug/../../obj/cstart.o .debug_aranges - 0x000004e0 0x40 THUMB Debug/../../obj/timer.o + 0x00000818 0x30 THUMB Debug/../../obj/irq.o .debug_aranges - 0x00000520 0x20 THUMB Debug/../../obj/vectors.o + 0x00000848 0x28 THUMB Debug/../../obj/led.o .debug_aranges - 0x00000540 0x218 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + 0x00000870 0x20 THUMB Debug/../../obj/main.o .debug_aranges - 0x00000758 0x60 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + 0x00000890 0x40 THUMB Debug/../../obj/timer.o + .debug_aranges + 0x000008d0 0x20 THUMB Debug/../../obj/vectors.o + .debug_aranges + 0x000008f0 0x30 THUMB Debug/../../obj/net.o + .debug_aranges + 0x00000920 0x98 THUMB Debug/../../obj/uip.o + .debug_aranges + 0x000009b8 0x40 THUMB Debug/../../obj/uip_arp.o + .debug_aranges + 0x000009f8 0x218 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_aranges + 0x00000c10 0x60 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) -.debug_ranges 0x00000000 0x728 +.debug_ranges 0x00000000 0xb80 .debug_ranges 0x00000000 0x18 THUMB Debug/../../obj/system_stm32f4xx.o .debug_ranges 0x00000018 0xd0 THUMB Debug/../../obj/stm32f4xx_can.o .debug_ranges 0x000000e8 0x78 THUMB Debug/../../obj/stm32f4xx_gpio.o .debug_ranges 0x00000160 0x170 THUMB Debug/../../obj/stm32f4xx_rcc.o - .debug_ranges 0x000002d0 0xf0 THUMB Debug/../../obj/stm32f4xx_usart.o - .debug_ranges 0x000003c0 0x88 THUMB Debug/../../obj/boot.o - .debug_ranges 0x00000448 0x20 THUMB Debug/../../obj/irq.o - .debug_ranges 0x00000468 0x18 THUMB Debug/../../obj/led.o - .debug_ranges 0x00000480 0x10 THUMB Debug/../../obj/main.o - .debug_ranges 0x00000490 0x30 THUMB Debug/../../obj/timer.o - .debug_ranges 0x000004c0 0x10 THUMB Debug/../../obj/vectors.o - .debug_ranges 0x000004d0 0x208 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - .debug_ranges 0x000006d8 0x50 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + .debug_ranges 0x000002d0 0x38 THUMB Debug/../../obj/stm32f4xx_syscfg.o + .debug_ranges 0x00000308 0xf0 THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_ranges 0x000003f8 0x320 THUMB Debug/../../obj/stm32_eth.o + .debug_ranges 0x00000718 0x28 THUMB Debug/../../obj/netdev.o + .debug_ranges 0x00000740 0x88 THUMB Debug/../../obj/boot.o + .debug_ranges 0x000007c8 0x20 THUMB Debug/../../obj/irq.o + .debug_ranges 0x000007e8 0x18 THUMB Debug/../../obj/led.o + .debug_ranges 0x00000800 0x10 THUMB Debug/../../obj/main.o + .debug_ranges 0x00000810 0x30 THUMB Debug/../../obj/timer.o + .debug_ranges 0x00000840 0x10 THUMB Debug/../../obj/vectors.o + .debug_ranges 0x00000850 0x20 THUMB Debug/../../obj/net.o + .debug_ranges 0x00000870 0x88 THUMB Debug/../../obj/uip.o + .debug_ranges 0x000008f8 0x30 THUMB Debug/../../obj/uip_arp.o + .debug_ranges 0x00000928 0x208 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_ranges 0x00000b30 0x50 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) -.debug_line 0x00000000 0x27c9 +.debug_line 0x00000000 0x445e .debug_line 0x00000000 0x21b THUMB Debug/../../obj/system_stm32f4xx.o .debug_line 0x0000021b 0x55e THUMB Debug/../../obj/stm32f4xx_can.o .debug_line 0x00000779 0x3ae THUMB Debug/../../obj/stm32f4xx_gpio.o .debug_line 0x00000b27 0x590 THUMB Debug/../../obj/stm32f4xx_rcc.o - .debug_line 0x000010b7 0x4a2 THUMB Debug/../../obj/stm32f4xx_usart.o - .debug_line 0x00001559 0x2f7 THUMB Debug/../../obj/boot.o - .debug_line 0x00001850 0x127 THUMB Debug/../../obj/cstart.o - .debug_line 0x00001977 0x169 THUMB Debug/../../obj/irq.o - .debug_line 0x00001ae0 0x220 THUMB Debug/../../obj/led.o - .debug_line 0x00001d00 0x1da THUMB Debug/../../obj/main.o - .debug_line 0x00001eda 0x20a THUMB Debug/../../obj/timer.o - .debug_line 0x000020e4 0x121 THUMB Debug/../../obj/vectors.o - .debug_line 0x00002205 0x550 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - .debug_line 0x00002755 0x74 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + .debug_line 0x000010b7 0x27d THUMB Debug/../../obj/stm32f4xx_syscfg.o + .debug_line 0x00001334 0x4a2 THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_line 0x000017d6 0xcd9 THUMB Debug/../../obj/stm32_eth.o + .debug_line 0x000024af 0x35a THUMB Debug/../../obj/netdev.o + .debug_line 0x00002809 0x2f7 THUMB Debug/../../obj/boot.o + .debug_line 0x00002b00 0x127 THUMB Debug/../../obj/cstart.o + .debug_line 0x00002c27 0x169 THUMB Debug/../../obj/irq.o + .debug_line 0x00002d90 0x220 THUMB Debug/../../obj/led.o + .debug_line 0x00002fb0 0x1e9 THUMB Debug/../../obj/main.o + .debug_line 0x00003199 0x20a THUMB Debug/../../obj/timer.o + .debug_line 0x000033a3 0x121 THUMB Debug/../../obj/vectors.o + .debug_line 0x000034c4 0x1ef THUMB Debug/../../obj/net.o + .debug_line 0x000036b3 0x541 THUMB Debug/../../obj/uip.o + .debug_line 0x00003bf4 0x2a6 THUMB Debug/../../obj/uip_arp.o + .debug_line 0x00003e9a 0x550 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_line 0x000043ea 0x74 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) -.debug_str 0x00000000 0x2653 +.debug_str 0x00000000 0x42fd .debug_str 0x00000000 0x356 THUMB Debug/../../obj/system_stm32f4xx.o 0x3a3 (size before relaxing) .debug_str 0x00000356 0x5b4 THUMB Debug/../../obj/stm32f4xx_can.o 0x793 (size before relaxing) - .debug_str 0x0000090a 0x390 THUMB Debug/../../obj/stm32f4xx_gpio.o + .debug_str 0x0000090a 0x38a THUMB Debug/../../obj/stm32f4xx_gpio.o 0x508 (size before relaxing) - .debug_str 0x00000c9a 0x5bc THUMB Debug/../../obj/stm32f4xx_rcc.o + .debug_str 0x00000c94 0x5bc THUMB Debug/../../obj/stm32f4xx_rcc.o 0x8b7 (size before relaxing) - .debug_str 0x00001256 0x488 THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_str 0x00001250 0x1b4 THUMB Debug/../../obj/stm32f4xx_syscfg.o + 0x354 (size before relaxing) + .debug_str 0x00001404 0x488 THUMB Debug/../../obj/stm32f4xx_usart.o 0x70d (size before relaxing) - .debug_str 0x000016de 0x253 THUMB Debug/../../obj/boot.o + .debug_str 0x0000188c 0x12bb THUMB Debug/../../obj/stm32_eth.o + 0x1565 (size before relaxing) + .debug_str 0x00002b47 0x226 THUMB Debug/../../obj/netdev.o + 0xc8f (size before relaxing) + .debug_str 0x00002d6d 0x23b THUMB Debug/../../obj/boot.o 0x920 (size before relaxing) - .debug_str 0x00001931 0xc7 THUMB Debug/../../obj/irq.o + .debug_str 0x00002fa8 0xc7 THUMB Debug/../../obj/irq.o 0x1fc (size before relaxing) - .debug_str 0x000019f8 0xb1 THUMB Debug/../../obj/led.o + .debug_str 0x0000306f 0xb1 THUMB Debug/../../obj/led.o 0x3ec (size before relaxing) - .debug_str 0x00001aa9 0x70 THUMB Debug/../../obj/main.o - 0x204 (size before relaxing) - .debug_str 0x00001b19 0x622 THUMB Debug/../../obj/timer.o + .debug_str 0x00003120 0x80 THUMB Debug/../../obj/main.o + 0x214 (size before relaxing) + .debug_str 0x000031a0 0x622 THUMB Debug/../../obj/timer.o 0x823 (size before relaxing) - .debug_str 0x0000213b 0x93 THUMB Debug/../../obj/vectors.o + .debug_str 0x000037c2 0x93 THUMB Debug/../../obj/vectors.o 0x1c8 (size before relaxing) - .debug_str 0x000021ce 0x3b3 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_str 0x00003855 0x1d4 THUMB Debug/../../obj/net.o + 0x3bd (size before relaxing) + .debug_str 0x00003a29 0x2f8 THUMB Debug/../../obj/uip.o + 0x56a (size before relaxing) + .debug_str 0x00003d21 0x157 THUMB Debug/../../obj/uip_arp.o + 0x344 (size before relaxing) + .debug_str 0x00003e78 0x3b3 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) 0x3fc (size before relaxing) - .debug_str 0x00002581 0xd2 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + .debug_str 0x0000422b 0xd2 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) 0x11b (size before relaxing) .comment 0x00000000 0x4e @@ -2397,13 +2952,19 @@ OUTPUT(C:/Work/software/OpenBLT/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossw .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_can.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_gpio.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_rcc.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_syscfg.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_usart.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32_eth.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/netdev.o .comment 0x00000000 0x4f THUMB Debug/../../obj/boot.o .comment 0x00000000 0x4f THUMB Debug/../../obj/irq.o .comment 0x00000000 0x4f THUMB Debug/../../obj/led.o .comment 0x00000000 0x4f THUMB Debug/../../obj/main.o .comment 0x00000000 0x4f THUMB Debug/../../obj/timer.o .comment 0x00000000 0x4f THUMB Debug/../../obj/vectors.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/net.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/uip.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/uip_arp.o .comment 0x00000000 0x4f C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) .comment 0x00000000 0x4f C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) @@ -2418,22 +2979,36 @@ OUTPUT(C:/Work/software/OpenBLT/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossw .ARM.attributes 0x00000099 0x33 THUMB Debug/../../obj/stm32f4xx_rcc.o .ARM.attributes - 0x000000cc 0x33 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x000000cc 0x33 THUMB Debug/../../obj/stm32f4xx_syscfg.o .ARM.attributes - 0x000000ff 0x33 THUMB Debug/../../obj/boot.o + 0x000000ff 0x33 THUMB Debug/../../obj/stm32f4xx_usart.o .ARM.attributes - 0x00000132 0x27 THUMB Debug/../../obj/cstart.o + 0x00000132 0x33 THUMB Debug/../../obj/stm32_eth.o .ARM.attributes - 0x00000159 0x33 THUMB Debug/../../obj/irq.o + 0x00000165 0x33 THUMB Debug/../../obj/netdev.o .ARM.attributes - 0x0000018c 0x33 THUMB Debug/../../obj/led.o + 0x00000198 0x33 THUMB Debug/../../obj/boot.o .ARM.attributes - 0x000001bf 0x33 THUMB Debug/../../obj/main.o + 0x000001cb 0x27 THUMB Debug/../../obj/cstart.o .ARM.attributes - 0x000001f2 0x33 THUMB Debug/../../obj/timer.o + 0x000001f2 0x33 THUMB Debug/../../obj/irq.o .ARM.attributes - 0x00000225 0x33 THUMB Debug/../../obj/vectors.o + 0x00000225 0x33 THUMB Debug/../../obj/led.o .ARM.attributes - 0x00000258 0x2e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + 0x00000258 0x33 THUMB Debug/../../obj/main.o .ARM.attributes - 0x00000286 0x2e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) + 0x0000028b 0x33 THUMB Debug/../../obj/timer.o + .ARM.attributes + 0x000002be 0x33 THUMB Debug/../../obj/vectors.o + .ARM.attributes + 0x000002f1 0x33 THUMB Debug/../../obj/net.o + .ARM.attributes + 0x00000324 0x33 THUMB Debug/../../obj/uip.o + .ARM.attributes + 0x00000357 0x33 THUMB Debug/../../obj/uip_arp.o + .ARM.attributes + 0x0000038a 0x1e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + .ARM.attributes + 0x000003a8 0x2e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .ARM.attributes + 0x000003d6 0x2e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_user_libc_v7em_t_le_eabi.a(user_libc.o) diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/bin/demoprog_olimex_stm32e407.srec b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/bin/demoprog_olimex_stm32e407.srec index 9dda9a51..3d710917 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/bin/demoprog_olimex_stm32e407.srec +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/bin/demoprog_olimex_stm32e407.srec @@ -1,279 +1,857 @@ S02B0000433A2F576F726B2F736F6674776172652F4F70656E424C542F5461726765742F44656D6F2F41524DEF -S315080080007010002033820008A1900008A190000893 -S31508008010A1900008A1900008A1900008A19000086E -S31508008020A1900008A1900008A1900008A19000085E -S31508008030A1900008A1900008A19000088D90000862 -S31508008040A1900008A1900008A1900008A19000083E -S31508008050A1900008A1900008A1900008A19000082E -S31508008060A1900008A1900008A1900008A19000081E -S31508008070A1900008A1900008A1900008A19000080E -S31508008080A1900008A1900008A1900008A1900008FE -S31508008090A1900008A1900008A1900008A1900008EE -S315080080A0A1900008A1900008A1900008A1900008DE -S315080080B0A1900008A1900008A1900008A1900008CE -S315080080C0A1900008A1900008A1900008A1900008BE -S315080080D0A1900008A1900008A1900008A1900008AE -S315080080E0A1900008A1900008A1900008A19000089E -S315080080F0A1900008A1900008A1900008A19000088E -S31508008100A1900008A1900008A1900008A19000087D -S31508008110A1900008A1900008A1900008A19000086D -S31508008120A1900008A1900008A1900008A19000085D -S31508008130A1900008A1900008A1900008A19000084D -S31508008140A1900008A1900008A1900008A19000083D -S31508008150A1900008A1900008A1900008A19000082D -S31508008160A1900008A1900008A1900008A19000081D -S31508008170A1900008A1900008A1900008A19000080D -S31108008180A1900008A1900008EE11AA5575 -S3150800818C3A49072291438D4639483A493A4A00F00A -S3150800819C39F83A483A493B4A00F034F83A483B49E8 -S315080081AC3B4A00F02FF83B483B493C4A00F02AF87A -S315080081BC3B483C493C4A00F025F83C483C493D4A7A -S315080081CC00F020F83C483D49002200F026F83C48CF -S315080081DC3C49091A082903DB0022026004300160B5 -S315080081EC2D482E49884205D00268043003B49047BE -S315080081FC03BCF7E700208646EC4600200021324AED -S3150800820C9047FEE7884207D0521A05D0037801300A -S3150800821C0B700131013AF9D17047884202D00270CD -S3150800822C0130FAE770474EF68850CEF20000016826 -S3150800823C51F47001016000BF00BF00BFF1EE100AD7 -S3150800824C50F04070E1EE100A4FF0000080F31488ED -S3150800825C4EF63C71CEF20001086850F0407008608A -S3150800826C1A481B490160FFF78BBF000070100020ED -S3150800827C0C9100080000002014000020E082000881 -S3150800828CE0820008E89000080C9100080000002025 -S3150800829C00000020E8900008E8900008E890000824 -S315080082ACE8900008E8900008E8900008E8900008B4 -S315080082BCE89000080C9100081400002070000020BB -S315080082CC70000020700800200990000808ED00E0F6 -S309080082DC0080000808 -S315080082E082B04FF46053C4F202031A6842F00100E8 -S315080082F018604FF000029A60196821F0847020F423 -S315080083008031196043F21000C2F2004058601968C3 -S3150800831021F480201860DA60009201921A6842F40B -S31508008320803119604FF46050C4F20200036803F408 -S3150800833000320192009901F101010091019B1BB9DC -S31508008340009AB2F5A06FF1D14FF46050C4F2020062 -S31508008350016811F4003F14BF012100210191019B1E -S31508008360012B46D14FF46050C4F20200026C42F071 -S31508008370805101644FF4E043C4F200031A6842F4E2 -S315080083804041196083688360826842F400418160D5 -S31508008390836843F4A052826045F20C41C0F24071F2 -S315080083A04160036843F0807202604FF46050C4F283 -S315080083B00200016811F0007FFBD04FF47053C4F23D -S315080083C0020340F205621A604FF46050C4F20200DC -S315080083D0816821F003038360826842F002018160AC -S315080083E04FF46050C4F20200836803F00C02082AB6 -S315080083F0FAD102B0704700BF08B54FF4C843C4F2BB -S31508008400000398420CD14FF000704FF0010100F0C4 -S315080084102FFB4FF000704FF0000100F029FB08BD5C -S315080084204FF080604FF0010100F022FB4FF08060B2 -S315080084304FF0000100F01CFB08BD00BF036823F0E5 -S3150800844002020260036843F001020260436813F007 -S31508008450010F0BD14FF6FF73426812F0010F05D1D9 -S3150800846003F1FF33426812F0010F6ED0426812F032 -S31508008470010F60D08B79012B02680CBF42F0800295 -S3150800848022F080020260CB79012B02680CBF42F011 -S31508008490400222F0400202600B7A012B02680CBFF0 -S315080084A042F0200222F0200202604B7A012B026879 -S315080084B00CBF42F0100222F0100202608B7A012BE8 -S315080084C002680CBF42F0080222F008020260CB7A6A -S315080084D0012B02680CBF42F0040222F0040202607B -S315080084E0CA788B784FEA837343EA02630A7943EAC8 -S315080084F002434A7943EA0252098801F1FF331A43D3 -S31508008500C261016821F001030360426812F0010F9D -S315080085100BD04FF6FF73416811F0010F05D003F138 -S31508008520FF33426812F0010F08D1406880F001025B -S3150800853002F0010070474FF000007047416811F0E3 -S31508008540010FF2D0023BE6D1EFE7426812F0010FC5 -S315080085508CD1023B80D189E770B4837A4FF0010150 -S3150800856001FA03F14FF4C843C4F20003D3F800221A -S3150800857042F00104C3F80042D3F81C426FEA010234 -S315080085801440C3F81C42037BDBB94FF4C843C4F25A -S315080085900003D3F80C521540C3F80C52847AC688E7 -S315080085A0458845EA064604F1480443F83460857A66 -S315080085B08688048844EA064405F1480503EBC503A2 -S315080085C05C60047B012C1CD14FF4C843C4F2000341 -S315080085D0D3F80C5241EA0506C3F80C62847A068879 -S315080085E0458845EA064604F1480443F83460857A26 -S315080085F08688C48844EA064405F1480503EBC503A2 -S315080086005C60C47A4CB94FF4C843C4F20003D3F88B -S3150800861004421440C3F8044208E04FF4C843C4F2C5 -S315080086200003D3F804420C43C3F80442038943B950 -S315080086304FF4C843C4F20003D3F814422240C3F8E7 -S3150800864014220289012A08D14FF4C843C4F2000350 -S31508008650D3F814220A43C3F81422407B012808D110 -S315080086604FF4C843C4F20003D3F81C221143C3F8DD -S315080086701C124FF4C841C4F20001D1F8000220F0E0 -S315080086800103C1F8003270BC704700BF4FF0000309 -S315080086908371C371037243728372C3728370C3702A -S315080086A04FF0030101714FF0020242714FF00103CE -S315080086B00380704730B401F11B034FEA03140559D0 -S315080086C005F00403DCB2147244B901F11B034FEA46 -S315080086D0031405594FEA5553136007E001F11B05CA -S315080086E04FEA0513C4584FEAD405556001F11B0437 -S315080086F04FEA04154319445904F0020555725C689B -S3150800870004F00F0595725B684FEA1324D47400EBE6 -S31508008710011303F5DC74D3F8B851D572D3F8B85100 -S315080087204FEA15251573D3F8B8514FEA1545557311 -S31508008730D3F8B8314FEA136393736368D3736368E6 -S315080087404FEA1323137463684FEA13435374636839 -S315080087504FEA1363937421B9C36843F02001C160DB -S3150800876003E0016941F02002026130BC704700BF96 -S3150800877019B9C16801F003007047012903D10069DE -S3150800878000F0030070474FF0000070472DE9F00134 -S315080087904FF000034FF001054FF0030705FA03F207 -S315080087A00C68144094423DD106684FEA430207FA22 -S315080087B002F46FEA040426400660066891F804C0CD -S315080087C00CFA02FC4CEA060606600E7906F1FF363C -S315080087D0F6B2012E17D886683440846086684C79CC -S315080087E004FA02F43443846046689CB205FA04FC31 -S315080087F026EA0C064660466891F806C00CFA04F4A8 -S31508008800A4B234434460C6689CB24FEA440407FAEB -S3150800881004F426EA0406C660C468CE7906FA02F2AB -S315080088202243C26003F101031C4605FA03F20E68EF -S315080088301640964253D102E0BDE8F0017047D0F8E1 -S3150800884000804FEA430207FA02F66FEA060606EACE -S31508008850080CC0F800C0D0F8008091F804C00CFAE3 -S3150800886002FC4CEA080CC0F800C091F804C00CF1F0 -S31508008870FF3C5FFA8CFCBCF1010F0FD9C668A4B2A5 -S315080088804FEA440407FA04F426EA0406C660C468F4 -S31508008890CE7906FA02F22243C26020E0D0F80880B8 -S315080088A006EA08068660866891F805C00CFA02F89A -S315080088B048EA06068660D0F804C09EB205FA06F8AD -S315080088C02CEA080CC0F804C0D0F804C091F8068059 -S315080088D008FA06F6B6B246EA0C064660CEE703F193 -S315080088E00103102B7FF45AAFA6E700BF0183704738 -S315080088F04183704730B401F007034FEA83034FEA18 -S31508008900D10101F1080150F821504FF00F0404FA83 -S3150800891003F425EA040440F8214050F8214002FAFD -S3150800892003F2144340F8214030BC704710B44FF4AA -S315080089306053C4F20203996801F00C02042A09D0B4 -S31508008940082A0DD0002A38D14FF41053C0F2F40388 -S31508008950036037E04FF4D853C0F2B703036031E041 -S315080089604FF46051C4F202014C684A6802F03F01B4 -S3150800897014F4800F4FF46053C4F202035A68C2F32A -S31508008980881319BF4FF4D854C0F2B7044FF41054E3 -S31508008990C0F2F404B4FBF1F404FB03F14FF46052A3 -S315080089A0C4F202025368C3F3014404F101044FEA16 -S315080089B04402B1FBF2F1016004E04FF41054C0F236 -S315080089C0F40404604FF46053C4F202039C68C4F3D1 -S315080089D0031240F20401C2F200018C5C026822FA1A -S315080089E004F242609C68C4F382240C5D22FA04F403 -S315080089F084609B68C3F34233C95C22FA01F2C26001 -S31508008A0010BC704739B14FF46051C4F202010B6BC8 -S31508008A101843086370474FF46053C4F202031A6B95 -S31508008A2022EA00001863704739B14FF46051C4F266 -S31508008A3002010B6C1843086470474FF46053C4F284 -S31508008A4002031A6C22EA00001864704739B14FF421 -S31508008A506051C4F202014B6C1843486470474FF4E6 -S31508008A606053C4F202035A6C22EA00005864704745 -S31508008A7039B14FF46051C4F202010B6A1843086217 -S31508008A8070474FF46053C4F202031A6A22EA0000E0 -S31508008A901862704730B585B004460D46038A23F43C -S31508008AA040504FEA00414FEA1143EA8813432382B4 -S31508008AB0A08920F4B05121F00C034FEA03424FEA93 -S31508008AC012402989AB8841EA030269890A4393B2AD -S31508008AD01843A081A28A22F440714FEA01434FEA63 -S31508008AE01340AA891043A0826846FFF71FFF4FF478 -S31508008AF08051C4F201018C4205D04FF4A053C4F250 -S31508008B0001039C4201D1039800E00298A28911B2A0 -S31508008B10002909DA00EB800101EB81002B684FEA96 -S31508008B204305B0FBF5F208E000EB800303EB830096 -S31508008B302D684FEA8502B0FBF2F248F21F51C5F2E2 -S31508008B40EB11A1FB02104FEA50134FEA03154FF041 -S31508008B50640103FB1122A08903B2002B0DDA4FEA48 -S31508008B60C20202F1320248F21F51C5F2EB11A1FB13 -S31508008B700220C0F342132B430CE04FEA021202F123 -S31508008B80320248F21F51C5F2EB11A1FB0220C0F3D5 -S31508008B9043132B439BB2238105B030BD29B181898C -S31508008BA08AB242F4005383817047838923F40051C3 -S31508008BB04FEA01424FEA12438381704780884FEAA1 -S31508008BC0C0514FEAD1507047038819420CBF0020A4 -S31508008BD001207047BFF34F8F4FF46D42CEF200026B -S31508008BE0D16801F4E0604FF00403C0F2FA5340EA9A -S31508008BF00301D160BFF34F8FFEE700BF10B50446EF -S31508008C004FF4A050C4F201004FF02001FFF7DCFF3B -S31508008C10012809D14FF4A050C4F20100FFF7CEFF96 -S31508008C2020704FF0010010BD4FF0000010BD00BFCE -S31508008C302DE9F04F8DB04FF020004FF00101FFF7FE -S31508008C4005FF4FF004004FF00101FFF7DBFE4FF47C -S31508008C50006AC4F2020A50464FF006014FF00802B5 -S31508008C60FFF748FE50464FF007014FF00802FFF79E -S31508008C7041FE4FF000048DF81A404FF001098DF8B7 -S31508008C801B904FF002088DF818804FF040030593AB -S31508008C908DF81980504605A9FFF778FD8DF81880DC -S31508008CA04FF080000590504605A9FFF76FFD4FF479 -S31508008CB061410891A346ADF82440ADF82640ADF8C9 -S31508008CC02840ADF82C404FF00C02ADF82A204FF49E -S31508008CD0A056C4F20106304608A9FFF7DBFE304667 -S31508008CE04946FFF75BFF40464946FFF78BFE4FF4C0 -S31508008CF0806AC4F2020A50464FF005014FF0090295 -S31508008D00FFF7F8FD50464FF006014FF00902FFF74E -S31508008D10F1FD4FF0600303938DF810808DF81180F4 -S31508008D208DF812408DF81390504603A9FFF72EFDD3 -S31508008D304FF0C0604946FFF777FE4FF4D040C4F2C3 -S31508008D400000FFF759FB05A8FFF7A0FC224649F2E9 -S31508008D50E800C0F600004FF4FA714AF2104340F2F8 -S31508008D60FF39145C00EB020E9EF801E004EB0E0CD2 -S31508008D700CFB011693FBF6F806FB183636B9454682 -S31508008D8008F1FF3C1FFA8CF64E4512D902F1020291 -S31508008D90845C00EB020E9EF801E004EB0E0C0CFB63 -S31508008DA0011693FBF6F806FB1838B8F1000F4BD1FD -S31508008DB042E0CDF804E027464FF000048DF81A404B -S31508008DC08DF81B408DF81C408DF81D408DF81E400F -S31508008DD08DF81F408DF816408DF8174007F1FF37BC -S31508008DE08DF81870019A02F1FF368DF819600CA9F2 -S31508008DF021F81C5D4FF4D040C4F20000FFF71EFBBB -S31508008E004FF00E008DF82A008DF82B404FF0010127 -S31508008E108DF82C10ADF82040ADF82240ADF824406E -S31508008E20ADF82640ADF828408DF82D1008A8FFF7B4 -S31508008E3093FB0DB0BDE8F08F93FBF6F505F1FF3C0B -S31508008E401FFA8CF64E45B4D902F10202242A88D1BB -S31508008E50B2E700BF00B587B040F25903C2F200037B -S31508008E601878B0B940F21400C2F20000FFF7C6FE47 -S31508008E70012844D140F25900C2F200004FF0010225 -S31508008E80027040F25801C2F200014FF000030B7065 -S31508008E9035E040F25801C2F200010A7802F10102F7 -S31508008EA040F21403C2F200039818FFF7A7FE012840 -S31508008EB025D140F25800C2F20000017801F1010103 -S31508008EC0CBB2037040F21402C2F200021078984244 -S31508008ED015D140F25901C2F200014FF000030B70A0 -S31508008EE040F21402C2F200025078FF2807D140F27D -S31508008EF01401C2F200018B780BB9FFF76BFE4FF431 -S31508008F00D040C4F200004FF00001FFF731FCB0B1C9 -S31508008F104FF4D040C4F200004FF0000101AAFFF759 -S31508008F20C9FB40F26760019A824208D19DF80F108A -S31508008F30FF2904D19DF810300BB9FFF74BFE07B097 -S31508008F4000BD00BF62B6704730B583B04FF004006D -S31508008F504FF00101FFF756FD4FF4005500954FF00D -S31508008F6001038DF804304FF000028DF806208DF8C5 -S31508008F7007304FF002008DF805004FF40064C4F284 -S31508008F80020420466946FFF701FC20462946FFF7FA -S31508008F90ADFC03B030BD00BF10B500F071F8044653 -S31508008FA040F25C03C2F200031868211AB1F5FA7F91 -S31508008FB029D340F26002C2F2000213787BB940F26C -S31508008FC06003C2F200034FF001021A704FF400600A -S31508008FD0C4F202004FF40051FFF78AFC0EE040F29B -S31508008FE06000C2F200004FF0000101704FF400600B -S31508008FF0C4F202004FF40051FFF778FC40F25C001F -S31508009000C2F20000046010BD08B5FFF769F9FFF762 -S315080090109BFF00F00FF8FFF795FFFFF709FEFFF734 -S31508009020BBFFFFF717FFFAE740F26403C2F200033B -S315080090301860704708B540F20003C2F200031A68C8 -S3150800904044F6D350C1F26200A0FB02134FEA931113 -S3150800905001F1FF324EF21003CEF200035A604FF4CC -S315080090606D40CEF200004FF0F00180F823104FF06B -S31508009070000098604FF007021A60FFF7D5FF08BD99 -S3150800908040F26403C2F200031868704740F26403B2 -S31508009090C2F200031A6802F101021A60704700BFA3 -S315080090A0FEE700BF38B504460D4600F019F840F251 -S315080090B06803C2F200031D6044F0800440F26C00AD -S315080090C0C2F200000460024611680029FCD100F0D3 -S315080090D009F840F26803C2F20003186838BD00BFF9 -S30D080090E0704700BF704700BF8E -S315080090E805020602060307030803090309040A0416 -S315080090F80B040C040C050D050E050F050F061006C6 -S309080091081007100826 -S3150800910C007A030A000000000102030401020304AA -S3090800911C0607080923 -S705080082333D +S3150800C000B425002033C20008DDD90008DDD90008B0 +S3150800C010DDD90008DDD90008DDD90008DDD900081A +S3150800C020DDD90008DDD90008DDD90008DDD900080A +S3150800C030DDD90008DDD90008DDD90008C9D900080E +S3150800C040DDD90008DDD90008DDD90008DDD90008EA +S3150800C050DDD90008DDD90008DDD90008DDD90008DA +S3150800C060DDD90008DDD90008DDD90008DDD90008CA +S3150800C070DDD90008DDD90008DDD90008DDD90008BA +S3150800C080DDD90008DDD90008DDD90008DDD90008AA +S3150800C090DDD90008DDD90008DDD90008DDD900089A +S3150800C0A0DDD90008DDD90008DDD90008DDD900088A +S3150800C0B0DDD90008DDD90008DDD90008DDD900087A +S3150800C0C0DDD90008DDD90008DDD90008DDD900086A +S3150800C0D0DDD90008DDD90008DDD90008DDD900085A +S3150800C0E0DDD90008DDD90008DDD90008DDD900084A +S3150800C0F0DDD90008DDD90008DDD90008DDD900083A +S3150800C100DDD90008DDD90008DDD90008DDD9000829 +S3150800C110DDD90008DDD90008DDD90008DDD9000819 +S3150800C120DDD90008DDD90008DDD90008DDD9000809 +S3150800C130DDD90008DDD90008DDD90008DDD90008F9 +S3150800C140DDD90008DDD90008DDD90008DDD90008E9 +S3150800C150DDD90008DDD90008DDD90008DDD90008D9 +S3150800C160DDD90008DDD90008DDD90008DDD90008C9 +S3150800C170DDD90008DDD90008DDD90008DDD90008B9 +S3110800C180DDD90008DDD90008EE11AA552B +S3150800C18C3A49072291438D4639483A493A4A00F0CA +S3150800C19C39F83A483A493B4A00F034F83A483B49A8 +S3150800C1AC3B4A00F02FF83B483B493C4A00F02AF83A +S3150800C1BC3B483C493C4A00F025F83C483C493D4A3A +S3150800C1CC00F020F83C483D49002200F026F83C488F +S3150800C1DC3C49091A082903DB002202600430016075 +S3150800C1EC2D482E49884205D00268043003B490477E +S3150800C1FC03BCF7E700208646EC4600200021324AAD +S3150800C20C9047FEE7884207D0521A05D003780130CA +S3150800C21C0B700131013AF9D17047884202D002708D +S3150800C22C0130FAE770474EF68850CEF200000168E6 +S3150800C23C51F47001016000BF00BF00BFF1EE100A97 +S3150800C24C50F04070E1EE100A4FF0000080F31488AD +S3150800C25C4EF63C71CEF20001086850F0407008604A +S3150800C26C1A481B490160FFF78BBF0000B425002054 +S3150800C27C34F500080000002014000020E0C2000875 +S3150800C28CE0C2000808F5000834F500080000002094 +S3150800C29C0000002008F5000808F5000808F5000855 +S3150800C2AC08F5000808F5000808F5000808F5000860 +S3150800C2BC08F5000834F5000814000020B415002011 +S3150800C2CCB4150020B41D00203DD9000808ED00E087 +S3090800C2DC00C0000888 +S3150800C2E082B04FF46053C4F202031A6842F00100A8 +S3150800C2F018604FF000029A60196821F0847020F4E3 +S3150800C3008031196043F21000C2F200405860196883 +S3150800C31021F480201860DA60009201921A6842F4CB +S3150800C320803119604FF46050C4F20200036803F4C8 +S3150800C33000320192009901F101010091019B1BB99C +S3150800C340009AB2F5A06FF1D14FF46050C4F2020022 +S3150800C350016811F4003F14BF012100210191019BDE +S3150800C360012B46D14FF46050C4F20200026C42F031 +S3150800C370805101644FF4E043C4F200031A6842F4A2 +S3150800C3804041196083688360826842F40041816095 +S3150800C390836843F4A052826045F20C41C0F24071B2 +S3150800C3A04160036843F0807202604FF46050C4F243 +S3150800C3B00200016811F0007FFBD04FF47053C4F2FD +S3150800C3C0020340F205621A604FF46050C4F202009C +S3150800C3D0816821F003038360826842F0020181606C +S3150800C3E04FF46050C4F20200836803F00C02082A76 +S3150800C3F0FAD102B0704700BF08B54FF4C843C4F27B +S3150800C400000398420CD14FF000704FF0010100F084 +S3150800C41041FB4FF000704FF0000100F03BFB08BDF8 +S3150800C4204FF080604FF0010100F034FB4FF0806060 +S3150800C4304FF0000100F02EFB08BD00BF036823F093 +S3150800C44002020260036843F001020260436813F0C7 +S3150800C450010F0BD14FF6FF73426812F0010F05D199 +S3150800C46003F1FF33426812F0010F6ED0426812F0F2 +S3150800C470010F60D08B79012B02680CBF42F0800255 +S3150800C48022F080020260CB79012B02680CBF42F0D1 +S3150800C490400222F0400202600B7A012B02680CBFB0 +S3150800C4A042F0200222F0200202604B7A012B026839 +S3150800C4B00CBF42F0100222F0100202608B7A012BA8 +S3150800C4C002680CBF42F0080222F008020260CB7A2A +S3150800C4D0012B02680CBF42F0040222F0040202603B +S3150800C4E0CA788B784FEA837343EA02630A7943EA88 +S3150800C4F002434A7943EA0252098801F1FF331A4393 +S3150800C500C261016821F001030360426812F0010F5D +S3150800C5100BD04FF6FF73416811F0010F05D003F1F8 +S3150800C520FF33426812F0010F08D1406880F001021B +S3150800C53002F0010070474FF000007047416811F0A3 +S3150800C540010FF2D0023BE6D1EFE7426812F0010F85 +S3150800C5508CD1023B80D189E770B4837A4FF0010110 +S3150800C56001FA03F14FF4C843C4F20003D3F80022DA +S3150800C57042F00104C3F80042D3F81C426FEA0102F4 +S3150800C5801440C3F81C42037BDBB94FF4C843C4F21A +S3150800C5900003D3F80C521540C3F80C52847AC688A7 +S3150800C5A0458845EA064604F1480443F83460857A26 +S3150800C5B08688048844EA064405F1480503EBC50362 +S3150800C5C05C60047B012C1CD14FF4C843C4F2000301 +S3150800C5D0D3F80C5241EA0506C3F80C62847A068839 +S3150800C5E0458845EA064604F1480443F83460857AE6 +S3150800C5F08688C48844EA064405F1480503EBC50362 +S3150800C6005C60C47A4CB94FF4C843C4F20003D3F84B +S3150800C61004421440C3F8044208E04FF4C843C4F285 +S3150800C6200003D3F804420C43C3F80442038943B910 +S3150800C6304FF4C843C4F20003D3F814422240C3F8A7 +S3150800C64014220289012A08D14FF4C843C4F2000310 +S3150800C650D3F814220A43C3F81422407B012808D1D0 +S3150800C6604FF4C843C4F20003D3F81C221143C3F89D +S3150800C6701C124FF4C841C4F20001D1F8000220F0A0 +S3150800C6800103C1F8003270BC704700BF4FF00003C9 +S3150800C6908371C371037243728372C3728370C370EA +S3150800C6A04FF0030101714FF0020242714FF001038E +S3150800C6B00380704730B401F11B034FEA0314055990 +S3150800C6C005F00403DCB2147244B901F11B034FEA06 +S3150800C6D0031405594FEA5553136007E001F11B058A +S3150800C6E04FEA0513C4584FEAD405556001F11B04F7 +S3150800C6F04FEA04154319445904F0020555725C685B +S3150800C70004F00F0595725B684FEA1324D47400EBA6 +S3150800C710011303F5DC74D3F8B851D572D3F8B851C0 +S3150800C7204FEA15251573D3F8B8514FEA15455573D1 +S3150800C730D3F8B8314FEA136393736368D3736368A6 +S3150800C7404FEA1323137463684FEA134353746368F9 +S3150800C7504FEA1363937421B9C36843F02001C1609B +S3150800C76003E0016941F02002026130BC704700BF56 +S3150800C77019B9C16801F003007047012903D100699E +S3150800C78000F0030070474FF0000070472DE9F001F4 +S3150800C7904FF000034FF001054FF0030705FA03F2C7 +S3150800C7A00C68144094423DD106684FEA430207FAE2 +S3150800C7B002F46FEA040426400660066891F804C08D +S3150800C7C00CFA02FC4CEA060606600E7906F1FF36FC +S3150800C7D0F6B2012E17D886683440846086684C798C +S3150800C7E004FA02F43443846046689CB205FA04FCF1 +S3150800C7F026EA0C064660466891F806C00CFA04F468 +S3150800C800A4B234434460C6689CB24FEA440407FAAB +S3150800C81004F426EA0406C660C468CE7906FA02F26B +S3150800C8202243C26003F101031C4605FA03F20E68AF +S3150800C8301640964253D102E0BDE8F0017047D0F8A1 +S3150800C84000804FEA430207FA02F66FEA060606EA8E +S3150800C850080CC0F800C0D0F8008091F804C00CFAA3 +S3150800C86002FC4CEA080CC0F800C091F804C00CF1B0 +S3150800C870FF3C5FFA8CFCBCF1010F0FD9C668A4B265 +S3150800C8804FEA440407FA04F426EA0406C660C468B4 +S3150800C890CE7906FA02F22243C26020E0D0F8088078 +S3150800C8A006EA08068660866891F805C00CFA02F85A +S3150800C8B048EA06068660D0F804C09EB205FA06F86D +S3150800C8C02CEA080CC0F804C0D0F804C091F8068019 +S3150800C8D008FA06F6B6B246EA0C064660CEE703F153 +S3150800C8E00103102B7FF45AAFA6E700BF01837047F8 +S3150800C8F04183704730B401F007034FEA83034FEAD8 +S3150800C900D10101F1080150F821504FF00F0404FA43 +S3150800C91003F425EA040440F8214050F8214002FABD +S3150800C92003F2144340F8214030BC704710B44FF46A +S3150800C9306053C4F20203996801F00C02042A09D074 +S3150800C940082A0DD0002A38D14FF41053C0F2F40348 +S3150800C950036037E04FF4D853C0F2B703036031E001 +S3150800C9604FF46051C4F202014C684A6802F03F0174 +S3150800C97014F4800F4FF46053C4F202035A68C2F3EA +S3150800C980881319BF4FF4D854C0F2B7044FF41054A3 +S3150800C990C0F2F404B4FBF1F404FB03F14FF4605263 +S3150800C9A0C4F202025368C3F3014404F101044FEAD6 +S3150800C9B04402B1FBF2F1016004E04FF41054C0F2F6 +S3150800C9C0F40404604FF46053C4F202039C68C4F391 +S3150800C9D0031240F20401C2F200018C5C026822FADA +S3150800C9E004F242609C68C4F382240C5D22FA04F4C3 +S3150800C9F084609B68C3F34233C95C22FA01F2C260C1 +S3150800CA0010BC704739B14FF46051C4F202010B6B88 +S3150800CA101843086370474FF46053C4F202031A6B55 +S3150800CA2022EA00001863704739B14FF46051C4F226 +S3150800CA3002010B6C1843086470474FF46053C4F244 +S3150800CA4002031A6C22EA00001864704739B14FF4E1 +S3150800CA506051C4F202014B6C1843486470474FF4A6 +S3150800CA606053C4F202035A6C22EA00005864704705 +S3150800CA7039B14FF46051C4F202010B6918430861D9 +S3150800CA8070474FF46053C4F202031A6922EA0000A1 +S3150800CA901861704739B14FF46051C4F202010B6A4C +S3150800CAA01843086270474FF46053C4F202031A6AC7 +S3150800CAB022EA0000186270474FF0DC03C4F227230D +S3150800CAC01860704730B585B004460D46038A23F4CE +S3150800CAD040504FEA00414FEA1143EA881343238244 +S3150800CAE0A08920F4B05121F00C034FEA03424FEA23 +S3150800CAF012402989AB8841EA030269890A4393B23D +S3150800CB001843A081A28A22F440714FEA01434FEAF2 +S3150800CB101340AA891043A0826846FFF707FF4FF41F +S3150800CB208051C4F201018C4205D04FF4A053C4F2DF +S3150800CB3001039C4201D1039800E00298A28911B230 +S3150800CB40002909DA00EB800101EB81002B684FEA26 +S3150800CB504305B0FBF5F208E000EB800303EB830026 +S3150800CB602D684FEA8502B0FBF2F248F21F51C5F272 +S3150800CB70EB11A1FB02104FEA50134FEA03154FF0D1 +S3150800CB80640103FB1122A08903B2002B0DDA4FEAD8 +S3150800CB90C20202F1320248F21F51C5F2EB11A1FBA3 +S3150800CBA00220C0F342132B430CE04FEA021202F1B3 +S3150800CBB0320248F21F51C5F2EB11A1FB0220C0F365 +S3150800CBC043132B439BB2238105B030BD29B181891C +S3150800CBD08AB242F4005383817047838923F4005153 +S3150800CBE04FEA01424FEA12438381704780884FEA31 +S3150800CBF0C0514FEAD1507047038819420CBF002034 +S3150800CC000120704708B54FF000704FF00101FFF79B +S3150800CC102FFF4FF000704FF00001FFF729FF08BD06 +S3150800CC204FF00003036043608360C36003614361A0 +S3150800CC308361C361036243628362C36203634363BE +S3150800CC408363C3634FF0400202644FF020014164DE +S3150800CC508364C364036543658365C36503664FF0F0 +S3150800CC60800242668366C366036743678367C36752 +S3150800CC704FF08061C0F880104FF00072C0F8842031 +S3150800CC804FF08071C0F888104FF40011C0F88C106E +S3150800CC90C0F89030C0F89430C0F89830C0F89C308E +S3150800CCA0C0F8A030C0F8A420C0F8A8304FF400326D +S3150800CCB0C0F8AC204FF48071C0F8B010C0F8B4309A +S3150800CCC0C0F8B830704700BF82B04FF00003019338 +S3150800CCD04FF40043C4F202031A6902F01C024FEA39 +S3150800CCE0C06042EA10424FEA811101F4F86002433B +S3150800CCF042F001021A614FF40040C4F202004FF6F6 +S3150800CD00FE71C0F20401019B03F10103019302695C +S3150800CD1012F0010F02D0019B8B42F4D901984FF60D +S3150800CD20FF71C0F20401884206D04FF40042C4F2F3 +S3150800CD300202536998B201E04FF0000002B0704752 +S3150800CD4010B483B04FF0000301934FF40043C4F2CC +S3150800CD5002031C6904F01C0444F003044FEAC06093 +S3150800CD6044EA10444FEA811101F4F86004435A6119 +S3150800CD701C614FF40042C4F202024FF6FE71C0F283 +S3150800CD800401019B03F101030193106910F0010FDF +S3150800CD9002D0019B8B42F4D9019A4FF6FF71C0F27B +S3150800CDA00401501A18BF012003B010BC704700BF19 +S3150800CDB0F0B587B004460D464FF00003059300937F +S3150800CDC04FF40040C4F20200066926F01C0601A8CA +S3150800CDD0FFF7ACFD02994FF45342CFF6CE628B189B +S3150800CDE04EF2BF10C0F2E400834202D846F00806AD +S3150800CDF01AE04FF24012CFF6E9528B1847F63F0079 +S3150800CE00C0F27D10834202D846F00C060CE04FF4BF +S3150800CE10F242CFF66C4289184FF4B443C0F262234B +S3150800CE20994288BF46F004064FF40040C4F2020057 +S3150800CE30066128464FF000014FF40042FFF780FFD5 +S3150800CE40002800F01C814FF080620592059931B1E7 +S3150800CE50059B03F1FF300590059A002AF8D1216851 +S3150800CE60002963D04FF001074FF6FE76C0F204069C +S3150800CE70009800F10100009028463946FFF724FF84 +S3150800CE8000F0040293B213B90099B142F0D90098A0 +S3150800CE904FF6FF72C0F20402904200F0F3804FF0A2 +S3150800CEA00001009128464FF48052FFF749FF0028F9 +S3150800CEB000F0EB804FF001074FF6FE76C0F204064D +S3150800CEC0009B03F10103009328463946FFF7FCFE51 +S3150800CED000F0200188B210B9009AB242F0D9009940 +S3150800CEE04FF6FF73C0F20403994200F0D1804FF069 +S3150800CEF00000009028464FF01001FFF7E5FE00F00D +S3150800CF00040291B219B14FF40062226202E04FF0B6 +S3150800CF100003236200F0020081B219B14FF000024B +S3150800CF2062611EE04FF4804363611AE06369206A18 +S3150800CF304FEAD00242EA530328464FF000019AB25C +S3150800CF40FFF7FEFE002800F0A6806FF07F410591EE +S3150800CF50059830B1059A02F1FF3305930599002922 +S3150800CF60F8D14FF40043C4F20203186848F20F12CE +S3150800CF70CFF620720240A06861680843E16808435A +S3150800CF802169084361690843A1690843E1690843BF +S3150800CF90216A0843616A0843A16A0843E16A0843AB +S3150800CFA0216B0843616B084302431A60E16BA06B6F +S3150800CFB00143226C1143606C0143A26C1143E06C7F +S3150800CFC00143226D1143606D01435960A26D9A6059 +S3150800CFD0E06DD8609869A16E626E1143E26E1143E6 +S3150800CFE0226F1143626F11434FF64172024041EAC4 +S3150800CFF00200216E40EA01429A61E06FA16F40EAA1 +S3150800D0000102DA6103F58053986943F62372CFF675 +S3150800D010DE020240D4F88400D4F880100843D4F81D +S3150800D02088100843D4F88C100843D4F890100843A5 +S3150800D030D4F894100843D4F898100843D4F89C10F0 +S3150800D0400843D4F8A010084302439A61D4F8A41000 +S3150800D050D4F8A800014341F40001D4F8AC201143E8 +S3150800D060D4F8B0000143D4F8B82041EA0200D4F855 +S3150800D070B41040EA81021A604FF001000DE04FF04B +S3150800D08000000AE04FF0000007E04FF0000004E05F +S3150800D0904FF0000001E04FF0000007B0F0BD00BF00 +S3150800D0A040B14FF40041C4F202010B6843F0080294 +S3150800D0B00A6070474FF40043C4F202031A6822F06C +S3150800D0C008001860704700BF40B14FF40041C4F231 +S3150800D0D002010B6843F004020A6070474FF40043EC +S3150800D0E0C4F202031A6822F004001860704700BFF1 +S3150800D0F04FF41043C4F202031A6842F001001860A4 +S3150800D100704700BF4FF41043C4F20203186800F0DA +S3150800D110010070474FF41043C4F202039A6942F4BF +S3150800D12080109861704700BF40B14FF41041C4F2B7 +S3150800D13002018B6943F400528A6170474FF4104329 +S3150800D140C4F202039A6922F400509861704700BF3E +S3150800D15040B14FF41041C4F202018B6943F0020258 +S3150800D1608A6170474FF41043C4F202039A6922F0A9 +S3150800D17002009861704700BF08B54FF00100FFF73D +S3150800D1808FFFFFF7C7FF4FF00100FFF79DFF4FF036 +S3150800D1900100FFF7C9FF4FF00100FFF7D9FF08BDEF +S3150800D1A02DE9F04FB3B04FF0F0504FF00101FFF703 +S3150800D1B029FC4FF047004FF00101FFF723FC4FF41D +S3150800D1C080404FF00101FFF741FC4FF00100FFF7E7 +S3150800D1D073FC4FF08E0330934FF000068DF8C6604F +S3150800D1E04FF002058DF8C4508DF8C7608DF8C5500C +S3150800D1F03746C4F20207384630A9FFF7C7FA384659 +S3150800D2004FF001014FF00B02FFF774FB3846294631 +S3150800D2104FF00B02FFF76EFB38464FF003014FF055 +S3150800D2200B02FFF767FB38464FF007014FF00B027A +S3150800D230FFF760FB4FF4006030908DF8C6608DF8FC +S3150800D240C4508DF8C7608DF8C5504FF4C057C4F266 +S3150800D2500207384630A9FFF799FA38464FF00B010E +S3150800D2600A46FFF747FB4FF0320130918DF8C6604A +S3150800D2708DF8C4508DF8C7608DF8C5504FF4006816 +S3150800D280C4F20208404630A9FFF780FA40464FF03C +S3150800D29001014FF00B02FFF72DFB40464FF004014A +S3150800D2A04FF00B02FFF726FB40464FF005014FF003 +S3150800D2B00B02FFF71FFB4FF4C04230928DF8C66091 +S3150800D2C08DF8C4508DF8C7608DF8C550384630A91A +S3150800D2D0FFF75CFA38464FF00D014FF00B02FFF7E7 +S3150800D2E009FB38464FF00E014FF00B02FFF702FB21 +S3150800D2F0FFF788FCFFF7FCFEFFF704FF0128FBD0C9 +S3150800D30001A8FFF78DFC4FF00005019508954FF42D +S3150800D31000730B930C954FF000460F964FF02000C4 +S3150800D32012901495159516954FF4006709974FF4C2 +S3150800D330804106914FF0020A4FF0030941F219673E +S3150800D340C0F222074CF2F108C0F20708AEB2304626 +S3150800D3505146FFF7B9FC60F31F4430464946FFF7CC +S3150800D360B3FC60F30F04BC4214D0444512D005F157 +S3150800D370010B5D461FFA8BF630465146FFF7A4FCB3 +S3150800D38060F31F4430464946FFF79EFC60F30F04DE +S3150800D390BC4234D101A8A9B2FFF70AFD40F2807356 +S3150800D3A0C2F2000340F60002C2F200029A60DB6095 +S3150800D3B04FF000021A605A604FF41041C4F202019D +S3150800D3C00B6140F28003C2F2000340F20010C2F281 +S3150800D3D0000098601A60DB605A604FF040025A718C +S3150800D3E09A884FF4C86060F30C029A804FF0800266 +S3150800D3F0DA70CB60FFF7C0FE33B0BDE8F08F444566 +S3150800D400C8D00BF10105202DA0D1C3E741F22C535A +S3150800D410C2F200034FF008021A704FF0000058706D +S3150800D4204FF0270199704FF06902DA704FF05B00F0 +S3150800D43018714FF045015971704700BF38B540F271 +S3150800D4408003C2F20003D87810F0800F1FD140F293 +S3150800D4508005C2F200056C884FEA84414FEA914480 +S3150800D46040F6D060C2F2000040F20011C2F200019C +S3150800D470224601F0CBFFEA7842F08003EB704FF4C6 +S3150800D4801040C4F202004FF00101816001E04FF044 +S3150800D4900004204638BD00BF38B540F28073C2F29A +S3150800D4A00003D87810F0800F2CD140F60005C2F2A0 +S3150800D4B0000540F6C464C2F20004284640F6D0616E +S3150800D4C0C2F20001228801F0A1FF40F28073C2F285 +S3150800D4D000039D604FF000021A604FF0100199702A +S3150800D4E05A6020884FEA00524FEA125199804FF04D +S3150800D4F0B000D8704FF41043C4F202034FF0010293 +S3150800D5005A6038BDFEE700BF10B504464FF4A05078 +S3150800D510C4F201004FF02001FFF76EFB012809D184 +S3150800D5204FF4A050C4F20100FFF760FB20704FF0E3 +S3150800D530010010BD4FF0000010BD00BF2DE9F04FEF +S3150800D5408DB04FF020004FF00101FFF77FFA4FF042 +S3150800D55004004FF00101FFF755FA4FF4006AC4F2D0 +S3150800D560020A50464FF006014FF00802FFF7C2F9CB +S3150800D57050464FF007014FF00802FFF7BBF94FF08E +S3150800D58000048DF81A404FF001098DF81B904FF0F2 +S3150800D59002088DF818804FF0400305938DF819801E +S3150800D5A0504605A9FFF7F2F88DF818804FF080006D +S3150800D5B00590504605A9FFF7E9F84FF4614108912F +S3150800D5C0A346ADF82440ADF82640ADF82840ADF89E +S3150800D5D02C404FF00C02ADF82A204FF4A056C4F2A6 +S3150800D5E00106304608A9FFF76DFA30464946FFF7A7 +S3150800D5F0EDFA40464946FFF705FA4FF4806AC4F249 +S3150800D600020A50464FF005014FF00902FFF772F97A +S3150800D61050464FF006014FF00902FFF76BF94FF03D +S3150800D620600303938DF810808DF811808DF81240F1 +S3150800D6308DF81390504603A9FFF7A8F84FF0C0607D +S3150800D6404946FFF7F1F94FF4D040C4F20000FEF75F +S3150800D650D3FE05A8FFF71AF822464FF20850C0F67F +S3150800D66000004FF4FA714AF2104340F2FF39145C95 +S3150800D67000EB020E9EF801E004EB0E0C0CFB011603 +S3150800D68093FBF6F806FB183636B9454608F1FF3C13 +S3150800D6901FFA8CF64E4512D902F10202845C00EBA1 +S3150800D6A0020E9EF801E004EB0E0C0CFB011693FB30 +S3150800D6B0F6F806FB1838B8F1000F4BD142E0CDF862 +S3150800D6C004E027464FF000048DF81A408DF81B40F9 +S3150800D6D08DF81C408DF81D408DF81E408DF81F40B2 +S3150800D6E08DF816408DF8174007F1FF378DF818703A +S3150800D6F0019A02F1FF368DF819600CA921F81C5D14 +S3150800D7004FF4D040C4F20000FEF798FE4FF00E002A +S3150800D7108DF82A008DF82B404FF001018DF82C105A +S3150800D720ADF82040ADF82240ADF82440ADF82640CB +S3150800D730ADF828408DF82D1008A8FEF70DFF0DB09E +S3150800D740BDE8F08F93FBF6F505F1FF3C1FFA8CF662 +S3150800D7504E45B4D902F10202242A88D1B2E700BFA5 +S3150800D760BFF34F8F4FF46D42CEF20002D16801F439 +S3150800D770E0604FF00403C0F2FA5340EA0301D160B7 +S3150800D780BFF34F8FFEE700BF00B587B040F685634D +S3150800D790C2F200031878B0B940F64060C2F2000041 +S3150800D7A0FFF7B2FE012844D140F68560C2F20000B8 +S3150800D7B04FF00102027040F68461C2F200014FF098 +S3150800D7C000030B7035E040F68461C2F200010A7866 +S3150800D7D002F1010240F64063C2F200039818FFF70F +S3150800D7E093FE012825D140F68460C2F20000017834 +S3150800D7F001F10101CBB2037040F64062C2F20002A9 +S3150800D8001078984215D140F68561C2F200014FF0B2 +S3150800D81000030B7040F64062C2F200025078FF28FF +S3150800D82007D140F64061C2F200018B780BB9FFF7C9 +S3150800D83097FF4FF4D040C4F200004FF00001FEF706 +S3150800D84097FFB0B14FF4D040C4F200004FF000018A +S3150800D85001AAFEF72FFF40F26760019A824208D1BB +S3150800D8609DF80F10FF2904D19DF810300BB9FFF76A +S3150800D87077FF07B000BD00BF62B6704730B583B00A +S3150800D8804FF004004FF00101FFF7BCF84FF40055C4 +S3150800D89000954FF001038DF804304FF000028DF823 +S3150800D8A006208DF807304FF002008DF805004FF47A +S3150800D8B00064C4F2020420466946FEF767FF204664 +S3150800D8C02946FFF713F803B030BD00BF10B500F0C6 +S3150800D8D075F8044640F68863C2F200031868211AF0 +S3150800D8E0B1F5FA7F29D340F68C62C2F200021378AA +S3150800D8F07BB940F68C63C2F200034FF001021A703E +S3150800D9004FF40060C4F202004FF40051FEF7F0FF36 +S3150800D9100EE040F68C60C2F200004FF00001017084 +S3150800D9204FF40060C4F202004FF40051FEF7DEFF28 +S3150800D93040F68860C2F20000046010BD08B5FEF724 +S3150800D940CFFCFFF79BFF00F013F8FFF795FF00F0F9 +S3150800D95047F8FFF7F3FDFFF7B9FF00F099F8FFF76F +S3150800D96013FFF8E740F69063C2F2000318607047A9 +S3150800D97008B540F20003C2F200031A6844F6D35011 +S3150800D980C1F26200A0FB02134FEA931101F1FF32C4 +S3150800D9904EF21003CEF200035A604FF46D40CEF2F9 +S3150800D9A000004FF0F00180F823104FF00000986057 +S3150800D9B04FF007021A60FFF7D5FF08BD40F69063DF +S3150800D9C0C2F200031868704740F69063C2F200037B +S3150800D9D01A6802F101021A60704700BFFEE700BF2D +S3150800D9E008B5FFF7DDFBFFF7E9FF00F5FA7040F62B +S3150800D9F09863C2F200031860FFF7E0FF00F51C51B8 +S3150800DA0001F1100140F69462C2F20002116000F0C2 +S3150800DA1083F941F21C50C2F200004FF6A962028057 +S3150800DA2043F61373438040F6C060C2F200004FF617 +S3150800DA30FF7101804FF00003438040F6C860C2F2D0 +S3150800DA400000028040F2131242804EF6030000F0F6 +S3150800DA507FF9FFF7DBFC08BD08B541F22053C2F297 +S3150800DA600003187800F04002D1B279B900F0020339 +S3150800DA70D8B258B141F21452C2F2000211680B79B9 +S3150800DA80FF2B03D1487908B9FFF76AFE08BD00BF26 +S3150800DA9010B5FFF7D3FC002841D040F6C462C2F2A5 +S3150800DAA00002108040F6D060C2F2000084894FF46C +S3150800DAB0006000F069F9844215D14FF0010000F0CA +S3150800DAC0A1F940F6C463C2F200031A883AB301F01A +S3150800DAD013FBFFF7E1FC40F6C460C2F200004FF00A +S3150800DAE0000101801BE040F6D061C2F200018C897A +S3150800DAF040F6060000F048F9844210D101F056FAC3 +S3150800DB0040F6C463C2F200031A8842B1FFF7C4FCA8 +S3150800DB1040F6C460C2F200004FF000010180FFF732 +S3150800DB204DFF40F69863C2F200031A68904224D368 +S3150800DB3002F5FA7040F69861C2F20001086040F6F4 +S3150800DB409C63C2F2000340F6A062C2F200021A60A9 +S3150800DB504FF0020000F056F940F6C460C2F2000029 +S3150800DB60018851B101F0C8FAFFF796FC40F6C46384 +S3150800DB70C2F200034FF000021A80FFF71FFF40F6BB +S3150800DB809461C2F200010B6898420AD303F51C504F +S3150800DB9000F1100040F69462C2F20002106001F033 +S3150800DBA0CBF910BD70B402F1FF328C18A1422ED207 +S3150800DBB00B466FEA01056619C6F340060D784A78E2 +S3150800DBC002EB052292B2801880B282422FD92BE04E +S3150800DBD01D785A7802EB0525AAB2801880B28242CF +S3150800DBE084BF013080B203F102029D78537803EBBB +S3150800DBF005239BB2C01880B2834231D92DE06FEA63 +S3150800DC000102A31823F0010202F102028918A142B7 +S3150800DC1008D109784FEA0123181880B2834284BFD5 +S3150800DC20013080B270BC704700F1010080B203F188 +S3150800DC3002039C42E3D9002ECAD01D785A7802EB1B +S3150800DC40052292B2801880B2824284BF013080B227 +S3150800DC5003F102039C42BBD8D1E700F1010080B270 +S3150800DC6002F102039C42B3D8C9E700BF70B4C47876 +S3150800DC700A19D4B241F22453C2F20003DC704FEA07 +S3150800DC8011258678AA19D2B29A7046785E700078FD +S3150800DC90187095420FD906F10106F6B241F22453DF +S3150800DCA0C2F200035E7036B900F1010041F2245356 +S3150800DCB0C2F200031870C9B28C4212DA02F10102EC +S3150800DCC0D2B241F22450C2F2000082704AB94378B7 +S3150800DCD003F10103DAB242701AB9017801F10101C0 +S3150800DCE0017070BC704700BF10B50146084C20682B +S3150800DCF000F10800FFF7BAFF2368064A117819727F +S3150800DD005078587291789972D278DA7210BD00BF3D +S3150800DD109C0E0020241500204FF0000341F23851D4 +S3150800DD20C2F200010B8040F6A060C2F20000437602 +S3150800DD3041F23453C2F200034FF001021A7041F265 +S3150800DD402851C2F200014FF480600880704700BF76 +S3150800DD5041F23453C2F200034FF000021A7041F246 +S3150800DD603851C2F200010B882BB941F23851C2F280 +S3150800DD7000010880704741F23450C2F200004FF0AB +S3150800DD8001020270704700BF4FEA102343EA0020E1 +S3150800DD9080B2704738B540F6D064C2F20004657C9C +S3150800DDA0A5F11405237C05EB03218DB2401980B239 +S3150800DDB004F11A014FF00802FFF7F4FE04F12201FC +S3150800DDC02A46FFF7EFFE10B1FFF7DEFF38BD4FF624 +S3150800DDD0FF7038BD08B54FF00600FFF7DBFF08BD3A +S3150800DDE008B54FF0000006494FF01402FFF7DAFEB7 +S3150800DDF010B1FFF7C9FF08BD4FF6FF7008BD00BF99 +S3150800DE00DE0E002038B540F69C63C2F200031C689B +S3150800DE10A84941F21452C2F20002116041F23C5381 +S3150800DE20C2F200031960032814D1637E03F00F00C1 +S3150800DE30032840F05986228A002A40F0558641F286 +S3150800DE402051C2F200014FF008030B70FFF704FEE1 +S3150800DE5000F08FBC022840F0AC8041F21852C2F2A2 +S3150800DE600002D37803F10103D8B2D070C0B941F2E9 +S3150800DE701851C2F200018A7802F10102D3B28B70FE +S3150800DE8073B941F21850C2F20000417801F101015C +S3150800DE90CAB2427022B90346007800F10100187030 +S3150800DEA04FF0000140F6C462C2F20002118040F64B +S3150800DEB0CC63C2F200031980607E072801D00528CA +S3150800DEC00CD1A07E00F10100C2B2A276782A40F0F9 +S3150800DED00B864FF00001617600F006BE002800F0C0 +S3150800DEE00386218A002955D0A27E02F1FF31A17648 +S3150800DEF0002A40F0F985E37E082B06D000F1FF32B0 +S3150800DF00D1B2012917D8052B15D14FF0000060763C +S3150800DF1041F22055C2F200054FF080022A70FFF741 +S3150800DF209BFD40F6D061C2F200014FF0140381F860 +S3150800DF302F3000F042BD042B9DBF03219940C9B282 +S3150800DF403021A17603F10103E37600F00F0000F11A +S3150800DF50FF33072B00F2C885DFE813F0DC01080061 +S3150800DF601100BD03C605BD03C605BD0340F6D06353 +S3150800DF70C2F200034FF0000583F82F50D2E141F2B8 +S3150800DF802051C2F200014FF004000870FFF764FD4B +S3150800DF9000F047BC00F00F02032A40F0A58541F2C5 +S3150800DFA02053C2F200034FF008001870FFF754FD23 +S3150800DFB0DFE340F6D060C2F20000817B452940F0DD +S3150800DFC0938540F6D063C2F200031A7C587C00EBB6 +S3150800DFD0022340F6C461C2F200010A88934200F3A4 +S3150800DFE083859CB240F6C460C2F20000048040F605 +S3150800DFF0D063C2F20003197D11F03F0F40F074851B +S3150800E00040F6D062C2F20002507D002840F06C85CE +S3150800E01041F21C55C2F200052D882DB941F21C5358 +S3150800E020C2F200035988A1B140F6D062C2F20002DA +S3150800E030D08BA84240F0588540F6D063C2F2000360 +S3150800E040198C41F21C52C2F200025088814240F0FB +S3150800E0504B85FFF7C5FE4FF6FF73984240F044859F +S3150800E06040F6D061C2F20001CA7D062A28D0012AEC +S3150800E07040F03A85104890F82230082B40F0348555 +S3150800E0800D494FF0000281F82220888C4FF6F6736E +S3150800E09098428CBF09300830074988840648428B65 +S3150800E0A0C283838B0384458304494A88828300F0AC +S3150800E0B013BD00BF060F0020D00E00201C1500203F +S3150800E0C0FFF788FE4FF6FF73984240F00D85B54876 +S3150800E0D0417EC1B1B44A908CB24B9A88904212D113 +S3150800E0E0B148428CAF4BD88882420CD1AE4A508B8D +S3150800E0F0AC4B1A88904206D1AB48828BA94B5888FC +S3150800E100824200F03581A84991F82F2002F03F039A +S3150800E110022B0FD1A448828CA4490A80A44B4FF045 +S3150800E12000001870A3490B88934262D0A0484FF0AC +S3150800E130010202709C4991F82F0000F00403DAB23C +S3150800E140002A40F0D184984B4FF0140483F82F40EE +S3150800E150994D4FF0280129804FF0500083F82E0082 +S3150800E16093F8294093F82D2083F8292093F828005E +S3150800E17093F82C5083F8285083F82C0093F827102E +S3150800E18093F82B2083F8272083F82B1093F8262062 +S3150800E190874D2A7093F82A5083F8265083F82A2048 +S3150800E1A004F10104E4B283F82D4084B900F10103B7 +S3150800E1B0DDB27D4880F82C504DB901F10101CCB291 +S3150800E1C080F82B401CB902F1010280F82A20764813 +S3150800E1D0428C76490A80848C44848284438BC38328 +S3150800E1E0858B0584754A118841835488848300F099 +S3150800E1F03EBC6C494B7E23B1072B40F0888400F067 +S3150800E20080BC684B6E490B604FF003009876187611 +S3150800E2104FF000049C754FF00405DD75DC769A8096 +S3150800E220614C628CDA80618B1980A08B58804FF024 +S3150800E23001005876634D2A781A7369785973AA7853 +S3150800E2409A73ED78DD73188294F82910D97294F8C8 +S3150800E25028209A7294F827505D7294F8261019723D +S3150800E260FFF742FD94F82E3003F0F004502C50DDF1 +S3150800E2704FEA1310A0F105024FEA8204524D2A789C +S3150800E2804FF0000348483BE0C21892F836202AB9F6 +S3150800E29047490B704C4C2270424C3BE0012A03D193 +S3150800E2A003F10103DBB22BE0022A1DD1451895F8CC +S3150800E2B03750042D18D13E4A1370434D4FF00203D0 +S3150800E2C02B703948411891F8384091F8392042EABC +S3150800E2D00425364B1D8040F20A60854228BF054654 +S3150800E2E0304C6582A58215E0411891F837502DB952 +S3150800E2F02F480370344C22702A4C0BE0EB18DBB223 +S3150800E3001946A342C0DB2A4C23702F4B1A70254CA2 +S3150800E31000E0244C40F6D061C2F200014FF0100232 +S3150800E32081F82F2040F6D060C2F2000090F82F3016 +S3150800E33043F0020580F82F504FF0020180F836109E +S3150800E3404FF0040280F837204FF0060380F8383083 +S3150800E3504FF00A0580F8395040F6C462C2F200024E +S3150800E3604FF02C0111804FF0600380F82E3033E314 +S3150800E3700C4A134B1A6015484FF0000202700A4BFC +S3150800E38093F82F3003F00400C2B20AB3054B4FF0DE +S3150800E39000025A760D484FF020010170FFF75CFB2A +S3150800E3A0A2E300BFA00E0020D00E00202A150020F0 +S3150800E3B03415002038150020C40E00201C15002036 +S3150800E3C09C0E00201815002040150020201500205E +S3150800E3D0A04890F82E204FEA12104FEA80029E4875 +S3150800E3E00270A4F11404A21A92B29C48028001F0A9 +S3150800E3F00F01022903D103F03F00122811D012B9E8 +S3150800E40013F0030F0DD0934AD18C95480289914297 +S3150800E41040F0CD828F49088D914A5189884240F053 +S3150800E420C68203F01003D8B200284FD08C4A118A4E +S3150800E43000294BD002F10C00FFF718FC854C94F824 +S3150800E4402A4088490B78A34240D1824890F82B008D +S3150800E450844A5178814239D17E4B93F82C10814AEF +S3150800E46093788B4232D17B4A92F82D207D4BDB780C +S3150800E47093422BD17A4B1C7358739973DA73D87EEF +S3150800E480D0B9774B987D197E9A7E891AA1EBD0026E +S3150800E490D1B2CAB20818C0B2987512F0800F1CBF64 +S3150800E4A04A42D2B26E4BD97DA1EB91018A18D1B2FC +S3150800E4B0D97501EBD00018766B4B4FF001021A7034 +S3150800E4C06749087E88764FF000030B82644A537EBC +S3150800E4D003F00F0101F1FF30072800F20583DFE89A +S3150800E4E010F008002A00CD00EE0137025802660235 +S3150800E4F0DD015D4A117811F0010F00F0F582584CE4 +S3150800E5004FF003006076584B4FF040021A704FF0F8 +S3150800E51000012182514C208828B1534B4FF042020A +S3150800E5201A70FFF7E1FB51484FF000010180FFF731 +S3150800E53093FA4B4C1DE14C4A137813F0010F7DD02A +S3150800E540444991F82F0000F03F02122A76D141483B +S3150800E55090F82E3003F0F002502A4CDD4FEA1311E2 +S3150800E560A1F105044FEA8404414802784FF00003FC +S3150800E570384839E0C21892F8362022B9364803706E +S3150800E5803B4B1A7037E0012A03D103F10103DBB2D2 +S3150800E5902AE0022A1DD1451895F83750042D18D1BE +S3150800E5A02D4A1370324B4FF002001870294C61182F +S3150800E5B091F8382091F8393043EA02202D4C208012 +S3150800E5C040F20A61884238BF0146254A5182918243 +S3150800E5D011E0411891F8371021B91F480370244CEF +S3150800E5E0227008E0CB18DBB21946A342C2DB1A4CEC +S3150800E5F023701F4B1A701A4C4FF0030161761548A9 +S3150800E60090F82620227290F82730637290F8281026 +S3150800E610A17290F82900E0724FF00100FFF764FB41 +S3150800E620114B4FF042021A704FF0000121820B483D +S3150800E63001800E4B1980FFF70FFA9AE00A4B4FF04C +S3150800E64020011970FFF708FA0B4803684FF000021B +S3150800E6505A766FE5D00E002034150020C40E00202F +S3150800E660A00E00202415002020150020CC0E002026 +S3150800E670401500202A1500209C0E0020AD4890F871 +S3150800E6802F2012F0010F2FD003F01001C8B258BB8B +S3150800E690A94B188A002840F02782A84D2A8802F13B +S3150800E6A0010290B2FFF720FBA54C237843F0100136 +S3150800E6B02170288818B143F01205A14A1570FFF792 +S3150800E6C0CBF99D4C4FF0010323824FF00801617688 +S3150800E6D04FF00000E07640F6D065C2F200054FF034 +S3150800E6E0110285F82F2068E102F02002D1B281B12B +S3150800E6F0904D95F834404FEA042095F83510914A24 +S3150800E70040EA01051468641914608C4A1088411B94 +S3150800E71011808A4A108850B103F01003D9B231B972 +S3150800E720874B1A7842F002011970FFF7DDFA814823 +S3150800E73090F8302090F8313003EB022188B2824AF3 +S3150800E74010807D4B998A884200D808B97E48018096 +S3150800E7507D4A1188784B59827948027812F0030F5E +S3150800E76000F0C281794C4FF000012180FFF774F95F +S3150800E770714C41F22050C2F20000017801F02002EB +S3150800E780D3B283B14FF0000040F6CC61C2F200016B +S3150800E7900880607640F6D065C2F200054FF0140294 +S3150800E7A085F82F2009E101F01000C2B2B2B14FF08E +S3150800E7B0000540F6CC61C2F200010D804FF0010061 +S3150800E7C020824FF004036376E57640F6D065C2F200 +S3150800E7D000054FF0110285F82F20EEE040F6CC63D5 +S3150800E7E0C2F200031888C8B111F0010F03D04FF028 +S3150800E7F00003238201E0218A59B9618A884284BFCD +S3150800E8005248018040F6CC60C2F20000028822829B +S3150800E81004E040F6CC62C2F2000211804FF0000319 +S3150800E820E37641F23C51C2F20001086841F2145203 +S3150800E830C2F20002106040F6CC63C2F200031988E7 +S3150800E84089B1208A78B100F1280040F6C465C2F281 +S3150800E8500005288040F6D060C2F200004FF0180389 +S3150800E86080F82F30B0E041F22052C2F2000213784D +S3150800E87003F00201C8B2002800F0368140F6C465EC +S3150800E880C2F200054FF028032B8040F6D061C2F291 +S3150800E89000014FF0100281F82F2095E0284A1378DE +S3150800E8A013F0010F00F0208123494FF0000048764D +S3150800E8B0234B4FF010021A70FFF7CEF814E11F48E9 +S3150800E8C0008808B1FFF710FA1A4B93F82F1011F0C9 +S3150800E8D0010F1CD01A4D2C7814F0010F08D0164BD6 +S3150800E8E04FF007025A764FF000059D761D8203E029 +S3150800E8F011494FF0060048764FF00100FFF7F4F98A +S3150800E9000F4C4FF010012170FFF7A6F84FE00C4AA4 +S3150800E910107810F0010F07D007484FF0050242762D +S3150800E9204FF000030382DFE0044B198800293ED12B +S3150800E930DAE000BFD00E0020A00E0020C40E002092 +S3150800E94020150020141500202A150020CC0E0020C2 +S3150800E9507148008808B1FFF7C7F9704B93F82F2064 +S3150800E96012F0010F11D06E4D4FF007046C764FF080 +S3150800E9700003AB764FF00100FFF7B6F969494FF08F +S3150800E98010020A70FFF768F811E06349088870B941 +S3150800E990AAE06449087810F0010F00F0A580604BE2 +S3150800E9A04FF007025A764FF0000199769CE05B4DCE +S3150800E9B04FF0100485F82F40594C40F6C460C2F257 +S3150800E9C000004FF02803038040F6D061C2F2000130 +S3150800E9D04FF0500581F82E50227A40F6D060C2F2E8 +S3150800E9E0000080F82A20637A80F82B30A17A80F814 +S3150800E9F02C10E57A80F82D50227B80F82620637B40 +S3150800EA0080F82730A17B80F82810E57B80F829500C +S3150800EA104FF00602C275A3884384E188818441F2D7 +S3150800EA201C55C2F200052A8842836B888383218895 +S3150800EA30C18365880584647E04F01000C2B252B1B1 +S3150800EA4040F6D064C2F200044FF0000084F83100AA +S3150800EA5084F830000BE040F6D063C2F200034FF0B2 +S3150800EA60060183F830104FF00A0583F8315040F656 +S3150800EA70D064C2F200044FF04002A27540F6C463A7 +S3150800EA80C2F2000319884FEA1125257461744FF004 +S3150800EA90000584F8355084F834506586FFF79AF9EE +S3150800EAA06FEA000060864FF04502A273E57365754C +S3150800EAB0257540F6C661C2F200010B8803F1010311 +S3150800EAC098B208804FEA1022A274E0742583FFF7F3 +S3150800EAD087F96FEA0001218341F22053C2F200034D +S3150800EAE04FF00000187038BD4FF0000340F6C461BF +S3150800EAF0C2F200010B8041F22050C2F200000370FE +S3150800EB0038BD094C4FF001052570FFF77ABB06485A +S3150800EB104FF001020270E7E7C40E0020D00E002075 +S3150800EB20A00E0020201500203415002070B50346DD +S3150800EB300D4641F24152C2F200024FF00001117037 +S3150800EB4041F24450C2F20000048864B141F24452D2 +S3150800EB50C2F20002518831B11888A04203D15C88FC +S3150800EB608C4200F0888041F24452C2F20002948935 +S3150800EB705CB141F24451C2F20001C98929B1188831 +S3150800EB80A04202D15A888A427CD041F24454C2F249 +S3150800EB900004228B5AB141F24451C2F200014C8B57 +S3150800EBA02CB11888904202D15A88A2426ED041F2FE +S3150800EBB04451C2F200018C8C5CB141F24450C2F25D +S3150800EBC00000C18C29B11A88A24202D15C888C4205 +S3150800EBD060D041F24450C2F20000028E5AB141F2AE +S3150800EBE04451C2F200014C8E2CB11888904202D1D1 +S3150800EBF05A88A24252D041F24451C2F200018C8F87 +S3150800EC005CB141F24450C2F20000C18F29B11A88A2 +S3150800EC10A24202D15C888C4244D041F24450C2F2EE +S3150800EC200000B0F8482062B141F24451C2F2000136 +S3150800EC30B1F84A402CB11888904202D15A88A242AB +S3150800EC4034D041F24451C2F20001B1F85440002CCC +S3150800EC5042D041F24450C2F20000B0F856100029E2 +S3150800EC603AD01A88A24237D15C888C4234D14FF008 +S3150800EC700700AA4C1DE04FF0000041F24454C2F2CE +S3150800EC80000416E04FF00100A54C12E04FF0020018 +S3150800EC90A44C0EE04FF00300A34C0AE04FF004002A +S3150800ECA0A24C06E04FF00500A14C02E04FF006002A +S3150800ECB0A04C41F24152C2F20002107004F1040065 +S3150800ECC029464FF0060200F0A1FB41F2A553C2F215 +S3150800ECD000031978A17270BD41F24450C2F20000D7 +S3150800ECE0018831B941F24452C2F200025488002C1C +S3150800ECF05FD041F24450C2F20000818931B941F235 +S3150800ED004452C2F20002D489002C59D041F2445030 +S3150800ED10C2F20000018B31B941F24452C2F200023C +S3150800ED20548B002C50D041F24450C2F20000818C22 +S3150800ED3031B941F24452C2F20002D48C002C47D0B9 +S3150800ED4041F24450C2F20000018E31B941F24452F8 +S3150800ED50C2F20002548E002C3ED041F24450C2F258 +S3150800ED600000818F29B941F24452C2F20002D48FC1 +S3150800ED70B4B341F24450C2F20000B0F8481031B9B9 +S3150800ED8041F24452C2F20002B2F84A4064B341F278 +S3150800ED904450C2F20000B0F8541071BB41F244521C +S3150800EDA0C2F20002B2F856403CBB4FF007005B4C7B +S3150800EDB01DE04FF0000041F24454C2F2000416E090 +S3150800EDC04FF00100564C12E04FF00200554C0EE091 +S3150800EDD04FF00300544C0AE04FF00400534C06E091 +S3150800EDE04FF00500524C02E04FF00600514C41F23C +S3150800EDF04152C2F2000210707BE04FF0000441F26B +S3150800EE00A556C2F200063078224641F24451C2F2B3 +S3150800EE1000018E7A811BA142C4BF0A46D2B241F2D2 +S3150800EE204456C2F20006B17D461A964202DDF2B297 +S3150800EE304FF0010441F24451C2F2000191F82260F8 +S3150800EE40811B914202DDCAB24FF0020441F24456D8 +S3150800EE50C2F2000696F82E10461A964202DDF2B263 +S3150800EE604FF0030441F24451C2F2000191F83A60AE +S3150800EE70811B914202DDCAB24FF0040441F24456A6 +S3150800EE80C2F2000696F84610461A964202DDF2B21B +S3150800EE904FF0050441F24451C2F2000191F8526064 +S3150800EEA0811B914202DDCAB24FF0060441F2445674 +S3150800EEB0C2F2000696F85E10461A964202DDF2B2D3 +S3150800EEC04FF0070441F24251C2F200010A7041F2C2 +S3150800EED0A450C2F20000047041F24152C2F200028C +S3150800EEE0147004EB440441F24451C2F2000101EBF0 +S3150800EEF08404204619464FF0040200F087FA04F10C +S3150800EF00040029464FF0060200F080FA41F2A553A4 +S3150800EF10C2F200031978A17270BD00BF98150020CF +S3150800EF20501500205C150020681500207415002077 +S3150800EF30801500208C1500202DE9F04141F2A553DB +S3150800EF40C2F200031A7802F101021A704FF00001AA +S3150800EF5041F24150C2F20000017041F24455C2F23A +S3150800EF60000541F2A556C2F2000688464FF004078E +S3150800EF70044601EB410105EB8100428835F8213052 +S3150800EF8042EA03018AB242B13178837ACA1A772AE9 +S3150800EF9003DD41463A4600F05DFA207800F10100AB +S3150800EFA0C1B221700729E4D9BDE8F081F8B540F669 +S3150800EFB0C463C2F200031888292807D840F6C46338 +S3150800EFC0C2F200034FF000021A80F8BD40F6C46191 +S3150800EFD0C2F200014FF000020A8040F6D063C2F286 +S3150800EFE00003988AB0F5807F03D0B0F5007F7FD103 +S3150800EFF060E040F6D061C2F20001CA8C41F21C53AF +S3150800F000C2F200031888824272D140F6D061C2F279 +S3150800F01000010A8D41F21C53C2F20003588882424D +S3150800F02066D13448A0F106052946FFF77FFD40F66C +S3150800F030D064C2F200044FF0000626754FF00207AE +S3150800F040677504F12006304629464FF0060200F09F +S3150800F050DDF941F22C57C2F20007284639464FF02F +S3150800F060060200F0D3F904F1060039464FF006020D +S3150800F07000F0CCF9204631464FF0060200F0C6F9FA +S3150800F080A18BE184E28B228541F21C53C2F2000374 +S3150800F0901888A0835988E1834FF0080222734FF03D +S3150800F0A00603637340F6C460C2F200004FF02A01FB +S3150800F0B00180F8BD40F6D061C2F20001CA8C41F267 +S3150800F0C01C53C2F200031888824211D140F6D0615F +S3150800F0D0C2F200010A8D41F21C53C2F2000358889D +S3150800F0E0824205D103490846A1F10601FFF71EFD34 +S3150800F0F0F8BD00BFEC0E002038B540F6D063C2F26A +S3150800F1000003DB8B4FF6FF72934215D140F6D060B1 +S3150800F110C2F20000018C4FF6FF7291420CD140F604 +S3150800F120D060C2F200004FF22C51C0F600014FF039 +S3150800F130060200F06BF93DE141F21C50C2F20000F4 +S3150800F140018883EA010040F6C062C2F20002118813 +S3150800F150084211D140F6D060C2F20000028C41F29A +S3150800F1601C51C2F200014888504040F6C061C2F204 +S3150800F1700001498808420CD041F2A853C2F20003A4 +S3150800F18040F6C862C2F20002118819805088588079 +S3150800F19005E041F2A850C2F200000380428041F225 +S3150800F1A0A852C2F200021388508841F24451C2F2B2 +S3150800F1B000010A889A4206D141F24451C2F200017E +S3150800F1C04A88824269D041F24451C2F200018A89D2 +S3150800F1D09A4206D141F24451C2F20001CA898242DA +S3150800F1E062D041F24451C2F200010A8B9A4206D11A +S3150800F1F041F24451C2F200014A8B824258D041F290 +S3150800F2004451C2F200018A8C9A4206D141F2445115 +S3150800F210C2F20001CA8C82424ED041F24451C2F277 +S3150800F22000010A8E9A4206D141F24451C2F2000107 +S3150800F2304A8E824244D041F24451C2F200018A8F7A +S3150800F2409A4206D141F24451C2F20001CA8F824263 +S3150800F2503AD041F24451C2F20001B1F848209A422C +S3150800F26007D141F24451C2F20001B1F84A20824264 +S3150800F2702ED041F24451C2F20001B1F854209A420C +S3150800F28039D141F24453C2F20003B3F85610814211 +S3150800F29031D14FF0070055491DE04FF0000041F20B +S3150800F2A04451C2F2000116E04FF00100504912E045 +S3150800F2B04FF002004F490EE04FF003004E490AE0B6 +S3150800F2C04FF004004D4906E04FF005004C4902E0B6 +S3150800F2D04FF006004B4941F24153C2F20003187041 +S3150800F2E040F6D060C2F2000001F104014FF00602B8 +S3150800F2F000F08CF85EE041F24154C2F200044FF08F +S3150800F3000805257040F6D064C2F2000420464FF086 +S3150800F310FF014FF0060200F09DF804F120004FF0BF +S3150800F32000014FF0060200F095F841F22C55C2F2A2 +S3150800F330000504F1060029464FF0060200F066F8BB +S3150800F34004F1160029464FF0060200F05FF841F274 +S3150800F350A850C2F200000288E2844388238541F25D +S3150800F3601C51C2F200010888A0834A88E2834FF044 +S3150800F370000323754FF001016175A373E1734FF024 +S3150800F3800800207463744FF00602A2744FF0040359 +S3150800F390E3742073627304F1360441F21451C2F225 +S3150800F3A000010C6040F6C460C2F200004FF02A0269 +S3150800F3B0028038BD144841F22C51C2F200014FF0C8 +S3150800F3C0060200F023F840F6D061C2F200014FF0C1 +S3150800F3D008020A734FF00000487340F6C463C2F28D +S3150800F3E00003198801F10E01198038BD981500200F +S3150800F3F0501500205C1500206815002074150020A3 +S3150800F400801500208C150020D60E0020844640EA80 +S3150800F410010313F0030F40F01080242AC0F00D807A +S3150800F4202DE9F00FB1E8F80FA0E8F80FA2F12402D1 +S3150800F430242ABFF4F7AFBDE8F00F002A00F00780D2 +S3150800F44011F8013B00F8013B013A7FF4F9AF604639 +S3150800F450704700BF8446002A00F0328010F0030F80 +S3150800F46000F0078000F8011B013A00F02980FFF739 +S3150800F470F5BF282AC0F01F80A2F128022DE9F00F57 +S3150800F48001F0FF0141EA012141EA014141EA016136 +S3150800F4900B460C460D460E460F46884689468A4652 +S3150800F4A08B46A0E8FA0F283ABFF4FBAFBDE8F00F89 +S3150800F4B0283200F0058000F8011B013A7FF4FBAF03 +S3150800F4C06046704738B504460D4600F019F841F213 +S3150800F4D0AC53C2F200031D6044F0800441F2B05000 +S3150800F4E0C2F200000460024611680029FCD100F04F +S3150800F4F009F841F2AC53C2F20003186838BD00BFE0 +S30D0800F500704700BF704700BF09 +S3150800F50805020602060307030803090309040A0491 +S3150800F5180B040C040C050D050E050F050F06100641 +S3110800F52810071008FFFFFFFFFFFF0000A0 +S3150800F534007A030A0000000001020304010203041E +S3090800F5440607080997 +S7050800C233FD diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/boot.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/boot.c index c05d146b..8c3d10af 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/boot.c +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/boot.c @@ -87,7 +87,7 @@ void BootComCheckActivationRequest(void) ** \return none. ** ****************************************************************************************/ -static void BootActivate(void) +void BootActivate(void) { /* perform software reset to activate the bootoader again */ NVIC_SystemReset(); diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/boot.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/boot.h index b3e3f8c1..26623a6f 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/boot.h +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/boot.h @@ -38,6 +38,7 @@ ****************************************************************************************/ void BootComInit(void); void BootComCheckActivationRequest(void); +void BootActivate(void); #endif /* BOOT_H */ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/header.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/header.h index 5eb9a804..9c2a298f 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/header.h +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/header.h @@ -43,6 +43,7 @@ #include "irq.h" /* IRQ driver */ #include "led.h" /* LED driver */ #include "timer.h" /* Timer driver */ +#include "net.h" /* TCP/IP server application */ #endif /* HEADER_H */ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/ide/stm32f407_crossworks.hzp b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/ide/stm32f407_crossworks.hzp index 0c3a3192..79a4421f 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/ide/stm32f407_crossworks.hzp +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/ide/stm32f407_crossworks.hzp @@ -1,7 +1,7 @@ - + @@ -75,6 +75,17 @@ + + + + + + + + + + +
@@ -88,6 +99,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/ide/stm32f407_crossworks.hzs b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/ide/stm32f407_crossworks.hzs index 324f7084..be6b5f0e 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/ide/stm32f407_crossworks.hzs +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/ide/stm32f407_crossworks.hzs @@ -66,7 +66,7 @@ - + - + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/ethernetlib/inc/stm32_eth.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/ethernetlib/inc/stm32_eth.h new file mode 100644 index 00000000..578d8baa --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/ethernetlib/inc/stm32_eth.h @@ -0,0 +1,1610 @@ +/** + ****************************************************************************** + * @file stm32_eth.h + * @author MCD Application Team + * @version V1.0.0 + * @date 06/19/2009 + * @brief This file contains all the functions prototypes for the Ethernet + * firmware library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32_ETH_H +#define __STM32_ETH_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" /* STM32 registers */ + +/** @addtogroup STM32_ETH_Driver + * @{ + */ + +/** @defgroup ETH_Exported_Types + * @{ + */ + +/** + * @brief ETH MAC Init structure definition + */ +typedef struct { +/** + * @brief / * MAC + */ + uint32_t ETH_AutoNegotiation; /*!< Selects or not the AutoNegotiation with the external PHY */ + uint32_t ETH_Watchdog; /*!< Enable/disable Watchdog timer */ + uint32_t ETH_Jabber; /*!< Enable/disable Jabber timer */ + uint32_t ETH_InterFrameGap; /*!< Selects minimum IFG between frames during transmission */ + uint32_t ETH_CarrierSense; /*!< Enable/disable Carrier Sense */ + uint32_t ETH_Speed; /*!< Indicates the Ethernet speed: 10/100 Mbps */ + uint32_t ETH_ReceiveOwn; /*!< Enable/disable the reception of frames when the TX_EN signal is asserted in Half-Duplex mode */ + uint32_t ETH_LoopbackMode; /*!< Enable/disable internal MAC MII Loopback mode */ + uint32_t ETH_Mode; /*!< Selects the MAC duplex mode: Half-Duplex or Full-Duplex mode */ + uint32_t ETH_ChecksumOffload; /*!< Enable/disable the calculation of complement sum of all received Ethernet frame payloads */ + uint32_t ETH_RetryTransmission; /*!< Enable/disable the MAC attempt retries transmission, based on the settings of BL, when a colision occurs (Half-Duplex mode) */ + uint32_t ETH_AutomaticPadCRCStrip; /*!< Enable/disable Automatic MAC Pad/CRC Stripping */ + uint32_t ETH_BackOffLimit; /*!< Selects the BackOff limit value */ + uint32_t ETH_DeferralCheck; /*!< Enable/disable deferral check function (Half-Duplex mode) */ + uint32_t ETH_ReceiveAll; /*!< Enable/disable all frames reception by the MAC (No fitering)*/ + uint32_t ETH_SourceAddrFilter; /*!< Selects EnableNormal/EnableInverse/disable Source Address Filter comparison */ + uint32_t ETH_PassControlFrames; /*!< Selects None/All/FilterPass of all control frames (including unicast and multicast PAUSE frames) */ + uint32_t ETH_BroadcastFramesReception; /*!< Enable/disable reception of Broadcast Frames */ + uint32_t ETH_DestinationAddrFilter; /*!< Selects EnableNormal/EnableInverse destination filter for both unicast and multicast frames */ + uint32_t ETH_PromiscuousMode; /*!< Enable/disable Promiscuous Mode */ + uint32_t ETH_MulticastFramesFilter; /*!< Selects the Multicast Frames filter: None/HashTableFilter/PerfectFilter/PerfectHashTableFilter */ + uint32_t ETH_UnicastFramesFilter; /*!< Selects the Unicast Frames filter: HashTableFilter/PerfectFilter/PerfectHashTableFilter */ + uint32_t ETH_HashTableHigh; /*!< This field contains the higher 32 bits of Hash table. */ + uint32_t ETH_HashTableLow; /*!< This field contains the lower 32 bits of Hash table. */ + uint32_t ETH_PauseTime; /*!< This field holds the value to be used in the Pause Time field in the transmit control frame */ + uint32_t ETH_ZeroQuantaPause; /*!< Enable/disable the automatic generation of Zero-Quanta Pause Control frames */ + uint32_t ETH_PauseLowThreshold; /*!< This field configures the threshold of the PAUSE to be checked for automatic retransmission of PAUSE Frame */ + uint32_t ETH_UnicastPauseFrameDetect; /*!< Enable/disable MAC to detect the Pause frames (with MAC Address0 unicast address and unique multicast address) */ + uint32_t ETH_ReceiveFlowControl; /*!< Enable/disable the MAC to decode the received Pause frame and disable its transmitter for a specified (Pause Time) time */ + uint32_t ETH_TransmitFlowControl; /*!< Enable/disable the MAC to transmit Pause frames (Full-Duplex mode) or the MAC back-pressure operation (Half-Duplex mode) */ + uint32_t ETH_VLANTagComparison; /*!< Selects the 12-bit VLAN identifier or the complete 16-bit VLAN tag for comparison and filtering */ + uint32_t ETH_VLANTagIdentifier; /*!< VLAN tag identifier for receive frames */ + +/** + * @brief / * DMA + */ + uint32_t ETH_DropTCPIPChecksumErrorFrame; /*!< Enable/disable Dropping of TCP/IP Checksum Error Frames */ + uint32_t ETH_ReceiveStoreForward; /*!< Enable/disable Receive store and forward */ + uint32_t ETH_FlushReceivedFrame; /*!< Enable/disable flushing of received frames */ + uint32_t ETH_TransmitStoreForward; /*!< Enable/disable Transmit store and forward */ + uint32_t ETH_TransmitThresholdControl; /*!< Selects the Transmit Threshold Control */ + uint32_t ETH_ForwardErrorFrames; /*!< Enable/disable forward to DMA of all frames except runt error frames */ + uint32_t ETH_ForwardUndersizedGoodFrames; /*!< Enable/disable Rx FIFO to forward Undersized frames (frames with no Error and length less than 64 bytes) including pad-bytes and CRC) */ + uint32_t ETH_ReceiveThresholdControl; /*!< Selects the threshold level of the Receive FIFO */ + uint32_t ETH_SecondFrameOperate; /*!< Enable/disable the DMA process of a second frame of Transmit data even before status for first frame is obtained */ + uint32_t ETH_AddressAlignedBeats; /*!< Enable/disable Address Aligned Beats */ + uint32_t ETH_FixedBurst; /*!< Enable/disable the AHB Master interface fixed burst transfers */ + uint32_t ETH_RxDMABurstLength; /*!< Indicate the maximum number of beats to be transferred in one Rx DMA transaction */ + uint32_t ETH_TxDMABurstLength; /*!< Indicate the maximum number of beats to be transferred in one Tx DMA transaction */ + uint32_t ETH_DescriptorSkipLength; /*!< Specifies the number of word to skip between two unchained descriptors (Ring mode) */ + uint32_t ETH_DMAArbitration; /*!< Selects DMA Tx/Rx arbitration */ +}ETH_InitTypeDef; + +/**--------------------------------------------------------------------------**/ +/** + * @brief DMA descriptors types + */ +/**--------------------------------------------------------------------------**/ + +/** + * @brief ETH DMA Desciptors data structure definition + */ +typedef struct { + uint32_t Status; /*!< Status */ + uint32_t ControlBufferSize; /*!< Control and Buffer1, Buffer2 lengths */ + uint32_t Buffer1Addr; /*!< Buffer1 address pointer */ + uint32_t Buffer2NextDescAddr; /*!< Buffer2 or next descriptor address pointer */ +} ETH_DMADESCTypeDef; + +/** + * @} + */ + +/** @defgroup ETH_Exported_Constants + * @{ + */ +/**--------------------------------------------------------------------------**/ +/** + * @brief ETH Frames defines + */ +/**--------------------------------------------------------------------------**/ + +/** @defgroup ENET_Buffers_setting + * @{ + */ +#define ETH_MAX_PACKET_SIZE 1520 /*!< ETH_HEADER + ETH_EXTRA + MAX_ETH_PAYLOAD + ETH_CRC */ +#define ETH_HEADER 14 /*!< 6 byte Dest addr, 6 byte Src addr, 2 byte length/type */ +#define ETH_CRC 4 /*!< Ethernet CRC */ +#define ETH_EXTRA 2 /*!< Extra bytes in some cases */ +#define VLAN_TAG 4 /*!< optional 802.1q VLAN Tag */ +#define MIN_ETH_PAYLOAD 46 /*!< Minimum Ethernet payload size */ +#define MAX_ETH_PAYLOAD 1500 /*!< Maximum Ethernet payload size */ +#define JUMBO_FRAME_PAYLOAD 9000 /*!< Jumbo frame payload size */ + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet DMA descriptors registers bits definition + */ +/**--------------------------------------------------------------------------**/ + +/* DMA Tx Desciptor -----------------------------------------------------------*/ +/**---------------------------------------------------------------------------------------------- + TDES0 | OWN(31) | CTRL[30:26] | Reserved[25:24] | CTRL[23:20] | Reserved[19:17] | Status[16:0] | + ----------------------------------------------------------------------------------------------- + TDES1 | Reserved[31:29] | Buffer2 ByteCount[28:16] | Reserved[15:13] | Buffer1 ByteCount[12:0] | + ----------------------------------------------------------------------------------------------- + TDES2 | Buffer1 Address [31:0] | + ----------------------------------------------------------------------------------------------- + TDES3 | Buffer2 Address [31:0] / Next Desciptor Address [31:0] | + ---------------------------------------------------------------------------------------------**/ + +/** + * @brief Bit definition of TDES0 register: DMA Tx descriptor status register + */ +#define ETH_DMATxDesc_OWN ((uint32_t)0x80000000) /*!< OWN bit: descriptor is owned by DMA engine */ +#define ETH_DMATxDesc_IC ((uint32_t)0x40000000) /*!< Interrupt on Completion */ +#define ETH_DMATxDesc_LS ((uint32_t)0x20000000) /*!< Last Segment */ +#define ETH_DMATxDesc_FS ((uint32_t)0x10000000) /*!< First Segment */ +#define ETH_DMATxDesc_DC ((uint32_t)0x08000000) /*!< Disable CRC */ +#define ETH_DMATxDesc_DP ((uint32_t)0x04000000) /*!< Disable Padding */ +#define ETH_DMATxDesc_TTSE ((uint32_t)0x02000000) /*!< Transmit Time Stamp Enable */ +#define ETH_DMATxDesc_CIC ((uint32_t)0x00C00000) /*!< Checksum Insertion Control: 4 cases */ +#define ETH_DMATxDesc_CIC_ByPass ((uint32_t)0x00000000) /*!< Do Nothing: Checksum Engine is bypassed */ +#define ETH_DMATxDesc_CIC_IPV4Header ((uint32_t)0x00400000) /*!< IPV4 header Checksum Insertion */ +#define ETH_DMATxDesc_CIC_TCPUDPICMP_Segment ((uint32_t)0x00800000) /*!< TCP/UDP/ICMP Checksum Insertion calculated over segment only */ +#define ETH_DMATxDesc_CIC_TCPUDPICMP_Full ((uint32_t)0x00C00000) /*!< TCP/UDP/ICMP Checksum Insertion fully calculated */ +#define ETH_DMATxDesc_TER ((uint32_t)0x00200000) /*!< Transmit End of Ring */ +#define ETH_DMATxDesc_TCH ((uint32_t)0x00100000) /*!< Second Address Chained */ +#define ETH_DMATxDesc_TTSS ((uint32_t)0x00020000) /*!< Tx Time Stamp Status */ +#define ETH_DMATxDesc_IHE ((uint32_t)0x00010000) /*!< IP Header Error */ +#define ETH_DMATxDesc_ES ((uint32_t)0x00008000) /*!< Error summary: OR of the following bits: UE || ED || EC || LCO || NC || LCA || FF || JT */ +#define ETH_DMATxDesc_JT ((uint32_t)0x00004000) /*!< Jabber Timeout */ +#define ETH_DMATxDesc_FF ((uint32_t)0x00002000) /*!< Frame Flushed: DMA/MTL flushed the frame due to SW flush */ +#define ETH_DMATxDesc_PCE ((uint32_t)0x00001000) /*!< Payload Checksum Error */ +#define ETH_DMATxDesc_LCA ((uint32_t)0x00000800) /*!< Loss of Carrier: carrier lost during tramsmission */ +#define ETH_DMATxDesc_NC ((uint32_t)0x00000400) /*!< No Carrier: no carrier signal from the tranceiver */ +#define ETH_DMATxDesc_LCO ((uint32_t)0x00000200) /*!< Late Collision: transmission aborted due to collision */ +#define ETH_DMATxDesc_EC ((uint32_t)0x00000100) /*!< Excessive Collision: transmission aborted after 16 collisions */ +#define ETH_DMATxDesc_VF ((uint32_t)0x00000080) /*!< VLAN Frame */ +#define ETH_DMATxDesc_CC ((uint32_t)0x00000078) /*!< Collision Count */ +#define ETH_DMATxDesc_ED ((uint32_t)0x00000004) /*!< Excessive Deferral */ +#define ETH_DMATxDesc_UF ((uint32_t)0x00000002) /*!< Underflow Error: late data arrival from the memory */ +#define ETH_DMATxDesc_DB ((uint32_t)0x00000001) /*!< Deferred Bit */ + +/** + * @brief Bit definition of TDES1 register + */ +#define ETH_DMATxDesc_TBS2 ((uint32_t)0x1FFF0000) /*!< Transmit Buffer2 Size */ +#define ETH_DMATxDesc_TBS1 ((uint32_t)0x00001FFF) /*!< Transmit Buffer1 Size */ + +/** + * @brief Bit definition of TDES2 register + */ +#define ETH_DMATxDesc_B1AP ((uint32_t)0xFFFFFFFF) /*!< Buffer1 Address Pointer */ + +/** + * @brief Bit definition of TDES3 register + */ +#define ETH_DMATxDesc_B2AP ((uint32_t)0xFFFFFFFF) /*!< Buffer2 Address Pointer */ + +/** + * @} + */ + + +/** @defgroup DMA_Rx_descriptor + * @{ + */ + +/**-------------------------------------------------------------------------------------------------------------------- + RDES0 | OWN(31) | Status [30:0] | + --------------------------------------------------------------------------------------------------------------------- + RDES1 | CTRL(31) | Reserved[30:29] | Buffer2 ByteCount[28:16] | CTRL[15:14] | Reserved(13) | Buffer1 ByteCount[12:0] | + --------------------------------------------------------------------------------------------------------------------- + RDES2 | Buffer1 Address [31:0] | + --------------------------------------------------------------------------------------------------------------------- + RDES3 | Buffer2 Address [31:0] / Next Desciptor Address [31:0] | + -------------------------------------------------------------------------------------------------------------------**/ + +/** + * @brief Bit definition of RDES0 register: DMA Rx descriptor status register + */ +#define ETH_DMARxDesc_OWN ((uint32_t)0x80000000) /*!< OWN bit: descriptor is owned by DMA engine */ +#define ETH_DMARxDesc_AFM ((uint32_t)0x40000000) /*!< DA Filter Fail for the rx frame */ +#define ETH_DMARxDesc_FL ((uint32_t)0x3FFF0000) /*!< Receive descriptor frame length */ +#define ETH_DMARxDesc_ES ((uint32_t)0x00008000) /*!< Error summary: OR of the following bits: DE || OE || IPC || LC || RWT || RE || CE */ +#define ETH_DMARxDesc_DE ((uint32_t)0x00004000) /*!< Desciptor error: no more descriptors for receive frame */ +#define ETH_DMARxDesc_SAF ((uint32_t)0x00002000) /*!< SA Filter Fail for the received frame */ +#define ETH_DMARxDesc_LE ((uint32_t)0x00001000) /*!< Frame size not matching with length field */ +#define ETH_DMARxDesc_OE ((uint32_t)0x00000800) /*!< Overflow Error: Frame was damaged due to buffer overflow */ +#define ETH_DMARxDesc_VLAN ((uint32_t)0x00000400) /*!< VLAN Tag: received frame is a VLAN frame */ +#define ETH_DMARxDesc_FS ((uint32_t)0x00000200) /*!< First descriptor of the frame */ +#define ETH_DMARxDesc_LS ((uint32_t)0x00000100) /*!< Last descriptor of the frame */ +#define ETH_DMARxDesc_IPV4HCE ((uint32_t)0x00000080) /*!< IPC Checksum Error: Rx Ipv4 header checksum error */ +#define ETH_DMARxDesc_LC ((uint32_t)0x00000040) /*!< Late collision occurred during reception */ +#define ETH_DMARxDesc_FT ((uint32_t)0x00000020) /*!< Frame type - Ethernet, otherwise 802.3 */ +#define ETH_DMARxDesc_RWT ((uint32_t)0x00000010) /*!< Receive Watchdog Timeout: watchdog timer expired during reception */ +#define ETH_DMARxDesc_RE ((uint32_t)0x00000008) /*!< Receive error: error reported by MII interface */ +#define ETH_DMARxDesc_DBE ((uint32_t)0x00000004) /*!< Dribble bit error: frame contains non int multiple of 8 bits */ +#define ETH_DMARxDesc_CE ((uint32_t)0x00000002) /*!< CRC error */ +#define ETH_DMARxDesc_MAMPCE ((uint32_t)0x00000001) /*!< Rx MAC Address/Payload Checksum Error: Rx MAC address matched/ Rx Payload Checksum Error */ + +/** + * @brief Bit definition of RDES1 register + */ +#define ETH_DMARxDesc_DIC ((uint32_t)0x80000000) /*!< Disable Interrupt on Completion */ +#define ETH_DMARxDesc_RBS2 ((uint32_t)0x1FFF0000) /*!< Receive Buffer2 Size */ +#define ETH_DMARxDesc_RER ((uint32_t)0x00008000) /*!< Receive End of Ring */ +#define ETH_DMARxDesc_RCH ((uint32_t)0x00004000) /*!< Second Address Chained */ +#define ETH_DMARxDesc_RBS1 ((uint32_t)0x00001FFF) /*!< Receive Buffer1 Size */ + +/** + * @brief Bit definition of RDES2 register + */ +#define ETH_DMARxDesc_B1AP ((uint32_t)0xFFFFFFFF) /*!< Buffer1 Address Pointer */ + +/** + * @brief Bit definition of RDES3 register + */ +#define ETH_DMARxDesc_B2AP ((uint32_t)0xFFFFFFFF) /*!< Buffer2 Address Pointer */ + +/**--------------------------------------------------------------------------**/ +/** + * @brief Desciption of common PHY registers + */ +/**--------------------------------------------------------------------------**/ + +/** + * @} + */ + +/** @defgroup PHY_Read_write_Timeouts + * @{ + */ +#define PHY_READ_TO ((uint32_t)0x0004FFFF) +#define PHY_WRITE_TO ((uint32_t)0x0004FFFF) + +/** + * @} + */ + +/** @defgroup PHY_Reset_Delay + * @{ + */ +#define PHY_ResetDelay ((uint32_t)0x04000000) + +/** + * @} + */ + +/** @defgroup PHY_Config_Delay + * @{ + */ +#define PHY_ConfigDelay ((uint32_t)0x00FFFFFF) + +/** + * @} + */ + +/** @defgroup PHY_Register_address + * @{ + */ +#define PHY_BCR 0 /*!< Tranceiver Basic Control Register */ +#define PHY_BSR 1 /*!< Tranceiver Basic Status Register */ + +/** + * @} + */ + +/** @defgroup PHY_basic_Control_register + * @{ + */ +#define PHY_Reset ((u16)0x8000) /*!< PHY Reset */ +#define PHY_Loopback ((u16)0x4000) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((u16)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((u16)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((u16)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((u16)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AutoNegotiation ((u16)0x1000) /*!< Enable auto-negotiation function */ +#define PHY_Restart_AutoNegotiation ((u16)0x0200) /*!< Restart auto-negotiation function */ +#define PHY_Powerdown ((u16)0x0800) /*!< Select the power down mode */ +#define PHY_Isolate ((u16)0x0400) /*!< Isolate PHY from MII */ + +/** + * @} + */ + +/** @defgroup PHY_basic_status_register + * @{ + */ +#define PHY_AutoNego_Complete ((u16)0x0020) /*!< Auto-Negotioation process completed */ +#define PHY_Linked_Status ((u16)0x0004) /*!< Valid link established */ +#define PHY_Jabber_detection ((u16)0x0002) /*!< Jabber condition detected */ + +/** + * @} + */ + +/** @defgroup PHY_status_register + * @{ + */ +/* The PHY status register value change from a PHY to another so the user have + to update this value depending on the used external PHY */ +/** + * @brief For LAN8700 + */ +//#define PHY_SR 31 /*!< Tranceiver Status Register */ +/** + * @brief For DP83848 + */ +#define PHY_SR 16 /*!< Tranceiver Status Register */ + +/* The Speed and Duplex mask values change from a PHY to another so the user have to update + this value depending on the used external PHY */ +/** + * @brief For LAN8700 + */ +//#define PHY_Speed_Status ((u16)0x0004) /*!< Configured information of Speed: 10Mbps */ +//#define PHY_Duplex_Status ((u16)0x0010) /*!< Configured information of Duplex: Full-duplex */ + +/** + * @brief For DP83848 + */ +#define PHY_Speed_Status ((u16)0x0002) /*!< Configured information of Speed: 10Mbps */ +#define PHY_Duplex_Status ((u16)0x0004) /*!< Configured information of Duplex: Full-duplex */ +#define IS_ETH_PHY_ADDRESS(ADDRESS) ((ADDRESS) <= 0x20) +#define IS_ETH_PHY_REG(REG) (((REG) == PHY_BCR) || \ + ((REG) == PHY_BSR) || \ + ((REG) == PHY_SR)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief MAC defines + */ +/**--------------------------------------------------------------------------**/ + +/** + * @} + */ + +/** @defgroup ETH_AutoNegotiation + * @{ + */ +#define ETH_AutoNegotiation_Enable ((uint32_t)0x00000001) +#define ETH_AutoNegotiation_Disable ((uint32_t)0x00000000) +#define IS_ETH_AUTONEGOTIATION(CMD) (((CMD) == ETH_AutoNegotiation_Enable) || \ + ((CMD) == ETH_AutoNegotiation_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_watchdog + * @{ + */ +#define ETH_Watchdog_Enable ((uint32_t)0x00000000) +#define ETH_Watchdog_Disable ((uint32_t)0x00800000) +#define IS_ETH_WATCHDOG(CMD) (((CMD) == ETH_Watchdog_Enable) || \ + ((CMD) == ETH_Watchdog_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Jabber + * @{ + */ +#define ETH_Jabber_Enable ((uint32_t)0x00000000) +#define ETH_Jabber_Disable ((uint32_t)0x00400000) +#define IS_ETH_JABBER(CMD) (((CMD) == ETH_Jabber_Enable) || \ + ((CMD) == ETH_Jabber_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Inter_Frame_Gap + * @{ + */ +#define ETH_InterFrameGap_96Bit ((uint32_t)0x00000000) /*!< minimum IFG between frames during transmission is 96Bit */ +#define ETH_InterFrameGap_88Bit ((uint32_t)0x00020000) /*!< minimum IFG between frames during transmission is 88Bit */ +#define ETH_InterFrameGap_80Bit ((uint32_t)0x00040000) /*!< minimum IFG between frames during transmission is 80Bit */ +#define ETH_InterFrameGap_72Bit ((uint32_t)0x00060000) /*!< minimum IFG between frames during transmission is 72Bit */ +#define ETH_InterFrameGap_64Bit ((uint32_t)0x00080000) /*!< minimum IFG between frames during transmission is 64Bit */ +#define ETH_InterFrameGap_56Bit ((uint32_t)0x000A0000) /*!< minimum IFG between frames during transmission is 56Bit */ +#define ETH_InterFrameGap_48Bit ((uint32_t)0x000C0000) /*!< minimum IFG between frames during transmission is 48Bit */ +#define ETH_InterFrameGap_40Bit ((uint32_t)0x000E0000) /*!< minimum IFG between frames during transmission is 40Bit */ +#define IS_ETH_INTER_FRAME_GAP(GAP) (((GAP) == ETH_InterFrameGap_96Bit) || \ + ((GAP) == ETH_InterFrameGap_88Bit) || \ + ((GAP) == ETH_InterFrameGap_80Bit) || \ + ((GAP) == ETH_InterFrameGap_72Bit) || \ + ((GAP) == ETH_InterFrameGap_64Bit) || \ + ((GAP) == ETH_InterFrameGap_56Bit) || \ + ((GAP) == ETH_InterFrameGap_48Bit) || \ + ((GAP) == ETH_InterFrameGap_40Bit)) + +/** + * @} + */ + +/** @defgroup ETH_Carrier_Sense + * @{ + */ +#define ETH_CarrierSense_Enable ((uint32_t)0x00000000) +#define ETH_CarrierSense_Disable ((uint32_t)0x00010000) +#define IS_ETH_CARRIER_SENSE(CMD) (((CMD) == ETH_CarrierSense_Enable) || \ + ((CMD) == ETH_CarrierSense_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Speed + * @{ + */ +#define ETH_Speed_10M ((uint32_t)0x00000000) +#define ETH_Speed_100M ((uint32_t)0x00004000) +#define IS_ETH_SPEED(SPEED) (((SPEED) == ETH_Speed_10M) || \ + ((SPEED) == ETH_Speed_100M)) + +/** + * @} + */ + +/** @defgroup ETH_Receive_Own + * @{ + */ +#define ETH_ReceiveOwn_Enable ((uint32_t)0x00000000) +#define ETH_ReceiveOwn_Disable ((uint32_t)0x00002000) +#define IS_ETH_RECEIVE_OWN(CMD) (((CMD) == ETH_ReceiveOwn_Enable) || \ + ((CMD) == ETH_ReceiveOwn_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Loop_back_Mode + * @{ + */ +#define ETH_LoopbackMode_Enable ((uint32_t)0x00001000) +#define ETH_LoopbackMode_Disable ((uint32_t)0x00000000) +#define IS_ETH_LOOPBACK_MODE(CMD) (((CMD) == ETH_LoopbackMode_Enable) || \ + ((CMD) == ETH_LoopbackMode_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Duplex_mode + * @{ + */ +#define ETH_Mode_FullDuplex ((uint32_t)0x00000800) +#define ETH_Mode_HalfDuplex ((uint32_t)0x00000000) +#define IS_ETH_DUPLEX_MODE(MODE) (((MODE) == ETH_Mode_FullDuplex) || \ + ((MODE) == ETH_Mode_HalfDuplex)) + +/** + * @} + */ + +/** @defgroup ETH_Checksum_Offload + * @{ + */ +#define ETH_ChecksumOffload_Enable ((uint32_t)0x00000400) +#define ETH_ChecksumOffload_Disable ((uint32_t)0x00000000) +#define IS_ETH_CHECKSUM_OFFLOAD(CMD) (((CMD) == ETH_ChecksumOffload_Enable) || \ + ((CMD) == ETH_ChecksumOffload_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Retry_Transmission + * @{ + */ +#define ETH_RetryTransmission_Enable ((uint32_t)0x00000000) +#define ETH_RetryTransmission_Disable ((uint32_t)0x00000200) +#define IS_ETH_RETRY_TRANSMISSION(CMD) (((CMD) == ETH_RetryTransmission_Enable) || \ + ((CMD) == ETH_RetryTransmission_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Automatic_Pad_CRC_Strip + * @{ + */ +#define ETH_AutomaticPadCRCStrip_Enable ((uint32_t)0x00000080) +#define ETH_AutomaticPadCRCStrip_Disable ((uint32_t)0x00000000) +#define IS_ETH_AUTOMATIC_PADCRC_STRIP(CMD) (((CMD) == ETH_AutomaticPadCRCStrip_Enable) || \ + ((CMD) == ETH_AutomaticPadCRCStrip_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Back-Off_limit + * @{ + */ +#define ETH_BackOffLimit_10 ((uint32_t)0x00000000) +#define ETH_BackOffLimit_8 ((uint32_t)0x00000020) +#define ETH_BackOffLimit_4 ((uint32_t)0x00000040) +#define ETH_BackOffLimit_1 ((uint32_t)0x00000060) +#define IS_ETH_BACKOFF_LIMIT(LIMIT) (((LIMIT) == ETH_BackOffLimit_10) || \ + ((LIMIT) == ETH_BackOffLimit_8) || \ + ((LIMIT) == ETH_BackOffLimit_4) || \ + ((LIMIT) == ETH_BackOffLimit_1)) + +/** + * @} + */ + +/** @defgroup ETH_Deferral_Check + * @{ + */ +#define ETH_DeferralCheck_Enable ((uint32_t)0x00000010) +#define ETH_DeferralCheck_Disable ((uint32_t)0x00000000) +#define IS_ETH_DEFERRAL_CHECK(CMD) (((CMD) == ETH_DeferralCheck_Enable) || \ + ((CMD) == ETH_DeferralCheck_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Receive_All + * @{ + */ +#define ETH_ReceiveAll_Enable ((uint32_t)0x80000000) +#define ETH_ReceiveAll_Disable ((uint32_t)0x00000000) +#define IS_ETH_RECEIVE_ALL(CMD) (((CMD) == ETH_ReceiveAll_Enable) || \ + ((CMD) == ETH_ReceiveAll_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Source_Addr_Filter + * @{ + */ +#define ETH_SourceAddrFilter_Normal_Enable ((uint32_t)0x00000200) +#define ETH_SourceAddrFilter_Inverse_Enable ((uint32_t)0x00000300) +#define ETH_SourceAddrFilter_Disable ((uint32_t)0x00000000) +#define IS_ETH_SOURCE_ADDR_FILTER(CMD) (((CMD) == ETH_SourceAddrFilter_Normal_Enable) || \ + ((CMD) == ETH_SourceAddrFilter_Inverse_Enable) || \ + ((CMD) == ETH_SourceAddrFilter_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Pass_Control_Frames + * @{ + */ +#define ETH_PassControlFrames_BlockAll ((uint32_t)0x00000040) /*!< MAC filters all control frames from reaching the application */ +#define ETH_PassControlFrames_ForwardAll ((uint32_t)0x00000080) /*!< MAC forwards all control frames to application even if they fail the Address Filter */ +#define ETH_PassControlFrames_ForwardPassedAddrFilter ((uint32_t)0x000000C0) /*!< MAC forwards control frames that pass the Address Filter. */ +#define IS_ETH_CONTROL_FRAMES(PASS) (((PASS) == ETH_PassControlFrames_BlockAll) || \ + ((PASS) == ETH_PassControlFrames_ForwardAll) || \ + ((PASS) == ETH_PassControlFrames_ForwardPassedAddrFilter)) + +/** + * @} + */ + +/** @defgroup ETH_Broadcast_Frames_Reception + * @{ + */ +#define ETH_BroadcastFramesReception_Enable ((uint32_t)0x00000000) +#define ETH_BroadcastFramesReception_Disable ((uint32_t)0x00000020) +#define IS_ETH_BROADCAST_FRAMES_RECEPTION(CMD) (((CMD) == ETH_BroadcastFramesReception_Enable) || \ + ((CMD) == ETH_BroadcastFramesReception_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Destination_Addr_Filter + * @{ + */ +#define ETH_DestinationAddrFilter_Normal ((uint32_t)0x00000000) +#define ETH_DestinationAddrFilter_Inverse ((uint32_t)0x00000008) +#define IS_ETH_DESTINATION_ADDR_FILTER(FILTER) (((FILTER) == ETH_DestinationAddrFilter_Normal) || \ + ((FILTER) == ETH_DestinationAddrFilter_Inverse)) + +/** + * @} + */ + +/** @defgroup ETH_Promiscuous_Mode + * @{ + */ +#define ETH_PromiscuousMode_Enable ((uint32_t)0x00000001) +#define ETH_PromiscuousMode_Disable ((uint32_t)0x00000000) +#define IS_ETH_PROMISCUOUS_MODE(CMD) (((CMD) == ETH_PromiscuousMode_Enable) || \ + ((CMD) == ETH_PromiscuousMode_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_multicast_frames_filter + * @{ + */ +#define ETH_MulticastFramesFilter_PerfectHashTable ((uint32_t)0x00000404) +#define ETH_MulticastFramesFilter_HashTable ((uint32_t)0x00000004) +#define ETH_MulticastFramesFilter_Perfect ((uint32_t)0x00000000) +#define ETH_MulticastFramesFilter_None ((uint32_t)0x00000010) +#define IS_ETH_MULTICAST_FRAMES_FILTER(FILTER) (((FILTER) == ETH_MulticastFramesFilter_PerfectHashTable) || \ + ((FILTER) == ETH_MulticastFramesFilter_HashTable) || \ + ((FILTER) == ETH_MulticastFramesFilter_Perfect) || \ + ((FILTER) == ETH_MulticastFramesFilter_None)) + + +/** + * @} + */ + +/** @defgroup ETH_unicast_frames_filter + * @{ + */ +#define ETH_UnicastFramesFilter_PerfectHashTable ((uint32_t)0x00000402) +#define ETH_UnicastFramesFilter_HashTable ((uint32_t)0x00000002) +#define ETH_UnicastFramesFilter_Perfect ((uint32_t)0x00000000) +#define IS_ETH_UNICAST_FRAMES_FILTER(FILTER) (((FILTER) == ETH_UnicastFramesFilter_PerfectHashTable) || \ + ((FILTER) == ETH_UnicastFramesFilter_HashTable) || \ + ((FILTER) == ETH_UnicastFramesFilter_Perfect)) + +/** + * @} + */ + +/** @defgroup ETH_Pause_Time + * @{ + */ +#define IS_ETH_PAUSE_TIME(TIME) ((TIME) <= 0xFFFF) + +/** + * @} + */ + +/** @defgroup ETH_Zero_Quanta_Pause + * @{ + */ +#define ETH_ZeroQuantaPause_Enable ((uint32_t)0x00000000) +#define ETH_ZeroQuantaPause_Disable ((uint32_t)0x00000080) +#define IS_ETH_ZEROQUANTA_PAUSE(CMD) (((CMD) == ETH_ZeroQuantaPause_Enable) || \ + ((CMD) == ETH_ZeroQuantaPause_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Pause_Low_Threshold + * @{ + */ +#define ETH_PauseLowThreshold_Minus4 ((uint32_t)0x00000000) /*!< Pause time minus 4 slot times */ +#define ETH_PauseLowThreshold_Minus28 ((uint32_t)0x00000010) /*!< Pause time minus 28 slot times */ +#define ETH_PauseLowThreshold_Minus144 ((uint32_t)0x00000020) /*!< Pause time minus 144 slot times */ +#define ETH_PauseLowThreshold_Minus256 ((uint32_t)0x00000030) /*!< Pause time minus 256 slot times */ +#define IS_ETH_PAUSE_LOW_THRESHOLD(THRESHOLD) (((THRESHOLD) == ETH_PauseLowThreshold_Minus4) || \ + ((THRESHOLD) == ETH_PauseLowThreshold_Minus28) || \ + ((THRESHOLD) == ETH_PauseLowThreshold_Minus144) || \ + ((THRESHOLD) == ETH_PauseLowThreshold_Minus256)) + +/** + * @} + */ + +/** @defgroup ETH_Unicast_Pause_Frame_Detect + * @{ + */ +#define ETH_UnicastPauseFrameDetect_Enable ((uint32_t)0x00000008) +#define ETH_UnicastPauseFrameDetect_Disable ((uint32_t)0x00000000) +#define IS_ETH_UNICAST_PAUSE_FRAME_DETECT(CMD) (((CMD) == ETH_UnicastPauseFrameDetect_Enable) || \ + ((CMD) == ETH_UnicastPauseFrameDetect_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Receive_Flow_Control + * @{ + */ +#define ETH_ReceiveFlowControl_Enable ((uint32_t)0x00000004) +#define ETH_ReceiveFlowControl_Disable ((uint32_t)0x00000000) +#define IS_ETH_RECEIVE_FLOWCONTROL(CMD) (((CMD) == ETH_ReceiveFlowControl_Enable) || \ + ((CMD) == ETH_ReceiveFlowControl_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Transmit_Flow_Control + * @{ + */ +#define ETH_TransmitFlowControl_Enable ((uint32_t)0x00000002) +#define ETH_TransmitFlowControl_Disable ((uint32_t)0x00000000) +#define IS_ETH_TRANSMIT_FLOWCONTROL(CMD) (((CMD) == ETH_TransmitFlowControl_Enable) || \ + ((CMD) == ETH_TransmitFlowControl_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_VLAN_Tag_Comparison + * @{ + */ +#define ETH_VLANTagComparison_12Bit ((uint32_t)0x00010000) +#define ETH_VLANTagComparison_16Bit ((uint32_t)0x00000000) +#define IS_ETH_VLAN_TAG_COMPARISON(COMPARISON) (((COMPARISON) == ETH_VLANTagComparison_12Bit) || \ + ((COMPARISON) == ETH_VLANTagComparison_16Bit)) +#define IS_ETH_VLAN_TAG_IDENTIFIER(IDENTIFIER) ((IDENTIFIER) <= 0xFFFF) + +/** + * @} + */ + +/** @defgroup ETH_MAC_Flags + * @{ + */ +#define ETH_MAC_FLAG_TST ((uint32_t)0x00000200) /*!< Time stamp trigger flag (on MAC) */ +#define ETH_MAC_FLAG_MMCT ((uint32_t)0x00000040) /*!< MMC transmit flag */ +#define ETH_MAC_FLAG_MMCR ((uint32_t)0x00000020) /*!< MMC receive flag */ +#define ETH_MAC_FLAG_MMC ((uint32_t)0x00000010) /*!< MMC flag (on MAC) */ +#define ETH_MAC_FLAG_PMT ((uint32_t)0x00000008) /*!< PMT flag (on MAC) */ +#define IS_ETH_MAC_GET_FLAG(FLAG) (((FLAG) == ETH_MAC_FLAG_TST) || ((FLAG) == ETH_MAC_FLAG_MMCT) || \ + ((FLAG) == ETH_MAC_FLAG_MMCR) || ((FLAG) == ETH_MAC_FLAG_MMC) || \ + ((FLAG) == ETH_MAC_FLAG_PMT)) +/** + * @} + */ + +/** @defgroup ETH_MAC_Interrupts + * @{ + */ +#define ETH_MAC_IT_TST ((uint32_t)0x00000200) /*!< Time stamp trigger interrupt (on MAC) */ +#define ETH_MAC_IT_MMCT ((uint32_t)0x00000040) /*!< MMC transmit interrupt */ +#define ETH_MAC_IT_MMCR ((uint32_t)0x00000020) /*!< MMC receive interrupt */ +#define ETH_MAC_IT_MMC ((uint32_t)0x00000010) /*!< MMC interrupt (on MAC) */ +#define ETH_MAC_IT_PMT ((uint32_t)0x00000008) /*!< PMT interrupt (on MAC) */ +#define IS_ETH_MAC_IT(IT) ((((IT) & (uint32_t)0xFFFFFDF7) == 0x00) && ((IT) != 0x00)) +#define IS_ETH_MAC_GET_IT(IT) (((IT) == ETH_MAC_IT_TST) || ((IT) == ETH_MAC_IT_MMCT) || \ + ((IT) == ETH_MAC_IT_MMCR) || ((IT) == ETH_MAC_IT_MMC) || \ + ((IT) == ETH_MAC_IT_PMT)) +/** + * @} + */ + +/** @defgroup ETH_MAC_addresses + * @{ + */ +#define ETH_MAC_Address0 ((uint32_t)0x00000000) +#define ETH_MAC_Address1 ((uint32_t)0x00000008) +#define ETH_MAC_Address2 ((uint32_t)0x00000010) +#define ETH_MAC_Address3 ((uint32_t)0x00000018) +#define IS_ETH_MAC_ADDRESS0123(ADDRESS) (((ADDRESS) == ETH_MAC_Address0) || \ + ((ADDRESS) == ETH_MAC_Address1) || \ + ((ADDRESS) == ETH_MAC_Address2) || \ + ((ADDRESS) == ETH_MAC_Address3)) +#define IS_ETH_MAC_ADDRESS123(ADDRESS) (((ADDRESS) == ETH_MAC_Address1) || \ + ((ADDRESS) == ETH_MAC_Address2) || \ + ((ADDRESS) == ETH_MAC_Address3)) +/** + * @} + */ + +/** @defgroup ETH_MAC_addresses_filter:_SA_DA_filed_of_received_frames + * @{ + */ +#define ETH_MAC_AddressFilter_SA ((uint32_t)0x00000000) +#define ETH_MAC_AddressFilter_DA ((uint32_t)0x00000008) +#define IS_ETH_MAC_ADDRESS_FILTER(FILTER) (((FILTER) == ETH_MAC_AddressFilter_SA) || \ + ((FILTER) == ETH_MAC_AddressFilter_DA)) +/** + * @} + */ + +/** @defgroup ETH_MAC_addresses_filter:_Mask_bytes + * @{ + */ +#define ETH_MAC_AddressMask_Byte6 ((uint32_t)0x20000000) /*!< Mask MAC Address high reg bits [15:8] */ +#define ETH_MAC_AddressMask_Byte5 ((uint32_t)0x10000000) /*!< Mask MAC Address high reg bits [7:0] */ +#define ETH_MAC_AddressMask_Byte4 ((uint32_t)0x08000000) /*!< Mask MAC Address low reg bits [31:24] */ +#define ETH_MAC_AddressMask_Byte3 ((uint32_t)0x04000000) /*!< Mask MAC Address low reg bits [23:16] */ +#define ETH_MAC_AddressMask_Byte2 ((uint32_t)0x02000000) /*!< Mask MAC Address low reg bits [15:8] */ +#define ETH_MAC_AddressMask_Byte1 ((uint32_t)0x01000000) /*!< Mask MAC Address low reg bits [70] */ +#define IS_ETH_MAC_ADDRESS_MASK(MASK) (((MASK) == ETH_MAC_AddressMask_Byte6) || \ + ((MASK) == ETH_MAC_AddressMask_Byte5) || \ + ((MASK) == ETH_MAC_AddressMask_Byte4) || \ + ((MASK) == ETH_MAC_AddressMask_Byte3) || \ + ((MASK) == ETH_MAC_AddressMask_Byte2) || \ + ((MASK) == ETH_MAC_AddressMask_Byte1)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet DMA Desciptors defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_DMA_Tx_descriptor_flags + * @{ + */ +#define IS_ETH_DMATxDESC_GET_FLAG(FLAG) (((FLAG) == ETH_DMATxDesc_OWN) || \ + ((FLAG) == ETH_DMATxDesc_IC) || \ + ((FLAG) == ETH_DMATxDesc_LS) || \ + ((FLAG) == ETH_DMATxDesc_FS) || \ + ((FLAG) == ETH_DMATxDesc_DC) || \ + ((FLAG) == ETH_DMATxDesc_DP) || \ + ((FLAG) == ETH_DMATxDesc_TTSE) || \ + ((FLAG) == ETH_DMATxDesc_TER) || \ + ((FLAG) == ETH_DMATxDesc_TCH) || \ + ((FLAG) == ETH_DMATxDesc_TTSS) || \ + ((FLAG) == ETH_DMATxDesc_IHE) || \ + ((FLAG) == ETH_DMATxDesc_ES) || \ + ((FLAG) == ETH_DMATxDesc_JT) || \ + ((FLAG) == ETH_DMATxDesc_FF) || \ + ((FLAG) == ETH_DMATxDesc_PCE) || \ + ((FLAG) == ETH_DMATxDesc_LCA) || \ + ((FLAG) == ETH_DMATxDesc_NC) || \ + ((FLAG) == ETH_DMATxDesc_LCO) || \ + ((FLAG) == ETH_DMATxDesc_EC) || \ + ((FLAG) == ETH_DMATxDesc_VF) || \ + ((FLAG) == ETH_DMATxDesc_CC) || \ + ((FLAG) == ETH_DMATxDesc_ED) || \ + ((FLAG) == ETH_DMATxDesc_UF) || \ + ((FLAG) == ETH_DMATxDesc_DB)) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Tx_descriptor_segment + * @{ + */ +#define ETH_DMATxDesc_LastSegment ((uint32_t)0x40000000) /*!< Last Segment */ +#define ETH_DMATxDesc_FirstSegment ((uint32_t)0x20000000) /*!< First Segment */ +#define IS_ETH_DMA_TXDESC_SEGMENT(SEGMENT) (((SEGMENT) == ETH_DMATxDesc_LastSegment) || \ + ((SEGMENT) == ETH_DMATxDesc_FirstSegment)) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Tx_descriptor_Checksum_Insertion_Control + * @{ + */ +#define ETH_DMATxDesc_ChecksumByPass ((uint32_t)0x00000000) /*!< Checksum engine bypass */ +#define ETH_DMATxDesc_ChecksumIPV4Header ((uint32_t)0x00400000) /*!< IPv4 header checksum insertion */ +#define ETH_DMATxDesc_ChecksumTCPUDPICMPSegment ((uint32_t)0x00800000) /*!< TCP/UDP/ICMP checksum insertion. Pseudo header checksum is assumed to be present */ +#define ETH_DMATxDesc_ChecksumTCPUDPICMPFull ((uint32_t)0x00C00000) /*!< TCP/UDP/ICMP checksum fully in hardware including pseudo header */ +#define IS_ETH_DMA_TXDESC_CHECKSUM(CHECKSUM) (((CHECKSUM) == ETH_DMATxDesc_ChecksumByPass) || \ + ((CHECKSUM) == ETH_DMATxDesc_ChecksumIPV4Header) || \ + ((CHECKSUM) == ETH_DMATxDesc_ChecksumTCPUDPICMPSegment) || \ + ((CHECKSUM) == ETH_DMATxDesc_ChecksumTCPUDPICMPFull)) +/** + * @brief ETH DMA Tx Desciptor buffer size + */ +#define IS_ETH_DMATxDESC_BUFFER_SIZE(SIZE) ((SIZE) <= 0x1FFF) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Rx_descriptor_flags + * @{ + */ +#define IS_ETH_DMARxDESC_GET_FLAG(FLAG) (((FLAG) == ETH_DMARxDesc_OWN) || \ + ((FLAG) == ETH_DMARxDesc_AFM) || \ + ((FLAG) == ETH_DMARxDesc_ES) || \ + ((FLAG) == ETH_DMARxDesc_DE) || \ + ((FLAG) == ETH_DMARxDesc_SAF) || \ + ((FLAG) == ETH_DMARxDesc_LE) || \ + ((FLAG) == ETH_DMARxDesc_OE) || \ + ((FLAG) == ETH_DMARxDesc_VLAN) || \ + ((FLAG) == ETH_DMARxDesc_FS) || \ + ((FLAG) == ETH_DMARxDesc_LS) || \ + ((FLAG) == ETH_DMARxDesc_IPV4HCE) || \ + ((FLAG) == ETH_DMARxDesc_LC) || \ + ((FLAG) == ETH_DMARxDesc_FT) || \ + ((FLAG) == ETH_DMARxDesc_RWT) || \ + ((FLAG) == ETH_DMARxDesc_RE) || \ + ((FLAG) == ETH_DMARxDesc_DBE) || \ + ((FLAG) == ETH_DMARxDesc_CE) || \ + ((FLAG) == ETH_DMARxDesc_MAMPCE)) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Rx_descriptor_buffers_ + * @{ + */ +#define ETH_DMARxDesc_Buffer1 ((uint32_t)0x00000000) /*!< DMA Rx Desc Buffer1 */ +#define ETH_DMARxDesc_Buffer2 ((uint32_t)0x00000001) /*!< DMA Rx Desc Buffer2 */ +#define IS_ETH_DMA_RXDESC_BUFFER(BUFFER) (((BUFFER) == ETH_DMARxDesc_Buffer1) || \ + ((BUFFER) == ETH_DMARxDesc_Buffer2)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet DMA defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_Drop_TCP_IP_Checksum_Error_Frame + * @{ + */ +#define ETH_DropTCPIPChecksumErrorFrame_Enable ((uint32_t)0x00000000) +#define ETH_DropTCPIPChecksumErrorFrame_Disable ((uint32_t)0x04000000) +#define IS_ETH_DROP_TCPIP_CHECKSUM_FRAME(CMD) (((CMD) == ETH_DropTCPIPChecksumErrorFrame_Enable) || \ + ((CMD) == ETH_DropTCPIPChecksumErrorFrame_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Receive_Store_Forward + * @{ + */ +#define ETH_ReceiveStoreForward_Enable ((uint32_t)0x02000000) +#define ETH_ReceiveStoreForward_Disable ((uint32_t)0x00000000) +#define IS_ETH_RECEIVE_STORE_FORWARD(CMD) (((CMD) == ETH_ReceiveStoreForward_Enable) || \ + ((CMD) == ETH_ReceiveStoreForward_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Flush_Received_Frame + * @{ + */ +#define ETH_FlushReceivedFrame_Enable ((uint32_t)0x00000000) +#define ETH_FlushReceivedFrame_Disable ((uint32_t)0x01000000) +#define IS_ETH_FLUSH_RECEIVE_FRAME(CMD) (((CMD) == ETH_FlushReceivedFrame_Enable) || \ + ((CMD) == ETH_FlushReceivedFrame_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Transmit_Store_Forward + * @{ + */ +#define ETH_TransmitStoreForward_Enable ((uint32_t)0x00200000) +#define ETH_TransmitStoreForward_Disable ((uint32_t)0x00000000) +#define IS_ETH_TRANSMIT_STORE_FORWARD(CMD) (((CMD) == ETH_TransmitStoreForward_Enable) || \ + ((CMD) == ETH_TransmitStoreForward_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Transmit_Threshold_Control + * @{ + */ +#define ETH_TransmitThresholdControl_64Bytes ((uint32_t)0x00000000) /*!< threshold level of the MTL Transmit FIFO is 64 Bytes */ +#define ETH_TransmitThresholdControl_128Bytes ((uint32_t)0x00004000) /*!< threshold level of the MTL Transmit FIFO is 128 Bytes */ +#define ETH_TransmitThresholdControl_192Bytes ((uint32_t)0x00008000) /*!< threshold level of the MTL Transmit FIFO is 192 Bytes */ +#define ETH_TransmitThresholdControl_256Bytes ((uint32_t)0x0000C000) /*!< threshold level of the MTL Transmit FIFO is 256 Bytes */ +#define ETH_TransmitThresholdControl_40Bytes ((uint32_t)0x00010000) /*!< threshold level of the MTL Transmit FIFO is 40 Bytes */ +#define ETH_TransmitThresholdControl_32Bytes ((uint32_t)0x00014000) /*!< threshold level of the MTL Transmit FIFO is 32 Bytes */ +#define ETH_TransmitThresholdControl_24Bytes ((uint32_t)0x00018000) /*!< threshold level of the MTL Transmit FIFO is 24 Bytes */ +#define ETH_TransmitThresholdControl_16Bytes ((uint32_t)0x0001C000) /*!< threshold level of the MTL Transmit FIFO is 16 Bytes */ +#define IS_ETH_TRANSMIT_THRESHOLD_CONTROL(THRESHOLD) (((THRESHOLD) == ETH_TransmitThresholdControl_64Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_128Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_192Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_256Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_40Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_32Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_24Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_16Bytes)) +/** + * @} + */ + +/** @defgroup ETH_Forward_Error_Frames + * @{ + */ +#define ETH_ForwardErrorFrames_Enable ((uint32_t)0x00000080) +#define ETH_ForwardErrorFrames_Disable ((uint32_t)0x00000000) +#define IS_ETH_FORWARD_ERROR_FRAMES(CMD) (((CMD) == ETH_ForwardErrorFrames_Enable) || \ + ((CMD) == ETH_ForwardErrorFrames_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Forward_Undersized_Good_Frames + * @{ + */ +#define ETH_ForwardUndersizedGoodFrames_Enable ((uint32_t)0x00000040) +#define ETH_ForwardUndersizedGoodFrames_Disable ((uint32_t)0x00000000) +#define IS_ETH_FORWARD_UNDERSIZED_GOOD_FRAMES(CMD) (((CMD) == ETH_ForwardUndersizedGoodFrames_Enable) || \ + ((CMD) == ETH_ForwardUndersizedGoodFrames_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Receive_Threshold_Control + * @{ + */ +#define ETH_ReceiveThresholdControl_64Bytes ((uint32_t)0x00000000) /*!< threshold level of the MTL Receive FIFO is 64 Bytes */ +#define ETH_ReceiveThresholdControl_32Bytes ((uint32_t)0x00000008) /*!< threshold level of the MTL Receive FIFO is 32 Bytes */ +#define ETH_ReceiveThresholdControl_96Bytes ((uint32_t)0x00000010) /*!< threshold level of the MTL Receive FIFO is 96 Bytes */ +#define ETH_ReceiveThresholdControl_128Bytes ((uint32_t)0x00000018) /*!< threshold level of the MTL Receive FIFO is 128 Bytes */ +#define IS_ETH_RECEIVE_THRESHOLD_CONTROL(THRESHOLD) (((THRESHOLD) == ETH_ReceiveThresholdControl_64Bytes) || \ + ((THRESHOLD) == ETH_ReceiveThresholdControl_32Bytes) || \ + ((THRESHOLD) == ETH_ReceiveThresholdControl_96Bytes) || \ + ((THRESHOLD) == ETH_ReceiveThresholdControl_128Bytes)) +/** + * @} + */ + +/** @defgroup ETH_Second_Frame_Operate + * @{ + */ +#define ETH_SecondFrameOperate_Enable ((uint32_t)0x00000004) +#define ETH_SecondFrameOperate_Disable ((uint32_t)0x00000000) +#define IS_ETH_SECOND_FRAME_OPERATE(CMD) (((CMD) == ETH_SecondFrameOperate_Enable) || \ + ((CMD) == ETH_SecondFrameOperate_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Address_Aligned_Beats + * @{ + */ +#define ETH_AddressAlignedBeats_Enable ((uint32_t)0x02000000) +#define ETH_AddressAlignedBeats_Disable ((uint32_t)0x00000000) +#define IS_ETH_ADDRESS_ALIGNED_BEATS(CMD) (((CMD) == ETH_AddressAlignedBeats_Enable) || \ + ((CMD) == ETH_AddressAlignedBeats_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Fixed_Burst + * @{ + */ +#define ETH_FixedBurst_Enable ((uint32_t)0x00010000) +#define ETH_FixedBurst_Disable ((uint32_t)0x00000000) +#define IS_ETH_FIXED_BURST(CMD) (((CMD) == ETH_FixedBurst_Enable) || \ + ((CMD) == ETH_FixedBurst_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Rx_DMA_Burst_Length + * @{ + */ +#define ETH_RxDMABurstLength_1Beat ((uint32_t)0x00020000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 1 */ +#define ETH_RxDMABurstLength_2Beat ((uint32_t)0x00040000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 2 */ +#define ETH_RxDMABurstLength_4Beat ((uint32_t)0x00080000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 4 */ +#define ETH_RxDMABurstLength_8Beat ((uint32_t)0x00100000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 8 */ +#define ETH_RxDMABurstLength_16Beat ((uint32_t)0x00200000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 16 */ +#define ETH_RxDMABurstLength_32Beat ((uint32_t)0x00400000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 32 */ +#define ETH_RxDMABurstLength_4xPBL_4Beat ((uint32_t)0x01020000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 4 */ +#define ETH_RxDMABurstLength_4xPBL_8Beat ((uint32_t)0x01040000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 8 */ +#define ETH_RxDMABurstLength_4xPBL_16Beat ((uint32_t)0x01080000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 16 */ +#define ETH_RxDMABurstLength_4xPBL_32Beat ((uint32_t)0x01100000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 32 */ +#define ETH_RxDMABurstLength_4xPBL_64Beat ((uint32_t)0x01200000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 64 */ +#define ETH_RxDMABurstLength_4xPBL_128Beat ((uint32_t)0x01400000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 128 */ +#define IS_ETH_RXDMA_BURST_LENGTH(LENGTH) (((LENGTH) == ETH_RxDMABurstLength_1Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_2Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_8Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_16Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_32Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_4Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_8Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_16Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_32Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_64Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_128Beat)) + +/** + * @} + */ + +/** @defgroup ETH_Tx_DMA_Burst_Length + * @{ + */ +#define ETH_TxDMABurstLength_1Beat ((uint32_t)0x00000100) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 1 */ +#define ETH_TxDMABurstLength_2Beat ((uint32_t)0x00000200) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 2 */ +#define ETH_TxDMABurstLength_4Beat ((uint32_t)0x00000400) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ +#define ETH_TxDMABurstLength_8Beat ((uint32_t)0x00000800) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ +#define ETH_TxDMABurstLength_16Beat ((uint32_t)0x00001000) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ +#define ETH_TxDMABurstLength_32Beat ((uint32_t)0x00002000) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ +#define ETH_TxDMABurstLength_4xPBL_4Beat ((uint32_t)0x01000100) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ +#define ETH_TxDMABurstLength_4xPBL_8Beat ((uint32_t)0x01000200) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ +#define ETH_TxDMABurstLength_4xPBL_16Beat ((uint32_t)0x01000400) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ +#define ETH_TxDMABurstLength_4xPBL_32Beat ((uint32_t)0x01000800) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ +#define ETH_TxDMABurstLength_4xPBL_64Beat ((uint32_t)0x01001000) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 64 */ +#define ETH_TxDMABurstLength_4xPBL_128Beat ((uint32_t)0x01002000) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 128 */ +#define IS_ETH_TXDMA_BURST_LENGTH(LENGTH) (((LENGTH) == ETH_TxDMABurstLength_1Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_2Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_8Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_16Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_32Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_4Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_8Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_16Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_32Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_64Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_128Beat)) +/** + * @brief ETH DMA Desciptor SkipLength + */ +#define IS_ETH_DMA_DESC_SKIP_LENGTH(LENGTH) ((LENGTH) <= 0x1F) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Arbitration + * @{ + */ +#define ETH_DMAArbitration_RoundRobin_RxTx_1_1 ((uint32_t)0x00000000) +#define ETH_DMAArbitration_RoundRobin_RxTx_2_1 ((uint32_t)0x00004000) +#define ETH_DMAArbitration_RoundRobin_RxTx_3_1 ((uint32_t)0x00008000) +#define ETH_DMAArbitration_RoundRobin_RxTx_4_1 ((uint32_t)0x0000C000) +#define ETH_DMAArbitration_RxPriorTx ((uint32_t)0x00000002) +#define IS_ETH_DMA_ARBITRATION_ROUNDROBIN_RXTX(RATIO) (((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_1_1) || \ + ((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_2_1) || \ + ((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_3_1) || \ + ((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_4_1) || \ + ((RATIO) == ETH_DMAArbitration_RxPriorTx)) +/** + * @} + */ + +/** @defgroup ETH_DMA_Flags + * @{ + */ +#define ETH_DMA_FLAG_TST ((uint32_t)0x20000000) /*!< Time-stamp trigger interrupt (on DMA) */ +#define ETH_DMA_FLAG_PMT ((uint32_t)0x10000000) /*!< PMT interrupt (on DMA) */ +#define ETH_DMA_FLAG_MMC ((uint32_t)0x08000000) /*!< MMC interrupt (on DMA) */ +#define ETH_DMA_FLAG_DataTransferError ((uint32_t)0x00800000) /*!< Error bits 0-Rx DMA, 1-Tx DMA */ +#define ETH_DMA_FLAG_ReadWriteError ((uint32_t)0x01000000) /*!< Error bits 0-write trnsf, 1-read transfr */ +#define ETH_DMA_FLAG_AccessError ((uint32_t)0x02000000) /*!< Error bits 0-data buffer, 1-desc. access */ +#define ETH_DMA_FLAG_NIS ((uint32_t)0x00010000) /*!< Normal interrupt summary flag */ +#define ETH_DMA_FLAG_AIS ((uint32_t)0x00008000) /*!< Abnormal interrupt summary flag */ +#define ETH_DMA_FLAG_ER ((uint32_t)0x00004000) /*!< Early receive flag */ +#define ETH_DMA_FLAG_FBE ((uint32_t)0x00002000) /*!< Fatal bus error flag */ +#define ETH_DMA_FLAG_ET ((uint32_t)0x00000400) /*!< Early transmit flag */ +#define ETH_DMA_FLAG_RWT ((uint32_t)0x00000200) /*!< Receive watchdog timeout flag */ +#define ETH_DMA_FLAG_RPS ((uint32_t)0x00000100) /*!< Receive process stopped flag */ +#define ETH_DMA_FLAG_RBU ((uint32_t)0x00000080) /*!< Receive buffer unavailable flag */ +#define ETH_DMA_FLAG_R ((uint32_t)0x00000040) /*!< Receive flag */ +#define ETH_DMA_FLAG_TU ((uint32_t)0x00000020) /*!< Underflow flag */ +#define ETH_DMA_FLAG_RO ((uint32_t)0x00000010) /*!< Overflow flag */ +#define ETH_DMA_FLAG_TJT ((uint32_t)0x00000008) /*!< Transmit jabber timeout flag */ +#define ETH_DMA_FLAG_TBU ((uint32_t)0x00000004) /*!< Transmit buffer unavailable flag */ +#define ETH_DMA_FLAG_TPS ((uint32_t)0x00000002) /*!< Transmit process stopped flag */ +#define ETH_DMA_FLAG_T ((uint32_t)0x00000001) /*!< Transmit flag */ + +#define IS_ETH_DMA_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFE1800) == 0x00) && ((FLAG) != 0x00)) +#define IS_ETH_DMA_GET_FLAG(FLAG) (((FLAG) == ETH_DMA_FLAG_TST) || ((FLAG) == ETH_DMA_FLAG_PMT) || \ + ((FLAG) == ETH_DMA_FLAG_MMC) || ((FLAG) == ETH_DMA_FLAG_DataTransferError) || \ + ((FLAG) == ETH_DMA_FLAG_ReadWriteError) || ((FLAG) == ETH_DMA_FLAG_AccessError) || \ + ((FLAG) == ETH_DMA_FLAG_NIS) || ((FLAG) == ETH_DMA_FLAG_AIS) || \ + ((FLAG) == ETH_DMA_FLAG_ER) || ((FLAG) == ETH_DMA_FLAG_FBE) || \ + ((FLAG) == ETH_DMA_FLAG_ET) || ((FLAG) == ETH_DMA_FLAG_RWT) || \ + ((FLAG) == ETH_DMA_FLAG_RPS) || ((FLAG) == ETH_DMA_FLAG_RBU) || \ + ((FLAG) == ETH_DMA_FLAG_R) || ((FLAG) == ETH_DMA_FLAG_TU) || \ + ((FLAG) == ETH_DMA_FLAG_RO) || ((FLAG) == ETH_DMA_FLAG_TJT) || \ + ((FLAG) == ETH_DMA_FLAG_TBU) || ((FLAG) == ETH_DMA_FLAG_TPS) || \ + ((FLAG) == ETH_DMA_FLAG_T)) +/** + * @} + */ + +/** @defgroup ETH_DMA_Interrupts + * @{ + */ +#define ETH_DMA_IT_TST ((uint32_t)0x20000000) /*!< Time-stamp trigger interrupt (on DMA) */ +#define ETH_DMA_IT_PMT ((uint32_t)0x10000000) /*!< PMT interrupt (on DMA) */ +#define ETH_DMA_IT_MMC ((uint32_t)0x08000000) /*!< MMC interrupt (on DMA) */ +#define ETH_DMA_IT_NIS ((uint32_t)0x00010000) /*!< Normal interrupt summary */ +#define ETH_DMA_IT_AIS ((uint32_t)0x00008000) /*!< Abnormal interrupt summary */ +#define ETH_DMA_IT_ER ((uint32_t)0x00004000) /*!< Early receive interrupt */ +#define ETH_DMA_IT_FBE ((uint32_t)0x00002000) /*!< Fatal bus error interrupt */ +#define ETH_DMA_IT_ET ((uint32_t)0x00000400) /*!< Early transmit interrupt */ +#define ETH_DMA_IT_RWT ((uint32_t)0x00000200) /*!< Receive watchdog timeout interrupt */ +#define ETH_DMA_IT_RPS ((uint32_t)0x00000100) /*!< Receive process stopped interrupt */ +#define ETH_DMA_IT_RBU ((uint32_t)0x00000080) /*!< Receive buffer unavailable interrupt */ +#define ETH_DMA_IT_R ((uint32_t)0x00000040) /*!< Receive interrupt */ +#define ETH_DMA_IT_TU ((uint32_t)0x00000020) /*!< Underflow interrupt */ +#define ETH_DMA_IT_RO ((uint32_t)0x00000010) /*!< Overflow interrupt */ +#define ETH_DMA_IT_TJT ((uint32_t)0x00000008) /*!< Transmit jabber timeout interrupt */ +#define ETH_DMA_IT_TBU ((uint32_t)0x00000004) /*!< Transmit buffer unavailable interrupt */ +#define ETH_DMA_IT_TPS ((uint32_t)0x00000002) /*!< Transmit process stopped interrupt */ +#define ETH_DMA_IT_T ((uint32_t)0x00000001) /*!< Transmit interrupt */ + +#define IS_ETH_DMA_IT(IT) ((((IT) & (uint32_t)0xFFFE1800) == 0x00) && ((IT) != 0x00)) +#define IS_ETH_DMA_GET_IT(IT) (((IT) == ETH_DMA_IT_TST) || ((IT) == ETH_DMA_IT_PMT) || \ + ((IT) == ETH_DMA_IT_MMC) || ((IT) == ETH_DMA_IT_NIS) || \ + ((IT) == ETH_DMA_IT_AIS) || ((IT) == ETH_DMA_IT_ER) || \ + ((IT) == ETH_DMA_IT_FBE) || ((IT) == ETH_DMA_IT_ET) || \ + ((IT) == ETH_DMA_IT_RWT) || ((IT) == ETH_DMA_IT_RPS) || \ + ((IT) == ETH_DMA_IT_RBU) || ((IT) == ETH_DMA_IT_R) || \ + ((IT) == ETH_DMA_IT_TU) || ((IT) == ETH_DMA_IT_RO) || \ + ((IT) == ETH_DMA_IT_TJT) || ((IT) == ETH_DMA_IT_TBU) || \ + ((IT) == ETH_DMA_IT_TPS) || ((IT) == ETH_DMA_IT_T)) + +/** + * @} + */ + +/** @defgroup ETH_DMA_transmit_process_state_ + * @{ + */ +#define ETH_DMA_TransmitProcess_Stopped ((uint32_t)0x00000000) /*!< Stopped - Reset or Stop Tx Command issued */ +#define ETH_DMA_TransmitProcess_Fetching ((uint32_t)0x00100000) /*!< Running - fetching the Tx descriptor */ +#define ETH_DMA_TransmitProcess_Waiting ((uint32_t)0x00200000) /*!< Running - waiting for status */ +#define ETH_DMA_TransmitProcess_Reading ((uint32_t)0x00300000) /*!< Running - reading the data from host memory */ +#define ETH_DMA_TransmitProcess_Suspended ((uint32_t)0x00600000) /*!< Suspended - Tx Desciptor unavailabe */ +#define ETH_DMA_TransmitProcess_Closing ((uint32_t)0x00700000) /*!< Running - closing Rx descriptor */ + +/** + * @} + */ + + +/** @defgroup ETH_DMA_receive_process_state_ + * @{ + */ +#define ETH_DMA_ReceiveProcess_Stopped ((uint32_t)0x00000000) /*!< Stopped - Reset or Stop Rx Command issued */ +#define ETH_DMA_ReceiveProcess_Fetching ((uint32_t)0x00020000) /*!< Running - fetching the Rx descriptor */ +#define ETH_DMA_ReceiveProcess_Waiting ((uint32_t)0x00060000) /*!< Running - waiting for packet */ +#define ETH_DMA_ReceiveProcess_Suspended ((uint32_t)0x00080000) /*!< Suspended - Rx Desciptor unavailable */ +#define ETH_DMA_ReceiveProcess_Closing ((uint32_t)0x000A0000) /*!< Running - closing descriptor */ +#define ETH_DMA_ReceiveProcess_Queuing ((uint32_t)0x000E0000) /*!< Running - queuing the recieve frame into host memory */ + +/** + * @} + */ + +/** @defgroup ETH_DMA_overflow_ + * @{ + */ +#define ETH_DMA_Overflow_RxFIFOCounter ((uint32_t)0x10000000) /*!< Overflow bit for FIFO overflow counter */ +#define ETH_DMA_Overflow_MissedFrameCounter ((uint32_t)0x00010000) /*!< Overflow bit for missed frame counter */ +#define IS_ETH_DMA_GET_OVERFLOW(OVERFLOW) (((OVERFLOW) == ETH_DMA_Overflow_RxFIFOCounter) || \ + ((OVERFLOW) == ETH_DMA_Overflow_MissedFrameCounter)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet PMT defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_PMT_Flags + * @{ + */ +#define ETH_PMT_FLAG_WUFFRPR ((uint32_t)0x80000000) /*!< Wake-Up Frame Filter Register Poniter Reset */ +#define ETH_PMT_FLAG_WUFR ((uint32_t)0x00000040) /*!< Wake-Up Frame Received */ +#define ETH_PMT_FLAG_MPR ((uint32_t)0x00000020) /*!< Magic Packet Received */ +#define IS_ETH_PMT_GET_FLAG(FLAG) (((FLAG) == ETH_PMT_FLAG_WUFR) || \ + ((FLAG) == ETH_PMT_FLAG_MPR)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet MMC defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_MMC_Tx_Interrupts + * @{ + */ +#define ETH_MMC_IT_TGF ((uint32_t)0x00200000) /*!< When Tx good frame counter reaches half the maximum value */ +#define ETH_MMC_IT_TGFMSC ((uint32_t)0x00008000) /*!< When Tx good multi col counter reaches half the maximum value */ +#define ETH_MMC_IT_TGFSC ((uint32_t)0x00004000) /*!< When Tx good single col counter reaches half the maximum value */ + +/** + * @} + */ + +/** @defgroup ETH_MMC_Rx_Interrupts + * @{ + */ +#define ETH_MMC_IT_RGUF ((uint32_t)0x10020000) /*!< When Rx good unicast frames counter reaches half the maximum value */ +#define ETH_MMC_IT_RFAE ((uint32_t)0x10000040) /*!< When Rx alignment error counter reaches half the maximum value */ +#define ETH_MMC_IT_RFCE ((uint32_t)0x10000020) /*!< When Rx crc error counter reaches half the maximum value */ +#define IS_ETH_MMC_IT(IT) (((((IT) & (uint32_t)0xFFDF3FFF) == 0x00) || (((IT) & (uint32_t)0xEFFDFF9F) == 0x00)) && \ + ((IT) != 0x00)) +#define IS_ETH_MMC_GET_IT(IT) (((IT) == ETH_MMC_IT_TGF) || ((IT) == ETH_MMC_IT_TGFMSC) || \ + ((IT) == ETH_MMC_IT_TGFSC) || ((IT) == ETH_MMC_IT_RGUF) || \ + ((IT) == ETH_MMC_IT_RFAE) || ((IT) == ETH_MMC_IT_RFCE)) +/** + * @} + */ + +/** @defgroup ETH_MMC_Registers + * @{ + */ +#define ETH_MMCCR ((uint32_t)0x00000100) /*!< MMC CR register */ +#define ETH_MMCRIR ((uint32_t)0x00000104) /*!< MMC RIR register */ +#define ETH_MMCTIR ((uint32_t)0x00000108) /*!< MMC TIR register */ +#define ETH_MMCRIMR ((uint32_t)0x0000010C) /*!< MMC RIMR register */ +#define ETH_MMCTIMR ((uint32_t)0x00000110) /*!< MMC TIMR register */ +#define ETH_MMCTGFSCCR ((uint32_t)0x0000014C) /*!< MMC TGFSCCR register */ +#define ETH_MMCTGFMSCCR ((uint32_t)0x00000150) /*!< MMC TGFMSCCR register */ +#define ETH_MMCTGFCR ((uint32_t)0x00000168) /*!< MMC TGFCR register */ +#define ETH_MMCRFCECR ((uint32_t)0x00000194) /*!< MMC RFCECR register */ +#define ETH_MMCRFAECR ((uint32_t)0x00000198) /*!< MMC RFAECR register */ +#define ETH_MMCRGUFCR ((uint32_t)0x000001C4) /*!< MMC RGUFCR register */ + +/** + * @brief ETH MMC registers + */ +#define IS_ETH_MMC_REGISTER(REG) (((REG) == ETH_MMCCR) || ((REG) == ETH_MMCRIR) || \ + ((REG) == ETH_MMCTIR) || ((REG) == ETH_MMCRIMR) || \ + ((REG) == ETH_MMCTIMR) || ((REG) == ETH_MMCTGFSCCR) || \ + ((REG) == ETH_MMCTGFMSCCR) || ((REG) == ETH_MMCTGFCR) || \ + ((REG) == ETH_MMCRFCECR) || ((REG) == ETH_MMCRFAECR) || \ + ((REG) == ETH_MMCRGUFCR)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet PTP defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_PTP_time_update_method + * @{ + */ +#define ETH_PTP_FineUpdate ((uint32_t)0x00000001) /*!< Fine Update method */ +#define ETH_PTP_CoarseUpdate ((uint32_t)0x00000000) /*!< Coarse Update method */ +#define IS_ETH_PTP_UPDATE(UPDATE) (((UPDATE) == ETH_PTP_FineUpdate) || \ + ((UPDATE) == ETH_PTP_CoarseUpdate)) + +/** + * @} + */ + + +/** @defgroup ETH_PTP_Flags + * @{ + */ +#define ETH_PTP_FLAG_TSARU ((uint32_t)0x00000020) /*!< Addend Register Update */ +#define ETH_PTP_FLAG_TSITE ((uint32_t)0x00000010) /*!< Time Stamp Interrupt Trigger */ +#define ETH_PTP_FLAG_TSSTU ((uint32_t)0x00000008) /*!< Time Stamp Update */ +#define ETH_PTP_FLAG_TSSTI ((uint32_t)0x00000004) /*!< Time Stamp Initialize */ +#define IS_ETH_PTP_GET_FLAG(FLAG) (((FLAG) == ETH_PTP_FLAG_TSARU) || \ + ((FLAG) == ETH_PTP_FLAG_TSITE) || \ + ((FLAG) == ETH_PTP_FLAG_TSSTU) || \ + ((FLAG) == ETH_PTP_FLAG_TSSTI)) +/** + * @brief ETH PTP subsecond increment + */ +#define IS_ETH_PTP_SUBSECOND_INCREMENT(SUBSECOND) ((SUBSECOND) <= 0xFF) + +/** + * @} + */ + + +/** @defgroup ETH_PTP_time_sign + * @{ + */ +#define ETH_PTP_PositiveTime ((uint32_t)0x00000000) /*!< Positive time value */ +#define ETH_PTP_NegativeTime ((uint32_t)0x80000000) /*!< Negative time value */ +#define IS_ETH_PTP_TIME_SIGN(SIGN) (((SIGN) == ETH_PTP_PositiveTime) || \ + ((SIGN) == ETH_PTP_NegativeTime)) + +/** + * @brief ETH PTP time stamp low update + */ +#define IS_ETH_PTP_TIME_STAMP_UPDATE_SUBSECOND(SUBSECOND) ((SUBSECOND) <= 0x7FFFFFFF) + +/** + * @brief ETH PTP registers + */ +#define ETH_PTPTSCR ((uint32_t)0x00000700) /*!< PTP TSCR register */ +#define ETH_PTPSSIR ((uint32_t)0x00000704) /*!< PTP SSIR register */ +#define ETH_PTPTSHR ((uint32_t)0x00000708) /*!< PTP TSHR register */ +#define ETH_PTPTSLR ((uint32_t)0x0000070C) /*!< PTP TSLR register */ +#define ETH_PTPTSHUR ((uint32_t)0x00000710) /*!< PTP TSHUR register */ +#define ETH_PTPTSLUR ((uint32_t)0x00000714) /*!< PTP TSLUR register */ +#define ETH_PTPTSAR ((uint32_t)0x00000718) /*!< PTP TSAR register */ +#define ETH_PTPTTHR ((uint32_t)0x0000071C) /*!< PTP TTHR register */ +#define ETH_PTPTTLR ((uint32_t)0x00000720) /* PTP TTLR register */ +#define IS_ETH_PTP_REGISTER(REG) (((REG) == ETH_PTPTSCR) || ((REG) == ETH_PTPSSIR) || \ + ((REG) == ETH_PTPTSHR) || ((REG) == ETH_PTPTSLR) || \ + ((REG) == ETH_PTPTSHUR) || ((REG) == ETH_PTPTSLUR) || \ + ((REG) == ETH_PTPTSAR) || ((REG) == ETH_PTPTTHR) || \ + ((REG) == ETH_PTPTTLR)) + +/** + * @} + */ + + +/** + * @} + */ + +/** @defgroup ETH_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup ETH_Exported_Functions + * @{ + */ +void ETH_DeInit(void); +uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, u16 PHYAddress); +void ETH_StructInit(ETH_InitTypeDef* ETH_InitStruct); +void ETH_SoftwareReset(void); +FlagStatus ETH_GetSoftwareResetStatus(void); +void ETH_Start(void); +uint32_t ETH_HandleTxPkt(u8 *ppkt, u16 FrameLength); +uint32_t ETH_HandleRxPkt(u8 *ppkt); +uint32_t ETH_GetRxPktSize(void); +void ETH_DropRxPkt(void); + +/** + * @brief PHY + */ +u16 ETH_ReadPHYRegister(u16 PHYAddress, u16 PHYReg); +uint32_t ETH_WritePHYRegister(u16 PHYAddress, u16 PHYReg, u16 PHYValue); +uint32_t ETH_PHYLoopBackCmd(u16 PHYAddress, FunctionalState NewState); + +/** + * @brief MAC + */ +void ETH_MACTransmissionCmd(FunctionalState NewState); +void ETH_MACReceptionCmd(FunctionalState NewState); +FlagStatus ETH_GetFlowControlBusyStatus(void); +void ETH_InitiatePauseControlFrame(void); +void ETH_BackPressureActivationCmd(FunctionalState NewState); +FlagStatus ETH_GetMACFlagStatus(uint32_t ETH_MAC_FLAG); +ITStatus ETH_GetMACITStatus(uint32_t ETH_MAC_IT); +void ETH_MACITConfig(uint32_t ETH_MAC_IT, FunctionalState NewState); +void ETH_MACAddressConfig(uint32_t MacAddr, u8 *Addr); +void ETH_GetMACAddress(uint32_t MacAddr, u8 *Addr); +void ETH_MACAddressPerfectFilterCmd(uint32_t MacAddr, FunctionalState NewState); +void ETH_MACAddressFilterConfig(uint32_t MacAddr, uint32_t Filter); +void ETH_MACAddressMaskBytesFilterConfig(uint32_t MacAddr, uint32_t MaskByte); + +/** + * @brief DMA Tx/Rx descriptors + */ +void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, u8 *TxBuff, uint32_t TxBuffCount); +void ETH_DMATxDescRingInit(ETH_DMADESCTypeDef *DMATxDescTab, u8 *TxBuff1, u8 *TxBuff2, uint32_t TxBuffCount); +FlagStatus ETH_GetDMATxDescFlagStatus(ETH_DMADESCTypeDef *DMATxDesc, uint32_t ETH_DMATxDescFlag); +uint32_t ETH_GetDMATxDescCollisionCount(ETH_DMADESCTypeDef *DMATxDesc); +void ETH_SetDMATxDescOwnBit(ETH_DMADESCTypeDef *DMATxDesc); +void ETH_DMATxDescTransmitITConfig(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescFrameSegmentConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_FrameSegment); +void ETH_DMATxDescChecksumInsertionConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_Checksum); +void ETH_DMATxDescCRCCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescShortFramePaddingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescTimeStampCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescBufferSizeConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t BufferSize1, uint32_t BufferSize2); +void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, u8 *RxBuff, uint32_t RxBuffCount); +void ETH_DMARxDescRingInit(ETH_DMADESCTypeDef *DMARxDescTab, u8 *RxBuff1, u8 *RxBuff2, uint32_t RxBuffCount); +FlagStatus ETH_GetDMARxDescFlagStatus(ETH_DMADESCTypeDef *DMARxDesc, uint32_t ETH_DMARxDescFlag); +void ETH_SetDMARxDescOwnBit(ETH_DMADESCTypeDef *DMARxDesc); +uint32_t ETH_GetDMARxDescFrameLength(ETH_DMADESCTypeDef *DMARxDesc); +void ETH_DMARxDescReceiveITConfig(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState); +void ETH_DMARxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState); +void ETH_DMARxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState); +uint32_t ETH_GetDMARxDescBufferSize(ETH_DMADESCTypeDef *DMARxDesc, uint32_t DMARxDesc_Buffer); + +/** + * @brief DMA + */ +FlagStatus ETH_GetDMAFlagStatus(uint32_t ETH_DMA_FLAG); +void ETH_DMAClearFlag(uint32_t ETH_DMA_FLAG); +ITStatus ETH_GetDMAITStatus(uint32_t ETH_DMA_IT); +void ETH_DMAClearITPendingBit(uint32_t ETH_DMA_IT); +uint32_t ETH_GetTransmitProcessState(void); +uint32_t ETH_GetReceiveProcessState(void); +void ETH_FlushTransmitFIFO(void); +FlagStatus ETH_GetFlushTransmitFIFOStatus(void); +void ETH_DMATransmissionCmd(FunctionalState NewState); +void ETH_DMAReceptionCmd(FunctionalState NewState); +void ETH_DMAITConfig(uint32_t ETH_DMA_IT, FunctionalState NewState); +FlagStatus ETH_GetDMAOverflowStatus(uint32_t ETH_DMA_Overflow); +uint32_t ETH_GetRxOverflowMissedFrameCounter(void); +uint32_t ETH_GetBufferUnavailableMissedFrameCounter(void); +uint32_t ETH_GetCurrentTxDescStartAddress(void); +uint32_t ETH_GetCurrentRxDescStartAddress(void); +uint32_t ETH_GetCurrentTxBufferAddress(void); +uint32_t ETH_GetCurrentRxBufferAddress(void); +void ETH_ResumeDMATransmission(void); +void ETH_ResumeDMAReception(void); + +/** + * @brief PMT + */ +void ETH_ResetWakeUpFrameFilterRegisterPointer(void); +void ETH_SetWakeUpFrameFilterRegister(uint32_t *Buffer); +void ETH_GlobalUnicastWakeUpCmd(FunctionalState NewState); +FlagStatus ETH_GetPMTFlagStatus(uint32_t ETH_PMT_FLAG); +void ETH_WakeUpFrameDetectionCmd(FunctionalState NewState); +void ETH_MagicPacketDetectionCmd(FunctionalState NewState); +void ETH_PowerDownCmd(FunctionalState NewState); + +/** + * @brief MMC + */ +void ETH_MMCCounterFreezeCmd(FunctionalState NewState); +void ETH_MMCResetOnReadCmd(FunctionalState NewState); +void ETH_MMCCounterRolloverCmd(FunctionalState NewState); +void ETH_MMCCountersReset(void); +void ETH_MMCITConfig(uint32_t ETH_MMC_IT, FunctionalState NewState); +ITStatus ETH_GetMMCITStatus(uint32_t ETH_MMC_IT); +uint32_t ETH_GetMMCRegister(uint32_t ETH_MMCReg); + +/** + * @brief PTP + */ +uint32_t ETH_HandlePTPTxPkt(u8 *ppkt, u16 FrameLength, uint32_t *PTPTxTab); +uint32_t ETH_HandlePTPRxPkt(u8 *ppkt, uint32_t *PTPRxTab); +void ETH_DMAPTPTxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, ETH_DMADESCTypeDef *DMAPTPTxDescTab, u8* TxBuff, uint32_t TxBuffCount); +void ETH_DMAPTPRxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, ETH_DMADESCTypeDef *DMAPTPRxDescTab, u8 *RxBuff, uint32_t RxBuffCount); +void ETH_EnablePTPTimeStampAddend(void); +void ETH_EnablePTPTimeStampInterruptTrigger(void); +void ETH_EnablePTPTimeStampUpdate(void); +void ETH_InitializePTPTimeStamp(void); +void ETH_PTPUpdateMethodConfig(uint32_t UpdateMethod); +void ETH_PTPTimeStampCmd(FunctionalState NewState); +FlagStatus ETH_GetPTPFlagStatus(uint32_t ETH_PTP_FLAG); +void ETH_SetPTPSubSecondIncrement(uint32_t SubSecondValue); +void ETH_SetPTPTimeStampUpdate(uint32_t Sign, uint32_t SecondValue, uint32_t SubSecondValue); +void ETH_SetPTPTimeStampAddend(uint32_t Value); +void ETH_SetPTPTargetTime(uint32_t HighValue, uint32_t LowValue); +uint32_t ETH_GetPTPRegister(uint32_t ETH_PTPReg); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32_ETH_H */ +/** + * @} + */ + + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/ethernetlib/src/stm32_eth.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/ethernetlib/src/stm32_eth.c new file mode 100644 index 00000000..119b4dbf --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/ethernetlib/src/stm32_eth.c @@ -0,0 +1,3056 @@ +/** + ****************************************************************************** + * @file stm32_eth.c + * @author MCD Application Team + * @version V1.0.0 + * @date 06/19/2009 + * @brief This file provides all the ETH firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32_eth.h" +#include "stm32f4xx_rcc.h" + +/** @addtogroup STM32_ETH_Driver + * @brief ETH driver modules + * @{ + */ + +/** @defgroup ETH_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup ETH_Private_Defines + * @{ + */ +/* Global pointers on Tx and Rx descriptor used to track transmit and receive descriptors */ +ETH_DMADESCTypeDef *DMATxDescToSet; +ETH_DMADESCTypeDef *DMARxDescToGet; +ETH_DMADESCTypeDef *DMAPTPTxDescToSet; +ETH_DMADESCTypeDef *DMAPTPRxDescToGet; + +/* ETHERNET MAC address offsets */ +#define ETH_MAC_AddrHighBase (ETH_MAC_BASE + 0x40) /* ETHERNET MAC address high offset */ +#define ETH_MAC_AddrLowBase (ETH_MAC_BASE + 0x44) /* ETHERNET MAC address low offset */ +/* ETHERNET MACMIIAR register Mask */ +#define MACMIIAR_CR_Mask ((uint32_t)0xFFFFFFE3) +/* ETHERNET MACCR register Mask */ +#define MACCR_CLEAR_Mask ((uint32_t)0xFF20810F) +/* ETHERNET MACFCR register Mask */ +#define MACFCR_CLEAR_Mask ((uint32_t)0x0000FF41) +/* ETHERNET DMAOMR register Mask */ +#define DMAOMR_CLEAR_Mask ((uint32_t)0xF8DE3F23) +/* ETHERNET Remote Wake-up frame register length */ +#define ETH_WakeupRegisterLength 8 +/* ETHERNET Missed frames counter Shift */ +#define ETH_DMA_RxOverflowMissedFramesCounterShift 17 +/* ETHERNET DMA Tx descriptors Collision Count Shift */ +#define ETH_DMATxDesc_CollisionCountShift 3 +/* ETHERNET DMA Tx descriptors Buffer2 Size Shift */ +#define ETH_DMATxDesc_BufferSize2Shift 16 +/* ETHERNET DMA Rx descriptors Frame Length Shift */ +#define ETH_DMARxDesc_FrameLengthShift 16 +/* ETHERNET DMA Rx descriptors Buffer2 Size Shift */ +#define ETH_DMARxDesc_Buffer2SizeShift 16 +/* ETHERNET errors */ +#define ETH_ERROR ((uint32_t)0) +#define ETH_SUCCESS ((uint32_t)1) +/** + * @} + */ + +/** @defgroup ETH_Private_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup ETH_Private_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup ETH_Private_FunctionPrototypes + * @{ + */ +/** + * @} + */ + +/** @defgroup ETH_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the ETHERNET peripheral registers to their + * default reset values. + * @param None + * @retval : None + */ +void ETH_DeInit(void) +{ + RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, ENABLE); + RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, DISABLE); +} + +/** + * @brief Initializes the ETHERNET peripheral according to the specified + * parameters in the ETH_InitStruct . + * @param ETH_InitStruct: pointer to a ETH_InitTypeDef structure + * that contains the configuration information for the + * specified ETHERNET peripheral. + * @param PHYAddress: external PHY address + * @retval : ETH_ERROR: Ethernet initialization failed + * ETH_SUCCESS: Ethernet successfully initialized + */ +uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, uint16_t PHYAddress) +{ + uint32_t RegValue = 0, tmpreg = 0; + __IO uint32_t i = 0; + RCC_ClocksTypeDef rcc_clocks; + uint32_t hclk = 120000000; + __IO uint32_t timeout = 0; + /* Check the parameters */ + /* MAC --------------------------*/ + assert_param(IS_ETH_AUTONEGOTIATION(ETH_InitStruct->ETH_AutoNegotiation)); + assert_param(IS_ETH_WATCHDOG(ETH_InitStruct->ETH_Watchdog)); + assert_param(IS_ETH_JABBER(ETH_InitStruct->ETH_Jabber)); + assert_param(IS_ETH_INTER_FRAME_GAP(ETH_InitStruct->ETH_InterFrameGap)); + assert_param(IS_ETH_CARRIER_SENSE(ETH_InitStruct->ETH_CarrierSense)); + assert_param(IS_ETH_SPEED(ETH_InitStruct->ETH_Speed)); + assert_param(IS_ETH_RECEIVE_OWN(ETH_InitStruct->ETH_ReceiveOwn)); + assert_param(IS_ETH_LOOPBACK_MODE(ETH_InitStruct->ETH_LoopbackMode)); + assert_param(IS_ETH_DUPLEX_MODE(ETH_InitStruct->ETH_Mode)); + assert_param(IS_ETH_CHECKSUM_OFFLOAD(ETH_InitStruct->ETH_ChecksumOffload)); + assert_param(IS_ETH_RETRY_TRANSMISSION(ETH_InitStruct->ETH_RetryTransmission)); + assert_param(IS_ETH_AUTOMATIC_PADCRC_STRIP(ETH_InitStruct->ETH_AutomaticPadCRCStrip)); + assert_param(IS_ETH_BACKOFF_LIMIT(ETH_InitStruct->ETH_BackOffLimit)); + assert_param(IS_ETH_DEFERRAL_CHECK(ETH_InitStruct->ETH_DeferralCheck)); + assert_param(IS_ETH_RECEIVE_ALL(ETH_InitStruct->ETH_ReceiveAll)); + assert_param(IS_ETH_SOURCE_ADDR_FILTER(ETH_InitStruct->ETH_SourceAddrFilter)); + assert_param(IS_ETH_CONTROL_FRAMES(ETH_InitStruct->ETH_PassControlFrames)); + assert_param(IS_ETH_BROADCAST_FRAMES_RECEPTION(ETH_InitStruct->ETH_BroadcastFramesReception)); + assert_param(IS_ETH_DESTINATION_ADDR_FILTER(ETH_InitStruct->ETH_DestinationAddrFilter)); + assert_param(IS_ETH_PROMISCUOUS_MODE(ETH_InitStruct->ETH_PromiscuousMode)); + assert_param(IS_ETH_MULTICAST_FRAMES_FILTER(ETH_InitStruct->ETH_MulticastFramesFilter)); + assert_param(IS_ETH_UNICAST_FRAMES_FILTER(ETH_InitStruct->ETH_UnicastFramesFilter)); + assert_param(IS_ETH_PAUSE_TIME(ETH_InitStruct->ETH_PauseTime)); + assert_param(IS_ETH_ZEROQUANTA_PAUSE(ETH_InitStruct->ETH_ZeroQuantaPause)); + assert_param(IS_ETH_PAUSE_LOW_THRESHOLD(ETH_InitStruct->ETH_PauseLowThreshold)); + assert_param(IS_ETH_UNICAST_PAUSE_FRAME_DETECT(ETH_InitStruct->ETH_UnicastPauseFrameDetect)); + assert_param(IS_ETH_RECEIVE_FLOWCONTROL(ETH_InitStruct->ETH_ReceiveFlowControl)); + assert_param(IS_ETH_TRANSMIT_FLOWCONTROL(ETH_InitStruct->ETH_TransmitFlowControl)); + assert_param(IS_ETH_VLAN_TAG_COMPARISON(ETH_InitStruct->ETH_VLANTagComparison)); + assert_param(IS_ETH_VLAN_TAG_IDENTIFIER(ETH_InitStruct->ETH_VLANTagIdentifier)); + /* DMA --------------------------*/ + assert_param(IS_ETH_DROP_TCPIP_CHECKSUM_FRAME(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame)); + assert_param(IS_ETH_RECEIVE_STORE_FORWARD(ETH_InitStruct->ETH_ReceiveStoreForward)); + assert_param(IS_ETH_FLUSH_RECEIVE_FRAME(ETH_InitStruct->ETH_FlushReceivedFrame)); + assert_param(IS_ETH_TRANSMIT_STORE_FORWARD(ETH_InitStruct->ETH_TransmitStoreForward)); + assert_param(IS_ETH_TRANSMIT_THRESHOLD_CONTROL(ETH_InitStruct->ETH_TransmitThresholdControl)); + assert_param(IS_ETH_FORWARD_ERROR_FRAMES(ETH_InitStruct->ETH_ForwardErrorFrames)); + assert_param(IS_ETH_FORWARD_UNDERSIZED_GOOD_FRAMES(ETH_InitStruct->ETH_ForwardUndersizedGoodFrames)); + assert_param(IS_ETH_RECEIVE_THRESHOLD_CONTROL(ETH_InitStruct->ETH_ReceiveThresholdControl)); + assert_param(IS_ETH_SECOND_FRAME_OPERATE(ETH_InitStruct->ETH_SecondFrameOperate)); + assert_param(IS_ETH_ADDRESS_ALIGNED_BEATS(ETH_InitStruct->ETH_AddressAlignedBeats)); + assert_param(IS_ETH_FIXED_BURST(ETH_InitStruct->ETH_FixedBurst)); + assert_param(IS_ETH_RXDMA_BURST_LENGTH(ETH_InitStruct->ETH_RxDMABurstLength)); + assert_param(IS_ETH_TXDMA_BURST_LENGTH(ETH_InitStruct->ETH_TxDMABurstLength)); + assert_param(IS_ETH_DMA_DESC_SKIP_LENGTH(ETH_InitStruct->ETH_DescriptorSkipLength)); + assert_param(IS_ETH_DMA_ARBITRATION_ROUNDROBIN_RXTX(ETH_InitStruct->ETH_DMAArbitration)); + /*-------------------------------- MAC Config ------------------------------*/ + /*---------------------- ETHERNET MACMIIAR Configuration -------------------*/ + /* Get the ETHERNET MACMIIAR value */ + tmpreg = ETH->MACMIIAR; + /* Clear CSR Clock Range CR[2:0] bits */ + tmpreg &= MACMIIAR_CR_Mask; + /* Get hclk frequency value */ + RCC_GetClocksFreq(&rcc_clocks); + hclk = rcc_clocks.HCLK_Frequency; + /* Set CR bits depending on hclk value */ + if((hclk >= 20000000)&&(hclk < 35000000)) + { + /* CSR Clock Range between 20-35 MHz */ + tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div16; + } + else if((hclk >= 35000000)&&(hclk < 60000000)) + { + /* CSR Clock Range between 35-60 MHz */ + tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div26; + } + else if((hclk >= 60000000)&&(hclk <= 100000000)) + { + /* CSR Clock Range between 60-100 MHz */ + tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div42; + } + else /*if((hclk >= 100000000)&&(hclk <= 120000000)) */ + { + /* CSR Clock Range between 100-120 MHz */ + tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div62; + } + /* Write to ETHERNET MAC MIIAR: Configure the ETHERNET CSR Clock Range */ + ETH->MACMIIAR = (uint32_t)tmpreg; + /*-------------------- PHY initialization and configuration ----------------*/ + /* Put the PHY in reset mode */ + if(!(ETH_WritePHYRegister(PHYAddress, PHY_BCR, PHY_Reset))) + { + /* Return ERROR in case of write timeout */ + return ETH_ERROR; + } + + /* Delay to assure PHY reset */ + for(i = PHY_ResetDelay; i != 0; i--) + { + } + + if(ETH_InitStruct->ETH_AutoNegotiation != ETH_AutoNegotiation_Disable) + { + /* We wait for linked satus... */ + do + { + timeout++; + } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_READ_TO) + { + return ETH_ERROR; + } + /* Reset Timeout counter */ + timeout = 0; + + /* Enable Auto-Negotiation */ + if(!(ETH_WritePHYRegister(PHYAddress, PHY_BCR, PHY_AutoNegotiation))) + { + /* Return ERROR in case of write timeout */ + return ETH_ERROR; + } + + /* Wait until the autonegotiation will be completed */ + do + { + timeout++; + } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_READ_TO) + { + return ETH_ERROR; + } + /* Reset Timeout counter */ + timeout = 0; + + /* Read the result of the autonegotiation */ + RegValue = ETH_ReadPHYRegister(PHYAddress, PHY_SR); + + /* Configure the MAC with the Duplex Mode fixed by the autonegotiation process */ + if((RegValue & PHY_Duplex_Status) != (uint32_t)RESET) + { + /* Set Ethernet duplex mode to FullDuplex following the autonegotiation */ + ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex; + + } + else + { + /* Set Ethernet duplex mode to HalfDuplex following the autonegotiation */ + ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex; + } + /* Configure the MAC with the speed fixed by the autonegotiation process */ + if(RegValue & PHY_Speed_Status) + { + /* Set Ethernet speed to 10M following the autonegotiation */ + ETH_InitStruct->ETH_Speed = ETH_Speed_10M; + } + else + { + /* Set Ethernet speed to 100M following the autonegotiation */ + ETH_InitStruct->ETH_Speed = ETH_Speed_100M; + } + } + else + { + if(!ETH_WritePHYRegister(PHYAddress, PHY_BCR, ((uint16_t)(ETH_InitStruct->ETH_Mode >> 3) | + (uint16_t)(ETH_InitStruct->ETH_Speed >> 1)))) + { + /* Return ERROR in case of write timeout */ + return ETH_ERROR; + } + /* Delay to assure PHY configuration */ + for(i = PHY_ConfigDelay; i != 0; i--) + { + } + } + /*------------------------ ETHERNET MACCR Configuration --------------------*/ + /* Get the ETHERNET MACCR value */ + tmpreg = ETH->MACCR; + /* Clear WD, PCE, PS, TE and RE bits */ + tmpreg &= MACCR_CLEAR_Mask; + /* Set the WD bit according to ETH_Watchdog value */ + /* Set the JD: bit according to ETH_Jabber value */ + /* Set the IFG bit according to ETH_InterFrameGap value */ + /* Set the DCRS bit according to ETH_CarrierSense value */ + /* Set the FES bit according to ETH_Speed value */ + /* Set the DO bit according to ETH_ReceiveOwn value */ + /* Set the LM bit according to ETH_LoopbackMode value */ + /* Set the DM bit according to ETH_Mode value */ + /* Set the IPC bit according to ETH_ChecksumOffload value */ + /* Set the DR bit according to ETH_RetryTransmission value */ + /* Set the ACS bit according to ETH_AutomaticPadCRCStrip value */ + /* Set the BL bit according to ETH_BackOffLimit value */ + /* Set the DC bit according to ETH_DeferralCheck value */ + tmpreg |= (uint32_t)(ETH_InitStruct->ETH_Watchdog | + ETH_InitStruct->ETH_Jabber | + ETH_InitStruct->ETH_InterFrameGap | + ETH_InitStruct->ETH_CarrierSense | + ETH_InitStruct->ETH_Speed | + ETH_InitStruct->ETH_ReceiveOwn | + ETH_InitStruct->ETH_LoopbackMode | + ETH_InitStruct->ETH_Mode | + ETH_InitStruct->ETH_ChecksumOffload | + ETH_InitStruct->ETH_RetryTransmission | + ETH_InitStruct->ETH_AutomaticPadCRCStrip | + ETH_InitStruct->ETH_BackOffLimit | + ETH_InitStruct->ETH_DeferralCheck); + /* Write to ETHERNET MACCR */ + ETH->MACCR = (uint32_t)tmpreg; + + /*----------------------- ETHERNET MACFFR Configuration --------------------*/ + /* Set the RA bit according to ETH_ReceiveAll value */ + /* Set the SAF and SAIF bits according to ETH_SourceAddrFilter value */ + /* Set the PCF bit according to ETH_PassControlFrames value */ + /* Set the DBF bit according to ETH_BroadcastFramesReception value */ + /* Set the DAIF bit according to ETH_DestinationAddrFilter value */ + /* Set the PR bit according to ETH_PromiscuousMode value */ + /* Set the PM, HMC and HPF bits according to ETH_MulticastFramesFilter value */ + /* Set the HUC and HPF bits according to ETH_UnicastFramesFilter value */ + /* Write to ETHERNET MACFFR */ + ETH->MACFFR = (uint32_t)(ETH_InitStruct->ETH_ReceiveAll | + ETH_InitStruct->ETH_SourceAddrFilter | + ETH_InitStruct->ETH_PassControlFrames | + ETH_InitStruct->ETH_BroadcastFramesReception | + ETH_InitStruct->ETH_DestinationAddrFilter | + ETH_InitStruct->ETH_PromiscuousMode | + ETH_InitStruct->ETH_MulticastFramesFilter | + ETH_InitStruct->ETH_UnicastFramesFilter); + /*--------------- ETHERNET MACHTHR and MACHTLR Configuration ---------------*/ + /* Write to ETHERNET MACHTHR */ + ETH->MACHTHR = (uint32_t)ETH_InitStruct->ETH_HashTableHigh; + /* Write to ETHERNET MACHTLR */ + ETH->MACHTLR = (uint32_t)ETH_InitStruct->ETH_HashTableLow; + /*----------------------- ETHERNET MACFCR Configuration --------------------*/ + /* Get the ETHERNET MACFCR value */ + tmpreg = ETH->MACFCR; + /* Clear xx bits */ + tmpreg &= MACFCR_CLEAR_Mask; + + /* Set the PT bit according to ETH_PauseTime value */ + /* Set the DZPQ bit according to ETH_ZeroQuantaPause value */ + /* Set the PLT bit according to ETH_PauseLowThreshold value */ + /* Set the UP bit according to ETH_UnicastPauseFrameDetect value */ + /* Set the RFE bit according to ETH_ReceiveFlowControl value */ + /* Set the TFE bit according to ETH_TransmitFlowControl value */ + tmpreg |= (uint32_t)((ETH_InitStruct->ETH_PauseTime << 16) | + ETH_InitStruct->ETH_ZeroQuantaPause | + ETH_InitStruct->ETH_PauseLowThreshold | + ETH_InitStruct->ETH_UnicastPauseFrameDetect | + ETH_InitStruct->ETH_ReceiveFlowControl | + ETH_InitStruct->ETH_TransmitFlowControl); + /* Write to ETHERNET MACFCR */ + ETH->MACFCR = (uint32_t)tmpreg; + /*----------------------- ETHERNET MACVLANTR Configuration -----------------*/ + /* Set the ETV bit according to ETH_VLANTagComparison value */ + /* Set the VL bit according to ETH_VLANTagIdentifier value */ + ETH->MACVLANTR = (uint32_t)(ETH_InitStruct->ETH_VLANTagComparison | + ETH_InitStruct->ETH_VLANTagIdentifier); + + /*-------------------------------- DMA Config ------------------------------*/ + /*----------------------- ETHERNET DMAOMR Configuration --------------------*/ + /* Get the ETHERNET DMAOMR value */ + tmpreg = ETH->DMAOMR; + /* Clear xx bits */ + tmpreg &= DMAOMR_CLEAR_Mask; + + /* Set the DT bit according to ETH_DropTCPIPChecksumErrorFrame value */ + /* Set the RSF bit according to ETH_ReceiveStoreForward value */ + /* Set the DFF bit according to ETH_FlushReceivedFrame value */ + /* Set the TSF bit according to ETH_TransmitStoreForward value */ + /* Set the TTC bit according to ETH_TransmitThresholdControl value */ + /* Set the FEF bit according to ETH_ForwardErrorFrames value */ + /* Set the FUF bit according to ETH_ForwardUndersizedGoodFrames value */ + /* Set the RTC bit according to ETH_ReceiveThresholdControl value */ + /* Set the OSF bit according to ETH_SecondFrameOperate value */ + tmpreg |= (uint32_t)(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame | + ETH_InitStruct->ETH_ReceiveStoreForward | + ETH_InitStruct->ETH_FlushReceivedFrame | + ETH_InitStruct->ETH_TransmitStoreForward | + ETH_InitStruct->ETH_TransmitThresholdControl | + ETH_InitStruct->ETH_ForwardErrorFrames | + ETH_InitStruct->ETH_ForwardUndersizedGoodFrames | + ETH_InitStruct->ETH_ReceiveThresholdControl | + ETH_InitStruct->ETH_SecondFrameOperate); + /* Write to ETHERNET DMAOMR */ + ETH->DMAOMR = (uint32_t)tmpreg; + + /*----------------------- ETHERNET DMABMR Configuration --------------------*/ + /* Set the AAL bit according to ETH_AddressAlignedBeats value */ + /* Set the FB bit according to ETH_FixedBurst value */ + /* Set the RPBL and 4*PBL bits according to ETH_RxDMABurstLength value */ + /* Set the PBL and 4*PBL bits according to ETH_TxDMABurstLength value */ + /* Set the DSL bit according to ETH_DesciptorSkipLength value */ + /* Set the PR and DA bits according to ETH_DMAArbitration value */ + ETH->DMABMR = (uint32_t)(ETH_InitStruct->ETH_AddressAlignedBeats | + ETH_InitStruct->ETH_FixedBurst | + ETH_InitStruct->ETH_RxDMABurstLength | /* !! if 4xPBL is selected for Tx or Rx it is applied for the other */ + ETH_InitStruct->ETH_TxDMABurstLength | + (ETH_InitStruct->ETH_DescriptorSkipLength << 2) | + ETH_InitStruct->ETH_DMAArbitration | + ETH_DMABMR_USP); /* Enable use of separate PBL for Rx and Tx */ + /* Return Ethernet configuration success */ + return ETH_SUCCESS; +} + +/** + * @brief Fills each ETH_InitStruct member with its default value. + * @param ETH_InitStruct: pointer to a ETH_InitTypeDef structure + * which will be initialized. + * @retval : None + */ +void ETH_StructInit(ETH_InitTypeDef* ETH_InitStruct) +{ + /* ETH_InitStruct members default value */ + /*------------------------ MAC -----------------------------------*/ + ETH_InitStruct->ETH_AutoNegotiation = ETH_AutoNegotiation_Disable; + ETH_InitStruct->ETH_Watchdog = ETH_Watchdog_Enable; + ETH_InitStruct->ETH_Jabber = ETH_Jabber_Enable; + ETH_InitStruct->ETH_InterFrameGap = ETH_InterFrameGap_96Bit; + ETH_InitStruct->ETH_CarrierSense = ETH_CarrierSense_Enable; + ETH_InitStruct->ETH_Speed = ETH_Speed_10M; + ETH_InitStruct->ETH_ReceiveOwn = ETH_ReceiveOwn_Enable; + ETH_InitStruct->ETH_LoopbackMode = ETH_LoopbackMode_Disable; + ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex; + ETH_InitStruct->ETH_ChecksumOffload = ETH_ChecksumOffload_Disable; + ETH_InitStruct->ETH_RetryTransmission = ETH_RetryTransmission_Enable; + ETH_InitStruct->ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable; + ETH_InitStruct->ETH_BackOffLimit = ETH_BackOffLimit_10; + ETH_InitStruct->ETH_DeferralCheck = ETH_DeferralCheck_Disable; + ETH_InitStruct->ETH_ReceiveAll = ETH_ReceiveAll_Disable; + ETH_InitStruct->ETH_SourceAddrFilter = ETH_SourceAddrFilter_Disable; + ETH_InitStruct->ETH_PassControlFrames = ETH_PassControlFrames_BlockAll; + ETH_InitStruct->ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable; + ETH_InitStruct->ETH_DestinationAddrFilter = ETH_DestinationAddrFilter_Normal; + ETH_InitStruct->ETH_PromiscuousMode = ETH_PromiscuousMode_Disable; + ETH_InitStruct->ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect; + ETH_InitStruct->ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect; + ETH_InitStruct->ETH_HashTableHigh = 0x0; + ETH_InitStruct->ETH_HashTableLow = 0x0; + ETH_InitStruct->ETH_PauseTime = 0x0; + ETH_InitStruct->ETH_ZeroQuantaPause = ETH_ZeroQuantaPause_Disable; + ETH_InitStruct->ETH_PauseLowThreshold = ETH_PauseLowThreshold_Minus4; + ETH_InitStruct->ETH_UnicastPauseFrameDetect = ETH_UnicastPauseFrameDetect_Disable; + ETH_InitStruct->ETH_ReceiveFlowControl = ETH_ReceiveFlowControl_Disable; + ETH_InitStruct->ETH_TransmitFlowControl = ETH_TransmitFlowControl_Disable; + ETH_InitStruct->ETH_VLANTagComparison = ETH_VLANTagComparison_16Bit; + ETH_InitStruct->ETH_VLANTagIdentifier = 0x0; + /*------------------------ DMA -----------------------------------*/ + ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable; + ETH_InitStruct->ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable; + ETH_InitStruct->ETH_FlushReceivedFrame = ETH_FlushReceivedFrame_Disable; + ETH_InitStruct->ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable; + ETH_InitStruct->ETH_TransmitThresholdControl = ETH_TransmitThresholdControl_64Bytes; + ETH_InitStruct->ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable; + ETH_InitStruct->ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable; + ETH_InitStruct->ETH_ReceiveThresholdControl = ETH_ReceiveThresholdControl_64Bytes; + ETH_InitStruct->ETH_SecondFrameOperate = ETH_SecondFrameOperate_Disable; + ETH_InitStruct->ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable; + ETH_InitStruct->ETH_FixedBurst = ETH_FixedBurst_Disable; + ETH_InitStruct->ETH_RxDMABurstLength = ETH_RxDMABurstLength_1Beat; + ETH_InitStruct->ETH_TxDMABurstLength = ETH_TxDMABurstLength_1Beat; + ETH_InitStruct->ETH_DescriptorSkipLength = 0x0; + ETH_InitStruct->ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_1_1; +} + +/** + * @brief Enables ENET MAC and DMA reception/transmission + * @param None + * @retval : None + */ +void ETH_Start(void) +{ + /* Enable transmit state machine of the MAC for transmission on the MII */ + ETH_MACTransmissionCmd(ENABLE); + /* Flush Transmit FIFO */ + ETH_FlushTransmitFIFO(); + /* Enable receive state machine of the MAC for reception from the MII */ + ETH_MACReceptionCmd(ENABLE); + + /* Start DMA transmission */ + ETH_DMATransmissionCmd(ENABLE); + /* Start DMA reception */ + ETH_DMAReceptionCmd(ENABLE); +} + +/** + * @brief Transmits a packet, from application buffer, pointed by ppkt. + * @param ppkt: pointer to application packet buffer to transmit. + * @param FrameLength: Tx Packet size. + * @retval : ETH_ERROR: in case of Tx desc owned by DMA + * ETH_SUCCESS: for correct transmission + */ +uint32_t ETH_HandleTxPkt(uint8_t *ppkt, uint16_t FrameLength) +{ + uint32_t offset = 0; + + /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */ + if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (uint32_t)RESET) + { + /* Return ERROR: OWN bit set */ + return ETH_ERROR; + } + + /* Copy the frame to be sent into memory pointed by the current ETHERNET DMA Tx descriptor */ + for(offset=0; offsetBuffer1Addr) + offset)) = (*(ppkt + offset)); + } + + /* Setting the Frame Length: bits[12:0] */ + DMATxDescToSet->ControlBufferSize = (FrameLength & ETH_DMATxDesc_TBS1); + /* Setting the last segment and first segment bits (in this case a frame is transmitted in one descriptor) */ + DMATxDescToSet->Status |= ETH_DMATxDesc_LS | ETH_DMATxDesc_FS; + /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMATxDescToSet->Status |= ETH_DMATxDesc_OWN; + /* When Tx Buffer unavailable flag is set: clear it and resume transmission */ + if ((ETH->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET) + { + /* Clear TBUS ETHERNET DMA flag */ + ETH->DMASR = ETH_DMASR_TBUS; + /* Resume DMA transmission*/ + ETH->DMATPDR = 0; + } + + /* Update the ETHERNET DMA global Tx descriptor with next Tx decriptor */ + /* Chained Mode */ + if((DMATxDescToSet->Status & ETH_DMATxDesc_TCH) != (uint32_t)RESET) + { + /* Selects the next DMA Tx descriptor list for next buffer to send */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) (DMATxDescToSet->Buffer2NextDescAddr); + } + else /* Ring Mode */ + { + if((DMATxDescToSet->Status & ETH_DMATxDesc_TER) != (uint32_t)RESET) + { + /* Selects the first DMA Tx descriptor for next buffer to send: last Tx descriptor was used */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) (ETH->DMATDLAR); + } + else + { + /* Selects the next DMA Tx descriptor list for next buffer to send */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) ((uint32_t)DMATxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** + * @brief Receives a packet and copies it to memory pointed by ppkt. + * @param ppkt: pointer to application packet receive buffer. + * @retval : ETH_ERROR: if there is error in reception + * framelength: received packet size if packet reception is correct + */ +uint32_t ETH_HandleRxPkt(uint8_t *ppkt) +{ + uint32_t offset = 0, framelength = 0; + /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */ + if((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) != (uint32_t)RESET) + { + /* Return error: OWN bit set */ + return ETH_ERROR; + } + + if(((DMARxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)) + { + /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */ + framelength = ((DMARxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARxDesc_FrameLengthShift) - 4; + /* Copy the received frame into buffer from memory pointed by the current ETHERNET DMA Rx descriptor */ + for(offset=0; offsetBuffer1Addr) + offset)); + } + } + else + { + /* Return ERROR */ + framelength = ETH_ERROR; + } + /* Set Own bit of the Rx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMARxDescToGet->Status = ETH_DMARxDesc_OWN; + + /* When Rx Buffer unavailable flag is set: clear it and resume reception */ + if ((ETH->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET) + { + /* Clear RBUS ETHERNET DMA flag */ + ETH->DMASR = ETH_DMASR_RBUS; + /* Resume DMA reception */ + ETH->DMARPDR = 0; + } + + /* Update the ETHERNET DMA global Rx descriptor with next Rx decriptor */ + /* Chained Mode */ + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RCH) != (uint32_t)RESET) + { + /* Selects the next DMA Rx descriptor list for next buffer to read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr); + } + else /* Ring Mode */ + { + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RER) != (uint32_t)RESET) + { + /* Selects the first DMA Rx descriptor for next buffer to read: last Rx descriptor was used */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (ETH->DMARDLAR); + } + else + { + /* Selects the next DMA Rx descriptor list for next buffer to read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) ((uint32_t)DMARxDescToGet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + + /* Return Frame Length/ERROR */ + return (framelength); +} + +/** + * @brief Get the size of received the received packet. + * @param None + * @retval : framelength: received packet size + */ +uint32_t ETH_GetRxPktSize(void) +{ + uint32_t frameLength = 0; + if(((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)) + { + /* Get the size of the packet: including 4 bytes of the CRC */ + frameLength = ETH_GetDMARxDescFrameLength(DMARxDescToGet); + } + + /* Return Frame Length */ + return frameLength; +} + +/** + * @brief Drop a Received packet (too small packet, etc...) + * @param None + * @retval : None + */ +void ETH_DropRxPkt(void) +{ + /* Set Own bit of the Rx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMARxDescToGet->Status = ETH_DMARxDesc_OWN; + /* Chained Mode */ + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RCH) != (uint32_t)RESET) + { + /* Selects the next DMA Rx descriptor list for next buffer read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr); + } + else /* Ring Mode */ + { + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RER) != (uint32_t)RESET) + { + /* Selects the next DMA Rx descriptor list for next buffer read: this will + be the first Rx descriptor in this case */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (ETH->DMARDLAR); + } + else + { + /* Selects the next DMA Rx descriptor list for next buffer read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) ((uint32_t)DMARxDescToGet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } +} + +/*--------------------------------- PHY ------------------------------------*/ +/** + * @brief Read a PHY register + * @param PHYAddress: PHY device address, is the index of one of supported + * 32 PHY devices. + * This parameter can be one of the following values: 0,..,31 + * @param PHYReg: PHY register address, is the index of one of the 32 + * PHY register. + * This parameter can be one of the following values: + * @arg PHY_BCR : Tranceiver Basic Control Register + * @arg PHY_BSR : Tranceiver Basic Status Register + * @arg PHY_SR : Tranceiver Status Register + * @arg More PHY register could be read depending on the used PHY + * @retval : ETH_ERROR: in case of timeout + * MAC MIIDR register value: Data read from the selected PHY register (correct read ) + */ +uint16_t ETH_ReadPHYRegister(uint16_t PHYAddress, uint16_t PHYReg) +{ + uint32_t tmpreg = 0; +__IO uint32_t timeout = 0; + /* Check the parameters */ + assert_param(IS_ETH_PHY_ADDRESS(PHYAddress)); + assert_param(IS_ETH_PHY_REG(PHYReg)); + + /* Get the ETHERNET MACMIIAR value */ + tmpreg = ETH->MACMIIAR; + /* Keep only the CSR Clock Range CR[2:0] bits value */ + tmpreg &= ~MACMIIAR_CR_Mask; + /* Prepare the MII address register value */ + tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */ + tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */ + tmpreg &= ~ETH_MACMIIAR_MW; /* Set the read mode */ + tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */ + /* Write the result value into the MII Address register */ + ETH->MACMIIAR = tmpreg; + /* Check for the Busy flag */ + do + { + timeout++; + tmpreg = ETH->MACMIIAR; + } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_READ_TO) + { + return (uint16_t)ETH_ERROR; + } + + /* Return data register value */ + return (uint16_t)(ETH->MACMIIDR); +} + +/** + * @brief Write to a PHY register + * @param PHYAddress: PHY device address, is the index of one of supported + * 32 PHY devices. + * This parameter can be one of the following values: 0,..,31 + * @param PHYReg: PHY register address, is the index of one of the 32 + * PHY register. + * This parameter can be one of the following values: + * @arg PHY_BCR : Tranceiver Control Register + * @arg More PHY register could be written depending on the used PHY + * @param PHYValue: the value to write + * @retval : ETH_ERROR: in case of timeout + * ETH_SUCCESS: for correct write + */ +uint32_t ETH_WritePHYRegister(uint16_t PHYAddress, uint16_t PHYReg, uint16_t PHYValue) +{ + uint32_t tmpreg = 0; + __IO uint32_t timeout = 0; + /* Check the parameters */ + assert_param(IS_ETH_PHY_ADDRESS(PHYAddress)); + assert_param(IS_ETH_PHY_REG(PHYReg)); + + /* Get the ETHERNET MACMIIAR value */ + tmpreg = ETH->MACMIIAR; + /* Keep only the CSR Clock Range CR[2:0] bits value */ + tmpreg &= ~MACMIIAR_CR_Mask; + /* Prepare the MII register address value */ + tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */ + tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */ + tmpreg |= ETH_MACMIIAR_MW; /* Set the write mode */ + tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */ + /* Give the value to the MII data register */ + ETH->MACMIIDR = PHYValue; + /* Write the result value into the MII Address register */ + ETH->MACMIIAR = tmpreg; + /* Check for the Busy flag */ + do + { + timeout++; + tmpreg = ETH->MACMIIAR; + } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_WRITE_TO)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_WRITE_TO) + { + return ETH_ERROR; + } + + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** + * @brief Enables or disables the PHY loopBack mode. + * @param PHYAddress: PHY device address, is the index of one of supported + * 32 PHY devices. + * This parameter can be one of the following values: + * @param NewState: new state of the PHY loopBack mode. + * This parameter can be: ENABLE or DISABLE. + * Note: Don't be confused with ETH_MACLoopBackCmd function + * which enables internal loopback at MII level + * @retval : ETH_ERROR: in case of bad PHY configuration + * ETH_SUCCESS: for correct PHY configuration + */ +uint32_t ETH_PHYLoopBackCmd(uint16_t PHYAddress, FunctionalState NewState) +{ + uint16_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_ETH_PHY_ADDRESS(PHYAddress)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* Get the PHY configuration to update it */ + tmpreg = ETH_ReadPHYRegister(PHYAddress, PHY_BCR); + + if (NewState != DISABLE) + { + /* Enable the PHY loopback mode */ + tmpreg |= PHY_Loopback; + } + else + { + /* Disable the PHY loopback mode: normal mode */ + tmpreg &= (uint16_t)(~(uint16_t)PHY_Loopback); + } + /* Update the PHY control register with the new configuration */ + if(ETH_WritePHYRegister(PHYAddress, PHY_BCR, tmpreg) != (uint32_t)RESET) + { + return ETH_SUCCESS; + } + else + { + /* Return SUCCESS */ + return ETH_ERROR; + } +} + +/*--------------------------------- MAC ------------------------------------*/ +/** + * @brief Enables or disables the MAC transmission. + * @param NewState: new state of the MAC transmission. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MACTransmissionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC transmission */ + ETH->MACCR |= ETH_MACCR_TE; + } + else + { + /* Disable the MAC transmission */ + ETH->MACCR &= ~ETH_MACCR_TE; + } +} + +/** + * @brief Enables or disables the MAC reception. + * @param NewState: new state of the MAC reception. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MACReceptionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC reception */ + ETH->MACCR |= ETH_MACCR_RE; + } + else + { + /* Disable the MAC reception */ + ETH->MACCR &= ~ETH_MACCR_RE; + } +} + +/** + * @brief Checks whether the ETHERNET flow control busy bit is set or not. + * @param None + * @retval : The new state of flow control busy status bit (SET or RESET). + */ +FlagStatus ETH_GetFlowControlBusyStatus(void) +{ + FlagStatus bitstatus = RESET; + /* The Flow Control register should not be written to until this bit is cleared */ + if ((ETH->MACFCR & ETH_MACFCR_FCBBPA) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Initiate a Pause Control Frame (Full-duplex only). + * @param None + * @retval : None + */ +void ETH_InitiatePauseControlFrame(void) +{ + /* When Set In full duplex MAC initiates pause control frame */ + ETH->MACFCR |= ETH_MACFCR_FCBBPA; +} + +/** + * @brief Enables or disables the MAC BackPressure operation activation (Half-duplex only). + * @param NewState: new state of the MAC BackPressure operation activation. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_BackPressureActivationCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Activate the MAC BackPressure operation */ + /* In Half duplex: during backpressure, when the MAC receives a new frame, + the transmitter starts sending a JAM pattern resulting in a collision */ + ETH->MACFCR |= ETH_MACFCR_FCBBPA; + } + else + { + /* Desactivate the MAC BackPressure operation */ + ETH->MACFCR &= ~ETH_MACFCR_FCBBPA; + } +} + +/** + * @brief Checks whether the specified ETHERNET MAC flag is set or not. + * @param ETH_MAC_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_MAC_FLAG_TST : Time stamp trigger flag + * @arg ETH_MAC_FLAG_MMCT : MMC transmit flag + * @arg ETH_MAC_FLAG_MMCR : MMC receive flag + * @arg ETH_MAC_FLAG_MMC : MMC flag + * @arg ETH_MAC_FLAG_PMT : PMT flag + * @retval : The new state of ETHERNET MAC flag (SET or RESET). + */ +FlagStatus ETH_GetMACFlagStatus(uint32_t ETH_MAC_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_MAC_GET_FLAG(ETH_MAC_FLAG)); + if ((ETH->MACSR & ETH_MAC_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Checks whether the specified ETHERNET MAC interrupt has occurred or not. + * @param ETH_MAC_IT: specifies the interrupt source to check. + * This parameter can be one of the following values: + * @arg ETH_MAC_IT_TST : Time stamp trigger interrupt + * @arg ETH_MAC_IT_MMCT : MMC transmit interrupt + * @arg ETH_MAC_IT_MMCR : MMC receive interrupt + * @arg ETH_MAC_IT_MMC : MMC interrupt + * @arg ETH_MAC_IT_PMT : PMT interrupt + * @retval : The new state of ETHERNET MAC interrupt (SET or RESET). + */ +ITStatus ETH_GetMACITStatus(uint32_t ETH_MAC_IT) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_MAC_GET_IT(ETH_MAC_IT)); + if ((ETH->MACSR & ETH_MAC_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Enables or disables the specified ETHERNET MAC interrupts. + * @param ETH_MAC_IT: specifies the ETHERNET MAC interrupt sources to be + * enabled or disabled. + * This parameter can be any combination of the following values: + * @arg ETH_MAC_IT_TST : Time stamp trigger interrupt + * @arg ETH_MAC_IT_PMT : PMT interrupt + * @param NewState: new state of the specified ETHERNET MAC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MACITConfig(uint32_t ETH_MAC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ETH_MAC_IT(ETH_MAC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET MAC interrupts */ + ETH->MACIMR &= (~(uint32_t)ETH_MAC_IT); + } + else + { + /* Disable the selected ETHERNET MAC interrupts */ + ETH->MACIMR |= ETH_MAC_IT; + } +} + +/** + * @brief Configures the selected MAC address. + * @param MacAddr: The MAC addres to configure. + * This parameter can be one of the following values: + * @arg ETH_MAC_Address0 : MAC Address0 + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param Addr: Pointer on MAC address buffer data (6 bytes). + * @retval : None + */ +void ETH_MACAddressConfig(uint32_t MacAddr, uint8_t *Addr) +{ + uint32_t tmpreg; + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS0123(MacAddr)); + + /* Calculate the selectecd MAC address high register */ + tmpreg = ((uint32_t)Addr[5] << 8) | (uint32_t)Addr[4]; + /* Load the selectecd MAC address high register */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) = tmpreg; + /* Calculate the selectecd MAC address low register */ + tmpreg = ((uint32_t)Addr[3] << 24) | ((uint32_t)Addr[2] << 16) | ((uint32_t)Addr[1] << 8) | Addr[0]; + + /* Load the selectecd MAC address low register */ + (*(__IO uint32_t *) (ETH_MAC_AddrLowBase + MacAddr)) = tmpreg; +} + +/** + * @brief Get the selected MAC address. + * @param MacAddr: The MAC addres to return. + * This parameter can be one of the following values: + * @arg ETH_MAC_Address0 : MAC Address0 + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param Addr: Pointer on MAC address buffer data (6 bytes). + * @retval : None + */ +void ETH_GetMACAddress(uint32_t MacAddr, uint8_t *Addr) +{ + uint32_t tmpreg; + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS0123(MacAddr)); + + /* Get the selectecd MAC address high register */ + tmpreg =(*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)); + + /* Calculate the selectecd MAC address buffer */ + Addr[5] = ((tmpreg >> 8) & (uint8_t)0xFF); + Addr[4] = (tmpreg & (uint8_t)0xFF); + /* Load the selectecd MAC address low register */ + tmpreg =(*(__IO uint32_t *) (ETH_MAC_AddrLowBase + MacAddr)); + /* Calculate the selectecd MAC address buffer */ + Addr[3] = ((tmpreg >> 24) & (uint8_t)0xFF); + Addr[2] = ((tmpreg >> 16) & (uint8_t)0xFF); + Addr[1] = ((tmpreg >> 8 ) & (uint8_t)0xFF); + Addr[0] = (tmpreg & (uint8_t)0xFF); +} + +/** + * @brief Enables or disables the Address filter module uses the specified + * ETHERNET MAC address for perfect filtering + * @param MacAddr: specifies the ETHERNET MAC address to be used for prfect filtering. + * This parameter can be one of the following values: + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param NewState: new state of the specified ETHERNET MAC address use. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MACAddressPerfectFilterCmd(uint32_t MacAddr, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS123(MacAddr)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET MAC address for perfect filtering */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) |= ETH_MACA1HR_AE; + } + else + { + /* Disable the selected ETHERNET MAC address for perfect filtering */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) &=(~(uint32_t)ETH_MACA1HR_AE); + } +} + +/** + * @brief Set the filter type for the specified ETHERNET MAC address + * @param MacAddr: specifies the ETHERNET MAC address + * This parameter can be one of the following values: + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param Filter: specifies the used frame received field for comparaison + * This parameter can be one of the following values: + * @arg ETH_MAC_AddressFilter_SA : MAC Address is used to compare + * with the SA fields of the received frame. + * @arg ETH_MAC_AddressFilter_DA : MAC Address is used to compare + * with the DA fields of the received frame. + * @retval : None + */ +void ETH_MACAddressFilterConfig(uint32_t MacAddr, uint32_t Filter) +{ + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS123(MacAddr)); + assert_param(IS_ETH_MAC_ADDRESS_FILTER(Filter)); + + if (Filter != ETH_MAC_AddressFilter_DA) + { + /* The selected ETHERNET MAC address is used to compare with the SA fields of the + received frame. */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) |= ETH_MACA1HR_SA; + } + else + { + /* The selected ETHERNET MAC address is used to compare with the DA fields of the + received frame. */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) &=(~(uint32_t)ETH_MACA1HR_SA); + } +} + +/** + * @brief Set the filter type for the specified ETHERNET MAC address + * @param MacAddr: specifies the ETHERNET MAC address + * This parameter can be one of the following values: + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param MaskByte: specifies the used address bytes for comparaison + * This parameter can be any combination of the following values: + * @arg ETH_MAC_AddressMask_Byte6 : Mask MAC Address high reg bits [15:8]. + * @arg ETH_MAC_AddressMask_Byte5 : Mask MAC Address high reg bits [7:0]. + * @arg ETH_MAC_AddressMask_Byte4 : Mask MAC Address low reg bits [31:24]. + * @arg ETH_MAC_AddressMask_Byte3 : Mask MAC Address low reg bits [23:16]. + * @arg ETH_MAC_AddressMask_Byte2 : Mask MAC Address low reg bits [15:8]. + * @arg ETH_MAC_AddressMask_Byte1 : Mask MAC Address low reg bits [7:0]. + * @retval : None + */ +void ETH_MACAddressMaskBytesFilterConfig(uint32_t MacAddr, uint32_t MaskByte) +{ + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS123(MacAddr)); + assert_param(IS_ETH_MAC_ADDRESS_MASK(MaskByte)); + + /* Clear MBC bits in the selected MAC address high register */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) &=(~(uint32_t)ETH_MACA1HR_MBC); + /* Set the selected Filetr mask bytes */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) |= MaskByte; +} +/*------------------------ DMA Tx/Rx Desciptors -----------------------------*/ + +/** + * @brief Initializes the DMA Tx descriptors in chain mode. + * @param DMATxDescTab: Pointer on the first Tx desc list + * @param TxBuff: Pointer on the first TxBuffer list + * @param TxBuffCount: Number of the used Tx desc in the list + * @retval : None + */ +void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t* TxBuff, uint32_t TxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMATxDesc; + + /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */ + DMATxDescToSet = DMATxDescTab; + /* Fill each DMATxDesc descriptor with the right values */ + for(i=0; i < TxBuffCount; i++) + { + /* Get the pointer on the ith member of the Tx Desc list */ + DMATxDesc = DMATxDescTab + i; + /* Set Second Address Chained bit */ + DMATxDesc->Status = ETH_DMATxDesc_TCH; + + /* Set Buffer1 address pointer */ + DMATxDesc->Buffer1Addr = (uint32_t)(&TxBuff[i*ETH_MAX_PACKET_SIZE]); + + /* Initialize the next descriptor with the Next Desciptor Polling Enable */ + if(i < (TxBuffCount-1)) + { + /* Set next descriptor address register with next descriptor base address */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t)(DMATxDescTab+i+1); + } + else + { + /* For last descriptor, set next descriptor address register equal to the first descriptor base address */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t) DMATxDescTab; + } + } + + /* Set Transmit Desciptor List Address Register */ + ETH->DMATDLAR = (uint32_t) DMATxDescTab; +} + +/** + * @brief Initializes the DMA Tx descriptors in ring mode. + * @param DMATxDescTab: Pointer on the first Tx desc list + * @param TxBuff1: Pointer on the first TxBuffer1 list + * @param TxBuff2: Pointer on the first TxBuffer2 list + * @param TxBuffCount: Number of the used Tx desc in the list + * Note: see decriptor skip length defined in ETH_DMA_InitStruct + * for the number of Words to skip between two unchained descriptors. + * @retval : None + */ +void ETH_DMATxDescRingInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t *TxBuff1, uint8_t *TxBuff2, uint32_t TxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMATxDesc; + + /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */ + DMATxDescToSet = DMATxDescTab; + /* Fill each DMATxDesc descriptor with the right values */ + for(i=0; i < TxBuffCount; i++) + { + /* Get the pointer on the ith member of the Tx Desc list */ + DMATxDesc = DMATxDescTab + i; + /* Set Buffer1 address pointer */ + DMATxDesc->Buffer1Addr = (uint32_t)(&TxBuff1[i*ETH_MAX_PACKET_SIZE]); + + /* Set Buffer2 address pointer */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t)(&TxBuff2[i*ETH_MAX_PACKET_SIZE]); + + /* Set Transmit End of Ring bit for last descriptor: The DMA returns to the base + address of the list, creating a Desciptor Ring */ + if(i == (TxBuffCount-1)) + { + /* Set Transmit End of Ring bit */ + DMATxDesc->Status = ETH_DMATxDesc_TER; + } + } + + /* Set Transmit Desciptor List Address Register */ + ETH->DMATDLAR = (uint32_t) DMATxDescTab; +} + +/** + * @brief Checks whether the specified ETHERNET DMA Tx Desc flag is set or not. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param ETH_DMATxDescFlag: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_DMATxDesc_OWN : OWN bit: descriptor is owned by DMA engine + * @arg ETH_DMATxDesc_IC : Interrupt on completetion + * @arg ETH_DMATxDesc_LS : Last Segment + * @arg ETH_DMATxDesc_FS : First Segment + * @arg ETH_DMATxDesc_DC : Disable CRC + * @arg ETH_DMATxDesc_DP : Disable Pad + * @arg ETH_DMATxDesc_TTSE: Transmit Time Stamp Enable + * @arg ETH_DMATxDesc_TER : Transmit End of Ring + * @arg ETH_DMATxDesc_TCH : Second Address Chained + * @arg ETH_DMATxDesc_TTSS: Tx Time Stamp Status + * @arg ETH_DMATxDesc_IHE : IP Header Error + * @arg ETH_DMATxDesc_ES : Error summary + * @arg ETH_DMATxDesc_JT : Jabber Timeout + * @arg ETH_DMATxDesc_FF : Frame Flushed: DMA/MTL flushed the frame due to SW flush + * @arg ETH_DMATxDesc_PCE : Payload Checksum Error + * @arg ETH_DMATxDesc_LCA : Loss of Carrier: carrier lost during tramsmission + * @arg ETH_DMATxDesc_NC : No Carrier: no carrier signal from the tranceiver + * @arg ETH_DMATxDesc_LCO : Late Collision: transmission aborted due to collision + * @arg ETH_DMATxDesc_EC : Excessive Collision: transmission aborted after 16 collisions + * @arg ETH_DMATxDesc_VF : VLAN Frame + * @arg ETH_DMATxDesc_CC : Collision Count + * @arg ETH_DMATxDesc_ED : Excessive Deferral + * @arg ETH_DMATxDesc_UF : Underflow Error: late data arrival from the memory + * @arg ETH_DMATxDesc_DB : Deferred Bit + * @retval : The new state of ETH_DMATxDescFlag (SET or RESET). + */ +FlagStatus ETH_GetDMATxDescFlagStatus(ETH_DMADESCTypeDef *DMATxDesc, uint32_t ETH_DMATxDescFlag) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMATxDESC_GET_FLAG(ETH_DMATxDescFlag)); + + if ((DMATxDesc->Status & ETH_DMATxDescFlag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Returns the specified ETHERNET DMA Tx Desc collision count. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @retval : The Transmit descriptor collision counter value. + */ +uint32_t ETH_GetDMATxDescCollisionCount(ETH_DMADESCTypeDef *DMATxDesc) +{ + /* Return the Receive descriptor frame length */ + return ((DMATxDesc->Status & ETH_DMATxDesc_CC) >> ETH_DMATxDesc_CollisionCountShift); +} + +/** + * @brief Set the specified DMA Tx Desc Own bit. + * @param DMATxDesc: Pointer on a Tx desc + * @retval : None + */ +void ETH_SetDMATxDescOwnBit(ETH_DMADESCTypeDef *DMATxDesc) +{ + /* Set the DMA Tx Desc Own bit */ + DMATxDesc->Status |= ETH_DMATxDesc_OWN; +} + +/** + * @brief Enables or disables the specified DMA Tx Desc Transmit interrupt. + * @param DMATxDesc: Pointer on a Tx desc + * @param NewState: new state of the DMA Tx Desc transmit interrupt. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescTransmitITConfig(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA Tx Desc Transmit interrupt */ + DMATxDesc->Status |= ETH_DMATxDesc_IC; + } + else + { + /* Disable the DMA Tx Desc Transmit interrupt */ + DMATxDesc->Status &=(~(uint32_t)ETH_DMATxDesc_IC); + } +} + +/** + * @brief Enables or disables the specified DMA Tx Desc Transmit interrupt. + * @param DMATxDesc: Pointer on a Tx desc + * @param DMATxDesc_FrameSegment: specifies is the actual Tx desc contain last or first segment. + * This parameter can be one of the following values: + * @arg ETH_DMATxDesc_LastSegment : actual Tx desc contain last segment + * @arg ETH_DMATxDesc_FirstSegment : actual Tx desc contain first segment + * @retval : None + */ +void ETH_DMATxDescFrameSegmentConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_FrameSegment) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_TXDESC_SEGMENT(DMATxDesc_FrameSegment)); + + /* Selects the DMA Tx Desc Frame segment */ + DMATxDesc->Status |= DMATxDesc_FrameSegment; +} + +/** + * @brief Selects the specified ETHERNET DMA Tx Desc Checksum Insertion. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param DMATxDesc_Checksum: specifies is the DMA Tx desc checksum insertion. + * This parameter can be one of the following values: + * @arg ETH_DMATxDesc_ChecksumByPass : Checksum bypass + * @arg ETH_DMATxDesc_ChecksumIPV4Header : IPv4 header checksum + * @arg ETH_DMATxDesc_ChecksumTCPUDPICMPSegment : TCP/UDP/ICMP checksum. Pseudo header checksum is assumed to be present + * @arg ETH_DMATxDesc_ChecksumTCPUDPICMPFull : TCP/UDP/ICMP checksum fully in hardware including pseudo header + * @retval : None + */ +void ETH_DMATxDescChecksumInsertionConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_Checksum) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_TXDESC_CHECKSUM(DMATxDesc_Checksum)); + + /* Set the selected DMA Tx desc checksum insertion control */ + DMATxDesc->Status |= DMATxDesc_Checksum; +} + +/** + * @brief Enables or disables the DMA Tx Desc CRC. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc CRC. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescCRCCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc CRC */ + DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_DC); + } + else + { + /* Disable the selected DMA Tx Desc CRC */ + DMATxDesc->Status |= ETH_DMATxDesc_DC; + } +} + +/** + * @brief Enables or disables the DMA Tx Desc end of ring. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc end of ring. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc end of ring */ + DMATxDesc->Status |= ETH_DMATxDesc_TER; + } + else + { + /* Disable the selected DMA Tx Desc end of ring */ + DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_TER); + } +} + +/** + * @brief Enables or disables the DMA Tx Desc second address chained. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc second address chained. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc second address chained */ + DMATxDesc->Status |= ETH_DMATxDesc_TCH; + } + else + { + /* Disable the selected DMA Tx Desc second address chained */ + DMATxDesc->Status &=(~(uint32_t)ETH_DMATxDesc_TCH); + } +} + +/** + * @brief Enables or disables the DMA Tx Desc padding for frame shorter than 64 bytes. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc padding for + * frame shorter than 64 bytes. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescShortFramePaddingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc padding for frame shorter than 64 bytes */ + DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_DP); + } + else + { + /* Disable the selected DMA Tx Desc padding for frame shorter than 64 bytes*/ + DMATxDesc->Status |= ETH_DMATxDesc_DP; + } +} + +/** + * @brief Enables or disables the DMA Tx Desc time stamp. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc time stamp. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescTimeStampCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc time stamp */ + DMATxDesc->Status |= ETH_DMATxDesc_TTSE; + } + else + { + /* Disable the selected DMA Tx Desc time stamp */ + DMATxDesc->Status &=(~(uint32_t)ETH_DMATxDesc_TTSE); + } +} + +/** + * @brief Configures the specified DMA Tx Desc buffer1 and buffer2 sizes. + * @param DMATxDesc: Pointer on a Tx desc + * @param BufferSize1: specifies the Tx desc buffer1 size. + * @param BufferSize2: specifies the Tx desc buffer2 size (put "0" if not used). + * @retval : None + */ +void ETH_DMATxDescBufferSizeConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t BufferSize1, uint32_t BufferSize2) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMATxDESC_BUFFER_SIZE(BufferSize1)); + assert_param(IS_ETH_DMATxDESC_BUFFER_SIZE(BufferSize2)); + + /* Set the DMA Tx Desc buffer1 and buffer2 sizes values */ + DMATxDesc->ControlBufferSize |= (BufferSize1 | (BufferSize2 << ETH_DMATxDesc_BufferSize2Shift)); +} + +/** + * @brief Initializes the DMA Rx descriptors in chain mode. + * @param DMARxDescTab: Pointer on the first Rx desc list + * @param RxBuff: Pointer on the first RxBuffer list + * @param RxBuffCount: Number of the used Rx desc in the list + * @retval : None + */ +void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMARxDesc; + + /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */ + DMARxDescToGet = DMARxDescTab; + /* Fill each DMARxDesc descriptor with the right values */ + for(i=0; i < RxBuffCount; i++) + { + /* Get the pointer on the ith member of the Rx Desc list */ + DMARxDesc = DMARxDescTab+i; + /* Set Own bit of the Rx descriptor Status */ + DMARxDesc->Status = ETH_DMARxDesc_OWN; + + /* Set Buffer1 size and Second Address Chained bit */ + DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_MAX_PACKET_SIZE; + /* Set Buffer1 address pointer */ + DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff[i*ETH_MAX_PACKET_SIZE]); + + /* Initialize the next descriptor with the Next Desciptor Polling Enable */ + if(i < (RxBuffCount-1)) + { + /* Set next descriptor address register with next descriptor base address */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab+i+1); + } + else + { + /* For last descriptor, set next descriptor address register equal to the first descriptor base address */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab); + } + } + + /* Set Receive Desciptor List Address Register */ + ETH->DMARDLAR = (uint32_t) DMARxDescTab; +} + +/** + * @brief Initializes the DMA Rx descriptors in ring mode. + * @param DMARxDescTab: Pointer on the first Rx desc list + * @param RxBuff1: Pointer on the first RxBuffer1 list + * @param RxBuff2: Pointer on the first RxBuffer2 list + * @param RxBuffCount: Number of the used Rx desc in the list + * Note: see decriptor skip length defined in ETH_DMA_InitStruct + * for the number of Words to skip between two unchained descriptors. + * @retval : None + */ +void ETH_DMARxDescRingInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff1, uint8_t *RxBuff2, uint32_t RxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMARxDesc; + /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */ + DMARxDescToGet = DMARxDescTab; + /* Fill each DMARxDesc descriptor with the right values */ + for(i=0; i < RxBuffCount; i++) + { + /* Get the pointer on the ith member of the Rx Desc list */ + DMARxDesc = DMARxDescTab+i; + /* Set Own bit of the Rx descriptor Status */ + DMARxDesc->Status = ETH_DMARxDesc_OWN; + /* Set Buffer1 size */ + DMARxDesc->ControlBufferSize = ETH_MAX_PACKET_SIZE; + /* Set Buffer1 address pointer */ + DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff1[i*ETH_MAX_PACKET_SIZE]); + + /* Set Buffer2 address pointer */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(&RxBuff2[i*ETH_MAX_PACKET_SIZE]); + + /* Set Receive End of Ring bit for last descriptor: The DMA returns to the base + address of the list, creating a Desciptor Ring */ + if(i == (RxBuffCount-1)) + { + /* Set Receive End of Ring bit */ + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_RER; + } + } + + /* Set Receive Desciptor List Address Register */ + ETH->DMARDLAR = (uint32_t) DMARxDescTab; +} + +/** + * @brief Checks whether the specified ETHERNET Rx Desc flag is set or not. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @param ETH_DMARxDescFlag: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_DMARxDesc_OWN: OWN bit: descriptor is owned by DMA engine + * @arg ETH_DMARxDesc_AFM: DA Filter Fail for the rx frame + * @arg ETH_DMARxDesc_ES: Error summary + * @arg ETH_DMARxDesc_DE: Desciptor error: no more descriptors for receive frame + * @arg ETH_DMARxDesc_SAF: SA Filter Fail for the received frame + * @arg ETH_DMARxDesc_LE: Frame size not matching with length field + * @arg ETH_DMARxDesc_OE: Overflow Error: Frame was damaged due to buffer overflow + * @arg ETH_DMARxDesc_VLAN: VLAN Tag: received frame is a VLAN frame + * @arg ETH_DMARxDesc_FS: First descriptor of the frame + * @arg ETH_DMARxDesc_LS: Last descriptor of the frame + * @arg ETH_DMARxDesc_IPV4HCE: IPC Checksum Error/Giant Frame: Rx Ipv4 header checksum error + * @arg ETH_DMARxDesc_LC: Late collision occurred during reception + * @arg ETH_DMARxDesc_FT: Frame type - Ethernet, otherwise 802.3 + * @arg ETH_DMARxDesc_RWT: Receive Watchdog Timeout: watchdog timer expired during reception + * @arg ETH_DMARxDesc_RE: Receive error: error reported by MII interface + * @arg ETH_DMARxDesc_DE: Dribble bit error: frame contains non int multiple of 8 bits + * @arg ETH_DMARxDesc_CE: CRC error + * @arg ETH_DMARxDesc_MAMPCE: Rx MAC Address/Payload Checksum Error: Rx MAC address matched/ Rx Payload Checksum Error + * @retval : The new state of ETH_DMARxDescFlag (SET or RESET). + */ +FlagStatus ETH_GetDMARxDescFlagStatus(ETH_DMADESCTypeDef *DMARxDesc, uint32_t ETH_DMARxDescFlag) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMARxDESC_GET_FLAG(ETH_DMARxDescFlag)); + if ((DMARxDesc->Status & ETH_DMARxDescFlag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Set the specified DMA Rx Desc Own bit. + * @param DMARxDesc: Pointer on a Rx desc + * @retval : None + */ +void ETH_SetDMARxDescOwnBit(ETH_DMADESCTypeDef *DMARxDesc) +{ + /* Set the DMA Rx Desc Own bit */ + DMARxDesc->Status |= ETH_DMARxDesc_OWN; +} + +/** + * @brief Returns the specified DMA Rx Desc frame length. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @retval : The Rx descriptor received frame length. + */ +uint32_t ETH_GetDMARxDescFrameLength(ETH_DMADESCTypeDef *DMARxDesc) +{ + /* Return the Receive descriptor frame length */ + return ((DMARxDesc->Status & ETH_DMARxDesc_FL) >> ETH_DMARxDesc_FrameLengthShift); +} + +/** + * @brief Enables or disables the specified DMA Rx Desc receive interrupt. + * @param DMARxDesc: Pointer on a Rx desc + * @param NewState: new state of the specified DMA Rx Desc interrupt. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMARxDescReceiveITConfig(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA Rx Desc receive interrupt */ + DMARxDesc->ControlBufferSize &=(~(uint32_t)ETH_DMARxDesc_DIC); + } + else + { + /* Disable the DMA Rx Desc receive interrupt */ + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_DIC; + } +} + +/** + * @brief Enables or disables the DMA Rx Desc end of ring. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @param NewState: new state of the specified DMA Rx Desc end of ring. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMARxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Rx Desc end of ring */ + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_RER; + } + else + { + /* Disable the selected DMA Rx Desc end of ring */ + DMARxDesc->ControlBufferSize &=(~(uint32_t)ETH_DMARxDesc_RER); + } +} + +/** + * @brief Enables or disables the DMA Rx Desc second address chained. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @param NewState: new state of the specified DMA Rx Desc second address chained. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMARxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Rx Desc second address chained */ + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_RCH; + } + else + { + /* Disable the selected DMA Rx Desc second address chained */ + DMARxDesc->ControlBufferSize &=(~(uint32_t)ETH_DMARxDesc_RCH); + } +} + +/** + * @brief Returns the specified ETHERNET DMA Rx Desc buffer size. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @param DMARxDesc_Buffer: specifies the DMA Rx Desc buffer. + * This parameter can be any one of the following values: + * @arg ETH_DMARxDesc_Buffer1 : DMA Rx Desc Buffer1 + * @arg ETH_DMARxDesc_Buffer2 : DMA Rx Desc Buffer2 + * @retval : The Receive descriptor frame length. + */ +uint32_t ETH_GetDMARxDescBufferSize(ETH_DMADESCTypeDef *DMARxDesc, uint32_t DMARxDesc_Buffer) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_RXDESC_BUFFER(DMARxDesc_Buffer)); + + if(DMARxDesc_Buffer != ETH_DMARxDesc_Buffer1) + { + /* Return the DMA Rx Desc buffer2 size */ + return ((DMARxDesc->ControlBufferSize & ETH_DMARxDesc_RBS2) >> ETH_DMARxDesc_Buffer2SizeShift); + } + else + { + /* Return the DMA Rx Desc buffer1 size */ + return (DMARxDesc->ControlBufferSize & ETH_DMARxDesc_RBS1); + } +} + +/*--------------------------------- DMA ------------------------------------*/ +/** + * @brief Resets all MAC subsystem internal registers and logic. + * @param None + * @retval : None + */ +void ETH_SoftwareReset(void) +{ + /* Set the SWR bit: resets all MAC subsystem internal registers and logic */ + /* After reset all the registers holds their respective reset values */ + ETH->DMABMR |= ETH_DMABMR_SR; +} + +/** + * @brief Checks whether the ETHERNET software reset bit is set or not. + * @param None + * @retval : The new state of DMA Bus Mode register SR bit (SET or RESET). + */ +FlagStatus ETH_GetSoftwareResetStatus(void) +{ + FlagStatus bitstatus = RESET; + if((ETH->DMABMR & ETH_DMABMR_SR) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Checks whether the specified ETHERNET DMA flag is set or not. + * @param ETH_DMA_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_DMA_FLAG_TST : Time-stamp trigger flag + * @arg ETH_DMA_FLAG_PMT : PMT flag + * @arg ETH_DMA_FLAG_MMC : MMC flag + * @arg ETH_DMA_FLAG_DataTransferError : Error bits 0-data buffer, 1-desc. access + * @arg ETH_DMA_FLAG_ReadWriteError : Error bits 0-write trnsf, 1-read transfr + * @arg ETH_DMA_FLAG_AccessError : Error bits 0-Rx DMA, 1-Tx DMA + * @arg ETH_DMA_FLAG_NIS : Normal interrupt summary flag + * @arg ETH_DMA_FLAG_AIS : Abnormal interrupt summary flag + * @arg ETH_DMA_FLAG_ER : Early receive flag + * @arg ETH_DMA_FLAG_FBE : Fatal bus error flag + * @arg ETH_DMA_FLAG_ET : Early transmit flag + * @arg ETH_DMA_FLAG_RWT : Receive watchdog timeout flag + * @arg ETH_DMA_FLAG_RPS : Receive process stopped flag + * @arg ETH_DMA_FLAG_RBU : Receive buffer unavailable flag + * @arg ETH_DMA_FLAG_R : Receive flag + * @arg ETH_DMA_FLAG_TU : Underflow flag + * @arg ETH_DMA_FLAG_RO : Overflow flag + * @arg ETH_DMA_FLAG_TJT : Transmit jabber timeout flag + * @arg ETH_DMA_FLAG_TBU : Transmit buffer unavailable flag + * @arg ETH_DMA_FLAG_TPS : Transmit process stopped flag + * @arg ETH_DMA_FLAG_T : Transmit flag + * @retval : The new state of ETH_DMA_FLAG (SET or RESET). + */ +FlagStatus ETH_GetDMAFlagStatus(uint32_t ETH_DMA_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMA_GET_IT(ETH_DMA_FLAG)); + if ((ETH->DMASR & ETH_DMA_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the ETHERNET’s DMA pending flag. + * @param ETH_DMA_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg ETH_DMA_FLAG_NIS : Normal interrupt summary flag + * @arg ETH_DMA_FLAG_AIS : Abnormal interrupt summary flag + * @arg ETH_DMA_FLAG_ER : Early receive flag + * @arg ETH_DMA_FLAG_FBE : Fatal bus error flag + * @arg ETH_DMA_FLAG_ETI : Early transmit flag + * @arg ETH_DMA_FLAG_RWT : Receive watchdog timeout flag + * @arg ETH_DMA_FLAG_RPS : Receive process stopped flag + * @arg ETH_DMA_FLAG_RBU : Receive buffer unavailable flag + * @arg ETH_DMA_FLAG_R : Receive flag + * @arg ETH_DMA_FLAG_TU : Transmit Underflow flag + * @arg ETH_DMA_FLAG_RO : Receive Overflow flag + * @arg ETH_DMA_FLAG_TJT : Transmit jabber timeout flag + * @arg ETH_DMA_FLAG_TBU : Transmit buffer unavailable flag + * @arg ETH_DMA_FLAG_TPS : Transmit process stopped flag + * @arg ETH_DMA_FLAG_T : Transmit flag + * @retval : None + */ +void ETH_DMAClearFlag(uint32_t ETH_DMA_FLAG) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_FLAG(ETH_DMA_FLAG)); + + /* Clear the selected ETHERNET DMA FLAG */ + ETH->DMASR = (uint32_t) ETH_DMA_FLAG; +} + +/** + * @brief Checks whether the specified ETHERNET DMA interrupt has occured or not. + * @param ETH_DMA_IT: specifies the interrupt source to check. + * This parameter can be one of the following values: + * @arg ETH_DMA_IT_TST : Time-stamp trigger interrupt + * @arg ETH_DMA_IT_PMT : PMT interrupt + * @arg ETH_DMA_IT_MMC : MMC interrupt + * @arg ETH_DMA_IT_NIS : Normal interrupt summary + * @arg ETH_DMA_IT_AIS : Abnormal interrupt summary + * @arg ETH_DMA_IT_ER : Early receive interrupt + * @arg ETH_DMA_IT_FBE : Fatal bus error interrupt + * @arg ETH_DMA_IT_ET : Early transmit interrupt + * @arg ETH_DMA_IT_RWT : Receive watchdog timeout interrupt + * @arg ETH_DMA_IT_RPS : Receive process stopped interrupt + * @arg ETH_DMA_IT_RBU : Receive buffer unavailable interrupt + * @arg ETH_DMA_IT_R : Receive interrupt + * @arg ETH_DMA_IT_TU : Underflow interrupt + * @arg ETH_DMA_IT_RO : Overflow interrupt + * @arg ETH_DMA_IT_TJT : Transmit jabber timeout interrupt + * @arg ETH_DMA_IT_TBU : Transmit buffer unavailable interrupt + * @arg ETH_DMA_IT_TPS : Transmit process stopped interrupt + * @arg ETH_DMA_IT_T : Transmit interrupt + * @retval : The new state of ETH_DMA_IT (SET or RESET). + */ +ITStatus ETH_GetDMAITStatus(uint32_t ETH_DMA_IT) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMA_GET_IT(ETH_DMA_IT)); + if ((ETH->DMASR & ETH_DMA_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the ETHERNET’s DMA IT pending bit. + * @param ETH_DMA_IT: specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg ETH_DMA_IT_NIS : Normal interrupt summary + * @arg ETH_DMA_IT_AIS : Abnormal interrupt summary + * @arg ETH_DMA_IT_ER : Early receive interrupt + * @arg ETH_DMA_IT_FBE : Fatal bus error interrupt + * @arg ETH_DMA_IT_ETI : Early transmit interrupt + * @arg ETH_DMA_IT_RWT : Receive watchdog timeout interrupt + * @arg ETH_DMA_IT_RPS : Receive process stopped interrupt + * @arg ETH_DMA_IT_RBU : Receive buffer unavailable interrupt + * @arg ETH_DMA_IT_R : Receive interrupt + * @arg ETH_DMA_IT_TU : Transmit Underflow interrupt + * @arg ETH_DMA_IT_RO : Receive Overflow interrupt + * @arg ETH_DMA_IT_TJT : Transmit jabber timeout interrupt + * @arg ETH_DMA_IT_TBU : Transmit buffer unavailable interrupt + * @arg ETH_DMA_IT_TPS : Transmit process stopped interrupt + * @arg ETH_DMA_IT_T : Transmit interrupt + * @retval : None + */ +void ETH_DMAClearITPendingBit(uint32_t ETH_DMA_IT) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_IT(ETH_DMA_IT)); + + /* Clear the selected ETHERNET DMA IT */ + ETH->DMASR = (uint32_t) ETH_DMA_IT; +} + +/** + * @brief Returns the ETHERNET DMA Transmit Process State. + * @param None + * @retval : The new ETHERNET DMA Transmit Process State: + * This can be one of the following values: + * - ETH_DMA_TransmitProcess_Stopped : Stopped - Reset or Stop Tx Command issued + * - ETH_DMA_TransmitProcess_Fetching : Running - fetching the Tx descriptor + * - ETH_DMA_TransmitProcess_Waiting : Running - waiting for status + * - ETH_DMA_TransmitProcess_Reading : unning - reading the data from host memory + * - ETH_DMA_TransmitProcess_Suspended : Suspended - Tx Desciptor unavailabe + * - ETH_DMA_TransmitProcess_Closing : Running - closing Rx descriptor + */ +uint32_t ETH_GetTransmitProcessState(void) +{ + return ((uint32_t)(ETH->DMASR & ETH_DMASR_TS)); +} + +/** + * @brief Returns the ETHERNET DMA Receive Process State. + * @param None + * @retval : The new ETHERNET DMA Receive Process State: + * This can be one of the following values: + * - ETH_DMA_ReceiveProcess_Stopped : Stopped - Reset or Stop Rx Command issued + * - ETH_DMA_ReceiveProcess_Fetching : Running - fetching the Rx descriptor + * - ETH_DMA_ReceiveProcess_Waiting : Running - waiting for packet + * - ETH_DMA_ReceiveProcess_Suspended : Suspended - Rx Desciptor unavailable + * - ETH_DMA_ReceiveProcess_Closing : Running - closing descriptor + * - ETH_DMA_ReceiveProcess_Queuing : Running - queuing the recieve frame into host memory + */ +uint32_t ETH_GetReceiveProcessState(void) +{ + return ((uint32_t)(ETH->DMASR & ETH_DMASR_RS)); +} + +/** + * @brief Clears the ETHERNET transmit FIFO. + * @param None + * @retval : None + */ +void ETH_FlushTransmitFIFO(void) +{ + /* Set the Flush Transmit FIFO bit */ + ETH->DMAOMR |= ETH_DMAOMR_FTF; +} + +/** + * @brief Checks whether the ETHERNET transmit FIFO bit is cleared or not. + * @param None + * @retval : The new state of ETHERNET flush transmit FIFO bit (SET or RESET). + */ +FlagStatus ETH_GetFlushTransmitFIFOStatus(void) +{ + FlagStatus bitstatus = RESET; + if ((ETH->DMAOMR & ETH_DMAOMR_FTF) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Enables or disables the DMA transmission. + * @param NewState: new state of the DMA transmission. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATransmissionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA transmission */ + ETH->DMAOMR |= ETH_DMAOMR_ST; + } + else + { + /* Disable the DMA transmission */ + ETH->DMAOMR &= ~ETH_DMAOMR_ST; + } +} + +/** + * @brief Enables or disables the DMA reception. + * @param NewState: new state of the DMA reception. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMAReceptionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA reception */ + ETH->DMAOMR |= ETH_DMAOMR_SR; + } + else + { + /* Disable the DMA reception */ + ETH->DMAOMR &= ~ETH_DMAOMR_SR; + } +} + +/** + * @brief Enables or disables the specified ETHERNET DMA interrupts. + * @param ETH_DMA_IT: specifies the ETHERNET DMA interrupt sources to be + * enabled or disabled. + * This parameter can be any combination of the following values: + * @arg ETH_DMA_IT_NIS : Normal interrupt summary + * @arg ETH_DMA_IT_AIS : Abnormal interrupt summary + * @arg ETH_DMA_IT_ER : Early receive interrupt + * @arg ETH_DMA_IT_FBE : Fatal bus error interrupt + * @arg ETH_DMA_IT_ET : Early transmit interrupt + * @arg ETH_DMA_IT_RWT : Receive watchdog timeout interrupt + * @arg ETH_DMA_IT_RPS : Receive process stopped interrupt + * @arg ETH_DMA_IT_RBU : Receive buffer unavailable interrupt + * @arg ETH_DMA_IT_R : Receive interrupt + * @arg ETH_DMA_IT_TU : Underflow interrupt + * @arg ETH_DMA_IT_RO : Overflow interrupt + * @arg ETH_DMA_IT_TJT : Transmit jabber timeout interrupt + * @arg ETH_DMA_IT_TBU : Transmit buffer unavailable interrupt + * @arg ETH_DMA_IT_TPS : Transmit process stopped interrupt + * @arg ETH_DMA_IT_T : Transmit interrupt + * @param NewState: new state of the specified ETHERNET DMA interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMAITConfig(uint32_t ETH_DMA_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_IT(ETH_DMA_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET DMA interrupts */ + ETH->DMAIER |= ETH_DMA_IT; + } + else + { + /* Disable the selected ETHERNET DMA interrupts */ + ETH->DMAIER &=(~(uint32_t)ETH_DMA_IT); + } +} + +/** + * @brief Checks whether the specified ETHERNET DMA overflow flag is set or not. + * @param ETH_DMA_Overflow: specifies the DMA overflow flag to check. + * This parameter can be one of the following values: + * @arg ETH_DMA_Overflow_RxFIFOCounter : Overflow for FIFO Overflow Counter + * @arg ETH_DMA_Overflow_MissedFrameCounter : Overflow for Missed Frame Counter + * @retval : The new state of ETHERNET DMA overflow Flag (SET or RESET). + */ +FlagStatus ETH_GetDMAOverflowStatus(uint32_t ETH_DMA_Overflow) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMA_GET_OVERFLOW(ETH_DMA_Overflow)); + + if ((ETH->DMAMFBOCR & ETH_DMA_Overflow) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Get the ETHERNET DMA Rx Overflow Missed Frame Counter value. + * @param None + * @retval : The value of Rx overflow Missed Frame Counter. + */ +uint32_t ETH_GetRxOverflowMissedFrameCounter(void) +{ + return ((uint32_t)((ETH->DMAMFBOCR & ETH_DMAMFBOCR_MFA)>>ETH_DMA_RxOverflowMissedFramesCounterShift)); +} + +/** + * @brief Get the ETHERNET DMA Buffer Unavailable Missed Frame Counter value. + * @param None + * @retval : The value of Buffer unavailable Missed Frame Counter. + */ +uint32_t ETH_GetBufferUnavailableMissedFrameCounter(void) +{ + return ((uint32_t)(ETH->DMAMFBOCR) & ETH_DMAMFBOCR_MFC); +} + +/** + * @brief Get the ETHERNET DMA DMACHTDR register value. + * @param None + * @retval : The value of the current Tx desc start address. + */ +uint32_t ETH_GetCurrentTxDescStartAddress(void) +{ + return ((uint32_t)(ETH->DMACHTDR)); +} + +/** + * @brief Get the ETHERNET DMA DMACHRDR register value. + * @param None + * @retval : The value of the current Rx desc start address. + */ +uint32_t ETH_GetCurrentRxDescStartAddress(void) +{ + return ((uint32_t)(ETH->DMACHRDR)); +} + +/** + * @brief Get the ETHERNET DMA DMACHTBAR register value. + * @param None + * @retval : The value of the current Tx desc buffer address. + */ +uint32_t ETH_GetCurrentTxBufferAddress(void) +{ + return ((uint32_t)(ETH->DMACHTBAR)); +} + +/** + * @brief Get the ETHERNET DMA DMACHRBAR register value. + * @param None + * @retval : The value of the current Rx desc buffer address. + */ +uint32_t ETH_GetCurrentRxBufferAddress(void) +{ + return ((uint32_t)(ETH->DMACHRBAR)); +} + +/** + * @brief Resumes the DMA Transmission by writing to the DmaTxPollDemand + * register: (the data written could be anything). This forces + * the DMA to resume transmission. + * @param None + * @retval : None. + */ +void ETH_ResumeDMATransmission(void) +{ + ETH->DMATPDR = 0; +} + +/** + * @brief Resumes the DMA Transmission by writing to the DmaRxPollDemand + * register: (the data written could be anything). This forces + * the DMA to resume reception. + * @param None + * @retval : None. + */ +void ETH_ResumeDMAReception(void) +{ + ETH->DMARPDR = 0; +} + +/*--------------------------------- PMT ------------------------------------*/ +/** + * @brief Reset Wakeup frame filter register pointer. + * @param None + * @retval : None + */ +void ETH_ResetWakeUpFrameFilterRegisterPointer(void) +{ + /* Resets the Remote Wake-up Frame Filter register pointer to 0x0000 */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_WFFRPR; +} + +/** + * @brief Populates the remote wakeup frame registers. + * @param Buffer: Pointer on remote WakeUp Frame Filter Register buffer + * data (8 words). + * @retval : None + */ +void ETH_SetWakeUpFrameFilterRegister(uint32_t *Buffer) +{ + uint32_t i = 0; + + /* Fill Remote Wake-up Frame Filter register with Buffer data */ + for(i =0; iMACRWUFFR = Buffer[i]; + } +} + +/** + * @brief Enables or disables any unicast packet filtered by the MAC + * (DAF) address recognition to be a wake-up frame. + * @param NewState: new state of the MAC Global Unicast Wake-Up. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_GlobalUnicastWakeUpCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC Global Unicast Wake-Up */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_GU; + } + else + { + /* Disable the MAC Global Unicast Wake-Up */ + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_GU; + } +} + +/** + * @brief Checks whether the specified ETHERNET PMT flag is set or not. + * @param ETH_PMT_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_PMT_FLAG_WUFFRPR : Wake-Up Frame Filter Register Poniter Reset + * @arg ETH_PMT_FLAG_WUFR : Wake-Up Frame Received + * @arg ETH_PMT_FLAG_MPR : Magic Packet Received + * @retval : The new state of ETHERNET PMT Flag (SET or RESET). + */ +FlagStatus ETH_GetPMTFlagStatus(uint32_t ETH_PMT_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_PMT_GET_FLAG(ETH_PMT_FLAG)); + + if ((ETH->MACPMTCSR & ETH_PMT_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Enables or disables the MAC Wake-Up Frame Detection. + * @param NewState: new state of the MAC Wake-Up Frame Detection. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_WakeUpFrameDetectionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC Wake-Up Frame Detection */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_WFE; + } + else + { + /* Disable the MAC Wake-Up Frame Detection */ + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_WFE; + } +} + +/** + * @brief Enables or disables the MAC Magic Packet Detection. + * @param NewState: new state of the MAC Magic Packet Detection. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MagicPacketDetectionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC Magic Packet Detection */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_MPE; + } + else + { + /* Disable the MAC Magic Packet Detection */ + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_MPE; + } +} + +/** + * @brief Enables or disables the MAC Power Down. + * @param NewState: new state of the MAC Power Down. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_PowerDownCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC Power Down */ + /* This puts the MAC in power down mode */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_PD; + } + else + { + /* Disable the MAC Power Down */ + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_PD; + } +} + +/*--------------------------------- MMC ------------------------------------*/ +/** + * @brief Enables or disables the MMC Counter Freeze. + * @param NewState: new state of the MMC Counter Freeze. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MMCCounterFreezeCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MMC Counter Freeze */ + ETH->MMCCR |= ETH_MMCCR_MCF; + } + else + { + /* Disable the MMC Counter Freeze */ + ETH->MMCCR &= ~ETH_MMCCR_MCF; + } +} + +/** + * @brief Enables or disables the MMC Reset On Read. + * @param NewState: new state of the MMC Reset On Read. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MMCResetOnReadCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MMC Counter reset on read */ + ETH->MMCCR |= ETH_MMCCR_ROR; + } + else + { + /* Disable the MMC Counter reset on read */ + ETH->MMCCR &= ~ETH_MMCCR_ROR; + } +} + +/** + * @brief Enables or disables the MMC Counter Stop Rollover. + * @param NewState: new state of the MMC Counter Stop Rollover. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MMCCounterRolloverCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Disable the MMC Counter Stop Rollover */ + ETH->MMCCR &= ~ETH_MMCCR_CSR; + } + else + { + /* Enable the MMC Counter Stop Rollover */ + ETH->MMCCR |= ETH_MMCCR_CSR; + } +} + +/** + * @brief Resets the MMC Counters. + * @param None + * @retval : None + */ +void ETH_MMCCountersReset(void) +{ + /* Resets the MMC Counters */ + ETH->MMCCR |= ETH_MMCCR_CR; +} + +/** + * @brief Enables or disables the specified ETHERNET MMC interrupts. + * @param ETH_MMC_IT: specifies the ETHERNET MMC interrupt + * sources to be enabled or disabled. + * This parameter can be any combination of Tx interrupt or + * any combination of Rx interrupt (but not both)of the following values: + * @arg ETH_MMC_IT_TGF : When Tx good frame counter reaches half the maximum value + * @arg ETH_MMC_IT_TGFMSC: When Tx good multi col counter reaches half the maximum value + * @arg ETH_MMC_IT_TGFSC : When Tx good single col counter reaches half the maximum value + * @arg ETH_MMC_IT_RGUF : When Rx good unicast frames counter reaches half the maximum value + * @arg ETH_MMC_IT_RFAE : When Rx alignment error counter reaches half the maximum value + * @arg ETH_MMC_IT_RFCE : When Rx crc error counter reaches half the maximum value + * @param NewState: new state of the specified ETHERNET MMC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MMCITConfig(uint32_t ETH_MMC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ETH_MMC_IT(ETH_MMC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if ((ETH_MMC_IT & (uint32_t)0x10000000) != (uint32_t)RESET) + { + /* Remove egister mak from IT */ + ETH_MMC_IT &= 0xEFFFFFFF; + + /* ETHERNET MMC Rx interrupts selected */ + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET MMC interrupts */ + ETH->MMCRIMR &=(~(uint32_t)ETH_MMC_IT); + } + else + { + /* Disable the selected ETHERNET MMC interrupts */ + ETH->MMCRIMR |= ETH_MMC_IT; + } + } + else + { + /* ETHERNET MMC Tx interrupts selected */ + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET MMC interrupts */ + ETH->MMCTIMR &=(~(uint32_t)ETH_MMC_IT); + } + else + { + /* Disable the selected ETHERNET MMC interrupts */ + ETH->MMCTIMR |= ETH_MMC_IT; + } + } +} + +/** + * @brief Checks whether the specified ETHERNET MMC IT is set or not. + * @param ETH_MMC_IT: specifies the ETHERNET MMC interrupt. + * This parameter can be one of the following values: + * @arg ETH_MMC_IT_TxFCGC: When Tx good frame counter reaches half the maximum value + * @arg ETH_MMC_IT_TxMCGC: When Tx good multi col counter reaches half the maximum value + * @arg ETH_MMC_IT_TxSCGC: When Tx good single col counter reaches half the maximum value + * @arg ETH_MMC_IT_RxUGFC: When Rx good unicast frames counter reaches half the maximum value + * @arg ETH_MMC_IT_RxAEC : When Rx alignment error counter reaches half the maximum value + * @arg ETH_MMC_IT_RxCEC : When Rx crc error counter reaches half the maximum value + * @retval : The value of ETHERNET MMC IT (SET or RESET). + */ +ITStatus ETH_GetMMCITStatus(uint32_t ETH_MMC_IT) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_MMC_GET_IT(ETH_MMC_IT)); + + if ((ETH_MMC_IT & (uint32_t)0x10000000) != (uint32_t)RESET) + { + /* ETHERNET MMC Rx interrupts selected */ + /* Check if the ETHERNET MMC Rx selected interrupt is enabled and occured */ + if ((((ETH->MMCRIR & ETH_MMC_IT) != (uint32_t)RESET)) && ((ETH->MMCRIMR & ETH_MMC_IT) != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else + { + /* ETHERNET MMC Tx interrupts selected */ + /* Check if the ETHERNET MMC Tx selected interrupt is enabled and occured */ + if ((((ETH->MMCTIR & ETH_MMC_IT) != (uint32_t)RESET)) && ((ETH->MMCRIMR & ETH_MMC_IT) != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + + return bitstatus; +} + +/** + * @brief Get the specified ETHERNET MMC register value. + * @param ETH_MMCReg: specifies the ETHERNET MMC register. + * This parameter can be one of the following values: + * @arg ETH_MMCCR : MMC CR register + * @arg ETH_MMCRIR : MMC RIR register + * @arg ETH_MMCTIR : MMC TIR register + * @arg ETH_MMCRIMR : MMC RIMR register + * @arg ETH_MMCTIMR : MMC TIMR register + * @arg ETH_MMCTGFSCCR : MMC TGFSCCR register + * @arg ETH_MMCTGFMSCCR: MMC TGFMSCCR register + * @arg ETH_MMCTGFCR : MMC TGFCR register + * @arg ETH_MMCRFCECR : MMC RFCECR register + * @arg ETH_MMCRFAECR : MMC RFAECR register + * @arg ETH_MMCRGUFCR : MMC RGUFCRregister + * @retval : The value of ETHERNET MMC Register value. + */ +uint32_t ETH_GetMMCRegister(uint32_t ETH_MMCReg) +{ + /* Check the parameters */ + assert_param(IS_ETH_MMC_REGISTER(ETH_MMCReg)); + + /* Return the selected register value */ + return (*(__IO uint32_t *)(ETH_MAC_BASE + ETH_MMCReg)); +} +/*--------------------------------- PTP ------------------------------------*/ + +/** + * @brief Updated the PTP block for fine correction with the Time Stamp + * Addend register value. + * @param None + * @retval : None + */ +void ETH_EnablePTPTimeStampAddend(void) +{ + /* Enable the PTP block update with the Time Stamp Addend register value */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSARU; +} + +/** + * @brief Enable the PTP Time Stamp interrupt trigger + * @param None + * @retval : None + */ +void ETH_EnablePTPTimeStampInterruptTrigger(void) +{ + /* Enable the PTP target time interrupt */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSITE; +} + +/** + * @brief Updated the PTP system time with the Time Stamp Update register + * value. + * @param None + * @retval : None + */ +void ETH_EnablePTPTimeStampUpdate(void) +{ + /* Enable the PTP system time update with the Time Stamp Update register value */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSSTU; +} + +/** + * @brief Initialize the PTP Time Stamp + * @param None + * @retval : None + */ +void ETH_InitializePTPTimeStamp(void) +{ + /* Initialize the PTP Time Stamp */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSSTI; +} + +/** + * @brief Selects the PTP Update method + * @param UpdateMethod: the PTP Update method + * This parameter can be one of the following values: + * @arg ETH_PTP_FineUpdate : Fine Update method + * @arg ETH_PTP_CoarseUpdate : Coarse Update method + * @retval : None + */ +void ETH_PTPUpdateMethodConfig(uint32_t UpdateMethod) +{ + /* Check the parameters */ + assert_param(IS_ETH_PTP_UPDATE(UpdateMethod)); + + if (UpdateMethod != ETH_PTP_CoarseUpdate) + { + /* Enable the PTP Fine Update method */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSFCU; + } + else + { + /* Disable the PTP Coarse Update method */ + ETH->PTPTSCR &= (~(uint32_t)ETH_PTPTSCR_TSFCU); + } +} + +/** + * @brief Enables or disables the PTP time stamp for transmit and receive frames. + * @param NewState: new state of the PTP time stamp for transmit and receive frames + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_PTPTimeStampCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the PTP time stamp for transmit and receive frames */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSE; + } + else + { + /* Disable the PTP time stamp for transmit and receive frames */ + ETH->PTPTSCR &= (~(uint32_t)ETH_PTPTSCR_TSE); + } +} + +/** + * @brief Checks whether the specified ETHERNET PTP flag is set or not. + * @param ETH_PTP_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_PTP_FLAG_TSARU : Addend Register Update + * @arg ETH_PTP_FLAG_TSITE : Time Stamp Interrupt Trigger Enable + * @arg ETH_PTP_FLAG_TSSTU : Time Stamp Update + * @arg ETH_PTP_FLAG_TSSTI : Time Stamp Initialize + * @retval : The new state of ETHERNET PTP Flag (SET or RESET). + */ +FlagStatus ETH_GetPTPFlagStatus(uint32_t ETH_PTP_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_PTP_GET_FLAG(ETH_PTP_FLAG)); + + if ((ETH->PTPTSCR & ETH_PTP_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Sets the system time Sub-Second Increment value. + * @param SubSecondValue: specifies the PTP Sub-Second Increment Register value. + * @retval : None + */ +void ETH_SetPTPSubSecondIncrement(uint32_t SubSecondValue) +{ + /* Check the parameters */ + assert_param(IS_ETH_PTP_SUBSECOND_INCREMENT(SubSecondValue)); + /* Set the PTP Sub-Second Increment Register */ + ETH->PTPSSIR = SubSecondValue; +} + +/** + * @brief Sets the Time Stamp update sign and values. + * @param Sign: specifies the PTP Time update value sign. + * This parameter can be one of the following values: + * @arg ETH_PTP_PositiveTime : positive time value. + * @arg ETH_PTP_NegativeTime : negative time value. + * @param SecondValue: specifies the PTP Time update second value. + * @param SubSecondValue: specifies the PTP Time update sub-second value. + * this is a 31 bit value. bit32 correspond to the sign. + * @retval : None + */ +void ETH_SetPTPTimeStampUpdate(uint32_t Sign, uint32_t SecondValue, uint32_t SubSecondValue) +{ + /* Check the parameters */ + assert_param(IS_ETH_PTP_TIME_SIGN(Sign)); + assert_param(IS_ETH_PTP_TIME_STAMP_UPDATE_SUBSECOND(SubSecondValue)); + /* Set the PTP Time Update High Register */ + ETH->PTPTSHUR = SecondValue; + + /* Set the PTP Time Update Low Register with sign */ + ETH->PTPTSLUR = Sign | SubSecondValue; +} + +/** + * @brief Sets the Time Stamp Addend value. + * @param Value: specifies the PTP Time Stamp Addend Register value. + * @retval : None + */ +void ETH_SetPTPTimeStampAddend(uint32_t Value) +{ + /* Set the PTP Time Stamp Addend Register */ + ETH->PTPTSAR = Value; +} + +/** + * @brief Sets the Target Time registers values. + * @param HighValue: specifies the PTP Target Time High Register value. + * @param LowValue: specifies the PTP Target Time Low Register value. + * @retval : None + */ +void ETH_SetPTPTargetTime(uint32_t HighValue, uint32_t LowValue) +{ + /* Set the PTP Target Time High Register */ + ETH->PTPTTHR = HighValue; + /* Set the PTP Target Time Low Register */ + ETH->PTPTTLR = LowValue; +} + +/** + * @brief Get the specified ETHERNET PTP register value. + * @param ETH_PTPReg: specifies the ETHERNET PTP register. + * This parameter can be one of the following values: + * @arg ETH_PTPTSCR : Sub-Second Increment Register + * @arg ETH_PTPSSIR : Sub-Second Increment Register + * @arg ETH_PTPTSHR : Time Stamp High Register + * @arg ETH_PTPTSLR : Time Stamp Low Register + * @arg ETH_PTPTSHUR : Time Stamp High Update Register + * @arg ETH_PTPTSLUR : Time Stamp Low Update Register + * @arg ETH_PTPTSAR : Time Stamp Addend Register + * @arg ETH_PTPTTHR : Target Time High Register + * @arg ETH_PTPTTLR : Target Time Low Register + * @retval : The value of ETHERNET PTP Register value. + */ +uint32_t ETH_GetPTPRegister(uint32_t ETH_PTPReg) +{ + /* Check the parameters */ + assert_param(IS_ETH_PTP_REGISTER(ETH_PTPReg)); + + /* Return the selected register value */ + return (*(__IO uint32_t *)(ETH_MAC_BASE + ETH_PTPReg)); +} + +/** + * @brief Initializes the DMA Tx descriptors in chain mode with PTP. + * @param DMATxDescTab: Pointer on the first Tx desc list + * @param DMAPTPTxDescTab: Pointer on the first PTP Tx desc list + * @param TxBuff: Pointer on the first TxBuffer list + * @param TxBuffCount: Number of the used Tx desc in the list + * @retval : None + */ +void ETH_DMAPTPTxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, ETH_DMADESCTypeDef *DMAPTPTxDescTab, uint8_t* TxBuff, uint32_t TxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMATxDesc; + + /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */ + DMATxDescToSet = DMATxDescTab; + DMAPTPTxDescToSet = DMAPTPTxDescTab; + /* Fill each DMATxDesc descriptor with the right values */ + for(i=0; i < TxBuffCount; i++) + { + /* Get the pointer on the ith member of the Tx Desc list */ + DMATxDesc = DMATxDescTab+i; + /* Set Second Address Chained bit and enable PTP */ + DMATxDesc->Status = ETH_DMATxDesc_TCH | ETH_DMATxDesc_TTSE; + + /* Set Buffer1 address pointer */ + DMATxDesc->Buffer1Addr =(uint32_t)(&TxBuff[i*ETH_MAX_PACKET_SIZE]); + + /* Initialize the next descriptor with the Next Desciptor Polling Enable */ + if(i < (TxBuffCount-1)) + { + /* Set next descriptor address register with next descriptor base address */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t)(DMATxDescTab+i+1); + } + else + { + /* For last descriptor, set next descriptor address register equal to the first descriptor base address */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t) DMATxDescTab; + } + /* make DMAPTPTxDescTab points to the same addresses as DMATxDescTab */ + (&DMAPTPTxDescTab[i])->Buffer1Addr = DMATxDesc->Buffer1Addr; + (&DMAPTPTxDescTab[i])->Buffer2NextDescAddr = DMATxDesc->Buffer2NextDescAddr; + } + /* Store on the last DMAPTPTxDescTab desc status record the first list address */ + (&DMAPTPTxDescTab[i-1])->Status = (uint32_t) DMAPTPTxDescTab; + + /* Set Transmit Desciptor List Address Register */ + ETH->DMATDLAR = (uint32_t) DMATxDescTab; +} + +/** + * @brief Initializes the DMA Rx descriptors in chain mode. + * @param DMARxDescTab: Pointer on the first Rx desc list + * @param DMAPTPRxDescTab: Pointer on the first PTP Rx desc list + * @param RxBuff: Pointer on the first RxBuffer list + * @param RxBuffCount: Number of the used Rx desc in the list + * @retval : None + */ +void ETH_DMAPTPRxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, ETH_DMADESCTypeDef *DMAPTPRxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMARxDesc; + + /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */ + DMARxDescToGet = DMARxDescTab; + DMAPTPRxDescToGet = DMAPTPRxDescTab; + /* Fill each DMARxDesc descriptor with the right values */ + for(i=0; i < RxBuffCount; i++) + { + /* Get the pointer on the ith member of the Rx Desc list */ + DMARxDesc = DMARxDescTab+i; + /* Set Own bit of the Rx descriptor Status */ + DMARxDesc->Status = ETH_DMARxDesc_OWN; + + /* Set Buffer1 size and Second Address Chained bit */ + DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_MAX_PACKET_SIZE; + /* Set Buffer1 address pointer */ + DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff[i*ETH_MAX_PACKET_SIZE]); + + /* Initialize the next descriptor with the Next Desciptor Polling Enable */ + if(i < (RxBuffCount-1)) + { + /* Set next descriptor address register with next descriptor base address */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab+i+1); + } + else + { + /* For last descriptor, set next descriptor address register equal to the first descriptor base address */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab); + } + /* Make DMAPTPRxDescTab points to the same addresses as DMARxDescTab */ + (&DMAPTPRxDescTab[i])->Buffer1Addr = DMARxDesc->Buffer1Addr; + (&DMAPTPRxDescTab[i])->Buffer2NextDescAddr = DMARxDesc->Buffer2NextDescAddr; + } + /* Store on the last DMAPTPRxDescTab desc status record the first list address */ + (&DMAPTPRxDescTab[i-1])->Status = (uint32_t) DMAPTPRxDescTab; + + /* Set Receive Desciptor List Address Register */ + ETH->DMARDLAR = (uint32_t) DMARxDescTab; +} + +/** + * @brief Transmits a packet, from application buffer, pointed by ppkt with + * Time Stamp values. + * @param ppkt: pointer to application packet buffer to transmit. + * @param FrameLength: Tx Packet size. + * @param PTPTxTab: Pointer on the first PTP Tx table to store Time stamp values. + * @retval : ETH_ERROR: in case of Tx desc owned by DMA + * ETH_SUCCESS: for correct transmission + */ +uint32_t ETH_HandlePTPTxPkt(uint8_t *ppkt, uint16_t FrameLength, uint32_t *PTPTxTab) +{ + uint32_t offset = 0, timeout = 0; + /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */ + if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (uint32_t)RESET) + { + /* Return ERROR: OWN bit set */ + return ETH_ERROR; + } + /* Copy the frame to be sent into memory pointed by the current ETHERNET DMA Tx descriptor */ + for(offset=0; offsetBuffer1Addr) + offset)) = (*(ppkt + offset)); + } + /* Setting the Frame Length: bits[12:0] */ + DMATxDescToSet->ControlBufferSize = (FrameLength & (uint32_t)0x1FFF); + /* Setting the last segment and first segment bits (in this case a frame is transmitted in one descriptor) */ + DMATxDescToSet->Status |= ETH_DMATxDesc_LS | ETH_DMATxDesc_FS; + /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMATxDescToSet->Status |= ETH_DMATxDesc_OWN; + /* When Tx Buffer unavailable flag is set: clear it and resume transmission */ + if ((ETH->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET) + { + /* Clear TBUS ETHERNET DMA flag */ + ETH->DMASR = ETH_DMASR_TBUS; + /* Resume DMA transmission*/ + ETH->DMATPDR = 0; + } + /* Wait for ETH_DMATxDesc_TTSS flag to be set */ + do + { + timeout++; + } while (!(DMATxDescToSet->Status & ETH_DMATxDesc_TTSS) && (timeout < 0xFFFF)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_READ_TO) + { + return ETH_ERROR; + } + /* Clear the DMATxDescToSet status register TTSS flag */ + DMATxDescToSet->Status &= ~ETH_DMATxDesc_TTSS; + *PTPTxTab++ = DMATxDescToSet->Buffer1Addr; + *PTPTxTab = DMATxDescToSet->Buffer2NextDescAddr; + /* Update the ENET DMA current descriptor */ + /* Chained Mode */ + if((DMATxDescToSet->Status & ETH_DMATxDesc_TCH) != (uint32_t)RESET) + { + /* Selects the next DMA Tx descriptor list for next buffer read */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) (DMAPTPTxDescToSet->Buffer2NextDescAddr); + if(DMAPTPTxDescToSet->Status != 0) + { + DMAPTPTxDescToSet = (ETH_DMADESCTypeDef*) (DMAPTPTxDescToSet->Status); + } + else + { + DMAPTPTxDescToSet++; + } + } + else /* Ring Mode */ + { + if((DMATxDescToSet->Status & ETH_DMATxDesc_TER) != (uint32_t)RESET) + { + /* Selects the next DMA Tx descriptor list for next buffer read: this will + be the first Tx descriptor in this case */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) (ETH->DMATDLAR); + DMAPTPTxDescToSet = (ETH_DMADESCTypeDef*) (ETH->DMATDLAR); + } + else + { + /* Selects the next DMA Tx descriptor list for next buffer read */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) ((uint32_t)DMATxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + DMAPTPTxDescToSet = (ETH_DMADESCTypeDef*) ((uint32_t)DMAPTPTxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** + * @brief Receives a packet and copies it to memory pointed by ppkt with + * Time Stamp values. + * @param ppkt: pointer to application packet receive buffer. + * @param PTPRxTab: Pointer on the first PTP Rx table to store Time stamp values. + * @retval : ETH_ERROR: if there is error in reception + * framelength: received packet size if packet reception is correct + */ +uint32_t ETH_HandlePTPRxPkt(uint8_t *ppkt, uint32_t *PTPRxTab) +{ + uint32_t offset = 0, framelength = 0; + /* Check if the descriptor is owned by the ENET or CPU */ + if((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) != (uint32_t)RESET) + { + /* Return error: OWN bit set */ + return ETH_ERROR; + } + if(((DMARxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)) + { + /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */ + framelength = ((DMARxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARxDesc_FrameLengthShift) - 4; + /* Copy the received frame into buffer from memory pointed by the current ETHERNET DMA Rx descriptor */ + for(offset=0; offsetBuffer1Addr) + offset)); + } + } + else + { + /* Return ERROR */ + framelength = ETH_ERROR; + } + /* When Rx Buffer unavailable flag is set: clear it and resume reception */ + if ((ETH->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET) + { + /* Clear RBUS ETHERNET DMA flag */ + ETH->DMASR = ETH_DMASR_RBUS; + /* Resume DMA reception */ + ETH->DMARPDR = 0; + } + *PTPRxTab++ = DMARxDescToGet->Buffer1Addr; + *PTPRxTab = DMARxDescToGet->Buffer2NextDescAddr; + /* Set Own bit of the Rx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMARxDescToGet->Status |= ETH_DMARxDesc_OWN; + /* Update the ETHERNET DMA global Rx descriptor with next Rx decriptor */ + /* Chained Mode */ + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RCH) != (uint32_t)RESET) + { + /* Selects the next DMA Rx descriptor list for next buffer read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMAPTPRxDescToGet->Buffer2NextDescAddr); + if(DMAPTPRxDescToGet->Status != 0) + { + DMAPTPRxDescToGet = (ETH_DMADESCTypeDef*) (DMAPTPRxDescToGet->Status); + } + else + { + DMAPTPRxDescToGet++; + } + } + else /* Ring Mode */ + { + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RER) != (uint32_t)RESET) + { + /* Selects the first DMA Rx descriptor for next buffer to read: last Rx descriptor was used */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (ETH->DMARDLAR); + } + else + { + /* Selects the next DMA Rx descriptor list for next buffer to read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) ((uint32_t)DMARxDescToGet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + /* Return Frame Length/ERROR */ + return (framelength); +} +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/uip/clock-arch.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/uip/clock-arch.c new file mode 100644 index 00000000..d8225115 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/uip/clock-arch.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: clock-arch.c,v 1.2 2006/06/12 08:00:31 adam Exp $ + */ + +/** + * \file + * Implementation of architecture-specific clock functionality + * \author + * Adam Dunkels + */ + +#include "clock-arch.h" +#include "header.h" + +/*---------------------------------------------------------------------------*/ +clock_time_t +clock_time(void) +{ + return (clock_time_t)TimerGet(); +} +/*---------------------------------------------------------------------------*/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/uip/clock-arch.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/uip/clock-arch.h new file mode 100644 index 00000000..aa97f0e7 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/uip/clock-arch.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: clock-arch.h,v 1.2 2006/06/12 08:00:31 adam Exp $ + */ + +#ifndef __CLOCK_ARCH_H__ +#define __CLOCK_ARCH_H__ + +typedef int clock_time_t; +#define CLOCK_CONF_SECOND 1000 + +#endif /* __CLOCK_ARCH_H__ */ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/uip/netdev.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/uip/netdev.c new file mode 100644 index 00000000..3ce42bdf --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/uip/netdev.c @@ -0,0 +1,442 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Author: Adam Dunkels + * + * $Id: netdev.c,v 1.8 2006/06/07 08:39:58 adam Exp $ + */ + + +/*---------------------------------------------------------------------------*/ +#include "uip.h" +#include "uip_arp.h" +#include "header.h" +#include "stm32_eth.h" /* STM32 ethernet library */ +#include /* for memcpy */ + + +/*---------------------------------------------------------------------------*/ +#define NETDEV_DEFAULT_MACADDR0 (0x08) +#define NETDEV_DEFAULT_MACADDR1 (0x00) +#define NETDEV_DEFAULT_MACADDR2 (0x27) +#define NETDEV_DEFAULT_MACADDR3 (0x69) +#define NETDEV_DEFAULT_MACADDR4 (0x5B) +#define NETDEV_DEFAULT_MACADDR5 (0x45) + + +/*---------------------------------------------------------------------------*/ +static void netdev_TxDscrInit(void); +static void netdev_RxDscrInit(void); + +/*---------------------------------------------------------------------------*/ +typedef union _TranDesc0_t +{ + uint32_t Data; + struct { + uint32_t DB : 1; + uint32_t UF : 1; + uint32_t ED : 1; + uint32_t CC : 4; + uint32_t VF : 1; + uint32_t EC : 1; + uint32_t LC : 1; + uint32_t NC : 1; + uint32_t LSC : 1; + uint32_t IPE : 1; + uint32_t FF : 1; + uint32_t JT : 1; + uint32_t ES : 1; + uint32_t IHE : 1; + uint32_t : 3; + uint32_t TCH : 1; + uint32_t TER : 1; + uint32_t CIC : 2; + uint32_t : 2; + uint32_t DP : 1; + uint32_t DC : 1; + uint32_t FS : 1; + uint32_t LSEG : 1; + uint32_t IC : 1; + uint32_t OWN : 1; + }; +} TranDesc0_t, * pTranDesc0_t; + +typedef union _TranDesc1_t +{ + uint32_t Data; + struct { + uint32_t TBS1 :13; + uint32_t : 3; + uint32_t TBS2 :12; + uint32_t : 3; + }; +} TranDesc1_t, * pTranDesc1_t; + +typedef union _RecDesc0_t +{ + uint32_t Data; + struct { + uint32_t RMAM_PCE : 1; + uint32_t CE : 1; + uint32_t DE : 1; + uint32_t RE : 1; + uint32_t RWT : 1; + uint32_t FT : 1; + uint32_t LC : 1; + uint32_t IPHCE : 1; + uint32_t LS : 1; + uint32_t FS : 1; + uint32_t VLAN : 1; + uint32_t OE : 1; + uint32_t LE : 1; + uint32_t SAF : 1; + uint32_t DERR : 1; + uint32_t ES : 1; + uint32_t FL :14; + uint32_t AFM : 1; + uint32_t OWN : 1; + }; +} RecDesc0_t, * pRecDesc0_t; + +typedef union _recDesc1_t +{ + uint32_t Data; + struct { + uint32_t RBS1 :13; + uint32_t : 1; + uint32_t RCH : 1; + uint32_t RER : 1; + uint32_t RBS2 :14; + uint32_t DIC : 1; + }; +} RecDesc1_t, * pRecDesc1_t; + +typedef union _EnetDmaDesc_t +{ + uint32_t Data[4]; + // Rx DMA descriptor + struct + { + RecDesc0_t RxDesc0; + RecDesc1_t RxDesc1; + uint32_t * pBuffer; + union + { + uint32_t * pBuffer2; + union _EnetDmaDesc_t * pEnetDmaNextDesc; + }; + } Rx; + // Tx DMA descriptor + struct + { + TranDesc0_t TxDesc0; + TranDesc1_t TxDesc1; + uint32_t * pBuffer1; + union + { + uint32_t * pBuffer2; + union _EnetDmaDesc_t * pEnetDmaNextDesc; + }; + } Tx; +} EnetDmaDesc_t, * pEnetDmaDesc_t; + + +/*---------------------------------------------------------------------------*/ +uint8_t RxBuff[UIP_CONF_BUFFER_SIZE] __attribute__ ((aligned (4))); +uint8_t TxBuff[UIP_CONF_BUFFER_SIZE] __attribute__ ((aligned (4))); + +EnetDmaDesc_t EnetDmaRx __attribute__((aligned (128))); +EnetDmaDesc_t EnetDmaTx __attribute__ ((aligned (128))); + + +/*---------------------------------------------------------------------------*/ +void netdev_init(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + ETH_InitTypeDef ETH_InitStructure; + + /* Enable ETHERNET clocks */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx | + RCC_AHB1Periph_ETH_MAC_Rx | RCC_AHB1Periph_ETH_MAC_PTP, ENABLE); + + + /* Enable GPIOs clocks */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | + RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOG, ENABLE); + + /* Enable SYSCFG clock */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); + /*Select RMII Interface*/ + SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII); + + /* ETHERNET pins configuration */ + /* PA + ETH_RMII_REF_CLK: PA1 + ETH_RMII_MDIO: PA2 + ETH_RMII_MDINT: PA3 + ETH_RMII_CRS_DV: PA7 + */ + + /* Configure PA1, PA2, PA3 and PA7*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + /* Connect PA1, PA2, PA3 and PA7 to ethernet module*/ + GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH); + + /* PB + ETH_RMII_TX_EN: PG11 + */ + + /* Configure PG11*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOG, &GPIO_InitStructure); + + /* Connect PG11 to ethernet module*/ + GPIO_PinAFConfig(GPIOG, GPIO_PinSource11, GPIO_AF_ETH); + + /* PC + ETH_RMII_MDC: PC1 + ETH_RMII_RXD0: PC4 + ETH_RMII_RXD1: PC5 + */ + + /* Configure PC1, PC4 and PC5*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + /* Connect PC1, PC4 and PC5 to ethernet module*/ + GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH); + + /* PG + ETH_RMII_TXD0: PG13 + ETH_RMII_TXD1: PG14 + */ + + /* Configure PG13 and PG14*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOG, &GPIO_InitStructure); + + /* Connect PG13 and PG14 to ethernet module*/ + GPIO_PinAFConfig(GPIOG, GPIO_PinSource13, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOG, GPIO_PinSource14, GPIO_AF_ETH); + + /* Reset ETHERNET on AHB Bus */ + ETH_DeInit(); + + /* Software reset */ + ETH_SoftwareReset(); + + /* Wait for software reset */ + while(ETH_GetSoftwareResetStatus()==SET); + + /* ETHERNET Configuration ------------------------------------------------------*/ + /* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */ + ETH_StructInit(Ð_InitStructure); + + /* Fill ETH_InitStructure parametrs */ + /*------------------------ MAC -----------------------------------*/ + ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable ; + ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable; + ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable; + ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable; + ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Enable; + ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable; + ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable; + ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect; + ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect; + ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex; + ETH_InitStructure.ETH_Speed = ETH_Speed_100M; + + unsigned int PhyAddr; + union { + uint32_t HI_LO; + struct + { + uint16_t LO; + uint16_t HI; + }; + } PHYID; + for(PhyAddr = 0; 32 > PhyAddr; PhyAddr++) + { + // datasheet for the ks8721bl ethernet controller (http://www.micrel.com/_PDF/Ethernet/datasheets/ks8721bl-sl.pdf) + // page 20 --> PHY Identifier 1 and 2 + PHYID.HI = ETH_ReadPHYRegister(PhyAddr,2); // 0x0022 + PHYID.LO = ETH_ReadPHYRegister(PhyAddr,3); // 0x1619 + if ((0x00221619 == PHYID.HI_LO) || (0x0007C0F1 == PHYID.HI_LO)) + break; + } + /* Configure Ethernet */ + ETH_Init(Ð_InitStructure, PhyAddr); + + netdev_TxDscrInit(); + netdev_RxDscrInit(); + ETH_Start(); +} + + +/*---------------------------------------------------------------------------*/ +void netdev_init_mac(void) +{ + struct uip_eth_addr macAddress; + + /* set the default MAC address */ + macAddress.addr[0] = NETDEV_DEFAULT_MACADDR0; + macAddress.addr[1] = NETDEV_DEFAULT_MACADDR1; + macAddress.addr[2] = NETDEV_DEFAULT_MACADDR2; + macAddress.addr[3] = NETDEV_DEFAULT_MACADDR3; + macAddress.addr[4] = NETDEV_DEFAULT_MACADDR4; + macAddress.addr[5] = NETDEV_DEFAULT_MACADDR5; + uip_setethaddr(macAddress); +} + + +/*---------------------------------------------------------------------------*/ +unsigned int netdev_read(void) +{ + uint32_t size; + /*check for validity*/ + if(0 == EnetDmaRx.Rx.RxDesc0.OWN) + { + /*Get the size of the packet*/ + size = EnetDmaRx.Rx.RxDesc0.FL; // CRC + memcpy(uip_buf, RxBuff, size); //string.h library*/ + } + else + { + return 0; + } + /* Give the buffer back to ENET */ + EnetDmaRx.Rx.RxDesc0.OWN = 1; + /* Start the receive operation */ + ETH->DMARPDR = 1; + /* Return no error */ + return size; +} + + +/*---------------------------------------------------------------------------*/ +void netdev_send(void) +{ + while(EnetDmaTx.Tx.TxDesc0.OWN); + + /* Copy the application buffer to the driver buffer + Using this MEMCOPY_L2L_BY4 makes the copy routine faster + than memcpy */ + memcpy(TxBuff, uip_buf, uip_len); + + /* Assign ENET address to Temp Tx Array */ + EnetDmaTx.Tx.pBuffer1 = (uint32_t *)TxBuff; + + /* Setting the Frame Length*/ + EnetDmaTx.Tx.TxDesc0.Data = 0; + EnetDmaTx.Tx.TxDesc0.TCH = 1; + EnetDmaTx.Tx.TxDesc0.LSEG = 1; + EnetDmaTx.Tx.TxDesc0.FS = 1; + EnetDmaTx.Tx.TxDesc0.DC = 0; + EnetDmaTx.Tx.TxDesc0.DP = 0; + + EnetDmaTx.Tx.TxDesc1.Data = 0; + EnetDmaTx.Tx.TxDesc1.TBS1 = (uip_len&0xFFF); + + /* Start the ENET by setting the VALID bit in dmaPackStatus of current descr*/ + EnetDmaTx.Tx.TxDesc0.OWN = 1; + + /* Start the transmit operation */ + ETH->DMATPDR = 1; +} + + +/*---------------------------------------------------------------------------*/ +static void netdev_RxDscrInit(void) +{ + /* Initialization */ + /* Assign temp Rx array to the ENET buffer */ + EnetDmaRx.Rx.pBuffer = (uint32_t *)RxBuff; + + /* Initialize RX ENET Status and control */ + EnetDmaRx.Rx.RxDesc0.Data = 0; + + /* Initialize the next descriptor- In our case its single descriptor */ + EnetDmaRx.Rx.pEnetDmaNextDesc = &EnetDmaRx; + + EnetDmaRx.Rx.RxDesc1.Data = 0; + EnetDmaRx.Rx.RxDesc1.RER = 0; // end of ring + EnetDmaRx.Rx.RxDesc1.RCH = 1; // end of ring + + /* Set the max packet size */ + EnetDmaRx.Rx.RxDesc1.RBS1 = UIP_CONF_BUFFER_SIZE; + + /* Setting the VALID bit */ + EnetDmaRx.Rx.RxDesc0.OWN = 1; + /* Setting the RX NEXT Descriptor Register inside the ENET */ + ETH->DMARDLAR = (uint32_t)&EnetDmaRx; +} + + +/*---------------------------------------------------------------------------*/ +static void netdev_TxDscrInit(void) +{ + /* ENET Start Address */ + EnetDmaTx.Tx.pBuffer1 = (uint32_t *)TxBuff; + + /* Next Descriptor Address */ + EnetDmaTx.Tx.pEnetDmaNextDesc = &EnetDmaTx; + + /* Initialize ENET status and control */ + EnetDmaTx.Tx.TxDesc0.TCH = 1; + EnetDmaTx.Tx.TxDesc0.Data = 0; + EnetDmaTx.Tx.TxDesc1.Data = 0; + /* Tx next set to Tx descriptor base */ + ETH->DMATDLAR = (uint32_t)&EnetDmaTx; + +} diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/uip/netdev.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/uip/netdev.h new file mode 100644 index 00000000..4ea59ce5 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/uip/netdev.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Adam Dunkels. + * 4. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: netdev.h,v 1.1 2002/01/10 06:22:56 adam Exp $ + * + */ + +#ifndef __NETDEV_H__ +#define __NETDEV_H__ + +void netdev_init(void); +void netdev_init_mac(void); +unsigned int netdev_read(void); +void netdev_send(void); + +#endif /* __NETDEV_H__ */ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/uip/uip-conf.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/uip/uip-conf.h new file mode 100644 index 00000000..fd9ba0dd --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/lib/uip/uip-conf.h @@ -0,0 +1,151 @@ +/** + * \addtogroup uipopt + * @{ + */ + +/** + * \name Project-specific configuration options + * @{ + * + * uIP has a number of configuration options that can be overridden + * for each project. These are kept in a project-specific uip-conf.h + * file and all configuration names have the prefix UIP_CONF. + */ + +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: uip-conf.h,v 1.6 2006/06/12 08:00:31 adam Exp $ + */ + +/** + * \file + * An example uIP configuration file + * \author + * Adam Dunkels + */ + +#ifndef __UIP_CONF_H__ +#define __UIP_CONF_H__ + + +/** + * 8 bit datatype + * + * This typedef defines the 8-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef unsigned char u8_t; + +/** + * 16 bit datatype + * + * This typedef defines the 16-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef unsigned short u16_t; + +/** + * Statistics datatype + * + * This typedef defines the dataype used for keeping statistics in + * uIP. + * + * \hideinitializer + */ +typedef unsigned short uip_stats_t; + +/** + * Maximum number of TCP connections. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_CONNECTIONS 1 + +/** + * Maximum number of listening TCP ports. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_LISTENPORTS 1 + +/** + * uIP buffer size. + * + * \hideinitializer + */ +#define UIP_CONF_BUFFER_SIZE 1600 + +/** + * CPU byte order. + * + * \hideinitializer + */ +#define UIP_CONF_BYTE_ORDER LITTLE_ENDIAN + +/** + * Logging on or off + * + * \hideinitializer + */ +#define UIP_CONF_LOGGING 0 + +/** + * UDP support on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP 0 + +/** + * UDP checksums on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP_CHECKSUMS 1 + +/** + * uIP statistics on or off + * + * \hideinitializer + */ +#define UIP_CONF_STATISTICS 0 + +/* Here we include the header file for the application(s) we use in + our project. */ +#include "boot.h" +#include "net.h" + +#endif /* __UIP_CONF_H__ */ + +/** @} */ +/** @} */ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/main.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/main.c index 9658bea4..c0b2e668 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/main.c +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/main.c @@ -53,6 +53,8 @@ void main(void) { /* initialize the microcontroller */ Init(); + /* initialize the network application */ + NetInit(); /* initialize the bootloader interface */ BootComInit(); @@ -61,6 +63,8 @@ void main(void) { /* toggle LED with a fixed frequency */ LedToggle(); + /* run the network task */ + NetTask(); /* check for bootloader activation request */ BootComCheckActivationRequest(); } diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/memory.x b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/memory.x index e8d2c90f..63d40407 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/memory.x +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/memory.x @@ -1,7 +1,7 @@ MEMORY { UNPLACED_SECTIONS (wx) : ORIGIN = 0x100000000, LENGTH = 0 - FLASH (rx) : ORIGIN = 0x08008000, LENGTH = 0x00100000-0x8000 + FLASH (rx) : ORIGIN = 0x0800C000, LENGTH = 0x00100000-0xC000 DATA_SRAM (wx) : ORIGIN = 0x10000000, LENGTH = 0x00010000 SYSTEM (wx) : ORIGIN = 0x1fff0000, LENGTH = 0x00007a10 OPTION (wx) : ORIGIN = 0x1fffc000, LENGTH = 0x00000008 @@ -28,7 +28,7 @@ MEMORY SECTIONS { - __FLASH_segment_start__ = 0x08008000; + __FLASH_segment_start__ = 0x0800C000; __FLASH_segment_end__ = 0x08100000; __DATA_SRAM_segment_start__ = 0x10000000; __DATA_SRAM_segment_end__ = 0x10010000; diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/net.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/net.c new file mode 100644 index 00000000..39728207 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/net.c @@ -0,0 +1,211 @@ +/************************************************************************************//** +* \file Demo\ARMCM3_LM3S_EK_LM3S6965_IAR\Prog\net.c +* \brief Network application for the uIP TCP/IP stack. +* \ingroup Prog_ARMCM3_LM3S_EK_LM3S6965_IAR +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2014 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "header.h" /* generic header */ +#include "netdev.h" +#include "uip.h" +#include "uip_arp.h" + + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +/** \brief Delta time for the uIP periodic timer. */ +#define NET_UIP_PERIODIC_TIMER_MS (500) +/** \brief Delta time for the uIP ARP timer. */ +#define NET_UIP_ARP_TIMER_MS (10000) +/** \brief Macro for accessing the Ethernet header information in the buffer */ +#define NET_UIP_HEADER_BUF ((struct uip_eth_hdr *)&uip_buf[0]) + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/** \brief Holds the time out value of the uIP periodic timer. */ +static unsigned long periodicTimerTimeOut; +/** \brief Holds the time out value of the uIP ARP timer. */ +static unsigned long ARPTimerTimeOut; + + +/************************************************************************************//** +** \brief Initializes the TCP/IP network communication interface. +** \return none. +** +****************************************************************************************/ +void NetInit(void) +{ + uip_ipaddr_t ipaddr; + + /* initialize the network device */ + netdev_init(); + /* initialize the timer variables */ + periodicTimerTimeOut = TimerGet() + NET_UIP_PERIODIC_TIMER_MS; + ARPTimerTimeOut = TimerGet() + NET_UIP_ARP_TIMER_MS; + /* initialize the uIP TCP/IP stack. */ + uip_init(); + /* set the IP address */ + uip_ipaddr(ipaddr, BOOT_COM_NET_IPADDR0, BOOT_COM_NET_IPADDR1, BOOT_COM_NET_IPADDR2, + BOOT_COM_NET_IPADDR3); + uip_sethostaddr(ipaddr); + /* set the network mask */ + uip_ipaddr(ipaddr, BOOT_COM_NET_NETMASK0, BOOT_COM_NET_NETMASK1, BOOT_COM_NET_NETMASK2, + BOOT_COM_NET_NETMASK3); + uip_setnetmask(ipaddr); + /* set the gateway address */ + uip_ipaddr(ipaddr, BOOT_COM_NET_GATEWAY0, BOOT_COM_NET_GATEWAY1, BOOT_COM_NET_GATEWAY2, + BOOT_COM_NET_GATEWAY3); + uip_setdraddr(ipaddr); + /* start listening on the configured port for XCP transfers on TCP/IP */ + uip_listen(HTONS(BOOT_COM_NET_PORT)); + /* initialize the MAC and set the MAC address */ + netdev_init_mac(); +} /*** end of NetInit ***/ + + +/************************************************************************************//** +** \brief The uIP network application that detects the XCP connect command on the +** port used by the bootloader. This indicates that the bootloader should +** be activated. +** \return none. +** +****************************************************************************************/ +void NetApp(void) +{ + unsigned char *newDataPtr; + + if (uip_connected()) + { + return; + } + + if (uip_newdata()) + { + /* a new XCP command was received. check if this is the connect command and in this + * case activate the bootloader. with XCP on TCP/IP the first 4 bytes contain a + * counter value in which we are not really interested. + */ + newDataPtr = uip_appdata; + newDataPtr += 4; + /* check if this was an XCP CONNECT command */ + if ((newDataPtr[0] == 0xff) && (newDataPtr[1] == 0x00)) + { + /* connection request received so start the bootloader */ + BootActivate(); + } + } +} /*** end of NetApp ***/ + + +/************************************************************************************//** +** \brief Runs the TCP/IP server task. +** \return none. +** +****************************************************************************************/ +void NetTask(void) +{ + unsigned long connection; + unsigned long packetLen; + + /* check for an RX packet and read it. */ + packetLen = netdev_read(); + if(packetLen > 0) + { + /* set uip_len for uIP stack usage */ + uip_len = (unsigned short)packetLen; + + /* process incoming IP packets here. */ + if(NET_UIP_HEADER_BUF->type == htons(UIP_ETHTYPE_IP)) + { + uip_arp_ipin(); + uip_input(); + /* if the above function invocation resulted in data that + * should be sent out on the network, the global variable + * uip_len is set to a value > 0. + */ + if(uip_len > 0) + { + uip_arp_out(); + netdev_send(); + uip_len = 0; + } + } + /* process incoming ARP packets here. */ + else if(NET_UIP_HEADER_BUF->type == htons(UIP_ETHTYPE_ARP)) + { + uip_arp_arpin(); + + /* if the above function invocation resulted in data that + * should be sent out on the network, the global variable + * uip_len is set to a value > 0. + */ + if(uip_len > 0) + { + netdev_send(); + uip_len = 0; + } + } + } + + /* process TCP/IP Periodic Timer here. */ + if (TimerGet() >= periodicTimerTimeOut) + { + periodicTimerTimeOut += NET_UIP_PERIODIC_TIMER_MS; + for (connection = 0; connection < UIP_CONNS; connection++) + { + uip_periodic(connection); + /* If the above function invocation resulted in data that + * should be sent out on the network, the global variable + * uip_len is set to a value > 0. + */ + if(uip_len > 0) + { + uip_arp_out(); + netdev_send(); + uip_len = 0; + } + } + } + + /* process ARP Timer here. */ + if (TimerGet() >= ARPTimerTimeOut) + { + ARPTimerTimeOut += NET_UIP_ARP_TIMER_MS; + uip_arp_timer(); + } +} /*** end of NetServerTask ***/ + + +/*********************************** end of net.c **************************************/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/net.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/net.h new file mode 100644 index 00000000..538e6664 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Prog/net.h @@ -0,0 +1,66 @@ +/************************************************************************************//** +* \file Demo\ARMCM3_LM3S_EK_LM3S6965_IAR\Prog\net.h +* \brief Network application for the uIP TCP/IP stack. +* \ingroup Prog_ARMCM3_LM3S_EK_LM3S6965_IAR +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2014 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ +#ifndef NET_H +#define NET_H + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +#ifndef UIP_APPCALL +#define UIP_APPCALL NetApp +#endif /* UIP_APPCALL */ + + +/**************************************************************************************** +* Type definitions +****************************************************************************************/ +/** \brief Define the uip_tcp_appstate_t datatype. This is the state of our tcp/ip + * application, and the memory required for this state is allocated together + * with each TCP connection. One application state for each TCP connection. + */ +typedef struct net_state +{ + unsigned char unused; +} uip_tcp_appstate_t; + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +void NetInit(void); +void NetApp(void); +void NetTask(void); + + +#endif /* NET_H */ +/*********************************** end of net.h **************************************/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/bin/openbtl_olimex_stm32e407.elf b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/bin/openbtl_olimex_stm32e407.elf index 29a4d198..d6c34888 100644 Binary files a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/bin/openbtl_olimex_stm32e407.elf and b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/bin/openbtl_olimex_stm32e407.elf differ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/bin/openbtl_olimex_stm32e407.map b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/bin/openbtl_olimex_stm32e407.map index 810b0e20..40e700a0 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/bin/openbtl_olimex_stm32e407.map +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/bin/openbtl_olimex_stm32e407.map @@ -7,43 +7,45 @@ start address 0x08000000 Program Header: LOAD off 0x00008000 vaddr 0x08000000 paddr 0x08000000 align 2**15 - filesz 0x00005e50 memsz 0x00005e50 flags r-x - LOAD off 0x00010000 vaddr 0x20000000 paddr 0x08005e50 align 2**15 - filesz 0x00000020 memsz 0x0000183c flags rw- + filesz 0x00007f98 memsz 0x00007f98 flags r-x + LOAD off 0x00010000 vaddr 0x20000000 paddr 0x08007f98 align 2**15 + filesz 0x00000020 memsz 0x00000020 flags rw- + LOAD off 0x00010080 vaddr 0x20000080 paddr 0x08008080 align 2**15 + filesz 0x00000000 memsz 0x00002ce4 flags rw- private flags = 5000202: [Version5 EABI] [soft-float ABI] [has entry point] Sections: Idx Name Size VMA LMA File off Algn - 0 .text 00005e50 08000000 08000000 00008000 2**2 + 0 .text 00007f98 08000000 08000000 00008000 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .data 00000020 20000000 08005e50 00010000 2**2 + 1 .data 00000020 20000000 08007f98 00010000 2**2 CONTENTS, ALLOC, LOAD, DATA - 2 .bss 0000181c 20000020 08005e70 00010020 2**3 + 2 .bss 00002ce4 20000080 08008080 00010080 2**7 ALLOC - 3 .debug_info 0000e1fa 00000000 00000000 00010020 2**0 + 3 .debug_info 00012d6c 00000000 00000000 00010020 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_abbrev 000028bd 00000000 00000000 0001e21a 2**0 + 4 .debug_abbrev 00003711 00000000 00000000 00022d8c 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_loc 00009eca 00000000 00000000 00020ad7 2**0 + 5 .debug_loc 0000b735 00000000 00000000 0002649d 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_aranges 00000c10 00000000 00000000 0002a9a1 2**0 + 6 .debug_aranges 000010d8 00000000 00000000 00031bd2 2**0 CONTENTS, READONLY, DEBUGGING - 7 .debug_ranges 00000ba0 00000000 00000000 0002b5b1 2**0 + 7 .debug_ranges 00001008 00000000 00000000 00032caa 2**0 CONTENTS, READONLY, DEBUGGING - 8 .debug_line 000044b6 00000000 00000000 0002c151 2**0 + 8 .debug_line 00005d54 00000000 00000000 00033cb2 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_str 00003a4f 00000000 00000000 00030607 2**0 + 9 .debug_str 0000553c 00000000 00000000 00039a06 2**0 CONTENTS, READONLY, DEBUGGING - 10 .comment 00000030 00000000 00000000 00034056 2**0 + 10 .comment 00000030 00000000 00000000 0003ef42 2**0 CONTENTS, READONLY - 11 .ARM.attributes 00000033 00000000 00000000 00034086 2**0 + 11 .ARM.attributes 00000033 00000000 00000000 0003ef72 2**0 CONTENTS, READONLY - 12 .debug_frame 00001f58 00000000 00000000 000340bc 2**2 + 12 .debug_frame 00002ab4 00000000 00000000 0003efa8 2**2 CONTENTS, READONLY, DEBUGGING SYMBOL TABLE: 08000000 l d .text 00000000 .text 20000000 l d .data 00000000 .data -20000020 l d .bss 00000000 .bss +20000080 l d .bss 00000000 .bss 00000000 l d .debug_info 00000000 .debug_info 00000000 l d .debug_abbrev 00000000 .debug_abbrev 00000000 l d .debug_loc 00000000 .debug_loc @@ -57,255 +59,335 @@ SYMBOL TABLE: 00000000 l df *ABS* 00000000 vectors.c 00000000 l df *ABS* 00000000 cstart.c 080001d4 l F .text 00000000 zero_loop2 -080053ea l F .text 00000000 zero_loop +08007482 l F .text 00000000 zero_loop 00000000 l df *ABS* 00000000 hooks.c -080054b0 l O .text 00000020 firmwareFilename -20000020 l O .bss 00000228 logfile +080075e8 l O .text 00000020 firmwareFilename +20000080 l O .bss 00000228 logfile 00000000 l df *ABS* 00000000 main.c 00000000 l df *ABS* 00000000 mmc.c 08000400 l F .text 0000004e CmdResp2Error 08000450 l F .text 00000130 CmdResp1Error 08000580 l F .text 0000024e SDEnWideBus -20000248 l O .bss 00000001 TransferError +200002a8 l O .bss 00000001 TransferError 20000000 l O .data 00000004 DMAEndOfTransfer -2000024c l O .bss 00000018 SDIO_DataInitStructure -20000264 l O .bss 00000010 CSD_Tab -20000274 l O .bss 00000004 CardType -20000278 l O .bss 00000010 CID_Tab -20000288 l O .bss 00000004 TransferEnd -2000028c l O .bss 00000018 SDIO_InitStructure -200002a4 l O .bss 00000004 RCA -200002a8 l O .bss 00000058 SDCardInfo -20000300 l O .bss 00000014 SDIO_CmdInitStructure +200002ac l O .bss 00000018 SDIO_DataInitStructure +200002c4 l O .bss 00000010 CSD_Tab +200002d4 l O .bss 00000004 CardType +200002d8 l O .bss 00000010 CID_Tab +200002e8 l O .bss 00000004 TransferEnd +200002ec l O .bss 00000018 SDIO_InitStructure +20000304 l O .bss 00000004 RCA +20000308 l O .bss 00000058 SDCardInfo +20000360 l O .bss 00000014 SDIO_CmdInitStructure 20000004 l O .data 00000001 Stat -20000314 l O .bss 00000004 StopCondition +20000374 l O .bss 00000004 StopCondition +00000000 l df *ABS* 00000000 stm32_eth.c +00000000 l df *ABS* 00000000 netdev.c 00000000 l df *ABS* 00000000 stm32f4xx_flash.c 00000000 l df *ABS* 00000000 stm32f4xx_gpio.c 00000000 l df *ABS* 00000000 stm32f4xx_rcc.c 20000008 l O .data 00000010 APBAHBPrescTable 00000000 l df *ABS* 00000000 stm32f4xx_sdio.c +00000000 l df *ABS* 00000000 stm32f4xx_syscfg.c 00000000 l df *ABS* 00000000 stm32f4xx_usart.c 00000000 l df *ABS* 00000000 system_stm32f4xx.c 00000000 l df *ABS* 00000000 ff.c -08001da8 l F .text 00000012 mem_cpy -08001dbc l F .text 0000001e ld_clust -08001ddc l F .text 0000001e sum_sfn -08001dfc l F .text 00000096 check_fs -08001e94 l F .text 00000076 sync_window -08001f0c l F .text 00000032 move_window -08001f40 l F .text 00000038 validate -08001f78 l F .text 00000394 chk_mounted -0800230c l F .text 0000012c get_fileinfo -08002438 l F .text 000000bc sync_fs -080025f8 l F .text 00000098 dir_sdi -080027a0 l F .text 000000cc create_chain -0800286c l F .text 0000012a dir_next -08002998 l F .text 000001a2 dir_find -08002b3c l F .text 00000332 follow_path -08002e70 l F .text 00000130 dir_read -08002fa0 l F .text 00000058 dir_remove -08002ff8 l F .text 0000006e remove_chain -08003100 l F .text 00000236 dir_register -20000318 l O .bss 00000200 LfnBuf -20000518 l O .bss 00000002 Fsid -080054f4 l O .text 00000080 ExCvt -08005574 l O .text 0000000d LfnOfs -2000051c l O .bss 00000004 FatFs +0800261c l F .text 00000012 mem_cpy +08002630 l F .text 0000001e ld_clust +08002650 l F .text 0000001e sum_sfn +08002670 l F .text 00000096 check_fs +08002708 l F .text 00000076 sync_window +08002780 l F .text 00000032 move_window +080027b4 l F .text 00000038 validate +080027ec l F .text 00000394 chk_mounted +08002b80 l F .text 0000012c get_fileinfo +08002cac l F .text 000000bc sync_fs +08002e6c l F .text 00000098 dir_sdi +08003014 l F .text 000000cc create_chain +080030e0 l F .text 0000012a dir_next +0800320c l F .text 000001a2 dir_find +080033b0 l F .text 00000332 follow_path +080036e4 l F .text 00000130 dir_read +08003814 l F .text 00000058 dir_remove +0800386c l F .text 0000006e remove_chain +08003974 l F .text 00000236 dir_register +20000378 l O .bss 00000200 LfnBuf +20000578 l O .bss 00000002 Fsid +08007640 l O .text 00000080 ExCvt +080076c0 l O .text 0000000d LfnOfs +2000057c l O .bss 00000004 FatFs 00000000 l df *ABS* 00000000 unicode.c -08005584 l O .text 000001e0 tbl_lower.4259 -08005764 l O .text 00000100 Tbl -08005864 l O .text 000001e0 tbl_upper.4260 +080076d0 l O .text 000001e0 tbl_lower.4259 +080078b0 l O .text 00000100 Tbl +080079b0 l O .text 000001e0 tbl_upper.4260 +00000000 l df *ABS* 00000000 uip.c +08004550 l F .text 0000004c chksum +0800459c l F .text 00000042 upper_layer_chksum +08004660 l F .text 00000030 uip_add_rcv_nxt +20000580 l O .bss 00000002 tmp16 +20000582 l O .bss 00000002 ipid +20000584 l O .bss 00000004 iss +20000588 l O .bss 00000002 lastport +20000594 l O .bss 00000001 c +20000595 l O .bss 00000001 opt +00000000 l df *ABS* 00000000 uip_arp.c +08005680 l F .text 00000116 uip_arp_update +20000596 l O .bss 00000001 i +20000597 l O .bss 00000001 tmpage +20000598 l O .bss 00000060 arp_table +08007b90 l O .text 00000006 broadcast_ethaddr +200005f8 l O .bss 00000001 c +200005f9 l O .bss 00000001 arptime +200005fc l O .bss 00000004 ipaddr 00000000 l df *ABS* 00000000 boot.c 00000000 l df *ABS* 00000000 com.c -20000520 l O .bss 00000001 comEntryStateConnect +20000600 l O .bss 00000001 comEntryStateConnect 20000018 l O .data 00000001 comActiveInterface -20000524 l O .bss 00000040 xcpCtoReqPacket.4403 +20000604 l O .bss 00000040 xcpCtoReqPacket.4419 +00000000 l df *ABS* 00000000 net.c +20000644 l O .bss 00000004 ARPTimerTimeOut +20000648 l O .bss 00000004 periodicTimerTimeOut 00000000 l df *ABS* 00000000 xcp.c -08003e40 l F .text 00000016 XcpSetCtoError -08005a44 l O .text 00000008 xcpStationId -20000564 l O .bss 0000004c xcpInfo +08005ec4 l F .text 00000016 XcpSetCtoError +08007b98 l O .text 00000008 xcpStationId +2000064c l O .bss 0000004c xcpInfo 00000000 l df *ABS* 00000000 backdoor.c -200005b0 l O .bss 00000001 backdoorOpen -200005b4 l O .bss 00000004 backdoorOpenTime +20000698 l O .bss 00000001 backdoorOpen +2000069c l O .bss 00000004 backdoorOpenTime 00000000 l df *ABS* 00000000 cop.c 00000000 l df *ABS* 00000000 file.c -08004294 l F .text 0000002e FileLibByteNibbleToChar -080042c4 l F .text 00000020 FileLibByteToHexString -080042e4 l F .text 00000046 FileLibLongToIntString -0800432c l F .text 00000066 FileLibHexStringToByte -200005b8 l O .bss 00000040 loggingStr -200005f8 l O .bss 00000001 firmwareUpdateState -200005fc l O .bss 00000008 eraseInfo -20000604 l O .bss 00000458 fatFsObjects -20000a5c l O .bss 00000184 lineParseObject +0800631c l F .text 0000002e FileLibByteNibbleToChar +0800634c l F .text 00000020 FileLibByteToHexString +0800636c l F .text 00000046 FileLibLongToIntString +080063b4 l F .text 00000066 FileLibHexStringToByte +200006a0 l O .bss 00000040 loggingStr +200006e0 l O .bss 00000001 firmwareUpdateState +200006e4 l O .bss 00000008 eraseInfo +200006ec l O .bss 00000458 fatFsObjects +20000b44 l O .bss 00000184 lineParseObject 00000000 l df *ABS* 00000000 assert.c -20000be0 l O .bss 00000004 assert_failure_file -20000be4 l O .bss 00000004 assert_failure_line +20000cc8 l O .bss 00000004 assert_failure_file +20000ccc l O .bss 00000004 assert_failure_line 00000000 l df *ABS* 00000000 can.c -08005c30 l O .text 00000024 canTiming +08007d84 l O .text 00000024 canTiming 00000000 l df *ABS* 00000000 cpu.c 00000000 l df *ABS* 00000000 flash.c -08004d98 l F .text 00000044 FlashGetSector -08004ddc l F .text 00000078 FlashWriteBlock -08004e54 l F .text 00000062 FlashSwitchBlock -08004eb8 l F .text 00000084 FlashAddToBlock -08005c54 l O .text 00000030 flashSectorNumToMask -08005c84 l O .text 00000078 flashLayout -20000be8 l O .bss 00000204 bootBlockInfo -20000dec l O .bss 00000204 blockInfo +08006e24 l F .text 00000044 FlashGetSector +08006e68 l F .text 00000078 FlashWriteBlock +08006ee0 l F .text 00000062 FlashSwitchBlock +08006f44 l F .text 00000084 FlashAddToBlock +08007da8 l O .text 00000030 flashSectorNumToMask +08007dd8 l O .text 0000006c flashLayout +20000cd0 l O .bss 00000204 bootBlockInfo +20000ed4 l O .bss 00000204 blockInfo 00000000 l df *ABS* 00000000 uart.c -08005140 l F .text 00000042 UartTransmitByte -08005184 l F .text 0000002c UartReceiveByte -20000ff0 l O .bss 00000041 xcpCtoReqPacket.7782 -20001034 l O .bss 00000001 xcpCtoRxLength.7783 -20001035 l O .bss 00000001 xcpCtoRxInProgress.7784 +080071d8 l F .text 00000042 UartTransmitByte +0800721c l F .text 0000002c UartReceiveByte +200010d8 l O .bss 00000041 xcpCtoReqPacket.7784 +2000111c l O .bss 00000001 xcpCtoRxLength.7785 +2000111d l O .bss 00000001 xcpCtoRxInProgress.7786 00000000 l df *ABS* 00000000 nvm.c 00000000 l df *ABS* 00000000 timer.c -20001038 l O .bss 00000004 millisecond_counter +20001120 l O .bss 00000004 millisecond_counter 00000000 l df *ABS* 00000000 memcpy-stub.c +00000000 l df *ABS* 00000000 memset.c 00000000 l df *ABS* 00000000 ctype_.c 00000000 l df *ABS* 00000000 00000800 l *ABS* 00000000 __STACKSIZE__ -08003d10 g F .text 00000044 ComInit -08004f58 g F .text 00000050 FlashWrite -08003bb0 g F .text 0000004e f_gets -08001678 g F .text 0000002c FLASH_Unlock -08004a90 g F .text 0000001c AssertFailure -0800250c g F .text 000000ea get_fat -08004cbc g F .text 00000088 CanReceivePacket -080053a8 g F .text 00000058 reset_handler -0800189c g F .text 00000028 GPIO_PinAFConfig -0800535c g F .text 00000022 TimerUpdate -08003e88 g F .text 00000010 XcpPacketTransmitted -08003d54 g F .text 00000054 ComTask -08001b64 g F .text 0000000c SDIO_ClearFlag +08005b28 g F .text 0000004c ComInit +08006fe4 g F .text 00000050 FlashWrite +08004424 g F .text 0000004e f_gets +08001ebc g F .text 0000002c FLASH_Unlock +08001b3c g F .text 00000012 ETH_FlushTransmitFIFO +08006b18 g F .text 0000001c AssertFailure +08002d80 g F .text 000000ea get_fat +08006d44 g F .text 00000088 CanReceivePacket +08007440 g F .text 00000058 reset_handler +080020e0 g F .text 00000028 GPIO_PinAFConfig +080073f4 g F .text 00000022 TimerUpdate +08005f0c g F .text 00000010 XcpPacketTransmitted +08001690 g F .text 0000009e ETH_StructInit +08005b74 g F .text 0000007c ComTask +080023cc g F .text 0000000c SDIO_ClearFlag 080014b8 g F .text 00000018 SD_GetStatus -080017c0 g F .text 0000003e FLASH_ProgramWord -08003e28 g F .text 0000000e ComSetConnectEntryState -08001a88 g F .text 0000000c SDIO_SetPowerState -08003cdc g F .text 0000001c BootInit -08004458 g F .text 00000038 FileSrecVerifyChecksum -08004268 g F .text 00000022 BackDoorInit -08001c7c g F .text 0000000c USART_GetFlagStatus -08004290 g F .text 00000002 CopService -08005e50 g .text 00000000 _etext +08002004 g F .text 0000003e FLASH_ProgramWord +08005c78 g F .text 0000000e ComSetConnectEntryState +080022f0 g F .text 0000000c SDIO_SetPowerState +08001808 g F .text 000002be ETH_Init +20001e90 g O .bss 00000002 uip_len +2000058c g O .bss 00000006 uip_ethaddr +080045e0 g F .text 0000007e uip_add32 +08005af4 g F .text 0000001c BootInit +080064e0 g F .text 00000038 FileSrecVerifyChecksum +080062f0 g F .text 00000022 BackDoorInit +08002250 g F .text 00000024 RCC_AHB1PeriphResetCmd +080024f0 g F .text 0000000c USART_GetFlagStatus +08006318 g F .text 00000002 CopService +08007f98 g .text 00000000 _etext 080012a4 g F .text 0000019a SD_WriteBlock -08003cac g F .text 0000002e ff_wtoupper -08005408 g F .text 000000a6 memcpy -08004610 g F .text 00000480 FileTask -0800534c g F .text 0000000e TimerReset +08004520 g F .text 0000002e ff_wtoupper +08001e0c g F .text 00000050 netdev_read +08004728 g F .text 00000f1e uip_process +080071cc g F .text 0000000a FlashGetUserProgBaseAddress +08001678 g F .text 00000018 ETH_DeInit +080074a0 g F .text 000000a6 memcpy +08006698 g F .text 00000480 FileTask +080073e4 g F .text 0000000e TimerReset 080014d0 g F .text 00000038 disk_initialize +20001e94 g O .bss 00000004 uip_sappdata +08001bc0 g F .text 00000226 netdev_init +20001e98 g O .bss 00000004 uip_acc32 +08004690 g F .text 00000024 uip_ipchksum 08000c20 g F .text 000002b6 SD_GetCardInfo -08001b50 g F .text 00000014 SDIO_GetFlagStatus -08001c74 g F .text 00000008 USART_ReceiveData -08003cf8 g F .text 00000018 BootTask +080023b8 g F .text 00000014 SDIO_GetFlagStatus +080024e8 g F .text 00000008 USART_ReceiveData +08005b10 g F .text 00000018 BootTask 0800148c g F .text 0000002c SD_GetState -08005034 g F .text 00000058 FlashWriteChecksum +080070c0 g F .text 00000058 FlashWriteChecksum 08000ed8 g F .text 00000084 SD_EnableWideBusOperation -080019e8 g F .text 00000024 RCC_APB2PeriphClockCmd -08001ad4 g F .text 0000000e SDIO_GetCommandResponse -08003dac g F .text 00000034 ComTransmitPacket -08001800 g F .text 00000090 GPIO_Init +0800222c g F .text 00000024 RCC_APB2PeriphClockCmd +0800233c g F .text 0000000e SDIO_GetCommandResponse +08005bf4 g F .text 0000004a ComTransmitPacket +08002044 g F .text 00000090 GPIO_Init 08001508 g F .text 00000032 disk_status -08004490 g F .text 0000017e FileSrecParseLine -08001c50 g F .text 0000001c USART_Cmd +08006518 g F .text 0000017e FileSrecParseLine +080046f4 g F .text 00000032 uip_listen +080024c4 g F .text 0000001c USART_Cmd +08001e5c g F .text 00000060 netdev_send 0800160c g F .text 00000062 disk_ioctl -080043d4 g F .text 00000036 FileHandleFirmwareUpdateRequest -080019c4 g F .text 00000024 RCC_APB1PeriphClockCmd -08003068 g F .text 00000098 gen_numname +0800645c g F .text 00000036 FileHandleFirmwareUpdateRequest +08002208 g F .text 00000024 RCC_APB1PeriphClockCmd +080038dc g F .text 00000098 gen_numname +20001e9c g O .bss 00000001 uip_flags +20001180 g O .bss 00000010 EnetDmaRx 08000280 g F .text 00000042 FileFirmwareUpdateCompletedHook -08003e74 g F .text 00000012 XcpIsConnected -08003af4 g F .text 000000bc f_unlink -080052f0 g F .text 00000008 NvmInit -08004f3c g F .text 0000001a FlashInit -080016a4 g F .text 00000012 FLASH_Lock -2000103c g .bss 00000000 _ebss -08003c00 g F .text 00000034 f_putc -08003c34 g F .text 0000002c f_puts -08005394 g F .text 00000012 UnusedISR -08001a7c g F .text 0000000c SDIO_ClockCmd -08003da8 g F .text 00000002 ComFree -08001b00 g F .text 00000030 SDIO_DataConfig -080051b0 g F .text 0000003e UartInit -080018c4 g F .text 000000da RCC_GetClocksFreq -08005300 g F .text 00000008 NvmErase -08001b70 g F .text 000000de USART_Init -20000020 g .bss 00000000 _bss -080038fc g F .text 00000014 f_close -080016c4 g F .text 00000054 FLASH_GetStatus -08003e98 g F .text 00000384 XcpPacketReceived -080016b8 g F .text 0000000c FLASH_ClearFlag -08001718 g F .text 00000038 FLASH_WaitForLastOperation -080034d0 g F .text 000001a8 f_read -080050f4 g F .text 0000004c FlashDone +08005ef8 g F .text 00000012 XcpIsConnected +08004368 g F .text 000000bc f_unlink +08001ac8 g F .text 00000026 ETH_MACTransmissionCmd +08007388 g F .text 00000008 NvmInit +08006fc8 g F .text 0000001a FlashInit +08001ee8 g F .text 00000012 FLASH_Lock +20002564 g .bss 00000000 _ebss +08004474 g F .text 00000034 f_putc +080044a8 g F .text 0000002c f_puts +0800742c g F .text 00000012 UnusedISR +080022e4 g F .text 0000000c SDIO_ClockCmd +08005bf0 g F .text 00000002 ComFree +08002368 g F .text 00000030 SDIO_DataConfig +08001b18 g F .text 00000012 ETH_SoftwareReset +080017a0 g F .text 00000068 ETH_WritePHYRegister +08007248 g F .text 0000003e UartInit +08002108 g F .text 000000da RCC_GetClocksFreq +08007398 g F .text 00000008 NvmErase +08001de8 g F .text 00000022 netdev_init_mac +080023e4 g F .text 000000de USART_Init +20000080 g .bss 00000000 _bss +08004170 g F .text 00000014 f_close +08001f08 g F .text 00000054 FLASH_GetStatus +08005f1c g F .text 00000384 XcpPacketReceived +080046b4 g F .text 0000000a uip_tcpchksum +08001efc g F .text 0000000c FLASH_ClearFlag +08001f5c g F .text 00000038 FLASH_WaitForLastOperation +08001b78 g F .text 00000026 ETH_DMAReceptionCmd +08003d44 g F .text 000001a8 f_read +08007180 g F .text 0000004c FlashDone 08000f88 g F .text 00000172 SD_Init 08000188 g F .text 00000064 EntryFromProg +20001ea0 g O .bss 00000004 uip_appdata +20001ea4 g O .bss 00000004 uip_conn +08001b2c g F .text 00000010 ETH_GetSoftwareResetStatus 08000f5c g F .text 0000002c SD_SelectDeselect -08004c14 g F .text 000000a8 CanTransmitPacket -08001aa4 g F .text 00000030 SDIO_SendCommand +08006c9c g F .text 000000a8 CanTransmitPacket +0800230c g F .text 00000030 SDIO_SendCommand +08001730 g F .text 0000006e ETH_ReadPHYRegister +20001ea8 g O .bss 00000068 uip_conns 08001670 g F .text 00000008 get_fattime -08003e58 g F .text 0000001c XcpInit -08004394 g F .text 0000002c FileInit -08001b30 g F .text 0000000e SDIO_ReadData -08004fa8 g F .text 0000008a FlashErase +08005edc g F .text 0000001c XcpInit +0800641c g F .text 0000002c FileInit +08002398 g F .text 0000000e SDIO_ReadData +08005924 g F .text 000001d0 uip_arp_out +08007034 g F .text 0000008a FlashErase +08007548 g F .text 0000009e memset 080002c4 g F .text 00000020 FileFirmwareUpdateErrorHook 08000344 g F .text 000000bc main -08001750 g F .text 0000006e FLASH_EraseSector -08003850 g F .text 000000ac f_sync +08001f94 g F .text 0000006e FLASH_EraseSector +080040c4 g F .text 000000ac f_sync 08001440 g F .text 0000004c SD_SendStatus -0800440c g F .text 0000004c FileSrecGetLineType -08005310 g F .text 00000012 NvmDone -08003338 g F .text 0000002a f_mount -080051f0 g F .text 00000066 UartTransmitPacket -08005308 g F .text 00000008 NvmVerifyChecksum -08004d70 g F .text 0000001e CpuMemCopy -08001ae4 g F .text 0000001a SDIO_GetResponse -08001c88 g F .text 00000120 SystemInit -08002690 g F .text 0000010e put_fat -08003910 g F .text 00000198 f_lseek -08003e04 g F .text 00000024 ComGetActiveInterfaceMaxTxLen -08005258 g F .text 00000098 UartReceivePacket +08006494 g F .text 0000004c FileSrecGetLineType +080073a8 g F .text 00000012 NvmDone +08003bac g F .text 0000002a f_mount +08007288 g F .text 00000066 UartTransmitPacket +080073a0 g F .text 00000008 NvmVerifyChecksum +08006dfc g F .text 0000001e CpuMemCopy +0800234c g F .text 0000001a SDIO_GetResponse +080024fc g F .text 00000120 SystemInit +08002f04 g F .text 0000010e put_fat +08004184 g F .text 00000198 f_lseek +080023d8 g F .text 0000000a SYSCFG_ETH_MediaInterfaceConfig +080057f0 g F .text 00000134 uip_arp_arpin +08005c5c g F .text 0000001c ComGetActiveInterfaceMaxTxLen +080072f0 g F .text 00000098 UartReceivePacket 08000244 g F .text 0000000a FileGetFirmwareFilenameHook 080010fc g F .text 000001a6 SD_ReadBlock +08005798 g F .text 00000058 uip_arp_timer +20001f10 g O .bss 00000002 uip_listenports +20001f14 g O .bss 00000004 uip_draddr 20000000 g .data 00000000 _data -08003aa8 g F .text 0000004a f_stat -0800428c g F .text 00000002 CopInit -08004d90 g F .text 00000008 CpuReset +08001ba0 g F .text 00000020 ETH_Start +20001190 g O .bss 00000640 RxBuff +0800431c g F .text 0000004a f_stat +08006314 g F .text 00000002 CopInit +08006e1c g F .text 00000008 CpuReset 080007d0 g F .text 0000002c SD_Detect -08004aac g F .text 00000168 CanInit -080052f8 g F .text 00000008 NvmWrite -08004d44 g F .text 0000002c CpuStartUserProgram -080024f4 g F .text 00000016 clust2sect -2000183c g .bss 00000000 _estack -08001c6c g F .text 00000008 USART_SendData -0800508c g F .text 00000068 FlashVerifyChecksum +08006b34 g F .text 00000168 CanInit +08007390 g F .text 00000008 NvmWrite +08006dcc g F .text 00000030 CpuStartUserProgram +08002d68 g F .text 00000016 clust2sect +20002d64 g .bss 00000000 _estack +080024e0 g F .text 00000008 USART_SendData +08007118 g F .text 00000068 FlashVerifyChecksum +08005d04 g F .text 00000044 NetTransmitPacket 20000020 g .data 00000000 _edata -080043c0 g F .text 00000014 FileIsIdle -08003678 g F .text 000001d8 f_write +08006448 g F .text 00000014 FileIsIdle +08005648 g F .text 0000000a htons +08003eec g F .text 000001d8 f_write 08000000 g O .text 00000188 _vectab -08003364 g F .text 0000016a f_open +08003bd8 g F .text 0000016a f_open 080015a0 g F .text 0000006c disk_write +08001af0 g F .text 00000026 ETH_MACReceptionCmd 080002e4 g F .text 00000060 FileFirmwareUpdateLogHook +200017d0 g O .bss 00000640 TxBuff 2000001c g O .data 00000004 __ctype_ptr__ -08003e38 g F .text 00000008 ComIsConnected -08005d4c g O .text 00000101 _ctype_ -08001a48 g F .text 00000034 SDIO_Init +08005c88 g F .text 00000008 ComIsConnected +08007e94 g O .text 00000101 _ctype_ +08001b50 g F .text 00000026 ETH_DMATransmissionCmd +080022b0 g F .text 00000034 SDIO_Init 08000200 g F .text 00000044 FileIsFirmwareUpdateRequestedHook +080046c0 g F .text 00000032 uip_init 080007fc g F .text 0000027e SD_PowerON -08003de0 g F .text 00000024 ComGetActiveInterfaceMaxRxLen -080019a0 g F .text 00000024 RCC_AHB1PeriphClockCmd +08005c40 g F .text 0000001c ComGetActiveInterfaceMaxRxLen +080021e4 g F .text 00000024 RCC_AHB1PeriphClockCmd +08005d48 g F .text 0000010a NetReceivePacket 0800153c g F .text 00000064 disk_read -0800421c g F .text 0000004a BackDoorCheck -2000103c g .bss 00000000 _stack -08001a0c g F .text 00000024 RCC_APB2PeriphResetCmd -08003c60 g F .text 0000004a ff_convert -08005380 g F .text 00000012 TimerGet -08001a94 g F .text 00000010 SDIO_GetPowerState +080062a0 g F .text 0000004e BackDoorCheck +20002564 g .bss 00000000 _stack +08002274 g F .text 00000024 RCC_APB2PeriphResetCmd +20001f18 g O .bss 00000004 uip_netmask +20001f1c g O .bss 00000004 uip_hostaddr +080044d4 g F .text 0000004a ff_convert +08007418 g F .text 00000012 TimerGet +080022fc g F .text 00000010 SDIO_GetPowerState +20001e80 g O .bss 00000010 EnetDmaTx +08005e54 g F .text 00000070 NetApp +08005c90 g F .text 00000074 NetInit 08000a7c g F .text 000001a4 SD_InitializeCards -08001890 g F .text 0000000c GPIO_ReadInputDataBit -08005324 g F .text 00000028 TimerInit -08001b40 g F .text 0000000e SDIO_WriteData +080020d4 g F .text 0000000c GPIO_ReadInputDataBit +080073bc g F .text 00000028 TimerInit +080023a8 g F .text 0000000e SDIO_WriteData +20001f20 g O .bss 00000642 uip_buf +08005654 g F .text 0000002a uip_send +20002562 g O .bss 00000002 uip_slen 08000250 g F .text 00000030 FileFirmwareUpdateStartedHook -08001a30 g F .text 00000018 SDIO_DeInit +08002298 g F .text 00000018 SDIO_DeInit diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/bin/openbtl_olimex_stm32e407.srec b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/bin/openbtl_olimex_stm32e407.srec index 9174b342..c4ee2b5c 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/bin/openbtl_olimex_stm32e407.srec +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/bin/openbtl_olimex_stm32e407.srec @@ -1,79 +1,79 @@ S024000062696E2F6F70656E62746C5F6F6C696D65785F73746D3332653430372E737265639F -S315080000003C180020A953000895530008955300088A -S315080000109553000895530008955300089553000812 -S315080000209553000895530008955300089553000802 -S3150800003095530008955300089553000895530008F2 -S3150800004095530008955300089553000895530008E2 -S3150800005095530008955300089553000895530008D2 -S3150800006095530008955300089553000895530008C2 -S3150800007095530008955300089553000895530008B2 -S3150800008095530008955300089553000895530008A2 -S315080000909553000895530008955300089553000892 -S315080000A09553000895530008955300089553000882 -S315080000B09553000895530008955300089553000872 -S315080000C09553000895530008955300089553000862 -S315080000D09553000895530008955300089553000852 -S315080000E09553000895530008955300089553000842 -S315080000F09553000895530008955300089553000832 -S315080001009553000895530008955300089553000821 -S315080001109553000895530008955300089553000811 -S315080001209553000895530008955300089553000801 -S3150800013095530008955300089553000895530008F1 -S3150800014095530008955300089553000895530008E1 -S3150800015095530008955300089553000895530008D1 -S3150800016095530008955300089553000895530008C1 -S3150800017095530008955300089553000895530008B1 -S31508000180955300089553000810B572B617481849D4 +S31508000000642D0020417400082D7400082D74000822 +S315080000102D7400082D7400082D7400082D7400082E +S315080000202D7400082D7400082D7400082D7400081E +S315080000302D7400082D7400082D7400082D7400080E +S315080000402D7400082D7400082D7400082D740008FE +S315080000502D7400082D7400082D7400082D740008EE +S315080000602D7400082D7400082D7400082D740008DE +S315080000702D7400082D7400082D7400082D740008CE +S315080000802D7400082D7400082D7400082D740008BE +S315080000902D7400082D7400082D7400082D740008AE +S315080000A02D7400082D7400082D7400082D7400089E +S315080000B02D7400082D7400082D7400082D7400088E +S315080000C02D7400082D7400082D7400082D7400087E +S315080000D02D7400082D7400082D7400082D7400086E +S315080000E02D7400082D7400082D7400082D7400085E +S315080000F02D7400082D7400082D7400082D7400084E +S315080001002D7400082D7400082D7400082D7400083D +S315080001102D7400082D7400082D7400082D7400082D +S315080001202D7400082D7400082D7400082D7400081D +S315080001302D7400082D7400082D7400082D7400080D +S315080001402D7400082D7400082D7400082D740008FD +S315080001502D7400082D7400082D7400082D740008ED +S315080001602D7400082D7400082D7400082D740008DD +S315080001702D7400082D7400082D7400082D740008CD +S315080001802D7400082D74000810B572B61748184962 S31508000190016018498D4640F20002C2F2000240F2A0 S315080001A02003C2F200039A4210D2131D0E4CE41A21 -S315080001B024F0030404340023104645F65061C0F6C3 +S315080001B024F0030404340023104647F69871C0F669 S315080001C000015A581A500433A342FAD10A480B4977 -S315080001D04FF000028842B8BF40F8042BFADB03F060 -S315080001E023FE00F0AFF810BD2300002008ED00E064 -S315080001F0000000083C180020200000203C100020C9 +S315080001D04FF000028842B8BF40F8042BFADB05F05E +S315080001E04BFD00F0AFF810BD2300002008ED00E03D +S315080001F000000008642D00208000002064250020EF S3150800020000B589B0002300930193029303930493E6 -S3150800021005930693079345F2B040C0F60000694679 -S3150800022003F042FC48B9009B002043B19DF8080042 +S3150800021005930693079347F2E850C0F6000069462F +S3150800022004F07CF848B9009B002043B19DF808000B S3150800023080F01000C0F3001001E00020FFE709B0CD -S315080002405DF804FB45F2B040C0F60000704700BFF9 -S3150800025008B540F22000C2F20000002380F82432DC -S3150800026045F2D041C0F600010A2203F07BF830B906 -S3150800027040F22003C2F20003012283F8242208BDBB -S3150800028038B540F22003C2F2000393F82432012B5A -S3150800029005D140F22000C2F2000003F02FFB4FF414 -S315080002A0A054C4F2010440252046294601F0E6FC84 -S315080002B00028F9D045F2B040C0F6000003F01AFC59 -S315080002C038BD00BF08B540F22003C2F2000393F818 -S315080002D02432012B05D140F22000C2F2000003F0BF -S315080002E00DFB08BD70B5064640F22003C2F20003B6 -S315080002F093F82432012B10D140F22001C2F20001FA -S3150800030003F098FC002808DA40F22000C2F2000048 -S31508000310002380F8243203F0F1FA317889B14FF4DA -S31508000320A054C4F201048025204601F09FFC204613 -S31508000330294601F0A3FC0028F9D016F8011F002968 -S31508000340F2D170BD80B582B072B601F09DFC202056 -S31508000350012101F049FB0420012101F021FB4FF4A2 -S315080003600065C4F2020528460621082201F096FA1D -S3150800037028460721082201F091FA00278DF8067011 +S315080002405DF804FB47F2E850C0F60000704700BFAF +S3150800025008B540F28000C2F20000002380F824327C +S3150800026047F20861C0F600010A2203F0B5FC30B96E +S3150800027040F28003C2F20003012283F8242208BD5B +S3150800028038B540F28003C2F2000393F82432012BFA +S3150800029005D140F28000C2F2000003F069FF4FF476 +S315080002A0A054C4F2010440252046294602F020F94C +S315080002B00028F9D047F2E850C0F6000004F054F8D8 +S315080002C038BD00BF08B540F28003C2F2000393F8B8 +S315080002D02432012B05D140F28000C2F2000003F05F +S315080002E047FF08BD70B5064640F28003C2F2000318 +S315080002F093F82432012B10D140F28001C2F200019A +S3150800030004F0D2F8002808DA40F28000C2F20000B1 +S31508000310002380F8243203F02BFF317889B14FF49B +S31508000320A054C4F201048025204602F0D9F82046DC +S31508000330294602F0DDF80028F9D016F8011F002931 +S31508000340F2D170BD80B582B072B602F0D7F820201F +S31508000350012101F06BFF0420012101F043FF4FF456 +S315080003600065C4F2020528460621082201F0B8FEF7 +S3150800037028460721082201F0B3FE00278DF80670EB S3150800038001268DF8076002248DF804404023009367 -S315080003908DF805402846694601F032FA8DF8044082 -S315080003A0802300932846694601F02AFA20463146FA -S315080003B001F0F6FA4FF48065C4F2020528460521D5 -S315080003C0092201F06BFA28460621092201F066FA8D +S315080003908DF805402846694601F054FE8DF804405C +S315080003A0802300932846694601F04CFE20463146D4 +S315080003B001F018FF4FF48065C4F2020528460521AE +S315080003C0092201F08DFE28460621092201F088FE41 S315080003D0602300938DF804408DF805408DF806706B -S315080003E08DF807602846694601F00AFA4FF0C060A2 -S315080003F0314601F0E7FA03F071FC03F07DFCFCE7F7 +S315080003E08DF807602846694601F02CFE4FF0C0607C +S315080003F0314601F009FF05F07DFB05F089FBFCE7B6 S3150800040008B54FF43053C4F201035B6B13F0450F84 S3150800041007D14FF43052C4F20102536B13F0450F63 -S31508000420FBD013F0040F04D0042001F09BFB03203B -S3150800043008BD13F0010F04D0012001F093FB012041 -S3150800044008BD40F2FF5001F08DFB002008BD00BF3B +S31508000420FBD013F0040F04D0042001F0CFFF032003 +S3150800043008BD13F0010F04D0012001F0C7FF012009 +S3150800044008BD40F2FF5001F0C1FF002008BD00BF03 S3150800045010B504464FF43053C4F201035B6B13F036 S31508000460450F07D14FF43052C4F20102536B13F013 -S31508000470450FFBD013F0040F04D0042001F072FBE3 -S31508000480032010BD13F0010F04D0012001F06AFB10 -S31508000490012010BD01F01EFBA04249D140F2FF50D9 -S315080004A001F060FB002001F01DFB4EF20803CFF6B9 +S31508000470450FFBD013F0040F04D0042001F0A6FFAB +S31508000480032010BD13F0010F04D0012001F09EFFD8 +S31508000490012010BD01F052FFA04249D140F2FF50A1 +S315080004A001F094FF002001F051FF4EF20803CFF649 S315080004B0FF530340002B3DD000283DDB10F0804F52 S315080004C03CD110F0005F3BD110F0805F3AD110F0BC S315080004D0006F39D110F0806F38D110F0807F37D196 @@ -87,115 +87,115 @@ S315080005400A2010BD0B2010BD0C2010BD0D2010BDBB S315080005500E2010BD0F2010BD102010BD112010BD9B S31508000560122010BD132010BD142010BD152010BD7B S31508000570162010BD172010BD182010BD192010BD5B -S315080005802DE9F04182B00446002001F0ABFA10F0E4 +S315080005802DE9F04182B00446002001F0DFFE10F0AC S31508000590007F18BF0E2040F01781002200920192BA -S315080005A040F20030C2F200000821016010254560C3 -S315080005B040218160C2604FF48062026101F072FAE4 -S315080005C02846FFF745FF002840F0FC8040F200303F -S315080005D0C2F2000040F2A422C2F200021268AA4047 +S315080005A040F26030C2F20000082101601025456063 +S315080005B040218160C2604FF48062026101F0A6FEAC +S315080005C02846FFF745FF002840F0FC8040F26030DF +S315080005D0C2F2000040F20432C2F200021268AA40D7 S315080005E0026037254560402282600022C2604FF4CF -S315080005F08062026101F056FA2846FFF729FF0028B3 -S3150800060040F0E18040F24C20C2F200004FF0FF3388 +S315080005F08062026101F08AFE2846FFF729FF00287B +S3150800060040F0E18040F2AC20C2F200004FF0FF3328 S31508000610036008234360302383600223C3600025F8 -S3150800062005610123436101F06BFA40F20030C2F222 +S3150800062005610123436101F09FFE40F26030C2F28A S31508000630000005603326466040228260C5604FF49C -S315080006408062026101F02EFA3046FFF701FF0028AA +S315080006408062026101F062FE3046FFF701FF002872 S3150800065040F0BA80ADF104084FF43055C4F20105F4 -S3150800066040F22A664FF4001707E0384601F070FAA0 -S3150800067018B101F05DFA48F8040F6B6B3342F4D0F9 -S31508000680082001F065FA20B1082001F06BFA042071 -S315080006909AE0022001F05CFA20B1022001F062FA29 -S315080006A0022091E0202001F053FA20B1202001F029 -S315080006B059FA062088E04FF4007001F049FA28B18B -S315080006C04FF4007001F04EFA07207DE040F2FF502B -S315080006D001F048FA009A130643EA126302F47F41CE +S3150800066040F22A664FF4001707E0384601F0A4FE68 +S3150800067018B101F091FE48F8040F6B6B3342F4D0C1 +S31508000680082001F099FE20B1082001F09FFE042001 +S315080006909AE0022001F090FE20B1022001F096FEB9 +S315080006A0022091E0202001F087FE20B1202001F0F1 +S315080006B08DFE062088E04FF4007001F07DFE28B11B +S315080006C04FF4007001F082FE07207DE040F2FF50F3 +S315080006D001F07CFE009A130643EA126302F47F4196 S315080006E043EA012302F47F0243EA1223012C34D1A0 -S315080006F013F4802F08BF252066D040F20030C2F2DE -S31508000700000040F2A422C2F200021268120402603B +S315080006F013F4802F08BF252066D040F26030C2F27E +S31508000700000040F20432C2F20002126812040260CB S3150800071037244460402282600022C2604FF480621F -S31508000720026101F0BFF92046FFF792FE002847D183 -S3150800073040F20030C2F20000022202600624446041 +S31508000720026101F0F3FD2046FFF792FE002847D14B +S3150800073040F26030C2F200000222026006244460E1 S31508000740402282600022C2604FF48062026101F09A -S31508000750A9F92046FFF77CFE36E013F4803F08BF70 -S31508000760252031D040F20030C2F2000040F2A42227 +S31508000750DDFD2046FFF77CFE36E013F4803F08BF38 +S31508000760252031D040F26030C2F2000040F2043257 S31508000770C2F2000212681204026037244460402262 -S3150800078082600022C2604FF48062026101F08AF939 -S315080007902046FFF75DFEA0B940F20030C2F2000025 +S3150800078082600022C2604FF48062026101F0BEFD01 +S315080007902046FFF75DFEA0B940F26030C2F20000C5 S315080007A0002202600624446040218160C2604FF442 -S315080007B08062026101F076F92046FFF749FE03E000 +S315080007B08062026101F0AAFD2046FFF749FE03E0C8 S315080007C002E001E000E0FFE702B0BDE8F08100BF0B S315080007D000B583B001238DF807304FF40060C4F2EA -S315080007E002004FF4006101F053F810B900238DF8A8 +S315080007E002004FF4006101F075FC10B900238DF882 S315080007F007309DF8070003B05DF804FB2DE9F047C4 -S3150800080082B000248DF8074040F28C20C2F2000026 +S3150800080082B000248DF8074040F2EC20C2F20000C6 S3150800081076230375046044608460C460046101F053 -S3150800082013F9032001F030F9012001F027F940F20D -S315080008300030C2F20000046044608460C4604FF473 -S315080008408063036101F02EF94FF48034802501E0BE -S31508000850013C0CD0284601F07BF90028F8D0032388 -S315080008603CB140F2FF5001F07DF9002301E003237B +S3150800082047FD032001F064FD012001F05BFD40F265 +S315080008306030C2F20000046044608460C4604FF413 +S315080008408063036101F062FD4FF48034802501E086 +S31508000850013C0CD0284601F0AFFD0028F8D0032350 +S315080008603CB140F2FF5001F0B1FD002301E0032343 S31508000870FFE78DF807309DF8073013F0FF0F03D018 -S315080008809DF80700C0B2F5E040F20030C2F2000061 +S315080008809DF80700C0B2F5E040F26030C2F2000001 S315080008904FF4D57303600823436040238360002325 -S315080008A0C3604FF48063036101F0FCF84FF43053E2 +S315080008A0C3604FF48063036101F030FD4FF43053A9 S315080008B0C4F201035A6B12F0450F0ED14FF4803380 S315080008C04FF43051C4F20101013B4A6B12F0450F57 S315080008D002D1002BF8D103E013B112F0040F04D0B3 -S315080008E0042001F03FF9032309E012F0400F08BF86 -S315080008F0002304D0402001F035F90023FFE78DF8E6 -S3150800090007309DF8073013F0FF0F08D140F2742323 +S315080008E0042001F073FD032309E012F0400F08BF4E +S315080008F0002304D0402001F069FD0023FFE78DF8AE +S3150800090007309DF8073013F0FF0F08D140F2D423C3 S31508000910C2F2000301221A604FF0804514E040F24B -S315080009200030C2F2000000250560372444604022EA -S315080009308260C5604FF48062026101F0B3F8204618 -S31508000940FFF786FD8DF8070040F20030C2F200007E +S315080009206030C2F20000002505603724446040228A +S315080009308260C5604FF48062026101F0E7FC2046E0 +S31508000940FFF786FD8DF8070040F26030C2F200001E S31508000950002202603724446040218160C2604FF45F -S315080009608062026101F09EF82046FFF771FD8DF85E +S315080009608062026101F0D2FC2046FFF771FD8DF826 S3150800097007009DF8073013F0FF0F78D1002740F2E3 -S315080009800034C2F20004B846B94645F0004545F4BD +S315080009806034C2F20004B846B94645F0004545F45D S31508000990801A4FF43055C4F20105C4F80090372682 S315080009A066604023A360C4F80C904FF4806323610B -S315080009B0204601F077F83046FFF74AFD8DF8070024 +S315080009B0204601F0ABFC3046FFF74AFD8DF80700EC S315080009C09DF8073013F0FF0F03D09DF80700C0B25B S315080009D050E0C4F800A0292363604023A360C4F84C -S315080009E00C804FF480632361204601F05BF86B6B43 +S315080009E00C804FF480632361204601F08FFC6B6B0B S315080009F013F0450F03D16B6B13F0450FFBD013F0C3 -S31508000A00040F04D0042001F0ADF8032304E040F2FB -S31508000A10FF5001F0A7F843468DF807309DF80730D8 +S31508000A00040F04D0042001F0E1FC032304E040F2C3 +S31508000A10FF5001F0DBFC43468DF807309DF80730A0 S31508000A2013F0FF0F03D09DF80700C0B222E040463E -S31508000A3001F058F8013701464FF6FE73C043C00F60 +S31508000A3001F08CFC013701464FF6FE73C043C00F28 S31508000A409F4288BF00200028A7D19F4206D91B23B2 S31508000A508DF807309DF80700C0B20BE011F0804F03 -S31508000A601FBF40F27423C2F2000302221A609DF8E7 +S31508000A601FBF40F2D423C2F2000302221A609DF887 S31508000A700700C0B202B0BDE8F08700BF38B501F084 -S31508000A8009F8002800F0BC8040F27423C2F2000383 -S31508000A901B68042B00F0B68040F20030C2F200005A +S31508000A803DFC002800F0BC8040F2D423C2F20003EB +S31508000A901B68042B00F0B68040F26030C2F20000FA S31508000AA00023036002224260C0228260C3604FF4C2 -S31508000AB08063036100F0F6FFFFF7A2FC002840F010 -S31508000AC0A38001F00FF840F27824C2F200042060F7 -S31508000AD0042001F007F86060082001F003F8A06020 -S31508000AE00C2000F0FFFFE06040F27423C2F200031E +S31508000AB08063036101F02AFCFFF7A2FC002840F0DE +S31508000AC0A38001F043FC40F2D824C2F2000420605F +S31508000AD0042001F03BFC6060082001F037FCA060B0 +S31508000AE00C2001F033FCE06040F2D423C2F200038C S31508000AF01B68062B18BF022B88BF01224AD840F272 -S31508000B000030C2F200000023036003224260402244 -S31508000B108260C3604FF48063036100F0C3FF4FF443 +S31508000B006030C2F2000000230360032242604022E4 +S31508000B108260C3604FF48063036101F0F7FB4FF412 S31508000B203053C4F201035B6B13F0450F07D14FF442 S31508000B303052C4F20102536B13F0450FFBD013F089 -S31508000B40040F04D0042001F00DF8032038BD13F07B -S31508000B50010F04D0012001F005F8012038BD00F08E -S31508000B60B9FF032854D140F2FF5000F0FBFF0020E4 -S31508000B7000F0B8FF10F4604F08BF020C0AD010F45A +S31508000B40040F04D0042001F041FC032038BD13F043 +S31508000B50010F04D0012001F039FC012038BD01F055 +S31508000B60EDFB032854D140F2FF5001F02FFC002082 +S31508000B7001F0ECFB10F4604F08BF020C0AD010F429 S31508000B80005F47D110F4804F46D110F4004F45D18D -S31508000B900122FFE740F27423C2F200031B68042B0C -S31508000BA033D040F2A423C2F200031A6040F20030A8 +S31508000B900122FFE740F2D423C2F200031B68042BAC +S31508000BA033D040F20433C2F200031A6040F26030D8 S31508000BB0C2F200001204026009234360C023836066 -S31508000BC00023C3604FF48063036100F06BFFFFF7F7 -S31508000BD017FC0546D8B900F085FF40F26424C2F236 -S31508000BE000042060042000F07DFF6060082000F00B -S31508000BF079FFA0600C2000F075FFE060284638BD3C +S31508000BC00023C3604FF48063036101F09FFBFFF7C6 +S31508000BD017FC0546D8B901F0B9FB40F2C424C2F2A5 +S31508000BE000042060042001F0B1FB6060082001F0D9 +S31508000BF0ADFBA0600C2001F0A9FBE060284638BDDB S31508000C00252038BD002038BD38BD002038BD38BD88 S31508000C10102038BD132038BD102038BD0F2038BD30 -S31508000C20F0B4014640F27423C2F200031C6880F84F -S31508000C30564040F2A423C2F200031B68A0F85430C1 -S31508000C4040F26423C2F200031A68150EE8B2860958 +S31508000C20F0B4014640F2D423C2F200031C6880F8EF +S31508000C30564040F20433C2F200031B68A0F8543051 +S31508000C4040F2C423C2F200031A68150EE8B28609F8 S31508000C500E70C5F383054D7000F003008870C2F36B S31508000C600740C870C2F307200871D2B24A715B68A0 S31508000C701A0E1201CA80C3F30742C88880B240EA36 @@ -203,7 +203,7 @@ S31508000C801210C88002F00F020A72C3F30720C209C5 S31508000C904A72C0F380128A72C0F34012CA72C0F355 S31508000CA000120A7300224A73012C42D800F003008E S31508000CB0800208610A69DBB242EA83030B6140F2EB -S31508000CC06423C2F200039868020ED3B20C6944EAA0 +S31508000CC0C423C2F200039868020ED3B20C6944EA40 S31508000CD093140C61C2F3C2020A7503F007034B753D S31508000CE0C0F307435A098A75C3F38202CA7503F02B S31508000CF003035B000B76C0F307200B7E43EAD01391 @@ -211,11 +211,11 @@ S31508000D000B760F690A7E0E7AF6B2012303FA06F607 S31508000D100E65023203FA02F2D517A2FB062306FB7A S31508000D2005337E1CA2FB064506FB0355C1E91245A1 S31508000D3024E0022C22D103F03F031B040B6140F28E -S31508000D406423C2F2000398680B69020E43EA022381 +S31508000D40C423C2F2000398680B69020E43EA022321 S31508000D500B610B69C0F3074213430B61C0F307200D S31508000D600A690023013243F10003DB0443EA5233E4 S31508000D70D2048A64CB644FF400730B65C0F3801306 -S31508000D804B7600F03F004000887640F26423C2F2BA +S31508000D804B7600F03F004000887640F2C423C2F25A S31508000D9000031A7A887E40EAD210887602F07F022B S31508000DA0CA76DA68130ED8B2C4090C77C3F34114AD S31508000DB04C77C3F382038B7700F003008000C87773 @@ -225,7 +225,7 @@ S31508000DE02230C2F30723DC0981F82340C3F38014B9 S31508000DF081F82440C3F3401481F82540C3F3001456 S31508000E0081F82640C3F3810481F8274003F00303E1 S31508000E1081F82830C2F3460281F82920012481F896 -S31508000E202A4040F27823C2F200031A68150E81F8A8 +S31508000E202A4040F2D823C2F200031A68150E81F848 S31508000E302C50C2F307452D02CD85CD8DADB2C2F338 S31508000E4007263543CD8512060A635A680D6B160EBA S31508000E5045EA06450D630D6BC2F3074645EA0625C6 @@ -236,97 +236,97 @@ S31508000E90D2B245EA02228A63DB688A6B42EA1362A7 S31508000EA08A63C3F3074291F83C5045EA121581F864 S31508000EB03C5002F00F021202CA87CA8F92B2C3F3DD S31508000EC007252A43CA87C3F3460381F8403081F8C9 -S31508000ED04140F0BC704700BF10B540F27423C2F21F +S31508000ED04140F0BC704700BF10B540F2D423C2F2BF S31508000EE000031B68032B31D0022B31D8B0F5805F85 S31508000EF030D0B0F5006F15D10120FFF741FB04464D -S31508000F0050BB40F28C20C2F200000022027502603B -S31508000F10426082604FF40061C160026100F094FD96 +S31508000F0050BB40F2EC20C2F20000002202750260DB +S31508000F10426082604FF40061C160026101F0C8F965 S31508000F20204610BD0020FFF72BFB0446A8B940F267 -S31508000F308C20C2F2000000220275026042608260C4 -S31508000F40C260026100F080FD204610BD272010BD5A +S31508000F30EC20C2F200000022027502604260826064 +S31508000F40C260026101F0B4F9204610BD272010BD29 S31508000F50002010BD272010BD10BD10BD10B540F2F1 -S31508000F600033C2F20003186007245C6040229A60CE -S31508000F700022DA604FF480621A61184600F092FD8A +S31508000F606033C2F20003186007245C6040229A606E +S31508000F700022DA604FF480621A61184601F0C6F959 S31508000F802046FFF765FA10BD2DE9F04184B000262A -S31508000F908DF80F600C20012100F002FD4FF400646B -S31508000FA0C4F20204204608210C2200F077FC2046F1 -S31508000FB009210C2200F072FC20460A210C2200F0BE -S31508000FC06DFC20460B210C2200F068FC20460C2103 -S31508000FD00A4600F063FC4FF44067C4F2020738463D -S31508000FE002210C2200F05AFC4FF47063019301258C +S31508000F908DF80F600C20012101F024F94FF400644C +S31508000FA0C4F20204204608210C2201F099F82046D2 +S31508000FB009210C2201F094F820460A210C2201F09E +S31508000FC08FF820460B210C2201F08AF820460C21C6 +S31508000FD00A4601F085F84FF44067C4F2020738461E +S31508000FE002210C2201F07CF84FF47063019301256D S31508000FF08DF809504FF002088DF808808DF80A60C0 -S315080010008DF80B50204601A900F0FAFB0423019342 -S3150800101038460DEB030100F0F3FB4FF480530193C0 -S315080010208DF80B60204601A900F0EAFB4FF4006733 -S3150800103001978DF808808DF80B60204601A900F00D -S31508001040DFFB3846294600F0CFFC4FF480002946DE -S3150800105000F0A6FC00F0ECFCFFF7D0FB8DF80F00C3 +S315080010008DF80B50204601A901F01CF80423019322 +S3150800101038460DEB030101F015F84FF480530193A0 +S315080010208DF80B60204601A901F00CF84FF4006713 +S3150800103001978DF808808DF80B60204601A901F00C +S3150800104001F83846294601F0F1F84FF480002946A0 +S3150800105001F0C8F801F020F9FFF7D0FB8DF80F0072 S315080010609DF80F3013F0FF0F03D09DF80F00C0B2A4 S3150800107040E0FFF703FD8DF80F009DF80F3013F0E1 -S31508001080FF0F03D09DF80F00C0B233E040F28C206A +S31508001080FF0F03D09DF80F00C0B233E040F2EC200A S31508001090C2F2000000230375036043608360C360E7 -S315080010A0036100F0D1FC40F2A820C2F20000FFF76D +S315080010A0036101F005F940F20830C2F20000FFF7CB S315080010B0B7FD8DF80F009DF80F3013F0FF0F0BD119 -S315080010C040F2A823C2F20003B3F85400000400213A +S315080010C040F20833C2F20003B3F8540000040021CA S315080010D0FFF744FF8DF80F009DF80F3013F0FF0F50 S315080010E005D14FF40060FFF7F7FE8DF80F009DF865 S315080010F00F00C0B204B0BDE8F08100BF2DE9F84387 -S3150800110007461646BDF8204040F24822C2F20002C1 -S315080011100021117040F28822C2F20002116040F2EA -S315080011201430C2F2000001604FF43052C4F20102DA -S31508001130D16240F27421C2F200010A68022A02BF93 -S31508001140760A46EAC3564FF40074A04640F20030C9 +S3150800110007461646BDF8204040F2A822C2F2000261 +S315080011100021117040F2E822C2F20002116040F28A +S315080011207430C2F2000001604FF43052C4F201027A +S31508001130D16240F2D421C2F200010A68022A02BF33 +S31508001140760A46EAC3564FF40074A04640F2603069 S31508001150C2F200000460102242604022826000222F -S31508001160C2604FF48062026100F09CFC4FF4803448 -S31508001170802501E0013C04D0284600F0E9FC00285F +S31508001160C2604FF48062026101F0D0F84FF4803417 +S31508001170802501E0013C04D0284601F01DF900282D S31508001180F8D01020FFF764F9002840F0868040F276 -S315080011904C20C2F200004FF0FF330360C0F8048011 +S31508001190AC20C2F200004FF0FF330360C0F80480B1 S315080011A0902383600223C360002505610123436100 -S315080011B000F0A6FC40F20030C2F2000006601124DE -S315080011C0446040228260C5604FF48062026100F08C -S315080011D069FC2046FFF73CF9002860D14FF43055EA +S315080011B001F0DAF840F26030C2F20000066011244D +S315080011C0446040228260C5604FF48062026101F08B +S315080011D09DF82046FFF73CF9002860D14FF43055BA S315080011E0C4F2010540F22A664FF400484FF00009A0 -S315080011F00BE0404600F0ACFC38B14C4600F098FCD9 +S315080011F00BE0404601F0E0F838B14C4601F0CCF877 S3150800120038510434202CF9D120376B6B3342F0D097 -S31508001210082000F09DFC28B1082000F0A3FC04205B -S31508001220BDE8F883022000F093FC28B1022000F004 -S3150800123099FC0220BDE8F883202000F089FC28B13B -S31508001240202000F08FFC0620BDE8F8834FF40070DC -S3150800125000F07EFC4FF0FF344FF4001558B14FF400 -S31508001260007000F07FFC0720BDE8F88300F060FC02 -S3150800127047F8040B013C284600F06AFC08B1002C2C -S31508001280F4D140F2FF5000F06DFC40F20003C2F2C8 +S31508001210082001F0D1F828B1082001F0D7F80420F9 +S31508001220BDE8F883022001F0C7F828B1022001F0D2 +S31508001230CDF80220BDE8F883202001F0BDF828B1DA +S31508001240202001F0C3F80620BDE8F8834FF40070AB +S3150800125001F0B2F84FF0FF344FF4001558B14FF4CF +S31508001260007001F0B3F80720BDE8F88301F094F8A0 +S3150800127047F8040B013C284601F09EF808B1002CFB +S31508001280F4D140F2FF5001F0A1F840F20003C2F297 S31508001290000300201860BDE8F883BDE8F883BDE8C0 S315080012A0F88300BF2DE9F84F80461446BDF828207C -S315080012B040F24820C2F200000021017040F2882066 -S315080012C0C2F20000016040F21430C2F20000016070 -S315080012D04FF43050C4F20100C16240F27421C2F2E8 +S315080012B040F2A820C2F200000021017040F2E820A6 +S315080012C0C2F20000016040F27430C2F20000016010 +S315080012D04FF43050C4F20100C16240F2D421C2F288 S315080012E000010968022902BF640A44EAC3544FF49C -S315080012F00072164640F20030C2F200000260102565 +S315080012F00072164640F26030C2F200000260102505 S315080013004560402282600022C2604FF4806202611A -S3150800131000F0C8FB2846FFF79BF8002840F08B80B2 -S3150800132040F20030C2F200000460182444604022F3 -S3150800133082600022C2604FF48062026100F0B2FB54 -S315080013402046FFF785F8002877D140F24C20C2F2F4 +S3150800131000F0FCFF2846FFF79BF8002840F08B807A +S3150800132040F26030C2F20000046018244460402293 +S3150800133082600022C2604FF48062026100F0E6FF1C +S315080013402046FFF785F8002877D140F2AC20C2F294 S3150800135000004FF0FF33036046609023836000244B -S31508001360C46004610123436100F0CAFBA3464FF43D +S31508001360C46004610123436100F0FEFFA3464FF405 S315080013703054C4F2010440F21A654FF4804625E061 -S31508001380304600F0E5FB08B3CBF5007ABAF11F0F3B +S31508001380304601F019F808B3CBF5007ABAF11F0F09 S3150800139010D85FEA9A0A19D0C146002759F8040BF3 -S315080013A000F0CEFB01375745F8D14FEA8A0AD044F8 -S315080013B0D3440BE0002758F8070000F0C1FB0437B8 +S315080013A001F002F801375745F8D14FEA8A0AD044C6 +S315080013B0D3440BE0002758F8070000F0F5FF043780 S315080013C0202FF8D108F120080BF1200B636B2B4274 -S315080013D0D6D0082000F0BCFB28B1082000F0C2FBDC -S315080013E00420BDE8F88F022000F0B2FB28B10220E5 -S315080013F000F0B8FB0220BDE8F88F102000F0A8FB2B -S3150800140028B1102000F0AEFB0520BDE8F88F4FF498 -S31508001410007000F09DFB30B14FF4007000F0A2FBA5 +S315080013D0D6D0082000F0F0FF28B1082000F0F6FF6C +S315080013E00420BDE8F88F022000F0E6FF28B10220AD +S315080013F000F0ECFF0220BDE8F88F102000F0DCFFBB +S3150800140028B1102000F0E2FF0520BDE8F88F4FF460 +S31508001410007000F0D1FF30B14FF4007000F0D6FF35 S315080014200720BDE8F88F40F20003C2F2000300204F S315080014301860BDE8F88FBDE8F88FBDE8F88F00BFE3 -S3150800144038B50546F8B140F20030C2F2000040F265 -S31508001450A422C2F200021268120402600D2444603B +S3150800144038B50546F8B140F26030C2F2000040F205 +S315080014500432C2F200021268120402600D244460CB S31508001460402282600022C2604FF48062026100F06E -S3150800147019FB2046FEF7ECFF044630B900F032FBB4 +S315080014704DFF2046FEF7ECFF044630B900F066FF44 S315080014802860204638BD262038BD38BD00B583B053 S3150800149000230193FFF79CF9012818BFFF2008D104 S315080014A001A8FFF7CDFF18B90198C0F3432000E063 @@ -342,12 +342,12 @@ S315080015300403C2F20003187808BD00BF2DE9F04382 S31508001540ADF5037D88461746D0B11CE0013BDCB2F9 S315080015504FF000094FF40075E619009502A87202CB S315080015604B46FFF7CBFD80B9FFF7A6FF0128FBD056 -S3150800157008EB442002A92A4603F046FF4CB906E0C8 +S3150800157008EB442002A92A4605F092FF4CB906E07A S3150800158001204BB1E2E7012006E0012004E000203B S3150800159002E0013CE4B2DFE70DF5037DBDE8F08328 S315080015A02DE9F043ADF5037D0F469046F0B120E0F6 S315080015B0013BDCB24FF400754FF0000902A807EBB7 -S315080015C044212A4603F020FF04EB0806009502A8EA +S315080015C044212A4605F06CFF04EB0806009502A89C S315080015D072024B46FFF766FE052818BF00280AD197 S315080015E0FFF76AFF0128FBD04CB906E001204BB192 S315080015F0DEE7012006E0012004E0002002E0013CCD @@ -358,1156 +358,1689 @@ S315080016301015002019E0A8B96846FFF7F1FA129BC1 S315080016405B0A139A43EAC253236000200DE04FF465 S3150800165000731380002008E030B92023136004E0EB S31508001660042002E0002000E0002016B010BD00BFF4 -S315080016700020C4F2AA2070474FF47053C4F2020344 -S315080016801B69002B0DDA4FF47053C4F2020340F2C3 -S315080016902312C4F267525A6048F6AB12CCF6EF52E0 -S315080016A05A6070474FF47053C4F202031A6942F045 -S315080016B000421A61704700BF4FF47053C4F2020328 -S315080016C0D86070474FF47053C4F20203DB6813F412 -S315080016D0803F1BD14FF47053C4F20203DB6813F04A -S315080016E0100F15D14FF47053C4F20203DB6813F0E0 -S315080016F0EF0F0FD14FF47053C4F20203D86800F00D -S31508001700020000280CBF08200720704701207047F8 -S31508001710052070470620704700B583B008238DF86A -S315080017200730FFF7CFFF8DF807009DF80730DBB2CB -S31508001730012B08D1FFF7C6FF8DF807009DF8073083 -S31508001740DBB2012BF6D09DF8070003B05DF804FB69 -S3150800175070B50546002659B1012908BF4FF48076B1 -S3150800176006D0022914BF4FF440764FF40076FFE7FF -S31508001770FFF7D2FF082821D14FF47054C4F20204AF -S31508001780236923F44073236123691E432661236971 -S3150800179023F0F8032361236943F002031D432561FF -S315080017A0236943F480332361FFF7B6FF236923F0E7 -S315080017B002032361236923F0F803236170BD00BF88 -S315080017C070B505460E46FFF7A7FF082816D14FF451 -S315080017D07054C4F20204236923F440732361236915 -S315080017E043F400732361236943F0010323612E60E8 -S315080017F0FFF792FF236923F00103236170BD00BF41 -S31508001800F0B400230125032605FA03F20C681440F8 -S31508001810944238D107685A0006FA02F4E44327408E -S315080018200760076891F804C00CFA02FC4CEA07073F -S3150800183007600F79013FFFB2012F16D887683C4031 -S31508001840846087684C7994403C43846047689CB2BE -S3150800185005FA04FC27EA0C074760476891F806C0B2 -S315080018600CFA04F4A4B23C434460C7689CB2640012 -S3150800187006FA04F427EA0404C460C468CF7907FAB0 -S3150800188002F22243C2600133102BBDD1F0BC70476F -S31508001890036919420CBF00200120704710B401F0FB -S315080018A007039B00C90800EB8100046A0F219940D1 -S315080018B024EA01010162016A9A40114301625DF856 -S315080018C0044B704710B44FF46053C4F202039B688C -S315080018D003F00C03042B09D0082B0DD0002B36D1AE -S315080018E04FF41053C0F2F403036035E04FF4D853B5 -S315080018F0C0F2B70303602FE04FF46053C4F202034B -S315080019005C685A6802F03F0214F4800F4FF4605383 -S31508001910C4F202035B68C3F3881319BF4FF4D854A3 -S31508001920C0F2B7044FF41054C0F2F404B4FBF2F159 -S3150800193001FB03F14FF46053C4F202035A68C2F381 -S31508001940014201325200B1FBF2F3036004E04FF4A6 -S315080019501053C0F2F40303604FF46052C4F202025B -S315080019609168C1F3031140F20803C2F20003595CFF -S31508001970C9B2046824FA01F141609468C4F3822468 -S315080019801C5DE4B221FA04F484609268C2F3423220 -S315080019909B5CDBB2D940C1605DF8044B704700BF61 -S315080019A039B14FF46053C4F202031A6B104318633B -S315080019B070474FF46053C4F202031A6B22EA000020 -S315080019C01863704739B14FF46053C4F202031A6CB6 -S315080019D01043186470474FF46053C4F202031A6C3C -S315080019E022EA00001864704739B14FF46053C4F214 -S315080019F002035A6C1043586470474FF46053C4F29C -S31508001A0002035A6C22EA00005864704739B14FF451 -S31508001A106053C4F202035A6A1043586270474FF47F -S31508001A206053C4F202035A6A22EA000058627047F9 -S31508001A3008B54FF400600121FFF7E8FF4FF4006096 -S31508001A400021FFF7E3FF08BD10B44FF43053C4F28A -S31508001A5001035C68416882681143C26811430268E1 -S31508001A60114302690A4324F4FD4424F07F04224307 -S31508001A70017D0A435A605DF8044B704748F2A0039B -S31508001A80C4F22523186070474FF43053C4F201039B -S31508001A90186070474FF43053C4F20103186800F019 -S31508001AA00300704710B402684FF43053C4F20103C0 -S31508001AB09A60DC6824F4FF6424F0070482684168AD -S31508001AC01143C2680A43006902432243DA605DF89B -S31508001AD0044B70474FF43053C4F201031869C0B27F -S31508001AE0704700BF82B00023019342F61443C4F244 -S31508001AF0010303440193019B186802B0704700BFB5 -S31508001B0010B402684FF43053C4F201035A624268B3 -S31508001B109A62DC6A24F0F704C26881681143026994 -S31508001B200A43406902432243DA625DF8044B704770 -S31508001B304FF43053C4F20103D3F88000704700BF56 -S31508001B404FF43053C4F20103C3F88000704700BF56 -S31508001B504FF43053C4F201035B6B18420CBF0020EC -S31508001B60012070474FF43053C4F20103986370475D -S31508001B7030B585B004460D46038A23F440531B044A -S31508001B801B0CCA8813430382838923F4B05323F0BA -S31508001B900C031B041B0C0989AA880A4369890A4392 -S31508001BA092B213438381838A23F440731B041B0C6C -S31508001BB0AA89134383826846FFF784FE4FF4A0522E -S31508001BC0C4F201024FF48053C4F201039C4218BFC9 -S31508001BD094420CBF039A029AA3891BB2002B02EB0C -S31508001BE0820202EB8202BDBF2B685B00B2FBF3F2F6 -S31508001BF02968A4BF8900B2FBF1F248F21F53C5F267 -S31508001C00EB13A3FB02135B091D01642003FB1023DE -S31508001C10A08900B200280BDADB00323348F21F51E4 -S31508001C20C5F2EB11A1FB0321C1F3421129430AE0D6 -S31508001C301B01323348F21F51C5F2EB11A1FB0321F8 -S31508001C40C1F34311294389B2218105B030BD00BFD4 -S31508001C5029B183899BB243F40053838170478389F2 -S31508001C6023F400531B041B0C83817047C1F308013E -S31508001C70818070478088C0F308007047038819423E -S31508001C800CBF00200120704782B04FF46053C4F2A5 -S31508001C9002031A6842F001021A6000229A60196863 -S31508001CA021F0847121F48031196043F21001C2F2E7 -S31508001CB000415960196821F480211960DA600092A0 -S31508001CC001921A6842F480321A604FF46052C4F2E4 -S31508001CD00202136803F400330193009B0133009357 -S31508001CE0019B1BB9009BB3F5A06FF2D14FF460536B -S31508001CF0C4F202031B6813F4003F14BF0123002338 -S31508001D000193019B012B46D14FF46053C4F20203A1 -S31508001D101A6C42F080521A644FF4E042C4F2000290 -S31508001D20116841F4404111609A689A609A6842F4D1 -S31508001D3000429A609A6842F4A0529A6045F20C42B0 -S31508001D40C0F240725A601A6842F080721A604FF404 -S31508001D506052C4F20202136813F0007FFBD04FF4FE -S31508001D607053C4F2020340F205621A604FF46053DE -S31508001D70C4F202039A6822F003029A609A6842F053 -S31508001D8002029A604FF46052C4F20202936803F0AA -S31508001D900C03082BFAD14FF46D43CEF200034FF033 -S31508001DA000629A6002B0704732B1821811F8013B9E -S31508001DB000F8013B9042F9D1704700BFCA7E8B7E7E -S31508001DC043EA02230278032A01BF487D0A7D42EAD4 -S31508001DD0002243EA02431846704700BF00F10B0190 -S31508001DE00023DA0142EA530310F8012B52FA83F36F -S31508001DF0DBB28842F5D11846704700BF10B50446D5 -S31508001E000A46407804F134010123FFF797FBD0BB5B -S31508001E1094F8332294F8323243EA022212B24AF68E -S31508001E205523CFF6FF739A422FD194F86D2094F874 -S31508001E306C301B0443EA026294F86A30134394F840 -S31508001E406B2043EA022222F07F4244F24613C0F294 -S31508001E5054039A421BD094F8890094F888301B04DE -S31508001E6043EA006094F88630034394F8870043EA0F -S31508001E70002020F07F4044F24613C0F25403C01AF3 -S31508001E8018BF012010BD032010BD022010BD002080 -S31508001E9010BD00BF2DE9F041044603791BB3056B5D -S31508001EA000F13407407839462A460123FFF778FBC4 -S31508001EB0E0B900232371636A9D421AD3E269134489 -S31508001EC09D4219D2E678012E19D94FF00108E26928 -S31508001ED01544607839462A464346FFF761FB013EBA -S31508001EE0012EF4D10EE00020BDE8F0810120BDE806 -S31508001EF0F0810020BDE8F0810020BDE8F0810020D7 -S31508001F00BDE8F0810020BDE8F08100BF38B5044681 -S31508001F100D46036B8B420CD0FFF7BCFF58B96078AF -S31508001F2004F134012A460123FFF708FB28B9256383 -S31508001F3038BD002038BD012038BD012038BD00BF9E -S31508001F4008B588B103688BB1197889B1D9888288B0 -S31508001F5091420FD15878FFF7D7FA00F00100002810 -S31508001F6014BF0320002008BD092008BD092008BDAC -S31508001F70092008BD092008BD2DE9F041154603686A -S31508001F801C78303C092C00F2B5815A783A2A40F080 -S31508001F90B1810233036000230B60002C40F071818D -S31508001FA040F21C53C2F200031C68002C00F06C813E -S31508001FB00C6023788BB16078FFF7A6FA10F0010F52 -S31508001FC00BD1002D00F0638100F00400C0B2002898 -S31508001FD014BF0A200020BDE8F08100202070607040 -S31508001FE0FFF776FA10F0010F40F054811DB110F09A -S31508001FF0040F40F0528120460021FFF7FFFE01281A -S3150800200018BF002517D194F8F631002B00F0488147 -S3150800201094F8FD2194F8FC311B0443EA026294F813 -S31508002020FA31134394F8FB5143EA0525204629461D -S31508002030FFF7E4FEFFE7032800F03581002840F0AB -S31508002040358194F8402094F83F3043EA02231BB2C6 -S31508002050B3F5007F40F02D8194F84B0094F84A3090 -S3150800206053EA00200DD194F85B2094F85A301B04EB -S3150800207043EA026294F85830134394F8590043EA45 -S315080020800020E06194F84410E1704B1EDBB2012B8E -S3150800209000F2128194F84130A370002B00F00F81F2 -S315080020A05A1E1A4240F00E8194F8466094F845206C -S315080020B042EA0622228112F00F0F40F0068194F8B8 -S315080020C0487094F8476056EA07260DD194F8577079 -S315080020D094F85660360446EA076794F854603E4317 -S315080020E094F8557046EA072694F843C094F8427067 -S315080020F057EA0C2700F0EC8001FB00FC07EB1211F5 -S3150800210061448E42C0F0E780761AB6FBF3F3002BE3 -S3150800211000F0E48040F6F576B3428CBF022601262D -S315080021204FF6F578434500F2E8800233A36125624D -S315080021302F4467622944E162032E13D1002A40F036 -S31508002140D08094F8631094F86220120442EA016180 -S3150800215094F860200A4394F8611042EA0122A262C8 -S315080021609B000EE0002A00F0BF806744A762022E9B -S315080021700FBF5B0003225A4303F0010318BF03EBAA -S31508002180520303F2FF13B0EB532FC0F0B0804FF0A9 -S31508002190FF3323610023E360032E63D1637194F850 -S315080021A0652094F8643043EA02222A446261607822 -S315080021B004F134010123FFF7C1F9002852D194F83C -S315080021C0332294F8323243EA022212B24AF65523EF -S315080021D0CFF6FF739A4245D194F8372094F83630F3 -S315080021E01B0443EA026294F83430134394F835200A -S315080021F043EA022245F25223C4F261139A4231D1CC -S3150800220094F81B2294F81A321B0443EA026294F8E3 -S315080022101832134394F8192243EA022247F272232A -S31508002220C6F241139A421DD194F8232294F8223219 -S315080022301B0443EA026294F82032134394F82122DD -S3150800224043EA0223E36094F81F2294F81E321B0423 -S3150800225043EA026294F81C32134394F81D2243EAB7 -S3150800226002232361267040F21853C2F200031A882B -S31508002270013292B21A80E280002020632071BDE804 -S31508002280F0810B20BDE8F0810C20BDE8F08100202C -S31508002290BDE8F0810320BDE8F0810A20BDE8F081A1 -S315080022A00D20BDE8F0810120BDE8F0810D20BDE8D4 -S315080022B0F0810D20BDE8F0810D20BDE8F0810D20EC -S315080022C0BDE8F0810D20BDE8F0810D20BDE8F08164 -S315080022D00D20BDE8F0810D20BDE8F0810D20BDE898 -S315080022E0F0810D20BDE8F0810D20BDE8F0810D20BC -S315080022F0BDE8F08100230B6052E60233A361256234 -S315080023002F4467622944E162032617E72DE9F04165 -S315080023100D4601F109020369002B5ED0416991F867 -S315080023200C800B78202B1BD00E46002408F00807DB -S31508002330FFB203E016F8013F202B11D0052B08BF8A -S31508002340E52347B1A3F1410C5FFA8CFCBCF1190FE8 -S315080023509CBF2033DBB202F8013B0134082CE9D1DB -S315080023600B7A202B22D0561C2E2313700B7A202B87 -S315080023701BD001F10804171D324608F010085FFA51 -S3150800238088F603E014F8013F202B0FD046B1A3F1DD -S31508002390410C5FFA8CFCBCF1190F9CBF2033DBB2F1 -S315080023A002F8013BBA42EDD100E03246CB7A2B72F5 -S315080023B0CC7F8B7F1B0443EA04630C7F23434C7F4B -S315080023C043EA04232B604C7E0B7E43EA0423AB804E -S315080023D0CC7D8B7D43EA0423EB8000231370AE6922 -S315080023E046B3EB6933B3036900240BB3028C4FF68B -S315080023F0FF739A4208BF00241AD0C769388890B17B -S315080024000024A046414601F02BFC70B1EA69013A66 -S31508002410A2420CD90134321902F8010C37F8020F1E -S315080024200028EFD104E0002402E0002400E00024A4 -S3150800243000233355BDE8F08110B50446FFF72AFDA1 -S315080024400346002854D12378032B49D16379002BFE -S3150800245046D00023236304F1340104F50D700B46BE -S31508002460002203F8012B8342FBD1552384F832322C -S31508002470AA2384F83332522384F8343084F835306A -S31508002480612384F83630412284F83720722084F894 -S31508002490180284F8190284F81A2284F81B32236970 -S315080024A084F81C32C3F3072284F81D221A0C84F818 -S315080024B01E221B0E84F81F32E36884F82032C3F309 -S315080024C0072284F821221A0C84F822221B0E84F88B -S315080024D02332607862690123FFF762F8002363718B -S315080024E0607800210A46FFF791F8031C18BF0123FC -S315080024F0184610BD02398369023B99423DBF82786E -S31508002500C36A02FB01300020704700BFF8B50546D4 -S315080025100C4601295CD9836999425BD20378022B60 -S3150800252028D0032B38D0012B56D101EB5106416A2E -S3150800253001EB5621FFF7EAFC002850D1C6F3080341 -S315080025402B4493F834700136696A284601EB562104 -S31508002550FFF7DCFC002845D1C6F30806354495F894 -S31508002560340047EA002014F0010F14BF0009C0F335 -S315080025700B00F8BD416A01EB1421FFF7C7FCA0BBAD -S31508002580640004F4FF742B1993F834302C4494F83F -S31508002590350043EA0020F8BD416A01EBD411FFF784 -S315080025A0B5FC28BBA40004F4FE742B1993F8360076 -S315080025B093F83720120642EA004293F8350042EAB9 -S315080025C000202C4494F83430184320F07040F8BDAD -S315080025D00120F8BD0120F8BD4FF0FF30F8BD4FF0DF -S315080025E0FF30F8BD4FF0FF30F8BD4FF0FF30F8BDB3 -S315080025F04FF0FF30F8BD00BF70B504460D46E180C8 -S315080026008168012938D003689A69914236D271B92E -S315080026101A78032A01D1996A49B90022E2601A890F -S31508002620AA422DD99B6A03EB151323611BE09E78FA -S315080026303601B54210D32068FFF768FF0146B0F1AE -S31508002640FF3F1FD001281FD923689B6998421DD2D6 -S31508002650AD1BADB2AE42EED9E1602068FFF74AFF86 -S3150800266000EB1510206105F00F05236803EB4513F1 -S3150800267034336361002070BD022070BD022070BD36 -S31508002680022070BD012070BD022070BD022070BD01 -S31508002690F8B505460C461646012998BF02237CD98B -S315080026A08369994228BF022377D20378022B40D048 -S315080026B0032B50D0012B18BF02236BD101EB510716 -S315080026C0416A01EB5721FFF721FC0346002861D137 -S315080026D0C7F3080314F001041FBFEA1892F8342060 -S315080026E002F00F02F1B21ABF42EA0112D2B2F2B2F6 -S315080026F02B4483F83420013701232B71696A284655 -S3150800270001EB5721FFF702FC0346002842D1C7F325 -S31508002710080714B1C6F3071607E0EA1992F8342039 -S3150800272022F00F02C6F3032616432F4487F83460B7 -S3150800273030E0416A01EB1421FFF7E8FB034648BB8A -S31508002740640004F4FF742A1982F83460C6F3072675 -S3150800275082F835601EE0416A01EBD411FFF7D6FB1B -S315080027600346B8B9A40004F4FE742A1992F837107F -S3150800277009062C4401F070410E4384F83460C6F310 -S31508002780072182F83510310C82F83610360E82F899 -S315080027903760FFE701222A71FFE71846F8BD00BF38 -S315080027A02DE9F0410546884631B9C66876B1836990 -S315080027B09E4228BF01260AE0FFF7A8FE012847D94E -S315080027C0AB69984228BF464601D24DE001263446F9 -S315080027D002270134AB699C4202D3012E3BD93C4601 -S315080027E028462146FFF792FE38B1B0F1FF3F18BFE1 -S315080027F0012833D0B442ECD132E026462846214699 -S315080028006FF07042FFF744FF0346D0F1010038BF6E -S315080028100020B8F1000F08BF002028B1284641461D -S315080028202246FFF735FF03465BB9EE602B69B3F125 -S31508002830FF3F18D0013B2B6101236B712046BDE891 -S31508002840F081012B14BF01204FF0FF30BDE8F08165 -S315080028500120BDE8F0810020BDE8F081BDE8F081E7 -S315080028600020BDE8F0812046BDE8F0812DE9F84357 -S3150800287004460E46C5880135ADB2002D6AD00369F7 -S31508002880002B6AD015F00F075BD101330361C168CD -S3150800289021B903681B89AB4262D952E00068837884 -S315080028A0013B13EA15134CD1FFF730FE8046012889 -S315080028B059D9B0F1FF3F59D020688369984539D373 -S315080028C0002E56D0E168FFF76BFF8046002853D0EC -S315080028D0012854D0B0F1FF3F54D02068FFF7DAFA48 -S315080028E0002852D1236803F1340100231A46CA543A -S315080028F00133B3F5007FFAD1266830464146FFF723 -S31508002900F9FD306300264FF001090CE083F80490C6 -S315080029102068FFF7BFFA00283AD123681A6B0132FC -S315080029201A630136F6B223689A78B242EED81A6B61 -S31508002930921B1A63C4F80C8020684146FFF7DAFD3B -S315080029402061E580236803EB471334336361002075 -S31508002950BDE8F8830420BDE8F8830420BDE8F883C1 -S315080029600420BDE8F8830220BDE8F8830120BDE80D -S31508002970F8830420BDE8F8830720BDE8F883022021 -S31508002980BDE8F8830120BDE8F8830120BDE8F88397 -S315080029900120BDE8F88300BF2DE9F04F89B0054650 -S315080029A00021FFF729FE002840F0AC804FF0FF0910 -S315080029B0C8464F4645F27451C0F60001029101F12E -S315080029C00C0204924FF6FF7A4FF0000B286829692B -S315080029D0FFF79CFA002840F096806C692678002E4E -S315080029E000F09280E37A03F03F02E52E7FD013F0E1 -S315080029F0080F04D00F2A18BFB8467BD101E00F2A6A -S31508002A0058D1EB690193002B74D016F0400F06D00D -S31508002A1094F80D9006F0BF06EB882B8403E0B045CA -S31508002A2018BFB84666D1617B0391494518BFB846B9 -S31508002A3060D1237823F04003013B03EB430203EB09 -S31508002A4082020592029A02F1FF394FF001080796B1 -S31508002A50059E06954546DDF8108019F8013FE218EF -S31508002A605078E35C43EA00207DB101F01FF9054682 -S31508002A70FE2E56D8731C0593019931F8160001F0FD -S31508002A8015F985424FD1059E01E050454DD1C14506 -S31508002A90E3D1A8460596079E069D237813F0400FB6 -S31508002AA039D0B8F1000F36D0059A019931F81230AD -S31508002AB08BB33BE0B8F1000F04D12046FFF78EF93F -S31508002AC0484523D0A5F820A0AB69DA7A12F0010FA1 -S31508002AD008BF04F10B0002D00BE0844218D014F8AA -S31508002AE0011B13F8012B9142F7D0B84602E0B8460D -S31508002AF000E0B84628465946FFF7B8FE00283FF4D6 -S31508002B0065AF07E016E015E0042013E0002011E0A9 -S31508002B1000200FE00EE0013E5FFA86F8DDF80C9023 -S31508002B20E8E7069D02E0069D00E0069DDDF80C90AC -S31508002B30B846DFE709B0BDE8F08F00BF2DE9F04FD2 -S31508002B4087B0814688460B782F2B18BF5C2B08BFA9 -S31508002B5001F101080023836098F800301F2B07D87D -S31508002B600021FFF749FD03460022C9F814207AE13F -S31508002B704FF0010A45F2E04BC0F6000B45F2EC4176 -S31508002B80C0F60001049145F2F442C0F6000205922F -S31508002B9098F800302F2B18BF5C2B08D108F10103D9 -S31508002BA0984613F8012B2F2A18BF5C2AF8D0D9F8B3 -S31508002BB01C5098F800002F2818BF1F282CD95C280D -S31508002BC000F02D81AF1E4646544607E05C2B00F008 -S31508002BD02881B2F5807F00F041811446514601F004 -S31508002BE03FF80146002800F039817F2809D82229B4 -S31508002BF000F034815A4612F8013F13B19842FAD1CF -S31508002C002CE127F8021F621C16F8013F18462F2BE5 -S31508002C1018BF1F2BDAD801E00024524690441F281B -S31508002C2098BF042601D90026FFE7002C00F016817C -S31508002C3004F10043013B5A0035F813302E2B18BF18 -S31508002C40202B40F0F080931C2B4407E033F8042C2B -S31508002C50023B2E2A18BF202A40F0E580013CF5D118 -S31508002C60FCE003F8011B8342FBD12B88202B18BFFD -S31508002C702E2B40F0E48028460023013330F8021F4B -S31508002C80202918BF2E29F8D0002B00F0D98046F04D -S31508002C900306D5E0013C05D10821039100220192E3 -S31508002CA0029205E0023A32F8021C2E29F2D1F3E725 -S31508002CB05F1C35F81300002861D0202808D0E31BD4 -S31508002CC018BF01232E2814BF002203F001021AB1EF -S31508002CD046F003063B46EBE7019A0399BC4218BF48 -S31508002CE08A4214D30B2903D146F00306029A49E017 -S31508002CF00BB146F00306A74243D8029A9300DBB20B -S31508002D00029323460B21039108220192D0E77F28DC -S31508002D100DD9002100F0A4FF0346002800F0A0808A -S31508002D2005990B4413F8800C46F0020650B101468B -S31508002D302B2807D0049A12F8013F002B00F0878051 -S31508002D409942F8D146F003065F2010E0029A42F055 -S31508002D50020202920BE0A0F161039BB2192B9FBFFE -S31508002D60029B43F001030293203898BF80B2D9F83A -S31508002D701830019958543B460131019198E7029A57 -S31508002D8000E0029AD9F818301978E52904BF052118 -S31508002D901970039B082B02BF9200D2B202920299C5 -S31508002DA001F00C030C2B03D001F00302032A01D116 -S31508002DB046F0020616F0020F0AD1029901F0030244 -S31508002DC0012A08BF46F01006042B08BF46F008067D -S31508002DD0D9F81830DE724846FFF7DEFDD9F8183004 -S31508002DE0DA7A034648B104283DD102F00403DBB27F -S31508002DF0002B14BF0346052335E012F0040F32D129 -S31508002E00D9F81410CB7A13F0100F06D0D9F80000B1 -S31508002E10FEF7D4FFC9F80800BAE6052323E0002424 -S31508002E2052469044FFE66700EA194FF0000325F87A -S31508002E301430D9F8183003F10B00202111E70023CC -S31508002E402F4437F8021C2E293FF426AF22E7A0F1BB -S31508002E5041039BB2192B7FF679AF7CE7062302E084 -S31508002E6046F002066EE7184607B0BDE8F08F00BFC9 -S31508002E702DE9F04F83B0044689464FF0FF0B5E46B6 -S31508002E800425D84645F2745AC0F6000A0AF10C031E -S31508002E900093002770E02068FFF738F805460028F9 -S31508002EA06ED162691378002B74D0D17AE52B18BFDE -S31508002EB02E2B59D001F03F01082914BF002001200C -S31508002EC0484518BF464651D10F2943D113F0400F44 -S31508002ED006D092F80DB003F0BF03E188218403E021 -S31508002EE09E4218BF464641D192F80DE0DE4518BF0E -S31508002EF046463BD1D4F81CC0117801F03F01013990 -S31508002F0001EB410501EB85050AF1FF310126019325 -S31508002F10DDF800B011F8013FD0184078D35C43EAD9 -S31508002F20002036B1FE2D32D82CF81500064601359C -S31508002F3003E04FF6FF73984229D15945EAD1019B20 -S31508002F40127812F0400F1ED0FE2D98BF2CF815707F -S31508002F5019D91CE010461EB9FEF740FF58451BD08C -S31508002F604FF6FF73238417E04646FFE720463946A7 -S31508002F70FFF77CFC054618B9216900298BD15DB19C -S31508002F800023236108E0013BDEB2F346EEE7F34691 -S31508002F904646EBE70425F3E7284603B0BDE8F08F7D -S31508002FA02DE9F0410446C588018C4FF6FF73994216 -S31508002FB008BF2946FFF720FB0346D0B9E5270126B7 -S31508002FC04FF0000820682169FEF7A0FF034668B99C -S31508002FD06269177022681671E288AA4209D22046E9 -S31508002FE04146FFF743FC03460028EBD0042B08BFF5 -S31508002FF002231846BDE8F0812DE9F04104460E4645 -S31508003000012998BF02212BD983699E4228BF022134 -S3150800301026D200274FF0010820463146FFF776FAF8 -S315080030200546C0B1012818D0B0F1FF3F17D0204699 -S3150800303031463A46FFF72CFB014688B92369B3F1B6 -S31508003040FF3F1EBF0133236184F80580A369AB42A5 -S3150800305006D92E46E0E7002102E0022100E0012120 -S315080030600846BDE8F08100BF70B582B00546164631 -S315080030701C460B22FEF798FE052C0BD9B21EE3035D -S3150800308043EA540432F8023F13FA84F4A4B253888C -S31508003090002BF4D1072204F00F0101F13003392B7C -S315080030A088BF01F13703013A00A911444B7024097E -S315080030B0F1D114467E2102AB134403F8081C62B111 -S315080030C02B78202B0BD0294600230133A34207D0A7 -S315080030D011F8010F2028F8D102E0002300E00023B0 -S315080030E02020072A9FBF02A9891811F8081C013257 -S315080030F088BF0146E9540133072BF2D902B070BDE7 -S315080031002DE9F04F87B004468769C66903A8394692 -S315080031100C22FEF749FE9DF8173013F0010F21D057 -S315080031200023FB72E3610125384603A932462B4684 -S31508003130FFF79AFF2046FFF72FFC034620B9013513 -S31508003140ADB2642DF0D1D5E0642D08BF072000F09C -S31508003150EF80042B18BF184640F0EA809DF8173018 -S31508003160FB72E6619DF8173013F0020F08BF0127BE -S3150800317016D033883BB1002301339BB236F81320AF -S31508003180002AF9D100E0002319334EF64F42C4F65F -S31508003190C46282FB0317DB17C3EBA707BFB2FFE7BF -S315080031A020460021FFF728FA0346002840F0BF8092 -S315080031B00025A846012620682169FEF7A7FE0346D2 -S315080031C0002840F0B48063691B78E52B18BF002BF4 -S315080031D003D10135AF4201D18EE04546204631463E -S315080031E0FFF744FB03460028E5D0A0E0E188C9EBD9 -S315080031F00101204689B2FFF7FFF90346002840F08F -S315080032009680A069FEF7EAFD01904FF000084FF698 -S31508003210FF7545F27456C0F60006FF272068216937 -S31508003220FEF774FE0346002840F08180D4F81CA0FF -S3150800323061695FFA89FB019A4A734FF00F03CB72F3 -S3150800324081F80C8081F81A8081F81B800BF1FF3316 -S3150800325003EB430003EB80000122434602E070467D -S315080032602B460132AB424ED000F1010E3AF810302F -S31508003270B01810F8010C0B5408444FEA132C80F8C8 -S3150800328001C0002B49D070460C2AEAD9AB4202D0BD -S315080032903AF810300BB94BF0400B81F800B02368B0 -S315080032A04FF00101197120464146FFF7DFFA034640 -S315080032B000283CD109F1FF391FFA89F9B9F1000F45 -S315080032C0ACD12DE0636903F12001002203F8012B3C -S315080032D08B42FBD16069A1690B22FEF765FD636924 -S315080032E0A269D27A02F018021A73236801221A71A7 -S315080032F000201DE007201BE0013F1FFA87F9B9F1FE -S31508003300000F0DD072E706EB020E1EF801EC01F86D -S315080033100E708E448EF80170B6E70C2A9FD9BAE76C -S3150800332020682169FEF7F2FD0028CBD000E0184698 -S3150800333007B0BDE8F08F00BF88B940F21C53C2F24F -S3150800334000031B680BB100221A7009B100230B7029 -S3150800335040F21C53C2F200031960002070470B208C -S31508003360704700BF2DE9F0438FB00191154604461A -S31508003370002800F094800023036001A805A902F044 -S315080033801E02FEF7F9FD002840F08B8005F01F07A6 -S3150800339002AB0B9340F21833C2F200030C9305A854 -S315080033A00199FFF7CBFB0A9E034600287FD1002E22 -S315080033B078D17BE05BB1042B40F0858005A8FFF748 -S315080033C09FFE47F008070A9E034638B17BE0F37A6A -S315080033D013F0110F70D115F0040F6FD117F0080F05 -S315080033E03CD0FEF745F9B073C0F30723F373030C1B -S315080033F03374000E70740025F57235777577B577D6 -S31508003400F577DDF8148040463146FEF7D7FCB576E9 -S31508003410F57635757575012388F804300546E8B1E3 -S31508003420D8F8309040462946FFF7E6FD03460028BF -S3150800343049D10598013DC5604946FEF767FD034633 -S315080034400AE0F37A13F0100F3AD115F0020F05D0FF -S3150800345013F0010F36D101E0002B34D117F0080F15 -S3150800346018BF47F02007059D2B6BE3612662A771FD -S3150800347028463146FEF7A2FC2061F27FB37F1B0483 -S3150800348043EA0263327F1343727F43EA0223E3600F -S315080034900020A060A0612560EB88A38014E00920C5 -S315080034A012E011E015F01C0F91D1CAE7062315F0BA -S315080034B01C0F7FF47FAFCFE7072304E0082302E061 -S315080034C0042300E0072318460FB0BDE8F08300BFC9 -S315080034D02DE9F04F83B004460F4690461E4600235A -S315080034E03360FEF72DFD002840F0BF80A37913F066 -S315080034F0800F18BF022040F0BC8013F0010F08BFF0 -S31508003500072000F0B680E568A368ED1AA84538BF1D -S315080035104546002D00F0AA8004F124030193A36810 -S31508003520C3F30802002A40F08680206890F802A0BB -S315080035300AF1FF3A0AEA532A1AF0FF0A17D10BB919 -S31508003540206902E06169FEF7E1FF012805D8A37941 -S3150800355063F07F03A37102208BE0B0F1FF3F05D132 -S31508003560A37963F07F03A371012082E06061D4F838 -S31508003570008040466169FEF7BDFF814628B9A379F8 -S3150800358063F07F03A371022073E0D1445FEA552BF1 -S3150800359029D098F802300BEB0A029A4288BFCAEB88 -S315080035A0030B98F8010039464A465FFA8BF3FDF794 -S315080035B0C5FF28B1A37963F07F03A371012058E002 -S315080035C0A37913F0400F0BD0A369C9EB0300834519 -S315080035D006D907EB402001994FF40072FEF7E4FB89 -S315080035E04FEA4B2B35E0A2694A4522D0A37913F05E -S315080035F0400F10D098F8010001990123FDF7D0FF7C -S3150800360028B1A37963F07F03A371012031E0A37980 -S3150800361023F04003A3712368587801994A46012389 -S31508003620FDF78CFF28B1A37963F07F03A37101200E -S315080036301FE0C4F81890A168C1F30801C1F5007B22 -S315080036405D4538BFAB462144384624315A46FEF715 -S31508003650ABFB5F44A3685B44A36033685B44336099 -S31508003660B5EB0B057FF45BAF02E002E0002000E05B -S31508003670002003B0BDE8F08F2DE9F04F83B0044673 -S315080036800F4615461E4600233360FEF759FC0028F0 -S3150800369040F0DA80A37913F0800F18BF022040F0BB -S315080036A0D48013F0020F08BF072000F0CE80E3682D -S315080036B0DD4280F0BE80002D00F0BB8004F12403BB -S315080036C00193A368C3F30802002A40F09580206896 -S315080036D090F802B00BF1FF3B0BEA532B1BF0FF0BE4 -S315080036E021D13BB9236963B90021FFF759F803468D -S315080036F0206103E06169FFF753F80346002B00F0E9 -S315080037009880012B05D1A37963F07F03A37102206A -S315080037109BE0B3F1FF3F05D1A37963F07F03A37163 -S31508003720012092E06361A37913F0400F11D023685A -S3150800373058780199A2690123FDF732FF28B1A379C8 -S3150800374063F07F03A37101207FE0A37923F0400390 -S31508003750A371D4F8008040466169FEF7CBFE814626 -S3150800376028B9A37963F07F03A37102206DE0D944D9 -S315080037705FEA552A29D098F802300AEB0B029A42DA -S3150800378088BFCBEB030A98F8010039464A465FFA28 -S315080037908AF3FDF705FF28B1A37963F07F03A371C8 -S315080037A0012052E0A369C9EB03018A450AD90198A9 -S315080037B007EB41214FF40072FEF7F6FAA37923F0DE -S315080037C04003A3714FEA4A2A28E0A3694B4511D062 -S315080037D0A268E3689A420DD298F8010001994A4610 -S315080037E00123FDF7ABFE28B1A37963F07F03A3712C -S315080037F001202AE0C4F81890A068C0F30800C0F5B4 -S31508003800007A554538BFAA462044243039465246E0 -S31508003810FEF7CAFAA37943F04003A3715744A36895 -S315080038205344A360336853443360B5EB0A057FF409 -S3150800383048AFA368E268934288BFE360A37943F080 -S315080038402003A371002000E0FFE703B0BDE8F08F76 -S3150800385038B50446FEF774FB002849D1A37913F05E -S31508003860200F46D013F0400F0DD0214651F8243BC7 -S315080038705878A2690123FDF793FE00283BD1A37966 -S3150800388023F04003A3712068E169FEF73FFB002897 -S3150800389033D1256AEB7A43F02003EB72E3682B7782 -S315080038A0A3891B0A6B77E389AB77E37BEB772369FD -S315080038B0AB76C3F30722EA761B0C2B751B0A6B75CE -S315080038C0FDF7D6FEA875C0F30723EB75030C2B7618 -S315080038D0000E68760023AB74EB74A37923F02003FB -S315080038E0A371236801221A712068FEF7A5FD38BD69 -S315080038F038BD002038BD012038BD38BD10B5044696 -S31508003900FFF7A6FF034608B900222260184610BD35 -S3150800391070B504460D46FEF713FB002840F0BD803F -S31508003920A37913F0800F40F0B980E268AA4205D265 -S3150800393003F00203DBB2002B08BF1546A26800237A -S31508003940A360002D00F0AC802068867876026AB104 -S31508003950013A691EB1FBF6F1B2FBF6F3994205D3BB -S3150800396073421A40A260AD1A616918E02169A9B9C3 -S31508003970FEF716FF0146012805D1A37963F07F03F8 -S31508003980A371022070BDB0F1FF3F18BF206105D1B9 -S31508003990A37963F07F03A371012070BD61610029DB -S315080039A040D0B5422BD9A27912F0020F05D0206873 -S315080039B0FEF7F6FE014620B920E02068FEF7A6FDD0 -S315080039C00146B1F1FF3F05D1A37963F07F03A371E7 -S315080039D0012070BD012903D922689269914205D355 -S315080039E0A37963F07F03A371022070BD6161A268A9 -S315080039F03244A260AD1BAE42D5D300E03546A2687C -S31508003A002A44A260C5F3080272B12068FEF772FD67 -S31508003A1028B9A37963F07F03A371022070BD00EB78 -S31508003A20552502E0002500E00025A368C3F3080336 -S31508003A3043B3A269AA4225D0A37913F0400F11D047 -S31508003A40214651F8243B58780123FDF7A9FD28B1F2 -S31508003A50A37963F07F03A371012070BDA37923F0D6 -S31508003A604003A371214651F8243B58782A4601237E -S31508003A70FDF764FD28B1A37963F07F03A3710120E4 -S31508003A8070BDA561A368E26893420BD9E360A37988 -S31508003A9043F02003A371002070BD70BD022070BDE5 -S31508003AA0002070BD002070BD30B58FB00EAB43F856 -S31508003AB0340D0D46184605A90022FEF75DFA0446A0 -S31508003AC0A0B902AB0B9340F21833C2F200030C9371 -S31508003AD005A80199FFF732F8044638B90A9B23B1BD -S31508003AE005A82946FEF712FC00E0062420460FB07A -S31508003AF030BD00BF30B599B018AB43F85C0D184619 -S31508003B000FA90122FEF738FA034600284DD103AB68 -S31508003B10159340F21833C2F2000316930FA80199C1 -S31508003B20FFF70CF8034600283FD11499062300290D -S31508003B303BD0CC7A14F0010F18BF072335D124E007 -S31508003B40012D98BF022330D906A80FA92422FEF713 -S31508003B502BF9089506A80221FEF74EFD034620BB61 -S31508003B6006A80021FFF784F90346E8B1042814D013 -S31508003B701BE02DB10F982946FFF73EFA0346A0B978 -S31508003B800F98FEF759FC03460FE00F98FEF716F953 -S31508003B90054614F0100FD3D1FFE70FA8FFF700FA78 -S31508003BA003460028E5D000E00723184619B030BDC3 -S31508003BB02DE9F04383B081469046054600244E1E03 -S31508003BC0012711E0404601A93A466B46FFF780FCFB -S31508003BD0009B012B0AD19DF804300D2B04D005F863 -S31508003BE0013B01340A2B01D0A642EBDC00232B70E3 -S31508003BF09C4214BF4846184603B0BDE8F08300BF90 -S31508003C0030B583B004460D460A2802D10D20FFF7C9 -S31508003C10F7FF02A901F8084D28466946012201ABBB -S31508003C20FFF72AFD0198012814BF4FF0FF30012045 -S31508003C3003B030BD70B505460E46007860B1002465 -S31508003C403146FFF7DDFFB0F1FF3F08D0013415F824 -S31508003C50010F0028F4D101E0002070BD204670BD98 -S31508003C607F2821D941B9C7281EBF45F26472C0F61C -S31508003C70000201230AD112E0FF2814D8803845F241 -S31508003C806473C0F6000333F81000704732F8021F59 -S31508003C90814205D001339BB2802BF7D100E0002387 -S31508003CA08033D8B270470020704700BF61280CD017 -S31508003CB045F28452C0F600020021013132F8023F73 -S31508003CC053B18342F9D10BB97047002145F6640315 -S31508003CD0C0F6000333F81100704700BF08B500F0BE -S31508003CE0D5FA01F01FFB01F003FB00F053FB00F0CF -S31508003CF00FF800F0B9FA08BD08B500F0C9FA01F0E6 -S31508003D002DFB00F085FC00F025F800F087FA08BDC9 -S31508003D1030B583B0FF238DF8043000258DF80550A3 -S31508003D2000F09AF800F0C2FE40F21804C2F200044D -S31508003D300123237001F03CFA257040F22053C2F2A9 -S31508003D4000031B78DBB2012B02D101A800F0A4F80E -S31508003D5003B030BD08B540F22450C2F2000000F0AE -S31508003D60ADFF01280BD140F21803C2F2000301226D -S31508003D701A7040F22450C2F2000000F08DF840F2AA -S31508003D802450C2F2000001F067FA01280BD140F274 -S31508003D901803C2F2000300221A7040F22450C2F23D -S31508003DA0000000F079F808BD704700BF38B5054631 -S31508003DB00C4640F21803C2F200031B78012B02D10D -S31508003DC0C9B200F027FF40F21803C2F200031B78BD -S31508003DD01BB92846E1B201F00BFA00F055F838BDD8 -S31508003DE040F21803C2F200031878022806D0032806 -S31508003DF006D001280CBF08204020704700207047D5 -S31508003E000020704740F21803C2F20003187802280F -S31508003E1006D0032806D001280CBF0820402070478A -S31508003E20002070470020704740F22053C2F200037A -S31508003E3001221A70704700BF08B500F01BF808BDCC -S31508003E4040F26453C2F20003FE22DA7018710222AD -S31508003E50A3F84420704700BF40F26453C2F200033F -S31508003E6000221A709A6483F84320A3F844209A70B3 -S31508003E705A70704740F26453C2F200031878003053 -S31508003E8018BF0120704700BF40F26453C2F2000316 -S31508003E90002283F84320704738B504460178FF2985 -S31508003EA023D100F08DFA18B91020FFF7C9FF96E163 -S31508003EB040F26454C2F200040023637001252570A1 -S31508003EC0FF22E270102222716371FFF789FFA07149 -S31508003ED0FFF798FFE071FFF795FF000A20726572F9 -S31508003EE0A5720823A4F8443079E140F26453C2F27B -S31508003EF000031B78012B40F09081C939352900F25F -S31508003F006B81DFE811F0DB00690169016501690170 -S31508003F1069015901FC0042012F0169016901690122 -S31508003F206901690169016901690169016901690133 -S31508003F306901690169016901690169016901690123 -S31508003F406901690169016901690169016901690113 -S31508003F50690169016901690169017F005400360038 -S31508003F607300690169016901A1006901B900BD0011 -S31508003F70CE004578FFF734FF0138854203DD22205D -S31508003F80FFF75EFF2BE140F26455C2F20005281DDB -S31508003F90A96C627800F0ECFEFF23EB706278AB6CDC -S31508003FA01344AB6463780133A5F8443017E14578C8 -S31508003FB0FFF716FF0138854203DD2220FFF740FF91 -S31508003FC00DE1616840F26455C2F20005A964281D36 -S31508003FD0627800F0CDFEFF23EB706278AB6C134479 -S31508003FE0AB6463780133A5F84430F8E040F26453D3 -S31508003FF0C2F20003FF22DA7042689A640122A3F82B -S315080040004420ECE040F26453C2F20003FF22DA7067 -S315080040109B6C406840B11844002213F8011B0A44FF -S31508004020D2B28342F9D100E0002240F26453C2F2D0 -S315080040300003C3F8072001221A7100225A719A71E7 -S315080040400822A3F84420CAE040F26453C2F20003EF -S31508004050FF22DA7045F64422C0F600029A6400226E -S315080040601A715A719A710721D9711A725A729A720B -S315080040700822A3F84420B2E00020FFF7E1FEAEE0F4 -S3150800408040F26453C2F20003FF22DA7000221A716A -S31508004090597859719A71DA711A720622A3F844206E -S315080040A09DE040F26453C2F2000300221A705A706F -S315080040B0FF22DA700122A3F8442090E040F264530C -S315080040C0C2F200039D6CFFF78BFE411E2846621C58 -S315080040D001F012F918B93120FFF7B2FE7FE040F27D -S315080040E06454C2F20004FF23E370A56CFFF778FE60 -S315080040F0013D2844A0640123A4F844306FE04578C4 -S31508004100FFF76EFE0238854203DD2220FFF798FE90 -S3150800411065E040F26453C2F20003FF22DA7001221E -S31508004120A3F84420617839B901F0F2F8002856D18D -S315080041303120FFF785FE52E040F26453C2F20003D5 -S31508004140986CA21C01F0D8F818B93120FFF778FE50 -S3150800415045E040F26453C2F2000361789A6C0A445F -S315080041609A643CE040F26454C2F20004FF23E37010 -S31508004170002525716571FFF733FEA071E57125727B -S3150800418065720723A4F8443029E040F26453C2F26A -S315080041900003986C616801F0B3F818B93120FFF78D -S315080041A04FFE1CE040F26453C2F20003FF22DA70AD -S315080041B00122A3F8442012E000F0EAFD40F264531D -S315080041C0C2F20003FF22DA700122A3F8442006E0B7 -S315080041D03120FFF735FE02E02020FFF731FE40F2DE -S315080041E06453C2F2000393F84330012B02D1102026 -S315080041F0FFF726FE40F26453C2F20003B3F84410F8 -S315080042000BB2002B09DD40F26450C2F20000012314 -S3150800421080F843300330FFF7C9FD38BD08B5FFF70E -S315080042200BFE01281ED000F0CBF8D8B140F2B053EF -S31508004230C2F200031B78012B14D101F0A1F840F259 -S31508004240B453C2F200031B68323398420AD340F2D1 -S31508004250B053C2F2000300221A7000F0BBF808B986 -S3150800426000F070FD08BD00BF08B540F2B053C2F2B9 -S31508004270000301221A7001F083F840F2B453C2F227 -S3150800428000031860FFF7CAFF08BD00BF704700BFEC -S31508004290704700BF00F00F03092802D903F1370061 -S315080042A0704703F1300040F21C03C2F200031B689A -S315080042B003445B7803F00303022B08BF2038C0B21F -S315080042C0704700BF38B505460C460009FFF7E2FF00 -S315080042D0207005F00F00FFF7DDFF60700023A37064 -S315080042E0204638BD30B4024603464CF6CD40CCF6DF -S315080042F0CC400131A0FB0343DB08FAD1002301F8C7 -S3150800430001394CF6CD45CCF6CC450846A5FB02430B -S31508004310DB0803EB8304A2EB4402303201F80129DF -S315080043201A46002BF1D130BC704700BFF0B440F2FA -S315080043301C03C2F200031F6800231C46C15C7A18DE -S31508004340527802F00302022A08BF2039C9B2A1F145 -S315080043503002D2B2A1F13A05EDB2162A94BF002670 -S315080043600126062D8CBF354646F0010565B9092A92 -S3150800437084BFA1F13702D2B22401E4B22244D4B2F6 -S315080043800133022BDAD101E0002000E02046F0BC20 -S31508004390704700BF08B540F2F853C2F20003002088 -S315080043A0187040F20461C2F20001FEF7C5FF30B191 -S315080043B045F64C20C0F600007C2100F069FB08BDDC -S315080043C040F2F853C2F200031878D0F1010038BF62 -S315080043D00020704708B5FFF72FFD01280FD040F2DF -S315080043E0F853C2F200031B785BB9FBF709FF0128F3 -S315080043F009D140F2F853C2F20003187008BD002034 -S3150800440008BD002008BD002008BD00BF027840F2A4 -S315080044101C03C2F200031B689918497801F00301CE -S31508004420022908BF203A532A0ED1407803445B7804 -S3150800443013F0040F0AD031280AD032280AD03328BC -S3150800444014BF0320022070470320704703207047DB -S31508004450002070470120704770B504460230FFF708 -S3150800446065FF0646054604342046FFF75FFF3044DD -S31508004470C6B2013DADB20234012DF5D82046FFF78C -S3150800448055FFF643F6B2864214BF0020012070BDE0 -S315080044902DE9F04115460F460446002918BF0028A5 -S315080044A007D145F64C20C0F6000040F2362100F050 -S315080044B0EFFA2046FFF7AAFF0646032808BF0020A2 -S315080044C000F0A2802046FFF7C7FF002800F08C8086 -S315080044D0012E29D016B1022E53D088E0A01CFFF772 -S315080044E025FF8046201DFFF721FF06023E60A01D1E -S315080044F0FFF71CFF3044386004F10806A8F10308EA -S315080045001FFA88F84046002D7ED00FFA88F7002F4C -S315080045106FDD00243046FFF709FF285502360134BF -S31508004520A4B2BC42F6DB66E0A01CFFF7FFFE80469D -S31508004530201DFFF7FBFE06043E60A01DFFF7F6FEF2 -S3150800454006EB00263E6004F10800FFF7EFFE304454 -S31508004550386004F10A06A8F104081FFA88F84046EC -S31508004560002D51D00FFA88F7002F46DD002430467B -S31508004570FFF7DCFE285502360134A4B2BC42F6DB4E -S315080045803DE0A01CFFF7D2FE8046201DFFF7CEFEB9 -S3150800459006063E60A01DFFF7C9FE06EB00463E6014 -S315080045A004F10800FFF7C2FE06EB00263E6004F1A0 -S315080045B00A00FFF7BBFE3044386004F10C06A8F188 -S315080045C005081FFA88F84046F5B10FFA88F7002F54 -S315080045D017DD00243046FFF7A9FE285502360134B8 -S315080045E0A4B2BC42F6DB0EE04FF6FF700CE00020EA -S315080045F00AE0404608E0404606E0404604E04046F9 -S3150800460002E0404600E0404600B2BDE8F08100BF47 -S3150800461070B540F2F853C2F200031B78002B00F085 -S315080046203382012B3FD1FBF713FE45F66420C0F613 -S315080046300000FBF757FE45F68820C0F60000FBF79A -S3150800464051FEFBF7FFFD0146BD480122FEF78AFE33 -S3150800465048B145F6B020C0F60000FBF743FE01203E -S31508004660FBF730FE70BD45F6B820C0F60000FBF734 -S3150800467039FE45F6C020C0F60000FBF733FE45F6C6 -S31508004680E420C0F60000FBF72DFE40F2FC53C2F210 -S31508004690000300221A605A6040F2F853C2F200037F -S315080046A002221A7070BD022B40F0FD8040F20464AD -S315080046B0C2F2000440F65C20C2F200004FF480719A -S315080046C004F50D72FFF774FA94F93A32002B13DAEF -S315080046D045F6B020C0F60000FBF704FE0220FBF703 -S315080046E0F1FD04F50D70FFF709F940F2F853C2F22F -S315080046F0000300221A7070BD00B340F65C21C2F2B6 -S315080047000001084601F5C0710022FFF7C1FE054603 -S31508004710B0F1FF3F12D145F6B020C0F60000FBF716 -S31508004720E1FD0320FBF7CEFD8548FFF7E7F840F2E9 -S31508004730F853C2F2000300221A7070BD2BB2002B88 -S315080047402CDD40F2FC53C2F200035B686BB940F201 -S31508004750FC53C2F2000340F65C22C2F20002D2F811 -S3150800476080211A602DB25D6018E040F65C22C2F224 -S315080047700002D2F8801140F2FC52C2F2000212681E -S3150800478091423EBF40F2FC52C2F20002116040F272 -S31508004790FC52C2F2000203FA85F3536040F2046346 -S315080047A0C2F20003D3F83C22D3F840329A4240F0D2 -S315080047B06B8163480021FFF7ABF890B145F6B0204E -S315080047C0C0F60000FBF78EFD0420FBF77BFD5C4876 -S315080047D0FFF794F840F2F853C2F2000300221A7069 -S315080047E070BD45F6B820C0F60000FBF77BFD45F620 -S315080047F01430C0F60000FBF775FD40F2FC55C2F216 -S31508004800000540F2B854C2F2000468682146FFF772 -S3150800481069FD2046FBF766FD45F62030C0F6000028 -S31508004820FBF760FD2E68300E2146FFF74BFDC6F3F9 -S315080048300740A11CFFF746FDC6F30720211DFFF719 -S3150800484041FDF0B2A11DFFF73DFD2046FBF74AFDED -S3150800485045F6C430C0F60000FBF744FD28686968D1 -S3150800486000F04EFD90B945F6B020C0F60000FBF703 -S3150800487039FD0520FBF726FD3148FFF73FF840F2E2 -S31508004880F853C2F2000300221A7070BD45F6B8202C -S31508004890C0F60000FBF726FD40F2F853C2F200030B -S315080048A003221A7070BD032B40F0EE8040F20464B8 -S315080048B0C2F2000440F65C20C2F200004FF4807198 -S315080048C004F50D72FFF774F994F93A32002B13DAEE -S315080048D045F63C30C0F60000FBF704FD0220FBF766 -S315080048E0F1FC04F50D70FFF709F840F2F853C2F22F -S315080048F0000300221A7070BD20B340F65C22C2F293 -S315080049000002104602F5C07102F58072FFF7C0FD7D -S315080049100546B0F1FF3F15D145F66030C0F60000F8 -S31508004920FBF7E0FC0320FBF7CDFC0548FEF7E6FFA6 -S3150800493040F2F853C2F2000300221A7070BD00BF9D -S31508004940380800202BB2002B59DD45F68430C0F616 -S315080049500000FBF7C7FC2DB240F2B854C2F20004BF -S3150800496028462146FFF7BEFC2046FBF7BBFC45F66A -S315080049709430C0F60000FBF7B5FC40F65C26C2F2A0 -S31508004980000696F883012146FFF79CFC96F88201FB -S31508004990A11CFFF797FC96F88101211DFFF792FCF1 -S315080049A096F88001A11DFFF78DFC2046FBF79AFCBF -S315080049B045F6C430C0F60000FBF794FCD6F8800133 -S315080049C0294606F5807200F097FC90B945F6B020A6 -S315080049D0C0F60000FBF786FC0620FBF773FC2B48A5 -S315080049E0FEF78CFF40F2F853C2F2000300221A7059 -S315080049F070BD45F6B820C0F60000FBF773FC40F220 -S31508004A000463C2F20003D3F83C22D3F840329A4238 -S31508004A103AD145F6AC30C0F60000FBF763FC00F06F -S31508004A2077FC90B945F6B020C0F60000FBF75AFCB3 -S31508004A300720FBF747FC1548FEF760FF40F2F853DE -S31508004A40C2F2000300221A7070BD45F6B820C0F6FF -S31508004A500000FBF747FC45F6C830C0F60000FBF738 -S31508004A6041FC0A48FEF74AFF45F6E030C0F600006A -S31508004A70FBF738FC40F2F853C2F2000300221A7022 -S31508004A80FBF7FEFB00F05EF970BD00BF380800209A -S31508004A9008B540F6E033C2F20003186040F6E43386 -S31508004AA0C2F200031960FFF7F3FBFCE72DE9F047B4 -S31508004AB0002345F63040C0F600004FF4FA744AF277 -S31508004AC0104113F80080C21892F801C008EB0C02D6 -S31508004AD002FB044291FBF2F902FB191636B94D4660 -S31508004AE009F1FF3292B2B2F5806F03D30233242B59 -S31508004AF0E7D187E04746E2464FF4D043C4F20003C5 -S31508004B0000225A611A6842F400421A601B6813F4BC -S31508004B10004F09D04FF4D044C4F20004FFF7B8FBA5 -S31508004B20236813F4004FF9D14FF4D043C4F20003BD -S31508004B301A6822F002021A601A6842F001021A6024 -S31508004B405B6813F0010F09D14FF4D044C4F2000496 -S31508004B50FFF79EFB636813F0010FF9D0013F0AF1D6 -S31508004B60FF36360546EA0747013D3D434FF4D04335 -S31508004B70C4F20003DD611A6822F001021A605B685C -S31508004B8013F0010F09D04FF4D044C4F20004FFF724 -S31508004B907FFB636813F0010FF9D14FF4C843C4F2E1 -S31508004BA00003D3F8002242F00102C3F80022D3F82A -S31508004BB01C2222F48042C3F81C22D3F80C2242F4A9 -S31508004BC08042C3F80C220022C3F8B022C3F8B422EC -S31508004BD0D3F8042222F48042C3F80422D3F814221C -S31508004BE022F48042C3F81422D3F81C2242F48042ED -S31508004BF0C3F81C22D3F8002222F00102C3F80022CF -S31508004C00BDE8F08745F60C40C0F60000F021FFF736 -S31508004C103FFF71E738B504460D464FF4D043C4F25A -S31508004C2000039B6813F0806F07D145F60C40C0F669 -S31508004C3000004FF4A271FFF72BFF4FF4D043C4F2E4 -S31508004C400003D3F8802102F00102C3F88021D3F8CB -S31508004C50802142F07C4242F40012C3F88021C3F856 -S31508004C608451E178A278120442EA016221780A4363 -S31508004C70617842EA0122C3F88821E179A27912040F -S31508004C8042EA016221790A43617942EA0122C3F8BC -S31508004C908C21D3F8802142F00102C3F880219B6859 -S31508004CA013F0806F09D14FF4D044C4F20004FFF723 -S31508004CB0EFFAA36813F0806FF9D038BD4FF4D043EC -S31508004CC0C4F20003DB6813F0030F39D04FF4D04366 -S31508004CD0C4F20003D3F8B02140F26763B3EB525F26 -S31508004CE018BF002023D14FF4D043C4F20003D3F8F1 -S31508004CF0B8210270D3F8B821120A4270D3F8B82145 -S31508004D00120C8270D3F8B821120EC270D3F8BC21E7 -S31508004D100271D3F8BC21120A4271D3F8BC21120CD5 -S31508004D208271D3F8BC311B0EC3710120FFE74FF423 -S31508004D30D043C4F20003DA6842F02002DA60704712 -S31508004D400020704708B500F0DFFA80B1FFF72CF8AD -S31508004D5000F0FCFA4EF60853CEF200034FF4004278 -S31508004D601A6048F20403C0F600031B68984708BD9A -S31508004D7070B5561EB6B24AB14C1E0E44451A14F802 -S31508004D80013F2B55FFF784FAB442F8D170BD00BF36 -S31508004D9008B500F009FB08BDF8B507460024254606 -S31508004DA045F68446C0F60006FFF772FAA359BB42D9 -S31508004DB00ED8311949680B449F4209D245F68443F7 -S31508004DC0C0F6000305EB450203EB8203187AF8BD2B -S31508004DD001350C34782CE7D1FF20F8BD2DE9F843CE -S31508004DE080460068FFF7D8FFFF2830D0FCF744FC60 -S31508004DF0F320FCF761FCFCF765FC01281CBF0024C6 -S31508004E0008F1040904D1FCF74DFC0020BDE8F8833D -S31508004E10D8F80060A71959F80450FFF739FA384648 -S31508004E202946FCF7CDFC082807D1A359AB4206D181 -S31508004E300434B4F5007FEBD103E0002402E000243B -S31508004E4000E00124FCF72EFC2046BDE8F88300208C -S31508004E50BDE8F88338B504460D4640F6E833C2F295 -S31508004E600003984209D04FF40043C0F60003994264 -S31508004E700BD0FFF7B3FF20B917E040F6EC54C2F2A7 -S31508004E800004C5F3080393B903E040F6E834C2F218 -S31508004E90000423689D420CD0204640F8045B29464E -S31508004EA04FF40072FFF764FF03E0002038BD0020CE -S31508004EB038BD204638BD00BF2DE9F04106460C46F0 -S31508004EC017461D464FEA51284FEA48280368B3F1AA -S31508004ED0FF3F06D140F8048B41464FF40072FFF7B6 -S31508004EE047FF3368434505D030464146FFF7B2FFD2 -S31508004EF00646D0B13368E41A3444043408F5007819 -S31508004F00FFF7C6F9331DE31AB3F5007F06D330461B -S31508004F104146FFF79FFF064650B1041D17F8013BAF -S31508004F2004F8013B013DEBD105E00020BDE8F08126 -S31508004F300020BDE8F0810120BDE8F08140F6EC5381 -S31508004F40C2F200034FF0FF321A6040F6E833C2F2AD -S31508004F5000031A60704700BF70B504460D46164632 -S31508004F60FFF71AFFFF281BD0681E2044FFF714FF1F -S31508004F70FF2817D0620A4FF40043C0F60003B3EBCC -S31508004F80422F07BF40F6E830C2F2000040F6EC5068 -S31508004F90C2F20000214632462B46FFF78DFF70BD50 -S31508004FA0002070BD002070BDF8B505460E46FFF717 -S31508004FB0F3FE0446701E2844FFF7EEFE0546FF2C56 -S31508004FC018BFFF2833D084422BD8012C2BD90B28A5 -S31508004FD02BD8FCF751FBF320FCF76EFBFCF772FBB2 -S31508004FE001281EBF45F65446C0F60006022703D11F -S31508004FF0FCF758FB0020F8BDFFF74AF936F814000D -S315080050003946FCF7A5FB082803D0FCF74BFB002024 -S31508005010F8BD0134E4B2A542EED2FCF743FB012009 -S31508005020F8BD0020F8BD0020F8BD0020F8BD00201E -S31508005030F8BD00BF00B583B040F6E833C2F20003FE -S315080050401B68B3F1FF3F08BF01201CD040F6E833C8 -S31508005050C2F2000399685A681144DA6811441A6959 -S3150800506011445A6911449A690A44D96953185B422A -S3150800507002AA42F8043D48F28810C0F6000004214E -S31508005080FFF76AFFFFE703B05DF804FB48F2040286 -S31508005090C0F600024FF40043C0F6000310681B6810 -S315080050A0184448F20803C0F600031B68184448F27F -S315080050B00C03C0F600031B68184448F21003C0F638 -S315080050C000031B68184448F21403C0F600031B6863 -S315080050D0184448F21803C0F600031B68184448F23F -S315080050E08813C0F600031B681844D0F1010038BFC6 -S315080050F00020704708B540F6E833C2F200031B6883 -S31508005100B3F1FF3F06D040F6E830C2F20000FFF7E1 -S3150800511065FE88B140F6EC53C2F200031B68B3F192 -S31508005120FF3F0BD040F6EC50C2F20000FFF756FEE8 -S31508005130003018BF012008BD002008BD012008BDA9 -S3150800514038B504464FF4A050C4F201008021FCF79C -S3150800515095FD90B14FF4A050C4F201002146FCF72A -S3150800516085FD4FF4A054C4F2010480252046294643 -S31508005170FCF784FD0028F9D001E0002038BD0120A5 -S3150800518038BD00BF10B504464FF4A050C4F2010064 -S315080051902021FCF773FD012808D14FF4A050C4F272 -S315080051A00100FCF767FD2070012010BD002010BD2E -S315080051B010B584B04FF4614300930023ADF8043072 -S315080051C0ADF80630ADF80830ADF80C300C23ADF864 -S315080051D00A304FF4A054C4F2010420466946FCF78D -S315080051E0C7FC20460121FCF733FD04B010BD00BF03 -S315080051F02DE9F04106460C46402906D945F6FC40FD -S31508005200C0F600007721FFF743FC2046FFF798FF1A -S31508005210012806D045F6FC40C0F600007B21FFF7C2 -S3150800522037FC2546ACB1002445F6FC47C0F6000716 -S315080052304FF08408FFF72CF8305DFFF781FF01284F -S3150800524003D038464146FFF723FC0134A3B2AB42EC -S31508005250F0D3BDE8F08100BF10B5044641F235032E -S31508005260C2F200031B78A3B940F6F070C2F2000040 -S31508005270FFF788FF012832D141F23503C2F2000355 -S3150800528001221A7041F23403C2F20003002018709A -S3150800529010BD41F23403C2F200031878134B1844C8 -S315080052A0FFF770FF01281CD141F23403C2F2000354 -S315080052B01A780132D2B21A7040F6F073C2F20003BD -S315080052C01B7893420FD120460849FFF751FD41F25A -S315080052D03503C2F2000300221A70012010BD002017 -S315080052E010BD002010BD002010BD00BFF10F00202A -S315080052F008B5FFF723FE08BD08B5FFF72DFE08BD64 -S3150800530008B5FFF751FE08BD08B5FFF7BFFE08BD93 -S3150800531008B5FFF78FFE10B1FFF7ECFE08BD0020B9 -S3150800532008BD00BF4EF21003CEF2000300221A6039 -S3150800533049F23F01C0F2020159609A6005211960DD -S3150800534041F23803C2F200031A6070474EF21003A6 -S31508005350CEF2000300221A60704700BF4EF2100317 -S31508005360CEF200031B6813F4803F1FBF41F23803D7 -S31508005370C2F200031A68013218BF1A60704700BFEC -S3150800538008B5FFF7EBFF41F23803C2F200031868CD -S3150800539008BD00BF08B545F62050C0F60000362106 -S315080053A0FFF776FB08BD00BF10B572B640F20002E3 -S315080053B0C2F2000240F22003C2F200039A4210D25F -S315080053C0131D0E4CE41A24F003040434002310467B -S315080053D045F65061C0F600015A581A500433A342E4 -S315080053E0FAD1074807494FF000028842B8BF40F88B -S315080053F0042BFADBFAF7A6FF10BD00BF2300002036 -S31508005400200000203C1000200F2AF0B445D940EABD -S3150800541001039B0745D1A2F110070C4603463F0935 -S3150800542000EB0716103625681033103443F8105C65 -S3150800543054F80C5C43F80C5C54F8085C43F8085CB8 -S3150800544054F8045C43F8045CB342ECD17B1C02F0CC -S315080054500F0CBCF1030F4FEA03131944034422D976 -S315080054600E461D46644656F8047B043C032C45F854 -S31508005470047BF8D8ACF1040402F0030224F0030418 -S3150800548004342344214432B10A4411F8014B9142B1 -S3150800549003F8014BF9D1F0BC70470346002AF3D153 -S315080054A0F9E70346F0E76246002AEDD1F3E700BFC5 -S315080054B02F64656D6F70726F675F6F6C696D657865 -S315080054C05F73746D3332653430372E7372656300DB -S315080054D02F626F6F746C6F672E747874000000000B -S315080054E0222A3A3C3E3F7C7F000000002B2C3B3DA5 -S315080054F05B5D0000809A90418E418F804545454905 -S3150800550049498E8F9092924F994F555559999A9B22 -S315080055109C9D9E9F41494F55A5A5A6A7A8A9AAAB9C -S31508005520AC21AEAFB0B1B2B3B4B5B6B7B8B9BABBC1 -S31508005530BCBDBEBFC0C1C2C3C4C5C6C7C8C9CACB25 -S31508005540CCCDCECFD0D1D2D3D4D5D6D7D8D9DADB15 -S31508005550DCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEB05 -S31508005560ECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBF5 -S31508005570FCFDFEFF01030507090E10121416181C80 -S315080055801E0000006100620063006400650066009A -S315080055906700680069006A006B006C006D006E00A9 -S315080055A06F00700071007200730074007500760059 -S315080055B07700780079007A00A100A200A300A50070 -S315080055C0AC00AF00E000E100E200E300E400E50023 -S315080055D0E600E700E800E900EA00EB00EC00ED0071 -S315080055E0EE00EF00F000F100F200F300F400F50021 -S315080055F0F600F800F900FA00FB00FC00FD00FE00CA -S31508005600FF00010103010501070109010B010D0155 -S315080056100F01110113011501170119011B011D01C4 -S315080056201F01210123012501270129012B012D0134 -S315080056302F0131013301350137013A013C013E01A1 -S31508005640400142014401460148014B014D014F0109 -S31508005650510153015501570159015B015D015F0174 -S31508005660610163016501670169016B016D016F01E4 -S3150800567071017301750177017A017C017E0192013E -S31508005680B103B203B303B403B503B603B703B80350 -S31508005690B903BA03BB03BC03BD03BE03BF03C00300 -S315080056A0C103C303C403C503C603C703C803C903A9 -S315080056B0CA0330043104320433043404350436048E -S315080056C03704380439043A043B043C043D043E04D8 -S315080056D03F04400441044204430444044504460488 -S315080056E04704480449044A044B044C044D044E0438 -S315080056F04F045104520453045404550456045704E1 -S31508005700580459045A045B045C045E045F0470215F -S3150800571071217221732174217521762177217821CF -S3150800572079217A217B217C217D217E217F2141FFE0 -S3150800573042FF43FF44FF45FF46FF47FF48FF49FF37 -S315080057404AFF4BFF4CFF4DFF4EFF4FFF50FF51FFE7 -S3150800575052FF53FF54FF55FF56FF57FF58FF59FF97 -S315080057605AFF0000C700FC00E900E200E400E00080 -S31508005770E500E700EA00EB00E800EF00EE00EC00C9 -S31508005780C400C500C900E600C600F400F600F20031 -S31508005790FB00F900FF00D600DC00A200A300A5006C -S315080057A0A7209201E100ED00F300FA00F100D10014 -S315080057B0AA00BA00BF001023AC00BD00BC00A100BF -S315080057C0AB00BB009125922593250225242561254A -S315080057D06225562555256325512557255D255C25C2 -S315080057E05B251025142534252C251C2500253C254C -S315080057F05E255F255A255425692566256025502589 -S315080058006C2567256825642565255925582552255B -S3150800581053256B256A2518250C25882584258C256E -S3150800582090258025B103DF009303C003A303C303B8 -S31508005830B500C403A6039803A903B4031E22C6032E -S31508005840B50329226122B10065226422202321237F -S31508005850F7004822B0001922B7001A227F20B200AA -S31508005860A025A00041004200430044004500460030 -S315080058704700480049004A004B004C004D004E00C6 -S315080058804F00500051005200530054005500560076 -S315080058905700580059005A002100E0FFE1FFE5FFD4 -S315080058A0E2FFE3FFC000C100C200C300C400C50098 -S315080058B0C600C700C800C900CA00CB00CC00CD008E -S315080058C0CE00CF00D000D100D200D300D400D5003E -S315080058D0D600D800D900DA00DB00DC00DD00DE00E7 -S315080058E07801000102010401060108010A010C0100 -S315080058F00E01100112011401160118011A011C01EA -S315080059001E01200122012401260128012A012C0159 -S315080059102E01300132013401360139013B013D01C6 -S315080059203F0141014301450147014A014C014E012E -S31508005930500152015401560158015A015C015E0199 -S31508005940600162016401660168016A016C016E0109 -S31508005950700172017401760179017B017D01910163 -S31508005960910392039303940395039603970398036D -S3150800597099039A039B039C039D039E039F03A0031D -S31508005980A103A303A403A503A603A703A803A903C6 -S31508005990AA031004110412041304140415041604AB -S315080059A01704180419041A041B041C041D041E04F5 -S315080059B01F042004210422042304240425042604A5 -S315080059C02704280429042A042B042C042D042E0455 -S315080059D02F0401040204030404040504060407044E -S315080059E0080409040A040B040C040E040F046021BD -S315080059F0612162216321642165216621672168216D -S31508005A0069216A216B216C216D216E216F2121FF8D -S31508005A1022FF23FF24FF25FF26FF27FF28FF29FF54 -S31508005A202AFF2BFF2CFF2DFF2EFF2FFF30FF31FF04 -S31508005A3032FF33FF34FF35FF36FF37FF38FF39FFB4 -S31508005A403AFF00004F70656E424C54002E2E2F2EE2 -S31508005A502E2F2E2E2F536F757263652F66696C6510 -S31508005A602E6300004669726D7761726520757064F1 -S31508005A7061746520726571756573742064657465F3 -S31508005A80637465640A0D00004F70656E696E672061 -S31508005A906669726D776172652066696C6520666FE6 -S31508005AA0722072656164696E672E2E2E00000000F2 -S31508005AB04552524F520A0D004F4B0A0D0000000086 -S31508005AC05374617274696E67207468652070726FAA -S31508005AD06772616D6D696E672073657175656E6352 -S31508005AE0650A0D0050617273696E67206669726D8A -S31508005AF0776172652066696C6520746F206F6274C1 -S31508005B0061696E2065726173652073697A652E2EE8 -S31508005B102E00000045726173696E67200000000060 -S31508005B202062797465732066726F6D206D656D6F7E -S31508005B307279206174203078000000005265616433 -S31508005B40696E67206C696E652066726F6D2066697E -S31508005B506C652E2E2E4552524F520A0D000000003B -S31508005B60496E76616C696420636865636B73756DED -S31508005B7020666F756E642E2E2E4552524F520A0DB0 -S31508005B800000000050726F6772616D6D696E672064 -S31508005B900000000020627974657320746F206D65BB -S31508005BA06D6F7279206174203078000057726974BD -S31508005BB0696E672070726F6772616D2063686563CE -S31508005BC06B73756D2E2E2E00436C6F73696E67208E -S31508005BD06669726D776172652066696C650A0D0083 -S31508005BE04669726D776172652075706461746520A7 -S31508005BF07375636365737366756C6C7920636F6D13 -S31508005C00706C657465640A0D000000002E2E2F2E38 -S31508005C102E2F2E2E2F536F757263652F41524D43CB -S31508005C204D345F53544D33322F63616E2E6300003B -S31508005C3005020602060307030803090309040A0402 -S31508005C400B040C040C050D050E050F050F061006B2 -S31508005C50100710080000080010001800200028008F -S31508005C603000380040004800500058008000880086 -S31508005C7090009800A000A800B000B800C000C800B6 -S31508005C80D000D80000800008004000000200000094 -S31508005C9000C00008004000000300000000000108E2 -S31508005CA000000100040000000000020800000200D5 -S31508005CB005000000000004080000020006000000BD -S31508005CC0000006080000020007000000000008089F -S31508005CD0000002000800000000000A080000020098 -S31508005CE00900000000000C08000002000A0000007D -S31508005CF000000E08000002000B0000002E2E2F2EBA -S31508005D002E2F2E2E2F536F757263652F41524D43DA -S31508005D104D345F53544D33322F756172742E6300C0 -S31508005D202E2E2F2E2E2F2E2E2F536F757263652F24 -S31508005D3041524D434D345F53544D33322F474343FD -S31508005D402F766563746F72732E630000002020201F -S31508005D50202020202020282828282820202020200D -S31508005D6020202020202020202020202020881010DD -S31508005D701010101010101010101010101004040439 -S31508005D8004040404040404101010101010104141F7 -S31508005D9041414141010101010101010101010101E5 -S31508005DA001010101010101011010101010104242F9 -S31508005DB042424242020202020202020202020202B5 -S31508005DC00202020202020202101010102000000055 -S31508005DD000000000000000000000000000000000B5 -S31508005DE000000000000000000000000000000000A5 -S31508005DF00000000000000000000000000000000095 -S31508005E000000000000000000000000000000000084 -S31508005E100000000000000000000000000000000074 -S31508005E200000000000000000000000000000000064 -S31508005E300000000000000000000000000000000054 -S31508005E400000000000000000000000000000000044 -S31508005E500100000001000000000000000102030428 -S31508005E600102030406070809040000004C5D000847 +S315080016700020C4F2AA20704708B54FF00070012177 +S3150800168000F0E6FD4FF00070002100F0E1FD08BD16 +S315080016900023036043608360C36003614361836121 +S315080016A0C361036243628362C36203634363836302 +S315080016B0C36340220264202242648364C3640365D0 +S315080016C043658365C3650366802242668366C3668F +S315080016D0036743678367C3674FF08062C0F880205B +S315080016E04FF00072C0F884204FF08071C0F888105F +S315080016F04FF40011C0F88C10C0F89030C0F8943040 +S31508001700C0F89830C0F89C30C0F8A030C0F8A420C3 +S31508001710C0F8A8304FF40032C0F8AC204FF48072FD +S31508001720C0F8B020C0F8B430C0F8B830704700BF71 +S3150800173082B0002301934FF40043C4F202031A69EE +S3150800174002F01C02890101F4F8610A43C00281B261 +S315080017500A4342F001021A614FF40042C4F202023F +S315080017604FF6FE71C0F20401019B01330193136920 +S3150800177013F0010F02D0019B8B42F5D9019A4FF65F +S31508001780FF73C0F204039A421FBF4FF40043C4F22A +S315080017900203586980B208BF002002B0704700BF34 +S315080017A010B483B0002301934FF40043C4F202033C +S315080017B01C6904F01C0444F00304890101F4F8616F +S315080017C00C43C00281B20C435A611C614FF40042BB +S315080017D0C4F202024FF6FE71C0F20401019B013306 +S315080017E00193136913F0010F02D0019B8B42F5D9BF +S315080017F001984FF6FF73C0F20403C01A18BF012000 +S3150800180003B05DF8044B7047F0B587B004460D4643 +S315080018100023059300934FF40043C4F202031E69A4 +S3150800182026F01C0601A800F06FFC02994FF45343FA +S31508001830CFF6CE630B444EF2BF12C0F2E4029342D7 +S3150800184098BF46F008061AD94FF24013CFF6E95367 +S315080018500B4447F63F02C0F27D12934298BF46F00A +S315080018600C060CD94FF4F243CFF66C430B444FF4F5 +S31508001870B442C0F26222934288BF46F004064FF48F +S315080018800043C4F202031E61284600214FF40042B9 +S31508001890FFF786FF002800F00F814FF0806305935D +S315080018A0059B2BB1059B013B0593059B002BF9D1A5 +S315080018B02368002B5ED001274FF6FE76C0F2040699 +S315080018C0009B0133009328463946FFF731FF00F0A5 +S315080018D0040083B213B9009BB342F1D9009A4FF6BC +S315080018E0FF73C0F204039A4208BF002000F0E980A3 +S315080018F00021009128464FF48052FFF751FF002837 +S3150800190000F0DC8001274FF6FE76C0F20406009B45 +S315080019100133009328463946FFF70AFF00F02000F6 +S3150800192080B210B9009BB342F1D9009A4FF6FF7303 +S31508001930C0F204039A4208BF002000F0C2800023C8 +S31508001940009328461021FFF7F3FE00F004039BB22C +S315080019501BB14FF40063236201E00023236200F009 +S3150800196002039BB213B1002363611BE04FF480436B +S31508001970636117E06369226AD20842EA530228467D +S31508001980002192B2FFF70CFF002800F099806FF053 +S315080019907F430593059B2BB1059B013B0593059B4F +S315080019A0002BF9D14FF40043C4F20203196848F238 +S315080019B00F12CFF620720A40A06861680843E168F2 +S315080019C008432169084361690843A1690843E16935 +S315080019D00843216A0843616A0843A16A0843E16A21 +S315080019E00843216B0843616B01430A431A60E16BA4 +S315080019F0A26B1143226C1143626C1143A26C114312 +S31508001A00E26C1143226D1143626D0A435A60A26D5E +S31508001A109A60E26DDA609869A16E626E1143E26EB1 +S31508001A201143226F1143626F11434FF64172024010 +S31508001A300A43216E42EA01419961E16FA26F0A43A6 +S31508001A40DA6103F58053996943F62372CFF6DE020D +S31508001A500A40D4F88400D4F880100843D4F88810D3 +S31508001A600843D4F88C100843D4F890100843D4F8E7 +S31508001A7094100843D4F898100843D4F89C100843E7 +S31508001A80D4F8A01001430A439A61D4F8A410D4F8F4 +S31508001A90A820114341F40001D4F8AC201143D4F82E +S31508001AA0B0201143D4F8B8200A43D4F8B41042EA57 +S31508001AB081021A60012004E0002002E0002000E014 +S31508001AC0002007B0F0BD00BF40B14FF40043C4F298 +S31508001AD002031A6842F008021A6070474FF400437E +S31508001AE0C4F202031A6822F008021A60704700BF9F +S31508001AF040B14FF40043C4F202031A6842F00402EC +S31508001B001A6070474FF40043C4F202031A6822F0C1 +S31508001B1004021A60704700BF4FF41043C4F2020370 +S31508001B201A6842F001021A60704700BF4FF410436A +S31508001B30C4F20203186800F0010070474FF410431E +S31508001B40C4F202039A6942F480129A61704700BF90 +S31508001B5040B14FF41043C4F202039A6942F40052AA +S31508001B609A6170474FF41043C4F202039A6922F44B +S31508001B7000529A61704700BF40B14FF41043C4F257 +S31508001B8002039A6942F002029A6170474FF41043C1 +S31508001B90C4F202039A6922F002029A61704700BFF2 +S31508001BA008B50120FFF790FFFFF7C8FF0120FFF7F0 +S31508001BB09FFF0120FFF7CCFF0120FFF7DDFF08BDDF +S31508001BC02DE9F047B2B04FF0F050012100F00AFBC2 +S31508001BD04720012100F006FB4FF48040012100F068 +S31508001BE025FB012000F0F8FB8E23309300268DF8A4 +S31508001BF0C66002248DF8C4408DF8C7608DF8C540CC +S31508001C003746C4F20207384630A900F01BFA3846B0 +S31508001C1001210B2200F064FA384621460B2200F017 +S31508001C205FFA384603210B2200F05AFA3846072194 +S31508001C300B2200F055FA4FF4006330938DF8C66016 +S31508001C408DF8C4408DF8C7608DF8C5404FF4C0576D +S31508001C50C4F20207384630A900F0F4F938460B21D9 +S31508001C600A4600F03DFA322330938DF8C6608DF8A7 +S31508001C70C4408DF8C7608DF8C5404FF40068C4F2BB +S31508001C800208404630A900F0DDF9404601210B2242 +S31508001C9000F026FA404604210B2200F021FA4046BD +S31508001CA005210B2200F01CFA4FF4C04330938DF83F +S31508001CB0C6608DF8C4408DF8C7608DF8C5403846B3 +S31508001CC030A900F0BFF938460D210B2200F008FABA +S31508001CD038460E210B2200F003FAFFF7CDFCFFF77A +S31508001CE01BFFFFF723FF0128FBD001A8FFF7D0FC55 +S31508001CF00024019408944FF400730B930C944FF04E +S31508001D0000430F93202312931494159416944FF4BA +S31508001D10006309934FF4804306934FF0020A4FF08D +S31508001D2003094CF2F108C0F2070841F21967C0F23C +S31508001D302207A6B230465146FFF7FAFC60F31F4564 +S31508001D4030464946FFF7F4FC60F30F05BD4218BF5D +S31508001D50454503D00134202CEBD109E0202C07D9C6 +S31508001D6047F21860C0F600004FF4A17104F0D4FEE3 +S31508001D7001A8A1B2FFF748FD38B947F21860C0F6C6 +S31508001D80000040F2471104F0C7FE41F68063C2F234 +S31508001D90000341F2D072C2F200029A60DB600022B0 +S31508001DA01A605A604FF41041C4F202010B6141F205 +S31508001DB08013C2F2000341F29010C2F2000098604C +S31508001DC01A60DB605A6040225A719A884FF4C860DC +S31508001DD060F30C029A808022DA70CB60FFF7E0FE8F +S31508001DE032B0BDE8F08700BF40F28C53C2F2000360 +S31508001DF008221A7000225A7027229A706922DA700D +S31508001E005B221A7145225A71704700BF38B541F2F4 +S31508001E108013C2F20003DB78DB091DD141F280147E +S31508001E20C2F200046588C5F30D0541F62070C2F2BA +S31508001E30000041F29011C2F200012A4605F030FB7B +S31508001E40E37843F08003E3704FF41043C4F20203CF +S31508001E5001229A60284638BD002038BD38B541F6BB +S31508001E608063C2F20003DB78DB0900D0FEE741F6A7 +S31508001E709063C2F200031D8841F2D074C2F20004D6 +S31508001E80204641F62071C2F200012A4605F008FBF9 +S31508001E9041F68063C2F200039C6000221A6010219A +S31508001EA099705A60C5F30B059D80B022DA704FF41D +S31508001EB01043C4F2020301225A6038BD4FF470532E +S31508001EC0C4F202031B69002B0DDA4FF47053C4F2F7 +S31508001ED0020340F22312C4F267525A6048F6AB1264 +S31508001EE0CCF6EF525A6070474FF47053C4F20203AF +S31508001EF01A6942F000421A61704700BF4FF47053E6 +S31508001F00C4F20203D86070474FF47053C4F2020358 +S31508001F10DB6813F4803F1BD14FF47053C4F20203FD +S31508001F20DB6813F0100F15D14FF47053C4F2020397 +S31508001F30DB6813F0EF0F0FD14FF47053C4F20203AE +S31508001F40D86800F0020000280CBF08200720704758 +S31508001F5001207047052070470620704700B583B0FA +S31508001F6008238DF80730FFF7CFFF8DF807009DF897 +S31508001F700730DBB2012B08D1FFF7C6FF8DF8070043 +S31508001F809DF80730DBB2012BF6D09DF8070003B0A9 +S31508001F905DF804FB70B50546002659B1012908BF4E +S31508001FA04FF4807606D0022914BF4FF440764FF4DA +S31508001FB00076FFE7FFF7D2FF082821D14FF47054C7 +S31508001FC0C4F20204236923F44073236123691E4380 +S31508001FD02661236923F0F8032361236943F002038A +S31508001FE01D432561236943F480332361FFF7B6FF58 +S31508001FF0236923F002032361236923F0F80323618D +S3150800200070BD00BF70B505460E46FFF7A7FF082846 +S3150800201016D14FF47054C4F20204236923F44073B2 +S315080020202361236943F400732361236943F00103A1 +S3150800203023612E60FFF792FF236923F001032361D2 +S3150800204070BD00BFF0B400230125032605FA03F28C +S315080020500C681440944238D107685A0006FA02F40C +S31508002060E44327400760076891F804C00CFA02FCAD +S315080020704CEA070707600F79013FFFB2012F16D810 +S3150800208087683C40846087684C7994403C43846008 +S3150800209047689CB205FA04FC27EA0C0747604768BC +S315080020A091F806C00CFA04F4A4B23C434460C7682D +S315080020B09CB2640006FA04F427EA0404C460C468FF +S315080020C0CF7907FA02F22243C2600133102BBDD141 +S315080020D0F0BC7047036919420CBF00200120704705 +S315080020E010B401F007039B00C90800EB8100046ADD +S315080020F00F21994024EA01010162016A9A401143BD +S3150800210001625DF8044B704710B44FF46053C4F293 +S3150800211002039B6803F00C03042B09D0082B0DD08F +S31508002120002B36D14FF41053C0F2F403036035E0A8 +S315080021304FF4D853C0F2B70303602FE04FF460534F +S31508002140C4F202035C685A6802F03F0214F4800F76 +S315080021504FF46053C4F202035B68C3F3881319BFD4 +S315080021604FF4D854C0F2B7044FF41054C0F2F40434 +S31508002170B4FBF2F101FB03F14FF46053C4F202031E +S315080021805A68C2F3014201325200B1FBF2F303600E +S3150800219004E04FF41053C0F2F40303604FF46052A6 +S315080021A0C4F202029168C1F3031140F20803C2F2B5 +S315080021B00003595CC9B2046824FA01F141609468C5 +S315080021C0C4F382241C5DE4B221FA04F484609268A4 +S315080021D0C2F342329B5CDBB2D940C1605DF8044B66 +S315080021E0704700BF39B14FF46053C4F202031A6B4B +S315080021F01043186370474FF46053C4F202031A6B16 +S3150800220022EA00001863704739B14FF46053C4F2EC +S3150800221002031A6C1043186470474FF46053C4F2F3 +S3150800222002031A6C22EA00001864704739B14FF4A9 +S315080022306053C4F202035A6C1043586470474FF453 +S315080022406053C4F202035A6C22EA000058647047CD +S3150800225039B14FF46053C4F202031A691043186186 +S3150800226070474FF46053C4F202031A6922EA000069 +S315080022701861704739B14FF46053C4F202035A6AC1 +S315080022801043586270474FF46053C4F202035A6A07 +S3150800229022EA00005862704708B54FF40060012131 +S315080022A0FFF7E8FF4FF400600021FFF7E3FF08BDE2 +S315080022B010B44FF43053C4F201035C684168826875 +S315080022C01143C26811430268114302690A4324F4A0 +S315080022D0FD4424F07F042243017D0A435A605DF8D9 +S315080022E0044B704748F2A003C4F2252318607047D0 +S315080022F04FF43053C4F20103186070474FF430535B +S31508002300C4F20103186800F00300704710B40268AD +S315080023104FF43053C4F201039A60DC6824F4FF6476 +S3150800232024F00704826841681143C2680A430069B9 +S3150800233002432243DA605DF8044B70474FF430538A +S31508002340C4F201031869C0B2704700BF82B0002307 +S31508002350019342F61443C4F2010303440193019B1B +S31508002360186802B0704700BF10B402684FF43053C3 +S31508002370C4F201035A6242689A62DC6A24F0F704DE +S31508002380C2688168114302690A43406902432243CD +S31508002390DA625DF8044B70474FF43053C4F2010318 +S315080023A0D3F88000704700BF4FF43053C4F20103DE +S315080023B0C3F88000704700BF4FF43053C4F20103DE +S315080023C05B6B18420CBF0020012070474FF4305356 +S315080023D0C4F2010398637047DC23C4F2272318600C +S315080023E0704700BF30B585B004460D46038A23F40E +S315080023F040531B041B0CCA8813430382838923F4A6 +S31508002400B05323F00C031B041B0C0989AA880A4342 +S3150800241069890A4392B213438381838A23F44073FA +S315080024201B041B0CAA89134383826846FFF76CFEBC +S315080024304FF4A052C4F201024FF48053C4F20103D0 +S315080024409C4218BF94420CBF039A029AA3891BB2F6 +S31508002450002B02EB820202EB8202BDBF2B685B00F7 +S31508002460B2FBF3F22968A4BF8900B2FBF1F248F285 +S315080024701F53C5F2EB13A3FB02135B091D0164206E +S3150800248003FB1023A08900B200280BDADB003233E5 +S3150800249048F21F51C5F2EB11A1FB0321C1F342110A +S315080024A029430AE01B01323348F21F51C5F2EB11EA +S315080024B0A1FB0321C1F34311294389B2218105B048 +S315080024C030BD00BF29B183899BB243F40053838191 +S315080024D07047838923F400531B041B0C83817047C0 +S315080024E0C1F30801818070478088C0F308007047EF +S315080024F0038819420CBF00200120704782B04FF4B0 +S315080025006053C4F202031A6842F001021A600022FC +S315080025109A60196821F0847121F48031196043F2B8 +S315080025201001C2F200415960196821F4802119602E +S31508002530DA60009201921A6842F480321A604FF407 +S315080025406052C4F20202136803F400330193009B3D +S3150800255001330093019B1BB9009BB3F5A06FF2D121 +S315080025604FF46053C4F202031B6813F4003F14BF10 +S31508002570012300230193019B012B46D14FF460539D +S31508002580C4F202031A6C42F080521A644FF4E04215 +S31508002590C4F20002116841F4404111609A689A60D9 +S315080025A09A6842F400429A609A6842F4A0529A6085 +S315080025B045F20C42C0F240725A601A6842F08072C4 +S315080025C01A604FF46052C4F20202136813F0007FD7 +S315080025D0FBD04FF47053C4F2020340F205621A604E +S315080025E04FF46053C4F202039A6822F003029A6019 +S315080025F09A6842F002029A604FF46052C4F20202EC +S31508002600936803F00C03082BFAD14FF46D43CEF20E +S3150800261000034FF000629A6002B0704732B1821828 +S3150800262011F8013B00F8013B9042F9D1704700BF11 +S31508002630CA7E8B7E43EA02230278032A01BF487DBD +S315080026400A7D42EA002243EA02431846704700BF61 +S3150800265000F10B010023DA0142EA530310F8012BBB +S3150800266052FA83F3DBB28842F5D11846704700BFA9 +S3150800267010B504460A46407804F134010123FEF7F2 +S315080026805DFFD0BB94F8332294F8323243EA022233 +S3150800269012B24AF65523CFF6FF739A422FD194F811 +S315080026A06D2094F86C301B0443EA026294F86A3091 +S315080026B0134394F86B2043EA022222F07F4244F245 +S315080026C04613C0F254039A421BD094F8890094F832 +S315080026D088301B0443EA006094F88630034394F874 +S315080026E0870043EA002020F07F4044F24613C0F2F8 +S315080026F05403C01A18BF012010BD032010BD0220C4 +S3150800270010BD002010BD00BF2DE9F0410446037935 +S315080027101BB3056B00F13407407839462A46012376 +S31508002720FEF73EFFE0B900232371636A9D421AD380 +S31508002730E26913449D4219D2E678012E19D94FF061 +S315080027400108E2691544607839462A464346FEF789 +S3150800275027FF013E012EF4D10EE00020BDE8F081EE +S315080027600120BDE8F0810020BDE8F0810020BDE829 +S31508002770F0810020BDE8F0810020BDE8F08100BFAF +S3150800278038B504460D46036B8B420CD0FFF7BCFFE9 +S3150800279058B9607804F134012A460123FEF7CEFEC3 +S315080027A028B9256338BD002038BD012038BD012071 +S315080027B038BD00BF08B588B103688BB1197889B1EF +S315080027C0D988828891420FD15878FEF79DFE00F08D +S315080027D00100002814BF0320002008BD092008BDF9 +S315080027E0092008BD092008BD092008BD2DE9F041CA +S315080027F0154603681C78303C092C00F2B5815A78D6 +S315080028003A2A40F0B1810233036000230B60002CA2 +S3150800281040F0718140F27C53C2F200031C68002C20 +S3150800282000F06C810C6023788BB16078FEF76CFE43 +S3150800283010F0010F0BD1002D00F0638100F00400A9 +S31508002840C0B2002814BF0A200020BDE8F08100208D +S3150800285020706070FEF73CFE10F0010F40F05481C6 +S315080028601DB110F0040F40F0528120460021FFF7F9 +S31508002870FFFE012818BF002517D194F8F631002B62 +S3150800288000F0488194F8FD2194F8FC311B0443EAD2 +S31508002890026294F8FA31134394F8FB5143EA05258A +S315080028A020462946FFF7E4FEFFE7032800F03581B6 +S315080028B0002840F0358194F8402094F83F3043EAE8 +S315080028C002231BB2B3F5007F40F02D8194F84B002C +S315080028D094F84A3053EA00200DD194F85B2094F816 +S315080028E05A301B0443EA026294F85830134394F8AA +S315080028F0590043EA0020E06194F84410E1704B1E49 +S31508002900DBB2012B00F2128194F84130A370002B40 +S3150800291000F00F815A1E1A4240F00E8194F8466064 +S3150800292094F8452042EA0622228112F00F0F40F061 +S31508002930068194F8487094F8476056EA07260DD140 +S3150800294094F8577094F85660360446EA076794F880 +S3150800295054603E4394F8557046EA072694F843C0F7 +S3150800296094F8427057EA0C2700F0EC8001FB00FC53 +S3150800297007EB121161448E42C0F0E780761AB6FB67 +S31508002980F3F3002B00F0E48040F6F576B3428CBFF3 +S31508002990022601264FF6F578434500F2E880023311 +S315080029A0A36125622F4467622944E162032E13D18D +S315080029B0002A40F0D08094F8631094F8622012043C +S315080029C042EA016194F860200A4394F8611042EAE9 +S315080029D00122A2629B000EE0002A00F0BF80674435 +S315080029E0A762022E0FBF5B0003225A4303F00103BE +S315080029F018BF03EB520303F2FF13B0EB532FC0F0DB +S31508002A00B0804FF0FF3323610023E360032E63D1C8 +S31508002A10637194F8652094F8643043EA02222A44E4 +S31508002A206261607804F134010123FEF787FD00280E +S31508002A3052D194F8332294F8323243EA022212B27F +S31508002A404AF65523CFF6FF739A4245D194F83720B4 +S31508002A5094F836301B0443EA026294F83430134380 +S31508002A6094F8352043EA022245F25223C4F2611350 +S31508002A709A4231D194F81B2294F81A321B0443EA7D +S31508002A80026294F81832134394F8192243EA022290 +S31508002A9047F27223C6F241139A421DD194F82322B3 +S31508002AA094F822321B0443EA026294F82032134354 +S31508002AB094F8212243EA0223E36094F81F2294F84B +S31508002AC01E321B0443EA026294F81C32134394F83C +S31508002AD01D2243EA02232361267040F27853C2F28C +S31508002AE000031A88013292B21A80E280002020631D +S31508002AF02071BDE8F0810B20BDE8F0810C20BDE80F +S31508002B00F0810020BDE8F0810320BDE8F0810A20AD +S31508002B10BDE8F0810D20BDE8F0810120BDE8F08117 +S31508002B200D20BDE8F0810D20BDE8F0810D20BDE83F +S31508002B30F0810D20BDE8F0810D20BDE8F0810D2063 +S31508002B40BDE8F0810D20BDE8F0810D20BDE8F081DB +S31508002B500D20BDE8F0810D20BDE8F0810D20BDE80F +S31508002B60F0810D20BDE8F08100230B6052E60233A8 +S31508002B70A36125622F4467622944E162032617E7A9 +S31508002B802DE9F0410D4601F109020369002B5ED0DB +S31508002B90416991F80C800B78202B1BD00E46002437 +S31508002BA008F00807FFB203E016F8013F202B11D002 +S31508002BB0052B08BFE52347B1A3F1410C5FFA8CFC4E +S31508002BC0BCF1190F9CBF2033DBB202F8013B01347C +S31508002BD0082CE9D10B7A202B22D0561C2E231370F1 +S31508002BE00B7A202B1BD001F10804171D324608F07A +S31508002BF010085FFA88F603E014F8013F202B0FD07F +S31508002C0046B1A3F1410C5FFA8CFCBCF1190F9CBFCD +S31508002C102033DBB202F8013BBA42EDD100E032467E +S31508002C20CB7A2B72CC7F8B7F1B0443EA04630C7F21 +S31508002C3023434C7F43EA04232B604C7E0B7E43EAF6 +S31508002C400423AB80CC7D8B7D43EA0423EB800023F1 +S31508002C501370AE6946B3EB6933B3036900240BB34B +S31508002C60028C4FF6FF739A4208BF00241AD0C76930 +S31508002C70388890B10024A046414601F02BFC70B17B +S31508002C80EA69013AA2420CD90134321902F8010C58 +S31508002C9037F8020F0028EFD104E0002402E00024F0 +S31508002CA000E0002400233355BDE8F08110B5044642 +S31508002CB0FFF72AFD0346002854D12378032B49D170 +S31508002CC06379002B46D00023236304F1340104F50D +S31508002CD00D700B46002203F8012B8342FBD15523C6 +S31508002CE084F83232AA2384F83332522384F83430F3 +S31508002CF084F83530612384F83630412284F8372049 +S31508002D00722084F8180284F8190284F81A2284F8C2 +S31508002D101B32236984F81C32C3F3072284F81D2268 +S31508002D201A0C84F81E221B0E84F81F32E36884F8F6 +S31508002D302032C3F3072284F821221A0C84F82222AF +S31508002D401B0E84F82332607862690123FEF728FC9B +S31508002D5000236371607800210A46FEF757FC031CBE +S31508002D6018BF0123184610BD02398369023B9942F0 +S31508002D703DBF8278C36A02FB01300020704700BF5E +S31508002D80F8B505460C4601295CD9836999425BD298 +S31508002D900378022B28D0032B38D0012B56D101EB10 +S31508002DA05106416A01EB5621FFF7EAFC002850D18B +S31508002DB0C6F308032B4493F834700136696A28462B +S31508002DC001EB5621FFF7DCFC002845D1C6F30806BF +S31508002DD0354495F8340047EA002014F0010F14BF73 +S31508002DE00009C0F30B00F8BD416A01EB1421FFF797 +S31508002DF0C7FCA0BB640004F4FF742B1993F83430A5 +S31508002E002C4494F8350043EA0020F8BD416A01EBEA +S31508002E10D411FFF7B5FC28BBA40004F4FE742B19E3 +S31508002E2093F8360093F83720120642EA004293F8E0 +S31508002E30350042EA00202C4494F83430184320F038 +S31508002E407040F8BD0120F8BD0120F8BD4FF0FF30F5 +S31508002E50F8BD4FF0FF30F8BD4FF0FF30F8BD4FF02A +S31508002E60FF30F8BD4FF0FF30F8BD00BF70B504461F +S31508002E700D46E1808168012938D003689A69914234 +S31508002E8036D271B91A78032A01D1996A49B900224A +S31508002E90E2601A89AA422DD99B6A03EB15132361AE +S31508002EA01BE09E783601B54210D32068FFF768FF0D +S31508002EB00146B0F1FF3F1FD001281FD923689B693F +S31508002EC098421DD2AD1BADB2AE42EED9E160206884 +S31508002ED0FFF74AFF00EB1510206105F00F05236880 +S31508002EE003EB451334336361002070BD022070BDC7 +S31508002EF0022070BD022070BD012070BD022070BD89 +S31508002F00022070BDF8B505460C461646012998BF3D +S31508002F1002237CD98369994228BF022377D2037892 +S31508002F20022B40D0032B50D0012B18BF02236BD1A4 +S31508002F3001EB5107416A01EB5721FFF721FC0346D4 +S31508002F40002861D1C7F3080314F001041FBFEA186B +S31508002F5092F8342002F00F02F1B21ABF42EA0112C7 +S31508002F60D2B2F2B22B4483F83420013701232B71F5 +S31508002F70696A284601EB5721FFF702FC0346002839 +S31508002F8042D1C7F3080714B1C6F3071607E0EA19D2 +S31508002F9092F8342022F00F02C6F3032616432F4474 +S31508002FA087F8346030E0416A01EB1421FFF7E8FB4B +S31508002FB0034648BB640004F4FF742A1982F8346097 +S31508002FC0C6F3072682F835601EE0416A01EBD41184 +S31508002FD0FFF7D6FB0346B8B9A40004F4FE742A1911 +S31508002FE092F8371009062C4401F070410E4384F814 +S31508002FF03460C6F3072182F83510310C82F8361092 +S31508003000360E82F83760FFE701222A71FFE7184675 +S31508003010F8BD00BF2DE9F0410546884631B9C668B6 +S3150800302076B183699E4228BF01260AE0FFF7A8FE0B +S31508003030012847D9AB69984228BF464601D24DE0D8 +S315080030400126344602270134AB699C4202D3012E7D +S315080030503BD93C4628462146FFF792FE38B1B0F1E7 +S31508003060FF3F18BF012833D0B442ECD132E02646E0 +S31508003070284621466FF07042FFF744FF0346D0F119 +S31508003080010038BF0020B8F1000F08BF002028B1A2 +S31508003090284641462246FFF735FF03465BB9EE60F0 +S315080030A02B69B3F1FF3F18D0013B2B6101236B71EC +S315080030B02046BDE8F081012B14BF01204FF0FF30F8 +S315080030C0BDE8F0810120BDE8F0810020BDE8F0816F +S315080030D0BDE8F0810020BDE8F0812046BDE8F0811A +S315080030E02DE9F84304460E46C5880135ADB2002DD4 +S315080030F06AD00369002B6AD015F00F075BD101333C +S315080031000361C16821B903681B89AB4262D952E0E1 +S3150800311000688378013B13EA15134CD1FFF730FE9C +S315080031208046012859D9B0F1FF3F59D020688369F4 +S31508003130984539D3002E56D0E168FFF76BFF8046D5 +S31508003140002853D0012854D0B0F1FF3F54D020684E +S31508003150FFF7DAFA002852D1236803F13401002375 +S315080031601A46CA540133B3F5007FFAD126683046A9 +S315080031704146FFF7F9FD306300264FF001090CE0E0 +S3150800318083F804902068FFF7BFFA00283AD123682D +S315080031901A6B01321A630136F6B223689A78B2427C +S315080031A0EED81A6B921B1A63C4F80C802068414645 +S315080031B0FFF7DAFD2061E580236803EB4713343314 +S315080031C063610020BDE8F8830420BDE8F883042085 +S315080031D0BDE8F8830420BDE8F8830220BDE8F8833B +S315080031E00120BDE8F8830420BDE8F8830720BDE880 +S315080031F0F8830220BDE8F8830120BDE8F8830120A2 +S31508003200BDE8F8830120BDE8F88300BF2DE9F04F3B +S3150800321089B005460021FFF729FE002840F0AC805A +S315080032204FF0FF09C8464F4647F2C061C0F6000195 +S31508003230029101F10C0204924FF6FF7A4FF0000B4F +S3150800324028682969FFF79CFA002840F096806C697F +S315080032502678002E00F09280E37A03F03F02E52EEE +S315080032607FD013F0080F04D00F2A18BFB8467BD1B9 +S3150800327001E00F2A58D1EB690193002B74D016F0A0 +S31508003280400F06D094F80D9006F0BF06EB882B8405 +S3150800329003E0B04518BFB84666D1617B039149453E +S315080032A018BFB84660D1237823F04003013B03EBEF +S315080032B0430203EB82020592029A02F1FF394FF0AC +S315080032C001080796059E06954546DDF8108019F80B +S315080032D0013FE2185078E35C43EA00207DB101F033 +S315080032E01FF90546FE2E56D8731C0593019931F829 +S315080032F0160001F015F985424FD1059E01E05045AB +S315080033004DD1C145E3D1A8460596079E069D23786B +S3150800331013F0400F39D0B8F1000F36D0059A01994D +S3150800332031F812308BB33BE0B8F1000F04D12046D8 +S31508003330FFF78EF9484523D0A5F820A0AB69DA7ABD +S3150800334012F0010F08BF04F10B0002D00BE0844213 +S3150800335018D014F8011B13F8012B9142F7D0B84680 +S3150800336002E0B84600E0B84628465946FFF7B8FED8 +S3150800337000283FF465AF07E016E015E0042013E0E7 +S31508003380002011E000200FE00EE0013E5FFA86F80B +S31508003390DDF80C90E8E7069D02E0069D00E0069D34 +S315080033A0DDF80C90B846DFE709B0BDE8F08F00BF3E +S315080033B02DE9F04F87B0814688460B782F2B18BF2A +S315080033C05C2B08BF01F101080023836098F80030E0 +S315080033D01F2B07D80021FFF749FD03460022C9F82D +S315080033E014207AE14FF0010A47F22C6BC0F6000B65 +S315080033F047F23861C0F60001049147F24062C0F610 +S315080034000002059298F800302F2B18BF5C2B08D1C4 +S3150800341008F10103984613F8012B2F2A18BF5C2AD6 +S31508003420F8D0D9F81C5098F800002F2818BF1F2884 +S315080034302CD95C2800F02D81AF1E4646544607E07D +S315080034405C2B00F02881B2F5807F00F0418114469C +S31508003450514601F03FF80146002800F039817F28DF +S3150800346009D8222900F034815A4612F8013F13B1CF +S315080034709842FAD12CE127F8021F621C16F8013F80 +S3150800348018462F2B18BF1F2BDAD801E00024524606 +S3150800349090441F2898BF042601D90026FFE7002C70 +S315080034A000F0168104F10043013B5A0035F8133049 +S315080034B02E2B18BF202B40F0F080931C2B4407E0DE +S315080034C033F8042C023B2E2A18BF202A40F0E58048 +S315080034D0013CF5D1FCE003F8011B8342FBD12B88A4 +S315080034E0202B18BF2E2B40F0E480284600230133FA +S315080034F030F8021F202918BF2E29F8D0002B00F01B +S31508003500D98046F00306D5E0013C05D10821039190 +S3150800351000220192029205E0023A32F8021C2E2994 +S31508003520F2D1F3E75F1C35F81300002861D0202894 +S3150800353008D0E31B18BF01232E2814BF002203F06E +S3150800354001021AB146F003063B46EBE7019A0399D6 +S31508003550BC4218BF8A4214D30B2903D146F003068E +S31508003560029A49E00BB146F00306A74243D8029AED +S315080035709300DBB2029323460B21039108220192A2 +S31508003580D0E77F280DD9002100F0A4FF03460028C4 +S3150800359000F0A08005990B4413F8800C46F002064B +S315080035A050B101462B2807D0049A12F8013F002B88 +S315080035B000F087809942F8D146F003065F2010E0B4 +S315080035C0029A42F0020202920BE0A0F161039BB25A +S315080035D0192B9FBF029B43F001030293203898BF23 +S315080035E080B2D9F81830019958543B4601310191F7 +S315080035F098E7029A00E0029AD9F818301978E5296E +S3150800360004BF05211970039B082B02BF9200D2B292 +S315080036100292029901F00C030C2B03D001F003026D +S31508003620032A01D146F0020616F0020F0AD10299C2 +S3150800363001F00302012A08BF46F01006042B08BF52 +S3150800364046F00806D9F81830DE724846FFF7DEFD60 +S31508003650D9F81830DA7A034648B104283DD102F081 +S315080036600403DBB2002B14BF0346052335E012F032 +S31508003670040F32D1D9F81410CB7A13F0100F06D0F4 +S31508003680D9F80000FEF7D4FFC9F80800BAE6052302 +S3150800369023E0002452469044FFE66700EA194FF0FB +S315080036A0000325F81430D9F8183003F10B0020214F +S315080036B011E700232F4437F8021C2E293FF426AFC2 +S315080036C022E7A0F141039BB2192B7FF679AF7CE77D +S315080036D0062302E046F002066EE7184607B0BDE884 +S315080036E0F08F00BF2DE9F04F83B0044689464FF0AE +S315080036F0FF0B5E460425D84647F2C06AC0F6000AA4 +S315080037000AF10C030093002770E02068FFF738F8E9 +S31508003710054600286ED162691378002B74D0D17AD9 +S31508003720E52B18BF2E2B59D001F03F01082914BFED +S3150800373000200120484518BF464651D10F2943D1DC +S3150800374013F0400F06D092F80DB003F0BF03E188DE +S31508003750218403E09E4218BF464641D192F80DE007 +S31508003760DE4518BF46463BD1D4F81CC0117801F097 +S315080037703F01013901EB410501EB85050AF1FF31EE +S3150800378001260193DDF800B011F8013FD018407802 +S31508003790D35C43EA002036B1FE2D32D82CF815004A +S315080037A00646013503E04FF6FF73984229D159457D +S315080037B0EAD1019B127812F0400F1ED0FE2D98BF59 +S315080037C02CF8157019D91CE010461EB9FEF740FFF3 +S315080037D058451BD04FF6FF73238417E04646FFE78C +S315080037E020463946FFF77CFC054618B921690029A9 +S315080037F08BD15DB10023236108E0013BDEB2F346BD +S31508003800EEE7F3464646EBE70425F3E7284603B01A +S31508003810BDE8F08F2DE9F0410446C588018C4FF6C6 +S31508003820FF73994208BF2946FFF720FB0346D0B924 +S31508003830E52701264FF0000820682169FEF7A0FF5A +S31508003840034668B96269177022681671E288AA4247 +S3150800385009D220464146FFF743FC03460028EBD031 +S31508003860042B08BF02231846BDE8F0812DE9F04174 +S3150800387004460E46012998BF02212BD983699E4228 +S3150800388028BF022126D200274FF0010820463146DC +S31508003890FFF776FA0546C0B1012818D0B0F1FF3F08 +S315080038A017D0204631463A46FFF72CFB014688B921 +S315080038B02369B3F1FF3F1EBF0133236184F80580F6 +S315080038C0A369AB4206D92E46E0E7002102E00221B1 +S315080038D000E001210846BDE8F08100BF70B582B05E +S315080038E0054616461C460B22FEF798FE052C0BD9F4 +S315080038F0B21EE30343EA540432F8023F13FA84F48F +S31508003900A4B25388002BF4D1072204F00F0101F169 +S315080039103003392B88BF01F13703013A00A9114456 +S315080039204B702409F1D114467E2102AB134403F8E7 +S31508003930081C62B12B78202B0BD0294600230133B3 +S31508003940A34207D011F8010F2028F8D102E000237E +S3150800395000E000232020072A9FBF02A9891811F832 +S31508003960081C013288BF0146E9540133072BF2D9F6 +S3150800397002B070BD2DE9F04F87B004468769C66965 +S3150800398003A839460C22FEF749FE9DF8173013F0B6 +S31508003990010F21D00023FB72E3610125384603A9F4 +S315080039A032462B46FFF79AFF2046FFF72FFC0346C1 +S315080039B020B90135ADB2642DF0D1D5E0642D08BF2C +S315080039C0072000F0EF80042B18BF184640F0EA8065 +S315080039D09DF81730FB72E6619DF8173013F0020F59 +S315080039E008BF012716D033883BB1002301339BB2A9 +S315080039F036F81320002AF9D100E0002319334EF6D1 +S31508003A004F42C4F6C46282FB0317DB17C3EBA70752 +S31508003A10BFB2FFE720460021FFF728FA0346002831 +S31508003A2040F0BF800025A846012620682169FEF7D8 +S31508003A30A7FE0346002840F0B48063691B78E52B8F +S31508003A4018BF002B03D10135AF4201D18EE04546A0 +S31508003A5020463146FFF744FB03460028E5D0A0E0A0 +S31508003A60E188C9EB0101204689B2FFF7FFF9034651 +S31508003A70002840F09680A069FEF7EAFD01904FF015 +S31508003A8000084FF6FF7547F2C066C0F60006FF2726 +S31508003A9020682169FEF774FE0346002840F08180FD +S31508003AA0D4F81CA061695FFA89FB019A4A734FF042 +S31508003AB00F03CB7281F80C8081F81A8081F81B807D +S31508003AC00BF1FF3303EB430003EB8000012243466F +S31508003AD002E070462B460132AB424ED000F1010E91 +S31508003AE03AF81030B01810F8010C0B5408444FEA95 +S31508003AF0132C80F801C0002B49D070460C2AEAD94D +S31508003B00AB4202D03AF810300BB94BF0400B81F8B3 +S31508003B1000B023684FF00101197120464146FFF7AE +S31508003B20DFFA034600283CD109F1FF391FFA89F963 +S31508003B30B9F1000FACD12DE0636903F12001002231 +S31508003B4003F8012B8B42FBD16069A1690B22FEF7B2 +S31508003B5065FD6369A269D27A02F018021A732368AE +S31508003B6001221A7100201DE007201BE0013F1FFA01 +S31508003B7087F9B9F1000F0DD072E706EB020E1EF8B1 +S31508003B8001EC01F80E708E448EF80170B6E70C2A27 +S31508003B909FD9BAE720682169FEF7F2FD0028CBD045 +S31508003BA000E0184607B0BDE8F08F00BF88B940F2BC +S31508003BB07C53C2F200031B680BB100221A7009B1CC +S31508003BC000230B7040F27C53C2F2000319600020F8 +S31508003BD070470B20704700BF2DE9F0438FB0019165 +S31508003BE015460446002800F094800023036001A8C7 +S31508003BF005A902F01E02FEF7F9FD002840F08B80A9 +S31508003C0005F01F0702AB0B9340F27833C2F20003AC +S31508003C100C9305A80199FFF7CBFB0A9E03460028DB +S31508003C207FD1002E78D17BE05BB1042B40F08580F4 +S31508003C3005A8FFF79FFE47F008070A9E034638B116 +S31508003C407BE0F37A13F0110F70D115F0040F6FD1E2 +S31508003C5017F0080F3CD0FDF70BFDB073C0F3072330 +S31508003C60F373030C3374000E70740025F572357700 +S31508003C707577B577F577DDF8148040463146FEF757 +S31508003C80D7FCB576F57635757575012388F8043051 +S31508003C900546E8B1D8F8309040462946FFF7E6FDD4 +S31508003CA00346002849D10598013DC5604946FEF7F7 +S31508003CB067FD03460AE0F37A13F0100F3AD115F0C0 +S31508003CC0020F05D013F0010F36D101E0002B34D1D5 +S31508003CD017F0080F18BF47F02007059D2B6BE36107 +S31508003CE02662A77128463146FEF7A2FC2061F27FBC +S31508003CF0B37F1B0443EA0263327F1343727F43EAAE +S31508003D000223E3600020A060A0612560EB88A38001 +S31508003D1014E0092012E011E015F01C0F91D1CAE752 +S31508003D20062315F01C0F7FF47FAFCFE7072304E0C7 +S31508003D30082302E0042300E0072318460FB0BDE875 +S31508003D40F08300BF2DE9F04F83B004460F46904636 +S31508003D501E4600233360FEF72DFD002840F0BF8085 +S31508003D60A37913F0800F18BF022040F0BC8013F02F +S31508003D70010F08BF072000F0B680E568A368ED1AB2 +S31508003D80A84538BF4546002D00F0AA8004F1240353 +S31508003D900193A368C3F30802002A40F086802068CE +S31508003DA090F802A00AF1FF3A0AEA532A1AF0FF0A23 +S31508003DB017D10BB9206902E06169FEF7E1FF012816 +S31508003DC005D8A37963F07F03A37102208BE0B0F1D5 +S31508003DD0FF3F05D1A37963F07F03A371012082E039 +S31508003DE06061D4F8008040466169FEF7BDFF8146F0 +S31508003DF028B9A37963F07F03A371022073E0D14445 +S31508003E005FEA552B29D098F802300BEB0A029A4242 +S31508003E1088BFCAEB030B98F8010039464A465FFA91 +S31508003E208BF3FDF78BFB28B1A37963F07F03A371AE +S31508003E30012058E0A37913F0400F0BD0A369C9EB12 +S31508003E400300834506D907EB402001994FF4007219 +S31508003E50FEF7E4FB4FEA4B2B35E0A2694A4522D030 +S31508003E60A37913F0400F10D098F8010001990123A7 +S31508003E70FDF796FB28B1A37963F07F03A3710120B0 +S31508003E8031E0A37923F04003A37123685878019998 +S31508003E904A460123FDF752FB28B1A37963F07F0355 +S31508003EA0A37101201FE0C4F81890A168C1F30801A6 +S31508003EB0C1F5007B5D4538BFAB4621443846243101 +S31508003EC05A46FEF7ABFB5F44A3685B44A3603368BE +S31508003ED05B443360B5EB0B057FF45BAF02E002E0B1 +S31508003EE0002000E0002003B0BDE8F08F2DE9F04F78 +S31508003EF083B004460F4615461E4600233360FEF778 +S31508003F0059FC002840F0DA80A37913F0800F18BF17 +S31508003F10022040F0D48013F0020F08BF072000F0FB +S31508003F20CE80E368DD4280F0BE80002D00F0BB80C5 +S31508003F3004F124030193A368C3F30802002A40F09E +S31508003F409580206890F802B00BF1FF3B0BEA532BE3 +S31508003F501BF0FF0B21D13BB9236963B90021FFF799 +S31508003F6059F80346206103E06169FFF753F80346F1 +S31508003F70002B00F09880012B05D1A37963F07F030D +S31508003F80A37102209BE0B3F1FF3F05D1A37963F04B +S31508003F907F03A371012092E06361A37913F0400FB8 +S31508003FA011D0236858780199A2690123FDF7F8FA18 +S31508003FB028B1A37963F07F03A37101207FE0A37979 +S31508003FC023F04003A371D4F8008040466169FEF7E8 +S31508003FD0CBFE814628B9A37963F07F03A37102203B +S31508003FE06DE0D9445FEA552A29D098F802300AEBE1 +S31508003FF00B029A4288BFCBEB030A98F801003946B0 +S315080040004A465FFA8AF3FDF7CBFA28B1A37963F03B +S315080040107F03A371012052E0A369C9EB03018A4516 +S315080040200AD9019807EB41214FF40072FEF7F6FA18 +S31508004030A37923F04003A3714FEA4A2A28E0A3692B +S315080040404B4511D0A268E3689A420DD298F8010050 +S3150800405001994A460123FDF771FA28B1A37963F05D +S315080040607F03A37101202AE0C4F81890A068C0F362 +S315080040700800C0F5007A554538BFAA4620442430C2 +S3150800408039465246FEF7CAFAA37943F04003A371AC +S315080040905744A3685344A360336853443360B5EB6D +S315080040A00A057FF448AFA368E268934288BFE360D5 +S315080040B0A37943F02003A371002000E0FFE703B0D3 +S315080040C0BDE8F08F38B50446FEF774FB002849D1E1 +S315080040D0A37913F0200F46D013F0400F0DD02146D8 +S315080040E051F8243B5878A2690123FDF759FA0028AC +S315080040F03BD1A37923F04003A3712068E169FEF759 +S315080041003FFB002833D1256AEB7A43F02003EB7294 +S31508004110E3682B77A3891B0A6B77E389AB77E37B85 +S31508004120EB772369AB76C3F30722EA761B0C2B756C +S315080041301B0A6B75FDF79CFAA875C0F30723EB7588 +S31508004140030C2B76000E68760023AB74EB74A37908 +S3150800415023F02003A371236801221A712068FEF751 +S31508004160A5FD38BD38BD002038BD012038BD38BD95 +S3150800417010B50446FFF7A6FF034608B900222260D9 +S31508004180184610BD70B504460D46FEF713FB002809 +S3150800419040F0BD80A37913F0800F40F0B980E26843 +S315080041A0AA4205D203F00203DBB2002B08BF15466C +S315080041B0A2680023A360002D00F0AC8020688678F2 +S315080041C076026AB1013A691EB1FBF6F1B2FBF6F363 +S315080041D0994205D373421A40A260AD1A616918E084 +S315080041E02169A9B9FEF716FF0146012805D1A37969 +S315080041F063F07F03A371022070BDB0F1FF3F18BFC3 +S31508004200206105D1A37963F07F03A371012070BDF6 +S315080042106161002940D0B5422BD9A27912F0020F6C +S3150800422005D02068FEF7F6FE014620B920E0206892 +S31508004230FEF7A6FD0146B1F1FF3F05D1A37963F06C +S315080042407F03A371012070BD012903D922689269F1 +S31508004250914205D3A37963F07F03A371022070BD51 +S315080042606161A2683244A260AD1BAE42D5D300E0BC +S315080042703546A2682A44A260C5F3080272B12068CE +S31508004280FEF772FD28B9A37963F07F03A3710220B4 +S3150800429070BD00EB552502E0002500E00025A36867 +S315080042A0C3F3080343B3A269AA4225D0A37913F03E +S315080042B0400F11D0214651F8243B58780123FDF7C9 +S315080042C06FF928B1A37963F07F03A371012070BD4C +S315080042D0A37923F04003A371214651F8243B58786B +S315080042E02A460123FDF72AF928B1A37963F07F034B +S315080042F0A371012070BDA561A368E26893420BD93A +S31508004300E360A37943F02003A371002070BD70BD5C +S31508004310022070BD002070BD002070BD30B58FB082 +S315080043200EAB43F8340D0D46184605A90022FEF7D4 +S315080043305DFA0446A0B902AB0B9340F27833C2F299 +S3150800434000030C9305A80199FFF732F8044638B91B +S315080043500A9B23B105A82946FEF712FC00E00624AD +S3150800436020460FB030BD00BF30B599B018AB43F842 +S315080043705C0D18460FA90122FEF738FA03460028F5 +S315080043804DD103AB159340F27833C2F2000316936E +S315080043900FA80199FFF70CF8034600283FD1149996 +S315080043A0062300293BD0CC7A14F0010F18BF072347 +S315080043B035D124E0012D98BF022330D906A80FA9CC +S315080043C02422FEF72BF9089506A80221FEF74EFDD2 +S315080043D0034620BB06A80021FFF784F90346E8B187 +S315080043E0042814D01BE02DB10F982946FFF73EFA92 +S315080043F00346A0B90F98FEF759FC03460FE00F983D +S31508004400FEF716F9054614F0100FD3D1FFE70FA8EB +S31508004410FFF700FA03460028E5D000E00723184610 +S3150800442019B030BD2DE9F04383B081469046054664 +S3150800443000244E1E012711E0404601A93A466B4664 +S31508004440FFF780FC009B012B0AD19DF804300D2B49 +S3150800445004D005F8013B01340A2B01D0A642EBDC57 +S3150800446000232B709C4214BF4846184603B0BDE88B +S31508004470F08300BF30B583B004460D460A2802D142 +S315080044800D20FFF7F7FF02A901F8084D28466946EF +S31508004490012201ABFFF72AFD0198012814BF4FF04E +S315080044A0FF30012003B030BD70B505460E460078D2 +S315080044B060B100243146FFF7DDFFB0F1FF3F08D0B9 +S315080044C0013415F8010F0028F4D101E0002070BD71 +S315080044D0204670BD7F2821D941B9C7281EBF47F697 +S315080044E0B002C0F6000201230AD112E0FF2814D850 +S315080044F0803847F6B003C0F6000333F8100070475B +S3150800450032F8021F814205D001339BB2802BF7D1C6 +S3150800451000E000238033D8B270470020704700BF00 +S3150800452061280CD047F2D062C0F6000200210131A2 +S3150800453032F8023F53B18342F9D10BB970470021D3 +S3150800454047F6B013C0F6000333F81100704700BFF2 +S3150800455030B4013A8D18A94214D20B461C785A7801 +S3150800456002EB042292B2104480B2824284BF013028 +S3150800457080B202339D42F1D8CB432B4423F001038A +S3150800458002331944A94207D10B781B02184480B29A +S31508004590834284BF013080B230BC704738B541F6DB +S315080045A02074C2F20004657C143D237C05EB0325C8 +S315080045B0ADB2284480B204F11A010822FFF7C8FFF9 +S315080045C004F122012A46FFF7C3FF034620B1000A79 +S315080045D040EA032080B238BD4FF6FF7038BD00BFF1 +S315080045E070B4C4780C44E4B241F69863C2F200038E +S315080045F0DC700D0A82782A44D2B29A7046785E70C8 +S315080046000078187095420DD90136F6B241F69863CE +S31508004610C2F200035E702EB941F69863C2F2000337 +S3150800462001301870C9B28C4217DA0132D2B241F69B +S315080046309863C2F200039A707AB941F69863C2F297 +S3150800464000035A780132D2B25A7032B941F69863E9 +S31508004650C2F200031A7801321A7070BC704700BFA4 +S3150800466010B5014641F6A464C2F200042068083079 +S31508004670FFF7B6FF226841F69863C2F2000319787D +S3150800468011725978517299789172DB78D37210BD8C +S3150800469008B5002006491422FFF75AFF034620B141 +S315080046A0000A40EA032080B208BD4FF6FF7008BD35 +S315080046B02E1F002008B50620FFF770FF08BD00BFB3 +S315080046C041F61073C2F2000300221A8041F6A8636D +S315080046D0C2F200035A7640F29453C2F20003012252 +S315080046E01A7040F28853C2F200034FF480621A80AF +S315080046F0704700BF40F29453C2F2000300221A70BA +S3150800470041F61073C2F200031B882BB941F61073E9 +S31508004710C2F200031880704740F29453C2F20003B5 +S3150800472001221A70704700BF38B541F6A463C2F279 +S3150800473000031C6841F6A063C2F20003A54A1A608A +S3150800474041F69463C2F200031A60032813D1637E0C +S3150800475003F00F03032B40F05B87238A002B40F0FE +S31508004760578741F69C63C2F2000308221A7001F0CB +S3150800477071FB00F097BD022840F09E8040F28453FA +S31508004780C2F20003DA780132D2B2DA70C2B940F264 +S315080047908453C2F200039A780132D2B29A707AB977 +S315080047A040F28453C2F200035A780132D2B25A70E8 +S315080047B032B940F28453C2F200031A7801321A70F1 +S315080047C041F69063C2F2000300221A8042F2625355 +S315080047D0C2F200031A80637E03F0FD02052A09D19E +S315080047E0A37E0133DBB2A376782B04BF002363765E +S315080047F000F00EBF002B00F00B87228A002A4CD04F +S31508004800A27E511EA176002A40F00287E27E082A7F +S3150800481005D0591EC9B2012914D8052A12D1002378 +S31508004820637641F69C63C2F2000380221A7001F097 +S3150800483011FB41F62073C2F20003142283F82F20DD +S3150800484000F063BE042A9DBF03219140C9B23021FE +S31508004850A1760132E27603F00F03013B072B00F243 +S31508004860D786DFE813F05D0208001000AC04D50611 +S31508004870AC04D506AC0441F62073C2F2000300224C +S3150800488083F82F2053E241F69C63C2F20003042208 +S315080048901A7001F0DFFA00F056BD03F00F03032B80 +S315080048A040F0B68641F69C63C2F2000308221A70ED +S315080048B001F0D0FA00F0F6BC41F62073C2F200030C +S315080048C09B7B452B40F0A48641F62073C2F2000379 +S315080048D0197C5A7C02EB012041F69063C2F2000370 +S315080048E01B88984200F3948684B241F69063C2F21C +S315080048F000031C8041F62073C2F200031B7D13F0EF +S315080049003F0F40F0858641F62073C2F200035B7DB7 +S31508004910002B40F07D8641F61C73C2F200031D8809 +S315080049202DB941F61C73C2F200035B88A3B141F6A8 +S315080049302073C2F20003DB8BAB4240F0698641F676 +S315080049402072C2F2000241F61C73C2F20003128CF6 +S315080049505B889A4240F05C86FFF79AFE4FF6FF7333 +S31508004960984240F0558641F62073C2F20003DB7D7B +S31508004970062B31D0012B40F04B8641F62073C2F24C +S31508004980000393F82230082B40F0428641F6207344 +S31508004990C2F20003002283F822209A8C4FF6F6739F +S315080049A09A4241F62073C2F200038CBF09320832DC +S315080049B09A8441F62073C2F200035A8BDA839A8BE3 +S315080049C01A845D8341F61C72C2F2000252889A83E9 +S315080049D000F017BE561F0020FFF76CFE4FF6FF7358 +S315080049E0984240F0158641F6A863C2F20003597E44 +S315080049F081B341F62072C2F2000241F6A863C2F200 +S31508004A000003928C9B889A4224D141F62072C2F206 +S31508004A10000241F6A863C2F20003528CDB889A4270 +S31508004A2018D141F62072C2F2000241F6A863C2F21A +S31508004A300003528B1B889A420CD141F62072C2F2AF +S31508004A40000241F6A863C2F20003928B5B889A4281 +S31508004A5000F08D8141F62073C2F2000393F82F30DF +S31508004A6003F03F03022B1CD141F62073C2F2000368 +S31508004A709A8C40F28053C2F200031A8040F2945393 +S31508004A80C2F200030021197041F61073C2F2000346 +S31508004A901B8893427BD040F29453C2F20003012252 +S31508004AA01A7041F62073C2F2000393F82F3013F000 +S31508004AB0040F40F0AD8541F62073C2F200031422BC +S31508004AC083F82F2041F69062C2F200022821118055 +S31508004AD0502283F82E2093F8295093F82D2083F836 +S31508004AE0292093F8284093F82C2083F8282083F867 +S31508004AF02C4093F8270093F82B2083F8272083F877 +S31508004B002B0093F8262040F29451C2F200010A7055 +S31508004B1093F82A1083F8261083F82A20691CC9B24C +S31508004B2083F82D10C1B9611CC9B241F62073C2F2CF +S31508004B30000383F82C1079B9411CC9B241F62073D9 +S31508004B40C2F2000383F82B1031B941F62073C2F282 +S31508004B500003013283F82A2041F62073C2F20003CB +S31508004B60598C40F28052C2F2000211809A8C5A8403 +S31508004B7099845A8BDA839A8B1A8441F61C72C2F28C +S31508004B8000021188598352889A8300F00DBD41F6B8 +S31508004B90A863C2F200035B7E23B1072B40F04C8565 +S31508004BA000F042BD41F6A461C2F2000141F6A863D5 +S31508004BB0C2F200030B6003219976197600219975D4 +S31508004BC00420D875D9769A8041F62074C2F200047A +S31508004BD0628CDA80628B1A80A28B5A800120587602 +S31508004BE040F28452C2F2000211781973517859734F +S31508004BF091789973D278DA73188294F82920DA7240 +S31508004C0094F828209A7294F827205A7294F8262045 +S31508004C101A72FFF725FD94F82E3003F0F002502A99 +S31508004C207ADD1B095C1FA40040F29553C2F200030B +S31508004C301A78002341F62071C2F200015AE0CA1818 +S31508004C4092F8362072B940F29451C2F200010B7004 +S31508004C5040F29553C2F200031A7041F6A864C2F2F4 +S31508004C6000045DE0012A02D10133DBB242E0022AE8 +S31508004C702BD10D1895F83750042D26D140F29452B1 +S31508004C80C2F20002137040F29553C2F200030222E8 +S31508004C901A7041F62073C2F20003034493F83820D1 +S31508004CA093F8393043EA022240F28053C2F20003F5 +S31508004CB01A8040F20A639A4238BF134641F6A8643E +S31508004CC0C2F200046382A3822AE0084490F83700FF +S31508004CD070B940F29451C2F200010B7040F295533C +S31508004CE0C2F200031A7041F6A864C2F2000417E083 +S31508004CF00344DBB21846A342A1DB40F29451C2F248 +S31508004D0000010B7040F29553C2F200031A7041F687 +S31508004D10A864C2F2000403E041F6A864C2F20004E3 +S31508004D2041F62073C2F20003102283F82F2041F6C1 +S31508004D302073C2F2000393F82F2042F0020283F890 +S31508004D402F20022283F83620042283F837200622F1 +S31508004D5083F838200A2283F8392041F69062C2F295 +S31508004D6000022C211180602283F82E20DAE341F616 +S31508004D70A463C2F2000341F6A862C2F200021A60F6 +S31508004D8041F69C63C2F2000300221A7041F62073B2 +S31508004D90C2F2000393F82F3013F0040F0ED041F639 +S31508004DA0A863C2F200035A7641F69C63C2F2000376 +S31508004DB020221A7001F04EF800F02ABC41F6207243 +S31508004DC0C2F2000292F82E000009800040F29452C6 +S31508004DD0C2F200021070143C201A80B241F69062AA +S31508004DE0C2F20002108001F00F01022903D103F07C +S31508004DF03F02122A1DD010B913F0030F19D041F63D +S31508004E002071C2F2000141F6A862C2F20002C98C02 +S31508004E101289914240F06E8341F62071C2F2000178 +S31508004E2041F6A862C2F20002098D5289914240F009 +S31508004E30618313F0100F77D041F6A863C2F200031E +S31508004E40198A002970D003F10C00FFF7C9FB41F657 +S31508004E502073C2F2000393F82A4041F69863C2F21F +S31508004E6000031B78A3425FD141F62073C2F2000308 +S31508004E7093F82B0041F69863C2F200035B788342ED +S31508004E8052D141F62073C2F2000393F82C1041F672 +S31508004E909863C2F200039B788B4245D141F6207392 +S31508004EA0C2F2000393F82D2041F69863C2F200037C +S31508004EB0DB78934238D141F6A863C2F200031C732B +S31508004EC058739973DA73DB7E03BB41F6A863C2F2A3 +S31508004ED00003987D197E9A7E891AA1EBD001C9B282 +S31508004EE0CAB20844C0B2987512F0800F1CBF4A4275 +S31508004EF0D2B241F6A863C2F20003D97DA1EB9101B3 +S31508004F000A44D2B2DA7502EBD0021A7641F69C63ED +S31508004F10C2F2000301221A7041F6A863C2F2000326 +S31508004F201A7E9A7600221A8241F6A863C2F2000314 +S31508004F305A7E02F00F03013B072B00F26983DFE874 +S31508004F4013F008003A00040151029B02C702D90275 +S31508004F50390241F69C63C2F200031B7813F0010F75 +S31508004F6000F0568341F6A863C2F2000303225A767C +S31508004F7041F69C62C2F200024021117000221A8298 +S31508004F8041F69063C2F20003188838B141F69C6373 +S31508004F90C2F2000342221A70FFF762FB42F2625322 +S31508004FA0C2F2000300221A8000F054FF41F6A864FA +S31508004FB0C2F2000476E141F69C63C2F200031B7854 +S31508004FC013F0010F00F0B18041F62073C2F200031E +S31508004FD093F82F3003F03F03122B40F0A68041F6DA +S31508004FE02073C2F2000393F82E3003F0F002502A21 +S31508004FF06DDD1B095C1FA40040F29553C2F2000345 +S315080050001A78002341F62071C2F2000152E0CA184C +S3150800501092F8362052B940F29451C2F200010B7050 +S3150800502040F29553C2F200031A7050E0012A02D1E9 +S315080050300133DBB23EE0022A2BD10D1895F8375022 +S31508005040042D26D140F29452C2F20002137040F2A7 +S315080050509553C2F2000302221A7041F62073C2F277 +S315080050600003034493F8382093F8393043EA0222C0 +S3150800507040F28053C2F200031A8040F20A639A4251 +S3150800508028BF1A4641F6A863C2F200035A829A82DA +S315080050901DE0084490F8370050B940F29451C2F226 +S315080050A000010B7040F29553C2F200031A700EE02D +S315080050B00344DBB21846A342A9DB40F29451C2F27C +S315080050C000010B7040F29553C2F200031A7041F6C4 +S315080050D0A864C2F200040323637641F62073C2F281 +S315080050E0000393F82620227293F82720627293F819 +S315080050F02820A27293F82930E3720120FFF7B0FA4C +S3150800510041F69C63C2F2000342221A7000222282F0 +S3150800511041F69063C2F200031A8042F26253C2F269 +S3150800512000031A8000F096FEBCE041F69C63C2F2CA +S31508005130000320221A7000F08DFE41F6A463C2F225 +S3150800514000031B6800225A76ABE441F62073C2F2CC +S31508005150000393F82F3013F0010F38D012F0100F18 +S3150800516035D141F6A863C2F200031B8A002B40F032 +S315080051704F8241F69064C2F200042088013080B262 +S31508005180FFF76EFA41F69C63C2F200031A7842F002 +S3150800519010011970238833B141F69C63C2F20003EB +S315080051A042F012021A7000F055FE41F6A864C2F2E7 +S315080051B0000401232382082363760023E37641F65D +S315080051C02073C2F20003112283F82F209DE113F009 +S315080051D0200F18D041F62073C2F2000393F834006A +S315080051E0000293F8351041F6A063C2F2000340EAC4 +S315080051F001051C682C441C6041F69063C2F200034A +S315080052001888411B198041F69063C2F2000318887A +S3150800521060B112F0100F09D141F69C63C2F2000387 +S315080052201A7842F002021A70FFF71AFA41F620734A +S31508005230C2F2000393F8302093F8313003EB0223CF +S315080052409BB240F28052C2F20002138041F6A86275 +S31508005250C2F20002928A934200D823B940F28053E0 +S31508005260C2F200031A8041F6A863C2F2000340F2B4 +S315080052708052C2F2000212885A8241F69C63C2F238 +S3150800528000031B7813F0030F00F0C28142F2625349 +S31508005290C2F2000300221A8000F0DCFD41F6A86481 +S315080052A0C2F2000441F69C63C2F200031B7813F0B5 +S315080052B0200F0ED042F26253C2F2000300221A8077 +S315080052C0627641F62073C2F20003142283F82F2077 +S315080052D01BE113F0100F12D042F26253C2F2000320 +S315080052E000221A800123238204236376E27641F69C +S315080052F02073C2F20003112283F82F2005E142F23F +S315080053006252C2F200021288DAB113F0010F1CBF12 +S315080053100023238201D1218A71B9618A8A4282BF18 +S3150800532042F26253C2F20003198042F26253C2F299 +S3150800533000031B88238204E042F26253C2F2000390 +S3150800534019800023E37641F6A063C2F2000341F612 +S315080053509462C2F2000212681A6042F26253C2F202 +S3150800536000031B887BB1238A6BB141F69062C2F2B7 +S3150800537000022833138041F62073C2F20003182274 +S3150800538083F82F20C7E041F69C63C2F200031B781E +S3150800539013F0020F00F03C8141F69063C2F200035D +S315080053A028221A8041F62073C2F20003102283F8DD +S315080053B02F20B0E041F69C63C2F200031B7813F07D +S315080053C0010F00F0258141F6A863C2F2000300220E +S315080053D05A7641F69C63C2F2000310221A7000F056 +S315080053E039FD15E141F69063C2F20003188808B149 +S315080053F0FFF736F941F62073C2F2000393F82F300F +S3150800540013F0010F1FD041F69C63C2F200031B780C +S3150800541013F0010F41F6A863C2F200031FBF07226B +S315080054205A7600229A7612BF1A8206225A760120E6 +S31508005430FFF716F941F69C63C2F2000310221A70B0 +S3150800544000F008FD56E041F69C63C2F200031B78A3 +S3150800545013F0010F08D041F6A863C2F20003052233 +S315080054605A7600221A82D3E041F69063C2F200030C +S315080054701B88002B3ED1CBE041F69063C2F20003B5 +S31508005480188808B1FFF7ECF841F62073C2F200035A +S3150800549093F82F3013F0010F13D041F6A863C2F228 +S315080054A0000307225A7600229A760120FFF7D8F8D9 +S315080054B041F69C63C2F2000310221A7000F0CAFC7F +S315080054C018E041F69063C2F200031B8893B99FE087 +S315080054D041F69C63C2F200031B7813F0010F00F03B +S315080054E0978041F6A863C2F2000307225A76002283 +S315080054F09A768DE041F62073C2F20003102283F8F3 +S315080055002F2041F6A864C2F2000441F69063C2F265 +S31508005510000328221A8041F62073C2F200035022A3 +S3150800552083F82E20227A41F62073C2F2000383F80C +S315080055302A20627A83F82B20A27A83F82C20E27A32 +S3150800554083F82D20227B83F82620627B83F8272088 +S31508005550A27B83F82820E27B83F829200622DA75C5 +S31508005560A2885A84E2889A8441F61C72C2F2000222 +S315080055701188598352889A832288DA8362881A8422 +S31508005580637E13F0100F41F62073C2F200031DBFAD +S31508005590002283F8312083F83020062202BF83F8E0 +S315080055A030200A2283F8312041F62074C2F2000422 +S315080055B04023A37541F69063C2F200031B881A0ABA +S315080055C022746374002584F8355084F8345065864F +S315080055D0FFF770F8C04360864523A373E5736575C6 +S315080055E0257540F28253C2F200031A88013292B23C +S315080055F01A80130AA374E2742583FFF749F8C04397 +S31508005600208341F69C63C2F2000300221A7038BD5B +S3150800561041F69063C2F2000300221A8041F69C63A9 +S31508005620C2F200031A7038BD40F29453C2F2000366 +S3150800563001211970FFF7B6BA40F29453C2F200037B +S3150800564001221A70E4E700BF030A43EA002080B289 +S31508005650704700BF10B504460A1E0FDD42F26253BA +S31508005660C2F200031A8041F69463C2F20003186876 +S31508005670844203D0214692B201F012FF10BD00BF4A +S315080056802DE9F00340F29653C2F200034FF0000CE6 +S3150800569083F800C040F29855C2F200052B46012255 +S315080056A01F461C88CCB15E88BEB1B0F80080A04504 +S315080056B013D14488B44210D140F29653C2F2000383 +S315080056C083F800C0086878608B883B8140F2F953FC +S315080056D0C2F200031B78BB725AE0541CE4B20C33C6 +S315080056E0092C02D094462246DAE72B4600221E46AB +S315080056F01C884CB95C883CB940F29653C2F2000348 +S315080057001A70082A36D104E00132D2B20C33082ABC +S31508005710EDD1002340F2F952C2F200021678B046E3 +S315080057201F4699465FFA83FCAA7AC2EB0804BC4274 +S31508005730C2BFC2EB0602E146D7B201330C35082BCD +S31508005740F0D140F29753C2F200031F7040F2F853AB +S31508005750C2F2000383F8009040F29653C2F20003A7 +S3150800576083F8009040F29853C2F2000309EB490906 +S3150800577003EB89060268334643F8042B0A6872600D +S315080057808A889A8040F2F953C2F200031B78B372F2 +S31508005790BDE8F003704700BFF0B440F2F953C2F217 +S315080057A000031E780136F6B21E7040F29853C2F214 +S315080057B000030122002740F29654C2F200045888DA +S315080057C01988014389B259B1997A711A772907DD7F +S315080057D0194601F8017B5F70013101F8017B0F70F2 +S315080057E022700132D2B20C33092AE8D1F0BC7047D4 +S315080057F038B541F69063C2F200031B88292B06D8F8 +S3150800580041F69063C2F2000300221A8038BD41F6C1 +S315080058109063C2F2000300221A8041F62073C2F296 +S3150800582000039B8AB3F5807F03D0B3F5007F59D078 +S3150800583038BD41F62072C2F2000241F61C73C2F26C +S315080058400003D28C1B889A4269D141F62072C2F2B3 +S31508005850000241F61C73C2F20003128D5B889A425D +S315080058605DD12F4CA51F20462946FFF709FFA4F155 +S315080058701C03002204F8082C022204F8072C54F80A +S31508005880062C626034F8022C228140F28C52C2F255 +S315080058900002106844F8060C928824F8022C44F892 +S315080058A0160C24F8122C626844F81C2C228924F859 +S315080058B0182C9A8B62816288A28141F61C72C2F208 +S315080058C000021188998352886280082204F8102CF5 +S315080058D0062204F80F2C41F69063C2F200032A222E +S315080058E01A8038BD41F62072C2F2000241F61C73D6 +S315080058F0C2F20003D28C1B889A4210D141F620725C +S31508005900C2F2000241F61C73C2F20003128D5B88D4 +S315080059109A4204D1024908460639FFF7B1FE38BD56 +S315080059203C1F002038B541F62073C2F20003D98B1C +S315080059308AB24FF6FF739A4215D141F62073C2F226 +S315080059400003188C4FF6FF7398420CD141F620736A +S31508005950C2F2000347F69032C0F6000210681860DB +S3150800596092889A80ADE041F61C73C2F200031B8848 +S315080059705A4041F61873C2F200031B881A4212D124 +S3150800598041F62073C2F200031A8C90B241F61C73DA +S31508005990C2F200035B88584041F61873C2F200034E +S315080059A05B8818420CD040F2FC53C2F2000341F661 +S315080059B01472C2F200021188198052885A8005E0D2 +S315080059C040F2FC53C2F2000319805A8040F2FC539D +S315080059D0C2F2000318885D8840F29853C2F20003A9 +S315080059E000221C46198881420AD15988A94207D142 +S315080059F040F29653C2F200031A70082A58D109E0F9 +S31508005A000132D2B20C33082AEBD140F29653C2F2D5 +S31508005A1000031A7041F62074C2F200042046FF21E2 +S31508005A20062201F091FD002384F8203084F8213005 +S31508005A3084F8223084F8233084F8243084F825301A +S31508005A4040F28C52C2F200021168C4F8061092881D +S31508005A506281C4F81610628340F2FC52C2F2000258 +S31508005A601188E1845288228541F61C72C2F200022E +S31508005A701188A1835288E283237501226275A37374 +S31508005A80E2730822227463740623A3740423E3745E +S31508005A9022730623637341F6A063C2F20003363409 +S31508005AA01C6041F69063C2F200032A221A8038BDB0 +S31508005AB041F62073C2F2000354F8040F1860A28856 +S31508005AC09A8041F62073C2F2000340F28C52C2F269 +S31508005AD000021168C3F8061092885A8108221A73C0 +S31508005AE000225A7341F69063C2F200031A880E32F6 +S31508005AF01A8038BD08B500F00DFC01F05FFC01F016 +S31508005B0043FC00F08BFC00F00FF800F0F1FB08BD39 +S31508005B1008B500F001FC01F06DFC00F0BDFD00F0D9 +S31508005B2029F800F0BDFB08BD30B583B0FF238DF81A +S31508005B30043000258DF8055000F0D0F900F0FAFF82 +S31508005B4040F21804C2F200040123237001F07CFB22 +S31508005B50257000F09DF80323237040F20063C2F21B +S31508005B6000031B78DBB2012B02D101A800F0D6F99D +S31508005B7003B030BD08B540F20460C2F2000001F07F +S31508005B80E1F801280BD140F21803C2F20003012202 +S31508005B901A7040F20460C2F2000000F0BFF940F249 +S31508005BA00460C2F2000001F0A3FB01280BD140F209 +S31508005BB01803C2F2000300221A7040F20460C2F20F +S31508005BC0000000F0ABF940F20460C2F2000000F0F9 +S31508005BD0BBF801280BD140F21803C2F200030322D6 +S31508005BE01A7040F20460C2F2000000F097F908BD8E +S31508005BF0704700BF38B505460C4640F21803C2F296 +S31508005C0000031B78012B02D1C9B201F047F840F214 +S31508005C101803C2F200031B781BB92846E1B201F04B +S31508005C2033FB40F21803C2F200031B78032B03D19F +S31508005C302846E1B200F066F800F068F938BD00BF02 +S31508005C4040F21803C2F200031878012804D002288B +S31508005C5014BF4020002070470820704740F2180300 +S31508005C60C2F200031878012804D0022814BF402085 +S31508005C70002070470820704740F20063C2F2000314 +S31508005C8001221A70704700BF08B500F035F908BD43 +S31508005C9008B5FBF795FF01F0BFFB40F24863C2F277 +S31508005CA0000300F5FA70186001F0B6FB40F2446391 +S31508005CB0C2F2000300F51C5010301860FEF700FD14 +S31508005CC041F61C73C2F200034FF6A9621A8043F626 +S31508005CD01371598041F61873C2F200034FF6FF712B +S31508005CE019800021598041F61473C2F200031A8004 +S31508005CF040F213125A804EF60300FEF7FBFCFCF73F +S31508005D0073F808BDF8B541F6A463C2F200031F682C +S31508005D10FB693B628E4659B14E1EB6B20136002368 +S31508005D2007F11C05C45CEA1814720133B342F9D1B1 +S31508005D300EF10401A7F8641007F12000FFF78AFCAA +S31508005D40FB690133FB61F8BD10B5FCF75FF8002865 +S31508005D503ED041F69062C2F20002108041F62073EE +S31508005D60C2F200039C894FF40060FFF76DFC844281 +S31508005D7013D10120FEF7D8FC41F69063C2F2000366 +S31508005D801B882BB3FFF7CEFDFCF768F841F6906346 +S31508005D90C2F2000300221A801AE041F62073C2F20A +S31508005DA000039C8940F60600FFF74EFC84420FD19B +S31508005DB0FFF71EFD41F69063C2F200031B883BB154 +S31508005DC0FCF74CF841F69063C2F2000300221A80F1 +S31508005DD001F022FB40F24863C2F200031B689842B6 +S31508005DE022D340F24862C2F2000203F5FA73136046 +S31508005DF041F6A463C2F2000341F6A862C2F20002A9 +S31508005E001A600220FEF790FC41F69063C2F2000386 +S31508005E101B884BB1FFF786FDFCF720F841F6906327 +S31508005E20C2F2000300221A8001F0F6FA40F2446337 +S31508005E30C2F200031B68984209D340F24462C2F2D8 +S31508005E40000203F51C5310331360FFF7A5FC00206E +S31508005E5010BD00BF10B541F6A463C2F200031C686A +S31508005E6041F69C63C2F200031B7813F0400F05D07D +S31508005E700123E3610023A4F8643010BD13F0010F79 +S31508005E801CBF0022A4F8642013F0040F06D0B4F84F +S31508005E90641019B104F12000FFF7DCFB41F69C639E +S31508005EA0C2F200031B7813F0020F0AD00023A4F8ED +S31508005EB0643041F6A063C2F200031868043000F0AB +S31508005EC02DF810BD40F24C63C2F20003FE22DA70D0 +S31508005ED018710222A3F84420704700BF40F24C63B1 +S31508005EE0C2F2000300221A709A6483F84320A3F8CA +S31508005EF044209A705A70704740F24C63C2F200030D +S31508005F001878003018BF0120704700BF40F24C6374 +S31508005F10C2F20003002283F84320704738B50446CE +S31508005F200178FF2923D100F08FFA18B91020FFF75E +S31508005F30C9FF96E140F24C64C2F200040023637084 +S31508005F4001252570FF22E270102222716371FFF786 +S31508005F5077FEA071FFF782FEE071FFF77FFE000A69 +S31508005F6020726572A5720823A4F8443079E140F2DC +S31508005F704C63C2F200031B78012B40F09081C939AB +S31508005F80352900F26B81DFE811F0DB006901690150 +S31508005F906501690169015901FC0042012F01690186 +S31508005FA06901690169016901690169016901690193 +S31508005FB06901690169016901690169016901690183 +S31508005FC06901690169016901690169016901690173 +S31508005FD069016901690169016901690169017F004E +S31508005FE0540036007300690169016901A10069015D +S31508005FF0B900BD00CE004578FFF722FE013885427C +S3150800600003DD2220FFF75EFF2BE140F24C65C2F26A +S315080060100005281DA96C627800F0F0FEFF23EB70DE +S315080060206278AB6C1344AB6463780133A5F84430EB +S3150800603017E14578FFF704FE0138854203DD222083 +S31508006040FFF740FF0DE1616840F24C65C2F20005BA +S31508006050A964281D627800F0D1FEFF23EB706278F0 +S31508006060AB6C1344AB6463780133A5F84430F8E0AD +S3150800607040F24C63C2F20003FF22DA7042689A6467 +S315080060800122A3F84420ECE040F24C63C2F200037C +S31508006090FF22DA709B6C406840B11844002213F85E +S315080060A0011B0A44D2B28342F9D100E0002240F231 +S315080060B04C63C2F20003C3F8072001221A710022BA +S315080060C05A719A710822A3F84420CAE040F24C6338 +S315080060D0C2F20003FF22DA7047F69832C0F60002D1 +S315080060E09A6400221A715A719A710721D9711A7223 +S315080060F05A729A720822A3F84420B2E00020FFF7E9 +S31508006100E1FEAEE040F24C63C2F20003FF22DA7011 +S3150800611000221A71597859719A71DA711A7206221F +S31508006120A3F844209DE040F24C63C2F2000300222B +S315080061301A705A70FF22DA700122A3F8442090E000 +S3150800614040F24C63C2F200039D6CFFF779FD411ED5 +S315080061502846621C01F01CF918B93120FFF7B2FE77 +S315080061607FE040F24C64C2F20004FF23E370A56CA2 +S31508006170FFF766FD013D2844A0640123A4F84430D6 +S315080061806FE04578FFF75CFD0238854203DD222083 +S31508006190FFF798FE65E040F24C63C2F20003FF2267 +S315080061A0DA700122A3F84420617839B901F0FCF8C5 +S315080061B0002856D13120FFF785FE52E040F24C63A5 +S315080061C0C2F20003986CA21C01F0E2F818B931205B +S315080061D0FFF778FE45E040F24C63C2F200036178AF +S315080061E09A6C0A449A643CE040F24C64C2F2000499 +S315080061F0FF23E370002525716571FFF721FDA07166 +S31508006200E571257265720723A4F8443029E040F247 +S315080062104C63C2F20003986C616801F0BDF818B9C6 +S315080062203120FFF74FFE1CE040F24C63C2F2000338 +S31508006230FF22DA700122A3F8442012E000F0EEFDF6 +S3150800624040F24C63C2F20003FF22DA700122A3F87F +S31508006250442006E03120FFF735FE02E02020FFF754 +S3150800626031FE40F24C63C2F2000393F84330012B2F +S3150800627002D11020FFF726FE40F24C63C2F200035B +S31508006280B3F844100BB2002B09DD40F24C60C2F2A1 +S315080062900000012380F843300330FFF7ABFC38BD1C +S315080062A008B5FFF7F1FC012820D000F0CDF8E8B1D9 +S315080062B040F29863C2F200031B78012B16D101F055 +S315080062C0ABF840F29C63C2F200031B6803F51C534B +S315080062D0103398420AD340F29863C2F200030022B0 +S315080062E01A7000F0BBF808B900F070FD08BD00BFD1 +S315080062F008B540F29863C2F2000301221A7001F051 +S315080063008BF840F29C63C2F200031860FFF7C8FFDF +S3150800631008BD00BF704700BF704700BF00F00F03FD +S31508006320092802D903F13700704703F1300040F21B +S315080063301C03C2F200031B6803445B7803F00303E3 +S31508006340022B08BF2038C0B2704700BF38B50546D3 +S315080063500C460009FFF7E2FF207005F00F00FFF773 +S31508006360DDFF60700023A370204638BD30B40246B6 +S3150800637003464CF6CD40CCF6CC400131A0FB034396 +S31508006380DB08FAD1002301F801394CF6CD45CCF6E5 +S31508006390CC450846A5FB0243DB0803EB8304A2EBC6 +S315080063A04402303201F801291A46002BF1D130BCDB +S315080063B0704700BFF0B440F21C03C2F200031F6826 +S315080063C000231C46C15C7A18527802F00302022A9E +S315080063D008BF2039C9B2A1F13002D2B2A1F13A05FB +S315080063E0EDB2162A94BF00260126062D8CBF354627 +S315080063F046F0010565B9092A84BFA1F13702D2B270 +S315080064002401E4B22244D4B20133022BDAD101E0EA +S31508006410002000E02046F0BC704700BF08B540F2F7 +S31508006420E063C2F200030020187040F2EC61C2F289 +S315080064300001FDF7BBFB30B147F6A030C0F60000FF +S315080064407C2100F069FB08BD40F2E063C2F200035C +S315080064501878D0F1010038BF0020704708B5FFF75B +S3150800646013FC01280FD040F2E063C2F200031B7848 +S315080064705BB9F9F7C5FE012809D140F2E063C2F21B +S315080064800003187008BD002008BD002008BD0020C4 +S3150800649008BD00BF027840F21C03C2F200031B6865 +S315080064A09918497801F00301022908BF203A532AAE +S315080064B00ED1407803445B7813F0040F0AD03128D4 +S315080064C00AD032280AD0332814BF03200220704786 +S315080064D0032070470320704700207047012070474B +S315080064E070B504460230FFF765FF064605460434D4 +S315080064F02046FFF75FFF3044C6B2013DADB2023415 +S31508006500012DF5D82046FFF755FFF643F6B2864229 +S3150800651014BF0020012070BD2DE9F04115460F4635 +S315080065200446002918BF002807D147F6A030C0F650 +S31508006530000040F2362100F0EFFA2046FFF7AAFFE6 +S315080065400646032808BF002000F0A2802046FFF771 +S31508006550C7FF002800F08C80012E29D016B1022E24 +S3150800656053D088E0A01CFFF725FF8046201DFFF7C3 +S3150800657021FF06023E60A01DFFF71CFF304438606D +S3150800658004F10806A8F103081FFA88F84046002D0A +S315080065907ED00FFA88F7002F6FDD00243046FFF70C +S315080065A009FF285502360134A4B2BC42F6DB66E080 +S315080065B0A01CFFF7FFFE8046201DFFF7FBFE060422 +S315080065C03E60A01DFFF7F6FE06EB00263E6004F1CE +S315080065D00800FFF7EFFE3044386004F10A06A8F118 +S315080065E004081FFA88F84046002D51D00FFA88F79C +S315080065F0002F46DD00243046FFF7DCFE285502361C +S315080066000134A4B2BC42F6DB3DE0A01CFFF7D2FE83 +S315080066108046201DFFF7CEFE06063E60A01DFFF74A +S31508006620C9FE06EB00463E6004F10800FFF7C2FE0D +S3150800663006EB00263E6004F10A00FFF7BBFE304475 +S31508006640386004F10C06A8F105081FFA88F84046D8 +S31508006650F5B10FFA88F7002F17DD00243046FFF74B +S31508006660A9FE285502360134A4B2BC42F6DB0EE078 +S315080066704FF6FF700CE000200AE0404608E040466E +S3150800668006E0404604E0404602E0404600E0404658 +S3150800669000B2BDE8F08100BF70B540F2E063C2F217 +S315080066A000031B78002B00F03382012B3FD1F9F74A +S315080066B0CFFD47F6B830C0F60000F9F713FE47F6E7 +S315080066C0DC30C0F60000F9F70DFEF9F7BBFD014610 +S315080066D0BD480122FDF780FA48B147F60440C0F6E6 +S315080066E00000F9F7FFFD0120F9F7ECFD70BD47F64C +S315080066F00C40C0F60000F9F7F5FD47F61440C0F661 +S315080067000000F9F7EFFD47F63840C0F60000F9F744 +S31508006710E9FD40F2E463C2F2000300221A605A60FF +S3150800672040F2E063C2F2000302221A7070BD022B27 +S3150800673040F0FD8040F2EC64C2F2000440F64430BA +S31508006740C2F200004FF4807104F50D72FDF76AFE7F +S3150800675094F93A32002B13DA47F60440C0F60000E3 +S31508006760F9F7C0FD0220F9F7ADFD04F50D70FDF748 +S31508006770FFFC40F2E063C2F2000300221A7070BD0B +S3150800678000B340F64431C2F20001084601F5C07173 +S315080067900022FFF7C1FE0546B0F1FF3F12D147F6CA +S315080067A00440C0F60000F9F79DFD0320F9F78AFDBD +S315080067B08548FDF7DDFC40F2E063C2F200030022E3 +S315080067C01A7070BD2BB2002B2CDD40F2E463C2F2C6 +S315080067D000035B686BB940F2E463C2F2000340F65B +S315080067E04432C2F20002D2F880211A602DB25D60EE +S315080067F018E040F64432C2F20002D2F8801140F2A4 +S31508006800E462C2F20002126891423EBF40F2E462BC +S31508006810C2F20002116040F2E462C2F2000203FA18 +S3150800682085F3536040F2EC63C2F20003D3F83C22CE +S31508006830D3F840329A4240F06B8163480021FDF755 +S31508006840A1FC90B147F60440C0F60000F9F74AFDEE +S315080068500420F9F737FD5C48FDF78AFC40F2E0634F +S31508006860C2F2000300221A7070BD47F60C40C0F64B +S315080068700000F9F737FD47F66840C0F60000F9F75B +S3150800688031FD40F2E465C2F2000540F2A064C2F2AE +S31508006890000468682146FFF769FD2046F9F722FDDE +S315080068A047F67440C0F60000F9F71CFD2E68300E56 +S315080068B02146FFF74BFDC6F30740A11CFFF746FD2F +S315080068C0C6F30720211DFFF741FDF0B2A11DFFF712 +S315080068D03DFD2046F9F706FD47F61850C0F60000BC +S315080068E0F9F700FD2868696800F056FD90B947F683 +S315080068F00440C0F60000F9F7F5FC0520F9F7E2FCBC +S315080069003148FDF735FC40F2E063C2F2000300228D +S315080069101A7070BD47F60C40C0F60000F9F7E2FCA5 +S3150800692040F2E063C2F2000303221A7070BD032B23 +S3150800693040F0EE8040F2EC64C2F2000440F64430C7 +S31508006940C2F200004FF4807104F50D72FDF76AFD7E +S3150800695094F93A32002B13DA47F69040C0F6000055 +S31508006960F9F7C0FC0220F9F7ADFC04F50D70FDF748 +S31508006970FFFB40F2E063C2F2000300221A7070BD0A +S3150800698020B340F64432C2F20002104602F5C07146 +S3150800699002F58072FFF7C0FD0546B0F1FF3F15D13D +S315080069A047F6B440C0F60000F9F79CFC0320F9F757 +S315080069B089FC0548FDF7DCFB40F2E063C2F2000300 +S315080069C000221A7070BD00BF200900202BB2002BD0 +S315080069D059DD47F6D840C0F60000F9F783FC2DB21A +S315080069E040F2A064C2F2000428462146FFF7BEFC26 +S315080069F02046F9F777FC47F6E840C0F60000F9F7B5 +S31508006A0071FC40F64436C2F2000696F88301214628 +S31508006A10FFF79CFC96F88201A11CFFF797FC96F8F5 +S31508006A208101211DFFF792FC96F88001A11DFFF751 +S31508006A308DFC2046F9F756FC47F61850C0F60000BC +S31508006A40F9F750FCD6F88001294606F5807200F061 +S31508006A509FFC90B947F60440C0F60000F9F742FCDF +S31508006A600620F9F72FFC2B48FDF782FB40F2E0637E +S31508006A70C2F2000300221A7070BD47F60C40C0F639 +S31508006A800000F9F72FFC40F2EC63C2F20003D3F8DA +S31508006A903C22D3F840329A423AD147F60050C0F623 +S31508006AA00000F9F71FFC00F07FFC90B947F6044098 +S31508006AB0C0F60000F9F716FC0720F9F703FC15489D +S31508006AC0FDF756FB40F2E063C2F2000300221A709B +S31508006AD070BD47F60C40C0F60000F9F703FC47F610 +S31508006AE01C50C0F60000F9F7FDFB0A48FDF740FB0D +S31508006AF047F63450C0F60000F9F7F4FB40F2E063BD +S31508006B00C2F2000300221A70F9F7BAFB00F05EF928 +S31508006B1070BD00BF2009002008B540F6C843C2F280 +S31508006B200003186040F6CC43C2F200031960FFF771 +S31508006B30F3FBFCE72DE9F047002347F68450C0F63F +S31508006B4000004FF4FA744AF2104113F80080C21894 +S31508006B5092F801C008EB0C0202FB044291FBF2F921 +S31508006B6002FB191636B94D4609F1FF3292B2B2F553 +S31508006B70806F03D30233242BE7D187E04746E246EA +S31508006B804FF4D043C4F2000300225A611A6842F453 +S31508006B9000421A601B6813F4004F09D04FF4D04422 +S31508006BA0C4F20004FFF7B8FB236813F4004FF9D1C9 +S31508006BB04FF4D043C4F200031A6822F002021A60A6 +S31508006BC01A6842F001021A605B6813F0010F09D1D6 +S31508006BD04FF4D044C4F20004FFF79EFB636813F039 +S31508006BE0010FF9D0013F0AF1FF36360546EA074795 +S31508006BF0013D3D434FF4D043C4F20003DD611A68FA +S31508006C0022F001021A605B6813F0010F09D04FF4F5 +S31508006C10D044C4F20004FFF77FFB636813F0010F4A +S31508006C20F9D14FF4C843C4F20003D3F8002242F066 +S31508006C300102C3F80022D3F81C2222F48042C3F8CA +S31508006C401C22D3F80C2242F48042C3F80C220022FC +S31508006C50C3F8B022C3F8B422D3F8042222F480423F +S31508006C60C3F80422D3F8142222F48042C3F814226B +S31508006C70D3F81C2242F48042C3F81C22D3F800221F +S31508006C8022F00102C3F80022BDE8F08747F66050FB +S31508006C90C0F60000F021FFF73FFF71E738B504465C +S31508006CA00D464FF4D043C4F200039B6813F0806F7F +S31508006CB007D147F66050C0F600004FF4A271FFF7FF +S31508006CC02BFF4FF4D043C4F20003D3F8802102F01F +S31508006CD00102C3F88021D3F8802142F07C4242F4B5 +S31508006CE00012C3F88021C3F88451E178A27812040F +S31508006CF042EA016221780A43617842EA0122C3F82E +S31508006D008821E179A279120442EA016221790A43CB +S31508006D10617942EA0122C3F88C21D3F8802142F036 +S31508006D200102C3F880219B6813F0806F09D14FF4E4 +S31508006D30D044C4F20004FFF7EFFAA36813F0806F9B +S31508006D40F9D038BD4FF4D043C4F20003DB6813F022 +S31508006D50030F39D04FF4D043C4F20003D3F8B0215F +S31508006D6040F26763B3EB525F18BF002023D14FF49C +S31508006D70D043C4F20003D3F8B8210270D3F8B8217F +S31508006D80120A4270D3F8B821120C8270D3F8B821CF +S31508006D90120EC270D3F8BC210271D3F8BC21120AB4 +S31508006DA04271D3F8BC21120C8271D3F8BC311B0E88 +S31508006DB0C3710120FFE74FF4D043C4F20003DA6839 +S31508006DC042F02002DA6070470020704708B500F0EC +S31508006DD0E7FA90B1FEF70CFF00F004FB00F0F6F9B5 +S31508006DE020F0604020F07F004EF60853CEF20003F4 +S31508006DF0186000F0EBF94368984708BD70B5561E51 +S31508006E00B6B24AB14C1E0E44451A14F8013F2B552A +S31508006E10FFF782FAB442F8D170BD00BF08B500F09A +S31508006E200FFB08BDF8B507460024254647F6D85691 +S31508006E30C0F60006FFF770FAA359BB420ED83119FF +S31508006E4049680B449F4209D247F6D853C0F6000357 +S31508006E5005EB450203EB8203187AF8BD01350C34BD +S31508006E606C2CE7D1FF20F8BD2DE9F8438046006871 +S31508006E70FFF7D8FFFF2830D0FBF720F8F320FBF701 +S31508006E803DF8FBF741F801281CBF002408F1040966 +S31508006E9004D1FBF729F80020BDE8F883D8F800608C +S31508006EA0A71959F80450FFF737FA38462946FBF769 +S31508006EB0A9F8082807D1A359AB4206D10434B4F57A +S31508006EC0007FEBD103E0002402E0002400E0012467 +S31508006ED0FBF70AF82046BDE8F8830020BDE8F883EA +S31508006EE038B504460D4640F6D043C2F20003984230 +S31508006EF009D04FF44043C0F6000399420BD0FFF780 +S31508006F00B3FF20B917E040F6D464C2F20004C5F313 +S31508006F10080393B903E040F6D044C2F2000423689C +S31508006F209D420CD0204640F8045B29464FF4007277 +S31508006F30FFF764FF03E0002038BD002038BD204677 +S31508006F4038BD00BF2DE9F04106460C4617461D46DA +S31508006F504FEA51284FEA48280368B3F1FF3F06D1A4 +S31508006F6040F8048B41464FF40072FFF747FF336839 +S31508006F70434505D030464146FFF7B2FF0646D0B135 +S31508006F803368E41A3444043408F50078FFF7C4F982 +S31508006F90331DE31AB3F5007F06D330464146FFF7A3 +S31508006FA09FFF064650B1041D17F8013B04F8013B44 +S31508006FB0013DEBD105E00020BDE8F0810020BDE8E9 +S31508006FC0F0810120BDE8F08140F6D463C2F20003E7 +S31508006FD04FF0FF321A6040F6D043C2F200031A603F +S31508006FE0704700BF70B504460D461646FFF71AFFF0 +S31508006FF0FF281BD0681E2044FFF714FFFF2817D070 +S31508007000620A4FF44043C0F60003B3EB422F07BFB2 +S3150800701040F6D040C2F2000040F6D460C2F200004A +S31508007020214632462B46FFF78DFF70BD002070BD06 +S31508007030002070BDF8B505460E46FFF7F3FE044678 +S31508007040701E2844FFF7EEFE0546FF2C18BFFF28E2 +S3150800705033D084422BD8022C2BD90B282BD8FAF7FD +S315080070602DFFF320FAF74AFFFAF74EFF01281EBF55 +S3150800707047F6A856C0F60006022703D1FAF734FFEA +S315080070800020F8BDFFF748F936F814003946FAF734 +S3150800709081FF082803D0FAF727FF0020F8BD01343E +S315080070A0E4B2A542EED2FAF71FFF0120F8BD002090 +S315080070B0F8BD0020F8BD0020F8BD0020F8BD00BFCF +S315080070C000B583B040F6D043C2F200031B68B3F1A3 +S315080070D0FF3F08BF01201CD040F6D043C2F2000390 +S315080070E099685A681144DA6811441A6911445A6948 +S315080070F011449A690A44D96953185B4202AA42F8AC +S31508007100043D4CF28810C0F600000421FFF76AFF20 +S31508007110FFE703B05DF804FB4CF20402C0F6000278 +S315080071204FF44043C0F6000310681B6818444CF23D +S315080071300803C0F600031B6818444CF20C03C0F69B +S3150800714000031B6818444CF21003C0F600031B68C2 +S3150800715018444CF21403C0F600031B6818444CF29A +S315080071601803C0F600031B6818444CF28813C0F6CF +S3150800717000031B681844D0F1010038BF002070478F +S3150800718008B540F6D043C2F200031B68B3F1FF3FCF +S3150800719006D040F6D040C2F20000FFF765FE88B17F +S315080071A040F6D463C2F200031B68B3F1FF3F0BD06D +S315080071B040F6D460C2F20000FFF756FE003018BF52 +S315080071C0012008BD002008BD012008BD4FF440403D +S315080071D0C0F60000704700BF38B504464FF4A0500B +S315080071E0C4F201008021FBF783F990B14FF4A05057 +S315080071F0C4F201002146FBF773F94FF4A054C4F218 +S315080072000104802520462946FBF772F90028F9D0A3 +S3150800721001E0002038BD012038BD00BF10B5044686 +S315080072204FF4A050C4F201002021FBF761F90128B0 +S3150800723008D14FF4A050C4F20100FBF755F92070AD +S31508007240012010BD002010BD10B584B04FF4614375 +S3150800725000930023ADF80430ADF80630ADF80830D9 +S31508007260ADF80C300C23ADF80A304FF4A054C4F234 +S31508007270010420466946FBF7B5F820460121FBF7CD +S3150800728021F904B010BD00BF2DE9F04106460C46B1 +S31508007290402906D947F64460C0F600007721FFF773 +S315080072A03BFC2046FFF798FF012806D047F64460C6 +S315080072B0C0F600007B21FFF72FFC2546ACB1002461 +S315080072C047F64467C0F600074FF08408FFF724F82E +S315080072D0305DFFF781FF012803D038464146FFF7A6 +S315080072E01BFC0134A3B2AB42F0D3BDE8F08100BF6A +S315080072F010B5044641F21D13C2F200031B78A3B968 +S3150800730041F2D800C2F20000FFF788FF012832D107 +S3150800731041F21D13C2F2000301221A7041F21C1336 +S31508007320C2F200030020187010BD41F21C13C2F20D +S3150800733000031878134B1844FFF770FF01281CD177 +S3150800734041F21C13C2F200031A780132D2B21A7043 +S3150800735041F2D803C2F200031B7893420FD12046AC +S315080073600849FFF74BFD41F21D13C2F20003002244 +S315080073701A70012010BD002010BD002010BD00208D +S3150800738010BD00BFD910002008B5FFF71DFE08BDC7 +S3150800739008B5FFF727FE08BD08B5FFF74BFE08BD81 +S315080073A008B5FFF7B9FE08BD08B5FFF789FE10B1A5 +S315080073B0FFF7E6FE08BD002008BD00BF4EF2100329 +S315080073C0CEF2000300221A6049F23F01C0F2020120 +S315080073D059609A600521196041F22013C2F2000330 +S315080073E01A6070474EF21003CEF2000300221A60AC +S315080073F0704700BF4EF21003CEF200031B6813F469 +S31508007400803F1FBF41F22013C2F200031A680132FF +S3150800741018BF1A60704700BF08B5FFF7EBFF41F2C7 +S315080074202013C2F20003186808BD00BF08B547F666 +S315080074306860C0F600003621FFF76EFB08BD00BF86 +S3150800744010B572B640F20002C2F2000240F2200302 +S31508007450C2F200039A4210D2131D0E4CE41A24F00D +S31508007460030404340023104647F69871C0F6000159 +S315080074705A581A500433A342FAD1074807494FF01D +S3150800748000028842B8BF40F8042BFADBF8F75AFF27 +S3150800749010BD00BF230000208000002064250020C6 +S315080074A00F2AF0B445D940EA01039B0745D1A2F15A +S315080074B010070C4603463F0900EB071610362568E9 +S315080074C01033103443F8105C54F80C5C43F80C5C29 +S315080074D054F8085C43F8085C54F8045C43F8045C08 +S315080074E0B342ECD17B1C02F00F0CBCF1030F4FEA40 +S315080074F003131944034422D90E461D46644656F81A +S31508007500047B043C032C45F8047BF8D8ACF104044E +S3150800751002F0030224F0030404342344214432B164 +S315080075200A4411F8014B914203F8014BF9D1F0BC1A +S3150800753070470346002AF3D1F9E70346F0E76246A7 +S31508007540002AEDD1F3E700BF8307F0B448D0541EF4 +S31508007550002A43D0CDB2034602E0002C3ED01446A2 +S3150800756003F8015B13F0030F04F1FF32F5D1032C86 +S315080075702DD9CDB20F2C45EA052545EA054518D97A +S31508007580A4F1100703F110061A463F0906EB071681 +S315080075901560103242F80C5C42F8085C42F8045C4C +S315080075A0B242F5D104F00F040137032C03EB07139D +S315080075B00DD91E462246043A46F8045B032AFAD831 +S315080075C0221F04F0030422F00302043213442CB1F0 +S315080075D0C9B21C4403F8011BA342FBD1F0BC704797 +S315080075E014460346C3E700BF2F64656D6F70726F5C +S315080075F0675F6F6C696D65785F73746D3332653478 +S3150800760030372E73726563002F626F6F746C6F6705 +S315080076102E747874000000002E2F6C69622F75692D +S31508007620702F6E65746465762E630000222A3A3CD4 +S315080076303E3F7C7F000000002B2C3B3D5B5D00003D +S31508007640809A90418E418F804545454949498E8F9C +S315080076509092924F994F555559999A9B9C9D9E9FEA +S3150800766041494F55A5A5A6A7A8A9AAABAC21AEAF77 +S31508007670B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF84 +S31508007680C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF74 +S31508007690D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF64 +S315080076A0E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF54 +S315080076B0F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF44 +S315080076C001030507090E10121416181C1E000000E7 +S315080076D06100620063006400650066006700680078 +S315080076E069006A006B006C006D006E006F00700028 +S315080076F071007200730074007500760077007800D8 +S3150800770079007A00A100A200A300A500AC00AF0092 +S31508007710E000E100E200E300E400E500E600E7003F +S31508007720E800E900EA00EB00EC00ED00EE00EF00EF +S31508007730F000F100F200F300F400F500F600F8009E +S31508007740F900FA00FB00FC00FD00FE00FF00010145 +S3150800775003010501070109010B010D010F011101C3 +S3150800776013011501170119011B011D011F01210133 +S3150800777023012501270129012B012D012F013101A3 +S315080077803301350137013A013C013E01400142010E +S315080077904401460148014B014D014F015101530176 +S315080077A05501570159015B015D015F0161016301E3 +S315080077B06501670169016B016D016F017101730153 +S315080077C0750177017A017C017E019201B103B2034A +S315080077D0B303B403B503B603B703B803B903BA03CF +S315080077E0BB03BC03BD03BE03BF03C003C103C3037E +S315080077F0C403C503C603C703C803C903CA033004C1 +S3150800780031043204330434043504360437043804A6 +S3150800781039043A043B043C043D043E043F04400456 +S315080078204104420443044404450446044704480406 +S3150800783049044A044B044C044D044E044F045104B5 +S31508007840520453045404550456045704580459045E +S315080078505A045B045C045E045F0470217121722182 +S3150800786073217421752176217721782179217A214E +S315080078707B217C217D217E217F2141FF42FF43FF21 +S3150800788044FF45FF46FF47FF48FF49FF4AFF4BFFB6 +S315080078904CFF4DFF4EFF4FFF50FF51FF52FF53FF66 +S315080078A054FF55FF56FF57FF58FF59FF5AFF000070 +S315080078B0C700FC00E900E200E400E000E500E7009C +S315080078C0EA00EB00E800EF00EE00EC00C400C5009B +S315080078D0C900E600C600F400F600F200FB00F90055 +S315080078E0FF00D600DC00A200A300A500A720920195 +S315080078F0E100ED00F300FA00F100D100AA00BA0099 +S31508007900BF001023AC00BD00BC00A100AB00BB004B +S31508007910912592259325022524256125622556253C +S3150800792055256325512557255D255C255B2510259D +S31508007930142534252C251C2500253C255E255F2588 +S315080079405A25542569256625602550256C25672501 +S3150800795068256425652559255825522553256B25FF +S315080079606A2518250C25882584258C2590258025AB +S31508007970B103DF009303C003A303C303B500C40325 +S31508007980A6039803A903B4031E22C603B503292236 +S315080079906122B1006522642220232123F7004822B0 +S315080079A0B0001922B7001A227F20B200A025A00035 +S315080079B04100420043004400450046004700480095 +S315080079C049004A004B004C004D004E004F00500045 +S315080079D051005200530054005500560057005800F5 +S315080079E059005A002100E0FFE1FFE5FFE2FFE3FF4F +S315080079F0C000C100C200C300C400C500C600C7005D +S31508007A00C800C900CA00CB00CC00CD00CE00CF000C +S31508007A10D000D100D200D300D400D500D600D800BB +S31508007A20D900DA00DB00DC00DD00DE0078010001A9 +S31508007A3002010401060108010A010C010E011001E8 +S31508007A4012011401160118011A011C011E01200158 +S31508007A5022012401260128012A012C012E013001C8 +S31508007A6032013401360139013B013D013F01410133 +S31508007A704301450147014A014C014E01500152019B +S31508007A805401560158015A015C015E016001620108 +S31508007A906401660168016A016C016E017001720178 +S31508007AA07401760179017B017D01910191039203AD +S31508007AB093039403950396039703980399039A03EC +S31508007AC09B039C039D039E039F03A003A103A3039B +S31508007AD0A403A503A603A703A803A903AA031004DE +S31508007AE011041204130414041504160417041804C4 +S31508007AF019041A041B041C041D041E041F04200474 +S31508007B002104220423042404250426042704280423 +S31508007B1029042A042B042C042D042E042F04010402 +S31508007B2002040304040405040604070408040904FB +S31508007B300A040B040C040E040F046021612162215F +S31508007B4063216421652166216721682169216A21EB +S31508007B506B216C216D216E216F2121FF22FF23FFEE +S31508007B6024FF25FF26FF27FF28FF29FF2AFF2BFFD3 +S31508007B702CFF2DFF2EFF2FFF30FF31FF32FF33FF83 +S31508007B8034FF35FF36FF37FF38FF39FF3AFF00006D +S31508007B90FFFFFFFFFFFF00004F70656E424C540069 +S31508007BA02E2E2F2E2E2F2E2E2F536F757263652F86 +S31508007BB066696C652E6300004669726D7761726549 +S31508007BC020757064617465207265717565737420BB +S31508007BD064657465637465640A0D00004F70656EAC +S31508007BE0696E67206669726D776172652066696C71 +S31508007BF06520666F722072656164696E672E2E2E27 +S31508007C00000000004552524F520A0D004F4B0A0D14 +S31508007C10000000005374617274696E6720746865A9 +S31508007C202070726F6772616D6D696E67207365711A +S31508007C3075656E63650A0D0050617273696E67201B +S31508007C406669726D776172652066696C6520746F06 +S31508007C50206F627461696E2065726173652073694D +S31508007C607A652E2E2E00000045726173696E6720B4 +S31508007C70000000002062797465732066726F6D20BB +S31508007C806D656D6F72792061742030780000000090 +S31508007C9052656164696E67206C696E652066726FED +S31508007CA06D2066696C652E2E2E4552524F520A0D6E +S31508007CB000000000496E76616C696420636865633C +S31508007CC06B73756D20666F756E642E2E2E45525237 +S31508007CD04F520A0D0000000050726F6772616D6D99 +S31508007CE0696E67200000000020627974657320744D +S31508007CF06F206D656D6F7279206174203078000091 +S31508007D0057726974696E672070726F6772616D2049 +S31508007D10636865636B73756D2E2E2E00436C6F73E7 +S31508007D20696E67206669726D776172652066696C2F +S31508007D30650A0D004669726D776172652075706413 +S31508007D40617465207375636365737366756C6C79A6 +S31508007D5020636F6D706C657465640A0D0000000021 +S31508007D602E2E2F2E2E2F2E2E2F536F757263652FC4 +S31508007D7041524D434D345F53544D33322F63616E38 +S31508007D802E6300000502060206030703080309031B +S31508007D9009040A040B040C040C050D050E050F0551 +S31508007DA00F0610061007100800000800100018003B +S31508007DB020002800300038004000480050005800D5 +S31508007DC08000880090009800A000A800B000B800C5 +S31508007DD0C000C800D000D80000C00008004000005D +S31508007DE00300000000000108000001000400000074 +S31508007DF00000020800000200050000000000040858 +S31508007E00000002000600000000000608000002004C +S31508007E100700000000000808000002000800000033 +S31508007E2000000A08000002000900000000000C0813 +S31508007E30000002000A00000000000E080000020010 +S31508007E400B0000002E2E2F2E2E2F2E2E2F536F7541 +S31508007E507263652F41524D434D345F53544D33324F +S31508007E602F756172742E63002E2E2F2E2E2F2E2E16 +S31508007E702F536F757263652F41524D434D345F53CF +S31508007E80544D33322F4743432F766563746F7273AD +S31508007E902E630000002020202020202020202828D3 +S31508007EA028282820202020202020202020202020AC +S31508007EB020202020208810101010101010101010EC +S31508007EC0101010101004040404040404040404101C +S31508007ED010101010101041414141414101010101AA +S31508007EE00101010101010101010101010101010174 +S31508007EF01010101010104242424242420202020280 +S31508007F000202020202020202020202020202020243 +S31508007F1010101010200000000000000000000000F3 +S31508007F200000000000000000000000000000000043 +S31508007F300000000000000000000000000000000033 +S31508007F400000000000000000000000000000000023 +S31508007F500000000000000000000000000000000013 +S31508007F600000000000000000000000000000000003 +S31508007F7000000000000000000000000000000000F3 +S31508007F8000000000000000000000000000000000E3 +S30D08007F900000000000000000DB +S31508007F9801000000010000000000000001020304BF +S31508007FA8010203040607080904000000947E000875 S70508000000F2 diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/blt_conf.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/blt_conf.h index 7c66ef5f..1bc54a2b 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/blt_conf.h +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/blt_conf.h @@ -108,6 +108,82 @@ #define BOOT_COM_UART_CHANNEL_INDEX (5) +/* The NET communication interface for firmware updates via TCP/IP is selected by setting + * the BOOT_COM_NET_ENABLE configurable to 1. The maximum amount of data bytes in a + * message for data transmission and reception is set through BOOT_COM_NET_TX_MAX_DATA + * and BOOT_COM_NET_RX_MAX_DATA, respectively. The default IP address is configured + * with the macros BOOT_COM_NET_IPADDRx. The default netmask is configued with the macros + * BOOT_COM_NET_NETMASKx. The default gateway is configured with the macros + * BOOT_COM_NET_GATEWAYx. The bootloader acts and a TCP/IP server. The port the server + * listen on for connections is configured with BOOT_COM_NET_PORT. + */ +/** \brief Enable/disable the NET transport layer. */ +#define BOOT_COM_NET_ENABLE (1) +/** \brief Configure number of bytes in the target->host data packet. */ +#define BOOT_COM_NET_TX_MAX_DATA (64) +/** \brief Configure number of bytes in the host->target data packet. */ +#define BOOT_COM_NET_RX_MAX_DATA (64) +/** \brief Configure the port that the TCP/IP server listens on */ +#define BOOT_COM_NET_PORT (1000) +/** \brief Configure the 1st byte of the IP address */ +#define BOOT_COM_NET_IPADDR0 (169) +/** \brief Configure the 2nd byte of the IP address */ +#define BOOT_COM_NET_IPADDR1 (254) +/** \brief Configure the 3rd byte of the IP address */ +#define BOOT_COM_NET_IPADDR2 (19) +/** \brief Configure the 4th byte of the IP address */ +#define BOOT_COM_NET_IPADDR3 (63) +/** \brief Configure the 1st byte of the network mask */ +#define BOOT_COM_NET_NETMASK0 (255) +/** \brief Configure the 2nd byte of the network mask */ +#define BOOT_COM_NET_NETMASK1 (255) +/** \brief Configure the 3rd byte of the network mask */ +#define BOOT_COM_NET_NETMASK2 (0) +/** \brief Configure the 4th byte of the network mask */ +#define BOOT_COM_NET_NETMASK3 (0) +/** \brief Configure the 1st byte of the gateway address */ +#define BOOT_COM_NET_GATEWAY0 (169) +/** \brief Configure the 2nd byte of the gateway address */ +#define BOOT_COM_NET_GATEWAY1 (254) +/** \brief Configure the 3rd byte of the gateway address */ +#define BOOT_COM_NET_GATEWAY2 (19) +/** \brief Configure the 4th byte of the gateway address */ +#define BOOT_COM_NET_GATEWAY3 (1) +/** \brief Enable/disable a hook function that is called when the IP address is about + * to be set. This allows a dynamic override of the BOOT_COM_NET_IPADDRx values. + */ +#define BOOT_COM_NET_IPADDR_HOOK_ENABLE (0) +/** \brief Enable/disable a hook function that is called when the netmask is about + * to be set. This allows a dynamic override of the BOOT_COM_NET_NETMASKx values. + */ +#define BOOT_COM_NET_NETMASK_HOOK_ENABLE (0) +/** \brief Enable/disable a hook function that is called when the gateway address is + * about to be set. This allows a dynamic override of the BOOT_COM_NET_GATEWAYx + * values. + */ +#define BOOT_COM_NET_GATEWAY_HOOK_ENABLE (0) + + +/**************************************************************************************** +* B A C K D O O R C O N F I G U R A T I O N +****************************************************************************************/ +#if (BOOT_COM_NET_ENABLE > 0) +/* Override the default time that the backdoor is open if firmware updates via TCP/IP + * are supported. in this case a reactivation of the bootloader results in a re- + * initialization of the ethernet MAC. when directly connected to the ethernet port of + * a PC this will go relatively fast (depending on what MS Windows is being used), but + * when connected to the network via a router this can take several seconds. feel free to + * shorten/lengthen this time for finetuning. the only downside of a long backdoor open + * time is that the starting of the user program will also be delayed for this time. + * + * Also note that when the target is directly connected to the ethernet port of a PC, + * the checkbox "Automatically retry socket connection" should be checked in the + * Microboot settings. if connecting via a router the uncheck this checkbox. + */ +#define BACKDOOR_ENTRY_TIMEOUT_MS (10000) +#endif + + /**************************************************************************************** * F I L E S Y S T E M I N T E R F A C E C O N F I G U R A T I O N ****************************************************************************************/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/ethernetlib/inc/stm32_eth.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/ethernetlib/inc/stm32_eth.h new file mode 100644 index 00000000..578d8baa --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/ethernetlib/inc/stm32_eth.h @@ -0,0 +1,1610 @@ +/** + ****************************************************************************** + * @file stm32_eth.h + * @author MCD Application Team + * @version V1.0.0 + * @date 06/19/2009 + * @brief This file contains all the functions prototypes for the Ethernet + * firmware library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32_ETH_H +#define __STM32_ETH_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" /* STM32 registers */ + +/** @addtogroup STM32_ETH_Driver + * @{ + */ + +/** @defgroup ETH_Exported_Types + * @{ + */ + +/** + * @brief ETH MAC Init structure definition + */ +typedef struct { +/** + * @brief / * MAC + */ + uint32_t ETH_AutoNegotiation; /*!< Selects or not the AutoNegotiation with the external PHY */ + uint32_t ETH_Watchdog; /*!< Enable/disable Watchdog timer */ + uint32_t ETH_Jabber; /*!< Enable/disable Jabber timer */ + uint32_t ETH_InterFrameGap; /*!< Selects minimum IFG between frames during transmission */ + uint32_t ETH_CarrierSense; /*!< Enable/disable Carrier Sense */ + uint32_t ETH_Speed; /*!< Indicates the Ethernet speed: 10/100 Mbps */ + uint32_t ETH_ReceiveOwn; /*!< Enable/disable the reception of frames when the TX_EN signal is asserted in Half-Duplex mode */ + uint32_t ETH_LoopbackMode; /*!< Enable/disable internal MAC MII Loopback mode */ + uint32_t ETH_Mode; /*!< Selects the MAC duplex mode: Half-Duplex or Full-Duplex mode */ + uint32_t ETH_ChecksumOffload; /*!< Enable/disable the calculation of complement sum of all received Ethernet frame payloads */ + uint32_t ETH_RetryTransmission; /*!< Enable/disable the MAC attempt retries transmission, based on the settings of BL, when a colision occurs (Half-Duplex mode) */ + uint32_t ETH_AutomaticPadCRCStrip; /*!< Enable/disable Automatic MAC Pad/CRC Stripping */ + uint32_t ETH_BackOffLimit; /*!< Selects the BackOff limit value */ + uint32_t ETH_DeferralCheck; /*!< Enable/disable deferral check function (Half-Duplex mode) */ + uint32_t ETH_ReceiveAll; /*!< Enable/disable all frames reception by the MAC (No fitering)*/ + uint32_t ETH_SourceAddrFilter; /*!< Selects EnableNormal/EnableInverse/disable Source Address Filter comparison */ + uint32_t ETH_PassControlFrames; /*!< Selects None/All/FilterPass of all control frames (including unicast and multicast PAUSE frames) */ + uint32_t ETH_BroadcastFramesReception; /*!< Enable/disable reception of Broadcast Frames */ + uint32_t ETH_DestinationAddrFilter; /*!< Selects EnableNormal/EnableInverse destination filter for both unicast and multicast frames */ + uint32_t ETH_PromiscuousMode; /*!< Enable/disable Promiscuous Mode */ + uint32_t ETH_MulticastFramesFilter; /*!< Selects the Multicast Frames filter: None/HashTableFilter/PerfectFilter/PerfectHashTableFilter */ + uint32_t ETH_UnicastFramesFilter; /*!< Selects the Unicast Frames filter: HashTableFilter/PerfectFilter/PerfectHashTableFilter */ + uint32_t ETH_HashTableHigh; /*!< This field contains the higher 32 bits of Hash table. */ + uint32_t ETH_HashTableLow; /*!< This field contains the lower 32 bits of Hash table. */ + uint32_t ETH_PauseTime; /*!< This field holds the value to be used in the Pause Time field in the transmit control frame */ + uint32_t ETH_ZeroQuantaPause; /*!< Enable/disable the automatic generation of Zero-Quanta Pause Control frames */ + uint32_t ETH_PauseLowThreshold; /*!< This field configures the threshold of the PAUSE to be checked for automatic retransmission of PAUSE Frame */ + uint32_t ETH_UnicastPauseFrameDetect; /*!< Enable/disable MAC to detect the Pause frames (with MAC Address0 unicast address and unique multicast address) */ + uint32_t ETH_ReceiveFlowControl; /*!< Enable/disable the MAC to decode the received Pause frame and disable its transmitter for a specified (Pause Time) time */ + uint32_t ETH_TransmitFlowControl; /*!< Enable/disable the MAC to transmit Pause frames (Full-Duplex mode) or the MAC back-pressure operation (Half-Duplex mode) */ + uint32_t ETH_VLANTagComparison; /*!< Selects the 12-bit VLAN identifier or the complete 16-bit VLAN tag for comparison and filtering */ + uint32_t ETH_VLANTagIdentifier; /*!< VLAN tag identifier for receive frames */ + +/** + * @brief / * DMA + */ + uint32_t ETH_DropTCPIPChecksumErrorFrame; /*!< Enable/disable Dropping of TCP/IP Checksum Error Frames */ + uint32_t ETH_ReceiveStoreForward; /*!< Enable/disable Receive store and forward */ + uint32_t ETH_FlushReceivedFrame; /*!< Enable/disable flushing of received frames */ + uint32_t ETH_TransmitStoreForward; /*!< Enable/disable Transmit store and forward */ + uint32_t ETH_TransmitThresholdControl; /*!< Selects the Transmit Threshold Control */ + uint32_t ETH_ForwardErrorFrames; /*!< Enable/disable forward to DMA of all frames except runt error frames */ + uint32_t ETH_ForwardUndersizedGoodFrames; /*!< Enable/disable Rx FIFO to forward Undersized frames (frames with no Error and length less than 64 bytes) including pad-bytes and CRC) */ + uint32_t ETH_ReceiveThresholdControl; /*!< Selects the threshold level of the Receive FIFO */ + uint32_t ETH_SecondFrameOperate; /*!< Enable/disable the DMA process of a second frame of Transmit data even before status for first frame is obtained */ + uint32_t ETH_AddressAlignedBeats; /*!< Enable/disable Address Aligned Beats */ + uint32_t ETH_FixedBurst; /*!< Enable/disable the AHB Master interface fixed burst transfers */ + uint32_t ETH_RxDMABurstLength; /*!< Indicate the maximum number of beats to be transferred in one Rx DMA transaction */ + uint32_t ETH_TxDMABurstLength; /*!< Indicate the maximum number of beats to be transferred in one Tx DMA transaction */ + uint32_t ETH_DescriptorSkipLength; /*!< Specifies the number of word to skip between two unchained descriptors (Ring mode) */ + uint32_t ETH_DMAArbitration; /*!< Selects DMA Tx/Rx arbitration */ +}ETH_InitTypeDef; + +/**--------------------------------------------------------------------------**/ +/** + * @brief DMA descriptors types + */ +/**--------------------------------------------------------------------------**/ + +/** + * @brief ETH DMA Desciptors data structure definition + */ +typedef struct { + uint32_t Status; /*!< Status */ + uint32_t ControlBufferSize; /*!< Control and Buffer1, Buffer2 lengths */ + uint32_t Buffer1Addr; /*!< Buffer1 address pointer */ + uint32_t Buffer2NextDescAddr; /*!< Buffer2 or next descriptor address pointer */ +} ETH_DMADESCTypeDef; + +/** + * @} + */ + +/** @defgroup ETH_Exported_Constants + * @{ + */ +/**--------------------------------------------------------------------------**/ +/** + * @brief ETH Frames defines + */ +/**--------------------------------------------------------------------------**/ + +/** @defgroup ENET_Buffers_setting + * @{ + */ +#define ETH_MAX_PACKET_SIZE 1520 /*!< ETH_HEADER + ETH_EXTRA + MAX_ETH_PAYLOAD + ETH_CRC */ +#define ETH_HEADER 14 /*!< 6 byte Dest addr, 6 byte Src addr, 2 byte length/type */ +#define ETH_CRC 4 /*!< Ethernet CRC */ +#define ETH_EXTRA 2 /*!< Extra bytes in some cases */ +#define VLAN_TAG 4 /*!< optional 802.1q VLAN Tag */ +#define MIN_ETH_PAYLOAD 46 /*!< Minimum Ethernet payload size */ +#define MAX_ETH_PAYLOAD 1500 /*!< Maximum Ethernet payload size */ +#define JUMBO_FRAME_PAYLOAD 9000 /*!< Jumbo frame payload size */ + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet DMA descriptors registers bits definition + */ +/**--------------------------------------------------------------------------**/ + +/* DMA Tx Desciptor -----------------------------------------------------------*/ +/**---------------------------------------------------------------------------------------------- + TDES0 | OWN(31) | CTRL[30:26] | Reserved[25:24] | CTRL[23:20] | Reserved[19:17] | Status[16:0] | + ----------------------------------------------------------------------------------------------- + TDES1 | Reserved[31:29] | Buffer2 ByteCount[28:16] | Reserved[15:13] | Buffer1 ByteCount[12:0] | + ----------------------------------------------------------------------------------------------- + TDES2 | Buffer1 Address [31:0] | + ----------------------------------------------------------------------------------------------- + TDES3 | Buffer2 Address [31:0] / Next Desciptor Address [31:0] | + ---------------------------------------------------------------------------------------------**/ + +/** + * @brief Bit definition of TDES0 register: DMA Tx descriptor status register + */ +#define ETH_DMATxDesc_OWN ((uint32_t)0x80000000) /*!< OWN bit: descriptor is owned by DMA engine */ +#define ETH_DMATxDesc_IC ((uint32_t)0x40000000) /*!< Interrupt on Completion */ +#define ETH_DMATxDesc_LS ((uint32_t)0x20000000) /*!< Last Segment */ +#define ETH_DMATxDesc_FS ((uint32_t)0x10000000) /*!< First Segment */ +#define ETH_DMATxDesc_DC ((uint32_t)0x08000000) /*!< Disable CRC */ +#define ETH_DMATxDesc_DP ((uint32_t)0x04000000) /*!< Disable Padding */ +#define ETH_DMATxDesc_TTSE ((uint32_t)0x02000000) /*!< Transmit Time Stamp Enable */ +#define ETH_DMATxDesc_CIC ((uint32_t)0x00C00000) /*!< Checksum Insertion Control: 4 cases */ +#define ETH_DMATxDesc_CIC_ByPass ((uint32_t)0x00000000) /*!< Do Nothing: Checksum Engine is bypassed */ +#define ETH_DMATxDesc_CIC_IPV4Header ((uint32_t)0x00400000) /*!< IPV4 header Checksum Insertion */ +#define ETH_DMATxDesc_CIC_TCPUDPICMP_Segment ((uint32_t)0x00800000) /*!< TCP/UDP/ICMP Checksum Insertion calculated over segment only */ +#define ETH_DMATxDesc_CIC_TCPUDPICMP_Full ((uint32_t)0x00C00000) /*!< TCP/UDP/ICMP Checksum Insertion fully calculated */ +#define ETH_DMATxDesc_TER ((uint32_t)0x00200000) /*!< Transmit End of Ring */ +#define ETH_DMATxDesc_TCH ((uint32_t)0x00100000) /*!< Second Address Chained */ +#define ETH_DMATxDesc_TTSS ((uint32_t)0x00020000) /*!< Tx Time Stamp Status */ +#define ETH_DMATxDesc_IHE ((uint32_t)0x00010000) /*!< IP Header Error */ +#define ETH_DMATxDesc_ES ((uint32_t)0x00008000) /*!< Error summary: OR of the following bits: UE || ED || EC || LCO || NC || LCA || FF || JT */ +#define ETH_DMATxDesc_JT ((uint32_t)0x00004000) /*!< Jabber Timeout */ +#define ETH_DMATxDesc_FF ((uint32_t)0x00002000) /*!< Frame Flushed: DMA/MTL flushed the frame due to SW flush */ +#define ETH_DMATxDesc_PCE ((uint32_t)0x00001000) /*!< Payload Checksum Error */ +#define ETH_DMATxDesc_LCA ((uint32_t)0x00000800) /*!< Loss of Carrier: carrier lost during tramsmission */ +#define ETH_DMATxDesc_NC ((uint32_t)0x00000400) /*!< No Carrier: no carrier signal from the tranceiver */ +#define ETH_DMATxDesc_LCO ((uint32_t)0x00000200) /*!< Late Collision: transmission aborted due to collision */ +#define ETH_DMATxDesc_EC ((uint32_t)0x00000100) /*!< Excessive Collision: transmission aborted after 16 collisions */ +#define ETH_DMATxDesc_VF ((uint32_t)0x00000080) /*!< VLAN Frame */ +#define ETH_DMATxDesc_CC ((uint32_t)0x00000078) /*!< Collision Count */ +#define ETH_DMATxDesc_ED ((uint32_t)0x00000004) /*!< Excessive Deferral */ +#define ETH_DMATxDesc_UF ((uint32_t)0x00000002) /*!< Underflow Error: late data arrival from the memory */ +#define ETH_DMATxDesc_DB ((uint32_t)0x00000001) /*!< Deferred Bit */ + +/** + * @brief Bit definition of TDES1 register + */ +#define ETH_DMATxDesc_TBS2 ((uint32_t)0x1FFF0000) /*!< Transmit Buffer2 Size */ +#define ETH_DMATxDesc_TBS1 ((uint32_t)0x00001FFF) /*!< Transmit Buffer1 Size */ + +/** + * @brief Bit definition of TDES2 register + */ +#define ETH_DMATxDesc_B1AP ((uint32_t)0xFFFFFFFF) /*!< Buffer1 Address Pointer */ + +/** + * @brief Bit definition of TDES3 register + */ +#define ETH_DMATxDesc_B2AP ((uint32_t)0xFFFFFFFF) /*!< Buffer2 Address Pointer */ + +/** + * @} + */ + + +/** @defgroup DMA_Rx_descriptor + * @{ + */ + +/**-------------------------------------------------------------------------------------------------------------------- + RDES0 | OWN(31) | Status [30:0] | + --------------------------------------------------------------------------------------------------------------------- + RDES1 | CTRL(31) | Reserved[30:29] | Buffer2 ByteCount[28:16] | CTRL[15:14] | Reserved(13) | Buffer1 ByteCount[12:0] | + --------------------------------------------------------------------------------------------------------------------- + RDES2 | Buffer1 Address [31:0] | + --------------------------------------------------------------------------------------------------------------------- + RDES3 | Buffer2 Address [31:0] / Next Desciptor Address [31:0] | + -------------------------------------------------------------------------------------------------------------------**/ + +/** + * @brief Bit definition of RDES0 register: DMA Rx descriptor status register + */ +#define ETH_DMARxDesc_OWN ((uint32_t)0x80000000) /*!< OWN bit: descriptor is owned by DMA engine */ +#define ETH_DMARxDesc_AFM ((uint32_t)0x40000000) /*!< DA Filter Fail for the rx frame */ +#define ETH_DMARxDesc_FL ((uint32_t)0x3FFF0000) /*!< Receive descriptor frame length */ +#define ETH_DMARxDesc_ES ((uint32_t)0x00008000) /*!< Error summary: OR of the following bits: DE || OE || IPC || LC || RWT || RE || CE */ +#define ETH_DMARxDesc_DE ((uint32_t)0x00004000) /*!< Desciptor error: no more descriptors for receive frame */ +#define ETH_DMARxDesc_SAF ((uint32_t)0x00002000) /*!< SA Filter Fail for the received frame */ +#define ETH_DMARxDesc_LE ((uint32_t)0x00001000) /*!< Frame size not matching with length field */ +#define ETH_DMARxDesc_OE ((uint32_t)0x00000800) /*!< Overflow Error: Frame was damaged due to buffer overflow */ +#define ETH_DMARxDesc_VLAN ((uint32_t)0x00000400) /*!< VLAN Tag: received frame is a VLAN frame */ +#define ETH_DMARxDesc_FS ((uint32_t)0x00000200) /*!< First descriptor of the frame */ +#define ETH_DMARxDesc_LS ((uint32_t)0x00000100) /*!< Last descriptor of the frame */ +#define ETH_DMARxDesc_IPV4HCE ((uint32_t)0x00000080) /*!< IPC Checksum Error: Rx Ipv4 header checksum error */ +#define ETH_DMARxDesc_LC ((uint32_t)0x00000040) /*!< Late collision occurred during reception */ +#define ETH_DMARxDesc_FT ((uint32_t)0x00000020) /*!< Frame type - Ethernet, otherwise 802.3 */ +#define ETH_DMARxDesc_RWT ((uint32_t)0x00000010) /*!< Receive Watchdog Timeout: watchdog timer expired during reception */ +#define ETH_DMARxDesc_RE ((uint32_t)0x00000008) /*!< Receive error: error reported by MII interface */ +#define ETH_DMARxDesc_DBE ((uint32_t)0x00000004) /*!< Dribble bit error: frame contains non int multiple of 8 bits */ +#define ETH_DMARxDesc_CE ((uint32_t)0x00000002) /*!< CRC error */ +#define ETH_DMARxDesc_MAMPCE ((uint32_t)0x00000001) /*!< Rx MAC Address/Payload Checksum Error: Rx MAC address matched/ Rx Payload Checksum Error */ + +/** + * @brief Bit definition of RDES1 register + */ +#define ETH_DMARxDesc_DIC ((uint32_t)0x80000000) /*!< Disable Interrupt on Completion */ +#define ETH_DMARxDesc_RBS2 ((uint32_t)0x1FFF0000) /*!< Receive Buffer2 Size */ +#define ETH_DMARxDesc_RER ((uint32_t)0x00008000) /*!< Receive End of Ring */ +#define ETH_DMARxDesc_RCH ((uint32_t)0x00004000) /*!< Second Address Chained */ +#define ETH_DMARxDesc_RBS1 ((uint32_t)0x00001FFF) /*!< Receive Buffer1 Size */ + +/** + * @brief Bit definition of RDES2 register + */ +#define ETH_DMARxDesc_B1AP ((uint32_t)0xFFFFFFFF) /*!< Buffer1 Address Pointer */ + +/** + * @brief Bit definition of RDES3 register + */ +#define ETH_DMARxDesc_B2AP ((uint32_t)0xFFFFFFFF) /*!< Buffer2 Address Pointer */ + +/**--------------------------------------------------------------------------**/ +/** + * @brief Desciption of common PHY registers + */ +/**--------------------------------------------------------------------------**/ + +/** + * @} + */ + +/** @defgroup PHY_Read_write_Timeouts + * @{ + */ +#define PHY_READ_TO ((uint32_t)0x0004FFFF) +#define PHY_WRITE_TO ((uint32_t)0x0004FFFF) + +/** + * @} + */ + +/** @defgroup PHY_Reset_Delay + * @{ + */ +#define PHY_ResetDelay ((uint32_t)0x04000000) + +/** + * @} + */ + +/** @defgroup PHY_Config_Delay + * @{ + */ +#define PHY_ConfigDelay ((uint32_t)0x00FFFFFF) + +/** + * @} + */ + +/** @defgroup PHY_Register_address + * @{ + */ +#define PHY_BCR 0 /*!< Tranceiver Basic Control Register */ +#define PHY_BSR 1 /*!< Tranceiver Basic Status Register */ + +/** + * @} + */ + +/** @defgroup PHY_basic_Control_register + * @{ + */ +#define PHY_Reset ((u16)0x8000) /*!< PHY Reset */ +#define PHY_Loopback ((u16)0x4000) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((u16)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((u16)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((u16)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((u16)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AutoNegotiation ((u16)0x1000) /*!< Enable auto-negotiation function */ +#define PHY_Restart_AutoNegotiation ((u16)0x0200) /*!< Restart auto-negotiation function */ +#define PHY_Powerdown ((u16)0x0800) /*!< Select the power down mode */ +#define PHY_Isolate ((u16)0x0400) /*!< Isolate PHY from MII */ + +/** + * @} + */ + +/** @defgroup PHY_basic_status_register + * @{ + */ +#define PHY_AutoNego_Complete ((u16)0x0020) /*!< Auto-Negotioation process completed */ +#define PHY_Linked_Status ((u16)0x0004) /*!< Valid link established */ +#define PHY_Jabber_detection ((u16)0x0002) /*!< Jabber condition detected */ + +/** + * @} + */ + +/** @defgroup PHY_status_register + * @{ + */ +/* The PHY status register value change from a PHY to another so the user have + to update this value depending on the used external PHY */ +/** + * @brief For LAN8700 + */ +//#define PHY_SR 31 /*!< Tranceiver Status Register */ +/** + * @brief For DP83848 + */ +#define PHY_SR 16 /*!< Tranceiver Status Register */ + +/* The Speed and Duplex mask values change from a PHY to another so the user have to update + this value depending on the used external PHY */ +/** + * @brief For LAN8700 + */ +//#define PHY_Speed_Status ((u16)0x0004) /*!< Configured information of Speed: 10Mbps */ +//#define PHY_Duplex_Status ((u16)0x0010) /*!< Configured information of Duplex: Full-duplex */ + +/** + * @brief For DP83848 + */ +#define PHY_Speed_Status ((u16)0x0002) /*!< Configured information of Speed: 10Mbps */ +#define PHY_Duplex_Status ((u16)0x0004) /*!< Configured information of Duplex: Full-duplex */ +#define IS_ETH_PHY_ADDRESS(ADDRESS) ((ADDRESS) <= 0x20) +#define IS_ETH_PHY_REG(REG) (((REG) == PHY_BCR) || \ + ((REG) == PHY_BSR) || \ + ((REG) == PHY_SR)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief MAC defines + */ +/**--------------------------------------------------------------------------**/ + +/** + * @} + */ + +/** @defgroup ETH_AutoNegotiation + * @{ + */ +#define ETH_AutoNegotiation_Enable ((uint32_t)0x00000001) +#define ETH_AutoNegotiation_Disable ((uint32_t)0x00000000) +#define IS_ETH_AUTONEGOTIATION(CMD) (((CMD) == ETH_AutoNegotiation_Enable) || \ + ((CMD) == ETH_AutoNegotiation_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_watchdog + * @{ + */ +#define ETH_Watchdog_Enable ((uint32_t)0x00000000) +#define ETH_Watchdog_Disable ((uint32_t)0x00800000) +#define IS_ETH_WATCHDOG(CMD) (((CMD) == ETH_Watchdog_Enable) || \ + ((CMD) == ETH_Watchdog_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Jabber + * @{ + */ +#define ETH_Jabber_Enable ((uint32_t)0x00000000) +#define ETH_Jabber_Disable ((uint32_t)0x00400000) +#define IS_ETH_JABBER(CMD) (((CMD) == ETH_Jabber_Enable) || \ + ((CMD) == ETH_Jabber_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Inter_Frame_Gap + * @{ + */ +#define ETH_InterFrameGap_96Bit ((uint32_t)0x00000000) /*!< minimum IFG between frames during transmission is 96Bit */ +#define ETH_InterFrameGap_88Bit ((uint32_t)0x00020000) /*!< minimum IFG between frames during transmission is 88Bit */ +#define ETH_InterFrameGap_80Bit ((uint32_t)0x00040000) /*!< minimum IFG between frames during transmission is 80Bit */ +#define ETH_InterFrameGap_72Bit ((uint32_t)0x00060000) /*!< minimum IFG between frames during transmission is 72Bit */ +#define ETH_InterFrameGap_64Bit ((uint32_t)0x00080000) /*!< minimum IFG between frames during transmission is 64Bit */ +#define ETH_InterFrameGap_56Bit ((uint32_t)0x000A0000) /*!< minimum IFG between frames during transmission is 56Bit */ +#define ETH_InterFrameGap_48Bit ((uint32_t)0x000C0000) /*!< minimum IFG between frames during transmission is 48Bit */ +#define ETH_InterFrameGap_40Bit ((uint32_t)0x000E0000) /*!< minimum IFG between frames during transmission is 40Bit */ +#define IS_ETH_INTER_FRAME_GAP(GAP) (((GAP) == ETH_InterFrameGap_96Bit) || \ + ((GAP) == ETH_InterFrameGap_88Bit) || \ + ((GAP) == ETH_InterFrameGap_80Bit) || \ + ((GAP) == ETH_InterFrameGap_72Bit) || \ + ((GAP) == ETH_InterFrameGap_64Bit) || \ + ((GAP) == ETH_InterFrameGap_56Bit) || \ + ((GAP) == ETH_InterFrameGap_48Bit) || \ + ((GAP) == ETH_InterFrameGap_40Bit)) + +/** + * @} + */ + +/** @defgroup ETH_Carrier_Sense + * @{ + */ +#define ETH_CarrierSense_Enable ((uint32_t)0x00000000) +#define ETH_CarrierSense_Disable ((uint32_t)0x00010000) +#define IS_ETH_CARRIER_SENSE(CMD) (((CMD) == ETH_CarrierSense_Enable) || \ + ((CMD) == ETH_CarrierSense_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Speed + * @{ + */ +#define ETH_Speed_10M ((uint32_t)0x00000000) +#define ETH_Speed_100M ((uint32_t)0x00004000) +#define IS_ETH_SPEED(SPEED) (((SPEED) == ETH_Speed_10M) || \ + ((SPEED) == ETH_Speed_100M)) + +/** + * @} + */ + +/** @defgroup ETH_Receive_Own + * @{ + */ +#define ETH_ReceiveOwn_Enable ((uint32_t)0x00000000) +#define ETH_ReceiveOwn_Disable ((uint32_t)0x00002000) +#define IS_ETH_RECEIVE_OWN(CMD) (((CMD) == ETH_ReceiveOwn_Enable) || \ + ((CMD) == ETH_ReceiveOwn_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Loop_back_Mode + * @{ + */ +#define ETH_LoopbackMode_Enable ((uint32_t)0x00001000) +#define ETH_LoopbackMode_Disable ((uint32_t)0x00000000) +#define IS_ETH_LOOPBACK_MODE(CMD) (((CMD) == ETH_LoopbackMode_Enable) || \ + ((CMD) == ETH_LoopbackMode_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Duplex_mode + * @{ + */ +#define ETH_Mode_FullDuplex ((uint32_t)0x00000800) +#define ETH_Mode_HalfDuplex ((uint32_t)0x00000000) +#define IS_ETH_DUPLEX_MODE(MODE) (((MODE) == ETH_Mode_FullDuplex) || \ + ((MODE) == ETH_Mode_HalfDuplex)) + +/** + * @} + */ + +/** @defgroup ETH_Checksum_Offload + * @{ + */ +#define ETH_ChecksumOffload_Enable ((uint32_t)0x00000400) +#define ETH_ChecksumOffload_Disable ((uint32_t)0x00000000) +#define IS_ETH_CHECKSUM_OFFLOAD(CMD) (((CMD) == ETH_ChecksumOffload_Enable) || \ + ((CMD) == ETH_ChecksumOffload_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Retry_Transmission + * @{ + */ +#define ETH_RetryTransmission_Enable ((uint32_t)0x00000000) +#define ETH_RetryTransmission_Disable ((uint32_t)0x00000200) +#define IS_ETH_RETRY_TRANSMISSION(CMD) (((CMD) == ETH_RetryTransmission_Enable) || \ + ((CMD) == ETH_RetryTransmission_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Automatic_Pad_CRC_Strip + * @{ + */ +#define ETH_AutomaticPadCRCStrip_Enable ((uint32_t)0x00000080) +#define ETH_AutomaticPadCRCStrip_Disable ((uint32_t)0x00000000) +#define IS_ETH_AUTOMATIC_PADCRC_STRIP(CMD) (((CMD) == ETH_AutomaticPadCRCStrip_Enable) || \ + ((CMD) == ETH_AutomaticPadCRCStrip_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Back-Off_limit + * @{ + */ +#define ETH_BackOffLimit_10 ((uint32_t)0x00000000) +#define ETH_BackOffLimit_8 ((uint32_t)0x00000020) +#define ETH_BackOffLimit_4 ((uint32_t)0x00000040) +#define ETH_BackOffLimit_1 ((uint32_t)0x00000060) +#define IS_ETH_BACKOFF_LIMIT(LIMIT) (((LIMIT) == ETH_BackOffLimit_10) || \ + ((LIMIT) == ETH_BackOffLimit_8) || \ + ((LIMIT) == ETH_BackOffLimit_4) || \ + ((LIMIT) == ETH_BackOffLimit_1)) + +/** + * @} + */ + +/** @defgroup ETH_Deferral_Check + * @{ + */ +#define ETH_DeferralCheck_Enable ((uint32_t)0x00000010) +#define ETH_DeferralCheck_Disable ((uint32_t)0x00000000) +#define IS_ETH_DEFERRAL_CHECK(CMD) (((CMD) == ETH_DeferralCheck_Enable) || \ + ((CMD) == ETH_DeferralCheck_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Receive_All + * @{ + */ +#define ETH_ReceiveAll_Enable ((uint32_t)0x80000000) +#define ETH_ReceiveAll_Disable ((uint32_t)0x00000000) +#define IS_ETH_RECEIVE_ALL(CMD) (((CMD) == ETH_ReceiveAll_Enable) || \ + ((CMD) == ETH_ReceiveAll_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Source_Addr_Filter + * @{ + */ +#define ETH_SourceAddrFilter_Normal_Enable ((uint32_t)0x00000200) +#define ETH_SourceAddrFilter_Inverse_Enable ((uint32_t)0x00000300) +#define ETH_SourceAddrFilter_Disable ((uint32_t)0x00000000) +#define IS_ETH_SOURCE_ADDR_FILTER(CMD) (((CMD) == ETH_SourceAddrFilter_Normal_Enable) || \ + ((CMD) == ETH_SourceAddrFilter_Inverse_Enable) || \ + ((CMD) == ETH_SourceAddrFilter_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Pass_Control_Frames + * @{ + */ +#define ETH_PassControlFrames_BlockAll ((uint32_t)0x00000040) /*!< MAC filters all control frames from reaching the application */ +#define ETH_PassControlFrames_ForwardAll ((uint32_t)0x00000080) /*!< MAC forwards all control frames to application even if they fail the Address Filter */ +#define ETH_PassControlFrames_ForwardPassedAddrFilter ((uint32_t)0x000000C0) /*!< MAC forwards control frames that pass the Address Filter. */ +#define IS_ETH_CONTROL_FRAMES(PASS) (((PASS) == ETH_PassControlFrames_BlockAll) || \ + ((PASS) == ETH_PassControlFrames_ForwardAll) || \ + ((PASS) == ETH_PassControlFrames_ForwardPassedAddrFilter)) + +/** + * @} + */ + +/** @defgroup ETH_Broadcast_Frames_Reception + * @{ + */ +#define ETH_BroadcastFramesReception_Enable ((uint32_t)0x00000000) +#define ETH_BroadcastFramesReception_Disable ((uint32_t)0x00000020) +#define IS_ETH_BROADCAST_FRAMES_RECEPTION(CMD) (((CMD) == ETH_BroadcastFramesReception_Enable) || \ + ((CMD) == ETH_BroadcastFramesReception_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Destination_Addr_Filter + * @{ + */ +#define ETH_DestinationAddrFilter_Normal ((uint32_t)0x00000000) +#define ETH_DestinationAddrFilter_Inverse ((uint32_t)0x00000008) +#define IS_ETH_DESTINATION_ADDR_FILTER(FILTER) (((FILTER) == ETH_DestinationAddrFilter_Normal) || \ + ((FILTER) == ETH_DestinationAddrFilter_Inverse)) + +/** + * @} + */ + +/** @defgroup ETH_Promiscuous_Mode + * @{ + */ +#define ETH_PromiscuousMode_Enable ((uint32_t)0x00000001) +#define ETH_PromiscuousMode_Disable ((uint32_t)0x00000000) +#define IS_ETH_PROMISCUOUS_MODE(CMD) (((CMD) == ETH_PromiscuousMode_Enable) || \ + ((CMD) == ETH_PromiscuousMode_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_multicast_frames_filter + * @{ + */ +#define ETH_MulticastFramesFilter_PerfectHashTable ((uint32_t)0x00000404) +#define ETH_MulticastFramesFilter_HashTable ((uint32_t)0x00000004) +#define ETH_MulticastFramesFilter_Perfect ((uint32_t)0x00000000) +#define ETH_MulticastFramesFilter_None ((uint32_t)0x00000010) +#define IS_ETH_MULTICAST_FRAMES_FILTER(FILTER) (((FILTER) == ETH_MulticastFramesFilter_PerfectHashTable) || \ + ((FILTER) == ETH_MulticastFramesFilter_HashTable) || \ + ((FILTER) == ETH_MulticastFramesFilter_Perfect) || \ + ((FILTER) == ETH_MulticastFramesFilter_None)) + + +/** + * @} + */ + +/** @defgroup ETH_unicast_frames_filter + * @{ + */ +#define ETH_UnicastFramesFilter_PerfectHashTable ((uint32_t)0x00000402) +#define ETH_UnicastFramesFilter_HashTable ((uint32_t)0x00000002) +#define ETH_UnicastFramesFilter_Perfect ((uint32_t)0x00000000) +#define IS_ETH_UNICAST_FRAMES_FILTER(FILTER) (((FILTER) == ETH_UnicastFramesFilter_PerfectHashTable) || \ + ((FILTER) == ETH_UnicastFramesFilter_HashTable) || \ + ((FILTER) == ETH_UnicastFramesFilter_Perfect)) + +/** + * @} + */ + +/** @defgroup ETH_Pause_Time + * @{ + */ +#define IS_ETH_PAUSE_TIME(TIME) ((TIME) <= 0xFFFF) + +/** + * @} + */ + +/** @defgroup ETH_Zero_Quanta_Pause + * @{ + */ +#define ETH_ZeroQuantaPause_Enable ((uint32_t)0x00000000) +#define ETH_ZeroQuantaPause_Disable ((uint32_t)0x00000080) +#define IS_ETH_ZEROQUANTA_PAUSE(CMD) (((CMD) == ETH_ZeroQuantaPause_Enable) || \ + ((CMD) == ETH_ZeroQuantaPause_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Pause_Low_Threshold + * @{ + */ +#define ETH_PauseLowThreshold_Minus4 ((uint32_t)0x00000000) /*!< Pause time minus 4 slot times */ +#define ETH_PauseLowThreshold_Minus28 ((uint32_t)0x00000010) /*!< Pause time minus 28 slot times */ +#define ETH_PauseLowThreshold_Minus144 ((uint32_t)0x00000020) /*!< Pause time minus 144 slot times */ +#define ETH_PauseLowThreshold_Minus256 ((uint32_t)0x00000030) /*!< Pause time minus 256 slot times */ +#define IS_ETH_PAUSE_LOW_THRESHOLD(THRESHOLD) (((THRESHOLD) == ETH_PauseLowThreshold_Minus4) || \ + ((THRESHOLD) == ETH_PauseLowThreshold_Minus28) || \ + ((THRESHOLD) == ETH_PauseLowThreshold_Minus144) || \ + ((THRESHOLD) == ETH_PauseLowThreshold_Minus256)) + +/** + * @} + */ + +/** @defgroup ETH_Unicast_Pause_Frame_Detect + * @{ + */ +#define ETH_UnicastPauseFrameDetect_Enable ((uint32_t)0x00000008) +#define ETH_UnicastPauseFrameDetect_Disable ((uint32_t)0x00000000) +#define IS_ETH_UNICAST_PAUSE_FRAME_DETECT(CMD) (((CMD) == ETH_UnicastPauseFrameDetect_Enable) || \ + ((CMD) == ETH_UnicastPauseFrameDetect_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Receive_Flow_Control + * @{ + */ +#define ETH_ReceiveFlowControl_Enable ((uint32_t)0x00000004) +#define ETH_ReceiveFlowControl_Disable ((uint32_t)0x00000000) +#define IS_ETH_RECEIVE_FLOWCONTROL(CMD) (((CMD) == ETH_ReceiveFlowControl_Enable) || \ + ((CMD) == ETH_ReceiveFlowControl_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Transmit_Flow_Control + * @{ + */ +#define ETH_TransmitFlowControl_Enable ((uint32_t)0x00000002) +#define ETH_TransmitFlowControl_Disable ((uint32_t)0x00000000) +#define IS_ETH_TRANSMIT_FLOWCONTROL(CMD) (((CMD) == ETH_TransmitFlowControl_Enable) || \ + ((CMD) == ETH_TransmitFlowControl_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_VLAN_Tag_Comparison + * @{ + */ +#define ETH_VLANTagComparison_12Bit ((uint32_t)0x00010000) +#define ETH_VLANTagComparison_16Bit ((uint32_t)0x00000000) +#define IS_ETH_VLAN_TAG_COMPARISON(COMPARISON) (((COMPARISON) == ETH_VLANTagComparison_12Bit) || \ + ((COMPARISON) == ETH_VLANTagComparison_16Bit)) +#define IS_ETH_VLAN_TAG_IDENTIFIER(IDENTIFIER) ((IDENTIFIER) <= 0xFFFF) + +/** + * @} + */ + +/** @defgroup ETH_MAC_Flags + * @{ + */ +#define ETH_MAC_FLAG_TST ((uint32_t)0x00000200) /*!< Time stamp trigger flag (on MAC) */ +#define ETH_MAC_FLAG_MMCT ((uint32_t)0x00000040) /*!< MMC transmit flag */ +#define ETH_MAC_FLAG_MMCR ((uint32_t)0x00000020) /*!< MMC receive flag */ +#define ETH_MAC_FLAG_MMC ((uint32_t)0x00000010) /*!< MMC flag (on MAC) */ +#define ETH_MAC_FLAG_PMT ((uint32_t)0x00000008) /*!< PMT flag (on MAC) */ +#define IS_ETH_MAC_GET_FLAG(FLAG) (((FLAG) == ETH_MAC_FLAG_TST) || ((FLAG) == ETH_MAC_FLAG_MMCT) || \ + ((FLAG) == ETH_MAC_FLAG_MMCR) || ((FLAG) == ETH_MAC_FLAG_MMC) || \ + ((FLAG) == ETH_MAC_FLAG_PMT)) +/** + * @} + */ + +/** @defgroup ETH_MAC_Interrupts + * @{ + */ +#define ETH_MAC_IT_TST ((uint32_t)0x00000200) /*!< Time stamp trigger interrupt (on MAC) */ +#define ETH_MAC_IT_MMCT ((uint32_t)0x00000040) /*!< MMC transmit interrupt */ +#define ETH_MAC_IT_MMCR ((uint32_t)0x00000020) /*!< MMC receive interrupt */ +#define ETH_MAC_IT_MMC ((uint32_t)0x00000010) /*!< MMC interrupt (on MAC) */ +#define ETH_MAC_IT_PMT ((uint32_t)0x00000008) /*!< PMT interrupt (on MAC) */ +#define IS_ETH_MAC_IT(IT) ((((IT) & (uint32_t)0xFFFFFDF7) == 0x00) && ((IT) != 0x00)) +#define IS_ETH_MAC_GET_IT(IT) (((IT) == ETH_MAC_IT_TST) || ((IT) == ETH_MAC_IT_MMCT) || \ + ((IT) == ETH_MAC_IT_MMCR) || ((IT) == ETH_MAC_IT_MMC) || \ + ((IT) == ETH_MAC_IT_PMT)) +/** + * @} + */ + +/** @defgroup ETH_MAC_addresses + * @{ + */ +#define ETH_MAC_Address0 ((uint32_t)0x00000000) +#define ETH_MAC_Address1 ((uint32_t)0x00000008) +#define ETH_MAC_Address2 ((uint32_t)0x00000010) +#define ETH_MAC_Address3 ((uint32_t)0x00000018) +#define IS_ETH_MAC_ADDRESS0123(ADDRESS) (((ADDRESS) == ETH_MAC_Address0) || \ + ((ADDRESS) == ETH_MAC_Address1) || \ + ((ADDRESS) == ETH_MAC_Address2) || \ + ((ADDRESS) == ETH_MAC_Address3)) +#define IS_ETH_MAC_ADDRESS123(ADDRESS) (((ADDRESS) == ETH_MAC_Address1) || \ + ((ADDRESS) == ETH_MAC_Address2) || \ + ((ADDRESS) == ETH_MAC_Address3)) +/** + * @} + */ + +/** @defgroup ETH_MAC_addresses_filter:_SA_DA_filed_of_received_frames + * @{ + */ +#define ETH_MAC_AddressFilter_SA ((uint32_t)0x00000000) +#define ETH_MAC_AddressFilter_DA ((uint32_t)0x00000008) +#define IS_ETH_MAC_ADDRESS_FILTER(FILTER) (((FILTER) == ETH_MAC_AddressFilter_SA) || \ + ((FILTER) == ETH_MAC_AddressFilter_DA)) +/** + * @} + */ + +/** @defgroup ETH_MAC_addresses_filter:_Mask_bytes + * @{ + */ +#define ETH_MAC_AddressMask_Byte6 ((uint32_t)0x20000000) /*!< Mask MAC Address high reg bits [15:8] */ +#define ETH_MAC_AddressMask_Byte5 ((uint32_t)0x10000000) /*!< Mask MAC Address high reg bits [7:0] */ +#define ETH_MAC_AddressMask_Byte4 ((uint32_t)0x08000000) /*!< Mask MAC Address low reg bits [31:24] */ +#define ETH_MAC_AddressMask_Byte3 ((uint32_t)0x04000000) /*!< Mask MAC Address low reg bits [23:16] */ +#define ETH_MAC_AddressMask_Byte2 ((uint32_t)0x02000000) /*!< Mask MAC Address low reg bits [15:8] */ +#define ETH_MAC_AddressMask_Byte1 ((uint32_t)0x01000000) /*!< Mask MAC Address low reg bits [70] */ +#define IS_ETH_MAC_ADDRESS_MASK(MASK) (((MASK) == ETH_MAC_AddressMask_Byte6) || \ + ((MASK) == ETH_MAC_AddressMask_Byte5) || \ + ((MASK) == ETH_MAC_AddressMask_Byte4) || \ + ((MASK) == ETH_MAC_AddressMask_Byte3) || \ + ((MASK) == ETH_MAC_AddressMask_Byte2) || \ + ((MASK) == ETH_MAC_AddressMask_Byte1)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet DMA Desciptors defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_DMA_Tx_descriptor_flags + * @{ + */ +#define IS_ETH_DMATxDESC_GET_FLAG(FLAG) (((FLAG) == ETH_DMATxDesc_OWN) || \ + ((FLAG) == ETH_DMATxDesc_IC) || \ + ((FLAG) == ETH_DMATxDesc_LS) || \ + ((FLAG) == ETH_DMATxDesc_FS) || \ + ((FLAG) == ETH_DMATxDesc_DC) || \ + ((FLAG) == ETH_DMATxDesc_DP) || \ + ((FLAG) == ETH_DMATxDesc_TTSE) || \ + ((FLAG) == ETH_DMATxDesc_TER) || \ + ((FLAG) == ETH_DMATxDesc_TCH) || \ + ((FLAG) == ETH_DMATxDesc_TTSS) || \ + ((FLAG) == ETH_DMATxDesc_IHE) || \ + ((FLAG) == ETH_DMATxDesc_ES) || \ + ((FLAG) == ETH_DMATxDesc_JT) || \ + ((FLAG) == ETH_DMATxDesc_FF) || \ + ((FLAG) == ETH_DMATxDesc_PCE) || \ + ((FLAG) == ETH_DMATxDesc_LCA) || \ + ((FLAG) == ETH_DMATxDesc_NC) || \ + ((FLAG) == ETH_DMATxDesc_LCO) || \ + ((FLAG) == ETH_DMATxDesc_EC) || \ + ((FLAG) == ETH_DMATxDesc_VF) || \ + ((FLAG) == ETH_DMATxDesc_CC) || \ + ((FLAG) == ETH_DMATxDesc_ED) || \ + ((FLAG) == ETH_DMATxDesc_UF) || \ + ((FLAG) == ETH_DMATxDesc_DB)) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Tx_descriptor_segment + * @{ + */ +#define ETH_DMATxDesc_LastSegment ((uint32_t)0x40000000) /*!< Last Segment */ +#define ETH_DMATxDesc_FirstSegment ((uint32_t)0x20000000) /*!< First Segment */ +#define IS_ETH_DMA_TXDESC_SEGMENT(SEGMENT) (((SEGMENT) == ETH_DMATxDesc_LastSegment) || \ + ((SEGMENT) == ETH_DMATxDesc_FirstSegment)) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Tx_descriptor_Checksum_Insertion_Control + * @{ + */ +#define ETH_DMATxDesc_ChecksumByPass ((uint32_t)0x00000000) /*!< Checksum engine bypass */ +#define ETH_DMATxDesc_ChecksumIPV4Header ((uint32_t)0x00400000) /*!< IPv4 header checksum insertion */ +#define ETH_DMATxDesc_ChecksumTCPUDPICMPSegment ((uint32_t)0x00800000) /*!< TCP/UDP/ICMP checksum insertion. Pseudo header checksum is assumed to be present */ +#define ETH_DMATxDesc_ChecksumTCPUDPICMPFull ((uint32_t)0x00C00000) /*!< TCP/UDP/ICMP checksum fully in hardware including pseudo header */ +#define IS_ETH_DMA_TXDESC_CHECKSUM(CHECKSUM) (((CHECKSUM) == ETH_DMATxDesc_ChecksumByPass) || \ + ((CHECKSUM) == ETH_DMATxDesc_ChecksumIPV4Header) || \ + ((CHECKSUM) == ETH_DMATxDesc_ChecksumTCPUDPICMPSegment) || \ + ((CHECKSUM) == ETH_DMATxDesc_ChecksumTCPUDPICMPFull)) +/** + * @brief ETH DMA Tx Desciptor buffer size + */ +#define IS_ETH_DMATxDESC_BUFFER_SIZE(SIZE) ((SIZE) <= 0x1FFF) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Rx_descriptor_flags + * @{ + */ +#define IS_ETH_DMARxDESC_GET_FLAG(FLAG) (((FLAG) == ETH_DMARxDesc_OWN) || \ + ((FLAG) == ETH_DMARxDesc_AFM) || \ + ((FLAG) == ETH_DMARxDesc_ES) || \ + ((FLAG) == ETH_DMARxDesc_DE) || \ + ((FLAG) == ETH_DMARxDesc_SAF) || \ + ((FLAG) == ETH_DMARxDesc_LE) || \ + ((FLAG) == ETH_DMARxDesc_OE) || \ + ((FLAG) == ETH_DMARxDesc_VLAN) || \ + ((FLAG) == ETH_DMARxDesc_FS) || \ + ((FLAG) == ETH_DMARxDesc_LS) || \ + ((FLAG) == ETH_DMARxDesc_IPV4HCE) || \ + ((FLAG) == ETH_DMARxDesc_LC) || \ + ((FLAG) == ETH_DMARxDesc_FT) || \ + ((FLAG) == ETH_DMARxDesc_RWT) || \ + ((FLAG) == ETH_DMARxDesc_RE) || \ + ((FLAG) == ETH_DMARxDesc_DBE) || \ + ((FLAG) == ETH_DMARxDesc_CE) || \ + ((FLAG) == ETH_DMARxDesc_MAMPCE)) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Rx_descriptor_buffers_ + * @{ + */ +#define ETH_DMARxDesc_Buffer1 ((uint32_t)0x00000000) /*!< DMA Rx Desc Buffer1 */ +#define ETH_DMARxDesc_Buffer2 ((uint32_t)0x00000001) /*!< DMA Rx Desc Buffer2 */ +#define IS_ETH_DMA_RXDESC_BUFFER(BUFFER) (((BUFFER) == ETH_DMARxDesc_Buffer1) || \ + ((BUFFER) == ETH_DMARxDesc_Buffer2)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet DMA defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_Drop_TCP_IP_Checksum_Error_Frame + * @{ + */ +#define ETH_DropTCPIPChecksumErrorFrame_Enable ((uint32_t)0x00000000) +#define ETH_DropTCPIPChecksumErrorFrame_Disable ((uint32_t)0x04000000) +#define IS_ETH_DROP_TCPIP_CHECKSUM_FRAME(CMD) (((CMD) == ETH_DropTCPIPChecksumErrorFrame_Enable) || \ + ((CMD) == ETH_DropTCPIPChecksumErrorFrame_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Receive_Store_Forward + * @{ + */ +#define ETH_ReceiveStoreForward_Enable ((uint32_t)0x02000000) +#define ETH_ReceiveStoreForward_Disable ((uint32_t)0x00000000) +#define IS_ETH_RECEIVE_STORE_FORWARD(CMD) (((CMD) == ETH_ReceiveStoreForward_Enable) || \ + ((CMD) == ETH_ReceiveStoreForward_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Flush_Received_Frame + * @{ + */ +#define ETH_FlushReceivedFrame_Enable ((uint32_t)0x00000000) +#define ETH_FlushReceivedFrame_Disable ((uint32_t)0x01000000) +#define IS_ETH_FLUSH_RECEIVE_FRAME(CMD) (((CMD) == ETH_FlushReceivedFrame_Enable) || \ + ((CMD) == ETH_FlushReceivedFrame_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Transmit_Store_Forward + * @{ + */ +#define ETH_TransmitStoreForward_Enable ((uint32_t)0x00200000) +#define ETH_TransmitStoreForward_Disable ((uint32_t)0x00000000) +#define IS_ETH_TRANSMIT_STORE_FORWARD(CMD) (((CMD) == ETH_TransmitStoreForward_Enable) || \ + ((CMD) == ETH_TransmitStoreForward_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Transmit_Threshold_Control + * @{ + */ +#define ETH_TransmitThresholdControl_64Bytes ((uint32_t)0x00000000) /*!< threshold level of the MTL Transmit FIFO is 64 Bytes */ +#define ETH_TransmitThresholdControl_128Bytes ((uint32_t)0x00004000) /*!< threshold level of the MTL Transmit FIFO is 128 Bytes */ +#define ETH_TransmitThresholdControl_192Bytes ((uint32_t)0x00008000) /*!< threshold level of the MTL Transmit FIFO is 192 Bytes */ +#define ETH_TransmitThresholdControl_256Bytes ((uint32_t)0x0000C000) /*!< threshold level of the MTL Transmit FIFO is 256 Bytes */ +#define ETH_TransmitThresholdControl_40Bytes ((uint32_t)0x00010000) /*!< threshold level of the MTL Transmit FIFO is 40 Bytes */ +#define ETH_TransmitThresholdControl_32Bytes ((uint32_t)0x00014000) /*!< threshold level of the MTL Transmit FIFO is 32 Bytes */ +#define ETH_TransmitThresholdControl_24Bytes ((uint32_t)0x00018000) /*!< threshold level of the MTL Transmit FIFO is 24 Bytes */ +#define ETH_TransmitThresholdControl_16Bytes ((uint32_t)0x0001C000) /*!< threshold level of the MTL Transmit FIFO is 16 Bytes */ +#define IS_ETH_TRANSMIT_THRESHOLD_CONTROL(THRESHOLD) (((THRESHOLD) == ETH_TransmitThresholdControl_64Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_128Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_192Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_256Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_40Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_32Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_24Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_16Bytes)) +/** + * @} + */ + +/** @defgroup ETH_Forward_Error_Frames + * @{ + */ +#define ETH_ForwardErrorFrames_Enable ((uint32_t)0x00000080) +#define ETH_ForwardErrorFrames_Disable ((uint32_t)0x00000000) +#define IS_ETH_FORWARD_ERROR_FRAMES(CMD) (((CMD) == ETH_ForwardErrorFrames_Enable) || \ + ((CMD) == ETH_ForwardErrorFrames_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Forward_Undersized_Good_Frames + * @{ + */ +#define ETH_ForwardUndersizedGoodFrames_Enable ((uint32_t)0x00000040) +#define ETH_ForwardUndersizedGoodFrames_Disable ((uint32_t)0x00000000) +#define IS_ETH_FORWARD_UNDERSIZED_GOOD_FRAMES(CMD) (((CMD) == ETH_ForwardUndersizedGoodFrames_Enable) || \ + ((CMD) == ETH_ForwardUndersizedGoodFrames_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Receive_Threshold_Control + * @{ + */ +#define ETH_ReceiveThresholdControl_64Bytes ((uint32_t)0x00000000) /*!< threshold level of the MTL Receive FIFO is 64 Bytes */ +#define ETH_ReceiveThresholdControl_32Bytes ((uint32_t)0x00000008) /*!< threshold level of the MTL Receive FIFO is 32 Bytes */ +#define ETH_ReceiveThresholdControl_96Bytes ((uint32_t)0x00000010) /*!< threshold level of the MTL Receive FIFO is 96 Bytes */ +#define ETH_ReceiveThresholdControl_128Bytes ((uint32_t)0x00000018) /*!< threshold level of the MTL Receive FIFO is 128 Bytes */ +#define IS_ETH_RECEIVE_THRESHOLD_CONTROL(THRESHOLD) (((THRESHOLD) == ETH_ReceiveThresholdControl_64Bytes) || \ + ((THRESHOLD) == ETH_ReceiveThresholdControl_32Bytes) || \ + ((THRESHOLD) == ETH_ReceiveThresholdControl_96Bytes) || \ + ((THRESHOLD) == ETH_ReceiveThresholdControl_128Bytes)) +/** + * @} + */ + +/** @defgroup ETH_Second_Frame_Operate + * @{ + */ +#define ETH_SecondFrameOperate_Enable ((uint32_t)0x00000004) +#define ETH_SecondFrameOperate_Disable ((uint32_t)0x00000000) +#define IS_ETH_SECOND_FRAME_OPERATE(CMD) (((CMD) == ETH_SecondFrameOperate_Enable) || \ + ((CMD) == ETH_SecondFrameOperate_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Address_Aligned_Beats + * @{ + */ +#define ETH_AddressAlignedBeats_Enable ((uint32_t)0x02000000) +#define ETH_AddressAlignedBeats_Disable ((uint32_t)0x00000000) +#define IS_ETH_ADDRESS_ALIGNED_BEATS(CMD) (((CMD) == ETH_AddressAlignedBeats_Enable) || \ + ((CMD) == ETH_AddressAlignedBeats_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Fixed_Burst + * @{ + */ +#define ETH_FixedBurst_Enable ((uint32_t)0x00010000) +#define ETH_FixedBurst_Disable ((uint32_t)0x00000000) +#define IS_ETH_FIXED_BURST(CMD) (((CMD) == ETH_FixedBurst_Enable) || \ + ((CMD) == ETH_FixedBurst_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Rx_DMA_Burst_Length + * @{ + */ +#define ETH_RxDMABurstLength_1Beat ((uint32_t)0x00020000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 1 */ +#define ETH_RxDMABurstLength_2Beat ((uint32_t)0x00040000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 2 */ +#define ETH_RxDMABurstLength_4Beat ((uint32_t)0x00080000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 4 */ +#define ETH_RxDMABurstLength_8Beat ((uint32_t)0x00100000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 8 */ +#define ETH_RxDMABurstLength_16Beat ((uint32_t)0x00200000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 16 */ +#define ETH_RxDMABurstLength_32Beat ((uint32_t)0x00400000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 32 */ +#define ETH_RxDMABurstLength_4xPBL_4Beat ((uint32_t)0x01020000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 4 */ +#define ETH_RxDMABurstLength_4xPBL_8Beat ((uint32_t)0x01040000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 8 */ +#define ETH_RxDMABurstLength_4xPBL_16Beat ((uint32_t)0x01080000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 16 */ +#define ETH_RxDMABurstLength_4xPBL_32Beat ((uint32_t)0x01100000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 32 */ +#define ETH_RxDMABurstLength_4xPBL_64Beat ((uint32_t)0x01200000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 64 */ +#define ETH_RxDMABurstLength_4xPBL_128Beat ((uint32_t)0x01400000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 128 */ +#define IS_ETH_RXDMA_BURST_LENGTH(LENGTH) (((LENGTH) == ETH_RxDMABurstLength_1Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_2Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_8Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_16Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_32Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_4Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_8Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_16Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_32Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_64Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_128Beat)) + +/** + * @} + */ + +/** @defgroup ETH_Tx_DMA_Burst_Length + * @{ + */ +#define ETH_TxDMABurstLength_1Beat ((uint32_t)0x00000100) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 1 */ +#define ETH_TxDMABurstLength_2Beat ((uint32_t)0x00000200) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 2 */ +#define ETH_TxDMABurstLength_4Beat ((uint32_t)0x00000400) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ +#define ETH_TxDMABurstLength_8Beat ((uint32_t)0x00000800) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ +#define ETH_TxDMABurstLength_16Beat ((uint32_t)0x00001000) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ +#define ETH_TxDMABurstLength_32Beat ((uint32_t)0x00002000) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ +#define ETH_TxDMABurstLength_4xPBL_4Beat ((uint32_t)0x01000100) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ +#define ETH_TxDMABurstLength_4xPBL_8Beat ((uint32_t)0x01000200) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ +#define ETH_TxDMABurstLength_4xPBL_16Beat ((uint32_t)0x01000400) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ +#define ETH_TxDMABurstLength_4xPBL_32Beat ((uint32_t)0x01000800) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ +#define ETH_TxDMABurstLength_4xPBL_64Beat ((uint32_t)0x01001000) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 64 */ +#define ETH_TxDMABurstLength_4xPBL_128Beat ((uint32_t)0x01002000) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 128 */ +#define IS_ETH_TXDMA_BURST_LENGTH(LENGTH) (((LENGTH) == ETH_TxDMABurstLength_1Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_2Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_8Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_16Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_32Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_4Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_8Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_16Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_32Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_64Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_128Beat)) +/** + * @brief ETH DMA Desciptor SkipLength + */ +#define IS_ETH_DMA_DESC_SKIP_LENGTH(LENGTH) ((LENGTH) <= 0x1F) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Arbitration + * @{ + */ +#define ETH_DMAArbitration_RoundRobin_RxTx_1_1 ((uint32_t)0x00000000) +#define ETH_DMAArbitration_RoundRobin_RxTx_2_1 ((uint32_t)0x00004000) +#define ETH_DMAArbitration_RoundRobin_RxTx_3_1 ((uint32_t)0x00008000) +#define ETH_DMAArbitration_RoundRobin_RxTx_4_1 ((uint32_t)0x0000C000) +#define ETH_DMAArbitration_RxPriorTx ((uint32_t)0x00000002) +#define IS_ETH_DMA_ARBITRATION_ROUNDROBIN_RXTX(RATIO) (((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_1_1) || \ + ((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_2_1) || \ + ((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_3_1) || \ + ((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_4_1) || \ + ((RATIO) == ETH_DMAArbitration_RxPriorTx)) +/** + * @} + */ + +/** @defgroup ETH_DMA_Flags + * @{ + */ +#define ETH_DMA_FLAG_TST ((uint32_t)0x20000000) /*!< Time-stamp trigger interrupt (on DMA) */ +#define ETH_DMA_FLAG_PMT ((uint32_t)0x10000000) /*!< PMT interrupt (on DMA) */ +#define ETH_DMA_FLAG_MMC ((uint32_t)0x08000000) /*!< MMC interrupt (on DMA) */ +#define ETH_DMA_FLAG_DataTransferError ((uint32_t)0x00800000) /*!< Error bits 0-Rx DMA, 1-Tx DMA */ +#define ETH_DMA_FLAG_ReadWriteError ((uint32_t)0x01000000) /*!< Error bits 0-write trnsf, 1-read transfr */ +#define ETH_DMA_FLAG_AccessError ((uint32_t)0x02000000) /*!< Error bits 0-data buffer, 1-desc. access */ +#define ETH_DMA_FLAG_NIS ((uint32_t)0x00010000) /*!< Normal interrupt summary flag */ +#define ETH_DMA_FLAG_AIS ((uint32_t)0x00008000) /*!< Abnormal interrupt summary flag */ +#define ETH_DMA_FLAG_ER ((uint32_t)0x00004000) /*!< Early receive flag */ +#define ETH_DMA_FLAG_FBE ((uint32_t)0x00002000) /*!< Fatal bus error flag */ +#define ETH_DMA_FLAG_ET ((uint32_t)0x00000400) /*!< Early transmit flag */ +#define ETH_DMA_FLAG_RWT ((uint32_t)0x00000200) /*!< Receive watchdog timeout flag */ +#define ETH_DMA_FLAG_RPS ((uint32_t)0x00000100) /*!< Receive process stopped flag */ +#define ETH_DMA_FLAG_RBU ((uint32_t)0x00000080) /*!< Receive buffer unavailable flag */ +#define ETH_DMA_FLAG_R ((uint32_t)0x00000040) /*!< Receive flag */ +#define ETH_DMA_FLAG_TU ((uint32_t)0x00000020) /*!< Underflow flag */ +#define ETH_DMA_FLAG_RO ((uint32_t)0x00000010) /*!< Overflow flag */ +#define ETH_DMA_FLAG_TJT ((uint32_t)0x00000008) /*!< Transmit jabber timeout flag */ +#define ETH_DMA_FLAG_TBU ((uint32_t)0x00000004) /*!< Transmit buffer unavailable flag */ +#define ETH_DMA_FLAG_TPS ((uint32_t)0x00000002) /*!< Transmit process stopped flag */ +#define ETH_DMA_FLAG_T ((uint32_t)0x00000001) /*!< Transmit flag */ + +#define IS_ETH_DMA_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFE1800) == 0x00) && ((FLAG) != 0x00)) +#define IS_ETH_DMA_GET_FLAG(FLAG) (((FLAG) == ETH_DMA_FLAG_TST) || ((FLAG) == ETH_DMA_FLAG_PMT) || \ + ((FLAG) == ETH_DMA_FLAG_MMC) || ((FLAG) == ETH_DMA_FLAG_DataTransferError) || \ + ((FLAG) == ETH_DMA_FLAG_ReadWriteError) || ((FLAG) == ETH_DMA_FLAG_AccessError) || \ + ((FLAG) == ETH_DMA_FLAG_NIS) || ((FLAG) == ETH_DMA_FLAG_AIS) || \ + ((FLAG) == ETH_DMA_FLAG_ER) || ((FLAG) == ETH_DMA_FLAG_FBE) || \ + ((FLAG) == ETH_DMA_FLAG_ET) || ((FLAG) == ETH_DMA_FLAG_RWT) || \ + ((FLAG) == ETH_DMA_FLAG_RPS) || ((FLAG) == ETH_DMA_FLAG_RBU) || \ + ((FLAG) == ETH_DMA_FLAG_R) || ((FLAG) == ETH_DMA_FLAG_TU) || \ + ((FLAG) == ETH_DMA_FLAG_RO) || ((FLAG) == ETH_DMA_FLAG_TJT) || \ + ((FLAG) == ETH_DMA_FLAG_TBU) || ((FLAG) == ETH_DMA_FLAG_TPS) || \ + ((FLAG) == ETH_DMA_FLAG_T)) +/** + * @} + */ + +/** @defgroup ETH_DMA_Interrupts + * @{ + */ +#define ETH_DMA_IT_TST ((uint32_t)0x20000000) /*!< Time-stamp trigger interrupt (on DMA) */ +#define ETH_DMA_IT_PMT ((uint32_t)0x10000000) /*!< PMT interrupt (on DMA) */ +#define ETH_DMA_IT_MMC ((uint32_t)0x08000000) /*!< MMC interrupt (on DMA) */ +#define ETH_DMA_IT_NIS ((uint32_t)0x00010000) /*!< Normal interrupt summary */ +#define ETH_DMA_IT_AIS ((uint32_t)0x00008000) /*!< Abnormal interrupt summary */ +#define ETH_DMA_IT_ER ((uint32_t)0x00004000) /*!< Early receive interrupt */ +#define ETH_DMA_IT_FBE ((uint32_t)0x00002000) /*!< Fatal bus error interrupt */ +#define ETH_DMA_IT_ET ((uint32_t)0x00000400) /*!< Early transmit interrupt */ +#define ETH_DMA_IT_RWT ((uint32_t)0x00000200) /*!< Receive watchdog timeout interrupt */ +#define ETH_DMA_IT_RPS ((uint32_t)0x00000100) /*!< Receive process stopped interrupt */ +#define ETH_DMA_IT_RBU ((uint32_t)0x00000080) /*!< Receive buffer unavailable interrupt */ +#define ETH_DMA_IT_R ((uint32_t)0x00000040) /*!< Receive interrupt */ +#define ETH_DMA_IT_TU ((uint32_t)0x00000020) /*!< Underflow interrupt */ +#define ETH_DMA_IT_RO ((uint32_t)0x00000010) /*!< Overflow interrupt */ +#define ETH_DMA_IT_TJT ((uint32_t)0x00000008) /*!< Transmit jabber timeout interrupt */ +#define ETH_DMA_IT_TBU ((uint32_t)0x00000004) /*!< Transmit buffer unavailable interrupt */ +#define ETH_DMA_IT_TPS ((uint32_t)0x00000002) /*!< Transmit process stopped interrupt */ +#define ETH_DMA_IT_T ((uint32_t)0x00000001) /*!< Transmit interrupt */ + +#define IS_ETH_DMA_IT(IT) ((((IT) & (uint32_t)0xFFFE1800) == 0x00) && ((IT) != 0x00)) +#define IS_ETH_DMA_GET_IT(IT) (((IT) == ETH_DMA_IT_TST) || ((IT) == ETH_DMA_IT_PMT) || \ + ((IT) == ETH_DMA_IT_MMC) || ((IT) == ETH_DMA_IT_NIS) || \ + ((IT) == ETH_DMA_IT_AIS) || ((IT) == ETH_DMA_IT_ER) || \ + ((IT) == ETH_DMA_IT_FBE) || ((IT) == ETH_DMA_IT_ET) || \ + ((IT) == ETH_DMA_IT_RWT) || ((IT) == ETH_DMA_IT_RPS) || \ + ((IT) == ETH_DMA_IT_RBU) || ((IT) == ETH_DMA_IT_R) || \ + ((IT) == ETH_DMA_IT_TU) || ((IT) == ETH_DMA_IT_RO) || \ + ((IT) == ETH_DMA_IT_TJT) || ((IT) == ETH_DMA_IT_TBU) || \ + ((IT) == ETH_DMA_IT_TPS) || ((IT) == ETH_DMA_IT_T)) + +/** + * @} + */ + +/** @defgroup ETH_DMA_transmit_process_state_ + * @{ + */ +#define ETH_DMA_TransmitProcess_Stopped ((uint32_t)0x00000000) /*!< Stopped - Reset or Stop Tx Command issued */ +#define ETH_DMA_TransmitProcess_Fetching ((uint32_t)0x00100000) /*!< Running - fetching the Tx descriptor */ +#define ETH_DMA_TransmitProcess_Waiting ((uint32_t)0x00200000) /*!< Running - waiting for status */ +#define ETH_DMA_TransmitProcess_Reading ((uint32_t)0x00300000) /*!< Running - reading the data from host memory */ +#define ETH_DMA_TransmitProcess_Suspended ((uint32_t)0x00600000) /*!< Suspended - Tx Desciptor unavailabe */ +#define ETH_DMA_TransmitProcess_Closing ((uint32_t)0x00700000) /*!< Running - closing Rx descriptor */ + +/** + * @} + */ + + +/** @defgroup ETH_DMA_receive_process_state_ + * @{ + */ +#define ETH_DMA_ReceiveProcess_Stopped ((uint32_t)0x00000000) /*!< Stopped - Reset or Stop Rx Command issued */ +#define ETH_DMA_ReceiveProcess_Fetching ((uint32_t)0x00020000) /*!< Running - fetching the Rx descriptor */ +#define ETH_DMA_ReceiveProcess_Waiting ((uint32_t)0x00060000) /*!< Running - waiting for packet */ +#define ETH_DMA_ReceiveProcess_Suspended ((uint32_t)0x00080000) /*!< Suspended - Rx Desciptor unavailable */ +#define ETH_DMA_ReceiveProcess_Closing ((uint32_t)0x000A0000) /*!< Running - closing descriptor */ +#define ETH_DMA_ReceiveProcess_Queuing ((uint32_t)0x000E0000) /*!< Running - queuing the recieve frame into host memory */ + +/** + * @} + */ + +/** @defgroup ETH_DMA_overflow_ + * @{ + */ +#define ETH_DMA_Overflow_RxFIFOCounter ((uint32_t)0x10000000) /*!< Overflow bit for FIFO overflow counter */ +#define ETH_DMA_Overflow_MissedFrameCounter ((uint32_t)0x00010000) /*!< Overflow bit for missed frame counter */ +#define IS_ETH_DMA_GET_OVERFLOW(OVERFLOW) (((OVERFLOW) == ETH_DMA_Overflow_RxFIFOCounter) || \ + ((OVERFLOW) == ETH_DMA_Overflow_MissedFrameCounter)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet PMT defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_PMT_Flags + * @{ + */ +#define ETH_PMT_FLAG_WUFFRPR ((uint32_t)0x80000000) /*!< Wake-Up Frame Filter Register Poniter Reset */ +#define ETH_PMT_FLAG_WUFR ((uint32_t)0x00000040) /*!< Wake-Up Frame Received */ +#define ETH_PMT_FLAG_MPR ((uint32_t)0x00000020) /*!< Magic Packet Received */ +#define IS_ETH_PMT_GET_FLAG(FLAG) (((FLAG) == ETH_PMT_FLAG_WUFR) || \ + ((FLAG) == ETH_PMT_FLAG_MPR)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet MMC defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_MMC_Tx_Interrupts + * @{ + */ +#define ETH_MMC_IT_TGF ((uint32_t)0x00200000) /*!< When Tx good frame counter reaches half the maximum value */ +#define ETH_MMC_IT_TGFMSC ((uint32_t)0x00008000) /*!< When Tx good multi col counter reaches half the maximum value */ +#define ETH_MMC_IT_TGFSC ((uint32_t)0x00004000) /*!< When Tx good single col counter reaches half the maximum value */ + +/** + * @} + */ + +/** @defgroup ETH_MMC_Rx_Interrupts + * @{ + */ +#define ETH_MMC_IT_RGUF ((uint32_t)0x10020000) /*!< When Rx good unicast frames counter reaches half the maximum value */ +#define ETH_MMC_IT_RFAE ((uint32_t)0x10000040) /*!< When Rx alignment error counter reaches half the maximum value */ +#define ETH_MMC_IT_RFCE ((uint32_t)0x10000020) /*!< When Rx crc error counter reaches half the maximum value */ +#define IS_ETH_MMC_IT(IT) (((((IT) & (uint32_t)0xFFDF3FFF) == 0x00) || (((IT) & (uint32_t)0xEFFDFF9F) == 0x00)) && \ + ((IT) != 0x00)) +#define IS_ETH_MMC_GET_IT(IT) (((IT) == ETH_MMC_IT_TGF) || ((IT) == ETH_MMC_IT_TGFMSC) || \ + ((IT) == ETH_MMC_IT_TGFSC) || ((IT) == ETH_MMC_IT_RGUF) || \ + ((IT) == ETH_MMC_IT_RFAE) || ((IT) == ETH_MMC_IT_RFCE)) +/** + * @} + */ + +/** @defgroup ETH_MMC_Registers + * @{ + */ +#define ETH_MMCCR ((uint32_t)0x00000100) /*!< MMC CR register */ +#define ETH_MMCRIR ((uint32_t)0x00000104) /*!< MMC RIR register */ +#define ETH_MMCTIR ((uint32_t)0x00000108) /*!< MMC TIR register */ +#define ETH_MMCRIMR ((uint32_t)0x0000010C) /*!< MMC RIMR register */ +#define ETH_MMCTIMR ((uint32_t)0x00000110) /*!< MMC TIMR register */ +#define ETH_MMCTGFSCCR ((uint32_t)0x0000014C) /*!< MMC TGFSCCR register */ +#define ETH_MMCTGFMSCCR ((uint32_t)0x00000150) /*!< MMC TGFMSCCR register */ +#define ETH_MMCTGFCR ((uint32_t)0x00000168) /*!< MMC TGFCR register */ +#define ETH_MMCRFCECR ((uint32_t)0x00000194) /*!< MMC RFCECR register */ +#define ETH_MMCRFAECR ((uint32_t)0x00000198) /*!< MMC RFAECR register */ +#define ETH_MMCRGUFCR ((uint32_t)0x000001C4) /*!< MMC RGUFCR register */ + +/** + * @brief ETH MMC registers + */ +#define IS_ETH_MMC_REGISTER(REG) (((REG) == ETH_MMCCR) || ((REG) == ETH_MMCRIR) || \ + ((REG) == ETH_MMCTIR) || ((REG) == ETH_MMCRIMR) || \ + ((REG) == ETH_MMCTIMR) || ((REG) == ETH_MMCTGFSCCR) || \ + ((REG) == ETH_MMCTGFMSCCR) || ((REG) == ETH_MMCTGFCR) || \ + ((REG) == ETH_MMCRFCECR) || ((REG) == ETH_MMCRFAECR) || \ + ((REG) == ETH_MMCRGUFCR)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet PTP defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_PTP_time_update_method + * @{ + */ +#define ETH_PTP_FineUpdate ((uint32_t)0x00000001) /*!< Fine Update method */ +#define ETH_PTP_CoarseUpdate ((uint32_t)0x00000000) /*!< Coarse Update method */ +#define IS_ETH_PTP_UPDATE(UPDATE) (((UPDATE) == ETH_PTP_FineUpdate) || \ + ((UPDATE) == ETH_PTP_CoarseUpdate)) + +/** + * @} + */ + + +/** @defgroup ETH_PTP_Flags + * @{ + */ +#define ETH_PTP_FLAG_TSARU ((uint32_t)0x00000020) /*!< Addend Register Update */ +#define ETH_PTP_FLAG_TSITE ((uint32_t)0x00000010) /*!< Time Stamp Interrupt Trigger */ +#define ETH_PTP_FLAG_TSSTU ((uint32_t)0x00000008) /*!< Time Stamp Update */ +#define ETH_PTP_FLAG_TSSTI ((uint32_t)0x00000004) /*!< Time Stamp Initialize */ +#define IS_ETH_PTP_GET_FLAG(FLAG) (((FLAG) == ETH_PTP_FLAG_TSARU) || \ + ((FLAG) == ETH_PTP_FLAG_TSITE) || \ + ((FLAG) == ETH_PTP_FLAG_TSSTU) || \ + ((FLAG) == ETH_PTP_FLAG_TSSTI)) +/** + * @brief ETH PTP subsecond increment + */ +#define IS_ETH_PTP_SUBSECOND_INCREMENT(SUBSECOND) ((SUBSECOND) <= 0xFF) + +/** + * @} + */ + + +/** @defgroup ETH_PTP_time_sign + * @{ + */ +#define ETH_PTP_PositiveTime ((uint32_t)0x00000000) /*!< Positive time value */ +#define ETH_PTP_NegativeTime ((uint32_t)0x80000000) /*!< Negative time value */ +#define IS_ETH_PTP_TIME_SIGN(SIGN) (((SIGN) == ETH_PTP_PositiveTime) || \ + ((SIGN) == ETH_PTP_NegativeTime)) + +/** + * @brief ETH PTP time stamp low update + */ +#define IS_ETH_PTP_TIME_STAMP_UPDATE_SUBSECOND(SUBSECOND) ((SUBSECOND) <= 0x7FFFFFFF) + +/** + * @brief ETH PTP registers + */ +#define ETH_PTPTSCR ((uint32_t)0x00000700) /*!< PTP TSCR register */ +#define ETH_PTPSSIR ((uint32_t)0x00000704) /*!< PTP SSIR register */ +#define ETH_PTPTSHR ((uint32_t)0x00000708) /*!< PTP TSHR register */ +#define ETH_PTPTSLR ((uint32_t)0x0000070C) /*!< PTP TSLR register */ +#define ETH_PTPTSHUR ((uint32_t)0x00000710) /*!< PTP TSHUR register */ +#define ETH_PTPTSLUR ((uint32_t)0x00000714) /*!< PTP TSLUR register */ +#define ETH_PTPTSAR ((uint32_t)0x00000718) /*!< PTP TSAR register */ +#define ETH_PTPTTHR ((uint32_t)0x0000071C) /*!< PTP TTHR register */ +#define ETH_PTPTTLR ((uint32_t)0x00000720) /* PTP TTLR register */ +#define IS_ETH_PTP_REGISTER(REG) (((REG) == ETH_PTPTSCR) || ((REG) == ETH_PTPSSIR) || \ + ((REG) == ETH_PTPTSHR) || ((REG) == ETH_PTPTSLR) || \ + ((REG) == ETH_PTPTSHUR) || ((REG) == ETH_PTPTSLUR) || \ + ((REG) == ETH_PTPTSAR) || ((REG) == ETH_PTPTTHR) || \ + ((REG) == ETH_PTPTTLR)) + +/** + * @} + */ + + +/** + * @} + */ + +/** @defgroup ETH_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup ETH_Exported_Functions + * @{ + */ +void ETH_DeInit(void); +uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, u16 PHYAddress); +void ETH_StructInit(ETH_InitTypeDef* ETH_InitStruct); +void ETH_SoftwareReset(void); +FlagStatus ETH_GetSoftwareResetStatus(void); +void ETH_Start(void); +uint32_t ETH_HandleTxPkt(u8 *ppkt, u16 FrameLength); +uint32_t ETH_HandleRxPkt(u8 *ppkt); +uint32_t ETH_GetRxPktSize(void); +void ETH_DropRxPkt(void); + +/** + * @brief PHY + */ +u16 ETH_ReadPHYRegister(u16 PHYAddress, u16 PHYReg); +uint32_t ETH_WritePHYRegister(u16 PHYAddress, u16 PHYReg, u16 PHYValue); +uint32_t ETH_PHYLoopBackCmd(u16 PHYAddress, FunctionalState NewState); + +/** + * @brief MAC + */ +void ETH_MACTransmissionCmd(FunctionalState NewState); +void ETH_MACReceptionCmd(FunctionalState NewState); +FlagStatus ETH_GetFlowControlBusyStatus(void); +void ETH_InitiatePauseControlFrame(void); +void ETH_BackPressureActivationCmd(FunctionalState NewState); +FlagStatus ETH_GetMACFlagStatus(uint32_t ETH_MAC_FLAG); +ITStatus ETH_GetMACITStatus(uint32_t ETH_MAC_IT); +void ETH_MACITConfig(uint32_t ETH_MAC_IT, FunctionalState NewState); +void ETH_MACAddressConfig(uint32_t MacAddr, u8 *Addr); +void ETH_GetMACAddress(uint32_t MacAddr, u8 *Addr); +void ETH_MACAddressPerfectFilterCmd(uint32_t MacAddr, FunctionalState NewState); +void ETH_MACAddressFilterConfig(uint32_t MacAddr, uint32_t Filter); +void ETH_MACAddressMaskBytesFilterConfig(uint32_t MacAddr, uint32_t MaskByte); + +/** + * @brief DMA Tx/Rx descriptors + */ +void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, u8 *TxBuff, uint32_t TxBuffCount); +void ETH_DMATxDescRingInit(ETH_DMADESCTypeDef *DMATxDescTab, u8 *TxBuff1, u8 *TxBuff2, uint32_t TxBuffCount); +FlagStatus ETH_GetDMATxDescFlagStatus(ETH_DMADESCTypeDef *DMATxDesc, uint32_t ETH_DMATxDescFlag); +uint32_t ETH_GetDMATxDescCollisionCount(ETH_DMADESCTypeDef *DMATxDesc); +void ETH_SetDMATxDescOwnBit(ETH_DMADESCTypeDef *DMATxDesc); +void ETH_DMATxDescTransmitITConfig(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescFrameSegmentConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_FrameSegment); +void ETH_DMATxDescChecksumInsertionConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_Checksum); +void ETH_DMATxDescCRCCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescShortFramePaddingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescTimeStampCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescBufferSizeConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t BufferSize1, uint32_t BufferSize2); +void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, u8 *RxBuff, uint32_t RxBuffCount); +void ETH_DMARxDescRingInit(ETH_DMADESCTypeDef *DMARxDescTab, u8 *RxBuff1, u8 *RxBuff2, uint32_t RxBuffCount); +FlagStatus ETH_GetDMARxDescFlagStatus(ETH_DMADESCTypeDef *DMARxDesc, uint32_t ETH_DMARxDescFlag); +void ETH_SetDMARxDescOwnBit(ETH_DMADESCTypeDef *DMARxDesc); +uint32_t ETH_GetDMARxDescFrameLength(ETH_DMADESCTypeDef *DMARxDesc); +void ETH_DMARxDescReceiveITConfig(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState); +void ETH_DMARxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState); +void ETH_DMARxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState); +uint32_t ETH_GetDMARxDescBufferSize(ETH_DMADESCTypeDef *DMARxDesc, uint32_t DMARxDesc_Buffer); + +/** + * @brief DMA + */ +FlagStatus ETH_GetDMAFlagStatus(uint32_t ETH_DMA_FLAG); +void ETH_DMAClearFlag(uint32_t ETH_DMA_FLAG); +ITStatus ETH_GetDMAITStatus(uint32_t ETH_DMA_IT); +void ETH_DMAClearITPendingBit(uint32_t ETH_DMA_IT); +uint32_t ETH_GetTransmitProcessState(void); +uint32_t ETH_GetReceiveProcessState(void); +void ETH_FlushTransmitFIFO(void); +FlagStatus ETH_GetFlushTransmitFIFOStatus(void); +void ETH_DMATransmissionCmd(FunctionalState NewState); +void ETH_DMAReceptionCmd(FunctionalState NewState); +void ETH_DMAITConfig(uint32_t ETH_DMA_IT, FunctionalState NewState); +FlagStatus ETH_GetDMAOverflowStatus(uint32_t ETH_DMA_Overflow); +uint32_t ETH_GetRxOverflowMissedFrameCounter(void); +uint32_t ETH_GetBufferUnavailableMissedFrameCounter(void); +uint32_t ETH_GetCurrentTxDescStartAddress(void); +uint32_t ETH_GetCurrentRxDescStartAddress(void); +uint32_t ETH_GetCurrentTxBufferAddress(void); +uint32_t ETH_GetCurrentRxBufferAddress(void); +void ETH_ResumeDMATransmission(void); +void ETH_ResumeDMAReception(void); + +/** + * @brief PMT + */ +void ETH_ResetWakeUpFrameFilterRegisterPointer(void); +void ETH_SetWakeUpFrameFilterRegister(uint32_t *Buffer); +void ETH_GlobalUnicastWakeUpCmd(FunctionalState NewState); +FlagStatus ETH_GetPMTFlagStatus(uint32_t ETH_PMT_FLAG); +void ETH_WakeUpFrameDetectionCmd(FunctionalState NewState); +void ETH_MagicPacketDetectionCmd(FunctionalState NewState); +void ETH_PowerDownCmd(FunctionalState NewState); + +/** + * @brief MMC + */ +void ETH_MMCCounterFreezeCmd(FunctionalState NewState); +void ETH_MMCResetOnReadCmd(FunctionalState NewState); +void ETH_MMCCounterRolloverCmd(FunctionalState NewState); +void ETH_MMCCountersReset(void); +void ETH_MMCITConfig(uint32_t ETH_MMC_IT, FunctionalState NewState); +ITStatus ETH_GetMMCITStatus(uint32_t ETH_MMC_IT); +uint32_t ETH_GetMMCRegister(uint32_t ETH_MMCReg); + +/** + * @brief PTP + */ +uint32_t ETH_HandlePTPTxPkt(u8 *ppkt, u16 FrameLength, uint32_t *PTPTxTab); +uint32_t ETH_HandlePTPRxPkt(u8 *ppkt, uint32_t *PTPRxTab); +void ETH_DMAPTPTxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, ETH_DMADESCTypeDef *DMAPTPTxDescTab, u8* TxBuff, uint32_t TxBuffCount); +void ETH_DMAPTPRxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, ETH_DMADESCTypeDef *DMAPTPRxDescTab, u8 *RxBuff, uint32_t RxBuffCount); +void ETH_EnablePTPTimeStampAddend(void); +void ETH_EnablePTPTimeStampInterruptTrigger(void); +void ETH_EnablePTPTimeStampUpdate(void); +void ETH_InitializePTPTimeStamp(void); +void ETH_PTPUpdateMethodConfig(uint32_t UpdateMethod); +void ETH_PTPTimeStampCmd(FunctionalState NewState); +FlagStatus ETH_GetPTPFlagStatus(uint32_t ETH_PTP_FLAG); +void ETH_SetPTPSubSecondIncrement(uint32_t SubSecondValue); +void ETH_SetPTPTimeStampUpdate(uint32_t Sign, uint32_t SecondValue, uint32_t SubSecondValue); +void ETH_SetPTPTimeStampAddend(uint32_t Value); +void ETH_SetPTPTargetTime(uint32_t HighValue, uint32_t LowValue); +uint32_t ETH_GetPTPRegister(uint32_t ETH_PTPReg); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32_ETH_H */ +/** + * @} + */ + + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/ethernetlib/src/stm32_eth.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/ethernetlib/src/stm32_eth.c new file mode 100644 index 00000000..119b4dbf --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/ethernetlib/src/stm32_eth.c @@ -0,0 +1,3056 @@ +/** + ****************************************************************************** + * @file stm32_eth.c + * @author MCD Application Team + * @version V1.0.0 + * @date 06/19/2009 + * @brief This file provides all the ETH firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32_eth.h" +#include "stm32f4xx_rcc.h" + +/** @addtogroup STM32_ETH_Driver + * @brief ETH driver modules + * @{ + */ + +/** @defgroup ETH_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup ETH_Private_Defines + * @{ + */ +/* Global pointers on Tx and Rx descriptor used to track transmit and receive descriptors */ +ETH_DMADESCTypeDef *DMATxDescToSet; +ETH_DMADESCTypeDef *DMARxDescToGet; +ETH_DMADESCTypeDef *DMAPTPTxDescToSet; +ETH_DMADESCTypeDef *DMAPTPRxDescToGet; + +/* ETHERNET MAC address offsets */ +#define ETH_MAC_AddrHighBase (ETH_MAC_BASE + 0x40) /* ETHERNET MAC address high offset */ +#define ETH_MAC_AddrLowBase (ETH_MAC_BASE + 0x44) /* ETHERNET MAC address low offset */ +/* ETHERNET MACMIIAR register Mask */ +#define MACMIIAR_CR_Mask ((uint32_t)0xFFFFFFE3) +/* ETHERNET MACCR register Mask */ +#define MACCR_CLEAR_Mask ((uint32_t)0xFF20810F) +/* ETHERNET MACFCR register Mask */ +#define MACFCR_CLEAR_Mask ((uint32_t)0x0000FF41) +/* ETHERNET DMAOMR register Mask */ +#define DMAOMR_CLEAR_Mask ((uint32_t)0xF8DE3F23) +/* ETHERNET Remote Wake-up frame register length */ +#define ETH_WakeupRegisterLength 8 +/* ETHERNET Missed frames counter Shift */ +#define ETH_DMA_RxOverflowMissedFramesCounterShift 17 +/* ETHERNET DMA Tx descriptors Collision Count Shift */ +#define ETH_DMATxDesc_CollisionCountShift 3 +/* ETHERNET DMA Tx descriptors Buffer2 Size Shift */ +#define ETH_DMATxDesc_BufferSize2Shift 16 +/* ETHERNET DMA Rx descriptors Frame Length Shift */ +#define ETH_DMARxDesc_FrameLengthShift 16 +/* ETHERNET DMA Rx descriptors Buffer2 Size Shift */ +#define ETH_DMARxDesc_Buffer2SizeShift 16 +/* ETHERNET errors */ +#define ETH_ERROR ((uint32_t)0) +#define ETH_SUCCESS ((uint32_t)1) +/** + * @} + */ + +/** @defgroup ETH_Private_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup ETH_Private_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup ETH_Private_FunctionPrototypes + * @{ + */ +/** + * @} + */ + +/** @defgroup ETH_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the ETHERNET peripheral registers to their + * default reset values. + * @param None + * @retval : None + */ +void ETH_DeInit(void) +{ + RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, ENABLE); + RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, DISABLE); +} + +/** + * @brief Initializes the ETHERNET peripheral according to the specified + * parameters in the ETH_InitStruct . + * @param ETH_InitStruct: pointer to a ETH_InitTypeDef structure + * that contains the configuration information for the + * specified ETHERNET peripheral. + * @param PHYAddress: external PHY address + * @retval : ETH_ERROR: Ethernet initialization failed + * ETH_SUCCESS: Ethernet successfully initialized + */ +uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, uint16_t PHYAddress) +{ + uint32_t RegValue = 0, tmpreg = 0; + __IO uint32_t i = 0; + RCC_ClocksTypeDef rcc_clocks; + uint32_t hclk = 120000000; + __IO uint32_t timeout = 0; + /* Check the parameters */ + /* MAC --------------------------*/ + assert_param(IS_ETH_AUTONEGOTIATION(ETH_InitStruct->ETH_AutoNegotiation)); + assert_param(IS_ETH_WATCHDOG(ETH_InitStruct->ETH_Watchdog)); + assert_param(IS_ETH_JABBER(ETH_InitStruct->ETH_Jabber)); + assert_param(IS_ETH_INTER_FRAME_GAP(ETH_InitStruct->ETH_InterFrameGap)); + assert_param(IS_ETH_CARRIER_SENSE(ETH_InitStruct->ETH_CarrierSense)); + assert_param(IS_ETH_SPEED(ETH_InitStruct->ETH_Speed)); + assert_param(IS_ETH_RECEIVE_OWN(ETH_InitStruct->ETH_ReceiveOwn)); + assert_param(IS_ETH_LOOPBACK_MODE(ETH_InitStruct->ETH_LoopbackMode)); + assert_param(IS_ETH_DUPLEX_MODE(ETH_InitStruct->ETH_Mode)); + assert_param(IS_ETH_CHECKSUM_OFFLOAD(ETH_InitStruct->ETH_ChecksumOffload)); + assert_param(IS_ETH_RETRY_TRANSMISSION(ETH_InitStruct->ETH_RetryTransmission)); + assert_param(IS_ETH_AUTOMATIC_PADCRC_STRIP(ETH_InitStruct->ETH_AutomaticPadCRCStrip)); + assert_param(IS_ETH_BACKOFF_LIMIT(ETH_InitStruct->ETH_BackOffLimit)); + assert_param(IS_ETH_DEFERRAL_CHECK(ETH_InitStruct->ETH_DeferralCheck)); + assert_param(IS_ETH_RECEIVE_ALL(ETH_InitStruct->ETH_ReceiveAll)); + assert_param(IS_ETH_SOURCE_ADDR_FILTER(ETH_InitStruct->ETH_SourceAddrFilter)); + assert_param(IS_ETH_CONTROL_FRAMES(ETH_InitStruct->ETH_PassControlFrames)); + assert_param(IS_ETH_BROADCAST_FRAMES_RECEPTION(ETH_InitStruct->ETH_BroadcastFramesReception)); + assert_param(IS_ETH_DESTINATION_ADDR_FILTER(ETH_InitStruct->ETH_DestinationAddrFilter)); + assert_param(IS_ETH_PROMISCUOUS_MODE(ETH_InitStruct->ETH_PromiscuousMode)); + assert_param(IS_ETH_MULTICAST_FRAMES_FILTER(ETH_InitStruct->ETH_MulticastFramesFilter)); + assert_param(IS_ETH_UNICAST_FRAMES_FILTER(ETH_InitStruct->ETH_UnicastFramesFilter)); + assert_param(IS_ETH_PAUSE_TIME(ETH_InitStruct->ETH_PauseTime)); + assert_param(IS_ETH_ZEROQUANTA_PAUSE(ETH_InitStruct->ETH_ZeroQuantaPause)); + assert_param(IS_ETH_PAUSE_LOW_THRESHOLD(ETH_InitStruct->ETH_PauseLowThreshold)); + assert_param(IS_ETH_UNICAST_PAUSE_FRAME_DETECT(ETH_InitStruct->ETH_UnicastPauseFrameDetect)); + assert_param(IS_ETH_RECEIVE_FLOWCONTROL(ETH_InitStruct->ETH_ReceiveFlowControl)); + assert_param(IS_ETH_TRANSMIT_FLOWCONTROL(ETH_InitStruct->ETH_TransmitFlowControl)); + assert_param(IS_ETH_VLAN_TAG_COMPARISON(ETH_InitStruct->ETH_VLANTagComparison)); + assert_param(IS_ETH_VLAN_TAG_IDENTIFIER(ETH_InitStruct->ETH_VLANTagIdentifier)); + /* DMA --------------------------*/ + assert_param(IS_ETH_DROP_TCPIP_CHECKSUM_FRAME(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame)); + assert_param(IS_ETH_RECEIVE_STORE_FORWARD(ETH_InitStruct->ETH_ReceiveStoreForward)); + assert_param(IS_ETH_FLUSH_RECEIVE_FRAME(ETH_InitStruct->ETH_FlushReceivedFrame)); + assert_param(IS_ETH_TRANSMIT_STORE_FORWARD(ETH_InitStruct->ETH_TransmitStoreForward)); + assert_param(IS_ETH_TRANSMIT_THRESHOLD_CONTROL(ETH_InitStruct->ETH_TransmitThresholdControl)); + assert_param(IS_ETH_FORWARD_ERROR_FRAMES(ETH_InitStruct->ETH_ForwardErrorFrames)); + assert_param(IS_ETH_FORWARD_UNDERSIZED_GOOD_FRAMES(ETH_InitStruct->ETH_ForwardUndersizedGoodFrames)); + assert_param(IS_ETH_RECEIVE_THRESHOLD_CONTROL(ETH_InitStruct->ETH_ReceiveThresholdControl)); + assert_param(IS_ETH_SECOND_FRAME_OPERATE(ETH_InitStruct->ETH_SecondFrameOperate)); + assert_param(IS_ETH_ADDRESS_ALIGNED_BEATS(ETH_InitStruct->ETH_AddressAlignedBeats)); + assert_param(IS_ETH_FIXED_BURST(ETH_InitStruct->ETH_FixedBurst)); + assert_param(IS_ETH_RXDMA_BURST_LENGTH(ETH_InitStruct->ETH_RxDMABurstLength)); + assert_param(IS_ETH_TXDMA_BURST_LENGTH(ETH_InitStruct->ETH_TxDMABurstLength)); + assert_param(IS_ETH_DMA_DESC_SKIP_LENGTH(ETH_InitStruct->ETH_DescriptorSkipLength)); + assert_param(IS_ETH_DMA_ARBITRATION_ROUNDROBIN_RXTX(ETH_InitStruct->ETH_DMAArbitration)); + /*-------------------------------- MAC Config ------------------------------*/ + /*---------------------- ETHERNET MACMIIAR Configuration -------------------*/ + /* Get the ETHERNET MACMIIAR value */ + tmpreg = ETH->MACMIIAR; + /* Clear CSR Clock Range CR[2:0] bits */ + tmpreg &= MACMIIAR_CR_Mask; + /* Get hclk frequency value */ + RCC_GetClocksFreq(&rcc_clocks); + hclk = rcc_clocks.HCLK_Frequency; + /* Set CR bits depending on hclk value */ + if((hclk >= 20000000)&&(hclk < 35000000)) + { + /* CSR Clock Range between 20-35 MHz */ + tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div16; + } + else if((hclk >= 35000000)&&(hclk < 60000000)) + { + /* CSR Clock Range between 35-60 MHz */ + tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div26; + } + else if((hclk >= 60000000)&&(hclk <= 100000000)) + { + /* CSR Clock Range between 60-100 MHz */ + tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div42; + } + else /*if((hclk >= 100000000)&&(hclk <= 120000000)) */ + { + /* CSR Clock Range between 100-120 MHz */ + tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div62; + } + /* Write to ETHERNET MAC MIIAR: Configure the ETHERNET CSR Clock Range */ + ETH->MACMIIAR = (uint32_t)tmpreg; + /*-------------------- PHY initialization and configuration ----------------*/ + /* Put the PHY in reset mode */ + if(!(ETH_WritePHYRegister(PHYAddress, PHY_BCR, PHY_Reset))) + { + /* Return ERROR in case of write timeout */ + return ETH_ERROR; + } + + /* Delay to assure PHY reset */ + for(i = PHY_ResetDelay; i != 0; i--) + { + } + + if(ETH_InitStruct->ETH_AutoNegotiation != ETH_AutoNegotiation_Disable) + { + /* We wait for linked satus... */ + do + { + timeout++; + } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_READ_TO) + { + return ETH_ERROR; + } + /* Reset Timeout counter */ + timeout = 0; + + /* Enable Auto-Negotiation */ + if(!(ETH_WritePHYRegister(PHYAddress, PHY_BCR, PHY_AutoNegotiation))) + { + /* Return ERROR in case of write timeout */ + return ETH_ERROR; + } + + /* Wait until the autonegotiation will be completed */ + do + { + timeout++; + } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_READ_TO) + { + return ETH_ERROR; + } + /* Reset Timeout counter */ + timeout = 0; + + /* Read the result of the autonegotiation */ + RegValue = ETH_ReadPHYRegister(PHYAddress, PHY_SR); + + /* Configure the MAC with the Duplex Mode fixed by the autonegotiation process */ + if((RegValue & PHY_Duplex_Status) != (uint32_t)RESET) + { + /* Set Ethernet duplex mode to FullDuplex following the autonegotiation */ + ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex; + + } + else + { + /* Set Ethernet duplex mode to HalfDuplex following the autonegotiation */ + ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex; + } + /* Configure the MAC with the speed fixed by the autonegotiation process */ + if(RegValue & PHY_Speed_Status) + { + /* Set Ethernet speed to 10M following the autonegotiation */ + ETH_InitStruct->ETH_Speed = ETH_Speed_10M; + } + else + { + /* Set Ethernet speed to 100M following the autonegotiation */ + ETH_InitStruct->ETH_Speed = ETH_Speed_100M; + } + } + else + { + if(!ETH_WritePHYRegister(PHYAddress, PHY_BCR, ((uint16_t)(ETH_InitStruct->ETH_Mode >> 3) | + (uint16_t)(ETH_InitStruct->ETH_Speed >> 1)))) + { + /* Return ERROR in case of write timeout */ + return ETH_ERROR; + } + /* Delay to assure PHY configuration */ + for(i = PHY_ConfigDelay; i != 0; i--) + { + } + } + /*------------------------ ETHERNET MACCR Configuration --------------------*/ + /* Get the ETHERNET MACCR value */ + tmpreg = ETH->MACCR; + /* Clear WD, PCE, PS, TE and RE bits */ + tmpreg &= MACCR_CLEAR_Mask; + /* Set the WD bit according to ETH_Watchdog value */ + /* Set the JD: bit according to ETH_Jabber value */ + /* Set the IFG bit according to ETH_InterFrameGap value */ + /* Set the DCRS bit according to ETH_CarrierSense value */ + /* Set the FES bit according to ETH_Speed value */ + /* Set the DO bit according to ETH_ReceiveOwn value */ + /* Set the LM bit according to ETH_LoopbackMode value */ + /* Set the DM bit according to ETH_Mode value */ + /* Set the IPC bit according to ETH_ChecksumOffload value */ + /* Set the DR bit according to ETH_RetryTransmission value */ + /* Set the ACS bit according to ETH_AutomaticPadCRCStrip value */ + /* Set the BL bit according to ETH_BackOffLimit value */ + /* Set the DC bit according to ETH_DeferralCheck value */ + tmpreg |= (uint32_t)(ETH_InitStruct->ETH_Watchdog | + ETH_InitStruct->ETH_Jabber | + ETH_InitStruct->ETH_InterFrameGap | + ETH_InitStruct->ETH_CarrierSense | + ETH_InitStruct->ETH_Speed | + ETH_InitStruct->ETH_ReceiveOwn | + ETH_InitStruct->ETH_LoopbackMode | + ETH_InitStruct->ETH_Mode | + ETH_InitStruct->ETH_ChecksumOffload | + ETH_InitStruct->ETH_RetryTransmission | + ETH_InitStruct->ETH_AutomaticPadCRCStrip | + ETH_InitStruct->ETH_BackOffLimit | + ETH_InitStruct->ETH_DeferralCheck); + /* Write to ETHERNET MACCR */ + ETH->MACCR = (uint32_t)tmpreg; + + /*----------------------- ETHERNET MACFFR Configuration --------------------*/ + /* Set the RA bit according to ETH_ReceiveAll value */ + /* Set the SAF and SAIF bits according to ETH_SourceAddrFilter value */ + /* Set the PCF bit according to ETH_PassControlFrames value */ + /* Set the DBF bit according to ETH_BroadcastFramesReception value */ + /* Set the DAIF bit according to ETH_DestinationAddrFilter value */ + /* Set the PR bit according to ETH_PromiscuousMode value */ + /* Set the PM, HMC and HPF bits according to ETH_MulticastFramesFilter value */ + /* Set the HUC and HPF bits according to ETH_UnicastFramesFilter value */ + /* Write to ETHERNET MACFFR */ + ETH->MACFFR = (uint32_t)(ETH_InitStruct->ETH_ReceiveAll | + ETH_InitStruct->ETH_SourceAddrFilter | + ETH_InitStruct->ETH_PassControlFrames | + ETH_InitStruct->ETH_BroadcastFramesReception | + ETH_InitStruct->ETH_DestinationAddrFilter | + ETH_InitStruct->ETH_PromiscuousMode | + ETH_InitStruct->ETH_MulticastFramesFilter | + ETH_InitStruct->ETH_UnicastFramesFilter); + /*--------------- ETHERNET MACHTHR and MACHTLR Configuration ---------------*/ + /* Write to ETHERNET MACHTHR */ + ETH->MACHTHR = (uint32_t)ETH_InitStruct->ETH_HashTableHigh; + /* Write to ETHERNET MACHTLR */ + ETH->MACHTLR = (uint32_t)ETH_InitStruct->ETH_HashTableLow; + /*----------------------- ETHERNET MACFCR Configuration --------------------*/ + /* Get the ETHERNET MACFCR value */ + tmpreg = ETH->MACFCR; + /* Clear xx bits */ + tmpreg &= MACFCR_CLEAR_Mask; + + /* Set the PT bit according to ETH_PauseTime value */ + /* Set the DZPQ bit according to ETH_ZeroQuantaPause value */ + /* Set the PLT bit according to ETH_PauseLowThreshold value */ + /* Set the UP bit according to ETH_UnicastPauseFrameDetect value */ + /* Set the RFE bit according to ETH_ReceiveFlowControl value */ + /* Set the TFE bit according to ETH_TransmitFlowControl value */ + tmpreg |= (uint32_t)((ETH_InitStruct->ETH_PauseTime << 16) | + ETH_InitStruct->ETH_ZeroQuantaPause | + ETH_InitStruct->ETH_PauseLowThreshold | + ETH_InitStruct->ETH_UnicastPauseFrameDetect | + ETH_InitStruct->ETH_ReceiveFlowControl | + ETH_InitStruct->ETH_TransmitFlowControl); + /* Write to ETHERNET MACFCR */ + ETH->MACFCR = (uint32_t)tmpreg; + /*----------------------- ETHERNET MACVLANTR Configuration -----------------*/ + /* Set the ETV bit according to ETH_VLANTagComparison value */ + /* Set the VL bit according to ETH_VLANTagIdentifier value */ + ETH->MACVLANTR = (uint32_t)(ETH_InitStruct->ETH_VLANTagComparison | + ETH_InitStruct->ETH_VLANTagIdentifier); + + /*-------------------------------- DMA Config ------------------------------*/ + /*----------------------- ETHERNET DMAOMR Configuration --------------------*/ + /* Get the ETHERNET DMAOMR value */ + tmpreg = ETH->DMAOMR; + /* Clear xx bits */ + tmpreg &= DMAOMR_CLEAR_Mask; + + /* Set the DT bit according to ETH_DropTCPIPChecksumErrorFrame value */ + /* Set the RSF bit according to ETH_ReceiveStoreForward value */ + /* Set the DFF bit according to ETH_FlushReceivedFrame value */ + /* Set the TSF bit according to ETH_TransmitStoreForward value */ + /* Set the TTC bit according to ETH_TransmitThresholdControl value */ + /* Set the FEF bit according to ETH_ForwardErrorFrames value */ + /* Set the FUF bit according to ETH_ForwardUndersizedGoodFrames value */ + /* Set the RTC bit according to ETH_ReceiveThresholdControl value */ + /* Set the OSF bit according to ETH_SecondFrameOperate value */ + tmpreg |= (uint32_t)(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame | + ETH_InitStruct->ETH_ReceiveStoreForward | + ETH_InitStruct->ETH_FlushReceivedFrame | + ETH_InitStruct->ETH_TransmitStoreForward | + ETH_InitStruct->ETH_TransmitThresholdControl | + ETH_InitStruct->ETH_ForwardErrorFrames | + ETH_InitStruct->ETH_ForwardUndersizedGoodFrames | + ETH_InitStruct->ETH_ReceiveThresholdControl | + ETH_InitStruct->ETH_SecondFrameOperate); + /* Write to ETHERNET DMAOMR */ + ETH->DMAOMR = (uint32_t)tmpreg; + + /*----------------------- ETHERNET DMABMR Configuration --------------------*/ + /* Set the AAL bit according to ETH_AddressAlignedBeats value */ + /* Set the FB bit according to ETH_FixedBurst value */ + /* Set the RPBL and 4*PBL bits according to ETH_RxDMABurstLength value */ + /* Set the PBL and 4*PBL bits according to ETH_TxDMABurstLength value */ + /* Set the DSL bit according to ETH_DesciptorSkipLength value */ + /* Set the PR and DA bits according to ETH_DMAArbitration value */ + ETH->DMABMR = (uint32_t)(ETH_InitStruct->ETH_AddressAlignedBeats | + ETH_InitStruct->ETH_FixedBurst | + ETH_InitStruct->ETH_RxDMABurstLength | /* !! if 4xPBL is selected for Tx or Rx it is applied for the other */ + ETH_InitStruct->ETH_TxDMABurstLength | + (ETH_InitStruct->ETH_DescriptorSkipLength << 2) | + ETH_InitStruct->ETH_DMAArbitration | + ETH_DMABMR_USP); /* Enable use of separate PBL for Rx and Tx */ + /* Return Ethernet configuration success */ + return ETH_SUCCESS; +} + +/** + * @brief Fills each ETH_InitStruct member with its default value. + * @param ETH_InitStruct: pointer to a ETH_InitTypeDef structure + * which will be initialized. + * @retval : None + */ +void ETH_StructInit(ETH_InitTypeDef* ETH_InitStruct) +{ + /* ETH_InitStruct members default value */ + /*------------------------ MAC -----------------------------------*/ + ETH_InitStruct->ETH_AutoNegotiation = ETH_AutoNegotiation_Disable; + ETH_InitStruct->ETH_Watchdog = ETH_Watchdog_Enable; + ETH_InitStruct->ETH_Jabber = ETH_Jabber_Enable; + ETH_InitStruct->ETH_InterFrameGap = ETH_InterFrameGap_96Bit; + ETH_InitStruct->ETH_CarrierSense = ETH_CarrierSense_Enable; + ETH_InitStruct->ETH_Speed = ETH_Speed_10M; + ETH_InitStruct->ETH_ReceiveOwn = ETH_ReceiveOwn_Enable; + ETH_InitStruct->ETH_LoopbackMode = ETH_LoopbackMode_Disable; + ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex; + ETH_InitStruct->ETH_ChecksumOffload = ETH_ChecksumOffload_Disable; + ETH_InitStruct->ETH_RetryTransmission = ETH_RetryTransmission_Enable; + ETH_InitStruct->ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable; + ETH_InitStruct->ETH_BackOffLimit = ETH_BackOffLimit_10; + ETH_InitStruct->ETH_DeferralCheck = ETH_DeferralCheck_Disable; + ETH_InitStruct->ETH_ReceiveAll = ETH_ReceiveAll_Disable; + ETH_InitStruct->ETH_SourceAddrFilter = ETH_SourceAddrFilter_Disable; + ETH_InitStruct->ETH_PassControlFrames = ETH_PassControlFrames_BlockAll; + ETH_InitStruct->ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable; + ETH_InitStruct->ETH_DestinationAddrFilter = ETH_DestinationAddrFilter_Normal; + ETH_InitStruct->ETH_PromiscuousMode = ETH_PromiscuousMode_Disable; + ETH_InitStruct->ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect; + ETH_InitStruct->ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect; + ETH_InitStruct->ETH_HashTableHigh = 0x0; + ETH_InitStruct->ETH_HashTableLow = 0x0; + ETH_InitStruct->ETH_PauseTime = 0x0; + ETH_InitStruct->ETH_ZeroQuantaPause = ETH_ZeroQuantaPause_Disable; + ETH_InitStruct->ETH_PauseLowThreshold = ETH_PauseLowThreshold_Minus4; + ETH_InitStruct->ETH_UnicastPauseFrameDetect = ETH_UnicastPauseFrameDetect_Disable; + ETH_InitStruct->ETH_ReceiveFlowControl = ETH_ReceiveFlowControl_Disable; + ETH_InitStruct->ETH_TransmitFlowControl = ETH_TransmitFlowControl_Disable; + ETH_InitStruct->ETH_VLANTagComparison = ETH_VLANTagComparison_16Bit; + ETH_InitStruct->ETH_VLANTagIdentifier = 0x0; + /*------------------------ DMA -----------------------------------*/ + ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable; + ETH_InitStruct->ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable; + ETH_InitStruct->ETH_FlushReceivedFrame = ETH_FlushReceivedFrame_Disable; + ETH_InitStruct->ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable; + ETH_InitStruct->ETH_TransmitThresholdControl = ETH_TransmitThresholdControl_64Bytes; + ETH_InitStruct->ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable; + ETH_InitStruct->ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable; + ETH_InitStruct->ETH_ReceiveThresholdControl = ETH_ReceiveThresholdControl_64Bytes; + ETH_InitStruct->ETH_SecondFrameOperate = ETH_SecondFrameOperate_Disable; + ETH_InitStruct->ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable; + ETH_InitStruct->ETH_FixedBurst = ETH_FixedBurst_Disable; + ETH_InitStruct->ETH_RxDMABurstLength = ETH_RxDMABurstLength_1Beat; + ETH_InitStruct->ETH_TxDMABurstLength = ETH_TxDMABurstLength_1Beat; + ETH_InitStruct->ETH_DescriptorSkipLength = 0x0; + ETH_InitStruct->ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_1_1; +} + +/** + * @brief Enables ENET MAC and DMA reception/transmission + * @param None + * @retval : None + */ +void ETH_Start(void) +{ + /* Enable transmit state machine of the MAC for transmission on the MII */ + ETH_MACTransmissionCmd(ENABLE); + /* Flush Transmit FIFO */ + ETH_FlushTransmitFIFO(); + /* Enable receive state machine of the MAC for reception from the MII */ + ETH_MACReceptionCmd(ENABLE); + + /* Start DMA transmission */ + ETH_DMATransmissionCmd(ENABLE); + /* Start DMA reception */ + ETH_DMAReceptionCmd(ENABLE); +} + +/** + * @brief Transmits a packet, from application buffer, pointed by ppkt. + * @param ppkt: pointer to application packet buffer to transmit. + * @param FrameLength: Tx Packet size. + * @retval : ETH_ERROR: in case of Tx desc owned by DMA + * ETH_SUCCESS: for correct transmission + */ +uint32_t ETH_HandleTxPkt(uint8_t *ppkt, uint16_t FrameLength) +{ + uint32_t offset = 0; + + /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */ + if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (uint32_t)RESET) + { + /* Return ERROR: OWN bit set */ + return ETH_ERROR; + } + + /* Copy the frame to be sent into memory pointed by the current ETHERNET DMA Tx descriptor */ + for(offset=0; offsetBuffer1Addr) + offset)) = (*(ppkt + offset)); + } + + /* Setting the Frame Length: bits[12:0] */ + DMATxDescToSet->ControlBufferSize = (FrameLength & ETH_DMATxDesc_TBS1); + /* Setting the last segment and first segment bits (in this case a frame is transmitted in one descriptor) */ + DMATxDescToSet->Status |= ETH_DMATxDesc_LS | ETH_DMATxDesc_FS; + /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMATxDescToSet->Status |= ETH_DMATxDesc_OWN; + /* When Tx Buffer unavailable flag is set: clear it and resume transmission */ + if ((ETH->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET) + { + /* Clear TBUS ETHERNET DMA flag */ + ETH->DMASR = ETH_DMASR_TBUS; + /* Resume DMA transmission*/ + ETH->DMATPDR = 0; + } + + /* Update the ETHERNET DMA global Tx descriptor with next Tx decriptor */ + /* Chained Mode */ + if((DMATxDescToSet->Status & ETH_DMATxDesc_TCH) != (uint32_t)RESET) + { + /* Selects the next DMA Tx descriptor list for next buffer to send */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) (DMATxDescToSet->Buffer2NextDescAddr); + } + else /* Ring Mode */ + { + if((DMATxDescToSet->Status & ETH_DMATxDesc_TER) != (uint32_t)RESET) + { + /* Selects the first DMA Tx descriptor for next buffer to send: last Tx descriptor was used */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) (ETH->DMATDLAR); + } + else + { + /* Selects the next DMA Tx descriptor list for next buffer to send */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) ((uint32_t)DMATxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** + * @brief Receives a packet and copies it to memory pointed by ppkt. + * @param ppkt: pointer to application packet receive buffer. + * @retval : ETH_ERROR: if there is error in reception + * framelength: received packet size if packet reception is correct + */ +uint32_t ETH_HandleRxPkt(uint8_t *ppkt) +{ + uint32_t offset = 0, framelength = 0; + /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */ + if((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) != (uint32_t)RESET) + { + /* Return error: OWN bit set */ + return ETH_ERROR; + } + + if(((DMARxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)) + { + /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */ + framelength = ((DMARxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARxDesc_FrameLengthShift) - 4; + /* Copy the received frame into buffer from memory pointed by the current ETHERNET DMA Rx descriptor */ + for(offset=0; offsetBuffer1Addr) + offset)); + } + } + else + { + /* Return ERROR */ + framelength = ETH_ERROR; + } + /* Set Own bit of the Rx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMARxDescToGet->Status = ETH_DMARxDesc_OWN; + + /* When Rx Buffer unavailable flag is set: clear it and resume reception */ + if ((ETH->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET) + { + /* Clear RBUS ETHERNET DMA flag */ + ETH->DMASR = ETH_DMASR_RBUS; + /* Resume DMA reception */ + ETH->DMARPDR = 0; + } + + /* Update the ETHERNET DMA global Rx descriptor with next Rx decriptor */ + /* Chained Mode */ + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RCH) != (uint32_t)RESET) + { + /* Selects the next DMA Rx descriptor list for next buffer to read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr); + } + else /* Ring Mode */ + { + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RER) != (uint32_t)RESET) + { + /* Selects the first DMA Rx descriptor for next buffer to read: last Rx descriptor was used */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (ETH->DMARDLAR); + } + else + { + /* Selects the next DMA Rx descriptor list for next buffer to read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) ((uint32_t)DMARxDescToGet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + + /* Return Frame Length/ERROR */ + return (framelength); +} + +/** + * @brief Get the size of received the received packet. + * @param None + * @retval : framelength: received packet size + */ +uint32_t ETH_GetRxPktSize(void) +{ + uint32_t frameLength = 0; + if(((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)) + { + /* Get the size of the packet: including 4 bytes of the CRC */ + frameLength = ETH_GetDMARxDescFrameLength(DMARxDescToGet); + } + + /* Return Frame Length */ + return frameLength; +} + +/** + * @brief Drop a Received packet (too small packet, etc...) + * @param None + * @retval : None + */ +void ETH_DropRxPkt(void) +{ + /* Set Own bit of the Rx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMARxDescToGet->Status = ETH_DMARxDesc_OWN; + /* Chained Mode */ + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RCH) != (uint32_t)RESET) + { + /* Selects the next DMA Rx descriptor list for next buffer read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr); + } + else /* Ring Mode */ + { + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RER) != (uint32_t)RESET) + { + /* Selects the next DMA Rx descriptor list for next buffer read: this will + be the first Rx descriptor in this case */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (ETH->DMARDLAR); + } + else + { + /* Selects the next DMA Rx descriptor list for next buffer read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) ((uint32_t)DMARxDescToGet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } +} + +/*--------------------------------- PHY ------------------------------------*/ +/** + * @brief Read a PHY register + * @param PHYAddress: PHY device address, is the index of one of supported + * 32 PHY devices. + * This parameter can be one of the following values: 0,..,31 + * @param PHYReg: PHY register address, is the index of one of the 32 + * PHY register. + * This parameter can be one of the following values: + * @arg PHY_BCR : Tranceiver Basic Control Register + * @arg PHY_BSR : Tranceiver Basic Status Register + * @arg PHY_SR : Tranceiver Status Register + * @arg More PHY register could be read depending on the used PHY + * @retval : ETH_ERROR: in case of timeout + * MAC MIIDR register value: Data read from the selected PHY register (correct read ) + */ +uint16_t ETH_ReadPHYRegister(uint16_t PHYAddress, uint16_t PHYReg) +{ + uint32_t tmpreg = 0; +__IO uint32_t timeout = 0; + /* Check the parameters */ + assert_param(IS_ETH_PHY_ADDRESS(PHYAddress)); + assert_param(IS_ETH_PHY_REG(PHYReg)); + + /* Get the ETHERNET MACMIIAR value */ + tmpreg = ETH->MACMIIAR; + /* Keep only the CSR Clock Range CR[2:0] bits value */ + tmpreg &= ~MACMIIAR_CR_Mask; + /* Prepare the MII address register value */ + tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */ + tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */ + tmpreg &= ~ETH_MACMIIAR_MW; /* Set the read mode */ + tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */ + /* Write the result value into the MII Address register */ + ETH->MACMIIAR = tmpreg; + /* Check for the Busy flag */ + do + { + timeout++; + tmpreg = ETH->MACMIIAR; + } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_READ_TO) + { + return (uint16_t)ETH_ERROR; + } + + /* Return data register value */ + return (uint16_t)(ETH->MACMIIDR); +} + +/** + * @brief Write to a PHY register + * @param PHYAddress: PHY device address, is the index of one of supported + * 32 PHY devices. + * This parameter can be one of the following values: 0,..,31 + * @param PHYReg: PHY register address, is the index of one of the 32 + * PHY register. + * This parameter can be one of the following values: + * @arg PHY_BCR : Tranceiver Control Register + * @arg More PHY register could be written depending on the used PHY + * @param PHYValue: the value to write + * @retval : ETH_ERROR: in case of timeout + * ETH_SUCCESS: for correct write + */ +uint32_t ETH_WritePHYRegister(uint16_t PHYAddress, uint16_t PHYReg, uint16_t PHYValue) +{ + uint32_t tmpreg = 0; + __IO uint32_t timeout = 0; + /* Check the parameters */ + assert_param(IS_ETH_PHY_ADDRESS(PHYAddress)); + assert_param(IS_ETH_PHY_REG(PHYReg)); + + /* Get the ETHERNET MACMIIAR value */ + tmpreg = ETH->MACMIIAR; + /* Keep only the CSR Clock Range CR[2:0] bits value */ + tmpreg &= ~MACMIIAR_CR_Mask; + /* Prepare the MII register address value */ + tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */ + tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */ + tmpreg |= ETH_MACMIIAR_MW; /* Set the write mode */ + tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */ + /* Give the value to the MII data register */ + ETH->MACMIIDR = PHYValue; + /* Write the result value into the MII Address register */ + ETH->MACMIIAR = tmpreg; + /* Check for the Busy flag */ + do + { + timeout++; + tmpreg = ETH->MACMIIAR; + } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_WRITE_TO)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_WRITE_TO) + { + return ETH_ERROR; + } + + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** + * @brief Enables or disables the PHY loopBack mode. + * @param PHYAddress: PHY device address, is the index of one of supported + * 32 PHY devices. + * This parameter can be one of the following values: + * @param NewState: new state of the PHY loopBack mode. + * This parameter can be: ENABLE or DISABLE. + * Note: Don't be confused with ETH_MACLoopBackCmd function + * which enables internal loopback at MII level + * @retval : ETH_ERROR: in case of bad PHY configuration + * ETH_SUCCESS: for correct PHY configuration + */ +uint32_t ETH_PHYLoopBackCmd(uint16_t PHYAddress, FunctionalState NewState) +{ + uint16_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_ETH_PHY_ADDRESS(PHYAddress)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* Get the PHY configuration to update it */ + tmpreg = ETH_ReadPHYRegister(PHYAddress, PHY_BCR); + + if (NewState != DISABLE) + { + /* Enable the PHY loopback mode */ + tmpreg |= PHY_Loopback; + } + else + { + /* Disable the PHY loopback mode: normal mode */ + tmpreg &= (uint16_t)(~(uint16_t)PHY_Loopback); + } + /* Update the PHY control register with the new configuration */ + if(ETH_WritePHYRegister(PHYAddress, PHY_BCR, tmpreg) != (uint32_t)RESET) + { + return ETH_SUCCESS; + } + else + { + /* Return SUCCESS */ + return ETH_ERROR; + } +} + +/*--------------------------------- MAC ------------------------------------*/ +/** + * @brief Enables or disables the MAC transmission. + * @param NewState: new state of the MAC transmission. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MACTransmissionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC transmission */ + ETH->MACCR |= ETH_MACCR_TE; + } + else + { + /* Disable the MAC transmission */ + ETH->MACCR &= ~ETH_MACCR_TE; + } +} + +/** + * @brief Enables or disables the MAC reception. + * @param NewState: new state of the MAC reception. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MACReceptionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC reception */ + ETH->MACCR |= ETH_MACCR_RE; + } + else + { + /* Disable the MAC reception */ + ETH->MACCR &= ~ETH_MACCR_RE; + } +} + +/** + * @brief Checks whether the ETHERNET flow control busy bit is set or not. + * @param None + * @retval : The new state of flow control busy status bit (SET or RESET). + */ +FlagStatus ETH_GetFlowControlBusyStatus(void) +{ + FlagStatus bitstatus = RESET; + /* The Flow Control register should not be written to until this bit is cleared */ + if ((ETH->MACFCR & ETH_MACFCR_FCBBPA) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Initiate a Pause Control Frame (Full-duplex only). + * @param None + * @retval : None + */ +void ETH_InitiatePauseControlFrame(void) +{ + /* When Set In full duplex MAC initiates pause control frame */ + ETH->MACFCR |= ETH_MACFCR_FCBBPA; +} + +/** + * @brief Enables or disables the MAC BackPressure operation activation (Half-duplex only). + * @param NewState: new state of the MAC BackPressure operation activation. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_BackPressureActivationCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Activate the MAC BackPressure operation */ + /* In Half duplex: during backpressure, when the MAC receives a new frame, + the transmitter starts sending a JAM pattern resulting in a collision */ + ETH->MACFCR |= ETH_MACFCR_FCBBPA; + } + else + { + /* Desactivate the MAC BackPressure operation */ + ETH->MACFCR &= ~ETH_MACFCR_FCBBPA; + } +} + +/** + * @brief Checks whether the specified ETHERNET MAC flag is set or not. + * @param ETH_MAC_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_MAC_FLAG_TST : Time stamp trigger flag + * @arg ETH_MAC_FLAG_MMCT : MMC transmit flag + * @arg ETH_MAC_FLAG_MMCR : MMC receive flag + * @arg ETH_MAC_FLAG_MMC : MMC flag + * @arg ETH_MAC_FLAG_PMT : PMT flag + * @retval : The new state of ETHERNET MAC flag (SET or RESET). + */ +FlagStatus ETH_GetMACFlagStatus(uint32_t ETH_MAC_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_MAC_GET_FLAG(ETH_MAC_FLAG)); + if ((ETH->MACSR & ETH_MAC_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Checks whether the specified ETHERNET MAC interrupt has occurred or not. + * @param ETH_MAC_IT: specifies the interrupt source to check. + * This parameter can be one of the following values: + * @arg ETH_MAC_IT_TST : Time stamp trigger interrupt + * @arg ETH_MAC_IT_MMCT : MMC transmit interrupt + * @arg ETH_MAC_IT_MMCR : MMC receive interrupt + * @arg ETH_MAC_IT_MMC : MMC interrupt + * @arg ETH_MAC_IT_PMT : PMT interrupt + * @retval : The new state of ETHERNET MAC interrupt (SET or RESET). + */ +ITStatus ETH_GetMACITStatus(uint32_t ETH_MAC_IT) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_MAC_GET_IT(ETH_MAC_IT)); + if ((ETH->MACSR & ETH_MAC_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Enables or disables the specified ETHERNET MAC interrupts. + * @param ETH_MAC_IT: specifies the ETHERNET MAC interrupt sources to be + * enabled or disabled. + * This parameter can be any combination of the following values: + * @arg ETH_MAC_IT_TST : Time stamp trigger interrupt + * @arg ETH_MAC_IT_PMT : PMT interrupt + * @param NewState: new state of the specified ETHERNET MAC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MACITConfig(uint32_t ETH_MAC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ETH_MAC_IT(ETH_MAC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET MAC interrupts */ + ETH->MACIMR &= (~(uint32_t)ETH_MAC_IT); + } + else + { + /* Disable the selected ETHERNET MAC interrupts */ + ETH->MACIMR |= ETH_MAC_IT; + } +} + +/** + * @brief Configures the selected MAC address. + * @param MacAddr: The MAC addres to configure. + * This parameter can be one of the following values: + * @arg ETH_MAC_Address0 : MAC Address0 + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param Addr: Pointer on MAC address buffer data (6 bytes). + * @retval : None + */ +void ETH_MACAddressConfig(uint32_t MacAddr, uint8_t *Addr) +{ + uint32_t tmpreg; + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS0123(MacAddr)); + + /* Calculate the selectecd MAC address high register */ + tmpreg = ((uint32_t)Addr[5] << 8) | (uint32_t)Addr[4]; + /* Load the selectecd MAC address high register */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) = tmpreg; + /* Calculate the selectecd MAC address low register */ + tmpreg = ((uint32_t)Addr[3] << 24) | ((uint32_t)Addr[2] << 16) | ((uint32_t)Addr[1] << 8) | Addr[0]; + + /* Load the selectecd MAC address low register */ + (*(__IO uint32_t *) (ETH_MAC_AddrLowBase + MacAddr)) = tmpreg; +} + +/** + * @brief Get the selected MAC address. + * @param MacAddr: The MAC addres to return. + * This parameter can be one of the following values: + * @arg ETH_MAC_Address0 : MAC Address0 + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param Addr: Pointer on MAC address buffer data (6 bytes). + * @retval : None + */ +void ETH_GetMACAddress(uint32_t MacAddr, uint8_t *Addr) +{ + uint32_t tmpreg; + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS0123(MacAddr)); + + /* Get the selectecd MAC address high register */ + tmpreg =(*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)); + + /* Calculate the selectecd MAC address buffer */ + Addr[5] = ((tmpreg >> 8) & (uint8_t)0xFF); + Addr[4] = (tmpreg & (uint8_t)0xFF); + /* Load the selectecd MAC address low register */ + tmpreg =(*(__IO uint32_t *) (ETH_MAC_AddrLowBase + MacAddr)); + /* Calculate the selectecd MAC address buffer */ + Addr[3] = ((tmpreg >> 24) & (uint8_t)0xFF); + Addr[2] = ((tmpreg >> 16) & (uint8_t)0xFF); + Addr[1] = ((tmpreg >> 8 ) & (uint8_t)0xFF); + Addr[0] = (tmpreg & (uint8_t)0xFF); +} + +/** + * @brief Enables or disables the Address filter module uses the specified + * ETHERNET MAC address for perfect filtering + * @param MacAddr: specifies the ETHERNET MAC address to be used for prfect filtering. + * This parameter can be one of the following values: + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param NewState: new state of the specified ETHERNET MAC address use. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MACAddressPerfectFilterCmd(uint32_t MacAddr, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS123(MacAddr)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET MAC address for perfect filtering */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) |= ETH_MACA1HR_AE; + } + else + { + /* Disable the selected ETHERNET MAC address for perfect filtering */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) &=(~(uint32_t)ETH_MACA1HR_AE); + } +} + +/** + * @brief Set the filter type for the specified ETHERNET MAC address + * @param MacAddr: specifies the ETHERNET MAC address + * This parameter can be one of the following values: + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param Filter: specifies the used frame received field for comparaison + * This parameter can be one of the following values: + * @arg ETH_MAC_AddressFilter_SA : MAC Address is used to compare + * with the SA fields of the received frame. + * @arg ETH_MAC_AddressFilter_DA : MAC Address is used to compare + * with the DA fields of the received frame. + * @retval : None + */ +void ETH_MACAddressFilterConfig(uint32_t MacAddr, uint32_t Filter) +{ + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS123(MacAddr)); + assert_param(IS_ETH_MAC_ADDRESS_FILTER(Filter)); + + if (Filter != ETH_MAC_AddressFilter_DA) + { + /* The selected ETHERNET MAC address is used to compare with the SA fields of the + received frame. */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) |= ETH_MACA1HR_SA; + } + else + { + /* The selected ETHERNET MAC address is used to compare with the DA fields of the + received frame. */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) &=(~(uint32_t)ETH_MACA1HR_SA); + } +} + +/** + * @brief Set the filter type for the specified ETHERNET MAC address + * @param MacAddr: specifies the ETHERNET MAC address + * This parameter can be one of the following values: + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param MaskByte: specifies the used address bytes for comparaison + * This parameter can be any combination of the following values: + * @arg ETH_MAC_AddressMask_Byte6 : Mask MAC Address high reg bits [15:8]. + * @arg ETH_MAC_AddressMask_Byte5 : Mask MAC Address high reg bits [7:0]. + * @arg ETH_MAC_AddressMask_Byte4 : Mask MAC Address low reg bits [31:24]. + * @arg ETH_MAC_AddressMask_Byte3 : Mask MAC Address low reg bits [23:16]. + * @arg ETH_MAC_AddressMask_Byte2 : Mask MAC Address low reg bits [15:8]. + * @arg ETH_MAC_AddressMask_Byte1 : Mask MAC Address low reg bits [7:0]. + * @retval : None + */ +void ETH_MACAddressMaskBytesFilterConfig(uint32_t MacAddr, uint32_t MaskByte) +{ + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS123(MacAddr)); + assert_param(IS_ETH_MAC_ADDRESS_MASK(MaskByte)); + + /* Clear MBC bits in the selected MAC address high register */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) &=(~(uint32_t)ETH_MACA1HR_MBC); + /* Set the selected Filetr mask bytes */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) |= MaskByte; +} +/*------------------------ DMA Tx/Rx Desciptors -----------------------------*/ + +/** + * @brief Initializes the DMA Tx descriptors in chain mode. + * @param DMATxDescTab: Pointer on the first Tx desc list + * @param TxBuff: Pointer on the first TxBuffer list + * @param TxBuffCount: Number of the used Tx desc in the list + * @retval : None + */ +void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t* TxBuff, uint32_t TxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMATxDesc; + + /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */ + DMATxDescToSet = DMATxDescTab; + /* Fill each DMATxDesc descriptor with the right values */ + for(i=0; i < TxBuffCount; i++) + { + /* Get the pointer on the ith member of the Tx Desc list */ + DMATxDesc = DMATxDescTab + i; + /* Set Second Address Chained bit */ + DMATxDesc->Status = ETH_DMATxDesc_TCH; + + /* Set Buffer1 address pointer */ + DMATxDesc->Buffer1Addr = (uint32_t)(&TxBuff[i*ETH_MAX_PACKET_SIZE]); + + /* Initialize the next descriptor with the Next Desciptor Polling Enable */ + if(i < (TxBuffCount-1)) + { + /* Set next descriptor address register with next descriptor base address */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t)(DMATxDescTab+i+1); + } + else + { + /* For last descriptor, set next descriptor address register equal to the first descriptor base address */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t) DMATxDescTab; + } + } + + /* Set Transmit Desciptor List Address Register */ + ETH->DMATDLAR = (uint32_t) DMATxDescTab; +} + +/** + * @brief Initializes the DMA Tx descriptors in ring mode. + * @param DMATxDescTab: Pointer on the first Tx desc list + * @param TxBuff1: Pointer on the first TxBuffer1 list + * @param TxBuff2: Pointer on the first TxBuffer2 list + * @param TxBuffCount: Number of the used Tx desc in the list + * Note: see decriptor skip length defined in ETH_DMA_InitStruct + * for the number of Words to skip between two unchained descriptors. + * @retval : None + */ +void ETH_DMATxDescRingInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t *TxBuff1, uint8_t *TxBuff2, uint32_t TxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMATxDesc; + + /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */ + DMATxDescToSet = DMATxDescTab; + /* Fill each DMATxDesc descriptor with the right values */ + for(i=0; i < TxBuffCount; i++) + { + /* Get the pointer on the ith member of the Tx Desc list */ + DMATxDesc = DMATxDescTab + i; + /* Set Buffer1 address pointer */ + DMATxDesc->Buffer1Addr = (uint32_t)(&TxBuff1[i*ETH_MAX_PACKET_SIZE]); + + /* Set Buffer2 address pointer */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t)(&TxBuff2[i*ETH_MAX_PACKET_SIZE]); + + /* Set Transmit End of Ring bit for last descriptor: The DMA returns to the base + address of the list, creating a Desciptor Ring */ + if(i == (TxBuffCount-1)) + { + /* Set Transmit End of Ring bit */ + DMATxDesc->Status = ETH_DMATxDesc_TER; + } + } + + /* Set Transmit Desciptor List Address Register */ + ETH->DMATDLAR = (uint32_t) DMATxDescTab; +} + +/** + * @brief Checks whether the specified ETHERNET DMA Tx Desc flag is set or not. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param ETH_DMATxDescFlag: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_DMATxDesc_OWN : OWN bit: descriptor is owned by DMA engine + * @arg ETH_DMATxDesc_IC : Interrupt on completetion + * @arg ETH_DMATxDesc_LS : Last Segment + * @arg ETH_DMATxDesc_FS : First Segment + * @arg ETH_DMATxDesc_DC : Disable CRC + * @arg ETH_DMATxDesc_DP : Disable Pad + * @arg ETH_DMATxDesc_TTSE: Transmit Time Stamp Enable + * @arg ETH_DMATxDesc_TER : Transmit End of Ring + * @arg ETH_DMATxDesc_TCH : Second Address Chained + * @arg ETH_DMATxDesc_TTSS: Tx Time Stamp Status + * @arg ETH_DMATxDesc_IHE : IP Header Error + * @arg ETH_DMATxDesc_ES : Error summary + * @arg ETH_DMATxDesc_JT : Jabber Timeout + * @arg ETH_DMATxDesc_FF : Frame Flushed: DMA/MTL flushed the frame due to SW flush + * @arg ETH_DMATxDesc_PCE : Payload Checksum Error + * @arg ETH_DMATxDesc_LCA : Loss of Carrier: carrier lost during tramsmission + * @arg ETH_DMATxDesc_NC : No Carrier: no carrier signal from the tranceiver + * @arg ETH_DMATxDesc_LCO : Late Collision: transmission aborted due to collision + * @arg ETH_DMATxDesc_EC : Excessive Collision: transmission aborted after 16 collisions + * @arg ETH_DMATxDesc_VF : VLAN Frame + * @arg ETH_DMATxDesc_CC : Collision Count + * @arg ETH_DMATxDesc_ED : Excessive Deferral + * @arg ETH_DMATxDesc_UF : Underflow Error: late data arrival from the memory + * @arg ETH_DMATxDesc_DB : Deferred Bit + * @retval : The new state of ETH_DMATxDescFlag (SET or RESET). + */ +FlagStatus ETH_GetDMATxDescFlagStatus(ETH_DMADESCTypeDef *DMATxDesc, uint32_t ETH_DMATxDescFlag) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMATxDESC_GET_FLAG(ETH_DMATxDescFlag)); + + if ((DMATxDesc->Status & ETH_DMATxDescFlag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Returns the specified ETHERNET DMA Tx Desc collision count. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @retval : The Transmit descriptor collision counter value. + */ +uint32_t ETH_GetDMATxDescCollisionCount(ETH_DMADESCTypeDef *DMATxDesc) +{ + /* Return the Receive descriptor frame length */ + return ((DMATxDesc->Status & ETH_DMATxDesc_CC) >> ETH_DMATxDesc_CollisionCountShift); +} + +/** + * @brief Set the specified DMA Tx Desc Own bit. + * @param DMATxDesc: Pointer on a Tx desc + * @retval : None + */ +void ETH_SetDMATxDescOwnBit(ETH_DMADESCTypeDef *DMATxDesc) +{ + /* Set the DMA Tx Desc Own bit */ + DMATxDesc->Status |= ETH_DMATxDesc_OWN; +} + +/** + * @brief Enables or disables the specified DMA Tx Desc Transmit interrupt. + * @param DMATxDesc: Pointer on a Tx desc + * @param NewState: new state of the DMA Tx Desc transmit interrupt. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescTransmitITConfig(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA Tx Desc Transmit interrupt */ + DMATxDesc->Status |= ETH_DMATxDesc_IC; + } + else + { + /* Disable the DMA Tx Desc Transmit interrupt */ + DMATxDesc->Status &=(~(uint32_t)ETH_DMATxDesc_IC); + } +} + +/** + * @brief Enables or disables the specified DMA Tx Desc Transmit interrupt. + * @param DMATxDesc: Pointer on a Tx desc + * @param DMATxDesc_FrameSegment: specifies is the actual Tx desc contain last or first segment. + * This parameter can be one of the following values: + * @arg ETH_DMATxDesc_LastSegment : actual Tx desc contain last segment + * @arg ETH_DMATxDesc_FirstSegment : actual Tx desc contain first segment + * @retval : None + */ +void ETH_DMATxDescFrameSegmentConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_FrameSegment) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_TXDESC_SEGMENT(DMATxDesc_FrameSegment)); + + /* Selects the DMA Tx Desc Frame segment */ + DMATxDesc->Status |= DMATxDesc_FrameSegment; +} + +/** + * @brief Selects the specified ETHERNET DMA Tx Desc Checksum Insertion. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param DMATxDesc_Checksum: specifies is the DMA Tx desc checksum insertion. + * This parameter can be one of the following values: + * @arg ETH_DMATxDesc_ChecksumByPass : Checksum bypass + * @arg ETH_DMATxDesc_ChecksumIPV4Header : IPv4 header checksum + * @arg ETH_DMATxDesc_ChecksumTCPUDPICMPSegment : TCP/UDP/ICMP checksum. Pseudo header checksum is assumed to be present + * @arg ETH_DMATxDesc_ChecksumTCPUDPICMPFull : TCP/UDP/ICMP checksum fully in hardware including pseudo header + * @retval : None + */ +void ETH_DMATxDescChecksumInsertionConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_Checksum) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_TXDESC_CHECKSUM(DMATxDesc_Checksum)); + + /* Set the selected DMA Tx desc checksum insertion control */ + DMATxDesc->Status |= DMATxDesc_Checksum; +} + +/** + * @brief Enables or disables the DMA Tx Desc CRC. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc CRC. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescCRCCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc CRC */ + DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_DC); + } + else + { + /* Disable the selected DMA Tx Desc CRC */ + DMATxDesc->Status |= ETH_DMATxDesc_DC; + } +} + +/** + * @brief Enables or disables the DMA Tx Desc end of ring. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc end of ring. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc end of ring */ + DMATxDesc->Status |= ETH_DMATxDesc_TER; + } + else + { + /* Disable the selected DMA Tx Desc end of ring */ + DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_TER); + } +} + +/** + * @brief Enables or disables the DMA Tx Desc second address chained. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc second address chained. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc second address chained */ + DMATxDesc->Status |= ETH_DMATxDesc_TCH; + } + else + { + /* Disable the selected DMA Tx Desc second address chained */ + DMATxDesc->Status &=(~(uint32_t)ETH_DMATxDesc_TCH); + } +} + +/** + * @brief Enables or disables the DMA Tx Desc padding for frame shorter than 64 bytes. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc padding for + * frame shorter than 64 bytes. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescShortFramePaddingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc padding for frame shorter than 64 bytes */ + DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_DP); + } + else + { + /* Disable the selected DMA Tx Desc padding for frame shorter than 64 bytes*/ + DMATxDesc->Status |= ETH_DMATxDesc_DP; + } +} + +/** + * @brief Enables or disables the DMA Tx Desc time stamp. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc time stamp. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescTimeStampCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc time stamp */ + DMATxDesc->Status |= ETH_DMATxDesc_TTSE; + } + else + { + /* Disable the selected DMA Tx Desc time stamp */ + DMATxDesc->Status &=(~(uint32_t)ETH_DMATxDesc_TTSE); + } +} + +/** + * @brief Configures the specified DMA Tx Desc buffer1 and buffer2 sizes. + * @param DMATxDesc: Pointer on a Tx desc + * @param BufferSize1: specifies the Tx desc buffer1 size. + * @param BufferSize2: specifies the Tx desc buffer2 size (put "0" if not used). + * @retval : None + */ +void ETH_DMATxDescBufferSizeConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t BufferSize1, uint32_t BufferSize2) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMATxDESC_BUFFER_SIZE(BufferSize1)); + assert_param(IS_ETH_DMATxDESC_BUFFER_SIZE(BufferSize2)); + + /* Set the DMA Tx Desc buffer1 and buffer2 sizes values */ + DMATxDesc->ControlBufferSize |= (BufferSize1 | (BufferSize2 << ETH_DMATxDesc_BufferSize2Shift)); +} + +/** + * @brief Initializes the DMA Rx descriptors in chain mode. + * @param DMARxDescTab: Pointer on the first Rx desc list + * @param RxBuff: Pointer on the first RxBuffer list + * @param RxBuffCount: Number of the used Rx desc in the list + * @retval : None + */ +void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMARxDesc; + + /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */ + DMARxDescToGet = DMARxDescTab; + /* Fill each DMARxDesc descriptor with the right values */ + for(i=0; i < RxBuffCount; i++) + { + /* Get the pointer on the ith member of the Rx Desc list */ + DMARxDesc = DMARxDescTab+i; + /* Set Own bit of the Rx descriptor Status */ + DMARxDesc->Status = ETH_DMARxDesc_OWN; + + /* Set Buffer1 size and Second Address Chained bit */ + DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_MAX_PACKET_SIZE; + /* Set Buffer1 address pointer */ + DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff[i*ETH_MAX_PACKET_SIZE]); + + /* Initialize the next descriptor with the Next Desciptor Polling Enable */ + if(i < (RxBuffCount-1)) + { + /* Set next descriptor address register with next descriptor base address */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab+i+1); + } + else + { + /* For last descriptor, set next descriptor address register equal to the first descriptor base address */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab); + } + } + + /* Set Receive Desciptor List Address Register */ + ETH->DMARDLAR = (uint32_t) DMARxDescTab; +} + +/** + * @brief Initializes the DMA Rx descriptors in ring mode. + * @param DMARxDescTab: Pointer on the first Rx desc list + * @param RxBuff1: Pointer on the first RxBuffer1 list + * @param RxBuff2: Pointer on the first RxBuffer2 list + * @param RxBuffCount: Number of the used Rx desc in the list + * Note: see decriptor skip length defined in ETH_DMA_InitStruct + * for the number of Words to skip between two unchained descriptors. + * @retval : None + */ +void ETH_DMARxDescRingInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff1, uint8_t *RxBuff2, uint32_t RxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMARxDesc; + /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */ + DMARxDescToGet = DMARxDescTab; + /* Fill each DMARxDesc descriptor with the right values */ + for(i=0; i < RxBuffCount; i++) + { + /* Get the pointer on the ith member of the Rx Desc list */ + DMARxDesc = DMARxDescTab+i; + /* Set Own bit of the Rx descriptor Status */ + DMARxDesc->Status = ETH_DMARxDesc_OWN; + /* Set Buffer1 size */ + DMARxDesc->ControlBufferSize = ETH_MAX_PACKET_SIZE; + /* Set Buffer1 address pointer */ + DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff1[i*ETH_MAX_PACKET_SIZE]); + + /* Set Buffer2 address pointer */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(&RxBuff2[i*ETH_MAX_PACKET_SIZE]); + + /* Set Receive End of Ring bit for last descriptor: The DMA returns to the base + address of the list, creating a Desciptor Ring */ + if(i == (RxBuffCount-1)) + { + /* Set Receive End of Ring bit */ + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_RER; + } + } + + /* Set Receive Desciptor List Address Register */ + ETH->DMARDLAR = (uint32_t) DMARxDescTab; +} + +/** + * @brief Checks whether the specified ETHERNET Rx Desc flag is set or not. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @param ETH_DMARxDescFlag: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_DMARxDesc_OWN: OWN bit: descriptor is owned by DMA engine + * @arg ETH_DMARxDesc_AFM: DA Filter Fail for the rx frame + * @arg ETH_DMARxDesc_ES: Error summary + * @arg ETH_DMARxDesc_DE: Desciptor error: no more descriptors for receive frame + * @arg ETH_DMARxDesc_SAF: SA Filter Fail for the received frame + * @arg ETH_DMARxDesc_LE: Frame size not matching with length field + * @arg ETH_DMARxDesc_OE: Overflow Error: Frame was damaged due to buffer overflow + * @arg ETH_DMARxDesc_VLAN: VLAN Tag: received frame is a VLAN frame + * @arg ETH_DMARxDesc_FS: First descriptor of the frame + * @arg ETH_DMARxDesc_LS: Last descriptor of the frame + * @arg ETH_DMARxDesc_IPV4HCE: IPC Checksum Error/Giant Frame: Rx Ipv4 header checksum error + * @arg ETH_DMARxDesc_LC: Late collision occurred during reception + * @arg ETH_DMARxDesc_FT: Frame type - Ethernet, otherwise 802.3 + * @arg ETH_DMARxDesc_RWT: Receive Watchdog Timeout: watchdog timer expired during reception + * @arg ETH_DMARxDesc_RE: Receive error: error reported by MII interface + * @arg ETH_DMARxDesc_DE: Dribble bit error: frame contains non int multiple of 8 bits + * @arg ETH_DMARxDesc_CE: CRC error + * @arg ETH_DMARxDesc_MAMPCE: Rx MAC Address/Payload Checksum Error: Rx MAC address matched/ Rx Payload Checksum Error + * @retval : The new state of ETH_DMARxDescFlag (SET or RESET). + */ +FlagStatus ETH_GetDMARxDescFlagStatus(ETH_DMADESCTypeDef *DMARxDesc, uint32_t ETH_DMARxDescFlag) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMARxDESC_GET_FLAG(ETH_DMARxDescFlag)); + if ((DMARxDesc->Status & ETH_DMARxDescFlag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Set the specified DMA Rx Desc Own bit. + * @param DMARxDesc: Pointer on a Rx desc + * @retval : None + */ +void ETH_SetDMARxDescOwnBit(ETH_DMADESCTypeDef *DMARxDesc) +{ + /* Set the DMA Rx Desc Own bit */ + DMARxDesc->Status |= ETH_DMARxDesc_OWN; +} + +/** + * @brief Returns the specified DMA Rx Desc frame length. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @retval : The Rx descriptor received frame length. + */ +uint32_t ETH_GetDMARxDescFrameLength(ETH_DMADESCTypeDef *DMARxDesc) +{ + /* Return the Receive descriptor frame length */ + return ((DMARxDesc->Status & ETH_DMARxDesc_FL) >> ETH_DMARxDesc_FrameLengthShift); +} + +/** + * @brief Enables or disables the specified DMA Rx Desc receive interrupt. + * @param DMARxDesc: Pointer on a Rx desc + * @param NewState: new state of the specified DMA Rx Desc interrupt. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMARxDescReceiveITConfig(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA Rx Desc receive interrupt */ + DMARxDesc->ControlBufferSize &=(~(uint32_t)ETH_DMARxDesc_DIC); + } + else + { + /* Disable the DMA Rx Desc receive interrupt */ + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_DIC; + } +} + +/** + * @brief Enables or disables the DMA Rx Desc end of ring. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @param NewState: new state of the specified DMA Rx Desc end of ring. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMARxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Rx Desc end of ring */ + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_RER; + } + else + { + /* Disable the selected DMA Rx Desc end of ring */ + DMARxDesc->ControlBufferSize &=(~(uint32_t)ETH_DMARxDesc_RER); + } +} + +/** + * @brief Enables or disables the DMA Rx Desc second address chained. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @param NewState: new state of the specified DMA Rx Desc second address chained. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMARxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Rx Desc second address chained */ + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_RCH; + } + else + { + /* Disable the selected DMA Rx Desc second address chained */ + DMARxDesc->ControlBufferSize &=(~(uint32_t)ETH_DMARxDesc_RCH); + } +} + +/** + * @brief Returns the specified ETHERNET DMA Rx Desc buffer size. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @param DMARxDesc_Buffer: specifies the DMA Rx Desc buffer. + * This parameter can be any one of the following values: + * @arg ETH_DMARxDesc_Buffer1 : DMA Rx Desc Buffer1 + * @arg ETH_DMARxDesc_Buffer2 : DMA Rx Desc Buffer2 + * @retval : The Receive descriptor frame length. + */ +uint32_t ETH_GetDMARxDescBufferSize(ETH_DMADESCTypeDef *DMARxDesc, uint32_t DMARxDesc_Buffer) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_RXDESC_BUFFER(DMARxDesc_Buffer)); + + if(DMARxDesc_Buffer != ETH_DMARxDesc_Buffer1) + { + /* Return the DMA Rx Desc buffer2 size */ + return ((DMARxDesc->ControlBufferSize & ETH_DMARxDesc_RBS2) >> ETH_DMARxDesc_Buffer2SizeShift); + } + else + { + /* Return the DMA Rx Desc buffer1 size */ + return (DMARxDesc->ControlBufferSize & ETH_DMARxDesc_RBS1); + } +} + +/*--------------------------------- DMA ------------------------------------*/ +/** + * @brief Resets all MAC subsystem internal registers and logic. + * @param None + * @retval : None + */ +void ETH_SoftwareReset(void) +{ + /* Set the SWR bit: resets all MAC subsystem internal registers and logic */ + /* After reset all the registers holds their respective reset values */ + ETH->DMABMR |= ETH_DMABMR_SR; +} + +/** + * @brief Checks whether the ETHERNET software reset bit is set or not. + * @param None + * @retval : The new state of DMA Bus Mode register SR bit (SET or RESET). + */ +FlagStatus ETH_GetSoftwareResetStatus(void) +{ + FlagStatus bitstatus = RESET; + if((ETH->DMABMR & ETH_DMABMR_SR) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Checks whether the specified ETHERNET DMA flag is set or not. + * @param ETH_DMA_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_DMA_FLAG_TST : Time-stamp trigger flag + * @arg ETH_DMA_FLAG_PMT : PMT flag + * @arg ETH_DMA_FLAG_MMC : MMC flag + * @arg ETH_DMA_FLAG_DataTransferError : Error bits 0-data buffer, 1-desc. access + * @arg ETH_DMA_FLAG_ReadWriteError : Error bits 0-write trnsf, 1-read transfr + * @arg ETH_DMA_FLAG_AccessError : Error bits 0-Rx DMA, 1-Tx DMA + * @arg ETH_DMA_FLAG_NIS : Normal interrupt summary flag + * @arg ETH_DMA_FLAG_AIS : Abnormal interrupt summary flag + * @arg ETH_DMA_FLAG_ER : Early receive flag + * @arg ETH_DMA_FLAG_FBE : Fatal bus error flag + * @arg ETH_DMA_FLAG_ET : Early transmit flag + * @arg ETH_DMA_FLAG_RWT : Receive watchdog timeout flag + * @arg ETH_DMA_FLAG_RPS : Receive process stopped flag + * @arg ETH_DMA_FLAG_RBU : Receive buffer unavailable flag + * @arg ETH_DMA_FLAG_R : Receive flag + * @arg ETH_DMA_FLAG_TU : Underflow flag + * @arg ETH_DMA_FLAG_RO : Overflow flag + * @arg ETH_DMA_FLAG_TJT : Transmit jabber timeout flag + * @arg ETH_DMA_FLAG_TBU : Transmit buffer unavailable flag + * @arg ETH_DMA_FLAG_TPS : Transmit process stopped flag + * @arg ETH_DMA_FLAG_T : Transmit flag + * @retval : The new state of ETH_DMA_FLAG (SET or RESET). + */ +FlagStatus ETH_GetDMAFlagStatus(uint32_t ETH_DMA_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMA_GET_IT(ETH_DMA_FLAG)); + if ((ETH->DMASR & ETH_DMA_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the ETHERNET’s DMA pending flag. + * @param ETH_DMA_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg ETH_DMA_FLAG_NIS : Normal interrupt summary flag + * @arg ETH_DMA_FLAG_AIS : Abnormal interrupt summary flag + * @arg ETH_DMA_FLAG_ER : Early receive flag + * @arg ETH_DMA_FLAG_FBE : Fatal bus error flag + * @arg ETH_DMA_FLAG_ETI : Early transmit flag + * @arg ETH_DMA_FLAG_RWT : Receive watchdog timeout flag + * @arg ETH_DMA_FLAG_RPS : Receive process stopped flag + * @arg ETH_DMA_FLAG_RBU : Receive buffer unavailable flag + * @arg ETH_DMA_FLAG_R : Receive flag + * @arg ETH_DMA_FLAG_TU : Transmit Underflow flag + * @arg ETH_DMA_FLAG_RO : Receive Overflow flag + * @arg ETH_DMA_FLAG_TJT : Transmit jabber timeout flag + * @arg ETH_DMA_FLAG_TBU : Transmit buffer unavailable flag + * @arg ETH_DMA_FLAG_TPS : Transmit process stopped flag + * @arg ETH_DMA_FLAG_T : Transmit flag + * @retval : None + */ +void ETH_DMAClearFlag(uint32_t ETH_DMA_FLAG) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_FLAG(ETH_DMA_FLAG)); + + /* Clear the selected ETHERNET DMA FLAG */ + ETH->DMASR = (uint32_t) ETH_DMA_FLAG; +} + +/** + * @brief Checks whether the specified ETHERNET DMA interrupt has occured or not. + * @param ETH_DMA_IT: specifies the interrupt source to check. + * This parameter can be one of the following values: + * @arg ETH_DMA_IT_TST : Time-stamp trigger interrupt + * @arg ETH_DMA_IT_PMT : PMT interrupt + * @arg ETH_DMA_IT_MMC : MMC interrupt + * @arg ETH_DMA_IT_NIS : Normal interrupt summary + * @arg ETH_DMA_IT_AIS : Abnormal interrupt summary + * @arg ETH_DMA_IT_ER : Early receive interrupt + * @arg ETH_DMA_IT_FBE : Fatal bus error interrupt + * @arg ETH_DMA_IT_ET : Early transmit interrupt + * @arg ETH_DMA_IT_RWT : Receive watchdog timeout interrupt + * @arg ETH_DMA_IT_RPS : Receive process stopped interrupt + * @arg ETH_DMA_IT_RBU : Receive buffer unavailable interrupt + * @arg ETH_DMA_IT_R : Receive interrupt + * @arg ETH_DMA_IT_TU : Underflow interrupt + * @arg ETH_DMA_IT_RO : Overflow interrupt + * @arg ETH_DMA_IT_TJT : Transmit jabber timeout interrupt + * @arg ETH_DMA_IT_TBU : Transmit buffer unavailable interrupt + * @arg ETH_DMA_IT_TPS : Transmit process stopped interrupt + * @arg ETH_DMA_IT_T : Transmit interrupt + * @retval : The new state of ETH_DMA_IT (SET or RESET). + */ +ITStatus ETH_GetDMAITStatus(uint32_t ETH_DMA_IT) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMA_GET_IT(ETH_DMA_IT)); + if ((ETH->DMASR & ETH_DMA_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the ETHERNET’s DMA IT pending bit. + * @param ETH_DMA_IT: specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg ETH_DMA_IT_NIS : Normal interrupt summary + * @arg ETH_DMA_IT_AIS : Abnormal interrupt summary + * @arg ETH_DMA_IT_ER : Early receive interrupt + * @arg ETH_DMA_IT_FBE : Fatal bus error interrupt + * @arg ETH_DMA_IT_ETI : Early transmit interrupt + * @arg ETH_DMA_IT_RWT : Receive watchdog timeout interrupt + * @arg ETH_DMA_IT_RPS : Receive process stopped interrupt + * @arg ETH_DMA_IT_RBU : Receive buffer unavailable interrupt + * @arg ETH_DMA_IT_R : Receive interrupt + * @arg ETH_DMA_IT_TU : Transmit Underflow interrupt + * @arg ETH_DMA_IT_RO : Receive Overflow interrupt + * @arg ETH_DMA_IT_TJT : Transmit jabber timeout interrupt + * @arg ETH_DMA_IT_TBU : Transmit buffer unavailable interrupt + * @arg ETH_DMA_IT_TPS : Transmit process stopped interrupt + * @arg ETH_DMA_IT_T : Transmit interrupt + * @retval : None + */ +void ETH_DMAClearITPendingBit(uint32_t ETH_DMA_IT) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_IT(ETH_DMA_IT)); + + /* Clear the selected ETHERNET DMA IT */ + ETH->DMASR = (uint32_t) ETH_DMA_IT; +} + +/** + * @brief Returns the ETHERNET DMA Transmit Process State. + * @param None + * @retval : The new ETHERNET DMA Transmit Process State: + * This can be one of the following values: + * - ETH_DMA_TransmitProcess_Stopped : Stopped - Reset or Stop Tx Command issued + * - ETH_DMA_TransmitProcess_Fetching : Running - fetching the Tx descriptor + * - ETH_DMA_TransmitProcess_Waiting : Running - waiting for status + * - ETH_DMA_TransmitProcess_Reading : unning - reading the data from host memory + * - ETH_DMA_TransmitProcess_Suspended : Suspended - Tx Desciptor unavailabe + * - ETH_DMA_TransmitProcess_Closing : Running - closing Rx descriptor + */ +uint32_t ETH_GetTransmitProcessState(void) +{ + return ((uint32_t)(ETH->DMASR & ETH_DMASR_TS)); +} + +/** + * @brief Returns the ETHERNET DMA Receive Process State. + * @param None + * @retval : The new ETHERNET DMA Receive Process State: + * This can be one of the following values: + * - ETH_DMA_ReceiveProcess_Stopped : Stopped - Reset or Stop Rx Command issued + * - ETH_DMA_ReceiveProcess_Fetching : Running - fetching the Rx descriptor + * - ETH_DMA_ReceiveProcess_Waiting : Running - waiting for packet + * - ETH_DMA_ReceiveProcess_Suspended : Suspended - Rx Desciptor unavailable + * - ETH_DMA_ReceiveProcess_Closing : Running - closing descriptor + * - ETH_DMA_ReceiveProcess_Queuing : Running - queuing the recieve frame into host memory + */ +uint32_t ETH_GetReceiveProcessState(void) +{ + return ((uint32_t)(ETH->DMASR & ETH_DMASR_RS)); +} + +/** + * @brief Clears the ETHERNET transmit FIFO. + * @param None + * @retval : None + */ +void ETH_FlushTransmitFIFO(void) +{ + /* Set the Flush Transmit FIFO bit */ + ETH->DMAOMR |= ETH_DMAOMR_FTF; +} + +/** + * @brief Checks whether the ETHERNET transmit FIFO bit is cleared or not. + * @param None + * @retval : The new state of ETHERNET flush transmit FIFO bit (SET or RESET). + */ +FlagStatus ETH_GetFlushTransmitFIFOStatus(void) +{ + FlagStatus bitstatus = RESET; + if ((ETH->DMAOMR & ETH_DMAOMR_FTF) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Enables or disables the DMA transmission. + * @param NewState: new state of the DMA transmission. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATransmissionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA transmission */ + ETH->DMAOMR |= ETH_DMAOMR_ST; + } + else + { + /* Disable the DMA transmission */ + ETH->DMAOMR &= ~ETH_DMAOMR_ST; + } +} + +/** + * @brief Enables or disables the DMA reception. + * @param NewState: new state of the DMA reception. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMAReceptionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA reception */ + ETH->DMAOMR |= ETH_DMAOMR_SR; + } + else + { + /* Disable the DMA reception */ + ETH->DMAOMR &= ~ETH_DMAOMR_SR; + } +} + +/** + * @brief Enables or disables the specified ETHERNET DMA interrupts. + * @param ETH_DMA_IT: specifies the ETHERNET DMA interrupt sources to be + * enabled or disabled. + * This parameter can be any combination of the following values: + * @arg ETH_DMA_IT_NIS : Normal interrupt summary + * @arg ETH_DMA_IT_AIS : Abnormal interrupt summary + * @arg ETH_DMA_IT_ER : Early receive interrupt + * @arg ETH_DMA_IT_FBE : Fatal bus error interrupt + * @arg ETH_DMA_IT_ET : Early transmit interrupt + * @arg ETH_DMA_IT_RWT : Receive watchdog timeout interrupt + * @arg ETH_DMA_IT_RPS : Receive process stopped interrupt + * @arg ETH_DMA_IT_RBU : Receive buffer unavailable interrupt + * @arg ETH_DMA_IT_R : Receive interrupt + * @arg ETH_DMA_IT_TU : Underflow interrupt + * @arg ETH_DMA_IT_RO : Overflow interrupt + * @arg ETH_DMA_IT_TJT : Transmit jabber timeout interrupt + * @arg ETH_DMA_IT_TBU : Transmit buffer unavailable interrupt + * @arg ETH_DMA_IT_TPS : Transmit process stopped interrupt + * @arg ETH_DMA_IT_T : Transmit interrupt + * @param NewState: new state of the specified ETHERNET DMA interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMAITConfig(uint32_t ETH_DMA_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_IT(ETH_DMA_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET DMA interrupts */ + ETH->DMAIER |= ETH_DMA_IT; + } + else + { + /* Disable the selected ETHERNET DMA interrupts */ + ETH->DMAIER &=(~(uint32_t)ETH_DMA_IT); + } +} + +/** + * @brief Checks whether the specified ETHERNET DMA overflow flag is set or not. + * @param ETH_DMA_Overflow: specifies the DMA overflow flag to check. + * This parameter can be one of the following values: + * @arg ETH_DMA_Overflow_RxFIFOCounter : Overflow for FIFO Overflow Counter + * @arg ETH_DMA_Overflow_MissedFrameCounter : Overflow for Missed Frame Counter + * @retval : The new state of ETHERNET DMA overflow Flag (SET or RESET). + */ +FlagStatus ETH_GetDMAOverflowStatus(uint32_t ETH_DMA_Overflow) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMA_GET_OVERFLOW(ETH_DMA_Overflow)); + + if ((ETH->DMAMFBOCR & ETH_DMA_Overflow) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Get the ETHERNET DMA Rx Overflow Missed Frame Counter value. + * @param None + * @retval : The value of Rx overflow Missed Frame Counter. + */ +uint32_t ETH_GetRxOverflowMissedFrameCounter(void) +{ + return ((uint32_t)((ETH->DMAMFBOCR & ETH_DMAMFBOCR_MFA)>>ETH_DMA_RxOverflowMissedFramesCounterShift)); +} + +/** + * @brief Get the ETHERNET DMA Buffer Unavailable Missed Frame Counter value. + * @param None + * @retval : The value of Buffer unavailable Missed Frame Counter. + */ +uint32_t ETH_GetBufferUnavailableMissedFrameCounter(void) +{ + return ((uint32_t)(ETH->DMAMFBOCR) & ETH_DMAMFBOCR_MFC); +} + +/** + * @brief Get the ETHERNET DMA DMACHTDR register value. + * @param None + * @retval : The value of the current Tx desc start address. + */ +uint32_t ETH_GetCurrentTxDescStartAddress(void) +{ + return ((uint32_t)(ETH->DMACHTDR)); +} + +/** + * @brief Get the ETHERNET DMA DMACHRDR register value. + * @param None + * @retval : The value of the current Rx desc start address. + */ +uint32_t ETH_GetCurrentRxDescStartAddress(void) +{ + return ((uint32_t)(ETH->DMACHRDR)); +} + +/** + * @brief Get the ETHERNET DMA DMACHTBAR register value. + * @param None + * @retval : The value of the current Tx desc buffer address. + */ +uint32_t ETH_GetCurrentTxBufferAddress(void) +{ + return ((uint32_t)(ETH->DMACHTBAR)); +} + +/** + * @brief Get the ETHERNET DMA DMACHRBAR register value. + * @param None + * @retval : The value of the current Rx desc buffer address. + */ +uint32_t ETH_GetCurrentRxBufferAddress(void) +{ + return ((uint32_t)(ETH->DMACHRBAR)); +} + +/** + * @brief Resumes the DMA Transmission by writing to the DmaTxPollDemand + * register: (the data written could be anything). This forces + * the DMA to resume transmission. + * @param None + * @retval : None. + */ +void ETH_ResumeDMATransmission(void) +{ + ETH->DMATPDR = 0; +} + +/** + * @brief Resumes the DMA Transmission by writing to the DmaRxPollDemand + * register: (the data written could be anything). This forces + * the DMA to resume reception. + * @param None + * @retval : None. + */ +void ETH_ResumeDMAReception(void) +{ + ETH->DMARPDR = 0; +} + +/*--------------------------------- PMT ------------------------------------*/ +/** + * @brief Reset Wakeup frame filter register pointer. + * @param None + * @retval : None + */ +void ETH_ResetWakeUpFrameFilterRegisterPointer(void) +{ + /* Resets the Remote Wake-up Frame Filter register pointer to 0x0000 */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_WFFRPR; +} + +/** + * @brief Populates the remote wakeup frame registers. + * @param Buffer: Pointer on remote WakeUp Frame Filter Register buffer + * data (8 words). + * @retval : None + */ +void ETH_SetWakeUpFrameFilterRegister(uint32_t *Buffer) +{ + uint32_t i = 0; + + /* Fill Remote Wake-up Frame Filter register with Buffer data */ + for(i =0; iMACRWUFFR = Buffer[i]; + } +} + +/** + * @brief Enables or disables any unicast packet filtered by the MAC + * (DAF) address recognition to be a wake-up frame. + * @param NewState: new state of the MAC Global Unicast Wake-Up. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_GlobalUnicastWakeUpCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC Global Unicast Wake-Up */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_GU; + } + else + { + /* Disable the MAC Global Unicast Wake-Up */ + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_GU; + } +} + +/** + * @brief Checks whether the specified ETHERNET PMT flag is set or not. + * @param ETH_PMT_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_PMT_FLAG_WUFFRPR : Wake-Up Frame Filter Register Poniter Reset + * @arg ETH_PMT_FLAG_WUFR : Wake-Up Frame Received + * @arg ETH_PMT_FLAG_MPR : Magic Packet Received + * @retval : The new state of ETHERNET PMT Flag (SET or RESET). + */ +FlagStatus ETH_GetPMTFlagStatus(uint32_t ETH_PMT_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_PMT_GET_FLAG(ETH_PMT_FLAG)); + + if ((ETH->MACPMTCSR & ETH_PMT_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Enables or disables the MAC Wake-Up Frame Detection. + * @param NewState: new state of the MAC Wake-Up Frame Detection. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_WakeUpFrameDetectionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC Wake-Up Frame Detection */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_WFE; + } + else + { + /* Disable the MAC Wake-Up Frame Detection */ + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_WFE; + } +} + +/** + * @brief Enables or disables the MAC Magic Packet Detection. + * @param NewState: new state of the MAC Magic Packet Detection. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MagicPacketDetectionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC Magic Packet Detection */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_MPE; + } + else + { + /* Disable the MAC Magic Packet Detection */ + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_MPE; + } +} + +/** + * @brief Enables or disables the MAC Power Down. + * @param NewState: new state of the MAC Power Down. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_PowerDownCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC Power Down */ + /* This puts the MAC in power down mode */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_PD; + } + else + { + /* Disable the MAC Power Down */ + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_PD; + } +} + +/*--------------------------------- MMC ------------------------------------*/ +/** + * @brief Enables or disables the MMC Counter Freeze. + * @param NewState: new state of the MMC Counter Freeze. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MMCCounterFreezeCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MMC Counter Freeze */ + ETH->MMCCR |= ETH_MMCCR_MCF; + } + else + { + /* Disable the MMC Counter Freeze */ + ETH->MMCCR &= ~ETH_MMCCR_MCF; + } +} + +/** + * @brief Enables or disables the MMC Reset On Read. + * @param NewState: new state of the MMC Reset On Read. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MMCResetOnReadCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MMC Counter reset on read */ + ETH->MMCCR |= ETH_MMCCR_ROR; + } + else + { + /* Disable the MMC Counter reset on read */ + ETH->MMCCR &= ~ETH_MMCCR_ROR; + } +} + +/** + * @brief Enables or disables the MMC Counter Stop Rollover. + * @param NewState: new state of the MMC Counter Stop Rollover. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MMCCounterRolloverCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Disable the MMC Counter Stop Rollover */ + ETH->MMCCR &= ~ETH_MMCCR_CSR; + } + else + { + /* Enable the MMC Counter Stop Rollover */ + ETH->MMCCR |= ETH_MMCCR_CSR; + } +} + +/** + * @brief Resets the MMC Counters. + * @param None + * @retval : None + */ +void ETH_MMCCountersReset(void) +{ + /* Resets the MMC Counters */ + ETH->MMCCR |= ETH_MMCCR_CR; +} + +/** + * @brief Enables or disables the specified ETHERNET MMC interrupts. + * @param ETH_MMC_IT: specifies the ETHERNET MMC interrupt + * sources to be enabled or disabled. + * This parameter can be any combination of Tx interrupt or + * any combination of Rx interrupt (but not both)of the following values: + * @arg ETH_MMC_IT_TGF : When Tx good frame counter reaches half the maximum value + * @arg ETH_MMC_IT_TGFMSC: When Tx good multi col counter reaches half the maximum value + * @arg ETH_MMC_IT_TGFSC : When Tx good single col counter reaches half the maximum value + * @arg ETH_MMC_IT_RGUF : When Rx good unicast frames counter reaches half the maximum value + * @arg ETH_MMC_IT_RFAE : When Rx alignment error counter reaches half the maximum value + * @arg ETH_MMC_IT_RFCE : When Rx crc error counter reaches half the maximum value + * @param NewState: new state of the specified ETHERNET MMC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MMCITConfig(uint32_t ETH_MMC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ETH_MMC_IT(ETH_MMC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if ((ETH_MMC_IT & (uint32_t)0x10000000) != (uint32_t)RESET) + { + /* Remove egister mak from IT */ + ETH_MMC_IT &= 0xEFFFFFFF; + + /* ETHERNET MMC Rx interrupts selected */ + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET MMC interrupts */ + ETH->MMCRIMR &=(~(uint32_t)ETH_MMC_IT); + } + else + { + /* Disable the selected ETHERNET MMC interrupts */ + ETH->MMCRIMR |= ETH_MMC_IT; + } + } + else + { + /* ETHERNET MMC Tx interrupts selected */ + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET MMC interrupts */ + ETH->MMCTIMR &=(~(uint32_t)ETH_MMC_IT); + } + else + { + /* Disable the selected ETHERNET MMC interrupts */ + ETH->MMCTIMR |= ETH_MMC_IT; + } + } +} + +/** + * @brief Checks whether the specified ETHERNET MMC IT is set or not. + * @param ETH_MMC_IT: specifies the ETHERNET MMC interrupt. + * This parameter can be one of the following values: + * @arg ETH_MMC_IT_TxFCGC: When Tx good frame counter reaches half the maximum value + * @arg ETH_MMC_IT_TxMCGC: When Tx good multi col counter reaches half the maximum value + * @arg ETH_MMC_IT_TxSCGC: When Tx good single col counter reaches half the maximum value + * @arg ETH_MMC_IT_RxUGFC: When Rx good unicast frames counter reaches half the maximum value + * @arg ETH_MMC_IT_RxAEC : When Rx alignment error counter reaches half the maximum value + * @arg ETH_MMC_IT_RxCEC : When Rx crc error counter reaches half the maximum value + * @retval : The value of ETHERNET MMC IT (SET or RESET). + */ +ITStatus ETH_GetMMCITStatus(uint32_t ETH_MMC_IT) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_MMC_GET_IT(ETH_MMC_IT)); + + if ((ETH_MMC_IT & (uint32_t)0x10000000) != (uint32_t)RESET) + { + /* ETHERNET MMC Rx interrupts selected */ + /* Check if the ETHERNET MMC Rx selected interrupt is enabled and occured */ + if ((((ETH->MMCRIR & ETH_MMC_IT) != (uint32_t)RESET)) && ((ETH->MMCRIMR & ETH_MMC_IT) != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else + { + /* ETHERNET MMC Tx interrupts selected */ + /* Check if the ETHERNET MMC Tx selected interrupt is enabled and occured */ + if ((((ETH->MMCTIR & ETH_MMC_IT) != (uint32_t)RESET)) && ((ETH->MMCRIMR & ETH_MMC_IT) != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + + return bitstatus; +} + +/** + * @brief Get the specified ETHERNET MMC register value. + * @param ETH_MMCReg: specifies the ETHERNET MMC register. + * This parameter can be one of the following values: + * @arg ETH_MMCCR : MMC CR register + * @arg ETH_MMCRIR : MMC RIR register + * @arg ETH_MMCTIR : MMC TIR register + * @arg ETH_MMCRIMR : MMC RIMR register + * @arg ETH_MMCTIMR : MMC TIMR register + * @arg ETH_MMCTGFSCCR : MMC TGFSCCR register + * @arg ETH_MMCTGFMSCCR: MMC TGFMSCCR register + * @arg ETH_MMCTGFCR : MMC TGFCR register + * @arg ETH_MMCRFCECR : MMC RFCECR register + * @arg ETH_MMCRFAECR : MMC RFAECR register + * @arg ETH_MMCRGUFCR : MMC RGUFCRregister + * @retval : The value of ETHERNET MMC Register value. + */ +uint32_t ETH_GetMMCRegister(uint32_t ETH_MMCReg) +{ + /* Check the parameters */ + assert_param(IS_ETH_MMC_REGISTER(ETH_MMCReg)); + + /* Return the selected register value */ + return (*(__IO uint32_t *)(ETH_MAC_BASE + ETH_MMCReg)); +} +/*--------------------------------- PTP ------------------------------------*/ + +/** + * @brief Updated the PTP block for fine correction with the Time Stamp + * Addend register value. + * @param None + * @retval : None + */ +void ETH_EnablePTPTimeStampAddend(void) +{ + /* Enable the PTP block update with the Time Stamp Addend register value */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSARU; +} + +/** + * @brief Enable the PTP Time Stamp interrupt trigger + * @param None + * @retval : None + */ +void ETH_EnablePTPTimeStampInterruptTrigger(void) +{ + /* Enable the PTP target time interrupt */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSITE; +} + +/** + * @brief Updated the PTP system time with the Time Stamp Update register + * value. + * @param None + * @retval : None + */ +void ETH_EnablePTPTimeStampUpdate(void) +{ + /* Enable the PTP system time update with the Time Stamp Update register value */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSSTU; +} + +/** + * @brief Initialize the PTP Time Stamp + * @param None + * @retval : None + */ +void ETH_InitializePTPTimeStamp(void) +{ + /* Initialize the PTP Time Stamp */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSSTI; +} + +/** + * @brief Selects the PTP Update method + * @param UpdateMethod: the PTP Update method + * This parameter can be one of the following values: + * @arg ETH_PTP_FineUpdate : Fine Update method + * @arg ETH_PTP_CoarseUpdate : Coarse Update method + * @retval : None + */ +void ETH_PTPUpdateMethodConfig(uint32_t UpdateMethod) +{ + /* Check the parameters */ + assert_param(IS_ETH_PTP_UPDATE(UpdateMethod)); + + if (UpdateMethod != ETH_PTP_CoarseUpdate) + { + /* Enable the PTP Fine Update method */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSFCU; + } + else + { + /* Disable the PTP Coarse Update method */ + ETH->PTPTSCR &= (~(uint32_t)ETH_PTPTSCR_TSFCU); + } +} + +/** + * @brief Enables or disables the PTP time stamp for transmit and receive frames. + * @param NewState: new state of the PTP time stamp for transmit and receive frames + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_PTPTimeStampCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the PTP time stamp for transmit and receive frames */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSE; + } + else + { + /* Disable the PTP time stamp for transmit and receive frames */ + ETH->PTPTSCR &= (~(uint32_t)ETH_PTPTSCR_TSE); + } +} + +/** + * @brief Checks whether the specified ETHERNET PTP flag is set or not. + * @param ETH_PTP_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_PTP_FLAG_TSARU : Addend Register Update + * @arg ETH_PTP_FLAG_TSITE : Time Stamp Interrupt Trigger Enable + * @arg ETH_PTP_FLAG_TSSTU : Time Stamp Update + * @arg ETH_PTP_FLAG_TSSTI : Time Stamp Initialize + * @retval : The new state of ETHERNET PTP Flag (SET or RESET). + */ +FlagStatus ETH_GetPTPFlagStatus(uint32_t ETH_PTP_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_PTP_GET_FLAG(ETH_PTP_FLAG)); + + if ((ETH->PTPTSCR & ETH_PTP_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Sets the system time Sub-Second Increment value. + * @param SubSecondValue: specifies the PTP Sub-Second Increment Register value. + * @retval : None + */ +void ETH_SetPTPSubSecondIncrement(uint32_t SubSecondValue) +{ + /* Check the parameters */ + assert_param(IS_ETH_PTP_SUBSECOND_INCREMENT(SubSecondValue)); + /* Set the PTP Sub-Second Increment Register */ + ETH->PTPSSIR = SubSecondValue; +} + +/** + * @brief Sets the Time Stamp update sign and values. + * @param Sign: specifies the PTP Time update value sign. + * This parameter can be one of the following values: + * @arg ETH_PTP_PositiveTime : positive time value. + * @arg ETH_PTP_NegativeTime : negative time value. + * @param SecondValue: specifies the PTP Time update second value. + * @param SubSecondValue: specifies the PTP Time update sub-second value. + * this is a 31 bit value. bit32 correspond to the sign. + * @retval : None + */ +void ETH_SetPTPTimeStampUpdate(uint32_t Sign, uint32_t SecondValue, uint32_t SubSecondValue) +{ + /* Check the parameters */ + assert_param(IS_ETH_PTP_TIME_SIGN(Sign)); + assert_param(IS_ETH_PTP_TIME_STAMP_UPDATE_SUBSECOND(SubSecondValue)); + /* Set the PTP Time Update High Register */ + ETH->PTPTSHUR = SecondValue; + + /* Set the PTP Time Update Low Register with sign */ + ETH->PTPTSLUR = Sign | SubSecondValue; +} + +/** + * @brief Sets the Time Stamp Addend value. + * @param Value: specifies the PTP Time Stamp Addend Register value. + * @retval : None + */ +void ETH_SetPTPTimeStampAddend(uint32_t Value) +{ + /* Set the PTP Time Stamp Addend Register */ + ETH->PTPTSAR = Value; +} + +/** + * @brief Sets the Target Time registers values. + * @param HighValue: specifies the PTP Target Time High Register value. + * @param LowValue: specifies the PTP Target Time Low Register value. + * @retval : None + */ +void ETH_SetPTPTargetTime(uint32_t HighValue, uint32_t LowValue) +{ + /* Set the PTP Target Time High Register */ + ETH->PTPTTHR = HighValue; + /* Set the PTP Target Time Low Register */ + ETH->PTPTTLR = LowValue; +} + +/** + * @brief Get the specified ETHERNET PTP register value. + * @param ETH_PTPReg: specifies the ETHERNET PTP register. + * This parameter can be one of the following values: + * @arg ETH_PTPTSCR : Sub-Second Increment Register + * @arg ETH_PTPSSIR : Sub-Second Increment Register + * @arg ETH_PTPTSHR : Time Stamp High Register + * @arg ETH_PTPTSLR : Time Stamp Low Register + * @arg ETH_PTPTSHUR : Time Stamp High Update Register + * @arg ETH_PTPTSLUR : Time Stamp Low Update Register + * @arg ETH_PTPTSAR : Time Stamp Addend Register + * @arg ETH_PTPTTHR : Target Time High Register + * @arg ETH_PTPTTLR : Target Time Low Register + * @retval : The value of ETHERNET PTP Register value. + */ +uint32_t ETH_GetPTPRegister(uint32_t ETH_PTPReg) +{ + /* Check the parameters */ + assert_param(IS_ETH_PTP_REGISTER(ETH_PTPReg)); + + /* Return the selected register value */ + return (*(__IO uint32_t *)(ETH_MAC_BASE + ETH_PTPReg)); +} + +/** + * @brief Initializes the DMA Tx descriptors in chain mode with PTP. + * @param DMATxDescTab: Pointer on the first Tx desc list + * @param DMAPTPTxDescTab: Pointer on the first PTP Tx desc list + * @param TxBuff: Pointer on the first TxBuffer list + * @param TxBuffCount: Number of the used Tx desc in the list + * @retval : None + */ +void ETH_DMAPTPTxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, ETH_DMADESCTypeDef *DMAPTPTxDescTab, uint8_t* TxBuff, uint32_t TxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMATxDesc; + + /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */ + DMATxDescToSet = DMATxDescTab; + DMAPTPTxDescToSet = DMAPTPTxDescTab; + /* Fill each DMATxDesc descriptor with the right values */ + for(i=0; i < TxBuffCount; i++) + { + /* Get the pointer on the ith member of the Tx Desc list */ + DMATxDesc = DMATxDescTab+i; + /* Set Second Address Chained bit and enable PTP */ + DMATxDesc->Status = ETH_DMATxDesc_TCH | ETH_DMATxDesc_TTSE; + + /* Set Buffer1 address pointer */ + DMATxDesc->Buffer1Addr =(uint32_t)(&TxBuff[i*ETH_MAX_PACKET_SIZE]); + + /* Initialize the next descriptor with the Next Desciptor Polling Enable */ + if(i < (TxBuffCount-1)) + { + /* Set next descriptor address register with next descriptor base address */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t)(DMATxDescTab+i+1); + } + else + { + /* For last descriptor, set next descriptor address register equal to the first descriptor base address */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t) DMATxDescTab; + } + /* make DMAPTPTxDescTab points to the same addresses as DMATxDescTab */ + (&DMAPTPTxDescTab[i])->Buffer1Addr = DMATxDesc->Buffer1Addr; + (&DMAPTPTxDescTab[i])->Buffer2NextDescAddr = DMATxDesc->Buffer2NextDescAddr; + } + /* Store on the last DMAPTPTxDescTab desc status record the first list address */ + (&DMAPTPTxDescTab[i-1])->Status = (uint32_t) DMAPTPTxDescTab; + + /* Set Transmit Desciptor List Address Register */ + ETH->DMATDLAR = (uint32_t) DMATxDescTab; +} + +/** + * @brief Initializes the DMA Rx descriptors in chain mode. + * @param DMARxDescTab: Pointer on the first Rx desc list + * @param DMAPTPRxDescTab: Pointer on the first PTP Rx desc list + * @param RxBuff: Pointer on the first RxBuffer list + * @param RxBuffCount: Number of the used Rx desc in the list + * @retval : None + */ +void ETH_DMAPTPRxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, ETH_DMADESCTypeDef *DMAPTPRxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMARxDesc; + + /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */ + DMARxDescToGet = DMARxDescTab; + DMAPTPRxDescToGet = DMAPTPRxDescTab; + /* Fill each DMARxDesc descriptor with the right values */ + for(i=0; i < RxBuffCount; i++) + { + /* Get the pointer on the ith member of the Rx Desc list */ + DMARxDesc = DMARxDescTab+i; + /* Set Own bit of the Rx descriptor Status */ + DMARxDesc->Status = ETH_DMARxDesc_OWN; + + /* Set Buffer1 size and Second Address Chained bit */ + DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_MAX_PACKET_SIZE; + /* Set Buffer1 address pointer */ + DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff[i*ETH_MAX_PACKET_SIZE]); + + /* Initialize the next descriptor with the Next Desciptor Polling Enable */ + if(i < (RxBuffCount-1)) + { + /* Set next descriptor address register with next descriptor base address */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab+i+1); + } + else + { + /* For last descriptor, set next descriptor address register equal to the first descriptor base address */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab); + } + /* Make DMAPTPRxDescTab points to the same addresses as DMARxDescTab */ + (&DMAPTPRxDescTab[i])->Buffer1Addr = DMARxDesc->Buffer1Addr; + (&DMAPTPRxDescTab[i])->Buffer2NextDescAddr = DMARxDesc->Buffer2NextDescAddr; + } + /* Store on the last DMAPTPRxDescTab desc status record the first list address */ + (&DMAPTPRxDescTab[i-1])->Status = (uint32_t) DMAPTPRxDescTab; + + /* Set Receive Desciptor List Address Register */ + ETH->DMARDLAR = (uint32_t) DMARxDescTab; +} + +/** + * @brief Transmits a packet, from application buffer, pointed by ppkt with + * Time Stamp values. + * @param ppkt: pointer to application packet buffer to transmit. + * @param FrameLength: Tx Packet size. + * @param PTPTxTab: Pointer on the first PTP Tx table to store Time stamp values. + * @retval : ETH_ERROR: in case of Tx desc owned by DMA + * ETH_SUCCESS: for correct transmission + */ +uint32_t ETH_HandlePTPTxPkt(uint8_t *ppkt, uint16_t FrameLength, uint32_t *PTPTxTab) +{ + uint32_t offset = 0, timeout = 0; + /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */ + if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (uint32_t)RESET) + { + /* Return ERROR: OWN bit set */ + return ETH_ERROR; + } + /* Copy the frame to be sent into memory pointed by the current ETHERNET DMA Tx descriptor */ + for(offset=0; offsetBuffer1Addr) + offset)) = (*(ppkt + offset)); + } + /* Setting the Frame Length: bits[12:0] */ + DMATxDescToSet->ControlBufferSize = (FrameLength & (uint32_t)0x1FFF); + /* Setting the last segment and first segment bits (in this case a frame is transmitted in one descriptor) */ + DMATxDescToSet->Status |= ETH_DMATxDesc_LS | ETH_DMATxDesc_FS; + /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMATxDescToSet->Status |= ETH_DMATxDesc_OWN; + /* When Tx Buffer unavailable flag is set: clear it and resume transmission */ + if ((ETH->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET) + { + /* Clear TBUS ETHERNET DMA flag */ + ETH->DMASR = ETH_DMASR_TBUS; + /* Resume DMA transmission*/ + ETH->DMATPDR = 0; + } + /* Wait for ETH_DMATxDesc_TTSS flag to be set */ + do + { + timeout++; + } while (!(DMATxDescToSet->Status & ETH_DMATxDesc_TTSS) && (timeout < 0xFFFF)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_READ_TO) + { + return ETH_ERROR; + } + /* Clear the DMATxDescToSet status register TTSS flag */ + DMATxDescToSet->Status &= ~ETH_DMATxDesc_TTSS; + *PTPTxTab++ = DMATxDescToSet->Buffer1Addr; + *PTPTxTab = DMATxDescToSet->Buffer2NextDescAddr; + /* Update the ENET DMA current descriptor */ + /* Chained Mode */ + if((DMATxDescToSet->Status & ETH_DMATxDesc_TCH) != (uint32_t)RESET) + { + /* Selects the next DMA Tx descriptor list for next buffer read */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) (DMAPTPTxDescToSet->Buffer2NextDescAddr); + if(DMAPTPTxDescToSet->Status != 0) + { + DMAPTPTxDescToSet = (ETH_DMADESCTypeDef*) (DMAPTPTxDescToSet->Status); + } + else + { + DMAPTPTxDescToSet++; + } + } + else /* Ring Mode */ + { + if((DMATxDescToSet->Status & ETH_DMATxDesc_TER) != (uint32_t)RESET) + { + /* Selects the next DMA Tx descriptor list for next buffer read: this will + be the first Tx descriptor in this case */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) (ETH->DMATDLAR); + DMAPTPTxDescToSet = (ETH_DMADESCTypeDef*) (ETH->DMATDLAR); + } + else + { + /* Selects the next DMA Tx descriptor list for next buffer read */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) ((uint32_t)DMATxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + DMAPTPTxDescToSet = (ETH_DMADESCTypeDef*) ((uint32_t)DMAPTPTxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** + * @brief Receives a packet and copies it to memory pointed by ppkt with + * Time Stamp values. + * @param ppkt: pointer to application packet receive buffer. + * @param PTPRxTab: Pointer on the first PTP Rx table to store Time stamp values. + * @retval : ETH_ERROR: if there is error in reception + * framelength: received packet size if packet reception is correct + */ +uint32_t ETH_HandlePTPRxPkt(uint8_t *ppkt, uint32_t *PTPRxTab) +{ + uint32_t offset = 0, framelength = 0; + /* Check if the descriptor is owned by the ENET or CPU */ + if((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) != (uint32_t)RESET) + { + /* Return error: OWN bit set */ + return ETH_ERROR; + } + if(((DMARxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)) + { + /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */ + framelength = ((DMARxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARxDesc_FrameLengthShift) - 4; + /* Copy the received frame into buffer from memory pointed by the current ETHERNET DMA Rx descriptor */ + for(offset=0; offsetBuffer1Addr) + offset)); + } + } + else + { + /* Return ERROR */ + framelength = ETH_ERROR; + } + /* When Rx Buffer unavailable flag is set: clear it and resume reception */ + if ((ETH->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET) + { + /* Clear RBUS ETHERNET DMA flag */ + ETH->DMASR = ETH_DMASR_RBUS; + /* Resume DMA reception */ + ETH->DMARPDR = 0; + } + *PTPRxTab++ = DMARxDescToGet->Buffer1Addr; + *PTPRxTab = DMARxDescToGet->Buffer2NextDescAddr; + /* Set Own bit of the Rx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMARxDescToGet->Status |= ETH_DMARxDesc_OWN; + /* Update the ETHERNET DMA global Rx descriptor with next Rx decriptor */ + /* Chained Mode */ + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RCH) != (uint32_t)RESET) + { + /* Selects the next DMA Rx descriptor list for next buffer read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMAPTPRxDescToGet->Buffer2NextDescAddr); + if(DMAPTPRxDescToGet->Status != 0) + { + DMAPTPRxDescToGet = (ETH_DMADESCTypeDef*) (DMAPTPRxDescToGet->Status); + } + else + { + DMAPTPRxDescToGet++; + } + } + else /* Ring Mode */ + { + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RER) != (uint32_t)RESET) + { + /* Selects the first DMA Rx descriptor for next buffer to read: last Rx descriptor was used */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (ETH->DMARDLAR); + } + else + { + /* Selects the next DMA Rx descriptor list for next buffer to read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) ((uint32_t)DMARxDescToGet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + /* Return Frame Length/ERROR */ + return (framelength); +} +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/uip/clock-arch.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/uip/clock-arch.c new file mode 100644 index 00000000..1e213136 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/uip/clock-arch.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: clock-arch.c,v 1.2 2006/06/12 08:00:31 adam Exp $ + */ + +/** + * \file + * Implementation of architecture-specific clock functionality + * \author + * Adam Dunkels + */ + +#include "clock-arch.h" +#include "boot.h" + +/*---------------------------------------------------------------------------*/ +clock_time_t +clock_time(void) +{ + return (clock_time_t)TimerGet(); +} +/*---------------------------------------------------------------------------*/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/uip/clock-arch.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/uip/clock-arch.h new file mode 100644 index 00000000..aa97f0e7 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/uip/clock-arch.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: clock-arch.h,v 1.2 2006/06/12 08:00:31 adam Exp $ + */ + +#ifndef __CLOCK_ARCH_H__ +#define __CLOCK_ARCH_H__ + +typedef int clock_time_t; +#define CLOCK_CONF_SECOND 1000 + +#endif /* __CLOCK_ARCH_H__ */ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/uip/netdev.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/uip/netdev.c new file mode 100644 index 00000000..09d0d2a7 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/uip/netdev.c @@ -0,0 +1,451 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Author: Adam Dunkels + * + * $Id: netdev.c,v 1.8 2006/06/07 08:39:58 adam Exp $ + */ + + +/*---------------------------------------------------------------------------*/ +#include "uip.h" +#include "uip_arp.h" +#include "boot.h" +#include "stm32f4xx.h" /* STM32 registers */ +#include "stm32f4xx_conf.h" /* STM32 peripheral drivers */ +#include "stm32_eth.h" /* STM32 ethernet library */ +#include /* for memcpy */ + + +/*---------------------------------------------------------------------------*/ +#define NETDEV_DEFAULT_MACADDR0 (0x08) +#define NETDEV_DEFAULT_MACADDR1 (0x00) +#define NETDEV_DEFAULT_MACADDR2 (0x27) +#define NETDEV_DEFAULT_MACADDR3 (0x69) +#define NETDEV_DEFAULT_MACADDR4 (0x5B) +#define NETDEV_DEFAULT_MACADDR5 (0x45) + + +/*---------------------------------------------------------------------------*/ +static void netdev_TxDscrInit(void); +static void netdev_RxDscrInit(void); + +/*---------------------------------------------------------------------------*/ +typedef union _TranDesc0_t +{ + uint32_t Data; + struct { + uint32_t DB : 1; + uint32_t UF : 1; + uint32_t ED : 1; + uint32_t CC : 4; + uint32_t VF : 1; + uint32_t EC : 1; + uint32_t LC : 1; + uint32_t NC : 1; + uint32_t LSC : 1; + uint32_t IPE : 1; + uint32_t FF : 1; + uint32_t JT : 1; + uint32_t ES : 1; + uint32_t IHE : 1; + uint32_t : 3; + uint32_t TCH : 1; + uint32_t TER : 1; + uint32_t CIC : 2; + uint32_t : 2; + uint32_t DP : 1; + uint32_t DC : 1; + uint32_t FS : 1; + uint32_t LSEG : 1; + uint32_t IC : 1; + uint32_t OWN : 1; + }; +} TranDesc0_t, * pTranDesc0_t; + +typedef union _TranDesc1_t +{ + uint32_t Data; + struct { + uint32_t TBS1 :13; + uint32_t : 3; + uint32_t TBS2 :12; + uint32_t : 3; + }; +} TranDesc1_t, * pTranDesc1_t; + +typedef union _RecDesc0_t +{ + uint32_t Data; + struct { + uint32_t RMAM_PCE : 1; + uint32_t CE : 1; + uint32_t DE : 1; + uint32_t RE : 1; + uint32_t RWT : 1; + uint32_t FT : 1; + uint32_t LC : 1; + uint32_t IPHCE : 1; + uint32_t LS : 1; + uint32_t FS : 1; + uint32_t VLAN : 1; + uint32_t OE : 1; + uint32_t LE : 1; + uint32_t SAF : 1; + uint32_t DERR : 1; + uint32_t ES : 1; + uint32_t FL :14; + uint32_t AFM : 1; + uint32_t OWN : 1; + }; +} RecDesc0_t, * pRecDesc0_t; + +typedef union _recDesc1_t +{ + uint32_t Data; + struct { + uint32_t RBS1 :13; + uint32_t : 1; + uint32_t RCH : 1; + uint32_t RER : 1; + uint32_t RBS2 :14; + uint32_t DIC : 1; + }; +} RecDesc1_t, * pRecDesc1_t; + +typedef union _EnetDmaDesc_t +{ + uint32_t Data[4]; + // Rx DMA descriptor + struct + { + RecDesc0_t RxDesc0; + RecDesc1_t RxDesc1; + uint32_t * pBuffer; + union + { + uint32_t * pBuffer2; + union _EnetDmaDesc_t * pEnetDmaNextDesc; + }; + } Rx; + // Tx DMA descriptor + struct + { + TranDesc0_t TxDesc0; + TranDesc1_t TxDesc1; + uint32_t * pBuffer1; + union + { + uint32_t * pBuffer2; + union _EnetDmaDesc_t * pEnetDmaNextDesc; + }; + } Tx; +} EnetDmaDesc_t, * pEnetDmaDesc_t; + + +/*---------------------------------------------------------------------------*/ +uint8_t RxBuff[UIP_CONF_BUFFER_SIZE] __attribute__ ((aligned (4))); +uint8_t TxBuff[UIP_CONF_BUFFER_SIZE] __attribute__ ((aligned (4))); + +EnetDmaDesc_t EnetDmaRx __attribute__((aligned (128))); +EnetDmaDesc_t EnetDmaTx __attribute__ ((aligned (128))); + + +/*---------------------------------------------------------------------------*/ +void netdev_init(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + ETH_InitTypeDef ETH_InitStructure; + + /* Enable ETHERNET clocks */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx | + RCC_AHB1Periph_ETH_MAC_Rx | RCC_AHB1Periph_ETH_MAC_PTP, ENABLE); + + + /* Enable GPIOs clocks */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | + RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOG, ENABLE); + + /* Enable SYSCFG clock */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); + /*Select RMII Interface*/ + SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII); + + /* ETHERNET pins configuration */ + /* PA + ETH_RMII_REF_CLK: PA1 + ETH_RMII_MDIO: PA2 + ETH_RMII_MDINT: PA3 + ETH_RMII_CRS_DV: PA7 + */ + + /* Configure PA1, PA2, PA3 and PA7*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + /* Connect PA1, PA2, PA3 and PA7 to ethernet module*/ + GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH); + + /* PB + ETH_RMII_TX_EN: PG11 + */ + + /* Configure PG11*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOG, &GPIO_InitStructure); + + /* Connect PG11 to ethernet module*/ + GPIO_PinAFConfig(GPIOG, GPIO_PinSource11, GPIO_AF_ETH); + + /* PC + ETH_RMII_MDC: PC1 + ETH_RMII_RXD0: PC4 + ETH_RMII_RXD1: PC5 + */ + + /* Configure PC1, PC4 and PC5*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + /* Connect PC1, PC4 and PC5 to ethernet module*/ + GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH); + + /* PG + ETH_RMII_TXD0: PG13 + ETH_RMII_TXD1: PG14 + */ + + /* Configure PG13 and PG14*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOG, &GPIO_InitStructure); + + /* Connect PG13 and PG14 to ethernet module*/ + GPIO_PinAFConfig(GPIOG, GPIO_PinSource13, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOG, GPIO_PinSource14, GPIO_AF_ETH); + + /* Reset ETHERNET on AHB Bus */ + ETH_DeInit(); + + /* Software reset */ + ETH_SoftwareReset(); + + /* Wait for software reset */ + while(ETH_GetSoftwareResetStatus()==SET); + + /* ETHERNET Configuration ------------------------------------------------------*/ + /* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */ + ETH_StructInit(Ð_InitStructure); + + /* Fill ETH_InitStructure parametrs */ + /*------------------------ MAC -----------------------------------*/ + ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable ; + ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable; + ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable; + ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable; + ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Enable; + ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable; + ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable; + ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect; + ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect; + ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex; + ETH_InitStructure.ETH_Speed = ETH_Speed_100M; + + unsigned int PhyAddr; + union { + uint32_t HI_LO; + struct + { + uint16_t LO; + uint16_t HI; + }; + } PHYID; + for(PhyAddr = 0; 32 > PhyAddr; PhyAddr++) + { + // datasheet for the ks8721bl ethernet controller (http://www.micrel.com/_PDF/Ethernet/datasheets/ks8721bl-sl.pdf) + // page 20 --> PHY Identifier 1 and 2 + PHYID.HI = ETH_ReadPHYRegister(PhyAddr,2); // 0x0022 + PHYID.LO = ETH_ReadPHYRegister(PhyAddr,3); // 0x1619 + if ((0x00221619 == PHYID.HI_LO) || (0x0007C0F1 == PHYID.HI_LO)) + break; + } + if (32 < PhyAddr) + { + ASSERT_RT(BLT_FALSE); + } + /* Configure Ethernet */ + if(0 == ETH_Init(Ð_InitStructure, PhyAddr)) + { + ASSERT_RT(BLT_FALSE); + } + + netdev_TxDscrInit(); + netdev_RxDscrInit(); + ETH_Start(); +} + + +/*---------------------------------------------------------------------------*/ +void netdev_init_mac(void) +{ + struct uip_eth_addr macAddress; + + /* set the default MAC address */ + macAddress.addr[0] = NETDEV_DEFAULT_MACADDR0; + macAddress.addr[1] = NETDEV_DEFAULT_MACADDR1; + macAddress.addr[2] = NETDEV_DEFAULT_MACADDR2; + macAddress.addr[3] = NETDEV_DEFAULT_MACADDR3; + macAddress.addr[4] = NETDEV_DEFAULT_MACADDR4; + macAddress.addr[5] = NETDEV_DEFAULT_MACADDR5; + uip_setethaddr(macAddress); +} + + +/*---------------------------------------------------------------------------*/ +unsigned int netdev_read(void) +{ + uint32_t size; + /*check for validity*/ + if(0 == EnetDmaRx.Rx.RxDesc0.OWN) + { + /*Get the size of the packet*/ + size = EnetDmaRx.Rx.RxDesc0.FL; // CRC + memcpy(uip_buf, RxBuff, size); //string.h library*/ + } + else + { + return 0; + } + /* Give the buffer back to ENET */ + EnetDmaRx.Rx.RxDesc0.OWN = 1; + /* Start the receive operation */ + ETH->DMARPDR = 1; + /* Return no error */ + return size; +} + + +/*---------------------------------------------------------------------------*/ +void netdev_send(void) +{ + while(EnetDmaTx.Tx.TxDesc0.OWN); + + /* Copy the application buffer to the driver buffer + Using this MEMCOPY_L2L_BY4 makes the copy routine faster + than memcpy */ + memcpy(TxBuff, uip_buf, uip_len); + + /* Assign ENET address to Temp Tx Array */ + EnetDmaTx.Tx.pBuffer1 = (uint32_t *)TxBuff; + + /* Setting the Frame Length*/ + EnetDmaTx.Tx.TxDesc0.Data = 0; + EnetDmaTx.Tx.TxDesc0.TCH = 1; + EnetDmaTx.Tx.TxDesc0.LSEG = 1; + EnetDmaTx.Tx.TxDesc0.FS = 1; + EnetDmaTx.Tx.TxDesc0.DC = 0; + EnetDmaTx.Tx.TxDesc0.DP = 0; + + EnetDmaTx.Tx.TxDesc1.Data = 0; + EnetDmaTx.Tx.TxDesc1.TBS1 = (uip_len&0xFFF); + + /* Start the ENET by setting the VALID bit in dmaPackStatus of current descr*/ + EnetDmaTx.Tx.TxDesc0.OWN = 1; + + /* Start the transmit operation */ + ETH->DMATPDR = 1; +} + + +/*---------------------------------------------------------------------------*/ +static void netdev_RxDscrInit(void) +{ + /* Initialization */ + /* Assign temp Rx array to the ENET buffer */ + EnetDmaRx.Rx.pBuffer = (uint32_t *)RxBuff; + + /* Initialize RX ENET Status and control */ + EnetDmaRx.Rx.RxDesc0.Data = 0; + + /* Initialize the next descriptor- In our case its single descriptor */ + EnetDmaRx.Rx.pEnetDmaNextDesc = &EnetDmaRx; + + EnetDmaRx.Rx.RxDesc1.Data = 0; + EnetDmaRx.Rx.RxDesc1.RER = 0; // end of ring + EnetDmaRx.Rx.RxDesc1.RCH = 1; // end of ring + + /* Set the max packet size */ + EnetDmaRx.Rx.RxDesc1.RBS1 = UIP_CONF_BUFFER_SIZE; + + /* Setting the VALID bit */ + EnetDmaRx.Rx.RxDesc0.OWN = 1; + /* Setting the RX NEXT Descriptor Register inside the ENET */ + ETH->DMARDLAR = (uint32_t)&EnetDmaRx; +} + + +/*---------------------------------------------------------------------------*/ +static void netdev_TxDscrInit(void) +{ + /* ENET Start Address */ + EnetDmaTx.Tx.pBuffer1 = (uint32_t *)TxBuff; + + /* Next Descriptor Address */ + EnetDmaTx.Tx.pEnetDmaNextDesc = &EnetDmaTx; + + /* Initialize ENET status and control */ + EnetDmaTx.Tx.TxDesc0.TCH = 1; + EnetDmaTx.Tx.TxDesc0.Data = 0; + EnetDmaTx.Tx.TxDesc1.Data = 0; + /* Tx next set to Tx descriptor base */ + ETH->DMATDLAR = (uint32_t)&EnetDmaTx; + +} diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/uip/netdev.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/uip/netdev.h new file mode 100644 index 00000000..4ea59ce5 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/uip/netdev.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Adam Dunkels. + * 4. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: netdev.h,v 1.1 2002/01/10 06:22:56 adam Exp $ + * + */ + +#ifndef __NETDEV_H__ +#define __NETDEV_H__ + +void netdev_init(void); +void netdev_init_mac(void); +unsigned int netdev_read(void); +void netdev_send(void); + +#endif /* __NETDEV_H__ */ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/uip/uip-conf.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/uip/uip-conf.h new file mode 100644 index 00000000..fd9ba0dd --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/uip/uip-conf.h @@ -0,0 +1,151 @@ +/** + * \addtogroup uipopt + * @{ + */ + +/** + * \name Project-specific configuration options + * @{ + * + * uIP has a number of configuration options that can be overridden + * for each project. These are kept in a project-specific uip-conf.h + * file and all configuration names have the prefix UIP_CONF. + */ + +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: uip-conf.h,v 1.6 2006/06/12 08:00:31 adam Exp $ + */ + +/** + * \file + * An example uIP configuration file + * \author + * Adam Dunkels + */ + +#ifndef __UIP_CONF_H__ +#define __UIP_CONF_H__ + + +/** + * 8 bit datatype + * + * This typedef defines the 8-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef unsigned char u8_t; + +/** + * 16 bit datatype + * + * This typedef defines the 16-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef unsigned short u16_t; + +/** + * Statistics datatype + * + * This typedef defines the dataype used for keeping statistics in + * uIP. + * + * \hideinitializer + */ +typedef unsigned short uip_stats_t; + +/** + * Maximum number of TCP connections. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_CONNECTIONS 1 + +/** + * Maximum number of listening TCP ports. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_LISTENPORTS 1 + +/** + * uIP buffer size. + * + * \hideinitializer + */ +#define UIP_CONF_BUFFER_SIZE 1600 + +/** + * CPU byte order. + * + * \hideinitializer + */ +#define UIP_CONF_BYTE_ORDER LITTLE_ENDIAN + +/** + * Logging on or off + * + * \hideinitializer + */ +#define UIP_CONF_LOGGING 0 + +/** + * UDP support on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP 0 + +/** + * UDP checksums on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP_CHECKSUMS 1 + +/** + * uIP statistics on or off + * + * \hideinitializer + */ +#define UIP_CONF_STATISTICS 0 + +/* Here we include the header file for the application(s) we use in + our project. */ +#include "boot.h" +#include "net.h" + +#endif /* __UIP_CONF_H__ */ + +/** @} */ +/** @} */ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/makefile b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/makefile index 98c6698f..c489cc5a 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/makefile +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/makefile @@ -40,6 +40,13 @@ hooks.c \ main.c \ ./lib/fatfs/ffconf.h \ ./lib/fatfs/mmc.c \ +./lib/ethernetlib/inc/stm32_eth.h \ +./lib/ethernetlib/src/stm32_eth.c \ +./lib/uip/clock-arch.c \ +./lib/uip/clock-arch.h \ +./lib/uip/netdev.c \ +./lib/uip/netdev.h \ +./lib/uip/uip-conf.h \ ./lib/stdperiphlib/stm32f4xx_conf.h \ ./lib/stdperiphlib/STM32F4xx_StdPeriph_Driver/inc/misc.h \ ./lib/stdperiphlib/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_adc.h \ @@ -110,10 +117,30 @@ main.c \ ../../../Source/third_party/fatfs/src/ff.h \ ../../../Source/third_party/fatfs/src/integer.h \ ../../../Source/third_party/fatfs/src/option/unicode.c \ +../../../Source/third_party/uip/uip/clock.h \ +../../../Source/third_party/uip/uip/lc-addrlabels.h \ +../../../Source/third_party/uip/uip/lc-switch.h \ +../../../Source/third_party/uip/uip/lc.h \ +../../../Source/third_party/uip/uip/pt.h \ +../../../Source/third_party/uip/uip/uip-fw.h \ +../../../Source/third_party/uip/uip/uip-neighbor.h \ +../../../Source/third_party/uip/uip/uip-split.h \ +../../../Source/third_party/uip/uip/uip.c \ +../../../Source/third_party/uip/uip/uip.h \ +../../../Source/third_party/uip/uip/uip_arch.h \ +../../../Source/third_party/uip/uip/uip_arp.c \ +../../../Source/third_party/uip/uip/uip_arp.h \ +../../../Source/third_party/uip/uip/uip_timer.c \ +../../../Source/third_party/uip/uip/uip_timer.h \ +../../../Source/third_party/uip/uip/uiplib.c \ +../../../Source/third_party/uip/uip/uiplib.h \ +../../../Source/third_party/uip/uip/uipopt.h \ ../../../Source/boot.c \ ../../../Source/boot.h \ ../../../Source/com.c \ ../../../Source/com.h \ +../../../Source/net.c \ +../../../Source/net.h \ ../../../Source/xcp.c \ ../../../Source/xcp.h \ ../../../Source/backdoor.c \ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/bin/demoprog_olimex_stm32e407.elf b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/bin/demoprog_olimex_stm32e407.elf index ad51dacc..ba11bbf0 100644 Binary files a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/bin/demoprog_olimex_stm32e407.elf and b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/bin/demoprog_olimex_stm32e407.elf differ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/bin/demoprog_olimex_stm32e407.map b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/bin/demoprog_olimex_stm32e407.map index fa8b24c2..7351c25c 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/bin/demoprog_olimex_stm32e407.map +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/bin/demoprog_olimex_stm32e407.map @@ -3,47 +3,49 @@ bin/demoprog_olimex_stm32e407.elf: file format elf32-littlearm bin/demoprog_olimex_stm32e407.elf architecture: arm, flags 0x00000112: EXEC_P, HAS_SYMS, D_PAGED -start address 0x08008000 +start address 0x0800c000 Program Header: - LOAD off 0x00008000 vaddr 0x08008000 paddr 0x08008000 align 2**15 - filesz 0x00000e70 memsz 0x00000e70 flags r-x - LOAD off 0x00010000 vaddr 0x20000000 paddr 0x08008e70 align 2**15 - filesz 0x00000014 memsz 0x00000868 flags rw- + LOAD off 0x00000000 vaddr 0x08008000 paddr 0x08008000 align 2**15 + filesz 0x00007128 memsz 0x00007128 flags r-x + LOAD off 0x00008000 vaddr 0x20000000 paddr 0x0800f128 align 2**15 + filesz 0x00000014 memsz 0x00000014 flags rw- + LOAD off 0x00008080 vaddr 0x20000080 paddr 0x0800f200 align 2**15 + filesz 0x00000000 memsz 0x00001c9c flags rw- private flags = 5000202: [Version5 EABI] [soft-float ABI] [has entry point] Sections: Idx Name Size VMA LMA File off Algn - 0 .text 00000e70 08008000 08008000 00008000 2**2 + 0 .text 00003128 0800c000 0800c000 00004000 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .data 00000014 20000000 08008e70 00010000 2**2 + 1 .data 00000014 20000000 0800f128 00008000 2**2 CONTENTS, ALLOC, LOAD, DATA - 2 .bss 00000854 20000014 08008e84 00010014 2**2 + 2 .bss 00001c9c 20000080 0800f200 00008080 2**7 ALLOC - 3 .debug_info 00004f05 00000000 00000000 00010014 2**0 + 3 .debug_info 00009528 00000000 00000000 00008014 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_abbrev 00001212 00000000 00000000 00014f19 2**0 + 4 .debug_abbrev 00001e7d 00000000 00000000 0001153c 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_loc 000023a4 00000000 00000000 0001612b 2**0 + 5 .debug_loc 00003ba9 00000000 00000000 000133b9 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_aranges 00000538 00000000 00000000 000184cf 2**0 + 6 .debug_aranges 000009f8 00000000 00000000 00016f62 2**0 CONTENTS, READONLY, DEBUGGING - 7 .debug_ranges 00000478 00000000 00000000 00018a07 2**0 + 7 .debug_ranges 000008d8 00000000 00000000 0001795a 2**0 CONTENTS, READONLY, DEBUGGING - 8 .debug_line 00001b4c 00000000 00000000 00018e7f 2**0 + 8 .debug_line 0000321a 00000000 00000000 00018232 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_str 00001e2c 00000000 00000000 0001a9cb 2**0 + 9 .debug_str 000038bb 00000000 00000000 0001b44c 2**0 CONTENTS, READONLY, DEBUGGING - 10 .comment 00000030 00000000 00000000 0001c7f7 2**0 + 10 .comment 00000030 00000000 00000000 0001ed07 2**0 CONTENTS, READONLY - 11 .ARM.attributes 00000033 00000000 00000000 0001c827 2**0 + 11 .ARM.attributes 00000033 00000000 00000000 0001ed37 2**0 CONTENTS, READONLY - 12 .debug_frame 000009d0 00000000 00000000 0001c85c 2**2 + 12 .debug_frame 000014a4 00000000 00000000 0001ed6c 2**2 CONTENTS, READONLY, DEBUGGING SYMBOL TABLE: -08008000 l d .text 00000000 .text +0800c000 l d .text 00000000 .text 20000000 l d .data 00000000 .data -20000014 l d .bss 00000000 .bss +20000080 l d .bss 00000000 .bss 00000000 l d .debug_info 00000000 .debug_info 00000000 l d .debug_abbrev 00000000 .debug_abbrev 00000000 l d .debug_loc 00000000 .debug_loc @@ -56,68 +58,148 @@ SYMBOL TABLE: 00000000 l d .debug_frame 00000000 .debug_frame 00000000 l df *ABS* 00000000 vectors.c 00000000 l df *ABS* 00000000 boot.c -0800818c l F .text 00000022 NVIC_SystemReset -080081b0 l F .text 00000038 UartReceiveByte -20000014 l O .bss 00000041 xcpCtoReqPacket.7486 -20000058 l O .bss 00000001 xcpCtoRxLength.7487 -20000059 l O .bss 00000001 xcpCtoRxInProgress.7488 -08008e4c l O .text 00000024 canTiming +0800c18c l F .text 00000022 NVIC_SystemReset +0800c1b0 l F .text 00000038 UartReceiveByte +20000080 l O .bss 00000041 xcpCtoReqPacket.7497 +200000c4 l O .bss 00000001 xcpCtoRxLength.7498 +200000c5 l O .bss 00000001 xcpCtoRxInProgress.7499 +0800f0fc l O .text 00000024 canTiming 00000000 l df *ABS* 00000000 cstart.c -08008518 l F .text 00000000 zero_loop +0800c524 l F .text 00000000 zero_loop 00000000 l df *ABS* 00000000 irq.c 00000000 l df *ABS* 00000000 led.c -2000005c l O .bss 00000004 timer_counter_last.7467 -20000060 l O .bss 00000001 led_toggle_state.7466 +200000c8 l O .bss 00000004 timer_counter_last.7478 +200000cc l O .bss 00000001 led_toggle_state.7477 +00000000 l df *ABS* 00000000 net.c +200000d0 l O .bss 00000004 ARPTimerTimeOut +200000d4 l O .bss 00000004 periodicTimerTimeOut 00000000 l df *ABS* 00000000 main.c 00000000 l df *ABS* 00000000 timer.c -20000064 l O .bss 00000004 millisecond_counter +200000d8 l O .bss 00000004 millisecond_counter +00000000 l df *ABS* 00000000 stm32_eth.c +00000000 l df *ABS* 00000000 netdev.c 00000000 l df *ABS* 00000000 stm32f4xx_can.c 00000000 l df *ABS* 00000000 stm32f4xx_gpio.c 00000000 l df *ABS* 00000000 stm32f4xx_rcc.c 20000000 l O .data 00000010 APBAHBPrescTable +00000000 l df *ABS* 00000000 stm32f4xx_syscfg.c 00000000 l df *ABS* 00000000 stm32f4xx_usart.c 00000000 l df *ABS* 00000000 system_stm32f4xx.c +00000000 l df *ABS* 00000000 uip.c +0800d96c l F .text 0000004c chksum +0800d9b8 l F .text 00000046 upper_layer_chksum +0800da80 l F .text 00000036 uip_add_rcv_nxt +200000dc l O .bss 00000002 tmp16 +200000de l O .bss 00000002 ipid +200000e0 l O .bss 00000004 iss +200000e4 l O .bss 00000002 lastport +200000f0 l O .bss 00000001 c +200000f1 l O .bss 00000001 opt +00000000 l df *ABS* 00000000 uip_arp.c +0800eb2c l F .text 00000116 uip_arp_update +200000f2 l O .bss 00000001 i +200000f3 l O .bss 00000001 tmpage +200000f4 l O .bss 00000060 arp_table +0800f120 l O .text 00000006 broadcast_ethaddr +20000154 l O .bss 00000001 c +20000155 l O .bss 00000001 arptime +20000158 l O .bss 00000004 ipaddr +00000000 l df *ABS* 00000000 memcpy-stub.c +00000000 l df *ABS* 00000000 memset.c 00000000 l df *ABS* 00000000 00000800 l *ABS* 00000000 __STACKSIZE__ -080084d4 g F .text 00000060 reset_handler -08008a90 g F .text 00000028 GPIO_PinAFConfig -08008800 g F .text 00000126 CAN_FilterInit -08008540 g F .text 00000004 IrqInterruptEnable -08008d2c g F .text 0000000c USART_GetFlagStatus -08008e70 g .text 00000000 _etext -080086bc g F .text 00000010 TimerISRHandler +0800ce0c g F .text 00000012 ETH_FlushTransmitFIFO +0800c4e0 g F .text 00000060 reset_handler +0800d580 g F .text 00000028 GPIO_PinAFConfig +0800c930 g F .text 0000009e ETH_StructInit +0800d2f0 g F .text 00000126 CAN_FilterInit +0800c54c g F .text 00000004 IrqInterruptEnable +0800caa8 g F .text 000002f0 ETH_Init +20000e90 g O .bss 00000002 uip_len +200000e8 g O .bss 00000006 uip_ethaddr +0800da00 g F .text 0000007e uip_add32 +0800d6f0 g F .text 00000024 RCC_AHB1PeriphResetCmd +0800d84c g F .text 0000000c USART_GetFlagStatus +0800f128 g .text 00000000 _etext +0800d100 g F .text 00000056 netdev_read +0800db5c g F .text 00000fc4 uip_process +0800c900 g F .text 00000010 TimerISRHandler +0800c914 g F .text 0000001c ETH_DeInit +0800efb4 g F .text 000000a6 memcpy +20000e94 g O .bss 00000004 uip_sappdata +0800ceb0 g F .text 0000022a netdev_init +20000e98 g O .bss 00000004 uip_acc32 +0800dab8 g F .text 0000002c uip_ipchksum 20000010 g O .data 00000004 SystemCoreClock -08008d24 g F .text 00000008 USART_ReceiveData -08008bdc g F .text 00000024 RCC_APB2PeriphClockCmd -080089f8 g F .text 00000090 GPIO_Init -08008d08 g F .text 0000001c USART_Cmd -08008bb8 g F .text 00000024 RCC_APB1PeriphClockCmd -080086d0 g F .text 00000042 CAN_DeInit -20000068 g .bss 00000000 _ebss -080086cc g F .text 00000002 UnusedISR -08008544 g F .text 00000056 LedInit -08008a88 g F .text 00000004 GPIO_SetBits -08008ab8 g F .text 000000da RCC_GetClocksFreq -08008c24 g F .text 000000e4 USART_Init -08008948 g F .text 00000096 CAN_Receive -08008714 g F .text 000000ea CAN_Init -20000014 g .bss 00000000 _bss -08008928 g F .text 00000020 CAN_StructInit -08008a8c g F .text 00000004 GPIO_ResetBits -0800861c g F .text 0000004a main -080089e0 g F .text 00000018 CAN_MessagePending -080081e8 g F .text 000001e8 BootComInit -08008d38 g F .text 00000112 SystemInit -08008c00 g F .text 00000024 RCC_APB1PeriphResetCmd +0800d844 g F .text 00000008 USART_ReceiveData +0800d6cc g F .text 00000024 RCC_APB2PeriphClockCmd +0800d4e8 g F .text 00000090 GPIO_Init +0800db28 g F .text 00000032 uip_listen +0800d828 g F .text 0000001c USART_Cmd +0800d158 g F .text 00000066 netdev_send +0800d6a8 g F .text 00000024 RCC_APB1PeriphClockCmd +20000e9c g O .bss 00000001 uip_flags +20000180 g O .bss 00000010 EnetDmaRx +0800d1c0 g F .text 00000042 CAN_DeInit +0800cd98 g F .text 00000026 ETH_MACTransmissionCmd +0800c4d4 g F .text 0000000c BootActivate +2000151c g .bss 00000000 _ebss +0800c910 g F .text 00000002 UnusedISR +0800c550 g F .text 00000056 LedInit +0800d578 g F .text 00000004 GPIO_SetBits +0800c6f0 g F .text 0000015c NetTask +0800cde8 g F .text 00000012 ETH_SoftwareReset +0800ca40 g F .text 00000068 ETH_WritePHYRegister +0800d5a8 g F .text 000000da RCC_GetClocksFreq +0800d0dc g F .text 00000022 netdev_init_mac +0800d744 g F .text 000000e4 USART_Init +0800d438 g F .text 00000096 CAN_Receive +0800d204 g F .text 000000ea CAN_Init +20000080 g .bss 00000000 _bss +0800d418 g F .text 00000020 CAN_StructInit +0800dae4 g F .text 00000010 uip_tcpchksum +0800ce48 g F .text 00000026 ETH_DMAReceptionCmd +20000ea0 g O .bss 00000004 uip_appdata +0800d57c g F .text 00000004 GPIO_ResetBits +20000ea4 g O .bss 00000004 uip_conn +0800cdfc g F .text 00000010 ETH_GetSoftwareResetStatus +0800c9d0 g F .text 0000006e ETH_ReadPHYRegister +20000ea8 g O .bss 0000001e uip_conns +0800eddc g F .text 000001d6 uip_arp_out +0800f05c g F .text 0000009e memset +0800c84c g F .text 0000005e main +0800d4d0 g F .text 00000018 CAN_MessagePending +0800c1e8 g F .text 000001e8 BootComInit +0800d858 g F .text 00000112 SystemInit +0800d738 g F .text 0000000a SYSCFG_ETH_MediaInterfaceConfig +0800ec9c g F .text 00000140 uip_arp_arpin +0800ec44 g F .text 00000058 uip_arp_timer +20000ec8 g O .bss 00000002 uip_listenports +20000ecc g O .bss 00000004 uip_draddr +0800d714 g F .text 00000024 RCC_APB1PeriphResetCmd 20000000 g .data 00000000 _data -0800859c g F .text 0000007e LedToggle -20000868 g .bss 00000000 _estack +0800c5a8 g F .text 0000007e LedToggle +0800ce70 g F .text 0000003e ETH_Start +20000190 g O .bss 00000640 RxBuff +20001d1c g .bss 00000000 _estack 20000014 g .data 00000000 _edata -08008000 g O .text 0000018c _vectab -080083d0 g F .text 00000104 BootComCheckActivationRequest -08008b94 g F .text 00000024 RCC_AHB1PeriphClockCmd -20000068 g .bss 00000000 _stack -080086b0 g F .text 0000000c TimerGet -08008668 g F .text 00000046 TimerInit +0800eb20 g F .text 0000000a htons +0800c000 g O .text 0000018c _vectab +0800cdc0 g F .text 00000026 ETH_MACReceptionCmd +200007d0 g O .bss 00000640 TxBuff +0800c3d0 g F .text 00000104 BootComCheckActivationRequest +0800ce20 g F .text 00000026 ETH_DMATransmissionCmd +0800daf4 g F .text 00000032 uip_init +0800d684 g F .text 00000024 RCC_AHB1PeriphClockCmd +2000151c g .bss 00000000 _stack +20000ed0 g O .bss 00000004 uip_netmask +20000ed4 g O .bss 00000004 uip_hostaddr +0800c8f4 g F .text 0000000c TimerGet +20000e80 g O .bss 00000010 EnetDmaTx +0800c6b8 g F .text 00000038 NetApp +0800c628 g F .text 00000090 NetInit +0800c8ac g F .text 00000046 TimerInit +20000ed8 g O .bss 00000642 uip_buf +2000151a g O .bss 00000002 uip_slen diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/bin/demoprog_olimex_stm32e407.srec b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/bin/demoprog_olimex_stm32e407.srec index 462f1bbd..e6b4a9e6 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/bin/demoprog_olimex_stm32e407.srec +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/bin/demoprog_olimex_stm32e407.srec @@ -1,235 +1,791 @@ S025000062696E2F64656D6F70726F675F6F6C696D65785F73746D3332653430372E7372656335 -S3150800800068080020D5840008CD860008CD860008BB -S31508008010CD860008CD860008CD860008CD860008E6 -S31508008020CD860008CD860008CD860008CD860008D6 -S31508008030CD860008CD860008CD860008BD860008D6 -S31508008040CD860008CD860008CD860008CD860008B6 -S31508008050CD860008CD860008CD860008CD860008A6 -S31508008060CD860008CD860008CD860008CD86000896 -S31508008070CD860008CD860008CD860008CD86000886 -S31508008080CD860008CD860008CD860008CD86000876 -S31508008090CD860008CD860008CD860008CD86000866 -S315080080A0CD860008CD860008CD860008CD86000856 -S315080080B0CD860008CD860008CD860008CD86000846 -S315080080C0CD860008CD860008CD860008CD86000836 -S315080080D0CD860008CD860008CD860008CD86000826 -S315080080E0CD860008CD860008CD860008CD86000816 -S315080080F0CD860008CD860008CD860008CD86000806 -S31508008100CD860008CD860008CD860008CD860008F5 -S31508008110CD860008CD860008CD860008CD860008E5 -S31508008120CD860008CD860008CD860008CD860008D5 -S31508008130CD860008CD860008CD860008CD860008C5 -S31508008140CD860008CD860008CD860008CD860008B5 -S31508008150CD860008CD860008CD860008CD860008A5 -S31508008160CD860008CD860008CD860008CD86000895 -S31508008170CD860008CD860008CD860008CD86000885 -S31508008180CD860008CD860008EE11AA55BFF34F8F9D -S315080081904FF46D42CEF20002D16801F4E061042387 -S315080081A0C0F2FA530B43D360BFF34F8FFEE700BF0D -S315080081B010B504464FF4A050C4F20100202148F639 -S315080081C02D53C0F60003984701280BD14FF4A05051 -S315080081D0C4F2010048F62553C0F6000398472070FC -S315080081E0012010BD002010BD2DE9F04F8DB02020D4 -S315080081F0012148F6DD33C0F6000398470420012123 -S3150800820048F6953BC0F6000BD8474FF4006AC4F20F -S31508008210020A50460621082248F69127C0F60007AA -S31508008220B847504607210822B84700258DF81A5046 -S315080082304FF001088DF81B8002268DF81860402340 -S3150800824005938DF81960504605A948F6F919C0F640 -S315080082500009C8478DF8186080230593504605A97C -S31508008260C8474FF461430893ADF82450ADF826503B -S31508008270ADF82850ADF82C500C23ADF82A304FF441 -S31508008280A05AC4F2010A504608A948F62543C0F682 -S31508008290000398475046414648F60953C0F600037E -S315080082A0984730464146D8474FF4806AC4F2020AD6 -S315080082B0504605210922B847504606210922B847E3 -S315080082C0602303938DF810608DF811608DF81250B5 -S315080082D08DF81380504603A9C8474FF0C060414641 -S315080082E048F6B933C0F6000398474FF4D040C4F2B5 -S315080082F0000048F2D163C0F60003984705A848F67F -S315080083002913C0F60003984748F64C61C0F60001E9 -S315080083104FF4FA704AF210426E5C4B195F78F31903 -S3150800832003FB000392FBF3FE03FB1E2EBEF1000FB8 -S3150800833006D192FBF3F4631E9BB2B3F5806F03D3A9 -S315080083400235242DE8D101E00097019600258DF825 -S315080083501A508DF81B508DF81C508DF81D508DF84D -S315080083601E508DF81F508DF816508DF81750019A2B -S31508008370531E8DF81830009A531E8DF819300CA923 -S3150800838021F81C4D4FF4D040C4F2000048F2157392 -S31508008390C0F6000398470E238DF82A308DF82B5027 -S315080083A001238DF82C30ADF82050ADF82250ADF8E9 -S315080083B02450ADF82650ADF828508DF82D3008A871 -S315080083C048F60103C0F6000398470DB0BDE8F08FE4 -S315080083D000B587B040F25903C2F200031B78BBB957 -S315080083E040F21400C2F2000048F2B113C0F60003CE -S315080083F09847012841D140F25903C2F200030122ED -S315080084001A7040F25803C2F2000300221A7034E0D0 -S3150800841040F25803C2F2000318782D4B184448F26C -S31508008420B113C0F600039847012826D140F2580335 -S31508008430C2F200031A780132D2B21A7040F214035B -S31508008440C2F200031B78934217D140F25903C2F2D5 -S31508008450000300221A7040F21403C2F200035B788C -S31508008460FF2B0AD140F21403C2F200039B7823B90A -S3150800847048F28D13C0F6000398474FF4D040C4F273 -S315080084800000002148F6E113C0F600039847D8B16A -S315080084904FF4D040C4F20000002101AA48F649135F -S315080084A0C0F60003984740F26762019B93420BD1DE -S315080084B09DF80F30FF2B07D19DF8103023B948F2ED -S315080084C08D13C0F60003984707B05DF804FB00BF9C -S315080084D01500002010B517498D4640F20002C2F279 -S315080084E0000240F21403C2F200039A4210D2131D8E -S315080084F00F4CE41A24F0030404340023104648F60B -S315080085007061C0F600015A581A500433A342FAD1D2 -S3150800851009480A494FF000028842B8BF40F8042BC0 -S31508008520FADB48F21D63C0F60003984710BD00BF8A -S3150800853017000020680800201400002068000020AA -S3150800854062B6704730B583B00420012148F69533EA -S31508008550C0F6000398474FF40055009501238DF89F -S31508008560043000228DF806208DF8073002238DF896 -S3150800857005304FF40064C4F202042046694648F602 -S31508008580F913C0F6000398472046294648F689237A -S31508008590C0F60003984703B030BD00BF10B548F2D7 -S315080085A0B163C0F600039847044640F25C03C2F282 -S315080085B000031B68C31AB3F5FA7F2DD340F2600394 -S315080085C0C2F200031B788BB940F26003C2F20003C3 -S315080085D001221A704FF40060C4F202004FF40051F1 -S315080085E048F68D23C0F60003984710E040F2600372 -S315080085F0C2F2000300221A704FF40060C4F20200AF -S315080086004FF4005148F68923C0F60003984740F214 -S315080086105C03C2F200031C6010BD00BF08B548F633 -S315080086203953C0F60003984748F24553C0F600038D -S31508008630984748F26963C0F60003984748F24153E1 -S31508008640C0F60003984748F2E913C0F600039847B6 -S3150800865048F29D55C0F6000548F2D134C0F600042C -S31508008660A847A047FCE700BF40F21003C2F2000388 -S315080086701A6844F6D353C1F26203A3FB02129209A5 -S31508008680013A4EF21003CEF200035A604FF46D42DF -S31508008690CEF20002F02182F8231000229A60072108 -S315080086A0196040F26403C2F200031A60704700BF03 -S315080086B040F26403C2F200031868704740F264038C -S315080086C0C2F200031A6801321A607047FEE700BF5B -S315080086D010B54FF4C843C4F2000398420CD14FF0CA -S315080086E00070012148F60144C0F60004A0474FF087 -S315080086F000700021A04710BD4FF08060012148F6A8 -S315080087000144C0F60004A0474FF080600021A0474E -S3150800871010BD00BF036823F002030360036843F03B -S3150800872001030360436813F0010F07D14FF6FF7387 -S31508008730426812F0010F01D1013BF9D1436813F0E9 -S31508008740010F5AD08B79012B03680CBF43F08003C5 -S3150800875023F080030360CB79012B03680CBF43F039 -S31508008760400323F0400303600B7A012B03680CBF18 -S3150800877043F0200323F0200303604B7A012B0368A0 -S315080087800CBF43F0100323F0100303608B7A012B10 -S3150800879003680CBF43F0080323F008030360CB7A91 -S315080087A0012B03680CBF43F0040323F004030360A2 -S315080087B0CA788B789B0743EA02630A7943EA02433D -S315080087C04A7943EA02520B88013B1343C3610368A3 -S315080087D023F001030360436813F0010F07D04FF637 -S315080087E0FF73426812F0010F01D0013BF9D14068CE -S315080087F080F0010000F0010070470020704700BFBC -S3150800880070B4837A012199404FF4C843C4F2000337 -S31508008810D3F8002242F00102C3F80022D3F81C4222 -S31508008820CA431440C3F81C42037BCBB94FF4C84370 -S31508008830C4F20003D3F80C421440C3F80C42847AFD -S31508008840C688458845EA0645483443F83450857A4B -S315080088508688048844EA0644483503EBC5035C6009 -S31508008860037B012B19D14FF4C843C4F20003D3F894 -S315080088700C420C43C3F80C42847A0688458845EABC -S315080088800645483443F83450857A8688C48844EACD -S315080088900644483503EBC5035C60C37A4BB94FF40D -S315080088A0C843C4F20003D3F804421440C3F8044290 -S315080088B008E04FF4C843C4F20003D3F804420C435B -S315080088C0C3F80442038943B94FF4C843C4F200030A -S315080088D0D3F814422240C3F814220389012B01BF9E -S315080088E04FF4C843C4F20003D3F814220A4308BF5E -S315080088F0C3F81422437B012B01BF4FF4C843C4F2CB -S315080089000003D3F81C22114308BFC3F81C124FF406 -S31508008910C843C4F20003D3F8002222F00102C3F8C8 -S31508008920002270BC704700BF00238371C3710372B5 -S3150800893043728372C3728370C37003230371022365 -S31508008940437101230380704730B400EB0113D3F859 -S31508008950B04104F00404E4B2147224B9D3F8B04167 -S31508008960640D146003E0D3F8B041E4085460D3F80A -S31508008970B04104F002045472D3F8B44104F00F0471 -S315080089809472D3F8B4311B0AD37400EB011303F5C0 -S31508008990DC74D3F8B851D572D3F8B8512D0A1573CB -S315080089A0D3F8B8512D0C5573D3F8B8311B0E937301 -S315080089B06368D37363681B0A137463681B0C537468 -S315080089C063681B0E937421B9C36843F02003C36020 -S315080089D003E0036943F02003036130BC704700BF1E -S315080089E019B9C06800F003007047012906BF00697D -S315080089F000F0030000207047F0B400230125032689 -S31508008A0005FA03F20C681440944238D107685A00F4 -S31508008A1006FA02F4E44327400760076891F804C0A1 -S31508008A200CFA02FC4CEA070707600F79013FFFB210 -S31508008A30012F16D887683C40846087684C79944033 -S31508008A403C43846047689CB205FA04FC27EA0C0795 -S31508008A504760476891F806C00CFA04F4A4B23C4390 -S31508008A604460C7689CB2640006FA04F427EA040462 -S31508008A70C460C468CF7907FA02F22243C2600133A0 -S31508008A80102BBDD1F0BC70470183704741837047F6 -S31508008A9010B401F007039B00C90800EB8100046AC3 -S31508008AA00F21994024EA01010162016A9A401143A3 -S31508008AB001625DF8044B704710B44FF46053C4F27A -S31508008AC002039B6803F00C03042B09D0082B0DD076 -S31508008AD0002B36D14FF41053C0F2F403036035E08F -S31508008AE04FF4D853C0F2B70303602FE04FF4605336 -S31508008AF0C4F202035C685A6802F03F0214F4800F5D -S31508008B004FF46053C4F202035B68C3F3881319BFBA -S31508008B104FF4D854C0F2B7044FF41054C0F2F4041A -S31508008B20B4FBF2F101FB03F14FF46053C4F2020304 -S31508008B305A68C2F3014201325200B1FBF2F30360F4 -S31508008B4004E04FF41053C0F2F40303604FF460528C -S31508008B50C4F202029168C1F3031140F20003C2F2A3 -S31508008B600003595CC9B2046824FA01F141609468AB -S31508008B70C4F382241C5DE4B221FA04F4846092688A -S31508008B80C2F342329B5CDBB2D940C1605DF8044B4C -S31508008B90704700BF39B14FF46053C4F202031A6B31 -S31508008BA01043186370474FF46053C4F202031A6BFC -S31508008BB022EA00001863704739B14FF46053C4F2D3 -S31508008BC002031A6C1043186470474FF46053C4F2DA -S31508008BD002031A6C22EA00001864704739B14FF490 -S31508008BE06053C4F202035A6C1043586470474FF43A -S31508008BF06053C4F202035A6C22EA000058647047B4 -S31508008C0039B14FF46053C4F202031A6A104318626A -S31508008C1070474FF46053C4F202031A6A22EA00004E -S31508008C201862704730B585B004460D46038A23F4AA -S31508008C3040531B041B0CCA8813430382838923F4FD -S31508008C40B05323F00C031B041B0C0989AA880A439A -S31508008C5069890A4392B213438381838A23F4407352 -S31508008C601B041B0CAA8913438382684648F6B9235A -S31508008C70C0F6000398474FF4A052C4F201024FF41D -S31508008C808053C4F201039C4218BF94420CBF039A56 -S31508008C90029AA3891BB2002B02EB820202EB820224 -S31508008CA0BDBF2B685B00B2FBF3F22968A4BF89003D -S31508008CB0B2FBF1F248F21F53C5F2EB13A3FB021302 -S31508008CC05B091D01642003FB1023A08900B200285C -S31508008CD00BDADB00323348F21F51C5F2EB11A1FB68 -S31508008CE00321C1F3421129430AE01B01323348F23A -S31508008CF01F51C5F2EB11A1FB0321C1F3431129430F -S31508008D0089B2218105B030BD29B183899BB243F46C -S31508008D10005383817047838923F400531B041B0C7B -S31508008D20838170478088C0F308007047038819421A -S31508008D300CBF00200120704782B04FF46053C4F284 -S31508008D4002031A6842F001021A6000229A60196842 -S31508008D5021F0847121F48031196043F21001C2F2C6 -S31508008D6000415960196821F480211960DA6000927F -S31508008D7001921A6842F480321A604FF46052C4F2C3 -S31508008D800202136803F400330193009B0133009336 -S31508008D90019B1BB9009BB3F5A06FF2D14FF460534A -S31508008DA0C4F202031B6813F4003F14BF0123002317 -S31508008DB00193019B012B46D14FF46053C4F2020381 -S31508008DC01A6C42F080521A644FF4E042C4F2000270 -S31508008DD0116841F4404111609A689A609A6842F4B1 -S31508008DE000429A609A6842F4A0529A6045F20C4290 -S31508008DF0C0F240725A601A6842F080721A604FF4E4 -S31508008E006052C4F20202136813F0007FFBD04FF4DD -S31508008E107053C4F2020340F205621A604FF46053BD -S31508008E20C4F202039A6822F003029A609A6842F032 -S31508008E3002029A604FF46052C4F20202936803F089 -S31508008E400C03082BFAD102B0704700BF05020602D0 -S31508008E50060307030803090309040A040B040C04A0 -S31508008E600C050D050E050F050F0610061007100850 -S31508008E7000000000010203040102030406070809B2 -S30908008E80007A030A59 -S7050800800072 +S3150800C0001C1D0020E1C4000811C9000811C9000858 +S3150800C01011C9000811C9000811C9000811C900088A +S3150800C02011C9000811C9000811C9000811C900087A +S3150800C03011C9000811C9000811C9000801C900087A +S3150800C04011C9000811C9000811C9000811C900085A +S3150800C05011C9000811C9000811C9000811C900084A +S3150800C06011C9000811C9000811C9000811C900083A +S3150800C07011C9000811C9000811C9000811C900082A +S3150800C08011C9000811C9000811C9000811C900081A +S3150800C09011C9000811C9000811C9000811C900080A +S3150800C0A011C9000811C9000811C9000811C90008FA +S3150800C0B011C9000811C9000811C9000811C90008EA +S3150800C0C011C9000811C9000811C9000811C90008DA +S3150800C0D011C9000811C9000811C9000811C90008CA +S3150800C0E011C9000811C9000811C9000811C90008BA +S3150800C0F011C9000811C9000811C9000811C90008AA +S3150800C10011C9000811C9000811C9000811C9000899 +S3150800C11011C9000811C9000811C9000811C9000889 +S3150800C12011C9000811C9000811C9000811C9000879 +S3150800C13011C9000811C9000811C9000811C9000869 +S3150800C14011C9000811C9000811C9000811C9000859 +S3150800C15011C9000811C9000811C9000811C9000849 +S3150800C16011C9000811C9000811C9000811C9000839 +S3150800C17011C9000811C9000811C9000811C9000829 +S3150800C18011C9000811C90008EE11AA55BFF34F8F4F +S3150800C1904FF46D42CEF20002D16801F4E061042347 +S3150800C1A0C0F2FA530B43D360BFF34F8FFEE700BFCD +S3150800C1B010B504464FF4A050C4F2010020214DF6F4 +S3150800C1C04D03C0F60003984701280BD14FF4A05041 +S3150800C1D0C4F201004DF64503C0F6000398472070E7 +S3150800C1E0012010BD002010BD2DE9F04F8DB0202094 +S3150800C1F001214DF2CD63C0F60003984704200121C2 +S3150800C2004DF2856BC0F6000BD8474FF4006AC4F2AE +S3150800C210020A5046062108224DF28157C0F6000749 +S3150800C220B847504607210822B84700258DF81A5006 +S3150800C2304FF001088DF81B8002268DF81860402300 +S3150800C24005938DF81960504605A94DF2E949C0F6DF +S3150800C2500009C8478DF8186080230593504605A93C +S3150800C260C8474FF461430893ADF82450ADF82650FB +S3150800C270ADF82850ADF82C500C23ADF82A304FF401 +S3150800C280A05AC4F2010A504608A94DF24573C0F6F1 +S3150800C29000039847504641464DF62903C0F6000369 +S3150800C2A0984730464146D8474FF4806AC4F2020A96 +S3150800C2B0504605210922B847504606210922B847A3 +S3150800C2C0602303938DF810608DF811608DF8125075 +S3150800C2D08DF81380504603A9C8474FF0C060414601 +S3150800C2E04DF2A963C0F6000398474FF4D040C4F254 +S3150800C2F000004DF2C113C0F60003984705A84DF299 +S3150800C3001943C0F6000398474FF2FC01C0F6000136 +S3150800C3104FF4FA704AF210426E5C4B195F78F319C3 +S3150800C32003FB000392FBF3FE03FB1E2EBEF1000F78 +S3150800C33006D192FBF3F4631E9BB2B3F5806F03D369 +S3150800C3400235242DE8D101E00097019600258DF8E5 +S3150800C3501A508DF81B508DF81C508DF81D508DF80D +S3150800C3601E508DF81F508DF816508DF81750019AEB +S3150800C370531E8DF81830009A531E8DF819300CA9E3 +S3150800C38021F81C4D4FF4D040C4F200004DF20523AD +S3150800C390C0F6000398470E238DF82A308DF82B50E7 +S3150800C3A001238DF82C30ADF82050ADF82250ADF8A9 +S3150800C3B02450ADF82650ADF828508DF82D3008A831 +S3150800C3C04DF2F123C0F6000398470DB0BDE8F08F93 +S3150800C3D000B587B040F2C503C2F200031B78BBB9AB +S3150800C3E040F28000C2F200004CF2B113C0F600031E +S3150800C3F09847012841D140F2C503C2F20003012241 +S3150800C4001A7040F2C403C2F2000300221A7034E024 +S3150800C41040F2C403C2F2000318782D4B18444CF2BC +S3150800C420B113C0F600039847012826D140F2C40389 +S3150800C430C2F200031A780132D2B21A7040F28003AF +S3150800C440C2F200031B78934217D140F2C503C2F229 +S3150800C450000300221A7040F28003C2F200035B78E0 +S3150800C460FF2B0AD140F28003C2F200039B7823B95E +S3150800C4704CF28D13C0F6000398474FF4D040C4F22F +S3150800C480000000214DF2D143C0F600039847D8B109 +S3150800C4904FF4D040C4F20000002101AA4DF23943FE +S3150800C4A0C0F60003984740F26762019B93420BD19E +S3150800C4B09DF80F30FF2B07D19DF8103023B94CF2A9 +S3150800C4C08D13C0F60003984707B05DF804FB00BF5C +S3150800C4D08100002008B54CF28D13C0F6000398477A +S3150800C4E010B517498D4640F20002C2F2000240F22A +S3150800C4F01403C2F200039A4210D2131D0F4CE41A19 +S3150800C50024F003040434002310464FF22811C0F621 +S3150800C51000015A581A500433A342FAD109480A4965 +S3150800C5204FF000028842B8BF40F8042BFADB4CF6FD +S3150800C5304D03C0F60003984710BD00BF1700002042 +S3150800C5401C1D0020800000201C15002062B67047C4 +S3150800C55030B583B0042001214DF28563C0F600038F +S3150800C56098474FF40055009501238DF804300022B2 +S3150800C5708DF806208DF8073002238DF805304FF424 +S3150800C5800064C4F20204204669464DF2E943C0F647 +S3150800C59000039847204629464DF27953C0F6000312 +S3150800C5A0984703B030BD00BF10B54CF6F503C0F68A +S3150800C5B000039847044640F2C803C2F200031B680A +S3150800C5C0C31AB3F5FA7F2DD340F2CC03C2F20003A7 +S3150800C5D01B788BB940F2CC03C2F2000301221A7011 +S3150800C5E04FF40060C4F202004FF400514DF27D533F +S3150800C5F0C0F60003984710E040F2CC03C2F20003ED +S3150800C60000221A704FF40060C4F202004FF4005181 +S3150800C6104DF27953C0F60003984740F2C803C2F2B8 +S3150800C62000031C6010BD00BF10B54CF6B163C0F620 +S3150800C630000398474CF6F504C0F60004A04740F2FC +S3150800C640D403C2F2000300F5FA701860A04740F25E +S3150800C650D003C2F2000300F51C50103018604DF6E6 +S3150800C660F523C0F60003984740F6D463C2F20003E8 +S3150800C6704FF6A9621A8043F61371598040F6D063C3 +S3150800C680C2F200034FF6FF7119800021598040F667 +S3150800C690CC63C2F200031A8040F213125A804EF697 +S3150800C6A003004DF62933C0F6000398474DF2DD0323 +S3150800C6B0C0F60003984710BD08B540F69C63C2F261 +S3150800C6C000031B7813F0400F11D113F0020F0ED0A0 +S3150800C6D040F6A063C2F200031B681A79FF2A06D146 +S3150800C6E05B7923B94CF2D543C0F60003984708BDD9 +S3150800C6F010B54DF20113C0F600039847002853D031 +S3150800C70040F69062C2F20002108040F6D863C2F288 +S3150800C71000039C894FF400604EF62133C0F60003EF +S3150800C720984784421CD101204DF65D33C0F60003BC +S3150800C730984740F69063C2F200031B88A3B34EF6EF +S3150800C740DD53C0F6000398474DF25913C0F60003AF +S3150800C750984740F69063C2F2000300221A8023E04D +S3150800C76040F6D863C2F200039C8940F606004EF6EE +S3150800C7702133C0F600039847844215D14EF69D43EF +S3150800C780C0F60003984740F69063C2F200031B8880 +S3150800C79053B14DF25913C0F60003984740F690631B +S3150800C7A0C2F2000300221A804CF6F503C0F6000315 +S3150800C7B0984740F2D403C2F200031B6898422BD371 +S3150800C7C040F2D402C2F2000203F5FA73136040F68F +S3150800C7D0A463C2F2000340F6A862C2F200021A601D +S3150800C7E002204DF65D33C0F60003984740F6906385 +S3150800C7F0C2F200031B887BB14EF6DD53C0F6000378 +S3150800C80098474DF25913C0F60003984740F69063CF +S3150800C810C2F2000300221A804CF6F503C0F60003A4 +S3150800C820984740F2D003C2F200031B6898420CD323 +S3150800C83040F2D002C2F2000203F51C531033136013 +S3150800C8404EF64543C0F60003984710BD08B54DF6A9 +S3150800C8505903C0F6000398474CF25153C0F600033B +S3150800C86098474CF6AD03C0F6000398474CF24D5373 +S3150800C870C0F6000398474CF22963C0F600039847B0 +S3150800C8804CF2E913C0F6000398474CF2A956C0F6D5 +S3150800C89000064CF2F165C0F600054CF2D134C0F63C +S3150800C8A00004B047A847A047FBE700BF40F21003C3 +S3150800C8B0C2F200031A6844F6D353C1F26203A3FB1B +S3150800C8C002129209013A4EF21003CEF200035A60A0 +S3150800C8D04FF46D42CEF20002F02182F823100022B6 +S3150800C8E09A600721196040F2D803C2F200031A6061 +S3150800C8F0704700BF40F2D803C2F2000318687047B9 +S3150800C90040F2D803C2F200031A6801321A6070476F +S3150800C910FEE700BF10B54FF0007001214DF2F1643B +S3150800C920C0F60004A0474FF000700021A04710BDD4 +S3150800C9300023036043608360C360036143618361CE +S3150800C940C361036243628362C362036343638363AF +S3150800C950C36340220264202242648364C36403657D +S3150800C96043658365C3650366802242668366C3663C +S3150800C970036743678367C3674FF08062C0F8802008 +S3150800C9804FF00072C0F884204FF08071C0F888100C +S3150800C9904FF40011C0F88C10C0F89030C0F89430ED +S3150800C9A0C0F89830C0F89C30C0F8A030C0F8A42071 +S3150800C9B0C0F8A8304FF40032C0F8AC204FF48072AB +S3150800C9C0C0F8B020C0F8B430C0F8B830704700BF1F +S3150800C9D082B0002301934FF40043C4F202031A699C +S3150800C9E002F01C02890101F4F8610A43C00281B20F +S3150800C9F00A4342F001021A614FF40042C4F20202ED +S3150800CA004FF6FE71C0F20401019B013301931369CD +S3150800CA1013F0010F02D0019B8B42F5D9019A4FF60C +S3150800CA20FF73C0F204039A421FBF4FF40043C4F2D7 +S3150800CA300203586980B208BF002002B0704700BFE1 +S3150800CA4010B483B0002301934FF40043C4F20203E9 +S3150800CA501C6904F01C0444F00304890101F4F8611C +S3150800CA600C43C00281B20C435A611C614FF4004268 +S3150800CA70C4F202024FF6FE71C0F20401019B0133B3 +S3150800CA800193136913F0010F02D0019B8B42F5D96C +S3150800CA9001984FF6FF73C0F20403C01A18BF0120AD +S3150800CAA003B05DF8044B70472DE9F04186B00446A3 +S3150800CAB00D460023059300934FF40043C4F2020386 +S3150800CAC01E6926F01C0601A84DF2A953C0F60003FC +S3150800CAD0984702994FF45343CFF6CE630B444EF270 +S3150800CAE0BF12C0F2E402934298BF46F008061AD96C +S3150800CAF04FF24013CFF6E9530B4447F63F02C0F214 +S3150800CB007D12934298BF46F00C060CD94FF4F243B7 +S3150800CB10CFF66C430B444FF4B442C0F26222934200 +S3150800CB2088BF46F004064FF40043C4F202031E61B0 +S3150800CB30284600214FF400424CF64123C0F6000374 +S3150800CB409847002800F020814FF080630593059BE5 +S3150800CB502BB1059B013B0593059B002BF9D1236857 +S3150800CB60002B6CD04FF001084CF6D116C0F6000623 +S3150800CB704FF6FE77C0F20407009B01330093284660 +S3150800CB804146B04700F0040083B213B9009BBB428C +S3150800CB90F2D9009A4FF6FF73C0F204039A4208BF0F +S3150800CBA0002000F0F6800021009128464FF48052BC +S3150800CBB04CF64123C0F600039847002800F0E680AB +S3150800CBC04FF001084CF6D116C0F600064FF6FE7770 +S3150800CBD0C0F20407009B0133009328464146B0473C +S3150800CBE000F0200080B210B9009BBB42F2D9009A2F +S3150800CBF04FF6FF73C0F204039A4208BF002000F004 +S3150800CC00C88000230093284610214CF6D113C0F69D +S3150800CC100003984700F004039BB21BB14FF400636E +S3150800CC20236201E00023236200F002039BB213B1E2 +S3150800CC30002363611EE04FF4804363611AE0636971 +S3150800CC40226AD20842EA53022846002192B24CF6DA +S3150800CC504123C0F600039847002800F099806FF03A +S3150800CC607F430593059B2BB1059B013B0593059BCC +S3150800CC70002BF9D14FF40043C4F20203196848F2B5 +S3150800CC800F12CFF620720A40A06861680843E1686F +S3150800CC9008432169084361690843A1690843E169B2 +S3150800CCA00843216A0843616A0843A16A0843E16A9E +S3150800CCB00843216B0843616B01430A431A60E16B21 +S3150800CCC0A26B1143226C1143626C1143A26C11438F +S3150800CCD0E26C1143226D1143626D0A435A60A26DDC +S3150800CCE09A60E26DDA609869A16E626E1143E26E2F +S3150800CCF01143226F1143626F11434FF6417202408E +S3150800CD000A43216E42EA01419961E16FA26F0A4323 +S3150800CD10DA6103F58053996943F62372CFF6DE028A +S3150800CD200A40D4F88400D4F880100843D4F8881050 +S3150800CD300843D4F88C100843D4F890100843D4F864 +S3150800CD4094100843D4F898100843D4F89C10084364 +S3150800CD50D4F8A01001430A439A61D4F8A410D4F871 +S3150800CD60A820114341F40001D4F8AC201143D4F8AB +S3150800CD70B0201143D4F8B8200A43D4F8B41042EAD4 +S3150800CD8081021A60012004E0002002E0002000E091 +S3150800CD90002006B0BDE8F08140B14FF40043C4F26C +S3150800CDA002031A6842F008021A6070474FF40043FB +S3150800CDB0C4F202031A6822F008021A60704700BF1C +S3150800CDC040B14FF40043C4F202031A6842F0040269 +S3150800CDD01A6070474FF40043C4F202031A6822F03F +S3150800CDE004021A60704700BF4FF41043C4F20203EE +S3150800CDF01A6842F001021A60704700BF4FF41043E8 +S3150800CE00C4F20203186800F0010070474FF410439B +S3150800CE10C4F202039A6942F480129A61704700BF0D +S3150800CE2040B14FF41043C4F202039A6942F4005227 +S3150800CE309A6170474FF41043C4F202039A6922F4C8 +S3150800CE4000529A61704700BF40B14FF41043C4F2D4 +S3150800CE5002039A6942F002029A6170474FF410433E +S3150800CE60C4F202039A6922F002029A61704700BF6F +S3150800CE7008B501204CF69953C0F6000398474CF6BE +S3150800CE800D63C0F60003984701204CF6C153C0F65F +S3150800CE900003984701204CF62163C0F60003984723 +S3150800CEA001204CF64963C0F60003984708BD00BF49 +S3150800CEB02DE9F04FB3B04FF0F05001214DF28564E3 +S3150800CEC0C0F60004A04747200121A0474FF4804040 +S3150800CED001214DF2CD63C0F60003984701204DF2BB +S3150800CEE03973C0F6000398478E23309300278DF8D0 +S3150800CEF0C67002268DF8C4608DF8C7708DF8C560B7 +S3150800CF00B846C4F20208404630A94DF2E949C0F6CF +S3150800CF100009C847404601210B224DF28154C0F64C +S3150800CF200004A047404631460B22A047404603214D +S3150800CF300B22A047404607210B22A0474FF4006367 +S3150800CF4030938DF8C6708DF8C4608DF8C7708DF86B +S3150800CF50C5604FF4C058C4F20208404630A9C84715 +S3150800CF6040460B210A46A047322330938DF8C670F7 +S3150800CF708DF8C4608DF8C7708DF8C5604FF4006AE7 +S3150800CF80C4F2020A504630A9C847504601210B226E +S3150800CF90A047504604210B22A047504605210B22E4 +S3150800CFA0A0474FF4C04330938DF8C6708DF8C4601F +S3150800CFB08DF8C7708DF8C560404630A9C847404609 +S3150800CFC00D210B22A04740460E210B22A0474CF606 +S3150800CFD01513C0F6000398474CF6E953C0F600034C +S3150800CFE098474CF6FD54C0F60004A0470128FCD02B +S3150800CFF001A84CF63113C0F60003984700240194A3 +S3150800D00008944FF400730B930C944FF000430F935E +S3150800D010202312931494159416944FF400630993DD +S3150800D0204FF4804306934FF0020B4CF6D117C0F627 +S3150800D03000074FF0030A4CF2F109C0F2070941F262 +S3150800D0401968C0F22208A6B230465946B84760F3B6 +S3150800D0501F4530465146B84760F30F05454518BF8A +S3150800D0604D4502D00134202CEDD101A8A1B24CF6D1 +S3150800D070A923C0F60003984740F68063C2F200036E +S3150800D08040F2D072C2F200029A60DB6000221A6097 +S3150800D0905A604FF41041C4F202010B6140F280134A +S3150800D0A0C2F2000340F29010C2F2000098601A60C3 +S3150800D0B0DB605A6040225A719A884FF4C86060F360 +S3150800D0C00C029A808022DA70CB604CF67163C0F647 +S3150800D0D00003984733B0BDE8F08F00BF40F2E8037D +S3150800D0E0C2F2000308221A7000225A7027229A7088 +S3150800D0F06922DA705B221A7145225A71704700BF9D +S3150800D10038B540F28013C2F20003DB78DB0920D180 +S3150800D11040F28014C2F200046588C5F30D0540F696 +S3150800D120D860C2F2000040F29011C2F200012A460D +S3150800D1304EF6B573C0F600039847E37843F08003CC +S3150800D140E3704FF41043C4F2020301229A602846A2 +S3150800D15038BD002038BD00BF38B540F68063C2F23E +S3150800D1600003DB78DB0900D0FEE740F69063C2F2E5 +S3150800D17000031D8840F2D074C2F20004204640F62F +S3150800D180D861C2F200012A464EF6B573C0F600030E +S3150800D190984740F68063C2F200039C6000221A603A +S3150800D1A0102199705A60C5F30B059D80B022DA707C +S3150800D1B04FF41043C4F2020301225A6038BD00BF7F +S3150800D1C010B54FF4C843C4F2000398420CD14FF08F +S3150800D1D0007001214DF21574C0F60004A0474FF007 +S3150800D1E000700021A04710BD4FF0806001214DF26C +S3150800D1F01574C0F60004A0474FF080600021A047D0 +S3150800D20010BD00BF036823F002030360036843F000 +S3150800D21001030360436813F0010F07D14FF6FF734C +S3150800D220426812F0010F01D1013BF9D1436813F0AE +S3150800D230010F5AD08B79012B03680CBF43F080038A +S3150800D24023F080030360CB79012B03680CBF43F0FE +S3150800D250400323F0400303600B7A012B03680CBFDD +S3150800D26043F0200323F0200303604B7A012B036865 +S3150800D2700CBF43F0100323F0100303608B7A012BD5 +S3150800D28003680CBF43F0080323F008030360CB7A56 +S3150800D290012B03680CBF43F0040323F00403036067 +S3150800D2A0CA788B789B0743EA02630A7943EA024302 +S3150800D2B04A7943EA02520B88013B1343C361036868 +S3150800D2C023F001030360436813F0010F07D04FF6FC +S3150800D2D0FF73426812F0010F01D0013BF9D1406893 +S3150800D2E080F0010000F0010070470020704700BF81 +S3150800D2F070B4837A012199404FF4C843C4F20003FD +S3150800D300D3F8002242F00102C3F80022D3F81C42E7 +S3150800D310CA431440C3F81C42037BCBB94FF4C84335 +S3150800D320C4F20003D3F80C421440C3F80C42847AC2 +S3150800D330C688458845EA0645483443F83450857A10 +S3150800D3408688048844EA0644483503EBC5035C60CE +S3150800D350037B012B19D14FF4C843C4F20003D3F859 +S3150800D3600C420C43C3F80C42847A0688458845EA81 +S3150800D3700645483443F83450857A8688C48844EA92 +S3150800D3800644483503EBC5035C60C37A4BB94FF4D2 +S3150800D390C843C4F20003D3F804421440C3F8044255 +S3150800D3A008E04FF4C843C4F20003D3F804420C4320 +S3150800D3B0C3F80442038943B94FF4C843C4F20003CF +S3150800D3C0D3F814422240C3F814220389012B01BF63 +S3150800D3D04FF4C843C4F20003D3F814220A4308BF23 +S3150800D3E0C3F81422437B012B01BF4FF4C843C4F290 +S3150800D3F00003D3F81C22114308BFC3F81C124FF4CC +S3150800D400C843C4F20003D3F8002222F00102C3F88D +S3150800D410002270BC704700BF00238371C37103727A +S3150800D42043728372C3728370C3700323037102232A +S3150800D430437101230380704730B400EB0113D3F81E +S3150800D440B04104F00404E4B2147224B9D3F8B0412C +S3150800D450640D146003E0D3F8B041E4085460D3F8CF +S3150800D460B04104F002045472D3F8B44104F00F0436 +S3150800D4709472D3F8B4311B0AD37400EB011303F585 +S3150800D480DC74D3F8B851D572D3F8B8512D0A157390 +S3150800D490D3F8B8512D0C5573D3F8B8311B0E9373C6 +S3150800D4A06368D37363681B0A137463681B0C53742D +S3150800D4B063681B0E937421B9C36843F02003C360E5 +S3150800D4C003E0036943F02003036130BC704700BFE3 +S3150800D4D019B9C06800F003007047012906BF006942 +S3150800D4E000F0030000207047F0B40023012503264E +S3150800D4F005FA03F20C681440944238D107685A00BA +S3150800D50006FA02F4E44327400760076891F804C066 +S3150800D5100CFA02FC4CEA070707600F79013FFFB2D5 +S3150800D520012F16D887683C40846087684C799440F8 +S3150800D5303C43846047689CB205FA04FC27EA0C075A +S3150800D5404760476891F806C00CFA04F4A4B23C4355 +S3150800D5504460C7689CB2640006FA04F427EA040427 +S3150800D560C460C468CF7907FA02F22243C260013365 +S3150800D570102BBDD1F0BC70470183704741837047BB +S3150800D58010B401F007039B00C90800EB8100046A88 +S3150800D5900F21994024EA01010162016A9A40114368 +S3150800D5A001625DF8044B704710B44FF46053C4F23F +S3150800D5B002039B6803F00C03042B09D0082B0DD03B +S3150800D5C0002B36D14FF41053C0F2F403036035E054 +S3150800D5D04FF4D853C0F2B70303602FE04FF46053FB +S3150800D5E0C4F202035C685A6802F03F0214F4800F22 +S3150800D5F04FF46053C4F202035B68C3F3881319BF80 +S3150800D6004FF4D854C0F2B7044FF41054C0F2F404DF +S3150800D610B4FBF2F101FB03F14FF46053C4F20203C9 +S3150800D6205A68C2F3014201325200B1FBF2F30360B9 +S3150800D63004E04FF41053C0F2F40303604FF4605251 +S3150800D640C4F202029168C1F3031140F20003C2F268 +S3150800D6500003595CC9B2046824FA01F14160946870 +S3150800D660C4F382241C5DE4B221FA04F4846092684F +S3150800D670C2F342329B5CDBB2D940C1605DF8044B11 +S3150800D680704700BF39B14FF46053C4F202031A6BF6 +S3150800D6901043186370474FF46053C4F202031A6BC1 +S3150800D6A022EA00001863704739B14FF46053C4F298 +S3150800D6B002031A6C1043186470474FF46053C4F29F +S3150800D6C002031A6C22EA00001864704739B14FF455 +S3150800D6D06053C4F202035A6C1043586470474FF4FF +S3150800D6E06053C4F202035A6C22EA00005864704779 +S3150800D6F039B14FF46053C4F202031A691043186132 +S3150800D70070474FF46053C4F202031A6922EA000014 +S3150800D7101861704739B14FF46053C4F202031A6AAC +S3150800D7201043186270474FF46053C4F202031A6A32 +S3150800D73022EA000018627047DC23C4F22723186027 +S3150800D740704700BF30B585B004460D46038A23F4FA +S3150800D75040531B041B0CCA8813430382838923F492 +S3150800D760B05323F00C031B041B0C0989AA880A432F +S3150800D77069890A4392B213438381838A23F44073E7 +S3150800D7801B041B0CAA891343838268464DF2A953CE +S3150800D790C0F6000398474FF4A052C4F201024FF4B2 +S3150800D7A08053C4F201039C4218BF94420CBF039AEB +S3150800D7B0029AA3891BB2002B02EB820202EB8202B9 +S3150800D7C0BDBF2B685B00B2FBF3F22968A4BF8900D2 +S3150800D7D0B2FBF1F248F21F53C5F2EB13A3FB021397 +S3150800D7E05B091D01642003FB1023A08900B20028F1 +S3150800D7F00BDADB00323348F21F51C5F2EB11A1FBFD +S3150800D8000321C1F3421129430AE01B01323348F2CE +S3150800D8101F51C5F2EB11A1FB0321C1F343112943A3 +S3150800D82089B2218105B030BD29B183899BB243F401 +S3150800D830005383817047838923F400531B041B0C10 +S3150800D840838170478088C0F30800704703881942AF +S3150800D8500CBF00200120704782B04FF46053C4F219 +S3150800D86002031A6842F001021A6000229A601968D7 +S3150800D87021F0847121F48031196043F21001C2F25B +S3150800D88000415960196821F480211960DA60009214 +S3150800D89001921A6842F480321A604FF46052C4F258 +S3150800D8A00202136803F400330193009B01330093CB +S3150800D8B0019B1BB9009BB3F5A06FF2D14FF46053DF +S3150800D8C0C4F202031B6813F4003F14BF01230023AC +S3150800D8D00193019B012B46D14FF46053C4F2020316 +S3150800D8E01A6C42F080521A644FF4E042C4F2000205 +S3150800D8F0116841F4404111609A689A609A6842F446 +S3150800D90000429A609A6842F4A0529A6045F20C4224 +S3150800D910C0F240725A601A6842F080721A604FF478 +S3150800D9206052C4F20202136813F0007FFBD04FF472 +S3150800D9307053C4F2020340F205621A604FF4605352 +S3150800D940C4F202039A6822F003029A609A6842F0C7 +S3150800D95002029A604FF46052C4F20202936803F01E +S3150800D9600C03082BFAD102B0704700BF30B4013A55 +S3150800D9708D18A94214D20B461C785A7802EB042259 +S3150800D98092B2104480B2824284BF013080B2023320 +S3150800D9909D42F1D8CB432B4423F0010302331944AB +S3150800D9A0A94207D10B781B02184480B2834284BF70 +S3150800D9B0013080B230BC704770B540F6D864C2F208 +S3150800D9C00004667C143E237C06EB0326B6B230447C +S3150800D9D080B204F11A0108224DF66D15C0F600054D +S3150800D9E0A84704F122013246A847034620B1000A97 +S3150800D9F040EA032080B270BD4FF6FF7070BD00BFCD +S3150800DA0070B4C4780C44E4B240F69863C2F20003DA +S3150800DA10DC700D0A82782A44D2B29A7046785E7013 +S3150800DA200078187095420DD90136F6B240F698631B +S3150800DA30C2F200035E702EB940F69863C2F2000384 +S3150800DA4001301870C9B28C4217DA0132D2B240F6E8 +S3150800DA509863C2F200039A707AB940F69863C2F2E4 +S3150800DA6000035A780132D2B25A7032B940F6986336 +S3150800DA70C2F200031A7801321A7070BC704700BFF0 +S3150800DA8010B5014640F6A464C2F2000420680830C6 +S3150800DA904DF60123C0F600039847226840F69863BE +S3150800DAA0C2F20003197811725978517299789172F5 +S3150800DAB0DB78D37210BD00BF08B5002008491422D0 +S3150800DAC04DF66D13C0F600039847034620B1000AC9 +S3150800DAD040EA032080B208BD4FF6FF7008BD00BFBC +S3150800DAE0E60E002008B506204DF6B913C0F6000369 +S3150800DAF0984708BD40F6C863C2F2000300221A80A0 +S3150800DB0040F6A863C2F200035A7640F2F003C2F266 +S3150800DB10000301221A7040F2E403C2F200034FF434 +S3150800DB2080621A80704700BF40F2F003C2F2000319 +S3150800DB3000221A7040F6C863C2F200031B882BB98C +S3150800DB4040F6C863C2F200031880704740F2F0033B +S3150800DB50C2F2000301221A70704700BF38B540F6BA +S3150800DB60A463C2F200031C6840F6A063C2F2000375 +S3150800DB70AD4A1A6040F69463C2F200031A6003289D +S3150800DB8016D1637E03F00F03032B40F0AE87238A7A +S3150800DB90002B40F0AA8740F69C63C2F200030822D5 +S3150800DBA01A704CF2B963C0F60003984700F0CCBD72 +S3150800DBB0022840F0A78040F2E003C2F20003DA78B8 +S3150800DBC00132D2B2DA70C2B940F2E003C2F20003FF +S3150800DBD09A780132D2B29A707AB940F2E003C2F268 +S3150800DBE000035A780132D2B25A7032B940F2E003D1 +S3150800DBF0C2F200031A7801321A7040F69063C2F234 +S3150800DC00000300221A8041F21A53C2F200031A8056 +S3150800DC10637E03F0FD02052A09D1A37E0133DBB238 +S3150800DC20A376782B04BF0023637600F05EBF002B33 +S3150800DC3000F05B87228A002A52D0A27E511EA17666 +S3150800DC40002A40F05287E27E082A05D0591EC9B23A +S3150800DC50012917D8052A15D10023637640F69C6357 +S3150800DC60C2F2000380221A704CF2B963C0F60003B0 +S3150800DC70984740F6D863C2F20003142283F82F208F +S3150800DC8000F0AABE042A9DBF03219140C9B23021E3 +S3150800DC90A1760132E27603F00F03013B072B00F26F +S3150800DCA02487DFE813F06D0208001000D804220765 +S3150800DCB0D8042207D80440F6D863C2F2000300222B +S3150800DCC083F82F2063E240F69C63C2F20003042225 +S3150800DCD01A704CF2B963C0F60003984700F085BD88 +S3150800DCE003F00F03032B40F0008740F69C63C2F253 +S3150800DCF0000308221A704CF2B963C0F6000398476D +S3150800DD0000F022BD40F6D863C2F200039B7B452B88 +S3150800DD1040F0EB8640F6D863C2F20003197C5A7CC1 +S3150800DD2002EB012040F69063C2F200031B8898427A +S3150800DD3000F3DB8684B240F69063C2F200031C80CF +S3150800DD4040F6D863C2F200031B7D13F03F0F40F084 +S3150800DD50CC8640F6D863C2F200035B7D002B40F008 +S3150800DD60C48640F6D463C2F200031D882DB940F676 +S3150800DD70D463C2F200035B88A3B140F6D863C2F24B +S3150800DD800003DB8BAB4240F0B08640F6D862C2F2A5 +S3150800DD90000240F6D463C2F20003128C5B889A42F2 +S3150800DDA040F0A3864DF6B923C0F6000398474FF610 +S3150800DDB0FF73984240F0998640F6D863C2F2000392 +S3150800DDC0DB7D062B32D0012B40F08F8640F6D863D8 +S3150800DDD0C2F2000393F82230082B40F0868640F6FC +S3150800DDE0D863C2F20003002283F822209A8C4FF6E9 +S3150800DDF0F6739A4240F6D863C2F200038CBF093222 +S3150800DE0008329A8440F6D863C2F200035A8BDA8342 +S3150800DE109A8B1A845D8340F6D462C2F20002528855 +S3150800DE209A8300F05BBE00BF0E0F00204DF6E52377 +S3150800DE30C0F6000398474FF6FF73984240F05586A0 +S3150800DE4040F6A863C2F20003597E81B340F6D86251 +S3150800DE50C2F2000240F6A863C2F20003928C9B88C5 +S3150800DE609A4224D140F6D862C2F2000240F6A8636C +S3150800DE70C2F20003528CDB889A4218D140F6D86267 +S3150800DE80C2F2000240F6A863C2F20003528B1B8856 +S3150800DE909A420CD140F6D862C2F2000240F6A86354 +S3150800DEA0C2F20003928B5B889A4200F0918140F699 +S3150800DEB0D863C2F2000393F82F3003F03F03022B16 +S3150800DEC01CD140F6D863C2F200039A8C40F2DC03F8 +S3150800DED0C2F200031A8040F2F003C2F200030021E6 +S3150800DEE0197040F6C863C2F200031B8893427BD0C0 +S3150800DEF040F2F003C2F2000301221A7040F6D8631A +S3150800DF00C2F2000393F82F3013F0040F40F0ED85AA +S3150800DF1040F6D863C2F20003142283F82F2040F695 +S3150800DF209062C2F2000228211180502283F82E2026 +S3150800DF3093F8295093F82D2083F8292093F8284040 +S3150800DF4093F82C2083F8282083F82C4093F8270090 +S3150800DF5093F82B2083F8272083F82B0093F82620A4 +S3150800DF6040F2F001C2F200010A7093F82A1083F811 +S3150800DF70261083F82A20691CC9B283F82D10C1B966 +S3150800DF80611CC9B240F6D863C2F2000383F82C10AC +S3150800DF9079B9411CC9B240F6D863C2F2000383F8C6 +S3150800DFA02B1031B940F6D863C2F20003013283F868 +S3150800DFB02A2040F6D863C2F20003598C40F2DC02EC +S3150800DFC0C2F2000211809A8C5A8499845A8BDA8399 +S3150800DFD09A8B1A8440F6D462C2F2000211885983D9 +S3150800DFE052889A8300F047BD40F6A863C2F2000340 +S3150800DFF05B7E23B1072B40F08C8500F082BD40F68E +S3150800E000A461C2F2000140F6A863C2F200030B60E5 +S3150800E010032199761976002199750420D875D97641 +S3150800E0209A8040F6D864C2F20004628CDA80628B69 +S3150800E0301A80A28B5A800120587640F2E002C2F27A +S3150800E0400002117819735178597391789973D278B7 +S3150800E050DA73188294F82920DA7294F828209A72CA +S3150800E06094F827205A7294F826201A724DF68123BE +S3150800E070C0F60003984794F82E3003F0F002502AB1 +S3150800E0807ADD1B095C1FA40040F2F103C2F200030B +S3150800E0901A78002340F6D861C2F200015AE0CA187D +S3150800E0A092F8362072B940F2F001C2F200010B7004 +S3150800E0B040F2F103C2F200031A7040F6A864C2F2F5 +S3150800E0C000045DE0012A02D10133DBB242E0022AF4 +S3150800E0D02BD10D1895F83750042D26D140F2F002B1 +S3150800E0E0C2F20002137040F2F103C2F200030222E8 +S3150800E0F01A7040F6D863C2F20003034493F8382036 +S3150800E10093F8393043EA022240F2DC03C2F20003F4 +S3150800E1101A8040F20A639A4238BF134640F6A8644A +S3150800E120C2F200046382A3822AE0084490F837000A +S3150800E13070B940F2F001C2F200010B7040F2F1032F +S3150800E140C2F200031A7040F6A864C2F2000417E08F +S3150800E1500344DBB21846A342A1DB40F2F001C2F247 +S3150800E16000010B7040F2F103C2F200031A7040F688 +S3150800E170A864C2F2000403E040F6A864C2F20004F0 +S3150800E18040F6D863C2F20003102283F82F2040F627 +S3150800E190D863C2F2000393F82F2042F0020283F8F4 +S3150800E1A02F20022283F83620042283F837200622FD +S3150800E1B083F838200A2283F8392040F69062C2F2A2 +S3150800E1C000022C211180602283F82E2000F011BC59 +S3150800E1D040F6A463C2F2000340F6A862C2F2000247 +S3150800E1E01A6040F69C63C2F2000300221A7040F6D9 +S3150800E1F0D863C2F2000393F82F3013F0040F11D03E +S3150800E20040F6A863C2F200035A7640F69C63C2F24F +S3150800E210000320221A704CF2B963C0F6000398472F +S3150800E22000F063BC40F6D862C2F2000292F82E00F3 +S3150800E2300009800040F2F002C2F200021070143C9D +S3150800E240201A80B240F69062C2F20002108001F0F5 +S3150800E2500F01022903D103F03F02122A1DD010B97B +S3150800E26013F0030F19D040F6D861C2F2000140F648 +S3150800E270A862C2F20002C98C1289914240F0A183B9 +S3150800E28040F6D861C2F2000140F6A862C2F2000266 +S3150800E290098D5289914240F0948313F0100F7AD079 +S3150800E2A040F6A863C2F20003198A002973D003F165 +S3150800E2B00C004DF60123C0F60003984740F6D863D4 +S3150800E2C0C2F2000393F82A4040F69863C2F20003AC +S3150800E2D01B78A3425FD140F6D863C2F2000393F8D5 +S3150800E2E02B0040F69863C2F200035B78834252D152 +S3150800E2F040F6D863C2F2000393F82C1040F69863F0 +S3150800E300C2F200039B788B4245D140F6D863C2F22D +S3150800E310000393F82D2040F69863C2F20003DB78D9 +S3150800E320934238D140F6A863C2F200031C735873AF +S3150800E3309973DA73DB7E03BB40F6A863C2F2000367 +S3150800E340987D197E9A7E891AA1EBD001C9B2CAB204 +S3150800E3500844C0B2987512F0800F1CBF4A42D2B268 +S3150800E36040F6A863C2F20003D97DA1EB91010A44E5 +S3150800E370D2B2DA7502EBD0021A7640F69C63C2F284 +S3150800E380000301221A7040F6A863C2F200031A7E3F +S3150800E3909A7600221A8240F6A863C2F200035A7ED1 +S3150800E3A002F00F03013B072B00F29F83DFE813F00F +S3150800E3B00800400013016F02C202F7020903540263 +S3150800E3C040F69C63C2F200031B7813F0010F00F0BD +S3150800E3D08C8340F6A863C2F2000303225A7640F6FD +S3150800E3E09C62C2F200024021117000221A8240F695 +S3150800E3F09063C2F20003188850B140F69C63C2F2DB +S3150800E400000342221A704DF68123C0F6000398478E +S3150800E41041F21A53C2F2000300221A804CF2B96381 +S3150800E420C0F60003984740F6A864C2F200048BE1E0 +S3150800E43040F69C63C2F200031B7813F0010F00F04C +S3150800E440B78040F6D863C2F2000393F82F3003F082 +S3150800E4503F03122B40F0AC8040F6D863C2F20003AB +S3150800E46093F82E3003F0F002502A6DDD1B095C1F6D +S3150800E470A40040F2F103C2F200031A78002340F622 +S3150800E480D861C2F2000152E0CA1892F8362052B991 +S3150800E49040F2F001C2F200010B7040F2F103C2F241 +S3150800E4A000031A7050E0012A02D10133DBB23EE0C4 +S3150800E4B0022A2BD10D1895F83750042D26D140F293 +S3150800E4C0F002C2F20002137040F2F103C2F2000336 +S3150800E4D002221A7040F6D863C2F20003034493F886 +S3150800E4E0382093F8393043EA022240F2DC03C2F2BC +S3150800E4F000031A8040F20A639A4228BF1A4640F679 +S3150800E500A863C2F200035A829A821DE0084490F872 +S3150800E510370050B940F2F001C2F200010B7040F228 +S3150800E520F103C2F200031A700EE00344DBB2184688 +S3150800E530A342A9DB40F2F001C2F200010B7040F2DF +S3150800E540F103C2F200031A7040F6A864C2F200048E +S3150800E5500323637640F6D863C2F2000393F82620B5 +S3150800E560227293F82720627293F82820A27293F8F1 +S3150800E5702930E37201204DF68123C0F6000398473F +S3150800E58040F69C63C2F2000342221A7000222282DD +S3150800E59040F69063C2F200031A8041F21A53C2F29F +S3150800E5A000031A804CF2B963C0F600039847CBE023 +S3150800E5B040F69C63C2F2000320221A704CF2B9633B +S3150800E5C0C0F60003984740F6A463C2F200031B682E +S3150800E5D000225A7692E440F6D863C2F2000393F812 +S3150800E5E02F3013F0010F3ED012F0100F3BD140F63A +S3150800E5F0A863C2F200031B8A002B40F0768240F61D +S3150800E6009064C2F200042088013080B24DF681235E +S3150800E610C0F60003984740F69C63C2F200031A78D6 +S3150800E62042F010011970238833B140F69C63C2F298 +S3150800E630000342F012021A704CF2B963C0F60003E6 +S3150800E640984740F6A864C2F20004012323820823EF +S3150800E65063760023E37640F6D863C2F200031122FC +S3150800E66083F82F20B8E113F0200F18D040F6D863AE +S3150800E670C2F2000393F83400000293F8351040F60E +S3150800E680A063C2F2000340EA01051C682C441C6022 +S3150800E69040F69063C2F200031888411B198040F6C1 +S3150800E6A09063C2F20003188878B112F0100F0CD1EB +S3150800E6B040F69C63C2F200031A7842F002021A700E +S3150800E6C04DF68123C0F60003984740F6D863C2F298 +S3150800E6D0000393F8302093F8313003EB02239BB202 +S3150800E6E040F2DC02C2F20002138040F6A862C2F2CF +S3150800E6F00002928A934200D823B940F2DC03C2F2A0 +S3150800E70000031A8040F6A863C2F2000340F2DC0256 +S3150800E710C2F2000212885A8240F69C63C2F20003D3 +S3150800E7201B7813F0030F00F0E08141F21A53C2F28E +S3150800E730000300221A804CF2B963C0F6000398471A +S3150800E74040F6A864C2F2000440F69C63C2F20003D5 +S3150800E7501B7813F0200F0ED041F21A53C2F20003B1 +S3150800E76000221A80627640F6D863C2F200031422A9 +S3150800E77083F82F2030E113F0100F12D041F21A530C +S3150800E780C2F2000300221A8001232382042363763F +S3150800E790E27640F6D863C2F20003112283F82F20EE +S3150800E7A01AE141F21A52C2F200021288DAB113F0E3 +S3150800E7B0010F1CBF0023238201D1218A71B9618A06 +S3150800E7C08A4282BF41F21A53C2F20003198041F20B +S3150800E7D01A53C2F200031B88238204E041F21A533B +S3150800E7E0C2F2000319800023E37640F6A063C2F262 +S3150800E7F0000340F69462C2F2000212681A6041F2FF +S3150800E8001A53C2F200031B887BB1238A6BB140F608 +S3150800E8109062C2F200022833138040F6D863C2F22F +S3150800E8200003182283F82F20DCE040F69C63C2F22E +S3150800E83000031B7813F0020F00F0578140F690632F +S3150800E840C2F2000328221A8040F6D863C2F20003F7 +S3150800E850102283F82F20C5E040F69C63C2F200031D +S3150800E8601B7813F0010F00F0408140F6A863C2F24E +S3150800E870000300225A7640F69C63C2F20003102277 +S3150800E8801A704CF2B963C0F6000398472DE140F6BA +S3150800E8909063C2F20003188820B14DF68123C0F6B2 +S3150800E8A00003984740F6D863C2F2000393F82F3066 +S3150800E8B013F0010F25D040F69C63C2F200031B78C3 +S3150800E8C013F0010F40F6A863C2F200031FBF072228 +S3150800E8D05A7600229A7612BF1A8206225A760120A2 +S3150800E8E04DF68123C0F60003984740F69C63C2F2B2 +S3150800E8F0000310221A704CF2B963C0F60003984759 +S3150800E9005FE040F69C63C2F200031B7813F0010F28 +S3150800E91008D040F6A863C2F2000305225A76002200 +S3150800E9201A82E2E040F69063C2F200031B88002BCD +S3150800E93047D1DAE040F69063C2F20003188820B1A6 +S3150800E9404DF68123C0F60003984740F6D863C2F215 +S3150800E950000393F82F3013F0010F19D040F6A8637F +S3150800E960C2F2000307225A7600229A7601204DF653 +S3150800E9708123C0F60003984740F69C63C2F2000361 +S3150800E98010221A704CF2B963C0F60003984718E0D3 +S3150800E99040F69063C2F200031B8893B9A5E040F6DF +S3150800E9A09C63C2F200031B7813F0010F00F09D80F0 +S3150800E9B040F6A863C2F2000307225A7600229A7626 +S3150800E9C093E040F6D863C2F20003102283F82F20A2 +S3150800E9D040F6A864C2F2000440F69063C2F200034F +S3150800E9E028221A8040F6D863C2F20003502283F820 +S3150800E9F02E20227A40F6D863C2F2000383F82A2032 +S3150800EA00627A83F82B20A27A83F82C20E27A83F89C +S3150800EA102D20227B83F82620627B83F82720A27B81 +S3150800EA2083F82820E27B83F829200622DA75A28853 +S3150800EA305A84E2889A8440F6D462C2F200021188A7 +S3150800EA40598352889A832288DA8362881A84637E75 +S3150800EA5013F0100F40F6D863C2F200031DBF002260 +S3150800EA6083F8312083F83020062202BF83F830204D +S3150800EA700A2283F8312040F6D864C2F20004402303 +S3150800EA80A37540F69063C2F200031B881A0A227423 +S3150800EA906374002584F8355084F8345065864DF63D +S3150800EAA0E523C0F600039847C04360864523A37351 +S3150800EAB0E5736575257540F2DE03C2F200031A8810 +S3150800EAC0013292B21A80130AA374E27425834DF6B2 +S3150800EAD0B923C0F600039847C043208340F69C63D9 +S3150800EAE0C2F2000300221A7038BD40F69063C2F2E3 +S3150800EAF0000300221A8040F69C63C2F200031A70D3 +S3150800EB0038BD40F2F003C2F2000301211970FFF785 +S3150800EB1076BA40F2F003C2F2000301221A70E4E763 +S3150800EB20030A43EA002080B2704700BF2DE9F003CC +S3150800EB3040F2F203C2F200034FF0000C83F800C063 +S3150800EB4040F2F405C2F200052B4601221F461C8836 +S3150800EB50CCB15E88BEB1B0F80080A04513D1448818 +S3150800EB60B44210D140F2F203C2F2000383F800C0A7 +S3150800EB70086878608B883B8140F25513C2F200031F +S3150800EB801B78BB725AE0541CE4B20C33092C02D031 +S3150800EB9094462246DAE72B4600221E461C884CB9C4 +S3150800EBA05C883CB940F2F203C2F200031A70082AE4 +S3150800EBB036D104E00132D2B20C33082AEDD1002353 +S3150800EBC040F25512C2F200021678B0461F46994620 +S3150800EBD05FFA83FCAA7AC2EB0804BC42C2BFC2EB46 +S3150800EBE00602E146D7B201330C35082BF0D140F2C4 +S3150800EBF0F303C2F200031F7040F25413C2F200037B +S3150800EC0083F8009040F2F203C2F2000383F8009002 +S3150800EC1040F2F403C2F2000309EB490903EB890643 +S3150800EC200268334643F8042B0A6872608A889A8019 +S3150800EC3040F25513C2F200031B78B372BDE8F00325 +S3150800EC40704700BFF0B440F25513C2F200031E78B5 +S3150800EC500136F6B21E7040F2F403C2F20003012236 +S3150800EC60002740F2F204C2F20004588819880143CA +S3150800EC7089B259B1997A711A772907DD194601F8C7 +S3150800EC80017B5F70013101F8017B0F702270013240 +S3150800EC90D2B20C33092AE8D1F0BC704738B540F631 +S3150800ECA09063C2F200031B88292B06D840F69063AE +S3150800ECB0C2F2000300221A8038BD40F69063C2F201 +S3150800ECC0000300221A8040F6D863C2F200039B8A2A +S3150800ECD0B3F5807F03D0B3F5007F5CD038BD40F62E +S3150800ECE0D862C2F2000240F6D463C2F20003D28CA4 +S3150800ECF01B889A426FD140F6D862C2F2000240F6EB +S3150800ED00D463C2F20003128D5B889A4263D1324CF7 +S3150800ED10A51F204629464EF62D33C0F60003984710 +S3150800ED20A4F11C03002204F8082C022204F8072C7C +S3150800ED3054F8062C626034F8022C228140F2E8026C +S3150800ED40C2F20002106844F8060C928824F8022CD5 +S3150800ED5044F8160C24F8122C626844F81C2C2289F4 +S3150800ED6024F8182C9A8B62816288A28140F6D462B4 +S3150800ED70C2F200021188998352886280082204F838 +S3150800ED80102C062204F80F2C40F69063C2F20003FA +S3150800ED902A221A8038BD40F6D862C2F2000240F62E +S3150800EDA0D463C2F20003D28C1B889A4213D140F670 +S3150800EDB0D862C2F2000240F6D463C2F20003128D92 +S3150800EDC05B889A4207D10449084606394EF62D3320 +S3150800EDD0C0F60003984738BDF40E002038B540F653 +S3150800EDE0D863C2F20003D98B8AB24FF6FF739A42F0 +S3150800EDF015D140F6D863C2F20003188C4FF6FF739C +S3150800EE0098420CD140F6D863C2F200034FF22012A2 +S3150800EE10C0F600021068186092889A80B0E040F642 +S3150800EE20D463C2F200031B885A4040F6D063C2F28C +S3150800EE3000031B881A4212D140F6D863C2F20003B7 +S3150800EE401A8C90B240F6D463C2F200035B8858402D +S3150800EE5040F6D063C2F200035B8818420CD040F239 +S3150800EE605813C2F2000340F6CC62C2F200021188BF +S3150800EE70198052885A8005E040F25813C2F20003FE +S3150800EE8019805A8040F25813C2F2000318885D8828 +S3150800EE9040F2F403C2F2000300221C46198881429C +S3150800EEA00AD15988A94207D140F2F203C2F20003F7 +S3150800EEB01A70082A5BD109E00132D2B20C33082A4B +S3150800EEC0EBD140F2F203C2F200031A7040F6D8649E +S3150800EED0C2F200042046FF2106224FF25D03C0F667 +S3150800EEE000039847002384F8203084F8213084F8FA +S3150800EEF0223084F8233084F8243084F8253040F210 +S3150800EF00E802C2F200021168C4F80610928862810B +S3150800EF10C4F81610628340F25812C2F20002118831 +S3150800EF20E1845288228540F6D462C2F20002118832 +S3150800EF30A1835288E283237501226275A373E27363 +S3150800EF400822227463740623A3740423E3742273C9 +S3150800EF500623637340F6A063C2F2000336341C60CE +S3150800EF6040F69063C2F200032A221A8038BD40F6A2 +S3150800EF70D863C2F2000354F8040F1860A2889A8076 +S3150800EF8040F6D863C2F2000340F2E802C2F2000279 +S3150800EF901168C3F8061092885A8108221A7300224B +S3150800EFA05A7340F69063C2F200031A880E321A802A +S3150800EFB038BD00BF0F2AF0B445D940EA01039B07C4 +S3150800EFC045D1A2F110070C4603463F0900EB071688 +S3150800EFD0103625681033103443F8105C54F80C5C6E +S3150800EFE043F80C5C54F8085C43F8085C54F8045C75 +S3150800EFF043F8045CB342ECD17B1C02F00F0CBCF165 +S3150800F000030F4FEA03131944034422D90E461D463B +S3150800F010644656F8047B043C032C45F8047BF8D870 +S3150800F020ACF1040402F0030224F00304043423447C +S3150800F030214432B10A4411F8014B914203F8014BBD +S3150800F040F9D1F0BC70470346002AF3D1F9E7034625 +S3150800F050F0E76246002AEDD1F3E700BF8307F0B474 +S3150800F06048D0541E002A43D0CDB2034602E0002CF5 +S3150800F0703ED0144603F8015B13F0030F04F1FF3288 +S3150800F080F5D1032C2DD9CDB20F2C45EA052545EA35 +S3150800F090054518D9A4F1100703F110061A463F09C9 +S3150800F0A006EB07161560103242F80C5C42F8085C4D +S3150800F0B042F8045CB242F5D104F00F040137032C80 +S3150800F0C003EB07130DD91E462246043A46F8045B9D +S3150800F0D0032AFAD8221F04F0030422F0030204329A +S3150800F0E013442CB1C9B21C4403F8011BA342FBD13B +S3150800F0F0F0BC704714460346C3E700BF0502060284 +S3150800F100060307030803090309040A040B040C048D +S3150800F1100C050D050E050F050F061006100710083D +S30D0800F120FFFFFFFFFFFF0000DF +S3150800F1280000000001020304010203040607080997 +S3090800F138007A030A3E +S7050800C00032 diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/boot.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/boot.c index 4195a2d0..22996261 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/boot.c +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/boot.c @@ -87,7 +87,7 @@ void BootComCheckActivationRequest(void) ** \return none. ** ****************************************************************************************/ -static void BootActivate(void) +void BootActivate(void) { /* perform software reset to activate the bootoader again */ NVIC_SystemReset(); diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/boot.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/boot.h index 1e5edab7..ac8c16be 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/boot.h +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/boot.h @@ -38,6 +38,7 @@ ****************************************************************************************/ void BootComInit(void); void BootComCheckActivationRequest(void); +void BootActivate(void); #endif /* BOOT_H */ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/header.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/header.h index 343341ce..0fb08098 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/header.h +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/header.h @@ -43,6 +43,7 @@ #include "irq.h" /* IRQ driver */ #include "led.h" /* LED driver */ #include "timer.h" /* Timer driver */ +#include "net.h" /* TCP/IP server application */ #endif /* HEADER_H */ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/ethernetlib/inc/stm32_eth.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/ethernetlib/inc/stm32_eth.h new file mode 100644 index 00000000..578d8baa --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/ethernetlib/inc/stm32_eth.h @@ -0,0 +1,1610 @@ +/** + ****************************************************************************** + * @file stm32_eth.h + * @author MCD Application Team + * @version V1.0.0 + * @date 06/19/2009 + * @brief This file contains all the functions prototypes for the Ethernet + * firmware library. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32_ETH_H +#define __STM32_ETH_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx.h" /* STM32 registers */ + +/** @addtogroup STM32_ETH_Driver + * @{ + */ + +/** @defgroup ETH_Exported_Types + * @{ + */ + +/** + * @brief ETH MAC Init structure definition + */ +typedef struct { +/** + * @brief / * MAC + */ + uint32_t ETH_AutoNegotiation; /*!< Selects or not the AutoNegotiation with the external PHY */ + uint32_t ETH_Watchdog; /*!< Enable/disable Watchdog timer */ + uint32_t ETH_Jabber; /*!< Enable/disable Jabber timer */ + uint32_t ETH_InterFrameGap; /*!< Selects minimum IFG between frames during transmission */ + uint32_t ETH_CarrierSense; /*!< Enable/disable Carrier Sense */ + uint32_t ETH_Speed; /*!< Indicates the Ethernet speed: 10/100 Mbps */ + uint32_t ETH_ReceiveOwn; /*!< Enable/disable the reception of frames when the TX_EN signal is asserted in Half-Duplex mode */ + uint32_t ETH_LoopbackMode; /*!< Enable/disable internal MAC MII Loopback mode */ + uint32_t ETH_Mode; /*!< Selects the MAC duplex mode: Half-Duplex or Full-Duplex mode */ + uint32_t ETH_ChecksumOffload; /*!< Enable/disable the calculation of complement sum of all received Ethernet frame payloads */ + uint32_t ETH_RetryTransmission; /*!< Enable/disable the MAC attempt retries transmission, based on the settings of BL, when a colision occurs (Half-Duplex mode) */ + uint32_t ETH_AutomaticPadCRCStrip; /*!< Enable/disable Automatic MAC Pad/CRC Stripping */ + uint32_t ETH_BackOffLimit; /*!< Selects the BackOff limit value */ + uint32_t ETH_DeferralCheck; /*!< Enable/disable deferral check function (Half-Duplex mode) */ + uint32_t ETH_ReceiveAll; /*!< Enable/disable all frames reception by the MAC (No fitering)*/ + uint32_t ETH_SourceAddrFilter; /*!< Selects EnableNormal/EnableInverse/disable Source Address Filter comparison */ + uint32_t ETH_PassControlFrames; /*!< Selects None/All/FilterPass of all control frames (including unicast and multicast PAUSE frames) */ + uint32_t ETH_BroadcastFramesReception; /*!< Enable/disable reception of Broadcast Frames */ + uint32_t ETH_DestinationAddrFilter; /*!< Selects EnableNormal/EnableInverse destination filter for both unicast and multicast frames */ + uint32_t ETH_PromiscuousMode; /*!< Enable/disable Promiscuous Mode */ + uint32_t ETH_MulticastFramesFilter; /*!< Selects the Multicast Frames filter: None/HashTableFilter/PerfectFilter/PerfectHashTableFilter */ + uint32_t ETH_UnicastFramesFilter; /*!< Selects the Unicast Frames filter: HashTableFilter/PerfectFilter/PerfectHashTableFilter */ + uint32_t ETH_HashTableHigh; /*!< This field contains the higher 32 bits of Hash table. */ + uint32_t ETH_HashTableLow; /*!< This field contains the lower 32 bits of Hash table. */ + uint32_t ETH_PauseTime; /*!< This field holds the value to be used in the Pause Time field in the transmit control frame */ + uint32_t ETH_ZeroQuantaPause; /*!< Enable/disable the automatic generation of Zero-Quanta Pause Control frames */ + uint32_t ETH_PauseLowThreshold; /*!< This field configures the threshold of the PAUSE to be checked for automatic retransmission of PAUSE Frame */ + uint32_t ETH_UnicastPauseFrameDetect; /*!< Enable/disable MAC to detect the Pause frames (with MAC Address0 unicast address and unique multicast address) */ + uint32_t ETH_ReceiveFlowControl; /*!< Enable/disable the MAC to decode the received Pause frame and disable its transmitter for a specified (Pause Time) time */ + uint32_t ETH_TransmitFlowControl; /*!< Enable/disable the MAC to transmit Pause frames (Full-Duplex mode) or the MAC back-pressure operation (Half-Duplex mode) */ + uint32_t ETH_VLANTagComparison; /*!< Selects the 12-bit VLAN identifier or the complete 16-bit VLAN tag for comparison and filtering */ + uint32_t ETH_VLANTagIdentifier; /*!< VLAN tag identifier for receive frames */ + +/** + * @brief / * DMA + */ + uint32_t ETH_DropTCPIPChecksumErrorFrame; /*!< Enable/disable Dropping of TCP/IP Checksum Error Frames */ + uint32_t ETH_ReceiveStoreForward; /*!< Enable/disable Receive store and forward */ + uint32_t ETH_FlushReceivedFrame; /*!< Enable/disable flushing of received frames */ + uint32_t ETH_TransmitStoreForward; /*!< Enable/disable Transmit store and forward */ + uint32_t ETH_TransmitThresholdControl; /*!< Selects the Transmit Threshold Control */ + uint32_t ETH_ForwardErrorFrames; /*!< Enable/disable forward to DMA of all frames except runt error frames */ + uint32_t ETH_ForwardUndersizedGoodFrames; /*!< Enable/disable Rx FIFO to forward Undersized frames (frames with no Error and length less than 64 bytes) including pad-bytes and CRC) */ + uint32_t ETH_ReceiveThresholdControl; /*!< Selects the threshold level of the Receive FIFO */ + uint32_t ETH_SecondFrameOperate; /*!< Enable/disable the DMA process of a second frame of Transmit data even before status for first frame is obtained */ + uint32_t ETH_AddressAlignedBeats; /*!< Enable/disable Address Aligned Beats */ + uint32_t ETH_FixedBurst; /*!< Enable/disable the AHB Master interface fixed burst transfers */ + uint32_t ETH_RxDMABurstLength; /*!< Indicate the maximum number of beats to be transferred in one Rx DMA transaction */ + uint32_t ETH_TxDMABurstLength; /*!< Indicate the maximum number of beats to be transferred in one Tx DMA transaction */ + uint32_t ETH_DescriptorSkipLength; /*!< Specifies the number of word to skip between two unchained descriptors (Ring mode) */ + uint32_t ETH_DMAArbitration; /*!< Selects DMA Tx/Rx arbitration */ +}ETH_InitTypeDef; + +/**--------------------------------------------------------------------------**/ +/** + * @brief DMA descriptors types + */ +/**--------------------------------------------------------------------------**/ + +/** + * @brief ETH DMA Desciptors data structure definition + */ +typedef struct { + uint32_t Status; /*!< Status */ + uint32_t ControlBufferSize; /*!< Control and Buffer1, Buffer2 lengths */ + uint32_t Buffer1Addr; /*!< Buffer1 address pointer */ + uint32_t Buffer2NextDescAddr; /*!< Buffer2 or next descriptor address pointer */ +} ETH_DMADESCTypeDef; + +/** + * @} + */ + +/** @defgroup ETH_Exported_Constants + * @{ + */ +/**--------------------------------------------------------------------------**/ +/** + * @brief ETH Frames defines + */ +/**--------------------------------------------------------------------------**/ + +/** @defgroup ENET_Buffers_setting + * @{ + */ +#define ETH_MAX_PACKET_SIZE 1520 /*!< ETH_HEADER + ETH_EXTRA + MAX_ETH_PAYLOAD + ETH_CRC */ +#define ETH_HEADER 14 /*!< 6 byte Dest addr, 6 byte Src addr, 2 byte length/type */ +#define ETH_CRC 4 /*!< Ethernet CRC */ +#define ETH_EXTRA 2 /*!< Extra bytes in some cases */ +#define VLAN_TAG 4 /*!< optional 802.1q VLAN Tag */ +#define MIN_ETH_PAYLOAD 46 /*!< Minimum Ethernet payload size */ +#define MAX_ETH_PAYLOAD 1500 /*!< Maximum Ethernet payload size */ +#define JUMBO_FRAME_PAYLOAD 9000 /*!< Jumbo frame payload size */ + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet DMA descriptors registers bits definition + */ +/**--------------------------------------------------------------------------**/ + +/* DMA Tx Desciptor -----------------------------------------------------------*/ +/**---------------------------------------------------------------------------------------------- + TDES0 | OWN(31) | CTRL[30:26] | Reserved[25:24] | CTRL[23:20] | Reserved[19:17] | Status[16:0] | + ----------------------------------------------------------------------------------------------- + TDES1 | Reserved[31:29] | Buffer2 ByteCount[28:16] | Reserved[15:13] | Buffer1 ByteCount[12:0] | + ----------------------------------------------------------------------------------------------- + TDES2 | Buffer1 Address [31:0] | + ----------------------------------------------------------------------------------------------- + TDES3 | Buffer2 Address [31:0] / Next Desciptor Address [31:0] | + ---------------------------------------------------------------------------------------------**/ + +/** + * @brief Bit definition of TDES0 register: DMA Tx descriptor status register + */ +#define ETH_DMATxDesc_OWN ((uint32_t)0x80000000) /*!< OWN bit: descriptor is owned by DMA engine */ +#define ETH_DMATxDesc_IC ((uint32_t)0x40000000) /*!< Interrupt on Completion */ +#define ETH_DMATxDesc_LS ((uint32_t)0x20000000) /*!< Last Segment */ +#define ETH_DMATxDesc_FS ((uint32_t)0x10000000) /*!< First Segment */ +#define ETH_DMATxDesc_DC ((uint32_t)0x08000000) /*!< Disable CRC */ +#define ETH_DMATxDesc_DP ((uint32_t)0x04000000) /*!< Disable Padding */ +#define ETH_DMATxDesc_TTSE ((uint32_t)0x02000000) /*!< Transmit Time Stamp Enable */ +#define ETH_DMATxDesc_CIC ((uint32_t)0x00C00000) /*!< Checksum Insertion Control: 4 cases */ +#define ETH_DMATxDesc_CIC_ByPass ((uint32_t)0x00000000) /*!< Do Nothing: Checksum Engine is bypassed */ +#define ETH_DMATxDesc_CIC_IPV4Header ((uint32_t)0x00400000) /*!< IPV4 header Checksum Insertion */ +#define ETH_DMATxDesc_CIC_TCPUDPICMP_Segment ((uint32_t)0x00800000) /*!< TCP/UDP/ICMP Checksum Insertion calculated over segment only */ +#define ETH_DMATxDesc_CIC_TCPUDPICMP_Full ((uint32_t)0x00C00000) /*!< TCP/UDP/ICMP Checksum Insertion fully calculated */ +#define ETH_DMATxDesc_TER ((uint32_t)0x00200000) /*!< Transmit End of Ring */ +#define ETH_DMATxDesc_TCH ((uint32_t)0x00100000) /*!< Second Address Chained */ +#define ETH_DMATxDesc_TTSS ((uint32_t)0x00020000) /*!< Tx Time Stamp Status */ +#define ETH_DMATxDesc_IHE ((uint32_t)0x00010000) /*!< IP Header Error */ +#define ETH_DMATxDesc_ES ((uint32_t)0x00008000) /*!< Error summary: OR of the following bits: UE || ED || EC || LCO || NC || LCA || FF || JT */ +#define ETH_DMATxDesc_JT ((uint32_t)0x00004000) /*!< Jabber Timeout */ +#define ETH_DMATxDesc_FF ((uint32_t)0x00002000) /*!< Frame Flushed: DMA/MTL flushed the frame due to SW flush */ +#define ETH_DMATxDesc_PCE ((uint32_t)0x00001000) /*!< Payload Checksum Error */ +#define ETH_DMATxDesc_LCA ((uint32_t)0x00000800) /*!< Loss of Carrier: carrier lost during tramsmission */ +#define ETH_DMATxDesc_NC ((uint32_t)0x00000400) /*!< No Carrier: no carrier signal from the tranceiver */ +#define ETH_DMATxDesc_LCO ((uint32_t)0x00000200) /*!< Late Collision: transmission aborted due to collision */ +#define ETH_DMATxDesc_EC ((uint32_t)0x00000100) /*!< Excessive Collision: transmission aborted after 16 collisions */ +#define ETH_DMATxDesc_VF ((uint32_t)0x00000080) /*!< VLAN Frame */ +#define ETH_DMATxDesc_CC ((uint32_t)0x00000078) /*!< Collision Count */ +#define ETH_DMATxDesc_ED ((uint32_t)0x00000004) /*!< Excessive Deferral */ +#define ETH_DMATxDesc_UF ((uint32_t)0x00000002) /*!< Underflow Error: late data arrival from the memory */ +#define ETH_DMATxDesc_DB ((uint32_t)0x00000001) /*!< Deferred Bit */ + +/** + * @brief Bit definition of TDES1 register + */ +#define ETH_DMATxDesc_TBS2 ((uint32_t)0x1FFF0000) /*!< Transmit Buffer2 Size */ +#define ETH_DMATxDesc_TBS1 ((uint32_t)0x00001FFF) /*!< Transmit Buffer1 Size */ + +/** + * @brief Bit definition of TDES2 register + */ +#define ETH_DMATxDesc_B1AP ((uint32_t)0xFFFFFFFF) /*!< Buffer1 Address Pointer */ + +/** + * @brief Bit definition of TDES3 register + */ +#define ETH_DMATxDesc_B2AP ((uint32_t)0xFFFFFFFF) /*!< Buffer2 Address Pointer */ + +/** + * @} + */ + + +/** @defgroup DMA_Rx_descriptor + * @{ + */ + +/**-------------------------------------------------------------------------------------------------------------------- + RDES0 | OWN(31) | Status [30:0] | + --------------------------------------------------------------------------------------------------------------------- + RDES1 | CTRL(31) | Reserved[30:29] | Buffer2 ByteCount[28:16] | CTRL[15:14] | Reserved(13) | Buffer1 ByteCount[12:0] | + --------------------------------------------------------------------------------------------------------------------- + RDES2 | Buffer1 Address [31:0] | + --------------------------------------------------------------------------------------------------------------------- + RDES3 | Buffer2 Address [31:0] / Next Desciptor Address [31:0] | + -------------------------------------------------------------------------------------------------------------------**/ + +/** + * @brief Bit definition of RDES0 register: DMA Rx descriptor status register + */ +#define ETH_DMARxDesc_OWN ((uint32_t)0x80000000) /*!< OWN bit: descriptor is owned by DMA engine */ +#define ETH_DMARxDesc_AFM ((uint32_t)0x40000000) /*!< DA Filter Fail for the rx frame */ +#define ETH_DMARxDesc_FL ((uint32_t)0x3FFF0000) /*!< Receive descriptor frame length */ +#define ETH_DMARxDesc_ES ((uint32_t)0x00008000) /*!< Error summary: OR of the following bits: DE || OE || IPC || LC || RWT || RE || CE */ +#define ETH_DMARxDesc_DE ((uint32_t)0x00004000) /*!< Desciptor error: no more descriptors for receive frame */ +#define ETH_DMARxDesc_SAF ((uint32_t)0x00002000) /*!< SA Filter Fail for the received frame */ +#define ETH_DMARxDesc_LE ((uint32_t)0x00001000) /*!< Frame size not matching with length field */ +#define ETH_DMARxDesc_OE ((uint32_t)0x00000800) /*!< Overflow Error: Frame was damaged due to buffer overflow */ +#define ETH_DMARxDesc_VLAN ((uint32_t)0x00000400) /*!< VLAN Tag: received frame is a VLAN frame */ +#define ETH_DMARxDesc_FS ((uint32_t)0x00000200) /*!< First descriptor of the frame */ +#define ETH_DMARxDesc_LS ((uint32_t)0x00000100) /*!< Last descriptor of the frame */ +#define ETH_DMARxDesc_IPV4HCE ((uint32_t)0x00000080) /*!< IPC Checksum Error: Rx Ipv4 header checksum error */ +#define ETH_DMARxDesc_LC ((uint32_t)0x00000040) /*!< Late collision occurred during reception */ +#define ETH_DMARxDesc_FT ((uint32_t)0x00000020) /*!< Frame type - Ethernet, otherwise 802.3 */ +#define ETH_DMARxDesc_RWT ((uint32_t)0x00000010) /*!< Receive Watchdog Timeout: watchdog timer expired during reception */ +#define ETH_DMARxDesc_RE ((uint32_t)0x00000008) /*!< Receive error: error reported by MII interface */ +#define ETH_DMARxDesc_DBE ((uint32_t)0x00000004) /*!< Dribble bit error: frame contains non int multiple of 8 bits */ +#define ETH_DMARxDesc_CE ((uint32_t)0x00000002) /*!< CRC error */ +#define ETH_DMARxDesc_MAMPCE ((uint32_t)0x00000001) /*!< Rx MAC Address/Payload Checksum Error: Rx MAC address matched/ Rx Payload Checksum Error */ + +/** + * @brief Bit definition of RDES1 register + */ +#define ETH_DMARxDesc_DIC ((uint32_t)0x80000000) /*!< Disable Interrupt on Completion */ +#define ETH_DMARxDesc_RBS2 ((uint32_t)0x1FFF0000) /*!< Receive Buffer2 Size */ +#define ETH_DMARxDesc_RER ((uint32_t)0x00008000) /*!< Receive End of Ring */ +#define ETH_DMARxDesc_RCH ((uint32_t)0x00004000) /*!< Second Address Chained */ +#define ETH_DMARxDesc_RBS1 ((uint32_t)0x00001FFF) /*!< Receive Buffer1 Size */ + +/** + * @brief Bit definition of RDES2 register + */ +#define ETH_DMARxDesc_B1AP ((uint32_t)0xFFFFFFFF) /*!< Buffer1 Address Pointer */ + +/** + * @brief Bit definition of RDES3 register + */ +#define ETH_DMARxDesc_B2AP ((uint32_t)0xFFFFFFFF) /*!< Buffer2 Address Pointer */ + +/**--------------------------------------------------------------------------**/ +/** + * @brief Desciption of common PHY registers + */ +/**--------------------------------------------------------------------------**/ + +/** + * @} + */ + +/** @defgroup PHY_Read_write_Timeouts + * @{ + */ +#define PHY_READ_TO ((uint32_t)0x0004FFFF) +#define PHY_WRITE_TO ((uint32_t)0x0004FFFF) + +/** + * @} + */ + +/** @defgroup PHY_Reset_Delay + * @{ + */ +#define PHY_ResetDelay ((uint32_t)0x04000000) + +/** + * @} + */ + +/** @defgroup PHY_Config_Delay + * @{ + */ +#define PHY_ConfigDelay ((uint32_t)0x00FFFFFF) + +/** + * @} + */ + +/** @defgroup PHY_Register_address + * @{ + */ +#define PHY_BCR 0 /*!< Tranceiver Basic Control Register */ +#define PHY_BSR 1 /*!< Tranceiver Basic Status Register */ + +/** + * @} + */ + +/** @defgroup PHY_basic_Control_register + * @{ + */ +#define PHY_Reset ((u16)0x8000) /*!< PHY Reset */ +#define PHY_Loopback ((u16)0x4000) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((u16)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((u16)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((u16)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((u16)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AutoNegotiation ((u16)0x1000) /*!< Enable auto-negotiation function */ +#define PHY_Restart_AutoNegotiation ((u16)0x0200) /*!< Restart auto-negotiation function */ +#define PHY_Powerdown ((u16)0x0800) /*!< Select the power down mode */ +#define PHY_Isolate ((u16)0x0400) /*!< Isolate PHY from MII */ + +/** + * @} + */ + +/** @defgroup PHY_basic_status_register + * @{ + */ +#define PHY_AutoNego_Complete ((u16)0x0020) /*!< Auto-Negotioation process completed */ +#define PHY_Linked_Status ((u16)0x0004) /*!< Valid link established */ +#define PHY_Jabber_detection ((u16)0x0002) /*!< Jabber condition detected */ + +/** + * @} + */ + +/** @defgroup PHY_status_register + * @{ + */ +/* The PHY status register value change from a PHY to another so the user have + to update this value depending on the used external PHY */ +/** + * @brief For LAN8700 + */ +//#define PHY_SR 31 /*!< Tranceiver Status Register */ +/** + * @brief For DP83848 + */ +#define PHY_SR 16 /*!< Tranceiver Status Register */ + +/* The Speed and Duplex mask values change from a PHY to another so the user have to update + this value depending on the used external PHY */ +/** + * @brief For LAN8700 + */ +//#define PHY_Speed_Status ((u16)0x0004) /*!< Configured information of Speed: 10Mbps */ +//#define PHY_Duplex_Status ((u16)0x0010) /*!< Configured information of Duplex: Full-duplex */ + +/** + * @brief For DP83848 + */ +#define PHY_Speed_Status ((u16)0x0002) /*!< Configured information of Speed: 10Mbps */ +#define PHY_Duplex_Status ((u16)0x0004) /*!< Configured information of Duplex: Full-duplex */ +#define IS_ETH_PHY_ADDRESS(ADDRESS) ((ADDRESS) <= 0x20) +#define IS_ETH_PHY_REG(REG) (((REG) == PHY_BCR) || \ + ((REG) == PHY_BSR) || \ + ((REG) == PHY_SR)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief MAC defines + */ +/**--------------------------------------------------------------------------**/ + +/** + * @} + */ + +/** @defgroup ETH_AutoNegotiation + * @{ + */ +#define ETH_AutoNegotiation_Enable ((uint32_t)0x00000001) +#define ETH_AutoNegotiation_Disable ((uint32_t)0x00000000) +#define IS_ETH_AUTONEGOTIATION(CMD) (((CMD) == ETH_AutoNegotiation_Enable) || \ + ((CMD) == ETH_AutoNegotiation_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_watchdog + * @{ + */ +#define ETH_Watchdog_Enable ((uint32_t)0x00000000) +#define ETH_Watchdog_Disable ((uint32_t)0x00800000) +#define IS_ETH_WATCHDOG(CMD) (((CMD) == ETH_Watchdog_Enable) || \ + ((CMD) == ETH_Watchdog_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Jabber + * @{ + */ +#define ETH_Jabber_Enable ((uint32_t)0x00000000) +#define ETH_Jabber_Disable ((uint32_t)0x00400000) +#define IS_ETH_JABBER(CMD) (((CMD) == ETH_Jabber_Enable) || \ + ((CMD) == ETH_Jabber_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Inter_Frame_Gap + * @{ + */ +#define ETH_InterFrameGap_96Bit ((uint32_t)0x00000000) /*!< minimum IFG between frames during transmission is 96Bit */ +#define ETH_InterFrameGap_88Bit ((uint32_t)0x00020000) /*!< minimum IFG between frames during transmission is 88Bit */ +#define ETH_InterFrameGap_80Bit ((uint32_t)0x00040000) /*!< minimum IFG between frames during transmission is 80Bit */ +#define ETH_InterFrameGap_72Bit ((uint32_t)0x00060000) /*!< minimum IFG between frames during transmission is 72Bit */ +#define ETH_InterFrameGap_64Bit ((uint32_t)0x00080000) /*!< minimum IFG between frames during transmission is 64Bit */ +#define ETH_InterFrameGap_56Bit ((uint32_t)0x000A0000) /*!< minimum IFG between frames during transmission is 56Bit */ +#define ETH_InterFrameGap_48Bit ((uint32_t)0x000C0000) /*!< minimum IFG between frames during transmission is 48Bit */ +#define ETH_InterFrameGap_40Bit ((uint32_t)0x000E0000) /*!< minimum IFG between frames during transmission is 40Bit */ +#define IS_ETH_INTER_FRAME_GAP(GAP) (((GAP) == ETH_InterFrameGap_96Bit) || \ + ((GAP) == ETH_InterFrameGap_88Bit) || \ + ((GAP) == ETH_InterFrameGap_80Bit) || \ + ((GAP) == ETH_InterFrameGap_72Bit) || \ + ((GAP) == ETH_InterFrameGap_64Bit) || \ + ((GAP) == ETH_InterFrameGap_56Bit) || \ + ((GAP) == ETH_InterFrameGap_48Bit) || \ + ((GAP) == ETH_InterFrameGap_40Bit)) + +/** + * @} + */ + +/** @defgroup ETH_Carrier_Sense + * @{ + */ +#define ETH_CarrierSense_Enable ((uint32_t)0x00000000) +#define ETH_CarrierSense_Disable ((uint32_t)0x00010000) +#define IS_ETH_CARRIER_SENSE(CMD) (((CMD) == ETH_CarrierSense_Enable) || \ + ((CMD) == ETH_CarrierSense_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Speed + * @{ + */ +#define ETH_Speed_10M ((uint32_t)0x00000000) +#define ETH_Speed_100M ((uint32_t)0x00004000) +#define IS_ETH_SPEED(SPEED) (((SPEED) == ETH_Speed_10M) || \ + ((SPEED) == ETH_Speed_100M)) + +/** + * @} + */ + +/** @defgroup ETH_Receive_Own + * @{ + */ +#define ETH_ReceiveOwn_Enable ((uint32_t)0x00000000) +#define ETH_ReceiveOwn_Disable ((uint32_t)0x00002000) +#define IS_ETH_RECEIVE_OWN(CMD) (((CMD) == ETH_ReceiveOwn_Enable) || \ + ((CMD) == ETH_ReceiveOwn_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Loop_back_Mode + * @{ + */ +#define ETH_LoopbackMode_Enable ((uint32_t)0x00001000) +#define ETH_LoopbackMode_Disable ((uint32_t)0x00000000) +#define IS_ETH_LOOPBACK_MODE(CMD) (((CMD) == ETH_LoopbackMode_Enable) || \ + ((CMD) == ETH_LoopbackMode_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Duplex_mode + * @{ + */ +#define ETH_Mode_FullDuplex ((uint32_t)0x00000800) +#define ETH_Mode_HalfDuplex ((uint32_t)0x00000000) +#define IS_ETH_DUPLEX_MODE(MODE) (((MODE) == ETH_Mode_FullDuplex) || \ + ((MODE) == ETH_Mode_HalfDuplex)) + +/** + * @} + */ + +/** @defgroup ETH_Checksum_Offload + * @{ + */ +#define ETH_ChecksumOffload_Enable ((uint32_t)0x00000400) +#define ETH_ChecksumOffload_Disable ((uint32_t)0x00000000) +#define IS_ETH_CHECKSUM_OFFLOAD(CMD) (((CMD) == ETH_ChecksumOffload_Enable) || \ + ((CMD) == ETH_ChecksumOffload_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Retry_Transmission + * @{ + */ +#define ETH_RetryTransmission_Enable ((uint32_t)0x00000000) +#define ETH_RetryTransmission_Disable ((uint32_t)0x00000200) +#define IS_ETH_RETRY_TRANSMISSION(CMD) (((CMD) == ETH_RetryTransmission_Enable) || \ + ((CMD) == ETH_RetryTransmission_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Automatic_Pad_CRC_Strip + * @{ + */ +#define ETH_AutomaticPadCRCStrip_Enable ((uint32_t)0x00000080) +#define ETH_AutomaticPadCRCStrip_Disable ((uint32_t)0x00000000) +#define IS_ETH_AUTOMATIC_PADCRC_STRIP(CMD) (((CMD) == ETH_AutomaticPadCRCStrip_Enable) || \ + ((CMD) == ETH_AutomaticPadCRCStrip_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Back-Off_limit + * @{ + */ +#define ETH_BackOffLimit_10 ((uint32_t)0x00000000) +#define ETH_BackOffLimit_8 ((uint32_t)0x00000020) +#define ETH_BackOffLimit_4 ((uint32_t)0x00000040) +#define ETH_BackOffLimit_1 ((uint32_t)0x00000060) +#define IS_ETH_BACKOFF_LIMIT(LIMIT) (((LIMIT) == ETH_BackOffLimit_10) || \ + ((LIMIT) == ETH_BackOffLimit_8) || \ + ((LIMIT) == ETH_BackOffLimit_4) || \ + ((LIMIT) == ETH_BackOffLimit_1)) + +/** + * @} + */ + +/** @defgroup ETH_Deferral_Check + * @{ + */ +#define ETH_DeferralCheck_Enable ((uint32_t)0x00000010) +#define ETH_DeferralCheck_Disable ((uint32_t)0x00000000) +#define IS_ETH_DEFERRAL_CHECK(CMD) (((CMD) == ETH_DeferralCheck_Enable) || \ + ((CMD) == ETH_DeferralCheck_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Receive_All + * @{ + */ +#define ETH_ReceiveAll_Enable ((uint32_t)0x80000000) +#define ETH_ReceiveAll_Disable ((uint32_t)0x00000000) +#define IS_ETH_RECEIVE_ALL(CMD) (((CMD) == ETH_ReceiveAll_Enable) || \ + ((CMD) == ETH_ReceiveAll_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Source_Addr_Filter + * @{ + */ +#define ETH_SourceAddrFilter_Normal_Enable ((uint32_t)0x00000200) +#define ETH_SourceAddrFilter_Inverse_Enable ((uint32_t)0x00000300) +#define ETH_SourceAddrFilter_Disable ((uint32_t)0x00000000) +#define IS_ETH_SOURCE_ADDR_FILTER(CMD) (((CMD) == ETH_SourceAddrFilter_Normal_Enable) || \ + ((CMD) == ETH_SourceAddrFilter_Inverse_Enable) || \ + ((CMD) == ETH_SourceAddrFilter_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Pass_Control_Frames + * @{ + */ +#define ETH_PassControlFrames_BlockAll ((uint32_t)0x00000040) /*!< MAC filters all control frames from reaching the application */ +#define ETH_PassControlFrames_ForwardAll ((uint32_t)0x00000080) /*!< MAC forwards all control frames to application even if they fail the Address Filter */ +#define ETH_PassControlFrames_ForwardPassedAddrFilter ((uint32_t)0x000000C0) /*!< MAC forwards control frames that pass the Address Filter. */ +#define IS_ETH_CONTROL_FRAMES(PASS) (((PASS) == ETH_PassControlFrames_BlockAll) || \ + ((PASS) == ETH_PassControlFrames_ForwardAll) || \ + ((PASS) == ETH_PassControlFrames_ForwardPassedAddrFilter)) + +/** + * @} + */ + +/** @defgroup ETH_Broadcast_Frames_Reception + * @{ + */ +#define ETH_BroadcastFramesReception_Enable ((uint32_t)0x00000000) +#define ETH_BroadcastFramesReception_Disable ((uint32_t)0x00000020) +#define IS_ETH_BROADCAST_FRAMES_RECEPTION(CMD) (((CMD) == ETH_BroadcastFramesReception_Enable) || \ + ((CMD) == ETH_BroadcastFramesReception_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Destination_Addr_Filter + * @{ + */ +#define ETH_DestinationAddrFilter_Normal ((uint32_t)0x00000000) +#define ETH_DestinationAddrFilter_Inverse ((uint32_t)0x00000008) +#define IS_ETH_DESTINATION_ADDR_FILTER(FILTER) (((FILTER) == ETH_DestinationAddrFilter_Normal) || \ + ((FILTER) == ETH_DestinationAddrFilter_Inverse)) + +/** + * @} + */ + +/** @defgroup ETH_Promiscuous_Mode + * @{ + */ +#define ETH_PromiscuousMode_Enable ((uint32_t)0x00000001) +#define ETH_PromiscuousMode_Disable ((uint32_t)0x00000000) +#define IS_ETH_PROMISCUOUS_MODE(CMD) (((CMD) == ETH_PromiscuousMode_Enable) || \ + ((CMD) == ETH_PromiscuousMode_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_multicast_frames_filter + * @{ + */ +#define ETH_MulticastFramesFilter_PerfectHashTable ((uint32_t)0x00000404) +#define ETH_MulticastFramesFilter_HashTable ((uint32_t)0x00000004) +#define ETH_MulticastFramesFilter_Perfect ((uint32_t)0x00000000) +#define ETH_MulticastFramesFilter_None ((uint32_t)0x00000010) +#define IS_ETH_MULTICAST_FRAMES_FILTER(FILTER) (((FILTER) == ETH_MulticastFramesFilter_PerfectHashTable) || \ + ((FILTER) == ETH_MulticastFramesFilter_HashTable) || \ + ((FILTER) == ETH_MulticastFramesFilter_Perfect) || \ + ((FILTER) == ETH_MulticastFramesFilter_None)) + + +/** + * @} + */ + +/** @defgroup ETH_unicast_frames_filter + * @{ + */ +#define ETH_UnicastFramesFilter_PerfectHashTable ((uint32_t)0x00000402) +#define ETH_UnicastFramesFilter_HashTable ((uint32_t)0x00000002) +#define ETH_UnicastFramesFilter_Perfect ((uint32_t)0x00000000) +#define IS_ETH_UNICAST_FRAMES_FILTER(FILTER) (((FILTER) == ETH_UnicastFramesFilter_PerfectHashTable) || \ + ((FILTER) == ETH_UnicastFramesFilter_HashTable) || \ + ((FILTER) == ETH_UnicastFramesFilter_Perfect)) + +/** + * @} + */ + +/** @defgroup ETH_Pause_Time + * @{ + */ +#define IS_ETH_PAUSE_TIME(TIME) ((TIME) <= 0xFFFF) + +/** + * @} + */ + +/** @defgroup ETH_Zero_Quanta_Pause + * @{ + */ +#define ETH_ZeroQuantaPause_Enable ((uint32_t)0x00000000) +#define ETH_ZeroQuantaPause_Disable ((uint32_t)0x00000080) +#define IS_ETH_ZEROQUANTA_PAUSE(CMD) (((CMD) == ETH_ZeroQuantaPause_Enable) || \ + ((CMD) == ETH_ZeroQuantaPause_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Pause_Low_Threshold + * @{ + */ +#define ETH_PauseLowThreshold_Minus4 ((uint32_t)0x00000000) /*!< Pause time minus 4 slot times */ +#define ETH_PauseLowThreshold_Minus28 ((uint32_t)0x00000010) /*!< Pause time minus 28 slot times */ +#define ETH_PauseLowThreshold_Minus144 ((uint32_t)0x00000020) /*!< Pause time minus 144 slot times */ +#define ETH_PauseLowThreshold_Minus256 ((uint32_t)0x00000030) /*!< Pause time minus 256 slot times */ +#define IS_ETH_PAUSE_LOW_THRESHOLD(THRESHOLD) (((THRESHOLD) == ETH_PauseLowThreshold_Minus4) || \ + ((THRESHOLD) == ETH_PauseLowThreshold_Minus28) || \ + ((THRESHOLD) == ETH_PauseLowThreshold_Minus144) || \ + ((THRESHOLD) == ETH_PauseLowThreshold_Minus256)) + +/** + * @} + */ + +/** @defgroup ETH_Unicast_Pause_Frame_Detect + * @{ + */ +#define ETH_UnicastPauseFrameDetect_Enable ((uint32_t)0x00000008) +#define ETH_UnicastPauseFrameDetect_Disable ((uint32_t)0x00000000) +#define IS_ETH_UNICAST_PAUSE_FRAME_DETECT(CMD) (((CMD) == ETH_UnicastPauseFrameDetect_Enable) || \ + ((CMD) == ETH_UnicastPauseFrameDetect_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Receive_Flow_Control + * @{ + */ +#define ETH_ReceiveFlowControl_Enable ((uint32_t)0x00000004) +#define ETH_ReceiveFlowControl_Disable ((uint32_t)0x00000000) +#define IS_ETH_RECEIVE_FLOWCONTROL(CMD) (((CMD) == ETH_ReceiveFlowControl_Enable) || \ + ((CMD) == ETH_ReceiveFlowControl_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Transmit_Flow_Control + * @{ + */ +#define ETH_TransmitFlowControl_Enable ((uint32_t)0x00000002) +#define ETH_TransmitFlowControl_Disable ((uint32_t)0x00000000) +#define IS_ETH_TRANSMIT_FLOWCONTROL(CMD) (((CMD) == ETH_TransmitFlowControl_Enable) || \ + ((CMD) == ETH_TransmitFlowControl_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_VLAN_Tag_Comparison + * @{ + */ +#define ETH_VLANTagComparison_12Bit ((uint32_t)0x00010000) +#define ETH_VLANTagComparison_16Bit ((uint32_t)0x00000000) +#define IS_ETH_VLAN_TAG_COMPARISON(COMPARISON) (((COMPARISON) == ETH_VLANTagComparison_12Bit) || \ + ((COMPARISON) == ETH_VLANTagComparison_16Bit)) +#define IS_ETH_VLAN_TAG_IDENTIFIER(IDENTIFIER) ((IDENTIFIER) <= 0xFFFF) + +/** + * @} + */ + +/** @defgroup ETH_MAC_Flags + * @{ + */ +#define ETH_MAC_FLAG_TST ((uint32_t)0x00000200) /*!< Time stamp trigger flag (on MAC) */ +#define ETH_MAC_FLAG_MMCT ((uint32_t)0x00000040) /*!< MMC transmit flag */ +#define ETH_MAC_FLAG_MMCR ((uint32_t)0x00000020) /*!< MMC receive flag */ +#define ETH_MAC_FLAG_MMC ((uint32_t)0x00000010) /*!< MMC flag (on MAC) */ +#define ETH_MAC_FLAG_PMT ((uint32_t)0x00000008) /*!< PMT flag (on MAC) */ +#define IS_ETH_MAC_GET_FLAG(FLAG) (((FLAG) == ETH_MAC_FLAG_TST) || ((FLAG) == ETH_MAC_FLAG_MMCT) || \ + ((FLAG) == ETH_MAC_FLAG_MMCR) || ((FLAG) == ETH_MAC_FLAG_MMC) || \ + ((FLAG) == ETH_MAC_FLAG_PMT)) +/** + * @} + */ + +/** @defgroup ETH_MAC_Interrupts + * @{ + */ +#define ETH_MAC_IT_TST ((uint32_t)0x00000200) /*!< Time stamp trigger interrupt (on MAC) */ +#define ETH_MAC_IT_MMCT ((uint32_t)0x00000040) /*!< MMC transmit interrupt */ +#define ETH_MAC_IT_MMCR ((uint32_t)0x00000020) /*!< MMC receive interrupt */ +#define ETH_MAC_IT_MMC ((uint32_t)0x00000010) /*!< MMC interrupt (on MAC) */ +#define ETH_MAC_IT_PMT ((uint32_t)0x00000008) /*!< PMT interrupt (on MAC) */ +#define IS_ETH_MAC_IT(IT) ((((IT) & (uint32_t)0xFFFFFDF7) == 0x00) && ((IT) != 0x00)) +#define IS_ETH_MAC_GET_IT(IT) (((IT) == ETH_MAC_IT_TST) || ((IT) == ETH_MAC_IT_MMCT) || \ + ((IT) == ETH_MAC_IT_MMCR) || ((IT) == ETH_MAC_IT_MMC) || \ + ((IT) == ETH_MAC_IT_PMT)) +/** + * @} + */ + +/** @defgroup ETH_MAC_addresses + * @{ + */ +#define ETH_MAC_Address0 ((uint32_t)0x00000000) +#define ETH_MAC_Address1 ((uint32_t)0x00000008) +#define ETH_MAC_Address2 ((uint32_t)0x00000010) +#define ETH_MAC_Address3 ((uint32_t)0x00000018) +#define IS_ETH_MAC_ADDRESS0123(ADDRESS) (((ADDRESS) == ETH_MAC_Address0) || \ + ((ADDRESS) == ETH_MAC_Address1) || \ + ((ADDRESS) == ETH_MAC_Address2) || \ + ((ADDRESS) == ETH_MAC_Address3)) +#define IS_ETH_MAC_ADDRESS123(ADDRESS) (((ADDRESS) == ETH_MAC_Address1) || \ + ((ADDRESS) == ETH_MAC_Address2) || \ + ((ADDRESS) == ETH_MAC_Address3)) +/** + * @} + */ + +/** @defgroup ETH_MAC_addresses_filter:_SA_DA_filed_of_received_frames + * @{ + */ +#define ETH_MAC_AddressFilter_SA ((uint32_t)0x00000000) +#define ETH_MAC_AddressFilter_DA ((uint32_t)0x00000008) +#define IS_ETH_MAC_ADDRESS_FILTER(FILTER) (((FILTER) == ETH_MAC_AddressFilter_SA) || \ + ((FILTER) == ETH_MAC_AddressFilter_DA)) +/** + * @} + */ + +/** @defgroup ETH_MAC_addresses_filter:_Mask_bytes + * @{ + */ +#define ETH_MAC_AddressMask_Byte6 ((uint32_t)0x20000000) /*!< Mask MAC Address high reg bits [15:8] */ +#define ETH_MAC_AddressMask_Byte5 ((uint32_t)0x10000000) /*!< Mask MAC Address high reg bits [7:0] */ +#define ETH_MAC_AddressMask_Byte4 ((uint32_t)0x08000000) /*!< Mask MAC Address low reg bits [31:24] */ +#define ETH_MAC_AddressMask_Byte3 ((uint32_t)0x04000000) /*!< Mask MAC Address low reg bits [23:16] */ +#define ETH_MAC_AddressMask_Byte2 ((uint32_t)0x02000000) /*!< Mask MAC Address low reg bits [15:8] */ +#define ETH_MAC_AddressMask_Byte1 ((uint32_t)0x01000000) /*!< Mask MAC Address low reg bits [70] */ +#define IS_ETH_MAC_ADDRESS_MASK(MASK) (((MASK) == ETH_MAC_AddressMask_Byte6) || \ + ((MASK) == ETH_MAC_AddressMask_Byte5) || \ + ((MASK) == ETH_MAC_AddressMask_Byte4) || \ + ((MASK) == ETH_MAC_AddressMask_Byte3) || \ + ((MASK) == ETH_MAC_AddressMask_Byte2) || \ + ((MASK) == ETH_MAC_AddressMask_Byte1)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet DMA Desciptors defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_DMA_Tx_descriptor_flags + * @{ + */ +#define IS_ETH_DMATxDESC_GET_FLAG(FLAG) (((FLAG) == ETH_DMATxDesc_OWN) || \ + ((FLAG) == ETH_DMATxDesc_IC) || \ + ((FLAG) == ETH_DMATxDesc_LS) || \ + ((FLAG) == ETH_DMATxDesc_FS) || \ + ((FLAG) == ETH_DMATxDesc_DC) || \ + ((FLAG) == ETH_DMATxDesc_DP) || \ + ((FLAG) == ETH_DMATxDesc_TTSE) || \ + ((FLAG) == ETH_DMATxDesc_TER) || \ + ((FLAG) == ETH_DMATxDesc_TCH) || \ + ((FLAG) == ETH_DMATxDesc_TTSS) || \ + ((FLAG) == ETH_DMATxDesc_IHE) || \ + ((FLAG) == ETH_DMATxDesc_ES) || \ + ((FLAG) == ETH_DMATxDesc_JT) || \ + ((FLAG) == ETH_DMATxDesc_FF) || \ + ((FLAG) == ETH_DMATxDesc_PCE) || \ + ((FLAG) == ETH_DMATxDesc_LCA) || \ + ((FLAG) == ETH_DMATxDesc_NC) || \ + ((FLAG) == ETH_DMATxDesc_LCO) || \ + ((FLAG) == ETH_DMATxDesc_EC) || \ + ((FLAG) == ETH_DMATxDesc_VF) || \ + ((FLAG) == ETH_DMATxDesc_CC) || \ + ((FLAG) == ETH_DMATxDesc_ED) || \ + ((FLAG) == ETH_DMATxDesc_UF) || \ + ((FLAG) == ETH_DMATxDesc_DB)) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Tx_descriptor_segment + * @{ + */ +#define ETH_DMATxDesc_LastSegment ((uint32_t)0x40000000) /*!< Last Segment */ +#define ETH_DMATxDesc_FirstSegment ((uint32_t)0x20000000) /*!< First Segment */ +#define IS_ETH_DMA_TXDESC_SEGMENT(SEGMENT) (((SEGMENT) == ETH_DMATxDesc_LastSegment) || \ + ((SEGMENT) == ETH_DMATxDesc_FirstSegment)) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Tx_descriptor_Checksum_Insertion_Control + * @{ + */ +#define ETH_DMATxDesc_ChecksumByPass ((uint32_t)0x00000000) /*!< Checksum engine bypass */ +#define ETH_DMATxDesc_ChecksumIPV4Header ((uint32_t)0x00400000) /*!< IPv4 header checksum insertion */ +#define ETH_DMATxDesc_ChecksumTCPUDPICMPSegment ((uint32_t)0x00800000) /*!< TCP/UDP/ICMP checksum insertion. Pseudo header checksum is assumed to be present */ +#define ETH_DMATxDesc_ChecksumTCPUDPICMPFull ((uint32_t)0x00C00000) /*!< TCP/UDP/ICMP checksum fully in hardware including pseudo header */ +#define IS_ETH_DMA_TXDESC_CHECKSUM(CHECKSUM) (((CHECKSUM) == ETH_DMATxDesc_ChecksumByPass) || \ + ((CHECKSUM) == ETH_DMATxDesc_ChecksumIPV4Header) || \ + ((CHECKSUM) == ETH_DMATxDesc_ChecksumTCPUDPICMPSegment) || \ + ((CHECKSUM) == ETH_DMATxDesc_ChecksumTCPUDPICMPFull)) +/** + * @brief ETH DMA Tx Desciptor buffer size + */ +#define IS_ETH_DMATxDESC_BUFFER_SIZE(SIZE) ((SIZE) <= 0x1FFF) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Rx_descriptor_flags + * @{ + */ +#define IS_ETH_DMARxDESC_GET_FLAG(FLAG) (((FLAG) == ETH_DMARxDesc_OWN) || \ + ((FLAG) == ETH_DMARxDesc_AFM) || \ + ((FLAG) == ETH_DMARxDesc_ES) || \ + ((FLAG) == ETH_DMARxDesc_DE) || \ + ((FLAG) == ETH_DMARxDesc_SAF) || \ + ((FLAG) == ETH_DMARxDesc_LE) || \ + ((FLAG) == ETH_DMARxDesc_OE) || \ + ((FLAG) == ETH_DMARxDesc_VLAN) || \ + ((FLAG) == ETH_DMARxDesc_FS) || \ + ((FLAG) == ETH_DMARxDesc_LS) || \ + ((FLAG) == ETH_DMARxDesc_IPV4HCE) || \ + ((FLAG) == ETH_DMARxDesc_LC) || \ + ((FLAG) == ETH_DMARxDesc_FT) || \ + ((FLAG) == ETH_DMARxDesc_RWT) || \ + ((FLAG) == ETH_DMARxDesc_RE) || \ + ((FLAG) == ETH_DMARxDesc_DBE) || \ + ((FLAG) == ETH_DMARxDesc_CE) || \ + ((FLAG) == ETH_DMARxDesc_MAMPCE)) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Rx_descriptor_buffers_ + * @{ + */ +#define ETH_DMARxDesc_Buffer1 ((uint32_t)0x00000000) /*!< DMA Rx Desc Buffer1 */ +#define ETH_DMARxDesc_Buffer2 ((uint32_t)0x00000001) /*!< DMA Rx Desc Buffer2 */ +#define IS_ETH_DMA_RXDESC_BUFFER(BUFFER) (((BUFFER) == ETH_DMARxDesc_Buffer1) || \ + ((BUFFER) == ETH_DMARxDesc_Buffer2)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet DMA defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_Drop_TCP_IP_Checksum_Error_Frame + * @{ + */ +#define ETH_DropTCPIPChecksumErrorFrame_Enable ((uint32_t)0x00000000) +#define ETH_DropTCPIPChecksumErrorFrame_Disable ((uint32_t)0x04000000) +#define IS_ETH_DROP_TCPIP_CHECKSUM_FRAME(CMD) (((CMD) == ETH_DropTCPIPChecksumErrorFrame_Enable) || \ + ((CMD) == ETH_DropTCPIPChecksumErrorFrame_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Receive_Store_Forward + * @{ + */ +#define ETH_ReceiveStoreForward_Enable ((uint32_t)0x02000000) +#define ETH_ReceiveStoreForward_Disable ((uint32_t)0x00000000) +#define IS_ETH_RECEIVE_STORE_FORWARD(CMD) (((CMD) == ETH_ReceiveStoreForward_Enable) || \ + ((CMD) == ETH_ReceiveStoreForward_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Flush_Received_Frame + * @{ + */ +#define ETH_FlushReceivedFrame_Enable ((uint32_t)0x00000000) +#define ETH_FlushReceivedFrame_Disable ((uint32_t)0x01000000) +#define IS_ETH_FLUSH_RECEIVE_FRAME(CMD) (((CMD) == ETH_FlushReceivedFrame_Enable) || \ + ((CMD) == ETH_FlushReceivedFrame_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Transmit_Store_Forward + * @{ + */ +#define ETH_TransmitStoreForward_Enable ((uint32_t)0x00200000) +#define ETH_TransmitStoreForward_Disable ((uint32_t)0x00000000) +#define IS_ETH_TRANSMIT_STORE_FORWARD(CMD) (((CMD) == ETH_TransmitStoreForward_Enable) || \ + ((CMD) == ETH_TransmitStoreForward_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Transmit_Threshold_Control + * @{ + */ +#define ETH_TransmitThresholdControl_64Bytes ((uint32_t)0x00000000) /*!< threshold level of the MTL Transmit FIFO is 64 Bytes */ +#define ETH_TransmitThresholdControl_128Bytes ((uint32_t)0x00004000) /*!< threshold level of the MTL Transmit FIFO is 128 Bytes */ +#define ETH_TransmitThresholdControl_192Bytes ((uint32_t)0x00008000) /*!< threshold level of the MTL Transmit FIFO is 192 Bytes */ +#define ETH_TransmitThresholdControl_256Bytes ((uint32_t)0x0000C000) /*!< threshold level of the MTL Transmit FIFO is 256 Bytes */ +#define ETH_TransmitThresholdControl_40Bytes ((uint32_t)0x00010000) /*!< threshold level of the MTL Transmit FIFO is 40 Bytes */ +#define ETH_TransmitThresholdControl_32Bytes ((uint32_t)0x00014000) /*!< threshold level of the MTL Transmit FIFO is 32 Bytes */ +#define ETH_TransmitThresholdControl_24Bytes ((uint32_t)0x00018000) /*!< threshold level of the MTL Transmit FIFO is 24 Bytes */ +#define ETH_TransmitThresholdControl_16Bytes ((uint32_t)0x0001C000) /*!< threshold level of the MTL Transmit FIFO is 16 Bytes */ +#define IS_ETH_TRANSMIT_THRESHOLD_CONTROL(THRESHOLD) (((THRESHOLD) == ETH_TransmitThresholdControl_64Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_128Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_192Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_256Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_40Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_32Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_24Bytes) || \ + ((THRESHOLD) == ETH_TransmitThresholdControl_16Bytes)) +/** + * @} + */ + +/** @defgroup ETH_Forward_Error_Frames + * @{ + */ +#define ETH_ForwardErrorFrames_Enable ((uint32_t)0x00000080) +#define ETH_ForwardErrorFrames_Disable ((uint32_t)0x00000000) +#define IS_ETH_FORWARD_ERROR_FRAMES(CMD) (((CMD) == ETH_ForwardErrorFrames_Enable) || \ + ((CMD) == ETH_ForwardErrorFrames_Disable)) +/** + * @} + */ + +/** @defgroup ETH_Forward_Undersized_Good_Frames + * @{ + */ +#define ETH_ForwardUndersizedGoodFrames_Enable ((uint32_t)0x00000040) +#define ETH_ForwardUndersizedGoodFrames_Disable ((uint32_t)0x00000000) +#define IS_ETH_FORWARD_UNDERSIZED_GOOD_FRAMES(CMD) (((CMD) == ETH_ForwardUndersizedGoodFrames_Enable) || \ + ((CMD) == ETH_ForwardUndersizedGoodFrames_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Receive_Threshold_Control + * @{ + */ +#define ETH_ReceiveThresholdControl_64Bytes ((uint32_t)0x00000000) /*!< threshold level of the MTL Receive FIFO is 64 Bytes */ +#define ETH_ReceiveThresholdControl_32Bytes ((uint32_t)0x00000008) /*!< threshold level of the MTL Receive FIFO is 32 Bytes */ +#define ETH_ReceiveThresholdControl_96Bytes ((uint32_t)0x00000010) /*!< threshold level of the MTL Receive FIFO is 96 Bytes */ +#define ETH_ReceiveThresholdControl_128Bytes ((uint32_t)0x00000018) /*!< threshold level of the MTL Receive FIFO is 128 Bytes */ +#define IS_ETH_RECEIVE_THRESHOLD_CONTROL(THRESHOLD) (((THRESHOLD) == ETH_ReceiveThresholdControl_64Bytes) || \ + ((THRESHOLD) == ETH_ReceiveThresholdControl_32Bytes) || \ + ((THRESHOLD) == ETH_ReceiveThresholdControl_96Bytes) || \ + ((THRESHOLD) == ETH_ReceiveThresholdControl_128Bytes)) +/** + * @} + */ + +/** @defgroup ETH_Second_Frame_Operate + * @{ + */ +#define ETH_SecondFrameOperate_Enable ((uint32_t)0x00000004) +#define ETH_SecondFrameOperate_Disable ((uint32_t)0x00000000) +#define IS_ETH_SECOND_FRAME_OPERATE(CMD) (((CMD) == ETH_SecondFrameOperate_Enable) || \ + ((CMD) == ETH_SecondFrameOperate_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Address_Aligned_Beats + * @{ + */ +#define ETH_AddressAlignedBeats_Enable ((uint32_t)0x02000000) +#define ETH_AddressAlignedBeats_Disable ((uint32_t)0x00000000) +#define IS_ETH_ADDRESS_ALIGNED_BEATS(CMD) (((CMD) == ETH_AddressAlignedBeats_Enable) || \ + ((CMD) == ETH_AddressAlignedBeats_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Fixed_Burst + * @{ + */ +#define ETH_FixedBurst_Enable ((uint32_t)0x00010000) +#define ETH_FixedBurst_Disable ((uint32_t)0x00000000) +#define IS_ETH_FIXED_BURST(CMD) (((CMD) == ETH_FixedBurst_Enable) || \ + ((CMD) == ETH_FixedBurst_Disable)) + +/** + * @} + */ + +/** @defgroup ETH_Rx_DMA_Burst_Length + * @{ + */ +#define ETH_RxDMABurstLength_1Beat ((uint32_t)0x00020000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 1 */ +#define ETH_RxDMABurstLength_2Beat ((uint32_t)0x00040000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 2 */ +#define ETH_RxDMABurstLength_4Beat ((uint32_t)0x00080000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 4 */ +#define ETH_RxDMABurstLength_8Beat ((uint32_t)0x00100000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 8 */ +#define ETH_RxDMABurstLength_16Beat ((uint32_t)0x00200000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 16 */ +#define ETH_RxDMABurstLength_32Beat ((uint32_t)0x00400000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 32 */ +#define ETH_RxDMABurstLength_4xPBL_4Beat ((uint32_t)0x01020000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 4 */ +#define ETH_RxDMABurstLength_4xPBL_8Beat ((uint32_t)0x01040000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 8 */ +#define ETH_RxDMABurstLength_4xPBL_16Beat ((uint32_t)0x01080000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 16 */ +#define ETH_RxDMABurstLength_4xPBL_32Beat ((uint32_t)0x01100000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 32 */ +#define ETH_RxDMABurstLength_4xPBL_64Beat ((uint32_t)0x01200000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 64 */ +#define ETH_RxDMABurstLength_4xPBL_128Beat ((uint32_t)0x01400000) /*!< maximum number of beats to be transferred in one RxDMA transaction is 128 */ +#define IS_ETH_RXDMA_BURST_LENGTH(LENGTH) (((LENGTH) == ETH_RxDMABurstLength_1Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_2Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_8Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_16Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_32Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_4Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_8Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_16Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_32Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_64Beat) || \ + ((LENGTH) == ETH_RxDMABurstLength_4xPBL_128Beat)) + +/** + * @} + */ + +/** @defgroup ETH_Tx_DMA_Burst_Length + * @{ + */ +#define ETH_TxDMABurstLength_1Beat ((uint32_t)0x00000100) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 1 */ +#define ETH_TxDMABurstLength_2Beat ((uint32_t)0x00000200) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 2 */ +#define ETH_TxDMABurstLength_4Beat ((uint32_t)0x00000400) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ +#define ETH_TxDMABurstLength_8Beat ((uint32_t)0x00000800) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ +#define ETH_TxDMABurstLength_16Beat ((uint32_t)0x00001000) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ +#define ETH_TxDMABurstLength_32Beat ((uint32_t)0x00002000) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ +#define ETH_TxDMABurstLength_4xPBL_4Beat ((uint32_t)0x01000100) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 4 */ +#define ETH_TxDMABurstLength_4xPBL_8Beat ((uint32_t)0x01000200) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 8 */ +#define ETH_TxDMABurstLength_4xPBL_16Beat ((uint32_t)0x01000400) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 16 */ +#define ETH_TxDMABurstLength_4xPBL_32Beat ((uint32_t)0x01000800) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 32 */ +#define ETH_TxDMABurstLength_4xPBL_64Beat ((uint32_t)0x01001000) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 64 */ +#define ETH_TxDMABurstLength_4xPBL_128Beat ((uint32_t)0x01002000) /*!< maximum number of beats to be transferred in one TxDMA (or both) transaction is 128 */ +#define IS_ETH_TXDMA_BURST_LENGTH(LENGTH) (((LENGTH) == ETH_TxDMABurstLength_1Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_2Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_8Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_16Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_32Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_4Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_8Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_16Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_32Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_64Beat) || \ + ((LENGTH) == ETH_TxDMABurstLength_4xPBL_128Beat)) +/** + * @brief ETH DMA Desciptor SkipLength + */ +#define IS_ETH_DMA_DESC_SKIP_LENGTH(LENGTH) ((LENGTH) <= 0x1F) + +/** + * @} + */ + +/** @defgroup ETH_DMA_Arbitration + * @{ + */ +#define ETH_DMAArbitration_RoundRobin_RxTx_1_1 ((uint32_t)0x00000000) +#define ETH_DMAArbitration_RoundRobin_RxTx_2_1 ((uint32_t)0x00004000) +#define ETH_DMAArbitration_RoundRobin_RxTx_3_1 ((uint32_t)0x00008000) +#define ETH_DMAArbitration_RoundRobin_RxTx_4_1 ((uint32_t)0x0000C000) +#define ETH_DMAArbitration_RxPriorTx ((uint32_t)0x00000002) +#define IS_ETH_DMA_ARBITRATION_ROUNDROBIN_RXTX(RATIO) (((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_1_1) || \ + ((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_2_1) || \ + ((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_3_1) || \ + ((RATIO) == ETH_DMAArbitration_RoundRobin_RxTx_4_1) || \ + ((RATIO) == ETH_DMAArbitration_RxPriorTx)) +/** + * @} + */ + +/** @defgroup ETH_DMA_Flags + * @{ + */ +#define ETH_DMA_FLAG_TST ((uint32_t)0x20000000) /*!< Time-stamp trigger interrupt (on DMA) */ +#define ETH_DMA_FLAG_PMT ((uint32_t)0x10000000) /*!< PMT interrupt (on DMA) */ +#define ETH_DMA_FLAG_MMC ((uint32_t)0x08000000) /*!< MMC interrupt (on DMA) */ +#define ETH_DMA_FLAG_DataTransferError ((uint32_t)0x00800000) /*!< Error bits 0-Rx DMA, 1-Tx DMA */ +#define ETH_DMA_FLAG_ReadWriteError ((uint32_t)0x01000000) /*!< Error bits 0-write trnsf, 1-read transfr */ +#define ETH_DMA_FLAG_AccessError ((uint32_t)0x02000000) /*!< Error bits 0-data buffer, 1-desc. access */ +#define ETH_DMA_FLAG_NIS ((uint32_t)0x00010000) /*!< Normal interrupt summary flag */ +#define ETH_DMA_FLAG_AIS ((uint32_t)0x00008000) /*!< Abnormal interrupt summary flag */ +#define ETH_DMA_FLAG_ER ((uint32_t)0x00004000) /*!< Early receive flag */ +#define ETH_DMA_FLAG_FBE ((uint32_t)0x00002000) /*!< Fatal bus error flag */ +#define ETH_DMA_FLAG_ET ((uint32_t)0x00000400) /*!< Early transmit flag */ +#define ETH_DMA_FLAG_RWT ((uint32_t)0x00000200) /*!< Receive watchdog timeout flag */ +#define ETH_DMA_FLAG_RPS ((uint32_t)0x00000100) /*!< Receive process stopped flag */ +#define ETH_DMA_FLAG_RBU ((uint32_t)0x00000080) /*!< Receive buffer unavailable flag */ +#define ETH_DMA_FLAG_R ((uint32_t)0x00000040) /*!< Receive flag */ +#define ETH_DMA_FLAG_TU ((uint32_t)0x00000020) /*!< Underflow flag */ +#define ETH_DMA_FLAG_RO ((uint32_t)0x00000010) /*!< Overflow flag */ +#define ETH_DMA_FLAG_TJT ((uint32_t)0x00000008) /*!< Transmit jabber timeout flag */ +#define ETH_DMA_FLAG_TBU ((uint32_t)0x00000004) /*!< Transmit buffer unavailable flag */ +#define ETH_DMA_FLAG_TPS ((uint32_t)0x00000002) /*!< Transmit process stopped flag */ +#define ETH_DMA_FLAG_T ((uint32_t)0x00000001) /*!< Transmit flag */ + +#define IS_ETH_DMA_FLAG(FLAG) ((((FLAG) & (uint32_t)0xFFFE1800) == 0x00) && ((FLAG) != 0x00)) +#define IS_ETH_DMA_GET_FLAG(FLAG) (((FLAG) == ETH_DMA_FLAG_TST) || ((FLAG) == ETH_DMA_FLAG_PMT) || \ + ((FLAG) == ETH_DMA_FLAG_MMC) || ((FLAG) == ETH_DMA_FLAG_DataTransferError) || \ + ((FLAG) == ETH_DMA_FLAG_ReadWriteError) || ((FLAG) == ETH_DMA_FLAG_AccessError) || \ + ((FLAG) == ETH_DMA_FLAG_NIS) || ((FLAG) == ETH_DMA_FLAG_AIS) || \ + ((FLAG) == ETH_DMA_FLAG_ER) || ((FLAG) == ETH_DMA_FLAG_FBE) || \ + ((FLAG) == ETH_DMA_FLAG_ET) || ((FLAG) == ETH_DMA_FLAG_RWT) || \ + ((FLAG) == ETH_DMA_FLAG_RPS) || ((FLAG) == ETH_DMA_FLAG_RBU) || \ + ((FLAG) == ETH_DMA_FLAG_R) || ((FLAG) == ETH_DMA_FLAG_TU) || \ + ((FLAG) == ETH_DMA_FLAG_RO) || ((FLAG) == ETH_DMA_FLAG_TJT) || \ + ((FLAG) == ETH_DMA_FLAG_TBU) || ((FLAG) == ETH_DMA_FLAG_TPS) || \ + ((FLAG) == ETH_DMA_FLAG_T)) +/** + * @} + */ + +/** @defgroup ETH_DMA_Interrupts + * @{ + */ +#define ETH_DMA_IT_TST ((uint32_t)0x20000000) /*!< Time-stamp trigger interrupt (on DMA) */ +#define ETH_DMA_IT_PMT ((uint32_t)0x10000000) /*!< PMT interrupt (on DMA) */ +#define ETH_DMA_IT_MMC ((uint32_t)0x08000000) /*!< MMC interrupt (on DMA) */ +#define ETH_DMA_IT_NIS ((uint32_t)0x00010000) /*!< Normal interrupt summary */ +#define ETH_DMA_IT_AIS ((uint32_t)0x00008000) /*!< Abnormal interrupt summary */ +#define ETH_DMA_IT_ER ((uint32_t)0x00004000) /*!< Early receive interrupt */ +#define ETH_DMA_IT_FBE ((uint32_t)0x00002000) /*!< Fatal bus error interrupt */ +#define ETH_DMA_IT_ET ((uint32_t)0x00000400) /*!< Early transmit interrupt */ +#define ETH_DMA_IT_RWT ((uint32_t)0x00000200) /*!< Receive watchdog timeout interrupt */ +#define ETH_DMA_IT_RPS ((uint32_t)0x00000100) /*!< Receive process stopped interrupt */ +#define ETH_DMA_IT_RBU ((uint32_t)0x00000080) /*!< Receive buffer unavailable interrupt */ +#define ETH_DMA_IT_R ((uint32_t)0x00000040) /*!< Receive interrupt */ +#define ETH_DMA_IT_TU ((uint32_t)0x00000020) /*!< Underflow interrupt */ +#define ETH_DMA_IT_RO ((uint32_t)0x00000010) /*!< Overflow interrupt */ +#define ETH_DMA_IT_TJT ((uint32_t)0x00000008) /*!< Transmit jabber timeout interrupt */ +#define ETH_DMA_IT_TBU ((uint32_t)0x00000004) /*!< Transmit buffer unavailable interrupt */ +#define ETH_DMA_IT_TPS ((uint32_t)0x00000002) /*!< Transmit process stopped interrupt */ +#define ETH_DMA_IT_T ((uint32_t)0x00000001) /*!< Transmit interrupt */ + +#define IS_ETH_DMA_IT(IT) ((((IT) & (uint32_t)0xFFFE1800) == 0x00) && ((IT) != 0x00)) +#define IS_ETH_DMA_GET_IT(IT) (((IT) == ETH_DMA_IT_TST) || ((IT) == ETH_DMA_IT_PMT) || \ + ((IT) == ETH_DMA_IT_MMC) || ((IT) == ETH_DMA_IT_NIS) || \ + ((IT) == ETH_DMA_IT_AIS) || ((IT) == ETH_DMA_IT_ER) || \ + ((IT) == ETH_DMA_IT_FBE) || ((IT) == ETH_DMA_IT_ET) || \ + ((IT) == ETH_DMA_IT_RWT) || ((IT) == ETH_DMA_IT_RPS) || \ + ((IT) == ETH_DMA_IT_RBU) || ((IT) == ETH_DMA_IT_R) || \ + ((IT) == ETH_DMA_IT_TU) || ((IT) == ETH_DMA_IT_RO) || \ + ((IT) == ETH_DMA_IT_TJT) || ((IT) == ETH_DMA_IT_TBU) || \ + ((IT) == ETH_DMA_IT_TPS) || ((IT) == ETH_DMA_IT_T)) + +/** + * @} + */ + +/** @defgroup ETH_DMA_transmit_process_state_ + * @{ + */ +#define ETH_DMA_TransmitProcess_Stopped ((uint32_t)0x00000000) /*!< Stopped - Reset or Stop Tx Command issued */ +#define ETH_DMA_TransmitProcess_Fetching ((uint32_t)0x00100000) /*!< Running - fetching the Tx descriptor */ +#define ETH_DMA_TransmitProcess_Waiting ((uint32_t)0x00200000) /*!< Running - waiting for status */ +#define ETH_DMA_TransmitProcess_Reading ((uint32_t)0x00300000) /*!< Running - reading the data from host memory */ +#define ETH_DMA_TransmitProcess_Suspended ((uint32_t)0x00600000) /*!< Suspended - Tx Desciptor unavailabe */ +#define ETH_DMA_TransmitProcess_Closing ((uint32_t)0x00700000) /*!< Running - closing Rx descriptor */ + +/** + * @} + */ + + +/** @defgroup ETH_DMA_receive_process_state_ + * @{ + */ +#define ETH_DMA_ReceiveProcess_Stopped ((uint32_t)0x00000000) /*!< Stopped - Reset or Stop Rx Command issued */ +#define ETH_DMA_ReceiveProcess_Fetching ((uint32_t)0x00020000) /*!< Running - fetching the Rx descriptor */ +#define ETH_DMA_ReceiveProcess_Waiting ((uint32_t)0x00060000) /*!< Running - waiting for packet */ +#define ETH_DMA_ReceiveProcess_Suspended ((uint32_t)0x00080000) /*!< Suspended - Rx Desciptor unavailable */ +#define ETH_DMA_ReceiveProcess_Closing ((uint32_t)0x000A0000) /*!< Running - closing descriptor */ +#define ETH_DMA_ReceiveProcess_Queuing ((uint32_t)0x000E0000) /*!< Running - queuing the recieve frame into host memory */ + +/** + * @} + */ + +/** @defgroup ETH_DMA_overflow_ + * @{ + */ +#define ETH_DMA_Overflow_RxFIFOCounter ((uint32_t)0x10000000) /*!< Overflow bit for FIFO overflow counter */ +#define ETH_DMA_Overflow_MissedFrameCounter ((uint32_t)0x00010000) /*!< Overflow bit for missed frame counter */ +#define IS_ETH_DMA_GET_OVERFLOW(OVERFLOW) (((OVERFLOW) == ETH_DMA_Overflow_RxFIFOCounter) || \ + ((OVERFLOW) == ETH_DMA_Overflow_MissedFrameCounter)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet PMT defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_PMT_Flags + * @{ + */ +#define ETH_PMT_FLAG_WUFFRPR ((uint32_t)0x80000000) /*!< Wake-Up Frame Filter Register Poniter Reset */ +#define ETH_PMT_FLAG_WUFR ((uint32_t)0x00000040) /*!< Wake-Up Frame Received */ +#define ETH_PMT_FLAG_MPR ((uint32_t)0x00000020) /*!< Magic Packet Received */ +#define IS_ETH_PMT_GET_FLAG(FLAG) (((FLAG) == ETH_PMT_FLAG_WUFR) || \ + ((FLAG) == ETH_PMT_FLAG_MPR)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet MMC defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_MMC_Tx_Interrupts + * @{ + */ +#define ETH_MMC_IT_TGF ((uint32_t)0x00200000) /*!< When Tx good frame counter reaches half the maximum value */ +#define ETH_MMC_IT_TGFMSC ((uint32_t)0x00008000) /*!< When Tx good multi col counter reaches half the maximum value */ +#define ETH_MMC_IT_TGFSC ((uint32_t)0x00004000) /*!< When Tx good single col counter reaches half the maximum value */ + +/** + * @} + */ + +/** @defgroup ETH_MMC_Rx_Interrupts + * @{ + */ +#define ETH_MMC_IT_RGUF ((uint32_t)0x10020000) /*!< When Rx good unicast frames counter reaches half the maximum value */ +#define ETH_MMC_IT_RFAE ((uint32_t)0x10000040) /*!< When Rx alignment error counter reaches half the maximum value */ +#define ETH_MMC_IT_RFCE ((uint32_t)0x10000020) /*!< When Rx crc error counter reaches half the maximum value */ +#define IS_ETH_MMC_IT(IT) (((((IT) & (uint32_t)0xFFDF3FFF) == 0x00) || (((IT) & (uint32_t)0xEFFDFF9F) == 0x00)) && \ + ((IT) != 0x00)) +#define IS_ETH_MMC_GET_IT(IT) (((IT) == ETH_MMC_IT_TGF) || ((IT) == ETH_MMC_IT_TGFMSC) || \ + ((IT) == ETH_MMC_IT_TGFSC) || ((IT) == ETH_MMC_IT_RGUF) || \ + ((IT) == ETH_MMC_IT_RFAE) || ((IT) == ETH_MMC_IT_RFCE)) +/** + * @} + */ + +/** @defgroup ETH_MMC_Registers + * @{ + */ +#define ETH_MMCCR ((uint32_t)0x00000100) /*!< MMC CR register */ +#define ETH_MMCRIR ((uint32_t)0x00000104) /*!< MMC RIR register */ +#define ETH_MMCTIR ((uint32_t)0x00000108) /*!< MMC TIR register */ +#define ETH_MMCRIMR ((uint32_t)0x0000010C) /*!< MMC RIMR register */ +#define ETH_MMCTIMR ((uint32_t)0x00000110) /*!< MMC TIMR register */ +#define ETH_MMCTGFSCCR ((uint32_t)0x0000014C) /*!< MMC TGFSCCR register */ +#define ETH_MMCTGFMSCCR ((uint32_t)0x00000150) /*!< MMC TGFMSCCR register */ +#define ETH_MMCTGFCR ((uint32_t)0x00000168) /*!< MMC TGFCR register */ +#define ETH_MMCRFCECR ((uint32_t)0x00000194) /*!< MMC RFCECR register */ +#define ETH_MMCRFAECR ((uint32_t)0x00000198) /*!< MMC RFAECR register */ +#define ETH_MMCRGUFCR ((uint32_t)0x000001C4) /*!< MMC RGUFCR register */ + +/** + * @brief ETH MMC registers + */ +#define IS_ETH_MMC_REGISTER(REG) (((REG) == ETH_MMCCR) || ((REG) == ETH_MMCRIR) || \ + ((REG) == ETH_MMCTIR) || ((REG) == ETH_MMCRIMR) || \ + ((REG) == ETH_MMCTIMR) || ((REG) == ETH_MMCTGFSCCR) || \ + ((REG) == ETH_MMCTGFMSCCR) || ((REG) == ETH_MMCTGFCR) || \ + ((REG) == ETH_MMCRFCECR) || ((REG) == ETH_MMCRFAECR) || \ + ((REG) == ETH_MMCRGUFCR)) + +/**--------------------------------------------------------------------------**/ +/** + * @brief Ethernet PTP defines + */ +/**--------------------------------------------------------------------------**/ +/** + * @} + */ + +/** @defgroup ETH_PTP_time_update_method + * @{ + */ +#define ETH_PTP_FineUpdate ((uint32_t)0x00000001) /*!< Fine Update method */ +#define ETH_PTP_CoarseUpdate ((uint32_t)0x00000000) /*!< Coarse Update method */ +#define IS_ETH_PTP_UPDATE(UPDATE) (((UPDATE) == ETH_PTP_FineUpdate) || \ + ((UPDATE) == ETH_PTP_CoarseUpdate)) + +/** + * @} + */ + + +/** @defgroup ETH_PTP_Flags + * @{ + */ +#define ETH_PTP_FLAG_TSARU ((uint32_t)0x00000020) /*!< Addend Register Update */ +#define ETH_PTP_FLAG_TSITE ((uint32_t)0x00000010) /*!< Time Stamp Interrupt Trigger */ +#define ETH_PTP_FLAG_TSSTU ((uint32_t)0x00000008) /*!< Time Stamp Update */ +#define ETH_PTP_FLAG_TSSTI ((uint32_t)0x00000004) /*!< Time Stamp Initialize */ +#define IS_ETH_PTP_GET_FLAG(FLAG) (((FLAG) == ETH_PTP_FLAG_TSARU) || \ + ((FLAG) == ETH_PTP_FLAG_TSITE) || \ + ((FLAG) == ETH_PTP_FLAG_TSSTU) || \ + ((FLAG) == ETH_PTP_FLAG_TSSTI)) +/** + * @brief ETH PTP subsecond increment + */ +#define IS_ETH_PTP_SUBSECOND_INCREMENT(SUBSECOND) ((SUBSECOND) <= 0xFF) + +/** + * @} + */ + + +/** @defgroup ETH_PTP_time_sign + * @{ + */ +#define ETH_PTP_PositiveTime ((uint32_t)0x00000000) /*!< Positive time value */ +#define ETH_PTP_NegativeTime ((uint32_t)0x80000000) /*!< Negative time value */ +#define IS_ETH_PTP_TIME_SIGN(SIGN) (((SIGN) == ETH_PTP_PositiveTime) || \ + ((SIGN) == ETH_PTP_NegativeTime)) + +/** + * @brief ETH PTP time stamp low update + */ +#define IS_ETH_PTP_TIME_STAMP_UPDATE_SUBSECOND(SUBSECOND) ((SUBSECOND) <= 0x7FFFFFFF) + +/** + * @brief ETH PTP registers + */ +#define ETH_PTPTSCR ((uint32_t)0x00000700) /*!< PTP TSCR register */ +#define ETH_PTPSSIR ((uint32_t)0x00000704) /*!< PTP SSIR register */ +#define ETH_PTPTSHR ((uint32_t)0x00000708) /*!< PTP TSHR register */ +#define ETH_PTPTSLR ((uint32_t)0x0000070C) /*!< PTP TSLR register */ +#define ETH_PTPTSHUR ((uint32_t)0x00000710) /*!< PTP TSHUR register */ +#define ETH_PTPTSLUR ((uint32_t)0x00000714) /*!< PTP TSLUR register */ +#define ETH_PTPTSAR ((uint32_t)0x00000718) /*!< PTP TSAR register */ +#define ETH_PTPTTHR ((uint32_t)0x0000071C) /*!< PTP TTHR register */ +#define ETH_PTPTTLR ((uint32_t)0x00000720) /* PTP TTLR register */ +#define IS_ETH_PTP_REGISTER(REG) (((REG) == ETH_PTPTSCR) || ((REG) == ETH_PTPSSIR) || \ + ((REG) == ETH_PTPTSHR) || ((REG) == ETH_PTPTSLR) || \ + ((REG) == ETH_PTPTSHUR) || ((REG) == ETH_PTPTSLUR) || \ + ((REG) == ETH_PTPTSAR) || ((REG) == ETH_PTPTTHR) || \ + ((REG) == ETH_PTPTTLR)) + +/** + * @} + */ + + +/** + * @} + */ + +/** @defgroup ETH_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup ETH_Exported_Functions + * @{ + */ +void ETH_DeInit(void); +uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, u16 PHYAddress); +void ETH_StructInit(ETH_InitTypeDef* ETH_InitStruct); +void ETH_SoftwareReset(void); +FlagStatus ETH_GetSoftwareResetStatus(void); +void ETH_Start(void); +uint32_t ETH_HandleTxPkt(u8 *ppkt, u16 FrameLength); +uint32_t ETH_HandleRxPkt(u8 *ppkt); +uint32_t ETH_GetRxPktSize(void); +void ETH_DropRxPkt(void); + +/** + * @brief PHY + */ +u16 ETH_ReadPHYRegister(u16 PHYAddress, u16 PHYReg); +uint32_t ETH_WritePHYRegister(u16 PHYAddress, u16 PHYReg, u16 PHYValue); +uint32_t ETH_PHYLoopBackCmd(u16 PHYAddress, FunctionalState NewState); + +/** + * @brief MAC + */ +void ETH_MACTransmissionCmd(FunctionalState NewState); +void ETH_MACReceptionCmd(FunctionalState NewState); +FlagStatus ETH_GetFlowControlBusyStatus(void); +void ETH_InitiatePauseControlFrame(void); +void ETH_BackPressureActivationCmd(FunctionalState NewState); +FlagStatus ETH_GetMACFlagStatus(uint32_t ETH_MAC_FLAG); +ITStatus ETH_GetMACITStatus(uint32_t ETH_MAC_IT); +void ETH_MACITConfig(uint32_t ETH_MAC_IT, FunctionalState NewState); +void ETH_MACAddressConfig(uint32_t MacAddr, u8 *Addr); +void ETH_GetMACAddress(uint32_t MacAddr, u8 *Addr); +void ETH_MACAddressPerfectFilterCmd(uint32_t MacAddr, FunctionalState NewState); +void ETH_MACAddressFilterConfig(uint32_t MacAddr, uint32_t Filter); +void ETH_MACAddressMaskBytesFilterConfig(uint32_t MacAddr, uint32_t MaskByte); + +/** + * @brief DMA Tx/Rx descriptors + */ +void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, u8 *TxBuff, uint32_t TxBuffCount); +void ETH_DMATxDescRingInit(ETH_DMADESCTypeDef *DMATxDescTab, u8 *TxBuff1, u8 *TxBuff2, uint32_t TxBuffCount); +FlagStatus ETH_GetDMATxDescFlagStatus(ETH_DMADESCTypeDef *DMATxDesc, uint32_t ETH_DMATxDescFlag); +uint32_t ETH_GetDMATxDescCollisionCount(ETH_DMADESCTypeDef *DMATxDesc); +void ETH_SetDMATxDescOwnBit(ETH_DMADESCTypeDef *DMATxDesc); +void ETH_DMATxDescTransmitITConfig(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescFrameSegmentConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_FrameSegment); +void ETH_DMATxDescChecksumInsertionConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_Checksum); +void ETH_DMATxDescCRCCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescShortFramePaddingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescTimeStampCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState); +void ETH_DMATxDescBufferSizeConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t BufferSize1, uint32_t BufferSize2); +void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, u8 *RxBuff, uint32_t RxBuffCount); +void ETH_DMARxDescRingInit(ETH_DMADESCTypeDef *DMARxDescTab, u8 *RxBuff1, u8 *RxBuff2, uint32_t RxBuffCount); +FlagStatus ETH_GetDMARxDescFlagStatus(ETH_DMADESCTypeDef *DMARxDesc, uint32_t ETH_DMARxDescFlag); +void ETH_SetDMARxDescOwnBit(ETH_DMADESCTypeDef *DMARxDesc); +uint32_t ETH_GetDMARxDescFrameLength(ETH_DMADESCTypeDef *DMARxDesc); +void ETH_DMARxDescReceiveITConfig(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState); +void ETH_DMARxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState); +void ETH_DMARxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState); +uint32_t ETH_GetDMARxDescBufferSize(ETH_DMADESCTypeDef *DMARxDesc, uint32_t DMARxDesc_Buffer); + +/** + * @brief DMA + */ +FlagStatus ETH_GetDMAFlagStatus(uint32_t ETH_DMA_FLAG); +void ETH_DMAClearFlag(uint32_t ETH_DMA_FLAG); +ITStatus ETH_GetDMAITStatus(uint32_t ETH_DMA_IT); +void ETH_DMAClearITPendingBit(uint32_t ETH_DMA_IT); +uint32_t ETH_GetTransmitProcessState(void); +uint32_t ETH_GetReceiveProcessState(void); +void ETH_FlushTransmitFIFO(void); +FlagStatus ETH_GetFlushTransmitFIFOStatus(void); +void ETH_DMATransmissionCmd(FunctionalState NewState); +void ETH_DMAReceptionCmd(FunctionalState NewState); +void ETH_DMAITConfig(uint32_t ETH_DMA_IT, FunctionalState NewState); +FlagStatus ETH_GetDMAOverflowStatus(uint32_t ETH_DMA_Overflow); +uint32_t ETH_GetRxOverflowMissedFrameCounter(void); +uint32_t ETH_GetBufferUnavailableMissedFrameCounter(void); +uint32_t ETH_GetCurrentTxDescStartAddress(void); +uint32_t ETH_GetCurrentRxDescStartAddress(void); +uint32_t ETH_GetCurrentTxBufferAddress(void); +uint32_t ETH_GetCurrentRxBufferAddress(void); +void ETH_ResumeDMATransmission(void); +void ETH_ResumeDMAReception(void); + +/** + * @brief PMT + */ +void ETH_ResetWakeUpFrameFilterRegisterPointer(void); +void ETH_SetWakeUpFrameFilterRegister(uint32_t *Buffer); +void ETH_GlobalUnicastWakeUpCmd(FunctionalState NewState); +FlagStatus ETH_GetPMTFlagStatus(uint32_t ETH_PMT_FLAG); +void ETH_WakeUpFrameDetectionCmd(FunctionalState NewState); +void ETH_MagicPacketDetectionCmd(FunctionalState NewState); +void ETH_PowerDownCmd(FunctionalState NewState); + +/** + * @brief MMC + */ +void ETH_MMCCounterFreezeCmd(FunctionalState NewState); +void ETH_MMCResetOnReadCmd(FunctionalState NewState); +void ETH_MMCCounterRolloverCmd(FunctionalState NewState); +void ETH_MMCCountersReset(void); +void ETH_MMCITConfig(uint32_t ETH_MMC_IT, FunctionalState NewState); +ITStatus ETH_GetMMCITStatus(uint32_t ETH_MMC_IT); +uint32_t ETH_GetMMCRegister(uint32_t ETH_MMCReg); + +/** + * @brief PTP + */ +uint32_t ETH_HandlePTPTxPkt(u8 *ppkt, u16 FrameLength, uint32_t *PTPTxTab); +uint32_t ETH_HandlePTPRxPkt(u8 *ppkt, uint32_t *PTPRxTab); +void ETH_DMAPTPTxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, ETH_DMADESCTypeDef *DMAPTPTxDescTab, u8* TxBuff, uint32_t TxBuffCount); +void ETH_DMAPTPRxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, ETH_DMADESCTypeDef *DMAPTPRxDescTab, u8 *RxBuff, uint32_t RxBuffCount); +void ETH_EnablePTPTimeStampAddend(void); +void ETH_EnablePTPTimeStampInterruptTrigger(void); +void ETH_EnablePTPTimeStampUpdate(void); +void ETH_InitializePTPTimeStamp(void); +void ETH_PTPUpdateMethodConfig(uint32_t UpdateMethod); +void ETH_PTPTimeStampCmd(FunctionalState NewState); +FlagStatus ETH_GetPTPFlagStatus(uint32_t ETH_PTP_FLAG); +void ETH_SetPTPSubSecondIncrement(uint32_t SubSecondValue); +void ETH_SetPTPTimeStampUpdate(uint32_t Sign, uint32_t SecondValue, uint32_t SubSecondValue); +void ETH_SetPTPTimeStampAddend(uint32_t Value); +void ETH_SetPTPTargetTime(uint32_t HighValue, uint32_t LowValue); +uint32_t ETH_GetPTPRegister(uint32_t ETH_PTPReg); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32_ETH_H */ +/** + * @} + */ + + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/ethernetlib/src/stm32_eth.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/ethernetlib/src/stm32_eth.c new file mode 100644 index 00000000..119b4dbf --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/ethernetlib/src/stm32_eth.c @@ -0,0 +1,3056 @@ +/** + ****************************************************************************** + * @file stm32_eth.c + * @author MCD Application Team + * @version V1.0.0 + * @date 06/19/2009 + * @brief This file provides all the ETH firmware functions. + ****************************************************************************** + * @copy + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + *

© COPYRIGHT 2009 STMicroelectronics

+ */ + +/* Includes ------------------------------------------------------------------*/ +#include "stm32_eth.h" +#include "stm32f4xx_rcc.h" + +/** @addtogroup STM32_ETH_Driver + * @brief ETH driver modules + * @{ + */ + +/** @defgroup ETH_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup ETH_Private_Defines + * @{ + */ +/* Global pointers on Tx and Rx descriptor used to track transmit and receive descriptors */ +ETH_DMADESCTypeDef *DMATxDescToSet; +ETH_DMADESCTypeDef *DMARxDescToGet; +ETH_DMADESCTypeDef *DMAPTPTxDescToSet; +ETH_DMADESCTypeDef *DMAPTPRxDescToGet; + +/* ETHERNET MAC address offsets */ +#define ETH_MAC_AddrHighBase (ETH_MAC_BASE + 0x40) /* ETHERNET MAC address high offset */ +#define ETH_MAC_AddrLowBase (ETH_MAC_BASE + 0x44) /* ETHERNET MAC address low offset */ +/* ETHERNET MACMIIAR register Mask */ +#define MACMIIAR_CR_Mask ((uint32_t)0xFFFFFFE3) +/* ETHERNET MACCR register Mask */ +#define MACCR_CLEAR_Mask ((uint32_t)0xFF20810F) +/* ETHERNET MACFCR register Mask */ +#define MACFCR_CLEAR_Mask ((uint32_t)0x0000FF41) +/* ETHERNET DMAOMR register Mask */ +#define DMAOMR_CLEAR_Mask ((uint32_t)0xF8DE3F23) +/* ETHERNET Remote Wake-up frame register length */ +#define ETH_WakeupRegisterLength 8 +/* ETHERNET Missed frames counter Shift */ +#define ETH_DMA_RxOverflowMissedFramesCounterShift 17 +/* ETHERNET DMA Tx descriptors Collision Count Shift */ +#define ETH_DMATxDesc_CollisionCountShift 3 +/* ETHERNET DMA Tx descriptors Buffer2 Size Shift */ +#define ETH_DMATxDesc_BufferSize2Shift 16 +/* ETHERNET DMA Rx descriptors Frame Length Shift */ +#define ETH_DMARxDesc_FrameLengthShift 16 +/* ETHERNET DMA Rx descriptors Buffer2 Size Shift */ +#define ETH_DMARxDesc_Buffer2SizeShift 16 +/* ETHERNET errors */ +#define ETH_ERROR ((uint32_t)0) +#define ETH_SUCCESS ((uint32_t)1) +/** + * @} + */ + +/** @defgroup ETH_Private_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup ETH_Private_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup ETH_Private_FunctionPrototypes + * @{ + */ +/** + * @} + */ + +/** @defgroup ETH_Private_Functions + * @{ + */ + +/** + * @brief Deinitializes the ETHERNET peripheral registers to their + * default reset values. + * @param None + * @retval : None + */ +void ETH_DeInit(void) +{ + RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, ENABLE); + RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_ETH_MAC, DISABLE); +} + +/** + * @brief Initializes the ETHERNET peripheral according to the specified + * parameters in the ETH_InitStruct . + * @param ETH_InitStruct: pointer to a ETH_InitTypeDef structure + * that contains the configuration information for the + * specified ETHERNET peripheral. + * @param PHYAddress: external PHY address + * @retval : ETH_ERROR: Ethernet initialization failed + * ETH_SUCCESS: Ethernet successfully initialized + */ +uint32_t ETH_Init(ETH_InitTypeDef* ETH_InitStruct, uint16_t PHYAddress) +{ + uint32_t RegValue = 0, tmpreg = 0; + __IO uint32_t i = 0; + RCC_ClocksTypeDef rcc_clocks; + uint32_t hclk = 120000000; + __IO uint32_t timeout = 0; + /* Check the parameters */ + /* MAC --------------------------*/ + assert_param(IS_ETH_AUTONEGOTIATION(ETH_InitStruct->ETH_AutoNegotiation)); + assert_param(IS_ETH_WATCHDOG(ETH_InitStruct->ETH_Watchdog)); + assert_param(IS_ETH_JABBER(ETH_InitStruct->ETH_Jabber)); + assert_param(IS_ETH_INTER_FRAME_GAP(ETH_InitStruct->ETH_InterFrameGap)); + assert_param(IS_ETH_CARRIER_SENSE(ETH_InitStruct->ETH_CarrierSense)); + assert_param(IS_ETH_SPEED(ETH_InitStruct->ETH_Speed)); + assert_param(IS_ETH_RECEIVE_OWN(ETH_InitStruct->ETH_ReceiveOwn)); + assert_param(IS_ETH_LOOPBACK_MODE(ETH_InitStruct->ETH_LoopbackMode)); + assert_param(IS_ETH_DUPLEX_MODE(ETH_InitStruct->ETH_Mode)); + assert_param(IS_ETH_CHECKSUM_OFFLOAD(ETH_InitStruct->ETH_ChecksumOffload)); + assert_param(IS_ETH_RETRY_TRANSMISSION(ETH_InitStruct->ETH_RetryTransmission)); + assert_param(IS_ETH_AUTOMATIC_PADCRC_STRIP(ETH_InitStruct->ETH_AutomaticPadCRCStrip)); + assert_param(IS_ETH_BACKOFF_LIMIT(ETH_InitStruct->ETH_BackOffLimit)); + assert_param(IS_ETH_DEFERRAL_CHECK(ETH_InitStruct->ETH_DeferralCheck)); + assert_param(IS_ETH_RECEIVE_ALL(ETH_InitStruct->ETH_ReceiveAll)); + assert_param(IS_ETH_SOURCE_ADDR_FILTER(ETH_InitStruct->ETH_SourceAddrFilter)); + assert_param(IS_ETH_CONTROL_FRAMES(ETH_InitStruct->ETH_PassControlFrames)); + assert_param(IS_ETH_BROADCAST_FRAMES_RECEPTION(ETH_InitStruct->ETH_BroadcastFramesReception)); + assert_param(IS_ETH_DESTINATION_ADDR_FILTER(ETH_InitStruct->ETH_DestinationAddrFilter)); + assert_param(IS_ETH_PROMISCUOUS_MODE(ETH_InitStruct->ETH_PromiscuousMode)); + assert_param(IS_ETH_MULTICAST_FRAMES_FILTER(ETH_InitStruct->ETH_MulticastFramesFilter)); + assert_param(IS_ETH_UNICAST_FRAMES_FILTER(ETH_InitStruct->ETH_UnicastFramesFilter)); + assert_param(IS_ETH_PAUSE_TIME(ETH_InitStruct->ETH_PauseTime)); + assert_param(IS_ETH_ZEROQUANTA_PAUSE(ETH_InitStruct->ETH_ZeroQuantaPause)); + assert_param(IS_ETH_PAUSE_LOW_THRESHOLD(ETH_InitStruct->ETH_PauseLowThreshold)); + assert_param(IS_ETH_UNICAST_PAUSE_FRAME_DETECT(ETH_InitStruct->ETH_UnicastPauseFrameDetect)); + assert_param(IS_ETH_RECEIVE_FLOWCONTROL(ETH_InitStruct->ETH_ReceiveFlowControl)); + assert_param(IS_ETH_TRANSMIT_FLOWCONTROL(ETH_InitStruct->ETH_TransmitFlowControl)); + assert_param(IS_ETH_VLAN_TAG_COMPARISON(ETH_InitStruct->ETH_VLANTagComparison)); + assert_param(IS_ETH_VLAN_TAG_IDENTIFIER(ETH_InitStruct->ETH_VLANTagIdentifier)); + /* DMA --------------------------*/ + assert_param(IS_ETH_DROP_TCPIP_CHECKSUM_FRAME(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame)); + assert_param(IS_ETH_RECEIVE_STORE_FORWARD(ETH_InitStruct->ETH_ReceiveStoreForward)); + assert_param(IS_ETH_FLUSH_RECEIVE_FRAME(ETH_InitStruct->ETH_FlushReceivedFrame)); + assert_param(IS_ETH_TRANSMIT_STORE_FORWARD(ETH_InitStruct->ETH_TransmitStoreForward)); + assert_param(IS_ETH_TRANSMIT_THRESHOLD_CONTROL(ETH_InitStruct->ETH_TransmitThresholdControl)); + assert_param(IS_ETH_FORWARD_ERROR_FRAMES(ETH_InitStruct->ETH_ForwardErrorFrames)); + assert_param(IS_ETH_FORWARD_UNDERSIZED_GOOD_FRAMES(ETH_InitStruct->ETH_ForwardUndersizedGoodFrames)); + assert_param(IS_ETH_RECEIVE_THRESHOLD_CONTROL(ETH_InitStruct->ETH_ReceiveThresholdControl)); + assert_param(IS_ETH_SECOND_FRAME_OPERATE(ETH_InitStruct->ETH_SecondFrameOperate)); + assert_param(IS_ETH_ADDRESS_ALIGNED_BEATS(ETH_InitStruct->ETH_AddressAlignedBeats)); + assert_param(IS_ETH_FIXED_BURST(ETH_InitStruct->ETH_FixedBurst)); + assert_param(IS_ETH_RXDMA_BURST_LENGTH(ETH_InitStruct->ETH_RxDMABurstLength)); + assert_param(IS_ETH_TXDMA_BURST_LENGTH(ETH_InitStruct->ETH_TxDMABurstLength)); + assert_param(IS_ETH_DMA_DESC_SKIP_LENGTH(ETH_InitStruct->ETH_DescriptorSkipLength)); + assert_param(IS_ETH_DMA_ARBITRATION_ROUNDROBIN_RXTX(ETH_InitStruct->ETH_DMAArbitration)); + /*-------------------------------- MAC Config ------------------------------*/ + /*---------------------- ETHERNET MACMIIAR Configuration -------------------*/ + /* Get the ETHERNET MACMIIAR value */ + tmpreg = ETH->MACMIIAR; + /* Clear CSR Clock Range CR[2:0] bits */ + tmpreg &= MACMIIAR_CR_Mask; + /* Get hclk frequency value */ + RCC_GetClocksFreq(&rcc_clocks); + hclk = rcc_clocks.HCLK_Frequency; + /* Set CR bits depending on hclk value */ + if((hclk >= 20000000)&&(hclk < 35000000)) + { + /* CSR Clock Range between 20-35 MHz */ + tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div16; + } + else if((hclk >= 35000000)&&(hclk < 60000000)) + { + /* CSR Clock Range between 35-60 MHz */ + tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div26; + } + else if((hclk >= 60000000)&&(hclk <= 100000000)) + { + /* CSR Clock Range between 60-100 MHz */ + tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div42; + } + else /*if((hclk >= 100000000)&&(hclk <= 120000000)) */ + { + /* CSR Clock Range between 100-120 MHz */ + tmpreg |= (uint32_t)ETH_MACMIIAR_CR_Div62; + } + /* Write to ETHERNET MAC MIIAR: Configure the ETHERNET CSR Clock Range */ + ETH->MACMIIAR = (uint32_t)tmpreg; + /*-------------------- PHY initialization and configuration ----------------*/ + /* Put the PHY in reset mode */ + if(!(ETH_WritePHYRegister(PHYAddress, PHY_BCR, PHY_Reset))) + { + /* Return ERROR in case of write timeout */ + return ETH_ERROR; + } + + /* Delay to assure PHY reset */ + for(i = PHY_ResetDelay; i != 0; i--) + { + } + + if(ETH_InitStruct->ETH_AutoNegotiation != ETH_AutoNegotiation_Disable) + { + /* We wait for linked satus... */ + do + { + timeout++; + } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_Linked_Status) && (timeout < PHY_READ_TO)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_READ_TO) + { + return ETH_ERROR; + } + /* Reset Timeout counter */ + timeout = 0; + + /* Enable Auto-Negotiation */ + if(!(ETH_WritePHYRegister(PHYAddress, PHY_BCR, PHY_AutoNegotiation))) + { + /* Return ERROR in case of write timeout */ + return ETH_ERROR; + } + + /* Wait until the autonegotiation will be completed */ + do + { + timeout++; + } while (!(ETH_ReadPHYRegister(PHYAddress, PHY_BSR) & PHY_AutoNego_Complete) && (timeout < (uint32_t)PHY_READ_TO)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_READ_TO) + { + return ETH_ERROR; + } + /* Reset Timeout counter */ + timeout = 0; + + /* Read the result of the autonegotiation */ + RegValue = ETH_ReadPHYRegister(PHYAddress, PHY_SR); + + /* Configure the MAC with the Duplex Mode fixed by the autonegotiation process */ + if((RegValue & PHY_Duplex_Status) != (uint32_t)RESET) + { + /* Set Ethernet duplex mode to FullDuplex following the autonegotiation */ + ETH_InitStruct->ETH_Mode = ETH_Mode_FullDuplex; + + } + else + { + /* Set Ethernet duplex mode to HalfDuplex following the autonegotiation */ + ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex; + } + /* Configure the MAC with the speed fixed by the autonegotiation process */ + if(RegValue & PHY_Speed_Status) + { + /* Set Ethernet speed to 10M following the autonegotiation */ + ETH_InitStruct->ETH_Speed = ETH_Speed_10M; + } + else + { + /* Set Ethernet speed to 100M following the autonegotiation */ + ETH_InitStruct->ETH_Speed = ETH_Speed_100M; + } + } + else + { + if(!ETH_WritePHYRegister(PHYAddress, PHY_BCR, ((uint16_t)(ETH_InitStruct->ETH_Mode >> 3) | + (uint16_t)(ETH_InitStruct->ETH_Speed >> 1)))) + { + /* Return ERROR in case of write timeout */ + return ETH_ERROR; + } + /* Delay to assure PHY configuration */ + for(i = PHY_ConfigDelay; i != 0; i--) + { + } + } + /*------------------------ ETHERNET MACCR Configuration --------------------*/ + /* Get the ETHERNET MACCR value */ + tmpreg = ETH->MACCR; + /* Clear WD, PCE, PS, TE and RE bits */ + tmpreg &= MACCR_CLEAR_Mask; + /* Set the WD bit according to ETH_Watchdog value */ + /* Set the JD: bit according to ETH_Jabber value */ + /* Set the IFG bit according to ETH_InterFrameGap value */ + /* Set the DCRS bit according to ETH_CarrierSense value */ + /* Set the FES bit according to ETH_Speed value */ + /* Set the DO bit according to ETH_ReceiveOwn value */ + /* Set the LM bit according to ETH_LoopbackMode value */ + /* Set the DM bit according to ETH_Mode value */ + /* Set the IPC bit according to ETH_ChecksumOffload value */ + /* Set the DR bit according to ETH_RetryTransmission value */ + /* Set the ACS bit according to ETH_AutomaticPadCRCStrip value */ + /* Set the BL bit according to ETH_BackOffLimit value */ + /* Set the DC bit according to ETH_DeferralCheck value */ + tmpreg |= (uint32_t)(ETH_InitStruct->ETH_Watchdog | + ETH_InitStruct->ETH_Jabber | + ETH_InitStruct->ETH_InterFrameGap | + ETH_InitStruct->ETH_CarrierSense | + ETH_InitStruct->ETH_Speed | + ETH_InitStruct->ETH_ReceiveOwn | + ETH_InitStruct->ETH_LoopbackMode | + ETH_InitStruct->ETH_Mode | + ETH_InitStruct->ETH_ChecksumOffload | + ETH_InitStruct->ETH_RetryTransmission | + ETH_InitStruct->ETH_AutomaticPadCRCStrip | + ETH_InitStruct->ETH_BackOffLimit | + ETH_InitStruct->ETH_DeferralCheck); + /* Write to ETHERNET MACCR */ + ETH->MACCR = (uint32_t)tmpreg; + + /*----------------------- ETHERNET MACFFR Configuration --------------------*/ + /* Set the RA bit according to ETH_ReceiveAll value */ + /* Set the SAF and SAIF bits according to ETH_SourceAddrFilter value */ + /* Set the PCF bit according to ETH_PassControlFrames value */ + /* Set the DBF bit according to ETH_BroadcastFramesReception value */ + /* Set the DAIF bit according to ETH_DestinationAddrFilter value */ + /* Set the PR bit according to ETH_PromiscuousMode value */ + /* Set the PM, HMC and HPF bits according to ETH_MulticastFramesFilter value */ + /* Set the HUC and HPF bits according to ETH_UnicastFramesFilter value */ + /* Write to ETHERNET MACFFR */ + ETH->MACFFR = (uint32_t)(ETH_InitStruct->ETH_ReceiveAll | + ETH_InitStruct->ETH_SourceAddrFilter | + ETH_InitStruct->ETH_PassControlFrames | + ETH_InitStruct->ETH_BroadcastFramesReception | + ETH_InitStruct->ETH_DestinationAddrFilter | + ETH_InitStruct->ETH_PromiscuousMode | + ETH_InitStruct->ETH_MulticastFramesFilter | + ETH_InitStruct->ETH_UnicastFramesFilter); + /*--------------- ETHERNET MACHTHR and MACHTLR Configuration ---------------*/ + /* Write to ETHERNET MACHTHR */ + ETH->MACHTHR = (uint32_t)ETH_InitStruct->ETH_HashTableHigh; + /* Write to ETHERNET MACHTLR */ + ETH->MACHTLR = (uint32_t)ETH_InitStruct->ETH_HashTableLow; + /*----------------------- ETHERNET MACFCR Configuration --------------------*/ + /* Get the ETHERNET MACFCR value */ + tmpreg = ETH->MACFCR; + /* Clear xx bits */ + tmpreg &= MACFCR_CLEAR_Mask; + + /* Set the PT bit according to ETH_PauseTime value */ + /* Set the DZPQ bit according to ETH_ZeroQuantaPause value */ + /* Set the PLT bit according to ETH_PauseLowThreshold value */ + /* Set the UP bit according to ETH_UnicastPauseFrameDetect value */ + /* Set the RFE bit according to ETH_ReceiveFlowControl value */ + /* Set the TFE bit according to ETH_TransmitFlowControl value */ + tmpreg |= (uint32_t)((ETH_InitStruct->ETH_PauseTime << 16) | + ETH_InitStruct->ETH_ZeroQuantaPause | + ETH_InitStruct->ETH_PauseLowThreshold | + ETH_InitStruct->ETH_UnicastPauseFrameDetect | + ETH_InitStruct->ETH_ReceiveFlowControl | + ETH_InitStruct->ETH_TransmitFlowControl); + /* Write to ETHERNET MACFCR */ + ETH->MACFCR = (uint32_t)tmpreg; + /*----------------------- ETHERNET MACVLANTR Configuration -----------------*/ + /* Set the ETV bit according to ETH_VLANTagComparison value */ + /* Set the VL bit according to ETH_VLANTagIdentifier value */ + ETH->MACVLANTR = (uint32_t)(ETH_InitStruct->ETH_VLANTagComparison | + ETH_InitStruct->ETH_VLANTagIdentifier); + + /*-------------------------------- DMA Config ------------------------------*/ + /*----------------------- ETHERNET DMAOMR Configuration --------------------*/ + /* Get the ETHERNET DMAOMR value */ + tmpreg = ETH->DMAOMR; + /* Clear xx bits */ + tmpreg &= DMAOMR_CLEAR_Mask; + + /* Set the DT bit according to ETH_DropTCPIPChecksumErrorFrame value */ + /* Set the RSF bit according to ETH_ReceiveStoreForward value */ + /* Set the DFF bit according to ETH_FlushReceivedFrame value */ + /* Set the TSF bit according to ETH_TransmitStoreForward value */ + /* Set the TTC bit according to ETH_TransmitThresholdControl value */ + /* Set the FEF bit according to ETH_ForwardErrorFrames value */ + /* Set the FUF bit according to ETH_ForwardUndersizedGoodFrames value */ + /* Set the RTC bit according to ETH_ReceiveThresholdControl value */ + /* Set the OSF bit according to ETH_SecondFrameOperate value */ + tmpreg |= (uint32_t)(ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame | + ETH_InitStruct->ETH_ReceiveStoreForward | + ETH_InitStruct->ETH_FlushReceivedFrame | + ETH_InitStruct->ETH_TransmitStoreForward | + ETH_InitStruct->ETH_TransmitThresholdControl | + ETH_InitStruct->ETH_ForwardErrorFrames | + ETH_InitStruct->ETH_ForwardUndersizedGoodFrames | + ETH_InitStruct->ETH_ReceiveThresholdControl | + ETH_InitStruct->ETH_SecondFrameOperate); + /* Write to ETHERNET DMAOMR */ + ETH->DMAOMR = (uint32_t)tmpreg; + + /*----------------------- ETHERNET DMABMR Configuration --------------------*/ + /* Set the AAL bit according to ETH_AddressAlignedBeats value */ + /* Set the FB bit according to ETH_FixedBurst value */ + /* Set the RPBL and 4*PBL bits according to ETH_RxDMABurstLength value */ + /* Set the PBL and 4*PBL bits according to ETH_TxDMABurstLength value */ + /* Set the DSL bit according to ETH_DesciptorSkipLength value */ + /* Set the PR and DA bits according to ETH_DMAArbitration value */ + ETH->DMABMR = (uint32_t)(ETH_InitStruct->ETH_AddressAlignedBeats | + ETH_InitStruct->ETH_FixedBurst | + ETH_InitStruct->ETH_RxDMABurstLength | /* !! if 4xPBL is selected for Tx or Rx it is applied for the other */ + ETH_InitStruct->ETH_TxDMABurstLength | + (ETH_InitStruct->ETH_DescriptorSkipLength << 2) | + ETH_InitStruct->ETH_DMAArbitration | + ETH_DMABMR_USP); /* Enable use of separate PBL for Rx and Tx */ + /* Return Ethernet configuration success */ + return ETH_SUCCESS; +} + +/** + * @brief Fills each ETH_InitStruct member with its default value. + * @param ETH_InitStruct: pointer to a ETH_InitTypeDef structure + * which will be initialized. + * @retval : None + */ +void ETH_StructInit(ETH_InitTypeDef* ETH_InitStruct) +{ + /* ETH_InitStruct members default value */ + /*------------------------ MAC -----------------------------------*/ + ETH_InitStruct->ETH_AutoNegotiation = ETH_AutoNegotiation_Disable; + ETH_InitStruct->ETH_Watchdog = ETH_Watchdog_Enable; + ETH_InitStruct->ETH_Jabber = ETH_Jabber_Enable; + ETH_InitStruct->ETH_InterFrameGap = ETH_InterFrameGap_96Bit; + ETH_InitStruct->ETH_CarrierSense = ETH_CarrierSense_Enable; + ETH_InitStruct->ETH_Speed = ETH_Speed_10M; + ETH_InitStruct->ETH_ReceiveOwn = ETH_ReceiveOwn_Enable; + ETH_InitStruct->ETH_LoopbackMode = ETH_LoopbackMode_Disable; + ETH_InitStruct->ETH_Mode = ETH_Mode_HalfDuplex; + ETH_InitStruct->ETH_ChecksumOffload = ETH_ChecksumOffload_Disable; + ETH_InitStruct->ETH_RetryTransmission = ETH_RetryTransmission_Enable; + ETH_InitStruct->ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable; + ETH_InitStruct->ETH_BackOffLimit = ETH_BackOffLimit_10; + ETH_InitStruct->ETH_DeferralCheck = ETH_DeferralCheck_Disable; + ETH_InitStruct->ETH_ReceiveAll = ETH_ReceiveAll_Disable; + ETH_InitStruct->ETH_SourceAddrFilter = ETH_SourceAddrFilter_Disable; + ETH_InitStruct->ETH_PassControlFrames = ETH_PassControlFrames_BlockAll; + ETH_InitStruct->ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable; + ETH_InitStruct->ETH_DestinationAddrFilter = ETH_DestinationAddrFilter_Normal; + ETH_InitStruct->ETH_PromiscuousMode = ETH_PromiscuousMode_Disable; + ETH_InitStruct->ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect; + ETH_InitStruct->ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect; + ETH_InitStruct->ETH_HashTableHigh = 0x0; + ETH_InitStruct->ETH_HashTableLow = 0x0; + ETH_InitStruct->ETH_PauseTime = 0x0; + ETH_InitStruct->ETH_ZeroQuantaPause = ETH_ZeroQuantaPause_Disable; + ETH_InitStruct->ETH_PauseLowThreshold = ETH_PauseLowThreshold_Minus4; + ETH_InitStruct->ETH_UnicastPauseFrameDetect = ETH_UnicastPauseFrameDetect_Disable; + ETH_InitStruct->ETH_ReceiveFlowControl = ETH_ReceiveFlowControl_Disable; + ETH_InitStruct->ETH_TransmitFlowControl = ETH_TransmitFlowControl_Disable; + ETH_InitStruct->ETH_VLANTagComparison = ETH_VLANTagComparison_16Bit; + ETH_InitStruct->ETH_VLANTagIdentifier = 0x0; + /*------------------------ DMA -----------------------------------*/ + ETH_InitStruct->ETH_DropTCPIPChecksumErrorFrame = ETH_DropTCPIPChecksumErrorFrame_Disable; + ETH_InitStruct->ETH_ReceiveStoreForward = ETH_ReceiveStoreForward_Enable; + ETH_InitStruct->ETH_FlushReceivedFrame = ETH_FlushReceivedFrame_Disable; + ETH_InitStruct->ETH_TransmitStoreForward = ETH_TransmitStoreForward_Enable; + ETH_InitStruct->ETH_TransmitThresholdControl = ETH_TransmitThresholdControl_64Bytes; + ETH_InitStruct->ETH_ForwardErrorFrames = ETH_ForwardErrorFrames_Disable; + ETH_InitStruct->ETH_ForwardUndersizedGoodFrames = ETH_ForwardUndersizedGoodFrames_Disable; + ETH_InitStruct->ETH_ReceiveThresholdControl = ETH_ReceiveThresholdControl_64Bytes; + ETH_InitStruct->ETH_SecondFrameOperate = ETH_SecondFrameOperate_Disable; + ETH_InitStruct->ETH_AddressAlignedBeats = ETH_AddressAlignedBeats_Enable; + ETH_InitStruct->ETH_FixedBurst = ETH_FixedBurst_Disable; + ETH_InitStruct->ETH_RxDMABurstLength = ETH_RxDMABurstLength_1Beat; + ETH_InitStruct->ETH_TxDMABurstLength = ETH_TxDMABurstLength_1Beat; + ETH_InitStruct->ETH_DescriptorSkipLength = 0x0; + ETH_InitStruct->ETH_DMAArbitration = ETH_DMAArbitration_RoundRobin_RxTx_1_1; +} + +/** + * @brief Enables ENET MAC and DMA reception/transmission + * @param None + * @retval : None + */ +void ETH_Start(void) +{ + /* Enable transmit state machine of the MAC for transmission on the MII */ + ETH_MACTransmissionCmd(ENABLE); + /* Flush Transmit FIFO */ + ETH_FlushTransmitFIFO(); + /* Enable receive state machine of the MAC for reception from the MII */ + ETH_MACReceptionCmd(ENABLE); + + /* Start DMA transmission */ + ETH_DMATransmissionCmd(ENABLE); + /* Start DMA reception */ + ETH_DMAReceptionCmd(ENABLE); +} + +/** + * @brief Transmits a packet, from application buffer, pointed by ppkt. + * @param ppkt: pointer to application packet buffer to transmit. + * @param FrameLength: Tx Packet size. + * @retval : ETH_ERROR: in case of Tx desc owned by DMA + * ETH_SUCCESS: for correct transmission + */ +uint32_t ETH_HandleTxPkt(uint8_t *ppkt, uint16_t FrameLength) +{ + uint32_t offset = 0; + + /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */ + if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (uint32_t)RESET) + { + /* Return ERROR: OWN bit set */ + return ETH_ERROR; + } + + /* Copy the frame to be sent into memory pointed by the current ETHERNET DMA Tx descriptor */ + for(offset=0; offsetBuffer1Addr) + offset)) = (*(ppkt + offset)); + } + + /* Setting the Frame Length: bits[12:0] */ + DMATxDescToSet->ControlBufferSize = (FrameLength & ETH_DMATxDesc_TBS1); + /* Setting the last segment and first segment bits (in this case a frame is transmitted in one descriptor) */ + DMATxDescToSet->Status |= ETH_DMATxDesc_LS | ETH_DMATxDesc_FS; + /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMATxDescToSet->Status |= ETH_DMATxDesc_OWN; + /* When Tx Buffer unavailable flag is set: clear it and resume transmission */ + if ((ETH->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET) + { + /* Clear TBUS ETHERNET DMA flag */ + ETH->DMASR = ETH_DMASR_TBUS; + /* Resume DMA transmission*/ + ETH->DMATPDR = 0; + } + + /* Update the ETHERNET DMA global Tx descriptor with next Tx decriptor */ + /* Chained Mode */ + if((DMATxDescToSet->Status & ETH_DMATxDesc_TCH) != (uint32_t)RESET) + { + /* Selects the next DMA Tx descriptor list for next buffer to send */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) (DMATxDescToSet->Buffer2NextDescAddr); + } + else /* Ring Mode */ + { + if((DMATxDescToSet->Status & ETH_DMATxDesc_TER) != (uint32_t)RESET) + { + /* Selects the first DMA Tx descriptor for next buffer to send: last Tx descriptor was used */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) (ETH->DMATDLAR); + } + else + { + /* Selects the next DMA Tx descriptor list for next buffer to send */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) ((uint32_t)DMATxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** + * @brief Receives a packet and copies it to memory pointed by ppkt. + * @param ppkt: pointer to application packet receive buffer. + * @retval : ETH_ERROR: if there is error in reception + * framelength: received packet size if packet reception is correct + */ +uint32_t ETH_HandleRxPkt(uint8_t *ppkt) +{ + uint32_t offset = 0, framelength = 0; + /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */ + if((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) != (uint32_t)RESET) + { + /* Return error: OWN bit set */ + return ETH_ERROR; + } + + if(((DMARxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)) + { + /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */ + framelength = ((DMARxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARxDesc_FrameLengthShift) - 4; + /* Copy the received frame into buffer from memory pointed by the current ETHERNET DMA Rx descriptor */ + for(offset=0; offsetBuffer1Addr) + offset)); + } + } + else + { + /* Return ERROR */ + framelength = ETH_ERROR; + } + /* Set Own bit of the Rx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMARxDescToGet->Status = ETH_DMARxDesc_OWN; + + /* When Rx Buffer unavailable flag is set: clear it and resume reception */ + if ((ETH->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET) + { + /* Clear RBUS ETHERNET DMA flag */ + ETH->DMASR = ETH_DMASR_RBUS; + /* Resume DMA reception */ + ETH->DMARPDR = 0; + } + + /* Update the ETHERNET DMA global Rx descriptor with next Rx decriptor */ + /* Chained Mode */ + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RCH) != (uint32_t)RESET) + { + /* Selects the next DMA Rx descriptor list for next buffer to read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr); + } + else /* Ring Mode */ + { + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RER) != (uint32_t)RESET) + { + /* Selects the first DMA Rx descriptor for next buffer to read: last Rx descriptor was used */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (ETH->DMARDLAR); + } + else + { + /* Selects the next DMA Rx descriptor list for next buffer to read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) ((uint32_t)DMARxDescToGet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + + /* Return Frame Length/ERROR */ + return (framelength); +} + +/** + * @brief Get the size of received the received packet. + * @param None + * @retval : framelength: received packet size + */ +uint32_t ETH_GetRxPktSize(void) +{ + uint32_t frameLength = 0; + if(((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)) + { + /* Get the size of the packet: including 4 bytes of the CRC */ + frameLength = ETH_GetDMARxDescFrameLength(DMARxDescToGet); + } + + /* Return Frame Length */ + return frameLength; +} + +/** + * @brief Drop a Received packet (too small packet, etc...) + * @param None + * @retval : None + */ +void ETH_DropRxPkt(void) +{ + /* Set Own bit of the Rx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMARxDescToGet->Status = ETH_DMARxDesc_OWN; + /* Chained Mode */ + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RCH) != (uint32_t)RESET) + { + /* Selects the next DMA Rx descriptor list for next buffer read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMARxDescToGet->Buffer2NextDescAddr); + } + else /* Ring Mode */ + { + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RER) != (uint32_t)RESET) + { + /* Selects the next DMA Rx descriptor list for next buffer read: this will + be the first Rx descriptor in this case */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (ETH->DMARDLAR); + } + else + { + /* Selects the next DMA Rx descriptor list for next buffer read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) ((uint32_t)DMARxDescToGet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } +} + +/*--------------------------------- PHY ------------------------------------*/ +/** + * @brief Read a PHY register + * @param PHYAddress: PHY device address, is the index of one of supported + * 32 PHY devices. + * This parameter can be one of the following values: 0,..,31 + * @param PHYReg: PHY register address, is the index of one of the 32 + * PHY register. + * This parameter can be one of the following values: + * @arg PHY_BCR : Tranceiver Basic Control Register + * @arg PHY_BSR : Tranceiver Basic Status Register + * @arg PHY_SR : Tranceiver Status Register + * @arg More PHY register could be read depending on the used PHY + * @retval : ETH_ERROR: in case of timeout + * MAC MIIDR register value: Data read from the selected PHY register (correct read ) + */ +uint16_t ETH_ReadPHYRegister(uint16_t PHYAddress, uint16_t PHYReg) +{ + uint32_t tmpreg = 0; +__IO uint32_t timeout = 0; + /* Check the parameters */ + assert_param(IS_ETH_PHY_ADDRESS(PHYAddress)); + assert_param(IS_ETH_PHY_REG(PHYReg)); + + /* Get the ETHERNET MACMIIAR value */ + tmpreg = ETH->MACMIIAR; + /* Keep only the CSR Clock Range CR[2:0] bits value */ + tmpreg &= ~MACMIIAR_CR_Mask; + /* Prepare the MII address register value */ + tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */ + tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */ + tmpreg &= ~ETH_MACMIIAR_MW; /* Set the read mode */ + tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */ + /* Write the result value into the MII Address register */ + ETH->MACMIIAR = tmpreg; + /* Check for the Busy flag */ + do + { + timeout++; + tmpreg = ETH->MACMIIAR; + } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_READ_TO)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_READ_TO) + { + return (uint16_t)ETH_ERROR; + } + + /* Return data register value */ + return (uint16_t)(ETH->MACMIIDR); +} + +/** + * @brief Write to a PHY register + * @param PHYAddress: PHY device address, is the index of one of supported + * 32 PHY devices. + * This parameter can be one of the following values: 0,..,31 + * @param PHYReg: PHY register address, is the index of one of the 32 + * PHY register. + * This parameter can be one of the following values: + * @arg PHY_BCR : Tranceiver Control Register + * @arg More PHY register could be written depending on the used PHY + * @param PHYValue: the value to write + * @retval : ETH_ERROR: in case of timeout + * ETH_SUCCESS: for correct write + */ +uint32_t ETH_WritePHYRegister(uint16_t PHYAddress, uint16_t PHYReg, uint16_t PHYValue) +{ + uint32_t tmpreg = 0; + __IO uint32_t timeout = 0; + /* Check the parameters */ + assert_param(IS_ETH_PHY_ADDRESS(PHYAddress)); + assert_param(IS_ETH_PHY_REG(PHYReg)); + + /* Get the ETHERNET MACMIIAR value */ + tmpreg = ETH->MACMIIAR; + /* Keep only the CSR Clock Range CR[2:0] bits value */ + tmpreg &= ~MACMIIAR_CR_Mask; + /* Prepare the MII register address value */ + tmpreg |=(((uint32_t)PHYAddress<<11) & ETH_MACMIIAR_PA); /* Set the PHY device address */ + tmpreg |=(((uint32_t)PHYReg<<6) & ETH_MACMIIAR_MR); /* Set the PHY register address */ + tmpreg |= ETH_MACMIIAR_MW; /* Set the write mode */ + tmpreg |= ETH_MACMIIAR_MB; /* Set the MII Busy bit */ + /* Give the value to the MII data register */ + ETH->MACMIIDR = PHYValue; + /* Write the result value into the MII Address register */ + ETH->MACMIIAR = tmpreg; + /* Check for the Busy flag */ + do + { + timeout++; + tmpreg = ETH->MACMIIAR; + } while ((tmpreg & ETH_MACMIIAR_MB) && (timeout < (uint32_t)PHY_WRITE_TO)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_WRITE_TO) + { + return ETH_ERROR; + } + + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** + * @brief Enables or disables the PHY loopBack mode. + * @param PHYAddress: PHY device address, is the index of one of supported + * 32 PHY devices. + * This parameter can be one of the following values: + * @param NewState: new state of the PHY loopBack mode. + * This parameter can be: ENABLE or DISABLE. + * Note: Don't be confused with ETH_MACLoopBackCmd function + * which enables internal loopback at MII level + * @retval : ETH_ERROR: in case of bad PHY configuration + * ETH_SUCCESS: for correct PHY configuration + */ +uint32_t ETH_PHYLoopBackCmd(uint16_t PHYAddress, FunctionalState NewState) +{ + uint16_t tmpreg = 0; + /* Check the parameters */ + assert_param(IS_ETH_PHY_ADDRESS(PHYAddress)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + /* Get the PHY configuration to update it */ + tmpreg = ETH_ReadPHYRegister(PHYAddress, PHY_BCR); + + if (NewState != DISABLE) + { + /* Enable the PHY loopback mode */ + tmpreg |= PHY_Loopback; + } + else + { + /* Disable the PHY loopback mode: normal mode */ + tmpreg &= (uint16_t)(~(uint16_t)PHY_Loopback); + } + /* Update the PHY control register with the new configuration */ + if(ETH_WritePHYRegister(PHYAddress, PHY_BCR, tmpreg) != (uint32_t)RESET) + { + return ETH_SUCCESS; + } + else + { + /* Return SUCCESS */ + return ETH_ERROR; + } +} + +/*--------------------------------- MAC ------------------------------------*/ +/** + * @brief Enables or disables the MAC transmission. + * @param NewState: new state of the MAC transmission. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MACTransmissionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC transmission */ + ETH->MACCR |= ETH_MACCR_TE; + } + else + { + /* Disable the MAC transmission */ + ETH->MACCR &= ~ETH_MACCR_TE; + } +} + +/** + * @brief Enables or disables the MAC reception. + * @param NewState: new state of the MAC reception. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MACReceptionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC reception */ + ETH->MACCR |= ETH_MACCR_RE; + } + else + { + /* Disable the MAC reception */ + ETH->MACCR &= ~ETH_MACCR_RE; + } +} + +/** + * @brief Checks whether the ETHERNET flow control busy bit is set or not. + * @param None + * @retval : The new state of flow control busy status bit (SET or RESET). + */ +FlagStatus ETH_GetFlowControlBusyStatus(void) +{ + FlagStatus bitstatus = RESET; + /* The Flow Control register should not be written to until this bit is cleared */ + if ((ETH->MACFCR & ETH_MACFCR_FCBBPA) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Initiate a Pause Control Frame (Full-duplex only). + * @param None + * @retval : None + */ +void ETH_InitiatePauseControlFrame(void) +{ + /* When Set In full duplex MAC initiates pause control frame */ + ETH->MACFCR |= ETH_MACFCR_FCBBPA; +} + +/** + * @brief Enables or disables the MAC BackPressure operation activation (Half-duplex only). + * @param NewState: new state of the MAC BackPressure operation activation. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_BackPressureActivationCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Activate the MAC BackPressure operation */ + /* In Half duplex: during backpressure, when the MAC receives a new frame, + the transmitter starts sending a JAM pattern resulting in a collision */ + ETH->MACFCR |= ETH_MACFCR_FCBBPA; + } + else + { + /* Desactivate the MAC BackPressure operation */ + ETH->MACFCR &= ~ETH_MACFCR_FCBBPA; + } +} + +/** + * @brief Checks whether the specified ETHERNET MAC flag is set or not. + * @param ETH_MAC_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_MAC_FLAG_TST : Time stamp trigger flag + * @arg ETH_MAC_FLAG_MMCT : MMC transmit flag + * @arg ETH_MAC_FLAG_MMCR : MMC receive flag + * @arg ETH_MAC_FLAG_MMC : MMC flag + * @arg ETH_MAC_FLAG_PMT : PMT flag + * @retval : The new state of ETHERNET MAC flag (SET or RESET). + */ +FlagStatus ETH_GetMACFlagStatus(uint32_t ETH_MAC_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_MAC_GET_FLAG(ETH_MAC_FLAG)); + if ((ETH->MACSR & ETH_MAC_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Checks whether the specified ETHERNET MAC interrupt has occurred or not. + * @param ETH_MAC_IT: specifies the interrupt source to check. + * This parameter can be one of the following values: + * @arg ETH_MAC_IT_TST : Time stamp trigger interrupt + * @arg ETH_MAC_IT_MMCT : MMC transmit interrupt + * @arg ETH_MAC_IT_MMCR : MMC receive interrupt + * @arg ETH_MAC_IT_MMC : MMC interrupt + * @arg ETH_MAC_IT_PMT : PMT interrupt + * @retval : The new state of ETHERNET MAC interrupt (SET or RESET). + */ +ITStatus ETH_GetMACITStatus(uint32_t ETH_MAC_IT) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_MAC_GET_IT(ETH_MAC_IT)); + if ((ETH->MACSR & ETH_MAC_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Enables or disables the specified ETHERNET MAC interrupts. + * @param ETH_MAC_IT: specifies the ETHERNET MAC interrupt sources to be + * enabled or disabled. + * This parameter can be any combination of the following values: + * @arg ETH_MAC_IT_TST : Time stamp trigger interrupt + * @arg ETH_MAC_IT_PMT : PMT interrupt + * @param NewState: new state of the specified ETHERNET MAC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MACITConfig(uint32_t ETH_MAC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ETH_MAC_IT(ETH_MAC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET MAC interrupts */ + ETH->MACIMR &= (~(uint32_t)ETH_MAC_IT); + } + else + { + /* Disable the selected ETHERNET MAC interrupts */ + ETH->MACIMR |= ETH_MAC_IT; + } +} + +/** + * @brief Configures the selected MAC address. + * @param MacAddr: The MAC addres to configure. + * This parameter can be one of the following values: + * @arg ETH_MAC_Address0 : MAC Address0 + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param Addr: Pointer on MAC address buffer data (6 bytes). + * @retval : None + */ +void ETH_MACAddressConfig(uint32_t MacAddr, uint8_t *Addr) +{ + uint32_t tmpreg; + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS0123(MacAddr)); + + /* Calculate the selectecd MAC address high register */ + tmpreg = ((uint32_t)Addr[5] << 8) | (uint32_t)Addr[4]; + /* Load the selectecd MAC address high register */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) = tmpreg; + /* Calculate the selectecd MAC address low register */ + tmpreg = ((uint32_t)Addr[3] << 24) | ((uint32_t)Addr[2] << 16) | ((uint32_t)Addr[1] << 8) | Addr[0]; + + /* Load the selectecd MAC address low register */ + (*(__IO uint32_t *) (ETH_MAC_AddrLowBase + MacAddr)) = tmpreg; +} + +/** + * @brief Get the selected MAC address. + * @param MacAddr: The MAC addres to return. + * This parameter can be one of the following values: + * @arg ETH_MAC_Address0 : MAC Address0 + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param Addr: Pointer on MAC address buffer data (6 bytes). + * @retval : None + */ +void ETH_GetMACAddress(uint32_t MacAddr, uint8_t *Addr) +{ + uint32_t tmpreg; + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS0123(MacAddr)); + + /* Get the selectecd MAC address high register */ + tmpreg =(*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)); + + /* Calculate the selectecd MAC address buffer */ + Addr[5] = ((tmpreg >> 8) & (uint8_t)0xFF); + Addr[4] = (tmpreg & (uint8_t)0xFF); + /* Load the selectecd MAC address low register */ + tmpreg =(*(__IO uint32_t *) (ETH_MAC_AddrLowBase + MacAddr)); + /* Calculate the selectecd MAC address buffer */ + Addr[3] = ((tmpreg >> 24) & (uint8_t)0xFF); + Addr[2] = ((tmpreg >> 16) & (uint8_t)0xFF); + Addr[1] = ((tmpreg >> 8 ) & (uint8_t)0xFF); + Addr[0] = (tmpreg & (uint8_t)0xFF); +} + +/** + * @brief Enables or disables the Address filter module uses the specified + * ETHERNET MAC address for perfect filtering + * @param MacAddr: specifies the ETHERNET MAC address to be used for prfect filtering. + * This parameter can be one of the following values: + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param NewState: new state of the specified ETHERNET MAC address use. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MACAddressPerfectFilterCmd(uint32_t MacAddr, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS123(MacAddr)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET MAC address for perfect filtering */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) |= ETH_MACA1HR_AE; + } + else + { + /* Disable the selected ETHERNET MAC address for perfect filtering */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) &=(~(uint32_t)ETH_MACA1HR_AE); + } +} + +/** + * @brief Set the filter type for the specified ETHERNET MAC address + * @param MacAddr: specifies the ETHERNET MAC address + * This parameter can be one of the following values: + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param Filter: specifies the used frame received field for comparaison + * This parameter can be one of the following values: + * @arg ETH_MAC_AddressFilter_SA : MAC Address is used to compare + * with the SA fields of the received frame. + * @arg ETH_MAC_AddressFilter_DA : MAC Address is used to compare + * with the DA fields of the received frame. + * @retval : None + */ +void ETH_MACAddressFilterConfig(uint32_t MacAddr, uint32_t Filter) +{ + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS123(MacAddr)); + assert_param(IS_ETH_MAC_ADDRESS_FILTER(Filter)); + + if (Filter != ETH_MAC_AddressFilter_DA) + { + /* The selected ETHERNET MAC address is used to compare with the SA fields of the + received frame. */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) |= ETH_MACA1HR_SA; + } + else + { + /* The selected ETHERNET MAC address is used to compare with the DA fields of the + received frame. */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) &=(~(uint32_t)ETH_MACA1HR_SA); + } +} + +/** + * @brief Set the filter type for the specified ETHERNET MAC address + * @param MacAddr: specifies the ETHERNET MAC address + * This parameter can be one of the following values: + * @arg ETH_MAC_Address1 : MAC Address1 + * @arg ETH_MAC_Address2 : MAC Address2 + * @arg ETH_MAC_Address3 : MAC Address3 + * @param MaskByte: specifies the used address bytes for comparaison + * This parameter can be any combination of the following values: + * @arg ETH_MAC_AddressMask_Byte6 : Mask MAC Address high reg bits [15:8]. + * @arg ETH_MAC_AddressMask_Byte5 : Mask MAC Address high reg bits [7:0]. + * @arg ETH_MAC_AddressMask_Byte4 : Mask MAC Address low reg bits [31:24]. + * @arg ETH_MAC_AddressMask_Byte3 : Mask MAC Address low reg bits [23:16]. + * @arg ETH_MAC_AddressMask_Byte2 : Mask MAC Address low reg bits [15:8]. + * @arg ETH_MAC_AddressMask_Byte1 : Mask MAC Address low reg bits [7:0]. + * @retval : None + */ +void ETH_MACAddressMaskBytesFilterConfig(uint32_t MacAddr, uint32_t MaskByte) +{ + /* Check the parameters */ + assert_param(IS_ETH_MAC_ADDRESS123(MacAddr)); + assert_param(IS_ETH_MAC_ADDRESS_MASK(MaskByte)); + + /* Clear MBC bits in the selected MAC address high register */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) &=(~(uint32_t)ETH_MACA1HR_MBC); + /* Set the selected Filetr mask bytes */ + (*(__IO uint32_t *) (ETH_MAC_AddrHighBase + MacAddr)) |= MaskByte; +} +/*------------------------ DMA Tx/Rx Desciptors -----------------------------*/ + +/** + * @brief Initializes the DMA Tx descriptors in chain mode. + * @param DMATxDescTab: Pointer on the first Tx desc list + * @param TxBuff: Pointer on the first TxBuffer list + * @param TxBuffCount: Number of the used Tx desc in the list + * @retval : None + */ +void ETH_DMATxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t* TxBuff, uint32_t TxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMATxDesc; + + /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */ + DMATxDescToSet = DMATxDescTab; + /* Fill each DMATxDesc descriptor with the right values */ + for(i=0; i < TxBuffCount; i++) + { + /* Get the pointer on the ith member of the Tx Desc list */ + DMATxDesc = DMATxDescTab + i; + /* Set Second Address Chained bit */ + DMATxDesc->Status = ETH_DMATxDesc_TCH; + + /* Set Buffer1 address pointer */ + DMATxDesc->Buffer1Addr = (uint32_t)(&TxBuff[i*ETH_MAX_PACKET_SIZE]); + + /* Initialize the next descriptor with the Next Desciptor Polling Enable */ + if(i < (TxBuffCount-1)) + { + /* Set next descriptor address register with next descriptor base address */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t)(DMATxDescTab+i+1); + } + else + { + /* For last descriptor, set next descriptor address register equal to the first descriptor base address */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t) DMATxDescTab; + } + } + + /* Set Transmit Desciptor List Address Register */ + ETH->DMATDLAR = (uint32_t) DMATxDescTab; +} + +/** + * @brief Initializes the DMA Tx descriptors in ring mode. + * @param DMATxDescTab: Pointer on the first Tx desc list + * @param TxBuff1: Pointer on the first TxBuffer1 list + * @param TxBuff2: Pointer on the first TxBuffer2 list + * @param TxBuffCount: Number of the used Tx desc in the list + * Note: see decriptor skip length defined in ETH_DMA_InitStruct + * for the number of Words to skip between two unchained descriptors. + * @retval : None + */ +void ETH_DMATxDescRingInit(ETH_DMADESCTypeDef *DMATxDescTab, uint8_t *TxBuff1, uint8_t *TxBuff2, uint32_t TxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMATxDesc; + + /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */ + DMATxDescToSet = DMATxDescTab; + /* Fill each DMATxDesc descriptor with the right values */ + for(i=0; i < TxBuffCount; i++) + { + /* Get the pointer on the ith member of the Tx Desc list */ + DMATxDesc = DMATxDescTab + i; + /* Set Buffer1 address pointer */ + DMATxDesc->Buffer1Addr = (uint32_t)(&TxBuff1[i*ETH_MAX_PACKET_SIZE]); + + /* Set Buffer2 address pointer */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t)(&TxBuff2[i*ETH_MAX_PACKET_SIZE]); + + /* Set Transmit End of Ring bit for last descriptor: The DMA returns to the base + address of the list, creating a Desciptor Ring */ + if(i == (TxBuffCount-1)) + { + /* Set Transmit End of Ring bit */ + DMATxDesc->Status = ETH_DMATxDesc_TER; + } + } + + /* Set Transmit Desciptor List Address Register */ + ETH->DMATDLAR = (uint32_t) DMATxDescTab; +} + +/** + * @brief Checks whether the specified ETHERNET DMA Tx Desc flag is set or not. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param ETH_DMATxDescFlag: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_DMATxDesc_OWN : OWN bit: descriptor is owned by DMA engine + * @arg ETH_DMATxDesc_IC : Interrupt on completetion + * @arg ETH_DMATxDesc_LS : Last Segment + * @arg ETH_DMATxDesc_FS : First Segment + * @arg ETH_DMATxDesc_DC : Disable CRC + * @arg ETH_DMATxDesc_DP : Disable Pad + * @arg ETH_DMATxDesc_TTSE: Transmit Time Stamp Enable + * @arg ETH_DMATxDesc_TER : Transmit End of Ring + * @arg ETH_DMATxDesc_TCH : Second Address Chained + * @arg ETH_DMATxDesc_TTSS: Tx Time Stamp Status + * @arg ETH_DMATxDesc_IHE : IP Header Error + * @arg ETH_DMATxDesc_ES : Error summary + * @arg ETH_DMATxDesc_JT : Jabber Timeout + * @arg ETH_DMATxDesc_FF : Frame Flushed: DMA/MTL flushed the frame due to SW flush + * @arg ETH_DMATxDesc_PCE : Payload Checksum Error + * @arg ETH_DMATxDesc_LCA : Loss of Carrier: carrier lost during tramsmission + * @arg ETH_DMATxDesc_NC : No Carrier: no carrier signal from the tranceiver + * @arg ETH_DMATxDesc_LCO : Late Collision: transmission aborted due to collision + * @arg ETH_DMATxDesc_EC : Excessive Collision: transmission aborted after 16 collisions + * @arg ETH_DMATxDesc_VF : VLAN Frame + * @arg ETH_DMATxDesc_CC : Collision Count + * @arg ETH_DMATxDesc_ED : Excessive Deferral + * @arg ETH_DMATxDesc_UF : Underflow Error: late data arrival from the memory + * @arg ETH_DMATxDesc_DB : Deferred Bit + * @retval : The new state of ETH_DMATxDescFlag (SET or RESET). + */ +FlagStatus ETH_GetDMATxDescFlagStatus(ETH_DMADESCTypeDef *DMATxDesc, uint32_t ETH_DMATxDescFlag) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMATxDESC_GET_FLAG(ETH_DMATxDescFlag)); + + if ((DMATxDesc->Status & ETH_DMATxDescFlag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Returns the specified ETHERNET DMA Tx Desc collision count. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @retval : The Transmit descriptor collision counter value. + */ +uint32_t ETH_GetDMATxDescCollisionCount(ETH_DMADESCTypeDef *DMATxDesc) +{ + /* Return the Receive descriptor frame length */ + return ((DMATxDesc->Status & ETH_DMATxDesc_CC) >> ETH_DMATxDesc_CollisionCountShift); +} + +/** + * @brief Set the specified DMA Tx Desc Own bit. + * @param DMATxDesc: Pointer on a Tx desc + * @retval : None + */ +void ETH_SetDMATxDescOwnBit(ETH_DMADESCTypeDef *DMATxDesc) +{ + /* Set the DMA Tx Desc Own bit */ + DMATxDesc->Status |= ETH_DMATxDesc_OWN; +} + +/** + * @brief Enables or disables the specified DMA Tx Desc Transmit interrupt. + * @param DMATxDesc: Pointer on a Tx desc + * @param NewState: new state of the DMA Tx Desc transmit interrupt. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescTransmitITConfig(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA Tx Desc Transmit interrupt */ + DMATxDesc->Status |= ETH_DMATxDesc_IC; + } + else + { + /* Disable the DMA Tx Desc Transmit interrupt */ + DMATxDesc->Status &=(~(uint32_t)ETH_DMATxDesc_IC); + } +} + +/** + * @brief Enables or disables the specified DMA Tx Desc Transmit interrupt. + * @param DMATxDesc: Pointer on a Tx desc + * @param DMATxDesc_FrameSegment: specifies is the actual Tx desc contain last or first segment. + * This parameter can be one of the following values: + * @arg ETH_DMATxDesc_LastSegment : actual Tx desc contain last segment + * @arg ETH_DMATxDesc_FirstSegment : actual Tx desc contain first segment + * @retval : None + */ +void ETH_DMATxDescFrameSegmentConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_FrameSegment) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_TXDESC_SEGMENT(DMATxDesc_FrameSegment)); + + /* Selects the DMA Tx Desc Frame segment */ + DMATxDesc->Status |= DMATxDesc_FrameSegment; +} + +/** + * @brief Selects the specified ETHERNET DMA Tx Desc Checksum Insertion. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param DMATxDesc_Checksum: specifies is the DMA Tx desc checksum insertion. + * This parameter can be one of the following values: + * @arg ETH_DMATxDesc_ChecksumByPass : Checksum bypass + * @arg ETH_DMATxDesc_ChecksumIPV4Header : IPv4 header checksum + * @arg ETH_DMATxDesc_ChecksumTCPUDPICMPSegment : TCP/UDP/ICMP checksum. Pseudo header checksum is assumed to be present + * @arg ETH_DMATxDesc_ChecksumTCPUDPICMPFull : TCP/UDP/ICMP checksum fully in hardware including pseudo header + * @retval : None + */ +void ETH_DMATxDescChecksumInsertionConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t DMATxDesc_Checksum) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_TXDESC_CHECKSUM(DMATxDesc_Checksum)); + + /* Set the selected DMA Tx desc checksum insertion control */ + DMATxDesc->Status |= DMATxDesc_Checksum; +} + +/** + * @brief Enables or disables the DMA Tx Desc CRC. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc CRC. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescCRCCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc CRC */ + DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_DC); + } + else + { + /* Disable the selected DMA Tx Desc CRC */ + DMATxDesc->Status |= ETH_DMATxDesc_DC; + } +} + +/** + * @brief Enables or disables the DMA Tx Desc end of ring. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc end of ring. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc end of ring */ + DMATxDesc->Status |= ETH_DMATxDesc_TER; + } + else + { + /* Disable the selected DMA Tx Desc end of ring */ + DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_TER); + } +} + +/** + * @brief Enables or disables the DMA Tx Desc second address chained. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc second address chained. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc second address chained */ + DMATxDesc->Status |= ETH_DMATxDesc_TCH; + } + else + { + /* Disable the selected DMA Tx Desc second address chained */ + DMATxDesc->Status &=(~(uint32_t)ETH_DMATxDesc_TCH); + } +} + +/** + * @brief Enables or disables the DMA Tx Desc padding for frame shorter than 64 bytes. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc padding for + * frame shorter than 64 bytes. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescShortFramePaddingCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc padding for frame shorter than 64 bytes */ + DMATxDesc->Status &= (~(uint32_t)ETH_DMATxDesc_DP); + } + else + { + /* Disable the selected DMA Tx Desc padding for frame shorter than 64 bytes*/ + DMATxDesc->Status |= ETH_DMATxDesc_DP; + } +} + +/** + * @brief Enables or disables the DMA Tx Desc time stamp. + * @param DMATxDesc: pointer on a DMA Tx descriptor + * @param NewState: new state of the specified DMA Tx Desc time stamp. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATxDescTimeStampCmd(ETH_DMADESCTypeDef *DMATxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Tx Desc time stamp */ + DMATxDesc->Status |= ETH_DMATxDesc_TTSE; + } + else + { + /* Disable the selected DMA Tx Desc time stamp */ + DMATxDesc->Status &=(~(uint32_t)ETH_DMATxDesc_TTSE); + } +} + +/** + * @brief Configures the specified DMA Tx Desc buffer1 and buffer2 sizes. + * @param DMATxDesc: Pointer on a Tx desc + * @param BufferSize1: specifies the Tx desc buffer1 size. + * @param BufferSize2: specifies the Tx desc buffer2 size (put "0" if not used). + * @retval : None + */ +void ETH_DMATxDescBufferSizeConfig(ETH_DMADESCTypeDef *DMATxDesc, uint32_t BufferSize1, uint32_t BufferSize2) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMATxDESC_BUFFER_SIZE(BufferSize1)); + assert_param(IS_ETH_DMATxDESC_BUFFER_SIZE(BufferSize2)); + + /* Set the DMA Tx Desc buffer1 and buffer2 sizes values */ + DMATxDesc->ControlBufferSize |= (BufferSize1 | (BufferSize2 << ETH_DMATxDesc_BufferSize2Shift)); +} + +/** + * @brief Initializes the DMA Rx descriptors in chain mode. + * @param DMARxDescTab: Pointer on the first Rx desc list + * @param RxBuff: Pointer on the first RxBuffer list + * @param RxBuffCount: Number of the used Rx desc in the list + * @retval : None + */ +void ETH_DMARxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMARxDesc; + + /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */ + DMARxDescToGet = DMARxDescTab; + /* Fill each DMARxDesc descriptor with the right values */ + for(i=0; i < RxBuffCount; i++) + { + /* Get the pointer on the ith member of the Rx Desc list */ + DMARxDesc = DMARxDescTab+i; + /* Set Own bit of the Rx descriptor Status */ + DMARxDesc->Status = ETH_DMARxDesc_OWN; + + /* Set Buffer1 size and Second Address Chained bit */ + DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_MAX_PACKET_SIZE; + /* Set Buffer1 address pointer */ + DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff[i*ETH_MAX_PACKET_SIZE]); + + /* Initialize the next descriptor with the Next Desciptor Polling Enable */ + if(i < (RxBuffCount-1)) + { + /* Set next descriptor address register with next descriptor base address */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab+i+1); + } + else + { + /* For last descriptor, set next descriptor address register equal to the first descriptor base address */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab); + } + } + + /* Set Receive Desciptor List Address Register */ + ETH->DMARDLAR = (uint32_t) DMARxDescTab; +} + +/** + * @brief Initializes the DMA Rx descriptors in ring mode. + * @param DMARxDescTab: Pointer on the first Rx desc list + * @param RxBuff1: Pointer on the first RxBuffer1 list + * @param RxBuff2: Pointer on the first RxBuffer2 list + * @param RxBuffCount: Number of the used Rx desc in the list + * Note: see decriptor skip length defined in ETH_DMA_InitStruct + * for the number of Words to skip between two unchained descriptors. + * @retval : None + */ +void ETH_DMARxDescRingInit(ETH_DMADESCTypeDef *DMARxDescTab, uint8_t *RxBuff1, uint8_t *RxBuff2, uint32_t RxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMARxDesc; + /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */ + DMARxDescToGet = DMARxDescTab; + /* Fill each DMARxDesc descriptor with the right values */ + for(i=0; i < RxBuffCount; i++) + { + /* Get the pointer on the ith member of the Rx Desc list */ + DMARxDesc = DMARxDescTab+i; + /* Set Own bit of the Rx descriptor Status */ + DMARxDesc->Status = ETH_DMARxDesc_OWN; + /* Set Buffer1 size */ + DMARxDesc->ControlBufferSize = ETH_MAX_PACKET_SIZE; + /* Set Buffer1 address pointer */ + DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff1[i*ETH_MAX_PACKET_SIZE]); + + /* Set Buffer2 address pointer */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(&RxBuff2[i*ETH_MAX_PACKET_SIZE]); + + /* Set Receive End of Ring bit for last descriptor: The DMA returns to the base + address of the list, creating a Desciptor Ring */ + if(i == (RxBuffCount-1)) + { + /* Set Receive End of Ring bit */ + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_RER; + } + } + + /* Set Receive Desciptor List Address Register */ + ETH->DMARDLAR = (uint32_t) DMARxDescTab; +} + +/** + * @brief Checks whether the specified ETHERNET Rx Desc flag is set or not. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @param ETH_DMARxDescFlag: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_DMARxDesc_OWN: OWN bit: descriptor is owned by DMA engine + * @arg ETH_DMARxDesc_AFM: DA Filter Fail for the rx frame + * @arg ETH_DMARxDesc_ES: Error summary + * @arg ETH_DMARxDesc_DE: Desciptor error: no more descriptors for receive frame + * @arg ETH_DMARxDesc_SAF: SA Filter Fail for the received frame + * @arg ETH_DMARxDesc_LE: Frame size not matching with length field + * @arg ETH_DMARxDesc_OE: Overflow Error: Frame was damaged due to buffer overflow + * @arg ETH_DMARxDesc_VLAN: VLAN Tag: received frame is a VLAN frame + * @arg ETH_DMARxDesc_FS: First descriptor of the frame + * @arg ETH_DMARxDesc_LS: Last descriptor of the frame + * @arg ETH_DMARxDesc_IPV4HCE: IPC Checksum Error/Giant Frame: Rx Ipv4 header checksum error + * @arg ETH_DMARxDesc_LC: Late collision occurred during reception + * @arg ETH_DMARxDesc_FT: Frame type - Ethernet, otherwise 802.3 + * @arg ETH_DMARxDesc_RWT: Receive Watchdog Timeout: watchdog timer expired during reception + * @arg ETH_DMARxDesc_RE: Receive error: error reported by MII interface + * @arg ETH_DMARxDesc_DE: Dribble bit error: frame contains non int multiple of 8 bits + * @arg ETH_DMARxDesc_CE: CRC error + * @arg ETH_DMARxDesc_MAMPCE: Rx MAC Address/Payload Checksum Error: Rx MAC address matched/ Rx Payload Checksum Error + * @retval : The new state of ETH_DMARxDescFlag (SET or RESET). + */ +FlagStatus ETH_GetDMARxDescFlagStatus(ETH_DMADESCTypeDef *DMARxDesc, uint32_t ETH_DMARxDescFlag) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMARxDESC_GET_FLAG(ETH_DMARxDescFlag)); + if ((DMARxDesc->Status & ETH_DMARxDescFlag) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Set the specified DMA Rx Desc Own bit. + * @param DMARxDesc: Pointer on a Rx desc + * @retval : None + */ +void ETH_SetDMARxDescOwnBit(ETH_DMADESCTypeDef *DMARxDesc) +{ + /* Set the DMA Rx Desc Own bit */ + DMARxDesc->Status |= ETH_DMARxDesc_OWN; +} + +/** + * @brief Returns the specified DMA Rx Desc frame length. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @retval : The Rx descriptor received frame length. + */ +uint32_t ETH_GetDMARxDescFrameLength(ETH_DMADESCTypeDef *DMARxDesc) +{ + /* Return the Receive descriptor frame length */ + return ((DMARxDesc->Status & ETH_DMARxDesc_FL) >> ETH_DMARxDesc_FrameLengthShift); +} + +/** + * @brief Enables or disables the specified DMA Rx Desc receive interrupt. + * @param DMARxDesc: Pointer on a Rx desc + * @param NewState: new state of the specified DMA Rx Desc interrupt. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMARxDescReceiveITConfig(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA Rx Desc receive interrupt */ + DMARxDesc->ControlBufferSize &=(~(uint32_t)ETH_DMARxDesc_DIC); + } + else + { + /* Disable the DMA Rx Desc receive interrupt */ + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_DIC; + } +} + +/** + * @brief Enables or disables the DMA Rx Desc end of ring. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @param NewState: new state of the specified DMA Rx Desc end of ring. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMARxDescEndOfRingCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Rx Desc end of ring */ + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_RER; + } + else + { + /* Disable the selected DMA Rx Desc end of ring */ + DMARxDesc->ControlBufferSize &=(~(uint32_t)ETH_DMARxDesc_RER); + } +} + +/** + * @brief Enables or disables the DMA Rx Desc second address chained. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @param NewState: new state of the specified DMA Rx Desc second address chained. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMARxDescSecondAddressChainedCmd(ETH_DMADESCTypeDef *DMARxDesc, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected DMA Rx Desc second address chained */ + DMARxDesc->ControlBufferSize |= ETH_DMARxDesc_RCH; + } + else + { + /* Disable the selected DMA Rx Desc second address chained */ + DMARxDesc->ControlBufferSize &=(~(uint32_t)ETH_DMARxDesc_RCH); + } +} + +/** + * @brief Returns the specified ETHERNET DMA Rx Desc buffer size. + * @param DMARxDesc: pointer on a DMA Rx descriptor + * @param DMARxDesc_Buffer: specifies the DMA Rx Desc buffer. + * This parameter can be any one of the following values: + * @arg ETH_DMARxDesc_Buffer1 : DMA Rx Desc Buffer1 + * @arg ETH_DMARxDesc_Buffer2 : DMA Rx Desc Buffer2 + * @retval : The Receive descriptor frame length. + */ +uint32_t ETH_GetDMARxDescBufferSize(ETH_DMADESCTypeDef *DMARxDesc, uint32_t DMARxDesc_Buffer) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_RXDESC_BUFFER(DMARxDesc_Buffer)); + + if(DMARxDesc_Buffer != ETH_DMARxDesc_Buffer1) + { + /* Return the DMA Rx Desc buffer2 size */ + return ((DMARxDesc->ControlBufferSize & ETH_DMARxDesc_RBS2) >> ETH_DMARxDesc_Buffer2SizeShift); + } + else + { + /* Return the DMA Rx Desc buffer1 size */ + return (DMARxDesc->ControlBufferSize & ETH_DMARxDesc_RBS1); + } +} + +/*--------------------------------- DMA ------------------------------------*/ +/** + * @brief Resets all MAC subsystem internal registers and logic. + * @param None + * @retval : None + */ +void ETH_SoftwareReset(void) +{ + /* Set the SWR bit: resets all MAC subsystem internal registers and logic */ + /* After reset all the registers holds their respective reset values */ + ETH->DMABMR |= ETH_DMABMR_SR; +} + +/** + * @brief Checks whether the ETHERNET software reset bit is set or not. + * @param None + * @retval : The new state of DMA Bus Mode register SR bit (SET or RESET). + */ +FlagStatus ETH_GetSoftwareResetStatus(void) +{ + FlagStatus bitstatus = RESET; + if((ETH->DMABMR & ETH_DMABMR_SR) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Checks whether the specified ETHERNET DMA flag is set or not. + * @param ETH_DMA_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_DMA_FLAG_TST : Time-stamp trigger flag + * @arg ETH_DMA_FLAG_PMT : PMT flag + * @arg ETH_DMA_FLAG_MMC : MMC flag + * @arg ETH_DMA_FLAG_DataTransferError : Error bits 0-data buffer, 1-desc. access + * @arg ETH_DMA_FLAG_ReadWriteError : Error bits 0-write trnsf, 1-read transfr + * @arg ETH_DMA_FLAG_AccessError : Error bits 0-Rx DMA, 1-Tx DMA + * @arg ETH_DMA_FLAG_NIS : Normal interrupt summary flag + * @arg ETH_DMA_FLAG_AIS : Abnormal interrupt summary flag + * @arg ETH_DMA_FLAG_ER : Early receive flag + * @arg ETH_DMA_FLAG_FBE : Fatal bus error flag + * @arg ETH_DMA_FLAG_ET : Early transmit flag + * @arg ETH_DMA_FLAG_RWT : Receive watchdog timeout flag + * @arg ETH_DMA_FLAG_RPS : Receive process stopped flag + * @arg ETH_DMA_FLAG_RBU : Receive buffer unavailable flag + * @arg ETH_DMA_FLAG_R : Receive flag + * @arg ETH_DMA_FLAG_TU : Underflow flag + * @arg ETH_DMA_FLAG_RO : Overflow flag + * @arg ETH_DMA_FLAG_TJT : Transmit jabber timeout flag + * @arg ETH_DMA_FLAG_TBU : Transmit buffer unavailable flag + * @arg ETH_DMA_FLAG_TPS : Transmit process stopped flag + * @arg ETH_DMA_FLAG_T : Transmit flag + * @retval : The new state of ETH_DMA_FLAG (SET or RESET). + */ +FlagStatus ETH_GetDMAFlagStatus(uint32_t ETH_DMA_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMA_GET_IT(ETH_DMA_FLAG)); + if ((ETH->DMASR & ETH_DMA_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the ETHERNET’s DMA pending flag. + * @param ETH_DMA_FLAG: specifies the flag to clear. + * This parameter can be any combination of the following values: + * @arg ETH_DMA_FLAG_NIS : Normal interrupt summary flag + * @arg ETH_DMA_FLAG_AIS : Abnormal interrupt summary flag + * @arg ETH_DMA_FLAG_ER : Early receive flag + * @arg ETH_DMA_FLAG_FBE : Fatal bus error flag + * @arg ETH_DMA_FLAG_ETI : Early transmit flag + * @arg ETH_DMA_FLAG_RWT : Receive watchdog timeout flag + * @arg ETH_DMA_FLAG_RPS : Receive process stopped flag + * @arg ETH_DMA_FLAG_RBU : Receive buffer unavailable flag + * @arg ETH_DMA_FLAG_R : Receive flag + * @arg ETH_DMA_FLAG_TU : Transmit Underflow flag + * @arg ETH_DMA_FLAG_RO : Receive Overflow flag + * @arg ETH_DMA_FLAG_TJT : Transmit jabber timeout flag + * @arg ETH_DMA_FLAG_TBU : Transmit buffer unavailable flag + * @arg ETH_DMA_FLAG_TPS : Transmit process stopped flag + * @arg ETH_DMA_FLAG_T : Transmit flag + * @retval : None + */ +void ETH_DMAClearFlag(uint32_t ETH_DMA_FLAG) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_FLAG(ETH_DMA_FLAG)); + + /* Clear the selected ETHERNET DMA FLAG */ + ETH->DMASR = (uint32_t) ETH_DMA_FLAG; +} + +/** + * @brief Checks whether the specified ETHERNET DMA interrupt has occured or not. + * @param ETH_DMA_IT: specifies the interrupt source to check. + * This parameter can be one of the following values: + * @arg ETH_DMA_IT_TST : Time-stamp trigger interrupt + * @arg ETH_DMA_IT_PMT : PMT interrupt + * @arg ETH_DMA_IT_MMC : MMC interrupt + * @arg ETH_DMA_IT_NIS : Normal interrupt summary + * @arg ETH_DMA_IT_AIS : Abnormal interrupt summary + * @arg ETH_DMA_IT_ER : Early receive interrupt + * @arg ETH_DMA_IT_FBE : Fatal bus error interrupt + * @arg ETH_DMA_IT_ET : Early transmit interrupt + * @arg ETH_DMA_IT_RWT : Receive watchdog timeout interrupt + * @arg ETH_DMA_IT_RPS : Receive process stopped interrupt + * @arg ETH_DMA_IT_RBU : Receive buffer unavailable interrupt + * @arg ETH_DMA_IT_R : Receive interrupt + * @arg ETH_DMA_IT_TU : Underflow interrupt + * @arg ETH_DMA_IT_RO : Overflow interrupt + * @arg ETH_DMA_IT_TJT : Transmit jabber timeout interrupt + * @arg ETH_DMA_IT_TBU : Transmit buffer unavailable interrupt + * @arg ETH_DMA_IT_TPS : Transmit process stopped interrupt + * @arg ETH_DMA_IT_T : Transmit interrupt + * @retval : The new state of ETH_DMA_IT (SET or RESET). + */ +ITStatus ETH_GetDMAITStatus(uint32_t ETH_DMA_IT) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMA_GET_IT(ETH_DMA_IT)); + if ((ETH->DMASR & ETH_DMA_IT) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Clears the ETHERNET’s DMA IT pending bit. + * @param ETH_DMA_IT: specifies the interrupt pending bit to clear. + * This parameter can be any combination of the following values: + * @arg ETH_DMA_IT_NIS : Normal interrupt summary + * @arg ETH_DMA_IT_AIS : Abnormal interrupt summary + * @arg ETH_DMA_IT_ER : Early receive interrupt + * @arg ETH_DMA_IT_FBE : Fatal bus error interrupt + * @arg ETH_DMA_IT_ETI : Early transmit interrupt + * @arg ETH_DMA_IT_RWT : Receive watchdog timeout interrupt + * @arg ETH_DMA_IT_RPS : Receive process stopped interrupt + * @arg ETH_DMA_IT_RBU : Receive buffer unavailable interrupt + * @arg ETH_DMA_IT_R : Receive interrupt + * @arg ETH_DMA_IT_TU : Transmit Underflow interrupt + * @arg ETH_DMA_IT_RO : Receive Overflow interrupt + * @arg ETH_DMA_IT_TJT : Transmit jabber timeout interrupt + * @arg ETH_DMA_IT_TBU : Transmit buffer unavailable interrupt + * @arg ETH_DMA_IT_TPS : Transmit process stopped interrupt + * @arg ETH_DMA_IT_T : Transmit interrupt + * @retval : None + */ +void ETH_DMAClearITPendingBit(uint32_t ETH_DMA_IT) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_IT(ETH_DMA_IT)); + + /* Clear the selected ETHERNET DMA IT */ + ETH->DMASR = (uint32_t) ETH_DMA_IT; +} + +/** + * @brief Returns the ETHERNET DMA Transmit Process State. + * @param None + * @retval : The new ETHERNET DMA Transmit Process State: + * This can be one of the following values: + * - ETH_DMA_TransmitProcess_Stopped : Stopped - Reset or Stop Tx Command issued + * - ETH_DMA_TransmitProcess_Fetching : Running - fetching the Tx descriptor + * - ETH_DMA_TransmitProcess_Waiting : Running - waiting for status + * - ETH_DMA_TransmitProcess_Reading : unning - reading the data from host memory + * - ETH_DMA_TransmitProcess_Suspended : Suspended - Tx Desciptor unavailabe + * - ETH_DMA_TransmitProcess_Closing : Running - closing Rx descriptor + */ +uint32_t ETH_GetTransmitProcessState(void) +{ + return ((uint32_t)(ETH->DMASR & ETH_DMASR_TS)); +} + +/** + * @brief Returns the ETHERNET DMA Receive Process State. + * @param None + * @retval : The new ETHERNET DMA Receive Process State: + * This can be one of the following values: + * - ETH_DMA_ReceiveProcess_Stopped : Stopped - Reset or Stop Rx Command issued + * - ETH_DMA_ReceiveProcess_Fetching : Running - fetching the Rx descriptor + * - ETH_DMA_ReceiveProcess_Waiting : Running - waiting for packet + * - ETH_DMA_ReceiveProcess_Suspended : Suspended - Rx Desciptor unavailable + * - ETH_DMA_ReceiveProcess_Closing : Running - closing descriptor + * - ETH_DMA_ReceiveProcess_Queuing : Running - queuing the recieve frame into host memory + */ +uint32_t ETH_GetReceiveProcessState(void) +{ + return ((uint32_t)(ETH->DMASR & ETH_DMASR_RS)); +} + +/** + * @brief Clears the ETHERNET transmit FIFO. + * @param None + * @retval : None + */ +void ETH_FlushTransmitFIFO(void) +{ + /* Set the Flush Transmit FIFO bit */ + ETH->DMAOMR |= ETH_DMAOMR_FTF; +} + +/** + * @brief Checks whether the ETHERNET transmit FIFO bit is cleared or not. + * @param None + * @retval : The new state of ETHERNET flush transmit FIFO bit (SET or RESET). + */ +FlagStatus ETH_GetFlushTransmitFIFOStatus(void) +{ + FlagStatus bitstatus = RESET; + if ((ETH->DMAOMR & ETH_DMAOMR_FTF) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Enables or disables the DMA transmission. + * @param NewState: new state of the DMA transmission. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMATransmissionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA transmission */ + ETH->DMAOMR |= ETH_DMAOMR_ST; + } + else + { + /* Disable the DMA transmission */ + ETH->DMAOMR &= ~ETH_DMAOMR_ST; + } +} + +/** + * @brief Enables or disables the DMA reception. + * @param NewState: new state of the DMA reception. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMAReceptionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the DMA reception */ + ETH->DMAOMR |= ETH_DMAOMR_SR; + } + else + { + /* Disable the DMA reception */ + ETH->DMAOMR &= ~ETH_DMAOMR_SR; + } +} + +/** + * @brief Enables or disables the specified ETHERNET DMA interrupts. + * @param ETH_DMA_IT: specifies the ETHERNET DMA interrupt sources to be + * enabled or disabled. + * This parameter can be any combination of the following values: + * @arg ETH_DMA_IT_NIS : Normal interrupt summary + * @arg ETH_DMA_IT_AIS : Abnormal interrupt summary + * @arg ETH_DMA_IT_ER : Early receive interrupt + * @arg ETH_DMA_IT_FBE : Fatal bus error interrupt + * @arg ETH_DMA_IT_ET : Early transmit interrupt + * @arg ETH_DMA_IT_RWT : Receive watchdog timeout interrupt + * @arg ETH_DMA_IT_RPS : Receive process stopped interrupt + * @arg ETH_DMA_IT_RBU : Receive buffer unavailable interrupt + * @arg ETH_DMA_IT_R : Receive interrupt + * @arg ETH_DMA_IT_TU : Underflow interrupt + * @arg ETH_DMA_IT_RO : Overflow interrupt + * @arg ETH_DMA_IT_TJT : Transmit jabber timeout interrupt + * @arg ETH_DMA_IT_TBU : Transmit buffer unavailable interrupt + * @arg ETH_DMA_IT_TPS : Transmit process stopped interrupt + * @arg ETH_DMA_IT_T : Transmit interrupt + * @param NewState: new state of the specified ETHERNET DMA interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_DMAITConfig(uint32_t ETH_DMA_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ETH_DMA_IT(ETH_DMA_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET DMA interrupts */ + ETH->DMAIER |= ETH_DMA_IT; + } + else + { + /* Disable the selected ETHERNET DMA interrupts */ + ETH->DMAIER &=(~(uint32_t)ETH_DMA_IT); + } +} + +/** + * @brief Checks whether the specified ETHERNET DMA overflow flag is set or not. + * @param ETH_DMA_Overflow: specifies the DMA overflow flag to check. + * This parameter can be one of the following values: + * @arg ETH_DMA_Overflow_RxFIFOCounter : Overflow for FIFO Overflow Counter + * @arg ETH_DMA_Overflow_MissedFrameCounter : Overflow for Missed Frame Counter + * @retval : The new state of ETHERNET DMA overflow Flag (SET or RESET). + */ +FlagStatus ETH_GetDMAOverflowStatus(uint32_t ETH_DMA_Overflow) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_DMA_GET_OVERFLOW(ETH_DMA_Overflow)); + + if ((ETH->DMAMFBOCR & ETH_DMA_Overflow) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Get the ETHERNET DMA Rx Overflow Missed Frame Counter value. + * @param None + * @retval : The value of Rx overflow Missed Frame Counter. + */ +uint32_t ETH_GetRxOverflowMissedFrameCounter(void) +{ + return ((uint32_t)((ETH->DMAMFBOCR & ETH_DMAMFBOCR_MFA)>>ETH_DMA_RxOverflowMissedFramesCounterShift)); +} + +/** + * @brief Get the ETHERNET DMA Buffer Unavailable Missed Frame Counter value. + * @param None + * @retval : The value of Buffer unavailable Missed Frame Counter. + */ +uint32_t ETH_GetBufferUnavailableMissedFrameCounter(void) +{ + return ((uint32_t)(ETH->DMAMFBOCR) & ETH_DMAMFBOCR_MFC); +} + +/** + * @brief Get the ETHERNET DMA DMACHTDR register value. + * @param None + * @retval : The value of the current Tx desc start address. + */ +uint32_t ETH_GetCurrentTxDescStartAddress(void) +{ + return ((uint32_t)(ETH->DMACHTDR)); +} + +/** + * @brief Get the ETHERNET DMA DMACHRDR register value. + * @param None + * @retval : The value of the current Rx desc start address. + */ +uint32_t ETH_GetCurrentRxDescStartAddress(void) +{ + return ((uint32_t)(ETH->DMACHRDR)); +} + +/** + * @brief Get the ETHERNET DMA DMACHTBAR register value. + * @param None + * @retval : The value of the current Tx desc buffer address. + */ +uint32_t ETH_GetCurrentTxBufferAddress(void) +{ + return ((uint32_t)(ETH->DMACHTBAR)); +} + +/** + * @brief Get the ETHERNET DMA DMACHRBAR register value. + * @param None + * @retval : The value of the current Rx desc buffer address. + */ +uint32_t ETH_GetCurrentRxBufferAddress(void) +{ + return ((uint32_t)(ETH->DMACHRBAR)); +} + +/** + * @brief Resumes the DMA Transmission by writing to the DmaTxPollDemand + * register: (the data written could be anything). This forces + * the DMA to resume transmission. + * @param None + * @retval : None. + */ +void ETH_ResumeDMATransmission(void) +{ + ETH->DMATPDR = 0; +} + +/** + * @brief Resumes the DMA Transmission by writing to the DmaRxPollDemand + * register: (the data written could be anything). This forces + * the DMA to resume reception. + * @param None + * @retval : None. + */ +void ETH_ResumeDMAReception(void) +{ + ETH->DMARPDR = 0; +} + +/*--------------------------------- PMT ------------------------------------*/ +/** + * @brief Reset Wakeup frame filter register pointer. + * @param None + * @retval : None + */ +void ETH_ResetWakeUpFrameFilterRegisterPointer(void) +{ + /* Resets the Remote Wake-up Frame Filter register pointer to 0x0000 */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_WFFRPR; +} + +/** + * @brief Populates the remote wakeup frame registers. + * @param Buffer: Pointer on remote WakeUp Frame Filter Register buffer + * data (8 words). + * @retval : None + */ +void ETH_SetWakeUpFrameFilterRegister(uint32_t *Buffer) +{ + uint32_t i = 0; + + /* Fill Remote Wake-up Frame Filter register with Buffer data */ + for(i =0; iMACRWUFFR = Buffer[i]; + } +} + +/** + * @brief Enables or disables any unicast packet filtered by the MAC + * (DAF) address recognition to be a wake-up frame. + * @param NewState: new state of the MAC Global Unicast Wake-Up. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_GlobalUnicastWakeUpCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC Global Unicast Wake-Up */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_GU; + } + else + { + /* Disable the MAC Global Unicast Wake-Up */ + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_GU; + } +} + +/** + * @brief Checks whether the specified ETHERNET PMT flag is set or not. + * @param ETH_PMT_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_PMT_FLAG_WUFFRPR : Wake-Up Frame Filter Register Poniter Reset + * @arg ETH_PMT_FLAG_WUFR : Wake-Up Frame Received + * @arg ETH_PMT_FLAG_MPR : Magic Packet Received + * @retval : The new state of ETHERNET PMT Flag (SET or RESET). + */ +FlagStatus ETH_GetPMTFlagStatus(uint32_t ETH_PMT_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_PMT_GET_FLAG(ETH_PMT_FLAG)); + + if ((ETH->MACPMTCSR & ETH_PMT_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Enables or disables the MAC Wake-Up Frame Detection. + * @param NewState: new state of the MAC Wake-Up Frame Detection. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_WakeUpFrameDetectionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC Wake-Up Frame Detection */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_WFE; + } + else + { + /* Disable the MAC Wake-Up Frame Detection */ + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_WFE; + } +} + +/** + * @brief Enables or disables the MAC Magic Packet Detection. + * @param NewState: new state of the MAC Magic Packet Detection. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MagicPacketDetectionCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC Magic Packet Detection */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_MPE; + } + else + { + /* Disable the MAC Magic Packet Detection */ + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_MPE; + } +} + +/** + * @brief Enables or disables the MAC Power Down. + * @param NewState: new state of the MAC Power Down. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_PowerDownCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MAC Power Down */ + /* This puts the MAC in power down mode */ + ETH->MACPMTCSR |= ETH_MACPMTCSR_PD; + } + else + { + /* Disable the MAC Power Down */ + ETH->MACPMTCSR &= ~ETH_MACPMTCSR_PD; + } +} + +/*--------------------------------- MMC ------------------------------------*/ +/** + * @brief Enables or disables the MMC Counter Freeze. + * @param NewState: new state of the MMC Counter Freeze. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MMCCounterFreezeCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MMC Counter Freeze */ + ETH->MMCCR |= ETH_MMCCR_MCF; + } + else + { + /* Disable the MMC Counter Freeze */ + ETH->MMCCR &= ~ETH_MMCCR_MCF; + } +} + +/** + * @brief Enables or disables the MMC Reset On Read. + * @param NewState: new state of the MMC Reset On Read. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MMCResetOnReadCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the MMC Counter reset on read */ + ETH->MMCCR |= ETH_MMCCR_ROR; + } + else + { + /* Disable the MMC Counter reset on read */ + ETH->MMCCR &= ~ETH_MMCCR_ROR; + } +} + +/** + * @brief Enables or disables the MMC Counter Stop Rollover. + * @param NewState: new state of the MMC Counter Stop Rollover. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MMCCounterRolloverCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Disable the MMC Counter Stop Rollover */ + ETH->MMCCR &= ~ETH_MMCCR_CSR; + } + else + { + /* Enable the MMC Counter Stop Rollover */ + ETH->MMCCR |= ETH_MMCCR_CSR; + } +} + +/** + * @brief Resets the MMC Counters. + * @param None + * @retval : None + */ +void ETH_MMCCountersReset(void) +{ + /* Resets the MMC Counters */ + ETH->MMCCR |= ETH_MMCCR_CR; +} + +/** + * @brief Enables or disables the specified ETHERNET MMC interrupts. + * @param ETH_MMC_IT: specifies the ETHERNET MMC interrupt + * sources to be enabled or disabled. + * This parameter can be any combination of Tx interrupt or + * any combination of Rx interrupt (but not both)of the following values: + * @arg ETH_MMC_IT_TGF : When Tx good frame counter reaches half the maximum value + * @arg ETH_MMC_IT_TGFMSC: When Tx good multi col counter reaches half the maximum value + * @arg ETH_MMC_IT_TGFSC : When Tx good single col counter reaches half the maximum value + * @arg ETH_MMC_IT_RGUF : When Rx good unicast frames counter reaches half the maximum value + * @arg ETH_MMC_IT_RFAE : When Rx alignment error counter reaches half the maximum value + * @arg ETH_MMC_IT_RFCE : When Rx crc error counter reaches half the maximum value + * @param NewState: new state of the specified ETHERNET MMC interrupts. + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_MMCITConfig(uint32_t ETH_MMC_IT, FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_ETH_MMC_IT(ETH_MMC_IT)); + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if ((ETH_MMC_IT & (uint32_t)0x10000000) != (uint32_t)RESET) + { + /* Remove egister mak from IT */ + ETH_MMC_IT &= 0xEFFFFFFF; + + /* ETHERNET MMC Rx interrupts selected */ + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET MMC interrupts */ + ETH->MMCRIMR &=(~(uint32_t)ETH_MMC_IT); + } + else + { + /* Disable the selected ETHERNET MMC interrupts */ + ETH->MMCRIMR |= ETH_MMC_IT; + } + } + else + { + /* ETHERNET MMC Tx interrupts selected */ + if (NewState != DISABLE) + { + /* Enable the selected ETHERNET MMC interrupts */ + ETH->MMCTIMR &=(~(uint32_t)ETH_MMC_IT); + } + else + { + /* Disable the selected ETHERNET MMC interrupts */ + ETH->MMCTIMR |= ETH_MMC_IT; + } + } +} + +/** + * @brief Checks whether the specified ETHERNET MMC IT is set or not. + * @param ETH_MMC_IT: specifies the ETHERNET MMC interrupt. + * This parameter can be one of the following values: + * @arg ETH_MMC_IT_TxFCGC: When Tx good frame counter reaches half the maximum value + * @arg ETH_MMC_IT_TxMCGC: When Tx good multi col counter reaches half the maximum value + * @arg ETH_MMC_IT_TxSCGC: When Tx good single col counter reaches half the maximum value + * @arg ETH_MMC_IT_RxUGFC: When Rx good unicast frames counter reaches half the maximum value + * @arg ETH_MMC_IT_RxAEC : When Rx alignment error counter reaches half the maximum value + * @arg ETH_MMC_IT_RxCEC : When Rx crc error counter reaches half the maximum value + * @retval : The value of ETHERNET MMC IT (SET or RESET). + */ +ITStatus ETH_GetMMCITStatus(uint32_t ETH_MMC_IT) +{ + ITStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_MMC_GET_IT(ETH_MMC_IT)); + + if ((ETH_MMC_IT & (uint32_t)0x10000000) != (uint32_t)RESET) + { + /* ETHERNET MMC Rx interrupts selected */ + /* Check if the ETHERNET MMC Rx selected interrupt is enabled and occured */ + if ((((ETH->MMCRIR & ETH_MMC_IT) != (uint32_t)RESET)) && ((ETH->MMCRIMR & ETH_MMC_IT) != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + else + { + /* ETHERNET MMC Tx interrupts selected */ + /* Check if the ETHERNET MMC Tx selected interrupt is enabled and occured */ + if ((((ETH->MMCTIR & ETH_MMC_IT) != (uint32_t)RESET)) && ((ETH->MMCRIMR & ETH_MMC_IT) != (uint32_t)RESET)) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + } + + return bitstatus; +} + +/** + * @brief Get the specified ETHERNET MMC register value. + * @param ETH_MMCReg: specifies the ETHERNET MMC register. + * This parameter can be one of the following values: + * @arg ETH_MMCCR : MMC CR register + * @arg ETH_MMCRIR : MMC RIR register + * @arg ETH_MMCTIR : MMC TIR register + * @arg ETH_MMCRIMR : MMC RIMR register + * @arg ETH_MMCTIMR : MMC TIMR register + * @arg ETH_MMCTGFSCCR : MMC TGFSCCR register + * @arg ETH_MMCTGFMSCCR: MMC TGFMSCCR register + * @arg ETH_MMCTGFCR : MMC TGFCR register + * @arg ETH_MMCRFCECR : MMC RFCECR register + * @arg ETH_MMCRFAECR : MMC RFAECR register + * @arg ETH_MMCRGUFCR : MMC RGUFCRregister + * @retval : The value of ETHERNET MMC Register value. + */ +uint32_t ETH_GetMMCRegister(uint32_t ETH_MMCReg) +{ + /* Check the parameters */ + assert_param(IS_ETH_MMC_REGISTER(ETH_MMCReg)); + + /* Return the selected register value */ + return (*(__IO uint32_t *)(ETH_MAC_BASE + ETH_MMCReg)); +} +/*--------------------------------- PTP ------------------------------------*/ + +/** + * @brief Updated the PTP block for fine correction with the Time Stamp + * Addend register value. + * @param None + * @retval : None + */ +void ETH_EnablePTPTimeStampAddend(void) +{ + /* Enable the PTP block update with the Time Stamp Addend register value */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSARU; +} + +/** + * @brief Enable the PTP Time Stamp interrupt trigger + * @param None + * @retval : None + */ +void ETH_EnablePTPTimeStampInterruptTrigger(void) +{ + /* Enable the PTP target time interrupt */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSITE; +} + +/** + * @brief Updated the PTP system time with the Time Stamp Update register + * value. + * @param None + * @retval : None + */ +void ETH_EnablePTPTimeStampUpdate(void) +{ + /* Enable the PTP system time update with the Time Stamp Update register value */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSSTU; +} + +/** + * @brief Initialize the PTP Time Stamp + * @param None + * @retval : None + */ +void ETH_InitializePTPTimeStamp(void) +{ + /* Initialize the PTP Time Stamp */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSSTI; +} + +/** + * @brief Selects the PTP Update method + * @param UpdateMethod: the PTP Update method + * This parameter can be one of the following values: + * @arg ETH_PTP_FineUpdate : Fine Update method + * @arg ETH_PTP_CoarseUpdate : Coarse Update method + * @retval : None + */ +void ETH_PTPUpdateMethodConfig(uint32_t UpdateMethod) +{ + /* Check the parameters */ + assert_param(IS_ETH_PTP_UPDATE(UpdateMethod)); + + if (UpdateMethod != ETH_PTP_CoarseUpdate) + { + /* Enable the PTP Fine Update method */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSFCU; + } + else + { + /* Disable the PTP Coarse Update method */ + ETH->PTPTSCR &= (~(uint32_t)ETH_PTPTSCR_TSFCU); + } +} + +/** + * @brief Enables or disables the PTP time stamp for transmit and receive frames. + * @param NewState: new state of the PTP time stamp for transmit and receive frames + * This parameter can be: ENABLE or DISABLE. + * @retval : None + */ +void ETH_PTPTimeStampCmd(FunctionalState NewState) +{ + /* Check the parameters */ + assert_param(IS_FUNCTIONAL_STATE(NewState)); + + if (NewState != DISABLE) + { + /* Enable the PTP time stamp for transmit and receive frames */ + ETH->PTPTSCR |= ETH_PTPTSCR_TSE; + } + else + { + /* Disable the PTP time stamp for transmit and receive frames */ + ETH->PTPTSCR &= (~(uint32_t)ETH_PTPTSCR_TSE); + } +} + +/** + * @brief Checks whether the specified ETHERNET PTP flag is set or not. + * @param ETH_PTP_FLAG: specifies the flag to check. + * This parameter can be one of the following values: + * @arg ETH_PTP_FLAG_TSARU : Addend Register Update + * @arg ETH_PTP_FLAG_TSITE : Time Stamp Interrupt Trigger Enable + * @arg ETH_PTP_FLAG_TSSTU : Time Stamp Update + * @arg ETH_PTP_FLAG_TSSTI : Time Stamp Initialize + * @retval : The new state of ETHERNET PTP Flag (SET or RESET). + */ +FlagStatus ETH_GetPTPFlagStatus(uint32_t ETH_PTP_FLAG) +{ + FlagStatus bitstatus = RESET; + /* Check the parameters */ + assert_param(IS_ETH_PTP_GET_FLAG(ETH_PTP_FLAG)); + + if ((ETH->PTPTSCR & ETH_PTP_FLAG) != (uint32_t)RESET) + { + bitstatus = SET; + } + else + { + bitstatus = RESET; + } + return bitstatus; +} + +/** + * @brief Sets the system time Sub-Second Increment value. + * @param SubSecondValue: specifies the PTP Sub-Second Increment Register value. + * @retval : None + */ +void ETH_SetPTPSubSecondIncrement(uint32_t SubSecondValue) +{ + /* Check the parameters */ + assert_param(IS_ETH_PTP_SUBSECOND_INCREMENT(SubSecondValue)); + /* Set the PTP Sub-Second Increment Register */ + ETH->PTPSSIR = SubSecondValue; +} + +/** + * @brief Sets the Time Stamp update sign and values. + * @param Sign: specifies the PTP Time update value sign. + * This parameter can be one of the following values: + * @arg ETH_PTP_PositiveTime : positive time value. + * @arg ETH_PTP_NegativeTime : negative time value. + * @param SecondValue: specifies the PTP Time update second value. + * @param SubSecondValue: specifies the PTP Time update sub-second value. + * this is a 31 bit value. bit32 correspond to the sign. + * @retval : None + */ +void ETH_SetPTPTimeStampUpdate(uint32_t Sign, uint32_t SecondValue, uint32_t SubSecondValue) +{ + /* Check the parameters */ + assert_param(IS_ETH_PTP_TIME_SIGN(Sign)); + assert_param(IS_ETH_PTP_TIME_STAMP_UPDATE_SUBSECOND(SubSecondValue)); + /* Set the PTP Time Update High Register */ + ETH->PTPTSHUR = SecondValue; + + /* Set the PTP Time Update Low Register with sign */ + ETH->PTPTSLUR = Sign | SubSecondValue; +} + +/** + * @brief Sets the Time Stamp Addend value. + * @param Value: specifies the PTP Time Stamp Addend Register value. + * @retval : None + */ +void ETH_SetPTPTimeStampAddend(uint32_t Value) +{ + /* Set the PTP Time Stamp Addend Register */ + ETH->PTPTSAR = Value; +} + +/** + * @brief Sets the Target Time registers values. + * @param HighValue: specifies the PTP Target Time High Register value. + * @param LowValue: specifies the PTP Target Time Low Register value. + * @retval : None + */ +void ETH_SetPTPTargetTime(uint32_t HighValue, uint32_t LowValue) +{ + /* Set the PTP Target Time High Register */ + ETH->PTPTTHR = HighValue; + /* Set the PTP Target Time Low Register */ + ETH->PTPTTLR = LowValue; +} + +/** + * @brief Get the specified ETHERNET PTP register value. + * @param ETH_PTPReg: specifies the ETHERNET PTP register. + * This parameter can be one of the following values: + * @arg ETH_PTPTSCR : Sub-Second Increment Register + * @arg ETH_PTPSSIR : Sub-Second Increment Register + * @arg ETH_PTPTSHR : Time Stamp High Register + * @arg ETH_PTPTSLR : Time Stamp Low Register + * @arg ETH_PTPTSHUR : Time Stamp High Update Register + * @arg ETH_PTPTSLUR : Time Stamp Low Update Register + * @arg ETH_PTPTSAR : Time Stamp Addend Register + * @arg ETH_PTPTTHR : Target Time High Register + * @arg ETH_PTPTTLR : Target Time Low Register + * @retval : The value of ETHERNET PTP Register value. + */ +uint32_t ETH_GetPTPRegister(uint32_t ETH_PTPReg) +{ + /* Check the parameters */ + assert_param(IS_ETH_PTP_REGISTER(ETH_PTPReg)); + + /* Return the selected register value */ + return (*(__IO uint32_t *)(ETH_MAC_BASE + ETH_PTPReg)); +} + +/** + * @brief Initializes the DMA Tx descriptors in chain mode with PTP. + * @param DMATxDescTab: Pointer on the first Tx desc list + * @param DMAPTPTxDescTab: Pointer on the first PTP Tx desc list + * @param TxBuff: Pointer on the first TxBuffer list + * @param TxBuffCount: Number of the used Tx desc in the list + * @retval : None + */ +void ETH_DMAPTPTxDescChainInit(ETH_DMADESCTypeDef *DMATxDescTab, ETH_DMADESCTypeDef *DMAPTPTxDescTab, uint8_t* TxBuff, uint32_t TxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMATxDesc; + + /* Set the DMATxDescToSet pointer with the first one of the DMATxDescTab list */ + DMATxDescToSet = DMATxDescTab; + DMAPTPTxDescToSet = DMAPTPTxDescTab; + /* Fill each DMATxDesc descriptor with the right values */ + for(i=0; i < TxBuffCount; i++) + { + /* Get the pointer on the ith member of the Tx Desc list */ + DMATxDesc = DMATxDescTab+i; + /* Set Second Address Chained bit and enable PTP */ + DMATxDesc->Status = ETH_DMATxDesc_TCH | ETH_DMATxDesc_TTSE; + + /* Set Buffer1 address pointer */ + DMATxDesc->Buffer1Addr =(uint32_t)(&TxBuff[i*ETH_MAX_PACKET_SIZE]); + + /* Initialize the next descriptor with the Next Desciptor Polling Enable */ + if(i < (TxBuffCount-1)) + { + /* Set next descriptor address register with next descriptor base address */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t)(DMATxDescTab+i+1); + } + else + { + /* For last descriptor, set next descriptor address register equal to the first descriptor base address */ + DMATxDesc->Buffer2NextDescAddr = (uint32_t) DMATxDescTab; + } + /* make DMAPTPTxDescTab points to the same addresses as DMATxDescTab */ + (&DMAPTPTxDescTab[i])->Buffer1Addr = DMATxDesc->Buffer1Addr; + (&DMAPTPTxDescTab[i])->Buffer2NextDescAddr = DMATxDesc->Buffer2NextDescAddr; + } + /* Store on the last DMAPTPTxDescTab desc status record the first list address */ + (&DMAPTPTxDescTab[i-1])->Status = (uint32_t) DMAPTPTxDescTab; + + /* Set Transmit Desciptor List Address Register */ + ETH->DMATDLAR = (uint32_t) DMATxDescTab; +} + +/** + * @brief Initializes the DMA Rx descriptors in chain mode. + * @param DMARxDescTab: Pointer on the first Rx desc list + * @param DMAPTPRxDescTab: Pointer on the first PTP Rx desc list + * @param RxBuff: Pointer on the first RxBuffer list + * @param RxBuffCount: Number of the used Rx desc in the list + * @retval : None + */ +void ETH_DMAPTPRxDescChainInit(ETH_DMADESCTypeDef *DMARxDescTab, ETH_DMADESCTypeDef *DMAPTPRxDescTab, uint8_t *RxBuff, uint32_t RxBuffCount) +{ + uint32_t i = 0; + ETH_DMADESCTypeDef *DMARxDesc; + + /* Set the DMARxDescToGet pointer with the first one of the DMARxDescTab list */ + DMARxDescToGet = DMARxDescTab; + DMAPTPRxDescToGet = DMAPTPRxDescTab; + /* Fill each DMARxDesc descriptor with the right values */ + for(i=0; i < RxBuffCount; i++) + { + /* Get the pointer on the ith member of the Rx Desc list */ + DMARxDesc = DMARxDescTab+i; + /* Set Own bit of the Rx descriptor Status */ + DMARxDesc->Status = ETH_DMARxDesc_OWN; + + /* Set Buffer1 size and Second Address Chained bit */ + DMARxDesc->ControlBufferSize = ETH_DMARxDesc_RCH | (uint32_t)ETH_MAX_PACKET_SIZE; + /* Set Buffer1 address pointer */ + DMARxDesc->Buffer1Addr = (uint32_t)(&RxBuff[i*ETH_MAX_PACKET_SIZE]); + + /* Initialize the next descriptor with the Next Desciptor Polling Enable */ + if(i < (RxBuffCount-1)) + { + /* Set next descriptor address register with next descriptor base address */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab+i+1); + } + else + { + /* For last descriptor, set next descriptor address register equal to the first descriptor base address */ + DMARxDesc->Buffer2NextDescAddr = (uint32_t)(DMARxDescTab); + } + /* Make DMAPTPRxDescTab points to the same addresses as DMARxDescTab */ + (&DMAPTPRxDescTab[i])->Buffer1Addr = DMARxDesc->Buffer1Addr; + (&DMAPTPRxDescTab[i])->Buffer2NextDescAddr = DMARxDesc->Buffer2NextDescAddr; + } + /* Store on the last DMAPTPRxDescTab desc status record the first list address */ + (&DMAPTPRxDescTab[i-1])->Status = (uint32_t) DMAPTPRxDescTab; + + /* Set Receive Desciptor List Address Register */ + ETH->DMARDLAR = (uint32_t) DMARxDescTab; +} + +/** + * @brief Transmits a packet, from application buffer, pointed by ppkt with + * Time Stamp values. + * @param ppkt: pointer to application packet buffer to transmit. + * @param FrameLength: Tx Packet size. + * @param PTPTxTab: Pointer on the first PTP Tx table to store Time stamp values. + * @retval : ETH_ERROR: in case of Tx desc owned by DMA + * ETH_SUCCESS: for correct transmission + */ +uint32_t ETH_HandlePTPTxPkt(uint8_t *ppkt, uint16_t FrameLength, uint32_t *PTPTxTab) +{ + uint32_t offset = 0, timeout = 0; + /* Check if the descriptor is owned by the ETHERNET DMA (when set) or CPU (when reset) */ + if((DMATxDescToSet->Status & ETH_DMATxDesc_OWN) != (uint32_t)RESET) + { + /* Return ERROR: OWN bit set */ + return ETH_ERROR; + } + /* Copy the frame to be sent into memory pointed by the current ETHERNET DMA Tx descriptor */ + for(offset=0; offsetBuffer1Addr) + offset)) = (*(ppkt + offset)); + } + /* Setting the Frame Length: bits[12:0] */ + DMATxDescToSet->ControlBufferSize = (FrameLength & (uint32_t)0x1FFF); + /* Setting the last segment and first segment bits (in this case a frame is transmitted in one descriptor) */ + DMATxDescToSet->Status |= ETH_DMATxDesc_LS | ETH_DMATxDesc_FS; + /* Set Own bit of the Tx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMATxDescToSet->Status |= ETH_DMATxDesc_OWN; + /* When Tx Buffer unavailable flag is set: clear it and resume transmission */ + if ((ETH->DMASR & ETH_DMASR_TBUS) != (uint32_t)RESET) + { + /* Clear TBUS ETHERNET DMA flag */ + ETH->DMASR = ETH_DMASR_TBUS; + /* Resume DMA transmission*/ + ETH->DMATPDR = 0; + } + /* Wait for ETH_DMATxDesc_TTSS flag to be set */ + do + { + timeout++; + } while (!(DMATxDescToSet->Status & ETH_DMATxDesc_TTSS) && (timeout < 0xFFFF)); + /* Return ERROR in case of timeout */ + if(timeout == PHY_READ_TO) + { + return ETH_ERROR; + } + /* Clear the DMATxDescToSet status register TTSS flag */ + DMATxDescToSet->Status &= ~ETH_DMATxDesc_TTSS; + *PTPTxTab++ = DMATxDescToSet->Buffer1Addr; + *PTPTxTab = DMATxDescToSet->Buffer2NextDescAddr; + /* Update the ENET DMA current descriptor */ + /* Chained Mode */ + if((DMATxDescToSet->Status & ETH_DMATxDesc_TCH) != (uint32_t)RESET) + { + /* Selects the next DMA Tx descriptor list for next buffer read */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) (DMAPTPTxDescToSet->Buffer2NextDescAddr); + if(DMAPTPTxDescToSet->Status != 0) + { + DMAPTPTxDescToSet = (ETH_DMADESCTypeDef*) (DMAPTPTxDescToSet->Status); + } + else + { + DMAPTPTxDescToSet++; + } + } + else /* Ring Mode */ + { + if((DMATxDescToSet->Status & ETH_DMATxDesc_TER) != (uint32_t)RESET) + { + /* Selects the next DMA Tx descriptor list for next buffer read: this will + be the first Tx descriptor in this case */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) (ETH->DMATDLAR); + DMAPTPTxDescToSet = (ETH_DMADESCTypeDef*) (ETH->DMATDLAR); + } + else + { + /* Selects the next DMA Tx descriptor list for next buffer read */ + DMATxDescToSet = (ETH_DMADESCTypeDef*) ((uint32_t)DMATxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + DMAPTPTxDescToSet = (ETH_DMADESCTypeDef*) ((uint32_t)DMAPTPTxDescToSet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + /* Return SUCCESS */ + return ETH_SUCCESS; +} + +/** + * @brief Receives a packet and copies it to memory pointed by ppkt with + * Time Stamp values. + * @param ppkt: pointer to application packet receive buffer. + * @param PTPRxTab: Pointer on the first PTP Rx table to store Time stamp values. + * @retval : ETH_ERROR: if there is error in reception + * framelength: received packet size if packet reception is correct + */ +uint32_t ETH_HandlePTPRxPkt(uint8_t *ppkt, uint32_t *PTPRxTab) +{ + uint32_t offset = 0, framelength = 0; + /* Check if the descriptor is owned by the ENET or CPU */ + if((DMARxDescToGet->Status & ETH_DMARxDesc_OWN) != (uint32_t)RESET) + { + /* Return error: OWN bit set */ + return ETH_ERROR; + } + if(((DMARxDescToGet->Status & ETH_DMARxDesc_ES) == (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_LS) != (uint32_t)RESET) && + ((DMARxDescToGet->Status & ETH_DMARxDesc_FS) != (uint32_t)RESET)) + { + /* Get the Frame Length of the received packet: substruct 4 bytes of the CRC */ + framelength = ((DMARxDescToGet->Status & ETH_DMARxDesc_FL) >> ETH_DMARxDesc_FrameLengthShift) - 4; + /* Copy the received frame into buffer from memory pointed by the current ETHERNET DMA Rx descriptor */ + for(offset=0; offsetBuffer1Addr) + offset)); + } + } + else + { + /* Return ERROR */ + framelength = ETH_ERROR; + } + /* When Rx Buffer unavailable flag is set: clear it and resume reception */ + if ((ETH->DMASR & ETH_DMASR_RBUS) != (uint32_t)RESET) + { + /* Clear RBUS ETHERNET DMA flag */ + ETH->DMASR = ETH_DMASR_RBUS; + /* Resume DMA reception */ + ETH->DMARPDR = 0; + } + *PTPRxTab++ = DMARxDescToGet->Buffer1Addr; + *PTPRxTab = DMARxDescToGet->Buffer2NextDescAddr; + /* Set Own bit of the Rx descriptor Status: gives the buffer back to ETHERNET DMA */ + DMARxDescToGet->Status |= ETH_DMARxDesc_OWN; + /* Update the ETHERNET DMA global Rx descriptor with next Rx decriptor */ + /* Chained Mode */ + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RCH) != (uint32_t)RESET) + { + /* Selects the next DMA Rx descriptor list for next buffer read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (DMAPTPRxDescToGet->Buffer2NextDescAddr); + if(DMAPTPRxDescToGet->Status != 0) + { + DMAPTPRxDescToGet = (ETH_DMADESCTypeDef*) (DMAPTPRxDescToGet->Status); + } + else + { + DMAPTPRxDescToGet++; + } + } + else /* Ring Mode */ + { + if((DMARxDescToGet->ControlBufferSize & ETH_DMARxDesc_RER) != (uint32_t)RESET) + { + /* Selects the first DMA Rx descriptor for next buffer to read: last Rx descriptor was used */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) (ETH->DMARDLAR); + } + else + { + /* Selects the next DMA Rx descriptor list for next buffer to read */ + DMARxDescToGet = (ETH_DMADESCTypeDef*) ((uint32_t)DMARxDescToGet + 0x10 + ((ETH->DMABMR & ETH_DMABMR_DSL) >> 2)); + } + } + /* Return Frame Length/ERROR */ + return (framelength); +} +/** + * @} + */ + +/** + * @} + */ + +/******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/uip/clock-arch.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/uip/clock-arch.c new file mode 100644 index 00000000..d8225115 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/uip/clock-arch.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: clock-arch.c,v 1.2 2006/06/12 08:00:31 adam Exp $ + */ + +/** + * \file + * Implementation of architecture-specific clock functionality + * \author + * Adam Dunkels + */ + +#include "clock-arch.h" +#include "header.h" + +/*---------------------------------------------------------------------------*/ +clock_time_t +clock_time(void) +{ + return (clock_time_t)TimerGet(); +} +/*---------------------------------------------------------------------------*/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/uip/clock-arch.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/uip/clock-arch.h new file mode 100644 index 00000000..aa97f0e7 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/uip/clock-arch.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: clock-arch.h,v 1.2 2006/06/12 08:00:31 adam Exp $ + */ + +#ifndef __CLOCK_ARCH_H__ +#define __CLOCK_ARCH_H__ + +typedef int clock_time_t; +#define CLOCK_CONF_SECOND 1000 + +#endif /* __CLOCK_ARCH_H__ */ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/uip/netdev.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/uip/netdev.c new file mode 100644 index 00000000..3ce42bdf --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/uip/netdev.c @@ -0,0 +1,442 @@ +/* + * Copyright (c) 2001, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Author: Adam Dunkels + * + * $Id: netdev.c,v 1.8 2006/06/07 08:39:58 adam Exp $ + */ + + +/*---------------------------------------------------------------------------*/ +#include "uip.h" +#include "uip_arp.h" +#include "header.h" +#include "stm32_eth.h" /* STM32 ethernet library */ +#include /* for memcpy */ + + +/*---------------------------------------------------------------------------*/ +#define NETDEV_DEFAULT_MACADDR0 (0x08) +#define NETDEV_DEFAULT_MACADDR1 (0x00) +#define NETDEV_DEFAULT_MACADDR2 (0x27) +#define NETDEV_DEFAULT_MACADDR3 (0x69) +#define NETDEV_DEFAULT_MACADDR4 (0x5B) +#define NETDEV_DEFAULT_MACADDR5 (0x45) + + +/*---------------------------------------------------------------------------*/ +static void netdev_TxDscrInit(void); +static void netdev_RxDscrInit(void); + +/*---------------------------------------------------------------------------*/ +typedef union _TranDesc0_t +{ + uint32_t Data; + struct { + uint32_t DB : 1; + uint32_t UF : 1; + uint32_t ED : 1; + uint32_t CC : 4; + uint32_t VF : 1; + uint32_t EC : 1; + uint32_t LC : 1; + uint32_t NC : 1; + uint32_t LSC : 1; + uint32_t IPE : 1; + uint32_t FF : 1; + uint32_t JT : 1; + uint32_t ES : 1; + uint32_t IHE : 1; + uint32_t : 3; + uint32_t TCH : 1; + uint32_t TER : 1; + uint32_t CIC : 2; + uint32_t : 2; + uint32_t DP : 1; + uint32_t DC : 1; + uint32_t FS : 1; + uint32_t LSEG : 1; + uint32_t IC : 1; + uint32_t OWN : 1; + }; +} TranDesc0_t, * pTranDesc0_t; + +typedef union _TranDesc1_t +{ + uint32_t Data; + struct { + uint32_t TBS1 :13; + uint32_t : 3; + uint32_t TBS2 :12; + uint32_t : 3; + }; +} TranDesc1_t, * pTranDesc1_t; + +typedef union _RecDesc0_t +{ + uint32_t Data; + struct { + uint32_t RMAM_PCE : 1; + uint32_t CE : 1; + uint32_t DE : 1; + uint32_t RE : 1; + uint32_t RWT : 1; + uint32_t FT : 1; + uint32_t LC : 1; + uint32_t IPHCE : 1; + uint32_t LS : 1; + uint32_t FS : 1; + uint32_t VLAN : 1; + uint32_t OE : 1; + uint32_t LE : 1; + uint32_t SAF : 1; + uint32_t DERR : 1; + uint32_t ES : 1; + uint32_t FL :14; + uint32_t AFM : 1; + uint32_t OWN : 1; + }; +} RecDesc0_t, * pRecDesc0_t; + +typedef union _recDesc1_t +{ + uint32_t Data; + struct { + uint32_t RBS1 :13; + uint32_t : 1; + uint32_t RCH : 1; + uint32_t RER : 1; + uint32_t RBS2 :14; + uint32_t DIC : 1; + }; +} RecDesc1_t, * pRecDesc1_t; + +typedef union _EnetDmaDesc_t +{ + uint32_t Data[4]; + // Rx DMA descriptor + struct + { + RecDesc0_t RxDesc0; + RecDesc1_t RxDesc1; + uint32_t * pBuffer; + union + { + uint32_t * pBuffer2; + union _EnetDmaDesc_t * pEnetDmaNextDesc; + }; + } Rx; + // Tx DMA descriptor + struct + { + TranDesc0_t TxDesc0; + TranDesc1_t TxDesc1; + uint32_t * pBuffer1; + union + { + uint32_t * pBuffer2; + union _EnetDmaDesc_t * pEnetDmaNextDesc; + }; + } Tx; +} EnetDmaDesc_t, * pEnetDmaDesc_t; + + +/*---------------------------------------------------------------------------*/ +uint8_t RxBuff[UIP_CONF_BUFFER_SIZE] __attribute__ ((aligned (4))); +uint8_t TxBuff[UIP_CONF_BUFFER_SIZE] __attribute__ ((aligned (4))); + +EnetDmaDesc_t EnetDmaRx __attribute__((aligned (128))); +EnetDmaDesc_t EnetDmaTx __attribute__ ((aligned (128))); + + +/*---------------------------------------------------------------------------*/ +void netdev_init(void) +{ + GPIO_InitTypeDef GPIO_InitStructure; + ETH_InitTypeDef ETH_InitStructure; + + /* Enable ETHERNET clocks */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_ETH_MAC | RCC_AHB1Periph_ETH_MAC_Tx | + RCC_AHB1Periph_ETH_MAC_Rx | RCC_AHB1Periph_ETH_MAC_PTP, ENABLE); + + + /* Enable GPIOs clocks */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | + RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOG, ENABLE); + + /* Enable SYSCFG clock */ + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); + /*Select RMII Interface*/ + SYSCFG_ETH_MediaInterfaceConfig(SYSCFG_ETH_MediaInterface_RMII); + + /* ETHERNET pins configuration */ + /* PA + ETH_RMII_REF_CLK: PA1 + ETH_RMII_MDIO: PA2 + ETH_RMII_MDINT: PA3 + ETH_RMII_CRS_DV: PA7 + */ + + /* Configure PA1, PA2, PA3 and PA7*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_7; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + /* Connect PA1, PA2, PA3 and PA7 to ethernet module*/ + GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_ETH); + + /* PB + ETH_RMII_TX_EN: PG11 + */ + + /* Configure PG11*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOG, &GPIO_InitStructure); + + /* Connect PG11 to ethernet module*/ + GPIO_PinAFConfig(GPIOG, GPIO_PinSource11, GPIO_AF_ETH); + + /* PC + ETH_RMII_MDC: PC1 + ETH_RMII_RXD0: PC4 + ETH_RMII_RXD1: PC5 + */ + + /* Configure PC1, PC4 and PC5*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOC, &GPIO_InitStructure); + + /* Connect PC1, PC4 and PC5 to ethernet module*/ + GPIO_PinAFConfig(GPIOC, GPIO_PinSource1, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOC, GPIO_PinSource4, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOC, GPIO_PinSource5, GPIO_AF_ETH); + + /* PG + ETH_RMII_TXD0: PG13 + ETH_RMII_TXD1: PG14 + */ + + /* Configure PG13 and PG14*/ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOG, &GPIO_InitStructure); + + /* Connect PG13 and PG14 to ethernet module*/ + GPIO_PinAFConfig(GPIOG, GPIO_PinSource13, GPIO_AF_ETH); + GPIO_PinAFConfig(GPIOG, GPIO_PinSource14, GPIO_AF_ETH); + + /* Reset ETHERNET on AHB Bus */ + ETH_DeInit(); + + /* Software reset */ + ETH_SoftwareReset(); + + /* Wait for software reset */ + while(ETH_GetSoftwareResetStatus()==SET); + + /* ETHERNET Configuration ------------------------------------------------------*/ + /* Call ETH_StructInit if you don't like to configure all ETH_InitStructure parameter */ + ETH_StructInit(Ð_InitStructure); + + /* Fill ETH_InitStructure parametrs */ + /*------------------------ MAC -----------------------------------*/ + ETH_InitStructure.ETH_AutoNegotiation = ETH_AutoNegotiation_Disable ; + ETH_InitStructure.ETH_LoopbackMode = ETH_LoopbackMode_Disable; + ETH_InitStructure.ETH_RetryTransmission = ETH_RetryTransmission_Disable; + ETH_InitStructure.ETH_AutomaticPadCRCStrip = ETH_AutomaticPadCRCStrip_Disable; + ETH_InitStructure.ETH_ReceiveAll = ETH_ReceiveAll_Enable; + ETH_InitStructure.ETH_BroadcastFramesReception = ETH_BroadcastFramesReception_Disable; + ETH_InitStructure.ETH_PromiscuousMode = ETH_PromiscuousMode_Disable; + ETH_InitStructure.ETH_MulticastFramesFilter = ETH_MulticastFramesFilter_Perfect; + ETH_InitStructure.ETH_UnicastFramesFilter = ETH_UnicastFramesFilter_Perfect; + ETH_InitStructure.ETH_Mode = ETH_Mode_FullDuplex; + ETH_InitStructure.ETH_Speed = ETH_Speed_100M; + + unsigned int PhyAddr; + union { + uint32_t HI_LO; + struct + { + uint16_t LO; + uint16_t HI; + }; + } PHYID; + for(PhyAddr = 0; 32 > PhyAddr; PhyAddr++) + { + // datasheet for the ks8721bl ethernet controller (http://www.micrel.com/_PDF/Ethernet/datasheets/ks8721bl-sl.pdf) + // page 20 --> PHY Identifier 1 and 2 + PHYID.HI = ETH_ReadPHYRegister(PhyAddr,2); // 0x0022 + PHYID.LO = ETH_ReadPHYRegister(PhyAddr,3); // 0x1619 + if ((0x00221619 == PHYID.HI_LO) || (0x0007C0F1 == PHYID.HI_LO)) + break; + } + /* Configure Ethernet */ + ETH_Init(Ð_InitStructure, PhyAddr); + + netdev_TxDscrInit(); + netdev_RxDscrInit(); + ETH_Start(); +} + + +/*---------------------------------------------------------------------------*/ +void netdev_init_mac(void) +{ + struct uip_eth_addr macAddress; + + /* set the default MAC address */ + macAddress.addr[0] = NETDEV_DEFAULT_MACADDR0; + macAddress.addr[1] = NETDEV_DEFAULT_MACADDR1; + macAddress.addr[2] = NETDEV_DEFAULT_MACADDR2; + macAddress.addr[3] = NETDEV_DEFAULT_MACADDR3; + macAddress.addr[4] = NETDEV_DEFAULT_MACADDR4; + macAddress.addr[5] = NETDEV_DEFAULT_MACADDR5; + uip_setethaddr(macAddress); +} + + +/*---------------------------------------------------------------------------*/ +unsigned int netdev_read(void) +{ + uint32_t size; + /*check for validity*/ + if(0 == EnetDmaRx.Rx.RxDesc0.OWN) + { + /*Get the size of the packet*/ + size = EnetDmaRx.Rx.RxDesc0.FL; // CRC + memcpy(uip_buf, RxBuff, size); //string.h library*/ + } + else + { + return 0; + } + /* Give the buffer back to ENET */ + EnetDmaRx.Rx.RxDesc0.OWN = 1; + /* Start the receive operation */ + ETH->DMARPDR = 1; + /* Return no error */ + return size; +} + + +/*---------------------------------------------------------------------------*/ +void netdev_send(void) +{ + while(EnetDmaTx.Tx.TxDesc0.OWN); + + /* Copy the application buffer to the driver buffer + Using this MEMCOPY_L2L_BY4 makes the copy routine faster + than memcpy */ + memcpy(TxBuff, uip_buf, uip_len); + + /* Assign ENET address to Temp Tx Array */ + EnetDmaTx.Tx.pBuffer1 = (uint32_t *)TxBuff; + + /* Setting the Frame Length*/ + EnetDmaTx.Tx.TxDesc0.Data = 0; + EnetDmaTx.Tx.TxDesc0.TCH = 1; + EnetDmaTx.Tx.TxDesc0.LSEG = 1; + EnetDmaTx.Tx.TxDesc0.FS = 1; + EnetDmaTx.Tx.TxDesc0.DC = 0; + EnetDmaTx.Tx.TxDesc0.DP = 0; + + EnetDmaTx.Tx.TxDesc1.Data = 0; + EnetDmaTx.Tx.TxDesc1.TBS1 = (uip_len&0xFFF); + + /* Start the ENET by setting the VALID bit in dmaPackStatus of current descr*/ + EnetDmaTx.Tx.TxDesc0.OWN = 1; + + /* Start the transmit operation */ + ETH->DMATPDR = 1; +} + + +/*---------------------------------------------------------------------------*/ +static void netdev_RxDscrInit(void) +{ + /* Initialization */ + /* Assign temp Rx array to the ENET buffer */ + EnetDmaRx.Rx.pBuffer = (uint32_t *)RxBuff; + + /* Initialize RX ENET Status and control */ + EnetDmaRx.Rx.RxDesc0.Data = 0; + + /* Initialize the next descriptor- In our case its single descriptor */ + EnetDmaRx.Rx.pEnetDmaNextDesc = &EnetDmaRx; + + EnetDmaRx.Rx.RxDesc1.Data = 0; + EnetDmaRx.Rx.RxDesc1.RER = 0; // end of ring + EnetDmaRx.Rx.RxDesc1.RCH = 1; // end of ring + + /* Set the max packet size */ + EnetDmaRx.Rx.RxDesc1.RBS1 = UIP_CONF_BUFFER_SIZE; + + /* Setting the VALID bit */ + EnetDmaRx.Rx.RxDesc0.OWN = 1; + /* Setting the RX NEXT Descriptor Register inside the ENET */ + ETH->DMARDLAR = (uint32_t)&EnetDmaRx; +} + + +/*---------------------------------------------------------------------------*/ +static void netdev_TxDscrInit(void) +{ + /* ENET Start Address */ + EnetDmaTx.Tx.pBuffer1 = (uint32_t *)TxBuff; + + /* Next Descriptor Address */ + EnetDmaTx.Tx.pEnetDmaNextDesc = &EnetDmaTx; + + /* Initialize ENET status and control */ + EnetDmaTx.Tx.TxDesc0.TCH = 1; + EnetDmaTx.Tx.TxDesc0.Data = 0; + EnetDmaTx.Tx.TxDesc1.Data = 0; + /* Tx next set to Tx descriptor base */ + ETH->DMATDLAR = (uint32_t)&EnetDmaTx; + +} diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/uip/netdev.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/uip/netdev.h new file mode 100644 index 00000000..4ea59ce5 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/uip/netdev.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2001, Adam Dunkels. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Adam Dunkels. + * 4. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack. + * + * $Id: netdev.h,v 1.1 2002/01/10 06:22:56 adam Exp $ + * + */ + +#ifndef __NETDEV_H__ +#define __NETDEV_H__ + +void netdev_init(void); +void netdev_init_mac(void); +unsigned int netdev_read(void); +void netdev_send(void); + +#endif /* __NETDEV_H__ */ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/uip/uip-conf.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/uip/uip-conf.h new file mode 100644 index 00000000..fd9ba0dd --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/lib/uip/uip-conf.h @@ -0,0 +1,151 @@ +/** + * \addtogroup uipopt + * @{ + */ + +/** + * \name Project-specific configuration options + * @{ + * + * uIP has a number of configuration options that can be overridden + * for each project. These are kept in a project-specific uip-conf.h + * file and all configuration names have the prefix UIP_CONF. + */ + +/* + * Copyright (c) 2006, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of the uIP TCP/IP stack + * + * $Id: uip-conf.h,v 1.6 2006/06/12 08:00:31 adam Exp $ + */ + +/** + * \file + * An example uIP configuration file + * \author + * Adam Dunkels + */ + +#ifndef __UIP_CONF_H__ +#define __UIP_CONF_H__ + + +/** + * 8 bit datatype + * + * This typedef defines the 8-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef unsigned char u8_t; + +/** + * 16 bit datatype + * + * This typedef defines the 16-bit type used throughout uIP. + * + * \hideinitializer + */ +typedef unsigned short u16_t; + +/** + * Statistics datatype + * + * This typedef defines the dataype used for keeping statistics in + * uIP. + * + * \hideinitializer + */ +typedef unsigned short uip_stats_t; + +/** + * Maximum number of TCP connections. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_CONNECTIONS 1 + +/** + * Maximum number of listening TCP ports. + * + * \hideinitializer + */ +#define UIP_CONF_MAX_LISTENPORTS 1 + +/** + * uIP buffer size. + * + * \hideinitializer + */ +#define UIP_CONF_BUFFER_SIZE 1600 + +/** + * CPU byte order. + * + * \hideinitializer + */ +#define UIP_CONF_BYTE_ORDER LITTLE_ENDIAN + +/** + * Logging on or off + * + * \hideinitializer + */ +#define UIP_CONF_LOGGING 0 + +/** + * UDP support on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP 0 + +/** + * UDP checksums on or off + * + * \hideinitializer + */ +#define UIP_CONF_UDP_CHECKSUMS 1 + +/** + * uIP statistics on or off + * + * \hideinitializer + */ +#define UIP_CONF_STATISTICS 0 + +/* Here we include the header file for the application(s) we use in + our project. */ +#include "boot.h" +#include "net.h" + +#endif /* __UIP_CONF_H__ */ + +/** @} */ +/** @} */ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/main.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/main.c index 6c16174f..79fc8509 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/main.c +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/main.c @@ -53,6 +53,8 @@ void main(void) { /* initialize the microcontroller */ Init(); + /* initialize the network application */ + NetInit(); /* initialize the bootloader interface */ BootComInit(); @@ -61,6 +63,8 @@ void main(void) { /* toggle LED with a fixed frequency */ LedToggle(); + /* run the network task */ + NetTask(); /* check for bootloader activation request */ BootComCheckActivationRequest(); } diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/makefile b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/makefile index 6b7f50e6..dcb69988 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/makefile +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/makefile @@ -43,10 +43,19 @@ irq.c \ irq.h \ led.c \ led.h \ +net.c \ +net.h \ main.c \ timer.c \ timer.h \ vectors.c \ +./lib/ethernetlib/inc/stm32_eth.h \ +./lib/ethernetlib/src/stm32_eth.c \ +./lib/uip/clock-arch.c \ +./lib/uip/clock-arch.h \ +./lib/uip/netdev.c \ +./lib/uip/netdev.h \ +./lib/uip/uip-conf.h \ ./lib/stdperiphlib/stm32f4xx_conf.h \ ./lib/stdperiphlib/STM32F4xx_StdPeriph_Driver/inc/misc.h \ ./lib/stdperiphlib/STM32F4xx_StdPeriph_Driver/inc/stm32f4xx_adc.h \ @@ -111,7 +120,27 @@ vectors.c \ ./lib/stdperiphlib/CMSIS/Include/core_cmInstr.h \ ./lib/stdperiphlib/CMSIS/Device/ST/STM32F4xx/Source/system_stm32f4xx.c \ ./lib/stdperiphlib/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h \ -./lib/stdperiphlib/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h +./lib/stdperiphlib/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h \ +../../../Source/third_party/uip/uip/clock.h \ +../../../Source/third_party/uip/uip/lc-addrlabels.h \ +../../../Source/third_party/uip/uip/lc-switch.h \ +../../../Source/third_party/uip/uip/lc.h \ +../../../Source/third_party/uip/uip/pt.h \ +../../../Source/third_party/uip/uip/uip-fw.c \ +../../../Source/third_party/uip/uip/uip-fw.h \ +../../../Source/third_party/uip/uip/uip-neighbor.h \ +../../../Source/third_party/uip/uip/uip-split.h \ +../../../Source/third_party/uip/uip/uip.c \ +../../../Source/third_party/uip/uip/uip.h \ +../../../Source/third_party/uip/uip/uiplib.c \ +../../../Source/third_party/uip/uip/uiplib.h \ +../../../Source/third_party/uip/uip/uipopt.h \ +../../../Source/third_party/uip/uip/uip_arch.h \ +../../../Source/third_party/uip/uip/uip_arp.c \ +../../../Source/third_party/uip/uip/uip_arp.h \ +../../../Source/third_party/uip/uip/uip_timer.c \ +../../../Source/third_party/uip/uip/uip_timer.h + #|---------------------------------------------------------------------------------------| diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/memory.x b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/memory.x index 4dd1f56a..69f68128 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/memory.x +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/memory.x @@ -1,6 +1,6 @@ MEMORY { - FLASH (rx) : ORIGIN = 0x08008000, LENGTH = 1024K-32K + FLASH (rx) : ORIGIN = 0x0800C000, LENGTH = 1024K-48K SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 128K } diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/net.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/net.c new file mode 100644 index 00000000..39728207 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/net.c @@ -0,0 +1,211 @@ +/************************************************************************************//** +* \file Demo\ARMCM3_LM3S_EK_LM3S6965_IAR\Prog\net.c +* \brief Network application for the uIP TCP/IP stack. +* \ingroup Prog_ARMCM3_LM3S_EK_LM3S6965_IAR +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2014 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "header.h" /* generic header */ +#include "netdev.h" +#include "uip.h" +#include "uip_arp.h" + + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +/** \brief Delta time for the uIP periodic timer. */ +#define NET_UIP_PERIODIC_TIMER_MS (500) +/** \brief Delta time for the uIP ARP timer. */ +#define NET_UIP_ARP_TIMER_MS (10000) +/** \brief Macro for accessing the Ethernet header information in the buffer */ +#define NET_UIP_HEADER_BUF ((struct uip_eth_hdr *)&uip_buf[0]) + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/** \brief Holds the time out value of the uIP periodic timer. */ +static unsigned long periodicTimerTimeOut; +/** \brief Holds the time out value of the uIP ARP timer. */ +static unsigned long ARPTimerTimeOut; + + +/************************************************************************************//** +** \brief Initializes the TCP/IP network communication interface. +** \return none. +** +****************************************************************************************/ +void NetInit(void) +{ + uip_ipaddr_t ipaddr; + + /* initialize the network device */ + netdev_init(); + /* initialize the timer variables */ + periodicTimerTimeOut = TimerGet() + NET_UIP_PERIODIC_TIMER_MS; + ARPTimerTimeOut = TimerGet() + NET_UIP_ARP_TIMER_MS; + /* initialize the uIP TCP/IP stack. */ + uip_init(); + /* set the IP address */ + uip_ipaddr(ipaddr, BOOT_COM_NET_IPADDR0, BOOT_COM_NET_IPADDR1, BOOT_COM_NET_IPADDR2, + BOOT_COM_NET_IPADDR3); + uip_sethostaddr(ipaddr); + /* set the network mask */ + uip_ipaddr(ipaddr, BOOT_COM_NET_NETMASK0, BOOT_COM_NET_NETMASK1, BOOT_COM_NET_NETMASK2, + BOOT_COM_NET_NETMASK3); + uip_setnetmask(ipaddr); + /* set the gateway address */ + uip_ipaddr(ipaddr, BOOT_COM_NET_GATEWAY0, BOOT_COM_NET_GATEWAY1, BOOT_COM_NET_GATEWAY2, + BOOT_COM_NET_GATEWAY3); + uip_setdraddr(ipaddr); + /* start listening on the configured port for XCP transfers on TCP/IP */ + uip_listen(HTONS(BOOT_COM_NET_PORT)); + /* initialize the MAC and set the MAC address */ + netdev_init_mac(); +} /*** end of NetInit ***/ + + +/************************************************************************************//** +** \brief The uIP network application that detects the XCP connect command on the +** port used by the bootloader. This indicates that the bootloader should +** be activated. +** \return none. +** +****************************************************************************************/ +void NetApp(void) +{ + unsigned char *newDataPtr; + + if (uip_connected()) + { + return; + } + + if (uip_newdata()) + { + /* a new XCP command was received. check if this is the connect command and in this + * case activate the bootloader. with XCP on TCP/IP the first 4 bytes contain a + * counter value in which we are not really interested. + */ + newDataPtr = uip_appdata; + newDataPtr += 4; + /* check if this was an XCP CONNECT command */ + if ((newDataPtr[0] == 0xff) && (newDataPtr[1] == 0x00)) + { + /* connection request received so start the bootloader */ + BootActivate(); + } + } +} /*** end of NetApp ***/ + + +/************************************************************************************//** +** \brief Runs the TCP/IP server task. +** \return none. +** +****************************************************************************************/ +void NetTask(void) +{ + unsigned long connection; + unsigned long packetLen; + + /* check for an RX packet and read it. */ + packetLen = netdev_read(); + if(packetLen > 0) + { + /* set uip_len for uIP stack usage */ + uip_len = (unsigned short)packetLen; + + /* process incoming IP packets here. */ + if(NET_UIP_HEADER_BUF->type == htons(UIP_ETHTYPE_IP)) + { + uip_arp_ipin(); + uip_input(); + /* if the above function invocation resulted in data that + * should be sent out on the network, the global variable + * uip_len is set to a value > 0. + */ + if(uip_len > 0) + { + uip_arp_out(); + netdev_send(); + uip_len = 0; + } + } + /* process incoming ARP packets here. */ + else if(NET_UIP_HEADER_BUF->type == htons(UIP_ETHTYPE_ARP)) + { + uip_arp_arpin(); + + /* if the above function invocation resulted in data that + * should be sent out on the network, the global variable + * uip_len is set to a value > 0. + */ + if(uip_len > 0) + { + netdev_send(); + uip_len = 0; + } + } + } + + /* process TCP/IP Periodic Timer here. */ + if (TimerGet() >= periodicTimerTimeOut) + { + periodicTimerTimeOut += NET_UIP_PERIODIC_TIMER_MS; + for (connection = 0; connection < UIP_CONNS; connection++) + { + uip_periodic(connection); + /* If the above function invocation resulted in data that + * should be sent out on the network, the global variable + * uip_len is set to a value > 0. + */ + if(uip_len > 0) + { + uip_arp_out(); + netdev_send(); + uip_len = 0; + } + } + } + + /* process ARP Timer here. */ + if (TimerGet() >= ARPTimerTimeOut) + { + ARPTimerTimeOut += NET_UIP_ARP_TIMER_MS; + uip_arp_timer(); + } +} /*** end of NetServerTask ***/ + + +/*********************************** end of net.c **************************************/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/net.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/net.h new file mode 100644 index 00000000..538e6664 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Prog/net.h @@ -0,0 +1,66 @@ +/************************************************************************************//** +* \file Demo\ARMCM3_LM3S_EK_LM3S6965_IAR\Prog\net.h +* \brief Network application for the uIP TCP/IP stack. +* \ingroup Prog_ARMCM3_LM3S_EK_LM3S6965_IAR +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2014 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License along with OpenBLT. +* If not, see . +* +* A special exception to the GPL is included to allow you to distribute a combined work +* that includes OpenBLT without being obliged to provide the source code for any +* proprietary components. The exception text is included at the bottom of the license +* file . +* +* \endinternal +****************************************************************************************/ +#ifndef NET_H +#define NET_H + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +#ifndef UIP_APPCALL +#define UIP_APPCALL NetApp +#endif /* UIP_APPCALL */ + + +/**************************************************************************************** +* Type definitions +****************************************************************************************/ +/** \brief Define the uip_tcp_appstate_t datatype. This is the state of our tcp/ip + * application, and the memory required for this state is allocated together + * with each TCP connection. One application state for each TCP connection. + */ +typedef struct net_state +{ + unsigned char unused; +} uip_tcp_appstate_t; + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +void NetInit(void); +void NetApp(void); +void NetTask(void); + + +#endif /* NET_H */ +/*********************************** end of net.h **************************************/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/bin/openbtl_olimex_stm32e407.out b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/bin/openbtl_olimex_stm32e407.out index cc21cfd4..3caf1703 100644 Binary files a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/bin/openbtl_olimex_stm32e407.out and b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/bin/openbtl_olimex_stm32e407.out differ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/bin/openbtl_olimex_stm32e407.srec b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/bin/openbtl_olimex_stm32e407.srec index 1f1ebdd0..649ae9e5 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/bin/openbtl_olimex_stm32e407.srec +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/bin/openbtl_olimex_stm32e407.srec @@ -1,1707 +1,2169 @@ S02000006F70656E62746C5F6F6C696D65785F73746D3332653430372E737265630B -S3150800000028180020F15B00081D6A00081D6A000810 -S315080000101D6A00081D6A00081D6A00081D6A000896 -S315080000201D6A00081D6A00081D6A00081D6A000886 -S315080000301D6A00081D6A00081D6A00081D6A000876 -S315080000401D6A00081D6A00081D6A00081D6A000866 -S315080000501D6A00081D6A00081D6A00081D6A000856 -S315080000601D6A00081D6A00081D6A00081D6A000846 -S315080000701D6A00081D6A00081D6A00081D6A000836 -S315080000801D6A00081D6A00081D6A00081D6A000826 -S315080000901D6A00081D6A00081D6A00081D6A000816 -S315080000A01D6A00081D6A00081D6A00081D6A000806 -S315080000B01D6A00081D6A00081D6A00081D6A0008F6 -S315080000C01D6A00081D6A00081D6A00081D6A0008E6 -S315080000D01D6A00081D6A00081D6A00081D6A0008D6 -S315080000E01D6A00081D6A00081D6A00081D6A0008C6 -S315080000F01D6A00081D6A00081D6A00081D6A0008B6 -S315080001001D6A00081D6A00081D6A00081D6A0008A5 -S315080001101D6A00081D6A00081D6A00081D6A000895 -S315080001201D6A00081D6A00081D6A00081D6A000885 -S315080001301D6A00081D6A00081D6A00081D6A000875 -S315080001401D6A00081D6A00081D6A00081D6A000865 -S315080001501D6A00081D6A00081D6A00081D6A000855 -S315080001601D6A00081D6A00081D6A00081D6A000845 -S315080001701D6A00081D6A00081D6A00081D6A000835 -S30D080001801D6A00081D6A00084B -S31508000188044B9D46C046C046C046C04604F0C8FC57 -S3150800019805F042FE2818002030B403000C001500AC -S315080001A86A1E002D04D025781D70641C5B1CF6E7B2 -S315080001B830BC704710B403001400621E002C02D02D -S315080001C819705B1CF8E710BC704770B403001C0074 -S315080001D80D0000201600721E002E06D020782E78F4 -S315080001E8801B6D1C641C0028F4D070BC704702780C -S315080001F8002A04D002788A4201D0401CF7E7007822 -S31508000208704770B504002079002825D0206B0500B2 -S3150800021801232A0014F13401607803F0A9FC0028A8 -S3150800022801D0012019E000202071606A854213D3A5 -S31508000238606AE169081885420ED2E0780600022E3F -S315080002480AD3E069451901232A0014F134016078B4 -S3150800025803F08EFC761EF2E7002070BD38B5040060 -S315080002680D00206B854212D02000FFF7CAFF002830 -S3150800027801D001200CE001232A0014F1340160782A -S3150800028803F034FC002801D0012001E02563002092 -S3150800029832BD38B504002000FFF7B3FF0500EDB2FC -S315080002A8002D5ED12078032852D1607900284FD0D6 -S315080002B8002020634FF40072002114F13400FFF780 -S315080002C879FF552084F83202AA2084F8330252208E -S315080002D884F83400522084F83500612084F8360002 -S315080002E8412084F83700722084F81802722084F8AE -S315080002F81902412084F81A02612084F81B02206931 -S3150800030884F81C02206980B2000A84F81D02206954 -S31508000318000C84F81E022069000E84F81F02E068A3 -S3150800032884F82002E06880B2000A84F82102E068AE -S31508000338000C84F82202E068000E84F823020123E0 -S31508000348626914F13401607803F012FC00206071C8 -S3150800035800220021607803F050FC002801D0012013 -S3150800036805002800C0B232BD0200891E9069801EA9 -S31508000378814201D3002003E09078D26A00FB01206D -S3150800038870472DE9F04104000D00022D02D3A0693B -S31508000398854201D3012071E02078012804D06BD367 -S315080003A803284AD031D367E0A84618EB5808606A8C -S315080003B810EB58212000FFF751FF00285CD14FF4B5 -S315080003C80070B8FBF0F101FB1081081990F83400A9 -S315080003D8060018F10108606A10EB58212000FFF79B -S315080003E83DFF002848D14FF40070B8FBF0F101FB37 -S315080003F81081081990F8340056EA0026E80701D54E -S31508000408300901E03005000D38E0606A10EB152167 -S315080004182000FFF723FF00282ED168004FF400714B -S31508000428B0FBF1F202FB1102101934300700787894 -S31508000438397851EA002080B220E0606A10EBD511BD -S315080004482000FFF70BFF002816D1A8004FF400710B -S31508000458B0FBF1F202FB1102101934300700F878E4 -S31508000468B978090451EA0060797850EA01203978A0 -S3150800047808430001000901E05FF0FF30BDE8F0819C -S315080004882DE9F84304000D001600022D02D3A069D1 -S31508000498854202D302208146A0E02078012805D0AB -S315080004A8C0F0988003286BD04CD393E02F0017EB45 -S315080004B85707606A10EB57212000FFF7CFFE8146E1 -S315080004C85FFA89F9B9F1000F40F086804FF4007099 -S315080004D8B7FBF0F101FB1071081934308046E807BC -S315080004E806D598F8000010F00F0050EA061000E04C -S315080004F8300088F800007F1C01202071606A10EB24 -S3150800050857212000FFF7AAFE81465FFA89F9B9F153 -S31508000518000F61D14FF40070B7FBF0F101FB1071C1 -S31508000528081934308046E80701D5300907E098F8F5 -S31508000538000010F0F000310A11F00F01084388F89E -S31508000548000049E0606A10EB15212000FFF786FED7 -S3150800055881465FFA89F9B9F1000F3DD168004FF471 -S315080005680071B0FBF1F202FB110210193430804613 -S3150800057888F80060300080B2000A88F801002BE08D -S31508000588606A10EBD5112000FFF768FE81465FFA0E -S3150800059889F9B9F1000F1FD1A8004FF40071B0FB13 -S315080005A8F1F202FB110210193430804698F803005C -S315080005B8000610F07040064388F80060300080B2E4 -S315080005C8000A88F80100300C88F80200300E88F80E -S315080005D8030001E002208146012020714846C0B286 -S315080005E8BDE8F283F8B504000D00022D02D3A06910 -S315080005F8854202D3022006002AE000200600A069E8 -S31508000608854225D229002000FFF7BBFE0700002FE8 -S315080006181ED0012F02D10220060019E017F1010F9A -S3150800062802D10120060013E0002229002000FFF766 -S3150800063827FF0600F6B2002E0AD1206910F1010F2D -S3150800064804D02069401C2061012060713D00D6E76E -S315080006583000C0B2F2BD2DE9F84304000D00002DA4 -S315080006680AD1E0688046B8F1000F02D0A069804533 -S3150800067811D3012080460EE029002000FFF781FEED -S315080006880600022E01D2012051E0A069864201D255 -S3150800069830004CE0A84647467F1CA069874205D328 -S315080006A802200700B84501D2002040E039002000A2 -S315080006B8FFF767FE0600002E0CD17FF0704239005E -S315080006C82000FFF7DDFE81465FFA89F9B9F1000FC8 -S315080006D813D10AE016F1010F01D0012E01D130001D -S315080006E825E04745D8D1002021E0002D05D03A005D -S315080006F829002000FFF7C4FE81465FFA89F9B9F197 -S31508000708000F0AD1E760206910F1010F0ED02069A1 -S31508000718401E20610120607108E05FFA89F9B9F185 -S31508000728010F02D15FF0FF3700E001273800BDE866 -S31508000738F283F8B504000D00E580A0680600012ECE -S3150800074803D020688069864201D302204BE0002E38 -S3150800075806D120680078032802D12068806A060036 -S31508000768002E0ED1E66020680089ADB2854201D315 -S31508000778022038E02068806AADB210EB15102061B7 -S3150800078825E02068807880B200010700ADB2BFB2C4 -S31508000798BD4213D331002068FFF7F3FD060016F1B2 -S315080007A8010F01D101201EE0022E03D320688069BB -S315080007B8864201D3022016E0ED1BE7E7E660310022 -S315080007C82068FFF7D1FDADB210EB15102061ADB268 -S315080007D81020B5FBF0F101FB1051206810EB411011 -S315080007E8343060610020F2BD2DE9F04104000F00A5 -S315080007F8E088401C0600B6B2002E02D02069002800 -S3150800080801D104208CE0B6B21020B6FBF0F101FB4A -S315080008181061002977D12069401C2061E06800280A -S3150800082806D120680089B6B286426CD3042077E0E0 -S31508000838B6B220688078401E10EA161F63D1E168B0 -S315080008482068FFF79EFD0500022D01D2022067E009 -S3150800085815F1010F01D1012062E0206880698542FF -S315080008684BD3002F01D104205AE0E1682068FFF72E -S31508000878F2FE0500002D01D1072051E0012D01D116 -S3150800088802204DE015F1010F01D1012048E020684A -S31508000898FFF7B7FC002801D0012041E04FF40072A9 -S315080008A8002120683430FFF785FC29002068FFF707 -S315080008B85BFD2168086300208046206880785FFA17 -S315080008C888F8804511D22068012101712068FFF750 -S315080008D898FC002801D0012022E02068006B401C03 -S315080008E82168086318F10108E7E72068006B5FFAD2 -S315080008F888F8B0EB080021680863E56029002068D5 -S31508000908FFF732FD2061E680B6B21020B6FBF0F19B -S3150800091801FB1061206810EB41103430606100203B -S31508000928BDE8F081F8B504000D0000212000FFF7A6 -S3150800093800FF0600F6B2002E1FD100200700216925 -S315080009482068FFF78BFC0600F6B2002E15D1606901 -S315080009580078E52803D060690078002803D17F1C51 -S31508000968AF4202D109E00020070001212000FFF765 -S315080009783BFF0600F6B2002EE1D03000C0B2F2BD49 -S3150800098810B40200CB7E8C7E54EA03239BB218006F -S315080009981378032B06D14B7D0C7D54EA03239BB2AF -S315080009A850EA034010BC704781760A0092B2120AD0 -S315080009B8C2760A0C02750A0C92B2120A4275704778 -S315080009C82DE9F84304000D00287830F04000401E51 -S315080009D80D21484306000020070001208046DFF85D -S315080009E8400B385C40194078DFF8341B795C495D60 -S315080009F851EA002081461FFA88F8B8F1000F12D08C -S31508000A08484680B203F06FF98046FF2E09D234F8BB -S31508000A18160003F068F9761C1FFA88F880B2804534 -S31508000A2809D0002019E01FFA89F94FF6FF708145A9 -S31508000A3801D0002011E07F1C0D2FD0D3287840065E -S31508000A480AD51FFA88F8B8F1000F05D034F8160049 -S31508000A58002801D0002000E00120BDE8F283F0B4A8 -S31508000A680200087810F03F00401E0D27784303005F -S31508000A780020040001200500DFF8A40A205C4018BD -S31508000A884078DFF89C7AE75D7F5C57EA0020060025 -S31508000A98ADB2002D08D0FF2B01D3002019E0350090 -S31508000AA822F813605B1C06E0B6B24FF6FF70864262 -S31508000AB801D000200DE0641C0D2CDDD30878400613 -S31508000AC806D5FF2B01D3002003E0002022F81300E7 -S31508000AD80120F0BC7047F0B44B730F27CF7200277C -S31508000AE80F7300278F760027CF76D2B2571E5FF08E -S31508000AF80D0C0CFB07F73C0000273E00BFB23D0073 -S31508000B08B6B24FF6FF77BE4203D030F814703E00EF -S31508000B18641CDFF80C7AEF5D7E54DFF8047AEF5D23 -S31508000B287F18B6B25FEA162C87F801C0B6B2002E4F -S31508000B3802D14FF6FF773E006D1C0D2DE0D3B6B2F5 -S31508000B484FF6FF77BE4203D030F81470002F01D154 -S31508000B5852F040020A70F0BC70472DE9FC470400C1 -S31508000B680D00160099460B2229002000FFF714FBF2 -S31508000B781FFA89F9B9F1060F0CDB1FFA89F95FEA3A -S31508000B88C93010EB5900318811EB0009B61C3088BA -S31508000B980028F2D1072080461FFA89F9102099FB08 -S31508000BA8F0F101FB109111F130000700FFB23A2F5E -S31508000BB800DBFF1D00A808F80070B8F101081FFA45 -S31508000BC889F9102099FBF0F91FFA89F9B9F1000F8C -S31508000BD8E2D100A87E2108F8001000208246C24506 -S31508000BE806D21AF80400202802D01AF1010AF6E7F4 -S31508000BF8504610F1010AB8F1080F05D200A918F8ED -S31508000C08011018F1010800E020210155BAF1080F72 -S31508000C18EED3BDE8F387010000200B22C0B2C3015A -S31508000C2813EB50000B781818491C521E002AF5D1E8 -S31508000C38C0B270472DE9F047040000212000FFF7ED -S31508000C4878FD82465FFA8AFABAF1000F02D0504652 -S31508000C58C0B272E0FF208146804621692068FFF706 -S31508000C68FDFA82465FFA8AFABAF1000F63D160691B -S31508000C78060030780500EDB2002D02D10420824620 -S31508000C8859E0F07A10F03F000700EDB2E52D04D0E0 -S31508000C98380705D5FFB20F2F02D0FF20804640E05F -S31508000CA8FFB20F2F21D1E06900283AD0680606D589 -S31508000CB8707B814615F0BF05A846E0882084EDB20A -S31508000CC85FFA88F845450DD1707B5FFA89F9814541 -S31508000CD808D13100E069FFF773FE002802D0B8F1A1 -S31508000CE8010801E04FF0FF081BE05FFA88F8B8F141 -S31508000CF8000F06D13000FFF78EFF5FFA89F98145A4 -S31508000D0819D0FF2080464FF6FF702084A069C07A64 -S31508000D18C00706D40B22A1693000FFF756FA002847 -S31508000D2809D000212000FFF75FFD82465FFA8AFA9C -S31508000D38BAF1000F91D05046C0B2BDE8F0872DE948 -S31508000D48F84F04000D004FF0FF0A4FF0FF0B042080 -S31508000D580600206900286DD021692068FFF77EFA09 -S31508000D680600F6B2002E65D16069814699F800003A -S31508000D7880465FFA88F8B8F1000F02D10420060009 -S31508000D8858E099F80B0010F03F0007005FFA88F85A -S31508000D98B8F1E50F0DD05FFA88F8B8F12E0F08D02C -S31508000DA8FFB2082F01D1012000E00020C0B2A842F6 -S31508000DB802D0FF20824635E0FFB20F2F22D15FEA24 -S31508000DC8486007D599F80D00834618F0BF08C2464B -S31508000DD8E08820845FFA88F85FFA8AFAD0450ED147 -S31508000DE899F80D005FFA8BFB834508D14946E069F7 -S31508000DF8FFF735FE002802D0BAF1010A01E04FF0E4 -S31508000E08FF0A0FE05FFA8AFABAF1000F06D14846D8 -S31508000E18FFF701FF5FFA8BFB834502D04FF6FF7099 -S31508000E28208407E000212000FFF7DEFC0600F6B262 -S31508000E38002E8ED0F6B2002E01D000202061300098 -S31508000E48C0B2BDE8F28F2DE9F04784B00400A06966 -S31508000E588046E06982460C22414600A8FFF79CF9BD -S31508000E689DF80B00C0072AD5002088F80B0000203B -S31508000E78E06101200600B6B2642E0FDA33009BB291 -S31508000E88524600A94046FFF768FE2000FFF7D2FE43 -S31508000E980500EDB2002D01D1761CECE7B6B2642E3A -S31508000EA801D107207EE0EDB2042D02D02800C0B299 -S31508000EB878E09DF80B0088F80B00C4F81CA09DF88C -S31508000EC80B00800710D500200600B6B23AF81600BF -S31508000ED8002801D0761CF8E7B6B216F119000D21DC -S31508000EE890FBF1F0070001E001200700BFB23900C6 -S31508000EF82000FFF717FD0500EDB2002D32D17F1E41 -S31508000F08380080B200282DD0E088C11B89B220009D -S31508000F18FFF70FFC0500EDB2002D23D1A069FFF7F6 -S31508000F287AFE814621692068FFF798F90500EDB22F -S31508000F38002D17D14B46DBB23A00D2B26169E06997 -S31508000F48FFF7C9FD20680121017100212000FFF77C -S31508000F584BFC0500EDB2002D04D17F1E380080B287 -S31508000F680028DFD1EDB2002D1AD121692068FFF7D4 -S31508000F7875F90500EDB2002D12D12022002160690D -S31508000F88FFF718F90B22A1696069FFF705F9A06947 -S31508000F98C07A10F018006169087320680121017188 -S31508000FA82800C0B204B0BDE8F08770B50400E08830 -S31508000FB80600208C4FF6FF71884201D1310000E007 -S31508000FC8218C89B22000FFF7B4FB0500EDB2002D8D -S31508000FD81ED121692068FFF741F90500EDB2002DF9 -S31508000FE811D16069E5210170206801210171E08845 -S31508000FF8B6B2B04207D200212000FFF7F5FB05007C -S31508001008EDB2002DE5D0EDB2042D01D10220050080 -S315080010182800C0B270BD2DE9F34F81B00298006868 -S31508001028070038782F2802D038785C2801D17F1C29 -S31508001038F7E70198C06905000020814682461AF834 -S31508001048070080461AF1010A1FFA88F8B8F1200F36 -S3150800105809DB1FFA88F8B8F12F0F04D01FFA88F8A9 -S31508001068B8F15C0F09D11AEB0700029908601FFA54 -S3150800107888F8B8F1200F2CDA28E0B9F1FF0F01D368 -S3150800108806201CE15FFA88F80121404680B202F082 -S3150800109803FE80461FFA88F8B8F1000F01D106202A -S315080010A80DE11FFA88F8B8F1800F0ADA1FFA88F8EE -S315080010B84146DFF8B40AFFF79AF8002801D0062057 -S315080010C8FDE025F8198019F10109B8E75FF0040B66 -S315080010D801E05FF0000BB9F1000F11D015EB4900DC -S315080010E830F8020C80461FFA88F8B8F1200F04D0A9 -S315080010F81FFA88F8B8F12E0F02D1B9F10109EAE703 -S31508001108B9F1000F01D10620D9E0002025F8190009 -S315080011180B22202101988069FFF74CF800208246A7 -S3150800112835F81A00202803D035F81A002E2802D1D7 -S315080011381AF1010AF4E7BAF1000F01D05BF0030BC4 -S31508001148B9F1000F08D015EB490030F8020C2E2823 -S3150800115802D0B9F10109F3E70020060004000820C7 -S31508001168009035F81A0080461AF1010A1FFA88F81D -S31508001178B8F1000F74D01FFA88F8B8F1200F06D016 -S315080011881FFA88F8B8F12E0F04D1CA4502D05BF0C9 -S31508001198030BE6E70098864201D2CA4512D10098A1 -S315080011A80B2802D15BF0030B5AE0CA4501D05BF065 -S315080011B8030BD14554D3CA46082006000B200090D5 -S315080011C8A400CEE71FFA88F8B8F1800F14DB0021CF -S315080011D8404680B202F060FD80461FFA88F8B8F1EA -S315080011E8000F07D01FFA88F8DFF8800918EB000007 -S315080011F810F8808C5BF0020B1FFA88F8B8F1000F1C -S3150800120808D01FFA88F84146DFF86409FEF7EFFFA9 -S31508001218002804D05F2080465BF0030B1AE01FFA0B -S3150800122888F8B8F1410F07DB1FFA88F8B8F15B0FA1 -S3150800123802DA54F002040DE01FFA88F8B8F1610FD3 -S3150800124808DB1FFA88F8B8F17B0F03DA54F00104B3 -S31508001258B8F120080198806906F80080761C80E7AE -S31508001268019880690078E52803D1019880690521E5 -S3150800127801700098082800D1A400E4B214F00C0004 -S315080012880C2804D0E4B214F00300032801D15BF05B -S31508001298020B5FEA8B700DD4E4B214F00300012840 -S315080012A801D15BF0100BE4B214F00C00042801D14C -S315080012B85BF0080B0198806980F80BB00020BDE840 -S315080012C8FE8F2DE9F14F82B00C0004F209000700E1 -S315080012D80298006900285DD0029840690500287BB5 -S315080012E88DF8000000208046B8F1080F1AD218F8C1 -S315080012F805000600F6B2202E14D0F6B2052E01D146 -S31508001308E52006009DF80000000706D5F6B2412E2E -S3150800131803DBF6B25B2E00DA20363E707F1C18F126 -S315080013280108E1E7287A20281DD02E2038707F1C6E -S3150800133808208046B8F10B0F15D218F805000600E4 -S31508001348F6B2202E0FD09DF80000C00606D5F6B2D4 -S31508001358412E03DBF6B25B2E00DA20363E707F1C80 -S3150800136818F10108E6E7E87A2072E87FA97F0904F8 -S3150800137851EA0060697F50EA0120297F0843206006 -S31508001388687E297E51EA0020A080E87DA97D51EA79 -S315080013980020E08000203870A069002838D0E0696D -S315080013A8002835D0D4F8189000208046029800699D -S315080013B800282AD00298008C4FF6FF71884224D05C -S315080013C80298C0698346BBF800001BF1020B8246E7 -S315080013D880B2002819D00021504680B202F05CFC81 -S315080013E882461FFA8AFABAF1000F02D1002080460F -S315080013F80BE0E069401E804502D30020804604E0E1 -S3150800140808F809A018F10108DDE7002008F809001E -S31508001418BDE8F78FF2B50400009800782F2803D0A6 -S31508001428009800785C2802D10098401C009000209B -S31508001438A06000980078202807D200212000FFF72E -S3150800144878F905000020606129E000A92000FFF767 -S31508001458E2FD0500EDB2002D21D12000FFF7EAFBD9 -S315080014680500A069C07A0700EDB2002D07D0EDB2D5 -S31508001478042D14D1780701D4052005000FE0780754 -S315080014880DD460690600F07AC00602D40520050066 -S3150800149805E031002068FFF773FAA060D5E7280051 -S315080014A8C0B2F2BD38B504000D0001232A0014F1B4 -S315080014B83401607802F01AFB002801D003202DE0D9 -S315080014C894F8330294F8321251EA002080B24AF6A8 -S315080014D85521884201D0022020E094F86C0094F83F -S315080014E86B10090251EA004094F86A100843DFF8BD -S315080014F88416884201D1002010E094F8880094F8F0 -S315080015088710090251EA004094F886100843DFF864 -S315080015186416884201D1002000E0012032BD00008F -S31508001528EC6900082DE9F74F86B00698D0F80090C0 -S3150800153899F800003038019001980A2809D299F8D4 -S3150800154801003A2805D119F102090698C0F8009051 -S3150800155801E0002001900798002101600198002801 -S3150800156801D00B20FEE10198DFF8F41C51F82000A1 -S315080015788246BAF1000F01D10C20F3E10798C0F8AA -S3150800158800A09AF80000002815D09AF8010002F081 -S3150800159897FA8DF800009DF80000C0070BD49DF84F -S315080015A82000002805D09DF80000400701D50A202C -S315080015B8D8E10020D6E100208AF8000001988AF8C8 -S315080015C801009AF8010002F061FA8DF800009DF80A -S315080015D80000C00701D50320C4E19DF820000028B3 -S315080015E805D09DF80000400701D50A20BAE1002178 -S315080015F88B465046FFF756FF0400E4B2012C23D168 -S3150800160800200600F6B2002E00D0761EF6B21AEBB7 -S31508001618061000F2F210029002980079002813D0FA -S315080016280298C07A0299897A090451EA00600299EF -S31508001638497A50EA01200299097A084383465946A5 -S315080016485046FFF72FFF0400E4B2032C01D101200E -S3150800165888E1E4B2002C01D00D2083E19AF8400015 -S315080016689AF83F1051EA002080B2B0F5007F01D001 -S315080016780D2077E19AF84B009AF84A1051EA0020AB -S3150800168880B20700002F0ED19AF85B009AF85A1014 -S31508001698090451EA00609AF8591050EA01209AF8A4 -S315080016A8581008430700CAF81C709AF84400050041 -S315080016B88AF80300EDB2012D04D0EDB2022D01D04F -S315080016C80D204FE1EDB26F439AF8410005008AF8FC -S315080016D80200EDB2002D04D0691E2800C0B20842E7 -S315080016E801D00D203EE19AF846009AF8451051EACD -S315080016F80020AAF80800BAF808001021B0FBF1F291 -S3150800170802FB1102002A01D00D202BE19AF84800A5 -S315080017189AF8471051EA002080B2049004980028E5 -S315080017280ED19AF857009AF85610090451EA00603B -S315080017389AF8551050EA01209AF85410084304906C -S315080017489AF843009AF8421051EA0020ADF80200C8 -S31508001758BDF80200002801D10D2003E1BDF80200FA -S3150800176817FA80F0BAF8081010EB111005900498CB -S315080017780599884201D20D20F4E004980599401A83 -S315080017889AF80210B0FBF1F003900398002801D1EB -S315080017980D20E7E001200400039840F6F671884218 -S315080017A801D30220040003984FF6F671884201D344 -S315080017B8032004000398801CCAF81800CAF820B049 -S315080017C8BDF802001BFA80F0CAF82400059810EB49 -S315080017D80B00CAF82C00E4B2032C1AD1BAF8080090 -S315080017E8002801D00D20BDE09AF863009AF8621027 -S315080017F8090451EA00609AF8611050EA01209AF83B -S3150800180860100843CAF82800DAF8180080008046ED -S315080018181CE0BAF80800002801D10D20A2E0DAF881 -S3150800182824003818CAF82800E4B2022C04D1DAF8D9 -S3150800183818005FEA400809E0DAF818000321484367 -S315080018489AF8181011F0010111EB5008DAF81C0083 -S3150800185808F2FF11B0EB512F01D20D2082E05FF09C -S31508001868FF30CAF810000020CAF80C00E4B2032CAE -S3150800187866D100208AF805009AF865009AF8641077 -S3150800188851EA00201BFA80F0CAF814000123DAF896 -S3150800189814201AF134019AF8010002F027F90028F1 -S315080018A84ED19AF833029AF8321251EA002080B2D9 -S315080018B84AF65521884243D19AF837009AF83610DD -S315080018C8090451EA00609AF8351050EA01209AF896 -S315080018D834100843DFF8B41A884231D19AF81B0243 -S315080018E89AF81A12090451EA00609AF8191250EA85 -S315080018F801209AF818120843DFF8941A88421FD16B -S315080019089AF823029AF82212090451EA00609AF80A -S31508001918211250EA01209AF820120843CAF80C0046 -S315080019289AF81F029AF81E12090451EA00609AF8F2 -S315080019381D1250EA01209AF81C120843CAF810002A -S315080019488AF80040DFF84C0A0088401CDFF8441A79 -S315080019580880AAF806000020CAF8300000208AF88D -S315080019680400002009B0BDE8F08F38B5040025004A -S31508001978002D0BD02868002808D028680078002889 -S3150800198804D02868C088A988884201D0092008E0B8 -S315080019982868407802F094F8C00701D5032000E0CB -S315080019A8002032BD0200D2B2002A01D00B2013E073 -S315080019B8D2B2DFF8AC0850F822000300002B01D099 -S315080019C800201870002901D000200870D2B2DFF86C -S315080019D8900840F82210002070472DE9F2438CB091 -S315080019E804001500002C01D10920BAE00020206067 -S315080019F815F01F0515F0FE0200A90CA8FFF792FDC1 -S31508001A080600F6B2002E40F0AA8009A80690DFF86C -S31508001A18880907900C9900A8FFF7FCFC06000598AA -S31508001A280700F6B2002E03D1002F01D106200600C2 -S31508001A381C2005425BD0F6B2002E0BD0F6B2042E57 -S31508001A4803D100A8FFF7FFF9060055F00805059821 -S31508001A5807000AE0F87A1121084202D00720060092 -S31508001A6803E0680701D508200600F6B2002E4ED115 -S31508001A7828074CD502F0FEF8804687F80E804046BF -S31508001A8880B2000AF8735FEA184038745FEA18608B -S31508001A9878740020F87200203877002078770020BC -S31508001AA8B8770020F87739000098FEF769FF81466D -S31508001AB800213800FEF778FF009801210171B9F175 -S31508001AC8000F24D00098006B804649460098FEF718 -S31508001AD889FD0600F6B2002E19D10098B9F1010160 -S31508001AE8C16041460098FEF7B9FB06000FE0F6B25A -S31508001AF8002E0CD1F87AC00602D50420060006E0A6 -S31508001B08A80704D5F87AC00701D507200600F6B253 -S31508001B18002E07D1280701D555F020050098006B37 -S31508001B28E0612762F6B2002E19D1A571390000982E -S31508001B38FEF726FF2061F87FB97F090451EA00609D -S31508001B48797F50EA0120397F0843E0600020A060C9 -S31508001B580020A061009820600098C088A080300006 -S31508001B68C0B20DB0BDE8F0832C6A0008F465000819 -S31508001B78506A0008464154002DE9FA4F83B004001C -S31508001B881500DDF80CB00498002101602000FFF765 -S31508001B98ECFE8DF804009DF80400002802D09DF894 -S31508001BA80400E8E0A079000601D50220E3E0A07960 -S31508001BB8C00701D40720DEE0E068A168401A009053 -S31508001BC80098A84201D200980500002D00F0D2809E -S31508001BD8A0684FF40071B0FBF1F202FB1102002A6B -S31508001BE840F09E80A068400A21688978491E084006 -S31508001BF882465FFA8AFABAF1000F1CD1A068002853 -S31508001C0802D12069060004E061692068FEF7B9FB7D -S31508001C180600022E05D2A07950F08000A071022095 -S31508001C28A9E016F1010F05D1A07950F08000A0713E -S31508001C380120A0E0666161692068FEF795FB070048 -S31508001C48002F05D1A07950F08000A071022092E0FB -S31508001C5857FA8AF7680A8146B9F1000F35D020681D -S31508001C68807859FA8AF1884206D2206880785FFA1D -S31508001C788AFAB0EB0A0081464B46DBB23A00594667 -S31508001C882068407801F032FF002805D0A07950F086 -S31508001C988000A07101206EE0A07940060FD5A069E2 -S31508001CA8C01B48450BD24FF4007214F12401A069F1 -S31508001CB8C01B4FF4007303FB00B0FEF76DFA4FF430 -S31508001CC8007000FB09F0804645E0A069B84226D0B6 -S31508001CD8A079400613D50123A26914F124012068C6 -S31508001CE8407801F045FF002805D0A07950F080001B -S31508001CF8A07101203FE0A07910F0BF00A071012370 -S31508001D083A0014F124012068407801F0EFFE002813 -S31508001D1805D0A07950F08000A07101202BE0A761BA -S31508001D28A0684FF40071B0FBF1F202FB1102D2F57C -S31508001D3800708046454500D2A8464246A0684FF43A -S31508001D480071B0FBF1F303FB1103181910F1240114 -S31508001D585846FEF721FA18EB0B0BA06818EB00009B -S31508001D68A0600498006818EB000004990860B5EBB1 -S31508001D7808052AE7002005B0BDE8F08F2DE9FB4FD6 -S31508001D8804001500DDF804A002980021016020006F -S31508001D98FFF7EBFD8DF800009DF80000002802D03B -S31508001DA89DF8000004E1A079000601D50220FFE0AD -S31508001DB8A079800701D40720FAE0E0682818E168C6 -S31508001DC8884201D200200500002D00F0E680A068B0 -S31508001DD84FF40071B0FBF1F202FB1102002A40F041 -S31508001DE8AE80A068400A21688978491E084083465B -S31508001DF85FFA8BFBBBF1000F27D1A06800280AD130 -S31508001E0820690600002E0BD100212068FEF723FC66 -S31508001E180600206104E061692068FEF71CFC0600DC -S31508001E28002E00F0BA80012E05D1A07950F0800066 -S31508001E38A0710220BCE016F1010F05D1A07950F077 -S31508001E488000A0710120B3E06661A079400613D529 -S31508001E580123A26914F124012068407801F088FE5C -S31508001E68002805D0A07950F08000A07101209FE0D5 -S31508001E78A07910F0BF00A07161692068FEF774FAAE -S31508001E880700002F05D1A07950F08000A071022024 -S31508001E988EE057FA8BF7680A8146B9F1000F36D0F3 -S31508001EA82068807859FA8BF1884206D220688078AB -S31508001EB85FFA8BFBB0EB0B0081464B46DBB23A0068 -S31508001EC851462068407801F053FE002805D0A079CD -S31508001ED850F08000A07101206AE0A069C01B48453F -S31508001EE80FD24FF40072A069C01B4FF4007101FBB2 -S31508001EF800A114F12400FEF74FF9A07910F0BF00ED -S31508001F08A0714FF4007000FB09F0804636E0A0691E -S31508001F18B84213D0A068E16888420FD201233A0074 -S31508001F2814F124012068407801F0E0FD002805D066 -S31508001F38A07950F08000A071012039E0A761A06857 -S31508001F484FF40071B0FBF1F202FB1102D2F50070F2 -S31508001F588046454500D2A84642465146A0684FF4F1 -S31508001F680073B0FBF3FC0CFB130C1CEB04002430C9 -S31508001F78FEF712F9A07950F04000A07118EB0A0A8A -S31508001F88A06818EB0000A0600298006818EB00002B -S31508001F9802990860B5EB080516E7E068A168884263 -S31508001FA801D2A068E060A07950F02000A071002056 -S31508001FB8BDE8FE8FF8B504002000FFF7D6FC05003B -S31508001FC8EDB2002D4ED1A07980064BD5A0794006F2 -S31508001FD80FD50123A26914F124012068407801F07D -S31508001FE8C7FD002801D001203EE0A07910F0BF0007 -S31508001FF8A071E1692068FEF731F90500EDB2002DF8 -S3150800200830D1206A0700F87A50F02000F872E068A4 -S315080020183877E06880B2000A7877E068000CB87705 -S31508002028E068000EF87721693800FEF7BDFC01F074 -S3150800203821FE0600BE75300080B2000AF875300C1D -S315080020483876300E78760020B8740020F874A079AF -S3150800205810F0DF00A0712068012101712068FEF7E1 -S3150800206818F905002800C0B2F2BD38B504002000EA -S31508002078FFF7A0FF0500EDB2002D01D10020206072 -S315080020882800C0B232BD2DE9F04704000D00200033 -S31508002098FFF76BFC0600F6B2002E02D03000C0B27D -S315080020A8DBE0A079000601D50220D6E0E068A84260 -S315080020B804D2A079800701D4E0680500A0688246A2 -S315080020C800208146A060002D00F086802068807870 -S315080020D84FF4007148438046BAF1000F13D0BAF19D -S315080020E80100B0FBF8F0691EB1FBF8F181420AD38A -S315080020F8BAF10100B8F101018843A060A0682D1A59 -S31508002108606907001BE020690700002F16D1002127 -S315080021182068FEF7A0FA0700012F05D1A07950F02C -S315080021288000A071022098E017F1010F05D1A07967 -S3150800213850F08000A07101208FE027616761002FA9 -S315080021484AD0A8452DD2A079800708D53900206835 -S31508002158FEF781FA0700002F06D1454621E0390027 -S315080021682068FEF70EF9070017F1010F05D1A079C7 -S3150800217850F08000A07101206FE0022F03D3206879 -S315080021888069874205D3A07950F08000A0710220A3 -S3150800219863E06761A06818EB0000A060B5EB080566 -S315080021A8CFE7A0682818A0604FF40070B5FBF0F1D7 -S315080021B801FB105100290FD039002068FEF7D4F822 -S315080021C88146B9F1000F05D1A07950F08000A071B9 -S315080021D8022042E019EB5529A0684FF40071B0FBBC -S315080021E8F1F202FB1102002A2BD0A069814528D0FA -S315080021F8A079400613D50123A26914F124012068A1 -S31508002208407801F0B5FC002805D0A07950F0800088 -S31508002218A071012021E0A07910F0BF00A071012368 -S315080022284A4614F124012068407801F05FFC00282A -S3150800223805D0A07950F08000A07101200DE0C4F8FF -S315080022481890E068A168884205D2A068E060A0797D -S3150800225850F02000A0713000C0B2BDE8F087000039 -S315080022680410002031B58CB00C00002203A90CA874 -S31508002278FFF758F90500EDB2002D15D100A8099009 -S3150800228845480A900C9903A8FFF7C4F80500EDB26B -S31508002298002D09D10898002804D0210003A8FFF7C3 -S315080022A810F801E0062005002800C0B20DB030BDC0 -S315080022B871B595B0012200A915A8FFF733F90400EE -S315080022C8E4B2002C5CD109A8069033480790159902 -S315080022D800A8FFF79FF80400E4B2002C50D105982F -S315080022E80500002D02D10620040004E0E87AC0079C -S315080022F801D50720040029000098FEF741FB0600CF -S31508002308E4B2002C24D1E87AC00621D5022E02D2DE -S31508002318022004001CE0242200A90CA8FDF73CFFB3 -S315080023280E9602210CA8FEF704FA0400E4B2002C63 -S315080023380ED100210CA8FEF702FD0400E4B2002C19 -S3150800234801D107200400E4B2042C01D100200400BE -S31508002358E4B2002C14D100A8FEF727FE0400E4B264 -S31508002368002C0DD1002E04D031000098FEF73AF95A -S315080023780400E4B2002C03D10098FDF78AFF040094 -S315080023882000C0B216B070BD00000000525261416C -S31508002398727241611C100020A00A00202DE9F04342 -S315080023A883B004000D0016000027A146681E874260 -S315080023B81ADA00AB012201A93000FFF7DDFB009805 -S315080023C8012811D19DF8040080465FFA88F8B8F10B -S315080023D80D0FEBD089F8008019F101097F1C5FFA07 -S315080023E888F8B8F10A0FE1D1002089F80000002F13 -S315080023F800D100242000BDE8FE837CB504000D004A -S31508002408E4B20A2C03D129000D20FFF7F6FF8DF850 -S3150800241800400120060001AB320000A92800FFF79A -S31508002428ADFC0198B04201D1012001E05FF0FF3010 -S3150800243876BD70B504000D00002006002078002837 -S315080024480CD029002078FFF7D8FF10F1010F02D128 -S315080024585FF0FF3003E0641C761CEFE7300070BDC0 -S3150800246880B500208DF8000001F0A7FA01F05CFCA1 -S3150800247800F089F88DF800009DF80000002802D0C1 -S315080024889DF8000046E000F0A4F98DF800009DF8D4 -S315080024980000002802D09DF800003BE0DFF8C00BDA -S315080024A800210175DFF8B80B00210160DFF8B00BD1 -S315080024B800214160DFF8A80B00218160DFF8A00B36 -S315080024C80021C160DFF8980B00210161DFF8900B45 -S315080024D801F036FCDFF88C0B00F04CFA8DF800009A -S315080024E89DF80000002809D1DFF8780BB0F85400E9 -S315080024F80004002100F092FC8DF800009DF8000009 -S31508002508002805D14FF4006000F024FC8DF800007F -S315080025189DF8000002BD10B5042400F00DF804006B -S31508002528E4B2042C01D1002005E0E4B2FF2C01D165 -S31508002538022000E0012010BD80B50020009000F0C0 -S3150800254810F801280BD100A800F0ACFE002801D02D -S31508002558FF2005E00098400A10F00F0000E0FF2071 -S3150800256802BD80B501208DF800004FF40061DFF840 -S31508002578FC0A01F0C8FC002802D100208DF80000EA -S315080025889DF8000002BDF8B500208DF8000000246B -S31508002598002500260027DFF8C80A76210175DFF826 -S315080025A8C00A00210160DFF8B80A00214160DFF897 -S315080025B8B00A00218160DFF8A80A0021C160DFF8A7 -S315080025C8A00A00210161DFF8980A01F0B9FB032087 -S315080025D801F0CFFB012001F0C8FBDFF88C0A0021C7 -S315080025E80160DFF8840A00214160DFF87C0A0021CF -S315080025F88160DFF8740A0021C160DFF86C0A4FF4BD -S3150800260880610161DFF8600A01F0BBFB00F08EFE0D -S315080026188DF800009DF80000002802D09DF80000FB -S31508002628D6E0DFF8440A4FF4D5710160DFF8380AB6 -S3150800263808214160DFF8300A40218160DFF8280A5E -S315080026480021C160DFF8200A4FF480610161DFF8D4 -S31508002658180A01F096FB00F085FE8DF800009DF833 -S315080026680000002807D1DFF8080A012101605FF099 -S31508002678804007001DE0DFF8F00900210160DFF857 -S31508002688E80937214160DFF8E00940218160DFF871 -S31508002698D8090021C160DFF8D0094FF480610161CB -S315080026A8DFF8C40901F06DFB372000F089FE8DF8C4 -S315080026B80000DFF8B40900210160DFF8AC0937210A -S315080026C84160DFF8A40940218160DFF89C090021F0 -S315080026D8C160DFF894094FF480610161DFF8880961 -S315080026E801F04FFB372000F06BFE8DF800009DF8CF -S315080026F8000000286AD1002E56D14FF6FF70854291 -S3150800270852D2DFF8640900210160DFF85C09372135 -S315080027184160DFF8540940218160DFF84C0900213F -S31508002728C160DFF844094FF480610161DFF83809B0 -S3150800273801F027FB372000F043FE8DF800009DF8CE -S315080027480000002802D09DF8000041E0DFF82409BF -S315080027583843DFF814190860DFF80C0929214160A5 -S31508002768DFF8040940218160DFF8FC080021C16010 -S31508002778DFF8F4084FF480610161DFF8EC0801F02E -S3150800278800FB00F0ABFE8DF800009DF8000000285D -S3150800279802D09DF800001BE0002001F00AFB0400A7 -S315080027A8E00F06006D1CA6E74FF6FF70854205D3B5 -S315080027B81B208DF800009DF8000009E014F08044FD -S315080027C8002C03D0DFF8A808022101609DF8000054 -S315080027D8F2BD10B582B000240120ADF8000001F062 -S315080027E8CBFA002804D1252004002000C0B2C0E096 -S315080027F8DFF87C080068042839D0DFF86C0800215F -S315080028080160DFF8640802214160DFF85C08C0212E -S315080028188160DFF854080021C160DFF84C084FF4DE -S3150800282880610161DFF8400801F0ABFA00F075FE37 -S315080028380400E4B2002C02D02000C0B299E00020BF -S3150800284801F0B7FADFF830180860042001F0B1FA89 -S31508002858DFF824184860082001F0ABFADFF81818E2 -S3150800286888600C2001F0A5FADFF80C18C860DFF8B4 -S315080028780008006800280ED0DFF8F4070068012869 -S3150800288809D0DFF8EC070068062804D0DFF8E00767 -S315080028980068022823D1DFF8D00700210160DFF895 -S315080028A8C80703214160DFF8C00740218160DFF8C7 -S315080028B8B8070021C160DFF8B0074FF480610161ED -S315080028C8DFF8A40701F05DFA00A9032000F052FE1C -S315080028D80400E4B2002C02D02000C0B249E0DFF8B8 -S315080028E890070068042840D0DFF8B009BDF8001042 -S315080028F80160BDF800000004DFF86C170860DFF80F -S31508002908680709214160DFF86007C0218160DFF8A0 -S3150800291858070021C160DFF850074FF4806101614C -S31508002928DFF8440701F02DFA00F0F7FD0400E4B2D9 -S31508002938002C02D02000C0B21BE0002001F039FAB2 -S31508002948DFF85C190860042001F033FADFF850193B -S315080029584860082001F02DFADFF8441988600C2031 -S3150800296801F027FADFF83819C860002004002000AB -S31508002978C0B216BD2DE9D003010000200024DFF8F7 -S31508002988F026126881F85620DFF810291268A1F88F -S315080029985420DFF80C291268120E1400E4B2A209B2 -S315080029A80A70C4F383024A7014F003028A70DFF8C7 -S315080029B8F0281268120C1400CC70DFF8E4281268A4 -S315080029C8120A14000C71DFF8D828126814004C7122 -S315080029D8DFF8CC285268120E1400E4B22201CA8025 -S315080029E8DFF8BC285268120C1400CA88E4B2230916 -S315080029F8DBB21A43CA8014F00F020A72DFF8A0285D -S31508002A085268120A1400E4B2E2094A72C4F3801240 -S31508002A188A72C4F34012CA72C4F300120A730022F7 -S31508002A284A73DFF84C261268002A04D0DFF84026D5 -S31508002A381268012A5DD1E4B214F0030292020A610F -S31508002A48DFF85C28526814000A69E4B252EA84027C -S31508002A580A61DFF84C289268120E14000A69E4B273 -S31508002A68A309DBB21A430A61C4F3C2020A7514F051 -S31508002A7807024A75DFF828289268120C1400E4B28F -S31508002A8862098A75C4F38202CA7514F003025200F1 -S31508002A980A76DFF80C289268120A14000A7EE4B24D -S31508002AA852EAD4120A760A69521C0023C1E912238B -S31508002AB8D1E9126701220B7E9B1C9A40D317A2FB09 -S31508002AC8068902FB079903FB0699C1E912890122BF -S31508002AD891F908309A400A65D1E912670A6D002308 -S31508002AE8A2FB068902FB079903FB0699C1E9128925 -S31508002AF838E0DFF87C251268022A33D1DFF8A027E8 -S31508002B0852681400E4B214F03F0212040A61DFF8AE -S31508002B1890279268120E14000A69E4B252EA04224F -S31508002B280A61DFF87C279268120C14000A69E4B275 -S31508002B3822430A61DFF868279268120A14000A69AC -S31508002B480023521C53F100035FF400260027A6FB56 -S31508002B58028906FB039907FB0299C1E912894FF412 -S31508002B6800720A65C4F380124A7614F03F025200CE -S31508002B788A76DFF82C27926814008A7EE4B252EA2D -S31508002B88D4128A7614F07F02CA76DFF81427D26838 -S31508002B98120E1400E4B2E2090A77C4F341124A771E -S31508002BA8C4F382028A7714F003029200CA77DFF820 -S31508002BB8F026D268120C1400CA7FE4B252EA9412BC -S31508002BC8CA77C4F3401281F82020002281F8212010 -S31508002BD814F0010281F82220DFF8C426D268120A06 -S31508002BE81400E4B2E20981F82320C4F3801281F8BC -S31508002BF82420C4F3401281F82520C4F3001281F872 -S31508002C082620C4F3810281F8272014F0030281F8EC -S31508002C182820DFF88C26D2681400E4B2620881F806 -S31508002C282920012281F82A20DFF84C241268120E7E -S31508002C38140081F82C40DFF840241268120C14009E -S31508002C48E4B22202CA85DFF830241268120A140090 -S31508002C58CA8DE4B22243CA85DFF81C241268140018 -S31508002C68E4B222060A63DFF810245268120E14002A -S31508002C780A6BE4B252EA04420A63DFF8FC23526894 -S31508002C88120C14000A6BE4B252EA04220A63DFF84B -S31508002C98E8235268120A14000A6BE4B222430A634C -S31508002CA8DFF8D4235268140081F83440DFF8C823C3 -S31508002CB89268120E140081F83540DFF8BC23926832 -S31508002CC8120C1400E4B222068A63DFF8AC23926871 -S31508002CD8120A14008A6BE4B252EA04428A63DFF8DD -S31508002CE89823926814008A6BE4B252EA04228A632B -S31508002CF8DFF88423D268120E14008A6BE4B22243E2 -S31508002D088A63DFF87423D268120C140091F83C2001 -S31508002D18E4B252EA141281F83C20E4B214F00F0225 -S31508002D281202CA87DFF85023D268120A1400CA8F1B -S31508002D38E4B22243CA87DFF84023D2681400E4B213 -S31508002D48620881F84020012281F84120C0B2BDE816 -S31508002D58D003704738B504000025DFF81403006867 -S31508002D68032804D1272005002800C0B255E0DFF85B -S31508002D7800030068002809D0DFF8F4020068012873 -S31508002D8804D0DFF8EC020068022844D1B4F5805F65 -S31508002D9804D1272005002800C0B23EE0B4F5006F2C -S31508002DA81DD1012000F039FC0500EDB2002D32D105 -S31508002DB8AB4800210175AA4800210160A8480021EE -S31508002DC84160A74800218160A5484FF40061C160A9 -S31508002DD8A34800210161A24800F0B2FF1BE00020C9 -S31508002DE800F01BFC0500EDB2002D14D19C4800210B -S31508002DF801759B480021016099480021416098485F -S31508002E080021816096480021C1609548002101612A -S31508002E18934800F095FF2800C0B232BD70B504008B -S31508002E280D000026DFF840020460DFF83C0207219F -S31508002E384160DFF8340240218160DFF82C02002166 -S31508002E48C16089484FF480610161874800F099FF9D -S31508002E58072000F0B5FA06003000C0B270BD2DE9AB -S31508002E68F84F070014001D000A9E5FF0000B5FF07C -S31508002E780008B946DFF89C0400210170DFF89804B9 -S31508002E8800210160DFF8940400210160DFF890044E -S31508002E9800210160DFF8D8010068022806D14FF43E -S31508002EA800700600640A44EAC5546D0A6E48B6B24C -S31508002EB806606D48102141606B48402181606A4868 -S31508002EC80021C16068484FF480610161664800F0D6 -S31508002ED858FF5FF4803ABAF1000F07D0802000F057 -S31508002EE890FF002802D1BAF1010AF4E7102000F091 -S31508002EF867FA83465FFA8BFBBBF1000F02D0584688 -S31508002F08C0B2ABE0DFF81C045FF0FF310160DFF800 -S31508002F181404B6B24660DFF80C0490218160DFF825 -S31508002F2804040221C160DFF8FC0300210161DFF80F -S31508002F38F40301214161DFF8EC0300F045FF4A4834 -S31508002F480460494811214160474840218160464844 -S31508002F580021C16044484FF480610161424800F08D -S31508002F6810FF112000F02CFA83465FFA8BFBBBF1A1 -S31508002F78000F02D05846C0B270E0DFF8AC0300680C -S31508002F8840F22A61084214D14FF4004000F039FF94 -S31508002F980028F2D000208046B8F1080F06D200F0C3 -S31508002FA82AFF49F8280018F10108F5E719F1200958 -S31508002FB8E3E7082000F025FF002807D0082000F0DE -S31508002FC82DFF042083465846C0B247E0022000F089 -S31508002FD818FF002807D0022000F020FF02208346A9 -S31508002FE85846C0B23AE0202000F00BFF002807D068 -S31508002FF8202000F013FF062083465846C0B22DE06D -S315080030084FF4007000F0FDFE002808D04FF4007059 -S3150800301800F004FF072083465846C0B21EE05FF05A -S31508003028FF3080465FF4001000F0EBFE00280BD056 -S31508003038B8F1000F08D000F0DEFEC9F8000019F153 -S315080030480409B8F10108EDE740F2FF5000F0E6FE82 -S31508003058DFF86803002101605846C0B2BDE8F28F60 -S315080030688C0F0020700E0020BC0F002000080240BC -S315080030780810002000001080E00F00202DE9F14F0D -S3150800308816001F000A9C5FF0000B00255FF0000879 -S315080030985FF00009DDF800A0DFF87802002101706A -S315080030A8DFF8740200210160DFF870020021016070 -S315080030B8DFF86C0200210160DFF8B0040068022816 -S315080030C806D14FF400700400760A46EAC7567F0A06 -S315080030D8DFF89C04A4B20460DFF894041021416068 -S315080030E8DFF88C0440218160DFF884040021C16080 -S315080030F8DFF87C044FF480610161DFF8740400F09E -S3150800310840FE102000F05CF983465FFA8BFBBBF1A2 -S31508003118000F02D05846C0B2BEE0DFF85404066075 -S31508003128DFF84C0418214160DFF844044021816027 -S31508003138DFF83C040021C160DFF834044FF48061ED -S315080031480161DFF82C0400F01CFE182000F038F99D -S3150800315883465FFA8BFBBBF1000F02D05846C0B214 -S315080031689AE0DFF8C0015FF0FF310160DFF8B401CB -S31508003178A4B24460DFF8AC0190218160DFF8A401AD -S315080031880021C160DFF89C0100210161DFF8940184 -S3150800319801214161DFF88C0100F016FEDFF888018D -S315080031A8006840F21A6108423AD14FF4804000F0AC -S315080031B828FE0028F2D0D5F50070202820D2D5F5AB -S315080031C800700421B0FBF1F202FB1102002A04D1B7 -S315080031D8D5F500705FEA900904E0D5F50070800817 -S315080031E810F1010900208046C845D7D2DAF8000050 -S315080031F800F004FE18F101081AF1040A2D1DF3E778 -S3150800320800208046B8F1080F06D25AF8280000F0C0 -S31508003218F5FD18F10108F5E71AF1200A2035BDE78A -S31508003228082000F0EEFD002807D0082000F0F6FD7B -S31508003238042083465846C0B22EE0022000F0E1FD7D -S31508003248002807D0022000F0E9FD022083465846E8 -S31508003258C0B221E0102000F0D4FD002807D01020C5 -S3150800326800F0DCFD052083465846C0B214E04FF44A -S31508003278007000F0C6FD002808D04FF4007000F072 -S31508003288CDFD072083465846C0B205E0DFF8480258 -S31508003298002101605846C0B2BDE8F28F0C10002024 -S315080032A8D00F002038B504000025002C04D12620AC -S315080032B805002800C0B22BE0DFF8F0040068000417 -S315080032C8DFF8AC120860DFF8A8020D214160DFF8C4 -S315080032D8A00240218160DFF898020021C160DFF86A -S315080032E890024FF480610161DFF8840200F049FD1D -S315080032F80D2000F065F80500EDB2002D02D0280073 -S31508003308C0B205E0002000F054FD20602800C0B2D5 -S3150800331832BD0000201000201410002010100020D4 -S315080033282C2C0140A40F0020342C014038B5002469 -S315080033385FF480300500002D06D0802000F061FD7E -S31508003348002801D16D1EF6E7002D04D103200400DC -S315080033582000C0B205E040F2FF5000F05FFD2000F3 -S31508003368C0B232BD70B500245FF48036DFF80809AC -S315080033780068050015F0450F07D1002E05D0761E02 -S31508003388DFF8F40800680500F4E7002E01D068079E -S3150800339807D503200400042000F040FD2000C0B231 -S315080033A80BE0680607D500200400402000F036FD2B -S315080033B82000C0B201E02000C0B270BD1000002095 -S315080033C8F8B504000025DFF8B0080068060016F00E -S315080033D8450F04D1DFF8A00800680600F7E770076C -S315080033E807D503200500042000F018FD2800C0B200 -S315080033F870E0F00707D501200500012000F00EFD52 -S315080034082800C0B266E000F0D0FCE4B2A04204D0BE -S31508003418102005002800C0B25CE040F2FF5000F01A -S31508003428FDFC002000F0C5FC0700DFF8500807423D -S3150800343802D12800C0B24DE0002F01D51C2049E072 -S31508003448780001D5092045E0B80001D50A2041E0F1 -S31508003458F80001D50B203DE0380101D50C2039E0EC -S31508003468780101D50D2035E0F80101D50E2031E0A7 -S31508003478380201D50F202DE0780201D5102029E061 -S31508003488B80201D5112025E0F80201D5122021E05D -S31508003498380301D513201DE0780301D5142019E057 -S315080034A8B80301D5152015E0F80301D5162011E053 -S315080034B8380401D517200DE0780401D5182009E04D -S315080034C8B80401D5192005E0380701D51A2001E006 -S315080034D82800C0B2F2BD00001000002038B500244C -S315080034E8DFF894070068050015F0450F04D1DFF8E2 -S315080034F8880700680500F7E7680707D5032004006A -S31508003508042000F08BFC2000C0B205E040F2FF5012 -S3150800351800F084FC2000C0B232BD38B50025DFF8BB -S3150800352858070068040014F0450F04D1DFF8480767 -S3150800353800680400F7E7600707D50320050004209C -S3150800354800F06CFC2800C0B20FE0E00707D50120A0 -S315080035580500012000F062FC2800C0B205E040F230 -S31508003568FF5000F05BFC2800C0B232BD08100020EE -S31508003578BC0F00202DE9F04104000D000026DFF8F5 -S31508003588F8060068070017F0450F04D1DFF8E806C3 -S3150800359800680700F7E7780707D503200600042020 -S315080035A800F03CFC3000C0B235E0F80707D501202A -S315080035B80600012000F032FC3000C0B22BE000F013 -S315080035C8F4FBE4B2A04204D0102006003000C0B2D2 -S315080035D821E040F2FF5000F021FC002000F0E9FB52 -S315080035E8804618F4604F05D15FEA184028803000F5 -S315080035F8C0B210E05FEA884001D513200BE05FEA05 -S31508003608484001D5102006E05FEA084001D50F209A -S3150800361801E03000C0B2BDE8F08130B583B00400DF -S31508003628002500A80021002206C00838002000F05E -S31508003638C0FB800104D50E2005002800C0B2B4E0FE -S3150800364800A95A48006880B200F0B2F80500EDB241 -S31508003658002D02D02800C0B2A7E0E4B2012C52D14E -S31508003668019840034AD5514800680004DFF8101647 -S315080036780860DFF80C0637214160DFF804064021A8 -S315080036888160DFF8FC050021C160DFF8F4054FF416 -S3150800369880610161DFF8E80500F073FB3720FFF762 -S315080036A88FFE0500EDB2002D02D02800C0B27CE0DE -S315080036B8DFF8CC0502210160DFF8C4050621416060 -S315080036C8DFF8BC0540218160DFF8B4050021C16038 -S315080036D8DFF8AC054FF480610161DFF8A40500F056 -S315080036E850FB0620FFF76CFE0500EDB2002D02D050 -S315080036F82800C0B259E02800C0B256E025200500C7 -S315080037082800C0B251E00198C0034AD52748006886 -S315080037180004DFF86C150860DFF864053721416096 -S31508003728DFF85C0540218160DFF854050021C16097 -S31508003738DFF84C054FF480610161DFF8440500F0B5 -S3150800374820FB3720FFF73CFE0500EDB2002D02D01E -S315080037582800C0B229E0DFF8280500210160DFF853 -S31508003768200506214160DFF8180540218160DFF849 -S3150800377810050021C160DFF808054FF48061016172 -S31508003788DFF8FC0400F0FDFA0620FFF719FE05002D -S31508003798EDB2002D02D02800C0B206E02800C0B25B -S315080037A803E0252005002800C0B23EBD0C10002005 -S315080037B8F0B583B004000D000026002700A80021F4 -S315080037C8002206C00838DFF8B80408210160DFF8C7 -S315080037D8B00410214160DFF8A80440218160DFF8B1 -S315080037E8A0040021C160DFF898044FF480610161E4 -S315080037F8DFF88C0400F0C5FA1020FFF7E1FD070092 -S31508003808FFB2002F02D03800C0B2D5E0DFF8740442 -S3150800381800680004DFF868140860DFF864043721D4 -S315080038284160DFF85C0440218160DFF85404002118 -S31508003838C160DFF84C044FF480610161DFF8400489 -S3150800384800F09FFA3720FFF7BBFD0700FFB2002FED -S3150800385802D03800C0B2AFE0DFF82C025FF0FF31C3 -S315080038680160DFF8240208214160DFF81C023021D4 -S315080038788160DFF814020221C160DFF80C0200211A -S315080038880161DFF8040201214161DFF8FC0100F05B -S315080038989BFADFF8EC0300210160DFF8E403332123 -S315080038A84160DFF8DC0340218160DFF8D40300219A -S315080038B8C160DFF8CC034FF480610161DFF8C0030B -S315080038C800F05FFA3320FFF77BFD0700FFB2002FF1 -S315080038D802D03800C0B26FE0DFF89C03006840F2F7 -S315080038E82A6108420CD15FF4001000F08AFA002811 -S315080038F8F2D000F080FA00A941F82600761CEBE71A -S31508003908082000F07EFA002807D0082000F086FA7A -S31508003918042007003800C0B24EE0022000F071FA11 -S31508003928002807D0022000F079FA0220070038009C -S31508003938C0B241E0202000F064FA002807D0202011 -S3150800394800F06CFA062007003800C0B234E04FF4DD -S31508003958007000F056FA002808D04FF4007000F0FE -S315080039685DFA072007003800C0B225E040F2FF508C -S3150800397800F054FA0098009911F47F41090251EAB7 -S3150800398800600099090A11F47F410843009950EA32 -S31508003998116068600198019911F47F41090251EA9A -S315080039A800600199090A11F47F410843019950EA10 -S315080039B8116028603800C0B2FEBD00B583B0012189 -S315080039C80C2000F071FB0C220821DFF8BC0200F07D -S315080039D8A7FA0C220921DFF8B00200F0A1FA0C2296 -S315080039E80A21DFF8A40200F09BFA0C220B21DFF863 -S315080039F8980200F095FA0C220C21DFF88C0200F0E8 -S31508003A088FFA0C220221DFF8840200F089FA4FF4B3 -S31508003A187060009001208DF8050002208DF80400DA -S31508003A2800208DF8060001208DF8070000A9DFF8A8 -S31508003A38580200F013FA0420009000A9DFF84C0297 -S31508003A4800F00CFA4FF48050009000208DF807001B -S31508003A5800A98D4800F002FA4FF400600090022091 -S31508003A688DF8040000208DF8070000A9864800F0A4 -S31508003A78F5F901214FF4006000F034FB01215FF4E9 -S31508003A88800000F011FB07BDA40F002030B597B0E1 -S31508003A980400FEF7E5FC0500EDB2002D0AD17C48C6 -S31508003AA8007810F0FE007A49087000A8FEF762FF51 -S31508003AB8002003E0764801210170032017B030BDC5 -S31508003AC810B50400724801210170E4B2002C09D12E -S31508003AD8FEF721FD002805D16D48007810F0FE0094 -S31508003AE86B4908706A48007810BD00002DE9F04156 -S31508003AF8ADF5027D04000D00160098460027E4B2CD -S31508003B08002C01D001202FE04046B0F10108C0B2D0 -S31508003B18002828D04FF40070009056FA88F04FF421 -S31508003B28007101FB00F2002301A8FFF798F90700C6 -S31508003B38FFB2002F01D0012016E0FEF7ECFC0128A1 -S31508003B48FBD04FF4007201A95FFA88F84FF40070A9 -S31508003B5800FB085000F0F6FA5FFA88F8B8F1000F8B -S31508003B68D2D1002000E001200DF5027DBDE8F081E4 -S31508003B782DE9F041ADF5027D04000D0016009846C2 -S31508003B880027E4B2002C01D0012032E04046B0F10B -S31508003B980108C0B200282BD04FF400725FFA88F8E3 -S31508003BA84FF4007000FB085101A800F0CBFA4FF457 -S31508003BB80070009056FA88F04FF4007101FB00F285 -S31508003BC8002301A8FFF75AFA0700FFB2002F04D00E -S31508003BD8FFB2052F01D001200BE0FEF79CFC012857 -S31508003BE8FBD05FFA88F8B8F1000FCFD1002000E0C3 -S31508003BF801200DF5027DBDE8F081F0B597B0040007 -S31508003C080D0016000120070021480078C00701D5D5 -S31508003C1803202DE0EDB2002D05D0022D16D005D3D0 -S31508003C28032D19D020E0002007001FE0E4B2002C7D -S31508003C3809D100A8FEF79EFEDDE91201400A40EA0E -S31508003C48C150490A3060002007000FE04FF40070A1 -S31508003C5830800020070009E0E4B2002C01D12020BA -S31508003C6830600020070001E0042007003800C0B2D1 -S31508003C7817B0F0BD07487047342C014008E0FFFD2F -S31508003C88BC0F00200C10002000080240000C02405F -S31508003C98150000200000AA42020092B2802A01DA22 -S31508003CA810001EE000290CD092B2FF2A01DD002080 -S31508003CB806E092B2194810EB4200B0F58070008809 -S31508003CC80FE00023180080B2802808DA80B2134B68 -S31508003CD833F8103092B29A4201D0401CF3E780308C -S31508003CE8C0B280B27047002211000D4A32F811207E -S31508003CF8002A07D00A4A32F8112080B2904201D029 -S31508003D08491CF2E7064A32F81120002A03D005486A -S31508003D1830F81100FFE780B270470000F464000825 -S31508003D28346100081463000880B501214FF4006067 -S31508003D3800F0E7F900214FF4006000F0E2F901BD50 -S31508003D480021384A12681100374A1140027D8368F3 -S31508003D581A4343681A43C3681A4303681A4303692C -S31508003D681A4311432F4A116070473049C0B2086098 -S31508003D7870472F49086070472D48006810F00300FF -S31508003D88704700212B4A036813602B4A12681100F2 -S31508003D98C90AC902426883681A43C3681A43036989 -S31508003DA81A431143244A1160704724480068C0B270 -S31508003DB8704781B001000020009021484018009003 -S31508003DC80098006801B0704700211E4A036813600E -S31508003DD842681D4B1A601D4A1268110031F0F70136 -S31508003DE88268C3681A4303691A4343691A43114325 -S31508003DF8164A1160704716480068704714490860E3 -S31508003E08704701000020134A12680A4202D00122AC -S31508003E18100001E000221000C0B270470E49086081 -S31508003E2870470000042C01400081FFFFA08025424E -S31508003E38002C0140082C01400C2C0140102C014094 -S31508003E48142C0140242C0140282C01402C2C01401C -S31508003E58802C0140342C0140382C0140F0B4002253 -S31508003E680023002400252A00102A4AD20125954055 -S31508003E782B000D681D402C009C4240D1056803267E -S31508003E881700FFB27F00BE40B543056005680E7986 -S31508003E981700FFB27F00BE40354305600D79012D36 -S31508003EA802D00D79022D1AD1856803261700FFB2AC -S31508003EB87F00BE40B543856085684E791700FFB216 -S31508003EC87F00BE4035438560456801269640B54360 -S31508003ED8456045688E799640B6B235434560C568EB -S31508003EE803261700FFB27F00BE40B543C560C56804 -S31508003EF8CE791700FFB27F00BE403543C560521C15 -S31508003F08B2E7F0BC704702000020136989B20B4279 -S31508003F1802D00123180001E000231800C0B2704738 -S31508003F28F0B400230024D2B211F00705EDB2AD00B3 -S31508003F3812FA05F52B0089B2CD1010EB850589B262 -S31508003F48CE1010EB8606366A0F2711F0070C5FFAB3 -S31508003F588CFC5FEA8C0C17FA0CF7BE432E6289B202 -S31508003F68CD1010EB85052D6A1D432C0089B2CD109E -S31508003F7810EB85052C62F0BC704710B450F8041B8A -S31508003F8881B102681218001D50F8043BDC0744BFCB -S31508003F98A9F10104E31852F8044B43F8044B091F26 -S31508003FA8F9D1EBE710BC7047F0B4002100220023D2 -S31508003FB8022400250226DFF868713F6817F00C0707 -S31508003FC839000F00002F04D0042F06D0082F08D078 -S31508003FD83CE0DFF8547107603BE0DFF85071076092 -S31508003FE837E0DFF840713F68C7F380573D00DFF8D0 -S31508003FF834713F6817F03F073E00002D0DD0DFF8F3 -S315080040082C71B7FBF6F7DFF81CC1DCF800C0CCF357 -S31508004018881C0CFB07F73B000CE0DFF80C71B7FBB4 -S31508004028F6F7DFF800C1DCF800C0CCF3881C0CFBF7 -S3150800403807F73B00DFF8EC703F68C7F301477F1CBA -S315080040487F003C00B3FBF4F7076002E0DFF8D8709E -S315080040580760DFF8CC703F6817F0F00739000909E0 -S31508004068DFF8CC70CF5D3A000768D7404760DFF8BD -S31508004078B0703F6817F4E0573900890ADFF8B0705E -S31508004088CF5D3A004768D7408760254F3F6817F4E1 -S3150800409860473900490BDFF89870CF5D3A004768E2 -S315080040A8D740C760F0BC7047C9B2002905D0214A75 -S315080040B8126802431F4B1A6004E01E4A12688243BC -S315080040C81C4B1A607047C9B2002905D01A4A1268EB -S315080040D80243194B1A6004E0174A12688243164BC2 -S315080040E81A607047C9B2002905D0144A12680243F3 -S315080040F8124B1A6004E0114A126882430F4B1A6081 -S315080041087047C9B2002905D00D4A126802430C4BFC -S315080041181A6004E00A4A12688243094B1A60704713 -S3150800412808380240043802400024F400001BB7008F -S315080041380000002030380240403802404438024027 -S315080041482438024070B504000D0016003200290014 -S31508004158200000F013F8200070BD50F8041B61B168 -S3150800416850F8042BD30744BFA9F101039A18002372 -S3150800417842F8043B091FFAD1EFE7704762B38B0789 -S3150800418808D0521E11F8013B00F8013B00F02480C4 -S315080041988B07F6D1830740F0208000BF103A07D373 -S315080041A830B4B1E83810103AA0E83810F9D230BC63 -S315080041B8530724BFB1E80810A0E8081044BF51F80F -S315080041C8043B40F8043BD20724BF31F8022B20F8F9 -S315080041D8022B44BF0B7803707047083A07D3B1E837 -S315080041E80810083A40F8043B40F804CBF7D25307BE -S315080041F8E4E7FF0010B5DFF8D00600210170DFF804 -S31508004208CC160020FDF7CEFB0400E4B2002C04D03F -S315080042187C21DFF8BC0600F0F7FB10BDDFF8A8061E -S315080042280078002801D1012000E00020704780B5F9 -S3150800423800F086FC012801D1002011E0DFF8880685 -S315080042480078002801D000200AE000F07DFC01284B -S3150800425805D1DFF8740601210170012000E000206D -S3150800426802BD38B5DFF860060078002800F0098234 -S31508004278DFF854060078012834D100F07FFCDFF80F -S31508004288540600F0AAFCDFF8500600F0A6FC00F079 -S3150800429873FC01220100DFF84406FDF79EFB00289F -S315080042A807D0DFF83C0600F098FC012000F08AFCED -S315080042B8E7E1DFF8300600F090FCDFF82C0600F09E -S315080042C88CFCDFF8280600F088FCDFF824060021B5 -S315080042D80160DFF81C0600214160DFF8EC050221C1 -S315080042E80170CEE1DFF8E0050078022840F0F88092 -S315080042F8DFF8E8254FF48071DFF8F805FEF74EF881 -S315080043080500DFF8C80590F83A02C0F3C01010F0A7 -S31508004318010001280FDBDFF8C80500F05EFC022063 -S3150800432800F050FCDFF8B405FDF79FFEDFF89805A6 -S3150800433800210170A5E1002D1BD00022DFF8B81571 -S31508004348DFF8B00500F0DFF9040024B214F1010F14 -S315080043580FD1DFF88C0500F040FC032000F032FC92 -S31508004368DFF87805FDF781FEDFF85C0500210170A6 -S3150800437887E124B2012C28DBDFF874054068002899 -S315080043880BD1DFF87005D0F88001DFF864150860EE -S31508004398DFF85C0524B2446017E0DFF85805D0F862 -S315080043A88001DFF84C150968884206D2DFF844050B -S315080043B8D0F88001DFF838150860DFF8340540685A -S315080043C800FA84F0DFF828154860DFF80005D0F809 -S315080043D83C02DFF8F814D1F84012884201D10120CE -S315080043E800E000200128C0F24C810021DFF8EC0427 -S315080043F8FDF749FE00280FD0DFF8E40400F0EDFBCE -S31508004408042000F0DFFBDFF8D404FDF72EFEDFF802 -S31508004418B8040021017034E1DFF8C80400F0DDFBB8 -S31508004428DFF8D80400F0D9FBDFF8D414DFF8C004A5 -S31508004438406800F0A3FADFF8C80400F0CEFBDFF8FE -S31508004448C40400F0CAFBDFF8B814DFF8A40400684F -S31508004458000EC0B200F081FADFF8AC14DFF8900459 -S315080044680068000CC0B200F078FADFF8A014DFF88C -S3150800447880040068000AC0B200F06FFADFF89014EA -S31508004488DFF86C040068C0B200F067FADFF8700459 -S3150800449800F0A3FB7BA000F0A0FBDFF854044168FA -S315080044A8DFF84C04006800F0D3FB00280FD1DFF8CA -S315080044B8300400F092FB052000F084FBDFF81C04AA -S315080044C8FDF7D3FDDFF8000400210170D9E0DFF815 -S315080044D8140400F082FBDFF8F00303210170D0E032 -S315080044E8DFF8E4030078032840F0CB80DFF8EC23F4 -S315080044F84FF48071DFF8FC03FDF750FF0500DFF87D -S31508004508CC0390F83A02C0F3C01010F00100012855 -S315080045180FDBDFF8000400F060FB022000F052FB16 -S31508004528DFF8B803FDF7A1FDDFF89C030021017049 -S31508004538A7E0002D1CD0DFF8E023DFF8BC13DFF86E -S31508004548B40300F0E0F8040024B214F1010F0FD107 -S31508004558DFF8C80300F041FB032000F033FBDFF85F -S315080045687C03FDF782FDDFF860030021017088E00F -S3150800457824B2012C51DBDFF8A80300F02EFBDFF884 -S31508004588801324B2200000F0F9F9DFF8740300F06C -S3150800459824FBDFF8900300F020FBDFF86413D54806 -S315080045A8D0F88001000EC0B200F0D7F9D649D14834 -S315080045B8D0F88001000CC0B200F0CFF9D349CD4835 -S315080045C8D0F88001000AC0B200F0C7F9D049C94836 -S315080045D8D0F88001C0B200F0C0F9C94800F0FDFA69 -S315080045E828A000F0FAFACC4A24B22100C148D0F82B -S315080045F8800100F023FB00280CD1B94800F0EDFA39 -S31508004608062000F0DFFAB548FDF72FFDAE48002171 -S31508004618017036E0B34800F0E0FAAC48D0F83C023E -S31508004628AA49D1F84012884201D1012000E00020A9 -S31508004638012826DBBC4800F0D0FA00F015FB002854 -S315080046480CD1A74800F0C9FA072000F0BBFAA3481E -S31508004658FDF70BFD9C480021017012E0A14800F007 -S31508004668BCFAB24800F0B9FA9C48FDF7FEFCB04817 -S3150800467800F0B3FA94480021017000F090FA00F0AF -S31508004688FDFA31BD2E2E2E0010B50400207800F054 -S3150800469826FB532804D1607800F027FB002801D1AF -S315080046A803200FE06078312801D100200AE06078FD -S315080046B8322801D1012005E06078332801D102208B -S315080046C800E0032010BD70B504000026A41C2000D5 -S315080046D800F070F90500AE19A41C200000F06AF96C -S315080046E8801906006D1EA41CADB2022DF5DAF6B2C5 -S315080046F8F643200000F05EF9F6B2864201D00020A3 -S3150800470800E0012070BD2DE9F84F82460C0015001F -S315080047180027002C02D0BAF1000F04D140F2362146 -S315080047286B4800F071F95046FFF7AEFF0600F6B27F -S31508004738032E01D10020C4E05046FFF7C4FF002825 -S3150800474802D15FF0FF30BCE0F6B2002E03D0022E8D -S315080047586FD032D3B3E01AF1020A504600F02AF9AC -S3150800476880461AF1020A504600F024F90002206031 -S315080047781AF1020AD4F800B0504600F01BF95BFAA1 -S3150800478880F020601AF1020AB8F103000700002D2C -S3150800479812D0002081461FFA89F93FB2B9450BDACB -S315080047A8504600F007F91FFA89F909F805001AF1C1 -S315080047B8020A19F10109EEE781E01AF1020A5046E0 -S315080047C800F0F8F880461AF1020A504600F0F2F8A6 -S315080047D8000420601AF1020AD4F800B0504600F026 -S315080047E8E9F81BEB002020601AF1020AD4F800B099 -S315080047F8504600F0DFF85BFA80F020601AF1020AEA -S31508004808B8F104000700002D12D0002081461FFACF -S3150800481889F93FB2B9450BDA504600F0CBF81FFACA -S3150800482889F909F805001AF1020A19F10109EEE7EA -S3150800483845E01AF1020A504600F0BCF880461AF11B -S31508004848020A504600F0B6F8000620601AF1020A75 -S31508004858D4F800B0504600F0ADF81BEB00402060D5 -S315080048681AF1020AD4F800B0504600F0A3F81BEB78 -S31508004878002020601AF1020AD4F800B0504600F069 -S3150800488899F85BFA80F020601AF1020AB8F1050077 -S315080048980700002D12D0002081461FFA89F93FB279 -S315080048A8B9450BDA504600F085F81FFA89F909F870 -S315080048B805001AF1020A19F10109EEE7FFE73800BF -S315080048C800B2BDE8F28F00001F1000201800002073 -S315080048D8A8670008B0680008646800084C02002049 -S315080048E8586A0008606A0008D4680008D86700088B -S315080048F8F00F0020A00C0020200E0020386A0008BF -S315080049084C0F0020846900084E0F0020500F002025 -S31508004918520F0020F8680008A00D00201C6900083E -S31508004928FC690008BC690008A0690008D469000881 -S315080049383868000838B5040014F00F003030050050 -S31508004948E4B20A2C01DBED1D04E0EDB2280000F004 -S31508004958C6F905002800C0B232BD38B504000D00F6 -S31508004968E4B22009FFF7E6FF287014F00F00FFF7F6 -S31508004978E1FF68700020A870280032BD10B4020054 -S3150800498808001100401C0A23B1FBF3F10029F9D1EC -S31508004998002303701100401E0A23B1FBF3F403FB3E -S315080049A81413303303700A23B1FBF3F10029F2D14B -S315080049B810BC7047F8B50400002500200700FFB2B0 -S315080049C8022F1DDAFFB2385D00F089F90600F6B243 -S315080049D8302E08DBF6B2472E05DAF6B23A2E04DB95 -S315080049E8F6B2412E01DA00200CE0303EF6B20A2E65 -S315080049F800DBF61FEDB2280150FA86F57F1CDEE7C4 -S31508004A082800C0B2F2BD000038B504000D000348FE -S31508004A1804600348056000F072F9FCE7F80F002007 -S31508004A28FC0F002080B542480088ADF8000000F069 -S31508004A3867F900F010FC3F480121017000F036FDC7 -S31508004A483C48002101703C480078012802D100A89A -S31508004A5800F080F901BD80B5384800F0C0FC01288F -S31508004A6805D1344801210170344800F073F93348F8 -S31508004A7800F069FD012805D12E48002101702F484C -S31508004A8800F068F901BD704738B504000D002948DB -S31508004A980078012804D12900C9B2200000F05EFC7C -S31508004AA824480078002804D12900C9B2200000F05B -S31508004AB81BFD00F049F931BD1E490978002905D0C2 -S31508004AC8022909D005D3032909D00BE0402108009B -S31508004AD80AE00821080007E00021080004E0002190 -S31508004AE8080001E04021080080B27047114909789A -S31508004AF8002905D0022909D005D3032909D00BE0D6 -S31508004B08402108000AE00821080007E000210800FB -S31508004B1804E00021080001E04021080080B270473F -S31508004B280548012101707047034800210170704744 -S31508004B38FA41000814000020241000200C0F002059 -S31508004B4880B500F0F8F802BD00B589B000A82021A4 -S31508004B5800F062FD00A93348FDF784FB002808D158 -S31508004B680098002805D09DF80800C00601D4012041 -S31508004B7800E0002009B000BD2A48704780B52A48D9 -S31508004B88002180F824120A2228492748FCF725FF1D -S31508004B98002803D12448012180F8241201BD80B5D4 -S31508004BA8214890F82402012802D11F48FDF75DFA2A -S31508004BB840211F4800F0C8FD0028F9D01948FDF71C -S31508004BC877FB01BD10B50400174890F824020128A0 -S31508004BD802D11548FDF749FA10BD10B50400124868 -S31508004BE890F8240201280CD10F492000FDF721FC72 -S31508004BF8002806D50C48002180F824120A48FDF733 -S31508004C0834FA207800280CD0217889B2084800F0B0 -S31508004C1893FD8021064800F097FD0028F9D0641C0A -S31508004C28EFE710BD64690008700400200C6A0008E4 -S31508004C380014014080B500F097FD01BD70B5040069 -S31508004C480D00160032002900200000F098FD70BDFE -S31508004C5838B504000D002900200000F0BBFD32BD60 -S31508004C6880B500F013FE02BD80B500F0CEFD002821 -S31508004C7801D1002001E000F032FE02BD10B5FFF7B1 -S31508004C88EFFF00280BD0FFF7FEFE00F08FFF044861 -S31508004C984FF400410160034800680400A04710BDAE -S31508004CA808ED00E0048000082DE9F04104000D0035 -S31508004CB816002F00A0463000461E80B2002808D0ED -S31508004CC8387888F800007F1C18F1010800F017F8F2 -S31508004CD8F1E7BDE8F08180B500F086FF01BD10B5A3 -S31508004CE80400200000F08CFF10BD302803DB3A28AA -S31508004CF801DA012000E00020C0B27047704770470B -S31508004D08DFF8A00400210170DFF898040021816407 -S31508004D18DFF89004002180F84310DFF888040021A2 -S31508004D28A0F84410DFF87C0400218170DFF87404C9 -S31508004D38002141707047DFF86C040078002801D11B -S31508004D48002000E001207047DFF85804002180F8A9 -S31508004D584310704710B504002078FF2803D12000B7 -S31508004D6800F0A5F85FE0DFF83C040078012859D17F -S31508004D782078C9283AD0CC284CD0CF2846D0D02875 -S31508004D8838D0D1283ED0D22838D0F3281AD0F428DB -S31508004D9810D0F5280AD0F62810D0FA2816D0FC28FC -S31508004DA818D0FD281AD0FE281CD037E0200000F0BD -S31508004DB809F938E0200000F027F934E0200000F06F -S31508004DC8F6F830E0200000F044F92CE0200000F066 -S31508004DD8D6F828E0200000F0CCF824E0200000F0FF -S31508004DE8B0F820E0200000F09DF81CE0200000F054 -S31508004DF865F918E0200000F083F914E0200000F0B7 -S31508004E0840F910E0200000F0ACF90CE0200000F0B2 -S31508004E18BDF908E0200000F0CFF904E0202000F0F2 -S31508004E283CF800E01BE0DFF87C0390F84300012813 -S31508004E3802D1102000F031F8DFF86803B0F9440011 -S31508004E4801280CDBDFF85C03012180F84310DFF842 -S31508004E585403B0F94410DFF8500300F001F810BD08 -S31508004E6838B504000D00290089B22000FFF70CFEAA -S31508004E7831BD10B4030000240800411E002803D0E1 -S31508004E88187804195B1CF7E7E4B21460012010BC13 -S31508004E987047C448002141707047C249FE22CA704B -S31508004EA8C0490871BF490222A1F84420704710B5C5 -S31508004EB80400FFF7B3F9002803D11020FFF7EDFF28 -S31508004EC82FE0FFF7E6FFB74801210170B548FF2133 -S31508004ED8C170B44800210171B248007950F0100039 -S31508004EE8B0490871AF4800214171AE48AD494979C2 -S31508004EF84171FFF7E1FDAB498871FFF7F7FDA9494D -S31508004F08C871FFF7F3FD80B2000AA6490872A548DA -S31508004F1801214172A34801218172A2480821A0F8FB -S31508004F28441010BD10B504009E4800210170FFF713 -S31508004F38B0FF9C48FF21C1709A480121A0F8441087 -S31508004F4810BD9849FF22CA70964900220A719549E8 -S31508004F58944A52784A71934900228A7191490022E3 -S31508004F68CA71904900220A728E490622A1F844207D -S31508004F78704710B504000020FFF78FFF10BD894958 -S31508004F88FF22CA708749894A8A64864900220A71B3 -S31508004F98844900224A71834900228A718149072275 -S31508004FA8C1F807207F490822A1F8442070477D499F -S31508004FB8FF22CA707B4942688A647A490122A1F8A5 -S31508004FC84420704710B50400FFF776FD401E617847 -S31508004FD8884203DA2220FFF760FF14E0627892B26B -S31508004FE87048816C7248FFF75FFE6E48FF21C170F2 -S31508004FF86C48806C617840186A4988646078401CF7 -S315080050086849A1F8440010BD10B50400FFF754FD1F -S31508005018401E6178884203DA2220FFF73EFF17E030 -S31508005028604861688164627892B25E48816C6048BB -S31508005038FFF73AFE5B48FF21C1705A48806C6178D1 -S315080050484018584988646078401C5649A1F84400B5 -S3150800505810BD10B504005348FF21C170554A616850 -S315080050685048806CFFF705FF4E4908714D480021E6 -S3150800507841714C48002181714A480821A0F844101A -S3150800508810BD10B504004748FF21C17045480021E6 -S315080050980171444800214171FFF70EFD41498871A5 -S315080050A840480021C1713F48002101723D4800214E -S315080050B841723C480721A0F8441010BD10B50400F9 -S315080050C8FFF7FAFC621C80B2411E3648806CFFF76F -S315080050D8B5FD002803D13120FFF7DFFE0FE0314880 -S315080050E8FF21C170FFF7E8FC2E49896C80B2401E83 -S315080050F840182C4988642B480121A0F8441010BD93 -S3150800510810B50400FFF7D8FC801E6178884203DAD8 -S315080051182220FFF7C2FE23E02248FF21C17021485A -S315080051280121A0F844106078002807D1FFF79CFDF4 -S31508005138002802D13120FFF7B0FE11E0A21C6178E1 -S315080051481848806CFFF77AFD002803D13120FFF74D -S31508005158A4FE05E01348806C6178401811498864F4 -S3150800516810BD10B5040061680E48806CFFF770FD25 -S31508005178002803D13120FFF790FE06E00948FF21F1 -S31508005188C17008480121A0F8441010BD10B50400E4 -S31508005198FFF7A1FD0348FF21C17002480121A0F8C5 -S315080051A8441010BD240E0020270E0020686A000847 -S315080051B8280E00202B0E002010B504003120FFF71A -S315080051C86CFE10BDF0B4040000200500EDB2122DE7 -S315080051D83ED24AF21040A4B2EDB29D4E16F81560BA -S315080051E8EDB29B4F17EB45077F78BE19761C06FB71 -S315080051F804F690FBF6F706FB1700002826D14AF2B4 -S315080052081040A4B2EDB2924E16F81560EDB2904F62 -S3150800521817EB45077F78BE19761C06FB04F690FB44 -S31508005228F6F008800888002810D00888B0F5806F3E -S315080052380CDCEDB2864810F815001070EDB28448FB -S3150800524810EB450040781870012002E06D1CBDE798 -S315080052580020F0BC704710B582B000AB0DF1010212 -S315080052680DF102014FF4FA70FFF7ACFF0400E4B23F -S31508005278012C03D0F0217748FFF7C6FB76480021B2 -S3150800528801607648006850F400407449086073481D -S315080052980068000402D5FFF732FDF8E76F48006892 -S315080052A830F002006D4908606C48006850F001004B -S315080052B86A4908606A480068C00702D4FFF71FFDF4 -S315080052C8F8E79DF80100401E9DF80010491E0905DB -S315080052D851EA0040BDF80210491E084361490860B2 -S315080052E85E480068400840005C4908605C480068F9 -S315080052F8C00702D5FFF703FDF8E75B48006850F0DA -S315080053080100594908605948006830F480405749EF -S3150800531808605748006850F4804055490860554861 -S31508005328002101605448002101605448006830F49F -S315080053388040524908605248006830F48040504915 -S3150800534808604A48006850F480404849086046485A -S315080053580068400840004449086013BD38B5040091 -S315080053680D0048480068400104D44FF4A271394832 -S31508005378FFF74AFB4448006810F0010042490860F4 -S3150800538841480068414908433F4908604048EDB22A -S315080053980560E078A178090451EA0060617850EA66 -S315080053A80120217808433B490860E079A179090476 -S315080053B851EA0060617950EA0120217908433649A3 -S315080053C808603148006850F001002F4908602D48E8 -S315080053D80068400102D4FFF792FCF8E731BD10B423 -S315080053E8010000202D4B1B6813F0030F2DD02C4B02 -S315080053F81B685B0D1A0040F267639A421FD10123A6 -S315080054081800284B1B680B70264B1B681B0A4B7029 -S31508005418244B1B681B0C8B70224B1B681B0ECB700E -S31508005428214B1B680B71204B1B681B0A4B711E4BC3 -S315080054381B681B0C8B711C4B1B681B0ECB71174BFF -S315080054481B6853F02003154C2360C0B210BC704784 -S315080054588C68000830670008146800400068004037 -S31508005468046800401C680040006600401C6600404E -S315080054780C660040B0660040B4660040046600400A -S31508005488146600400868004080690040000020FC57 -S3150800549884690040886900408C6900400C680040AF -S315080054A8B0690040B8690040BC69004000B585B0DD -S315080054B84FF4614000900020ADF804000020ADF8D4 -S315080054C806000020ADF808000020ADF80C000C20F6 -S315080054D8ADF80A0000A94A4800F0A2F80121484890 -S315080054E800F01CF905B000BDF8B504000D00EDB2D2 -S315080054F8412D03DB77214348FFF786FA2800C0B217 -S3150800550800F065F80700FFB2012F03D07B213D485C -S31508005518FFF77AFA002006002800C0B2B6B280B2B1 -S3150800552886420FD2FFF7EBFBB6B2305D00F04FF8B4 -S315080055380700FFB2012F03D084213248FFF764FA27 -S31508005548761CE9E7F1BD10B504002F480078002855 -S315080055580BD12E4800F02BF8012826D12A4801211C -S3150800556801702B48002101701FE029480078274957 -S315080055784018401C00F01BF8012816D1244800786A -S31508005588401C23490870224800782049097888422F -S315080055980BD11F48027892B21E492000FFF784FBF8 -S315080055A8194800210170012000E0002010BD10B53F -S315080055B804002021124800F0C7F8012805D1104830 -S315080055C800F0BEF82070012000E0002010BD10B5DC -S315080055D8040080210A4800F0B7F8002801D1002005 -S315080055E80CE0E4B2210089B2054800F0A5F880214C -S315080055F8034800F0A9F80028F9D0012010BD0000DA -S31508005608001401406C67000822100020C80E00200C -S3150800561821100020C90E0020002200F0FDBA000063 -S315080056282DE9F04385B004000D005FF00009002657 -S3150800563800275FF00008A8890028208A814639F4DF -S315080056484059E88850EA0909A4F81090A0898146C3 -S31508005658314810EA0909A888298908436989084345 -S3150800566850EA0909A4F80C90A08A814639F44079C9 -S31508005678A88950EA0909A4F8149000A8FEF794FC2A -S315080056882348844202D02348844202D1039806005C -S3150800569801E002980600A089000408D5192000FB35 -S315080056A806F029684900B0FBF1F0070007E0192061 -S315080056B800FB06F029688900B0FBF1F007006420B2 -S315080056C8B7FBF0F0000181465FEA1910642101FB77 -S315080056D810708046A08900040AD55FEAC8003230EF -S315080056E86421B0FBF1F010F0070050EA090909E057 -S315080056F85FEA081032306421B0FBF1F010F00F00B1 -S3150800570850EA0909A4F8089005B0BDE8F083000036 -S315080057180010014000140140F3E9FFFFC9B200294F -S3150800572804D0828952F40052828104E082894DF6B7 -S31508005738FF731A4082817047CA05D20D8280704766 -S315080057488088C005C00D70470200002089B2B1F5EF -S31508005758007F13880B4202D00123180001E00023BA -S315080057681800C0B270470000DFF810045FF0FF3178 -S315080057780160DFF80C045FF0FF3101607047F8B587 -S3150800578804000D001600200000F0CCF9FF2805D00B -S315080057982819401E00F0C6F9FF2801D1002018E094 -S315080057A8600A4FF4007148430700DFF8D803006819 -S315080057B8874207D12B0032002100DFF8C40300F026 -S315080057C8E8F806E02B0032002100DFF8B00300F005 -S315080057D8E0F8F2BDF8B504000D00200000F0A2F9C3 -S315080057E806002819401E00F09DF90700F6B2FF2E9C -S315080057F802D0FFB2FF2F01D1002005E03900C9B257 -S315080058083000C0B200F051F9F2BD80B50020009012 -S31508005818DFF86C03006810F1010F01D1012034E0AC -S315080058280098DFF85C134968081800900098DFF8B4 -S3150800583850138968081800900098DFF84413C96857 -S31508005848081800900098DFF83813096908180090B6 -S315080058580098CB494969081800900098C849896989 -S31508005868081800900098C649C96908180090009851 -S31508005878C04300900098401C009000AA0421C14823 -S31508005888006810F5C470FFF77AFF02BD0021BD480D -S31508005898006800684118BB48006840684118B9485C -S315080058A8006880684118B7480068C0684118B54854 -S315080058B8006800694118B348006840694118B1484A -S315080058C8006880694118AF48006810F5C470006818 -S315080058D84118002901D1012000E00020704780B551 -S315080058E8A748006810F1010F06D0A54800F09CF8F3 -S315080058F8002801D100200CE0A048006810F1010F2B -S3150800590806D09E4800F090F8002801D1002000E053 -S31508005918012002BD38B504000D004FF40070B5FB30 -S31508005928F0F101FB1051002901D000200CE0206895 -S31508005938A84201D1012007E025604FF4007229002A -S31508005948201DFFF7B1F9012032BD38B504000D0056 -S315080059588B48844202D18948040010E089480068C7 -S31508005968854205D18648040086480068050006E091 -S31508005978200000F059F8002801D1002008E0290085 -S315080059882000FFF7C7FF002801D1002000E020000B -S3150800599832BD2DE9F04704000D0016001F00680AFD -S315080059A84FF4007148438046206810F1010F07D16B -S315080059B841462000FFF7AEFF002801D1002031E05C -S315080059C82068404508D041462000FFF7BEFF04007E -S315080059D8002C01D1002025E02068281A0019001D8E -S315080059E88146B246FFF78BF9201DB9EB0000B0F5E2 -S315080059F8007F0BD318F500712000FFF7A6FF0400F7 -S31508005A08002C01D100200DE0201D81469AF80000DF -S31508005A1889F8000019F101091AF1010A7F1E002FF9 -S31508005A28E0D10120BDE8F0872DE9F84304000126F6 -S31508005A38206800F077F80500EDB2FF2D01D10020A7 -S31508005A4831E000F003F9F32000F0A2F900F0A3F919 -S31508005A58012803D100F00AF9002024E00020814635 -S31508005A68B9F1800F1BD2206810EB8900070014EBE8 -S31508005A78890040688046FFF742F94146380000F039 -S31508005A885EF9082802D00020060008E03868404574 -S31508005A9802D00020060002E019F10109E0E700F04B -S31508005AA8E5F83000C0B2BDE8F28370B504000D0011 -S31508005AB8EDB2E4B2A54201D2002032E03148007ABC -S31508005AC8E4B2844205D32F4890F87400EDB2A84290 -S31508005AD801D2002025E000F0B9F8F32000F058F9C3 -S31508005AE800F059F9012803D100F0C0F8002018E0A1 -S31508005AF82600EDB2F6B2B54210D3FFF700F9022137 -S31508005B08F6B2214830F8160000F0B9F8082803D08C -S31508005B1800F0ACF8002004E0761CEAE700F0A6F8E6 -S31508005B28012070BD38B5040000200500EDB20A2D25 -S31508005B3821D2FFF7E4F8EDB20C20124900FB051054 -S31508005B480068844215D3EDB20C200E4900FB0510F7 -S31508005B580068EDB20C210B4A01FB052149680818B3 -S31508005B68844206D2EDB20C20064900FB0510007ADD -S31508005B7802E06D1CDAE7FF2032BD00009806002017 -S31508005B889C080020746600080868000880B500F0BC -S31508005B980DF81048104901601048002101601048A6 -S31508005BA8052101600F480021016001BD0C4800214C -S31508005BB8016070470A480068C00304D509480068A8 -S31508005BC8401C08490860704780B5FFF7F3FF054889 -S31508005BD8006802BD14E000E03F90020018E000E00B -S31508005BE810E000E018100020044B9D46C046C04649 -S31508005BF8C046C046FEF798FF00F00EF928180020A0 -S31508005C0810B50400200000F012F9002801D0203C45 -S31508005C18FFE7200010BD000000B500BF1300964638 -S31508005C289446103928BFA0E80C50FAD85FEA417C98 -S31508005C3828BF0CC048BF40F8042BC90728BF20F85E -S31508005C48022B48BF00F8012B00BD0000DFF88C01C5 -S31508005C580068002809D5DFF88801DFF8881101608F -S31508005C68DFF87C01DFF8801101607047DFF86C0106 -S31508005C78006850F00040DFF8641108607047F8B50E -S31508005C8804000D0000260827EDB2002D02D10020D9 -S31508005C98060010E0EDB2012D03D14FF4807006001E -S31508005CA809E0EDB2022D03D14FF40070060002E0B8 -S31508005CB84FF44070060000F09BF80700FFB2082F63 -S31508005CC83AD1DFF81801006830F44070DFF80C1193 -S31508005CD80860DFF8080100683043DFF8001108603B -S31508005CE8DFF8F800006830F0F800DFF8F010086010 -S31508005CF8DFF8E800006854F002010843DFF8DC1012 -S31508005D080860DFF8D800006850F48030DFF8CC1057 -S31508005D18086000F06DF80700DFF8C000006830F08A -S31508005D280200DFF8B8100860DFF8B000006830F045 -S31508005D38F800DFF8A81008603800C0B2F2BD70B5E0 -S31508005D4804000D00082600F053F80600F6B2082EDF -S31508005D581BD12248006830F44070204908601F4863 -S31508005D68006850F400701D4908601C48006850F027 -S31508005D7801001A490860256000F03AF80600174835 -S31508005D88006840084000154908603000C0B270BD78 -S31508005D98164908607047082014490968C90302D5D6 -S31508005DA80121080017E011490968C90602D5052125 -S31508005DB8080010E00D49096811F0EF0F02D0062116 -S31508005DC8080008E009490968890702D50721080073 -S31508005DD801E008210800C0B270470000103C0240E4 -S31508005DE8043C024023016745AB89EFCD0C3C0240D1 -S31508005DF880B508208DF80000FFF7CDFF8DF8000064 -S31508005E089DF80000012804D1FFF7C5FF8DF80000AA -S31508005E18F6E79DF8000002BD00F012F8002801D048 -S31508005E2800F010F8002000F021F800F083F8612847 -S31508005E3803DB7B2801DA012000E00020C0B27047A6 -S31508005E480120704710B5074979441831064C7C4437 -S31508005E58163404E00A68081D511888470146A14205 -S31508005E68F8D110BDD40A0000F40A000080B500F085 -S31508005E7805F800F061F800F06DF8FCE700B583B0A6 -S31508005E8872B600F073F801212020FEF72BF90121DC -S31508005E980420FEF709F9082206212448FEF740F8E7 -S31508005EA8082207212148FEF73BF800208DF806004E -S31508005EB801208DF8070002208DF804004020009084 -S31508005EC802208DF8050000A91848FDF7C7FF02202B -S31508005ED88DF804008020009000A91448FDF7BEFF3D -S31508005EE801210220FEF7E0F8092205211048FEF7ED -S31508005EF817F8092206210E48FEF712F860200090C6 -S31508005F0802208DF8040002208DF8050000208DF87F -S31508005F18060001208DF8070000A90548FDF79EFF31 -S31508005F2801215FF0C060FEF7CEF807BD0008024001 -S31508005F380004024000F0BCB880B5FEF7DFFEFFF7A4 -S31508005F4825FEFEF777FEFEF755F9FEF76BFD00F01E -S31508005F58B5F801BD80B5FEF7D2FEFFF72BFEFEF7B2 -S31508005F6880F9FEF778FD00F0B4F801BD80B545481C -S31508005F78006850F001004349086043480021016061 -S31508005F8840480068414908403E4908604048414938 -S31508005F9801603C48006830F480203A4908603E4869 -S31508005FA80021016000F005F83C485FF000610160D7 -S31508005FB801BD82B000200190002000903148006899 -S31508005FC850F480302F4908602E48006810F40030D5 -S31508005FD800900198401C01900098002803D1019868 -S31508005FE8B0F5A06FF0D127480068800302D50120D4 -S31508005FF8009001E000200090009801283ED128482A -S31508006008006850F08050264908602648006850F411 -S315080060184040244908601C481B49096801601A4819 -S31508006028006850F40040184908601748006850F49A -S31508006038A0501549086016481B49016011480068B0 -S3150800604850F080700F4908600E4800688001FBD53B -S31508006058164840F2056101600B4800688008800010 -S31508006068094908600848006850F0020006490860AF -S315080060780548006810F00C000828F9D102B07047E6 -S31508006088000000000038024008380240FFFFF6FE0C -S3150800609804380240103000240C38024008ED00E0AD -S315080060A840380240007000400C544007003C02404B -S315080060B80746384600F030F8FBE7000080B5144874 -S315080060C801210170FFF780FD1249086000F001F808 -S315080060D801BD80B5FEF734FD012817D0FEF79EF8F6 -S315080060E8002813D00A48007801280FD1FFF76CFD5D -S315080060F8084909683231884208D3054800210170E1 -S31508006108FEF795F8002801D1FEF7B8FD01BD000095 -S315080061181E1000200010002080B5C046C046024A5E -S3150800612811001820ABBEFBE72600020061006200DA -S3150800613863006400650066006700680069006A0015 -S315080061486B006C006D006E006F00700071007200C5 -S3150800615873007400750076007700780079007A0075 -S31508006168A100A200A300A500AC00AF00E000E10072 -S31508006178E200E300E400E500E600E700E800E900DD -S31508006188EA00EB00EC00ED00EE00EF00F000F1008D -S31508006198F200F300F400F500F600F800F900FA003A -S315080061A8FB00FC00FD00FE00FF00010103010501DC -S315080061B8070109010B010D010F0111011301150151 -S315080061C8170119011B011D011F01210123012501C1 -S315080061D8270129012B012D012F0131013301350131 -S315080061E837013A013C013E0140014201440146019A -S315080061F848014B014D014F01510153015501570102 -S3150800620859015B015D015F01610163016501670170 -S3150800621869016B016D016F017101730175017701E0 -S315080062287A017C017E019201B103B203B303B40378 -S31508006238B503B603B703B803B903BA03BB03BC036C -S31508006248BD03BE03BF03C003C103C303C403C50319 -S31508006258C603C703C803C903CA0330043104320492 -S3150800626833043404350436043704380439043A0444 -S315080062783B043C043D043E043F04400441044204F4 -S3150800628843044404450446044704480449044A04A4 -S315080062984B044C044D044E044F0451045204530451 -S315080062A85404550456045704580459045A045B04FC -S315080062B85C045E045F0470217121722173217421C4 -S315080062C8752176217721782179217A217B217C21EC -S315080062D87D217E217F2141FF42FF43FF44FF45FF81 -S315080062E846FF47FF48FF49FF4AFF4BFF4CFF4DFF54 -S315080062F84EFF4FFF50FF51FF52FF53FF54FF55FF04 -S3150800630856FF57FF58FF59FF5AFF00004100420041 -S3150800631843004400450046004700480049004A0033 -S315080063284B004C004D004E004F00500051005200E3 -S3150800633853005400550056005700580059005A0093 -S315080063482100E0FFE1FFE5FFE2FFE3FFC000C1002F -S31508006358C200C300C400C500C600C700C800C900FB -S31508006368CA00CB00CC00CD00CE00CF00D000D100AB -S31508006378D200D300D400D500D600D800D900DA0058 -S31508006388DB00DC00DD00DE00780100010201040103 -S31508006398060108010A010C010E0110011201140177 -S315080063A8160118011A011C011E01200122012401E7 -S315080063B8260128012A012C012E0130013201340157 -S315080063C8360139013B013D013F01410143014501C0 -S315080063D847014A014C014E01500152015401560128 -S315080063E858015A015C015E01600162016401660197 -S315080063F868016A016C016E01700172017401760107 -S3150800640879017B017D01910191039203930394031A -S31508006418950396039703980399039A039B039C038A -S315080064289D039E039F03A003A103A303A403A50337 -S31508006438A603A703A803A903AA03100411041204B0 -S3150800644813041404150416041704180419041A0462 -S315080064581B041C041D041E041F0420042104220412 -S3150800646823042404250426042704280429042A04C2 -S315080064782B042C042D042E042F04010402040304FF -S315080064880404050406040704080409040A040B049A -S315080064980C040E040F046021612162216321642122 -S315080064A8652166216721682169216A216B216C218A -S315080064B86D216E216F2121FF22FF23FF24FF25FF6F -S315080064C826FF27FF28FF29FF2AFF2BFF2CFF2DFF72 -S315080064D82EFF2FFF30FF31FF32FF33FF34FF35FF22 -S315080064E836FF37FF38FF39FF3AFF0000C700FC00C0 -S315080064F8E900E200E400E000E500E700EA00EB0056 -S31508006508E800EF00EE00EC00C400C500C900E6008C -S31508006518C600F400F600F200FB00F900FF00D600FA -S31508006528DC00A200A300A500A7209201E100ED0067 -S31508006538F300FA00F100D100AA00BA00BF00102340 -S31508006548AC00BD00BC00A100AB00BB00912592259C -S315080065589325022524256125622556255525632573 -S31508006568512557255D255C255B25102514253425D9 -S315080065782C251C2500253C255E255F255A255425EE -S3150800658869256625602550256C25672568256425AF -S31508006598652559255825522553256B256A25182515 -S315080065A80C25882584258C2590258025B103DF00B0 -S315080065B89303C003A303C303B500C403A603980340 -S315080065C8A903B4031E22C603B50329226122B10012 -S315080065D86522642220232123F7004822B0001922C5 -S315080065E8B7001A227F20B200A025A000809A904101 -S315080065F88E418F804545454949498E8F9092924FDD -S31508006608994F555559999A9B9C9D9E9F41494F5517 -S31508006618A5A5A6A7A8A9AAABAC21AEAFB0B1B2B337 -S31508006628B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C39C -S31508006638C4C5C6C7C8C9CACBCCCDCECFD0D1D2D38C -S31508006648D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E37C -S31508006658E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F36C -S31508006668F4F5F6F7F8F9FAFBFCFDFEFF00800008DA -S31508006678004000000200000000C0000800400000BA -S3150800668803000000000001080000010004000000E3 -S3150800669800000208000002000500000000000408C7 -S315080066A800000200060000000000060800000200BC -S315080066B807000000000008080000020008000000A3 -S315080066C800000A08000002000900000000000C0883 -S315080066D8000002000A00000000000E080000020080 -S315080066E80B000000433A5C576F726B5C736F6674F5 -S315080066F8776172655C4F70656E424C545C54617282 -S315080067086765745C536F757263655C41524D434D9A -S31508006718345F53544D33325C4941525C7665637431 -S315080067286F72732E63000000433A5C576F726B5C96 -S31508006738736F6674776172655C4F70656E424C5408 -S315080067485C5461726765745C536F757263655C4106 -S31508006758524D434D345F53544D33325C63616E2E4C -S3150800676863000000433A5C576F726B5C736F66741C -S31508006778776172655C4F70656E424C545C54617201 -S315080067886765745C536F757263655C41524D434D1A -S31508006798345F53544D33325C756172742E6300004E -S315080067A8433A5C576F726B5C736F66747761726590 -S315080067B85C4F70656E424C545C5461726765745CD4 -S315080067C8536F757263655C66696C652E63000000B5 -S315080067D850617273696E67206669726D7761726552 -S315080067E82066696C6520746F206F627461696E2013 -S315080067F865726173652073697A652E2E2E0000000E -S315080068080000080010001800200028003000380092 -S315080068184000480050005800800088009000980002 -S31508006828A000A800B000B800C000C800D000D80072 -S315080068384669726D77617265207570646174652042 -S315080068487375636365737366756C6C7920636F6DAE -S31508006858706C657465640A0D000000004F70656EFB -S31508006868696E67206669726D776172652066696CFC -S315080068786520666F722072656164696E672E2E2EB2 -S3150800688800000000050206020603070308030903B9 -S3150800689809040A040B040C040C050D050E050F055E -S315080068A80F061006100710084669726D776172653B -S315080068B820757064617465207265717565737420D6 -S315080068C864657465637465640A0D000053746172BF -S315080068D874696E67207468652070726F6772616D77 -S315080068E86D696E672073657175656E63650A0D0057 -S315080068F852656164696E67206C696E652066726F99 -S315080069086D2066696C652E2E2E4552524F520A0D19 -S3150800691800000000496E76616C69642063686563E7 -S315080069286B73756D20666F756E642E2E2E455252E2 -S315080069384F520A0D0000000023D8FFFF0C10000074 -S31508006948180000200000000033D6FFFF18000000DA -S315080069581801000000000020000000002F64656D83 -S315080069686F70726F675F6F6C696D65785F73746D4A -S315080069783332653430372E73726563002062797452 -S3150800698865732066726F6D206D656D6F727920610B -S31508006998742030780000000057726974696E6720A1 -S315080069A870726F6772616D20636865636B73756D66 -S315080069B82E2E2E0020627974657320746F206D65FB -S315080069C86D6F72792061742030780000436C6F739C -S315080069D8696E67206669726D776172652066696C8B -S315080069E8650A0D0001030507090E10121416181C6E -S315080069F81E00000050726F6772616D6D696E6720C0 -S31508006A08000000002F626F6F746C6F672E747874BD -S31508006A180000000080B541210148FDF7F5FF01BDDA -S31508006A28EC660008222A3A3C3E3F7C7F00000000BC -S31508006A3845726173696E672000000000C046C0464B -S31508006A48C046C046FFF7E8F92B2C3B3D5B5D0000C6 -S31508006A584552524F520A0D004F4B0A0D00000000CE -S31508006A684F70656E424C5400000000000102030492 -S31508006A7801020304060708090100000004010000D2 -S70508006A4543 +S31508000000902C002009770008E9860008E986000890 +S31508000010E9860008E9860008E9860008E9860008F6 +S31508000020E9860008E9860008E9860008E9860008E6 +S31508000030E9860008E9860008E9860008E9860008D6 +S31508000040E9860008E9860008E9860008E9860008C6 +S31508000050E9860008E9860008E9860008E9860008B6 +S31508000060E9860008E9860008E9860008E9860008A6 +S31508000070E9860008E9860008E9860008E986000896 +S31508000080E9860008E9860008E9860008E986000886 +S31508000090E9860008E9860008E9860008E986000876 +S315080000A0E9860008E9860008E9860008E986000866 +S315080000B0E9860008E9860008E9860008E986000856 +S315080000C0E9860008E9860008E9860008E986000846 +S315080000D0E9860008E9860008E9860008E986000836 +S315080000E0E9860008E9860008E9860008E986000826 +S315080000F0E9860008E9860008E9860008E986000816 +S31508000100E9860008E9860008E9860008E986000805 +S31508000110E9860008E9860008E9860008E9860008F5 +S31508000120E9860008E9860008E9860008E9860008E5 +S31508000130E9860008E9860008E9860008E9860008D5 +S31508000140E9860008E9860008E9860008E9860008C5 +S31508000150E9860008E9860008E9860008E9860008B5 +S31508000160E9860008E9860008E9860008E9860008A5 +S31508000170E9860008E9860008E9860008E986000895 +S30D08000180E9860008E98600087B +S31508000188044B9D46C046C046C046C04606F0E5F93B +S3150800019807F062FC902C002003E00B780370491CDA +S315080001A8401C13005A1E002BF7D1704701E0017056 +S315080001B8401C13005A1E002BF9D1704710B40023AF +S315080001C81400621E002C06D003780C781B1B491CE9 +S315080001D8401C002BF4D0180010BC704700E0401CE7 +S315080001E80278002A02D002788A42F8D10078704745 +S315080001F870B504002079002823D0256B01232A002E +S3150800020814F13401607803F081FA002801D001203E +S3150800021818E000202071606A854212D3606AE16995 +S31508000228081885420DD2E67809E0E06945190123E0 +S315080002382A0014F13401607803F068FA761E022E53 +S31508000248F3D2002070BD38B504000D00206B854236 +S3150800025812D02000FFF7CCFF002801D001200CE0BF +S3150800026801232A0014F13401607803F014FA0028EF +S3150800027801D0012001E02563002032BD38B504000D +S315080002882000FFF7B5FF0500EDB2002D5DD12078F7 +S31508000298032852D1607900284FD0002020634FF4F4 +S315080002A80072002114F13400FFF780FF552084F806 +S315080002B83202AA2084F83302522084F834005220E5 +S315080002C884F83500612084F83600412084F8370020 +S315080002D8722084F81802722084F81902412084F8DA +S315080002E81A02612084F81B02206984F81C02206916 +S315080002F880B2000A84F81D022069000C84F81E02E0 +S315080003082069000E84F81F02E06884F82002E06875 +S3150800031880B2000A84F82102E068000C84F82202F8 +S31508000328E068000E84F823020123626914F1340197 +S31508000338607803F0EBF900206071002200216078EC +S3150800034803F022FA002800D001252800C0B232BDE1 +S31508000358891E8269921E914201D3002003E08278A1 +S31508000368C06A02FB01007047F8B504000D00022DAB +S3150800037802D3A069854201D3012014E02078012818 +S3150800038804D00ED303284AD032D30AE02E0016EB3F +S315080003985606606A10EB56212000FFF754FF00281E +S315080003A802D05FF0FF30F2BD4FF40070B6FBF0F1F3 +S315080003B801FB1061081990F83470761C606A10EB16 +S315080003C856212000FFF73FFF0028EAD14FF40070B6 +S315080003D8B6FBF0F101FB1061081990F8340057EAEA +S315080003E80027E80701D5380901E03805000DDAE7DE +S315080003F8606A10EB15212000FFF725FF0028D0D1E9 +S3150800040868004FF40071B0FBF1F202FB11021019F3 +S3150800041834304178007850EA012080B2C3E7606A30 +S3150800042810EBD5112000FFF70EFF0028B9D1A80058 +S315080004384FF40071B0FBF1F202FB110210193430C7 +S31508000448C1788278120452EA0161427851EA022197 +S315080004580078084300010009A5E7F8B504000D006F +S315080004681600022D02D3A069854201D3022082E034 +S315080004782078012804D07BD3032858D040D377E0C6 +S315080004882F0017EB5707606A10EB57212000FFF774 +S31508000498DAFEC0B200286CD14FF40070B7FBF0F151 +S315080004A801FB1071081910F13401E80705D5087819 +S315080004B810F00F0050EA061000E0300008707F1CA4 +S315080004C801202071606A10EB57212000FFF7BBFE58 +S315080004D8C0B200284DD14FF40071B7FBF1F202FB08 +S315080004E8117211193431EA0701D5320906E00A787A +S315080004F812F0F002330A13F00F031A430A7038E0B1 +S31508000508606A10EB15212000FFF79DFEC0B200288F +S315080005182FD169004FF40072B1FBF2F303FB1213F3 +S31508000528191934310E70B6B2320A4A7021E0606A77 +S3150800053810EBD5112000FFF786FEC0B2002818D1A7 +S31508000548A9004FF40072B1FBF2F303FB1213191951 +S315080005583431CA78120612F0704216430E70320009 +S3150800056892B2120A4A70320C8A70320ECA7000E0C9 +S31508000578022001212171C0B2F2BDF8B504000E00AF +S31508000588022E02D3A069864201D3022527E0002558 +S3150800059809E0206910F1010F04D02069401C206188 +S315080005A8012060713E00A069864218D231002000F9 +S315080005B8FFF7DAFE0700002F11D0012F01D1022517 +S315080005C80DE017F1010F01D1012508E000223100DD +S315080005D82000FFF742FF0500EDB2002DD9D028000C +S315080005E8C0B2F2BDF8B504000E00002E07D1E768C0 +S315080005F8002F02D0A06987420DD301270BE03100EE +S315080006082000FFF7B1FE022801D2012043E0A169C4 +S31508000618884240D337003D006D1CA069854204D343 +S315080006280225AF4201D2002035E029002000FFF755 +S315080006389BFE00281DD17FF0704229002000FFF795 +S315080006480CFFC0B2002806D1002E04D02A003100BB +S315080006582000FFF702FFC0B2002814D1E560206920 +S3150800066810F1010F16D02069401E20610120607123 +S3150800067810E010F1010F01D0012800D10BE0BD42AE +S31508000688CAD1002007E0C0B2012802D15FF0FF35C1 +S3150800069800E001252800F2BD70B504000D00E580CC +S315080006A8A068012803D021688969884201D30220F5 +S315080006B848E0002805D121680978032901D120686E +S315080006C8806A00280ED1E06020680089ADB28542AC +S315080006D801D3022036E02068806AADB210EB151007 +S315080006E8206123E02168897889B20E0100E0AD1BF4 +S315080006F8ADB2B6B2B54210D301002068FFF734FE92 +S3150800070810F1010F01D101201CE0022803D321684A +S3150800071889698842EBD3022014E0E060010020686A +S31508000728FFF716FEADB210EB15102061ADB210201A +S31508000738B5FBF0F101FB1051206810EB411034307D +S315080007486061002070BDF8B504000D00E088461CFD +S31508000758B6B2002E02D02069002801D1042087E00D +S31508000768B6B21020B6FBF0F101FB1061002972D170 +S315080007782069401C2061E068002806D120680089A5 +S31508000788B6B2864267D3042072E0B6B2206880788B +S31508000798401E10EA161F5ED1E1682068FFF7E4FDDF +S315080007A80700022F01D2022062E017F1010F01D1DA +S315080007B801205DE020688069874246D3002D01D173 +S315080007C8042055E0E1682068FFF70CFF0700002FB2 +S315080007D801D107204CE0012F01D1022048E017F18A +S315080007E8010F01D1012043E02068FFF701FD002829 +S315080007F801D001203CE04FF4007200212068343013 +S31508000808FFF7D4FC39002068FFF7A2FD21680863C2 +S31508000818002505E02068006B401C216808636D1CEC +S3150800082820688078EDB2854209D2206801210171D5 +S315080008382068FFF7DDFC0028ECD0012018E02068C6 +S31508000848006BEDB2401B21680863E7603900206831 +S31508000858FFF77EFD2061E680B6B21020B6FBF0F100 +S3150800086801FB1061206810EB4110343060610020EC +S31508000878F2BD70B504000D0000212000FFF70CFF3B +S31508000888C0B200281BD1002621692068FFF7DBFCC7 +S31508000898C0B2002813D161690978E52903D06169CE +S315080008A80978002903D1761CAE4201D107E0002653 +S315080008B801212000FFF747FFC0B20028E4D0C0B2E4 +S315080008C870BDCA7E8B7E53EA022292B2007803284C +S315080008D806D1487D097D51EA002080B252EA0042D5 +S315080008E81000704781760A0092B2120AC2760A0C7C +S315080008F80275090C89B2090A417570472DE9F04154 +S3150800090804000D00287830F04000401E0D2101FB38 +S3150800091800F600275FF00108DFF8180D385C401963 +S315080009284078DFF8101D795C495D51EA00201FFA06 +S3150800093888F8B8F1000F11D080B202F096FF804609 +S31508000948FF2E09D234F8160002F08FFF761C1FFA1C +S3150800095888F880B2804508D0002018E080B24FF6A3 +S31508000968FF71884201D0002011E07F1C0D2FD3D3D8 +S31508000978287840060AD51FFA88F8B8F1000F05D076 +S3150800098834F81600002801D0002000E00120BDE850 +S31508000998F08170B40A7812F03F02521E0D235A43AA +S315080009A800230124DFF88C5C5D5D6D186D78DFF82F +S315080009B8846C9E5D765C56EA0525A4B2002C11D097 +S315080009C8FF2A01D3002018E02C0020F81240521CF8 +S315080009D85B1C0D2BE6D3097849060DD5FF2A08D3E3 +S315080009E800200AE0ADB24FF6FF76B542F0D00020F7 +S315080009F803E0002120F81210012070BC7047F0B4FB +S31508000A084B730F23CB7200230B7300238B760023BB +S31508000A18CB76D2B2531E0D24634300242500A4B214 +S31508000A28ADB24FF6FF76B54202D030F813505B1CCC +S31508000A38DFF8006CA65D7554DFF8F86BA65D7618C6 +S31508000A48ADB22F0A7770ADB2002D01D14FF6FF75FA +S31508000A58641C0D2CE4D3ADB24FF6FF74A54203D03F +S31508000A6830F81300002801D152F040020A70F0BC91 +S31508000A7870477CB5040016001D000B222000FFF7FE +S31508000A888BFBADB2062D09DBADB2E80310EB5500BA +S31508000A9831880D18B61C30880028F5D10720ADB264 +S31508000AA8102195FBF1F202FB115212F13001C9B27D +S31508000AB83A2900DBC91D00AA8154401EADB210218F +S31508000AC895FBF1F5ADB2002DE9D100A97E22425475 +S31508000AD8002100E0491C814202D20A5D202AF9D188 +S31508000AE80A00511C082803D200ABC35C401C00E06E +S31508000AF8202313550829F3D373BD00210B22C9B245 +S31508000B08CB0113EB510103785918401C521E002AD1 +S31508000B18F5D10800C0B270472DE9F041050000215B +S31508000B282800FFF7B9FD0400E4B2002C02D0200023 +S31508000B38C0B226E0FF27B84629692868FFF783FB6D +S31508000B480400E4B2002C1AD16E693078C0B20028C5 +S31508000B5801D1042413E0F17A11F03F01C0B2E52867 +S31508000B6804D00A070FD5C9B20F290CD0FF270021D0 +S31508000B782800FFF7E8FD0400E4B2002CDCD02000CA +S31508000B88C0B2BDE8F081C9B20F291ED1E9690029AA +S31508000B98EDD0410606D596F80D8010F0BF0007007F +S31508000BA8E9882984C0B2FFB2B8420CD1707B5FFAD3 +S31508000BB888F8804507D13100E869FFF79FFE0028C5 +S31508000BC801D07F1E00E0FF27D1E7FFB2002F06D12C +S31508000BD83000FFF792FF5FFA88F88045CFD0FF27E5 +S31508000BE84FF6FF702884A869C07AC007BFD40B22BD +S31508000BF8A9693000FFF7E2FA0028B8D1BFE72DE95E +S31508000C08F04104000D00FF26FF275FF0040820695D +S31508000C1800282ED021692068FFF715FB80465FFA61 +S31508000C2888F8B8F1000F24D160690278D2B2002A90 +S31508000C3802D15FF004081CE0C17A11F03F01D2B274 +S31508000C48E52A0BD0D2B22E2A08D0C9B2082901D172 +S31508000C58012300E00023DBB2AB4215D0FF260021B2 +S31508000C682000FFF770FD80465FFA88F8B8F1000F94 +S31508000C78CDD05FFA88F8B8F1000F01D000202061BE +S31508000C884046C0B2BDE8F081C9B20F2919D151064C +S31508000C9805D5477B12F0BF021600E1882184D2B237 +S31508000CA8F6B2B2420BD1417BFFB28F4207D101009F +S31508000CB8E069FFF76EFE002801D0761E00E0FF26E1 +S31508000CC8CDE7F6B2002E04D1FFF717FFFFB2874229 +S31508000CD802D04FF6FF702084CBE72DE9F04184B0A7 +S31508000CE80400A669E7690C22310000A8FFF754FA40 +S31508000CF89DF80B00C0072CD50020F0720020E06193 +S31508000D085FF0010801E018F101081FFA88F8B8F140 +S31508000D18640F0DDA43469BB23A0000A93000FFF784 +S31508000D28A8FE2000FFF7F8FE0500EDB2002DEAD070 +S31508000D381FFA88F8B8F1640F01D107207DE0EDB2F3 +S31508000D48042D02D02800C0B277E09DF80B00F07297 +S31508000D58E7619DF80B00800712D55FF0000801E0EF +S31508000D6818F101081FFA88F837F818000028F7D18B +S31508000D781FFA88F818F119000D2190FBF1F600E022 +S31508000D880126B6B231002000FFF773FD0500EDB263 +S31508000D98002D32D1761E300080B200282DD0E0888A +S31508000DA8811B89B22000FFF777FC0500EDB2002DFC +S31508000DB823D1A069FFF7A1FE070021692068FFF77C +S31508000DC842FA0500EDB2002D17D13B00DBB232001E +S31508000DD8D2B26169E069FFF712FE20680121017144 +S31508000DE800212000FFF7AFFC0500EDB2002D04D165 +S31508000DF8761E300080B20028DFD1EDB2002D1AD158 +S31508000E0821692068FFF71FFA0500EDB2002D12D1F7 +S31508000E18202200216069FFF7C9F90B22A1696069D8 +S31508000E28FFF7BAF9A069C07A10F018006169087363 +S31508000E382068012101712800C0B204B0BDE8F0811C +S31508000E4838B50400E588208C4FF6FF71884201D131 +S31508000E58290000E0218C89B22000FFF71DFCC0B2EA +S31508000E6800281BD121692068FFF7EDF9C0B20028D0 +S31508000E7810D16169E5220A70216801220A71E188A0 +S31508000E88ADB2A94206D200212000FFF75CFCC0B229 +S31508000E980028E7D0C0B2042800D10220C0B232BD6B +S31508000EA82DE9F14F8846D8F8009001E019F10109B3 +S31508000EB899F800002F28F9D099F800005C28F5D091 +S31508000EC80098C6690024250002E026F815706D1CEE +S31508000ED814F80970641CBFB2202F05DBBFB22F2F88 +S31508000EE802D0BFB25C2F09D114EB0900C8F800007C +S31508000EF8BFB2202F1FDA5FF004081EE0FF2D01D3CA +S31508000F08062090E0FFB20121380080B202F086FC84 +S31508000F180700BFB2002F01D1062084E0BFB2802F98 +S31508000F28D3DABFB23900DFF8F808FFF757F900280F +S31508000F38CBD0062077E05FF0000800E06D1E002D94 +S31508000F4809D016EB450030F8027CBFB2202FF5D041 +S31508000F58BFB22E2FF2D0002D01D1062063E0002063 +S31508000F6826F815000B22202100988069FFF71EF93C +S31508000F78002400E0641C36F814002028FAD036F855 +S31508000F8814002E28F6D0002C03D058F0030800E0E9 +S31508000F986D1E002D05D016EB450030F8020C2E28DC +S31508000FA8F6D15FF00009CB465FF0080A01E058F071 +S31508000FB8030836F81470641CBFB2002F35D10098A0 +S31508000FC880690078E52803D10098806905210170B1 +S31508000FD8BAF1080F01D15FEA89095FFA89F919F0A8 +S31508000FE80C000C2805D05FFA89F919F003000328C4 +S31508000FF801D158F002085FEA88700FD45FFA89F9B8 +S3150800100819F00300012801D158F010085FFA89F988 +S3150800101819F00C00042801D158F0080800988069CE +S3150800102880F80B800020BDE8F28FBFB2202FBED013 +S31508001038BFB22E2F01D1AC42B9D1D34501D2AC42A9 +S3150800104813D1BAF10B0F02D158F00308B7E7AC422F +S3150800105801D058F00308A542B1D32C005FF0080B5D +S315080010685FF00B0A5FEA8909A3E7BFB2802F10DB96 +S315080010780021380080B202F0D1FB0700BFB2002F6A +S3150800108805D0BFB2DFF89C07381810F8807C58F0EE +S315080010980208BFB2002F07D0BFB23900DFF88807A9 +S315080010A8FFF79CF8002803D05F2758F003080FE0DD +S315080010B8BFB2B7F141001A2802D259F0020907E06F +S315080010C8BFB2B7F161001A2802D259F00109203FC8 +S315080010D8009880690BF800701BF1010B69E7F8B5F1 +S315080010E80C0004F209010269002A48D04269137BF8 +S315080010F800250EE0F6B2052E00D1E5261F0705D510 +S31508001108F6B2B6F141071A2F00D220360E70491CDE +S315080011186D1C082D03D2AE5CF6B2202EEAD1157ADC +S31508001128202D15D02E250D70491C08250AE0DF0646 +S3150800113805D5F6B2B6F141071A2F00D220360E7039 +S31508001148491C6D1C0B2D03D2AE5CF6B2202EEED1CF +S31508001158D37A2372D37F957F2D0455EA0363557F87 +S3150800116853EA0523157F2B432360537E157E55EADC +S315080011780323A380D37D927D52EA0322E2800022CC +S315080011880A70A169002926D0E169002923D0A66931 +S315080011980025016900291CD0018C4FF6FF7291427F +S315080011A817D0C76901E0A8556D1C3888BF1C01000F +S315080011B889B200290DD0002180B202F02FFB80B237 +S315080011C8002801D1002504E0E169491E8D42EAD3C9 +S315080011D800250020A855F1BD13B50400019800782C +S315080011E82F2803D0019800785C2802D10198401C62 +S315080011F801900020A0600198007820280AD20021D2 +S315080012082000FFF749FA0021616120E02068FFF70E +S3150800121858FBA06001A92000FFF742FEC0B20028CB +S3150800122815D12000FFF778FCA169C97AC0B2002851 +S3150800123806D0C0B204280AD1490700D4052006E01A +S31508001248490704D46169C87AC006DFD40520C0B244 +S3150800125816BD10B5040001230A0014F1340160789C +S3150800126802F019FA002801D003202DE094F8330279 +S3150800127894F8321251EA002080B24AF6552188427B +S3150800128801D0022020E094F86C0094F86B1009024B +S3150800129851EA004094F86A100843DFF8681C884247 +S315080012A801D1002010E094F8880094F88710090204 +S315080012B851EA004094F886100843DFF8481C88422B +S315080012C801D1002000E0012010BDF8B5150002681C +S315080012D81378B3F130060A2E05D253783A2B02D181 +S315080012E8921C026000E0002600200860002E01D04B +S315080012F80B209DE1DFF8100C50F82640002C01D190 +S315080013080C2095E10C60207800280DD0607802F052 +S31508001318AEF9C10708D4EDB2002D03D0400701D5B0 +S315080013280A2085E1002083E1002020706670607835 +S3150800133802F085F9C10701D5032079E1EDB2002D40 +S3150800134803D0400701D50A2072E1002529002000AC +S31508001358FFF77FFF0600F6B2012E1CD10020C0B2A7 +S31508001368002800D0401EC0B214EB001000F2F2109C +S31508001378017900290FD0C17A827A120452EA0161EA +S31508001388427A51EA0221007A50EA0105290020002A +S31508001398FFF75FFF0600F6B2032E01D1012047E1E9 +S315080013A8F6B2002E01D00D2042E194F8400094F8D8 +S315080013B83F1051EA002080B2B0F5007F01D00D2019 +S315080013C836E194F84B0094F84A1051EA002080B2A6 +S315080013D800280DD194F85B0094F85A10090451EACC +S315080013E8006094F8591050EA012094F858100843F8 +S315080013F8E06194F84410E170C9B2012904D0C9B271 +S31508001408022901D00D2013E1C9B2484394F84110C6 +S31508001418A170C9B2002903D04A1EC9B2114201D027 +S315080014280D2005E194F8461094F8452052EA012162 +S31508001438218121891022B1FBF2F303FB1213002B39 +S3150800144801D00D20F4E094F8481094F8472052EAA1 +S31508001458012292B2002A0DD194F8571094F8562012 +S31508001468120452EA016194F8552051EA022194F8C7 +S3150800147854200A4394F8431094F8423053EA012159 +S3150800148889B2002901D10D20D2E010FA81F3268904 +S3150800149813EB16139A4201D20D20C9E0D21AA67880 +S315080014A8B2FBF6F2002A01D10D20C1E0012640F66A +S315080014B8F677BA4200D302264FF6F677BA4200D331 +S315080014C80326921CA261256215FA81F161625919EF +S315080014D8E162F6B2032E16D12089002801D00D2024 +S315080014E8A6E094F8630094F86210090451EA0060CB +S315080014F894F8611050EA012094F860100843A06235 +S31508001508A069800015E02189002901D10D208FE006 +S31508001518616A4018A062F6B2022E02D1A06940009C +S3150800152807E0A06903214843217E11F0010111EB68 +S315080015385000E16900F2FF10B1EB502F01D20D20DF +S3150800154876E05FF0FF3020610020E060F6B2032EF7 +S3150800155860D10020607194F8650094F8641051EA27 +S31508001568002015FA80F060610123626914F13401DC +S31508001578607802F090F800284CD194F8330294F871 +S31508001588321251EA002080B24AF65521884241D1E2 +S3150800159894F8370094F83610090451EA006094F86C +S315080015A8351050EA012094F834100843DFF8281A51 +S315080015B888422FD194F81B0294F81A12090451EAA2 +S315080015C8006094F8191250EA012094F81812084392 +S315080015D8DFF8081A88421DD194F8230294F82212D3 +S315080015E8090451EA006094F8211250EA012094F897 +S315080015F820120843E06094F81F0294F81E120904A2 +S3150800160851EA006094F81D1250EA012094F81C1259 +S31508001618084320612670DFF8C8090088401CDFF8EF +S31508001628C0190880E080002020630020207100206F +S31508001638F2BD0000B886000880B500280BD00168FE +S31508001648002908D001680978002904D00168C988E2 +S315080016588288914201D0092008E00068407802F0A3 +S3150800166806F8C00701D5032000E0002002BDC0B275 +S31508001678002801D00B2012E0C0B2DFF88C2852F8F7 +S315080016882020002A01D000231370002901D0002247 +S315080016980A70C0B2DFF8702842F820100020704798 +S315080016A82DE9F2438CB004001500002C01D109205D +S315080016B8B3E00020206015F01F0515F0FE0200A90A +S315080016C80CA8FFF702FE0600F6B2002E40F0A3802B +S315080016D809A80690DFF80C0907900C9900A8FFF7E7 +S315080016E87BFD0600059FF6B2002E02D1002F00D119 +S315080016F806261C20054258D0F6B2002E0AD0F6B2A5 +S31508001708042E03D100A8FFF7E8FA060055F00805E5 +S31508001718059F08E0F87A1121084201D0072602E059 +S31508001728680700D50826F6B2002E4CD128074AD5F0 +S3150800173802F05FF8804687F80E80404680B2000AB5 +S31508001748F8735FEA184038745FEA186078740020FE +S31508001758F87200203877002078770020B8770020BC +S31508001768F87739000098FFF7ACF881460021380069 +S31508001778FFF7B8F8009801210171B9F1000F22D0D6 +S315080017880098D0F8308049460098FEF7F6FE06001D +S31508001798F6B2002E17D10098B9F10101C160414689 +S315080017A80098FEF750FD06000DE0F6B2002E0AD1A5 +S315080017B8F87AC00601D5042605E0A80703D5F87AFD +S315080017C8C00700D50726F6B2002E07D1280701D587 +S315080017D855F020050098006BE0612762F6B2002EE6 +S315080017E819D1A57139000098FFF76BF82061F87FC1 +S315080017F8B97F090451EA0060797F50EA0120397FE8 +S315080018080843E0600020A0600020A06100982060DE +S315080018180098C088A0803000C0B20DB0BDE8F0833B +S31508001828F88600086C8200081C8700082DE9F0472E +S31508001838050016001F000C00002038602800FFF776 +S31508001848FBFEC0B2002801D0C0B2E3E0A8790006C2 +S3150800185801D50220DEE0A879C00701D40720D9E01F +S31508001868E868A968401AB04229D2060027E0C5F8F0 +S315080018781890A8684FF40071B0FBF1F202FB110248 +S31508001888D2F50078464500D2B0464246A8684FF4D5 +S315080018980071B0FBF1F303FB1103581910F1240189 +S315080018A82000FEF779FC18EB0404A86818EB00007A +S315080018B8A860386818EB00003860B6EB0806002EF2 +S315080018C800F0A780A8684FF40071B0FBF1F202FB9C +S315080018D81102002ACDD1A868400A29688978491EC4 +S315080018E811EA00085FFA88F8B8F1000F1AD1A86853 +S315080018F8002801D1286903E069692868FEF734FDDC +S31508001908022805D2A87950F08000A871022081E043 +S3150800191810F1010F05D1A87950F08000A8710120AF +S3150800192878E0686169692868FEF712FD8146B9F1A9 +S31508001938000F05D1A87950F08000A871022069E047 +S3150800194859FA88F95FEA562ABAF1000F35D0286895 +S3150800195880785AFA88F1884205D2286880785FFA2A +S3150800196888F8B0EB080A5346DBB24A4621002868CD +S31508001978407801F090FE002805D0A87950F080003C +S31508001988A871012046E0A879400611D5A869B0EBE8 +S31508001998090050450CD24FF4007215F12401A869C4 +S315080019A8B0EB09004FF4007303FB0040FEF7F4FBA5 +S315080019B84FF4007000FB0AF875E7A86948453FF434 +S315080019C856AFA879400613D50123AA6915F124014B +S315080019D82868407801F09AFE002805D0A87950F0C2 +S315080019E88000A871012015E0A87910F0BF00A87139 +S315080019F801234A4615F124012868407801F04BFE70 +S31508001A0800283FF434AFA87950F08000A871012067 +S31508001A1800E00020BDE8F0872DE9F047050016002C +S31508001A281F000C00002038602800FFF705FEC0B22A +S31508001A38002801D0C0B270E0A879000601D50220B6 +S31508001A486BE0A879800701D4072066E0E8683018B3 +S31508001A58E96888422DD200262BE0C5F81890A868B0 +S31508001A684FF40071B0FBF1F202FB1102D2F50078CF +S31508001A78464500D2B04642462100A8684FF400738E +S31508001A88B0FBF3FC0CFB130C1CEB05002430FEF72B +S31508001A9883FBA87950F04000A87118EB0404A868DD +S31508001AA818EB0000A860386818EB00003860B6EB39 +S31508001AB80806002E26D0A8684FF40071B0FBF1F28C +S31508001AC802FB1102002ACAD1A868400A296889783F +S31508001AD8491E11EA00085FFA88F8B8F1000F30D1F4 +S31508001AE8A868002808D12869002809D1002128688B +S31508001AF8FEF778FD286103E069692868FEF772FD34 +S31508001B0800280CD1E868A968884201D2A868E86064 +S31508001B18A87950F02000A8710020BDE8F0870128B0 +S31508001B2805D1A87950F08000A8710220F5E710F1D0 +S31508001B38010F05D1A87950F08000A8710120ECE7BB +S31508001B486861A879400613D50123AA6915F1240105 +S31508001B582868407801F0DAFD002805D0A87950F001 +S31508001B688000A8710120D8E7A87910F0BF00A871ED +S31508001B7869692868FEF7ECFB8146B9F1000F05D1BB +S31508001B88A87950F08000A8710220C6E759FA88F9A2 +S31508001B985FEA562ABAF1000F36D0286880785AFACA +S31508001BA888F1884205D2286880785FFA88F8B0EB09 +S31508001BB8080A5346DBB24A4621002868407801F0ED +S31508001BC8A5FD002805D0A87950F08000A871012045 +S31508001BD8A3E7A869B0EB0900504510D24FF4007284 +S31508001BE8A869B0EB09004FF4007101FB004115F133 +S31508001BF82400FEF7D1FAA87910F0BF00A8714FF4AF +S31508001C08007000FB0AF848E7A86948453FF425AF7D +S31508001C18A868E9688842BFF420AF01234A4615F147 +S31508001C2824012868407801F036FD00283FF415AFEE +S31508001C38A87950F08000A87101206EE738B504002D +S31508001C482000FFF7F9FCC0B200284AD1A179890615 +S31508001C5847D5A07940060FD50123A26914F12401B6 +S31508001C682068407801F052FD002801D0012039E0AB +S31508001C78A07910F0BF00A071E1692068FEF7E3FAC1 +S31508001C88C0B200282DD1256AE87A50F02000E872FB +S31508001C98E0682877E06880B2000A6877E068000C90 +S31508001CA8A877E068000EE87721692800FEF71AFE8B +S31508001CB801F09FFDA875010089B2090AE975010CAA +S31508001CC82976000E68760020A8740020E874A079A2 +S31508001CD810F0DF00A0712068012101712068FEF765 +S31508001CE8CDFAC0B232BD10B504002000FFF7A6FF32 +S31508001CF8C0B2002801D100212160C0B210BD2DE96B +S31508001D08F04104000D002000FFF796FC0600F6B225 +S31508001D18002E02D03000C0B2CCE0A079000601D56A +S31508001D280220C7E0E068A84203D2A079800700D459 +S31508001D38E568A0680027A760002D7BD02168897808 +S31508001D484FF4007202FB01F8002810D0411EB1FBBF +S31508001D58F8F16A1EB2FBF8F28A4208D3401EB8F1B7 +S31508001D6801018843A060A0682D1A606919E02069F6 +S31508001D78002815D100212068FEF734FC012805D172 +S31508001D88A07950F08000A071022093E010F1010FAD +S31508001D9805D1A07950F08000A07101208AE0206161 +S31508001DA86061002807D145E06061A16818EB010168 +S31508001DB8A160B5EB0805A84509D2A17989071ED5FA +S31508001DC801002068FEF70EFC00281CD14546A168CC +S31508001DD86918A1604FF40071B5FBF1F202FB1152C4 +S31508001DE8002A27D001002068FEF7B2FA0700002F5C +S31508001DF81ED1A07950F08000A07102205AE0010097 +S31508001E082068FEF7B1FA10F1010F05D1A07950F054 +S31508001E188000A07101204DE0022803D32168896952 +S31508001E288842C1D3A07950F08000A071022041E011 +S31508001E3817EB5527A0684FF40071B0FBF1F202FBC7 +S31508001E481102002A2AD0A069874227D0A07940061D +S31508001E5813D50123A26914F124012068407801F0FA +S31508001E6855FC002805D0A07950F08000A071012003 +S31508001E7820E0A07910F0BF00A07101233A0014F100 +S31508001E8824012068407801F006FC002805D0A079CE +S31508001E9850F08000A07101200CE0A761E068A168F5 +S31508001EA8884205D2A068E060A07950F02000A071A9 +S31508001EB83000C0B2BDE8F08131B58CB00C00002204 +S31508001EC803A90CA8FFF701FA0500EDB2002D15D1F4 +S31508001ED800A80990DFF80C010A900C9903A8FFF7E7 +S31508001EE87BF90500EDB2002D08D10898002804D022 +S31508001EF8210003A8FFF7F3F800E006252800C0B27A +S31508001F080DB030BD464154002C24002071B595B05B +S31508001F18012200A915A8FFF7D8F90400E4B2002C95 +S31508001F2856D109A806902F480790159900A8FFF7D3 +S31508001F3853F90400E4B2002C4AD1059D002D01D1BD +S31508001F48062403E0E87AC00700D507242900009884 +S31508001F58FEF7B7FC0600E4B2002C21D1E87AC006E1 +S31508001F681ED5022E01D202241AE0242200A90CA8A2 +S31508001F78FEF712F90E9602210CA8FEF78DFB04004F +S31508001F88E4B2002C0CD100210CA8FEF738FE040098 +S31508001F98E4B2002C00D10724E4B2042C00D10024B2 +S31508001FA8E4B2002C14D100A8FEF74AFF0400E4B2F4 +S31508001FB8002C0DD1002E04D031000098FEF7DDFA6A +S31508001FC80400E4B2002C03D10098FEF757F9040080 +S31508001FD82000C0B216B070BD52526141727241619A +S31508001FE870240020641D00202DE9FC4104000F0020 +S31508001FF8904600252600FFE7781E854213DA00ABCF +S31508002008012201A94046FFF711FC009801280AD1C8 +S315080020189DF80400C0B20D28EED03070761C6D1CF1 +S31508002028C0B20A28E8D100203070002D00D100245B +S315080020382000BDE8F68130B583B004000D00E4B28F +S315080020480A2C03D129000D20FFF7F5FF8DF800406B +S31508002058012401AB220000A92800FFF7DDFC01983E +S31508002068A04201D1012001E05FF0FF303EBD70B506 +S3150800207804000D00002601E0641C761C2078002860 +S3150800208809D029002078FFF7D6FF10F1010FF3D100 +S315080020985FF0FF3000E0300070BD10B450F8041B44 +S315080020A881B102681218001D50F8043BDC0744BFCA +S315080020B8A9F10104E31852F8044B43F8044B091F25 +S315080020C8F9D1EBE710BC704780B500208DF8000001 +S315080020D801F050FA01F0E8FB00F089F88DF80000E5 +S315080020E89DF80000002802D09DF8000046E000F0A0 +S315080020F8A2F98DF800009DF80000002802D09DF886 +S3150800210800003BE0DFF86C0B00210175DFF8640B73 +S3150800211800210160DFF85C0B00214160DFF8540BF1 +S3150800212800218160DFF84C0B0021C160DFF8440B01 +S3150800213800210161DFF83C0B01F0C2FBDFF8380B20 +S3150800214800F048FA8DF800009DF80000002809D12B +S31508002158DFF8240BB0F854000004002100F068FCEE +S315080021688DF800009DF80000002805D14FF400609E +S3150800217800F0FDFB8DF800009DF8000002BD10B5C3 +S31508002188042400F00DF80400E4B2042C01D1002060 +S3150800219805E0E4B2FF2C01D1022000E0012010BDC1 +S315080021A880B50020009000F010F801280BD100A88F +S315080021B800F082FE002801D0FF2005E00098400ABA +S315080021C810F00F0000E0FF2002BD80B501208DF851 +S315080021D800004FF40061DFF8A40A01F04EFC00285D +S315080021E802D100208DF800009DF8000002BDF8B560 +S315080021F800208DF800000026002400270025DFF8B7 +S31508002208740A76210175DFF86C0A00210160DFF887 +S31508002218640A00214160DFF85C0A00218160DFF862 +S31508002228540A0021C160DFF84C0A00210161DFF871 +S31508002238440A01F045FB032001F05BFB012001F08D +S3150800224854FBDFF83C0A00210160DFF8340A002154 +S315080022584160DFF82C0A00218160DFF8240A002192 +S31508002268C160DFF81C0A4FF480610161DFF8100AC3 +S3150800227801F047FB00F062FE8DF800009DF80000AB +S31508002288002802D09DF80000D4E0DFF8F4094FF4DE +S31508002298D5710160DFF8E80908214160DFF8E0092F +S315080022A840218160DFF8D8090021C160DFF8D0092C +S315080022B84FF480610161DFF8C80901F022FB00F0DC +S315080022C857FE8DF800009DF80000002806D1DFF8B3 +S315080022D8B409012101605FF080451DE0DFF8A00917 +S315080022E800210160DFF8980937214160DFF8900975 +S315080022F840218160DFF888090021C160DFF880097C +S315080023084FF480610161DFF8780901F0FAFA37209D +S3150800231800F056FE8DF80000DFF864090021016018 +S31508002328DFF85C0937214160DFF8540940218160EC +S31508002338DFF84C090021C160DFF844094FF48061D1 +S315080023480161DFF83C0901F0DCFA372000F038FEB5 +S315080023588DF800009DF80000002869D105E00020E6 +S3150800236801F0E7FA0600F70F641C002F4ED14FF666 +S31508002378FF7084424AD2DFF8080900210160DFF8B5 +S31508002388000937214160DFF8F80840218160DFF845 +S31508002398F0080021C160DFF8E8084FF480610161A0 +S315080023A8DFF8DC0801F0ADFA372000F009FE8DF8F1 +S315080023B800009DF80000002802D09DF8000039E0CA +S315080023C8DFF8C4082843DFF8B8180860DFF8B0084B +S315080023D829214160DFF8A80840218160DFF8A008B4 +S315080023E80021C160DFF898084FF480610161DFF8C1 +S315080023F8900801F086FA00F06BFE8DF800009DF84B +S3150800240800000028ABD09DF8000013E04FF6FF70D7 +S31508002418844205D31B208DF800009DF8000009E0CA +S3150800242816F08046002E03D0DFF85808022101600E +S315080024389DF80000F2BD10B582B000240120ADF861 +S31508002448000001F059FA002803D125242000C0B25B +S31508002458BFE0DFF830080068042839D0DFF820081C +S3150800246800210160DFF8180802214160DFF810082A +S31508002478C0218160DFF808080021C160DFF800087C +S315080024884FF480610161DFF8F80701F03AFA00F0C5 +S315080024983DFE0400E4B2002C02D02000C0B298E049 +S315080024A8002001F046FADFF8001A0860042001F057 +S315080024B840FADFF8F4194860082001F03AFADFF81C +S315080024C8E81988600C2001F034FADFF8DC19C860CE +S315080024D8DFF8B007006800280ED0DFF8A8070068FC +S315080024E8012809D0DFF89C070068062804D0DFF819 +S315080024F894070068022823D1DFF8840700210160C1 +S31508002508DFF87C0703214160DFF874074021816002 +S31508002518DFF86C070021C160DFF864074FF48061B3 +S315080025280161DFF85C0701F0ECF900A9032000F067 +S3150800253812FE0400E4B2002C02D02000C0B248E023 +S31508002548DFF840070068042840D0DFF86009BDF8BE +S3150800255800100160BDF800000004DFF824170860C1 +S31508002568DFF81C0709214160DFF81407C0218160DC +S31508002578DFF80C070021C160DFF804074FF4806113 +S315080025880161DFF8FC0601F0BCF900F0BFFD0400A4 +S31508002598E4B2002C02D02000C0B21AE0002001F0F4 +S315080025A8C8F9DFF80C190860042001F0C2F9DFF849 +S315080025B800194860082001F0BCF9DFF8F4188860AB +S315080025C80C2001F0B6F9DFF8E818C86000242000E6 +S315080025D8C0B216BD2DE9D00300210024DFF8A426D1 +S315080025E8126880F85620DFF8C4281268A0F8542024 +S315080025F8DFF8BC281268120E1400E4B2A2090270A9 +S31508002608C4F38302427014F003028270DFF8A0282C +S315080026181268140CC470DFF898281268140A047132 +S31508002628DFF88C2814684471DFF884285268140E79 +S31508002638E4B22201C280DFF878285268140CC288EE +S31508002648E4B22309DBB21A43C28014F00F020272FD +S31508002658DFF85C285268140AE4B2E2094272C4F345 +S3150800266880128272C4F34012C272C4F30012027353 +S3150800267800224273DFF80C261268002A04D0DFF815 +S3150800268804261268012A59D1E4B214F00302920208 +S315080026980261DFF81C2854680269E4B252EA840227 +S315080026A80261DFF80C289268140E0269E4B2A309DD +S315080026B8DBB21A430261C4F3C202027514F00702B8 +S315080026C84275DFF8EC279268140CE4B26209827541 +S315080026D8C4F38202C27514F0030252000276DFF8C8 +S315080026E8D0279268140A027EE4B252EAD412027615 +S315080026F80269521C0023C0E91223D0E91267012295 +S31508002708037E9B1C9A40D317A2FB068902FB0799EE +S3150800271803FB0699C0E91289012290F908309A4004 +S315080027280265D0E91267026D0023A2FB068902FB3F +S31508002738079903FB0699C0E9128934E0DFF84425AE +S315080027481268022A2FD1DFF868275468E4B214F011 +S315080027583F0212040261DFF858279268140E0269CC +S31508002768E4B252EA04220261DFF844279268140C9C +S315080027780269E4B222430261DFF834279268140A30 +S3150800278802690023521C53F100035FF40026002750 +S31508002798A6FB028906FB039907FB0299C0E9128979 +S315080027A84FF400720265C4F38012427614F03F02B1 +S315080027B852008276DFF8F8269468827EE4B252EAF6 +S315080027C8D412827614F07F02C276DFF8E426D2683D +S315080027D8140EE4B2E2090277C4F341124277C4F34D +S315080027E88202827714F003029200C277DFF8C026C5 +S315080027F8D268140CC27FE4B252EA9412C277C4F3C0 +S31508002808401280F82020002280F8212014F00102C6 +S3150800281880F82220DFF89826D268140AE4B2E2097A +S3150800282880F82320C4F3801280F82420C4F34012C9 +S3150800283880F82520C4F3001280F82620C4F3810204 +S3150800284880F8272014F0030280F82820DFF860268D +S31508002858D468E4B2620880F82920012280F82A2080 +S31508002868DFF844261268140E80F82C40DFF838265C +S315080028781268140CE4B22202C285DFF82C26126804 +S31508002888140AC28DE4B22243C285DFF81C261468EE +S31508002898E4B222060263DFF810265268140E026BA9 +S315080028A8E4B252EA04420263DFF8FC255268140CC3 +S315080028B8026BE4B252EA04220263DFF8EC25526896 +S315080028C8140A026BE4B222430263DFF8DC25546873 +S315080028D880F83440DFF8D0259268140E80F8354021 +S315080028E8DFF8C4259268140CE4B222068263DFF87E +S315080028F8B8259268140A826BE4B252EA04428263E3 +S31508002908DFF8A4259468826BE4B252EA042282634B +S31508002918DFF89425D268140E826BE4B222438263E8 +S31508002928DFF88425D268140C90F83C20E4B252EA01 +S31508002938141280F83C20E4B214F00F021202C2877F +S31508002948DFF86425D268140AC28FE4B22243C28724 +S31508002958DFF85425D468E4B2620880F840200122DA +S3150800296880F841200800C0B2BDE8D003704710B50A +S315080029780024DFF810130968032903D12724200047 +S31508002988C0B254E0DFF8FC120968002909D0DFF85C +S31508002998F4120968012904D0DFF8E812096802293F +S315080029A843D1B0F5805F03D127242000C0B23EE0AA +S315080029B8B0F5006F1DD1012000F016FC0400E4B242 +S315080029C8002C32D1AB4800210175AA4800210160C4 +S315080029D8A84800214160A74800218160A5484FF40E +S315080029E80061C160A34800210161A24800F068FFA0 +S315080029F81BE0002000F0F8FB0400E4B2002C14D118 +S31508002A089C48002101759B480021016099480021CE +S31508002A18416098480021816096480021C160954820 +S31508002A2800210161934800F04BFF2000C0B210BD99 +S31508002A3810B50024DFF848221060DFF844020721A1 +S31508002A484160DFF83C0240218160DFF8340200214A +S31508002A58C160DFF82C024FF480610161DFF82002BB +S31508002A6800F04FFF072000F0ABFA04002000C0B2C0 +S31508002A7810BD2DE9F84314001D005FF000085FF04B +S31508002A8800090600DFF89C0400210170DFF89804A5 +S31508002A9800210160DFF8940400210160DFF8900442 +S31508002AA800210160089FDFF8DC010068022805D1CB +S31508002AB84FF40077640A44EAC5546D0ADFF8C00182 +S31508002AC8BFB20760DFF8B80110214160DFF8B0012E +S31508002AD840218160DFF8A8010021C160DFF8A00164 +S31508002AE84FF480610161664800F00BFF5FF4803897 +S31508002AF801E0B8F10108B8F1000F04D0802000F011 +S31508002B083FFF0028F5D0102000F05AFA80465FFAF1 +S31508002B1888F8B8F1000F02D04046C0B2A6E0DFF840 +S31508002B2814045FF0FF310160DFF80804BFB247609C +S31508002B38DFF8000490218160DFF8F8030221C160FC +S31508002B48DFF8F00300210161DFF8E803012141619C +S31508002B58DFF8E00300F0F7FE494804604848112109 +S31508002B68416047484021816045480021C160444882 +S31508002B784FF480610161424800F0C3FE112000F05D +S31508002B881FFA80465FFA88F8B8F1000F0CD040465D +S31508002B98C0B26BE000F0EEFE46F8290019F101090B +S31508002BA8B9F1080FF6D32036DFF88C03006840F22F +S31508002BB82A61084208D14FF4004000F0E1FE0028D7 +S31508002BC8F2D05FF00009EBE7082000F0D9FE0028EC +S31508002BD807D0082000F0DFFE5FF004084046C0B2C0 +S31508002BE844E0022000F0CCFE002807D0022000F0BE +S31508002BF8D2FE5FF002084046C0B237E0202000F057 +S31508002C08BFFE002807D0202000F0C5FE5FF00608A2 +S31508002C184046C0B22AE04FF4007000F0B1FE002822 +S31508002C2808D04FF4007000F0B6FE5FF0070840467B +S31508002C38C0B21BE05FF0FF3905E000F09BFE30608C +S31508002C48361DB9F101095FF4001000F099FE002855 +S31508002C5802D0B9F1000FF0D140F2FF5000F09BFE08 +S31508002C68DFF86804002101604046C0B2BDE8F28377 +S31508002C780000000018230020B021002000080240A8 +S31508002C884823002030240020000010802DE9F84F42 +S31508002C9814001D005FF000095FF000085FF0000AE5 +S31508002CA85FF0000B0600DFF87C0200210170DFF8F0 +S31508002CB8780200210160DFF8740200210160DFF85C +S31508002CC87002002101600A9F7A480068022805D127 +S31508002CD84FF40077640A44EAC5546D0ADFF8040518 +S31508002CE8BFB20760DFF8FC0410214160DFF8F4047E +S31508002CF840218160DFF8EC040021C160DFF8E404B4 +S31508002D084FF480610161DFF8DC0400F0FAFD102059 +S31508002D1800F056F981465FFA89F9B9F1000F02D031 +S31508002D284846C0B2BDE0DFF8BC040460DFF8B40466 +S31508002D3818214160DFF8AC0440218160DFF8A4045B +S31508002D480021C160DFF89C044FF480610161DFF857 +S31508002D58940400F0D6FD182000F032F981465FFA8F +S31508002D6889F9B9F1000F02D04846C0B299E0DFF8F0 +S31508002D78C4015FF0FF310160DFF8B801BFB24760F0 +S31508002D88DFF8B00190218160DFF8A8010021C16051 +S31508002D98DFF8A00100210161DFF8980101214161EE +S31508002DA8DFF8900100F0CFFD0BE056F82A0000F096 +S31508002DB8E4FD1AF1010ABAF1080FF6D3203618F11C +S31508002DC82008DFF87401006840F21A6108422CD11D +S31508002DD84FF4804000F0D4FD0028F2D0D8F50070F2 +S31508002DE820281FD2D8F500700421B0FBF1F202FBA7 +S31508002DF81102002A04D1D8F500705FEA900B04E0A6 +S31508002E08D8F50070800810F1010B5FF0000ADA4562 +S31508002E18D7D2306800F0B1FD1AF1010A361D18F14B +S31508002E280408F4E75FF0000AC5E7082000F0A8FDE3 +S31508002E38002807D0082000F0AEFD5FF004094846D0 +S31508002E48C0B22EE0022000F09BFD002807D0022021 +S31508002E5800F0A1FD5FF002094846C0B221E0102043 +S31508002E6800F08EFD002807D0102000F094FD5FF0D2 +S31508002E7805094846C0B214E04FF4007000F080FD1A +S31508002E88002808D04FF4007000F085FD5FF00709A8 +S31508002E984846C0B205E0DFF87002002101604846DE +S31508002EA8C0B2BDE8F28F00006C230020342400204D +S31508002EB85C2300203024002038B504000025002CA7 +S31508002EC803D126252800C0B22BE0DFF8A80400683D +S31508002ED80004DFF810130860DFF808030D214160C5 +S31508002EE8DFF8000340218160DFF8F8020021C1609D +S31508002EF8DFF8F0024FF480610161DFF8E80200F0BC +S31508002F0800FD0D2000F05CF80500EDB2002D02D09A +S31508002F182800C0B205E0002000F00BFD206028005C +S31508002F28C0B232BD802400203C240020382400206A +S31508002F382C2C014030230020342C014038B50024BD +S31508002F485FF4803500E06D1E002D04D0802000F067 +S31508002F5817FD0028F7D0002D03D103242000C0B29E +S31508002F6805E040F2FF5000F016FD2000C0B232BD61 +S31508002F7810B500245FF48031DFF87C08006803E0A8 +S31508002F88491EDFF87408006810F0450F01D10029BA +S31508002F98F6D1002901D0410706D50324042000F0FC +S31508002FA8FAFC2000C0B20AE0400606D500244020F4 +S31508002FB800F0F1FC2000C0B201E02000C0B210BD4C +S31508002FC838B505000024DFF83008006802E0DFF8A5 +S31508002FD82808006810F0450FF9D0410706D50324DC +S31508002FE8042000F0D8FC2000C0B26DE0C00706D562 +S31508002FF80124012000F0CFFC2000C0B264E000F0F4 +S3150800300894FCEDB2A84203D010242000C0B25BE0BD +S3150800301840F2FF5000F0BFFC002000F08AFCDFF801 +S31508003028DC17084202D12000C0B24DE0002801D5BD +S315080030381C2049E0410001D5092045E0810001D559 +S315080030480A2041E0C10001D50B203DE0010101D568 +S315080030580C2039E0410101D50D2035E0C10101D523 +S315080030680E2031E0010201D50F202DE0410201D5DD +S31508003078102029E0810201D5112025E0C10201D5D9 +S31508003088122021E0010301D513201DE0410301D5D3 +S31508003098142019E0810301D5152015E0C10301D5CF +S315080030A8162011E0010401D517200DE0410401D5C9 +S315080030B8182009E0810401D5192005E0000701D583 +S315080030C81A2001E02000C0B232BD0000100000201E +S315080030D810B50024DFF82007006802E0DFF81807B3 +S315080030E8006810F0450FF9D0400706D503240420D8 +S315080030F800F051FC2000C0B205E040F2FF5000F095 +S315080031084AFC2000C0B210BD1000002010B50024EB +S31508003118DFF8E406006802E0DFF8DC06006810F06D +S31508003128450FF9D0410706D50324042000F033FCDF +S315080031382000C0B20EE0C00706D50124012000F021 +S315080031482AFC2000C0B205E040F2FF5000F023FC3C +S315080031582000C0B210BD70B506000C000025DFF8C7 +S315080031689806006802E0DFF89006006810F0450F38 +S31508003178F9D0410706D50325042000F00CFC2800E1 +S31508003188C0B22EE0C00706D50125012000F003FCD1 +S315080031982800C0B225E000F0C8FBF6B2B04203D05A +S315080031A810252800C0B21CE040F2FF5000F0F3FBDF +S315080031B8002000F0BEFB10F4604F04D1000C2080FC +S315080031C82800C0B20DE0810401D5132009E04104A6 +S315080031D801D5102005E0000401D50F2001E02800DC +S315080031E8C0B270BD4823002030B583B0040000255E +S315080031F800A80021002206C00838002000F099FB24 +S31508003208800103D50E252800C0B2B2E000A95948A6 +S31508003218006880B200F0B0F80500EDB2002D02D0C3 +S315080032282800C0B2A5E0E4B2012C51D101984003A8 +S315080032384AD5504800680004DFF8C4150860DFF866 +S31508003248C00537214160DFF8B80540218160DFF8FD +S31508003258B0050021C160DFF8A8054FF48061016157 +S31508003268DFF89C0500F04DFB3720FFF7A9FE05009F +S31508003278EDB2002D02D02800C0B27AE0DFF880054A +S3150800328802210160DFF8780506214160DFF870053C +S3150800329840218160DFF868050021C160DFF8600514 +S315080032A84FF480610161DFF8580500F02AFB062013 +S315080032B8FFF786FE0500EDB2002D02D02800C0B241 +S315080032C857E02800C0B254E025252800C0B250E0CF +S315080032D80198C0034AD5274800680004DFF8201576 +S315080032E80860DFF81C0537214160DFF8140540211E +S315080032F88160DFF80C050021C160DFF804054FF48A +S3150800330880610161DFF8F80400F0FBFA3720FFF75F +S3150800331857FE0500EDB2002D02D02800C0B228E0FD +S31508003328DFF8DC0400210160DFF8D40406214160D7 +S31508003338DFF8CC0440218160DFF8C4040021C160AD +S31508003348DFF8BC044FF480610161DFF8B40400F0CB +S31508003358D8FA0620FFF734FE0500EDB2002D02D094 +S315080033682800C0B205E02800C0B202E025252800DA +S31508003378C0B23EBD342400207CB50C0000250026CA +S3150800338800A80021002206C00838DFF874040821BE +S315080033980160DFF86C0410214160DFF864044021FD +S315080033A88160DFF85C040021C160DFF854044FF43B +S315080033B880610161DFF8480400F0A3FA1020FFF7DE +S315080033C8FFFD0600F6B2002E02D03000C0B2D0E0EB +S315080033D8DFF8300400680004DFF824140860DFF812 +S315080033E8200437214160DFF8180440218160DFF89E +S315080033F810040021C160DFF808044FF480610161F8 +S31508003408DFF8FC0300F07DFA3720FFF7D9FD060040 +S31508003418F6B2002E02D03000C0B2AAE0DFF8E80300 +S315080034285FF0FF310160DFF8E00308214160DFF84B +S31508003438D80330218160DFF8D0030221C160DFF8A4 +S31508003448C80300210161DFF8C00301214161DFF8E3 +S31508003458B80300F078FADFF8A80300210160DFF85E +S31508003468A00333214160DFF8980340218160DFF823 +S3150800347890030021C160DFF888034FF48061016179 +S31508003488DFF87C0300F03DFA3320FFF799FD0600C4 +S31508003498F6B2002E0ED03000C0B26AE05FF4001013 +S315080034A800F06EFA002805D000F064FA00A941F881 +S315080034B825006D1CDFF84003006840F22A610842BF +S315080034C8ECD0082000F05CFA002806D0082000F0A6 +S315080034D862FA04263000C0B24BE0022000F050FA27 +S315080034E8002806D0022000F056FA02263000C0B29C +S315080034F83FE0202000F044FA002806D0202000F0FB +S315080035084AFA06263000C0B233E04FF4007000F0DD +S3150800351837FA002807D04FF4007000F03CFA07265F +S315080035283000C0B225E040F2FF5000F034FA0098A7 +S31508003538009911F47F41090251EA00600099090AC5 +S3150800354811F47F410843009950EA116060600198B8 +S31508003558019911F47F41090251EA00600199090AA3 +S3150800356811F47F410843019950EA11602060300040 +S31508003578C0B276BD00B583B001210C2000F034FB3B +S315080035880C220821DFF8840200F082FA0C220921AD +S31508003598DFF8780200F07CFA0C220A21DFF86C02C0 +S315080035A800F076FA0C220B21DFF8600200F070FAB8 +S315080035B80C220C21DFF8540200F06AFA0C220221C8 +S315080035C8DFF84C0200F064FA4FF4706000900120AE +S315080035D88DF8050002208DF8040000208DF80600F5 +S315080035E801208DF8070000A9884800F0F3F904209F +S315080035F8009000A9864800F0EDF94FF48050009035 +S3150800360800208DF8070000A9804800F0E3F94FF478 +S315080036180060009002208DF8040000208DF807004D +S3150800362800A97A4800F0D6F901214FF4006000F0A5 +S31508003638FBFA01215FF4800000F0D6FA07BD00B551 +S3150800364897B0FEF741FDC0B200280AD17148007844 +S3150800365810F0FE006F49087000A8FEF7BBFF0020AF +S3150800366803E06C4801210170032017B000BD80B53E +S31508003678684901220A70C0B2002809D1FEF77FFD01 +S31508003688002805D16348007810F0FE0061490870E3 +S315080036986048007802BD70B5ADF5027D0C001500CE +S315080036A81E000021C0B2002801D001202BE03000FE +S315080036B8461EC0B2002825D04FF40070009055FA6F +S315080036C886F04FF4007101FB00F2002301A8FFF70A +S315080036D8D0F90100C9B2002901D0012013E0FEF78C +S315080036E84EFD0128FBD04FF4007201A9F6B24FF43B +S315080036F8007000FB064000F0DBFAF6B2002ED6D1C1 +S31508003708002000E001200DF5027D70BD70B5ADF50D +S31508003718027D0C0015001E000021C0B2002801D049 +S3150800372801202EE03000461EC0B2002828D04FF4EB +S315080037380072F6B24FF4007000FB064101A800F0CB +S31508003748B7FA4FF40070009055FA86F04FF40071F6 +S3150800375801FB00F2002301A8FFF798FA0100C9B295 +S31508003768002904D0C9B2052901D0012009E0FEF7CD +S3150800377806FD0128FBD0F6B2002ED3D1002000E0C2 +S3150800378801200DF5027D70BD10B596B00300140032 +S315080037980120204A1278D20701D5032027E0C9B2AA +S315080037A8002905D0022914D004D3032916D01CE011 +S315080037B800201BE0DBB2002B09D100A8FEF70AFFA0 +S315080037C8DDE91201400A40EAC150490A2060002092 +S315080037D80CE04FF400702080002007E0DBB2002BD5 +S315080037E801D120202060002000E00420C0B216B0D5 +S315080037F810BD094870470000342C014008E0FFFD59 +S3150800380848230020342400203023002000080240E2 +S31508003818000C0240150000200000AA4280B2802849 +S3150800382801DA01001EE000290CD080B2FF2801DD6C +S31508003838002106E080B2194911EB4000B0F5807006 +S3150800384801880FE0002100E0491C89B2802906DAC0 +S3150800385889B2124A32F8112080B29042F4D111F195 +S315080038688000C1B2080080B27047002100E0491CF8 +S315080038780B4A32F81120002A05D0094A32F81120D5 +S3150800388880B29042F3D1064A32F81120002A03D0B2 +S31508003898044830F81100FFE780B270476C810008C9 +S315080038A8AC7D00088C7F000880B501214FF40060C4 +S315080038B800F0DAF900214FF4006000F0D5F901BDEF +S315080038C80021364A12681100354A1140027D83687C +S315080038D81A4343681A43C3681A4303681A430069B4 +S315080038E8104301432D48016070472E49C0B208604D +S315080038F870472D49086070472B48006810F0030088 +S3150800390870470021294A03681360294A126811007A +S31508003918C90AC902426883681A43C3681A43006910 +S315080039281043014322480160704722480068C0B224 +S31508003938704781B0002100911F4908180090009827 +S31508003948006801B0704700211C4A03681360426882 +S315080039581B4B1A601B4A1268110031F0F70182687E +S31508003968C3681A4303691A43406910430143154853 +S315080039780160704714480068704713490860704723 +S315080039880021124A1268024201D0012100E00021F2 +S315080039980800C0B270470E4908607047042C0140F9 +S315080039A80081FFFFA0802542002C0140082C014019 +S315080039B80C2C0140102C0140142C0140242C0140E9 +S315080039C8282C01402C2C0140802C0140342C014025 +S315080039D8382C014030B400220023002400252A0090 +S315080039E847E0012393400C681C409C4240D1036879 +S315080039F803241500EDB26D00AC40A34303600368C9 +S31508003A080C791500EDB26D00AC40234303600B79C1 +S31508003A18012B02D00B79022B1AD1836803241500CF +S31508003A28EDB26D00AC40A343836083684C791500FA +S31508003A38EDB26D00AC40234383604368012494408B +S31508003A48A343436043688C799440A4B223434360F4 +S31508003A58C36803241500EDB26D00AC40A343C360E8 +S31508003A68C368CC791500EDB26D00AC402343C3603A +S31508003A78521C102AB5D330BC70470022006989B297 +S31508003A88084201D0012200E000221000C0B27047A7 +S31508003A98F0B400230024D2B211F00705EDB2AD0048 +S31508003AA8AA40130089B2CA1010EB820289B2CD1057 +S31508003AB810EB85052D6A0F2611F00707FFB2BF0020 +S31508003AC8BE40B543156289B2CA1010EB8202126A63 +S31508003AD81A43140089B2C91010EB81000462F0BCBD +S31508003AE8704750F8041B61B150F8042BD30744BF3C +S31508003AF8A9F101039A18002342F8043B091FFAD1D1 +S31508003B08EFE77047F0B400210022002302240025BD +S31508003B180226DFF874713F6817F00C073900002988 +S31508003B2804D0042906D0082908D035E0DFF8601142 +S31508003B38016034E0DFF85C11016030E0DFF84C1111 +S31508003B480968C1F38055DFF84411096811F03F0682 +S31508003B58002D0BD0DFF83C11B1FBF6F1DFF82C216C +S31508003B681268C2F3881202FB01F30AE0DFF8201193 +S31508003B78B1FBF6F1DFF814211268C2F3881202FBCA +S31508003B8801F3DFF808110968C1F30141491C4C0023 +S31508003B98B3FBF4F1016002E0DFF8F4100160DFF826 +S31508003BA8E810096811F0F0010909DFF8EC208A5CC9 +S31508003BB80168D1404160DFF8D010096811F4E05176 +S31508003BC8890ADFF8D4208A5C4168D14081602E4989 +S31508003BD8096811F46041490BDFF8BC208A5C416822 +S31508003BE8D140C160F0BC7047C9B2002905D02B493D +S31508003BF8096808432949086005E02849096831EA37 +S31508003C080000264908607047C9B2002905D024492A +S31508003C18096808432249086005E02149096831EA24 +S31508003C2800001F4908607047C9B2002905D01D4918 +S31508003C38096808431B49086005E01A49096831EA12 +S31508003C480000184908607047C9B2002905D0164906 +S31508003C58096808431449086005E01349096831EA00 +S31508003C680000114908607047C9B2002905D00F49F4 +S31508003C78096808430D49086005E00C49096831EAEE +S31508003C8800000A49086070470838024004380240AC +S31508003C980024F400001BB70000000020303802405A +S31508003CA8403802404438024010380240243802405E +S31508003CB810B50400200000F003F8200010BDFF002E +S31508003CC862B38B0708D0521E11F8013B00F8013B76 +S31508003CD800F024808B07F6D1830740F0208000BFC8 +S31508003CE8103A07D330B4B1E83810103AA0E83810BB +S31508003CF8F9D230BC530724BFB1E80810A0E8081069 +S31508003D0844BF51F8043B40F8043BD20724BF31F8B6 +S31508003D18022B20F8022B44BF0B7803707047083A29 +S31508003D2807D3B1E80810083A40F8043B40F804CB32 +S31508003D38F7D25307E4E70000C2788A18DFF8183282 +S31508003D48DA70827889B20B0A9A18DFF80C329A70F8 +S31508003D58DFF8042243785370DFF8FC2100781070E6 +S31508003D68DFF8F401807889B20A0AD2B2904212D2F0 +S31508003D78DFF8E4014078401CDFF8DC215070DFF8F2 +S31508003D88D8014078002806D1DFF8CC010078401C15 +S31508003D98DFF8C4211070DFF8C001C07889B2C9B24B +S31508003DA8884217DADFF8B0018078401C6A498870BB +S31508003DB86948807800280DD167484078401C6649CC +S31508003DC8487065484078002804D163480078401C44 +S31508003DD861490870704710B492B25218531E0AE027 +S31508003DE80A7812024C781219101880B292B29042C8 +S31508003DF800D2401C891C9942F2D3994207D1097806 +S31508003E080A02101880B292B2904200D2401C80B2C0 +S31508003E1810BC704780B5142250490020FFF7DBFF15 +S31508003E2880B2002802D14FF6FF7002E080B201F096 +S31508003E385FF880B202BD10B54949097C0902484AAB +S31508003E48527C8918B1F1140454FA80F008224549BD +S31508003E5880B2FFF7C0FF220092B2434980B2FFF74B +S31508003E68BAFF80B2002802D14FF6FF7002E080B28E +S31508003E7801F03EF880B210BD80B50620FFF7DBFFDB +S31508003E8802BD3A48002101700AE0384800783849E6 +S31508003E98002221F8102035480078401C334908705C +S31508003EA8324800780028F0D03048002101700CE02C +S31508003EB82E48007868212F4A01FB00200021417608 +S31508003EC82A480078401C294908702848007800289C +S31508003ED8EED029484FF480610180704723490022B3 +S31508003EE80A7004E021490978491C204A11701F49BB +S31508003EF8097800290CD11D4909781D4A32F811108C +S31508003F080029EFD119490978194A22F81100FFE75B +S31508003F18704780B5010089B2DFF8DC0D0068083003 +S31508003F28FFF70AFFDFF8D00D00680B490978017218 +S31508003F38DFF8C40D0068084949784172DFF8B80DFA +S31508003F480068054989788172DFF8AC0D006802496E +S31508003F58C978C17201BD0000682400202600002027 +S31508003F6818000020320000203A000020842400208F +S31508003F7876240020E82000207A24002010B5DFF8EF +S31508003F88781D0C68DFF8C41DDFF8C42D1160DFF84A +S31508003F98C42D1160C0B2032818D1607E10F00F0036 +S31508003FA803280AD1208A002807D1DFF8AC0D082192 +S31508003FB8017001F03CF800F064BEDFF8A00D00219E +S31508003FC80180DFF8940D0021017010BDC0B20228E7 +S31508003FD840F0CB80DFF8880DC078401CDFF8801DDC +S31508003FE8C870C0B200281AD1DFF8740D8078401C52 +S31508003FF8DFF86C1D8870C0B2002810D1DFF8600D94 +S315080040084078401CDFF8581D4870C0B2002806D111 +S31508004018DFF84C0D0078401CDFF8441D0870DFF8FF +S315080040283C0D00210180DFF83C0D00210180607EEF +S31508004038072802D0607E052808D1A07E401CA076F5 +S31508004048A07E782801D100206076B6E7607E002831 +S31508004058FBD0208A00287AD0A07E411EA176C0B25D +S315080040680028F2D1E07E082808D0607E022802D00F +S31508004078607E012810D1E07E05280DD100206076E3 +S31508004088DFF8D40C8021017000F0D1FFDFF8A40D09 +S31508004098142180F82F108DE1E07E052801DB042025 +S315080040A800E0E07E032111FA00F0A076E07E401CCD +S315080040B8E076607E10F00F00C0B201280AD0022808 +S315080040C835D0032839D004283FD006283DD00828FB +S315080040D83BD0BAE7DFF85C0D102180F82F10DFF81F +S315080040E8540D90F82F0050F00200DFF8481D81F8AB +S315080040F82F00DFF8400D022180F83610DFF8340D5E +S31508004108042180F83710DFF82C0D062180F83810BE +S31508004118DFF8200D0A2180F83910DFF8400C2C2129 +S315080041280180DFF8100D602180F82E104BE1DFF8CA +S31508004138040D002180F82F10D1E7DFF81C0C0421A4 +S31508004148017000F074FF00F0DEBD00F041BD607E2E +S3150800415810F00F0003287FF478AFDFF8FC0B08216E +S31508004168017000F064FF00F08CBDDFF8C80C807B96 +S3150800417845287FF422AFDFF8E40B0088DFF8B41C83 +S31508004188097C0902DFF8AC2C527C8918884216DBB0 +S31508004198DFF8A00C007C0002DFF8981C497C401860 +S315080041A8DFF8B81B0880DFF88C0C007D3F21084231 +S315080041B804D1DFF8800C407D002801D0FDE6FCE636 +S315080041C8DFF8240D0088DFF8241D0988884207D1FE +S315080041D8DFF8140D4088DFF8141D4988884210D086 +S315080041E8DFF8500CC08BDFF8001D0988884207D114 +S315080041F8DFF8400C008CDFF8F01C4988884200D0AC +S31508004208DBE6FFF707FE4FF6FF7188427FF4D5AE67 +S31508004218DFF8200CC07D062808D1FFF72DFE4FF6DB +S31508004228FF71884244D1DFF8F84C43E0DFF8040C04 +S31508004238C07D01287FF4C1AEDFF8F80B90F822009C +S3150800424808287FF4BAAEDFF8EC0B002180F82210B4 +S31508004258DFF8E00B808C4FF6F771884207DBDFF84A +S31508004268D40B808C0930DFF8CC1B888406E0DFF88D +S31508004278C40B808C0830DFF8BC1B8884DFF8B40BC5 +S31508004288DFF8B01B498BC183DFF8A80BDFF8A41B3E +S31508004298898B0184DFF89C0BDFF84C1C098841835D +S315080042A8DFF8900BDFF8401C4988818300F016BEBA +S315080042B883E66834DFF8680CA042C0F0DB80607ECD +S315080042C80028F6D0DFF86C0B808CA1888842F0D1DC +S315080042D8DFF8600B408CE1888842EAD1DFF8540B96 +S315080042E8408B21888842E4D1DFF8480B808B6188A7 +S315080042F88842DED1DFF8000A0460DFF85C0A00218C +S315080043080170DFF8300B90F82F00400700F1BC82E7 +S31508004318DFF8200B90F82E00C0B200098000DFF8FD +S31508004328041C0870DFF8340A0088DFF8F81B0978D7 +S31508004338401A1438DFF8241A0880607E10F00F0037 +S31508004348022808D1DFF8EC0A90F82F0010F03F0091 +S31508004358122800F0A382DFF8040A0088002807D18B +S31508004368DFF8D00A90F82F000321084200F0968259 +S31508004378DFF8C00A90F82600217A884215D1DFF8B6 +S31508004388B40A90F82700617A88420ED1DFF8A40AA1 +S3150800439890F82800A17A884207D1DFF8980A90F899 +S315080043A82900E17A884200F07982DFF8880A102124 +S315080043B880F82F10DFF8A40928210180DFF8740A8D +S315080043C8502180F82E10DFF86C0A217A80F82A1016 +S315080043D8DFF8600A617A80F82B10DFF8580AA17AA4 +S315080043E880F82C10DFF84C0AE17A80F82D10DFF8EF +S315080043F8440A217B80F82610DFF8380A617B80F8A2 +S315080044082710DFF8300AA17B80F82810DFF8240A7D +S31508004418E17B80F82910DFF81C0A0621C175DFF848 +S31508004428140AA1884184DFF80C0AE1888184DFF838 +S31508004438040ADFF8B41A09884183DFF8F809DFF8AF +S31508004448A81A49888183DFF8EC092188C183DFF82F +S31508004458E40961880184607EC00640F1F984002079 +S31508004468DFF8D01981F83100DFF8C81981F830006B +S3150800447800F0F6BCDFF8BC0990F82F0010F03F00F2 +S31508004488022806D0DFF8AC0990F82F00400729D58E +S3150800449893E5DFF8A009808CDFF88C1A0880DFF826 +S315080044A8840A0021017006E0DFF8780A0078401CC3 +S315080044B8DFF8701A0870DFF86C0A00780028E1D16E +S315080044C8DFF8640A0088DFF85C1A0978DFF85C2ADE +S315080044D832F811108842E7D10024DFF8480A00218B +S315080044E80170E6E0DFF84C09142180F82F10DFF890 +S315080044F86C0828210180DFF83C09502180F82E1025 +S31508004508DFF8300990F82900DFF8181A0870DFF87C +S315080045182409DFF8201991F82D1080F82910DFF8FA +S315080045281409DFF8001A097880F82D10DFF804094D +S3150800453890F82800DFF8EC190870DFF8F808DFF8B3 +S31508004548F41891F82C1080F82810DFF8E808DFF836 +S31508004558D419097880F82C10DFF8D80890F82700BD +S31508004568DFF8C0190870DFF8CC08DFF8C81891F822 +S315080045782B1080F82710DFF8BC08DFF8A819097887 +S3150800458880F82B10DFF8AC0890F82600DFF89419A5 +S315080045980870DFF8A008DFF89C1891F82A1080F848 +S315080045A82610DFF89008DFF87C19097880F82A10B1 +S315080045B8DFF8800890F82D00401CDFF8781881F895 +S315080045C82D00C0B2002820D1DFF8680890F82C0022 +S315080045D8401CDFF8601881F82C00C0B2002814D1F6 +S315080045E8DFF8500890F82B00401CDFF8481881F8C7 +S315080045F82B00C0B2002808D1DFF8380890F82A003E +S31508004608401CDFF8301881F82A00DFF82808408CA3 +S31508004618DFF814190880DFF81C08DFF81818898CE1 +S315080046284184DFF81008DFF8001909888184DFF863 +S315080046380408DFF80018498BC183DFF8F807DFF8A4 +S31508004648F417898B0184DFF8EC07DFF89C180988CA +S315080046584183DFF8E007DFF890184988818300F07E +S31508004668FFBBDFF8C00800786821DFF8B42801FB2B +S315080046780020407E072815D1002C0BD0A07EDFF835 +S31508004688A41809786822DFF8983802FB0131897E70 +S31508004698884207D2DFF88C0800786821DFF8802876 +S315080046A801FB0024DFF87C080078401CDFF8741842 +S315080046B80870DFF870080078002812D1DFF8640857 +S315080046C800786821DFF8582801FB0020407E00287A +S315080046D8C7D1DFF8500800786821DFF8442801FBBD +S315080046E80024002C3FF469ACDFF80C0604600320AC +S315080046F8A07620760020A0750420E0750020E076D4 +S31508004708DFF83007808CA080DFF82807408CE08027 +S31508004718DFF82007408B2080DFF81807808B608039 +S3150800472801206076DFF8380600782073DFF830064F +S3150800473840786073DFF828068078A073DFF82006CB +S31508004748C078E07301202082DFF8E80690F829008F +S31508004758E072DFF8E00690F82800A072DFF8D406C1 +S3150800476890F827006072DFF8CC0690F826002072C9 +S315080047780120FFF7CEFBDFF8BC0690F82E0010F0F4 +S31508004788F0005128FFF6A6ACDFF89807002101705B +S3150800479806E0DFF890070078401CDFF888170870ED +S315080047A8DFF880070078DFF88C1691F82E10C9B262 +S315080047B80909C9B2491FB0EB810FBFF68BACDFF800 +S315080047C864070078DFF86C16401890F83600DFF8AA +S315080047D860170870DFF85807007800283FF47AACA5 +S315080047E8DFF84C0700780128D3D0DFF844070078AB +S315080047F802282ED1DFF82C070078DFF8381640187B +S3150800480890F83700042824D1DFF818070078DFF86D +S315080048182416401890F83800DFF808170978DFF8E2 +S315080048281426891891F8391051EA0020DFF8F81685 +S315080048380880DFF8F406008840F20B61884202DB3C +S3150800484840F20A6002E0DFF8E00600886082A0828B +S3150800485840E4DFF8D0060078DFF8D815401890F855 +S31508004868370000283FF436ACDFF8B8060078DFF8DA +S31508004878B4160978DFF8BC25891891F8371008188E +S31508004888DFF8A01608708BE700206076DFF8C80402 +S315080048982021017000F0CBFBFFF78FBBDFF89405EA +S315080048A890F82F00C00664D5208A002861D0218A8E +S315080048B814F10C00FFF740FADFF8780590F82A009B +S315080048C8DFF870160978884253D1DFF8680590F83A +S315080048D82B00DFF86016497888424AD1DFF8540574 +S315080048E890F82C00DFF84C168978884241D1DFF811 +S315080048F8440590F82D00DFF83C16C978884238D167 +S31508004908DFF8300600782073DFF8280640786073E9 +S31508004918DFF820068078A073DFF81806C078E073F9 +S31508004928E07E00281DD194F9180094F91A10401A47 +S31508004938A17DC9B2B0EBD100A17D4118A17540B2DD +S31508004948002801D540B24042E17DC9B2B0EB9100DA +S31508004958E17D4018E075A07DC0B2E17D11EBD0007D +S315080049682076DFF8F40301210170207EA076002066 +S315080049782082607E10F00F00C0B2012813D0C0F064 +S315080049886582032800F0FA8035D3052800F02F82BF +S31508004998C0F0F881072800F04F82C0F04F82082837 +S315080049A800F0E48152E2DFF8B0030078C00720D5AA +S315080049B803206076DFF8A0034021017000202082DA +S315080049C8DFF89803008800280CD0DFF88C030078F5 +S315080049D850F00200DFF880130870DFF880030088BB +S315080049E8FFF797FADFF87C030021018000F01FFB28 +S315080049F847E1FFF7E2BADFF860030078C00740F13D +S31508004A08B380DFF8300490F82F0010F03F00122822 +S31508004A1840F0AA80DFF81C0490F82E0010F0F00089 +S31508004A28512829DBDFF8FC040021017006E0DFF8CD +S31508004A38F4040078401CDFF8EC140870DFF8E40486 +S31508004A480078DFF8F01391F82E10C9B20909C9B22F +S31508004A58491FB0EB810F0FDADFF8C8040078DFF8D2 +S31508004A68D413401890F83600DFF8C4140870DFF835 +S31508004A78C0040078002826D103206076DFF8B4033E +S31508004A8890F826002072DFF8AC0390F827006072C9 +S31508004A98DFF8A00390F82800A072DFF8980390F8CA +S31508004AA82900E0720120FFF734FAAB484221017069 +S31508004AB800202082A94800210180AA4800210180F7 +S31508004AC800F0B5FADDE0DFF8680400780128AED012 +S31508004AD8DFF85C04007802282ED1DFF8480400784D +S31508004AE8DFF85013401890F83700042824D1DFF867 +S31508004AF834040078DFF83C13401890F83800DFF8DB +S31508004B0824140978DFF82C23891891F8391051EA02 +S31508004B180020DFF814140880DFF80C04008840F237 +S31508004B280B61884202DB40F20A6002E0DFF8F8030C +S31508004B3800886082A0829FE7DFF8E8030078BD490D +S31508004B48401890F83700002896D0DFF8D803007880 +S31508004B58DFF8D0130978B74A891891F83710081872 +S31508004B68DFF8C013087069E77B482021017000F058 +S31508004B785EFA614800680021417683E4AD4890F8FA +S31508004B882F00C0072AD5607EC00627D4208A0028A9 +S31508004B987FF413AA71480088401C80B2FFF7B9F958 +S31508004BA86D48007850F010006B4908706B4800880B +S31508004BB8002805D06848007850F002006649087051 +S31508004BC800F035FA01202082082060760020E07679 +S31508004BD89848112180F82F10FFF7ECBB954890F8F4 +S31508004BE82F00800619D5934890F83400914991F812 +S31508004BF8351051EA00205649096840185449086092 +S31508004C08564800888B4991F834108A4A92F8352014 +S31508004C1852EA0121401A514908805048008800285C +S31508004C280CD0607EC00609D44B48007850F00200C4 +S31508004C384949087049480088FFF76BF97D4890F894 +S31508004C48300000027B4991F831104018B6490880AF +S31508004C58A08AB5490988884203D3B348008800283A +S31508004C6802D1A08AB0490880AF48008860823A48CD +S31508004C7800780321084277D03A480021018000F0DD +S31508004C88D6F93548007880060AD5364800210180C5 +S31508004C98002060766748142180F82F10FFF78ABB32 +S31508004CA82D480078C0060ED52E480021018001201F +S31508004CB82082042060760020E0765E48112180F87C +S31508004CC82F10FFF777BB27480088002819D02248F5 +S31508004CD80078C00701D500202082208A00280DD137 +S31508004CE8608A20490988884202D2608A1D49088054 +S31508004CF81C480088208204E060240020208A19497C +S31508004D0808800020E07612481249096801601548AB +S31508004D18008800280CD0208A002809D0208A283044 +S31508004D280E4908804348182180F82F10FFF746BB1C +S31508004D3809480078800717D50848282101803D4882 +S31508004D48102180F82F10FFF739BB00BF4E0000204E +S31508004D58582400205C240020832400207224002084 +S31508004D686424002074240020FFF727B972480078C5 +S31508004D78C00706D5002060766F481021017000F03C +S31508004D8856F963E06D480088002803D06B48008808 +S31508004D98FFF7BFF8274890F82F00C00716D56648CA +S31508004DA80078C00706D5072060760020A076002080 +S31508004DB8208201E0062060760120FFF7AAF85E48FF +S31508004DC81021017000F033F9FFF7EFBA5A48007856 +S31508004DD8C00705D50520607600202082FFF7EDB8C4 +S31508004DE85648008800287FF4E0AAFFF7E6B8534833 +S31508004DF80088002803D051480088FFF78AF80D482C +S31508004E0890F82F00C0070DD5072060760020A076F9 +S31508004E180120FFF77EF848481021017000F007F9CD +S31508004E28FFF7C3BA4548008800287FF4BEAAFFF7EB +S31508004E38C4B800BF18000020FFF7B7BA3E48007884 +S31508004E48C00703D5072060760020A076FFF7B5B817 +S31508004E583B48062180F8301039480A2180F8311075 +S31508004E6837484021817536483449098889B2090A7C +S31508004E78017433483149098841740020304981F85A +S31508004E8835002F4981F834002D4800214186FEF760 +S31508004E98F3FFC0432A49488629484521817328488B +S31508004EA80021C173002026494875254908752548F3 +S31508004EB80088401C2349088021482249098889B264 +S31508004EC8090A81741E481F490988C1741C480021AB +S31508004ED80183FEF79FFFC043194908831648002136 +S31508004EE80170FFF772B800004C24002044870008B8 +S31508004EF880B2010A51EA002080B2704780B50129BC +S31508004F080CDB114A118011490968884206D00E49F6 +S31508004F180A8801000D480068FEF7CAFE01BD0000B0 +S31508004F28E8200020842400207C2400207624002001 +S31508004F388524002068240020832400207224002069 +S31508004F481800002078240020742400205C240020FF +S31508004F5880B500F01BF900F019FB10F5FA708049C6 +S31508004F68086000F013FB00F51C5010307D490860F6 +S31508004F78FEF787FF4FF6A960ADF8000043F61370F1 +S31508004F88ADF802007848BDF8001001807648BDF8EB +S31508004F98021041804FF6FF70ADF800000020ADF80A +S31508004FA802007248BDF8001001807048BDF802106A +S31508004FB841804FF6A960ADF8000040F21310ADF82D +S31508004FC802006B48BDF8001001806948BDF8021058 +S31508004FD841804EF60300FEF781FF00F0C2F901BDD5 +S31508004FE838B5644A126812F11C0422686260002205 +S31508004FF805E092B2131992B2155C1D72521C0B0089 +S31508005008DBB292B29BB29A42F3D3C9B2081DA4F88E +S315080050184800B4F84810201DFFF770FF2068401CA8 +S31508005028206031BD80B500F032F8002002BD10B509 +S315080050385048006810F11C044F480078400605D50A +S31508005048012020600020A4F848001FE04A4800789C +S31508005058C00702D50020A4F848004748007840074A +S3150800506808D5B4F84800002804D0B4F84810201D1C +S31508005078FFF744FF40480078800707D50020A4F8C2 +S3150800508848003E480068001D00F0BAFA10BD10B581 +S3150800509800F094F900282DD0394908804FF40060AB +S315080050A8FFF726FF3749898980B281420ED1012048 +S315080050B8FEF764FF3248008800281BD000F0F1FD8F +S315080050C800F098F92E480021018013E040F6060002 +S315080050D8FFF70EFF2B49898980B281420AD100F071 +S315080050E87AFD27480088002804D000F083F9244868 +S315080050F80021018000F04AFA1949096888421ED336 +S315080051081748006810F5FA7015490860002414E075 +S3150800511868201D4900FB0410164908600220FEF79E +S315080051282DFF17480088002806D000F0BAFD00F0C1 +S3150800513861F9134800210180641C002CE8D000F0AE +S3150800514825FA08490968884208D30648006800F518 +S315080051581C5010300349086000F072FC10BD0000AE +S3150800516840240020442400204C24002054240020F5 +S31508005178502400206024002083240020582400207E +S315080051887224002018000020E820002010B5B2B0CC +S3150800519801215FF0F050FEF727FD01214720FEF7B1 +S315080051A823FD01214FF48040FEF73EFD012000F063 +S315080051B851FE8E20009000208DF8060002208DF8FA +S315080051C8040000208DF8070002208DF8050000A9C4 +S315080051D8DFF83803FEF7FEFB0B220121CB48FEF762 +S315080051E857FC0B220221C948FEF752FC0B22032161 +S315080051F8C648FEF74DFC0B220721C448FEF748FCB3 +S315080052084FF40060009000208DF8060002208DF803 +S31508005218040000208DF8070002208DF8050000A973 +S31508005228BB48FEF7D7FB0B220B21B948FEF730FC23 +S315080052383220009000208DF8060002208DF8040020 +S3150800524800208DF8070002208DF8050000A9B1484E +S31508005258FEF7C0FB0B220121AE48FEF719FC0B220C +S315080052680421AC48FEF714FC0B220521A948FEF7D1 +S315080052780FFC4FF4C040009000208DF8060002206D +S315080052888DF8040000208DF8070002208DF8050027 +S3150800529800A99F48FEF79EFB0B220D219C48FEF7A6 +S315080052A8F7FB0B220E219A48FEF7F2FB00F0D8FD11 +S315080052B801F052F801F059F80128FBD003A800F0CC +S315080052C831FF0020039000200A904FF400700D90DB +S315080052D800200E905FF000401190202014900020C6 +S315080052E8169000201790002018904FF400600B9035 +S315080052F84FF480400890002400E0641C202C15D246 +S315080053080221200080B200F092FFADF80A000321BE +S31508005318200080B200F08BFFADF8080002987E499D +S31508005328884203D002987D498842E6D1212C04D3C5 +S3150800533840F247117A4801F077F8210089B203A8A4 +S3150800534800F09AFD002804D14FF4A671744801F0BC +S315080053586BF800F0C4F800F098F800F058FF32B07F +S3150800536810BD82B008208DF8000000208DF80100D5 +S3150800537827208DF8020069208DF803005B208DF838 +S31508005388040045208DF8050066489DF80010017050 +S3150800539864489DF80110417062489DF802108170B2 +S315080053A860489DF80310C1705E489DF804100171A5 +S315080053B85C489DF80510417102B0704710B55A4807 +S315080053C80068C00F002813D157480068C0F30D4479 +S315080053D8220056495648FEF76BFC5348006850F0B9 +S315080053E8004051490860534801210160200000E047 +S315080053F8002010BD80B550480068C00F0028FAD1B3 +S315080054084E4802884A494E48FEF752FC4A484C49D3 +S3150800541881604948002101604748006850F48010B7 +S31508005428454908604448006850F0005042490860F9 +S315080054384148006850F080503F4908603E48006877 +S3150800544830F000603C4908603B48006830F08060EE +S315080054583949086038480021416038480088364983 +S31508005468496860F30B01344841603348406830F4B2 +S315080054788050314948603048006850F000402E494D +S31508005488086030480121016001BD27482749816025 +S3150800549825480021016024482349C1602248002183 +S315080054A841602148406830F400401F4948601E485A +S315080054B8406850F480401C4948604FF4C8601A494F +S315080054C8496860F30C01184841601748006850F0AD +S315080054D80040154908601C4813490160704716487A +S315080054E81749816014481449C1601348006850F484 +S315080054F88010114908601048002101600E480021F3 +S31508005508416012480C4901607047000000000240DB +S31508005518001802400008024019162200F1C00700C8 +S315080055285883000818240020802300205C060020E1 +S315080055381800002008900240002400207224002049 +S315080055489C0C0020049002400C90024010900240E7 +S3150800555880B500F00DF81048104901601048002180 +S3150800556801601048052101600F480021016001BD4E +S315080055780C480021016070470A480068C00304D532 +S3150800558809480068401C08490860704780B5FFF755 +S31508005598F3FF0548006802BD14E000E03F900200EA +S315080055A818E000E010E000E048240020DFF8700466 +S315080055B800210170DFF8680400218164DFF86004BF +S315080055C8002180F84310DFF858040021A0F8441099 +S315080055D8DFF84C0400218170DFF84404002141708B +S315080055E87047DFF83C040078002801D1002000E065 +S315080055F801207047DFF82804002180F84310704717 +S3150800560880B50178FF291ED100F091F8DFF810045B +S3150800561890F84300012802D1102000F07EF8DFF840 +S315080056280004B0F9440001280CDBDFF8F403012173 +S3150800563880F84310DFF8E803B0F94410DFF8E4030C +S3150800564800F053F801BDDFF8D813097801294BD1C2 +S315080056580178C92932D0CC293FD0CF293AD0D029C8 +S315080056682FD0D12933D0D2292ED0F32917D0F4290F +S315080056780FD0F5290AD0F6290ED0FA2912D0FC2916 +S3150800568813D0FD2914D0FE2915D029E000F0DAF840 +S31508005698BCE700F0F9F8B9E700F0C9F8B6E700F092 +S315080056A818F9B3E700F0ABF8B0E700F0A2F8ADE7F1 +S315080056B800F087F8AAE700F075F8A7E700F03DF9C3 +S315080056C8A4E700F05CF9A1E700F01AF99EE700F0F4 +S315080056D887F99BE700F098F998E700F0ABF995E7A2 +S315080056E8202000F01AF891E7ACE780B589B200F0F7 +S315080056F8E9FE01BD10B4002302E00478E318401C53 +S315080057080C00611E002CF8D1DBB21360012010BC16 +S315080057187047C348002141707047C149FE22CA70C4 +S31508005728BF490871BE480221A0F84410704710B551 +S31508005738040000F03AFF002803D11020FFF7EDFF18 +S315080057482FE0FFF7E6FFB64801210170B448FF21AC +S31508005758C170B34800210171B148007950F01000B2 +S31508005768AF490871AE4800214171AD48AC4949793D +S31508005778417100F0C8FEAA49887100F0D9FEA84907 +S31508005788C87100F0D5FE80B2000AA5490872A44877 +S3150800579801214172A24801218172A1480821A0F875 +S315080057A8441010BD10B504009D4800210170FFF78C +S315080057B8B0FF9B48FF21C17099480121A0F8441001 +S315080057C810BD9749FF22CA70954900220A71944963 +S315080057D8934A52784A71924900228A71904900225E +S315080057E8CA718F4900220A728D490622A1F84420F7 +S315080057F8704710B504000020FFF78FFF10BD8849D1 +S31508005808FF22CA708649884A8A64854900220A712D +S31508005818834900224A71824900228A7180490722EF +S31508005828C1F807207E490822A1F8442070477C4918 +S31508005838FF22CA707A494068886479480121A0F825 +S315080058484410704710B5040000F05DFE401E6178EC +S31508005858884203DA2220FFF760FF14E0627892B2E2 +S315080058686F48816C714801F077FA6D48FF21C1705D +S315080058786B48806C61784018694988646078401C70 +S315080058886749A1F8440010BD10B5040000F03BFEB6 +S31508005898401E6178884203DA2220FFF73EFF17E0A8 +S315080058A85F4861688164627892B25D48816C5F4836 +S315080058B801F052FA5A48FF21C1705948806C61783C +S315080058C84018574988646078401C5549A1F844002F +S315080058D810BD80B55249FF22CA70554A41685048DA +S315080058E8806CFFF707FF4E4908714D480021417142 +S315080058F84B48002181714A480821A0F8441001BD87 +S3150800590810B504004648FF21C170454800210171B9 +S3150800591843480021417100F0F6FD41498871404825 +S315080059280021C1713E48002101723D48002141729B +S315080059383B480721A0F8441010BD10B5040000F034 +S31508005948E2FD621C80B2411E3548806C01F01DFAE2 +S31508005958002803D13120FFF7E0FE0FE03048FF2189 +S31508005968C17000F0D0FD2E49896C80B2401E4018DF +S315080059782B4988642A480121A0F8441010BD10B59F +S31508005988040000F0C0FD801E6178884203DA2220F0 +S31508005998FFF7C3FE23E02248FF21C17020480121F2 +S315080059A8A0F844106078002807D101F0FAF9002811 +S315080059B802D13120FFF7B1FE11E0A21C6178184820 +S315080059C8806C01F0E2F9002803D13120FFF7A5FE23 +S315080059D805E01348806C617840181149886410BD41 +S315080059E880B541680E48806C01F0D3F9002803D1C8 +S315080059F83120FFF792FE06E00948FF21C1700848E2 +S31508005A080121A0F8441001BD10B5040001F0B5F94C +S31508005A180348FF21C17002480121A0F8441010BDAF +S31508005A28082200200B2200203C8700080C220020B0 +S31508005A380F22002080B53120FFF76FFE01BD000058 +S31508005A4880B5DFF8C8030078401CDFF8C013087073 +S31508005A58DFF8B003002101701EE0DFF8A80300781C +S31508005A680C21DFF8A42301FB002001884288114392 +S31508005A7800290AD0DFF894130978827A891A7829CE +S31508005A8803DB0422002101F096F9DFF87803007891 +S31508005A98401CDFF870130870DFF8680300780828D8 +S31508005AA8DBDB01BD38B50C00DFF8581300220A7095 +S31508005AB806E0DFF850130978491CDFF84823117007 +S31508005AC8DFF84013097808291FDADFF83813097848 +S31508005AD80C22DFF8343302FB013529880029E8D07F +S31508005AE869880029E5D001882A889142E1D1418848 +S31508005AF86A889142DDD106222100281DFEF7D8F8CA +S31508005B08DFF808030078A87264E0DFF8F8120022C4 +S31508005B180A7006E0DFF8EC120978491CDFF8E42277 +S31508005B281170DFF8E012097808290DDADFF8D412BF +S31508005B3809780C22DFF8D03202FB013529880029BA +S31508005B48E8D169880029E5D1AE490978082934D108 +S31508005B58AF4900220A70AF4900220A70A9490022F3 +S31508005B680A701CE0A74909780C22A74B02FB0135E5 +S31508005B78A7490978A54A1278AB7AD21A914209DA5E +S31508005B88A2490978AA7A891AA14A1170A1499D4A8F +S31508005B9812780A709B490978491C9A4A11709949DA +S31508005BA809780829DEDB97499A4A12780A709549CE +S31508005BB809780C22944B02FB0135042201002800BF +S31508005BC8FEF776F806222100281DFEF771F88F4899 +S31508005BD80078A87231BD80B58F4800882A2803D274 +S31508005BE88D48002101805BE08B48002101808B48A5 +S31508005BF8808AB0F5807F03D0B0F5007F40D04FE0AB +S31508005C088648C08C86490988884238D18348008DD9 +S31508005C1883494988884232D182498348FFF742FF37 +S31508005C287E484FF40071818206227E497F48FEF736 +S31508005C383FF806227E497B48FEF73AF806227C4951 +S31508005C487C48FEF735F8062278497448FEF730F896 +S31508005C5872487249898BC18470487049C98B018515 +S31508005C686E486F49098881836C486D494988C1839C +S31508005C786A484FF4C161818167482A2101800FE08B +S31508005C886648C08C66490988884209D16348008DE8 +S31508005C9863494988884203D162496348FFF702FF86 +S31508005CA801BD80B55D49C98B634A128891420BD1FB +S31508005CB85A49098C604A5288914205D106225F4999 +S31508005CC85648FDF7F5FF8EE05449C98B5C4A128899 +S31508005CD81140534A12885A4B1B881A4091420BD1D5 +S31508005CE84E49098C564A528811404D4A5288544B97 +S31508005CF85B881A40914208D05249534A12880A804A +S31508005D085049514A52884A8007E04449C98B4D4A46 +S31508005D1811804C49414A128C4A803A4900220A7035 +S31508005D2804E038490978491C364A11703549097812 +S31508005D3808290FDA334800780C21334A01FB00207A +S31508005D484049098802889142EBD13E4949884288E8 +S31508005D589142E6D12B49097808293FD10622FF2125 +S31508005D682E4801F028F806220021304801F023F8C9 +S31508005D7806222F492F48FDF79BFF06222C4929485A +S31508005D88FDF796FF25482F490988C18423482D49D8 +S31508005D984988018521482249098881831F4820495D +S31508005DA84988C1831D484FF4807181821B484FF486 +S31508005DB88071C18119480821018218480621817411 +S31508005DC816480421C17415484FF4C16181811F48DA +S31508005DD81F49016010482A21018011E00622011D89 +S31508005DE80E48FDF765FF062211491248FDF760FFC0 +S31508005DF80A4808218181084800880E300649088023 +S31508005E0801BD000086240020502100208824002097 +S31508005E1889240020872400207224002018000020E6 +S31508005E284C2400202E0000203400002038000020D2 +S31508005E38182400201E000020488700083487000818 +S31508005E48542400206C2400205024002058240020C4 +S31508005E584E0000200149086070470000DC00274210 +S31508005E6880B501215FF00070FDF7EEFE00215FF0B6 +S31508005E780070FDF7E9FE01BD2DE9F04186B0040082 +S31508005E880D000026002700200190DFF8488500202D +S31508005E980090DFF844050068070037F01C0702A8D9 +S31508005EA8FDF730FE03988046DFF83005B8EB0000AA +S31508005EB8DFF82C15884202D257F0080714E0DFF8F5 +S31508005EC82405B8EB0000DFF82015884202D257F0FF +S31508005ED80C0709E0DFF81405B8EB0000DFF8101521 +S31508005EE8884201D357F00407DFF8EC0407604FF43B +S31508005EF800420021280080B200F0CEF9002801D11E +S31508005F0800200CE15FF08060019002E00198401ED5 +S31508005F18019001980028F9D12068002851D00098E6 +S31508005F28401C00900121280080B200F080F9400743 +S31508005F3804D40098DFF8BC148842F0D30098DFF838 +S31508005F48B414884201D10020E9E0002000904FF4FB +S31508005F5880520021280080B200F09EF9002801D15D +S31508005F680020DCE00098401C00900121280080B23F +S31508005F7800F05DF9800604D40098DFF878148842A2 +S31508005F88F0D30098DFF86C14884201D10020C6E0E7 +S31508005F98002000901021280080B200F048F9060079 +S31508005FA8700703D54FF40060206201E000202062E4 +S31508005FB8B00702D5002060611CE04FF4804060619C +S31508005FC818E0206A6169490851EAD00292B20021AC +S31508005FD8280080B200F060F9002801D100209EE070 +S31508005FE87FF07F40019002E00198401E01900198D9 +S31508005FF80028F9D1DFF800040768DFF8000407402D +S315080060086068A1680843E16808432169084361692B +S315080060180843A1690843E1690843216A0843616A94 +S315080060280843A16A0843E16A0843216B0843616B80 +S3150800603808430743DFF8C0030760A06BE16B084312 +S31508006048216C0843616C0843A16C0843E16C08435A +S31508006058216D0843616D0843DFF8A4130860A06D35 +S31508006068DFF8A0130860E06DDFF89C130860DFF816 +S315080060789C0307684FF641700740206E616E51EA27 +S315080060880040A16E0843E16E0843216F0843616F1B +S3150800609808430743DFF874030760A06FE16F0843F6 +S315080060A8DFF86C130860DFF86C030768DFF8680325 +S315080060B80740D4F88000D4F884100843D4F8881028 +S315080060C80843D4F88C100843D4F890100843D4F839 +S315080060D894100843D4F898100843D4F89C10084339 +S315080060E8D4F8A01008430743DFF828030760D4F854 +S315080060F8A400D4F8A8100843D4F8AC100843D4F878 +S31508006108B0100843D4F8B41050EA8100D4F8B8108F +S31508006118084350F40000DFF804130860012006B0AD +S31508006128BDE8F081002101600021416000218160FD +S315080061380021C160002101610021416100218161BE +S315080061480021C161002101620021416200218162AA +S315080061580021C16200210163002141630021816396 +S315080061680021C16340210164202141640021816422 +S315080061780021C1640021016500214165002181656E +S315080061880021C165002101668021416600218166DA +S315080061980021C16600210167002141670021816746 +S315080061A80021C1675FF08061C0F880105FF0007158 +S315080061B8C0F884105FF08071C0F888105FF4001189 +S315080061C8C0F88C100021C0F890100021C0F894106F +S315080061D80021C0F898100021C0F89C100021C0F8CA +S315080061E8A0105FF00071C0F8A4100021C0F8A8102C +S315080061F85FF40031C0F8AC104FF48071C0F8B010E5 +S315080062080021C0F8B4100021C0F8B810704780B54E +S31508006218012000F077F800F0B3F8012000F087F8BD +S31508006228012000F0B4F8012000F0C2F801BD81B0E1 +S31508006238002200230093DFF8A0311B681A0012F029 +S315080062481C0280B2C00210F47840024389B2880161 +S3150800625810F4F860024332F0020252F00102DFF845 +S31508006268780102600098401C0090DFF86C0102680B +S31508006278D00704D50098DFF87C118842F2D3009835 +S31508006288DFF87011884201D1002003E0DFF8900199 +S31508006298006880B201B0704718B40023002400943F +S315080062A8DFF834412468230013F01C0380B2C002C7 +S315080062B810F47840034389B2880110F4F860034360 +S315080062C853F0020353F00103DFF8540192B2026057 +S315080062D8DFF8040103600098401C0090DFF8F80016 +S315080062E80368D80704D50098DFF808118842F2D35E +S315080062F80098DFF80011884201D1002000E001204B +S3150800630812BC7047C0B2002808D0DFF8EC00006855 +S3150800631850F00800DFF8E010086007E0DFF8D8005A +S31508006328006830F00800DFF8D01008607047C0B27F +S31508006338002808D0DFF8C000006850F00400DFF82D +S31508006348B810086007E0DFF8B000006830F004000D +S31508006358DFF8A41008607047DFF8C800006850F036 +S315080063680100DFF8C010086070470020DFF8B41095 +S315080063780968C90701D5012000E00020C0B27047A6 +S315080063882448006850F48010224908607047C0B253 +S31508006398002806D01F48006850F400501D490860B8 +S315080063A805E01C48006830F400501A490860704730 +S315080063B8C0B2002806D01748006850F002001549F0 +S315080063C8086005E01348006830F0020011490860C3 +S315080063D870470000000E270710800240002D310183 +S315080063E8C0E1E400C00E160240787D0100879303D9 +S315080063F8015A6202FFFF0400008002400F8120FF55 +S3150800640804800240088002400C800240188002403E +S315080064181C80024018900240233FDEF80090024094 +S31508006428148002400090024080B5034A1060034871 +S31508006438016000F0CBFCFCE720240020242400207F +S3150800644880B54A480088ADF80000FFF7AFF800F0B5 +S3150800645806FD47480121017000F026FE4448002140 +S315080064680170FEF775FD424803210170414800781E +S31508006478012802D100A8FFF7C3F801BD80B53E4838 +S3150800648800F0AFFD012805D13948012101703A48C5 +S31508006498FFF7B6F8384800F051FE012805D1344808 +S315080064A8002101703448FFF7ABF83348FEF7BAFD08 +S315080064B8012805D12E48032101702F48FFF7A0F8B7 +S315080064C801BD704738B504000D0029480078012831 +S315080064D804D12900C9B2200000F042FD24480078FA +S315080064E8002804D12900C9B2200000F0FBFD204885 +S315080064F80078032804D12900C9B22000FEF770FDE8 +S31508006508FFF778F831BD1A480078002805D0022820 +S3150800651807D004D3032806D007E0402006E0082061 +S3150800652804E0002002E0402000E0402080B27047E6 +S315080065380F480078002805D0022807D004D3032876 +S3150800654806D007E0402006E0082004E0002002E024 +S31508006558402000E0402080B27047064801210170BB +S31508006568704704480021017070470000C63C0008BF +S31508006578140000208C2400209822002080B5FFF7FC +S3150800658830F802BD80B5DFF8780600210170DFF81B +S3150800659874160020FBF76BF8C0B2002804D07C21DB +S315080065A8DFF86406FFF740FF01BDDFF854060078F8 +S315080065B8002801D1012000E00020704780B5FFF7C8 +S315080065C8DDFF012801D1002011E0DFF83406007844 +S315080065D8002801D000200AE000F018FE012805D19D +S315080065E8DFF81C0601210170012000E0002002BD29 +S315080065F810B5DFF80C060078002800F0FF81DFF8F0 +S3150800660800060078012834D100F01AFEDFF8FC05E8 +S3150800661800F044FEDFF8F80500F040FE00F00EFE34 +S3150800662801220100DFF8EC05FBF73AF8002807D045 +S31508006638DFF8E40500F032FE012000F025FEDDE172 +S31508006648DFF8D80500F02AFEDFF8D40500F026FEA4 +S31508006658DFF8D00500F022FEDFF8CC05002101603E +S31508006668DFF8C40500214160DFF8940502210170AE +S31508006678C4E1DFF88C050078022840F0F780DFF8D7 +S3150800668894254FF48071DFF8A405FBF7ADFCDFF815 +S31508006698741591F83A12C1F3C01111F001010129D4 +S315080066A80FDBDFF8740500F0F9FD022000F0ECFDB9 +S315080066B8DFF86005FBF717FBDFF8440500210170D2 +S315080066C89CE100281BD00022DFF86415DFF85C057A +S315080066D800F0D6F9040024B214F1010F0FD1DFF83F +S315080066E8380500F0DBFD032000F0CEFDDFF82405B1 +S315080066F8FBF7F9FADFF80805002101707EE124B2F4 +S31508006708012C28DBDFF82005406800280BD1DFF8C4 +S315080067181C05D0F88001DFF810150860DFF80805B1 +S3150800672824B2446017E0DFF80405D0F88001DFF8E2 +S31508006738F8140968884206D2DFF8F004D0F8800110 +S31508006748DFF8E4140860DFF8E004406800FA84F02B +S31508006758DFF8D4144860DFF8AC04D0F83C02DFF858 +S31508006768A414D1F84012884201D1012000E0002083 +S315080067780128C0F243810021DFF89804FBF7BFFA25 +S3150800678800280FD0DFF8900400F088FD042000F0F8 +S315080067987BFDDFF88004FBF7A6FADFF8640400211E +S315080067A801702BE1DFF8740400F078FDDFF8840443 +S315080067B800F074FDDFF88014DFF86C04406800F018 +S315080067C875FADFF8740400F069FDDFF8700400F064 +S315080067D865FDDFF86414DFF850040068000EC0B2DF +S315080067E800F053FADFF85814DFF83C040068000C88 +S315080067F8C0B200F04AFADFF84C14DFF82C04006837 +S31508006808000AC0B200F041FADFF83C14DFF81804B1 +S315080068180068C0B200F039FADFF81C0400F03EFD43 +S3150800682877A000F03BFDDFF800044168DFF8F803BD +S31508006838006800F0AEFA00280FD1DFF8DC0300F094 +S315080068482DFD052000F020FDDFF8C803FBF74BFAFD +S31508006858DFF8AC0300210170D0E0DFF8C00300F0D0 +S315080068681DFDDFF89C0303210170C7E0DFF89003DC +S315080068780078032840F0C280DFF898234FF4807127 +S31508006888DFF8A803FBF7B0FBDFF8781391F83A129C +S31508006898C1F3C01111F0010101290EDBDFF8AC03C1 +S315080068A800F0FCFC022000F0EFFCDFF86803FBF7B9 +S315080068B81AFAD34800210170A0E000281AD0DFF898 +S315080068C89023DFF86C13DFF8640300F0D9F80400A6 +S315080068D824B214F1010F0DD1DFF8780300F0DEFCBD +S315080068E8032000F0D1FCCB48FBF7FDF9C44800218A +S315080068F8017083E024B2012C4CDBD74800F0CEFCAB +S31508006908CD4924B2200000F0D1F9CB4800F0C6FCE6 +S31508006918D24800F0C3FCC849C448D0F88001000E24 +S31508006928C0B200F0B2F9C649C048D0F88001000CD8 +S31508006938C0B200F0AAF9C349BC48D0F88001000AD9 +S31508006948C0B200F0A2F9C049B848D0F88001C0B270 +S3150800695800F09BF9B84800F0A1FC29A000F09EFCBD +S31508006968BB4A24B22100B148D0F8800100F00DFADC +S3150800697800280CD1A84800F091FC062000F084FCF9 +S31508006988A448FBF7B0F99E480021017036E0A348F1 +S3150800699800F084FC9B48D0F83C029A49D1F840128A +S315080069A8884201D1012000E00020012826DBAC48F6 +S315080069B800F074FC00F0F5F900280CD1964800F0B0 +S315080069C86DFC072000F060FC9248FBF78CF98C48B0 +S315080069D80021017012E0914800F060FCA14800F01F +S315080069E85DFC8C48FBF77FF99F4800F057FC844804 +S315080069F80021017000F035FC00F096F910BD000082 +S31508006A082E2E2E0010B50400207800F075FC5328A9 +S31508006A1804D1607800F074FC002801D103200FE047 +S31508006A286078312801D100200AE06078322801D13F +S31508006A38012005E06078332801D1022000E0032010 +S31508006A4810BD70B504000026A41C200000F047F904 +S31508006A580500AE19A41C200000F041F986196D1E20 +S31508006A68A41CADB2022DF6DAF6B2F643200000F001 +S31508006A7836F9F6B2864201D0002000E0012070BD42 +S31508006A882DE9F04105000E0014005FF00008002EFD +S31508006A9801D0002D04D140F236215B48FFF7C4FC2B +S31508006AA82800FFF7AFFF0700FFB2032F01D1002028 +S31508006AB8A3E02800FFF7C5FF002802D15FF0FF30E2 +S31508006AC89BE0FFB2002F03D0022F5AD028D392E0BA +S31508006AD8AD1C280000F003F90700AD1C280000F0DB +S31508006AE8FEF800023060AD1CD6F80080280000F0D9 +S31508006AF8F6F858FA80F03060AD1CB7F10308002C98 +S31508006B080DD0002606E0280000F0E9F8B6B23055A0 +S31508006B18AD1C761CB6B20FFA88F84645F3DB6AE070 +S31508006B28AD1C280000F0DBF80700AD1C280000F0B3 +S31508006B38D6F800043060AD1CD6F80080280000F0AE +S31508006B48CEF818EB00203060AD1CD6F80080280077 +S31508006B5800F0C5F858FA80F03060AD1CB7F10408A3 +S31508006B68002C0DD0002606E0280000F0B8F8B6B2CA +S31508006B783055AD1C761CB6B20FFA88F84645F3DBD5 +S31508006B8839E0AD1C280000F0AAF80700AD1C28005B +S31508006B9800F0A5F800063060AD1CD6F8008028007D +S31508006BA800F09DF818EB00403060AD1CD6F8008060 +S31508006BB8280000F094F818EB00203060AD1CD6F8D1 +S31508006BC80080280000F08BF858FA80F03060AD1C79 +S31508006BD8B7F10508002C0DD0002606E0280000F0BD +S31508006BE87EF8B6B23055AD1C761CB6B20FFA88F8E0 +S31508006BF84645F3DBFFE7404600B2BDE8F0810000F2 +S31508006C087F240020DC120020748400087C85000894 +S31508006C183085000810150020248700082C870008EE +S31508006C28A0850008A484000810240020641F0020FA +S31508006C38E420002004870008D8220020508600088F +S31508006C48DA220020DC220020DE220020C485000883 +S31508006C5864200020E8850008C88600088886000899 +S31508006C686C860008A08600080485000880B501001F +S31508006C7811F00F003030C9B20A2901DBC01D02E045 +S31508006C88C0B200F039FBC0B202BD38B504000D0029 +S31508006C98E4B22009FFF7EAFF287014F00F00FFF79F +S31508006CA8E5FF68700020A870280032BD0200491C5C +S31508006CB80A23B2FBF3F2002AF9D100220A7002006D +S31508006CC8491E0A20B2FBF0F300FB13203030087087 +S31508006CD80A20B2FBF0F2002AF2D10800704770B514 +S31508006CE804000025002609E03038C0B20A2800DB6F +S31508006CF8C01FEDB2290151FA80F5761CF6B2022EAC +S31508006D080FDAF6B2305D00F0F7FAC0B2B0F130012A +S31508006D18172904D2C0B2B0F13A010729E4D20020F3 +S31508006D2801E02800C0B270BD80B500F036F800282A +S31508006D380DD0FFF7C6FBFEF71BFC00F0B9FB0449AC +S31508006D4808400449086000F0B3FB4068804701BD65 +S31508006D5880FFFF1F08ED00E070B504000D0016005F +S31508006D6805E0287820706D1C641C00F02FF83000A8 +S31508006D78461E80B20028F4D170BD80B500F0C0FC6C +S31508006D8801BD80B500F0C4FA01BD80B500F0CBFAA4 +S31508006D9802BD80B500F0F1FA02BD80B500F044FBEB +S31508006DA802BD80B500F003FB002801D1002001E0F0 +S31508006DB800F063FB02BD10B5040010000A000100CC +S31508006DC8200000F0A9FC200010BD7047704700009D +S31508006DD8F0B4002400E0641CE4B2122C3CD24AF257 +S31508006DE8104580B2E4B2994E16F81460E4B2974F8B +S31508006DF817EB44077F78BE19761C06FB00F695FB49 +S31508006E08F6F706FB1755002DE5D14AF2104580B26C +S31508006E18E4B28E4E16F81460E4B28C4F17EB4407AA +S31508006E287F78BE19761C06FB00F695FBF6F50D80ED +S31508006E380D88002DCFD00D88B5F5806FCBDCE4B270 +S31508006E48824810F814001070E4B2804810EB440029 +S31508006E5840781870012000E00020F0BC704780B523 +S31508006E6800AB0DF101020DF102014FF4FA70FFF7BC +S31508006E78AFFFC0B2012803D0F0217548FFF7D4FA4E +S31508006E887448002101607448006850F4004072494B +S31508006E98086001E0FFF79AFF6F4800680004F9D414 +S31508006EA86D48006830F002006B4908606A48006857 +S31508006EB850F001006849086001E0FFF787FF674856 +S31508006EC80068C007F9D59DF80100401E9DF8001016 +S31508006ED8491E090551EA0040BDF80210491E084333 +S31508006EE85F4908605C480068400840005A490860DD +S31508006EF801E0FFF76BFF59480068C007F9D45948FD +S31508006F08006850F00100574908605748006830F48F +S31508006F188040554908605548006850F480405349F0 +S31508006F280860534800210160524800210160524810 +S31508006F38006830F48040504908605048006830F4CA +S31508006F4880404E4908604848006850F480404649E1 +S31508006F58086044480068400840004249086001BD86 +S31508006F6838B504000D0046480068400104D44FF4BB +S31508006F78A2713748FFF758FA4248006810F001002E +S31508006F88404908603F4800683F4908433D4908604A +S31508006F983E48EDB20560E078A178090451EA006038 +S31508006FA8617850EA01202178084339490860E07970 +S31508006FB8A179090451EA0060617950EA012021792A +S31508006FC80843344908602F48006850F001002D49E5 +S31508006FD8086001E0FFF7FAFE294800684001F9D57C +S31508006FE831BD00212C4A126812F0030F2BD02B4A08 +S31508006FF81268520D40F267639A421ED10121284A47 +S3150800700812680270264A1268120A4270244A1268DE +S31508007018120C8270224A1268120EC270214A12682D +S315080070280271204A1268120A42711E4A1268120C24 +S3150800703882711C4A1268120EC2711748006850F00D +S315080070482000154A10600800C0B270475885000825 +S31508007058FC83000814680040006800400468004083 +S315080070681C680040006600401C6600400C6600402C +S31508007078B0660040B46600400466004014660040E6 +S315080070880868004080690040000020FC84690040C8 +S31508007098886900408C6900400C680040B069004067 +S315080070A8B8690040BC69004000B585B04FF4614036 +S315080070B800900020ADF804000020ADF80600002076 +S315080070C8ADF808000020ADF80C000C20ADF80A0051 +S315080070D800A9484800F054FB0121464800F0B2FBD5 +S315080070E805B000BD70B504000D00EDB2412D03DBF7 +S315080070F877214148FFF798F92800C0B200F061F8EF +S31508007108C0B2012803D07B213B48FFF78DF900263A +S315080071180DE0FFF75BFEB6B2305D00F052F8C0B27C +S31508007128012803D084213448FFF77EF9761C280005 +S31508007138C0B2B6B280B28642EBD370BD10B50400B1 +S315080071482E48007800280CD12D4800F02AF8012886 +S3150800715805D12A48012101702A480021017000201A +S3150800716810BD2848007826494018401C00F019F830 +S315080071780128F4D123480078401C22490870214880 +S3150800718800781F4909788842E9D11E48027892B2E0 +S315080071981D492000FFF7E0FD18480021017001206D +S315080071A8DEE710B504002021124800F061FB01282B +S315080071B805D1104800F058FB2070012000E0002097 +S315080071C810BD10B5040080210A4800F051FB0028BC +S315080071D801D100200CE0E4B2210089B2054800F08C +S315080071E83FFB8021034800F043FB0028F9D0012023 +S315080071F810BD0000001401403884000882240020CD +S3150800720854220020812400205522002000B589B088 +S3150800721800A8202100F03AFB00A93348FAF74CFEEB +S31508007228002808D10098002805D09DF80800C0064F +S3150800723801D4012000E0002009B000BD2A487047A3 +S3150800724880B52A48002180F824120A2228492748A6 +S31508007258FAF726FA002803D12448012180F82412CF +S3150800726801BD80B5214890F82402012802D11F489B +S31508007278FAF739FD40211F4800F0FAFA0028F9D034 +S315080072881948FAF743FE01BD80B5184890F8240254 +S31508007298012802D11548FAF726FD01BD10B50400E4 +S315080072A8124890F82402012819D110492000FAF743 +S315080072B8DEFE002813D50D48002180F824120B4855 +S315080072C8FAF711FD0BE0217889B20A4800F0C8FAE6 +S315080072D88021084800F0CCFA0028F9D0641C2078E8 +S315080072E80028F0D110BD00003086000834170020A9 +S315080072F8D88600080014014080B500F0CAFA02BD15 +S3150800730830380A2801D2012000E00020C0B27047B0 +S31508007318DFF8DC035FF0FF310160DFF8D8035FF0C0 +S31508007328FF310160704770B504000D001600200093 +S3150800733800F0B3F9FF2805D02819401E00F0ADF96A +S31508007348FF2801D1002017E0600A4FF4007148436E +S31508007358DFF8A4130968884207D12B0032002100F8 +S31508007368DFF8900300F0DFF806E02B003200210072 +S31508007378DFF87C0300F0D7F870BD70B504000D007F +S31508007388200000F08AF906002819401E00F085F941 +S31508007398F6B2FF2E02D0C0B2FF2801D1002005E0C0 +S315080073A80100C9B23000C0B200F03BF970BD80B523 +S315080073B800200090DFF83C03006810F1010F01D1A6 +S315080073C8012030E00098CB494968081800900098D1 +S315080073D8C8498968081800900098C649C9680818ED +S315080073E800900098C3490969081800900098C1498F +S315080073F84969081800900098BE49896908180090D4 +S315080074080098BC49C969081800900098C0430090BC +S315080074180098401C009000AA0421B748006810F597 +S31508007428C470FFF780FF02BD0020B34909680968E0 +S315080074380818B149096849680818AF490968896880 +S315080074480818AD490968C9680818AB490968096977 +S315080074580818A949096849690818A749096889696E +S315080074680818A549096811F5C47109680818002893 +S3150800747801D1012000E00020704780B59D480068CA +S3150800748810F1010F06D09B4800F090F8002801D1AA +S3150800749800200CE09648006810F1010F06D09448C1 +S315080074A800F084F8002801D1002000E0012002BD80 +S315080074B891480068704780B54FF40072B1FBF2F343 +S315080074C803FB1213002B01D000200BE002688A4246 +S315080074D801D1012006E001604FF40072001DFFF794 +S315080074E83BFC012002BD38B504000D0081488442E2 +S315080074F808D17F4C29002000FFF7DDFF002810D1AE +S3150800750800200FE07C480068854203D1794C7A4808 +S315080075180568EFE7200000F049F80028EAD10020BE +S3150800752800E0200032BD2DE9F04104000F001500E7 +S315080075381E00780A4FF4007101FB00F8206810F164 +S31508007548010F07D141462000FFF7B5FF002801D1F2 +S31508007558002029E02068404508D041462000FFF76A +S31508007568C2FF0400002C01D100201DE02068381A4B +S315080075780019071DFFF72AFC201D381AB0F5007FE9 +S315080075880AD318F500712000FFF7ADFF0400002C98 +S3150800759801D1002008E0271D287838707F1C6D1C4B +S315080075A8761E002EE6D10120BDE8F0812DE9F041CE +S315080075B804000125206800F070F8C0B2FF2801D140 +S315080075C800202CE000F070F9F32000F007FA00F02C +S315080075D808FA012803D100F077F900201FE05FF0C8 +S315080075E8000801E018F10108B8F1800F13D22068E5 +S315080075F810EB880614EB88004768FFF7E7FB3900A5 +S31508007608300000F0C2F9082801D0002503E03068E8 +S31508007618B842E7D0002500F057F92800C0B2BDE8FF +S31508007628F08138B504000D00EDB2E4B2A54201D2E6 +S31508007638002031E03048007AE4B2844205D32E4867 +S3150800764890F86800EDB2A84201D2002024E000F0C4 +S315080076582BF9F32000F0C2F900F0C3F9012803D189 +S3150800766800F032F9002017E000E0641CEDB2E4B23D +S31508007678A5420ED3FFF7AAFB0221E4B21F4830F849 +S31508007688140000F02AF90828EFD000F01DF90020A8 +S3150800769802E000F019F9012032BD38B504000025CA +S315080076A800E06D1CEDB2092D1FD2FFF78FFBEDB276 +S315080076B80C20114900FB051000688442F1D3EDB28D +S315080076C80C200D4900FB05100068EDB20C210A4A8A +S315080076D801FB0521496808188442E2D2EDB20C205C +S315080076E8054900FB0510007A00E0FF2032BD0000BE +S315080076F85C190020601B0020EC820008D48400086E +S31508007708044B9D46C046C046C046C046FEF729FFFC +S3150800771800F0A2F9902C002062F30F2262F31F42B0 +S31508007728401810F0030308D0C91A1FD3DB0748BF4F +S3150800773800F8012D28BF20F8022D130030B414468E +S315080077481546103928BF20E93C00FAD8490728BF4A +S3150800775820E90C0048BF40F8042D890028BF20F806 +S31508007768022D48BF00F8012D30BC7047C91818BF4C +S3150800777800F8012DCB0728BF00F8012D7047000037 +S315080077887FB504000D000020002100220023AE89E1 +S31508007798002E208A30F44050E98808432082A089C0 +S315080077A827490840A9882A8911436A891143084341 +S315080077B8A081A08A30F44070A9890843A08200A84D +S315080077C8FCF7A0F91C48844202D01C48844201D11F +S315080077D8039900E00299A089000407D5192000FB3F +S315080077E801F029684900B0FBF1F206E0192000FB10 +S315080077F801F029688900B0FBF1F26420B2FBF0F0C9 +S3150800780800010109642303FB1123A189090408D58A +S31508007818D90032316422B1FBF2F111F007010843AD +S3150800782807E0190132316422B1FBF2F111F00F01B8 +S31508007838084320817FBD0000001001400014014064 +S31508007848F3E9FFFFC9B2002904D0818951F4005130 +S31508007858818104E081894DF6FF7211408181704764 +S31508007868C905C90D818070478088C005C00D704755 +S31508007878002289B2B1F5007F0088084201D00122AA +S3150800788800E000221000C0B270470000002200F095 +S31508007898EFB810B50400200000F003F9002801D05D +S315080078A8203CFFE7200010BDDFF8700100680028BB +S315080078B809D5DFF86C01DFF86C110160DFF86001A3 +S315080078C8DFF8641101607047DFF85001006850F06E +S315080078D80040DFF848110860704738B504000025ED +S315080078E80820C9B2002901D100250DE0C9B201292D +S315080078F802D14FF4807507E0C9B2022902D14FF4C4 +S31508007908007501E04FF4407500F092F8C0B20828F7 +S3150800791839D1DFF80801006830F44070DFF8FC1048 +S315080079280860DFF8F80000682843DFF8F0100860F8 +S31508007938DFF8E800006830F0F800DFF8E0100860C3 +S31508007948DFF8D800006854F002010843DFF8CC10C5 +S315080079580860DFF8C800006850F48030DFF8BC100B +S31508007968086000F065F8DFF8B410096831F002011C +S31508007978DFF8A8201160DFF8A410096831F0F801CB +S31508007988DFF898201160C0B232BD70B504000D004A +S31508007998082600F04DF80600F6B2082E1BD11F4837 +S315080079A8006830F440701D4908601C48006850F4A7 +S315080079B800701A4908601948006850F0010017490C +S315080079C80860256000F034F8060014480068400886 +S315080079D84000124908603000C0B270BD13490860FB +S315080079E87047082011490968C90301D5012013E021 +S315080079F80E480068C00601D505200DE00B4800684A +S31508007A0810F0EF0F01D0062006E008480068800746 +S31508007A1801D5072000E00820C0B27047103C024094 +S31508007A28043C024023016745AB89EFCD0C3C024074 +S31508007A3880B508208DF80000FFF7D3FF8DF8000001 +S31508007A4803E0FFF7CEFF8DF800009DF80000012837 +S31508007A58F7D09DF8000002BD00F02BF8002801D0E9 +S31508007A6800F02AF8002000F03BF800F09DF8000026 +S31508007A7800B500BF130096469446103928BFA0E8FB +S31508007A880C50FAD85FEA417C28BF0CC048BF40F8BA +S31508007A98042BC90728BF20F8022B48BF00F8012B7A +S31508007AA800BD61381A2801D2012000E00020C0B2C2 +S31508007AB8704701207047000010B507497944183106 +S31508007AC8064C7C44163404E00A68081D5118884791 +S31508007AD80146A142F8D110BD2C0B00004C0B000042 +S31508007AE880B500F005F800F061F800F06DF8FCE7DD +S31508007AF800B583B072B600F073F801212020FCF7B0 +S31508007B0893F801210420FCF76FF808220621244877 +S31508007B18FBF7BEFF082207212148FBF7B9FF00201B +S31508007B288DF8060001208DF8070002208DF804005C +S31508007B384020009002208DF8050000A91848FBF798 +S31508007B4849FF02208DF804008020009000A91448F7 +S31508007B58FBF740FF01210220FCF746F80922052118 +S31508007B681048FBF795FF092206210E48FBF790FFF8 +S31508007B786020009002208DF8040002208DF8050088 +S31508007B8800208DF8060001208DF8070000A9054891 +S31508007B98FBF720FF01215FF0C060FCF735F807BD49 +S31508007BA8000802400004024000F0BCB880B5FFF7A0 +S31508007BB80CF9FDF7CDFCFFF7E4F8FEF7E3FCFEF752 +S31508007BC83FFC00F0B5F801BD80B5FFF7FFF8FDF7F3 +S31508007BD8D3FCFEF70DFDFEF751FC00F0B4F801BD25 +S31508007BE880B54548006850F0010043490860434895 +S31508007BF80021016040480068414908403E4908603C +S31508007C084048414901603C48006830F480203A49B8 +S31508007C1808603E480021016000F005F83C485FF01E +S31508007C280061016001BD82B000200190002000902B +S31508007C383148006850F480302F4908602E4800689B +S31508007C4810F4003000900198401C01900098002814 +S31508007C5803D10198B0F5A06FF0D1274800688003D2 +S31508007C6802D50120009001E0002000900098012824 +S31508007C783ED12848006850F08050264908602648B2 +S31508007C88006850F44040244908601C481B490968A4 +S31508007C9801601A48006850F40040184908601748F7 +S31508007CA8006850F4A0501549086016481B49016039 +S31508007CB81148006850F080700F4908600E4800683F +S31508007CC88001FBD5164840F2056101600B4800683B +S31508007CD880088000094908600848006850F00200D2 +S31508007CE8064908600548006810F00C000828F9D10C +S31508007CF802B0704700000000003802400838024009 +S31508007D08FFFFF6FE04380240103000240C38024003 +S31508007D1808ED00E040380240007000400C54400767 +S31508007D28003C02400746384600F032F8FBE70000F8 +S31508007D3880B5154801210170FDF728FC134908602C +S31508007D4800F001F801BD80B5FEF718FC012819D026 +S31508007D58FEF72BFC002815D00B480078012811D10E +S31508007D68FDF714FC0949096801F51C5110318842C8 +S31508007D7808D3054800210170FEF720FC002801D128 +S31508007D88FEF7D2FF01BD00007E240020282400202B +S31508007D9880B5C046C046024A11001820ABBEFBE7AC +S31508007DA82600020061006200630064006500660040 +S31508007DB86700680069006A006B006C006D006E0059 +S31508007DC86F00700071007200730074007500760009 +S31508007DD87700780079007A00A100A200A300A50020 +S31508007DE8AC00AF00E000E100E200E300E400E500D3 +S31508007DF8E600E700E800E900EA00EB00EC00ED0021 +S31508007E08EE00EF00F000F100F200F300F400F500D0 +S31508007E18F600F800F900FA00FB00FC00FD00FE0079 +S31508007E28FF00010103010501070109010B010D0105 +S31508007E380F01110113011501170119011B011D0174 +S31508007E481F01210123012501270129012B012D01E4 +S31508007E582F0131013301350137013A013C013E0151 +S31508007E68400142014401460148014B014D014F01B9 +S31508007E78510153015501570159015B015D015F0124 +S31508007E88610163016501670169016B016D016F0194 +S31508007E9871017301750177017A017C017E019201EE +S31508007EA8B103B203B303B403B503B603B703B80300 +S31508007EB8B903BA03BB03BC03BD03BE03BF03C003B0 +S31508007EC8C103C303C403C503C603C703C803C90359 +S31508007ED8CA0330043104320433043404350436043E +S31508007EE83704380439043A043B043C043D043E0488 +S31508007EF83F04400441044204430444044504460438 +S31508007F084704480449044A044B044C044D044E04E7 +S31508007F184F04510452045304540455045604570490 +S31508007F28580459045A045B045C045E045F0470210F +S31508007F38712172217321742175217621772178217F +S31508007F4879217A217B217C217D217E217F2141FF90 +S31508007F5842FF43FF44FF45FF46FF47FF48FF49FFE7 +S31508007F684AFF4BFF4CFF4DFF4EFF4FFF50FF51FF97 +S31508007F7852FF53FF54FF55FF56FF57FF58FF59FF47 +S31508007F885AFF0000410042004300440045004600ED +S31508007F984700480049004A004B004C004D004E0077 +S31508007FA84F00500051005200530054005500560027 +S31508007FB85700580059005A002100E0FFE1FFE5FF85 +S31508007FC8E2FFE3FFC000C100C200C300C400C50049 +S31508007FD8C600C700C800C900CA00CB00CC00CD003F +S31508007FE8CE00CF00D000D100D200D300D400D500EF +S31508007FF8D600D800D900DA00DB00DC00DD00DE0098 +S315080080087801000102010401060108010A010C01B0 +S315080080180E01100112011401160118011A011C019A +S315080080281E01200122012401260128012A012C010A +S315080080382E01300132013401360139013B013D0177 +S315080080483F0141014301450147014A014C014E01DF +S31508008058500152015401560158015A015C015E014A +S31508008068600162016401660168016A016C016E01BA +S31508008078700172017401760179017B017D01910114 +S31508008088910392039303940395039603970398031E +S3150800809899039A039B039C039D039E039F03A003CE +S315080080A8A103A303A403A503A603A703A803A90377 +S315080080B8AA0310041104120413041404150416045C +S315080080C81704180419041A041B041C041D041E04A6 +S315080080D81F04200421042204230424042504260456 +S315080080E82704280429042A042B042C042D042E0406 +S315080080F82F040104020403040404050406040704FF +S31508008108080409040A040B040C040E040F0460216D +S31508008118612162216321642165216621672168211D +S3150800812869216A216B216C216D216E216F2121FF3E +S3150800813822FF23FF24FF25FF26FF27FF28FF29FF05 +S315080081482AFF2BFF2CFF2DFF2EFF2FFF30FF31FFB5 +S3150800815832FF33FF34FF35FF36FF37FF38FF39FF65 +S315080081683AFF0000C700FC00E900E200E400E0006E +S31508008178E500E700EA00EB00E800EF00EE00EC0097 +S31508008188C400C500C900E600C600F400F600F200FF +S31508008198FB00F900FF00D600DC00A200A300A5003A +S315080081A8A7209201E100ED00F300FA00F100D100E2 +S315080081B8AA00BA00BF001023AC00BD00BC00A1008D +S315080081C8AB00BB0091259225932502252425612518 +S315080081D86225562555256325512557255D255C2590 +S315080081E85B251025142534252C251C2500253C251A +S315080081F85E255F255A255425692566256025502557 +S315080082086C25672568256425652559255825522529 +S3150800821853256B256A2518250C25882584258C253C +S3150800822890258025B103DF009303C003A303C30386 +S31508008238B500C403A6039803A903B4031E22C603FC +S31508008248B50329226122B10065226422202321234D +S31508008258F7004822B0001922B7001A227F20B20078 +S31508008268A025A000809A90418E418F8045454549B2 +S3150800827849498E8F9092924F994F555559999A9B7D +S315080082889C9D9E9F41494F55A5A5A6A7A8A9AAABF7 +S31508008298AC21AEAFB0B1B2B3B4B5B6B7B8B9BABB1C +S315080082A8BCBDBEBFC0C1C2C3C4C5C6C7C8C9CACB80 +S315080082B8CCCDCECFD0D1D2D3D4D5D6D7D8D9DADB70 +S315080082C8DCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEB60 +S315080082D8ECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFB50 +S315080082E8FCFDFEFF00C00008004000000300000077 +S315080082F80000010800000100040000000000020850 +S315080083080000020005000000000004080000020042 +S31508008318060000000000060800000200070000002A +S3150800832800000808000002000800000000000A080B +S31508008338000002000900000000000C080000020006 +S315080083480A00000000000E08000002000B000000EA +S31508008358433A5C576F726B5C736F667477617265C4 +S315080083685C4F70656E424C545C5461726765745C08 +S3150800837844656D6F5C41524D434D345F53544D33DC +S31508008388325F4F6C696D65785F53544D33324534A7 +S3150800839830375F4941525C426F6F745C6C69625C46 +S315080083A87569705C6E65746465762E6300000000F6 +S315080083B8433A5C576F726B5C736F66747761726564 +S315080083C85C4F70656E424C545C5461726765745CA8 +S315080083D8536F757263655C41524D434D345F535410 +S315080083E84D33325C4941525C766563746F72732EFD +S315080083F863000000433A5C576F726B5C736F667470 +S31508008408776172655C4F70656E424C545C54617254 +S315080084186765745C536F757263655C41524D434D6D +S31508008428345F53544D33325C63616E2E630000002B +S31508008438433A5C576F726B5C736F667477617265E3 +S315080084485C4F70656E424C545C5461726765745C27 +S31508008458536F757263655C41524D434D345F53548F +S315080084684D33325C756172742E630000433A5C576B +S315080084786F726B5C736F6674776172655C4F706553 +S315080084886E424C545C5461726765745C536F7572BE +S3150800849863655C66696C652E6300000050617273DB +S315080084A8696E67206669726D776172652066696CA0 +S315080084B86520746F206F627461696E2065726173D6 +S315080084C8652073697A652E2E2E00000000000800C4 +S315080084D81000180020002800300038004000480026 +S315080084E8500058008000880090009800A000A80056 +S315080084F8B000B800C000C800D000D8004669726D40 +S315080085087761726520757064617465207375636335 +S3150800851865737366756C6C7920636F6D706C6574BA +S3150800852865640A0D000000004F70656E696E672065 +S315080085386669726D776172652066696C6520666F13 +S31508008548722072656164696E672E2E2E000000001F +S3150800855805020602060307030803090309040A04B1 +S315080085680B040C040C050D050E050F050F06100661 +S31508008578100710084669726D776172652075706410 +S3150800858861746520726571756573742064657465B0 +S31508008598637465640A0D00005374617274696E67C2 +S315080085A8207468652070726F6772616D6D696E6791 +S315080085B82073657175656E63650A0D005265616499 +S315080085C8696E67206C696E652066726F6D206669CC +S315080085D86C652E2E2E4552524F520A0D0000000089 +S315080085E8496E76616C696420636865636B73756D3B +S315080085F820666F756E642E2E2E4552524F520A0DFE +S3150800860800000000DFB4FFFF7424000018000020F3 +S3150800861800000000879AFFFF1800000028010000E4 +S3150800862800000020000000002F64656D6F70726FEF +S31508008638675F6F6C696D65785F73746D333265341F +S3150800864830372E7372656300206279746573206605 +S31508008658726F6D206D656D6F727920617420307840 +S315080086680000000057726974696E672070726F6738 +S3150800867872616D20636865636B73756D2E2E2E00A7 +S3150800868820627974657320746F206D656D6F7279D1 +S315080086982061742030780000436C6F73696E672018 +S315080086A86669726D776172652066696C650A0D0080 +S315080086B801030507090E10121416181C1E000000DF +S315080086C850726F6772616D6D696E672000000000F1 +S315080086D82F626F6F746C6F672E74787400000000D1 +S315080086E880B541210148FDF79FFE01BDB883000802 +S315080086F8222A3A3C3E3F7C7F00000000457261739F +S31508008708696E672000000000C046C046C046C046DD +S31508008718FFF7A2F92B2C3B3D5B5D00004552524FF3 +S31508008728520A0D004F4B0A0D00000000FFFFFFFF1D +S31508008738FFFF00004F70656E424C540000000000B1 +S31508008748FFFFFFFF00000000010203040102030403 +S31108008758060708090100000004010000E3 +S705080087115A diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/blt_conf.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/blt_conf.h index 208fffd3..2be19eea 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/blt_conf.h +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/blt_conf.h @@ -110,6 +110,82 @@ #define BOOT_COM_UART_CHANNEL_INDEX (5) +/* The NET communication interface for firmware updates via TCP/IP is selected by setting + * the BOOT_COM_NET_ENABLE configurable to 1. The maximum amount of data bytes in a + * message for data transmission and reception is set through BOOT_COM_NET_TX_MAX_DATA + * and BOOT_COM_NET_RX_MAX_DATA, respectively. The default IP address is configured + * with the macros BOOT_COM_NET_IPADDRx. The default netmask is configued with the macros + * BOOT_COM_NET_NETMASKx. The default gateway is configured with the macros + * BOOT_COM_NET_GATEWAYx. The bootloader acts and a TCP/IP server. The port the server + * listen on for connections is configured with BOOT_COM_NET_PORT. + */ +/** \brief Enable/disable the NET transport layer. */ +#define BOOT_COM_NET_ENABLE (1) +/** \brief Configure number of bytes in the target->host data packet. */ +#define BOOT_COM_NET_TX_MAX_DATA (64) +/** \brief Configure number of bytes in the host->target data packet. */ +#define BOOT_COM_NET_RX_MAX_DATA (64) +/** \brief Configure the port that the TCP/IP server listens on */ +#define BOOT_COM_NET_PORT (1000) +/** \brief Configure the 1st byte of the IP address */ +#define BOOT_COM_NET_IPADDR0 (169) +/** \brief Configure the 2nd byte of the IP address */ +#define BOOT_COM_NET_IPADDR1 (254) +/** \brief Configure the 3rd byte of the IP address */ +#define BOOT_COM_NET_IPADDR2 (19) +/** \brief Configure the 4th byte of the IP address */ +#define BOOT_COM_NET_IPADDR3 (63) +/** \brief Configure the 1st byte of the network mask */ +#define BOOT_COM_NET_NETMASK0 (255) +/** \brief Configure the 2nd byte of the network mask */ +#define BOOT_COM_NET_NETMASK1 (255) +/** \brief Configure the 3rd byte of the network mask */ +#define BOOT_COM_NET_NETMASK2 (0) +/** \brief Configure the 4th byte of the network mask */ +#define BOOT_COM_NET_NETMASK3 (0) +/** \brief Configure the 1st byte of the gateway address */ +#define BOOT_COM_NET_GATEWAY0 (169) +/** \brief Configure the 2nd byte of the gateway address */ +#define BOOT_COM_NET_GATEWAY1 (254) +/** \brief Configure the 3rd byte of the gateway address */ +#define BOOT_COM_NET_GATEWAY2 (19) +/** \brief Configure the 4th byte of the gateway address */ +#define BOOT_COM_NET_GATEWAY3 (1) +/** \brief Enable/disable a hook function that is called when the IP address is about + * to be set. This allows a dynamic override of the BOOT_COM_NET_IPADDRx values. + */ +#define BOOT_COM_NET_IPADDR_HOOK_ENABLE (0) +/** \brief Enable/disable a hook function that is called when the netmask is about + * to be set. This allows a dynamic override of the BOOT_COM_NET_NETMASKx values. + */ +#define BOOT_COM_NET_NETMASK_HOOK_ENABLE (0) +/** \brief Enable/disable a hook function that is called when the gateway address is + * about to be set. This allows a dynamic override of the BOOT_COM_NET_GATEWAYx + * values. + */ +#define BOOT_COM_NET_GATEWAY_HOOK_ENABLE (0) + + +/**************************************************************************************** +* B A C K D O O R C O N F I G U R A T I O N +****************************************************************************************/ +#if (BOOT_COM_NET_ENABLE > 0) +/* Override the default time that the backdoor is open if firmware updates via TCP/IP + * are supported. in this case a reactivation of the bootloader results in a re- + * initialization of the ethernet MAC. when directly connected to the ethernet port of + * a PC this will go relatively fast (depending on what MS Windows is being used), but + * when connected to the network via a router this can take several seconds. feel free to + * shorten/lengthen this time for finetuning. the only downside of a long backdoor open + * time is that the starting of the user program will also be delayed for this time. + * + * Also note that when the target is directly connected to the ethernet port of a PC, + * the checkbox "Automatically retry socket connection" should be checked in the + * Microboot settings. if connecting via a router the uncheck this checkbox. + */ +#define BACKDOOR_ENTRY_TIMEOUT_MS (10000) +#endif + + /**************************************************************************************** * F I L E S Y S T E M I N T E R F A C E C O N F I G U R A T I O N ****************************************************************************************/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/settings/stm32f407.dbgdt b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/settings/stm32f407.dbgdt index 824f59ea..e53c94ff 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/settings/stm32f407.dbgdt +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/settings/stm32f407.dbgdt @@ -19,7 +19,7 @@ - 124272727 + 125272727 @@ -39,7 +39,7 @@ - + TabID-30829-10739 @@ -55,7 +55,7 @@ - 0 + 0 TabID-8810-10743 @@ -67,7 +67,7 @@ - 0 + 0 TabID-19558-10746 @@ -77,20 +77,20 @@ - 0 + 0 - TextEditor$WS_DIR$\..\main.c0000033296329630TextEditor$WS_DIR$\..\blt_conf.h0000057470847080100000010000001 + TextEditor$WS_DIR$\..\main.c0000042296329630TextEditor$WS_DIR$\..\blt_conf.h00000132873587350100000010000001 - iaridepm.enu1debuggergui.enu1-2-2741198-2-2200200104167198413104167737103-2-2741461-2-2200200104167198413241146737103-2-21981922-2-219242001002083198413104167198413 + iaridepm.enu1debuggergui.enu1-2-2741199-2-2201200104688198413104688737103-2-2741460-2-2201200104688198413240625737103-2-21981922-2-219242001002083198413104688198413
diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/settings/stm32f407.dni b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/settings/stm32f407.dni index 89ad5e39..071dba60 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/settings/stm32f407.dni +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/settings/stm32f407.dni @@ -9,7 +9,7 @@ TriggerName=main LimitSize=0 ByteLimit=50 [DebugChecksum] -Checksum=-2067015847 +Checksum=-1915269868 [Exceptions] StopOnUncaught=_ 0 StopOnThrow=_ 0 diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/settings/stm32f407.wsdt b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/settings/stm32f407.wsdt index e3cba71c..aba1407b 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/settings/stm32f407.wsdt +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/settings/stm32f407.wsdt @@ -12,7 +12,7 @@ - 338272727 + 322272727 @@ -26,7 +26,7 @@ 19027326200Build - FileFunctionLine200700100300 + FileFunctionLine20070010030017367 @@ -38,24 +38,24 @@ Workspace - stm32f407stm32f407/Bootstm32f407/Outputstm32f407/libstm32f407/src + stm32f407stm32f407/Bootstm32f407/Boot/libstm32f407/Boot/lib/uipstm32f407/Outputstm32f407/Sourcestm32f407/Source/ARMCM4_STM32stm32f407/Source/ARMCM4_STM32/IARstm32f407/Source/third_partystm32f407/libstm32f407/src - 0TabID-19870-1384BuildBuild0 + 0TabID-19870-1384BuildBuildTabID-11216-22197Debug LogDebug-Log0 - TextEditor$WS_DIR$\..\main.c0000033296329630TextEditor$WS_DIR$\..\blt_conf.h0000057470847080100000010000001 + TextEditor$WS_DIR$\..\main.c0000042296329630TextEditor$WS_DIR$\..\blt_conf.h00000132873587350100000010000001 - iaridepm.enu1-2-2963412-2-2200200104167198413215625957341-2-2963420-2-2200200104167198413219792957341 + iaridepm.enu1-2-2963413-2-2200200104167198413216146957341-2-2963413-2-2200200104167198413216146957341 diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/stm32f407.dep b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/stm32f407.dep index 58aa4fe2..468f918a 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/stm32f407.dep +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/stm32f407.dep @@ -2,261 +2,17 @@ 2 - 66273092 + 1032076476 Debug - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_rtc.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rtc.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_sdio.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_sdio.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_spi.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_spi.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_syscfg.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_syscfg.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_tim.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_tim.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_usart.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_usart.h - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_wwdg.c - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_wwdg.h - $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Device\ST\STM32F4xx\Source\system_stm32f4xx.c - $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h - $PROJ_DIR$\..\blt_conf.h - $PROJ_DIR$\..\hooks.c - $PROJ_DIR$\..\main.c - $PROJ_DIR$\..\obj\stm32f4xx_can.pbi - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\cstart.s - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\vectors.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\can.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\can.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\cpu.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\cpu.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\flash.c - $PROJ_DIR$\..\obj\stm32f4xx_pwr.o - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\flash.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\nvm.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\nvm.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\timer.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\timer.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\types.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\uart.c - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\uart.h - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\integer.h - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\diskio.h - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.c - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.h - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\unicode.c - $PROJ_DIR$\..\..\..\..\Source\assert.c - $PROJ_DIR$\..\..\..\..\Source\assert.h - $PROJ_DIR$\..\..\..\..\Source\backdoor.c - $PROJ_DIR$\..\..\..\..\Source\backdoor.h - $PROJ_DIR$\..\..\..\..\Source\boot.c - $PROJ_DIR$\..\..\..\..\Source\boot.h - $PROJ_DIR$\..\..\..\..\Source\com.c - $PROJ_DIR$\..\..\..\..\Source\com.h - $PROJ_DIR$\..\..\..\..\Source\cop.c - $PROJ_DIR$\..\..\..\..\Source\cop.h - $PROJ_DIR$\..\..\..\..\Source\file.c - $PROJ_DIR$\..\..\..\..\Source\file.h - $PROJ_DIR$\..\..\..\..\Source\plausibility.h - $PROJ_DIR$\..\..\..\..\Source\xcp.c - $PROJ_DIR$\..\..\..\..\Source\xcp.h - $TOOLKIT_DIR$\inc\c\DLib_Defaults.h - $PROJ_DIR$\..\obj\stm32f4xx_wwdg.o - $PROJ_DIR$\..\obj\stm32f4xx_crc.pbi - $TOOLKIT_DIR$\inc\c\ycheck.h - $PROJ_DIR$\..\obj\stm32f4xx_rcc.pbi - $TOOLKIT_DIR$\inc\c\string.h - $PROJ_DIR$\..\obj\stm32f4xx_adc.pbi - $PROJ_DIR$\..\obj\stm32f4xx_wwdg.pbi - $PROJ_DIR$\..\obj\cop.pbi - $PROJ_DIR$\..\obj\file.pbi - $PROJ_DIR$\..\obj\vectors.o - $TOOLKIT_DIR$\inc\c\xlocale_c.h - $TOOLKIT_DIR$\inc\c\xlocaleuse.h - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\ccsbcs.c - $TOOLKIT_DIR$\inc\c\stdint.h - $PROJ_DIR$\..\obj\misc.pbi - $PROJ_DIR$\..\obj\stm32f4xx_dac.pbi - $TOOLKIT_DIR$\inc\c\DLib_Product.h - $PROJ_DIR$\..\obj\stm32f4xx_exti.pbi - $PROJ_DIR$\..\obj\stm32f4xx_iwdg.pbi - $PROJ_DIR$\..\obj\stm32f4xx_fsmc.pbi - $TOOLKIT_DIR$\inc\c\ysizet.h - $PROJ_DIR$\..\obj\assert.o - $PROJ_DIR$\..\obj\assert.pbi - $PROJ_DIR$\..\obj\assert.lst - $TOOLKIT_DIR$\inc\c\intrinsics.h - $PROJ_DIR$\..\obj\misc.o - $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h - $PROJ_DIR$\..\bin\openbtl_olimex_stm32e407.out - $PROJ_DIR$\..\obj\stm32f4xx_cryp_aes.o - $PROJ_DIR$\..\obj\stm32f4xx_cryp_des.o - $PROJ_DIR$\..\obj\system_stm32f4xx.o - $PROJ_DIR$\..\obj\system_stm32f4xx.pbi - $TOOLKIT_DIR$\inc\c\wchar.h - $PROJ_DIR$\..\obj\nvm.pbi - $TOOLKIT_DIR$\inc\c\xtls.h - $TOOLKIT_DIR$\inc\c\xlocale.h - $PROJ_DIR$\..\obj\nvm.o - $TOOLKIT_DIR$\inc\c\ctype.h - $PROJ_DIR$\..\obj\vectors.lst - $PROJ_DIR$\..\obj\nvm.lst - $PROJ_DIR$\..\obj\xcp.lst - $PROJ_DIR$\..\obj\timer.lst - $PROJ_DIR$\..\obj\stm32f4xx_hash_md5.lst - $PROJ_DIR$\..\obj\stm32f4xx_gpio.pbi - $PROJ_DIR$\..\obj\stm32f4xx_hash.pbi - $PROJ_DIR$\..\obj\stm32f4xx_hash_md5.pbi - $PROJ_DIR$\..\obj\stm32f4xx_cryp_aes.lst - $PROJ_DIR$\..\obj\stm32f4xx_can.lst - $PROJ_DIR$\..\obj\stm32f4xx_cryp_des.lst - $TOOLKIT_DIR$\lib\shb_l.a - $PROJ_DIR$\..\obj\misc.lst - $PROJ_DIR$\..\obj\stm32f4xx_syscfg.pbi - $PROJ_DIR$\..\obj\stm32f4xx_hash_sha1.pbi - $PROJ_DIR$\..\obj\stm32f4xx_cryp.lst - $PROJ_DIR$\..\obj\stm32f4xx_cryp_tdes.lst - $PROJ_DIR$\..\obj\stm32f4xx_adc.lst - $PROJ_DIR$\..\obj\stm32f4xx_exti.lst - $PROJ_DIR$\..\obj\stm32f4xx_dbgmcu.lst - $PROJ_DIR$\..\obj\stm32f4xx_crc.lst - $PROJ_DIR$\..\obj\stm32f4xx_dcmi.lst - $PROJ_DIR$\..\obj\stm32f4xx_flash.lst - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\memory.x - $PROJ_DIR$\..\obj\stm32f4xx_fsmc.lst - $PROJ_DIR$\..\obj\stm32f4xx_gpio.lst - $PROJ_DIR$\..\obj\stm32f4xx_dac.lst - $PROJ_DIR$\..\obj\stm32f4xx_hash.lst - $PROJ_DIR$\..\obj\uart.o - $PROJ_DIR$\..\obj\stm32f4xx_hash_sha1.lst - $PROJ_DIR$\..\obj\stm32f4xx_dma.lst - $PROJ_DIR$\..\obj\stm32f4xx_iwdg.lst - $PROJ_DIR$\..\obj\stm32f4xx_wwdg.lst - $PROJ_DIR$\..\obj\stm32f4xx_i2c.lst - $PROJ_DIR$\..\obj\system_stm32f4xx.lst - $PROJ_DIR$\..\obj\stm32f4xx_usart.lst - $TOOLKIT_DIR$\lib\dl7M_tln.a - $PROJ_DIR$\..\obj\stm32f4xx_syscfg.lst - $PROJ_DIR$\..\obj\stm32f4xx_sdio.lst - $PROJ_DIR$\..\obj\stm32f4xx_rng.lst - $PROJ_DIR$\..\obj\stm32f4xx_pwr.lst - $PROJ_DIR$\..\obj\stm32f4xx_rcc.lst - $PROJ_DIR$\..\obj\stm32f4xx_rtc.lst - $TOOLKIT_DIR$\lib\rt7M_tl.a - $PROJ_DIR$\..\obj\stm32f4xx_spi.lst - $TOOLKIT_DIR$\lib\m7M_tl.a - $PROJ_DIR$\..\obj\stm32f4xx_tim.lst - $PROJ_DIR$\..\obj\uart.lst - $PROJ_DIR$\..\obj\openbtl_olimex_stm32e407.map - $PROJ_DIR$\..\obj\ff.lst - $PROJ_DIR$\..\obj\mmc.lst - $PROJ_DIR$\..\obj\unicode.lst - $TOOLKIT_DIR$\inc\c\stdarg.h - $PROJ_DIR$\..\obj\mmc.o - $PROJ_DIR$\..\obj\stm32f4xx_usart.pbi - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\ff.c - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\diskio.h - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\ff.h - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\integer.h - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\unicode.c - $TOOLKIT_DIR$\inc\c\DLib_Product_string.h - $PROJ_DIR$\..\obj\uart.pbi - $PROJ_DIR$\..\obj\stm32f4xx_tim.o - $PROJ_DIR$\..\bin\openbtl_olimex_stm32e407.srec - $TOOLKIT_DIR$\inc\c\cmsis_iar.h - $PROJ_DIR$\..\obj\stm32f4xx_sdio.pbi - $PROJ_DIR$\..\obj\stm32f4xx_pwr.pbi - $TOOLKIT_DIR$\inc\c\DLib_Threads.h - $PROJ_DIR$\..\obj\stm32f4xx_usart.o - $PROJ_DIR$\..\obj\mmc.pbi - $PROJ_DIR$\..\obj\ff.pbi - $PROJ_DIR$\..\obj\ff.o - $PROJ_DIR$\..\obj\unicode.o - $PROJ_DIR$\..\obj\unicode.pbi - $PROJ_DIR$\..\obj\stm32f4xx_dbgmcu.pbi - $PROJ_DIR$\..\obj\stm32f4xx_tim.pbi - $PROJ_DIR$\..\obj\stm32f4xx_rng.pbi - $PROJ_DIR$\..\obj\stm32f4xx_spi.pbi - $PROJ_DIR$\..\obj\stm32f4xx_rtc.pbi - $PROJ_DIR$\..\obj\stm32f4xx_i2c.o - $PROJ_DIR$\..\obj\stm32f4xx_syscfg.o - $PROJ_DIR$\..\obj\stm32f4xx_cryp_des.pbi - $PROJ_DIR$\..\obj\stm32f4xx_cryp.pbi - $PROJ_DIR$\..\obj\stm32f4xx_iwdg.o - $PROJ_DIR$\..\obj\stm32f4xx_cryp_aes.pbi - $PROJ_DIR$\..\obj\stm32f4xx_rcc.o - $PROJ_DIR$\..\obj\stm32f4xx_flash.pbi - $PROJ_DIR$\..\obj\stm32f4xx_rng.o - $PROJ_DIR$\..\obj\stm32f4xx_rtc.o - $PROJ_DIR$\..\obj\stm32f4xx_sdio.o - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\ccsbcs.c - $PROJ_DIR$\..\obj\stm32f4xx_cryp_tdes.pbi - $PROJ_DIR$\..\obj\stm32f4xx_spi.o - $PROJ_DIR$\..\obj\can.pbi - $PROJ_DIR$\..\obj\can.o - $PROJ_DIR$\..\obj\can.lst - $PROJ_DIR$\..\obj\stm32f4xx_cryp_tdes.o - $PROJ_DIR$\..\obj\stm32f4xx_adc.o - $PROJ_DIR$\..\obj\stm32f4xx_dbgmcu.o - $PROJ_DIR$\..\obj\stm32f4xx_can.o - $PROJ_DIR$\..\obj\stm32f4xx_cryp.o - $PROJ_DIR$\..\obj\stm32f4xx_hash_md5.o - $PROJ_DIR$\..\obj\stm32f4xx_hash_sha1.o - $PROJ_DIR$\..\obj\stm32f4xx_crc.o - $PROJ_DIR$\..\obj\stm32f4xx_dcmi.pbi - $TOOLKIT_DIR$\inc\c\yvals.h - $TOOLKIT_DIR$\inc\c\xencoding_limits.h - $PROJ_DIR$\..\obj\stm32f4xx_dac.o - $PROJ_DIR$\..\obj\stm32f4xx_dcmi.o - $PROJ_DIR$\..\obj\stm32f4xx_dma.o - $PROJ_DIR$\..\obj\stm32f4xx_exti.o - $PROJ_DIR$\..\obj\stm32f4xx_flash.o - $PROJ_DIR$\..\obj\stm32f4xx_fsmc.o - $PROJ_DIR$\..\obj\stm32f4xx_gpio.o - $PROJ_DIR$\..\obj\stm32f4xx_hash.o - $PROJ_DIR$\..\obj\stm32f4xx_dma.pbi - $PROJ_DIR$\..\obj\stm32f4xx_i2c.pbi - $PROJ_DIR$\..\obj\stm32f407.pbd - $PROJ_DIR$\..\obj\backdoor.o - $PROJ_DIR$\..\obj\boot.o - $PROJ_DIR$\..\obj\main.o - $PROJ_DIR$\..\obj\hooks.o - $PROJ_DIR$\..\obj\com.o - $PROJ_DIR$\..\obj\file.lst - $PROJ_DIR$\..\obj\backdoor.lst - $PROJ_DIR$\..\obj\boot.lst - $PROJ_DIR$\..\obj\cop.lst - $PROJ_DIR$\..\obj\hooks.lst - $PROJ_DIR$\..\obj\com.lst - $PROJ_DIR$\..\obj\cpu.lst - $PROJ_DIR$\..\obj\main.lst - $PROJ_DIR$\..\obj\flash.lst - $PROJ_DIR$\..\obj\timer.pbi - $TOOLKIT_DIR$\inc\c\xmtx.h - $PROJ_DIR$\..\obj\com.pbi - $PROJ_DIR$\..\obj\vectors.pbi - $PROJ_DIR$\..\obj\cpu.o - $TOOLKIT_DIR$\inc\c\stdlib.h - $PROJ_DIR$\..\obj\xcp.pbi - $PROJ_DIR$\..\obj\hooks.pbi - $PROJ_DIR$\..\obj\main.pbi - $PROJ_DIR$\..\obj\cstart.o - $PROJ_DIR$\..\obj\flash.pbi - $PROJ_DIR$\..\obj\flash.o - $PROJ_DIR$\..\obj\cpu.pbi - $PROJ_DIR$\..\obj\cop.o - $PROJ_DIR$\..\obj\file.o - $PROJ_DIR$\..\obj\timer.o - $PROJ_DIR$\..\obj\boot.pbi - $PROJ_DIR$\..\obj\xcp.o - $PROJ_DIR$\..\obj\backdoor.pbi + $PROJ_DIR$\..\lib\ethernetlib\inc\stm32_eth.h $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Include\core_cm4_simd.h - $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Include\core_cmInstr.h - $PROJ_DIR$\..\lib\fatfs\mmc.c + $PROJ_DIR$\..\lib\ethernetlib\src\stm32_eth.c $PROJ_DIR$\..\lib\fatfs\ffconf.h + $PROJ_DIR$\..\lib\fatfs\mmc.c $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Include\core_cm4.h + $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Include\core_cmInstr.h $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Include\core_cmFunc.h $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\misc.c $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\misc.h @@ -303,206 +59,519 @@ $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_rcc.h $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rng.c $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_rng.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rtc.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_rtc.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_sdio.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_sdio.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_spi.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_spi.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_syscfg.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_syscfg.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_tim.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_tim.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_usart.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_usart.h + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_wwdg.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc\stm32f4xx_wwdg.h + $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Device\ST\STM32F4xx\Source\system_stm32f4xx.c + $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h + $PROJ_DIR$\..\lib\uip\clock-arch.c + $PROJ_DIR$\..\lib\uip\clock-arch.h + $PROJ_DIR$\..\lib\uip\netdev.c + $PROJ_DIR$\..\lib\uip\netdev.h + $PROJ_DIR$\..\lib\uip\uip-conf.h + $PROJ_DIR$\..\blt_conf.h + $PROJ_DIR$\..\hooks.c + $PROJ_DIR$\..\main.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\cstart.s + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\vectors.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\can.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\can.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\cpu.c + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_arp.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\cpu.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\flash.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\flash.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\nvm.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\nvm.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\timer.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\timer.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\types.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\uart.c + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\diskio.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\uart.h + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\integer.h + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.c + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.h + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\unicode.c + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\clock.h + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip-fw.c + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip-fw.h + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_arch.h + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip.c + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip.h + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_arp.c + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_timer.c + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_timer.h + $PROJ_DIR$\..\..\..\..\Source\assert.c + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uiplib.c + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uiplib.h + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uipopt.h + $PROJ_DIR$\..\..\..\..\Source\assert.h + $PROJ_DIR$\..\..\..\..\Source\backdoor.c + $PROJ_DIR$\..\..\..\..\Source\backdoor.h + $PROJ_DIR$\..\..\..\..\Source\boot.c + $PROJ_DIR$\..\..\..\..\Source\boot.h + $PROJ_DIR$\..\..\..\..\Source\com.c + $PROJ_DIR$\..\..\..\..\Source\com.h + $PROJ_DIR$\..\..\..\..\Source\cop.c + $PROJ_DIR$\..\..\..\..\Source\cop.h + $PROJ_DIR$\..\..\..\..\Source\file.c + $PROJ_DIR$\..\..\..\..\Source\file.h + $PROJ_DIR$\..\..\..\..\Source\net.c + $PROJ_DIR$\..\..\..\..\Source\net.h + $PROJ_DIR$\..\..\..\..\Source\plausibility.h + $PROJ_DIR$\..\..\..\..\Source\xcp.c + $PROJ_DIR$\..\..\..\..\Source\xcp.h + $PROJ_DIR$\..\obj\unicode.pbi + $PROJ_DIR$\..\obj\stm32f4xx_pwr.pbi + $PROJ_DIR$\..\obj\stm32f4xx_sdio.pbi + $PROJ_DIR$\..\bin\openbtl_olimex_stm32e407.srec + $PROJ_DIR$\..\obj\stm32f4xx_rtc.pbi + $PROJ_DIR$\..\obj\stm32f4xx_dbgmcu.pbi + $PROJ_DIR$\..\obj\stm32f4xx_tim.pbi + $PROJ_DIR$\..\obj\stm32f4xx_spi.pbi + $TOOLKIT_DIR$\inc\c\cmsis_iar.h + $PROJ_DIR$\..\obj\stm32f4xx_usart.o + $PROJ_DIR$\..\obj\stm32f4xx_syscfg.o + $PROJ_DIR$\..\obj\unicode.o + $PROJ_DIR$\..\obj\stm32f4xx_rng.pbi + $PROJ_DIR$\..\obj\ff.o + $TOOLKIT_DIR$\inc\c\DLib_Threads.h + $PROJ_DIR$\..\obj\stm32f4xx_cryp.pbi + $PROJ_DIR$\..\obj\stm32f4xx_iwdg.o + $PROJ_DIR$\..\obj\stm32f4xx_i2c.pbi + $PROJ_DIR$\..\obj\stm32f4xx_rcc.o + $PROJ_DIR$\..\obj\stm32f4xx_dma.pbi + $PROJ_DIR$\..\obj\backdoor.o + $PROJ_DIR$\..\obj\boot.o + $PROJ_DIR$\..\obj\main.o + $PROJ_DIR$\..\obj\hooks.o + $PROJ_DIR$\..\obj\com.o + $PROJ_DIR$\..\obj\file.lst + $PROJ_DIR$\..\obj\backdoor.lst + $PROJ_DIR$\..\obj\boot.lst + $PROJ_DIR$\..\obj\cop.lst + $PROJ_DIR$\..\obj\hooks.lst + $PROJ_DIR$\..\obj\com.lst + $PROJ_DIR$\..\obj\cpu.lst + $PROJ_DIR$\..\obj\main.lst + $PROJ_DIR$\..\obj\flash.lst + $PROJ_DIR$\..\obj\timer.pbi + $TOOLKIT_DIR$\inc\c\xmtx.h + $PROJ_DIR$\..\obj\com.pbi + $PROJ_DIR$\..\obj\vectors.pbi + $PROJ_DIR$\..\obj\cpu.o + $TOOLKIT_DIR$\inc\c\stdlib.h + $PROJ_DIR$\..\obj\xcp.pbi + $PROJ_DIR$\..\obj\hooks.pbi + $PROJ_DIR$\..\obj\main.pbi + $PROJ_DIR$\..\obj\cstart.o + $PROJ_DIR$\..\obj\flash.pbi + $PROJ_DIR$\..\obj\flash.o + $PROJ_DIR$\..\obj\cpu.pbi + $PROJ_DIR$\..\obj\stm32f4xx_cryp_aes.pbi + $TOOLKIT_DIR$\inc\c\ysizet.h + $PROJ_DIR$\..\obj\assert.o + $PROJ_DIR$\..\obj\assert.pbi + $PROJ_DIR$\..\obj\assert.lst + $TOOLKIT_DIR$\inc\c\intrinsics.h + $PROJ_DIR$\..\obj\misc.o + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $PROJ_DIR$\..\bin\openbtl_olimex_stm32e407.out + $PROJ_DIR$\..\obj\xcp.lst + $TOOLKIT_DIR$\lib\shb_l.a + $PROJ_DIR$\..\obj\timer.lst + $PROJ_DIR$\..\obj\stm32f4xx_hash_md5.lst + $PROJ_DIR$\..\obj\stm32f4xx_hash_sha1.pbi + $PROJ_DIR$\..\obj\uip-fw.o + $PROJ_DIR$\..\obj\stm32f4xx_dbgmcu.lst + $PROJ_DIR$\..\obj\stm32f4xx_crc.lst + $PROJ_DIR$\..\lib\ethernetlib\src\stm32f4x7_eth.c + $PROJ_DIR$\..\lib\ethernetlib\inc\stm32f4x7_eth_conf.h + $PROJ_DIR$\..\obj\stm32f4xx_cryp.lst + $PROJ_DIR$\..\obj\openbtl_olimex_stm32e407.map + $PROJ_DIR$\..\obj\misc.lst + $PROJ_DIR$\..\obj\uip_timer.o + $PROJ_DIR$\..\lib\ethernetlib\inc\stm32f4x7_eth.h + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\diskio.h + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\ff.c + $PROJ_DIR$\..\obj\unicode.lst + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\ff.h + $PROJ_DIR$\..\obj\mmc.o + $TOOLKIT_DIR$\lib\m7M_tl.a + $TOOLKIT_DIR$\inc\c\stdarg.h + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + $PROJ_DIR$\..\obj\uart.pbi + $PROJ_DIR$\..\obj\mmc.lst + $PROJ_DIR$\..\obj\stm32f407.pbd + $PROJ_DIR$\..\obj\ff.lst + $PROJ_DIR$\..\obj\stm32f4xx_tim.lst + $PROJ_DIR$\..\obj\stm32f4xx_spi.lst + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\integer.h + $PROJ_DIR$\..\obj\uart.lst + $PROJ_DIR$\..\obj\stm32f4xx_usart.pbi + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\unicode.c + $PROJ_DIR$\..\obj\stm32f4xx_i2c.o + $PROJ_DIR$\..\obj\stm32f4xx_cryp_des.pbi + $PROJ_DIR$\..\obj\mmc.pbi + $PROJ_DIR$\..\obj\stm32f4xx_tim.o + $PROJ_DIR$\..\obj\ff.pbi + $PROJ_DIR$\..\obj\stm32f4xx_hash_md5.pbi + $PROJ_DIR$\..\obj\stm32f4xx_can.lst + $PROJ_DIR$\..\obj\stm32f4xx_cryp_aes.lst + $PROJ_DIR$\..\obj\stm32f4xx_hash.pbi + $PROJ_DIR$\..\obj\stm32f4xx_cryp_des.lst + $PROJ_DIR$\..\obj\stm32f4xx_gpio.pbi + $PROJ_DIR$\..\obj\stm32_eth.o + $PROJ_DIR$\..\obj\stm32_eth.pbi + $PROJ_DIR$\..\obj\stm32_eth.lst + $PROJ_DIR$\..\obj\stm32f4xx_flash.pbi + $PROJ_DIR$\..\obj\stm32f4xx_rng.o + $PROJ_DIR$\..\obj\stm32f4xx_rtc.o + $PROJ_DIR$\..\obj\stm32f4xx_sdio.o + $PROJ_DIR$\..\obj\stm32f4xx_cryp_tdes.pbi + $PROJ_DIR$\..\obj\stm32f4xx_spi.o + $PROJ_DIR$\..\obj\can.pbi + $PROJ_DIR$\..\obj\can.o + $PROJ_DIR$\..\obj\can.lst + $PROJ_DIR$\..\obj\stm32f4xx_cryp_tdes.o + $PROJ_DIR$\..\obj\stm32f4xx_adc.o + $PROJ_DIR$\..\obj\stm32f4xx_dbgmcu.o + $PROJ_DIR$\..\obj\stm32f4xx_can.o + $PROJ_DIR$\..\obj\stm32f4xx_cryp.o + $PROJ_DIR$\..\obj\stm32f4xx_hash_md5.o + $PROJ_DIR$\..\obj\stm32f4xx_hash_sha1.o + $PROJ_DIR$\..\obj\stm32f4xx_crc.o + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\ccsbcs.c + $PROJ_DIR$\..\obj\stm32f4xx_dcmi.pbi + $TOOLKIT_DIR$\inc\c\yvals.h + $TOOLKIT_DIR$\inc\c\xencoding_limits.h + $PROJ_DIR$\..\obj\stm32f4xx_dac.o + $PROJ_DIR$\..\obj\stm32f4xx_dcmi.o + $PROJ_DIR$\..\obj\stm32f4xx_dma.o + $PROJ_DIR$\..\obj\stm32f4xx_flash.o + $PROJ_DIR$\..\obj\stm32f4xx_exti.o + $PROJ_DIR$\..\obj\stm32f4xx_fsmc.o + $PROJ_DIR$\..\obj\file.o + $PROJ_DIR$\..\obj\boot.pbi + $PROJ_DIR$\..\obj\timer.o + $PROJ_DIR$\..\obj\cop.o + $PROJ_DIR$\..\obj\xcp.o + $PROJ_DIR$\..\obj\stm32f4xx_hash.o + $PROJ_DIR$\..\obj\stm32f4xx_gpio.o + $PROJ_DIR$\..\obj\backdoor.pbi + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\..\obj\stm32f4xx_can.pbi + $PROJ_DIR$\..\obj\stm32f4xx_pwr.o + $PROJ_DIR$\..\obj\stm32f4xx_rcc.pbi + $PROJ_DIR$\..\obj\stm32f4xx_adc.pbi + $TOOLKIT_DIR$\inc\c\string.h + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\..\obj\stm32f4xx_wwdg.pbi + $PROJ_DIR$\..\obj\stm32f4xx_crc.pbi + $PROJ_DIR$\..\obj\stm32f4xx_wwdg.o + $PROJ_DIR$\..\obj\cop.pbi + $PROJ_DIR$\..\obj\file.pbi + $PROJ_DIR$\..\obj\vectors.o + $TOOLKIT_DIR$\inc\c\xlocale_c.h + $TOOLKIT_DIR$\inc\c\xlocaleuse.h + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\ccsbcs.c + $TOOLKIT_DIR$\inc\c\stdint.h + $PROJ_DIR$\..\obj\misc.pbi + $PROJ_DIR$\..\obj\stm32f4xx_dac.pbi + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $PROJ_DIR$\..\obj\stm32f4xx_exti.pbi + $PROJ_DIR$\..\obj\stm32f4xx_iwdg.pbi + $PROJ_DIR$\..\obj\stm32f4xx_fsmc.pbi + $PROJ_DIR$\..\obj\stm32f4xx_fsmc.lst + $TOOLKIT_DIR$\lib\rt7M_tl.a + $PROJ_DIR$\..\obj\stm32f4xx_syscfg.lst + $PROJ_DIR$\..\obj\uart.o + $PROJ_DIR$\..\obj\stm32f4xx_sdio.lst + $PROJ_DIR$\..\obj\stm32f4xx_hash.lst + $PROJ_DIR$\..\obj\stm32f4xx_dac.lst + $PROJ_DIR$\..\obj\stm32f4xx_dma.lst + $PROJ_DIR$\..\obj\stm32f4xx_dcmi.lst + $TOOLKIT_DIR$\lib\dl7M_tln.a + $PROJ_DIR$\..\obj\stm32f4xx_rng.lst + $PROJ_DIR$\..\obj\stm32f4xx_hash_sha1.lst + $PROJ_DIR$\..\obj\system_stm32f4xx.lst + $PROJ_DIR$\..\obj\stm32f4xx_rtc.lst + $PROJ_DIR$\..\obj\stm32f4xx_iwdg.lst + $PROJ_DIR$\..\obj\stm32f4xx_rcc.lst + $PROJ_DIR$\..\obj\stm32f4xx_pwr.lst + $PROJ_DIR$\..\obj\stm32f4xx_gpio.lst + $PROJ_DIR$\..\obj\stm32f4xx_wwdg.lst + $PROJ_DIR$\..\obj\stm32f4xx_flash.lst + $PROJ_DIR$\..\obj\stm32f4xx_usart.lst + $PROJ_DIR$\..\obj\stm32f4xx_i2c.lst + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\memory.x + $PROJ_DIR$\..\obj\clock-arch.o + $PROJ_DIR$\..\obj\nvm.lst + $PROJ_DIR$\..\obj\clock-arch.pbi + $PROJ_DIR$\..\obj\net.o + $PROJ_DIR$\..\obj\net.pbi + $PROJ_DIR$\..\obj\nvm.pbi + $PROJ_DIR$\..\obj\stm32f4xx_cryp_des.o + $PROJ_DIR$\..\obj\stm32f4x7_eth.pbi + $PROJ_DIR$\..\obj\system_stm32f4xx.pbi + $TOOLKIT_DIR$\inc\c\wchar.h + $TOOLKIT_DIR$\inc\c\xlocale.h + $PROJ_DIR$\..\obj\stm32f4x7_eth.o + $PROJ_DIR$\..\obj\vectors.lst + $TOOLKIT_DIR$\inc\c\ctype.h + $TOOLKIT_DIR$\inc\c\xtls.h + $PROJ_DIR$\..\obj\system_stm32f4xx.o + $PROJ_DIR$\..\obj\clock-arch.lst + $PROJ_DIR$\..\obj\nvm.o + $PROJ_DIR$\..\obj\stm32f4x7_eth.lst + $PROJ_DIR$\..\obj\uip.lst + $PROJ_DIR$\..\obj\netdev.o + $PROJ_DIR$\..\obj\net.lst + $PROJ_DIR$\..\obj\netdev.pbi + $PROJ_DIR$\..\obj\stm32f4xx_cryp_aes.o + $PROJ_DIR$\..\obj\uip_arp.o + $PROJ_DIR$\..\obj\uip_timer.lst + $PROJ_DIR$\..\obj\uiplib.o + $PROJ_DIR$\..\obj\netdev.lst + $PROJ_DIR$\..\obj\uiplib.lst + $PROJ_DIR$\..\obj\uip.o + $PROJ_DIR$\..\obj\uip-fw.lst + $PROJ_DIR$\..\obj\stm32f4xx_cryp_tdes.lst + $PROJ_DIR$\..\obj\uip-fw.pbi + $PROJ_DIR$\..\obj\uip.pbi + $PROJ_DIR$\..\obj\stm32f4xx_syscfg.pbi + $PROJ_DIR$\..\obj\uip_arp.pbi + $PROJ_DIR$\..\obj\stm32f4xx_adc.lst + $PROJ_DIR$\..\obj\uiplib.pbi + $PROJ_DIR$\..\obj\uip_arp.lst + $PROJ_DIR$\..\obj\uip_timer.pbi + $PROJ_DIR$\..\obj\stm32f4xx_exti.lst - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rtc.c + $PROJ_DIR$\..\lib\ethernetlib\src\stm32_eth.c ICCARM - 137 183 + 229 227 BICOMP - 173 + 228 ICCARM - 0 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 3 5 7 9 11 13 253 + 0 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 0 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 3 5 7 9 11 13 253 + 0 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_sdio.c + $PROJ_DIR$\..\lib\fatfs\mmc.c ICCARM - 133 184 + 207 202 BICOMP - 160 + 218 ICCARM - 3 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 5 7 9 11 13 253 + 270 271 249 265 181 284 250 141 175 205 92 94 10 5 281 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 3 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 5 7 9 11 13 253 + 270 271 249 265 181 284 250 141 175 205 92 94 10 5 281 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - [ROOT_NODE] - - - ILINK - 84 143 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_spi.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\misc.c ICCARM - 139 187 + 195 180 BICOMP - 172 + 282 ICCARM - 5 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 7 9 11 13 253 + 9 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 BICOMP - 5 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 7 9 11 13 253 + 9 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_syscfg.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_adc.c ICCARM - 132 175 + 347 240 BICOMP - 108 + 269 ICCARM - 7 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 9 11 13 253 + 12 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 7 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 9 11 13 253 + 12 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_tim.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_can.c ICCARM - 141 157 + 222 242 BICOMP - 170 + 266 ICCARM - 9 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 11 13 253 + 14 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 9 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 11 13 253 + 14 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_usart.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_crc.c ICCARM - 130 163 + 190 246 BICOMP - 149 + 273 ICCARM - 11 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 13 253 + 17 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 11 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 13 253 + 17 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_wwdg.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp.c ICCARM - 127 57 + 193 243 BICOMP - 63 + 142 ICCARM - 13 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 253 + 19 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 13 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 253 + 19 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Device\ST\STM32F4xx\Source\system_stm32f4xx.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp_aes.c ICCARM - 129 87 + 223 334 BICOMP - 88 + 174 ICCARM - 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 + 19 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 + 19 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\hooks.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp_des.c ICCARM - 222 216 + 225 317 + + + BICOMP + 217 + + + + + ICCARM + 19 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + BICOMP + 19 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp_tdes.c + + + ICCARM + 342 239 BICOMP @@ -512,52 +581,140 @@ ICCARM - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 + 19 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 + 19 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\main.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dac.c ICCARM - 225 215 + 294 251 BICOMP - 235 + 283 ICCARM - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 + 24 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 + 24 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\cstart.s + [ROOT_NODE] - AARM - 236 + ILINK + 182 194 - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\vectors.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dbgmcu.c ICCARM - 95 66 + 189 241 + + + BICOMP + 132 + + + + + ICCARM + 26 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + BICOMP + 26 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dcmi.c + + + ICCARM + 296 252 + + + BICOMP + 248 + + + + + ICCARM + 28 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + BICOMP + 28 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dma.c + + + ICCARM + 295 253 + + + BICOMP + 146 + + + + + ICCARM + 30 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_exti.c + + + ICCARM + 351 255 + + + BICOMP + 285 + + + + + ICCARM + 32 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + BICOMP + 32 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_flash.c + + + ICCARM + 307 254 BICOMP @@ -567,181 +724,476 @@ ICCARM - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 + 34 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 + 34 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\can.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_fsmc.c ICCARM - 190 189 + 288 256 BICOMP - 188 + 287 ICCARM - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 + 36 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 + 36 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\cpu.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_gpio.c ICCARM - 224 231 + 305 263 BICOMP - 239 + 226 ICCARM - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 + 38 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 + 38 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\flash.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash.c ICCARM - 226 238 + 293 262 BICOMP - 237 + 224 ICCARM - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 + 40 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 + 40 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\nvm.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash_md5.c ICCARM - 96 93 + 186 244 BICOMP - 90 + 221 ICCARM - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 + 40 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 + 40 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\timer.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash_sha1.c ICCARM - 98 242 + 299 245 BICOMP - 227 + 187 ICCARM - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - BICOMP - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 + 40 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\uart.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_i2c.c ICCARM - 142 123 + 309 216 BICOMP - 156 + 144 ICCARM - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 + 44 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 + 44 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_iwdg.c ICCARM - 144 166 + 302 143 BICOMP - 165 + 286 ICCARM - 39 36 249 37 147 59 200 56 83 73 201 162 + 46 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 39 36 249 37 147 59 200 56 83 73 201 162 + 46 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\unicode.c + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_pwr.c ICCARM - 146 167 + 304 267 + + + BICOMP + 128 + + + + + ICCARM + 48 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 50 52 54 56 58 60 62 64 66 9 + + + BICOMP + 48 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rcc.c + + + ICCARM + 303 145 + + + BICOMP + 268 + + + + + ICCARM + 50 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 52 54 56 58 60 62 64 66 9 + + + BICOMP + 50 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rng.c + + + ICCARM + 298 231 + + + BICOMP + 139 + + + + + ICCARM + 52 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 54 56 58 60 62 64 66 9 + + + BICOMP + 52 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rtc.c + + + ICCARM + 301 232 + + + BICOMP + 131 + + + + + ICCARM + 54 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 56 58 60 62 64 66 9 + + + BICOMP + 54 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_sdio.c + + + ICCARM + 292 233 + + + BICOMP + 129 + + + + + ICCARM + 56 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 58 60 62 64 66 9 + + + BICOMP + 56 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_spi.c + + + ICCARM + 211 235 + + + BICOMP + 134 + + + + + ICCARM + 58 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 60 62 64 66 9 + + + BICOMP + 58 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_syscfg.c + + + ICCARM + 290 137 + + + BICOMP + 345 + + + + + ICCARM + 60 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 62 64 66 9 + + + BICOMP + 60 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_tim.c + + + ICCARM + 210 219 + + + BICOMP + 133 + + + + + ICCARM + 62 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 64 66 9 + + + BICOMP + 62 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 64 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_usart.c + + + ICCARM + 308 136 + + + BICOMP + 214 + + + + + ICCARM + 64 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 66 9 + + + BICOMP + 64 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 66 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_wwdg.c + + + ICCARM + 306 274 + + + BICOMP + 272 + + + + + ICCARM + 66 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 9 + + + BICOMP + 66 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 9 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Device\ST\STM32F4xx\Source\system_stm32f4xx.c + + + ICCARM + 300 326 + + + BICOMP + 319 + + + + + ICCARM + 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + BICOMP + 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\lib\uip\clock-arch.c + + + ICCARM + 327 311 + + + BICOMP + 313 + + + + + ICCARM + 70 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 + + + BICOMP + 70 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 + + + + + $PROJ_DIR$\..\lib\uip\netdev.c + + + ICCARM + 338 331 + + + BICOMP + 333 + + + + + ICCARM + 103 110 73 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 123 82 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 0 270 175 205 + + + BICOMP + 103 110 73 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 123 82 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 0 270 175 205 + + + + + $PROJ_DIR$\..\hooks.c + + + ICCARM + 156 150 BICOMP @@ -751,476 +1203,20 @@ ICCARM - 39 36 249 69 + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 39 36 249 69 + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\..\..\..\Source\assert.c + $PROJ_DIR$\..\main.c ICCARM - 80 78 - - - BICOMP - 79 - - - - - ICCARM - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 - - - BICOMP - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 - - - - - $PROJ_DIR$\..\..\..\..\Source\backdoor.c - - - ICCARM - 219 213 - - - BICOMP - 245 - - - - - ICCARM - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 - - - BICOMP - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 - - - - - $PROJ_DIR$\..\..\..\..\Source\boot.c - - - ICCARM - 220 214 - - - BICOMP - 243 - - - - - ICCARM - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 - - - BICOMP - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 - - - - - $PROJ_DIR$\..\..\..\..\Source\com.c - - - ICCARM - 223 217 - - - BICOMP - 229 - - - - - ICCARM - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 23 35 - - - BICOMP - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 23 35 - - - - - $PROJ_DIR$\..\..\..\..\Source\cop.c - - - ICCARM - 221 240 - - - BICOMP - 64 - - - - - ICCARM - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 - - - BICOMP - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 - - - - - $PROJ_DIR$\..\..\..\..\Source\file.c - - - ICCARM - 218 241 - - - BICOMP - 65 - - - - - ICCARM - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 61 59 200 56 83 73 201 162 77 155 94 92 91 228 232 68 67 89 - - - BICOMP - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 61 59 200 56 83 73 201 162 77 155 94 92 91 228 232 68 67 89 - - - - - $PROJ_DIR$\..\..\..\..\Source\xcp.c - - - ICCARM - 97 244 - - - BICOMP - 233 - - - - - ICCARM - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 - - - BICOMP - 46 33 42 16 53 25 50 30 28 32 44 52 39 36 249 48 55 - - - - - $PROJ_DIR$\..\bin\openbtl_olimex_stm32e407.out - - - ILINK - 143 - - - OBJCOPY - 158 - - - - - ILINK - 118 78 213 214 189 217 240 231 236 166 241 238 216 215 82 148 93 192 194 198 195 85 86 191 202 193 203 204 205 206 207 208 209 196 197 174 178 27 180 182 183 184 187 175 157 163 57 87 242 123 167 66 244 106 138 140 131 - - - - - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\ff.c - - - ICCARM - 144 166 - - - BICOMP - 165 - - - - - ICCARM - 152 153 249 151 147 59 200 56 83 73 201 162 - - - BICOMP - 152 153 249 151 147 59 200 56 83 73 201 162 - - - - - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\unicode.c - - - ICCARM - 146 167 - - - BICOMP - 168 - - - - - ICCARM - 152 153 249 185 - - - BICOMP - 152 153 249 185 - - - - - $PROJ_DIR$\..\lib\fatfs\mmc.c - - - ICCARM - 145 148 - - - BICOMP - 164 - - - - - ICCARM - 61 59 200 56 83 73 201 162 77 155 37 36 254 250 70 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - BICOMP - 61 59 200 56 83 73 201 162 77 155 37 36 254 250 70 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\misc.c - - - ICCARM - 107 82 - - - BICOMP - 71 - - - - - ICCARM - 253 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 - - - BICOMP - 253 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_adc.c - - - ICCARM - 112 192 - - - BICOMP - 62 - - - - - ICCARM - 256 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - BICOMP - 256 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_can.c - - - ICCARM - 104 194 - - - BICOMP - 19 - - - - - ICCARM - 258 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - BICOMP - 258 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_crc.c - - - ICCARM - 115 198 - - - BICOMP - 58 - - - - - ICCARM - 261 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - BICOMP - 261 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 263 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp.c - - - ICCARM - 110 195 - - - BICOMP - 177 - - - - - ICCARM - 263 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - BICOMP - 263 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp_aes.c - - - ICCARM - 103 85 - - - BICOMP - 179 - - - - - ICCARM - 263 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - BICOMP - 263 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp_des.c - - - ICCARM - 105 86 - - - BICOMP - 176 - - - - - ICCARM - 263 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - BICOMP - 263 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_cryp_tdes.c - - - ICCARM - 111 191 - - - BICOMP - 186 - - - - - ICCARM - 263 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - BICOMP - 263 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 268 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dac.c - - - ICCARM - 121 202 - - - BICOMP - 72 - - - - - ICCARM - 268 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - BICOMP - 268 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 270 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dbgmcu.c - - - ICCARM - 114 193 + 159 149 BICOMP @@ -1230,319 +1226,98 @@ ICCARM - 270 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 270 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 272 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dcmi.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\cstart.s + + + AARM + 170 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\vectors.c ICCARM - 116 203 + 323 277 BICOMP - 199 + 164 ICCARM - 272 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 BICOMP - 272 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 274 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dma.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\can.c ICCARM - 125 204 + 238 237 BICOMP - 210 + 236 ICCARM - 274 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 BICOMP - 274 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 276 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_exti.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\cpu.c ICCARM - 113 205 + 158 165 BICOMP - 74 + 173 ICCARM - 276 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 BICOMP - 276 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 278 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_flash.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\flash.c ICCARM - 117 206 - - - BICOMP - 181 - - - - - ICCARM - 278 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - BICOMP - 278 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 280 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_fsmc.c - - - ICCARM - 119 207 - - - BICOMP - 76 - - - - - ICCARM - 280 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - BICOMP - 280 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 284 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_gpio.c - - - ICCARM - 120 208 - - - BICOMP - 100 - - - - - ICCARM - 282 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - BICOMP - 282 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash.c - - - ICCARM - 122 209 - - - BICOMP - 101 - - - - - ICCARM - 284 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - BICOMP - 284 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash_md5.c - - - ICCARM - 99 196 - - - BICOMP - 102 - - - - - ICCARM - 284 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - BICOMP - 284 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash_sha1.c - - - ICCARM - 124 197 - - - BICOMP - 109 - - - - - ICCARM - 284 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - BICOMP - 284 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 282 288 290 292 294 296 0 3 5 7 9 11 13 253 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_i2c.c - - - ICCARM - 128 174 - - - BICOMP - 211 - - - - - ICCARM - 288 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 290 292 294 296 0 3 5 7 9 11 13 253 - - - BICOMP - 288 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 290 292 294 296 0 3 5 7 9 11 13 253 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_iwdg.c - - - ICCARM - 126 178 - - - BICOMP - 75 - - - - - ICCARM - 290 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 292 294 296 0 3 5 7 9 11 13 253 - - - BICOMP - 290 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 292 294 296 0 3 5 7 9 11 13 253 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_pwr.c - - - ICCARM - 135 27 - - - BICOMP - 161 - - - - - ICCARM - 292 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 294 296 0 3 5 7 9 11 13 253 - - - BICOMP - 292 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 294 296 0 3 5 7 9 11 13 253 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rcc.c - - - ICCARM - 136 180 - - - BICOMP - 60 - - - - - ICCARM - 294 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 296 0 3 5 7 9 11 13 253 - - - BICOMP - 294 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 296 0 3 5 7 9 11 13 253 - - - - - $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_rng.c - - - ICCARM - 134 182 + 160 172 BICOMP @@ -1552,11 +1327,513 @@ ICCARM - 296 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 0 3 5 7 9 11 13 253 + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 BICOMP - 296 254 250 70 59 200 56 83 73 201 162 247 159 81 251 246 15 259 256 258 261 263 268 270 272 274 276 278 280 284 282 288 290 292 294 0 3 5 7 9 11 13 253 + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\nvm.c + + + ICCARM + 312 328 + + + BICOMP + 316 + + + + + ICCARM + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 + + + BICOMP + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\timer.c + + + ICCARM + 185 259 + + + BICOMP + 161 + + + + + ICCARM + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + BICOMP + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\uart.c + + + ICCARM + 213 291 + + + BICOMP + 206 + + + + + ICCARM + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + BICOMP + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.c + + + ICCARM + 209 140 + + + BICOMP + 220 + + + + + ICCARM + 96 94 3 92 204 271 249 265 181 284 250 141 + + + BICOMP + 96 94 3 92 204 271 249 265 181 284 250 141 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\unicode.c + + + ICCARM + 200 138 + + + BICOMP + 127 + + + + + ICCARM + 96 94 3 280 + + + BICOMP + 96 94 3 280 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip-fw.c + + + ICCARM + 341 188 + + + BICOMP + 343 + + + + + ICCARM + 103 110 73 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 123 101 100 270 271 249 265 181 284 250 141 175 205 + + + BICOMP + 103 110 73 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 123 101 100 270 271 249 265 181 284 250 141 175 205 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip.c + + + ICCARM + 330 340 + + + BICOMP + 344 + + + + + ICCARM + 103 110 73 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 123 101 270 271 249 265 181 284 250 141 175 205 + + + BICOMP + 103 110 73 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 123 101 270 271 249 265 181 284 250 141 175 205 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_arp.c + + + ICCARM + 349 335 + + + BICOMP + 346 + + + + + ICCARM + 82 103 110 73 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 123 270 271 249 265 181 284 250 141 175 205 + + + BICOMP + 82 103 110 73 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 123 270 271 249 265 181 284 250 141 175 205 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_timer.c + + + ICCARM + 336 196 + + + BICOMP + 350 + + + + + ICCARM + 98 70 106 + + + BICOMP + 98 70 106 + + + + + $PROJ_DIR$\..\..\..\..\Source\assert.c + + + ICCARM + 178 176 + + + BICOMP + 177 + + + + + ICCARM + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 + + + BICOMP + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uiplib.c + + + ICCARM + 339 337 + + + BICOMP + 348 + + + + + ICCARM + 103 110 73 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 123 109 + + + BICOMP + 103 110 73 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 123 109 + + + + + $PROJ_DIR$\..\..\..\..\Source\backdoor.c + + + ICCARM + 153 147 + + + BICOMP + 264 + + + + + ICCARM + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 + + + BICOMP + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 + + + + + $PROJ_DIR$\..\..\..\..\Source\boot.c + + + ICCARM + 154 148 + + + BICOMP + 258 + + + + + ICCARM + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 + + + BICOMP + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 + + + + + $PROJ_DIR$\..\..\..\..\Source\com.c + + + ICCARM + 157 151 + + + BICOMP + 163 + + + + + ICCARM + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 80 93 123 + + + BICOMP + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 80 93 123 + + + + + $PROJ_DIR$\..\..\..\..\Source\cop.c + + + ICCARM + 155 260 + + + BICOMP + 275 + + + + + ICCARM + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 + + + BICOMP + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 + + + + + $PROJ_DIR$\..\..\..\..\Source\file.c + + + ICCARM + 152 257 + + + BICOMP + 276 + + + + + ICCARM + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 270 271 249 265 181 284 250 141 175 205 324 321 325 162 166 279 278 320 + + + BICOMP + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 270 271 249 265 181 284 250 141 175 205 324 321 325 162 166 279 278 320 + + + + + $PROJ_DIR$\..\..\..\..\Source\net.c + + + ICCARM + 332 314 + + + BICOMP + 315 + + + + + ICCARM + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 72 103 110 73 123 82 + + + BICOMP + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 72 103 110 73 123 82 + + + + + $PROJ_DIR$\..\..\..\..\Source\xcp.c + + + ICCARM + 183 261 + + + BICOMP + 167 + + + + + ICCARM + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 + + + BICOMP + 115 90 111 74 124 83 119 87 85 89 113 121 96 94 3 117 126 + + + + + $PROJ_DIR$\..\bin\openbtl_olimex_stm32e407.out + + + ILINK + 194 + + + OBJCOPY + 130 + + + + + ILINK + 310 176 147 148 237 311 151 260 165 170 140 257 172 150 149 180 202 314 331 328 227 240 242 246 243 334 317 239 251 241 252 253 255 254 256 263 262 244 245 216 143 267 145 231 232 233 235 137 219 136 274 326 259 291 188 340 335 196 337 138 277 261 184 289 203 297 + + + + + $PROJ_DIR$\..\lib\ethernetlib\src\stm32f4x7_eth.c + + + ICCARM + 329 322 + + + BICOMP + 318 + + + + + ICCARM + 197 192 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 270 175 205 + + + BICOMP + 197 192 10 5 281 271 249 265 181 284 250 141 6 135 179 7 1 68 15 12 14 17 19 24 26 28 30 32 34 36 40 38 44 46 48 50 52 54 56 58 60 62 64 66 9 270 175 205 + + + + + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\ff.c + + + ICCARM + 209 140 + + + BICOMP + 220 + + + + + ICCARM + 201 212 3 198 204 271 249 265 181 284 250 141 + + + BICOMP + 201 212 3 198 204 271 249 265 181 284 250 141 + + + + + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\unicode.c + + + ICCARM + 200 138 + + + BICOMP + 127 + + + + + ICCARM + 201 212 3 247 + + + BICOMP + 201 212 3 247 diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/stm32f407.ewp b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/stm32f407.ewp index 970906df..80b1491d 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/stm32f407.ewp +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/ide/stm32f407.ewp @@ -299,11 +299,15 @@ $PROJ_DIR$\..\lib\stdperiphlib $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Device\ST\STM32F4xx\Include $PROJ_DIR$\..\lib\stdperiphlib\CMSIS\Include + $PROJ_DIR$\..\lib\ethernetlib\inc + $PROJ_DIR$\..\lib\ethernetlib\src $PROJ_DIR$\..\lib\fatfs + $PROJ_DIR$\..\lib\uip $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc $PROJ_DIR$\..\..\..\..\Source $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32 $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip