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 acc77b89..d35ab603 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 10b83df3..71b21db6 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 @@ -19,33 +19,33 @@ Discarded input sections .data 0x00000000 0x0 THUMB Debug/../../obj/mmc.o .bss 0x00000000 0x0 THUMB Debug/../../obj/mmc.o .text.IsCardProgramming - 0x00000000 0x1e0 THUMB Debug/../../obj/mmc.o + 0x00000000 0x164 THUMB Debug/../../obj/mmc.o .text.SD_DeInit - 0x00000000 0xc4 THUMB Debug/../../obj/mmc.o + 0x00000000 0xa0 THUMB Debug/../../obj/mmc.o .text.SD_PowerOFF - 0x00000000 0x10 THUMB Debug/../../obj/mmc.o + 0x00000000 0xc THUMB Debug/../../obj/mmc.o .text.SD_ReadMultiBlocks - 0x00000000 0x1d8 THUMB Debug/../../obj/mmc.o + 0x00000000 0x1bc THUMB Debug/../../obj/mmc.o .text.SD_WriteMultiBlocks - 0x00000000 0x224 THUMB Debug/../../obj/mmc.o + 0x00000000 0x1ec THUMB Debug/../../obj/mmc.o .text.SD_GetTransferState 0x00000000 0x18 THUMB Debug/../../obj/mmc.o .text.SD_StopTransfer 0x00000000 0x30 THUMB Debug/../../obj/mmc.o .text.SD_WaitWriteOperation - 0x00000000 0x1c4 THUMB Debug/../../obj/mmc.o + 0x00000000 0x198 THUMB Debug/../../obj/mmc.o .text.SD_WaitReadOperation - 0x00000000 0x158 THUMB Debug/../../obj/mmc.o + 0x00000000 0x100 THUMB Debug/../../obj/mmc.o .text.SD_Erase - 0x00000000 0x1a8 THUMB Debug/../../obj/mmc.o + 0x00000000 0x164 THUMB Debug/../../obj/mmc.o .text.SD_SendSDStatus - 0x00000000 0x1fc THUMB Debug/../../obj/mmc.o + 0x00000000 0x1a0 THUMB Debug/../../obj/mmc.o .text.SD_GetCardStatus - 0x00000000 0x98 THUMB Debug/../../obj/mmc.o + 0x00000000 0x84 THUMB Debug/../../obj/mmc.o .text.SD_ProcessIRQSrc - 0x00000000 0xf4 THUMB Debug/../../obj/mmc.o + 0x00000000 0xac THUMB Debug/../../obj/mmc.o .text.SD_ProcessDMAIRQ - 0x00000000 0x34 THUMB Debug/../../obj/mmc.o + 0x00000000 0x2c THUMB Debug/../../obj/mmc.o .text.SDIO_IRQHandler 0x00000000 0x4 THUMB Debug/../../obj/mmc.o .text.DMA2_Stream3_IRQHandler @@ -56,7 +56,7 @@ Discarded input sections .data 0x00000000 0x0 THUMB Debug/../../obj/system_stm32f4xx.o .bss 0x00000000 0x0 THUMB Debug/../../obj/system_stm32f4xx.o .text.SystemCoreClockUpdate - 0x00000000 0xe0 THUMB Debug/../../obj/system_stm32f4xx.o + 0x00000000 0x94 THUMB Debug/../../obj/system_stm32f4xx.o .data.AHBPrescTable 0x00000000 0x10 THUMB Debug/../../obj/system_stm32f4xx.o .data.SystemCoreClock @@ -67,21 +67,21 @@ Discarded input sections .text.NVIC_PriorityGroupConfig 0x00000000 0x14 THUMB Debug/../../obj/misc.o .text.NVIC_Init - 0x00000000 0x8c THUMB Debug/../../obj/misc.o + 0x00000000 0x80 THUMB Debug/../../obj/misc.o .text.NVIC_SetVectorTable 0x00000000 0x18 THUMB Debug/../../obj/misc.o .text.NVIC_SystemLPConfig - 0x00000000 0x24 THUMB Debug/../../obj/misc.o + 0x00000000 0x1c THUMB Debug/../../obj/misc.o .text.SysTick_CLKSourceConfig 0x00000000 0x1c THUMB Debug/../../obj/misc.o .debug_frame 0x00000000 0x6c THUMB Debug/../../obj/misc.o - .debug_info 0x00000000 0x58c THUMB Debug/../../obj/misc.o + .debug_info 0x00000000 0x58a THUMB Debug/../../obj/misc.o .debug_abbrev 0x00000000 0x149 THUMB Debug/../../obj/misc.o - .debug_loc 0x00000000 0x1d0 THUMB Debug/../../obj/misc.o + .debug_loc 0x00000000 0x1ac THUMB Debug/../../obj/misc.o .debug_aranges 0x00000000 0x40 THUMB Debug/../../obj/misc.o .debug_ranges 0x00000000 0x30 THUMB Debug/../../obj/misc.o - .debug_line 0x00000000 0x268 THUMB Debug/../../obj/misc.o + .debug_line 0x00000000 0x27b THUMB Debug/../../obj/misc.o .debug_str 0x00000000 0x417 THUMB Debug/../../obj/misc.o .comment 0x00000000 0x4f THUMB Debug/../../obj/misc.o .ARM.attributes @@ -92,14 +92,14 @@ Discarded input sections .text.ADC_DeInit 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_Init - 0x00000000 0x54 THUMB Debug/../../obj/stm32f4xx_adc.o + 0x00000000 0x50 THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_StructInit - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_adc.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_CommonInit - 0x00000000 0x2c THUMB Debug/../../obj/stm32f4xx_adc.o + 0x00000000 0x30 THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_CommonStructInit - 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_adc.o - .text.ADC_Cmd 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_adc.o + 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_adc.o + .text.ADC_Cmd 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_AnalogWatchdogCmd 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_AnalogWatchdogThresholdsConfig @@ -107,37 +107,37 @@ Discarded input sections .text.ADC_AnalogWatchdogSingleChannelConfig 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_TempSensorVrefintCmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_adc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_VBATCmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_adc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_RegularChannelConfig - 0x00000000 0xb0 THUMB Debug/../../obj/stm32f4xx_adc.o + 0x00000000 0x9c THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_SoftwareStartConv 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_GetSoftwareStartConvStatus 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_EOCOnEachRegularChannelCmd - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_adc.o - .text.ADC_ContinuousModeCmd - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_adc.o - .text.ADC_DiscModeChannelCountConfig 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_adc.o + .text.ADC_ContinuousModeCmd + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_adc.o + .text.ADC_DiscModeChannelCountConfig + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_DiscModeCmd - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_adc.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_GetConversionValue 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_GetMultiModeConversionValue 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_DMACmd - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_adc.o - .text.ADC_DMARequestAfterLastTransferCmd - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_adc.o - .text.ADC_MultiModeDMARequestAfterLastTransferCmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_adc.o - .text.ADC_InjectedChannelConfig - 0x00000000 0x70 THUMB Debug/../../obj/stm32f4xx_adc.o - .text.ADC_InjectedSequencerLengthConfig 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_adc.o + .text.ADC_DMARequestAfterLastTransferCmd + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_adc.o + .text.ADC_MultiModeDMARequestAfterLastTransferCmd + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_adc.o + .text.ADC_InjectedChannelConfig + 0x00000000 0x64 THUMB Debug/../../obj/stm32f4xx_adc.o + .text.ADC_InjectedSequencerLengthConfig + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_SetInjectedOffset 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_ExternalTrigInjectedConvConfig @@ -149,29 +149,29 @@ Discarded input sections .text.ADC_GetSoftwareStartInjectedConvCmdStatus 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_AutoInjectedConvCmd - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_adc.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_InjectedDiscModeCmd - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_adc.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_GetInjectedConversionValue - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_adc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_ITConfig - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_adc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_GetFlagStatus 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_ClearFlag 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_GetITStatus - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_adc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_adc.o .text.ADC_ClearITPendingBit 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_adc.o - .debug_frame 0x00000000 0x2c4 THUMB Debug/../../obj/stm32f4xx_adc.o - .debug_info 0x00000000 0xd5a THUMB Debug/../../obj/stm32f4xx_adc.o - .debug_abbrev 0x00000000 0x207 THUMB Debug/../../obj/stm32f4xx_adc.o - .debug_loc 0x00000000 0xdb9 THUMB Debug/../../obj/stm32f4xx_adc.o + .debug_frame 0x00000000 0x2cc THUMB Debug/../../obj/stm32f4xx_adc.o + .debug_info 0x00000000 0xd5b THUMB Debug/../../obj/stm32f4xx_adc.o + .debug_abbrev 0x00000000 0x20a THUMB Debug/../../obj/stm32f4xx_adc.o + .debug_loc 0x00000000 0xdab THUMB Debug/../../obj/stm32f4xx_adc.o .debug_aranges 0x00000000 0x148 THUMB Debug/../../obj/stm32f4xx_adc.o .debug_ranges 0x00000000 0x138 THUMB Debug/../../obj/stm32f4xx_adc.o - .debug_line 0x00000000 0x55d THUMB Debug/../../obj/stm32f4xx_adc.o + .debug_line 0x00000000 0x5d1 THUMB Debug/../../obj/stm32f4xx_adc.o .debug_str 0x00000000 0x859 THUMB Debug/../../obj/stm32f4xx_adc.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_adc.o .ARM.attributes @@ -179,40 +179,38 @@ Discarded input sections .text 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_can.o .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_can.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_can.o - .text.CheckITStatus - 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_DeInit - 0x00000000 0x44 THUMB Debug/../../obj/stm32f4xx_can.o + 0x00000000 0x40 THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_Init - 0x00000000 0x11c THUMB Debug/../../obj/stm32f4xx_can.o + 0x00000000 0x104 THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_FilterInit 0x00000000 0x134 THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_StructInit - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_can.o + 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_SlaveStartBank 0x00000000 0x40 THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_DBGFreeze - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_can.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_TTComModeCmd - 0x00000000 0x60 THUMB Debug/../../obj/stm32f4xx_can.o + 0x00000000 0x5c THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_Transmit - 0x00000000 0xe8 THUMB Debug/../../obj/stm32f4xx_can.o + 0x00000000 0xd0 THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_TransmitStatus - 0x00000000 0x90 THUMB Debug/../../obj/stm32f4xx_can.o + 0x00000000 0x60 THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_CancelTransmit - 0x00000000 0x2c THUMB Debug/../../obj/stm32f4xx_can.o + 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_Receive - 0x00000000 0xbc THUMB Debug/../../obj/stm32f4xx_can.o + 0x00000000 0x98 THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_FIFORelease 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_MessagePending 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_OperatingModeRequest - 0x00000000 0xf8 THUMB Debug/../../obj/stm32f4xx_can.o + 0x00000000 0xe8 THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_Sleep 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_WakeUp - 0x00000000 0x44 THUMB Debug/../../obj/stm32f4xx_can.o + 0x00000000 0x38 THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_GetLastErrorCode 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_GetReceiveErrorCounter @@ -222,21 +220,21 @@ Discarded input sections .text.CAN_ITConfig 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_GetFlagStatus - 0x00000000 0x6c THUMB Debug/../../obj/stm32f4xx_can.o + 0x00000000 0x64 THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_ClearFlag - 0x00000000 0x3c THUMB Debug/../../obj/stm32f4xx_can.o + 0x00000000 0x34 THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_GetITStatus - 0x00000000 0x114 THUMB Debug/../../obj/stm32f4xx_can.o + 0x00000000 0xe4 THUMB Debug/../../obj/stm32f4xx_can.o .text.CAN_ClearITPendingBit - 0x00000000 0xbc THUMB Debug/../../obj/stm32f4xx_can.o - .debug_frame 0x00000000 0x1e4 THUMB Debug/../../obj/stm32f4xx_can.o - .debug_info 0x00000000 0xdf4 THUMB Debug/../../obj/stm32f4xx_can.o - .debug_abbrev 0x00000000 0x23e THUMB Debug/../../obj/stm32f4xx_can.o - .debug_loc 0x00000000 0xf06 THUMB Debug/../../obj/stm32f4xx_can.o + 0x00000000 0x80 THUMB Debug/../../obj/stm32f4xx_can.o + .debug_frame 0x00000000 0x1dc THUMB Debug/../../obj/stm32f4xx_can.o + .debug_info 0x00000000 0xd18 THUMB Debug/../../obj/stm32f4xx_can.o + .debug_abbrev 0x00000000 0x283 THUMB Debug/../../obj/stm32f4xx_can.o + .debug_loc 0x00000000 0xc55 THUMB Debug/../../obj/stm32f4xx_can.o .debug_aranges - 0x00000000 0xe0 THUMB Debug/../../obj/stm32f4xx_can.o - .debug_ranges 0x00000000 0xd0 THUMB Debug/../../obj/stm32f4xx_can.o - .debug_line 0x00000000 0x55e THUMB Debug/../../obj/stm32f4xx_can.o + 0x00000000 0xd8 THUMB Debug/../../obj/stm32f4xx_can.o + .debug_ranges 0x00000000 0xc8 THUMB Debug/../../obj/stm32f4xx_can.o + .debug_line 0x00000000 0x625 THUMB Debug/../../obj/stm32f4xx_can.o .debug_str 0x00000000 0x793 THUMB Debug/../../obj/stm32f4xx_can.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_can.o .ARM.attributes @@ -249,7 +247,7 @@ Discarded input sections .text.CRC_CalcCRC 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_crc.o .text.CRC_CalcBlockCRC - 0x00000000 0x5c THUMB Debug/../../obj/stm32f4xx_crc.o + 0x00000000 0x50 THUMB Debug/../../obj/stm32f4xx_crc.o .text.CRC_GetCRC 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_crc.o .text.CRC_SetIDRegister @@ -259,11 +257,11 @@ Discarded input sections .debug_frame 0x00000000 0x7c THUMB Debug/../../obj/stm32f4xx_crc.o .debug_info 0x00000000 0x1fe THUMB Debug/../../obj/stm32f4xx_crc.o .debug_abbrev 0x00000000 0x138 THUMB Debug/../../obj/stm32f4xx_crc.o - .debug_loc 0x00000000 0xad THUMB Debug/../../obj/stm32f4xx_crc.o + .debug_loc 0x00000000 0xaf THUMB Debug/../../obj/stm32f4xx_crc.o .debug_aranges 0x00000000 0x48 THUMB Debug/../../obj/stm32f4xx_crc.o .debug_ranges 0x00000000 0x38 THUMB Debug/../../obj/stm32f4xx_crc.o - .debug_line 0x00000000 0x23d THUMB Debug/../../obj/stm32f4xx_crc.o + .debug_line 0x00000000 0x24e THUMB Debug/../../obj/stm32f4xx_crc.o .debug_str 0x00000000 0x289 THUMB Debug/../../obj/stm32f4xx_crc.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_crc.o .ARM.attributes @@ -272,51 +270,51 @@ Discarded input sections .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_cryp.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_cryp.o .text.CRYP_DeInit - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_cryp.o - .text.CRYP_Init - 0x00000000 0x70 THUMB Debug/../../obj/stm32f4xx_cryp.o - .text.CRYP_StructInit - 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_cryp.o - .text.CRYP_KeyInit - 0x00000000 0x2c THUMB Debug/../../obj/stm32f4xx_cryp.o - .text.CRYP_KeyStructInit 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_cryp.o + .text.CRYP_Init + 0x00000000 0x68 THUMB Debug/../../obj/stm32f4xx_cryp.o + .text.CRYP_StructInit + 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_cryp.o + .text.CRYP_KeyInit + 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_cryp.o + .text.CRYP_KeyStructInit + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_cryp.o .text.CRYP_IVInit - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_cryp.o + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_cryp.o .text.CRYP_IVStructInit - 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_cryp.o + 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_cryp.o .text.CRYP_PhaseConfig 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_cryp.o .text.CRYP_FIFOFlush - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_cryp.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_cryp.o .text.CRYP_Cmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_cryp.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_cryp.o .text.CRYP_DataIn 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_cryp.o .text.CRYP_DataOut 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_cryp.o .text.CRYP_SaveContext - 0x00000000 0x108 THUMB Debug/../../obj/stm32f4xx_cryp.o + 0x00000000 0x104 THUMB Debug/../../obj/stm32f4xx_cryp.o .text.CRYP_RestoreContext - 0x00000000 0x90 THUMB Debug/../../obj/stm32f4xx_cryp.o + 0x00000000 0x8c THUMB Debug/../../obj/stm32f4xx_cryp.o .text.CRYP_DMACmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_cryp.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_cryp.o .text.CRYP_ITConfig - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_cryp.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_cryp.o .text.CRYP_GetITStatus 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_cryp.o .text.CRYP_GetCmdStatus 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_cryp.o .text.CRYP_GetFlagStatus - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_cryp.o - .debug_frame 0x00000000 0x160 THUMB Debug/../../obj/stm32f4xx_cryp.o - .debug_info 0x00000000 0x970 THUMB Debug/../../obj/stm32f4xx_cryp.o - .debug_abbrev 0x00000000 0x204 THUMB Debug/../../obj/stm32f4xx_cryp.o - .debug_loc 0x00000000 0x40c THUMB Debug/../../obj/stm32f4xx_cryp.o + 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_cryp.o + .debug_frame 0x00000000 0x178 THUMB Debug/../../obj/stm32f4xx_cryp.o + .debug_info 0x00000000 0x972 THUMB Debug/../../obj/stm32f4xx_cryp.o + .debug_abbrev 0x00000000 0x1ed THUMB Debug/../../obj/stm32f4xx_cryp.o + .debug_loc 0x00000000 0x448 THUMB Debug/../../obj/stm32f4xx_cryp.o .debug_aranges 0x00000000 0xb0 THUMB Debug/../../obj/stm32f4xx_cryp.o .debug_ranges 0x00000000 0xa0 THUMB Debug/../../obj/stm32f4xx_cryp.o - .debug_line 0x00000000 0x3fe THUMB Debug/../../obj/stm32f4xx_cryp.o + .debug_line 0x00000000 0x42d THUMB Debug/../../obj/stm32f4xx_cryp.o .debug_str 0x00000000 0x705 THUMB Debug/../../obj/stm32f4xx_cryp.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_cryp.o .ARM.attributes @@ -325,23 +323,23 @@ Discarded input sections .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o .text.CRYP_AES_ECB - 0x00000000 0x1f0 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o + 0x00000000 0x1cc THUMB Debug/../../obj/stm32f4xx_cryp_aes.o .text.CRYP_AES_CBC - 0x00000000 0x214 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o + 0x00000000 0x1ec THUMB Debug/../../obj/stm32f4xx_cryp_aes.o .text.CRYP_AES_CTR - 0x00000000 0x1bc THUMB Debug/../../obj/stm32f4xx_cryp_aes.o + 0x00000000 0x194 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o .text.CRYP_AES_GCM - 0x00000000 0x530 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o + 0x00000000 0x480 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o .text.CRYP_AES_CCM - 0x00000000 0x810 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o - .debug_frame 0x00000000 0x100 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o - .debug_info 0x00000000 0x2d5c THUMB Debug/../../obj/stm32f4xx_cryp_aes.o - .debug_abbrev 0x00000000 0x2b0 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o - .debug_loc 0x00000000 0x32b9 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o + 0x00000000 0x6e8 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o + .debug_frame 0x00000000 0xf8 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o + .debug_info 0x00000000 0x2ce6 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o + .debug_abbrev 0x00000000 0x2b9 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o + .debug_loc 0x00000000 0x3733 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o .debug_aranges 0x00000000 0x40 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o .debug_ranges 0x00000000 0x30 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o - .debug_line 0x00000000 0xc60 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o + .debug_line 0x00000000 0xdcb THUMB Debug/../../obj/stm32f4xx_cryp_aes.o .debug_str 0x00000000 0x5b8 THUMB Debug/../../obj/stm32f4xx_cryp_aes.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_cryp_aes.o .ARM.attributes @@ -350,17 +348,17 @@ Discarded input sections .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_cryp_des.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_cryp_des.o .text.CRYP_DES_ECB - 0x00000000 0xec THUMB Debug/../../obj/stm32f4xx_cryp_des.o + 0x00000000 0xc8 THUMB Debug/../../obj/stm32f4xx_cryp_des.o .text.CRYP_DES_CBC - 0x00000000 0x104 THUMB Debug/../../obj/stm32f4xx_cryp_des.o + 0x00000000 0xe0 THUMB Debug/../../obj/stm32f4xx_cryp_des.o .debug_frame 0x00000000 0x68 THUMB Debug/../../obj/stm32f4xx_cryp_des.o - .debug_info 0x00000000 0x7c1 THUMB Debug/../../obj/stm32f4xx_cryp_des.o + .debug_info 0x00000000 0x7bb THUMB Debug/../../obj/stm32f4xx_cryp_des.o .debug_abbrev 0x00000000 0x1f7 THUMB Debug/../../obj/stm32f4xx_cryp_des.o - .debug_loc 0x00000000 0x6b4 THUMB Debug/../../obj/stm32f4xx_cryp_des.o + .debug_loc 0x00000000 0x5f6 THUMB Debug/../../obj/stm32f4xx_cryp_des.o .debug_aranges 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_cryp_des.o .debug_ranges 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_cryp_des.o - .debug_line 0x00000000 0x30c THUMB Debug/../../obj/stm32f4xx_cryp_des.o + .debug_line 0x00000000 0x335 THUMB Debug/../../obj/stm32f4xx_cryp_des.o .debug_str 0x00000000 0x4b7 THUMB Debug/../../obj/stm32f4xx_cryp_des.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_cryp_des.o .ARM.attributes @@ -369,17 +367,17 @@ Discarded input sections .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_cryp_tdes.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_cryp_tdes.o .text.CRYP_TDES_ECB - 0x00000000 0x104 THUMB Debug/../../obj/stm32f4xx_cryp_tdes.o + 0x00000000 0xdc THUMB Debug/../../obj/stm32f4xx_cryp_tdes.o .text.CRYP_TDES_CBC - 0x00000000 0x11c THUMB Debug/../../obj/stm32f4xx_cryp_tdes.o + 0x00000000 0xf8 THUMB Debug/../../obj/stm32f4xx_cryp_tdes.o .debug_frame 0x00000000 0x68 THUMB Debug/../../obj/stm32f4xx_cryp_tdes.o - .debug_info 0x00000000 0x942 THUMB Debug/../../obj/stm32f4xx_cryp_tdes.o + .debug_info 0x00000000 0x93c THUMB Debug/../../obj/stm32f4xx_cryp_tdes.o .debug_abbrev 0x00000000 0x208 THUMB Debug/../../obj/stm32f4xx_cryp_tdes.o - .debug_loc 0x00000000 0x91c THUMB Debug/../../obj/stm32f4xx_cryp_tdes.o + .debug_loc 0x00000000 0x7f6 THUMB Debug/../../obj/stm32f4xx_cryp_tdes.o .debug_aranges 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_cryp_tdes.o .debug_ranges 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_cryp_tdes.o - .debug_line 0x00000000 0x36d THUMB Debug/../../obj/stm32f4xx_cryp_tdes.o + .debug_line 0x00000000 0x392 THUMB Debug/../../obj/stm32f4xx_cryp_tdes.o .debug_str 0x00000000 0x4bd THUMB Debug/../../obj/stm32f4xx_cryp_tdes.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_cryp_tdes.o .ARM.attributes @@ -390,44 +388,44 @@ Discarded input sections .text.DAC_DeInit 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_dac.o .text.DAC_Init - 0x00000000 0x34 THUMB Debug/../../obj/stm32f4xx_dac.o + 0x00000000 0x38 THUMB Debug/../../obj/stm32f4xx_dac.o .text.DAC_StructInit - 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_dac.o - .text.DAC_Cmd 0x00000000 0x34 THUMB Debug/../../obj/stm32f4xx_dac.o + 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_dac.o + .text.DAC_Cmd 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_dac.o .text.DAC_SoftwareTriggerCmd - 0x00000000 0x3c THUMB Debug/../../obj/stm32f4xx_dac.o - .text.DAC_DualSoftwareTriggerCmd 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_dac.o + .text.DAC_DualSoftwareTriggerCmd + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_dac.o .text.DAC_WaveGenerationCmd - 0x00000000 0x2c THUMB Debug/../../obj/stm32f4xx_dac.o + 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_dac.o .text.DAC_SetChannel1Data - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_dac.o + 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_dac.o .text.DAC_SetChannel2Data - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_dac.o + 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_dac.o .text.DAC_SetDualChannelData 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_dac.o .text.DAC_GetDataOutputValue - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_dac.o + 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_dac.o .text.DAC_DMACmd - 0x00000000 0x34 THUMB Debug/../../obj/stm32f4xx_dac.o - .text.DAC_ITConfig 0x00000000 0x2c THUMB Debug/../../obj/stm32f4xx_dac.o + .text.DAC_ITConfig + 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_dac.o .text.DAC_GetFlagStatus 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_dac.o .text.DAC_ClearFlag 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_dac.o .text.DAC_GetITStatus - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_dac.o + 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_dac.o .text.DAC_ClearITPendingBit 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_dac.o - .debug_frame 0x00000000 0x150 THUMB Debug/../../obj/stm32f4xx_dac.o - .debug_info 0x00000000 0x6dd THUMB Debug/../../obj/stm32f4xx_dac.o - .debug_abbrev 0x00000000 0x207 THUMB Debug/../../obj/stm32f4xx_dac.o - .debug_loc 0x00000000 0x685 THUMB Debug/../../obj/stm32f4xx_dac.o + .debug_frame 0x00000000 0x154 THUMB Debug/../../obj/stm32f4xx_dac.o + .debug_info 0x00000000 0x6e2 THUMB Debug/../../obj/stm32f4xx_dac.o + .debug_abbrev 0x00000000 0x20a THUMB Debug/../../obj/stm32f4xx_dac.o + .debug_loc 0x00000000 0x5ff THUMB Debug/../../obj/stm32f4xx_dac.o .debug_aranges 0x00000000 0xa0 THUMB Debug/../../obj/stm32f4xx_dac.o .debug_ranges 0x00000000 0x90 THUMB Debug/../../obj/stm32f4xx_dac.o - .debug_line 0x00000000 0x37c THUMB Debug/../../obj/stm32f4xx_dac.o + .debug_line 0x00000000 0x3ad THUMB Debug/../../obj/stm32f4xx_dac.o .debug_str 0x00000000 0x4a8 THUMB Debug/../../obj/stm32f4xx_dac.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_dac.o .ARM.attributes @@ -438,21 +436,21 @@ Discarded input sections .text.DBGMCU_GetREVID 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_dbgmcu.o .text.DBGMCU_GetDEVID - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_dbgmcu.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_dbgmcu.o .text.DBGMCU_Config - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_dbgmcu.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_dbgmcu.o .text.DBGMCU_APB1PeriphConfig - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_dbgmcu.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_dbgmcu.o .text.DBGMCU_APB2PeriphConfig - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_dbgmcu.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_dbgmcu.o .debug_frame 0x00000000 0x60 THUMB Debug/../../obj/stm32f4xx_dbgmcu.o - .debug_info 0x00000000 0x1e4 THUMB Debug/../../obj/stm32f4xx_dbgmcu.o - .debug_abbrev 0x00000000 0xd7 THUMB Debug/../../obj/stm32f4xx_dbgmcu.o - .debug_loc 0x00000000 0x132 THUMB Debug/../../obj/stm32f4xx_dbgmcu.o + .debug_info 0x00000000 0x1de THUMB Debug/../../obj/stm32f4xx_dbgmcu.o + .debug_abbrev 0x00000000 0xe6 THUMB Debug/../../obj/stm32f4xx_dbgmcu.o + .debug_loc 0x00000000 0xae THUMB Debug/../../obj/stm32f4xx_dbgmcu.o .debug_aranges 0x00000000 0x40 THUMB Debug/../../obj/stm32f4xx_dbgmcu.o .debug_ranges 0x00000000 0x30 THUMB Debug/../../obj/stm32f4xx_dbgmcu.o - .debug_line 0x00000000 0x222 THUMB Debug/../../obj/stm32f4xx_dbgmcu.o + .debug_line 0x00000000 0x225 THUMB Debug/../../obj/stm32f4xx_dbgmcu.o .debug_str 0x00000000 0x293 THUMB Debug/../../obj/stm32f4xx_dbgmcu.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_dbgmcu.o .ARM.attributes @@ -461,43 +459,43 @@ Discarded input sections .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_dcmi.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_dcmi.o .text.DCMI_DeInit - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_dcmi.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_dcmi.o .text.DCMI_Init - 0x00000000 0x44 THUMB Debug/../../obj/stm32f4xx_dcmi.o + 0x00000000 0x48 THUMB Debug/../../obj/stm32f4xx_dcmi.o .text.DCMI_StructInit 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_dcmi.o .text.DCMI_CROPConfig 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_dcmi.o .text.DCMI_CROPCmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_dcmi.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_dcmi.o .text.DCMI_SetEmbeddedSynchroCodes 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_dcmi.o .text.DCMI_JPEGCmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_dcmi.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_dcmi.o .text.DCMI_Cmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_dcmi.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_dcmi.o .text.DCMI_CaptureCmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_dcmi.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_dcmi.o .text.DCMI_ReadData 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_dcmi.o .text.DCMI_ITConfig - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_dcmi.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_dcmi.o .text.DCMI_GetFlagStatus - 0x00000000 0x2c THUMB Debug/../../obj/stm32f4xx_dcmi.o + 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_dcmi.o .text.DCMI_ClearFlag 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_dcmi.o .text.DCMI_GetITStatus 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_dcmi.o .text.DCMI_ClearITPendingBit 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_dcmi.o - .debug_frame 0x00000000 0x10c THUMB Debug/../../obj/stm32f4xx_dcmi.o - .debug_info 0x00000000 0x59b THUMB Debug/../../obj/stm32f4xx_dcmi.o + .debug_frame 0x00000000 0x128 THUMB Debug/../../obj/stm32f4xx_dcmi.o + .debug_info 0x00000000 0x59d THUMB Debug/../../obj/stm32f4xx_dcmi.o .debug_abbrev 0x00000000 0x1b8 THUMB Debug/../../obj/stm32f4xx_dcmi.o - .debug_loc 0x00000000 0x2d9 THUMB Debug/../../obj/stm32f4xx_dcmi.o + .debug_loc 0x00000000 0x367 THUMB Debug/../../obj/stm32f4xx_dcmi.o .debug_aranges 0x00000000 0x90 THUMB Debug/../../obj/stm32f4xx_dcmi.o .debug_ranges 0x00000000 0x80 THUMB Debug/../../obj/stm32f4xx_dcmi.o - .debug_line 0x00000000 0x343 THUMB Debug/../../obj/stm32f4xx_dcmi.o + .debug_line 0x00000000 0x37c THUMB Debug/../../obj/stm32f4xx_dcmi.o .debug_str 0x00000000 0x517 THUMB Debug/../../obj/stm32f4xx_dcmi.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_dcmi.o .ARM.attributes @@ -506,16 +504,16 @@ Discarded input sections .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_dma.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_dma.o .text.DMA_DeInit - 0x00000000 0x1f4 THUMB Debug/../../obj/stm32f4xx_dma.o + 0x00000000 0x1ec THUMB Debug/../../obj/stm32f4xx_dma.o .text.DMA_Init - 0x00000000 0x58 THUMB Debug/../../obj/stm32f4xx_dma.o + 0x00000000 0x88 THUMB Debug/../../obj/stm32f4xx_dma.o .text.DMA_StructInit 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_dma.o - .text.DMA_Cmd 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_dma.o + .text.DMA_Cmd 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_dma.o .text.DMA_PeriphIncOffsetSizeConfig - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_dma.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_dma.o .text.DMA_FlowControllerConfig - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_dma.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_dma.o .text.DMA_SetCurrDataCounter 0x00000000 0x4 THUMB Debug/../../obj/stm32f4xx_dma.o .text.DMA_GetCurrDataCounter @@ -523,7 +521,7 @@ Discarded input sections .text.DMA_DoubleBufferModeConfig 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_dma.o .text.DMA_DoubleBufferModeCmd - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_dma.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_dma.o .text.DMA_MemoryTargetConfig 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_dma.o .text.DMA_GetCurrentMemoryTarget @@ -537,19 +535,19 @@ Discarded input sections .text.DMA_ClearFlag 0x00000000 0x38 THUMB Debug/../../obj/stm32f4xx_dma.o .text.DMA_ITConfig - 0x00000000 0x44 THUMB Debug/../../obj/stm32f4xx_dma.o + 0x00000000 0x40 THUMB Debug/../../obj/stm32f4xx_dma.o .text.DMA_GetITStatus - 0x00000000 0x64 THUMB Debug/../../obj/stm32f4xx_dma.o + 0x00000000 0x58 THUMB Debug/../../obj/stm32f4xx_dma.o .text.DMA_ClearITPendingBit 0x00000000 0x38 THUMB Debug/../../obj/stm32f4xx_dma.o - .debug_frame 0x00000000 0x17c THUMB Debug/../../obj/stm32f4xx_dma.o + .debug_frame 0x00000000 0x194 THUMB Debug/../../obj/stm32f4xx_dma.o .debug_info 0x00000000 0x7a7 THUMB Debug/../../obj/stm32f4xx_dma.o .debug_abbrev 0x00000000 0x1a2 THUMB Debug/../../obj/stm32f4xx_dma.o - .debug_loc 0x00000000 0x695 THUMB Debug/../../obj/stm32f4xx_dma.o + .debug_loc 0x00000000 0x6f9 THUMB Debug/../../obj/stm32f4xx_dma.o .debug_aranges 0x00000000 0xb0 THUMB Debug/../../obj/stm32f4xx_dma.o .debug_ranges 0x00000000 0xa0 THUMB Debug/../../obj/stm32f4xx_dma.o - .debug_line 0x00000000 0x3e6 THUMB Debug/../../obj/stm32f4xx_dma.o + .debug_line 0x00000000 0x46b THUMB Debug/../../obj/stm32f4xx_dma.o .debug_str 0x00000000 0x58a THUMB Debug/../../obj/stm32f4xx_dma.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_dma.o .ARM.attributes @@ -560,9 +558,9 @@ Discarded input sections .text.EXTI_DeInit 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_exti.o .text.EXTI_Init - 0x00000000 0x98 THUMB Debug/../../obj/stm32f4xx_exti.o + 0x00000000 0x7c THUMB Debug/../../obj/stm32f4xx_exti.o .text.EXTI_StructInit - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_exti.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_exti.o .text.EXTI_GenerateSWInterrupt 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_exti.o .text.EXTI_GetFlagStatus @@ -573,14 +571,14 @@ Discarded input sections 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_exti.o .text.EXTI_ClearITPendingBit 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_exti.o - .debug_frame 0x00000000 0x9c THUMB Debug/../../obj/stm32f4xx_exti.o + .debug_frame 0x00000000 0xa0 THUMB Debug/../../obj/stm32f4xx_exti.o .debug_info 0x00000000 0x367 THUMB Debug/../../obj/stm32f4xx_exti.o .debug_abbrev 0x00000000 0x1d6 THUMB Debug/../../obj/stm32f4xx_exti.o - .debug_loc 0x00000000 0x264 THUMB Debug/../../obj/stm32f4xx_exti.o + .debug_loc 0x00000000 0x267 THUMB Debug/../../obj/stm32f4xx_exti.o .debug_aranges 0x00000000 0x58 THUMB Debug/../../obj/stm32f4xx_exti.o .debug_ranges 0x00000000 0x48 THUMB Debug/../../obj/stm32f4xx_exti.o - .debug_line 0x00000000 0x2be THUMB Debug/../../obj/stm32f4xx_exti.o + .debug_line 0x00000000 0x2da THUMB Debug/../../obj/stm32f4xx_exti.o .debug_str 0x00000000 0x3ac THUMB Debug/../../obj/stm32f4xx_exti.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_exti.o .ARM.attributes @@ -591,17 +589,17 @@ Discarded input sections .text.FLASH_SetLatency 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_flash.o .text.FLASH_PrefetchBufferCmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_flash.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_flash.o .text.FLASH_InstructionCacheCmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_flash.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_flash.o .text.FLASH_DataCacheCmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_flash.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_flash.o .text.FLASH_InstructionCacheReset 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_flash.o .text.FLASH_DataCacheReset 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_flash.o .text.FLASH_OB_Unlock - 0x00000000 0x30 THUMB Debug/../../obj/stm32f4xx_flash.o + 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_flash.o .text.FLASH_OB_Lock 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_flash.o .text.FLASH_OB_BORConfig @@ -617,19 +615,19 @@ Discarded input sections .text.FLASH_OB_GetBOR 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_flash.o .text.FLASH_ITConfig - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_flash.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_flash.o .text.FLASH_GetFlagStatus 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_flash.o .text.FLASH_OB_Launch - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_flash.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_flash.o .text.FLASH_OB_UserConfig 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_flash.o .text.FLASH_OB_RDPConfig 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_flash.o .text.FLASH_OB_WRP1Config - 0x00000000 0x38 THUMB Debug/../../obj/stm32f4xx_flash.o + 0x00000000 0x30 THUMB Debug/../../obj/stm32f4xx_flash.o .text.FLASH_OB_WRPConfig - 0x00000000 0x38 THUMB Debug/../../obj/stm32f4xx_flash.o + 0x00000000 0x30 THUMB Debug/../../obj/stm32f4xx_flash.o .text.FLASH_ProgramByte 0x00000000 0x3c THUMB Debug/../../obj/stm32f4xx_flash.o .text.FLASH_ProgramHalfWord @@ -637,56 +635,56 @@ Discarded input sections .text.FLASH_ProgramDoubleWord 0x00000000 0x44 THUMB Debug/../../obj/stm32f4xx_flash.o .text.FLASH_EraseAllSectors - 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_flash.o + 0x00000000 0x4 THUMB Debug/../../obj/stm32f4xx_flash.o .text 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_fsmc.o .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_fsmc.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_fsmc.o .text.FSMC_NORSRAMDeInit 0x00000000 0x3c THUMB Debug/../../obj/stm32f4xx_fsmc.o .text.FSMC_NORSRAMInit - 0x00000000 0xd4 THUMB Debug/../../obj/stm32f4xx_fsmc.o + 0x00000000 0xd8 THUMB Debug/../../obj/stm32f4xx_fsmc.o .text.FSMC_NORSRAMStructInit - 0x00000000 0x70 THUMB Debug/../../obj/stm32f4xx_fsmc.o + 0x00000000 0x50 THUMB Debug/../../obj/stm32f4xx_fsmc.o .text.FSMC_NORSRAMCmd 0x00000000 0x2c THUMB Debug/../../obj/stm32f4xx_fsmc.o .text.FSMC_NANDDeInit - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_fsmc.o - .text.FSMC_NANDInit - 0x00000000 0x6c THUMB Debug/../../obj/stm32f4xx_fsmc.o - .text.FSMC_NANDStructInit - 0x00000000 0x3c THUMB Debug/../../obj/stm32f4xx_fsmc.o - .text.FSMC_NANDCmd - 0x00000000 0x34 THUMB Debug/../../obj/stm32f4xx_fsmc.o - .text.FSMC_NANDECCCmd - 0x00000000 0x34 THUMB Debug/../../obj/stm32f4xx_fsmc.o - .text.FSMC_GetECC - 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_fsmc.o - .text.FSMC_PCCARDDeInit 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_fsmc.o - .text.FSMC_PCCARDInit - 0x00000000 0x70 THUMB Debug/../../obj/stm32f4xx_fsmc.o - .text.FSMC_PCCARDStructInit - 0x00000000 0x40 THUMB Debug/../../obj/stm32f4xx_fsmc.o - .text.FSMC_PCCARDCmd - 0x00000000 0x2c THUMB Debug/../../obj/stm32f4xx_fsmc.o - .text.FSMC_ITConfig - 0x00000000 0x5c THUMB Debug/../../obj/stm32f4xx_fsmc.o - .text.FSMC_GetFlagStatus - 0x00000000 0x2c THUMB Debug/../../obj/stm32f4xx_fsmc.o - .text.FSMC_ClearFlag + .text.FSMC_NANDInit + 0x00000000 0x94 THUMB Debug/../../obj/stm32f4xx_fsmc.o + .text.FSMC_NANDStructInit 0x00000000 0x30 THUMB Debug/../../obj/stm32f4xx_fsmc.o + .text.FSMC_NANDCmd + 0x00000000 0x44 THUMB Debug/../../obj/stm32f4xx_fsmc.o + .text.FSMC_NANDECCCmd + 0x00000000 0x44 THUMB Debug/../../obj/stm32f4xx_fsmc.o + .text.FSMC_GetECC + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_fsmc.o + .text.FSMC_PCCARDDeInit + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_fsmc.o + .text.FSMC_PCCARDInit + 0x00000000 0x64 THUMB Debug/../../obj/stm32f4xx_fsmc.o + .text.FSMC_PCCARDStructInit + 0x00000000 0x30 THUMB Debug/../../obj/stm32f4xx_fsmc.o + .text.FSMC_PCCARDCmd + 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_fsmc.o + .text.FSMC_ITConfig + 0x00000000 0x70 THUMB Debug/../../obj/stm32f4xx_fsmc.o + .text.FSMC_GetFlagStatus + 0x00000000 0x30 THUMB Debug/../../obj/stm32f4xx_fsmc.o + .text.FSMC_ClearFlag + 0x00000000 0x3c THUMB Debug/../../obj/stm32f4xx_fsmc.o .text.FSMC_GetITStatus 0x00000000 0x38 THUMB Debug/../../obj/stm32f4xx_fsmc.o .text.FSMC_ClearITPendingBit - 0x00000000 0x30 THUMB Debug/../../obj/stm32f4xx_fsmc.o - .debug_frame 0x00000000 0x170 THUMB Debug/../../obj/stm32f4xx_fsmc.o - .debug_info 0x00000000 0x9b9 THUMB Debug/../../obj/stm32f4xx_fsmc.o - .debug_abbrev 0x00000000 0x1ac THUMB Debug/../../obj/stm32f4xx_fsmc.o - .debug_loc 0x00000000 0x6b7 THUMB Debug/../../obj/stm32f4xx_fsmc.o + 0x00000000 0x3c THUMB Debug/../../obj/stm32f4xx_fsmc.o + .debug_frame 0x00000000 0x1bc THUMB Debug/../../obj/stm32f4xx_fsmc.o + .debug_info 0x00000000 0x9b4 THUMB Debug/../../obj/stm32f4xx_fsmc.o + .debug_abbrev 0x00000000 0x1a1 THUMB Debug/../../obj/stm32f4xx_fsmc.o + .debug_loc 0x00000000 0x877 THUMB Debug/../../obj/stm32f4xx_fsmc.o .debug_aranges 0x00000000 0xb0 THUMB Debug/../../obj/stm32f4xx_fsmc.o .debug_ranges 0x00000000 0xa0 THUMB Debug/../../obj/stm32f4xx_fsmc.o - .debug_line 0x00000000 0x441 THUMB Debug/../../obj/stm32f4xx_fsmc.o + .debug_line 0x00000000 0x4e8 THUMB Debug/../../obj/stm32f4xx_fsmc.o .debug_str 0x00000000 0x7d2 THUMB Debug/../../obj/stm32f4xx_fsmc.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_fsmc.o .ARM.attributes @@ -695,7 +693,7 @@ Discarded input sections .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_gpio.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_gpio.o .text.GPIO_DeInit - 0x00000000 0x158 THUMB Debug/../../obj/stm32f4xx_gpio.o + 0x00000000 0x128 THUMB Debug/../../obj/stm32f4xx_gpio.o .text.GPIO_StructInit 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_gpio.o .text.GPIO_PinLockConfig @@ -720,11 +718,11 @@ Discarded input sections .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_hash.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_hash.o .text.HASH_DeInit - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_hash.o + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_hash.o .text.HASH_Init - 0x00000000 0x58 THUMB Debug/../../obj/stm32f4xx_hash.o + 0x00000000 0x50 THUMB Debug/../../obj/stm32f4xx_hash.o .text.HASH_StructInit - 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_hash.o + 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_hash.o .text.HASH_Reset 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_hash.o .text.HASH_SetLastWordValidBitsNbr @@ -738,15 +736,15 @@ Discarded input sections .text.HASH_StartDigest 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_hash.o .text.HASH_SaveContext - 0x00000000 0x54 THUMB Debug/../../obj/stm32f4xx_hash.o + 0x00000000 0x3c THUMB Debug/../../obj/stm32f4xx_hash.o .text.HASH_RestoreContext - 0x00000000 0x5c THUMB Debug/../../obj/stm32f4xx_hash.o + 0x00000000 0x44 THUMB Debug/../../obj/stm32f4xx_hash.o .text.HASH_AutoStartDigest - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_hash.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_hash.o .text.HASH_DMACmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_hash.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_hash.o .text.HASH_ITConfig - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_hash.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_hash.o .text.HASH_GetFlagStatus 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_hash.o .text.HASH_ClearFlag @@ -755,14 +753,14 @@ Discarded input sections 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_hash.o .text.HASH_ClearITPendingBit 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_hash.o - .debug_frame 0x00000000 0x154 THUMB Debug/../../obj/stm32f4xx_hash.o + .debug_frame 0x00000000 0x160 THUMB Debug/../../obj/stm32f4xx_hash.o .debug_info 0x00000000 0x633 THUMB Debug/../../obj/stm32f4xx_hash.o - .debug_abbrev 0x00000000 0x245 THUMB Debug/../../obj/stm32f4xx_hash.o - .debug_loc 0x00000000 0x2f2 THUMB Debug/../../obj/stm32f4xx_hash.o + .debug_abbrev 0x00000000 0x248 THUMB Debug/../../obj/stm32f4xx_hash.o + .debug_loc 0x00000000 0x2fc THUMB Debug/../../obj/stm32f4xx_hash.o .debug_aranges 0x00000000 0xa8 THUMB Debug/../../obj/stm32f4xx_hash.o .debug_ranges 0x00000000 0x98 THUMB Debug/../../obj/stm32f4xx_hash.o - .debug_line 0x00000000 0x3a4 THUMB Debug/../../obj/stm32f4xx_hash.o + .debug_line 0x00000000 0x3bf THUMB Debug/../../obj/stm32f4xx_hash.o .debug_str 0x00000000 0x4b0 THUMB Debug/../../obj/stm32f4xx_hash.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_hash.o .ARM.attributes @@ -771,17 +769,17 @@ Discarded input sections .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_hash_md5.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_hash_md5.o .text.HASH_MD5 - 0x00000000 0xe4 THUMB Debug/../../obj/stm32f4xx_hash_md5.o + 0x00000000 0xc0 THUMB Debug/../../obj/stm32f4xx_hash_md5.o .text.HMAC_MD5 - 0x00000000 0x234 THUMB Debug/../../obj/stm32f4xx_hash_md5.o + 0x00000000 0x1d0 THUMB Debug/../../obj/stm32f4xx_hash_md5.o .debug_frame 0x00000000 0x68 THUMB Debug/../../obj/stm32f4xx_hash_md5.o - .debug_info 0x00000000 0x718 THUMB Debug/../../obj/stm32f4xx_hash_md5.o - .debug_abbrev 0x00000000 0x1ed THUMB Debug/../../obj/stm32f4xx_hash_md5.o - .debug_loc 0x00000000 0x689 THUMB Debug/../../obj/stm32f4xx_hash_md5.o + .debug_info 0x00000000 0x721 THUMB Debug/../../obj/stm32f4xx_hash_md5.o + .debug_abbrev 0x00000000 0x222 THUMB Debug/../../obj/stm32f4xx_hash_md5.o + .debug_loc 0x00000000 0x584 THUMB Debug/../../obj/stm32f4xx_hash_md5.o .debug_aranges 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_hash_md5.o - .debug_ranges 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_hash_md5.o - .debug_line 0x00000000 0x38e THUMB Debug/../../obj/stm32f4xx_hash_md5.o + .debug_ranges 0x00000000 0x48 THUMB Debug/../../obj/stm32f4xx_hash_md5.o + .debug_line 0x00000000 0x406 THUMB Debug/../../obj/stm32f4xx_hash_md5.o .debug_str 0x00000000 0x3ad THUMB Debug/../../obj/stm32f4xx_hash_md5.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_hash_md5.o .ARM.attributes @@ -790,17 +788,17 @@ Discarded input sections .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_hash_sha1.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_hash_sha1.o .text.HASH_SHA1 - 0x00000000 0xe4 THUMB Debug/../../obj/stm32f4xx_hash_sha1.o + 0x00000000 0xc4 THUMB Debug/../../obj/stm32f4xx_hash_sha1.o .text.HMAC_SHA1 - 0x00000000 0x234 THUMB Debug/../../obj/stm32f4xx_hash_sha1.o + 0x00000000 0x1d4 THUMB Debug/../../obj/stm32f4xx_hash_sha1.o .debug_frame 0x00000000 0x68 THUMB Debug/../../obj/stm32f4xx_hash_sha1.o - .debug_info 0x00000000 0x779 THUMB Debug/../../obj/stm32f4xx_hash_sha1.o - .debug_abbrev 0x00000000 0x1ed THUMB Debug/../../obj/stm32f4xx_hash_sha1.o - .debug_loc 0x00000000 0x715 THUMB Debug/../../obj/stm32f4xx_hash_sha1.o + .debug_info 0x00000000 0x781 THUMB Debug/../../obj/stm32f4xx_hash_sha1.o + .debug_abbrev 0x00000000 0x222 THUMB Debug/../../obj/stm32f4xx_hash_sha1.o + .debug_loc 0x00000000 0x5fc THUMB Debug/../../obj/stm32f4xx_hash_sha1.o .debug_aranges 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_hash_sha1.o - .debug_ranges 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_hash_sha1.o - .debug_line 0x00000000 0x3a7 THUMB Debug/../../obj/stm32f4xx_hash_sha1.o + .debug_ranges 0x00000000 0x48 THUMB Debug/../../obj/stm32f4xx_hash_sha1.o + .debug_line 0x00000000 0x41d THUMB Debug/../../obj/stm32f4xx_hash_sha1.o .debug_str 0x00000000 0x3b2 THUMB Debug/../../obj/stm32f4xx_hash_sha1.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_hash_sha1.o .ARM.attributes @@ -809,82 +807,82 @@ Discarded input sections .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_i2c.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_DeInit - 0x00000000 0x74 THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x70 THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_Init - 0x00000000 0x100 THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0xe8 THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_StructInit - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_i2c.o - .text.I2C_Cmd 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_i2c.o + .text.I2C_Cmd 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_AnalogFilterCmd - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_DigitalFilterConfig - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_GenerateSTART - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_GenerateSTOP - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_Send7bitAddress - 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_AcknowledgeConfig - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_OwnAddress2Config - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_DualAddressCmd - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_GeneralCallCmd - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_SoftwareResetCmd - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_StretchClockCmd - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_FastModeDutyCycleConfig - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_i2c.o - .text.I2C_NACKPositionConfig - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_i2c.o - .text.I2C_SMBusAlertConfig - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_i2c.o - .text.I2C_ARPCmd 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_i2c.o + .text.I2C_NACKPositionConfig + 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_i2c.o + .text.I2C_SMBusAlertConfig + 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_i2c.o + .text.I2C_ARPCmd + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_SendData 0x00000000 0x4 THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_ReceiveData 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_TransmitPEC - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_PECPositionConfig - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_i2c.o - .text.I2C_CalculatePEC 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_i2c.o + .text.I2C_CalculatePEC + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_GetPEC 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_DMACmd - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_DMALastTransferCmd - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_ReadRegister - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_i2c.o - .text.I2C_ITConfig 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_i2c.o + .text.I2C_ITConfig + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_CheckEvent - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_GetLastEvent 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_GetFlagStatus - 0x00000000 0x40 THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x38 THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_ClearFlag - 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_GetITStatus - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_i2c.o .text.I2C_ClearITPendingBit - 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_i2c.o + 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_i2c.o .debug_frame 0x00000000 0x274 THUMB Debug/../../obj/stm32f4xx_i2c.o - .debug_info 0x00000000 0xd25 THUMB Debug/../../obj/stm32f4xx_i2c.o - .debug_abbrev 0x00000000 0x1d5 THUMB Debug/../../obj/stm32f4xx_i2c.o - .debug_loc 0x00000000 0xca5 THUMB Debug/../../obj/stm32f4xx_i2c.o + .debug_info 0x00000000 0xd28 THUMB Debug/../../obj/stm32f4xx_i2c.o + .debug_abbrev 0x00000000 0x1f3 THUMB Debug/../../obj/stm32f4xx_i2c.o + .debug_loc 0x00000000 0xc83 THUMB Debug/../../obj/stm32f4xx_i2c.o .debug_aranges 0x00000000 0x130 THUMB Debug/../../obj/stm32f4xx_i2c.o .debug_ranges 0x00000000 0x120 THUMB Debug/../../obj/stm32f4xx_i2c.o - .debug_line 0x00000000 0x505 THUMB Debug/../../obj/stm32f4xx_i2c.o + .debug_line 0x00000000 0x57d THUMB Debug/../../obj/stm32f4xx_i2c.o .debug_str 0x00000000 0x726 THUMB Debug/../../obj/stm32f4xx_i2c.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_i2c.o .ARM.attributes @@ -936,21 +934,21 @@ Discarded input sections .text.PWR_FlashPowerDownCmd 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_pwr.o .text.PWR_EnterSTOPMode - 0x00000000 0x40 THUMB Debug/../../obj/stm32f4xx_pwr.o + 0x00000000 0x44 THUMB Debug/../../obj/stm32f4xx_pwr.o .text.PWR_EnterSTANDBYMode 0x00000000 0x2c THUMB Debug/../../obj/stm32f4xx_pwr.o .text.PWR_GetFlagStatus 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_pwr.o .text.PWR_ClearFlag 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_pwr.o - .debug_frame 0x00000000 0xdc THUMB Debug/../../obj/stm32f4xx_pwr.o - .debug_info 0x00000000 0x582 THUMB Debug/../../obj/stm32f4xx_pwr.o - .debug_abbrev 0x00000000 0x1d4 THUMB Debug/../../obj/stm32f4xx_pwr.o - .debug_loc 0x00000000 0x1d0 THUMB Debug/../../obj/stm32f4xx_pwr.o + .debug_frame 0x00000000 0xe8 THUMB Debug/../../obj/stm32f4xx_pwr.o + .debug_info 0x00000000 0x584 THUMB Debug/../../obj/stm32f4xx_pwr.o + .debug_abbrev 0x00000000 0x1f1 THUMB Debug/../../obj/stm32f4xx_pwr.o + .debug_loc 0x00000000 0x1fb THUMB Debug/../../obj/stm32f4xx_pwr.o .debug_aranges 0x00000000 0x78 THUMB Debug/../../obj/stm32f4xx_pwr.o .debug_ranges 0x00000000 0x68 THUMB Debug/../../obj/stm32f4xx_pwr.o - .debug_line 0x00000000 0x30f THUMB Debug/../../obj/stm32f4xx_pwr.o + .debug_line 0x00000000 0x32b THUMB Debug/../../obj/stm32f4xx_pwr.o .debug_str 0x00000000 0x3dd THUMB Debug/../../obj/stm32f4xx_pwr.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_pwr.o .ARM.attributes @@ -959,23 +957,25 @@ Discarded input sections .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_rcc.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_DeInit - 0x00000000 0x44 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x00000000 0x48 THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_HSEConfig - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_rcc.o + .text.RCC_WaitForHSEStartUp + 0x00000000 0x40 THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_AdjustHSICalibrationValue 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_HSICmd 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_LSEConfig - 0x00000000 0x3c THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_LSICmd 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_PLLConfig - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_PLLCmd 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_PLLI2SConfig - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_PLLI2SCmd 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_ClockSecuritySystemCmd @@ -995,7 +995,7 @@ Discarded input sections .text.RCC_PCLK2Config 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_RTCCLKConfig - 0x00000000 0x3c THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x00000000 0x38 THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_RTCCLKCmd 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_BackupResetCmd @@ -1004,32 +1004,28 @@ Discarded input sections 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_TIMCLKPresConfig 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_rcc.o - .text.RCC_AHB2PeriphClockCmd - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_AHB3PeriphClockCmd - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_AHB2PeriphResetCmd - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_AHB3PeriphResetCmd - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_APB1PeriphResetCmd - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_AHB1PeriphClockLPModeCmd - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_AHB2PeriphClockLPModeCmd - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_AHB3PeriphClockLPModeCmd - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_APB1PeriphClockLPModeCmd - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_APB2PeriphClockLPModeCmd - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_ITConfig - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_GetFlagStatus - 0x00000000 0x34 THUMB Debug/../../obj/stm32f4xx_rcc.o - .text.RCC_WaitForHSEStartUp - 0x00000000 0x3c THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x00000000 0x30 THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_ClearFlag 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_rcc.o .text.RCC_GetITStatus @@ -1040,12 +1036,12 @@ Discarded input sections .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_rng.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_rng.o .text.RNG_DeInit - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rng.o - .text.RNG_Cmd 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_rng.o + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_rng.o + .text.RNG_Cmd 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rng.o .text.RNG_GetRandomNumber 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_rng.o .text.RNG_ITConfig - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_rng.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rng.o .text.RNG_GetFlagStatus 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_rng.o .text.RNG_ClearFlag @@ -1053,15 +1049,15 @@ Discarded input sections .text.RNG_GetITStatus 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_rng.o .text.RNG_ClearITPendingBit - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_rng.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_rng.o .debug_frame 0x00000000 0x9c THUMB Debug/../../obj/stm32f4xx_rng.o - .debug_info 0x00000000 0x2d2 THUMB Debug/../../obj/stm32f4xx_rng.o - .debug_abbrev 0x00000000 0x17b THUMB Debug/../../obj/stm32f4xx_rng.o - .debug_loc 0x00000000 0x164 THUMB Debug/../../obj/stm32f4xx_rng.o + .debug_info 0x00000000 0x2d3 THUMB Debug/../../obj/stm32f4xx_rng.o + .debug_abbrev 0x00000000 0x17e THUMB Debug/../../obj/stm32f4xx_rng.o + .debug_loc 0x00000000 0x17a THUMB Debug/../../obj/stm32f4xx_rng.o .debug_aranges 0x00000000 0x58 THUMB Debug/../../obj/stm32f4xx_rng.o .debug_ranges 0x00000000 0x48 THUMB Debug/../../obj/stm32f4xx_rng.o - .debug_line 0x00000000 0x29f THUMB Debug/../../obj/stm32f4xx_rng.o + .debug_line 0x00000000 0x2a3 THUMB Debug/../../obj/stm32f4xx_rng.o .debug_str 0x00000000 0x2d9 THUMB Debug/../../obj/stm32f4xx_rng.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_rng.o .ARM.attributes @@ -1069,88 +1065,84 @@ Discarded input sections .text 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_rtc.o .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_rtc.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_rtc.o - .text.RTC_ByteToBcd2 - 0x00000000 0x6c THUMB Debug/../../obj/stm32f4xx_rtc.o - .text.RTC_Bcd2ToByte - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_StructInit - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_WriteProtectionCmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_EnterInitMode - 0x00000000 0x60 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x48 THUMB Debug/../../obj/stm32f4xx_rtc.o + .text.RTC_Init + 0x00000000 0x54 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_ExitInitMode 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_rtc.o - .text.RTC_Init - 0x00000000 0x64 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_WaitForSynchro - 0x00000000 0x60 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x4c THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_DeInit - 0x00000000 0xd0 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x9c THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_RefClockCmd - 0x00000000 0x60 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x4c THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_BypassShadowCmd - 0x00000000 0x48 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x30 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_SetTime - 0x00000000 0xd4 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x16c THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_TimeStructInit - 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_GetTime - 0x00000000 0x48 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x64 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_GetSubSecond 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_SetDate - 0x00000000 0xbc THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x158 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_DateStructInit - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_GetDate - 0x00000000 0x44 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x60 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_SetAlarm - 0x00000000 0xd4 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x1b8 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_AlarmStructInit - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_GetAlarm - 0x00000000 0x68 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0xa8 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_AlarmCmd - 0x00000000 0x8c THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x68 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_AlarmSubSecondConfig - 0x00000000 0x3c THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x30 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_GetAlarmSubSecond - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_WakeUpClockConfig - 0x00000000 0x2c THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_SetWakeUpCounter - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_GetWakeUpCounter 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_WakeUpCmd - 0x00000000 0x88 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x60 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_DayLightSavingConfig - 0x00000000 0x2c THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_GetStoreOperation 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_OutputConfig - 0x00000000 0x2c THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_CoarseCalibConfig - 0x00000000 0x4c THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x38 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_CoarseCalibCmd - 0x00000000 0x60 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x4c THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_CalibOutputCmd - 0x00000000 0x48 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x30 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_CalibOutputConfig - 0x00000000 0x2c THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_SmoothCalibConfig - 0x00000000 0x90 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x68 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_TimeStampCmd - 0x00000000 0x3c THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x38 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_GetTimeStamp - 0x00000000 0x7c THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0xb8 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_GetTimeStampSubSecond 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_TamperTriggerConfig - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_TamperCmd - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_TamperFilterConfig 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_TamperSamplingFreqConfig @@ -1158,13 +1150,13 @@ Discarded input sections .text.RTC_TamperPinsPrechargeDuration 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_TimeStampOnTamperDetectionCmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_TamperPullUpCmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_WriteBackupRegister - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_ReadBackupRegister - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_TamperPinSelection 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_TimeStampPinSelection @@ -1172,25 +1164,25 @@ Discarded input sections .text.RTC_OutputTypeConfig 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_SynchroShiftConfig - 0x00000000 0xa8 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x78 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_ITConfig - 0x00000000 0x64 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x4c THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_GetFlagStatus 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_ClearFlag 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_GetITStatus - 0x00000000 0x38 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x34 THUMB Debug/../../obj/stm32f4xx_rtc.o .text.RTC_ClearITPendingBit 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_rtc.o - .debug_frame 0x00000000 0x4bc THUMB Debug/../../obj/stm32f4xx_rtc.o - .debug_info 0x00000000 0x145a THUMB Debug/../../obj/stm32f4xx_rtc.o - .debug_abbrev 0x00000000 0x1e5 THUMB Debug/../../obj/stm32f4xx_rtc.o - .debug_loc 0x00000000 0x1724 THUMB Debug/../../obj/stm32f4xx_rtc.o + .debug_frame 0x00000000 0x4b0 THUMB Debug/../../obj/stm32f4xx_rtc.o + .debug_info 0x00000000 0x17c3 THUMB Debug/../../obj/stm32f4xx_rtc.o + .debug_abbrev 0x00000000 0x290 THUMB Debug/../../obj/stm32f4xx_rtc.o + .debug_loc 0x00000000 0x1dc8 THUMB Debug/../../obj/stm32f4xx_rtc.o .debug_aranges - 0x00000000 0x1e0 THUMB Debug/../../obj/stm32f4xx_rtc.o - .debug_ranges 0x00000000 0x1d0 THUMB Debug/../../obj/stm32f4xx_rtc.o - .debug_line 0x00000000 0x821 THUMB Debug/../../obj/stm32f4xx_rtc.o + 0x00000000 0x1d0 THUMB Debug/../../obj/stm32f4xx_rtc.o + .debug_ranges 0x00000000 0x750 THUMB Debug/../../obj/stm32f4xx_rtc.o + .debug_line 0x00000000 0xa56 THUMB Debug/../../obj/stm32f4xx_rtc.o .debug_str 0x00000000 0xb91 THUMB Debug/../../obj/stm32f4xx_rtc.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_rtc.o .ARM.attributes @@ -1199,11 +1191,11 @@ Discarded input sections .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_sdio.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_sdio.o .text.SDIO_StructInit - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_sdio.o .text.SDIO_CmdStructInit 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_sdio.o .text.SDIO_DataStructInit - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_sdio.o .text.SDIO_GetDataCounter 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_sdio.o .text.SDIO_GetFIFOCount @@ -1221,13 +1213,13 @@ Discarded input sections .text.SDIO_CommandCompletionCmd 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_sdio.o .text.SDIO_CEATAITCmd - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_sdio.o .text.SDIO_SendCEATACmd 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_sdio.o .text.SDIO_DMACmd 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_sdio.o .text.SDIO_ITConfig - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_sdio.o .text.SDIO_GetITStatus 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_sdio.o .text.SDIO_ClearITPendingBit @@ -1236,35 +1228,35 @@ Discarded input sections .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_spi.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_spi.o .text.SPI_I2S_DeInit - 0x00000000 0xe8 THUMB Debug/../../obj/stm32f4xx_spi.o + 0x00000000 0xdc THUMB Debug/../../obj/stm32f4xx_spi.o .text.SPI_Init - 0x00000000 0x44 THUMB Debug/../../obj/stm32f4xx_spi.o - .text.I2S_Init - 0x00000000 0x10c THUMB Debug/../../obj/stm32f4xx_spi.o - .text.SPI_StructInit - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_spi.o - .text.I2S_StructInit - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_spi.o - .text.SPI_Cmd 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_spi.o - .text.I2S_Cmd 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_spi.o - .text.SPI_DataSizeConfig - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_spi.o - .text.SPI_BiDirectionalLineConfig - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_spi.o - .text.SPI_NSSInternalSoftwareConfig - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_spi.o - .text.SPI_SSOutputCmd - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_spi.o - .text.SPI_TIModeCmd - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_spi.o - .text.I2S_FullDuplexConfig 0x00000000 0x54 THUMB Debug/../../obj/stm32f4xx_spi.o + .text.I2S_Init + 0x00000000 0xec THUMB Debug/../../obj/stm32f4xx_spi.o + .text.SPI_StructInit + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_spi.o + .text.I2S_StructInit + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_spi.o + .text.SPI_Cmd 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_spi.o + .text.I2S_Cmd 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_spi.o + .text.SPI_DataSizeConfig + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_spi.o + .text.SPI_BiDirectionalLineConfig + 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_spi.o + .text.SPI_NSSInternalSoftwareConfig + 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_spi.o + .text.SPI_SSOutputCmd + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_spi.o + .text.SPI_TIModeCmd + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_spi.o + .text.I2S_FullDuplexConfig + 0x00000000 0x48 THUMB Debug/../../obj/stm32f4xx_spi.o .text.SPI_I2S_ReceiveData 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_spi.o .text.SPI_I2S_SendData 0x00000000 0x4 THUMB Debug/../../obj/stm32f4xx_spi.o .text.SPI_CalculateCRC - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_spi.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_spi.o .text.SPI_TransmitCRC 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_spi.o .text.SPI_GetCRC @@ -1272,25 +1264,25 @@ Discarded input sections .text.SPI_GetCRCPolynomial 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_spi.o .text.SPI_I2S_DMACmd - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_spi.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_spi.o .text.SPI_I2S_ITConfig - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_spi.o + 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_spi.o .text.SPI_I2S_GetFlagStatus 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_spi.o .text.SPI_I2S_ClearFlag - 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_spi.o + 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_spi.o .text.SPI_I2S_GetITStatus - 0x00000000 0x34 THUMB Debug/../../obj/stm32f4xx_spi.o + 0x00000000 0x2c THUMB Debug/../../obj/stm32f4xx_spi.o .text.SPI_I2S_ClearITPendingBit - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_spi.o - .debug_frame 0x00000000 0x1e0 THUMB Debug/../../obj/stm32f4xx_spi.o - .debug_info 0x00000000 0xd33 THUMB Debug/../../obj/stm32f4xx_spi.o - .debug_abbrev 0x00000000 0x201 THUMB Debug/../../obj/stm32f4xx_spi.o - .debug_loc 0x00000000 0x94c THUMB Debug/../../obj/stm32f4xx_spi.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_spi.o + .debug_frame 0x00000000 0x1f4 THUMB Debug/../../obj/stm32f4xx_spi.o + .debug_info 0x00000000 0xd37 THUMB Debug/../../obj/stm32f4xx_spi.o + .debug_abbrev 0x00000000 0x214 THUMB Debug/../../obj/stm32f4xx_spi.o + .debug_loc 0x00000000 0x8c6 THUMB Debug/../../obj/stm32f4xx_spi.o .debug_aranges 0x00000000 0xe0 THUMB Debug/../../obj/stm32f4xx_spi.o .debug_ranges 0x00000000 0xd0 THUMB Debug/../../obj/stm32f4xx_spi.o - .debug_line 0x00000000 0x470 THUMB Debug/../../obj/stm32f4xx_spi.o + .debug_line 0x00000000 0x4f6 THUMB Debug/../../obj/stm32f4xx_spi.o .debug_str 0x00000000 0x6f6 THUMB Debug/../../obj/stm32f4xx_spi.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_spi.o .ARM.attributes @@ -1303,7 +1295,7 @@ Discarded input sections .text.SYSCFG_MemoryRemapConfig 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_syscfg.o .text.SYSCFG_EXTILineConfig - 0x00000000 0x40 THUMB Debug/../../obj/stm32f4xx_syscfg.o + 0x00000000 0x38 THUMB Debug/../../obj/stm32f4xx_syscfg.o .text.SYSCFG_CompensationCellCmd 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_syscfg.o .text.SYSCFG_GetCompensationCellStatus @@ -1311,20 +1303,16 @@ Discarded input sections .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 - .text.TI1_Config - 0x00000000 0x44 THUMB Debug/../../obj/stm32f4xx_tim.o - .text.TI2_Config - 0x00000000 0x4c THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_DeInit - 0x00000000 0x20c THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x1d4 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_TimeBaseInit - 0x00000000 0xac THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0xb0 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_TimeBaseStructInit 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_PrescalerConfig 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_CounterModeConfig - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_SetCounter 0x00000000 0x4 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_SetAutoreload @@ -1334,28 +1322,28 @@ Discarded input sections .text.TIM_GetPrescaler 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_UpdateDisableConfig - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_UpdateRequestConfig - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_ARRPreloadConfig - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_SelectOnePulseMode - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_SetClockDivision - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_tim.o - .text.TIM_Cmd 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o + .text.TIM_Cmd 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_OC1Init - 0x00000000 0x8c THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x94 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_OC2Init 0x00000000 0x9c THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_OC3Init 0x00000000 0x98 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_OC4Init - 0x00000000 0x7c THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x74 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_OCStructInit - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_SelectOCxM - 0x00000000 0x58 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x50 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_SetCompare1 0x00000000 0x4 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_SetCompare2 @@ -1365,57 +1353,61 @@ Discarded input sections .text.TIM_SetCompare4 0x00000000 0x4 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_ForcedOC1Config - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_ForcedOC2Config - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_ForcedOC3Config - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_ForcedOC4Config - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_OC1PreloadConfig - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_OC2PreloadConfig - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_OC3PreloadConfig - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_OC4PreloadConfig - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_OC1FastConfig - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_OC2FastConfig - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_OC3FastConfig - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_OC4FastConfig - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_ClearOC1Ref - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_ClearOC2Ref - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_ClearOC3Ref - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_ClearOC4Ref - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_OC1PolarityConfig - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_OC1NPolarityConfig - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_OC2PolarityConfig - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o - .text.TIM_OC2NPolarityConfig - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o - .text.TIM_OC3PolarityConfig - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o - .text.TIM_OC3NPolarityConfig - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o - .text.TIM_OC4PolarityConfig - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o - .text.TIM_CCxCmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_tim.o - .text.TIM_CCxNCmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_tim.o - .text.TIM_ICStructInit 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o + .text.TIM_OC2NPolarityConfig + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o + .text.TIM_OC3PolarityConfig + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o + .text.TIM_OC3NPolarityConfig + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o + .text.TIM_OC4PolarityConfig + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o + .text.TIM_CCxCmd + 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_tim.o + .text.TIM_CCxNCmd + 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_tim.o + .text.TIM_ICInit + 0x00000000 0x16c THUMB Debug/../../obj/stm32f4xx_tim.o + .text.TIM_ICStructInit + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_tim.o + .text.TIM_PWMIConfig + 0x00000000 0x164 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_GetCapture1 0x00000000 0x4 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_GetCapture2 @@ -1425,79 +1417,75 @@ Discarded input sections .text.TIM_GetCapture4 0x00000000 0x4 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_SetIC1Prescaler - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_SetIC2Prescaler - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_tim.o - .text.TIM_PWMIConfig - 0x00000000 0x6c THUMB Debug/../../obj/stm32f4xx_tim.o - .text.TIM_SetIC3Prescaler 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_tim.o + .text.TIM_SetIC3Prescaler + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_SetIC4Prescaler - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_tim.o - .text.TIM_ICInit - 0x00000000 0xe0 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_BDTRConfig - 0x00000000 0x24 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x2c THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_BDTRStructInit 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_CtrlPWMOutputs - 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_SelectCOM - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_CCPreloadControl - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_ITConfig - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_GenerateEvent 0x00000000 0x4 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_GetFlagStatus 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_ClearFlag - 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_GetITStatus - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_ClearITPendingBit - 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_DMAConfig 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_DMACmd - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_SelectCCDMA - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_InternalClockConfig - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o - .text.TIM_SelectInputTrigger - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o - .text.TIM_TIxExternalClockConfig - 0x00000000 0x34 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_ITRxExternalClockConfig - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_tim.o + .text.TIM_TIxExternalClockConfig + 0x00000000 0x90 THUMB Debug/../../obj/stm32f4xx_tim.o + .text.TIM_ETRClockMode1Config + 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_tim.o + .text.TIM_ETRClockMode2Config + 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_tim.o + .text.TIM_SelectInputTrigger + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_SelectOutputTrigger - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_SelectSlaveMode - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_SelectMasterSlaveMode - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_ETRConfig 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_tim.o - .text.TIM_ETRClockMode2Config - 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_tim.o - .text.TIM_ETRClockMode1Config - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_EncoderInterfaceConfig - 0x00000000 0x4c THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x40 THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_SelectHallSensor - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_tim.o .text.TIM_RemapConfig 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_tim.o - .debug_frame 0x00000000 0x6a4 THUMB Debug/../../obj/stm32f4xx_tim.o - .debug_info 0x00000000 0x234a THUMB Debug/../../obj/stm32f4xx_tim.o - .debug_abbrev 0x00000000 0x256 THUMB Debug/../../obj/stm32f4xx_tim.o - .debug_loc 0x00000000 0x2204 THUMB Debug/../../obj/stm32f4xx_tim.o + .debug_frame 0x00000000 0x694 THUMB Debug/../../obj/stm32f4xx_tim.o + .debug_info 0x00000000 0x26e4 THUMB Debug/../../obj/stm32f4xx_tim.o + .debug_abbrev 0x00000000 0x2ad THUMB Debug/../../obj/stm32f4xx_tim.o + .debug_loc 0x00000000 0x26ee THUMB Debug/../../obj/stm32f4xx_tim.o .debug_aranges - 0x00000000 0x2e8 THUMB Debug/../../obj/stm32f4xx_tim.o - .debug_ranges 0x00000000 0x2d8 THUMB Debug/../../obj/stm32f4xx_tim.o - .debug_line 0x00000000 0xa07 THUMB Debug/../../obj/stm32f4xx_tim.o + 0x00000000 0x2d8 THUMB Debug/../../obj/stm32f4xx_tim.o + .debug_ranges 0x00000000 0x3c8 THUMB Debug/../../obj/stm32f4xx_tim.o + .debug_line 0x00000000 0xc67 THUMB Debug/../../obj/stm32f4xx_tim.o .debug_str 0x00000000 0xe3c THUMB Debug/../../obj/stm32f4xx_tim.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_tim.o .ARM.attributes @@ -1506,53 +1494,53 @@ Discarded input sections .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_usart.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_DeInit - 0x00000000 0x134 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000000 0x11c THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_StructInit - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_ClockInit 0x00000000 0x28 THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_ClockStructInit - 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_SetPrescaler 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_OverSampling8Cmd - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_OneBitMethodCmd - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_SetAddress - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_ReceiverWakeUpCmd - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_WakeUpConfig - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_LINBreakDetectLengthConfig - 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_LINCmd - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_SendBreak 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_HalfDuplexCmd - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_SetGuardTime 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_SmartCardCmd - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_usart.o - .text.USART_SmartCardNACKCmd - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_usart.o - .text.USART_IrDAConfig 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_usart.o + .text.USART_SmartCardNACKCmd + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_usart.o + .text.USART_IrDAConfig + 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_IrDACmd - 0x00000000 0x20 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_DMACmd - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_ITConfig - 0x00000000 0x3c THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000000 0x38 THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_ClearFlag - 0x00000000 0xc THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000000 0x8 THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_GetITStatus - 0x00000000 0x50 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000000 0x48 THUMB Debug/../../obj/stm32f4xx_usart.o .text.USART_ClearITPendingBit - 0x00000000 0x18 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_usart.o .text 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_wwdg.o .data 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_wwdg.o .bss 0x00000000 0x0 THUMB Debug/../../obj/stm32f4xx_wwdg.o @@ -1573,13 +1561,13 @@ Discarded input sections .text.WWDG_ClearFlag 0x00000000 0x10 THUMB Debug/../../obj/stm32f4xx_wwdg.o .debug_frame 0x00000000 0xa4 THUMB Debug/../../obj/stm32f4xx_wwdg.o - .debug_info 0x00000000 0x2a5 THUMB Debug/../../obj/stm32f4xx_wwdg.o - .debug_abbrev 0x00000000 0x177 THUMB Debug/../../obj/stm32f4xx_wwdg.o + .debug_info 0x00000000 0x2a6 THUMB Debug/../../obj/stm32f4xx_wwdg.o + .debug_abbrev 0x00000000 0x17a THUMB Debug/../../obj/stm32f4xx_wwdg.o .debug_loc 0x00000000 0x13b THUMB Debug/../../obj/stm32f4xx_wwdg.o .debug_aranges 0x00000000 0x58 THUMB Debug/../../obj/stm32f4xx_wwdg.o .debug_ranges 0x00000000 0x48 THUMB Debug/../../obj/stm32f4xx_wwdg.o - .debug_line 0x00000000 0x29e THUMB Debug/../../obj/stm32f4xx_wwdg.o + .debug_line 0x00000000 0x2a3 THUMB Debug/../../obj/stm32f4xx_wwdg.o .debug_str 0x00000000 0x2e7 THUMB Debug/../../obj/stm32f4xx_wwdg.o .comment 0x00000000 0x4f THUMB Debug/../../obj/stm32f4xx_wwdg.o .ARM.attributes @@ -1588,39 +1576,45 @@ Discarded input sections .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 + 0x00000000 0xac THUMB Debug/../../obj/stm32_eth.o .text.ETH_HandleRxPkt - 0x00000000 0x120 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0xb4 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_GetRxPktSize + 0x00000000 0x24 THUMB Debug/../../obj/stm32_eth.o .text.ETH_DropRxPkt - 0x00000000 0x64 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x3c THUMB Debug/../../obj/stm32_eth.o .text.ETH_PHYLoopBackCmd - 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x2c THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MACTransmissionCmd + 0x00000000 0x1c THUMB Debug/../../obj/stm32_eth.o + .text.ETH_MACReceptionCmd + 0x00000000 0x1c 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 + 0x00000000 0x1c 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 + 0x00000000 0x1c THUMB Debug/../../obj/stm32_eth.o .text.ETH_MACAddressConfig - 0x00000000 0x34 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x38 THUMB Debug/../../obj/stm32_eth.o .text.ETH_GetMACAddress - 0x00000000 0x34 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o .text.ETH_MACAddressPerfectFilterCmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x1c 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 + 0x00000000 0x4c THUMB Debug/../../obj/stm32_eth.o .text.ETH_DMATxDescRingInit - 0x00000000 0xc4 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0xd4 THUMB Debug/../../obj/stm32_eth.o .text.ETH_GetDMATxDescFlagStatus 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o .text.ETH_GetDMATxDescCollisionCount @@ -1628,43 +1622,41 @@ Discarded input sections .text.ETH_SetDMATxDescOwnBit 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o .text.ETH_DMATxDescTransmitITConfig - 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x14 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 + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o .text.ETH_DMATxDescEndOfRingCmd - 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o .text.ETH_DMATxDescSecondAddressChainedCmd - 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o .text.ETH_DMATxDescShortFramePaddingCmd - 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o .text.ETH_DMATxDescTimeStampCmd - 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x14 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 + 0x00000000 0x54 THUMB Debug/../../obj/stm32_eth.o .text.ETH_DMARxDescRingInit - 0x00000000 0x14c THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x120 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 + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o .text.ETH_DMARxDescEndOfRingCmd - 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o .text.ETH_DMARxDescSecondAddressChainedCmd - 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o .text.ETH_GetDMARxDescBufferSize - 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o .text.ETH_GetDMAFlagStatus 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o .text.ETH_DMAClearFlag @@ -1677,10 +1669,16 @@ Discarded input sections 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o .text.ETH_GetReceiveProcessState 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_FlushTransmitFIFO + 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o .text.ETH_GetFlushTransmitFIFOStatus 0x00000000 0x10 THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMATransmissionCmd + 0x00000000 0x1c THUMB Debug/../../obj/stm32_eth.o + .text.ETH_DMAReceptionCmd + 0x00000000 0x1c THUMB Debug/../../obj/stm32_eth.o .text.ETH_DMAITConfig - 0x00000000 0x24 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32_eth.o .text.ETH_GetDMAOverflowStatus 0x00000000 0x14 THUMB Debug/../../obj/stm32_eth.o .text.ETH_GetRxOverflowMissedFrameCounter @@ -1704,27 +1702,27 @@ Discarded input sections .text.ETH_SetWakeUpFrameFilterRegister 0x00000000 0x2c THUMB Debug/../../obj/stm32_eth.o .text.ETH_GlobalUnicastWakeUpCmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x1c 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 + 0x00000000 0x1c THUMB Debug/../../obj/stm32_eth.o .text.ETH_MagicPacketDetectionCmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32_eth.o .text.ETH_PowerDownCmd - 0x00000000 0x28 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x1c THUMB Debug/../../obj/stm32_eth.o .text.ETH_MMCCounterFreezeCmd - 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x24 THUMB Debug/../../obj/stm32_eth.o .text.ETH_MMCResetOnReadCmd - 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x24 THUMB Debug/../../obj/stm32_eth.o .text.ETH_MMCCounterRolloverCmd - 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x24 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 + 0x00000000 0x48 THUMB Debug/../../obj/stm32_eth.o .text.ETH_GetMMCITStatus - 0x00000000 0x60 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x34 THUMB Debug/../../obj/stm32_eth.o .text.ETH_GetMMCRegister 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o .text.ETH_EnablePTPTimeStampAddend @@ -1736,9 +1734,9 @@ Discarded input sections .text.ETH_InitializePTPTimeStamp 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o .text.ETH_PTPUpdateMethodConfig - 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x24 THUMB Debug/../../obj/stm32_eth.o .text.ETH_PTPTimeStampCmd - 0x00000000 0x30 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x24 THUMB Debug/../../obj/stm32_eth.o .text.ETH_GetPTPFlagStatus 0x00000000 0x18 THUMB Debug/../../obj/stm32_eth.o .text.ETH_SetPTPSubSecondIncrement @@ -1752,13 +1750,13 @@ Discarded input sections .text.ETH_GetPTPRegister 0x00000000 0xc THUMB Debug/../../obj/stm32_eth.o .text.ETH_DMAPTPTxDescChainInit - 0x00000000 0x120 THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x70 THUMB Debug/../../obj/stm32_eth.o .text.ETH_DMAPTPRxDescChainInit - 0x00000000 0x12c THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0x78 THUMB Debug/../../obj/stm32_eth.o .text.ETH_HandlePTPTxPkt - 0x00000000 0x1dc THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0xf8 THUMB Debug/../../obj/stm32_eth.o .text.ETH_HandlePTPRxPkt - 0x00000000 0x14c THUMB Debug/../../obj/stm32_eth.o + 0x00000000 0xe4 THUMB Debug/../../obj/stm32_eth.o .bss.DMARxDescToGet 0x00000000 0x4 THUMB Debug/../../obj/stm32_eth.o .bss.DMAPTPTxDescToSet @@ -1771,11 +1769,10 @@ Discarded input sections .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 + 0x00000000 0x4 THUMB Debug/../../obj/clock-arch.o + .debug_frame 0x00000000 0x20 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_abbrev 0x00000000 0x76 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 @@ -1787,12 +1784,76 @@ Discarded input sections .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/usbd_core.o + .data 0x00000000 0x0 THUMB Debug/../../obj/usbd_core.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/usbd_core.o + .text.USBD_DeInit + 0x00000000 0x4 THUMB Debug/../../obj/usbd_core.o + .text 0x00000000 0x0 THUMB Debug/../../obj/usbd_ioreq.o + .data 0x00000000 0x0 THUMB Debug/../../obj/usbd_ioreq.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/usbd_ioreq.o + .text.USBD_CtlPrepareRx + 0x00000000 0x20 THUMB Debug/../../obj/usbd_ioreq.o + .text.USBD_GetRxCount + 0x00000000 0x10 THUMB Debug/../../obj/usbd_ioreq.o + .text 0x00000000 0x0 THUMB Debug/../../obj/usbd_req.o + .data 0x00000000 0x0 THUMB Debug/../../obj/usbd_req.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/usbd_req.o + .text 0x00000000 0x0 THUMB Debug/../../obj/usb_core.o + .data 0x00000000 0x0 THUMB Debug/../../obj/usb_core.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/usb_core.o + .text.USB_OTG_GetMode + 0x00000000 0xc THUMB Debug/../../obj/usb_core.o + .text.USB_OTG_IsHostMode + 0x00000000 0xc THUMB Debug/../../obj/usb_core.o + .text.USB_OTG_ReadOtgItr + 0x00000000 0x8 THUMB Debug/../../obj/usb_core.o + .text.USB_OTG_InitDevSpeed + 0x00000000 0xc THUMB Debug/../../obj/usb_core.o + .text.USB_OTG_ActiveRemoteWakeup + 0x00000000 0x44 THUMB Debug/../../obj/usb_core.o + .text.USB_OTG_UngateClock + 0x00000000 0x20 THUMB Debug/../../obj/usb_core.o + .text.USB_OTG_StopDevice + 0x00000000 0x48 THUMB Debug/../../obj/usb_core.o + .text.USB_OTG_GetEPStatus + 0x00000000 0x5c THUMB Debug/../../obj/usb_core.o + .text.USB_OTG_SetEPStatus + 0x00000000 0x7c THUMB Debug/../../obj/usb_core.o + .text 0x00000000 0x0 THUMB Debug/../../obj/usb_dcd.o + .data 0x00000000 0x0 THUMB Debug/../../obj/usb_dcd.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/usb_dcd.o + .text.DCD_EP_Flush + 0x00000000 0x1c THUMB Debug/../../obj/usb_dcd.o + .text.DCD_DevConnect + 0x00000000 0x10 THUMB Debug/../../obj/usb_dcd.o + .text.DCD_GetEPStatus + 0x00000000 0x28 THUMB Debug/../../obj/usb_dcd.o + .text.DCD_SetEPStatus + 0x00000000 0x28 THUMB Debug/../../obj/usb_dcd.o + .text 0x00000000 0x0 THUMB Debug/../../obj/usb_dcd_int.o + .data 0x00000000 0x0 THUMB Debug/../../obj/usb_dcd_int.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/usb_dcd_int.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 .text 0x00000000 0x0 THUMB Debug/../../obj/main.o .data 0x00000000 0x0 THUMB Debug/../../obj/main.o .bss 0x00000000 0x0 THUMB Debug/../../obj/main.o + .text 0x00000000 0x0 THUMB Debug/../../obj/usb_bsp.o + .data 0x00000000 0x0 THUMB Debug/../../obj/usb_bsp.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/usb_bsp.o + .text 0x00000000 0x0 THUMB Debug/../../obj/usbd_bulk.o + .data 0x00000000 0x0 THUMB Debug/../../obj/usbd_bulk.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/usbd_bulk.o + .text 0x00000000 0x0 THUMB Debug/../../obj/usbd_desc.o + .data 0x00000000 0x0 THUMB Debug/../../obj/usbd_desc.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/usbd_desc.o + .data.USBD_DeviceQualifierDesc + 0x00000000 0xc THUMB Debug/../../obj/usbd_desc.o + .text 0x00000000 0x0 THUMB Debug/../../obj/usbd_usr.o + .data 0x00000000 0x0 THUMB Debug/../../obj/usbd_usr.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/usbd_usr.o .text 0x00000000 0x0 THUMB Debug/../../obj/cstart.o .data 0x00000000 0x0 THUMB Debug/../../obj/cstart.o .bss 0x00000000 0x0 THUMB Debug/../../obj/cstart.o @@ -1807,7 +1868,7 @@ Discarded input sections .data 0x00000000 0x0 THUMB Debug/../../obj/cpu.o .bss 0x00000000 0x0 THUMB Debug/../../obj/cpu.o .text.CpuReset - 0x00000000 0x8 THUMB Debug/../../obj/cpu.o + 0x00000000 0x4 THUMB Debug/../../obj/cpu.o .text 0x00000000 0x0 THUMB Debug/../../obj/flash.o .data 0x00000000 0x0 THUMB Debug/../../obj/flash.o .bss 0x00000000 0x0 THUMB Debug/../../obj/flash.o @@ -1823,6 +1884,9 @@ Discarded input sections .text 0x00000000 0x0 THUMB Debug/../../obj/can.o .data 0x00000000 0x0 THUMB Debug/../../obj/can.o .bss 0x00000000 0x0 THUMB Debug/../../obj/can.o + .text 0x00000000 0x0 THUMB Debug/../../obj/usb.o + .data 0x00000000 0x0 THUMB Debug/../../obj/usb.o + .bss 0x00000000 0x0 THUMB Debug/../../obj/usb.o .text 0x00000000 0x0 THUMB Debug/../../obj/assert.o .data 0x00000000 0x0 THUMB Debug/../../obj/assert.o .bss 0x00000000 0x0 THUMB Debug/../../obj/assert.o @@ -1847,21 +1911,23 @@ Discarded input sections .text 0x00000000 0x0 THUMB Debug/../../obj/ff.o .data 0x00000000 0x0 THUMB Debug/../../obj/ff.o .bss 0x00000000 0x0 THUMB Debug/../../obj/ff.o + .text.clust2sect + 0x00000000 0x18 THUMB Debug/../../obj/ff.o .text.f_opendir - 0x00000000 0x90 THUMB Debug/../../obj/ff.o + 0x00000000 0x80 THUMB Debug/../../obj/ff.o .text.f_readdir - 0x00000000 0x70 THUMB Debug/../../obj/ff.o + 0x00000000 0x5c THUMB Debug/../../obj/ff.o .text.f_getfree - 0x00000000 0x28c THUMB Debug/../../obj/ff.o + 0x00000000 0x1f0 THUMB Debug/../../obj/ff.o .text.f_truncate - 0x00000000 0xac THUMB Debug/../../obj/ff.o - .text.f_mkdir 0x00000000 0x244 THUMB Debug/../../obj/ff.o - .text.f_chmod 0x00000000 0x68 THUMB Debug/../../obj/ff.o - .text.f_utime 0x00000000 0x6c THUMB Debug/../../obj/ff.o + 0x00000000 0x90 THUMB Debug/../../obj/ff.o + .text.f_mkdir 0x00000000 0x25c THUMB Debug/../../obj/ff.o + .text.f_chmod 0x00000000 0x5c THUMB Debug/../../obj/ff.o + .text.f_utime 0x00000000 0x60 THUMB Debug/../../obj/ff.o .text.f_rename - 0x00000000 0x134 THUMB Debug/../../obj/ff.o + 0x00000000 0x178 THUMB Debug/../../obj/ff.o .text.f_printf - 0x00000000 0x7b0 THUMB Debug/../../obj/ff.o + 0x00000000 0x720 THUMB Debug/../../obj/ff.o .text 0x00000000 0x0 THUMB Debug/../../obj/unicode.o .data 0x00000000 0x0 THUMB Debug/../../obj/unicode.o .bss 0x00000000 0x0 THUMB Debug/../../obj/unicode.o @@ -1870,19 +1936,19 @@ Discarded input sections .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_udpchksum + 0x00000000 0x8 THUMB Debug/../../obj/uip.o + .text.uip_connect + 0x00000000 0xb4 THUMB Debug/../../obj/uip.o + .text.uip_unlisten + 0x00000000 0x24 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 + 0x00000000 0x30 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 @@ -1901,7 +1967,7 @@ Discarded input sections .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_line 0x00000000 0x12a 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 @@ -1910,29 +1976,29 @@ Discarded input sections .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 + 0x00000000 0x24 THUMB Debug/../../obj/uip-fw.o .text.uip_fw_output - 0x00000000 0xe8 THUMB Debug/../../obj/uip-fw.o + 0x00000000 0xb4 THUMB Debug/../../obj/uip-fw.o .text.uip_fw_forward - 0x00000000 0x1dc THUMB Debug/../../obj/uip-fw.o + 0x00000000 0x164 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 + 0x00000000 0x1c 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_frame 0x00000000 0x98 THUMB Debug/../../obj/uip-fw.o + .debug_info 0x00000000 0x71e THUMB Debug/../../obj/uip-fw.o + .debug_abbrev 0x00000000 0x28c THUMB Debug/../../obj/uip-fw.o + .debug_loc 0x00000000 0x181 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_ranges 0x00000000 0x108 THUMB Debug/../../obj/uip-fw.o + .debug_line 0x00000000 0x276 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 @@ -1941,15 +2007,15 @@ Discarded input sections .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 + 0x00000000 0x208 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_loc 0x00000000 0x7b3 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_line 0x00000000 0x1a2 THUMB Debug/../../obj/uiplib.o .debug_str 0x00000000 0x1b5 THUMB Debug/../../obj/uiplib.o .comment 0x00000000 0x4f THUMB Debug/../../obj/uiplib.o .ARM.attributes @@ -2725,7 +2791,7 @@ CM3_System_Control_Space 0xe000e000 0x00001000 xw Linker script and memory map - 0x08008f1c __do_debug_operation = __do_debug_operation_mempoll + 0x08009d14 __do_debug_operation = __do_debug_operation_mempoll 0x08000000 __FLASH_segment_start__ = 0x8000000 0x0800c000 __FLASH_segment_end__ = 0x800c000 0x10000000 __DATA_SRAM_segment_start__ = 0x10000000 @@ -2809,571 +2875,811 @@ 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) 0x08000290 __text_load_start__ = ALIGN (__init_end__, 0x4) -.text 0x08000290 0x8cd0 +.text 0x08000290 0x9ac8 0x08000290 __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.CmdResp2Error - 0x08000290 0x58 THUMB Debug/../../obj/mmc.o + 0x08000290 0x3c THUMB Debug/../../obj/mmc.o .text.CmdResp1Error - 0x080002e8 0x164 THUMB Debug/../../obj/mmc.o + 0x080002cc 0xf4 THUMB Debug/../../obj/mmc.o .text.SDEnWideBus - 0x0800044c 0x2b4 THUMB Debug/../../obj/mmc.o + 0x080003c0 0x1ec THUMB Debug/../../obj/mmc.o .text.SD_Detect - 0x08000700 0x30 THUMB Debug/../../obj/mmc.o - 0x08000700 SD_Detect + 0x080005ac 0x28 THUMB Debug/../../obj/mmc.o + 0x080005ac SD_Detect .text.SD_PowerON - 0x08000730 0x2d0 THUMB Debug/../../obj/mmc.o - 0x08000730 SD_PowerON + 0x080005d4 0x220 THUMB Debug/../../obj/mmc.o + 0x080005d4 SD_PowerON .text.SD_InitializeCards - 0x08000a00 0x1dc THUMB Debug/../../obj/mmc.o - 0x08000a00 SD_InitializeCards + 0x080007f4 0x15c THUMB Debug/../../obj/mmc.o + 0x080007f4 SD_InitializeCards .text.SD_GetCardInfo - 0x08000bdc 0x2fc THUMB Debug/../../obj/mmc.o - 0x08000bdc SD_GetCardInfo + 0x08000950 0x304 THUMB Debug/../../obj/mmc.o + 0x08000950 SD_GetCardInfo .text.SD_EnableWideBusOperation - 0x08000ed8 0x8c THUMB Debug/../../obj/mmc.o - 0x08000ed8 SD_EnableWideBusOperation + 0x08000c54 0x74 THUMB Debug/../../obj/mmc.o + 0x08000c54 SD_EnableWideBusOperation .text.SD_SelectDeselect - 0x08000f64 0x34 THUMB Debug/../../obj/mmc.o - 0x08000f64 SD_SelectDeselect - .text.SD_Init 0x08000f98 0x180 THUMB Debug/../../obj/mmc.o - 0x08000f98 SD_Init + 0x08000cc8 0x30 THUMB Debug/../../obj/mmc.o + 0x08000cc8 SD_SelectDeselect + .text.SD_Init 0x08000cf8 0x170 THUMB Debug/../../obj/mmc.o + 0x08000cf8 SD_Init .text.SD_ReadBlock - 0x08001118 0x234 THUMB Debug/../../obj/mmc.o - 0x08001118 SD_ReadBlock + 0x08000e68 0x1e8 THUMB Debug/../../obj/mmc.o + 0x08000e68 SD_ReadBlock .text.SD_WriteBlock - 0x0800134c 0x25c THUMB Debug/../../obj/mmc.o - 0x0800134c SD_WriteBlock + 0x08001050 0x1ec THUMB Debug/../../obj/mmc.o + 0x08001050 SD_WriteBlock .text.SD_SendStatus - 0x080015a8 0x58 THUMB Debug/../../obj/mmc.o - 0x080015a8 SD_SendStatus + 0x0800123c 0x50 THUMB Debug/../../obj/mmc.o + 0x0800123c SD_SendStatus .text.SD_GetState - 0x08001600 0x30 THUMB Debug/../../obj/mmc.o - 0x08001600 SD_GetState + 0x0800128c 0x28 THUMB Debug/../../obj/mmc.o + 0x0800128c SD_GetState .text.SD_GetStatus - 0x08001630 0x1c THUMB Debug/../../obj/mmc.o - 0x08001630 SD_GetStatus + 0x080012b4 0x18 THUMB Debug/../../obj/mmc.o + 0x080012b4 SD_GetStatus .text.disk_initialize - 0x0800164c 0x3c THUMB Debug/../../obj/mmc.o - 0x0800164c disk_initialize + 0x080012cc 0x30 THUMB Debug/../../obj/mmc.o + 0x080012cc disk_initialize .text.disk_status - 0x08001688 0x34 THUMB Debug/../../obj/mmc.o - 0x08001688 disk_status + 0x080012fc 0x28 THUMB Debug/../../obj/mmc.o + 0x080012fc disk_status .text.disk_read - 0x080016bc 0x74 THUMB Debug/../../obj/mmc.o - 0x080016bc disk_read + 0x08001324 0x50 THUMB Debug/../../obj/mmc.o + 0x08001324 disk_read .text.disk_write - 0x08001730 0x7c THUMB Debug/../../obj/mmc.o - 0x08001730 disk_write + 0x08001374 0x54 THUMB Debug/../../obj/mmc.o + 0x08001374 disk_write .text.disk_ioctl - 0x080017ac 0x74 THUMB Debug/../../obj/mmc.o - 0x080017ac disk_ioctl + 0x080013c8 0x60 THUMB Debug/../../obj/mmc.o + 0x080013c8 disk_ioctl .text.get_fattime - 0x08001820 0xc THUMB Debug/../../obj/mmc.o - 0x08001820 get_fattime + 0x08001428 0x8 THUMB Debug/../../obj/mmc.o + 0x08001428 get_fattime .text.SystemInit - 0x0800182c 0x124 THUMB Debug/../../obj/system_stm32f4xx.o - 0x0800182c SystemInit + 0x08001430 0x118 THUMB Debug/../../obj/system_stm32f4xx.o + 0x08001430 SystemInit .text.FLASH_Unlock - 0x08001950 0x2c THUMB Debug/../../obj/stm32f4xx_flash.o - 0x08001950 FLASH_Unlock + 0x08001548 0x24 THUMB Debug/../../obj/stm32f4xx_flash.o + 0x08001548 FLASH_Unlock .text.FLASH_Lock - 0x0800197c 0x14 THUMB Debug/../../obj/stm32f4xx_flash.o - 0x0800197c FLASH_Lock + 0x0800156c 0x14 THUMB Debug/../../obj/stm32f4xx_flash.o + 0x0800156c FLASH_Lock .text.FLASH_ClearFlag - 0x08001990 0xc THUMB Debug/../../obj/stm32f4xx_flash.o - 0x08001990 FLASH_ClearFlag + 0x08001580 0xc THUMB Debug/../../obj/stm32f4xx_flash.o + 0x08001580 FLASH_ClearFlag .text.FLASH_GetStatus - 0x0800199c 0x5c THUMB Debug/../../obj/stm32f4xx_flash.o - 0x0800199c FLASH_GetStatus + 0x0800158c 0x38 THUMB Debug/../../obj/stm32f4xx_flash.o + 0x0800158c FLASH_GetStatus .text.FLASH_WaitForLastOperation - 0x080019f8 0x34 THUMB Debug/../../obj/stm32f4xx_flash.o - 0x080019f8 FLASH_WaitForLastOperation + 0x080015c4 0x24 THUMB Debug/../../obj/stm32f4xx_flash.o + 0x080015c4 FLASH_WaitForLastOperation .text.FLASH_ProgramWord - 0x08001a2c 0x40 THUMB Debug/../../obj/stm32f4xx_flash.o - 0x08001a2c FLASH_ProgramWord + 0x080015e8 0x40 THUMB Debug/../../obj/stm32f4xx_flash.o + 0x080015e8 FLASH_ProgramWord .text.FLASH_EraseSector - 0x08001a6c 0x70 THUMB Debug/../../obj/stm32f4xx_flash.o - 0x08001a6c FLASH_EraseSector + 0x08001628 0x78 THUMB Debug/../../obj/stm32f4xx_flash.o + 0x08001628 FLASH_EraseSector .text.GPIO_Init - 0x08001adc 0x160 THUMB Debug/../../obj/stm32f4xx_gpio.o - 0x08001adc GPIO_Init + 0x080016a0 0x150 THUMB Debug/../../obj/stm32f4xx_gpio.o + 0x080016a0 GPIO_Init .text.GPIO_ReadInputDataBit - 0x08001c3c 0xc THUMB Debug/../../obj/stm32f4xx_gpio.o - 0x08001c3c GPIO_ReadInputDataBit + 0x080017f0 0xc THUMB Debug/../../obj/stm32f4xx_gpio.o + 0x080017f0 GPIO_ReadInputDataBit .text.GPIO_PinAFConfig - 0x08001c48 0x38 THUMB Debug/../../obj/stm32f4xx_gpio.o - 0x08001c48 GPIO_PinAFConfig + 0x080017fc 0x30 THUMB Debug/../../obj/stm32f4xx_gpio.o + 0x080017fc GPIO_PinAFConfig .text.RCC_GetClocksFreq - 0x08001c80 0xd8 THUMB Debug/../../obj/stm32f4xx_rcc.o - 0x08001c80 RCC_GetClocksFreq + 0x0800182c 0xb4 THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x0800182c RCC_GetClocksFreq .text.RCC_AHB1PeriphClockCmd - 0x08001d58 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o - 0x08001d58 RCC_AHB1PeriphClockCmd + 0x080018e0 0x1c THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x080018e0 RCC_AHB1PeriphClockCmd + .text.RCC_AHB2PeriphClockCmd + 0x080018fc 0x1c THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x080018fc RCC_AHB2PeriphClockCmd .text.RCC_APB1PeriphClockCmd - 0x08001d7c 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o - 0x08001d7c RCC_APB1PeriphClockCmd + 0x08001918 0x1c THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x08001918 RCC_APB1PeriphClockCmd .text.RCC_APB2PeriphClockCmd - 0x08001da0 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o - 0x08001da0 RCC_APB2PeriphClockCmd + 0x08001934 0x1c THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x08001934 RCC_APB2PeriphClockCmd .text.RCC_AHB1PeriphResetCmd - 0x08001dc4 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o - 0x08001dc4 RCC_AHB1PeriphResetCmd + 0x08001950 0x1c THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x08001950 RCC_AHB1PeriphResetCmd .text.RCC_APB2PeriphResetCmd - 0x08001de8 0x24 THUMB Debug/../../obj/stm32f4xx_rcc.o - 0x08001de8 RCC_APB2PeriphResetCmd + 0x0800196c 0x1c THUMB Debug/../../obj/stm32f4xx_rcc.o + 0x0800196c RCC_APB2PeriphResetCmd .text.SDIO_DeInit - 0x08001e0c 0x1c THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001e0c SDIO_DeInit + 0x08001988 0x1c THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001988 SDIO_DeInit .text.SDIO_Init - 0x08001e28 0x34 THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001e28 SDIO_Init + 0x080019a4 0x38 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x080019a4 SDIO_Init .text.SDIO_ClockCmd - 0x08001e5c 0xc THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001e5c SDIO_ClockCmd + 0x080019dc 0xc THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x080019dc SDIO_ClockCmd .text.SDIO_SetPowerState - 0x08001e68 0xc THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001e68 SDIO_SetPowerState + 0x080019e8 0xc THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x080019e8 SDIO_SetPowerState .text.SDIO_GetPowerState - 0x08001e74 0x10 THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001e74 SDIO_GetPowerState + 0x080019f4 0x10 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x080019f4 SDIO_GetPowerState .text.SDIO_SendCommand - 0x08001e84 0x30 THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001e84 SDIO_SendCommand + 0x08001a04 0x30 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001a04 SDIO_SendCommand .text.SDIO_GetCommandResponse - 0x08001eb4 0x10 THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001eb4 SDIO_GetCommandResponse + 0x08001a34 0x10 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001a34 SDIO_GetCommandResponse .text.SDIO_GetResponse - 0x08001ec4 0x1c THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001ec4 SDIO_GetResponse + 0x08001a44 0x1c THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001a44 SDIO_GetResponse .text.SDIO_DataConfig - 0x08001ee0 0x30 THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001ee0 SDIO_DataConfig + 0x08001a60 0x30 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001a60 SDIO_DataConfig .text.SDIO_ReadData - 0x08001f10 0x10 THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001f10 SDIO_ReadData + 0x08001a90 0x10 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001a90 SDIO_ReadData .text.SDIO_WriteData - 0x08001f20 0x10 THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001f20 SDIO_WriteData + 0x08001aa0 0x10 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001aa0 SDIO_WriteData .text.SDIO_GetFlagStatus - 0x08001f30 0x14 THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001f30 SDIO_GetFlagStatus + 0x08001ab0 0x14 THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001ab0 SDIO_GetFlagStatus .text.SDIO_ClearFlag - 0x08001f44 0xc THUMB Debug/../../obj/stm32f4xx_sdio.o - 0x08001f44 SDIO_ClearFlag + 0x08001ac4 0xc THUMB Debug/../../obj/stm32f4xx_sdio.o + 0x08001ac4 SDIO_ClearFlag .text.SYSCFG_ETH_MediaInterfaceConfig - 0x08001f50 0xc THUMB Debug/../../obj/stm32f4xx_syscfg.o - 0x08001f50 SYSCFG_ETH_MediaInterfaceConfig + 0x08001ad0 0xc THUMB Debug/../../obj/stm32f4xx_syscfg.o + 0x08001ad0 SYSCFG_ETH_MediaInterfaceConfig .text.USART_Init - 0x08001f5c 0x108 THUMB Debug/../../obj/stm32f4xx_usart.o - 0x08001f5c USART_Init + 0x08001adc 0xe0 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x08001adc USART_Init .text.USART_Cmd - 0x08002064 0x20 THUMB Debug/../../obj/stm32f4xx_usart.o - 0x08002064 USART_Cmd + 0x08001bbc 0x1c THUMB Debug/../../obj/stm32f4xx_usart.o + 0x08001bbc USART_Cmd .text.USART_SendData - 0x08002084 0xc THUMB Debug/../../obj/stm32f4xx_usart.o - 0x08002084 USART_SendData + 0x08001bd8 0x8 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x08001bd8 USART_SendData .text.USART_ReceiveData - 0x08002090 0xc THUMB Debug/../../obj/stm32f4xx_usart.o - 0x08002090 USART_ReceiveData + 0x08001be0 0x8 THUMB Debug/../../obj/stm32f4xx_usart.o + 0x08001be0 USART_ReceiveData .text.USART_GetFlagStatus - 0x0800209c 0xc THUMB Debug/../../obj/stm32f4xx_usart.o - 0x0800209c USART_GetFlagStatus + 0x08001be8 0xc THUMB Debug/../../obj/stm32f4xx_usart.o + 0x08001be8 USART_GetFlagStatus .text.ETH_DeInit - 0x080020a8 0x1c THUMB Debug/../../obj/stm32_eth.o - 0x080020a8 ETH_DeInit + 0x08001bf4 0x1c THUMB Debug/../../obj/stm32_eth.o + 0x08001bf4 ETH_DeInit .text.ETH_StructInit - 0x080020c4 0xa8 THUMB Debug/../../obj/stm32_eth.o - 0x080020c4 ETH_StructInit - .text.ETH_ReadPHYRegister - 0x0800216c 0x78 THUMB Debug/../../obj/stm32_eth.o - 0x0800216c ETH_ReadPHYRegister - .text.ETH_WritePHYRegister - 0x080021e4 0x70 THUMB Debug/../../obj/stm32_eth.o - 0x080021e4 ETH_WritePHYRegister - .text.ETH_Init - 0x08002254 0x2f0 THUMB Debug/../../obj/stm32_eth.o - 0x08002254 ETH_Init - .text.ETH_MACTransmissionCmd - 0x08002544 0x28 THUMB Debug/../../obj/stm32_eth.o - 0x08002544 ETH_MACTransmissionCmd - .text.ETH_MACReceptionCmd - 0x0800256c 0x28 THUMB Debug/../../obj/stm32_eth.o - 0x0800256c ETH_MACReceptionCmd - .text.ETH_SoftwareReset - 0x08002594 0x14 THUMB Debug/../../obj/stm32_eth.o - 0x08002594 ETH_SoftwareReset - .text.ETH_GetSoftwareResetStatus - 0x080025a8 0x10 THUMB Debug/../../obj/stm32_eth.o - 0x080025a8 ETH_GetSoftwareResetStatus - .text.ETH_FlushTransmitFIFO - 0x080025b8 0x14 THUMB Debug/../../obj/stm32_eth.o - 0x080025b8 ETH_FlushTransmitFIFO - .text.ETH_DMATransmissionCmd - 0x080025cc 0x28 THUMB Debug/../../obj/stm32_eth.o - 0x080025cc ETH_DMATransmissionCmd - .text.ETH_DMAReceptionCmd - 0x080025f4 0x28 THUMB Debug/../../obj/stm32_eth.o - 0x080025f4 ETH_DMAReceptionCmd + 0x08001c10 0xa0 THUMB Debug/../../obj/stm32_eth.o + 0x08001c10 ETH_StructInit .text.ETH_Start - 0x0800261c 0x28 THUMB Debug/../../obj/stm32_eth.o - 0x0800261c ETH_Start + 0x08001cb0 0x38 THUMB Debug/../../obj/stm32_eth.o + 0x08001cb0 ETH_Start + .text.ETH_ReadPHYRegister + 0x08001ce8 0x68 THUMB Debug/../../obj/stm32_eth.o + 0x08001ce8 ETH_ReadPHYRegister + .text.ETH_WritePHYRegister + 0x08001d50 0x60 THUMB Debug/../../obj/stm32_eth.o + 0x08001d50 ETH_WritePHYRegister + .text.ETH_Init + 0x08001db0 0x328 THUMB Debug/../../obj/stm32_eth.o + 0x08001db0 ETH_Init + .text.ETH_SoftwareReset + 0x080020d8 0x14 THUMB Debug/../../obj/stm32_eth.o + 0x080020d8 ETH_SoftwareReset + .text.ETH_GetSoftwareResetStatus + 0x080020ec 0x10 THUMB Debug/../../obj/stm32_eth.o + 0x080020ec ETH_GetSoftwareResetStatus .text.netdev_init - 0x08002644 0x294 THUMB Debug/../../obj/netdev.o - 0x08002644 netdev_init + 0x080020fc 0x25c THUMB Debug/../../obj/netdev.o + 0x080020fc netdev_init .text.netdev_init_mac - 0x080028d8 0x30 THUMB Debug/../../obj/netdev.o - 0x080028d8 netdev_init_mac + 0x08002358 0x24 THUMB Debug/../../obj/netdev.o + 0x08002358 netdev_init_mac .text.netdev_read - 0x08002908 0x5c THUMB Debug/../../obj/netdev.o - 0x08002908 netdev_read + 0x0800237c 0x48 THUMB Debug/../../obj/netdev.o + 0x0800237c netdev_read .text.netdev_send - 0x08002964 0x70 THUMB Debug/../../obj/netdev.o - 0x08002964 netdev_send + 0x080023c4 0x54 THUMB Debug/../../obj/netdev.o + 0x080023c4 netdev_send + .text.USBD_Resume + 0x08002418 0x18 THUMB Debug/../../obj/usbd_core.o + .text.USBD_Suspend + 0x08002430 0x1c THUMB Debug/../../obj/usbd_core.o + .text.USBD_SOF + 0x0800244c 0x10 THUMB Debug/../../obj/usbd_core.o + .text.USBD_IsoINIncomplete + 0x0800245c 0x10 THUMB Debug/../../obj/usbd_core.o + .text.USBD_IsoOUTIncomplete + 0x0800246c 0x10 THUMB Debug/../../obj/usbd_core.o + .text.USBD_DevConnected + 0x0800247c 0x18 THUMB Debug/../../obj/usbd_core.o + .text.USBD_DevDisconnected + 0x08002494 0x20 THUMB Debug/../../obj/usbd_core.o + .text.USBD_Reset + 0x080024b4 0x30 THUMB Debug/../../obj/usbd_core.o + .text.USBD_SetupStage + 0x080024e4 0x4c THUMB Debug/../../obj/usbd_core.o + .text.USBD_DataInStage + 0x08002530 0xbc THUMB Debug/../../obj/usbd_core.o + .text.USBD_DataOutStage + 0x080025ec 0x7c THUMB Debug/../../obj/usbd_core.o + .text.USBD_Init + 0x08002668 0x38 THUMB Debug/../../obj/usbd_core.o + 0x08002668 USBD_Init + .text.USBD_SetCfg + 0x080026a0 0x18 THUMB Debug/../../obj/usbd_core.o + 0x080026a0 USBD_SetCfg + .text.USBD_ClrCfg + 0x080026b8 0x10 THUMB Debug/../../obj/usbd_core.o + 0x080026b8 USBD_ClrCfg + .text.USBD_CtlSendData + 0x080026c8 0x20 THUMB Debug/../../obj/usbd_ioreq.o + 0x080026c8 USBD_CtlSendData + .text.USBD_CtlContinueSendData + 0x080026e8 0x14 THUMB Debug/../../obj/usbd_ioreq.o + 0x080026e8 USBD_CtlContinueSendData + .text.USBD_CtlContinueRx + 0x080026fc 0x14 THUMB Debug/../../obj/usbd_ioreq.o + 0x080026fc USBD_CtlContinueRx + .text.USBD_CtlSendStatus + 0x08002710 0x20 THUMB Debug/../../obj/usbd_ioreq.o + 0x08002710 USBD_CtlSendStatus + .text.USBD_CtlReceiveStatus + 0x08002730 0x20 THUMB Debug/../../obj/usbd_ioreq.o + 0x08002730 USBD_CtlReceiveStatus + .text.USBD_ParseSetupRequest + 0x08002750 0x44 THUMB Debug/../../obj/usbd_req.o + 0x08002750 USBD_ParseSetupRequest + .text.USBD_CtlError + 0x08002794 0x1c THUMB Debug/../../obj/usbd_req.o + 0x08002794 USBD_CtlError + .text.USBD_StdEPReq + 0x080027b0 0xd8 THUMB Debug/../../obj/usbd_req.o + 0x080027b0 USBD_StdEPReq + .text.USBD_StdItfReq + 0x08002888 0x34 THUMB Debug/../../obj/usbd_req.o + 0x08002888 USBD_StdItfReq + .text.USBD_StdDevReq + 0x080028bc 0x2e8 THUMB Debug/../../obj/usbd_req.o + 0x080028bc USBD_StdDevReq + .text.USBD_GetString + 0x08002ba4 0x4c THUMB Debug/../../obj/usbd_req.o + 0x08002ba4 USBD_GetString + .text.USB_OTG_CoreReset + 0x08002bf0 0x90 THUMB Debug/../../obj/usb_core.o + .text.USB_OTG_WritePacket + 0x08002c80 0x54 THUMB Debug/../../obj/usb_core.o + 0x08002c80 USB_OTG_WritePacket + .text.USB_OTG_ReadPacket + 0x08002cd4 0x50 THUMB Debug/../../obj/usb_core.o + 0x08002cd4 USB_OTG_ReadPacket + .text.USB_OTG_SelectCore + 0x08002d24 0x1f0 THUMB Debug/../../obj/usb_core.o + 0x08002d24 USB_OTG_SelectCore + .text.USB_OTG_CoreInit + 0x08002f14 0x8c THUMB Debug/../../obj/usb_core.o + 0x08002f14 USB_OTG_CoreInit + .text.USB_OTG_EnableGlobalInt + 0x08002fa0 0x10 THUMB Debug/../../obj/usb_core.o + 0x08002fa0 USB_OTG_EnableGlobalInt + .text.USB_OTG_DisableGlobalInt + 0x08002fb0 0x10 THUMB Debug/../../obj/usb_core.o + 0x08002fb0 USB_OTG_DisableGlobalInt + .text.USB_OTG_FlushTxFifo + 0x08002fc0 0x58 THUMB Debug/../../obj/usb_core.o + 0x08002fc0 USB_OTG_FlushTxFifo + .text.USB_OTG_FlushRxFifo + 0x08003018 0x50 THUMB Debug/../../obj/usb_core.o + 0x08003018 USB_OTG_FlushRxFifo + .text.USB_OTG_SetCurrentMode + 0x08003068 0x2c THUMB Debug/../../obj/usb_core.o + 0x08003068 USB_OTG_SetCurrentMode + .text.USB_OTG_IsDeviceMode + 0x08003094 0x10 THUMB Debug/../../obj/usb_core.o + 0x08003094 USB_OTG_IsDeviceMode + .text.USB_OTG_ReadCoreItr + 0x080030a4 0xc THUMB Debug/../../obj/usb_core.o + 0x080030a4 USB_OTG_ReadCoreItr + .text.USB_OTG_EnableDevInt + 0x080030b0 0x48 THUMB Debug/../../obj/usb_core.o + 0x080030b0 USB_OTG_EnableDevInt + .text.USB_OTG_CoreInitDev + 0x080030f8 0x114 THUMB Debug/../../obj/usb_core.o + 0x080030f8 USB_OTG_CoreInitDev + .text.USB_OTG_GetDeviceSpeed + 0x0800320c 0x1c THUMB Debug/../../obj/usb_core.o + 0x0800320c USB_OTG_GetDeviceSpeed + .text.USB_OTG_EP0Activate + 0x08003228 0x2c THUMB Debug/../../obj/usb_core.o + 0x08003228 USB_OTG_EP0Activate + .text.USB_OTG_EPActivate + 0x08003254 0x68 THUMB Debug/../../obj/usb_core.o + 0x08003254 USB_OTG_EPActivate + .text.USB_OTG_EPDeactivate + 0x080032bc 0x48 THUMB Debug/../../obj/usb_core.o + 0x080032bc USB_OTG_EPDeactivate + .text.USB_OTG_EPStartXfer + 0x08003304 0x178 THUMB Debug/../../obj/usb_core.o + 0x08003304 USB_OTG_EPStartXfer + .text.USB_OTG_EP0StartXfer + 0x0800347c 0x108 THUMB Debug/../../obj/usb_core.o + 0x0800347c USB_OTG_EP0StartXfer + .text.USB_OTG_EPSetStall + 0x08003584 0x38 THUMB Debug/../../obj/usb_core.o + 0x08003584 USB_OTG_EPSetStall + .text.USB_OTG_EPClearStall + 0x080035bc 0x28 THUMB Debug/../../obj/usb_core.o + 0x080035bc USB_OTG_EPClearStall + .text.USB_OTG_ReadDevAllOutEp_itr + 0x080035e4 0xc THUMB Debug/../../obj/usb_core.o + 0x080035e4 USB_OTG_ReadDevAllOutEp_itr + .text.USB_OTG_ReadDevOutEP_itr + 0x080035f0 0x10 THUMB Debug/../../obj/usb_core.o + 0x080035f0 USB_OTG_ReadDevOutEP_itr + .text.USB_OTG_ReadDevAllInEPItr + 0x08003600 0xc THUMB Debug/../../obj/usb_core.o + 0x08003600 USB_OTG_ReadDevAllInEPItr + .text.USB_OTG_EP0_OutStart + 0x0800360c 0x3c THUMB Debug/../../obj/usb_core.o + 0x0800360c USB_OTG_EP0_OutStart + .text.DCD_Init + 0x08003648 0xa0 THUMB Debug/../../obj/usb_dcd.o + 0x08003648 DCD_Init + .text.DCD_EP_Open + 0x080036e8 0x4c THUMB Debug/../../obj/usb_dcd.o + 0x080036e8 DCD_EP_Open + .text.DCD_EP_Close + 0x08003734 0x2c THUMB Debug/../../obj/usb_dcd.o + 0x08003734 DCD_EP_Close + .text.DCD_EP_PrepareRx + 0x08003760 0x40 THUMB Debug/../../obj/usb_dcd.o + 0x08003760 DCD_EP_PrepareRx + .text.DCD_EP_Tx + 0x080037a0 0x3c THUMB Debug/../../obj/usb_dcd.o + 0x080037a0 DCD_EP_Tx + .text.DCD_EP_Stall + 0x080037dc 0x40 THUMB Debug/../../obj/usb_dcd.o + 0x080037dc DCD_EP_Stall + .text.DCD_EP_ClrStall + 0x0800381c 0x40 THUMB Debug/../../obj/usb_dcd.o + 0x0800381c DCD_EP_ClrStall + .text.DCD_EP_SetAddress + 0x0800385c 0x10 THUMB Debug/../../obj/usb_dcd.o + 0x0800385c DCD_EP_SetAddress + .text.DCD_DevDisconnect + 0x0800386c 0x10 THUMB Debug/../../obj/usb_dcd.o + 0x0800386c DCD_DevDisconnect + .text.USBD_OTG_ISR_Handler + 0x0800387c 0x534 THUMB Debug/../../obj/usb_dcd_int.o + 0x0800387c USBD_OTG_ISR_Handler + .text.UsbConnectHook + 0x08003db0 0x4 THUMB Debug/../../obj/hooks.o + 0x08003db0 UsbConnectHook + .text.UsbEnterLowPowerModeHook + 0x08003db4 0x4 THUMB Debug/../../obj/hooks.o + 0x08003db4 UsbEnterLowPowerModeHook + .text.UsbLeaveLowPowerModeHook + 0x08003db8 0x4 THUMB Debug/../../obj/hooks.o + 0x08003db8 UsbLeaveLowPowerModeHook + .text.CpuUserProgramStartHook + 0x08003dbc 0x18 THUMB Debug/../../obj/hooks.o + 0x08003dbc CpuUserProgramStartHook .text.FileIsFirmwareUpdateRequestedHook - 0x080029d4 0x48 THUMB Debug/../../obj/hooks.o - 0x080029d4 FileIsFirmwareUpdateRequestedHook + 0x08003dd4 0x3c THUMB Debug/../../obj/hooks.o + 0x08003dd4 FileIsFirmwareUpdateRequestedHook .text.FileGetFirmwareFilenameHook - 0x08002a1c 0xc THUMB Debug/../../obj/hooks.o - 0x08002a1c FileGetFirmwareFilenameHook + 0x08003e10 0xc THUMB Debug/../../obj/hooks.o + 0x08003e10 FileGetFirmwareFilenameHook .text.FileFirmwareUpdateStartedHook - 0x08002a28 0x38 THUMB Debug/../../obj/hooks.o - 0x08002a28 FileFirmwareUpdateStartedHook + 0x08003e1c 0x28 THUMB Debug/../../obj/hooks.o + 0x08003e1c FileFirmwareUpdateStartedHook .text.FileFirmwareUpdateCompletedHook - 0x08002a60 0x44 THUMB Debug/../../obj/hooks.o - 0x08002a60 FileFirmwareUpdateCompletedHook + 0x08003e44 0x38 THUMB Debug/../../obj/hooks.o + 0x08003e44 FileFirmwareUpdateCompletedHook .text.FileFirmwareUpdateErrorHook - 0x08002aa4 0x20 THUMB Debug/../../obj/hooks.o - 0x08002aa4 FileFirmwareUpdateErrorHook + 0x08003e7c 0x14 THUMB Debug/../../obj/hooks.o + 0x08003e7c FileFirmwareUpdateErrorHook .text.FileFirmwareUpdateLogHook - 0x08002ac4 0x68 THUMB Debug/../../obj/hooks.o - 0x08002ac4 FileFirmwareUpdateLogHook - .text.main 0x08002b2c 0xe0 THUMB Debug/../../obj/main.o - 0x08002b2c main + 0x08003e90 0x58 THUMB Debug/../../obj/hooks.o + 0x08003e90 FileFirmwareUpdateLogHook + .text.startup.main + 0x08003ee8 0xf8 THUMB Debug/../../obj/main.o + 0x08003ee8 main + .text.USB_OTG_BSP_Init + 0x08003fe0 0xb0 THUMB Debug/../../obj/usb_bsp.o + 0x08003fe0 USB_OTG_BSP_Init + .text.USB_OTG_BSP_EnableInterrupt + 0x08004090 0x4 THUMB Debug/../../obj/usb_bsp.o + 0x08004090 USB_OTG_BSP_EnableInterrupt + .text.USB_OTG_BSP_uDelay + 0x08004094 0x1c THUMB Debug/../../obj/usb_bsp.o + 0x08004094 USB_OTG_BSP_uDelay + .text.USB_OTG_BSP_mDelay + 0x080040b0 0x24 THUMB Debug/../../obj/usb_bsp.o + 0x080040b0 USB_OTG_BSP_mDelay + .text.USBD_bulk_GetCfgDesc + 0x080040d4 0x10 THUMB Debug/../../obj/usbd_bulk.o + .text.usbd_bulk_SOF + 0x080040e4 0x18 THUMB Debug/../../obj/usbd_bulk.o + .text.usbd_bulk_DataIn + 0x080040fc 0xc THUMB Debug/../../obj/usbd_bulk.o + .text.usbd_bulk_DataOut + 0x08004108 0xc THUMB Debug/../../obj/usbd_bulk.o + .text.usbd_bulk_DeInit + 0x08004114 0x18 THUMB Debug/../../obj/usbd_bulk.o + .text.usbd_bulk_Init + 0x0800412c 0x30 THUMB Debug/../../obj/usbd_bulk.o + .text.usbd_bulk_Setup + 0x0800415c 0x6c THUMB Debug/../../obj/usbd_bulk.o + .text.usbd_bulk_get_rx_buffer_ptr + 0x080041c8 0xc THUMB Debug/../../obj/usbd_bulk.o + 0x080041c8 usbd_bulk_get_rx_buffer_ptr + .text.USBD_USR_DeviceDescriptor + 0x080041d4 0x10 THUMB Debug/../../obj/usbd_desc.o + 0x080041d4 USBD_USR_DeviceDescriptor + .text.USBD_USR_LangIDStrDescriptor + 0x080041e4 0x10 THUMB Debug/../../obj/usbd_desc.o + 0x080041e4 USBD_USR_LangIDStrDescriptor + .text.USBD_USR_InterfaceStrDescriptor + 0x080041f4 0x20 THUMB Debug/../../obj/usbd_desc.o + 0x080041f4 USBD_USR_InterfaceStrDescriptor + .text.USBD_USR_ConfigStrDescriptor + 0x08004214 0x20 THUMB Debug/../../obj/usbd_desc.o + 0x08004214 USBD_USR_ConfigStrDescriptor + .text.USBD_USR_SerialStrDescriptor + 0x08004234 0x20 THUMB Debug/../../obj/usbd_desc.o + 0x08004234 USBD_USR_SerialStrDescriptor + .text.USBD_USR_ManufacturerStrDescriptor + 0x08004254 0x20 THUMB Debug/../../obj/usbd_desc.o + 0x08004254 USBD_USR_ManufacturerStrDescriptor + .text.USBD_USR_ProductStrDescriptor + 0x08004274 0x20 THUMB Debug/../../obj/usbd_desc.o + 0x08004274 USBD_USR_ProductStrDescriptor + .text.USBD_USR_Init + 0x08004294 0x4 THUMB Debug/../../obj/usbd_usr.o + 0x08004294 USBD_USR_Init + .text.USBD_USR_DeviceReset + 0x08004298 0x4 THUMB Debug/../../obj/usbd_usr.o + 0x08004298 USBD_USR_DeviceReset + .text.USBD_USR_DeviceConfigured + 0x0800429c 0x4 THUMB Debug/../../obj/usbd_usr.o + 0x0800429c USBD_USR_DeviceConfigured + .text.USBD_USR_DeviceDisconnected + 0x080042a0 0x8 THUMB Debug/../../obj/usbd_usr.o + 0x080042a0 USBD_USR_DeviceDisconnected + .text.USBD_USR_DeviceConnected + 0x080042a8 0x8 THUMB Debug/../../obj/usbd_usr.o + 0x080042a8 USBD_USR_DeviceConnected + .text.USBD_USR_DeviceResumed + 0x080042b0 0x4 THUMB Debug/../../obj/usbd_usr.o + 0x080042b0 USBD_USR_DeviceResumed + .text.USBD_USR_DeviceSuspended + 0x080042b4 0x4 THUMB Debug/../../obj/usbd_usr.o + 0x080042b4 USBD_USR_DeviceSuspended .text.UnusedISR - 0x08002c0c 0x14 THUMB Debug/../../obj/vectors.o - 0x08002c0c UnusedISR + 0x080042b8 0x10 THUMB Debug/../../obj/vectors.o + 0x080042b8 UnusedISR .text.CpuStartUserProgram - 0x08002c20 0x30 THUMB Debug/../../obj/cpu.o - 0x08002c20 CpuStartUserProgram + 0x080042c8 0x3c THUMB Debug/../../obj/cpu.o + 0x080042c8 CpuStartUserProgram .text.CpuMemCopy - 0x08002c50 0x60 THUMB Debug/../../obj/cpu.o - 0x08002c50 CpuMemCopy + 0x08004304 0x54 THUMB Debug/../../obj/cpu.o + 0x08004304 CpuMemCopy .text.FlashGetSector - 0x08002cb0 0x150 THUMB Debug/../../obj/flash.o + 0x08004358 0x130 THUMB Debug/../../obj/flash.o .text.FlashWriteBlock - 0x08002e00 0xa4 THUMB Debug/../../obj/flash.o - .text.FlashInitBlock - 0x08002ea4 0x30 THUMB Debug/../../obj/flash.o + 0x08004488 0x9c THUMB Debug/../../obj/flash.o .text.FlashSwitchBlock - 0x08002ed4 0x54 THUMB Debug/../../obj/flash.o + 0x08004524 0x54 THUMB Debug/../../obj/flash.o .text.FlashAddToBlock - 0x08002f28 0x130 THUMB Debug/../../obj/flash.o + 0x08004578 0x110 THUMB Debug/../../obj/flash.o .text.FlashInit - 0x08003058 0x1c THUMB Debug/../../obj/flash.o - 0x08003058 FlashInit + 0x08004688 0x1c THUMB Debug/../../obj/flash.o + 0x08004688 FlashInit .text.FlashWrite - 0x08003074 0x64 THUMB Debug/../../obj/flash.o - 0x08003074 FlashWrite + 0x080046a4 0x4c THUMB Debug/../../obj/flash.o + 0x080046a4 FlashWrite .text.FlashErase - 0x080030d8 0x120 THUMB Debug/../../obj/flash.o - 0x080030d8 FlashErase + 0x080046f0 0xc4 THUMB Debug/../../obj/flash.o + 0x080046f0 FlashErase .text.FlashWriteChecksum - 0x080031f8 0x5c THUMB Debug/../../obj/flash.o - 0x080031f8 FlashWriteChecksum + 0x080047b4 0x48 THUMB Debug/../../obj/flash.o + 0x080047b4 FlashWriteChecksum .text.FlashVerifyChecksum - 0x08003254 0x68 THUMB Debug/../../obj/flash.o - 0x08003254 FlashVerifyChecksum + 0x080047fc 0x6c THUMB Debug/../../obj/flash.o + 0x080047fc FlashVerifyChecksum .text.FlashDone - 0x080032bc 0x50 THUMB Debug/../../obj/flash.o - 0x080032bc FlashDone + 0x08004868 0x34 THUMB Debug/../../obj/flash.o + 0x08004868 FlashDone .text.FlashGetUserProgBaseAddress - 0x0800330c 0xc THUMB Debug/../../obj/flash.o - 0x0800330c FlashGetUserProgBaseAddress - .text.NvmInit 0x08003318 0x8 THUMB Debug/../../obj/nvm.o - 0x08003318 NvmInit + 0x0800489c 0xc THUMB Debug/../../obj/flash.o + 0x0800489c FlashGetUserProgBaseAddress + .text.NvmInit 0x080048a8 0x4 THUMB Debug/../../obj/nvm.o + 0x080048a8 NvmInit .text.NvmWrite - 0x08003320 0x8 THUMB Debug/../../obj/nvm.o - 0x08003320 NvmWrite + 0x080048ac 0x4 THUMB Debug/../../obj/nvm.o + 0x080048ac NvmWrite .text.NvmErase - 0x08003328 0x8 THUMB Debug/../../obj/nvm.o - 0x08003328 NvmErase + 0x080048b0 0x4 THUMB Debug/../../obj/nvm.o + 0x080048b0 NvmErase .text.NvmVerifyChecksum - 0x08003330 0x8 THUMB Debug/../../obj/nvm.o - 0x08003330 NvmVerifyChecksum - .text.NvmDone 0x08003338 0x14 THUMB Debug/../../obj/nvm.o - 0x08003338 NvmDone - .text.TimerReset - 0x0800334c 0x10 THUMB Debug/../../obj/timer.o - 0x0800334c TimerReset + 0x080048b4 0x4 THUMB Debug/../../obj/nvm.o + 0x080048b4 NvmVerifyChecksum + .text.NvmDone 0x080048b8 0x14 THUMB Debug/../../obj/nvm.o + 0x080048b8 NvmDone .text.TimerInit - 0x0800335c 0x30 THUMB Debug/../../obj/timer.o - 0x0800335c TimerInit + 0x080048cc 0x28 THUMB Debug/../../obj/timer.o + 0x080048cc TimerInit + .text.TimerReset + 0x080048f4 0x10 THUMB Debug/../../obj/timer.o + 0x080048f4 TimerReset .text.TimerUpdate - 0x0800338c 0x24 THUMB Debug/../../obj/timer.o - 0x0800338c TimerUpdate + 0x08004904 0x1c THUMB Debug/../../obj/timer.o + 0x08004904 TimerUpdate .text.TimerGet - 0x080033b0 0x14 THUMB Debug/../../obj/timer.o - 0x080033b0 TimerGet + 0x08004920 0x20 THUMB Debug/../../obj/timer.o + 0x08004920 TimerGet .text.UartReceiveByte - 0x080033c4 0x34 THUMB Debug/../../obj/uart.o - .text.UartTransmitByte - 0x080033f8 0x48 THUMB Debug/../../obj/uart.o + 0x08004940 0x30 THUMB Debug/../../obj/uart.o .text.UartInit - 0x08003440 0x44 THUMB Debug/../../obj/uart.o - 0x08003440 UartInit + 0x08004970 0x40 THUMB Debug/../../obj/uart.o + 0x08004970 UartInit .text.UartTransmitPacket - 0x08003484 0xe4 THUMB Debug/../../obj/uart.o - 0x08003484 UartTransmitPacket + 0x080049b0 0xb0 THUMB Debug/../../obj/uart.o + 0x080049b0 UartTransmitPacket .text.UartReceivePacket - 0x08003568 0xc4 THUMB Debug/../../obj/uart.o - 0x08003568 UartReceivePacket - .text.CanInit 0x0800362c 0x1b4 THUMB Debug/../../obj/can.o - 0x0800362c CanInit + 0x08004a60 0x70 THUMB Debug/../../obj/uart.o + 0x08004a60 UartReceivePacket + .text.CanInit 0x08004ad0 0x174 THUMB Debug/../../obj/can.o + 0x08004ad0 CanInit .text.CanTransmitPacket - 0x080037e0 0xac THUMB Debug/../../obj/can.o - 0x080037e0 CanTransmitPacket + 0x08004c44 0x9c THUMB Debug/../../obj/can.o + 0x08004c44 CanTransmitPacket .text.CanReceivePacket - 0x0800388c 0x98 THUMB Debug/../../obj/can.o - 0x0800388c CanReceivePacket + 0x08004ce0 0x78 THUMB Debug/../../obj/can.o + 0x08004ce0 CanReceivePacket + .text.UsbFifoMgrWrite + 0x08004d58 0x54 THUMB Debug/../../obj/usb.o + .text.UsbFifoMgrRead + 0x08004dac 0x50 THUMB Debug/../../obj/usb.o + .text.UsbInit 0x08004dfc 0xb8 THUMB Debug/../../obj/usb.o + 0x08004dfc UsbInit + .text.UsbFree 0x08004eb4 0x18 THUMB Debug/../../obj/usb.o + 0x08004eb4 UsbFree + .text.UsbTransmitPacket + 0x08004ecc 0xcc THUMB Debug/../../obj/usb.o + 0x08004ecc UsbTransmitPacket + .text.UsbReceivePacket + 0x08004f98 0x88 THUMB Debug/../../obj/usb.o + 0x08004f98 UsbReceivePacket + .text.UsbTransmitPipeBulkIN + 0x08005020 0xf4 THUMB Debug/../../obj/usb.o + 0x08005020 UsbTransmitPipeBulkIN + .text.UsbReceivePipeBulkOUT + 0x08005114 0xcc THUMB Debug/../../obj/usb.o + 0x08005114 UsbReceivePipeBulkOUT .text.AssertFailure - 0x08003924 0x1c THUMB Debug/../../obj/assert.o - 0x08003924 AssertFailure + 0x080051e0 0x18 THUMB Debug/../../obj/assert.o + 0x080051e0 AssertFailure .text.BackDoorCheck - 0x08003940 0x54 THUMB Debug/../../obj/backdoor.o - 0x08003940 BackDoorCheck + 0x080051f8 0x48 THUMB Debug/../../obj/backdoor.o + 0x080051f8 BackDoorCheck .text.BackDoorInit - 0x08003994 0x24 THUMB Debug/../../obj/backdoor.o - 0x08003994 BackDoorInit + 0x08005240 0x24 THUMB Debug/../../obj/backdoor.o + 0x08005240 BackDoorInit .text.BootInit - 0x080039b8 0x1c THUMB Debug/../../obj/boot.o - 0x080039b8 BootInit + 0x08005264 0x20 THUMB Debug/../../obj/boot.o + 0x08005264 BootInit .text.BootTask - 0x080039d4 0x18 THUMB Debug/../../obj/boot.o - 0x080039d4 BootTask - .text.ComInit 0x080039ec 0x30 THUMB Debug/../../obj/com.o - 0x080039ec ComInit - .text.ComTask 0x08003a1c 0x84 THUMB Debug/../../obj/com.o - 0x08003a1c ComTask - .text.ComFree 0x08003aa0 0x4 THUMB Debug/../../obj/com.o - 0x08003aa0 ComFree + 0x08005284 0x1c THUMB Debug/../../obj/boot.o + 0x08005284 BootTask + .text.ComInit 0x080052a0 0x30 THUMB Debug/../../obj/com.o + 0x080052a0 ComInit + .text.ComTask 0x080052d0 0x80 THUMB Debug/../../obj/com.o + 0x080052d0 ComTask + .text.ComFree 0x08005350 0x4 THUMB Debug/../../obj/com.o + 0x08005350 ComFree .text.ComTransmitPacket - 0x08003aa4 0x4c THUMB Debug/../../obj/com.o - 0x08003aa4 ComTransmitPacket + 0x08005354 0x54 THUMB Debug/../../obj/com.o + 0x08005354 ComTransmitPacket .text.ComGetActiveInterfaceMaxRxLen - 0x08003af0 0x20 THUMB Debug/../../obj/com.o - 0x08003af0 ComGetActiveInterfaceMaxRxLen + 0x080053a8 0x20 THUMB Debug/../../obj/com.o + 0x080053a8 ComGetActiveInterfaceMaxRxLen .text.ComGetActiveInterfaceMaxTxLen - 0x08003b10 0x20 THUMB Debug/../../obj/com.o - 0x08003b10 ComGetActiveInterfaceMaxTxLen + 0x080053c8 0x20 THUMB Debug/../../obj/com.o + 0x080053c8 ComGetActiveInterfaceMaxTxLen .text.ComIsConnected - 0x08003b30 0x8 THUMB Debug/../../obj/com.o - 0x08003b30 ComIsConnected - .text.CopInit 0x08003b38 0x4 THUMB Debug/../../obj/cop.o - 0x08003b38 CopInit + 0x080053e8 0x4 THUMB Debug/../../obj/com.o + 0x080053e8 ComIsConnected + .text.CopInit 0x080053ec 0x4 THUMB Debug/../../obj/cop.o + 0x080053ec CopInit .text.CopService - 0x08003b3c 0x4 THUMB Debug/../../obj/cop.o - 0x08003b3c CopService - .text.XcpProtectResources - 0x08003b40 0x10 THUMB Debug/../../obj/xcp.o - .text.XcpSetCtoError - 0x08003b50 0x1c THUMB Debug/../../obj/xcp.o - .text.XcpInit 0x08003b6c 0x20 THUMB Debug/../../obj/xcp.o - 0x08003b6c XcpInit + 0x080053f0 0x4 THUMB Debug/../../obj/cop.o + 0x080053f0 CopService + .text.XcpInit 0x080053f4 0x1c THUMB Debug/../../obj/xcp.o + 0x080053f4 XcpInit .text.XcpIsConnected - 0x08003b8c 0x14 THUMB Debug/../../obj/xcp.o - 0x08003b8c XcpIsConnected + 0x08005410 0x14 THUMB Debug/../../obj/xcp.o + 0x08005410 XcpIsConnected .text.XcpPacketTransmitted - 0x08003ba0 0x14 THUMB Debug/../../obj/xcp.o - 0x08003ba0 XcpPacketTransmitted + 0x08005424 0x10 THUMB Debug/../../obj/xcp.o + 0x08005424 XcpPacketTransmitted .text.XcpPacketReceived - 0x08003bb4 0x438 THUMB Debug/../../obj/xcp.o - 0x08003bb4 XcpPacketReceived - .text.FileLibLongToIntString - 0x08003fec 0x50 THUMB Debug/../../obj/file.o + 0x08005434 0x31c THUMB Debug/../../obj/xcp.o + 0x08005434 XcpPacketReceived .text.FileLibHexStringToByte - 0x0800403c 0x70 THUMB Debug/../../obj/file.o - .text.FileLibByteNibbleToChar - 0x080040ac 0x1c THUMB Debug/../../obj/file.o + 0x08005750 0x5c THUMB Debug/../../obj/file.o .text.FileLibByteToHexString - 0x080040c8 0x24 THUMB Debug/../../obj/file.o + 0x080057ac 0x44 THUMB Debug/../../obj/file.o .text.FileInit - 0x080040ec 0x30 THUMB Debug/../../obj/file.o - 0x080040ec FileInit + 0x080057f0 0x2c THUMB Debug/../../obj/file.o + 0x080057f0 FileInit .text.FileIsIdle - 0x0800411c 0x14 THUMB Debug/../../obj/file.o - 0x0800411c FileIsIdle + 0x0800581c 0x14 THUMB Debug/../../obj/file.o + 0x0800581c FileIsIdle .text.FileHandleFirmwareUpdateRequest - 0x08004130 0x3c THUMB Debug/../../obj/file.o - 0x08004130 FileHandleFirmwareUpdateRequest + 0x08005830 0x24 THUMB Debug/../../obj/file.o + 0x08005830 FileHandleFirmwareUpdateRequest .text.FileSrecGetLineType - 0x0800416c 0x44 THUMB Debug/../../obj/file.o - 0x0800416c FileSrecGetLineType + 0x08005854 0x38 THUMB Debug/../../obj/file.o + 0x08005854 FileSrecGetLineType .text.FileSrecVerifyChecksum - 0x080041b0 0x94 THUMB Debug/../../obj/file.o - 0x080041b0 FileSrecVerifyChecksum + 0x0800588c 0x74 THUMB Debug/../../obj/file.o + 0x0800588c FileSrecVerifyChecksum .text.FileSrecParseLine - 0x08004244 0x1a4 THUMB Debug/../../obj/file.o - 0x08004244 FileSrecParseLine + 0x08005900 0x154 THUMB Debug/../../obj/file.o + 0x08005900 FileSrecParseLine .text.FileTask - 0x080043e8 0x4b4 THUMB Debug/../../obj/file.o - 0x080043e8 FileTask - .text.mem_cpy 0x0800489c 0x54 THUMB Debug/../../obj/ff.o - .text.mem_set 0x080048f0 0x38 THUMB Debug/../../obj/ff.o - .text.chk_chr 0x08004928 0x18 THUMB Debug/../../obj/ff.o - .text.ld_clust - 0x08004940 0x20 THUMB Debug/../../obj/ff.o - .text.st_clust - 0x08004960 0x18 THUMB Debug/../../obj/ff.o - .text.sum_sfn 0x08004978 0xa4 THUMB Debug/../../obj/ff.o + 0x08005a54 0x3e4 THUMB Debug/../../obj/file.o + 0x08005a54 FileTask .text.validate - 0x08004a1c 0x44 THUMB Debug/../../obj/ff.o - .text.check_fs - 0x08004a60 0xa8 THUMB Debug/../../obj/ff.o - .text.chk_mounted - 0x08004b08 0x400 THUMB Debug/../../obj/ff.o + 0x08005e38 0x2c THUMB Debug/../../obj/ff.o .text.get_fileinfo - 0x08004f08 0x248 THUMB Debug/../../obj/ff.o + 0x08005e64 0x20c THUMB Debug/../../obj/ff.o + .text.check_fs + 0x08006070 0x8c THUMB Debug/../../obj/ff.o + .text.chk_mounted + 0x080060fc 0x328 THUMB Debug/../../obj/ff.o .text.sync_window - 0x08005150 0xd8 THUMB Debug/../../obj/ff.o + 0x08006424 0x70 THUMB Debug/../../obj/ff.o + .text.sync_fs 0x08006494 0xcc THUMB Debug/../../obj/ff.o .text.move_window - 0x08005228 0x3c THUMB Debug/../../obj/ff.o - .text.sync_fs 0x08005264 0xd4 THUMB Debug/../../obj/ff.o - .text.clust2sect - 0x08005338 0x20 THUMB Debug/../../obj/ff.o - 0x08005338 clust2sect - .text.get_fat 0x08005358 0x110 THUMB Debug/../../obj/ff.o - 0x08005358 get_fat - .text.dir_sdi 0x08005468 0xac THUMB Debug/../../obj/ff.o - .text.put_fat 0x08005514 0x134 THUMB Debug/../../obj/ff.o - 0x08005514 put_fat + 0x08006560 0x30 THUMB Debug/../../obj/ff.o + .text.get_fat 0x08006590 0xd0 THUMB Debug/../../obj/ff.o + 0x08006590 get_fat + .text.dir_sdi 0x08006660 0x94 THUMB Debug/../../obj/ff.o + .text.put_fat 0x080066f4 0x110 THUMB Debug/../../obj/ff.o + 0x080066f4 put_fat .text.create_chain - 0x08005648 0xc8 THUMB Debug/../../obj/ff.o + 0x08006804 0xa0 THUMB Debug/../../obj/ff.o .text.dir_next - 0x08005710 0x150 THUMB Debug/../../obj/ff.o - .text.dir_find - 0x08005860 0x478 THUMB Debug/../../obj/ff.o + 0x080068a4 0x128 THUMB Debug/../../obj/ff.o + .text.dir_find.part.6 + 0x080069cc 0x4c8 THUMB Debug/../../obj/ff.o .text.follow_path - 0x08005cd8 0x408 THUMB Debug/../../obj/ff.o + 0x08006e94 0x348 THUMB Debug/../../obj/ff.o .text.dir_remove - 0x080060e0 0x5c THUMB Debug/../../obj/ff.o - .text.dir_read - 0x0800613c 0x2c4 THUMB Debug/../../obj/ff.o + 0x080071dc 0x50 THUMB Debug/../../obj/ff.o + .text.dir_read.constprop.8 + 0x0800722c 0x354 THUMB Debug/../../obj/ff.o .text.remove_chain - 0x08006400 0x7c THUMB Debug/../../obj/ff.o + 0x08007580 0x54 THUMB Debug/../../obj/ff.o .text.gen_numname - 0x0800647c 0x140 THUMB Debug/../../obj/ff.o - 0x0800647c gen_numname + 0x080075d4 0x130 THUMB Debug/../../obj/ff.o + 0x080075d4 gen_numname .text.dir_register - 0x080065bc 0x298 THUMB Debug/../../obj/ff.o - .text.f_mount 0x08006854 0x34 THUMB Debug/../../obj/ff.o - 0x08006854 f_mount - .text.f_open 0x08006888 0x1a4 THUMB Debug/../../obj/ff.o - 0x08006888 f_open - .text.f_read 0x08006a2c 0x1c8 THUMB Debug/../../obj/ff.o - 0x08006a2c f_read - .text.f_write 0x08006bf4 0x204 THUMB Debug/../../obj/ff.o - 0x08006bf4 f_write - .text.f_sync 0x08006df8 0xb4 THUMB Debug/../../obj/ff.o - 0x08006df8 f_sync - .text.f_close 0x08006eac 0x18 THUMB Debug/../../obj/ff.o - 0x08006eac f_close - .text.f_lseek 0x08006ec4 0x1bc THUMB Debug/../../obj/ff.o - 0x08006ec4 f_lseek - .text.f_stat 0x08007080 0x50 THUMB Debug/../../obj/ff.o - 0x08007080 f_stat + 0x08007704 0x540 THUMB Debug/../../obj/ff.o + .text.f_mount 0x08007c44 0x20 THUMB Debug/../../obj/ff.o + 0x08007c44 f_mount + .text.f_open 0x08007c64 0x18c THUMB Debug/../../obj/ff.o + 0x08007c64 f_open + .text.f_read 0x08007df0 0x1c8 THUMB Debug/../../obj/ff.o + 0x08007df0 f_read + .text.f_write 0x08007fb8 0x254 THUMB Debug/../../obj/ff.o + 0x08007fb8 f_write + .text.f_sync 0x0800820c 0xa8 THUMB Debug/../../obj/ff.o + 0x0800820c f_sync + .text.f_close 0x080082b4 0x10 THUMB Debug/../../obj/ff.o + 0x080082b4 f_close + .text.f_lseek 0x080082c4 0x188 THUMB Debug/../../obj/ff.o + 0x080082c4 f_lseek + .text.f_stat 0x0800844c 0x4c THUMB Debug/../../obj/ff.o + 0x0800844c f_stat .text.f_unlink - 0x080070d0 0xd4 THUMB Debug/../../obj/ff.o - 0x080070d0 f_unlink - .text.f_gets 0x080071a4 0x60 THUMB Debug/../../obj/ff.o - 0x080071a4 f_gets - .text.f_putc 0x08007204 0x38 THUMB Debug/../../obj/ff.o - 0x08007204 f_putc - .text.f_puts 0x0800723c 0x38 THUMB Debug/../../obj/ff.o - 0x0800723c f_puts + 0x08008498 0xd8 THUMB Debug/../../obj/ff.o + 0x08008498 f_unlink + .text.f_gets 0x08008570 0x4c THUMB Debug/../../obj/ff.o + 0x08008570 f_gets + .text.f_putc 0x080085bc 0x38 THUMB Debug/../../obj/ff.o + 0x080085bc f_putc + .text.f_puts 0x080085f4 0x28 THUMB Debug/../../obj/ff.o + 0x080085f4 f_puts .text.ff_convert - 0x08007274 0x78 THUMB Debug/../../obj/unicode.o - 0x08007274 ff_convert + 0x0800861c 0x50 THUMB Debug/../../obj/unicode.o + 0x0800861c ff_convert .text.ff_wtoupper - 0x080072ec 0x34 THUMB Debug/../../obj/unicode.o - 0x080072ec ff_wtoupper - .text.chksum 0x08007320 0xc8 THUMB Debug/../../obj/uip.o - .text.uip_add32 - 0x080073e8 0x7c THUMB Debug/../../obj/uip.o - 0x080073e8 uip_add32 - .text.uip_add_rcv_nxt - 0x08007464 0x30 THUMB Debug/../../obj/uip.o - .text.uip_init - 0x08007494 0x38 THUMB Debug/../../obj/uip.o - 0x08007494 uip_init - .text.uip_listen - 0x080074cc 0x38 THUMB Debug/../../obj/uip.o - 0x080074cc uip_listen - .text.htons 0x08007504 0xc THUMB Debug/../../obj/uip.o - 0x08007504 htons + 0x0800866c 0x2c THUMB Debug/../../obj/unicode.o + 0x0800866c ff_wtoupper + .text.chksum 0x08008698 0xa8 THUMB Debug/../../obj/uip.o .text.upper_layer_chksum - 0x08007510 0x40 THUMB Debug/../../obj/uip.o - .text.uip_tcpchksum - 0x08007550 0xc THUMB Debug/../../obj/uip.o - 0x08007550 uip_tcpchksum + 0x08008740 0x40 THUMB Debug/../../obj/uip.o + .text.uip_add32 + 0x08008780 0x58 THUMB Debug/../../obj/uip.o + 0x08008780 uip_add32 + .text.unlikely.uip_add_rcv_nxt + 0x080087d8 0x30 THUMB Debug/../../obj/uip.o .text.uip_ipchksum - 0x0800755c 0x24 THUMB Debug/../../obj/uip.o - 0x0800755c uip_ipchksum + 0x08008808 0x24 THUMB Debug/../../obj/uip.o + 0x08008808 uip_ipchksum + .text.uip_tcpchksum + 0x0800882c 0x8 THUMB Debug/../../obj/uip.o + 0x0800882c uip_tcpchksum + .text.uip_init + 0x08008834 0x38 THUMB Debug/../../obj/uip.o + 0x08008834 uip_init + .text.uip_listen + 0x0800886c 0x24 THUMB Debug/../../obj/uip.o + 0x0800886c uip_listen .text.uip_process - 0x08007580 0xd28 THUMB Debug/../../obj/uip.o - 0x08007580 uip_process + 0x08008890 0xbc8 THUMB Debug/../../obj/uip.o + 0x08008890 uip_process + .text.htons 0x08009458 0xc THUMB Debug/../../obj/uip.o + 0x08009458 htons .text.uip_send - 0x080082a8 0x2c THUMB Debug/../../obj/uip.o - 0x080082a8 uip_send - .text.uip_arp_update - 0x080082d4 0x40c THUMB Debug/../../obj/uip_arp.o + 0x08009464 0x24 THUMB Debug/../../obj/uip.o + 0x08009464 uip_send + .text.uip_arp_update.constprop.0 + 0x08009488 0x294 THUMB Debug/../../obj/uip_arp.o .text.uip_arp_timer - 0x080086e0 0x74 THUMB Debug/../../obj/uip_arp.o - 0x080086e0 uip_arp_timer + 0x0800971c 0x64 THUMB Debug/../../obj/uip_arp.o + 0x0800971c uip_arp_timer .text.uip_arp_arpin - 0x08008754 0x14c THUMB Debug/../../obj/uip_arp.o - 0x08008754 uip_arp_arpin + 0x08009780 0xbc THUMB Debug/../../obj/uip_arp.o + 0x08009780 uip_arp_arpin .text.uip_arp_out - 0x080088a0 0x314 THUMB Debug/../../obj/uip_arp.o - 0x080088a0 uip_arp_out - .text.NetInit 0x08008bb4 0x78 THUMB Debug/../../obj/net.o - 0x08008bb4 NetInit + 0x0800983c 0x1fc THUMB Debug/../../obj/uip_arp.o + 0x0800983c uip_arp_out + .text.NetInit 0x08009a38 0x78 THUMB Debug/../../obj/net.o + 0x08009a38 NetInit .text.NetTransmitPacket - 0x08008c2c 0x80 THUMB Debug/../../obj/net.o - 0x08008c2c NetTransmitPacket + 0x08009ab0 0x60 THUMB Debug/../../obj/net.o + 0x08009ab0 NetTransmitPacket .text.NetReceivePacket - 0x08008cac 0x118 THUMB Debug/../../obj/net.o - 0x08008cac NetReceivePacket - .text.NetApp 0x08008dc4 0x80 THUMB Debug/../../obj/net.o - 0x08008dc4 NetApp + 0x08009b10 0xc0 THUMB Debug/../../obj/net.o + 0x08009b10 NetReceivePacket + .text.NetApp 0x08009bd0 0x6c THUMB Debug/../../obj/net.o + 0x08009bd0 NetApp .text.libc.isdigit - 0x08008e44 0x10 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) - 0x08008e44 isdigit + 0x08009c3c 0x10 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + 0x08009c3c isdigit .text.libc.toupper - 0x08008e54 0x10 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) - 0x08008e54 toupper + 0x08009c4c 0x10 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + 0x08009c4c toupper .text.libc.memcpy - 0x08008e64 0x48 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) - 0x08008e64 __aeabi_memcpy - 0x08008e64 __aeabi_memcpy4 - 0x08008e64 __aeabi_memcpy8 - 0x08008e64 memcpy + 0x08009c5c 0x48 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + 0x08009c5c __aeabi_memcpy + 0x08009c5c __aeabi_memcpy4 + 0x08009c5c __aeabi_memcpy8 + 0x08009c5c memcpy .text.libc.memset - 0x08008eac 0x70 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) - 0x08008eac memset + 0x08009ca4 0x70 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2_asm.o) + 0x08009ca4 memset .text.libdebugio.__do_debug_operation_mempoll - 0x08008f1c 0x3c C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - 0x08008f1c __do_debug_operation_mempoll + 0x08009d14 0x3c C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + 0x08009d14 __do_debug_operation_mempoll .text.libc.__debug_io_lock - 0x08008f58 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) - 0x08008f58 __debug_io_lock + 0x08009d50 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) + 0x08009d50 __debug_io_lock .text.libc.__debug_io_unlock - 0x08008f5c 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) - 0x08008f5c __debug_io_unlock - 0x08008f60 __text_end__ = (__text_start__ + SIZEOF (.text)) - 0x08008f60 __text_load_end__ = __text_end__ + 0x08009d54 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) + 0x08009d54 __debug_io_unlock + 0x08009d58 __text_end__ = (__text_start__ + SIZEOF (.text)) + 0x08009d58 __text_load_end__ = __text_end__ .vfp11_veneer 0x00000000 0x0 .vfp11_veneer 0x00000000 0x0 linker stubs @@ -3384,98 +3690,110 @@ 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) - 0x08008f60 __dtors_load_start__ = ALIGN (__text_end__, 0x4) + 0x08009d58 __dtors_load_start__ = ALIGN (__text_end__, 0x4) -.dtors 0x08008f60 0x0 - 0x08008f60 __dtors_start__ = . +.dtors 0x08009d58 0x0 + 0x08009d58 __dtors_start__ = . *(SORT(.dtors.*)) *(.dtors) *(.fini_array .fini_array.*) - 0x08008f60 __dtors_end__ = (__dtors_start__ + SIZEOF (.dtors)) - 0x08008f60 __dtors_load_end__ = __dtors_end__ + 0x08009d58 __dtors_end__ = (__dtors_start__ + SIZEOF (.dtors)) + 0x08009d58 __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) - 0x08008f60 __ctors_load_start__ = ALIGN (__dtors_end__, 0x4) + 0x08009d58 __ctors_load_start__ = ALIGN (__dtors_end__, 0x4) -.ctors 0x08008f60 0x0 - 0x08008f60 __ctors_start__ = . +.ctors 0x08009d58 0x0 + 0x08009d58 __ctors_start__ = . *(SORT(.ctors.*)) *(.ctors) *(.init_array .init_array.*) - 0x08008f60 __ctors_end__ = (__ctors_start__ + SIZEOF (.ctors)) - 0x08008f60 __ctors_load_end__ = __ctors_end__ + 0x08009d58 __ctors_end__ = (__ctors_start__ + SIZEOF (.ctors)) + 0x08009d58 __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) - 0x08008f60 __rodata_load_start__ = ALIGN (__ctors_end__, 0x4) + 0x08009d58 __rodata_load_start__ = ALIGN (__ctors_end__, 0x4) -.rodata 0x08008f60 0xa78 - 0x08008f60 __rodata_start__ = . +.rodata 0x08009d58 0xb48 + 0x08009d58 __rodata_start__ = . *(.rodata .rodata.* .gnu.linkonce.r.*) .rodata.str1.4 - 0x08008f60 0x6b THUMB Debug/../../obj/netdev.o + 0x08009d58 0x6b THUMB Debug/../../obj/netdev.o 0x6c (size before relaxing) - *fill* 0x08008fcb 0x1 00 + *fill* 0x08009dc3 0x1 00 + .rodata.CSWTCH.22 + 0x08009dc4 0x4 THUMB Debug/../../obj/usb_core.o .rodata.firmwareFilename - 0x08008fcc 0x20 THUMB Debug/../../obj/hooks.o + 0x08009dc8 0x20 THUMB Debug/../../obj/hooks.o .rodata.str1.4 - 0x08008fec 0xd THUMB Debug/../../obj/hooks.o + 0x08009de8 0xd THUMB Debug/../../obj/hooks.o 0x10 (size before relaxing) - *fill* 0x08008ff9 0x3 00 + *fill* 0x08009df5 0x3 00 .rodata.str1.4 - 0x08008ffc 0x8c THUMB Debug/../../obj/vectors.o + 0x08009df8 0x53 THUMB Debug/../../obj/usbd_desc.o + 0x54 (size before relaxing) + *fill* 0x08009e4b 0x1 00 + .rodata.str1.4 + 0x08009e4c 0x8c THUMB Debug/../../obj/vectors.o .rodata.flashSectorNumToMask - 0x08009088 0x30 THUMB Debug/../../obj/flash.o + 0x08009ed8 0x30 THUMB Debug/../../obj/flash.o .rodata.flashLayout - 0x080090b8 0x6c THUMB Debug/../../obj/flash.o + 0x08009f08 0x6c THUMB Debug/../../obj/flash.o .rodata.str1.4 - 0x08009124 0x7e THUMB Debug/../../obj/uart.o + 0x08009f74 0x7e THUMB Debug/../../obj/uart.o 0x80 (size before relaxing) - *fill* 0x080091a2 0x2 00 + *fill* 0x08009ff2 0x2 00 .rodata.str1.4 - 0x080091a4 0x7d THUMB Debug/../../obj/can.o + 0x08009ff4 0x7d THUMB Debug/../../obj/can.o 0x80 (size before relaxing) - *fill* 0x08009221 0x3 00 + *fill* 0x0800a071 0x3 00 .rodata.canTiming - 0x08009224 0x24 THUMB Debug/../../obj/can.o + 0x0800a074 0x24 THUMB Debug/../../obj/can.o + .rodata.str1.4 + 0x0800a098 0x7d THUMB Debug/../../obj/usb.o + 0x80 (size before relaxing) + *fill* 0x0800a115 0x3 00 + .rodata.CSWTCH.9 + 0x0800a118 0x4 THUMB Debug/../../obj/com.o + .rodata.CSWTCH.12 + 0x0800a11c 0x4 THUMB Debug/../../obj/com.o .rodata.xcpStationId - 0x08009248 0x8 THUMB Debug/../../obj/xcp.o + 0x0800a120 0x8 THUMB Debug/../../obj/xcp.o .rodata.str1.4 - 0x08009250 0x219 THUMB Debug/../../obj/file.o + 0x0800a128 0x219 THUMB Debug/../../obj/file.o 0x220 (size before relaxing) - *fill* 0x08009469 0x3 00 + *fill* 0x0800a341 0x3 00 .rodata.str1.4 - 0x0800946c 0x14 THUMB Debug/../../obj/ff.o - .rodata.ExCvt 0x08009480 0x80 THUMB Debug/../../obj/ff.o - .rodata.LfnOfs - 0x08009500 0x10 THUMB Debug/../../obj/ff.o + 0x0800a344 0x14 THUMB Debug/../../obj/ff.o + .rodata.ExCvt 0x0800a358 0x80 THUMB Debug/../../obj/ff.o .rodata.tbl_lower.3809 - 0x08009510 0x1e0 THUMB Debug/../../obj/unicode.o - .rodata.Tbl 0x080096f0 0x100 THUMB Debug/../../obj/unicode.o + 0x0800a3d8 0x1e0 THUMB Debug/../../obj/unicode.o + .rodata.Tbl 0x0800a5b8 0x100 THUMB Debug/../../obj/unicode.o .rodata.tbl_upper.3810 - 0x080097f0 0x1e0 THUMB Debug/../../obj/unicode.o + 0x0800a6b8 0x1e0 THUMB Debug/../../obj/unicode.o .rodata.broadcast_ethaddr - 0x080099d0 0x8 THUMB Debug/../../obj/uip_arp.o - 0x080099d8 __rodata_end__ = (__rodata_start__ + SIZEOF (.rodata)) - 0x080099d8 __rodata_load_end__ = __rodata_end__ + 0x0800a898 0x8 THUMB Debug/../../obj/uip_arp.o + 0x0800a8a0 __rodata_end__ = (__rodata_start__ + SIZEOF (.rodata)) + 0x0800a8a0 __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) - 0x080099d8 __ARM.exidx_load_start__ = ALIGN (__rodata_end__, 0x4) + 0x0800a8a0 __ARM.exidx_load_start__ = ALIGN (__rodata_end__, 0x4) -.ARM.exidx 0x080099d8 0x0 - 0x080099d8 __ARM.exidx_start__ = . - 0x080099d8 __exidx_start = __ARM.exidx_start__ +.ARM.exidx 0x0800a8a0 0x0 + 0x0800a8a0 __ARM.exidx_start__ = . + 0x0800a8a0 __exidx_start = __ARM.exidx_start__ *(.ARM.exidx .ARM.exidx.*) - 0x080099d8 __ARM.exidx_end__ = (__ARM.exidx_start__ + SIZEOF (.ARM.exidx)) - 0x080099d8 __exidx_end = __ARM.exidx_end__ - 0x080099d8 __ARM.exidx_load_end__ = __ARM.exidx_end__ + 0x0800a8a0 __ARM.exidx_end__ = (__ARM.exidx_start__ + SIZEOF (.ARM.exidx)) + 0x0800a8a0 __exidx_end = __ARM.exidx_end__ + 0x0800a8a0 __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) - 0x080099d8 __fast_load_start__ = ALIGN (__ARM.exidx_end__, 0x4) + 0x0800a8a0 __fast_load_start__ = ALIGN (__ARM.exidx_end__, 0x4) -.fast 0x20000000 0x0 load address 0x080099d8 +.fast 0x20000000 0x0 load address 0x0800a8a0 0x20000000 __fast_start__ = . *(.fast .fast.*) 0x20000000 __fast_end__ = (__fast_start__ + SIZEOF (.fast)) - 0x080099d8 __fast_load_end__ = (__fast_load_start__ + SIZEOF (.fast)) + 0x0800a8a0 __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 @@ -3484,9 +3802,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) - 0x080099d8 __data_load_start__ = ALIGN ((__fast_load_start__ + SIZEOF (.fast)), 0x4) + 0x0800a8a0 __data_load_start__ = ALIGN ((__fast_load_start__ + SIZEOF (.fast)), 0x4) -.data 0x20000000 0x19 load address 0x080099d8 +.data 0x20000000 0xe5 load address 0x0800a8a0 0x20000000 __data_start__ = . *(.data .data.* .gnu.linkonce.d.*) .data.DMAEndOfTransfer @@ -3495,231 +3813,295 @@ Linker script and memory map *fill* 0x20000005 0x3 00 .data.APBAHBPrescTable 0x20000008 0x10 THUMB Debug/../../obj/stm32f4xx_rcc.o + .data.USBD_DCD_INT_fops + 0x20000018 0x4 THUMB Debug/../../obj/usbd_core.o + 0x20000018 USBD_DCD_INT_fops + .data.USBD_DCD_INT_cb + 0x2000001c 0x2c THUMB Debug/../../obj/usbd_core.o + 0x2000001c USBD_DCD_INT_cb + .data.usbd_bulk_CfgDesc + 0x20000048 0x20 THUMB Debug/../../obj/usbd_bulk.o + 0x20000048 usbd_bulk_CfgDesc + .data.USBD_bulk_cb + 0x20000068 0x2c THUMB Debug/../../obj/usbd_bulk.o + 0x20000068 USBD_bulk_cb + .data.USR_desc + 0x20000094 0x1c THUMB Debug/../../obj/usbd_desc.o + 0x20000094 USR_desc + .data.USBD_LangIDDesc + 0x200000b0 0x4 THUMB Debug/../../obj/usbd_desc.o + 0x200000b0 USBD_LangIDDesc + .data.USBD_DeviceDesc + 0x200000b4 0x14 THUMB Debug/../../obj/usbd_desc.o + 0x200000b4 USBD_DeviceDesc + .data.USR_cb 0x200000c8 0x1c THUMB Debug/../../obj/usbd_usr.o + 0x200000c8 USR_cb .data.comActiveInterface - 0x20000018 0x1 THUMB Debug/../../obj/com.o - 0x20000019 __data_end__ = (__data_start__ + SIZEOF (.data)) - 0x080099f1 __data_load_end__ = (__data_load_start__ + SIZEOF (.data)) + 0x200000e4 0x1 THUMB Debug/../../obj/com.o + 0x200000e5 __data_end__ = (__data_start__ + SIZEOF (.data)) + 0x0800a985 __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 0x080099d8 +.data_run 0x20000000 0xe5 load address 0x0800a8a0 0x20000000 __data_run_start__ = . - 0x20000019 . = MAX ((__data_run_start__ + SIZEOF (.data)), .) - *fill* 0x20000000 0x19 00 - 0x20000019 __data_run_end__ = (__data_run_start__ + SIZEOF (.data_run)) - 0x20000019 __data_run_load_end__ = __data_run_end__ + 0x200000e5 . = MAX ((__data_run_start__ + SIZEOF (.data)), .) + *fill* 0x20000000 0xe5 00 + 0x200000e5 __data_run_end__ = (__data_run_start__ + SIZEOF (.data_run)) + 0x200000e5 __data_run_load_end__ = __data_run_end__ 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) + 0x200000e8 __bss_load_start__ = ALIGN (__data_run_end__, 0x4) -.bss 0x2000001c 0x2554 - 0x2000001c __bss_start__ = . +.bss 0x200000e8 0x2e18 + 0x200000e8 __bss_start__ = . *(.bss .bss.* .gnu.linkonce.b.*) .bss.TransferError - 0x2000001c 0x1 THUMB Debug/../../obj/mmc.o - *fill* 0x2000001d 0x3 00 + 0x200000e8 0x1 THUMB Debug/../../obj/mmc.o + *fill* 0x200000e9 0x3 00 .bss.SDIO_DataInitStructure - 0x20000020 0x18 THUMB Debug/../../obj/mmc.o - .bss.CSD_Tab 0x20000038 0x10 THUMB Debug/../../obj/mmc.o - .bss.CardType 0x20000048 0x4 THUMB Debug/../../obj/mmc.o - .bss.CID_Tab 0x2000004c 0x10 THUMB Debug/../../obj/mmc.o + 0x200000ec 0x18 THUMB Debug/../../obj/mmc.o + .bss.CSD_Tab 0x20000104 0x10 THUMB Debug/../../obj/mmc.o + .bss.CardType 0x20000114 0x4 THUMB Debug/../../obj/mmc.o + .bss.CID_Tab 0x20000118 0x10 THUMB Debug/../../obj/mmc.o .bss.TransferEnd - 0x2000005c 0x4 THUMB Debug/../../obj/mmc.o + 0x20000128 0x4 THUMB Debug/../../obj/mmc.o .bss.SDIO_InitStructure - 0x20000060 0x18 THUMB Debug/../../obj/mmc.o - .bss.RCA 0x20000078 0x4 THUMB Debug/../../obj/mmc.o - *fill* 0x2000007c 0x4 00 + 0x2000012c 0x18 THUMB Debug/../../obj/mmc.o + .bss.RCA 0x20000144 0x4 THUMB Debug/../../obj/mmc.o .bss.SDCardInfo - 0x20000080 0x58 THUMB Debug/../../obj/mmc.o + 0x20000148 0x58 THUMB Debug/../../obj/mmc.o .bss.SDIO_CmdInitStructure - 0x200000d8 0x14 THUMB Debug/../../obj/mmc.o + 0x200001a0 0x14 THUMB Debug/../../obj/mmc.o .bss.StopCondition - 0x200000ec 0x4 THUMB Debug/../../obj/mmc.o - *fill* 0x200000f0 0x10 00 + 0x200001b4 0x4 THUMB Debug/../../obj/mmc.o + *fill* 0x200001b8 0x48 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 + 0x20000200 0x80 THUMB Debug/../../obj/netdev.o + 0x20000200 EnetDmaRx + .bss.RxBuff 0x20000280 0x640 THUMB Debug/../../obj/netdev.o + 0x20000280 RxBuff + *fill* 0x200008c0 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 + 0x20000900 0x80 THUMB Debug/../../obj/netdev.o + 0x20000900 EnetDmaTx + .bss.TxBuff 0x20000980 0x640 THUMB Debug/../../obj/netdev.o + 0x20000980 TxBuff + .bss.SET_TEST_MODE + 0x20000fc0 0x4 THUMB Debug/../../obj/usbd_core.o + 0x20000fc0 SET_TEST_MODE + .bss.USBD_StrDesc + 0x20000fc4 0x100 THUMB Debug/../../obj/usbd_req.o + 0x20000fc4 USBD_StrDesc + .bss.USBD_cfg_status + 0x200010c4 0x4 THUMB Debug/../../obj/usbd_req.o + 0x200010c4 USBD_cfg_status + .bss.USBD_ep_status + 0x200010c8 0x4 THUMB Debug/../../obj/usbd_req.o + 0x200010c8 USBD_ep_status + .bss.cfgidx.8154 + 0x200010cc 0x1 THUMB Debug/../../obj/usbd_req.o + *fill* 0x200010cd 0x3 00 + .bss.USBD_default_cfg + 0x200010d0 0x4 THUMB Debug/../../obj/usbd_req.o + 0x200010d0 USBD_default_cfg + .bss.logfile 0x200010d4 0x228 THUMB Debug/../../obj/hooks.o + .bss.USB_Rx_Buffer + 0x200012fc 0x40 THUMB Debug/../../obj/usbd_bulk.o + 0x200012fc USB_Rx_Buffer + .bss.usbd_bulk_AltSet + 0x2000133c 0x4 THUMB Debug/../../obj/usbd_bulk.o .bss.bootBlockInfo - 0x200010e8 0x204 THUMB Debug/../../obj/flash.o + 0x20001340 0x204 THUMB Debug/../../obj/flash.o .bss.blockInfo - 0x200012ec 0x204 THUMB Debug/../../obj/flash.o + 0x20001544 0x204 THUMB Debug/../../obj/flash.o .bss.millisecond_counter - 0x200014f0 0x4 THUMB Debug/../../obj/timer.o + 0x20001748 0x4 THUMB Debug/../../obj/timer.o .bss.xcpCtoReqPacket.7326 - 0x200014f4 0x44 THUMB Debug/../../obj/uart.o + 0x2000174c 0x44 THUMB Debug/../../obj/uart.o .bss.xcpCtoRxLength.7327 - 0x20001538 0x1 THUMB Debug/../../obj/uart.o + 0x20001790 0x1 THUMB Debug/../../obj/uart.o .bss.xcpCtoRxInProgress.7328 - 0x20001539 0x1 THUMB Debug/../../obj/uart.o - *fill* 0x2000153a 0x2 00 + 0x20001791 0x1 THUMB Debug/../../obj/uart.o + *fill* 0x20001792 0x2 00 + .bss.USB_Tx_Buffer.8511 + 0x20001794 0x40 THUMB Debug/../../obj/usb.o + .bss.fifoCtrlFree + 0x200017d4 0x4 THUMB Debug/../../obj/usb.o + .bss.fifoCtrl 0x200017d8 0x30 THUMB Debug/../../obj/usb.o + .bss.fifoPipeBulkOUT + 0x20001808 0x44 THUMB Debug/../../obj/usb.o + .bss.xcpCtoRxLength.8498 + 0x2000184c 0x1 THUMB Debug/../../obj/usb.o + *fill* 0x2000184d 0x3 00 + .bss.xcpCtoReqPacket.8497 + 0x20001850 0x40 THUMB Debug/../../obj/usb.o + .bss.xcpCtoRxInProgress.8499 + 0x20001890 0x1 THUMB Debug/../../obj/usb.o + *fill* 0x20001891 0x3 00 + .bss.fifoPipeBulkIN + 0x20001894 0x44 THUMB Debug/../../obj/usb.o + .bss.USB_OTG_dev + 0x200018d8 0x5f4 THUMB Debug/../../obj/usb.o .bss.assert_failure_file - 0x2000153c 0x4 THUMB Debug/../../obj/assert.o + 0x20001ecc 0x4 THUMB Debug/../../obj/assert.o .bss.assert_failure_line - 0x20001540 0x4 THUMB Debug/../../obj/assert.o + 0x20001ed0 0x4 THUMB Debug/../../obj/assert.o .bss.backdoorOpen - 0x20001544 0x1 THUMB Debug/../../obj/backdoor.o - *fill* 0x20001545 0x3 00 + 0x20001ed4 0x1 THUMB Debug/../../obj/backdoor.o + *fill* 0x20001ed5 0x3 00 .bss.backdoorOpenTime - 0x20001548 0x4 THUMB Debug/../../obj/backdoor.o - .bss.xcpCtoReqPacket.3959 - 0x2000154c 0x40 THUMB Debug/../../obj/com.o - .bss.xcpInfo 0x2000158c 0x4c THUMB Debug/../../obj/xcp.o + 0x20001ed8 0x4 THUMB Debug/../../obj/backdoor.o + .bss.xcpCtoReqPacket.3974 + 0x20001edc 0x40 THUMB Debug/../../obj/com.o + .bss.xcpInfo 0x20001f1c 0x4c THUMB Debug/../../obj/xcp.o .bss.loggingStr - 0x200015d8 0x40 THUMB Debug/../../obj/file.o + 0x20001f68 0x40 THUMB Debug/../../obj/file.o .bss.firmwareUpdateState - 0x20001618 0x1 THUMB Debug/../../obj/file.o - *fill* 0x20001619 0x3 00 + 0x20001fa8 0x1 THUMB Debug/../../obj/file.o + *fill* 0x20001fa9 0x3 00 .bss.eraseInfo - 0x2000161c 0x8 THUMB Debug/../../obj/file.o + 0x20001fac 0x8 THUMB Debug/../../obj/file.o .bss.fatFsObjects - 0x20001624 0x458 THUMB Debug/../../obj/file.o + 0x20001fb4 0x458 THUMB Debug/../../obj/file.o .bss.lineParseObject - 0x20001a7c 0x184 THUMB Debug/../../obj/file.o - .bss.LfnBuf 0x20001c00 0x200 THUMB Debug/../../obj/ff.o - .bss.Fsid 0x20001e00 0x2 THUMB Debug/../../obj/ff.o - *fill* 0x20001e02 0x2 00 - .bss.FatFs 0x20001e04 0x4 THUMB Debug/../../obj/ff.o - .bss.uip_conn 0x20001e08 0x4 THUMB Debug/../../obj/uip.o - 0x20001e08 uip_conn + 0x2000240c 0x184 THUMB Debug/../../obj/file.o + .bss.LfnBuf 0x20002590 0x200 THUMB Debug/../../obj/ff.o + .bss.Fsid 0x20002790 0x2 THUMB Debug/../../obj/ff.o + *fill* 0x20002792 0x2 00 + .bss.FatFs 0x20002794 0x4 THUMB Debug/../../obj/ff.o + .bss.uip_conn 0x20002798 0x4 THUMB Debug/../../obj/uip.o + 0x20002798 uip_conn .bss.uip_conns - 0x20001e0c 0x68 THUMB Debug/../../obj/uip.o - 0x20001e0c uip_conns + 0x2000279c 0x68 THUMB Debug/../../obj/uip.o + 0x2000279c uip_conns .bss.uip_netmask - 0x20001e74 0x4 THUMB Debug/../../obj/uip.o - 0x20001e74 uip_netmask - .bss.uip_len 0x20001e78 0x2 THUMB Debug/../../obj/uip.o - 0x20001e78 uip_len - .bss.ipid 0x20001e7a 0x2 THUMB Debug/../../obj/uip.o + 0x20002804 0x4 THUMB Debug/../../obj/uip.o + 0x20002804 uip_netmask + .bss.uip_len 0x20002808 0x2 THUMB Debug/../../obj/uip.o + 0x20002808 uip_len + .bss.ipid 0x2000280a 0x2 THUMB Debug/../../obj/uip.o .bss.uip_draddr - 0x20001e7c 0x4 THUMB Debug/../../obj/uip.o - 0x20001e7c uip_draddr - .bss.uip_slen 0x20001e80 0x2 THUMB Debug/../../obj/uip.o - 0x20001e80 uip_slen - *fill* 0x20001e82 0x2 00 - .bss.uip_buf 0x20001e84 0x644 THUMB Debug/../../obj/uip.o - 0x20001e84 uip_buf + 0x2000280c 0x4 THUMB Debug/../../obj/uip.o + 0x2000280c uip_draddr + .bss.uip_slen 0x20002810 0x2 THUMB Debug/../../obj/uip.o + 0x20002810 uip_slen + *fill* 0x20002812 0x2 00 + .bss.uip_buf 0x20002814 0x644 THUMB Debug/../../obj/uip.o + 0x20002814 uip_buf .bss.uip_appdata - 0x200024c8 0x4 THUMB Debug/../../obj/uip.o - 0x200024c8 uip_appdata - .bss.iss 0x200024cc 0x4 THUMB Debug/../../obj/uip.o + 0x20002e58 0x4 THUMB Debug/../../obj/uip.o + 0x20002e58 uip_appdata + .bss.iss 0x20002e5c 0x4 THUMB Debug/../../obj/uip.o .bss.uip_hostaddr - 0x200024d0 0x4 THUMB Debug/../../obj/uip.o - 0x200024d0 uip_hostaddr + 0x20002e60 0x4 THUMB Debug/../../obj/uip.o + 0x20002e60 uip_hostaddr .bss.uip_flags - 0x200024d4 0x1 THUMB Debug/../../obj/uip.o - 0x200024d4 uip_flags - *fill* 0x200024d5 0x3 00 + 0x20002e64 0x1 THUMB Debug/../../obj/uip.o + 0x20002e64 uip_flags + *fill* 0x20002e65 0x3 00 .bss.uip_acc32 - 0x200024d8 0x4 THUMB Debug/../../obj/uip.o - 0x200024d8 uip_acc32 - .bss.lastport 0x200024dc 0x2 THUMB Debug/../../obj/uip.o - .bss.tmp16 0x200024de 0x2 THUMB Debug/../../obj/uip.o + 0x20002e68 0x4 THUMB Debug/../../obj/uip.o + 0x20002e68 uip_acc32 + .bss.lastport 0x20002e6c 0x2 THUMB Debug/../../obj/uip.o + .bss.tmp16 0x20002e6e 0x2 THUMB Debug/../../obj/uip.o .bss.uip_ethaddr - 0x200024e0 0x8 THUMB Debug/../../obj/uip.o - 0x200024e0 uip_ethaddr - .bss.c 0x200024e8 0x1 THUMB Debug/../../obj/uip.o - *fill* 0x200024e9 0x3 00 + 0x20002e70 0x8 THUMB Debug/../../obj/uip.o + 0x20002e70 uip_ethaddr + .bss.c 0x20002e78 0x1 THUMB Debug/../../obj/uip.o + *fill* 0x20002e79 0x3 00 .bss.uip_listenports - 0x200024ec 0x4 THUMB Debug/../../obj/uip.o - 0x200024ec uip_listenports + 0x20002e7c 0x4 THUMB Debug/../../obj/uip.o + 0x20002e7c uip_listenports .bss.uip_sappdata - 0x200024f0 0x4 THUMB Debug/../../obj/uip.o - 0x200024f0 uip_sappdata - .bss.opt 0x200024f4 0x1 THUMB Debug/../../obj/uip.o - .bss.i 0x200024f5 0x1 THUMB Debug/../../obj/uip_arp.o - .bss.tmpage 0x200024f6 0x1 THUMB Debug/../../obj/uip_arp.o - *fill* 0x200024f7 0x1 00 + 0x20002e80 0x4 THUMB Debug/../../obj/uip.o + 0x20002e80 uip_sappdata + .bss.opt 0x20002e84 0x1 THUMB Debug/../../obj/uip.o + .bss.i 0x20002e85 0x1 THUMB Debug/../../obj/uip_arp.o + .bss.tmpage 0x20002e86 0x1 THUMB Debug/../../obj/uip_arp.o + *fill* 0x20002e87 0x1 00 .bss.arp_table - 0x200024f8 0x60 THUMB Debug/../../obj/uip_arp.o - .bss.c 0x20002558 0x1 THUMB Debug/../../obj/uip_arp.o - .bss.arptime 0x20002559 0x1 THUMB Debug/../../obj/uip_arp.o - *fill* 0x2000255a 0x2 00 - .bss.ipaddr 0x2000255c 0x4 THUMB Debug/../../obj/uip_arp.o + 0x20002e88 0x60 THUMB Debug/../../obj/uip_arp.o + .bss.c 0x20002ee8 0x1 THUMB Debug/../../obj/uip_arp.o + .bss.arptime 0x20002ee9 0x1 THUMB Debug/../../obj/uip_arp.o + *fill* 0x20002eea 0x2 00 + .bss.ipaddr 0x20002eec 0x4 THUMB Debug/../../obj/uip_arp.o .bss.ARPTimerTimeOut - 0x20002560 0x4 THUMB Debug/../../obj/net.o + 0x20002ef0 0x4 THUMB Debug/../../obj/net.o .bss.periodicTimerTimeOut - 0x20002564 0x4 THUMB Debug/../../obj/net.o + 0x20002ef4 0x4 THUMB Debug/../../obj/net.o .bss.libdebugio.dbgCommWord - 0x20002568 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - 0x20002568 dbgCommWord + 0x20002ef8 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + 0x20002ef8 dbgCommWord .bss.libdebugio.dbgCntrlWord_mempoll - 0x2000256c 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - 0x2000256c dbgCntrlWord_mempoll + 0x20002efc 0x4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + 0x20002efc dbgCntrlWord_mempoll *(COMMON) - 0x20002570 __bss_end__ = (__bss_start__ + SIZEOF (.bss)) - 0x20002570 __bss_load_end__ = __bss_end__ + 0x20002f00 __bss_end__ = (__bss_start__ + SIZEOF (.bss)) + 0x20002f00 __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) - 0x20002570 __non_init_load_start__ = ALIGN (__bss_end__, 0x4) + 0x20002f00 __non_init_load_start__ = ALIGN (__bss_end__, 0x4) -.non_init 0x20002570 0x0 - 0x20002570 __non_init_start__ = . +.non_init 0x20002f00 0x0 + 0x20002f00 __non_init_start__ = . *(.non_init .non_init.*) - 0x20002570 __non_init_end__ = (__non_init_start__ + SIZEOF (.non_init)) - 0x20002570 __non_init_load_end__ = __non_init_end__ + 0x20002f00 __non_init_end__ = (__non_init_start__ + SIZEOF (.non_init)) + 0x20002f00 __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) - 0x20002570 __heap_load_start__ = ALIGN (__non_init_end__, 0x4) + 0x20002f00 __heap_load_start__ = ALIGN (__non_init_end__, 0x4) -.heap 0x20002570 0x800 - 0x20002570 __heap_start__ = . +.heap 0x20002f00 0x800 + 0x20002f00 __heap_start__ = . *(.heap .heap.*) - 0x20002d70 . = ALIGN (MAX ((__heap_start__ + __HEAPSIZE__), .), 0x4) - *fill* 0x20002570 0x800 00 - 0x20002d70 __heap_end__ = (__heap_start__ + SIZEOF (.heap)) - 0x20002d70 __heap_load_end__ = __heap_end__ + 0x20003700 . = ALIGN (MAX ((__heap_start__ + __HEAPSIZE__), .), 0x4) + *fill* 0x20002f00 0x800 00 + 0x20003700 __heap_end__ = (__heap_start__ + SIZEOF (.heap)) + 0x20003700 __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) - 0x20002d70 __stack_load_start__ = ALIGN (__heap_end__, 0x4) + 0x20003700 __stack_load_start__ = ALIGN (__heap_end__, 0x4) -.stack 0x20002d70 0x800 - 0x20002d70 __stack_start__ = . +.stack 0x20003700 0x800 + 0x20003700 __stack_start__ = . *(.stack .stack.*) - 0x20003570 . = ALIGN (MAX ((__stack_start__ + __STACKSIZE__), .), 0x4) - *fill* 0x20002d70 0x800 00 - 0x20003570 __stack_end__ = (__stack_start__ + SIZEOF (.stack)) - 0x20003570 __stack_load_end__ = __stack_end__ + 0x20003f00 . = ALIGN (MAX ((__stack_start__ + __STACKSIZE__), .), 0x4) + *fill* 0x20003700 0x800 00 + 0x20003f00 __stack_end__ = (__stack_start__ + SIZEOF (.stack)) + 0x20003f00 __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) - 0x20003570 __stack_process_load_start__ = ALIGN (__stack_end__, 0x4) + 0x20003f00 __stack_process_load_start__ = ALIGN (__stack_end__, 0x4) -.stack_process 0x20003570 0x0 - 0x20003570 __stack_process_start__ = . +.stack_process 0x20003f00 0x0 + 0x20003f00 __stack_process_start__ = . *(.stack_process .stack_process.*) - 0x20003570 . = ALIGN (MAX ((__stack_process_start__ + __STACKSIZE_PROCESS__), .), 0x4) - 0x20003570 __stack_process_end__ = (__stack_process_start__ + SIZEOF (.stack_process)) - 0x20003570 __stack_process_load_end__ = __stack_process_end__ + 0x20003f00 . = ALIGN (MAX ((__stack_process_start__ + __STACKSIZE_PROCESS__), .), 0x4) + 0x20003f00 __stack_process_end__ = (__stack_process_start__ + SIZEOF (.stack_process)) + 0x20003f00 __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) - 0x20003570 __tbss_load_start__ = ALIGN (__stack_process_end__, 0x4) + 0x20003f00 __tbss_load_start__ = ALIGN (__stack_process_end__, 0x4) -.tbss 0x20003570 0x0 - 0x20003570 __tbss_start__ = . +.tbss 0x20003f00 0x0 + 0x20003f00 __tbss_start__ = . *(.tbss .tbss.*) - 0x20003570 __tbss_end__ = (__tbss_start__ + SIZEOF (.tbss)) - 0x20003570 __tbss_load_end__ = __tbss_end__ + 0x20003f00 __tbss_end__ = (__tbss_start__ + SIZEOF (.tbss)) + 0x20003f00 __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) - 0x080099f4 __tdata_load_start__ = ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) + 0x0800a988 __tdata_load_start__ = ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) -.tdata 0x20003570 0x0 load address 0x080099f4 - 0x20003570 __tdata_start__ = . +.tdata 0x20003f00 0x0 load address 0x0800a988 + 0x20003f00 __tdata_start__ = . *(.tdata .tdata.*) - 0x20003570 __tdata_end__ = (__tdata_start__ + SIZEOF (.tdata)) - 0x080099f4 __tdata_load_end__ = (__tdata_load_start__ + SIZEOF (.tdata)) - 0x080099f4 __FLASH_segment_used_end__ = (ALIGN ((__data_load_start__ + SIZEOF (.data)), 0x4) + SIZEOF (.tdata)) + 0x20003f00 __tdata_end__ = (__tdata_start__ + SIZEOF (.tdata)) + 0x0800a988 __tdata_load_end__ = (__tdata_load_start__ + SIZEOF (.tdata)) + 0x0800a988 __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 0x20003570 0x0 - 0x20003570 __tdata_run_start__ = . - 0x20003570 . = MAX ((__tdata_run_start__ + SIZEOF (.tdata)), .) - 0x20003570 __tdata_run_end__ = (__tdata_run_start__ + SIZEOF (.tdata_run)) - 0x20003570 __tdata_run_load_end__ = __tdata_run_end__ - 0x20003570 __RAM_segment_used_end__ = (ALIGN (__tbss_end__, 0x4) + SIZEOF (.tdata_run)) +.tdata_run 0x20003f00 0x0 + 0x20003f00 __tdata_run_start__ = . + 0x20003f00 . = MAX ((__tdata_run_start__ + SIZEOF (.tdata)), .) + 0x20003f00 __tdata_run_end__ = (__tdata_run_start__ + SIZEOF (.tdata_run)) + 0x20003f00 __tdata_run_load_end__ = __tdata_run_end__ + 0x20003f00 __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 @@ -3758,8 +4140,18 @@ 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/usbd_core.o +LOAD THUMB Debug/../../obj/usbd_ioreq.o +LOAD THUMB Debug/../../obj/usbd_req.o +LOAD THUMB Debug/../../obj/usb_core.o +LOAD THUMB Debug/../../obj/usb_dcd.o +LOAD THUMB Debug/../../obj/usb_dcd_int.o LOAD THUMB Debug/../../obj/hooks.o LOAD THUMB Debug/../../obj/main.o +LOAD THUMB Debug/../../obj/usb_bsp.o +LOAD THUMB Debug/../../obj/usbd_bulk.o +LOAD THUMB Debug/../../obj/usbd_desc.o +LOAD THUMB Debug/../../obj/usbd_usr.o LOAD THUMB Debug/../../obj/cstart.o LOAD THUMB Debug/../../obj/vectors.o LOAD THUMB Debug/../../obj/cpu.o @@ -3768,6 +4160,7 @@ LOAD THUMB Debug/../../obj/nvm.o LOAD THUMB Debug/../../obj/timer.o LOAD THUMB Debug/../../obj/uart.o LOAD THUMB Debug/../../obj/can.o +LOAD THUMB Debug/../../obj/usb.o LOAD THUMB Debug/../../obj/assert.o LOAD THUMB Debug/../../obj/backdoor.o LOAD THUMB Debug/../../obj/boot.o @@ -3793,152 +4186,193 @@ 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 0x4740 - .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 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 0xb4 THUMB Debug/../../obj/com.o - .debug_frame 0x00001f60 0x30 THUMB Debug/../../obj/cop.o - .debug_frame 0x00001f90 0x80 THUMB Debug/../../obj/xcp.o - .debug_frame 0x00002010 0x154 THUMB Debug/../../obj/file.o - .debug_frame 0x00002164 0x688 THUMB Debug/../../obj/ff.o - .debug_frame 0x000027ec 0x30 THUMB Debug/../../obj/unicode.o - .debug_frame 0x0000281c 0x1b0 THUMB Debug/../../obj/uip.o - .debug_frame 0x000029cc 0xbc THUMB Debug/../../obj/uip_arp.o - .debug_frame 0x00002a88 0x88 THUMB Debug/../../obj/net.o - .debug_frame 0x00002b10 0x12e0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) - .debug_frame 0x00003df0 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 0x00003f10 0x790 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - .debug_frame 0x000046a0 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 0x00000000 0x5284 + .debug_frame 0x00000000 0x4f8 THUMB Debug/../../obj/mmc.o + .debug_frame 0x000004f8 0x38 THUMB Debug/../../obj/system_stm32f4xx.o + .debug_frame 0x00000530 0x2b0 THUMB Debug/../../obj/stm32f4xx_flash.o + .debug_frame 0x000007e0 0x130 THUMB Debug/../../obj/stm32f4xx_gpio.o + .debug_frame 0x00000910 0x30c THUMB Debug/../../obj/stm32f4xx_rcc.o + .debug_frame 0x00000c1c 0x22c THUMB Debug/../../obj/stm32f4xx_sdio.o + .debug_frame 0x00000e48 0x88 THUMB Debug/../../obj/stm32f4xx_syscfg.o + .debug_frame 0x00000ed0 0x228 THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_frame 0x000010f8 0x770 THUMB Debug/../../obj/stm32_eth.o + .debug_frame 0x00001868 0x94 THUMB Debug/../../obj/netdev.o + .debug_frame 0x000018fc 0x1bc THUMB Debug/../../obj/usbd_core.o + .debug_frame 0x00001ab8 0xd0 THUMB Debug/../../obj/usbd_ioreq.o + .debug_frame 0x00001b88 0xc0 THUMB Debug/../../obj/usbd_req.o + .debug_frame 0x00001c48 0x364 THUMB Debug/../../obj/usb_core.o + .debug_frame 0x00001fac 0x150 THUMB Debug/../../obj/usb_dcd.o + .debug_frame 0x000020fc 0x40 THUMB Debug/../../obj/usb_dcd_int.o + .debug_frame 0x0000213c 0xf8 THUMB Debug/../../obj/hooks.o + .debug_frame 0x00002234 0x30 THUMB Debug/../../obj/main.o + .debug_frame 0x00002264 0x68 THUMB Debug/../../obj/usb_bsp.o + .debug_frame 0x000022cc 0xd8 THUMB Debug/../../obj/usbd_bulk.o + .debug_frame 0x000023a4 0xbc THUMB Debug/../../obj/usbd_desc.o + .debug_frame 0x00002460 0x80 THUMB Debug/../../obj/usbd_usr.o + .debug_frame 0x000024e0 0x20 THUMB Debug/../../obj/vectors.o + .debug_frame 0x00002500 0x60 THUMB Debug/../../obj/cpu.o + .debug_frame 0x00002560 0x168 THUMB Debug/../../obj/flash.o + .debug_frame 0x000026c8 0x6c THUMB Debug/../../obj/nvm.o + .debug_frame 0x00002734 0x50 THUMB Debug/../../obj/timer.o + .debug_frame 0x00002784 0x9c THUMB Debug/../../obj/uart.o + .debug_frame 0x00002820 0x70 THUMB Debug/../../obj/can.o + .debug_frame 0x00002890 0x134 THUMB Debug/../../obj/usb.o + .debug_frame 0x000029c4 0x2c THUMB Debug/../../obj/assert.o + .debug_frame 0x000029f0 0x48 THUMB Debug/../../obj/backdoor.o + .debug_frame 0x00002a38 0x48 THUMB Debug/../../obj/boot.o + .debug_frame 0x00002a80 0xa8 THUMB Debug/../../obj/com.o + .debug_frame 0x00002b28 0x30 THUMB Debug/../../obj/cop.o + .debug_frame 0x00002b58 0x64 THUMB Debug/../../obj/xcp.o + .debug_frame 0x00002bbc 0x124 THUMB Debug/../../obj/file.o + .debug_frame 0x00002ce0 0x62c THUMB Debug/../../obj/ff.o + .debug_frame 0x0000330c 0x3c THUMB Debug/../../obj/unicode.o + .debug_frame 0x00003348 0x1bc THUMB Debug/../../obj/uip.o + .debug_frame 0x00003504 0xbc THUMB Debug/../../obj/uip_arp.o + .debug_frame 0x000035c0 0x94 THUMB Debug/../../obj/net.o + .debug_frame 0x00003654 0x12e0 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + .debug_frame 0x00004934 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 0x00004a54 0x790 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_frame 0x000051e4 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 0x15abb - .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 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 0x4f0 THUMB Debug/../../obj/main.o - .debug_info 0x0000b508 0x10a THUMB Debug/../../obj/cstart.o - .debug_info 0x0000b612 0x13f THUMB Debug/../../obj/vectors.o - .debug_info 0x0000b751 0x1fd THUMB Debug/../../obj/cpu.o - .debug_info 0x0000b94e 0xa1c THUMB Debug/../../obj/flash.o - .debug_info 0x0000c36a 0x252 THUMB Debug/../../obj/nvm.o - .debug_info 0x0000c5bc 0x195 THUMB Debug/../../obj/timer.o - .debug_info 0x0000c751 0x66d THUMB Debug/../../obj/uart.o - .debug_info 0x0000cdbe 0x581 THUMB Debug/../../obj/can.o - .debug_info 0x0000d33f 0x10a THUMB Debug/../../obj/assert.o - .debug_info 0x0000d449 0x15f THUMB Debug/../../obj/backdoor.o - .debug_info 0x0000d5a8 0x177 THUMB Debug/../../obj/boot.o - .debug_info 0x0000d71f 0x3e7 THUMB Debug/../../obj/com.o - .debug_info 0x0000db06 0x9a THUMB Debug/../../obj/cop.o - .debug_info 0x0000dba0 0x8ac THUMB Debug/../../obj/xcp.o - .debug_info 0x0000e44c 0x1226 THUMB Debug/../../obj/file.o - .debug_info 0x0000f672 0x3562 THUMB Debug/../../obj/ff.o - .debug_info 0x00012bd4 0x169 THUMB Debug/../../obj/unicode.o - .debug_info 0x00012d3d 0xd12 THUMB Debug/../../obj/uip.o - .debug_info 0x00013a4f 0x6b3 THUMB Debug/../../obj/uip_arp.o - .debug_info 0x00014102 0x682 THUMB Debug/../../obj/net.o - .debug_info 0x00014784 0xd02 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) - .debug_info 0x00015486 0x55f C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - .debug_info 0x000159e5 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 0x00000000 0x2429a + .debug_info 0x00000000 0x3480 THUMB Debug/../../obj/mmc.o + .debug_info 0x00003480 0x619 THUMB Debug/../../obj/system_stm32f4xx.o + .debug_info 0x00003a99 0x8c8 THUMB Debug/../../obj/stm32f4xx_flash.o + .debug_info 0x00004361 0x814 THUMB Debug/../../obj/stm32f4xx_gpio.o + .debug_info 0x00004b75 0xdf6 THUMB Debug/../../obj/stm32f4xx_rcc.o + .debug_info 0x0000596b 0x8e1 THUMB Debug/../../obj/stm32f4xx_sdio.o + .debug_info 0x0000624c 0x2b8 THUMB Debug/../../obj/stm32f4xx_syscfg.o + .debug_info 0x00006504 0xc51 THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_info 0x00007155 0x2060 THUMB Debug/../../obj/stm32_eth.o + .debug_info 0x000091b5 0x1559 THUMB Debug/../../obj/netdev.o + .debug_info 0x0000a70e 0x15b5 THUMB Debug/../../obj/usbd_core.o + .debug_info 0x0000bcc3 0xf37 THUMB Debug/../../obj/usbd_ioreq.o + .debug_info 0x0000cbfa 0x15d3 THUMB Debug/../../obj/usbd_req.o + .debug_info 0x0000e1cd 0x2a16 THUMB Debug/../../obj/usb_core.o + .debug_info 0x00010be3 0x1503 THUMB Debug/../../obj/usb_dcd.o + .debug_info 0x000120e6 0x26c9 THUMB Debug/../../obj/usb_dcd_int.o + .debug_info 0x000147af 0x98e THUMB Debug/../../obj/hooks.o + .debug_info 0x0001513d 0x4f4 THUMB Debug/../../obj/main.o + .debug_info 0x00015631 0x1055 THUMB Debug/../../obj/usb_bsp.o + .debug_info 0x00016686 0x1037 THUMB Debug/../../obj/usbd_bulk.o + .debug_info 0x000176bd 0x432 THUMB Debug/../../obj/usbd_desc.o + .debug_info 0x00017aef 0x26d THUMB Debug/../../obj/usbd_usr.o + .debug_info 0x00017d5c 0x10a THUMB Debug/../../obj/cstart.o + .debug_info 0x00017e66 0x13f THUMB Debug/../../obj/vectors.o + .debug_info 0x00017fa5 0x214 THUMB Debug/../../obj/cpu.o + .debug_info 0x000181b9 0xaa3 THUMB Debug/../../obj/flash.o + .debug_info 0x00018c5c 0x253 THUMB Debug/../../obj/nvm.o + .debug_info 0x00018eaf 0x1ab THUMB Debug/../../obj/timer.o + .debug_info 0x0001905a 0x67a THUMB Debug/../../obj/uart.o + .debug_info 0x000196d4 0x581 THUMB Debug/../../obj/can.o + .debug_info 0x00019c55 0x1717 THUMB Debug/../../obj/usb.o + .debug_info 0x0001b36c 0x10a THUMB Debug/../../obj/assert.o + .debug_info 0x0001b476 0x161 THUMB Debug/../../obj/backdoor.o + .debug_info 0x0001b5d7 0x179 THUMB Debug/../../obj/boot.o + .debug_info 0x0001b750 0x4ae THUMB Debug/../../obj/com.o + .debug_info 0x0001bbfe 0x9a THUMB Debug/../../obj/cop.o + .debug_info 0x0001bc98 0x8bb THUMB Debug/../../obj/xcp.o + .debug_info 0x0001c553 0x1233 THUMB Debug/../../obj/file.o + .debug_info 0x0001d786 0x3bc5 THUMB Debug/../../obj/ff.o + .debug_info 0x0002134b 0x16a THUMB Debug/../../obj/unicode.o + .debug_info 0x000214b5 0xda0 THUMB Debug/../../obj/uip.o + .debug_info 0x00022255 0x68e THUMB Debug/../../obj/uip_arp.o + .debug_info 0x000228e3 0x680 THUMB Debug/../../obj/net.o + .debug_info 0x00022f63 0xd02 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + .debug_info 0x00023c65 0x55f C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_info 0x000241c4 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 0x37b8 - .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 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 0x198 THUMB Debug/../../obj/main.o - .debug_abbrev 0x00001959 0x14 THUMB Debug/../../obj/cstart.o - .debug_abbrev 0x0000196d 0xf6 THUMB Debug/../../obj/vectors.o - .debug_abbrev 0x00001a63 0xe8 THUMB Debug/../../obj/cpu.o - .debug_abbrev 0x00001b4b 0x2e1 THUMB Debug/../../obj/flash.o - .debug_abbrev 0x00001e2c 0xf8 THUMB Debug/../../obj/nvm.o - .debug_abbrev 0x00001f24 0xf8 THUMB Debug/../../obj/timer.o - .debug_abbrev 0x0000201c 0x1fe THUMB Debug/../../obj/uart.o - .debug_abbrev 0x0000221a 0x20b THUMB Debug/../../obj/can.o - .debug_abbrev 0x00002425 0x9d THUMB Debug/../../obj/assert.o - .debug_abbrev 0x000024c2 0x91 THUMB Debug/../../obj/backdoor.o - .debug_abbrev 0x00002553 0x62 THUMB Debug/../../obj/boot.o - .debug_abbrev 0x000025b5 0x183 THUMB Debug/../../obj/com.o - .debug_abbrev 0x00002738 0x44 THUMB Debug/../../obj/cop.o - .debug_abbrev 0x0000277c 0x265 THUMB Debug/../../obj/xcp.o - .debug_abbrev 0x000029e1 0x212 THUMB Debug/../../obj/file.o - .debug_abbrev 0x00002bf3 0x337 THUMB Debug/../../obj/ff.o - .debug_abbrev 0x00002f2a 0xa8 THUMB Debug/../../obj/unicode.o - .debug_abbrev 0x00002fd2 0x293 THUMB Debug/../../obj/uip.o - .debug_abbrev 0x00003265 0x1df THUMB Debug/../../obj/uip_arp.o - .debug_abbrev 0x00003444 0x243 THUMB Debug/../../obj/net.o - .debug_abbrev 0x00003687 0xcb C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) - .debug_abbrev 0x00003752 0x3e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - .debug_abbrev 0x00003790 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 0x00000000 0x5ca1 + .debug_abbrev 0x00000000 0x3c4 THUMB Debug/../../obj/mmc.o + .debug_abbrev 0x000003c4 0x156 THUMB Debug/../../obj/system_stm32f4xx.o + .debug_abbrev 0x0000051a 0x222 THUMB Debug/../../obj/stm32f4xx_flash.o + .debug_abbrev 0x0000073c 0x223 THUMB Debug/../../obj/stm32f4xx_gpio.o + .debug_abbrev 0x0000095f 0x2ad THUMB Debug/../../obj/stm32f4xx_rcc.o + .debug_abbrev 0x00000c0c 0x1dc THUMB Debug/../../obj/stm32f4xx_sdio.o + .debug_abbrev 0x00000de8 0x17a THUMB Debug/../../obj/stm32f4xx_syscfg.o + .debug_abbrev 0x00000f62 0x21a THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_abbrev 0x0000117c 0x352 THUMB Debug/../../obj/stm32_eth.o + .debug_abbrev 0x000014ce 0x335 THUMB Debug/../../obj/netdev.o + .debug_abbrev 0x00001803 0x3b7 THUMB Debug/../../obj/usbd_core.o + .debug_abbrev 0x00001bba 0x1c5 THUMB Debug/../../obj/usbd_ioreq.o + .debug_abbrev 0x00001d7f 0x373 THUMB Debug/../../obj/usbd_req.o + .debug_abbrev 0x000020f2 0x496 THUMB Debug/../../obj/usb_core.o + .debug_abbrev 0x00002588 0x2dd THUMB Debug/../../obj/usb_dcd.o + .debug_abbrev 0x00002865 0x2ef THUMB Debug/../../obj/usb_dcd_int.o + .debug_abbrev 0x00002b54 0x2bb THUMB Debug/../../obj/hooks.o + .debug_abbrev 0x00002e0f 0x198 THUMB Debug/../../obj/main.o + .debug_abbrev 0x00002fa7 0x25d THUMB Debug/../../obj/usb_bsp.o + .debug_abbrev 0x00003204 0x2d9 THUMB Debug/../../obj/usbd_bulk.o + .debug_abbrev 0x000034dd 0x131 THUMB Debug/../../obj/usbd_desc.o + .debug_abbrev 0x0000360e 0x12d THUMB Debug/../../obj/usbd_usr.o + .debug_abbrev 0x0000373b 0x14 THUMB Debug/../../obj/cstart.o + .debug_abbrev 0x0000374f 0xf9 THUMB Debug/../../obj/vectors.o + .debug_abbrev 0x00003848 0x110 THUMB Debug/../../obj/cpu.o + .debug_abbrev 0x00003958 0x327 THUMB Debug/../../obj/flash.o + .debug_abbrev 0x00003c7f 0x125 THUMB Debug/../../obj/nvm.o + .debug_abbrev 0x00003da4 0x114 THUMB Debug/../../obj/timer.o + .debug_abbrev 0x00003eb8 0x257 THUMB Debug/../../obj/uart.o + .debug_abbrev 0x0000410f 0x20b THUMB Debug/../../obj/can.o + .debug_abbrev 0x0000431a 0x39d THUMB Debug/../../obj/usb.o + .debug_abbrev 0x000046b7 0x9d THUMB Debug/../../obj/assert.o + .debug_abbrev 0x00004754 0x9f THUMB Debug/../../obj/backdoor.o + .debug_abbrev 0x000047f3 0x70 THUMB Debug/../../obj/boot.o + .debug_abbrev 0x00004863 0x1b2 THUMB Debug/../../obj/com.o + .debug_abbrev 0x00004a15 0x44 THUMB Debug/../../obj/cop.o + .debug_abbrev 0x00004a59 0x28a THUMB Debug/../../obj/xcp.o + .debug_abbrev 0x00004ce3 0x2b1 THUMB Debug/../../obj/file.o + .debug_abbrev 0x00004f94 0x37f THUMB Debug/../../obj/ff.o + .debug_abbrev 0x00005313 0xc4 THUMB Debug/../../obj/unicode.o + .debug_abbrev 0x000053d7 0x34f THUMB Debug/../../obj/uip.o + .debug_abbrev 0x00005726 0x208 THUMB Debug/../../obj/uip_arp.o + .debug_abbrev 0x0000592e 0x242 THUMB Debug/../../obj/net.o + .debug_abbrev 0x00005b70 0xcb C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + .debug_abbrev 0x00005c3b 0x3e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_abbrev 0x00005c79 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 0x11731 - .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 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 0xbf THUMB Debug/../../obj/com.o - .debug_loc 0x00007b74 0x296 THUMB Debug/../../obj/xcp.o - .debug_loc 0x00007e0a 0x97a THUMB Debug/../../obj/file.o - .debug_loc 0x00008784 0x68fe THUMB Debug/../../obj/ff.o - .debug_loc 0x0000f082 0x179 THUMB Debug/../../obj/unicode.o - .debug_loc 0x0000f1fb 0x64e THUMB Debug/../../obj/uip.o - .debug_loc 0x0000f849 0x4c4 THUMB Debug/../../obj/uip_arp.o - .debug_loc 0x0000fd0d 0x19e THUMB Debug/../../obj/net.o - .debug_loc 0x0000feab 0x1092 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) - .debug_loc 0x00010f3d 0x7f4 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) +.debug_loc 0x00000000 0x1750c + .debug_loc 0x00000000 0x21b3 THUMB Debug/../../obj/mmc.o + .debug_loc 0x000021b3 0x182 THUMB Debug/../../obj/system_stm32f4xx.o + .debug_loc 0x00002335 0x810 THUMB Debug/../../obj/stm32f4xx_flash.o + .debug_loc 0x00002b45 0x439 THUMB Debug/../../obj/stm32f4xx_gpio.o + .debug_loc 0x00002f7e 0xc0c THUMB Debug/../../obj/stm32f4xx_rcc.o + .debug_loc 0x00003b8a 0x2e1 THUMB Debug/../../obj/stm32f4xx_sdio.o + .debug_loc 0x00003e6b 0xe6 THUMB Debug/../../obj/stm32f4xx_syscfg.o + .debug_loc 0x00003f51 0xa9a THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_loc 0x000049eb 0x1a44 THUMB Debug/../../obj/stm32_eth.o + .debug_loc 0x0000642f 0xda THUMB Debug/../../obj/netdev.o + .debug_loc 0x00006509 0x750 THUMB Debug/../../obj/usbd_core.o + .debug_loc 0x00006c59 0x2d4 THUMB Debug/../../obj/usbd_ioreq.o + .debug_loc 0x00006f2d 0x89c THUMB Debug/../../obj/usbd_req.o + .debug_loc 0x000077c9 0x14f1 THUMB Debug/../../obj/usb_core.o + .debug_loc 0x00008cba 0x7f6 THUMB Debug/../../obj/usb_dcd.o + .debug_loc 0x000094b0 0x9c7 THUMB Debug/../../obj/usb_dcd_int.o + .debug_loc 0x00009e77 0x101 THUMB Debug/../../obj/hooks.o + .debug_loc 0x00009f78 0x2c THUMB Debug/../../obj/main.o + .debug_loc 0x00009fa4 0x13d THUMB Debug/../../obj/usb_bsp.o + .debug_loc 0x0000a0e1 0x3ab THUMB Debug/../../obj/usbd_bulk.o + .debug_loc 0x0000a48c 0x263 THUMB Debug/../../obj/usbd_desc.o + .debug_loc 0x0000a6ef 0x10f THUMB Debug/../../obj/cpu.o + .debug_loc 0x0000a7fe 0x76c THUMB Debug/../../obj/flash.o + .debug_loc 0x0000af6a 0xc5 THUMB Debug/../../obj/nvm.o + .debug_loc 0x0000b02f 0x1d2 THUMB Debug/../../obj/uart.o + .debug_loc 0x0000b201 0x1b7 THUMB Debug/../../obj/can.o + .debug_loc 0x0000b3b8 0x4be THUMB Debug/../../obj/usb.o + .debug_loc 0x0000b876 0x71 THUMB Debug/../../obj/assert.o + .debug_loc 0x0000b8e7 0x40 THUMB Debug/../../obj/backdoor.o + .debug_loc 0x0000b927 0x40 THUMB Debug/../../obj/boot.o + .debug_loc 0x0000b967 0xf4 THUMB Debug/../../obj/com.o + .debug_loc 0x0000ba5b 0x426 THUMB Debug/../../obj/xcp.o + .debug_loc 0x0000be81 0x9f7 THUMB Debug/../../obj/file.o + .debug_loc 0x0000c878 0x84f9 THUMB Debug/../../obj/ff.o + .debug_loc 0x00014d71 0x12d THUMB Debug/../../obj/unicode.o + .debug_loc 0x00014e9e 0x7b0 THUMB Debug/../../obj/uip.o + .debug_loc 0x0001564e 0x47a THUMB Debug/../../obj/uip_arp.o + .debug_loc 0x00015ac8 0x1be THUMB Debug/../../obj/net.o + .debug_loc 0x00015c86 0x1092 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + .debug_loc 0x00016d18 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 0x1860 +.debug_aranges 0x00000000 0x1ca0 .debug_aranges 0x00000000 0x140 THUMB Debug/../../obj/mmc.o .debug_aranges @@ -3960,197 +4394,263 @@ OUTPUT(C:/Work/software/OpenBLT/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossw .debug_aranges 0x00000a08 0x38 THUMB Debug/../../obj/netdev.o .debug_aranges - 0x00000a40 0x48 THUMB Debug/../../obj/hooks.o + 0x00000a40 0x90 THUMB Debug/../../obj/usbd_core.o .debug_aranges - 0x00000a88 0x20 THUMB Debug/../../obj/main.o + 0x00000ad0 0x50 THUMB Debug/../../obj/usbd_ioreq.o .debug_aranges - 0x00000aa8 0x20 THUMB Debug/../../obj/cstart.o + 0x00000b20 0x48 THUMB Debug/../../obj/usbd_req.o .debug_aranges - 0x00000ac8 0x20 THUMB Debug/../../obj/vectors.o + 0x00000b68 0x130 THUMB Debug/../../obj/usb_core.o .debug_aranges - 0x00000ae8 0x30 THUMB Debug/../../obj/cpu.o + 0x00000c98 0x80 THUMB Debug/../../obj/usb_dcd.o .debug_aranges - 0x00000b18 0x78 THUMB Debug/../../obj/flash.o + 0x00000d18 0x20 THUMB Debug/../../obj/usb_dcd_int.o .debug_aranges - 0x00000b90 0x40 THUMB Debug/../../obj/nvm.o + 0x00000d38 0x68 THUMB Debug/../../obj/hooks.o .debug_aranges - 0x00000bd0 0x38 THUMB Debug/../../obj/timer.o + 0x00000da0 0x20 THUMB Debug/../../obj/main.o .debug_aranges - 0x00000c08 0x40 THUMB Debug/../../obj/uart.o + 0x00000dc0 0x38 THUMB Debug/../../obj/usb_bsp.o .debug_aranges - 0x00000c48 0x30 THUMB Debug/../../obj/can.o + 0x00000df8 0x58 THUMB Debug/../../obj/usbd_bulk.o .debug_aranges - 0x00000c78 0x20 THUMB Debug/../../obj/assert.o + 0x00000e50 0x50 THUMB Debug/../../obj/usbd_desc.o .debug_aranges - 0x00000c98 0x28 THUMB Debug/../../obj/backdoor.o + 0x00000ea0 0x50 THUMB Debug/../../obj/usbd_usr.o .debug_aranges - 0x00000cc0 0x28 THUMB Debug/../../obj/boot.o + 0x00000ef0 0x20 THUMB Debug/../../obj/cstart.o .debug_aranges - 0x00000ce8 0x50 THUMB Debug/../../obj/com.o + 0x00000f10 0x20 THUMB Debug/../../obj/vectors.o .debug_aranges - 0x00000d38 0x28 THUMB Debug/../../obj/cop.o + 0x00000f30 0x30 THUMB Debug/../../obj/cpu.o .debug_aranges - 0x00000d60 0x48 THUMB Debug/../../obj/xcp.o + 0x00000f60 0x70 THUMB Debug/../../obj/flash.o .debug_aranges - 0x00000da8 0x70 THUMB Debug/../../obj/file.o + 0x00000fd0 0x40 THUMB Debug/../../obj/nvm.o .debug_aranges - 0x00000e18 0x190 THUMB Debug/../../obj/ff.o + 0x00001010 0x38 THUMB Debug/../../obj/timer.o .debug_aranges - 0x00000fa8 0x28 THUMB Debug/../../obj/unicode.o + 0x00001048 0x38 THUMB Debug/../../obj/uart.o .debug_aranges - 0x00000fd0 0x98 THUMB Debug/../../obj/uip.o + 0x00001080 0x30 THUMB Debug/../../obj/can.o .debug_aranges - 0x00001068 0x40 THUMB Debug/../../obj/uip_arp.o + 0x000010b0 0x58 THUMB Debug/../../obj/usb.o .debug_aranges - 0x000010a8 0x38 THUMB Debug/../../obj/net.o + 0x00001108 0x20 THUMB Debug/../../obj/assert.o .debug_aranges - 0x000010e0 0x508 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + 0x00001128 0x28 THUMB Debug/../../obj/backdoor.o .debug_aranges - 0x000015e8 0x218 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + 0x00001150 0x28 THUMB Debug/../../obj/boot.o .debug_aranges - 0x00001800 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) + 0x00001178 0x50 THUMB Debug/../../obj/com.o + .debug_aranges + 0x000011c8 0x28 THUMB Debug/../../obj/cop.o + .debug_aranges + 0x000011f0 0x38 THUMB Debug/../../obj/xcp.o + .debug_aranges + 0x00001228 0x60 THUMB Debug/../../obj/file.o + .debug_aranges + 0x00001288 0x160 THUMB Debug/../../obj/ff.o + .debug_aranges + 0x000013e8 0x28 THUMB Debug/../../obj/unicode.o + .debug_aranges + 0x00001410 0x98 THUMB Debug/../../obj/uip.o + .debug_aranges + 0x000014a8 0x40 THUMB Debug/../../obj/uip_arp.o + .debug_aranges + 0x000014e8 0x38 THUMB Debug/../../obj/net.o + .debug_aranges + 0x00001520 0x508 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + .debug_aranges + 0x00001a28 0x218 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_aranges + 0x00001c40 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 0x18d0 - .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 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 0x40 THUMB Debug/../../obj/com.o - .debug_ranges 0x00000cc8 0x18 THUMB Debug/../../obj/cop.o - .debug_ranges 0x00000ce0 0x80 THUMB Debug/../../obj/xcp.o - .debug_ranges 0x00000d60 0x60 THUMB Debug/../../obj/file.o - .debug_ranges 0x00000dc0 0x2c8 THUMB Debug/../../obj/ff.o - .debug_ranges 0x00001088 0x18 THUMB Debug/../../obj/unicode.o - .debug_ranges 0x000010a0 0x88 THUMB Debug/../../obj/uip.o - .debug_ranges 0x00001128 0x30 THUMB Debug/../../obj/uip_arp.o - .debug_ranges 0x00001158 0x28 THUMB Debug/../../obj/net.o - .debug_ranges 0x00001180 0x4f8 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) - .debug_ranges 0x00001678 0x208 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - .debug_ranges 0x00001880 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 0x00000000 0x2c30 + .debug_ranges 0x00000000 0x2d0 THUMB Debug/../../obj/mmc.o + .debug_ranges 0x000002d0 0x48 THUMB Debug/../../obj/system_stm32f4xx.o + .debug_ranges 0x00000318 0x108 THUMB Debug/../../obj/stm32f4xx_flash.o + .debug_ranges 0x00000420 0x78 THUMB Debug/../../obj/stm32f4xx_gpio.o + .debug_ranges 0x00000498 0x1a0 THUMB Debug/../../obj/stm32f4xx_rcc.o + .debug_ranges 0x00000638 0xf8 THUMB Debug/../../obj/stm32f4xx_sdio.o + .debug_ranges 0x00000730 0x38 THUMB Debug/../../obj/stm32f4xx_syscfg.o + .debug_ranges 0x00000768 0xf0 THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_ranges 0x00000858 0x350 THUMB Debug/../../obj/stm32_eth.o + .debug_ranges 0x00000ba8 0x58 THUMB Debug/../../obj/netdev.o + .debug_ranges 0x00000c00 0xe8 THUMB Debug/../../obj/usbd_core.o + .debug_ranges 0x00000ce8 0x40 THUMB Debug/../../obj/usbd_ioreq.o + .debug_ranges 0x00000d28 0x178 THUMB Debug/../../obj/usbd_req.o + .debug_ranges 0x00000ea0 0x1c0 THUMB Debug/../../obj/usb_core.o + .debug_ranges 0x00001060 0x70 THUMB Debug/../../obj/usb_dcd.o + .debug_ranges 0x000010d0 0x158 THUMB Debug/../../obj/usb_dcd_int.o + .debug_ranges 0x00001228 0x58 THUMB Debug/../../obj/hooks.o + .debug_ranges 0x00001280 0x10 THUMB Debug/../../obj/main.o + .debug_ranges 0x00001290 0x28 THUMB Debug/../../obj/usb_bsp.o + .debug_ranges 0x000012b8 0x78 THUMB Debug/../../obj/usbd_bulk.o + .debug_ranges 0x00001330 0x40 THUMB Debug/../../obj/usbd_desc.o + .debug_ranges 0x00001370 0x40 THUMB Debug/../../obj/usbd_usr.o + .debug_ranges 0x000013b0 0x10 THUMB Debug/../../obj/vectors.o + .debug_ranges 0x000013c0 0x20 THUMB Debug/../../obj/cpu.o + .debug_ranges 0x000013e0 0xd8 THUMB Debug/../../obj/flash.o + .debug_ranges 0x000014b8 0x30 THUMB Debug/../../obj/nvm.o + .debug_ranges 0x000014e8 0x48 THUMB Debug/../../obj/timer.o + .debug_ranges 0x00001530 0x58 THUMB Debug/../../obj/uart.o + .debug_ranges 0x00001588 0x50 THUMB Debug/../../obj/can.o + .debug_ranges 0x000015d8 0x260 THUMB Debug/../../obj/usb.o + .debug_ranges 0x00001838 0x10 THUMB Debug/../../obj/assert.o + .debug_ranges 0x00001848 0x18 THUMB Debug/../../obj/backdoor.o + .debug_ranges 0x00001860 0x18 THUMB Debug/../../obj/boot.o + .debug_ranges 0x00001878 0x40 THUMB Debug/../../obj/com.o + .debug_ranges 0x000018b8 0x18 THUMB Debug/../../obj/cop.o + .debug_ranges 0x000018d0 0x168 THUMB Debug/../../obj/xcp.o + .debug_ranges 0x00001a38 0x160 THUMB Debug/../../obj/file.o + .debug_ranges 0x00001b98 0x808 THUMB Debug/../../obj/ff.o + .debug_ranges 0x000023a0 0x18 THUMB Debug/../../obj/unicode.o + .debug_ranges 0x000023b8 0xa0 THUMB Debug/../../obj/uip.o + .debug_ranges 0x00002458 0x30 THUMB Debug/../../obj/uip_arp.o + .debug_ranges 0x00002488 0x58 THUMB Debug/../../obj/net.o + .debug_ranges 0x000024e0 0x4f8 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + .debug_ranges 0x000029d8 0x208 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_ranges 0x00002be0 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 0x7d6b - .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 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 0x24f THUMB Debug/../../obj/main.o - .debug_line 0x00003c82 0x134 THUMB Debug/../../obj/cstart.o - .debug_line 0x00003db6 0x10a THUMB Debug/../../obj/vectors.o - .debug_line 0x00003ec0 0x15b THUMB Debug/../../obj/cpu.o - .debug_line 0x0000401b 0x3a0 THUMB Debug/../../obj/flash.o - .debug_line 0x000043bb 0x137 THUMB Debug/../../obj/nvm.o - .debug_line 0x000044f2 0x1a3 THUMB Debug/../../obj/timer.o - .debug_line 0x00004695 0x306 THUMB Debug/../../obj/uart.o - .debug_line 0x0000499b 0x1a0 THUMB Debug/../../obj/can.o - .debug_line 0x00004b3b 0xdf THUMB Debug/../../obj/assert.o - .debug_line 0x00004c1a 0x117 THUMB Debug/../../obj/backdoor.o - .debug_line 0x00004d31 0x11b THUMB Debug/../../obj/boot.o - .debug_line 0x00004e4c 0x187 THUMB Debug/../../obj/com.o - .debug_line 0x00004fd3 0xaf THUMB Debug/../../obj/cop.o - .debug_line 0x00005082 0x200 THUMB Debug/../../obj/xcp.o - .debug_line 0x00005282 0x3d7 THUMB Debug/../../obj/file.o - .debug_line 0x00005659 0xfc5 THUMB Debug/../../obj/ff.o - .debug_line 0x0000661e 0x19d THUMB Debug/../../obj/unicode.o - .debug_line 0x000067bb 0x57e THUMB Debug/../../obj/uip.o - .debug_line 0x00006d39 0x2a6 THUMB Debug/../../obj/uip_arp.o - .debug_line 0x00006fdf 0x215 THUMB Debug/../../obj/net.o - .debug_line 0x000071f4 0x5b3 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) - .debug_line 0x000077a7 0x550 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) - .debug_line 0x00007cf7 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 0x00000000 0xb0bf + .debug_line 0x00000000 0xe5a THUMB Debug/../../obj/mmc.o + .debug_line 0x00000e5a 0x23f THUMB Debug/../../obj/system_stm32f4xx.o + .debug_line 0x00001099 0x4d3 THUMB Debug/../../obj/stm32f4xx_flash.o + .debug_line 0x0000156c 0x3ed THUMB Debug/../../obj/stm32f4xx_gpio.o + .debug_line 0x00001959 0x5dc THUMB Debug/../../obj/stm32f4xx_rcc.o + .debug_line 0x00001f35 0x49d THUMB Debug/../../obj/stm32f4xx_sdio.o + .debug_line 0x000023d2 0x284 THUMB Debug/../../obj/stm32f4xx_syscfg.o + .debug_line 0x00002656 0x53e THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_line 0x00002b94 0xdd6 THUMB Debug/../../obj/stm32_eth.o + .debug_line 0x0000396a 0x40a THUMB Debug/../../obj/netdev.o + .debug_line 0x00003d74 0x384 THUMB Debug/../../obj/usbd_core.o + .debug_line 0x000040f8 0x23e THUMB Debug/../../obj/usbd_ioreq.o + .debug_line 0x00004336 0x347 THUMB Debug/../../obj/usbd_req.o + .debug_line 0x0000467d 0x7c3 THUMB Debug/../../obj/usb_core.o + .debug_line 0x00004e40 0x356 THUMB Debug/../../obj/usb_dcd.o + .debug_line 0x00005196 0x316 THUMB Debug/../../obj/usb_dcd_int.o + .debug_line 0x000054ac 0x349 THUMB Debug/../../obj/hooks.o + .debug_line 0x000057f5 0x263 THUMB Debug/../../obj/main.o + .debug_line 0x00005a58 0x2aa THUMB Debug/../../obj/usb_bsp.o + .debug_line 0x00005d02 0x262 THUMB Debug/../../obj/usbd_bulk.o + .debug_line 0x00005f64 0x204 THUMB Debug/../../obj/usbd_desc.o + .debug_line 0x00006168 0x1eb THUMB Debug/../../obj/usbd_usr.o + .debug_line 0x00006353 0x134 THUMB Debug/../../obj/cstart.o + .debug_line 0x00006487 0x10c THUMB Debug/../../obj/vectors.o + .debug_line 0x00006593 0x160 THUMB Debug/../../obj/cpu.o + .debug_line 0x000066f3 0x3f3 THUMB Debug/../../obj/flash.o + .debug_line 0x00006ae6 0x137 THUMB Debug/../../obj/nvm.o + .debug_line 0x00006c1d 0x1c1 THUMB Debug/../../obj/timer.o + .debug_line 0x00006dde 0x306 THUMB Debug/../../obj/uart.o + .debug_line 0x000070e4 0x1b1 THUMB Debug/../../obj/can.o + .debug_line 0x00007295 0x474 THUMB Debug/../../obj/usb.o + .debug_line 0x00007709 0xdf THUMB Debug/../../obj/assert.o + .debug_line 0x000077e8 0x11b THUMB Debug/../../obj/backdoor.o + .debug_line 0x00007903 0x11d THUMB Debug/../../obj/boot.o + .debug_line 0x00007a20 0x1af THUMB Debug/../../obj/com.o + .debug_line 0x00007bcf 0xaf THUMB Debug/../../obj/cop.o + .debug_line 0x00007c7e 0x274 THUMB Debug/../../obj/xcp.o + .debug_line 0x00007ef2 0x4ab THUMB Debug/../../obj/file.o + .debug_line 0x0000839d 0x134e THUMB Debug/../../obj/ff.o + .debug_line 0x000096eb 0x18e THUMB Debug/../../obj/unicode.o + .debug_line 0x00009879 0x7bc THUMB Debug/../../obj/uip.o + .debug_line 0x0000a035 0x2ce THUMB Debug/../../obj/uip_arp.o + .debug_line 0x0000a303 0x245 THUMB Debug/../../obj/net.o + .debug_line 0x0000a548 0x5b3 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + .debug_line 0x0000aafb 0x550 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_line 0x0000b04b 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 0x690b - .debug_str 0x00000000 0x145b THUMB Debug/../../obj/mmc.o +.debug_str 0x00000000 0x8be6 + .debug_str 0x00000000 0x1456 THUMB Debug/../../obj/mmc.o 0x1526 (size before relaxing) - .debug_str 0x0000145b 0x276 THUMB Debug/../../obj/system_stm32f4xx.o + .debug_str 0x00001456 0x276 THUMB Debug/../../obj/system_stm32f4xx.o 0x3f7 (size before relaxing) - .debug_str 0x000016d1 0x424 THUMB Debug/../../obj/stm32f4xx_flash.o + .debug_str 0x000016cc 0x424 THUMB Debug/../../obj/stm32f4xx_flash.o 0x5f1 (size before relaxing) - .debug_str 0x00001af5 0x1c2 THUMB Debug/../../obj/stm32f4xx_gpio.o + .debug_str 0x00001af0 0x1c2 THUMB Debug/../../obj/stm32f4xx_gpio.o 0x508 (size before relaxing) - .debug_str 0x00001cb7 0x59f THUMB Debug/../../obj/stm32f4xx_rcc.o + .debug_str 0x00001cb2 0x59f THUMB Debug/../../obj/stm32f4xx_rcc.o 0x8b7 (size before relaxing) - .debug_str 0x00002256 0x21d THUMB Debug/../../obj/stm32f4xx_sdio.o + .debug_str 0x00002251 0x21d THUMB Debug/../../obj/stm32f4xx_sdio.o 0x6a0 (size before relaxing) - .debug_str 0x00002473 0x1b4 THUMB Debug/../../obj/stm32f4xx_syscfg.o + .debug_str 0x0000246e 0x1b4 THUMB Debug/../../obj/stm32f4xx_syscfg.o 0x354 (size before relaxing) - .debug_str 0x00002627 0x488 THUMB Debug/../../obj/stm32f4xx_usart.o + .debug_str 0x00002622 0x488 THUMB Debug/../../obj/stm32f4xx_usart.o 0x70d (size before relaxing) - .debug_str 0x00002aaf 0x12bb THUMB Debug/../../obj/stm32_eth.o + .debug_str 0x00002aaa 0x12b6 THUMB Debug/../../obj/stm32_eth.o 0x1565 (size before relaxing) - .debug_str 0x00003d6a 0x227 THUMB Debug/../../obj/netdev.o + .debug_str 0x00003d60 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 0x00004329 0x73 THUMB Debug/../../obj/main.o + .debug_str 0x00003f87 0x9ea THUMB Debug/../../obj/usbd_core.o + 0xcd4 (size before relaxing) + .debug_str 0x00004971 0xe9 THUMB Debug/../../obj/usbd_ioreq.o + 0xa32 (size before relaxing) + .debug_str 0x00004a5a 0x195 THUMB Debug/../../obj/usbd_req.o + 0xbd2 (size before relaxing) + .debug_str 0x00004bef 0xb50 THUMB Debug/../../obj/usb_core.o + 0x16cf (size before relaxing) + .debug_str 0x0000573f 0xeb THUMB Debug/../../obj/usb_dcd.o + 0xcf1 (size before relaxing) + .debug_str 0x0000582a 0x397 THUMB Debug/../../obj/usb_dcd_int.o + 0x1510 (size before relaxing) + .debug_str 0x00005bc1 0x3ea THUMB Debug/../../obj/hooks.o + 0x683 (size before relaxing) + .debug_str 0x00005fab 0x73 THUMB Debug/../../obj/main.o 0x400 (size before relaxing) - .debug_str 0x0000439c 0xbb THUMB Debug/../../obj/vectors.o + .debug_str 0x0000601e 0x84 THUMB Debug/../../obj/usb_bsp.o + 0xbb4 (size before relaxing) + .debug_str 0x000060a2 0x162 THUMB Debug/../../obj/usbd_bulk.o + 0xab2 (size before relaxing) + .debug_str 0x00006204 0x17a THUMB Debug/../../obj/usbd_desc.o + 0x3b4 (size before relaxing) + .debug_str 0x0000637e 0x10e THUMB Debug/../../obj/usbd_usr.o + 0x333 (size before relaxing) + .debug_str 0x0000648c 0xbb THUMB Debug/../../obj/vectors.o 0x1ea (size before relaxing) - .debug_str 0x00004457 0x12f THUMB Debug/../../obj/cpu.o - 0x25a (size before relaxing) - .debug_str 0x00004586 0x221 THUMB Debug/../../obj/flash.o + .debug_str 0x00006547 0x12a THUMB Debug/../../obj/cpu.o + 0x272 (size before relaxing) + .debug_str 0x00006671 0x221 THUMB Debug/../../obj/flash.o 0x4f6 (size before relaxing) - .debug_str 0x000047a7 0x9f THUMB Debug/../../obj/nvm.o + .debug_str 0x00006892 0x9f THUMB Debug/../../obj/nvm.o 0x240 (size before relaxing) - .debug_str 0x00004846 0xca THUMB Debug/../../obj/timer.o + .debug_str 0x00006931 0xca THUMB Debug/../../obj/timer.o 0x235 (size before relaxing) - .debug_str 0x00004910 0x11e THUMB Debug/../../obj/uart.o + .debug_str 0x000069fb 0x11e THUMB Debug/../../obj/uart.o 0x428 (size before relaxing) - .debug_str 0x00004a2e 0x19a THUMB Debug/../../obj/can.o + .debug_str 0x00006b19 0x19a THUMB Debug/../../obj/can.o 0x33f (size before relaxing) - .debug_str 0x00004bc8 0x9b THUMB Debug/../../obj/assert.o + .debug_str 0x00006cb3 0x211 THUMB Debug/../../obj/usb.o + 0xc9e (size before relaxing) + .debug_str 0x00006ec4 0x9b THUMB Debug/../../obj/assert.o 0x1df (size before relaxing) - .debug_str 0x00004c63 0xe8 THUMB Debug/../../obj/backdoor.o + .debug_str 0x00006f5f 0xe8 THUMB Debug/../../obj/backdoor.o 0x226 (size before relaxing) - .debug_str 0x00004d4b 0x9b THUMB Debug/../../obj/boot.o + .debug_str 0x00007047 0x9b THUMB Debug/../../obj/boot.o 0x1fe (size before relaxing) - .debug_str 0x00004de6 0x184 THUMB Debug/../../obj/com.o - 0x34b (size before relaxing) - .debug_str 0x00004f6a 0x70 THUMB Debug/../../obj/cop.o + .debug_str 0x000070e2 0x184 THUMB Debug/../../obj/com.o + 0x37e (size before relaxing) + .debug_str 0x00007266 0x70 THUMB Debug/../../obj/cop.o 0x190 (size before relaxing) - .debug_str 0x00004fda 0x21d THUMB Debug/../../obj/xcp.o + .debug_str 0x000072d6 0x213 THUMB Debug/../../obj/xcp.o 0x44f (size before relaxing) - .debug_str 0x000051f7 0x31b THUMB Debug/../../obj/file.o + .debug_str 0x000074e9 0x31b THUMB Debug/../../obj/file.o 0x7e9 (size before relaxing) - .debug_str 0x00005512 0x31a THUMB Debug/../../obj/ff.o + .debug_str 0x00007804 0x314 THUMB Debug/../../obj/ff.o 0x758 (size before relaxing) - .debug_str 0x0000582c 0xa5 THUMB Debug/../../obj/unicode.o + .debug_str 0x00007b18 0xa5 THUMB Debug/../../obj/unicode.o 0x171 (size before relaxing) - .debug_str 0x000058d1 0x3ff THUMB Debug/../../obj/uip.o + .debug_str 0x00007bbd 0x3ee THUMB Debug/../../obj/uip.o 0x5ca (size before relaxing) - .debug_str 0x00005cd0 0x184 THUMB Debug/../../obj/uip_arp.o + .debug_str 0x00007fab 0x184 THUMB Debug/../../obj/uip_arp.o 0x37a (size before relaxing) - .debug_str 0x00005e54 0xc3 THUMB Debug/../../obj/net.o + .debug_str 0x0000812f 0xc3 THUMB Debug/../../obj/net.o 0x413 (size before relaxing) - .debug_str 0x00005f17 0x56f C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + .debug_str 0x000081f2 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 0x00006486 0x3b3 C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .debug_str 0x00008761 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 0x00006839 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 0x00008b14 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 @@ -4165,8 +4665,18 @@ OUTPUT(C:/Work/software/OpenBLT/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossw .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/usbd_core.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/usbd_ioreq.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/usbd_req.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/usb_core.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/usb_dcd.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/usb_dcd_int.o .comment 0x00000000 0x4f THUMB Debug/../../obj/hooks.o .comment 0x00000000 0x4f THUMB Debug/../../obj/main.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/usb_bsp.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/usbd_bulk.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/usbd_desc.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/usbd_usr.o .comment 0x00000000 0x4f THUMB Debug/../../obj/vectors.o .comment 0x00000000 0x4f THUMB Debug/../../obj/cpu.o .comment 0x00000000 0x4f THUMB Debug/../../obj/flash.o @@ -4174,6 +4684,7 @@ OUTPUT(C:/Work/software/OpenBLT/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossw .comment 0x00000000 0x4f THUMB Debug/../../obj/timer.o .comment 0x00000000 0x4f THUMB Debug/../../obj/uart.o .comment 0x00000000 0x4f THUMB Debug/../../obj/can.o + .comment 0x00000000 0x4f THUMB Debug/../../obj/usb.o .comment 0x00000000 0x4f THUMB Debug/../../obj/assert.o .comment 0x00000000 0x4f THUMB Debug/../../obj/backdoor.o .comment 0x00000000 0x4f THUMB Debug/../../obj/boot.o @@ -4213,54 +4724,76 @@ OUTPUT(C:/Work/software/OpenBLT/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossw .ARM.attributes 0x000001cb 0x33 THUMB Debug/../../obj/netdev.o .ARM.attributes - 0x000001fe 0x33 THUMB Debug/../../obj/hooks.o + 0x000001fe 0x33 THUMB Debug/../../obj/usbd_core.o .ARM.attributes - 0x00000231 0x33 THUMB Debug/../../obj/main.o + 0x00000231 0x33 THUMB Debug/../../obj/usbd_ioreq.o .ARM.attributes - 0x00000264 0x27 THUMB Debug/../../obj/cstart.o + 0x00000264 0x33 THUMB Debug/../../obj/usbd_req.o .ARM.attributes - 0x0000028b 0x33 THUMB Debug/../../obj/vectors.o + 0x00000297 0x33 THUMB Debug/../../obj/usb_core.o .ARM.attributes - 0x000002be 0x33 THUMB Debug/../../obj/cpu.o + 0x000002ca 0x33 THUMB Debug/../../obj/usb_dcd.o .ARM.attributes - 0x000002f1 0x33 THUMB Debug/../../obj/flash.o + 0x000002fd 0x33 THUMB Debug/../../obj/usb_dcd_int.o .ARM.attributes - 0x00000324 0x33 THUMB Debug/../../obj/nvm.o + 0x00000330 0x33 THUMB Debug/../../obj/hooks.o .ARM.attributes - 0x00000357 0x33 THUMB Debug/../../obj/timer.o + 0x00000363 0x33 THUMB Debug/../../obj/main.o .ARM.attributes - 0x0000038a 0x33 THUMB Debug/../../obj/uart.o + 0x00000396 0x33 THUMB Debug/../../obj/usb_bsp.o .ARM.attributes - 0x000003bd 0x33 THUMB Debug/../../obj/can.o + 0x000003c9 0x33 THUMB Debug/../../obj/usbd_bulk.o .ARM.attributes - 0x000003f0 0x33 THUMB Debug/../../obj/assert.o + 0x000003fc 0x33 THUMB Debug/../../obj/usbd_desc.o .ARM.attributes - 0x00000423 0x33 THUMB Debug/../../obj/backdoor.o + 0x0000042f 0x33 THUMB Debug/../../obj/usbd_usr.o .ARM.attributes - 0x00000456 0x33 THUMB Debug/../../obj/boot.o + 0x00000462 0x27 THUMB Debug/../../obj/cstart.o .ARM.attributes - 0x00000489 0x33 THUMB Debug/../../obj/com.o + 0x00000489 0x33 THUMB Debug/../../obj/vectors.o .ARM.attributes - 0x000004bc 0x33 THUMB Debug/../../obj/cop.o + 0x000004bc 0x33 THUMB Debug/../../obj/cpu.o .ARM.attributes - 0x000004ef 0x33 THUMB Debug/../../obj/xcp.o + 0x000004ef 0x33 THUMB Debug/../../obj/flash.o .ARM.attributes - 0x00000522 0x33 THUMB Debug/../../obj/file.o + 0x00000522 0x33 THUMB Debug/../../obj/nvm.o .ARM.attributes - 0x00000555 0x33 THUMB Debug/../../obj/ff.o + 0x00000555 0x33 THUMB Debug/../../obj/timer.o .ARM.attributes - 0x00000588 0x33 THUMB Debug/../../obj/unicode.o + 0x00000588 0x33 THUMB Debug/../../obj/uart.o .ARM.attributes - 0x000005bb 0x33 THUMB Debug/../../obj/uip.o + 0x000005bb 0x33 THUMB Debug/../../obj/can.o .ARM.attributes - 0x000005ee 0x33 THUMB Debug/../../obj/uip_arp.o + 0x000005ee 0x33 THUMB Debug/../../obj/usb.o .ARM.attributes - 0x00000621 0x33 THUMB Debug/../../obj/net.o + 0x00000621 0x33 THUMB Debug/../../obj/assert.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) + 0x00000654 0x33 THUMB Debug/../../obj/backdoor.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) + 0x00000687 0x33 THUMB Debug/../../obj/boot.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) + 0x000006ba 0x33 THUMB Debug/../../obj/com.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) + 0x000006ed 0x33 THUMB Debug/../../obj/cop.o + .ARM.attributes + 0x00000720 0x33 THUMB Debug/../../obj/xcp.o + .ARM.attributes + 0x00000753 0x33 THUMB Debug/../../obj/file.o + .ARM.attributes + 0x00000786 0x33 THUMB Debug/../../obj/ff.o + .ARM.attributes + 0x000007b9 0x33 THUMB Debug/../../obj/unicode.o + .ARM.attributes + 0x000007ec 0x33 THUMB Debug/../../obj/uip.o + .ARM.attributes + 0x0000081f 0x33 THUMB Debug/../../obj/uip_arp.o + .ARM.attributes + 0x00000852 0x33 THUMB Debug/../../obj/net.o + .ARM.attributes + 0x00000885 0x2e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libc_v7em_t_le_eabi.a(libc2.o) + .ARM.attributes + 0x000008b3 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 + 0x000008d1 0x2e C:/Program Files (x86)/Rowley Associates Limited/CrossWorks for ARM 2.3/lib/libdebugio_v7em_t_le_eabi.a(libdebugio.o) + .ARM.attributes + 0x000008ff 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 6f0af0be..2056cabd 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 -S3150800000070350020890100080D2C00080D2C000809 -S315080000100D2C00080D2C00080D2C00080D2C0008CE -S315080000200D2C00080D2C00080D2C00080D2C0008BE -S315080000300D2C00080D2C00080D2C00080D2C0008AE -S315080000400D2C00080D2C00080D2C00080D2C00089E -S315080000500D2C00080D2C00080D2C00080D2C00088E -S315080000600D2C00080D2C00080D2C00080D2C00087E -S315080000700D2C00080D2C00080D2C00080D2C00086E -S315080000800D2C00080D2C00080D2C00080D2C00085E -S315080000900D2C00080D2C00080D2C00080D2C00084E -S315080000A00D2C00080D2C00080D2C00080D2C00083E -S315080000B00D2C00080D2C00080D2C00080D2C00082E -S315080000C00D2C00080D2C00080D2C00080D2C00081E -S315080000D00D2C00080D2C00080D2C00080D2C00080E -S315080000E00D2C00080D2C00080D2C00080D2C0008FE -S315080000F00D2C00080D2C00080D2C00080D2C0008EE -S315080001000D2C00080D2C00080D2C00080D2C0008DD -S315080001100D2C00080D2C00080D2C00080D2C0008CD -S315080001200D2C00080D2C00080D2C00080D2C0008BD -S315080001300D2C00080D2C00080D2C00080D2C0008AD -S315080001400D2C00080D2C00080D2C00080D2C00089D -S315080001500D2C00080D2C00080D2C00080D2C00088D -S315080001600D2C00080D2C00080D2C00080D2C00087D -S315080001700D2C00080D2C00080D2C00080D2C00086D -S30D080001800D2C00080D2C0008E7 +S31508000000003F002089010008B9420008B9420008EB +S31508000010B9420008B9420008B9420008B9420008C6 +S31508000020B9420008B9420008B9420008B9420008B6 +S31508000030B9420008B9420008B9420008B9420008A6 +S31508000040B9420008B9420008B9420008B942000896 +S31508000050B9420008B9420008B9420008B942000886 +S31508000060B9420008B9420008B9420008B942000876 +S31508000070B9420008B9420008B9420008B942000866 +S31508000080B9420008B9420008B9420008B942000856 +S31508000090B9420008B9420008B9420008B942000846 +S315080000A0B9420008B9420008B9420008B942000836 +S315080000B0B9420008B9420008B9420008B942000826 +S315080000C0B9420008B9420008B9420008B942000816 +S315080000D0B9420008B9420008B9420008B942000806 +S315080000E0B9420008B9420008B9420008B9420008F6 +S315080000F0B9420008B9420008B9420008B9420008E6 +S31508000100B9420008B9420008B9420008B9420008D5 +S31508000110B9420008B9420008B9420008B9420008C5 +S31508000120B9420008B9420008B9420008B9420008B5 +S31508000130B9420008B9420008B9420008B9420008A5 +S31508000140B9420008B9420008B9420008B942000895 +S31508000150B9420008B9420008B9420008B942000885 +S31508000160B9420008B9420008B9420008B942000875 +S31508000170B9420008B9420008B9420008B942000865 +S30D08000180B9420008B942000863 S3150800018872B62949072291438D4628482849294A9B S3150800019800F039F828482949294A00F034F8294846 S315080001A829492A4A00F02FF829482A492A4A00F0F4 @@ -34,2434 +34,2684 @@ S315080001E801601C481C49884205D00268043003B4DB S315080001F8904703BCF7E700208646EC460020002116 S31508000208204A9047FEE7884207D0521A05D0037855 S3150800021801300B700131013AF9D17047884202D092 -S3150800022802700130FAE7704770350020D89900083F -S31508000238000000201900002090020008900200081B -S31508000248608F0008D89900080000002000000020E8 -S31508000258608F0008608F0008608F0008608F0008AC -S31508000268608F0008608F0008608F0008608F00089C -S31508000278D89900081C000020702500207025002049 -S30D08000288702D00202D2B000843 -S3150800029008B54FF43053C4F20103586B10F0450FFC -S315080002A007D14FF43052C4F20102506B10F0450FDB -S315080002B0FBD010F0040F06D04FF0040001F042FE08 -S315080002C04FF0030008BD10F0010F06D04FF00100F3 -S315080002D001F038FE4FF0010008BD40F2FF5001F072 -S315080002E031FE4FF0000008BD10B504464FF43053F8 -S315080002F0C4F20103586B10F0450F07D14FF4305282 -S31508000300C4F20102506B10F0450FFBD010F0040F39 -S3150800031006D04FF0040001F015FE4FF0030010BDA3 -S3150800032010F0010F06D04FF0010001F00BFE4FF060 -S31508000330010010BD01F0BEFDA0424AD140F2FF50B7 -S3150800034001F000FE4FF0000001F0BCFD4EF208017E -S31508000350CFF6FF51014000293ED000283FDB10F0C0 -S31508000360804F3FD110F0005F3FD110F0805F3FD142 -S3150800037010F0006F3FD110F0806F3FD110F0807FF2 -S315080003803FD110F4000F3FD110F4800F3FD110F485 -S31508000390001F3FD110F4801F3FD110F4002F3FD12A -S315080003A010F4802F3FD110F4003F3FD110F4803F66 -S315080003B03FD110F4004F3FD110F4804F3FD110F4D5 -S315080003C0005F3FD100F00803002B14BF1A2000205D -S315080003D010BD4FF0100010BD4FF0000010BD4FF0DB -S315080003E01C0010BD4FF0090010BD4FF00A0010BDEB -S315080003F04FF00B0010BD4FF00C0010BD4FF00D0074 -S3150800040010BD4FF00E0010BD4FF00F0010BD4FF09D -S31508000410100010BD4FF0110010BD4FF0120010BDB6 -S315080004204FF0130010BD4FF0140010BD4FF015002B -S3150800043010BD4FF0160010BD4FF0170010BD4FF05D -S31508000440180010BD4FF0190010BD00BF2DE9F0418E -S3150800045082B004464FF0000001F034FD10F0007F32 -S3150800046040F042814FF000020092019240F2D80318 -S315080004701846C2F200004FF0080101604FF010055F -S3150800048045604FF040038360C2604FF480620261AA -S3150800049001F0F8FC2846FFF727FF0146002840F040 -S315080004A02B8140F2D800C2F2000040F27801C2F275 -S315080004B000010B6803FA05F303604FF03705456042 -S315080004C04FF0400282604FF00001C1604FF4806334 -S315080004D0036101F0D7FC2846FFF706FF014600280E -S315080004E040F00A8140F22000C2F200004FF0FF35CA -S315080004F005604FF0080646604FF0300282604FF004 -S315080005000201C1604FF0000505614FF00103436128 -S3150800051001F0E6FC40F2D800C2F2000005604FF098 -S31508000520330646604FF040028260C5604FF4806132 -S31508000530016101F0A7FC3046FFF7D6FE0146002808 -S3150800054040F0DA80ADF104084FF43055C4F20105E5 -S3150800055040F22A664FF4001707E0384601F0E8FC37 -S3150800056018B101F0D5FC48F8040F6B6B3342F4D090 -S315080005704FF0080001F0DCFC30B14FF0080001F044 -S31508000580E1FC4FF00401B7E04FF0020001F0D0FCA7 -S3150800059030B14FF0020001F0D5FC4FF00201ABE09C -S315080005A04FF0200001F0C4FC30B14FF0200001F0FC -S315080005B0C9FC4FF006019FE04FF4007001F0B8FC4B -S315080005C030B14FF4007001F0BDFC4FF0070193E025 -S315080005D040F2FF5001F0B6FC00984FEA006242EA8A -S315080005E0106300F47F4143EA012300F47F0043EAE5 -S315080005F01022012C3DD112F4802F78D040F2D80475 -S315080006002046C2F2000040F27803C2F200031A68DC -S315080006104FEA024101604FF0370444604FF040034F -S3150800062083604FF00002C2604FF48061016101F0FF -S3150800063029FC2046FFF758FE014600285CD140F207 -S31508000640D800C2F200004FF0020404604FF006041E -S3150800065044604FF0400383604FF00002C2604FF4DD -S315080006608061016101F00EFC2046FFF73DFE014660 -S3150800067042E012F4803F3DD040F2D8042046C2F250 -S31508000680000040F27803C2F200031A684FEA0241FA -S3150800069001604FF0370444604FF0400383604FF029 -S315080006A00002C2604FF48061016101F0EBFB204655 -S315080006B0FFF71AFE0146F8B940F2D800C2F2000068 -S315080006C04FF0000303604FF0060444604FF0400209 -S315080006D08260C3604FF48061016101F0D3FB20465C -S315080006E0FFF702FE014607E04FF00E0104E04FF067 -S315080006F0250101E04FF02501084602B0BDE8F0816A -S3150800070000B583B04FF001038DF807304FF4006051 -S31508000710C4F202004FF4006101F090FA18B94FF0E4 -S3150800072000008DF807009DF8070003B000BD00BF64 -S315080007302DE9F04782B04FF000048DF8074040F2EB -S315080007406000C2F200004FF076030375046044604F -S315080007508460C460046101F067FB4FF0030001F098 -S3150800076083FB4FF0010001F079FB40F2D800C2F29A -S315080007700000046044608460C4604FF480610161D5 -S3150800078001F080FB4FF480354FF0800609E005F153 -S31508000790FF34251E304601F0CBFB002800F02B81E4 -S315080007A004E0304601F0C4FB0028F0D04DB140F219 -S315080007B0FF5001F0C7FB4FF0000004E04FF00300C4 -S315080007C001E04FF003008DF807009DF8072012B1ED -S315080007D09DF8070008E140F2D800C2F200004FF485 -S315080007E0D57404604FF0080545604FF040038360F8 -S315080007F04FF00001C1604FF48062026101F042FBD4 -S315080008004FF43050C4F20100436B13F0450F14D176 -S315080008104FF480314FF43054C4F2010401F1FF352E -S315080008202946636B13F0450F06D105F1FF31636B5B -S3150800083013F0450F00F0DB8011B113F0040F06D05A -S315080008404FF0040001F07EFB4FF003020BE013F0BB -S31508000850400F06D04FF0400001F074FB4FF0000245 -S3150800086001E04FF000028DF807209DF8070048B90F -S3150800087040F24805C2F200054FF001022A604FF027 -S31508000880804518E040F2D8042046C2F200004FF036 -S31508000890000505604FF0370444604FF04001816061 -S315080008A0C5604FF48063036101F0ECFA2046FFF758 -S315080008B01BFD8DF8070040F2D800C2F200004FF089 -S315080008C0000303604FF0370444604FF04001816035 -S315080008D0C3604FF48062026101F0D4FA2046FFF744 -S315080008E003FD8DF807009DF8070000287AD14FF020 -S315080008F0000740F2D804C2F20004B846B94645F0EB -S31508000900004646F4801A4FF43055C4F20105C4F87F -S3150800091000904FF0370666604FF04003A360C4F8B6 -S315080009200C904FF480612161204601F0ABFA304605 -S31508000930FFF7DAFC8DF807009DF8072012B19DF83D -S31508000940070051E0C4F800A04FF0290060604FF09E -S315080009504003A360C4F80C804FF4806121612046EF -S3150800096001F090FA6A6B12F0450F03D16A6B12F028 -S31508000970450FFBD012F0040F06D04FF0040001F02B -S31508000980E1FA4FF0030004E040F2FF5001F0DAFA12 -S3150800099040468DF807009DF8073013B19DF807000B -S315080009A022E0404601F08EFA07F10107002804DB31 -S315080009B04FF6FF739F42AAD103E04FF6FE718F42AE -S315080009C006D94FF01B018DF807109DF807000BE0BC -S315080009D010F0804F06D040F24800C2F200004FF0F7 -S315080009E0020202609DF8070002B0BDE8F087002900 -S315080009F07FF414AF24E7651E7FF4D3AEDEE600BFAE -S31508000A0038B501F037FA002800F0D78040F24803DD -S31508000A10C2F200031868042800F0D28040F2D80019 -S31508000A20C2F200004FF0000101604FF0020242607E -S31508000A304FF0C0048460C1604FF48063036101F025 -S31508000A4021FAFFF725FC0446002840F0C48001F08F -S31508000A5039FA40F24C05C2F2000528604FF004004E -S31508000A6001F030FA68604FF0080001F02BFAA86030 -S31508000A704FF00C0001F026FAE86040F24800C2F296 -S31508000A8000000168012903D9062901D0022956D197 -S31508000A9040F2D800C2F200004FF0000101604FF0AA -S31508000AA0030242604FF040038360C1604FF48061E7 -S31508000AB0016101F0E7F94FF43050C4F20100436BCD -S31508000AC013F0450F07D14FF43052C4F20102536BAD -S31508000AD013F0450FFBD013F0040F06D04FF00400B7 -S31508000AE001F030FA4FF0030475E013F0010F06D059 -S31508000AF04FF0010001F026FA4FF001046BE001F017 -S31508000B00D9F9032818BF102465D140F2FF5001F027 -S31508000B1019FA4FF0000001F0D5F910F4604F02D130 -S31508000B204FEA10430DE010F4005F4CD110F4804FEB -S31508000B304CD110F4004F4CD14FF0010301E04FF0B7 -S31508000B40010340F24801C2F200010868042842D0B5 -S31508000B5040F27804C2F20004236040F2D800C2F2E0 -S31508000B6000004FEA034202604FF0090343604FF06A -S31508000B70C00181604FF00004C4604FF480620261D6 -S31508000B8001F080F9FFF784FB044620BB01F09AF9CF -S31508000B9040F23805C2F2000528604FF0040001F063 -S31508000BA091F968604FF0080001F08CF9A8604FF0E1 -S31508000BB00C0001F087F9E8600DE04FF025040AE023 -S31508000BC04FF0000407E04FF0130404E04FF0100460 -S31508000BD001E04FF00F04204638BD00BF70B401464F -S31508000BE040F24803C2F200031C6880F8564040F2FF -S31508000BF07800C2F200000268A1F8542040F23806D4 -S31508000C00C2F2000633684FEA13604FEA90150D707A -S31508000C10C0F383024A7000F003008870C3F30745E7 -S31508000C20CD70C3F307220A71DBB24B7176684FEABF -S31508000C3016604FEA0015CD80C6F30742CB8898B2F6 -S31508000C4040EA1215CD8002F00F020A72C6F3072396 -S31508000C50D8B24FEAD0154D72C3F380128A72C3F325 -S31508000C604015CD72C3F300120A734FF000054D7399 -S31508000C70012C48D803F003004FEA80230B610D6965 -S31508000C80F2B245EA82040C6140F23806C2F2000666 -S31508000C90B0684FEA10630D6945EA93120A61C3F317 -S31508000CA0C2040C7503F007064E75C0F307434FEAF6 -S31508000CB053158D75C3F38202CA7503F003044FEA10 -S31508000CC044060E76C0F307200B7E43EAD0150D7650 -S31508000CD00E690A7E0C7A4FF0010303FA04F40C65D8 -S31508000CE002F1020203FA02F24FEAE275A2FB0423BA -S31508000CF004FB053306F10106A2FB064506FB035570 -S31508000D00C1E912452CE0022C2AD106F03F044FEA2D -S31508000D1004460E6140F23800C2F2000085680B698D -S31508000D204FEA156243EA02240C610E69C5F30740CF -S31508000D3040EA06030B61C5F307200D694FF001026F -S31508000D404FF00004561944F100034FEAC34545EA3B -S31508000D505632CA644FEAC6448C644FF400760E6570 -S31508000D60C0F380164E7600F03F004FEA40048C76BA -S31508000D7040F23805C2F20005AA688B7EC2F3C01697 -S31508000D8043EA0600887602F07F04CC76ED684FEADF -S31508000D9015624FEAD2130B77C2F341164E77C2F3A8 -S31508000DA08200887702F003044FEA8402CA77C5F303 -S31508000DB00743CE7F46EA9310C877C3F3401481F8F9 -S31508000DC020404FF0000081F8210003F0010281F86D -S31508000DD02220C5F307234FEAD31681F82360C3F30D -S31508000DE0801481F82440C3F3401281F82520C3F308 -S31508000DF0001681F82660C3F3810481F8274003F0C2 -S31508000E00030381F82830C5F3460581F829504FF0C9 -S31508000E10010481F82A4040F24C03C2F200031A6822 -S31508000E204FEA126681F82C60C2F307454FEA052699 -S31508000E30CE85CD8DADB2C2F307263543CD854FEAB3 -S31508000E4002620A635A680D6B4FEA126645EA06455E -S31508000E500D630D6BC2F3074645EA06250D630D6B58 -S31508000E60C2F3072635430D63D2B281F834209A6857 -S31508000E704FEA126681F83560C2F307454FEA056600 -S31508000E808E638D6BC2F3072645EA06458D638D6B27 -S31508000E90D2B245EA02258D63DB688A6B42EA13659E -S31508000EA08D63C3F3074291F83C5045EA121581F861 -S31508000EB03C5002F00F024FEA0225CD87CA8F92B244 -S31508000EC0C3F307252A43CA87C3F3460381F840308C -S31508000ED081F8414070BC704710B540F24803C2F231 -S31508000EE000031968032933D0022934D8B0F5805F86 -S31508000EF034D0B0F5006F16D14FF00100FFF7A6FA0F -S31508000F00044668BB40F26000C2F200004FF00003DE -S31508000F1003750360436083604FF40061C160036139 -S31508000F2000F082FF1CE04FF00000FFF78FFA04463E -S31508000F30B0B940F26000C2F200004FF0000202753C -S31508000F40026042608260C260026100F06DFF07E0E5 -S31508000F504FF0270404E04FF0000401E04FF02704A7 -S31508000F60204610BD10B540F2D803C2F2000318603F -S31508000F704FF007045C604FF040029A604FF00000A3 -S31508000F80D8604FF480611961184600F07BFF20464F -S31508000F90FFF7AAF910BD00BF2DE9F04184B04FF064 -S31508000FA000068DF80F604FF00C004FF0010100F0BD -S31508000FB0D3FE4FF40064C4F2020420464FF0080141 -S31508000FC04FF00C0200F040FE20464FF009014FF0AA -S31508000FD00C0200F039FE20464FF00A014FF00C02D1 -S31508000FE000F032FE20464FF00B014FF00C0200F0E5 -S31508000FF02BFE20464FF00C010A4600F025FE4FF462 -S315080010004067C4F2020738464FF002014FF00C025F -S3150800101000F01AFE4FF4706301934FF001058DF846 -S3150800102009504FF002088DF808808DF80A608DF88F -S315080010300B50204601A900F051FD4FF00401019123 -S315080010403846694400F04AFD4FF4805001908DF807 -S315080010500B60204601A900F041FD4FF40067019797 -S315080010608DF808808DF80B60204601A900F036FD42 -S315080010703846294600F094FE4FF48000294600F0D1 -S315080010806BFE00F0C3FEFFF753FB8DF80F009DF8CB -S315080010900F2012B19DF80F003BE0FFF7B1FC8DF869 -S315080010A00F009DF80F3013B19DF80F0031E040F2A4 -S315080010B06000C2F200004FF0000101750160416056 -S315080010C08160C160016100F0AFFE40F28000C2F2AB -S315080010D00000FFF783FD8DF80F009DF80F0068B933 -S315080010E040F28002C2F20002B2F854304FEA0340DE -S315080010F04FF00001FFF736FF8DF80F009DF80F102F -S3150800110029B94FF40060FFF7E7FE8DF80F009DF848 -S315080011100F0004B0BDE8F0812DE9F84307461646EE -S31508001120BDF820204FF0000140F21C00C2F200007A -S31508001130017040F25C04C2F20004216040F2EC0542 -S31508001140C2F2000529604FF43050C4F20100C162B2 -S3150800115040F24801C2F200010C68022C05D14FEAA0 -S31508001160562646EAC3564FF40072914640F2D80016 -S31508001170C2F2000002604FF0100343604FF04005D2 -S3150800118085604FF00001C1604FF48064046100F08F -S3150800119079FE4FF480344FF0800508E004F1FF34FF -S315080011A0284600F0C5FE002800F0CB8004E028465B -S315080011B000F0BEFE0028F1D04FF01000FFF794F8BB -S315080011C08046002840F0AA8040F22000C2F20000C3 -S315080011D04FF0FF320260C0F804904FF0900383602E -S315080011E04FF00205C5604FF0000505614FF001019B -S315080011F0416100F075FE40F2D800C2F200000660B8 -S315080012004FF0110444604FF040028260C5604FF40D -S315080012108063036100F036FE2046FFF765F88046D6 -S3150800122000287BD13C464FF43055C4F2010540F204 -S315080012302A664FF400471DE0384600F079FEC8B12B -S3150800124000F066FE206000F063FE606000F060FE5D -S31508001250A06000F05DFEE06000F05AFE206100F03C -S3150800126057FE606100F054FEA06100F051FEE06197 -S3150800127004F12004696B3142DED04FF0080000F01B -S3150800128057FE30B14FF0080000F05CFE4FF004083E -S3150800129044E04FF0020000F04BFE30B14FF0020080 -S315080012A000F050FE4FF0020838E04FF0200000F042 -S315080012B03FFE30B14FF0200000F044FE4FF0060824 -S315080012C02CE04FF4007000F033FE90B14FF400703C -S315080012D000F038FE4FF0070820E000F019FE25461A -S315080012E045F8040B07F1FF37304600F021FEC0B978 -S315080012F009E04FF0FF374FF40016304600F018FEAD -S3150800130008B1002FE9D140F2FF5000F01BFE40F271 -S315080013100000C2F200004FF0000202604046BDE83D -S31508001320F88300F0F5FD6060304600F001FE002805 -S31508001330E9D000F0EDFD686005F10804A7F10207A1 -S31508001340DBE7013C7FF433AF36E700BF2DE9F04F0A -S3150800135085B082461646BDF838404FF0000140F287 -S315080013601C02C2F20002117040F25C00C2F20000D8 -S31508001370016040F2EC05C2F2000529604FF43052D4 -S31508001380C4F20102D16240F24801C2F200010868C3 -S31508001390022805D14FEA562646EAC3564FF400748A -S315080013A0254640F2D8031846C2F2000004604FF002 -S315080013B0100444604FF0400282604FF00001C160A3 -S315080013C04FF48063036100F05DFD2046FEF78CFF55 -S315080013D08346002840F0D38040F2D800C2F20000CD -S315080013E006604FF0180444604FF0400282604FF0E8 -S315080013F00001C1604FF48063036100F043FD20469D -S31508001400FEF772FF8346002840F0B98040F22000BC -S31508001410C2F200004FF0FF37076045604FF09006B4 -S3150800142086604FF00004C46004614FF00102426117 -S3150800143000F056FD02944FF43056C4F2010640F20D -S315080014401A674FF4804960E0484600F071FD0028AD -S315080014505BD0029AC2F500701F2830D88308019322 -S3150800146053D055464FF000046FEA0400019A8118DC -S3150800147001F001030393DAF8000000F051FD04F1CE -S3150800148001040AF10408019884427CD10FE045461C -S3150800149055F8040B00F044FDD8F8040000F040FDB0 -S315080014A004F1020405F10408019B9C42EFD101985E -S315080014B00AEB800A029A02EB8001029125E0DAF82B -S315080014C0000000F02DFDDAF8040000F029FDDAF836 -S315080014D0080000F025FDDAF80C0000F021FDDAF826 -S315080014E0100000F01DFDDAF8140000F019FDDAF816 -S315080014F0180000F015FDDAF81C0000F011FD0AF1DD -S31508001500200A029901F120010291706B38429BD0A2 -S315080015104FF0080000F00CFD30B14FF0080000F065 -S3150800152011FD4FF0040B2AE04FF0020000F000FD19 -S3150800153030B14FF0020000F005FD4FF0020B1EE03F -S315080015404FF0100000F0F4FC30B14FF0100000F03E -S31508001550F9FC4FF0050B12E04FF4007000F0E8FCC0 -S3150800156030B14FF4007000F0EDFC4FF0070B06E0C9 -S3150800157040F20001C2F200014FF000030B6058462A -S3150800158005B0BDE8F08F039A002A80D0DAF8040087 -S3150800159000F0C6FC04F1010408F1040801998C4224 -S315080015A07FF475AF83E700BF38B5054618B340F238 -S315080015B0D8031846C2F2000040F27802C2F20002CE -S315080015C011684FEA014404604FF00D0444604FF07F -S315080015D0400383604FF00002C2604FF480610161EE -S315080015E000F050FC2046FEF77FFE044628B900F0BE -S315080015F069FC286001E04FF02604204638BD00BF8C -S3150800160000B583B04FF000030193FFF779F801287E -S3150800161018BFFF2009D101A8FFF7C6FF18B901981E -S31508001620C0F3432001E04FF0FF0003B000BD00BF48 -S3150800163008B5FFF7E5FF042804D0FF2814BF0120EA -S31508001640022008BD4FF0000008BD00BF00B597B0E6 -S31508001650FFF7A2FC68B940F20400C2F20000017864 -S3150800166001F0FE0303706846FFF7B8FA4FF0000072 -S3150800167008E040F20403C2F200034FF001021A70B8 -S315080016804FF0030017B000BD08B540F20403C2F2DC -S3150800169000034FF001021A7050B9FFF7C9FF38B9B5 -S315080016A040F20400C2F20000017801F0FE03037064 -S315080016B040F20402C2F20002107808BD2DE9B043D8 -S315080016C0ADF5027D88461746C8B120E04FF00009FF -S315080016D04FF40075E219009502A84FEA42224B46DC -S315080016E0FFF71AFDB0B9FFF7A3FF0128FBD008EBF7 -S315080016F0442002A92A4607F0B5FB8CB90DE003F190 -S31508001700FF34E4B2002BE1D14FF001000CE04FF0BA -S31508001710010009E04FF0010006E04FF0000003E089 -S3150800172004F1FF30C4B2D5E70DF5027DBDE8B083FC -S315080017302DE9F043ADF5037D0F469046E8B124E068 -S315080017404FF400754FF0000902A807EB44212A461A -S3150800175007F088FB04EB0802009502A84FEA42222C -S315080017604B46FFF7F3FD064608B1052810D1FFF7EB -S315080017705FFF0128FBD08CB90DE003F1FF34E4B21A -S31508001780002BDDD14FF001000CE04FF0010009E01D -S315080017904FF0010006E04FF0000003E004F1FF30CF -S315080017A0C4B2D1E70DF5037DBDE8F08310B596B058 -S315080017B0144640F20403C2F200031A7812F0010F2D -S315080017C021D1032922D8DFE801F0020513194FF0C9 -S315080017D0000023E0E8B96846FFF700FA129B4FEAD3 -S315080017E05322139942EAC15020604FF0000015E0D9 -S315080017F04FF4007020804FF000000FE060B94FF002 -S31508001800200121600AE04FF0030007E04FF00400D2 -S3150800181004E04FF0000001E04FF0000016B010BDE4 -S315080018204FF00000C4F2AA20704700BF82B04FF400 -S315080018306053C4F202031A6842F0010018604FF0C0 -S3150800184000029A60196821F0847020F480311960CA -S3150800185043F21000C2F200405860196821F4802053 -S315080018601860DA60009201921A6842F480311960B1 -S315080018704FF46050C4F20200036803F40032019288 -S31508001880009901F101010091019B1BB9009AB2F57B -S31508001890A06FF1D14FF46050C4F20200016811F450 -S315080018A0003F14BF012100210191019B012B46D164 -S315080018B04FF46050C4F20200026C42F08051016499 -S315080018C04FF4E043C4F200031A6842F44041196039 -S315080018D083688360826842F400418160836843F4C8 -S315080018E0A052826045F20C41C0F240714160036823 -S315080018F043F0807202604FF46050C4F2020001683F -S3150800190011F0007FFBD04FF47053C4F2020340F28B -S3150800191005621A604FF46050C4F20200816821F033 -S3150800192003038360826842F0020181604FF46050CD -S31508001930C4F20200836803F00C02082AFAD14FF4B5 -S315080019406D41CEF200014FF00060886002B070472A -S315080019504FF47053C4F20203186900280DDA4FF4E5 -S315080019607051C4F2020140F22312C4F267524A606F -S3150800197048F6AB13CCF6EF534B6070474FF47053F1 -S31508001980C4F202031A6942F000401861704700BFAA -S315080019904FF47053C4F20203D86070474FF4705383 -S315080019A0C4F20203D86810F4803F1BD14FF470517B -S315080019B0C4F20201CA6812F0100F16D14FF4705320 -S315080019C0C4F20203D86810F0EF0F11D14FF470512A -S315080019D0C4F20201CA6802F00203002B0CBF0820F9 -S315080019E0072070474FF0010070474FF00500704719 -S315080019F04FF00600704700BF00B583B04FF00803EC -S31508001A008DF80730FFF7CAFF8DF807009DF8070025 -S31508001A10012807D1FFF7C2FF8DF807009DF80710C8 -S31508001A200129F7D09DF8070003B000BD70B505463B -S31508001A300E46FFF7E1FF082816D14FF47054C4F29A -S31508001A400204236923F440702061216941F400727D -S31508001A502261236943F0010020612E60FFF7CCFF65 -S31508001A60216921F00102226170BD00BF70B50546EB -S31508001A7041B1012909D0022914BF4FF440764FF429 -S31508001A80007604E04FF0000601E04FF48076FFF799 -S31508001A90B3FF082821D14FF47054C4F20204206918 -S31508001AA020F440712161226916432661236923F0D7 -S31508001AB0F8002061216941F0020215432561236976 -S31508001AC043F480302061FFF797FF216921F0020275 -S31508001AD02261236923F0F801216170BD2DE9F00127 -S31508001AE04FF000034FF001054FF0030705FA03F224 -S31508001AF00C68144094423DD106684FEA430207FA3F -S31508001B0002F46FEA040426400660066891F804C0E9 -S31508001B100CFA02FC4CEA060606600E7906F1FF3658 -S31508001B20F6B2012E17D886683440846086684C79E8 -S31508001B3004FA02F43443846046689CB205FA04FC4D -S31508001B4026EA0C064660466891F806C00CFA04F4C4 -S31508001B50A4B234434460C6689CB24FEA440407FA08 -S31508001B6004F426EA0406C660C468CE7906FA02F2C8 -S31508001B702243C26003F101031C4605FA03F20E680C -S31508001B801640964253D102E0BDE8F0017047D0F8FE -S31508001B9000804FEA430207FA02F66FEA060606EAEB -S31508001BA0080CC0F800C0D0F8008091F804C00CFA00 -S31508001BB002FC4CEA080CC0F800C091F804C00CF10D -S31508001BC0FF3C5FFA8CFCBCF1010F0FD9C668A4B2C2 -S31508001BD04FEA440407FA04F426EA0406C660C46811 -S31508001BE0CE7906FA02F22243C26020E0D0F80880D5 -S31508001BF006EA08068660866891F805C00CFA02F8B7 -S31508001C0048EA06068660D0F804C09EB205FA06F8C9 -S31508001C102CEA080CC0F804C0D0F804C091F8068075 -S31508001C2008FA06F6B6B246EA0C064660CEE703F1AF -S31508001C300103102B7FF45AAFA6E700BF03691942C8 -S31508001C400CBF00200120704730B401F007034FEAAB -S31508001C5083034FEAD10101F1080150F821504FF0F2 -S31508001C600F0404FA03F425EA040440F8214050F866 -S31508001C70214002FA03F2144340F8214030BC704771 -S31508001C8010B44FF46053C4F20203996801F00C02D1 -S31508001C90042A09D0082A0DD0002A38D14FF4105347 -S31508001CA0C0F2F403036037E04FF4D853C0F2B70329 -S31508001CB0036031E04FF46051C4F202014C684A688F -S31508001CC002F03F0114F4800F4FF46053C4F202038C -S31508001CD05A68C2F3881319BF4FF4D854C0F2B70430 -S31508001CE04FF41054C0F2F404B4FBF1F404FB03F10E -S31508001CF04FF46052C4F202025368C3F3014404F17C -S31508001D0001044FEA4402B1FBF2F1016004E04FF42A -S31508001D101054C0F2F40404604FF46053C4F2020392 -S31508001D209C68C4F3031240F20801C2F200018C5CFD -S31508001D30026822FA04F242609C68C4F382240C5DAD -S31508001D4022FA04F484609B68C3F34233C95C22FA1E -S31508001D5001F2C26010BC704739B14FF46051C4F249 -S31508001D6002010B6B1843086370474FF46053C4F2C3 -S31508001D7002031A6B22EA00001863704739B14FF460 -S31508001D806051C4F202010B6C1843086470474FF4A3 -S31508001D906053C4F202031A6C22EA00001864704702 -S31508001DA039B14FF46051C4F202014B6C18434864D0 -S31508001DB070474FF46053C4F202035A6C22EA0000DB -S31508001DC05864704739B14FF46051C4F202010B6987 -S31508001DD01843086170474FF46053C4F202031A6946 -S31508001DE022EA00001861704739B14FF46051C4F215 -S31508001DF002014B6A1843486270474FF46053C4F2B5 -S31508001E0002035A6A22EA00005862704708B54FF47E -S31508001E1000604FF00101FFF7E7FF4FF400604FF055 -S31508001E200001FFF7E1FF08BD10B44FF43053C4F2C8 -S31508001E3001035C68416882681143C26811430268FD -S31508001E40114302690A4324F4FD4424F07F04224323 -S31508001E50007D02435A6010BC704700BF48F2A003D9 -S31508001E60C4F22523186070474FF43053C4F20103B7 -S31508001E70186070474FF43053C4F20103186800F035 -S31508001E800300704710B402684FF43053C4F20103DC -S31508001E909A60DC6824F4FF6121F0070482684168CF -S31508001EA01143C2681143006901432143D96010BC3C -S31508001EB0704700BF4FF43053C4F201031869C0B22B -S31508001EC0704700BF82B04FF00003019342F61441F9 -S31508001ED0C4F2010140180190019A106802B07047D7 -S31508001EE010B402684FF43053C4F201035A624168D1 -S31508001EF09962DC6A24F0F704C268816811430269B2 -S31508001F001143406901432143D96210BC704700BFA1 -S31508001F104FF43053C4F20103D3F88000704700BF72 -S31508001F204FF43053C4F20103C3F88000704700BF72 -S31508001F304FF43053C4F20103596B08420CBF00201A -S31508001F40012070474FF43053C4F201039863704779 -S31508001F504FF0DC03C4F227231860704730B585B00C -S31508001F6004460D46038A23F440504FEA00414FEADF -S31508001F701143EA8813432382A08920F4B05121F043 -S31508001F800C034FEA03424FEA12402989AB8841EA1B -S31508001F90030269890A4393B21843A081A28A22F4EC -S31508001FA040714FEA01434FEA1340AA891043A082C1 -S31508001FB06846FFF765FE4FF48051C4F201018C4272 -S31508001FC005D04FF4A053C4F201039C4201D10398F3 -S31508001FD000E00298A28911B2002909DA00EB800113 -S31508001FE001EB81002B684FEA4305B0FBF5F208E0E8 -S31508001FF000EB800303EB83002D684FEA8502B0FBF4 -S31508002000F2F248F21F51C5F2EB11A1FB02104FEA9A -S3150800201050134FEA03154FF0640103FB1122A08900 -S3150800202003B2002B0DDA4FEAC20202F1320248F27D -S315080020301F51C5F2EB11A1FB0220C0F342132B433B -S315080020400CE04FEA021202F1320248F21F51C5F2C1 -S31508002050EB11A1FB0220C0F343132B439BB2238150 -S3150800206005B030BD29B181898AB242F40053838113 -S315080020707047838923F400514FEA01424FEA12431D -S31508002080838170474FEAC1514FEAD1528280704727 -S3150800209080884FEAC0514FEAD150704703881942E9 -S315080020A00CBF00200120704708B54FF000704FF0B4 -S315080020B00101FFF787FE4FF000704FF00001FFF7B0 -S315080020C081FE08BD4FF00003036043608360C36070 -S315080020D0036143618361C361036243628362C362CE -S315080020E0036343638363C3634FF0400202644FF0A4 -S315080020F0200141648364C364036543658365C365DE -S3150800210003664FF0800242668366C36603674367C9 -S315080021108367C3674FF08061C0F880104FF0007284 -S31508002120C0F884204FF08071C0F888104FF4001171 -S31508002130C0F88C10C0F89030C0F89430C0F89830C9 -S31508002140C0F89C30C0F8A030C0F8A420C0F8A83069 -S315080021504FF40032C0F8AC204FF48071C0F8B010CC -S31508002160C0F8B430C0F8B830704700BF82B04FF03E -S31508002170000301934FF40043C4F202031A6902F004 -S315080021801C024FEAC06042EA10424FEA811101F48C -S31508002190F860024342F001021A614FF40040C4F2AB -S315080021A002004FF6FE71C0F20401019B03F1010320 -S315080021B00193026912F0010F02D0019B8B42F4D9F8 -S315080021C001984FF6FF71C0F20401884206D04FF419 -S315080021D00042C4F20202536998B201E04FF00000CF -S315080021E002B0704710B483B04FF0000301934FF468 -S315080021F00043C4F202031C6904F01C0444F00304FF -S315080022004FEAC06044EA10444FEA811101F4F860CD -S3150800221004435A611C614FF40042C4F202024FF6AD -S31508002220FE71C0F20401019B03F1010301931069D9 -S3150800223010F0010F02D0019B8B42F4D9019A4FF698 -S31508002240FF71C0F20401501A18BF012003B010BC78 -S31508002250704700BFF0B587B004460D464FF000033F -S31508002260059300934FF40040C4F20200066926F075 -S315080022701C0601A8FFF704FD02994FF45342CFF656 -S31508002280CE628B184EF2BF10C0F2E400834202D829 -S3150800229046F008061AE04FF24012CFF6E9528B18BC -S315080022A047F63F00C0F27D10834202D846F00C067E -S315080022B00CE04FF4F242CFF66C4289184FF4B4435F -S315080022C0C0F26223994288BF46F004064FF40040E4 -S315080022D0C4F20200066128464FF000014FF400429E -S315080022E0FFF780FF002800F01C814FF080620592FE -S315080022F0059931B1059B03F1FF300590059A002A2F -S31508002300F8D12168002963D04FF001074FF6FE7611 -S31508002310C0F20406009800F10100009028463946EC -S31508002320FFF724FF00F0040293B213B90099B142F3 -S31508002330F0D900984FF6FF72C0F20402904200F0FE -S31508002340F3804FF00001009128464FF48052FFF7C2 -S3150800235049FF002800F0EB804FF001074FF6FE76A4 -S31508002360C0F20406009B03F1010300932846394690 -S31508002370FFF7FCFE00F0200188B210B9009AB242BD -S31508002380F0D900994FF6FF73C0F20403994200F0A2 -S31508002390D1804FF00000009028464FF01001FFF75B -S315080023A0E5FE00F0040291B219B14FF40062226210 -S315080023B002E04FF00003236200F0020081B219B177 -S315080023C04FF0000262611EE04FF4804363611AE039 -S315080023D06369206A4FEAD00242EA530328464FF05F -S315080023E000019AB2FFF7FEFE002800F0A6806FF003 -S315080023F07F410591059830B1059A02F1FF3305939F -S3150800240005990029F8D14FF40043C4F2020318686D -S3150800241048F20F12CFF620720240A068616808439E -S31508002420E16808432169084361690843A1690843CB -S31508002430E1690843216A0843616A0843A16A0843B7 -S31508002440E16A0843216B0843616B084302431A603B -S31508002450E16BA06B0143226C1143606C0143A26CD3 -S315080024601143E06C0143226D1143606D01435960CD -S31508002470A26D9A60E06DD8609869A16E626E11438C -S31508002480E26E1143226F1143626F11434FF6417298 -S31508002490024041EA0200216E40EA01429A61E06F79 -S315080024A0A16F40EA0102DA6103F58053986943F6A1 -S315080024B02372CFF6DE020240D4F88400D4F88010E6 -S315080024C00843D4F888100843D4F88C100843D4F885 -S315080024D090100843D4F894100843D4F89810084389 -S315080024E0D4F89C100843D4F8A010084302439A6114 -S315080024F0D4F8A410D4F8A800014341F40001D4F894 -S31508002500AC201143D4F8B0000143D4F8B82041EA0E -S315080025100200D4F8B41040EA81021A604FF00100B4 -S315080025200DE04FF000000AE04FF0000007E04FF022 -S31508002530000004E04FF0000001E04FF0000007B093 -S31508002540F0BD00BF40B14FF40041C4F202010B6870 -S3150800255043F008020A6070474FF40043C4F20203CE -S315080025601A6822F008001860704700BF40B14FF49F -S315080025700041C4F202010B6843F004020A60704786 -S315080025804FF40043C4F202031A6822F004001860EC -S31508002590704700BF4FF41043C4F202031A6842F0B2 -S315080025A001001860704700BF4FF41043C4F20203DD -S315080025B0186800F0010070474FF41043C4F2020394 -S315080025C09A6942F480109861704700BF40B14FF491 -S315080025D01041C4F202018B6943F400528A617047C4 -S315080025E04FF41043C4F202039A6922F4005098612A -S315080025F0704700BF40B14FF41041C4F202018B6925 -S3150800260043F002028A6170474FF41043C4F2020392 -S315080026109A6922F002009861704700BF08B54FF02A -S315080026200100FFF78FFFFFF7C7FF4FF00100FFF725 -S315080026309DFF4FF00100FFF7C9FF4FF00100FFF7BC -S31508002640D9FF08BD2DE9F04FB3B04FF0F0504FF069 -S315080026500101FFF781FB4FF047004FF00101FFF73B -S315080026607BFB4FF480404FF00101FFF799FB4FF0D9 -S315080026700100FFF76DFC4FF08E0330934FF0000614 -S315080026808DF8C6604FF002058DF8C4508DF8C76006 -S315080026908DF8C5503746C4F20207384630A9FFF709 -S315080026A01DFA38464FF001014FF00B02FFF7CCFA3E -S315080026B0384629464FF00B02FFF7C6FA38464FF060 -S315080026C003014FF00B02FFF7BFFA38464FF0070138 -S315080026D04FF00B02FFF7B8FA4FF4006030908DF810 -S315080026E0C6608DF8C4508DF8C7608DF8C5504FF494 -S315080026F0C057C4F20207384630A9FFF7EFF9384643 -S315080027004FF00B010A46FFF79FFA4FF0320130915E -S315080027108DF8C6608DF8C4508DF8C7608DF8C55021 -S315080027204FF40068C4F20208404630A9FFF7D6F90C -S3150800273040464FF001014FF00B02FFF785FA40467D -S315080027404FF004014FF00B02FFF77EFA40464FF0B8 -S3150800275005014FF00B02FFF777FA4FF4C0423092AB -S315080027608DF8C6608DF8C4508DF8C7608DF8C550D1 -S31508002770384630A9FFF7B2F938464FF00D014FF049 -S315080027800B02FFF761FA38464FF00E014FF00B02C5 -S31508002790FFF75AFAFFF788FCFFF7FCFEFFF704FF7E -S315080027A00128FBD001A8FFF78DFC4FF00005019525 -S315080027B008954FF400730B930C954FF000460F964F -S315080027C04FF0200012901495159516954FF4006752 -S315080027D009974FF4804106914FF0020A4FF003091A -S315080027E041F21967C0F222074CF2F108C0F2070855 -S315080027F0AEB230465146FFF7B9FC60F31F44304687 -S315080028004946FFF7B3FC60F30F04BC4214D04445B5 -S3150800281012D005F1010B5D461FFA8BF6304651467C -S31508002820FFF7A4FC60F31F4430464946FFF79EFCB9 -S3150800283060F30F04BC4247D1202D07D948F66070D3 -S31508002840C0F600004FF4A17101F06CF801A8A9B216 -S31508002850FFF700FD38B948F66070C0F6000040F290 -S31508002860471101F05FF840F60003C2F2000340F694 -S315080028708002C2F200029A60DB604FF000021A6022 -S315080028805A604FF41041C4F202010B6140F2001382 -S31508002890C2F2000340F28010C2F2000098601A608B -S315080028A0DB605A604FF040025A719A884FF4C8604C -S315080028B060F30C029A804FF08002DA70CB60FFF763 -S315080028C0ADFE33B0BDE8F08F4445B5D00BF1010538 -S315080028D0202D8DD1BAE700BF42F2E043C2F20003D1 -S315080028E04FF008021A704FF0000058704FF0270199 -S315080028F099704FF06902DA704FF05B0018714FF06B -S3150800290045015971704700BF38B540F20013C2F24D -S315080029100003D87810F0800F1FD140F20015C2F2DC -S3150800292000056C884FEA84414FEA914441F6846079 -S31508002930C2F2000040F28011C2F20001224606F0FF -S3150800294091FAEA7842F08003EB704FF41040C4F233 -S3150800295002004FF00101816001E04FF000042046BB -S3150800296038BD00BF38B540F60003C2F20003D87878 -S3150800297010F0800F2CD140F68005C2F2000541F612 -S315080029807864C2F20004284641F68461C2F2000166 -S31508002990228806F067FA40F60003C2F200039D603B -S315080029A04FF000021A604FF0100199705A602088A3 -S315080029B04FEA00524FEA125199804FF0B000D87092 -S315080029C04FF41043C4F202034FF001025A6038BDB7 -S315080029D0FEE700BF00B589B04FF0000300930193EE -S315080029E002930393049305930693079348F6CC70D2 -S315080029F0C0F60000694604F043FB40B9009848B1A8 -S31508002A009DF8081081F01002C2F3001004E04FF0A0 -S31508002A10000001E04FF0000009B000BD48F6CC7098 -S31508002A20C0F60000704700BF08B540F6C060C2F2A5 -S31508002A3000004FF0000380F8243248F6EC71C0F627 -S31508002A4000014FF00A0203F01FFF38B940F6C060D4 -S31508002A50C2F200004FF0010280F8242208BD00BF30 -S31508002A6038B540F6C063C2F2000393F82402012881 -S31508002A7005D140F6C060C2F2000004F017FA4FF420 -S31508002A80A054C4F201044FF0400520462946FFF73A -S31508002A9005FB0028F9D048F6CC70C0F6000004F013 -S31508002AA017FB38BD08B540F6C063C2F2000393F8B9 -S31508002AB02402012805D140F6C060C2F2000004F0E5 -S31508002AC0F5F908BD70B5064640F6C063C2F20003C4 -S31508002AD093F82402012812D1304640F6C061C2F2AA -S31508002AE0000104F0ABFB002809DA40F6C060C2F228 -S31508002AF000004FF0000180F8241204F0D7F931786D -S31508002B0091B14FF4A054C4F201044FF08005204659 -S31508002B10FFF7B8FA20462946FFF7C0FA0028F9D089 -S31508002B2016F8011F0029F2D170BD00BF80B582B02A -S31508002B30FEF77CFE4FF020004FF00101FFF730F959 -S31508002B404FF004004FF00101FFF706F94FF4006556 -S31508002B50C4F2020528464FF006014FF00802FFF7B7 -S31508002B6073F828464FF007014FF00802FFF76CF894 -S31508002B704FF000078DF806704FF001068DF80760D4 -S31508002B804FF002048DF804404FF0400300938DF88F -S31508002B90054028466946FEF7A1FF8DF804404FF028 -S31508002BA08000009028466946FEF798FF2046314681 -S31508002BB0FFF7D2F84FF48065C4F2020528464FF0B5 -S31508002BC005014FF00902FFF73FF828464FF00601C6 -S31508002BD04FF00902FFF738F84FF0600100918DF8C1 -S31508002BE004408DF805408DF806708DF80760284674 -S31508002BF06946FEF773FF4FF0C0603146FFF7BEF82F -S31508002C0000F0DAFE00F0E6FEFCE700BF08B548F67D -S31508002C10FC70C0F600004FF03D0100F083FE08BDD1 -S31508002C2008B500F085FB90B100F03AFF00F08EFB86 -S31508002C3000F06CFB20F0604020F07F014EF6085350 -S31508002C40CEF20003196000F061FB4268904708BDA8 -S31508002C50F8B5044602F1FF37BFB2F2B100F101033D -S31508002C60DF190E1A6FEA0000391801F00105A25D96 -S31508002C7004F8012B00F062FFBC420FD1F8BDA05D3D -S31508002C80254605F8010B00F059FFA95D617005F1AD -S31508002C90010400F053FFBC42F1D1F8BD002DEED07F -S31508002CA0A35D04F8013B00F049FFBC42E7D1F8BD3B -S31508002CB010B5044600F042FF4BF6FF73C0F600035A -S31508002CC09C4205D94FF6FF70C0F6000084426FD9C2 -S31508002CD000F034FF4FF6FF71C0F600018C4205D9AB -S31508002CE04FF6FF72C0F60102944264D900F026FF3F -S31508002CF04FF6FF73C0F601039C4205D94FF6FF70E5 -S31508002D00C0F60300844259D900F018FF4FF6FF7148 -S31508002D10C0F603018C4205D94FF6FF72C0F60502CC -S31508002D2094424ED900F00AFF4FF6FF73C0F605032A -S31508002D309C4205D94FF6FF70C0F60700844243D976 -S31508002D4000F0FCFE4FF6FF71C0F607018C4205D96C -S31508002D504FF6FF72C0F60902944238D900F0EEFE2B -S31508002D604FF6FF73C0F609039C4205D94FF6FF706C -S31508002D70C0F60B0084422DD900F0E0FE4FF6FF7135 -S31508002D80C0F60B018C4205D94FF6FF72C0F60D024C -S31508002D90944222D900F0D2FE4FF6FF73C0F60D0317 -S31508002DA09C4226D9B4F1016F38BF082317D323E014 -S31508002DB04FF0000313E04FF0010310E04FF0020359 -S31508002DC00DE04FF003030AE04FF0040307E04FF06D -S31508002DD0050304E04FF0060301E04FF0070303EB99 -S31508002DE0430049F2B801C0F6000101EB8002107AEF -S31508002DF010BD4FF0FF0010BD4FF0FF0010BD00BF23 -S31508002E002DE9F04105460068FFF752FFFF283BD041 -S31508002E10FEF79EFD4FF0F300FEF7BAFDFEF7BEFD86 -S31508002E20012818BF002404D1FEF7A8FD4FF00004BE -S31508002E302CE02F6804EB07082B195E6800F07EFE6D -S31508002E4040463146FEF7F2FD082815D1E059B04252 -S31508002E5015D104F104042F6804EB07082A195668EB -S31508002E6000F06CFE40463146FEF7E0FD082810D01B -S31508002E7002E04FF0010404E04FF0000401E04FF0D7 -S31508002E800004FEF77BFD01E04FF000042046BDE894 -S31508002E90F081E359B342F2D104F10404B4F5007F9A -S31508002EA0C7D1E6E708B54FEAC1534FEAD3525AB934 -S31508002EB003688B420BD040F8041B4FF40072FFF7EF -S31508002EC0C7FE4FF0010008BD4FF0000008BD4FF0E7 -S31508002ED0010008BD38B504460D4641F2E803C2F2C2 -S31508002EE0000398420AD04FF44040C0F600008142E1 -S31508002EF009D02046FFF784FF48B911E041F2EC24D7 -S31508002F00C2F2000403E041F2E804C2F200042046DB -S31508002F102946FFF7C7FF002814BF2046002038BD02 -S31508002F204FF0000038BD00BF2DE9F04704460D46B6 -S31508002F3016461F464FEA51294FEA49290368B3F155 -S31508002F40FF3F04D14946FFF7ADFF00283FD0206870 -S31508002F50484506D020464946FFF7BCFF04460028E8 -S31508002F6039D021686D1A651905F1040540F2FF1874 -S31508002F7009F5007907F1FF3A0AF0010A00F0DEFDCB -S31508002F8004F10402AB1A434536D92CE000F0D6FD0D -S31508002F9004F10400291A414507D920464946FFF796 -S31508002FA099FF0446D8B100F1040516F8012B05F877 -S31508002FB0012B07F1FF3700F0C1FD04F10403E81AFD -S31508002FC0404542D938E04FF00100BDE8F0874FF0A0 -S31508002FD00000BDE8F0874FF00000BDE8F0874FF02D -S31508002FE00000BDE8F08720464946FFF773FF044610 -S31508002FF00028F4D000F1040516F8010B05F8010BBA -S31508003000013FE0D0BAF1000FC0D000F097FD04F1FF -S3150800301004016A1A424508D920464946FFF75AFF6D -S3150800302004460028DBD000F1040516F8013B05F834 -S31508003030013B013FAAD1C6E720464946FFF74AFFAA -S3150800304004460028CBD000F1040516F8011B05F844 -S31508003050011B013F9AD1B6E74FF0FF3341F2EC224C -S31508003060C2F20002136041F2E800C2F200000360F7 -S31508003070704700BF70B504460D461646FFF718FEA2 -S31508003080FF2823D004F1FF304019FFF711FEFF286F -S315080030901FD04FEA54224FF44043C0F60003B3EB67 -S315080030A0422F09D141F2E800C2F200002146324619 -S315080030B02B46FFF739FF70BD41F2EC20C2F2000043 -S315080030C0214632462B46FFF72FFF70BD4FF0000012 -S315080030D070BD4FF0000070BD2DE9F04106460D4663 -S315080030E0FFF7E6FD044606F1FF304019FFF7E0FD5D -S315080030F00546FF2C59D0FF285BD0844249D8022CBC -S315080031004BD90B284DD8FEF723FC4FF0F300FEF7FA -S315080031103FFCFEF743FC012805D1FEF72FFC4FF0D4 -S315080031200000BDE8F08149F28806C0F600064FF0B7 -S3150800313002072B1B03F0010800F000FD36F8140007 -S315080031403946FEF793FC082837D008E000F0F6FC6D -S3150800315036F814003946FEF789FC082805D0FEF72C -S315080031600DFC4FF00000BDE8F08104F1010404F005 -S31508003170FF0400F0E3FC36F814003946FEF776FC47 -S31508003180082832D0EBE7FEF7F9FB4FF00100BDE85F -S31508003190F0814FF00000BDE8F0814FF00000BDE877 -S315080031A0F0814FF00000BDE8F0814FF00000BDE867 -S315080031B0F0814FF00000BDE8F08104F10104E4B2AB -S315080031C0A542E0D34FFA88F10029BFD000F0B6FC3B -S315080031D036F814003946FEF749FC0828BFD104F131 -S315080031E00104E4B2A542B1D2CDE704F10104E4B288 -S315080031F0A542ABD2C7E700BF00B583B041F2E803EA -S31508003200C2F200031868B0F1FF3F1ED041F2E8038E -S31508003210C2F2000399685A688818D96840181A696A -S315080032208118586909189A698818DB69C118C1F1A3 -S31508003230000002AA42F8040D4CF28810C0F60000FD -S315080032404FF00401FFF716FF01E04FF0010003B04D -S3150800325000BD00BF4CF20402C0F600024FF4404322 -S31508003260C0F600031068196842184CF20803C0F645 -S315080032700003186811184CF20C02C0F60002136815 -S31508003280C8184CF21001C0F600010A6880184CF202 -S315080032901403C0F60003196842184CF21800C0F669 -S315080032A000000368D1184CF28812C0F600021068B4 -S315080032B00B18D3F1010038BF0020704708B541F25A -S315080032C0E803C2F200031868B0F1FF3F06D041F2E6 -S315080032D0E800C2F20000FFF793FD88B141F2EC2145 -S315080032E0C2F200010A68B2F1FF3F0CD041F2EC20AD -S315080032F0C2F20000FFF784FD003018BF012008BDA8 -S315080033004FF0000008BD4FF0010008BD4FF44040E3 -S31508003310C0F60000704700BF08B5FFF79DFE08BD60 -S3150800332008B5FFF7A7FE08BD08B5FFF7D5FE08BD27 -S3150800333008B5FFF78FFF08BD08B5FFF75DFF10B1A9 -S31508003340FFF7BCFF08BD4FF0000008BD4EF21003A2 -S31508003350CEF200034FF000021A60704708B5FFF777 -S31508003360F5FF4EF21003CEF2000349F23F02C0F217 -S3150800337002025A604FF0000098604FF0050119608C -S3150800338041F2F043C2F20003186008BD4EF2100382 -S31508003390CEF20003186810F4803F07D041F2F041DE -S315080033A0C2F200010A6802F101020A60704700BF12 -S315080033B008B5FFF7EBFF41F2F043C2F200031868C5 -S315080033C008BD00BF10B504464FF4A050C4F2010072 -S315080033D04FF02001FEF762FE012809D14FF4A050F4 -S315080033E0C4F20100FEF754FE20704FF0010010BD34 -S315080033F04FF0000010BD00BF38B504464FF4A0508A -S31508003400C4F201004FF08001FEF748FEA8B14FF460 -S31508003410A050C4F201002146FEF734FE4FF4A05432 -S31508003420C4F201044FF0800520462946FEF736FE11 -S315080034300028F9D04FF0010038BD4FF0000038BD24 -S3150800344010B584B04FF4614300934FF00000ADF817 -S315080034500400ADF80600ADF80800ADF80C004FF012 -S315080034600C01ADF80A104FF4A054C4F2010420462A -S315080034706946FEF773FD20464FF00101FEF7F2FD9F -S3150800348004B010BD2DE9F84305460C46402907D976 -S3150800349049F22410C0F600004FF0770100F042FA16 -S315080034A02046FFF7A9FF012807D049F22410C0F6E5 -S315080034B000004FF07B0100F035FA264644B349F286 -S315080034C02417C0F600074FF084084FF0000406F1F1 -S315080034D0FF3303F0010900F031FB285DFFF78CFF8D -S315080034E0012817D11AE000F029FB285DFFF784FFB1 -S315080034F0012803D03846414600F014FA04F10104C5 -S3150800350000F01CFB285DFFF777FF012820D123E098 -S31508003510BDE8F8833846414600F004FA04F1010490 -S31508003520012EF5D90FFA89F00028DCD000F006FB49 -S31508003530285DFFF761FF012803D03846414600F0B1 -S31508003540F1F904F10104A1B2B142CCD3BDE8F88384 -S315080035503846414600F0E6F904F10104A2B2B24247 -S31508003560C1D3BDE8F88300BF10B5044641F239530C -S31508003570C2F200031878E8B941F2F440C2F200003A -S31508003580FFF720FF012843D141F2F443C2F20003BA -S31508003590187800283FD041F23951C2F200014FF0A5 -S315080035A001020A704FF0000041F23853C2F20003DC -S315080035B0187010BD41F23851C2F200010A7802F1C2 -S315080035C0010241F2F443C2F200039818FFF7FAFE2B -S315080035D0012823D141F23850C2F20000017801F1E6 -S315080035E00101CAB2027041F2F443C2F2000318782C -S315080035F0904216D120460C49FFF72AFB41F2395171 -S31508003600C2F200014FF000020A704FF0010010BD2F -S315080036104FF0000010BD4FF0000010BD4FF0000045 -S3150800362010BD4FF0000010BDF51400202DE9F84F2D -S315080036304FF0000249F22420C0F600004FF4FA7158 -S315080036404AF2104340F2FF3912F800C08418647831 -S315080036500CEB040808FB011693FBF6FA06FB1A3670 -S3150800366036B955460AF1FF381FFA88F8C84512D9FF -S3150800367002F1020210F802C0861874780CEB040AEC -S315080036800AFB011893FBF8F608FB163ABAF1000F85 -S3150800369040F0A08095E0E34627464FF4D040C4F2B8 -S315080036A000004FF000024261016841F400430360E4 -S315080036B0066816F4004F09D04FF4D044C4F200044B -S315080036C000F03CFA206810F4004FF9D14FF4D041CD -S315080036D0C4F200010A6822F002030B600E6846F085 -S315080036E001000860496811F0010F09D14FF4D04470 -S315080036F0C4F2000400F022FA626812F0010FF9D051 -S315080037000BF1FF3307F1FF374FEA075747EA03463E -S3150800371005F1FF3535434FF4D040C4F20000C561CA -S31508003720016821F001020260436813F0010F09D015 -S315080037304FF4D044C4F2000400F000FA606810F0B8 -S31508003740010FF9D14FF4C841C4F20001D1F80022A3 -S3150800375042F00103C1F80032D1F81C0220F480427D -S31508003760C1F81C22D1F80C3243F48040C1F80C028F -S315080037704FF00002C1F8B022C1F8B422D1F80432E1 -S3150800378023F48040C1F80402D1F8142222F48043BD -S31508003790C1F81432D1F81C0240F48042C1F81C2248 -S315080037A0D1F8003223F00100C1F80002BDE8F88F15 -S315080037B049F2A410C0F600004FF0F00100F0B2F88C -S315080037C06BE793FBF8F505F1FF381FFA88F8C8454B -S315080037D07FF661AF02F10202242A7FF435AFE7E7EC -S315080037E038B504460D464FF4D043C4F20003986832 -S315080037F010F0806F07D149F2A410C0F600004FF40C -S31508003800A27100F08FF84FF4D043C4F20003D3F846 -S31508003810802102F00101C3F88011D3F8800140F03D -S315080038207C4242F40011C3F88011C3F88451E07851 -S31508003830A2784FEA024141EA006022781043617893 -S3150800384040EA0120C3F88801E179A2794FEA0240EB -S3150800385040EA016221790A43607942EA0022C3F804 -S315080038608C21D3F8801141F00100C3F880019B68D0 -S3150800387013F0806F09D14FF4D044C4F2000400F06D -S315080038805DF9A26812F0806FF9D038BD4FF4D043C5 -S31508003890C4F20003D96811F0030F40D04FF4D042A8 -S315080038A0C4F20002D2F8B01140F26763B3EB515F7D -S315080038B02AD14FF4D041C4F20001D1F8B8210270E0 -S315080038C0D1F8B8314FEA13224270D1F8B8314FEA2D -S315080038D013428270D1F8B8314FEA1362C270D1F838 -S315080038E0BC310371D1F8BC214FEA12234371D1F8D8 -S315080038F0BC214FEA12438371D1F8BC114FEA116219 -S31508003900C2714FF0010001E04FF000004FF4D043C0 -S31508003910C4F20003D96841F02002DA6070474FF01C -S315080039200000704708B541F23C53C2F20003186024 -S3150800393041F24050C2F20000016000F0FFF8FCE7D7 -S3150800394008B500F0F5F8012822D000F0E7FBF8B139 -S3150800395041F24453C2F200031878012818D1FFF740 -S3150800396027FD41F24851C2F200010A6802F51C53CC -S3150800397003F1100398420BD341F24450C2F20000FF -S315080039804FF00001017000F0D3FB08B9FFF748F9C2 -S3150800399008BD00BF08B541F24453C2F200034FF018 -S315080039A001021A70FFF704FD41F24851C2F2000104 -S315080039B00860FFF7C5FF08BD08B500F0BDF8FFF7BA -S315080039C0CDFCFFF7A9FC00F091FB00F00FF8FFF71C -S315080039D0E1FF08BD08B500F0B1F8FFF7D7FC00F025 -S315080039E003FD00F01BF8FFF7ABFF08BD10B500F0AC -S315080039F0BDF8FFF71BFE40F21804C2F200044FF0B0 -S31508003A0001032370FFF71CFD4FF00000207005F03E -S31508003A10D1F84FF00301217010BD00BF08B541F27F -S31508003A204C50C2F20000FFF731FF01280CD140F2DA -S31508003A301803C2F200034FF001021A7041F24C500B -S31508003A40C2F2000000F0B6F841F24C50C2F2000093 -S31508003A50FFF78AFD01280CD140F21800C2F20000D7 -S31508003A604FF00001017041F24C50C2F2000000F024 -S31508003A70A1F841F24C50C2F2000005F017F90128EE -S31508003A800CD140F21803C2F200034FF003021A7079 -S31508003A9041F24C50C2F2000000F08CF808BD00BF9D -S31508003AA0704700BF38B505460C4640F21803C2F207 -S31508003AB000031878012803D12846C9B2FFF790FEFB -S31508003AC040F21801C2F200010A781AB92846E1B292 -S31508003AD0FFF7D8FC40F21803C2F20003187803284F -S31508003AE003D12846E1B205F0A1F800F059F838BD2F -S31508003AF040F21803C2F200031878012804D00228FD -S31508003B0014BF4020002070474FF00800704700BFE0 -S31508003B1040F21803C2F200031878012804D00228DC -S31508003B2014BF4020002070474FF00800704700BFC0 -S31508003B3008B500F02BF808BD704700BF704700BFF6 -S31508003B4041F28C53C2F200034FF000025A707047DC -S31508003B5041F28C53C2F200034FF0FE02DA7018717C -S31508003B604FF00200A3F84400704700BF41F28C539F -S31508003B70C2F200034FF000021A709A6483F84320D9 -S31508003B80A3F844209A705A70704700BF41F28C53CC -S31508003B90C2F200031878003018BF0120704700BF32 -S31508003BA041F28C53C2F200034FF0000283F843201F -S31508003BB0704700BF38B504460378FF2B2BD100F0B9 -S31508003BC0ADFA20B94FF01000FFF7C2FFE0E1FFF7AA -S31508003BD0B7FF41F28C54C2F200044FF0010525707C -S31508003BE04FF0FF02E2704FF0100323714FF0000010 -S31508003BF06071FFF77DFFA071FFF78AFFE071FFF79D -S31508003C0087FF4FEA102121726572A5724FF00802EC -S31508003C10A4F84420BCE141F28C52C2F200021078AA -S31508003C20012840F0D681A3F1C903352B00F2AC81F7 -S31508003C30DFE813F00601AA01AA01A501AA01AA0153 -S31508003C4097012D017D016701AA01AA01AA01AA010E -S31508003C50AA01AA01AA01AA01AA01AA01AA01AA01FE -S31508003C60AA01AA01AA01AA01AA01AA01AA01AA01EE -S31508003C70AA01AA01AA01AA01AA01AA01AA01AA01DE -S31508003C80AA01AA01AA01AA018B00590036007D00E3 -S31508003C90AA01AA01AA01C200AA01DC00E100F500F6 -S31508003CA06578FFF725FF00F1FF30854204DD4FF008 -S31508003CB02200FFF74DFF6BE141F28C55C2F2000579 -S31508003CC005F10400A96C6278FEF7C2FF4FF0FF0108 -S31508003CD0E9706278AB6CD018A864617801F10101CB -S31508003CE0A5F8441054E16578FFF702FF00F1FF32AA -S31508003CF0954204DD4FF02200FFF72AFF48E161688C -S31508003D0041F28C55C2F20005A96405F104006278F7 -S31508003D10FEF79EFF4FF0FF03EB706078A96C421820 -S31508003D20AA64637803F10103A5F8443030E141F24F -S31508003D308C50C2F200004FF0FF01C17063688364C3 -S31508003D404FF00102A0F8442022E141F28C50C2F261 -S31508003D5000004FF0FF01C170836C6468C4B1E418B9 -S31508003D606FEA0302101900F0010213F8011BA342BF -S31508003D7040F030810EE01A4612F8010B09185B78FC -S31508003D8053FA81F0C1B202F10103A342F3D101E073 -S31508003D904FF0000141F28C53C2F20003C3F807103A -S31508003DA04FF001021A714FF00001597199714FF0E5 -S31508003DB00800A3F84400EBE041F28C50C2F2000080 -S31508003DC04FF0FF03C37049F24822C0F6000282642E -S31508003DD04FF000010171417181714FF00703C0F87E -S31508003DE007304FF00802A0F84420D1E04FF0000059 -S31508003DF0FFF7AEFECCE041F28C50C2F200004FF065 -S31508003E00FF01C1704FF0000303714278427183715C -S31508003E10C37103724FF00601A0F84410B8E041F2EE -S31508003E208C54C2F200044FF000012170FFF788FE9F -S31508003E304FF0FF03E3704FF00102A4F84420A7E017 -S31508003E4041F28C55C2F20005AD6CFFF751FE00F148 -S31508003E50FF31284604F10102FFF762FA20B94FF054 -S31508003E603100FFF775FE93E041F28C54C2F200046C -S31508003E704FF0FF03E370A56CFFF73AFE05F1FF3537 -S31508003E802818A0644FF00101A4F8441080E0657872 -S31508003E90FFF72EFEA0F10200854204DD4FF0220056 -S31508003EA0FFF756FE74E041F28C51C2F200014FF062 -S31508003EB0FF02CA704FF00100A1F84400617841B9C9 -S31508003EC0FFF73AFA002863D14FF03100FFF740FEBA -S31508003ED05EE041F28C53C2F20003986C04F10202D0 -S31508003EE0FFF71EFA20B94FF03100FFF731FE4FE019 -S31508003EF041F28C50C2F200006178826C8B188364A0 -S31508003F0046E041F28C54C2F200044FF0FF05E5701A -S31508003F104FF0000525716571FFF7EAFDA071E5719F -S31508003F20257265724FF00703A4F8443030E041F279 -S31508003F308C52C2F20002906C6168FFF7F5F920B95D -S31508003F404FF03100FFF704FE22E041F28C51C2F235 -S31508003F5000014FF0FF00C8704FF00103A1F844308C -S31508003F6016E0FEF75DFE41F28C50C2F200004FF0FB -S31508003F70FF01C1704FF00102A0F8442008E04FF09D -S31508003F803100FFF7E5FD03E04FF02000FFF7E0FD05 -S31508003F9041F28C53C2F2000393F84300012803D17F -S31508003FA04FF01000FFF7D4FD41F28C51C2F2000128 -S31508003FB0B1F844100AB2002A0BDD41F28C50C2F265 -S31508003FC000004FF0010380F8433000F10300FFF7CB -S31508003FD069FD38BD002A3FF4CEAE13F8010B091867 -S31508003FE0C9B2A3427FF4C7AED4E600BF30B40246D6 -S31508003FF04CF6CD44CCF6CC4401F10101A4FB0223D6 -S31508004000DA08F9D14FF0000501F8015902464CF6D5 -S31508004010CD45CCF6CC450846A5FB02434FEAD3036B -S3150800402003EB8304A2EB440202F1300201F80129F2 -S315080040301A46002BEFD130BC704700BF38B505468D -S31508004040007804F007FFC0B2A0F13004E4B2162CE1 -S3150800405020D8A0F13A02D1B206291ED9092C84BF6C -S31508004060A0F13704E4B2687804F0F4FEC0B2A0F117 -S315080040703003D9B2162913D8A0F13A02D3B2062BC7 -S3150800408011D9092984BFA0F13701C9B201EB04147B -S31508004090E0B238BD4FF0000038BD4FF0000038BD23 -S315080040A04FF0000038BD4FF0000038BD08B500F0ED -S315080040B00F03092802D903F1370008BD03F13000C0 -S315080040C004F0C8FEC0B208BD38B505460C464FEA2E -S315080040D01010FFF7EBFF207005F00F00FFF7E6FF63 -S315080040E060704FF00003A370204638BD08B54FF046 -S315080040F0000041F21863C2F20003187041F224610D -S31508004100C2F2000102F0A6FB38B149F25020C0F60F -S3150800411000004FF07C01FFF705FC08BD41F218636B -S31508004120C2F200031878D0F1010038BF00207047AA -S3150800413008B5FFF7FDFC01280FD041F21863C2F25B -S315080041400003187860B9FEF745FC01280BD141F247 -S315080041501861C2F20001087008BD4FF0000008BDE2 -S315080041604FF0000008BD4FF0000008BD10B504462A -S31508004170007804F06FFE53280DD1607804F062FED3 -S3150800418060B1607831280CD032280DD0332814BF9E -S315080041900320022010BD4FF0030010BD4FF00300AE -S315080041A010BD4FF0000010BD4FF0010010BD00BF5C -S315080041B0F8B5044600F10200FFF740FF064605463B -S315080041C004F1040400F001072046FFF737FF301812 -S315080041D0C6B205F1FF318DB204F10204012D21D8D2 -S315080041E015E02046FFF72AFF3018C6B205F1FF355D -S315080041F004F10204ADB22046FFF720FF3118CEB213 -S3150800420005F1FF3295B204F10204012DE9D82046E2 -S31508004210FFF714FF6FEA0603DEB2864214BF0020DA -S315080042200120F8BD3FB2002FDBD02046FFF706FF7E -S315080042303218D6B205F1FF339DB204F10204012DFE -S31508004240CFD8E4E72DE9F04104461546884601B182 -S3150800425038B949F25020C0F6000040F23621FFF77F -S3150800426061FB2046FFF782FF0646032800F0B08070 -S315080042702046FFF79DFF002800F0AD80012E34D0C0 -S315080042801EB1022E40F0AA8065E004F10200FFF795 -S31508004290D5FE074604F10400FFF7D0FE4FEA0026D4 -S315080042A0C8F8006004F10600FFF7C8FE3118C8F820 -S315080042B0001004F10804A7F10307BFB2002D00F0AF -S315080042C08F800FFA87F8B8F1000F40F389804FF016 -S315080042D000062046FFF7B2FEA85504F1020406F1CF -S315080042E00106B6B24645F4DB7AE004F10200FFF7B0 -S315080042F0A5FE074604F10400FFF7A0FE4FEA0046B4 -S31508004300C8F8006004F10600FFF798FE06EB0026E1 -S31508004310C8F8006004F10800FFF790FE3218C8F8E4 -S31508004320002004F10A04A7F10407BFB2002D57D0F4 -S315080043300FFA87F8B8F1000F52DD4FF00006204655 -S31508004340FFF77CFEA85504F1020406F10106B6B291 -S315080043504645F4DB44E004F10200FFF76FFE07462A -S3150800436004F10400FFF76AFE4FEA0066C8F8006029 -S3150800437004F10600FFF762FE06EB0046C8F8006087 -S3150800438004F10800FFF75AFE06EB0026C8F800609D -S3150800439004F10A00FFF752FE3018C8F8000004F1CD -S315080043A00C04A7F10507BFB2D5B10FFA87F8B8F123 -S315080043B0000F15DD4FF000062046FFF73FFEA85513 -S315080043C004F1020406F10106B6B24645F4DB07E03D -S315080043D04FF0000704E04FF6FF7701E04FF00007C3 -S315080043E038B2BDE8F08100BF70B541F21863C2F279 -S315080043F000031878002800F04D82012843D1FEF703 -S3150800440013FB49F2C420C0F60000FEF75BFB49F235 -S31508004410E820C0F60000FEF755FBFEF7FFFA014656 -S31508004420C6484FF0010202F02FFA50B149F2103097 -S31508004430C0F60000FEF746FB4FF00100FEF732FB20 -S3150800444070BD49F21830C0F60000FEF73BFB49F292 -S315080044502030C0F60000FEF735FB49F24430C0F6BE -S315080044600000FEF72FFB41F21C63C2F200034FF077 -S3150800447000021A605A6041F21860C2F200004FF05A -S315080044800201017070BD022840F0088141F22464DF -S31508004490C2F2000441F67C20C2F200004FF480719B -S315080044A004F50D7202F07EFE94F93A12002915DA27 -S315080044B049F21030C0F60000FEF704FB4FF0020088 -S315080044C0FEF7F0FA04F50D7002F0F0FC41F2186000 -S315080044D0C2F200004FF00001017070BD18B341F63A -S315080044E07C26C2F20006304606F5C0714FF000027F -S315080044F0FFF7A8FE0646B0F1FF3F14D149F2103087 -S31508004500C0F60000FEF7DEFA4FF00300FEF7CAFA1F -S315080045108A4802F0CBFC41F21863C2F200034FF05E -S3150800452000021A7070BD32B2002A2CDD41F21C63FB -S31508004530C2F20003586868B941F21C61C2F2000170 -S3150800454041F67C23C2F20003D3F88001086036B234 -S315080045504E6018E041F67C21C2F20001D1F88021B4 -S3150800456041F21C63C2F2000319688A4204D241F27E -S315080045701C63C2F200031A6000FA86F041F21C625C -S31508004580C2F20002506041F22461C2F20001D1F881 -S315080045903C22D1F840329A4240F07C8167484FF07D -S315080045A0000102F08FFCA0B149F21030C0F60000FD -S315080045B0FEF788FA4FF00400FEF774FA5F4802F037 -S315080045C075FC41F21860C2F200004FF0000101705C -S315080045D070BD49F21830C0F60000FEF773FA49F2CA -S315080045E07430C0F60000FEF76DFA41F21C64C2F2A0 -S315080045F0000441F2D855C2F2000560682946FFF763 -S31508004600F5FC2846FEF75EFA49F28030C0F600004F -S31508004610FEF758FAE0782946FFF756FDA07805F127 -S315080046200201FFF751FD607805F10401FFF74CFD23 -S31508004630207805F10601FFF747FD2846FEF742FAFE -S3150800464049F22440C0F60000FEF73CFA206861688B -S31508004650FEF76AFEA0B949F21030C0F60000FEF770 -S3150800466031FA4FF00500FEF71DFA344802F01EFC39 -S3150800467041F21863C2F200034FF000021A7070BDCF -S3150800468049F21830C0F60000FEF71CFA41F218602D -S31508004690C2F200004FF00301017070BD032840F01C -S315080046A0F98041F22464C2F2000441F67C20C2F289 -S315080046B000004FF4807104F50D7202F073FD94F951 -S315080046C03A12002915DA49F29C30C0F60000FEF7C6 -S315080046D0F9F94FF00200FEF7E5F904F50D7002F05E -S315080046E0E5FB41F21863C2F200034FF000001870B0 -S315080046F070BD28B341F67C22C2F20002104602F5CC -S31508004700C07102F58072FFF79DFD0546B0F1FF3FC7 -S3150800471016D149F2C030C0F60000FEF7D3F94FF0C3 -S315080047200300FEF7BFF9054802F0C0FB41F2186125 -S31508004730C2F200014FF000020A7070BD581800203E -S315080047402BB2002B5EDD49F2E430C0F60000FEF71E -S31508004750B9F92EB241F2D854C2F2000430462146C5 -S31508004760FFF744FC2046FEF7ADF949F2F430C0F6EF -S315080047700000FEF7A7F941F67C25C2F2000595F878 -S3150800478083012146FFF7A0FC95F8820104F1020196 -S31508004790FFF79AFC95F8810104F10401FFF794FCF0 -S315080047A095F8800104F10601FFF78EFC2046FEF716 -S315080047B089F949F22440C0F60000FEF783F9D5F8D6 -S315080047C08001314605F58072FEF7AAFDA0B949F2C7 -S315080047D01030C0F60000FEF775F94FF00600FEF738 -S315080047E061F92D4802F062FB41F21863C2F2000338 -S315080047F04FF00000187070BD49F21830C0F600007E -S31508004800FEF760F941F22460C2F20000D0F83C12CB -S31508004810D0F8402291423DD149F20C40C0F6000042 -S31508004820FEF750F9FEF788FDA0B949F21030C0F638 -S315080048300000FEF747F94FF00700FEF733F9164870 -S3150800484002F034FB41F21861C2F200014FF0000297 -S315080048500A7070BD49F21830C0F60000FEF732F94A -S3150800486049F22840C0F60000FEF72CF90A4802F083 -S315080048701DFB49F24040C0F60000FEF723F941F25D -S315080048801863C2F200034FF000001870FEF7E8F84C -S31508004890FEF7C6F970BD00BF5818002010B4E2B183 -S315080048A082186FEA0004131903F0010401F1FF31BD -S315080048B011F8013F00F8013B904210D10DE001F1DB -S315080048C001044978034603F8011B04F101016478E1 -S315080048D0447003F101009042F1D110BC7047002CDE -S315080048E0EDD011F8013F00F8013B9042E7D1F4E71B -S315080048F092B182186FEA0003D31803F0010300F897 -S31508004900011B904209D17047034603F8011B417009 -S3150800491003F101009042F7D17047002BF4D000F85C -S31508004920011B9042F0D17047037833B18B4204D013 -S3150800493010F8013F0BB18B42FAD11846704700BFF9 -S31508004940CA7E8B7E43EA02230078032805D1487D78 -S31508004950097D41EA002243EA02431846704700BF30 -S315080049608176C1F30723C3764FEA114101754FEAF1 -S3150800497011224275704700BF03784FEAC31242EA14 -S3150800498053014378CA18D1B24FEAC11343EA510119 -S31508004990827852FA81F3D9B24FEAC11242EA510338 -S315080049A0C17851FA83F2D3B24FEAC31141EA5303ED -S315080049B0027952FA83F1CBB24FEAC31242EA5301A3 -S315080049C0437953FA81F2D1B24FEAC11343EA51014E -S315080049D0827952FA81F3D9B24FEAC11242EA5103F7 -S315080049E0C17951FA83F2D3B24FEAC31141EA5303AC -S315080049F0027A52FA83F1CBB24FEAC31242EA530162 -S31508004A00437A53FA81F2D1B24FEAC11343EA51010C -S31508004A10807A50FA81F2D0B2704700BF08B50246D4 -S31508004A2088B1036893B1197899B1D8889288904269 -S31508004A3012D15878FCF728FE00F00103002B14BFAA -S31508004A400320002008BD4FF0090008BD4FF00900FB -S31508004A5008BD4FF0090008BD4FF0090008BD00BFAA -S31508004A6010B504460A46407804F134014FF00103B4 -S31508004A70FCF724FE00283ED194F8332294F832320B -S31508004A8043EA022001B24AF65522CFF6FF72914256 -S31508004A9034D194F86D0094F86C304FEA034141EA3A -S31508004AA0006294F86A0042EA000394F86B1043EA3D -S31508004AB0012222F07F4044F24613C0F25403984282 -S31508004AC01FD094F8891094F888204FEA024040EAEB -S31508004AD0016194F8863041EA030294F8870042EAB5 -S31508004AE0002121F07F4244F24613C0F25403D01A43 -S31508004AF018BF012010BD4FF0030010BD4FF0020093 -S31508004B0010BD4FF0000010BD2DE9F04115460368B1 -S31508004B101C78A4F13004092C00F2E5815A783A2A67 -S31508004B2040F0E18103F1020303604FF000030B60DC -S31508004B30002C40F08C8141F60464C2F2000424681B -S31508004B40002C00F088810C60217889B16078FCF728 -S31508004B509BFD10F0010F0BD1002D00F0808100F0B5 -S31508004B600401C8B2002814BF0A200020BDE8F0815D -S31508004B704FF0000020706070FCF768FD10F0010F20 -S31508004B8040F071812DB100F00402D0B2002840F047 -S31508004B906E8120464FF00001FFF762FF012819D108 -S31508004BA094F8F631002B00F0668194F8FD5194F8DC -S31508004BB0FC114FEA014242EA056094F8FA3140EAEC -S31508004BC0030194F8FB5141EA052520462946FFF7DB -S31508004BD047FF01E04FF00005032800F05081002848 -S31508004BE040F0518194F8402094F83F0040EA0223AF -S31508004BF019B2B1F5007F40F04A8194F84B2094F839 -S31508004C004A0050EA02210FD194F85B1094F85A3002 -S31508004C104FEA034242EA016094F8581040EA010359 -S31508004C2094F8592043EA0221E16194F84420E2709D -S31508004C3002F1FF30C3B2012B00F22D8194F8413006 -S31508004C40A370002B00F02B8103F1FF30184240F0CF -S31508004C502A8194F8466094F8450040EA0626B0B2E0 -S31508004C60208116F00F0F40F0228194F8487094F8CE -S31508004C70476056EA07260ED194F8577094F856609E -S31508004C804FEA064646EA076794F854603E4394F8A6 -S31508004C90557046EA072694F843C094F8427057EAD6 -S31508004CA00C2700F0088102FB01FC07EB1012624496 -S31508004CB09642C0F00481B61AB6FBF3F3002B00F057 -S31508004CC0028140F6F576B3428CBF022601264FF6DE -S31508004CD0F578434500F20B8103F10203A3612562CF -S31508004CE0EF1967625219E262032E15D1002840F0C7 -S31508004CF0EE8094F8630094F862204FEA024242EA92 -S31508004D00006094F86020024394F8610042EA0022A9 -S31508004D10A2624FEA830011E0002800F0DC806744B5 -S31508004D20A762022E02D14FEA430007E04FF00300C4 -S31508004D3000FB03F203F0010303EB520000F2FF133A -S31508004D40B1EB532FC0F0CB804FF0FF3121614FF00C -S31508004D500000E060032E6CD1607194F8652094F829 -S31508004D60643043EA02216A186261607804F134010A -S31508004D704FF00103FCF7A2FC00285AD194F833023D -S31508004D8094F8322242EA002319B24AF65520CFF6A1 -S31508004D90FF7081424DD194F8372094F836304FEAA7 -S31508004DA0034141EA026094F8342040EA020394F889 -S31508004DB0351043EA012045F25222C4F261129042AC -S31508004DC037D194F81B1294F81A324FEA034040EA96 -S31508004DD0016294F8181242EA010394F8190243EAA8 -S31508004DE0002247F27221C6F241118A4221D194F873 -S31508004DF0230294F822324FEA034242EA006194F809 -S31508004E00200241EA000394F8212243EA0221E160E4 -S31508004E1094F81F0294F81E324FEA034242EA0061F0 -S31508004E2094F81C0241EA000394F81D2243EA022181 -S31508004E30216126703348038803F101039AB2028080 -S31508004E40E2804FF0000020632071BDE8F0814FF04A -S31508004E500B00BDE8F0814FF00C00BDE8F0814FF083 -S31508004E600000BDE8F0814FF00300BDE8F0814FF087 -S31508004E700A00BDE8F0814FF00D00BDE8F0814FF063 -S31508004E800100BDE8F0814FF00D00BDE8F0814FF05C -S31508004E900D00BDE8F0814FF00D00BDE8F0814FF040 -S31508004EA00D00BDE8F0814FF00D00BDE8F0814FF030 -S31508004EB00D00BDE8F0814FF00D00BDE8F0814FF020 -S31508004EC00D00BDE8F0814FF00D00BDE8F0814FF010 -S31508004ED00D00BDE8F0814FF00D00BDE8F0814FF000 -S31508004EE00D00BDE8F0814FF00000086023E603F1ED -S31508004EF00203A3612562EF1967625619E6624FF04D -S31508004F000306F3E6001E00202DE9F0410C4601F1E8 -S31508004F1009020369002B00F0E28043691E7B1978B9 -S31508004F20202900F08A80052914BF0A46E52206F0E2 -S31508004F30080505F0FF0135B1A2F14105EDB2192DBD -S31508004F409CBF2032D2B2627204F10A025D78202D2B -S31508004F5073D0052D08BFE52531B1A5F14102D2B2BE -S31508004F60192A9CBF2035EDB2A57204F10B029D7873 -S31508004F70202D62D0052D08BFE52531B1A5F14102E6 -S31508004F80D2B2192A9CBF2035EDB2E57204F10C02A3 -S31508004F90DD78202D51D0052D08BFE52531B1A5F1C5 -S31508004FA04102D2B2192A9CBF2035EDB2257304F10D -S31508004FB00D021D79202D40D0052D08BFE52531B1FC -S31508004FC0A5F14102D2B2192A9CBF2035EDB265730C -S31508004FD004F10E025D79202D2FD0052D08BFE52599 -S31508004FE031B1A5F14102D2B2192A9CBF2035EDB2E2 -S31508004FF0A57304F10F029D79202D1ED0052D08BF3B -S31508005000E52531B1A5F14102D2B2192A9CBF203556 -S31508005010EDB2E57304F11002DD79202D0DD0052DD2 -S3150800502008BFE52531B1A5F14101CAB2192A9CBFCD -S315080050302035EDB2257404F111021D7A202D36D0E3 -S3150800504015464FF02E0105F8011B197A20292DD097 -S3150800505006F0100606F0FF0536B1A1F14106F6B2D4 -S31508005060192E9CBF2031C9B2517002F10206597A35 -S3150800507020290DD035B1A1F14106F6B2192E9CBFF3 -S315080050802031C9B2917002F10306997A202901D11B -S3150800509032460CE035B1A1F14105EEB2192E9CBF9E -S315080050A02031C9B2D17002F1040200E02A46D97A49 -S315080050B02172DD7F9E7F4FEA064141EA05661D7F24 -S315080050C02E43597F46EA012626605D7E197E41EA0F -S315080050D00526A680D97D9B7D43EA0126E6804FF00A -S315080050E000011170A6698EB3E2697AB30569E5B164 -S315080050F0018C4FF6FF7399421AD0C7693888D0B128 -S315080051004FF00005A846414602F0B4F80146A8B19A -S31508005110E06900F1FF32AA4213D9715505F101057C -S3150800512037F8020F0028EED10DE04FF000050AE02F -S315080051304FF0000507E04FF0000504E04FF00005CA -S3150800514001E04FF000054FF000037355BDE8F0810C -S315080051502DE9F84304460379002B40D0076B00F18C -S315080051603405407829463A464FF00103FCF7E0FA41 -S31508005170002838D14FF000002071616A8F4236D37B -S31508005180E2698B189F4236D2E678012E37D94FF05E -S31508005190010806EA0809BF18607829463A464346D0 -S315080051A0FCF7C6FA06F1FF3646452CD113E0E2694C -S315080051B0BF18607829463A464346FCF7B9FAE369C8 -S315080051C0FF18607829463A464346FCF7B1FAA6F135 -S315080051D00206012EEBD14FF00000BDE8F8834FF030 -S315080051E00000BDE8F8834FF00100BDE8F8834FF0F2 -S315080051F00000BDE8F8834FF00000BDE8F8834FF0E3 -S315080052000000BDE8F883B9F1000FD0D0E1697F1836 -S31508005210607829463A464346FCF78AFA06F1FF368D -S31508005220012EC4D1D7E700BF38B504460D46036B37 -S315080052308B420DD0FFF78CFF68B9607804F1340112 -S315080052402A464FF00103FCF739FA38B9256338BD09 -S315080052504FF0000038BD4FF0010038BD4FF0010097 -S3150800526038BD00BF70B50446FFF772FF0346002835 -S315080052705FD12378032B53D16079002850D04FF0A3 -S315080052800005256304F13406304629464FF40072BA -S31508005290FFF72EFB4FF0550184F832124FF0AA02A1 -S315080052A084F833224FF0520384F8343084F83530CA -S315080052B04FF0610084F836004FF0410284F8372039 -S315080052C04FF0720184F8181284F8191284F81A2219 -S315080052D084F81B02236984F81C32C3F3072084F878 -S315080052E01D024FEA134284F81E224FEA136184F81E -S315080052F01F12E36884F82032C3F3072084F82102DA -S315080053004FEA134284F822224FEA136184F82312E3 -S315080053106078314662694FF00103FCF709FA657156 -S3150800532060784FF000010A46FCF740FA031C18BFE4 -S315080053300123184670BD00BFA1F102018369A3F1DC -S315080053400203994204D28278C06A02FB01007047C0 -S315080053504FF00000704700BFF8B505460C46012916 -S315080053606DD9836999426DD20078022832D0032814 -S3150800537045D0012869D101EB5106696A284601EB37 -S315080053805621FFF751FF002862D14FEAC6524FEA6D -S31508005390D257EB1993F8347006F10106696A284664 -S315080053A001EB5621FFF740FF002854D14FEAC656B5 -S315080053B04FEAD656AD1995F8340047EA002214F09C -S315080053C0010F02D04FEA1210F8BD4FEA02534FEA16 -S315080053D01350F8BD6A6A284602EB1121FFF724FF2D -S315080053E000283BD14FEA04644FEAD4502B1893F8AF -S315080053F034102C1894F8352041EA0220F8BD696A61 -S31508005400284601EBD411FFF70FFF002829D14FEAF0 -S3150800541044644FEAD4516B1893F8360093F8372052 -S315080054204FEA026444EA004293F8353042EA032020 -S315080054306C1894F83410084320F07040F8BD4FF00B -S315080054400100F8BD4FF00100F8BD4FF0FF30F8BD80 -S315080054504FF0FF30F8BD4FF0FF30F8BD4FF0FF308A -S31508005460F8BD4FF0FF30F8BD70B504460D46E18033 -S31508005470816801293CD003689A6991423BD279B97F -S315080054801878032801D1996A51B94FF00000E060F5 -S315080054901A89AA4232D99B6A03EB151121611CE0CD -S315080054A09E784FEA0616B54210D32068FFF754FFD8 -S315080054B00146B0F1FF3F24D0012825D923689A690F -S315080054C0904224D2AD1BADB2AE42EED9E16020685F -S315080054D0FFF732FF00EB1511216105F00F05206873 -S315080054E000EB451202F1340262614FF0000070BD14 -S315080054F04FF0020070BD4FF0020070BD4FF0020081 -S3150800550070BD4FF0010070BD4FF0020070BD4FF046 -S31508005510020070BDF8B505460C461646012940F24C -S315080055208C808369994280F08B800078022845D068 -S31508005530032858D001287AD101EB5107696A284611 -S3150800554001EB5721FFF770FE0346002871D14FEA99 -S31508005550C7524FEAD25314F0010409D0E91891F85A -S31508005560342002F00F00F1B240EA0112D0B200E096 -S31508005570F0B2EB1883F8340007F101074FF0010089 -S315080055802871696A284601EB5721FFF74DFE034645 -S3150800559000284ED14FEAC7574FEAD75014B1C6F381 -S315080055A0071607E02A1892F8341021F00F07C6F3F9 -S315080055B003263E432F1887F834603AE06B6A28467C -S315080055C003EB1121FFF730FE034690BB4FEA046454 -S315080055D04FEAD452A91881F834600C46C6F3072658 -S315080055E081F8356025E06B6A284603EBD111FFF791 -S315080055F01BFE0346E8B94FEA44644FEAD4502A181A -S3150800560092F837104FEA01612C1801F070400643F2 -S3150800561084F83460C6F3072182F835104FEA16403D -S3150800562082F836004FEA166682F8376001E04FF0D6 -S3150800563002034FF00100287104E04FF0020301E075 -S315080056404FF002031846F8BD2DE9F0410546884695 -S3150800565031B9C66876B183699E4228BF01260BE038 -S31508005660FFF77AFE0346012845D9AA6990424CD32A -S31508005670464601E04FF0010634464FF0020704F1B2 -S315080056800104A869844202D3012E37D93C4628462C -S315080056902146FFF761FE034638B1B0F1FF3F34D02B -S315080056A0012832D0B442EAD12BE0264628462146C4 -S315080056B06FF07042FFF72EFF0146B0B9B8F1000F40 -S315080056C006D0284641462246FFF724FF014660B920 -S315080056D0EE602A69B2F1FF3F16D002F1FF30286169 -S315080056E04FF00101697123460FE0012914BF012318 -S315080056F04FF0FF3309E04FF0010306E04FF00003D7 -S3150800570003E04FF0000300E023461846BDE8F081A9 -S315080057102DE9F84304460E46C58805F10105ADB2E4 -S31508005720002D70D00369002B71D015F00F075FD1DB -S3150800573003F101030361C16821B903681989A94204 -S3150800574069D955E00068827802F1FF3313EA151328 -S315080057504ED1FFF701FE8046012860D9B0F1FF3F20 -S3150800576061D02068816988453BD3002E5FD0E16807 -S31508005770FFF76AFF804600285DD001285FD0B0F1A8 -S31508005780FF3F60D02068FFF7E3FC00285FD1206860 -S3150800579000F134004FF000014FF40072FFF7A8F84B -S315080057A0266830464146FFF7C7FD30634FF00006CE -S315080057B04FF001090EE080F804902068FFF7C8FC56 -S315080057C0002848D12068026B02F10102026306F143 -S315080057D00106F6B220688278B242ECD8036B991BB0 -S315080057E00163C4F80C8020684146FFF7A5FD2061D7 -S315080057F0E580206800EB471202F1340262614FF03F -S315080058000000BDE8F8834FF00400BDE8F8834FF0C8 -S315080058100400BDE8F8834FF00400BDE8F8834FF0B4 -S315080058200200BDE8F8834FF00100BDE8F8834FF0A9 -S315080058300400BDE8F8834FF00700BDE8F8834FF091 -S315080058400200BDE8F8834FF00100BDE8F8834FF089 -S315080058500100BDE8F8834FF00100BDE8F88300BFFA -S315080058602DE9F04F83B004464FF00001FFF7FCFD29 -S315080058700746002840F02C824FF0FF0BD846DA4640 -S315080058804FF0000920682169FFF7CEFC074600287B -S3150800589040F01E8265692E78002E00F00B82EB7AA6 -S315080058A003F03F02E52E00F0E18103F00800C1B2E3 -S315080058B019B10F2A40F0DC8102E00F2A40F09881E6 -S315080058C0E769002F00F0ED8106F04003DAB232B145 -S315080058D095F80DB006F0BF06E188218404E0B045CE -S315080058E018BFD04640F0DD81687B0090584540F0EF -S315080058F0C1812B7823F0400202F1FF3101EB410010 -S3150800590001EB80030193AA78697841EA022001F045 -S31508005910EDFC80460198FE2800F2D68100F1010BC5 -S3150800592037F8100001F0E2FC804540F0CD812A7975 -S31508005930EB7843EA0220B8F1000F04D14FF6FF7165 -S31508005940884211D0C0E101F0D1FC8046BBF1FE0FC0 -S3150800595000F2BA8137F81B00019A02F1020B01F036 -S31508005960C5FC804540F0B081A8796B7943EA0020F0 -S31508005970B8F1000F04D14FF6FF71884210D0A3E1A9 -S3150800598001F0B4FC8046BBF1FE0F00F29D8137F8AA -S315080059901B000BF1010B01F0A9FC804540F0948136 -S315080059A02A7AE87940EA0220B8F1000F04D14FF6C6 -S315080059B0FF73984210D087E101F098FC8046BBF14E -S315080059C0FE0F00F2818137F81B000BF1010B01F085 -S315080059D08DFC804540F07881A97A6A7A42EA0120EE -S315080059E0B8F1000F04D14FF6FF73984210D06BE15F -S315080059F001F07CFC8046BBF1FE0F00F2658137F8AA -S31508005A001B000BF1010B01F071FC804540F05C8135 -S31508005A10E87BA97B41EA0020B8F1000F04D14FF6D4 -S31508005A20FF72904210D04FE101F060FC8046BBF156 -S31508005A30FE0F00F2498137F81B000BF1010B01F04C -S31508005A4055FC804540F04081687C2B7C43EA002069 -S31508005A50B8F1000F04D14FF6FF71884210D033E138 -S31508005A6001F044FC8046BBF1FE0F00F22D8137F8A9 -S31508005A701B000BF1010B01F039FC804540F0248135 -S31508005A80EA7CA87C40EA0220B8F1000F04D14FF660 -S31508005A90FF73984210D017E101F028FC8046BBF14D -S31508005AA0FE0F00F2118137F81B000BF1010B01F014 -S31508005AB01DFC804540F00881697D2A7D42EA012067 -S31508005AC0B8F1000F04D14FF6FF73984210D0FBE0EF -S31508005AD001F00CFC8046BBF1FE0F00F2F58037F8AA -S31508005AE01B000BF1010B01F001FC804540F0EC8036 -S31508005AF0E87DA97D41EA0020B8F1000F04D14FF6F0 -S31508005B00FF72904210D0DFE001F0F0FB8046BBF157 -S31508005B10FE0F00F2D98037F81B000BF1010B01F0DC -S31508005B20E5FB804540F0D080687E2B7E43EA002066 -S31508005B30B8F1000F04D14FF6FF71884210D0C3E0C8 -S31508005B4001F0D4FB8046BBF1FE0F00F2BD8037F8AA -S31508005B501B000BF1010B01F0C9FB804540F0B48036 -S31508005B606A7F287F40EA0220B8F1000F04D14FF679 -S31508005B70FF73984210D0A7E001F0B8FB8046BBF14E -S31508005B80FE0F00F2A18037F81B000BF1010B01F0A4 -S31508005B90ADFB804540F09880E97FAA7F42EA012064 -S31508005BA0B8F1000F10D001F0A1FB8046BBF1FE0F43 -S31508005BB000F28A800BF10100019037F81B0001F012 -S31508005BC095FB804505D07FE04FF6FF77B84274D045 -S31508005BD07AE02B7803F04001CAB2002A6DD0B8F1FA -S31508005BE0000F6AD0019837F81070002F65D06BE067 -S31508005BF0B8F1000F04D12846FEF7BEFE584567D017 -S31508005C004FF0FF332384A069C27A12F0010F33D113 -S31508005C1029780378994231D16978427891422FD10F -S31508005C20AB7881788B422DD1EB78C27893422BD111 -S31508005C3029790379994229D169794279914227D1FB -S31508005C40AB7981798B4225D1EB79C279934223D1FD -S31508005C50297A037A994221D1697A427A91421FD1E7 -S31508005C60A97A807A814233D0D0461AE0D04618E025 -S31508005C70D04616E0D04614E0D04612E0D04610E0F2 -S31508005C80D0460EE0D0460CE0D0460AE0D04608E002 -S31508005C90D04606E0D04604E0D04602E0D04600E012 -S31508005CA0D04620464946FFF733FD074600283FF40D -S31508005CB0E9AD0DE04FF004070AE006F1FF365FFA9A -S31508005CC086F8DDF800B0ECE7DDF800B0D046E8E786 -S31508005CD0384603B0BDE8F08F2DE9F04F87B0019044 -S31508005CE08B460B782F2B01D05C2B01D10BF1010BC6 -S31508005CF04FF00000019988609BF800201F2A0AD8F7 -S31508005D0008464FF00001FFF7AFFB02464FF00003CD -S31508005D1001994B6198E149F26C44C0F6000403947A -S31508005D2049F27846C0F60006049649F28043C0F662 -S31508005D30000305935E461BF8010B2F28FAD05C2852 -S31508005D40F8D00199CA69029230781F2840F2568124 -S31508005D502F2800F045815C2800F047811746A7F1F7 -S31508005D60020735464FF00104A34613E02F2B00F037 -S31508005D7040815C2B00F03D81B2F5807F00F05981AF -S31508005D8092461446594601F075FA8046002840F0B6 -S31508005D908D814EE1594601F06DFA8046002800F0E3 -S31508005DA048817F2806D803984146FEF7BDFD00289E -S31508005DB040F03F8107F10209A7F8028015F8013F74 -S31508005DC0184604F101021F2BD0D81BE1002C00F065 -S31508005DD0308104F1FF3000F00101029B03EB44021D -S31508005DE032F8020D202840F0478148E132F8023D9A -S31508005DF0202B01D02E2B08D104F1FF30041E32F8D7 -S31508005E00021D202940F04B814CE12746002C00F06A -S31508005E101081029A02EB44084FF0000522F814504C -S31508005E20019B98694FF020014FF00B02FEF760FDC9 -S31508005E30029AA2F1020201E005F1010532F8020F09 -S31508005E402028F9D02E28F7D0002D00F0E08046F063 -S31508005E500306DCE004F1FF30044628B94FF00809D0 -S31508005E604FF00008C24607E0A8F1020737F8021CFF -S31508005E702E2940F0F780F1E7029B33F8157005F1FB -S31508005E800105002F5AD0202F04D02E2F05D1AC4261 -S31508005E9000F0D28046F00306EEE7C84502D2AC42CF -S31508005EA017D1C1E0B9F10B0F03D146F003065046EE -S31508005EB047E0AC4203D046F00306A54240D84FEA75 -S31508005EC08A0A5FFA8AFA25464FF00B094FF0080846 -S31508005ED0D2E77F2F0FD938464FF0000101F0CAF9F3 -S31508005EE00746002800F0AD800598C11911F8807C96 -S31508005EF046F0020627B104983946FEF715FD20B18B -S31508005F0046F003064FF05F0711E0A7F1410293B28E -S31508005F10192B02D84AF0020A09E0A7F1610081B2FA -S31508005F20192904D84AF0010AA7F12007BFB2019A35 -S31508005F30936903F8087008F101089DE7504600E0E8 -S31508005F40504601998B691A78E52A04BF05221A700A -S31508005F50B9F1080F04BF80005FFA80FA0AF00C0056 -S31508005F600C2803D00AF00301032901D146F00206E2 -S31508005F7006F00203DAB252B90AF0030ABAF1010FBF -S31508005F8008BF46F01006042808BF46F00806019820 -S31508005F908169CE72FFF764FC019B9A69D37A02463F -S31508005FA040B1042850D103F00403D8B2002808BF32 -S31508005FB0052249E003F00400C1B2002944D1019A40 -S31508005FC05169CB7A03F01000C2B232B1019C206845 -S31508005FD0FEF7B6FC019EB060ACE64FF0050233E072 -S31508005FE04FF000044FF0010203E04FF000044FF0B9 -S31508005FF0010206EB020B4FF00006E7E64FF000043D -S315080060004FF0010206EB020B4FF00406DEE607F13D -S31508006010FF37029931F817202E2A3FF41FAF14F0E4 -S31508006020010F7FF417AF13E0B9F10B0F7FF447AFF9 -S315080060303BE74FF0060207E0B9F10B0F7FF43FAFDD -S3150800604033E746F002065BE7104607B0BDE8F08F77 -S3150800605004F1FF34A8F1020838F8023C2E2B7FF42D -S31508006060F9AEFBE600F1FF34A7F1020838F8022C76 -S315080060702E2A7FF4EFAEF1E62E287FF4C6AE013C59 -S31508006080D7D000293FF4B2AE32F8021D202902D03B -S315080060902E297FF4BAAE013C7FF4A8AEC9E72E29B3 -S315080060A07FF4B3AE441E7FF4A1AEC2E77F2805D8BD -S315080060B003984146FEF738FC0028BAD109F10207D1 -S315080060C0A9F8028015F8011F084604F101021F29E4 -S315080060D098D92F298DD05C298BD00AF1010459E66D -S315080060E02DE9F0410446C588018C4FF6FF739942A5 -S315080060F008BF2946FFF7B8F90346E0B94FF0E507A8 -S315080061004FF001064FF0000820682169FFF78CF868 -S31508006110034668B96269177020680671E188A94262 -S3150800612009D220464146FFF7F3FA03460028EBD08A -S31508006130042B08BF02231846BDE8F0812DE9F84F65 -S31508006140044689464FF0FF0A56464FF00405D046E6 -S315080061504FF000074FF6FF7B3AE12068FFF764F837 -S315080061600546002840F0398160690378002B00F065 -S315080061704081C27AE52B00F01E812E2B00F01D818E -S3150800618002F03F02082A14BF00210121494540F0C8 -S3150800619016810F2A40F0068103F04001CDB235B1D1 -S315080061A090F80DA003F0BF03E688268404E09E421B -S315080061B018BF464640F00681417B514540F00181B3 -S315080061C0E669027802F03F0505F1FF3202EB420E5E -S315080061D002EB8E0E8578427842EA0525BEF1FE0F5F -S315080061E000F2048126F81E500EF1010290F804A070 -S315080061F090F803C04CEA0A2A15B9DA4508D0F5E042 -S31508006200FE2A00F2F38026F812A00EF10202554685 -S3150800621090F806C090F805E04EEA0C2A15B9DA455A -S3150800622008D0E3E0FE2A00F2E18026F812A002F187 -S315080062300102554690F808C090F807E04EEA0C2A85 -S3150800624015B9DA4508D0D1E0FE2A00F2CF8026F843 -S3150800625012A002F10102554690F80AC090F809E02A -S315080062604EEA0C2A15B9DA4508D0BFE0FE2A00F234 -S31508006270BD8026F812A002F10102554690F80FC01B -S3150800628090F80EE04EEA0C2A15B9DA4508D0ADE0CA -S31508006290FE2A00F2AB8026F812A002F1010255464A -S315080062A090F811C090F810E04EEA0C2A15B9DA45B4 -S315080062B008D09BE0FE2A00F2998026F812A002F187 -S315080062C00102554690F813C090F812E04EEA0C2ADF -S315080062D015B9DA4508D089E0FE2A00F2878026F843 -S315080062E012A002F10102554690F815C090F814E084 -S315080062F04EEA0C2A15B9DA4507D077E0FE2A75D892 -S3150800630026F812A002F10102554690F817C090F837 -S3150800631016E04EEA0C2A15B9DA4507D066E0FE2AD9 -S3150800632064D826F812A002F10102554690F819C061 -S3150800633090F818E04EEA0C2A15B9DA4507D055E068 -S31508006340FE2A53D826F812A002F10102554690F803 -S315080063501DC090F81CE04EEA0C2A15B9DA4507D09C -S3150800636044E0FE2A42D826F812A002F10102554658 -S3150800637090F81FC090F81EE04EEA0C2A35B1FE2AA6 -S3150800638034D826F812A002F1010201E0DA452DD12F -S31508006390007800F04005E8B218B3FE2A26D826F899 -S315080063A012701EE01EB9FEF7E7FA504524D04FF6E4 -S315080063B0FF70208420E0464604E0464602E0464652 -S315080063C000E0464620463946FFF7A2F9054620B9B9 -S315080063D0216900297FF4C1AE75B14FF00001216132 -S315080063E00AE003F1FF33DEB28A46EBE78A46464601 -S315080063F0E8E74FF00405F0E72846BDE8F88F00BF48 -S315080064002DE9F04104460E46012926D983699942A9 -S3150800641026D24FF000074FF0010820463146FEF716 -S315080064209BFF0546F8B1012820D0B0F1FF3F20D0E8 -S31508006430204631463A46FFF76DF80146D8B9206935 -S31508006440B0F1FF3F04D000F10100206184F8058017 -S315080064502E46A269AA42E0D80DE04FF002010AE0F2 -S315080064604FF0020107E04FF0000104E04FF002018F -S3150800647001E04FF001010846BDE8F08170B582B031 -S31508006480054616461C464FF00B02FEF707FA052C82 -S315080064900DD9A6F102024FEA540343EAC43432F88E -S315080064A0020F10FA84F18CB25688002EF3D14FF001 -S315080064B0070204F00F0000F13003392B88BF00F102 -S315080064C037030DF8023002F1FF322409F1D11646DE -S315080064D002A988184FF07E0300F8083C92B12C7880 -S315080064E0202C12D029464FF0000312F0010F56D087 -S315080064F003F101000346B04209D011F8014F202CE0 -S3150800650054D104E04FF0000301E04FF000034FF0D0 -S315080065102000C3F1070101F00104072A19D811E088 -S31508006520072A06D802ACA11811F8081C02F10102C4 -S3150800653000E00146E95403F10103072A28D820E0C0 -S3150800654002B070BD02AEB11811F8081C02F10102C2 -S3150800655000E00146E95403F10103072BF0D8002CAB -S31508006560DED0072A06D802ACA11811F8081C02F1D9 -S31508006570010200E00146E95403F10103072BCFD9D4 -S31508006580DEE702AEB11811F8081C02F1010200E0BC -S315080065900146E95403F10103072BC1D9D0E703F1FA -S315080065A0010311F8010F2028A2D1B0E700F1010379 -S315080065B011F8010F20289BD1A9E700BF2DE9F04F5C -S315080065C087B004468769C66903A839464FF00C02A6 -S315080065D0FEF764F99DF8173013F0010F2FD04FF02E -S315080065E00000F872E0614FF00105384603A932460B -S315080065F02B46FFF743FF2046FFF732F9814698B945 -S3150800660005F10105ADB2384603A932462B46FFF718 -S3150800661035FF2046FFF724F98146002800F003815C -S3150800662002E04FF00709FAE0642D00F0DB80B9F1CB -S31508006630040F40F0F4809DF81710F972E6619DF892 -S31508006640172002F00207FBB2DBB1308848B14FF0E1 -S31508006650000303F101039BB236F813100029F8D1A1 -S3150800666001E04FF0000303F119034EF64F42C4F65A -S31508006670C46282FB03174FEAE370C0EBA7039FB21D -S3150800668001E04FF0010720464FF00001FEF7ECFE4F -S315080066908146002840F0C3804FF00005A8464FF019 -S315080066A0010620682169FEF7BFFD8146002840F0F3 -S315080066B0B68061690A78E52A00D022B905F1010594 -S315080066C0AF4201D191E0454620463146FFF720F812 -S315080066D081460028E5D0A2E0E088C31B204699B28F -S315080066E0FEF7C2FE8146002840F09980A069FEF7B1 -S315080066F043F901904FF000084FF6FF7549F200562E -S31508006700C0F6000620682169FEF78EFD814600283E -S3150800671040F08580D4F81C9061695FFA87FB019A7E -S315080067204A734FF00F00C87281F80C8081F81A80FE -S3150800673081F81B800BF1FF3303EB430203EB820066 -S315080067404FF0010243464FF0FF0A02E02B4602F1E2 -S315080067500102AB424ED039F8103000F1010006EBC9 -S31508006760020C1CF801EC01F80E308E444FEA132C8B -S315080067708EF801C0002B48D00C2AE8D9AB4202D0CB -S3150800678039F8100018B947F0400B5FFA8BFB81F80F -S3150800679000B022684FF00101117120464146FEF70C -S315080067A0B7FF814600283AD107F1FF37BFB2002F5D -S315080067B0A8D12DE060694FF000014FF02002FEF7E6 -S315080067C097F86069A1694FF00B02FEF767F86369ED -S315080067D0A069C27A02F01801197323684FF0010004 -S315080067E018711CE04FF0070919E007F1FF37BFB22F -S315080067F077B171E706EB020E1EF801CC01F80CA082 -S3150800680001EB0C0E8EF801A0B6E70C2A9ED9BAE762 -S3150800681020682169FEF708FD81460028CAD0484647 -S3150800682007B0BDE8F08F05F10105ADB2384603A9FA -S3150800683032462B46FFF722FE2046FFF711F881461F -S3150800684000287FF4F1AE05F10105ADB2642D7FF4A1 -S31508006850CCAEE6E6A0B941F60463C2F200031868B6 -S3150800686010B14FF00002027011B14FF000030B7027 -S3150800687041F60460C2F2000001604FF00000704764 -S315080068804FF00B00704700BF2DE9F0438FB0019120 -S3150800689016460546002800F0A5804FF00003036061 -S315080068A001A805A902F01E02FEF72EF904460028E3 -S315080068B040F0B78006F01F0802A80B9041F6004189 -S315080068C0C2F200010C9105A80199FFF705FA0A9F83 -S315080068D00146002840F08F80002F40F0868088E02F -S315080068E059B1042940F0928005A8FFF767FE48F0E1 -S315080068F008080A9F50B1044693E0FB7A13F0110F7B -S315080069007ED106F00402D6B2002E7CD108F008002B -S31508006910C6B2002E41D0FAF783FFB873C0F3072337 -S31508006920FB734FEA10423A744FEA106179744FF0DC -S315080069300006FE723E777E77BE77FE770598394663 -S31508006940FDF7FEFF814638463146FEF709F80598F9 -S315080069504FF001030371B9F1000F1ED0066B4946CB -S31508006960FFF74EFD002853D1059809F1FF31C160A4 -S315080069703146FEF759FC01460DE0FB7A03F010029A -S31508006980D0B2002846D106F00206F6B22EB113F0B0 -S31508006990010F42D101E0002942D108F00800C6B231 -S315080069A00EB148F02008059E336BEB612F6285F81F -S315080069B0068030463946FDF7C3FF2861FA7FB97F5E -S315080069C04FEA014040EA02633A7F1343797F43EA7C -S315080069D00120E8604FF00003AB60AB612E60F288DF -S315080069E0AA801EE04FF009041BE016F01C0F84D1A4 -S315080069F0C3E74FF0060116F01C0F7FF471AFCAE724 -S31508006A004FF007040DE04FF008040AE00C4608E0D2 -S31508006A10044606E04FF0040403E04FF0070400E0E4 -S31508006A200C4620460FB0BDE8F08300BF2DE9F04FB5 -S31508006A3083B00446884691461E464FF000033360ED -S31508006A40FDF7ECFF0746002840F0D080A07910F04B -S31508006A50800F40F0C68010F0010F00F0C580E56891 -S31508006A60A1686D1AA94538BF4D46002D00F0BE80B5 -S31508006A7004F1240200920197A7684FEAC7534FEA28 -S31508006A80D350002840F08D80206890F802A00AF1C3 -S31508006A90FF3101EA572212F0FF0A19D10FB920690E -S31508006AA002E06169FEF758FC012806D8A77967F065 -S31508006AB07F00A0714FF0020798E0B0F1FF3F06D1C2 -S31508006AC0A37963F07F02A2714FF001078EE060613F -S31508006AD0276838466169FEF72FFC814630B9A079E8 -S31508006AE060F07F01A1714FF002077FE000EB0A0911 -S31508006AF05FEA552B29D0BB780BEB0A029A4288BF6E -S31508006B00CAEB030B787841464A465FFA8BF3FAF7E5 -S31508006B10D5FD30B1A27962F07F07A7714FF0010762 -S31508006B2064E0A77907F04000C1B259B1A369C9EB7F -S31508006B300302934506D908EB422000994FF40072E8 -S31508006B40FDF7ACFE4FEA4B2B3CE0A2694A4526D03E -S31508006B50A37903F04000C1B289B1787800994FF063 -S31508006B600103FAF7E5FD30B1A07960F07F01A17164 -S31508006B704FF001073AE0A27922F04007A77123688F -S31508006B80587800994A464FF00103FAF797FD30B155 -S31508006B90A77967F07F03A3714FF0010726E0C4F8D1 -S31508006BA01890A0684FEAC0514FEAD152C2F5007B4F -S31508006BB05D4538BFAB46A118404601F124015A4647 -S31508006BC0FDF76CFED844A76807EB0B00A060316898 -S31508006BD001EB0B033360B5EB0B057FF44DAF019F5B -S31508006BE004E04FF0020701E04FF00707384603B00C -S31508006BF0BDE8F08F2DE9F04F83B004468846154668 -S31508006C001E464FF000033360FDF708FF07460028CD -S31508006C1040F0EE80A07910F0800F40F0E48000F09C -S31508006C200201CAB2002A00F0E180E368DD4280F082 -S31508006C30D080002D00F0CD8004F12400009001974B -S31508006C40A7684FEAC7514FEAD152002A40F09C8004 -S31508006C50206890F802B00BF1FF3303EA572111F0D0 -S31508006C60FF0B24D147B927696FB94FF00001FEF72A -S31508006C70EBFC0746206103E06169FEF7E5FC074681 -S31508006C80002F00F0A580012F06D1A77967F07F00B5 -S31508006C90A0714FF00207ABE0B7F1FF3F06D1A2792A -S31508006CA062F07F03A3714FF00107A1E06761A07945 -S31508006CB000F04002D3B29BB1216848780099A269D6 -S31508006CC04FF00103FAF734FD30B1A07960F07F0187 -S31508006CD0A1714FF001078BE0A77927F04000A0715A -S31508006CE0276838466169FEF727FB814630B9A379DC -S31508006CF063F07F07A7714FF0020779E000EB0B09F5 -S31508006D005FEA552A28D0B9780AEB0B028A4288BF6F -S31508006D10CBEB010A787841464A465FFA8AF3FAF7D6 -S31508006D2007FD30B1A17961F07F02A2714FF001072A -S31508006D305EE0A369C9EB0307BA450AD9009808EBD0 -S31508006D4047214FF40072FDF7A9FDA07920F0400114 -S31508006D50A1714FEA4A2A2CE0A2694A4512D0A168D5 -S31508006D60E36899420ED2787800994A464FF00103B3 -S31508006D70FAF7A4FC30B1A07960F07F07A7714FF04D -S31508006D80010735E0C4F81890A0684FEAC0574FEAE3 -S31508006D90D752C2F5007A554538BFAA46A01800F161 -S31508006DA0240041465246FDF779FDA17941F040039A -S31508006DB0A371D044A26802EB0A03A360376807EB05 -S31508006DC00A003060B5EB0A057FF43AAF019F00E090 -S31508006DD0019FA168E268914288BFE160A37943F008 -S31508006DE02000A07104E04FF0020701E04FF007070A -S31508006DF0384603B0BDE8F08F38B50446FDF70EFEF9 -S31508006E000346002850D1A27902F02001C8B2002812 -S31508006E104AD002F04003DAB272B1214651F8240B87 -S31508006E204078A2694FF00103FAF782FC002839D1AD -S31508006E30A17921F04003A3712068E169FEF7F4F90E -S31508006E40034688BB256AEA7A42F02000E872E168C0 -S31508006E502977A3894FEA13226A77E089A877E17B25 -S31508006E60E97728462169FDF77BFDFAF7D9FCA8756D -S31508006E70C0F30723EB754FEA10422A764FEA1060F3 -S31508006E8068764FF00001A974E974A37923F020020B -S31508006E90A27120684FF0010101712068FEF7E2F93E -S31508006EA0034601E04FF00103184638BD10B5044605 -S31508006EB0FFF7A2FF034610B94FF0000222601846FA -S31508006EC010BD00BFF8B504460D46FDF7A7FD0746F9 -S31508006ED0002840F0D380A37913F0800F40F0CC80CF -S31508006EE0E268AA4205D203F00200C1B2002908BF2F -S31508006EF01546A2684FF00003A360002D00F0BE807F -S31508006F00206886784FEA462682B102F1FF3205F1FB -S31508006F10FF31B1FBF6F1B2FBF6F3994206D3C6F19F -S31508006F2000031A40A260AD1A616919E02169B1B976 -S31508006F30FEF78AFB0146012806D1A27962F07F0195 -S31508006F40A1714FF0020799E0B0F1FF3F06D1A7798A -S31508006F5067F07F00A0714FF001078FE02061616143 -S31508006F60002946D0B5422ED9A07900F00202D3B244 -S31508006F702BB12068FEF768FB014620B922E020689D -S31508006F80FEF7EAF90146B1F1FF3F06D1A27962F0B0 -S31508006F907F03A3714FF0010770E0012903D9206828 -S31508006FA08269914206D3A77967F07F01A1714FF0F4 -S31508006FB0020763E06161A3689819A060AD1BAE4241 -S31508006FC0D2D300E03546A0684219A2604FEAC553FD -S31508006FD04FEAD35080B12068FEF7AEF930B9A079F0 -S31508006FE060F07F07A7714FF0020747E000EB5525D1 -S31508006FF004E04FF0000501E04FF00005A2684FEAF3 -S31508007000C2534FEAD35068B3A269AA422AD0A179DB -S3150800701001F04003D8B298B1214651F8243B58787C -S315080070204FF00103FAF784FB30B1A27962F07F01D1 -S31508007030A1714FF0010721E0A27922F04001A17168 -S31508007040214651F8240B40782A464FF00103FAF7F7 -S3150800705035FB30B1A77967F07F03A3714FF00107BD -S315080070600CE0A561A368E268934207D9E360A179B9 -S3150800707041F02000A07101E04FF002073846F8BD44 -S3150800708030B58FB00EAB43F8340D0D46184605A93A -S315080070904FF00002FDF738FD0446A8B902A80B9088 -S315080070A041F60041C2F200010C9105A80199FEF7CC -S315080070B013FE044640B90A9A22B105A82946FDF7E7 -S315080070C023FF01E04FF0060420460FB030BD00BF95 -S315080070D030B599B018AB43F85C0D18460FA94FF0B8 -S315080070E00102FDF711FD0246002857D103A81590A5 -S315080070F041F60041C2F2000116910FA80199FEF768 -S31508007100EBFD0246002849D1149959B3CC7A14F0FC -S31508007110010F2AD12CE0012D34D906A80FA94FF06A -S315080071202402FDF7BBFB089506A84FF00201FEF7FF -S315080071309BF90246002831D106A84FF00001FEF758 -S31508007140FDFF024640B304281FD027E02DB10F9853 -S315080071502946FFF755F9024600BB0F98FEF782F855 -S3150800716002461BE04FF0060218E04FF0070215E052 -S315080071700F98FDF7E5FB054604F01004E4B2002C71 -S31508007180C9D102E04FF0020208E00FA8FEF7A8FFF7 -S3150800719002460028DAD001E04FF00702104619B07F -S315080071A030BD00BF2DE9F04782B0824691460446BD -S315080071B04FF0000501F1FF374FF0010814E048468B -S315080071C001A942466B46FFF731FC009B012B0ED105 -S315080071D09DF804000D2808D0307004F101042646F5 -S315080071E005F101050A2802D02646AF42E7DC4FF032 -S315080071F0000131708D4214BF5046084602B0BDE802 -S31508007200F08700BF30B583B004460D460A2803D17F -S315080072104FF00D00FFF7F6FF02A901F8084D2846C2 -S3150800722069464FF0010201ABFFF7E4FC019801281B -S3150800723014BF4FF0FF30012003B030BD70B50546CE -S315080072400E46007870B14FF000043146FFF7DAFFBA -S31508007250B0F1FF3F09D004F1010415F8010F002829 -S31508007260F3D104E04FF0000401E04FF0FF3420466C -S3150800727070BD00BF7F282DD911B9C7280BD121E0D1 -S31508007280FF2825D8A0F1800049F2F062C0F6000276 -S3150800729032F8100070474FF0010349F2F062C0F669 -S315080072A0000232F8021F814215D10DE032F8021FA2 -S315080072B0814209D003F101039BB232F8021F8142D1 -S315080072C00DD101E04FF0000303F18000C0B2704712 -S315080072D04FF00000704703F101039BB2E6E703F1A4 -S315080072E001039BB2802BE1D1EEE700BF61280ED0E7 -S315080072F049F21051C0F600014FF0000202F10102F6 -S3150800730031F8023F5BB18342F8D113B970474FF0A9 -S31508007310000249F2F070C0F6000030F8120070471B -S3150800732070B402F1FF328C18A1422ED20B466FEAD6 -S3150800733001056619C6F340060D784A7802EB052260 -S3150800734092B2801880B282422FD92BE01D785A78E3 -S3150800735002EB0525AAB2801880B2824284BF0130AA -S3150800736080B203F102029D78537803EB05239BB2A2 -S31508007370C01880B2834231D92DE06FEA0102A31802 -S3150800738023F0010202F102028918A14208D1097804 -S315080073904FEA0123181880B2834284BF013080B2B5 -S315080073A070BC704700F1010080B203F102039C42F1 -S315080073B0E3D9002ECAD01D785A7802EB052292B27C -S315080073C0801880B2824284BF013080B203F1020382 -S315080073D09C42BBD8D1E700F1010080B202F102035A -S315080073E09C42B3D8C9E700BF70B4C4780A19D4B2AE -S315080073F042F2D843C2F20003DC704FEA11258678C0 -S31508007400AA19D2B29A7046785E70007818709542BA -S315080074100FD906F10106F6B242F2D843C2F20003CA -S315080074205E7036B900F1010042F2D843C2F2000399 -S315080074301870C9B28C4212DA02F10102D2B242F2D3 -S31508007440D840C2F2000082704AB9437803F10103BA -S31508007450DAB242701AB9017801F10101017070BC03 -S31508007460704700BF10B50146084C206800F10800B7 -S31508007470FFF7BAFF2368064A1178197250785872CE -S3150800748091789972D278DA7210BD00BF081E002072 -S31508007490D82400204FF0000342F2EC41C2F200016A -S315080074A00B8041F60C60C2F20000437642F2E843D4 -S315080074B0C2F200034FF001021A7042F2DC41C2F236 -S315080074C000014FF480600880704700BF42F2E8432D -S315080074D0C2F200034FF000021A7042F2EC41C2F207 -S315080074E000010B882BB942F2EC41C2F20001088078 -S315080074F0704742F2E840C2F200004FF00102027003 -S31508007500704700BF4FEA102343EA002080B2704755 -S3150800751038B541F68464C2F20004657CA5F1140509 -S31508007520237C05EB03218DB2401980B204F11A01C0 -S315080075304FF00802FFF7F4FE04F122012A46FFF78E -S31508007540EFFE10B1FFF7DEFF38BD4FF6FF7038BD0E -S3150800755008B54FF00600FFF7DBFF08BD08B54FF08A -S31508007560000006494FF01402FFF7DAFE10B1FFF7E4 -S31508007570C9FF08BD4FF6FF7008BD00BF921E002068 -S3150800758038B541F60863C2F200031C68A84942F2FE -S31508007590C842C2F20002116042F2F043C2F200038E -S315080075A01960032814D1637E03F00F00032840F006 -S315080075B05986228A002A40F0558642F2D441C2F200 -S315080075C000014FF008030B7001F0FCFB00F08FBCC4 -S315080075D0022840F0AC8042F2CC42C2F20002D378D4 -S315080075E003F10103D8B2D070C0B942F2CC41C2F25D -S315080075F000018A7802F10102D3B28B7073B942F2A4 -S31508007600CC40C2F20000417801F10101CAB24270D1 -S3150800761022B90346007800F1010018704FF0000106 -S3150800762041F67862C2F20002118041F68063C2F226 -S3150800763000031980607E072801D005280CD1A07E9A -S3150800764000F10100C2B2A276782A40F00B864FF00C -S315080076500001617600F006BE002800F00386218A44 -S31508007660002955D0A27E02F1FF31A176002A40F00A -S31508007670F985E37E082B06D000F1FF32D1B2012945 -S3150800768017D8052B15D14FF00000607642F2D44585 -S31508007690C2F200054FF080022A7001F093FB41F612 -S315080076A08461C2F200014FF0140381F82F3000F014 -S315080076B042BD042B9DBF03219940C9B23021A17652 -S315080076C003F10103E37600F00F0000F1FF33072B07 -S315080076D000F2C885DFE813F0DC0108001100BD03DD -S315080076E0C605BD03C605BD0341F68463C2F20003A1 -S315080076F04FF0000583F82F50D2E142F2D441C2F28E -S3150800770000014FF00400087001F05CFB00F047BC74 -S3150800771000F00F02032A40F0A58542F2D443C2F2D4 -S3150800772000034FF00800187001F04CFBDFE341F648 -S315080077308460C2F20000817B452940F0938541F6BA -S315080077408463C2F200031A7C587C00EB022341F6DC -S315080077507861C2F200010A88934200F383859CB2DD -S3150800776041F67860C2F20000048041F68463C2F2F2 -S315080077700003197D11F03F0F40F0748541F68462CD -S31508007780C2F20002507D002840F06C8542F2D045D6 -S31508007790C2F200052D882DB942F2D043C2F2000389 -S315080077A05988A1B141F68462C2F20002D08BA84280 -S315080077B040F0588541F68463C2F20003198C42F200 -S315080077C0D042C2F200025088814240F04B85FFF752 -S315080077D0C5FE4FF6FF73984240F0448541F6846132 -S315080077E0C2F20001CA7D062A28D0012A40F03A854D -S315080077F0104890F82230082B40F034850D494FF098 -S31508007800000281F82220888C4FF6F67398428CBFC6 -S3150800781009300830074988840648428BC283838B1F -S315080078200384458304494A88828300F013BD00BF58 -S31508007830BA1E0020841E0020D0240020FFF788FEF0 -S315080078404FF6FF73984240F00D85B548417EC1B1A9 -S31508007850B44A908CB24B9A88904212D1B148428C65 -S31508007860AF4BD88882420CD1AE4A508BAC4B1A88A3 -S31508007870904206D1AB48828BA94B5888824200F0C9 -S315080078803581A84991F82F2002F03F03022B0FD12A -S31508007890A448828CA4490A80A44B4FF000001870B3 -S315080078A0A3490B88934262D0A0484FF001020270A8 -S315080078B09C4991F82F0000F00403DAB2002A40F040 -S315080078C0D184984B4FF0140483F82F40994D4FF00C -S315080078D0280129804FF0500083F82E0093F829409C -S315080078E093F82D2083F8292093F8280093F82C5034 -S315080078F083F8285083F82C0093F8271093F82B2048 -S3150800790083F8272083F82B1093F82620874D2A70B2 -S3150800791093F82A5083F8265083F82A2004F10104A4 -S31508007920E4B283F82D4084B900F10103DDB27D4845 -S3150800793080F82C504DB901F10101CCB280F82B40EA -S315080079401CB902F1010280F82A207648428C764951 -S315080079500A80848C44848284438BC383858B058404 -S31508007960754A118841835488848300F03EBC6C496B -S315080079704B7E23B1072B40F0888400F080BC684B0F -S315080079806E490B604FF00300987618764FF00004A6 -S315080079909C754FF00405DD75DC769A80614C628C27 -S315080079A0DA80618B1980A08B58804FF001005876D9 -S315080079B0634D2A781A7369785973AA789A73ED7899 -S315080079C0DD73188294F82910D97294F828209A72CF -S315080079D094F827505D7294F826101972FFF742FD45 -S315080079E094F82E3003F0F004502C50DD4FEA1310B3 -S315080079F0A0F105024FEA8204524D2A784FF000039F -S31508007A0048483BE0C21892F836202AB947490B7015 -S31508007A104C4C2270424C3BE0012A03D103F101038E -S31508007A20DBB22BE0022A1DD1451895F83750042DF4 -S31508007A3018D13E4A1370434D4FF002032B70394854 -S31508007A40411891F8384091F8392042EA0425364B16 -S31508007A501D8040F20A60854228BF0546304C658283 -S31508007A60A58215E0411891F837502DB92F480370B3 -S31508007A70344C22702A4C0BE0EB18DBB21946A342B1 -S31508007A80C0DB2A4C23702F4B1A70254C00E0244C7F -S31508007A9041F68461C2F200014FF0100281F82F20EE -S31508007AA041F68460C2F2000090F82F3043F00205D8 -S31508007AB080F82F504FF0020180F836104FF004027C -S31508007AC080F837204FF0060380F838304FF00A0563 -S31508007AD080F8395041F67862C2F200024FF02C0164 -S31508007AE011804FF0600380F82E3033E30C4A134BB5 -S31508007AF01A6015484FF0000202700A4B93F82F30AF -S31508007B0003F00400C2B20AB3054B4FF000025A76DE -S31508007B100D484FF02001017001F054F9A2E300BFAF -S31508007B200C1E0020841E0020DE240020E8240020ED -S31508007B30EC240020781E0020D0240020081E0020F7 -S31508007B40CC240020F4240020D4240020A04890F857 -S31508007B502E204FEA12104FEA80029E480270A4F1C6 -S31508007B601404A21A92B29C48028001F00F0102295D -S31508007B7003D103F03F00122811D012B913F0030FF6 -S31508007B800DD0934AD18C95480289914240F0CD8216 -S31508007B908F49088D914A5189884240F0C68203F080 -S31508007BA01003D8B200284FD08C4A118A00294BD02E -S31508007BB002F10C00FFF718FC854C94F82A40884916 -S31508007BC00B78A34240D1824890F82B00844A51781A -S31508007BD0814239D17E4B93F82C10814A93788B4297 -S31508007BE032D17B4A92F82D207D4BDB7893422BD1FC -S31508007BF07A4B1C7358739973DA73D87ED0B9774B5E -S31508007C00987D197E9A7E891AA1EBD002D1B2CAB2A2 -S31508007C100818C0B2987512F0800F1CBF4A42D2B23B -S31508007C206E4BD97DA1EB91018A18D1B2D97501EBBA -S31508007C30D00018766B4B4FF001021A706749087E20 -S31508007C4088764FF000030B82644A537E03F00F01D7 -S31508007C5001F1FF30072800F20583DFE810F008007D -S31508007C602A00CD00EE01370258026602DD015D4AA0 -S31508007C70117811F0010F00F0F582584C4FF003000F -S31508007C806076584B4FF040021A704FF0000121827F -S31508007C90514C208828B1534B4FF042021A70FFF717 -S31508007CA0E1FB51484FF00001018001F08BF84B4C85 -S31508007CB01DE14C4A137813F0010F7DD0444991F821 -S31508007CC02F0000F03F02122A76D1414890F82E3054 -S31508007CD003F0F002502A4CDD4FEA1311A1F1050416 -S31508007CE04FEA8404414802784FF00003384839E0E7 -S31508007CF0C21892F8362022B9364803703B4B1A70E0 -S31508007D0037E0012A03D103F10103DBB22AE0022A94 -S31508007D101DD1451895F83750042D18D12D4A1370E2 -S31508007D20324B4FF002001870294C611891F8382030 -S31508007D3091F8393043EA02202D4C208040F20A613E -S31508007D40884238BF0146254A5182918211E041187E -S31508007D5091F8371021B91F480370244C227008E0A7 -S31508007D60CB18DBB21946A342C2DB1A4C23701F4B51 -S31508007D701A701A4C4FF003016176154890F82620C0 -S31508007D80227290F82730637290F82810A17290F842 -S31508007D902900E0724FF00100FFF764FB114B4FF02A -S31508007DA042021A704FF0000121820B4801800E4BE7 -S31508007DB0198001F007F89AE00A4B4FF02001197074 -S31508007DC001F000F80B4803684FF000025A766FE599 -S31508007DD0841E0020E8240020781E00200C1E0020A7 -S31508007DE0D8240020D4240020801E0020F42400205B -S31508007DF0DE240020081E0020AD4890F82F2012F03F -S31508007E00010F2FD003F01001C8B258BBA94B188A2E -S31508007E10002840F02782A84D2A8802F1010290B274 -S31508007E20FFF720FBA54C237843F010012170288822 -S31508007E3018B143F01205A14A157000F0C3FF9D4C16 -S31508007E404FF0010323824FF0080161764FF00000DE -S31508007E50E07641F68465C2F200054FF0110285F816 -S31508007E602F2068E102F02002D1B281B1904D95F839 -S31508007E7034404FEA042095F83510914A40EA010546 -S31508007E801468641914608C4A1088411B11808A4A48 -S31508007E90108850B103F01003D9B231B9874B1A785C -S31508007EA042F002011970FFF7DDFA814890F8302098 -S31508007EB090F8313003EB022188B2824A10807D4B5C -S31508007EC0998A884200D808B97E4801807D4A118877 -S31508007ED0784B59827948027812F0030F00F0C28174 -S31508007EE0794C4FF00001218000F06CFF714C42F292 -S31508007EF0D440C2F20000017801F02002D3B283B167 -S31508007F004FF0000041F68061C2F2000108806076F9 -S31508007F1041F68465C2F200054FF0140285F82F2059 -S31508007F2009E101F01000C2B2B2B14FF0000541F606 -S31508007F308061C2F200010D804FF0010020824FF0EF -S31508007F4004036376E57641F68465C2F200054FF0D0 -S31508007F50110285F82F20EEE041F68063C2F2000395 -S31508007F601888C8B111F0010F03D04FF0000323821F -S31508007F7001E0218A59B9618A884284BF5248018042 -S31508007F8041F68060C2F200000288228204E041F6CF -S31508007F908062C2F2000211804FF00003E37642F2DB -S31508007FA0F041C2F20001086842F2C842C2F2000279 -S31508007FB0106041F68063C2F20003198889B1208AED -S31508007FC078B100F1280041F67865C2F200052880EC -S31508007FD041F68460C2F200004FF0180380F82F3093 -S31508007FE0B0E042F2D442C2F20002137803F0020172 -S31508007FF0C8B2002800F0368141F67865C2F200055D -S315080080004FF028032B8041F68461C2F200014FF03D -S31508008010100281F82F2095E0284A137813F0010FF3 -S3150800802000F0208123494FF000004876234B4FF09B -S3150800803010021A7000F0C6FE14E11F48008808B145 -S31508008040FFF710FA1A4B93F82F1011F0010F1CD0F6 -S315080080501A4D2C7814F0010F08D0164B4FF0070272 -S315080080605A764FF000059D761D8203E011494FF0C0 -S31508008070060048764FF00100FFF7F4F90F4C4FF071 -S315080080801001217000F09EFE4FE00C4A107810F0A7 -S31508008090010F07D007484FF0050242764FF000035C -S315080080A00382DFE0044B198800293ED1DAE000BFDD -S315080080B0841E00200C1E0020781E0020D4240020D8 -S315080080C0C8240020DE240020801E00207148008875 -S315080080D008B1FFF7C7F9704B93F82F2012F0010F7C -S315080080E011D06E4D4FF007046C764FF00003AB7657 -S315080080F04FF00100FFF7B6F969494FF010020A7010 -S3150800810000F060FE11E06349088870B9AAE0644986 -S31508008110087810F0010F00F0A580604B4FF00702B9 -S315080081205A764FF0000199769CE05B4D4FF01004AB -S3150800813085F82F40594C41F67860C2F200004FF09E -S315080081402803038041F68461C2F200014FF050050E -S3150800815081F82E50227A41F68460C2F2000080F837 -S315080081602A20637A80F82B30A17A80F82C10E57AD9 -S3150800817080F82D50227B80F82620637B80F82730F4 -S31508008180A17B80F82810E57B80F829504FF006027D -S31508008190C275A3884384E188818442F2D045C2F23D -S315080081A000052A8842836B8883832188C183658872 -S315080081B00584647E04F01000C2B252B141F68464AC -S315080081C0C2F200044FF0000084F8310084F8300051 -S315080081D00BE041F68463C2F200034FF0060183F810 -S315080081E030104FF00A0583F8315041F68464C2F224 -S315080081F000044FF04002A27541F67863C2F200030C -S3150800820019884FEA1125257461744FF0000584F822 -S31508008210355084F834506586FFF79AF96FEA0000FE -S3150800822060864FF04502A273E5736575257541F6BC -S315080082307A61C2F200010B8803F1010398B2088043 -S315080082404FEA1022A274E0742583FFF787F96FEAD4 -S315080082500001218342F2D443C2F200034FF000002A -S31508008260187038BD4FF0000341F67861C2F200017C -S315080082700B8042F2D440C2F20000037038BD094CAC -S315080082804FF001052570FFF77ABB06484FF001024B -S315080082900270E7E7781E0020841E00200C1E0020CE -S315080082A0D4240020E824002008B503460A1E0FDD62 -S315080082B041F68061C2F200010A8042F2F040C2F241 -S315080082C000000068834203D0194692B200F0CAFD46 -S315080082D008BD00BF70B503460D4642F2F542C2F22C -S315080082E000024FF00001117042F2F840C2F200009D -S315080082F0048864B142F2F842C2F20002518831B1F0 -S315080083001888A04203D15C888C4200F0888042F22B -S31508008310F842C2F2000294895CB142F2F841C2F214 -S315080083200001C98929B11888A04202D15A888A420F -S315080083307CD042F2F844C2F20004228B5AB142F2CF -S31508008340F841C2F200014C8B2CB11888904202D138 -S315080083505A88A2426ED042F2F841C2F200018C8CD1 -S315080083605CB142F2F840C2F20000C18C29B11A8809 -S31508008370A24202D15C888C4260D042F2F840C2F236 -S315080083800000028E5AB142F2F841C2F200014C8E48 -S315080083902CB11888904202D15A88A24252D042F291 -S315080083A0F841C2F200018C8F5CB142F2F840C2F289 -S315080083B00000C18F29B11A88A24202D15C888C427A -S315080083C044D042F2F840C2F20000B0F8482062B148 -S315080083D042F2F841C2F20001B1F84A402CB11888BD -S315080083E0904202D15A88A24234D042F2F841C2F2EF -S315080083F00001B1F85440002C42D042F2F840C2F2D3 -S315080084000000B0F8561000293AD01A88A24237D18F -S315080084105C888C4234D14FF00700AA4C1DE04FF01F -S31508008420000042F2F844C2F2000416E04FF00100E0 -S31508008430A54C12E04FF00200A44C0EE04FF00300EA -S31508008440A34C0AE04FF00400A24C06E04FF00500EA -S31508008450A14C02E04FF00600A04C42F2F542C2F2EF -S315080084600002107004F1040029464FF0060200F0DD -S31508008470F9FC42F25953C2F200031978A17270BD91 -S3150800848042F2F840C2F20000018831B942F2F842DD -S31508008490C2F200025488002C5FD042F2F840C2F2C1 -S315080084A00000818931B942F2F842C2F20002D48949 -S315080084B0002C59D042F2F840C2F20000018B31B9C3 -S315080084C042F2F842C2F20002548B002C50D042F21B -S315080084D0F840C2F20000818C31B942F2F842C2F289 -S315080084E00002D48C002C47D042F2F840C2F20000B9 -S315080084F0018E31B942F2F842C2F20002548E002CC3 -S315080085003ED042F2F840C2F20000818F29B942F209 -S31508008510F842C2F20002D48FB4B342F2F840C2F273 -S315080085200000B0F8481031B942F2F842C2F200022F -S31508008530B2F84A4064B342F2F840C2F20000B0F81A -S31508008540541071BB42F2F842C2F20002B2F8564029 -S315080085503CBB4FF007005B4C1DE04FF0000042F2B9 -S31508008560F844C2F2000416E04FF00100564C12E03F -S315080085704FF00200554C0EE04FF00300544C0AE051 -S315080085804FF00400534C06E04FF00500524C02E051 -S315080085904FF00600514C42F2F542C2F2000210704A -S315080085A07BE04FF0000442F25956C2F200063078DA -S315080085B0224642F2F841C2F200018E7A811BA1429C -S315080085C0C4BF0A46D2B242F2F846C2F20006B17DEC -S315080085D0461A964202DDF2B24FF0010442F2F84121 -S315080085E0C2F2000191F82260811B914202DDCAB2F3 -S315080085F04FF0020442F2F846C2F2000696F82E1030 -S31508008600461A964202DDF2B24FF0030442F2F841EE -S31508008610C2F2000191F83A60811B914202DDCAB2AA -S315080086204FF0040442F2F846C2F2000696F84610E5 -S31508008630461A964202DDF2B24FF0050442F2F841BC -S31508008640C2F2000191F85260811B914202DDCAB262 -S315080086504FF0060442F2F846C2F2000696F85E109B -S31508008660461A964202DDF2B24FF0070442F2F6418C -S31508008670C2F200010A7042F25850C2F200000470B9 -S3150800868042F2F542C2F20002147004EB440442F2CC -S31508008690F841C2F2000101EB8404204619464FF066 -S315080086A0040200F0DFFB04F1040029464FF006023D -S315080086B000F0D8FB42F25953C2F200031978A172AE -S315080086C070BD00BF4C250020042500201025002081 -S315080086D01C250020282500203425002040250020C0 -S315080086E02DE9F04142F25953C2F200031A7802F119 -S315080086F001021A704FF0000142F2F540C2F2000082 -S31508008700017042F2F845C2F2000542F25956C2F229 -S31508008710000688464FF00407044601EB410105EBC5 -S315080087208100428835F8213042EA03018AB242B113 -S315080087303178837ACA1A772A03DD41463A4600F029 -S31508008740B5FB207800F10100C1B221700729E4D9F0 -S31508008750BDE8F081F8B541F67863C2F200031888DF -S31508008760292807D841F67863C2F200034FF00002C1 -S315080087701A80F8BD41F67861C2F200014FF0000296 -S315080087800A8041F68463C2F20003988AB0F5807FB6 -S3150800879003D0B0F5007F7FD160E041F68461C2F274 -S315080087A00001CA8C42F2D043C2F200031888824202 -S315080087B072D141F68461C2F200010A8D42F2D043B9 -S315080087C0C2F200035888824266D13448A0F10605F1 -S315080087D02946FFF77FFD41F68464C2F200044FF094 -S315080087E0000626754FF00207677504F12006304625 -S315080087F029464FF0060200F035FB42F2E047C2F286 -S315080088000007284639464FF0060200F02BFB04F114 -S31508008810060039464FF0060200F024FB2046314692 -S315080088204FF0060200F01EFBA18BE184E28B228545 -S3150800883042F2D043C2F200031888A0835988E18324 -S315080088404FF0080222734FF00603637341F678600F -S31508008850C2F200004FF02A010180F8BD41F684619A -S31508008860C2F20001CA8C42F2D043C2F20003188851 -S31508008870824211D141F68461C2F200010A8D42F2A8 -S31508008880D043C2F200035888824205D103490846FC -S31508008890A1F10601FFF71EFDF8BD00BFA01E0020CE -S315080088A038B541F68463C2F20003DB8B4FF6FF72DC -S315080088B0934215D141F68460C2F20000018C4FF64E -S315080088C0FF7291420CD141F68460C2F2000049F66B -S315080088D0D011C0F600014FF0060200F0C3FA3DE1E0 -S315080088E042F2D040C2F20000018883EA010041F654 -S315080088F07462C2F200021188084211D141F68460FE -S31508008900C2F20000028C42F2D041C2F2000148884D -S31508008910504041F67461C2F20001498808420CD001 -S3150800892042F25C53C2F2000341F67C62C2F20002D4 -S31508008930118819805088588005E042F25C50C2F2CE -S3150800894000000380428042F25C52C2F200021388A1 -S31508008950508842F2F841C2F200010A889A4206D1CA -S3150800896042F2F841C2F200014A88824269D042F2D4 -S31508008970F841C2F200018A899A4206D142F2F841C8 -S31508008980C2F20001CA89824262D042F2F841C2F2BA -S3150800899000010A8B9A4206D142F2F841C2F200015E -S315080089A04A8B824258D042F2F841C2F200018A8CC0 -S315080089B09A4206D142F2F841C2F20001CA8C8242BA -S315080089C04ED042F2F841C2F200010A8E9A4206D10E -S315080089D042F2F841C2F200014A8E824244D042F283 -S315080089E0F841C2F200018A8F9A4206D142F2F84152 -S315080089F0C2F20001CA8F82423AD042F2F841C2F26C -S31508008A000001B1F848209A4207D142F2F841C2F271 -S31508008A100001B1F84A2082422ED042F2F841C2F251 -S31508008A200001B1F854209A4239D142F2F843C2F211 -S31508008A300003B3F85610814231D14FF0070055496B -S31508008A401DE04FF0000042F2F841C2F2000116E0C4 -S31508008A504FF00100504912E04FF002004F490EE076 -S31508008A604FF003004E490AE04FF004004D4906E076 -S31508008A704FF005004C4902E04FF006004B4942F220 -S31508008A80F543C2F20003187041F68460C2F2000092 -S31508008A9001F104014FF0060200F0E4F95EE042F24B -S31508008AA0F544C2F200044FF00805257041F68464C7 -S31508008AB0C2F2000420464FF0FF014FF0060200F014 -S31508008AC0F5F904F120004FF000014FF0060200F01E -S31508008AD0EDF942F2E045C2F2000504F10600294626 -S31508008AE04FF0060200F0BEF904F1160029464FF0D1 -S31508008AF0060200F0B7F942F25C50C2F200000288A2 -S31508008B00E2844388238542F2D041C2F200010888F4 -S31508008B10A0834A88E2834FF0000323754FF00101D2 -S31508008B206175A373E1734FF00800207463744FF006 -S31508008B300602A2744FF00403E3742073627304F10F -S31508008B40360442F2C841C2F200010C6041F6786070 -S31508008B50C2F200004FF02A02028038BD144842F2E1 -S31508008B60E041C2F200014FF0060200F07BF941F63F -S31508008B708461C2F200014FF008020A734FF0000048 -S31508008B80487341F67863C2F20003198801F10E01B1 -S31508008B90198038BD4C25002004250020102500200A -S31508008BA01C250020282500203425002040250020EB -S31508008BB08A1E002008B5F9F745FDFAF7F9FB00F516 -S31508008BC0FA7042F26453C2F200031860FAF7F0FB37 -S31508008BD000F51C5101F1100142F26052C2F2000286 -S31508008BE01160FEF757FC42F2D040C2F200004FF681 -S31508008BF0A962028043F61373438041F67460C2F299 -S31508008C0000004FF6FF7101804FF00003438041F6E4 -S31508008C107C60C2F20000028040F2131242804EF6D7 -S31508008C200300FEF753FCF9F757FE08BDF8B541F601 -S31508008C300863C2F200031E68F26932628E46F1B119 -S31508008C4001F1FF318CB206F11C024FF0000304F16A -S31508008C50010704F00101C55CD418257203F101036C -S31508008C60BB4219D10BE0C55CD418257203F1010388 -S31508008C70C55CD418257203F10103BB42F3D10EF18A -S31508008C800401A6F8641006F12000FFF70DFBF06951 -S31508008C9000F10100F061F8BD0029E4D0C45CD118E8 -S31508008CA00C7203F10103BB42DDD1E8E710B5F9F711 -S31508008CB02BFE002841D041F67862C2F200021080ED -S31508008CC041F68460C2F2000084894FF40060FEF722 -S31508008CD019FC844215D14FF00100FEF751FC41F60C -S31508008CE07863C2F200031A883AB3FFF7D9FDF9F799 -S31508008CF039FE41F67860C2F200004FF000010180AB -S31508008D001BE041F68461C2F200018C8940F6060038 -S31508008D10FEF7F8FB844210D1FFF71CFD41F6786395 -S31508008D20C2F200031A8842B1F9F71CFE41F67860D0 -S31508008D30C2F200004FF000010180FAF739FB42F257 -S31508008D406453C2F200031A68904224D302F5FA70FB -S31508008D5042F26451C2F20001086041F60863C2F2A9 -S31508008D60000341F60C62C2F200021A604FF00200DC -S31508008D70FEF706FC41F67860C2F20000018851B1A0 -S31508008D80FFF78EFDF9F7EEFD41F67863C2F20003B0 -S31508008D904FF000021A80FAF70BFB42F26051C2F25A -S31508008DA000010B6898420AD303F51C5000F1100025 -S31508008DB042F26052C2F200021060FFF791FC4FF0D7 -S31508008DC0000010BD10B541F60863C2F200031C6826 -S31508008DD042F2D440C2F20000017801F04002D3B258 -S31508008DE03BB14FF00100E0614FF00001A4F86410B8 -S31508008DF010BD11F0010F1CBF0023A4F8643001F068 -S31508008E000400C1B231B1B4F8641019B104F12000FC -S31508008E10FFF74AFA42F2D442C2F20002137803F08C -S31508008E200200C1B261B14FF00002A4F8642042F218 -S31508008E30C843C2F20003186800F10400FAF7BAFE44 -S31508008E4010BD00BFA0F1300009288CBF002001200A -S31508008E50704700BFA0F16103D9B2192998BF20381D -S31508008E60704700BF844640EA010313F0030F40F041 -S31508008E701080242AC0F00D802DE9F00FB1E8F80F14 -S31508008E80A0E8F80FA2F12402242ABFF4F7AFBDE840 -S31508008E90F00F002A00F0078011F8013B00F8013BAB -S31508008EA0013A7FF4F9AF6046704700BF8446002A4E -S31508008EB000F0328010F0030F00F0078000F8011B65 -S31508008EC0013A00F02980FFF7F5BF282AC0F01F8075 -S31508008ED0A2F128022DE9F00F01F0FF0141EA012174 -S31508008EE041EA014141EA01610B460C460D460E4630 -S31508008EF00F46884689468A468B46A0E8FA0F283ADE -S31508008F00BFF4FBAFBDE8F00F283200F0058000F88B -S31508008F10011B013A7FF4FBAF6046704738B504463B -S31508008F200D4600F019F842F26853C2F200031D60BC -S31508008F3044F0800442F26C50C2F20000046002461B -S31508008F4011680029FCD100F009F842F26853C2F210 -S31508008F500003186838BD00BF704700BF704700BFE0 -S31508008F60433A2F576F726B2F736F6674776172650A -S31508008F702F4F70656E424C542F5461726765742F7B -S31508008F8044656D6F2F41524D434D345F53544D33F5 -S31508008F90325F4F6C696D65785F53544D3332453493 -S31508008FA030375F43726F7373776F726B732F426FCD -S31508008FB06F742F6964652F2E2E2F6C69622F756961 -S31508008FC0702F6E65746465762E6300002F64656D78 -S31508008FD06F70726F675F6F6C696D65785F73746DBC -S31508008FE03332653430372E73726563002F626F6FC4 -S31508008FF0746C6F672E74787400000000433A2F571C -S315080090006F726B2F736F6674776172652F4F706519 -S315080090106E424C542F5461726765742F44656D6FA8 -S315080090202F41524D434D345F53544D33325F4F6C8D -S31508009030696D65785F53544D3332453430375F4335 -S31508009040726F7373776F726B732F426F6F742F69BA -S3150800905064652F2E2E2F2E2E2F2E2E2F2E2E2F538B -S315080090606F757263652F41524D434D345F53544DAE -S3150800907033322F43726F7373776F726B732F766504 -S3150800908063746F72732E63000000080010001800E6 -S3150800909020002800300038004000480050005800E2 -S315080090A08000880090009800A000A800B000B800D2 -S315080090B0C000C800D000D80000C00008004000006A -S315080090C00300000000000108000001000400000081 -S315080090D00000020800000200050000000000040865 -S315080090E0000002000600000000000608000002005A -S315080090F00700000000000808000002000800000041 -S3150800910000000A08000002000900000000000C0820 -S31508009110000002000A00000000000E08000002001D -S315080091200B000000433A2F576F726B2F736F6674EC -S31508009130776172652F4F70656E424C542F54617279 -S315080091406765742F44656D6F2F41524D434D345FEB -S3150800915053544D33325F4F6C696D65785F53544D88 -S315080091603332453430375F43726F7373776F726B80 -S31508009170732F426F6F742F6964652F2E2E2F2E2E34 -S315080091802F2E2E2F2E2E2F536F757263652F415259 -S315080091904D434D345F53544D33322F756172742EDF -S315080091A063000000433A2F576F726B2F736F667414 -S315080091B0776172652F4F70656E424C542F546172F9 -S315080091C06765742F44656D6F2F41524D434D345F6B -S315080091D053544D33325F4F6C696D65785F53544D08 -S315080091E03332453430375F43726F7373776F726B00 -S315080091F0732F426F6F742F6964652F2E2E2F2E2EB4 -S315080092002F2E2E2F2E2E2F536F757263652F4152D8 -S315080092104D434D345F53544D33322F63616E2E6385 -S3150800922000000000050206020603070308030903F7 -S3150800923009040A040B040C040C050D050E050F059C -S315080092400F061006100710084F70656E424C540042 -S31508009250433A2F576F726B2F736F66747761726517 -S315080092602F4F70656E424C542F5461726765742F88 -S3150800927044656D6F2F41524D434D345F53544D3302 -S31508009280325F4F6C696D65785F53544D33324534A0 -S3150800929030375F43726F7373776F726B732F426FDA -S315080092A06F742F6964652F2E2E2F2E2E2F2E2E2F9C -S315080092B02E2E2F536F757263652F66696C652E6344 -S315080092C0000000004669726D7761726520757064EA -S315080092D0617465207265717565737420646574655B -S315080092E0637465640A0D00004F70656E696E6720C9 -S315080092F06669726D776172652066696C6520666F4E -S31508009300722072656164696E672E2E2E0000000059 -S315080093104552524F520A0D004F4B0A0D00000000ED -S315080093205374617274696E67207468652070726F11 -S315080093306772616D6D696E672073657175656E63B9 -S31508009340650A0D0050617273696E67206669726DF1 -S31508009350776172652066696C6520746F206F627428 -S3150800936061696E2065726173652073697A652E2E50 -S315080093702E00000045726173696E672000000000C8 -S315080093802062797465732066726F6D206D656D6FE6 -S31508009390727920617420307800000000526561649B -S315080093A0696E67206C696E652066726F6D206669E6 -S315080093B06C652E2E2E4552524F520A0D00000000A3 -S315080093C0496E76616C696420636865636B73756D55 -S315080093D020666F756E642E2E2E4552524F520A0D18 -S315080093E00000000050726F6772616D6D696E6720CC -S315080093F00000000020627974657320746F206D6523 -S315080094006D6F727920617420307800005772697424 -S31508009410696E672070726F6772616D206368656335 -S315080094206B73756D2E2E2E00436C6F73696E6720F5 -S315080094306669726D776172652066696C650A0D00EA -S315080094404669726D7761726520757064617465200E -S315080094507375636365737366756C6C7920636F6D7A -S31508009460706C657465640A0D00000000222A3A3C97 -S315080094703E3F7C7F000000002B2C3B3D5B5D0000DF -S31508009480809A90418E418F804545454949498E8F3E -S315080094909092924F994F555559999A9B9C9D9E9F8C -S315080094A041494F55A5A5A6A7A8A9AAABAC21AEAF19 -S315080094B0B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF26 -S315080094C0C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF16 -S315080094D0D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF06 -S315080094E0E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF6 -S315080094F0F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFFE6 -S3150800950001030507090E10121416181C1E00000088 -S315080095106100620063006400650066006700680019 -S3150800952069006A006B006C006D006E006F007000C9 -S315080095307100720073007400750076007700780079 -S3150800954079007A00A100A200A300A500AC00AF0034 -S31508009550E000E100E200E300E400E500E600E700E1 -S31508009560E800E900EA00EB00EC00ED00EE00EF0091 -S31508009570F000F100F200F300F400F500F600F80040 -S31508009580F900FA00FB00FC00FD00FE00FF000101E7 -S3150800959003010501070109010B010D010F01110165 -S315080095A013011501170119011B011D011F012101D5 -S315080095B023012501270129012B012D012F01310145 -S315080095C03301350137013A013C013E0140014201B0 -S315080095D04401460148014B014D014F015101530118 -S315080095E05501570159015B015D015F016101630185 -S315080095F06501670169016B016D016F0171017301F5 -S31508009600750177017A017C017E019201B103B203EB -S31508009610B303B403B503B603B703B803B903BA0370 -S31508009620BB03BC03BD03BE03BF03C003C103C3031F -S31508009630C403C503C603C703C803C903CA03300462 -S315080096403104320433043404350436043704380448 -S3150800965039043A043B043C043D043E043F044004F8 -S3150800966041044204430444044504460447044804A8 -S3150800967049044A044B044C044D044E044F04510457 -S315080096805204530454045504560457045804590400 -S315080096905A045B045C045E045F0470217121722124 -S315080096A073217421752176217721782179217A21F0 -S315080096B07B217C217D217E217F2141FF42FF43FFC3 -S315080096C044FF45FF46FF47FF48FF49FF4AFF4BFF58 -S315080096D04CFF4DFF4EFF4FFF50FF51FF52FF53FF08 -S315080096E054FF55FF56FF57FF58FF59FF5AFF000012 -S315080096F0C700FC00E900E200E400E000E500E7003E -S31508009700EA00EB00E800EF00EE00EC00C400C5003C -S31508009710C900E600C600F400F600F200FB00F900F6 -S31508009720FF00D600DC00A200A300A500A720920136 -S31508009730E100ED00F300FA00F100D100AA00BA003A -S31508009740BF001023AC00BD00BC00A100AB00BB00ED -S3150800975091259225932502252425612562255625DE -S3150800976055256325512557255D255C255B2510253F -S31508009770142534252C251C2500253C255E255F252A -S315080097805A25542569256625602550256C256725A3 -S3150800979068256425652559255825522553256B25A1 -S315080097A06A2518250C25882584258C25902580254D -S315080097B0B103DF009303C003A303C303B500C403C7 -S315080097C0A6039803A903B4031E22C603B5032922D8 -S315080097D06122B1006522642220232123F700482252 -S315080097E0B0001922B7001A227F20B200A025A000D7 -S315080097F04100420043004400450046004700480037 -S3150800980049004A004B004C004D004E004F005000E6 -S315080098105100520053005400550056005700580096 -S3150800982059005A002100E0FFE1FFE5FFE2FFE3FFF0 -S31508009830C000C100C200C300C400C500C600C700FE -S31508009840C800C900CA00CB00CC00CD00CE00CF00AE -S31508009850D000D100D200D300D400D500D600D8005D -S31508009860D900DA00DB00DC00DD00DE00780100014B -S3150800987002010401060108010A010C010E0110018A -S3150800988012011401160118011A011C011E012001FA -S3150800989022012401260128012A012C012E0130016A -S315080098A032013401360139013B013D013F014101D5 -S315080098B04301450147014A014C014E01500152013D -S315080098C05401560158015A015C015E0160016201AA -S315080098D06401660168016A016C016E01700172011A -S315080098E07401760179017B017D019101910392034F -S315080098F093039403950396039703980399039A038E -S315080099009B039C039D039E039F03A003A103A3033C -S31508009910A403A503A603A703A803A903AA0310047F -S315080099201104120413041404150416041704180465 -S3150800993019041A041B041C041D041E041F04200415 -S3150800994021042204230424042504260427042804C5 -S3150800995029042A042B042C042D042E042F040104A4 -S31508009960020403040404050406040704080409049D -S315080099700A040B040C040E040F0460216121622101 -S3150800998063216421652166216721682169216A218D -S315080099906B216C216D216E216F2121FF22FF23FF90 -S315080099A024FF25FF26FF27FF28FF29FF2AFF2BFF75 -S315080099B02CFF2DFF2EFF2FFF30FF31FF32FF33FF25 -S315080099C034FF35FF36FF37FF38FF39FF3AFF00000F -S30D080099D0FFFFFFFFFFFF000087 -S315080099D80100000001000000000000000102030465 -S30E080099E80102030406070809043C +S3150800022802700130FAE77047003F0020A0A80008CE +S3150800023800000020E500002090020008900200084F +S31508000248589D0008A0A8000800000020000000200B +S31508000258589D0008589D0008589D0008589D000894 +S31508000268589D0008589D0008589D0008589D000884 +S31508000278A0A80008E8000020002F0020002F002072 +S30D0800028800370020E93E0008DA +S3150800029010B54FF43053C4F20103586B10F0450FF4 +S315080002A0FBD043070DD410F0010405D140F2FF50EE +S315080002B001F008FC204610BD012001F003FC0120D6 +S315080002C010BD042001F0FEFB032010BD4FF4305290 +S315080002D038B5C4F201020446536B13F0450FFBD040 +S315080002E059070DD413F0010505D101F0A3FBA0426F +S315080002F00BD0102038BD012001F0E4FB012038BDE9 +S31508000300042001F0DFFB032038BD40F2FF5001F066 +S31508000310D9FB284601F096FB4EF20801CFF6FF51AD +S31508000320014029B1002805DB420005D5092038BD62 +S31508000330084638BD1C2038BD830001D50A2038BDC3 +S31508000340C10001D50B2038BD020101D50C2038BDEE +S31508000350430101D50D2038BDC10101D50E2038BD98 +S31508000360020201D50F2038BD4302C2D4810201D54D +S31508000370112038BDC20201D5122038BD030301D5AC +S31508000380132038BD410301D5142038BD820301D599 +S31508000390152038BDC30301D5162038BD010401D583 +S315080003A0172038BD420401D5182038BD830401D56D +S315080003B0192038BD10F0080F0CBF00201A2038BDD0 +S315080003C02DE9F04F054683B0002001F03BFB10F005 +S315080003D0007304D00E23184603B0BDE8F08F704CA6 +S315080003E000934FF0100820464FF0080940274FF4B5 +S315080003F080660193E360C4F80090C4F80480A7609F +S31508000400266101F0FFFA4046FFF760FF0346002821 +S31508000410E1D1DFF89481E060D8F80010A7600B04FA +S315080004204FF0370A204684E80804266101F0EAFA04 +S315080004305046FFF74BFF824603460028CBD1594B5F +S315080004404FF0FF3283E80402302218469A600221F0 +S315080004500122D960C3F810A05A614FF0330B01F09E +S31508000460FFFA204684E8000CA760C4F80CA02661B1 +S3150800047001F0C8FA5846FFF729FF03460028AAD113 +S315080004804FF43056ADF10407C4F20106716B40F221 +S315080004902A630B404FF4001043B901F009FB00280A +S315080004A0F4D001F0F5FA47F8040FEFE7082001F059 +S315080004B0FFFA20B1082001F005FB04238BE7022090 +S315080004C001F0F6FA20B1022001F0FCFA022382E7D5 +S315080004D0202001F0EDFA20B1202001F0F3FA0623DE +S315080004E079E74FF4007001F0E3FA064628B14FF4B5 +S315080004F0007001F0E7FA07236DE740F2FF5001F0BC +S31508000500E1FA0098012D02BA2BD0D00301D4252395 +S3150800051061E7D8F80070224DE6603B043726284686 +S315080005204FF040084FF4806784E84801276101F0DE +S3150800053069FA3046FFF7CAFE0146034600287FF4EB +S315080005404AAF0624284629606C60C5F80880E96029 +S315080005502F6101F057FA204603B0BDE8F04FFFF7C8 +S31508000560B5BE5303D3D5D8F800000D4DE660030495 +S31508000570372628464FF040084FF4806784E848013C +S31508000580276101F03FFA3046FFF7A0FE0146034611 +S3150800059000287FF420AF0222062428462A60D3E7E3 +S315080005A0A0010020EC0000204401002000B54FF413 +S315080005B0006083B00123C4F202004FF400618DF895 +S315080005C0073001F015F908B98DF807009DF80700FE +S315080005D003B000BD2DE9F04F834B844D85B0002450 +S315080005E0184676221C605C609C60DC601C611A758B +S315080005F08DF80F4001F0D6F9032001F0F5F9012036 +S3150800060001F0ECF94FF4806128462C606C60AC6010 +S31508000610EC6029614FF4803401F0F4F906E080209B +S3150800062001F046FA40B9013C00F0C080802001F094 +S315080006303FFA013C0028F2D040F2FF5001F042FA9E +S3150800064000208DF80F009DF80F3023B19DF80F009C +S3150800065005B0BDE8F08F082240244FF4D57185E82F +S3150800066016004FF43054C4F201046048EB604FF4AE +S3150800067080672F6101F0C6F9626B12F0450F0ED143 +S315080006804FF4803105E0626B013912F0450F05D150 +S3150800069041B1626B013912F0450FF4D011B112F075 +S315080006A0040775D0042001F00DFA03208DF80F0019 +S315080006B09DF80F30002B7BD14D4F01243C604FF045 +S315080006C0804400234FF0370940224848EB6085E80C +S315080006D008024FF48063AA602B6101F093F948463B +S315080006E0FFF7F4FD8DF80F009DF80F70002FADD1C0 +S315080006F044F0004A4AF480104FF430543B4E0190BF +S31508000700B846C4F201043948C5F800804FF0400ADB +S315080007104FF4806BC5F80490C5F808A0C5F80C809E +S31508000720C5F810B001F06EF93720FFF7CFFD8DF848 +S315080007300F009DF80F30002B88D101992B483160A6 +S3150800074029227260C6F808A0F360C6F810B001F056 +S3150800075059F9606B10F0450FFBD010F0040B1FD051 +S31508000760042001F0AFF903238DF80F309DF80F0030 +S3150800077000287FF46BAF01F065F9013700284FF6C2 +S31508000780FF7128DB8F42BED11B238DF80F305DE742 +S3150800079012F040008AD0402001F094F9384685E7E7 +S315080007A040F2FF5001F08EF95B46DDE7032048E78B +S315080007B040224FF48061002437260C48AA6029613C +S315080007C085E85000EC6001F01DF93046FFF77EFD24 +S315080007D08DF80F0075E78F42D6D042007FF536AF09 +S315080007E003480222026031E72C010020A001002004 +S315080007F014010020F8B501F0FDF810B925242046AB +S31508000800F8BD4E4E3368042B52D04D4D00210222BE +S315080008104FF480632846C02429606A60AC60E960AA +S315080008202B6101F0EFF8FFF733FD04460028E6D107 +S3150800083001F008F9434F3860042001F003F97860A5 +S31508000840082001F0FFF8B8600C2001F0FBF83368C7 +S31508000850F860012B2FD9062B2DD0022B2BD0012186 +S31508000860042BCCD0384C364821600A04C023092111 +S315080008702A6000244FF480626960AB60EC602A61EC +S3150800088001F0C0F8FFF704FD04460028B7D101F0CF +S31508000890D9F82E4D2860042001F0D4F868600820A5 +S315080008A001F0D0F8A8600C2001F0CCF8E860A6E7C3 +S315080008B000242046F8BD0021214829600322402350 +S315080008C0E9604FF480616A60AB60296101F09AF8CB +S315080008D04FF43050C4F20100426B12F0450FFBD0C2 +S315080008E0500708D412F001070AD101F0A3F803282B +S315080008F00BD0102483E7042001F0E4F803247EE7F4 +S31508000900012001F0DFF8012479E740F2FF5001F0F9 +S31508000910D9F8384601F096F810F4604F03D08104F0 +S3150800092004D513246BE7010C336899E74204E0D435 +S31508000930030401D50F2462E70121F5E7140100201D +S31508000940A001002018010020440100200401002015 +S315080009502DE9F00FBB4FBC4B3A6879681C68BB4D54 +S3150800096003460E0E100E4FEA901AC0F38309C2F31F +S315080009700748C2F3072C360100F00300D2B283F809 +S3150800098000A083F80190987083F8038083F804C068 +S315080009905A71DE80B3F806B02D6883F85640C1F365 +S315080009A00722C1F307401FFA8BF65FFA82FC46EA74 +S315080009B0101B4FEADC1A00F00F00C2F38019C2F3CD +S315080009C04018C2F30016A3F854500025012CA3F8CA +S315080009D006B086B0187283F809A083F80A9083F8DF +S315080009E00B801E735D7340F2ED80022C00F0C88008 +S315080009F0BE680CF03F04FF6895496200CCF3801985 +S31508000A0083F819909A7693F81A800C684A68380E13 +S31508000A10C6F3C01C00F0030548EA0C0B4FEAD01ACF +S31508000A20C0F34119AD0006F07F06C0F3820083F8D3 +S31508000A301AB0DE7683F81CA083F81D909877DD77C8 +S31508000A4093F81FB0C7F3074C01250CEA0509C7F34D +S31508000A500728CDF804904BEA9C1BCCF3401A83F880 +S31508000A601FB04FEAD81C83F820A0DDF804A0CDF803 +S31508000A7008C0002083F82100C8F3801983F822A053 +S31508000A80DDF808A0CDF80C9083F823A0C8F3401C25 +S31508000A90DDF80CA0CDF810C083F824A0C8F300191F +S31508000AA0DDF810A0CDF8149083F825A0C4F3074606 +S31508000AB0DDF814A0C8F38109C7F3460C3602270EE1 +S31508000AC008F0030883F826A083F8279083F828807F +S31508000AD083F829C083F82A5083F82C70DE85DE8DCA +S31508000AE0C4F30727B6B23E432406DE851C631F6B94 +S31508000AF0160E47EA06441C631F6BC2F3074647EA0D +S31508000B0006241C638C681F6BC968C2F3072CC4F3E0 +S31508000B1007464CEA070C3606270ED2B2C3F830C091 +S31508000B2083F8342083F835709E639A6BC4F30726DE +S31508000B3042EA06429A639E6BE4B246EA04229A6344 +S31508000B409E6B46EA11649C6393F83C60C1F30742C6 +S31508000B5002F00F04240246EA121283F83C20DC87CE +S31508000B60DA8FC1F3072492B22243C1F34601DA872A +S31508000B7083F8401083F8415006B0BDE8F00F70477F +S31508000B8001F03F010C041C61BE681A69300E42EA86 +S31508000B9000251D611C69C6F3074141EA04021A6172 +S31508000BA01D6901200024451944F10001CA0442EADE +S31508000BB05534E8044FF40075C6F3072CDC649864D2 +S31508000BC01D6516E702F00306B2021A611C69BE68C3 +S31508000BD0C9B244EA810018611D69C6F30742340E9A +S31508000BE002F0030045EA941B04F00701C4F3C205AA +S31508000BF040005409C2F38202C3F810B01D75597536 +S31508000C009C75DA7518761D7EC6F3072C45EADC1145 +S31508000C1019761C69187E1D7A0122811C02FA01F0D8 +S31508000C2002FA05F204F1010AC517A0FB020102FB4C +S31508000C300511A0FB0A450AFB01551A65C3E91245C9 +S31508000C40D7E600BF0401002014010020440100205B +S31508000C501801002038B51A4B19680329054617D01C +S31508000C60022918D8B0F5805F12D0B0F5006F15D0FC +S31508000C700020FFF7A5FB044658B9124A104614751A +S31508000C80146054609460D460146100F08BFE00E038 +S31508000C902724204638BD0024204638BD0120FFF70A +S31508000CA08FFB04460028F4D1064B18461C751C60B9 +S31508000CB05C609C60DD601C6100F074FEE9E700BFC3 +S31508000CC0140100202C01002040F2A013C2F20003F8 +S31508000CD010B54022072418609A60184600214FF480 +S31508000CE080625C60D9601A6100F08CFE2046BDE81F +S31508000CF01040FFF7EBBA00BFF0B585B000240C2012 +S31508000D0001218DF8074000F0EBFD4FF40060C4F2B6 +S31508000D10020008210C2200F071FD4FF40060C4F2B5 +S31508000D20020009210C2200F069FD4FF40060C4F2AC +S31508000D3002000A210C2200F061FD4FF40060C4F2A3 +S31508000D4002000B210C2200F059FD0C214FF4006023 +S31508000D500A46C4F2020000F051FD4FF440600C222E +S31508000D60C4F20200022100F049FD4FF400604FF47E +S31508000D70706301250227C4F2020002A902938DF8C6 +S31508000D800D508DF80C708DF80E408DF80F5000F050 +S31508000D9087FC4FF440600422C4F2020002A90292C2 +S31508000DA000F07EFC4FF40060C4F2020002A94FF482 +S31508000DB0805602968DF80F4000F072FC4FF40060E2 +S31508000DC0064602A9C4F2020002968DF80C708DF848 +S31508000DD00F4000F065FC3046294600F0ABFD4FF4A5 +S31508000DE08000294600F07CFD00F0CEFDFFF7F2FBFF +S31508000DF08DF807009DF8070018B19DF8070005B0A3 +S31508000E00F0BDFFF7F7FC8DF807009DF80730002BBB +S31508000E10F3D1134A134C137510461360536093604D +S31508000E20D360136100F0BEFD2046FFF791FD8DF8F3 +S31508000E3007009DF8071051B19DF80730002BDCD14B +S31508000E404FF40060FFF706FF8DF80700D5E7B4F802 +S31508000E5054000004FFF738FF8DF80700ECE700BFE1 +S31508000E602C010020480100202DE9F843714D724EEF +S31508000E7000214FF430542970C4F201046F4D3160DB +S31508000E802960E1626E4C6F4D2168022918BFBDF8D2 +S31508000E902070914602BF4FEA52294FF4007749EA7B +S31508000EA0C35980461023402200264FF48064284602 +S31508000EB02C612F606B60AA60EE604FF4803400F0FE +S31508000EC0A1FD05E0802000F0F3FD38B9013C05D00E +S31508000ED0802000F0EDFD013C0028F3D01020FFF73C +S31508000EE0F5F9064610B13046BDE8F88356494FF085 +S31508000EF0FF329023084681E884008B600222012392 +S31508000F00CA604B610E61112400F0AAFD4FF480619E +S31508000F104C48EE604026AE602961C5F800906C60CA +S31508000F2000F070FD2046FFF7D1F906460028DAD111 +S31508000F304FF430554446C4F201056A6B40F22A6301 +S31508000F4013404FF4004023BB00F0B2FD0028F4D054 +S31508000F5000F09EFD206000F09BFD606000F098FDAB +S31508000F60A06000F095FDE06000F092FD206100F0C1 +S31508000F708FFD606100F08CFDA06100F089FDE061E5 +S31508000F806A6B40F22A63134020344FF40040002B6A +S31508000F90DAD0082000F08CFD30B10820042600F0D5 +S31508000FA091FD3046BDE8F883022000F081FD20B1AE +S31508000FB0022000F087FD022695E7202000F078FD44 +S31508000FC020B1202000F07EFD06268CE74FF4007045 +S31508000FD000F06EFD40BB4FF0FF3516E0E5B100F0BE +S31508000FE057FD47F8040B4FF4001000F061FD98B167 +S31508000FF000F04EFD60604FF4001000F059FD58B146 +S3150800100000F046FD0C347860033D4FF40010274687 +S3150800101000F04EFD0028E1D140F2FF5000F052FDED +S315080010200A49002008605EE74FF4007000F04AFDA8 +S31508001030072658E7E800002028010020B401002010 +S3150800104014010020A0010020EC0000200000002070 +S315080010502DE9F84F4FF43054C4F20104704D714E27 +S31508001060714F0021297031603960E1626F4C216847 +S315080010706F4C022918BFBDF82890924602BF4FEA66 +S31508001080522A4FF400794AEAC35A804610250023AB +S31508001090204640274FF480666560E360C4F80090F8 +S315080010A0A760266100F0AEFC2846FFF70FF9054653 +S315080010B010B12846BDE8F88F4FF0180B2046E560BA +S315080010C084E8000CA760266100F09CFC5846FFF7F0 +S315080010D0FDF805460028ECD156494FF0FF3281E865 +S315080010E004020123902208468A60CD600D614B6197 +S315080010F000F0B6FC4FF43057A946C4F20107786BE6 +S3150800110040F21A61014000293AD14FF4804000F0BC +S31508001110CFFC0028F3D0C9F5007BBBF11F0F3AD8E6 +S315080011205FEA9B0BEBD046460BF1FF33012456F8DA +S31508001130040B03EA040A00F0B3FC5C4516D0BAF1C6 +S31508001140000F06D056F8040B022400F0A9FC5C45F3 +S315080011500CD0B24602345AF8040B00F0A1FC7068B1 +S3150800116000F09EFC5C450AF10406F2D1786B40F269 +S315080011701A61014008EB840809EB84090029C4D0E8 +S31508001180082000F095FC58B30820042500F09AFCC6 +S315080011902846BDE8F88FD8F8000000F081FCD8F89A +S315080011A0040000F07DFCD8F8080000F079FCD8F8B7 +S315080011B00C0000F075FCD8F8100000F071FCD8F8A7 +S315080011C0140000F06DFCD8F8180000F069FCD8F897 +S315080011D01C0000F065FC08F1200809F120098EE7DB +S315080011E0022000F065FC20B1022000F06BFC02250D +S315080011F05FE7102000F05CFC20B1102000F062FCD4 +S31508001200052556E74FF4007000F052FC10B90A4A5B +S3150800121010604EE74FF4007000F054FC072548E7CD +S31508001220E800002028010020B40100201401002055 +S31508001230A0010020EC0000200000002038B504467C +S31508001240E0B1104A104B10680D250204402183E8CE +S3150800125024001846996000224FF48061DA6019610B +S3150800126000F0D0FB2846FFF731F8054608B12846B6 +S3150800127038BD00F0E7FB2060284638BD26252846FD +S3150800128038BD00BF44010020A001002000B583B08E +S3150800129000230193FFF78AF9012802D0FF2003B043 +S315080012A000BD01A8FFF7CAFF0028F7D10198C0F3CF +S315080012B04320F4E708B5FFF7E9FF042804D0FF2820 +S315080012C014BF0120022008BD002008BD10B596B045 +S315080012D0FFF712FD044628B1074B01221A700320B6 +S315080012E016B010BD04490A78684602F0FE030B7072 +S315080012F0FFF72EFB2046F3E70400002010B5084C44 +S315080013000123237008B1207810BDFFF7D3FF00280A +S31508001310F9D1207800F0FE012170207810BD00BFB9 +S3150800132004000020F0B50E46ADF5037D1546D8B984 +S315080013305C1EE4B2C3B14FF400776219009702A8A5 +S3150800134052020023FFF790FD70B9FFF7B3FF01289B +S31508001350FBD006EB442002A94FF4007208F07EFC8D +S3150800136034B1601EC4B2E8E701200DF5037DF0BD77 +S315080013702046FAE7F0B50D46ADF5037D1646E8B901 +S315080013805C1EE4B2D3B14FF400774FF4007205EB5C +S31508001390442102A808F062FCA219009702A852028A +S315080013A00023FFF755FE08B1052807D1FFF782FF8E +S315080013B00128FBD034B1601EC4B2E6E701200DF562 +S315080013C0037DF0BD2046FAE710B5164B1B78DB0700 +S315080013D098B0044602D5032018B010BD032906D8D4 +S315080013E0DFE801F003020D0770B10020F4E70420DE +S315080013F0F2E70028F9D1202010602046ECE74FF4E8 +S31508001400007111800020E7E702A80192FFF7A0FA11 +S31508001410149A159B500A019A40EAC3511160204656 +S31508001420DAE700BF040000200020C4F2AA207047B3 +S315080014304FF46053C4F202030022196841F0010018 +S3150800144018609A60186843F2100120F0847020F43E +S315080014508030C2F2004118605960196882B021F4E0 +S3150800146080201860DA60009201921A6842F480318E +S315080014701960184603E00099B1F5A06F09D0036812 +S3150800148003F40032019200994B1C0093019A002A3A +S31508001490F1D04FF46050C4F20200036813F400322E +S315080014A00DD001210191019801280CD04FF46D430C +S315080014B0CEF200034FF00061996002B070470192C6 +S315080014C001980128F2D14FF46053C4F202034FF495 +S315080014D0E042196CC4F2000241F0805018641168A9 +S315080014E041F4404010609A689A60996841F4004057 +S315080014F09860996845F20C4241F4A050C0F24072D7 +S3150800150098605A60196841F080721A601846016836 +S315080015104FF460538A01C4F20203F8D54FF47052AF +S31508001520C4F2020240F205601060996821F00302D5 +S315080015309A60986840F0020199609A6802F00C0077 +S315080015400828FAD1B2E700BF4FF47053C4F2020379 +S315080015501A69002A09DA40F2231148F6AB10C4F2D8 +S315080015606751CCF6EF505960586070474FF4705386 +S31508001570C4F202031A6942F000401861704700BFBE +S315080015804FF47053C4F20203D86070474FF4705397 +S31508001590C4F20203DA68D0030AD4D868C10601D5B2 +S315080015A005207047D96811F0EF0F03D00620704761 +S315080015B001207047DB6813F0020F0CBF08200720D4 +S315080015C0704700BF00B583B008238DF80730FFF7D2 +S315080015D0DDFF8DF807009DF807000128F7D09DF874 +S315080015E0070003B000BD00BF70B505460E46FFF7FD +S315080015F0E9FF082800D070BD4FF47054C4F2020405 +S31508001600236923F440702061216941F40072226144 +S31508001610236943F0010020612E60FFF7D3FF21699B +S3150800162021F00102226170BD70B5054600292ED051 +S31508001630012932D0022914BF4FF440764FF40076C0 +S31508001640FFF7C0FF082827D14FF47054C4F20204EC +S31508001650236923F44070206121690E4326612269BB +S3150800166022F0F8032361206940F002010D43256149 +S31508001670226942F480332361FFF7A4FF216921F030 +S3150800168002022261236923F0F801216170BD0E462A +S31508001690FFF798FF0828D7D070BD4FF48076F7E794 +S315080016A02DE9F00F0E6884B00022884613464FF0E5 +S315080016B0010B00968A4607E0DDF80490A14539D06B +S315080016C04B1CAA1C102B54D0009E0BFA03F5591C70 +S315080016D005EA060C0BFA01F42640AC45019602F120 +S315080016E00205E9D1032606FA02F907689AF8048082 +S315080016F06FEA09094E463E4006600768CDF80C9029 +S3150800170008FA02F908F1FF3849EA0709B8F1010FA2 +S31508001710C0F8009031D9C368039F9AF807C0DDF86E +S3150800172004903B40C360C3680CFA02F21A43A14511 +S31508001730C260C5D1032304689AF80420AB40DB4392 +S315080017401C400460046802FA05FC013A4CEA0404E9 +S31508001750012A046033D9C2689AF807401340C36067 +S31508001760C26804FA05F31343C3604B1CAA1C102B6A +S31508001770AAD104B0BDE8F00F7047D0F80880039EE0 +S315080017809AF806709AF8059006EA0808C0F80880DC +S31508001790D0F8088009FA02F949EA0808C0F808806A +S315080017A0D0F8048028EA0C0CC0F804C0D0F80490DD +S315080017B007FA03F39FB247EA09034360ABE7866873 +S315080017C09AF805709AF806201E408660846807FA1B +S315080017D005FC4CEA040686604768019E27EA060768 +S315080017E04760446802FA01F292B222434260B2E7C5 +S315080017F0036919420CBF002001207047CB08083343 +S3150800180001F0070130B4890050F823500F2404FA78 +S3150800181001F425EA040440F8234050F8234002FA6C +S3150800182001F2144340F8234030BC70474FF460532C +S31508001830C4F2020310B49A6802F00C01042922D0FB +S31508001840082926D04FF41052C0F2F40202604FF471 +S315080018506053C4F2020321499C68C4F303140C5D67 +S3150800186022FA04F242609C68C4F382240C5D22FAD0 +S3150800187004F484609B68C3F34233C95C22FA01F21C +S31508001880C26010BC70474FF4D852C0F2B70202606B +S31508001890DDE75C68596814F4800F5C6801F03F0264 +S315080018A014BF4FF4D8534FF41053C4F388114FF4B0 +S315080018B0605414BFC0F2B703C0F2F403C4F20204C2 +S315080018C0B3FBF2F303FB01F26168C1F301435C1C4D +S315080018D06100B2FBF1F20260B9E700BF0800002020 +S315080018E04FF46053C4F202031A6B19B922EA0000D6 +S315080018F01863704710431863704700BF4FF460536E +S31508001900C4F202035A6B19B922EA000058637047F9 +S3150800191010435863704700BF4FF46053C4F2020384 +S315080019201A6C19B922EA0000186470471043186443 +S31508001930704700BF4FF46053C4F202035A6C19B9DA +S3150800194022EA00005864704710435864704700BF85 +S315080019504FF46053C4F202031A6919B922EA000067 +S315080019601861704710431861704700BF4FF4605301 +S31508001970C4F202035A6A19B922EA0000586270478B +S3150800198010435862704700BF08B501214FF4006044 +S31508001990FFF7ECFF4FF400600021BDE80840FFF7B1 +S315080019A0E5BF00BFF0B44FF43053D0F804C08268E6 +S315080019B0C76806680469017DC4F201034CEA02029D +S315080019C05D683A43324325F4FD40224320F07F0008 +S315080019D002430A435A60F0BC704700BF48F2A003AE +S315080019E0C4F22523186070474FF43053C4F201033C +S315080019F0186070474FF43053C4F20103186800F0BA +S31508001A00030070474FF430530268C4F2010330B440 +S31508001A109A6085684268C468D96800692A4321F4CF +S31508001A20FF61224321F0070102430A43DA6030BC12 +S31508001A30704700BF4FF43053C4F201031869C0B2AF +S31508001A40704700BF42F6144382B0C4F20103C018BF +S31508001A500022019201900199086802B0704700BF00 +S31508001A604FF430530268C4F2010330B45A62416835 +S31508001A709962C56882680469D96A40692A4322431B +S31508001A8021F0F70102430A43DA6230BC704700BF0F +S31508001A904FF43053C4F20103D3F88000704700BFF7 +S31508001AA04FF43053C4F20103C3F88000704700BFF7 +S31508001AB04FF43053C4F20103596B08420CBF00209F +S31508001AC0012070474FF43053C4F2010398637047FE +S31508001AD0DC23C4F227231860704700BF028ACB882C +S31508001AE022F440521204F0B5120C04461A434889EF +S31508001AF00F898E880D4689892282A38923F4B052DC +S31508001B0022F00C033E431A040643B3B2100C43EA10 +S31508001B100006A681A28A22F4407003041E0C0E4316 +S31508001B2085B0A6826846FFF781FE4FF48051C4F25D +S31508001B3001018C422CD04FF4A052C4F20102944207 +S31508001B4026D0A089029B06B2002E26DB2D6803EB61 +S31508001B50830101EB8102AB00B2FBF3F148F21F539C +S31508001B60A089C5F2EB13A3FB0156720900B26425DE +S31508001B701601002802FB151118DB0D013235A3FBEF +S31508001B800553C3F34312324391B2218105B0F0BD28 +S31508001B90A089039B06B2002ED8DA286803EB8306D1 +S31508001BA006EB86054200B5FBF2F1D7E7C8003230EE +S31508001BB0A3FB0013C3F342123243E5E7838929B92D +S31508001BC023F400510A04130C8381704799B241F437 +S31508001BD000528281704700BFC905CA0D82807047CE +S31508001BE08088C105C80D7047038819420CBF0020BC +S31508001BF00120704708B501214FF00070FFF7A8FED5 +S31508001C004FF000700021BDE80840FFF7A1BE00BFF5 +S31508001C104021016420214164802141664FF08061A2 +S31508001C2000234FF00072C0F880104FF080710360F7 +S31508001C3043608360C360036143618361C361036278 +S31508001C4043628362C362036343638363C3638364D8 +S31508001C50C364036543658365C36503668366C366B4 +S31508001C60036743678367C367C0F88420C0F8881092 +S31508001C704FF40011C0F88C10C0F8A4204FF48071FE +S31508001C804FF40032C0F89030C0F89430C0F898305D +S31508001C90C0F89C30C0F8A030C0F8A830C0F8AC2016 +S31508001CA0C0F8B010C0F8B430C0F8B830704700BFFC +S31508001CB04FF40042C4F2020202F58053116841F063 +S31508001CC008001060996941F480109861116841F024 +S31508001CD0040010609A6942F400519961986940F0CD +S31508001CE002029A61704700BF82B04FF40043C4F203 +S31508001CF00203002201921A69890102F01C02C00639 +S31508001D0042EA104001F4F862104340F001014FF630 +S31508001D10FE7019611A46C0F2040002E00199814278 +S31508001D2005D8019B591C01911369DB07F6D4019864 +S31508001D304FF6FF72C0F20402904207D04FF40043F8 +S31508001D40C4F20203596988B202B070470020FBE763 +S31508001D5010B44FF4004383B0C4F202030024019484 +S31508001D601C695A6104F01C04C006890144F0030486 +S31508001D7044EA104401F4F86004434FF6FE711A462B +S31508001D801C61C0F2040102E00198884205D8019B53 +S31508001D90581C01901369D807F6D401994FF6FF72BB +S31508001DA0C0F20402881A18BF012003B010BC70479D +S31508001DB02DE9F0414FF4004386B00022C4F2020335 +S31508001DC000928046019202A81D690C46FFF72EFD77 +S31508001DD003994FF45340CFF6CE604EF2BF120B185C +S31508001DE0C0F2E402934225F01C0500F2358145F065 +S31508001DF008054FF40043C4F2020320461D61002182 +S31508001E004FF40042FFF7A4FF002800F021814FF0AD +S31508001E1080600090009A2AB100994B1E00930098A2 +S31508001E200028F9D1D8F80010002900F031814FF6C2 +S31508001E30FE75C0F20405019B01215A1C2046019239 +S31508001E40FFF752FF00F0040081B211B9019BAB42C3 +S31508001E50F1D9019A4FF6FF70C0F20400824200F0F1 +S31508001E60F7800023204619464FF480520193FFF766 +S31508001E706FFF002800F0EC804FF6FE75C0F20405EF +S31508001E80019920464A1C01210192FFF72DFF00F017 +S31508001E90200083B213B90199A942F1D9019A4FF6E4 +S31508001EA0FF70C0F20400824200F0D2802046102162 +S31508001EB000240194FFF718FF00F00406B5B2002DC0 +S31508001EC000F007814FF40067C8F8207000F002039D +S31508001ED099B2002900F0F7800020C8F814000746D8 +S31508001EE008F1180393E80700D8F80460D8F8083012 +S31508001EF0D8F80C50D8F810401E4335432C432043DD +S31508001F00D8F82430D8F82860D8F82C4001430A437A +S31508001F104FF4004CC4F2020C1A43D8F83000DCF82F +S31508001F200050D8F834303243224348F20F110243A6 +S31508001F30CFF6207129401A430A433A43CCF80020C9 +S31508001F4008F148010FC9D8F83860D8F83C70D8F8B5 +S31508001F504050D8F84440374347EA050646EA0405A0 +S31508001F60284340EA010422431343CCF80430D8F846 +S31508001F705810CCF80810D8F85C70CCF80C70D8F863 +S31508001F806850D8F86440D8F86C00D8F87030DCF897 +S31508001F901860D8F87410D8F8602045EA040747EAAC +S31508001FA000051D434FF6417445EA0100344040EAF6 +S31508001FB0040343EA0246CCF81860D8F87C10D8F82F +S31508001FC0782041EA0207CCF81C70D8F88030D8F897 +S31508001FD08470D8F88850D8F88C4008F1900007C863 +S31508001FE047EA030646EA050343EA04054FF4104E9A +S31508001FF045EA0004C4F2020ED8F89C30DEF8180050 +S3150800200021430A4343F62375D8F8A01042EA03048D +S31508002010CFF6DE050C43054044EA0500CEF8180065 +S31508002020D8F8A450D8F8A830D8F8AC40D8F8B000FA +S31508002030D8F8B810D8F8B4202B4343F40003234348 +S3150800204003430B4343EA8200CEF80000012000E078 +S31508002050002006B0BDE8F0814FF24010CFF6E950F7 +S3150800206047F63F020B18C0F27D12934202D845F09C +S315080020700C05BEE64FF4F240CFF66C404FF4B4427E +S315080020800918C0F26222914288BF45F00405B0E6FD +S31508002090D8F82020D8F81430D00840EA530292B273 +S315080020A02046FFF755FE0028D2D06FF07F440094F3 +S315080020B0009E2EB1009F7D1E009500990029F9D13A +S315080020C0D8F814700CE74FF48042C8F81420174665 +S315080020D006E7C8F82050F9E64FF41043C4F20203A5 +S315080020E01A6842F001001860704700BF4FF41043A9 +S315080020F0C4F20203186800F0010070472DE9F043A6 +S315080021000121B3B04FF0F050FFF7EAFB4720012159 +S31508002110FFF7E6FB01214FF48040FFF70BFC012097 +S31508002120FFF7D6FC00208E2306460225C4F20200DD +S3150800213001A901938DF80A608DF808508DF80B6097 +S315080021408DF80950FFF7ACFA304601210B22C4F28C +S315080021500200FFF753FB30460B22C4F20200294661 +S31508002160FFF74CFB304603210B22C4F20200FFF7AF +S3150800217045FB30460B220721C4F20200FFF73EFB5F +S315080021804FF4C0504FF40062C4F2020001A9019254 +S315080021908DF80A608DF808508DF80B608DF8095097 +S315080021A0FFF77EFA0B214FF4C0500A46C4F202002C +S315080021B0FFF724FB4FF40060C4F2020001A932279E +S315080021C001978DF80A608DF808508DF80B608DF828 +S315080021D00950FFF765FA4FF400600121C4F20200C6 +S315080021E00B22FFF70BFB4FF400600421C4F2020038 +S315080021F00B22FFF703FB4FF400600B22C4F2020028 +S315080022000521FFF7FBFA4FF4C0504FF4C043C4F260 +S31508002210020001A901938DF80A608DF808508DF81F +S315080022200B608DF80950FFF73BFA4FF4C050C4F223 +S3150800223002000D210B22FFF7E1FA4FF4C050C4F259 +S3150800224002000E210B22FFF7D9FAFFF7D3FCFFF79E +S3150800225043FFFFF74BFF0128FBD003A8FFF7D8FC85 +S31508002260002641F219684CF2F1094FF400704FF05C +S31508002270004120254FF400624FF4804703960A96E2 +S315080022800D900E96119114951696179618960B9210 +S315080022900897C0F22208C0F2070913E04C4523D07C +S315080022A0BDB22846FFF720FD032160F31F442846E8 +S315080022B0FFF71AFD60F30F04444515D04C4513D0BB +S315080022C0202E3DD0B5B202212846FFF70DFD032189 +S315080022D060F31F442846FFF707FD60F30F04771CD9 +S315080022E0022144450E44D9D103A82946FFF760FDCB +S315080022F020B9144840F2471102F072FF4FF410401B +S31508002300114A124C124B9460C4F20200002111606B +S315080023105160D2600261402259605A719A881960E8 +S315080023204FF4C86161F30C020A499A8080229960C9 +S31508002330DB60DA70C360FFF7BBFC33B0BDE8F0833F +S315080023403546D1E7589D000800090020800900207D +S31508002350000200208002002042F67063C2F20003E9 +S315080023600822002027211A705870997069225B206C +S315080023704521DA7018715971704700BF38B50E4C8F +S31508002380E37803F08000C1B211B10025284638BDB4 +S3150800239065880A490A48AA04950C2A4607F05EFC8D +S315080023A0E0784FF41043C4F2020340F080010122A2 +S315080023B0E17028469A6038BD00020020800200209D +S315080023C014280020F8B5104CE57805F08000C5B251 +S315080023D0C5B90E4E0E4F0F493A88304607F03EFCF7 +S315080023E03B88656019054FF41042080DC4F20202D5 +S315080023F0A0801023B02101202560A660A370E1709B +S315080024005060F8BDFEE700BF0009002080090020E3 +S315080024100828002014280020D0F8E83510B504460E +S3150800242018698047032184F81211002010BD00BFE7 +S3150800243008B590F81221D0F8E83580F81321042160 +S3150800244080F81211D8688047002008BD08B5D0F872 +S31508002450E435D96901B18847002008BD08B5D0F828 +S31508002460E435196A8847002008BD00BF08B5D0F8CA +S31508002470E435596A8847002008BD00BFD0F8E8351A +S3150800248010B5044658698047012184F815110020C3 +S3150800249010BD00BFD0F8E83510B5044698698047E6 +S315080024A0D4F8E41520464A6800219047002084F8AD +S315080024B0150110BD002110B50B460446402201F057 +S315080024C013F9802140220023204601F00DF9D4F8A3 +S315080024D0E835A078012284F8122159688847002037 +S315080024E010BD00BF10B582B06946044600F030F949 +S315080024F09DF8001001F01F03012B0FD009D3022B02 +S3150800250011D0204601F0800101F068F9002002B0E0 +S3150800251010BD2046694600F0D1F9F7E7204669461E +S3150800252000F0B2F9F2E72046694600F041F9EDE716 +S3150800253070B5044649B990F81131022B19D094F8B0 +S31508002540161101290CD0002070BDD0F8E4355B695E +S31508002550002BF8D090F81221032AF4D19847F2E715 +S3150800256021482369026800215A60002084F8161160 +S3150800257070BDD0F83821D0F824319A4211D9C078E4 +S31508002580D4F828110128C3EB020208BFC918C4F8F9 +S31508002590382108BFC4F82811204692B200F0A4F8E2 +S315080025A0CDE7D0F83C51B5FBF3F603FB16565EB9FA +S315080025B0AB4209D8D0F84021954205D2324600F000 +S315080025C093F8C4F84061BAE7D4F8E405C16819B1CC +S315080025D094F81231032B03D0204600F0A9F8AEE791 +S315080025E020468847F8E700BFC00F002010B504460C +S315080025F029B990F8111103290CD0002010BDD0F884 +S31508002600E4359B69002BF8D090F81221032AF4D1FF +S315080026109847F2E7D0F89023D0F87C339A4214D939 +S31508002620C078D4F880130128C3EB020208BFC91882 +S31508002630C4F8902308BFC4F880139A4228BF1A46E4 +S31508002640204692B200F05AF8D7E7D0F8E4150B699D +S315080026501BB190F81221032A03D0204600F058F83F +S31508002660CBE79847F9E700BF2DE9F041069D0446F8 +S3150800267016461F46884601F0B3FC20464146C4F874 +S31508002680E475C4F8E855C4F8EC6500F0DDFFD4F845 +S31508002690E835186880472046BDE8F04101F0F8BCE7 +S315080026A0D0F8E43510B504461A689047D4F8E8051A +S315080026B081688847002010BD08B5D0F8E4355A6807 +S315080026C09047002008BD00BF13460A46022110B5F0 +S315080026D0C0F83C31C0F8383180F8111100210446A1 +S315080026E001F05EF8002010BD10B50C461346002117 +S315080026F0224601F055F8002010BD00BF10B50C4663 +S3150800270013460021224601F02BF8002010BD00BF19 +S3150800271038B50021042504460A460B4680F81151AF +S3150800272001F03EF8204600F071FF002038BD00BFDA +S3150800273038B50021052504460A460B4680F811518E +S3150800274001F00EF8204600F061FF002038BD00BFFA +S3150800275090F8CC350B7090F8CD254A7090F8CE35A8 +S3150800276090F8CF2503EB02224A8090F8D03590F8EE +S31508002770D12503EB02228A8090F8D23590F8D3252A +S3150800278003EB022293B2CB800121C0F8403180F8D6 +S315080027901111704710B58021044601F01FF8204634 +S315080027A0002101F01BF82046BDE8104000F02EBFBE +S315080027B070B54B788A88012B0C460546D6B21CD0D4 +S315080027C003D3032B25D0002070BD90F81231022BBD +S315080027D017D0032B23D1130646D406EB860600EB47 +S315080027E0C60696F87603002848D1264A1060284679 +S315080027F024490222FFF768FFE5E790F81231022B19 +S3150800280011D1002EDFD0802EDDD0314600F0E6FF54 +S31508002810D9E790F81221022AF3D0032A19D0FFF734 +S31508002820B9FF002070BD032BF9D14A88002ACAD106 +S3150800283056B1802E08D0314600F0F0FFD5F8E415E1 +S3150800284028468B68214698472846FFF761FF0020EF +S3150800285070BD49880029F1D1002EEFD0802EEDD029 +S31508002860314600F0BBFFE9E702F07F0202EB820186 +S3150800287000EBC10393F81E010028B6D001490120D8 +S315080028800860B4E7C810002038B590F81231032B59 +S3150800289004460D4603D0FFF77DFF002038BD0A79B0 +S315080028A0012AF8D8D0F8E4359A689047E8880028CD +S315080028B0F3D12046FFF72CFFEFE700BF70B54B7842 +S315080028C082B00C460546092B11D8DFE803F0374AD3 +S315080028D0105F107492100517E288012A07D190F844 +S315080028E01211022900F02C81032900F0D280284613 +S315080028F02146FFF74FFF002002B070BDA178A54E14 +S3150800290001293170F3D890F81201022800F01C81D1 +S315080029100328ECD1002900F0318195F8101101291E +S3150800292008D02846FFF7C8FE3178284685F81011E2 +S31508002930FFF7B6FE2846FFF7EBFEDCE790F8121124 +S31508002940881E0128D3D8944BD5F81821012119607F +S315080029500AB10320186028468F490222FFF7B4FE01 +S31508002960C9E790F81201831E012BC0D86188012996 +S31508002970C1D1D5F8E40500228368C5F81821284690 +S31508002980214698472846FFF7C3FEB4E76388012B1C +S3150800299000F0EE80022BAED1A18811F0FF0FAAD16C +S315080029A00269080A431E5268042B7AD8DFE803F046 +S315080029B0828A868E7600A188002998D1E088002828 +S315080029C095D1668895F8122106F07F03032A1E46DC +S315080029D08DD0284685F81431194600F03FFF284661 +S315080029E0FFF796FE002E00F0BF80022085F8120140 +S315080029F081E76088020A531E062B3FF678AF01A1CD +S31508002A0051F823F0712A0008332A0008212A000801 +S31508002A10EF280008EF280008EF280008EF2800082C +S31508002A20C1B205293FF663AFDFE801F081786F662A +S31508002A305D54D5F8E435A8789A6A0DF106019047F1 +S31508002A40014602204870C5F8F015BDF80630002B7F +S31508002A503FF451AFE288002A3FF44DAF934228BFB6 +S31508002A60134628461A46ADF80630FFF72DFE42E70C +S31508002A70D5F8EC15A8780B680DF106019847E28899 +S31508002A80402A014603D095F812010128DDD1082312 +S31508002A90E1E700F58871FFF717FE2CE7052161F3DA +S31508002AA0061201233D4985F8163128460A60FFF7C4 +S31508002AB02FFE20E7012060F30612F2E7032363F3F3 +S31508002AC00612EEE7022161F30612EAE7042060F334 +S31508002AD00612E6E7D5F8EC25A87893690DF1060104 +S31508002AE098470146B1E7D5F8EC15A8784A690DF17B +S31508002AF0060190470146A8E7D5F8EC35A8781A6983 +S31508002B000DF10601904701469FE7D5F8EC15A87820 +S31508002B10CB680DF106019847014696E7D5F8EC25EE +S31508002B20A87893680DF10601984701468DE7D5F810 +S31508002B30EC15A8784A680DF106019047014684E726 +S31508002B401749FFF7C1FDD6E600293FF4F3AE012188 +S31508002B50032385F8101185F812312846FFF7A0FDE2 +S31508002B602846FFF7D5FDC6E6012185F81211C2E60B +S31508002B70D0F8E425C0F81831936800E7022285F8F2 +S31508002B80122185F810112846FFF796FD2846FFF70B +S31508002B90BFFDB0E6CC100020C4100020C00F0020F6 +S31508002BA0D010002030B4F0B10378F3B10446002306 +S31508002BB014F8015F0133DBB2002DF9D15C00A31CC8 +S31508002BC0DCB2138003220C704A7002785AB10223D1 +S31508002BD000255C1CE4B2CA540D5510F8012F0233C7 +S31508002BE0DBB2002AF5D130BC704702242346E8E759 +S31508002BF030B5054683B000230320019301F04AFA55 +S31508002C00EB681A694FF454640192C0F203040FE0AA +S31508002C1001F040FAEB681A6901920199032000292C +S31508002C200CDB01F037FAEB681969013C019124D0F5 +S31508002C3001990320002904F1FF34E9DA019840F0EC +S31508002C40010201920199196118694FF454620190C1 +S31508002C50C0F2030208E0186901900199C90709D56D +S31508002C601869013A019005D0019911F0010F02F196 +S31508002C70FF32F0D1032001F00DFA002003B030BD79 +S31508002C8010B4C47814BB00EB820003339B10D0F851 +S31508002C90D0001BD051F8042B026001225C1E0431BF +S31508002CA0934204F0010411D034B151F8044C0222C5 +S31508002CB004319342046009D051F8044C046051F879 +S31508002CC0044B0232043193420460F5D1002010BC53 +S31508002CD0704700BF033270B49510D0F8D0401ED0AC +S31508002CE00B4620686A1E43F8040B02F00100012215 +S31508002CF00433954211D030B12068022243F8040CFF +S31508002D000433954209D0266843F8046C266843F8CC +S31508002D10046B023204339542F5D101EB850108466E +S31508002D2070BC70472DE9F00F0023012240240129C9 +S31508002D3084B0C3708270848000F0BF80002900F0E0 +S31508002D4099800178427800914FF40064C360046169 +S31508002D50002A00F0D4804FF460654FF488664FF47B +S31508002D6080610395029601919B464FEA421AAAF1A1 +S31508002D70200220230BF510650BF53066C2F34014CC +S31508002D80021D5345856146651ED04CB10BF512648C +S31508002D900BF532614023946151650432534513D0D3 +S31508002DA0814603F1200705EB030806EB030CE81937 +S31508002DB04033F719C2F81880C2F854C0D061976535 +S31508002DC008325345EDD14846019C00994461029C5E +S31508002DD0C0F8CC40002945D0009D0BF5A06202EB57 +S31508002DE04515AC1A0BF5A463203CC0F89020021DCB +S31508002DF0AB42C4F3401111D031B1C2F890300BF593 +S31508002E00A8630432AB4209D003F12004C2F890301B +S31508002E104033C2F894400832AB42F5D1009C0BF51A +S31508002E20805202EB0435A91A0BF50053A1F580511F +S31508002E30C0F8D020021DAB42C1F3003112D031B127 +S31508002E40C2F8D03003F580530432AB420AD003F5FA +S31508002E508054C2F8D03003F50053C2F8D440083283 +S31508002E60AB42F4D10399C0F80C11002004B0BDE8B8 +S31508002E70F00F70470C254FF4A0660023C172057049 +S31508002E80C6804FF4606100954FF480664FF48865FC +S31508002E9006224FF40064C4F20403C4F20401C4F227 +S31508002EA00405C4F204064270039102950196C4F221 +S31508002EB004049B46C360046157E708250226C172CD +S31508002EC04FF4A0710570C18006724FF460610095D9 +S31508002ED04FF480664FF4886504224FF400644FF07F +S31508002EE0A043C5F20001C5F20005C5F2000642700E +S31508002EF0039102950196C5F200049B46DAE74FF462 +S31508002F0060634FF488614FF48064039302910194DF +S31508002F10934659E738B5037A0025012B04461ED097 +S31508002F20C168CA6842F04003CB60FFF761FE607A69 +S31508002F30E16800280CBF4FF450224FF4E8128A6368 +S31508002F40142001F0B5F8E278012A06D1E068816814 +S31508002F5021F03E0343F02A028260002038BDC06893 +S31508002F60617A836B65F3104309B143F48013836375 +S31508002F70C2686FF386126FF396526FF351426FF37E +S31508002F80D342C2602046FFF733FEE0780128E4D139 +S31508002F90052161F34405E36845F020059D60D2E705 +S31508002FA0C3689A6842F0010098600020704700BF25 +S31508002FB0C3689A6822F0010098600020704700BF35 +S31508002FC000B583B000230193019A42F020030193D0 +S31508002FD0019A61F38A1201920199C2681161106916 +S31508002FE04FF454630190C0F2030308E0106901909E +S31508002FF00199880609D51069013B019005D0019908 +S3150800300011F0200F03F1FF33F0D1032001F042F84D +S31508003010002003B000BD00BF00B583B000230193B4 +S31508003020019941F010020192019BC0680361016990 +S315080030304FF454630191C0F2030308E0016901915A +S31508003040019AD10609D50169013B019105D0019A7A +S3150800305012F0100F03F1FF33F0D1032001F01AF834 +S31508003060002003B000BD00BFC26808B5D3680129B7 +S315080030706FF35D736FF39E7308D009B943F080430D +S315080030803220D36001F014F8002008BD43F0005345 +S31508003090F6E700BFC368586900F0010181F0010036 +S315080030A0704700BFC3685A6998691040704700BFE7 +S315080030B030B4C3684FF4006200216FF08044C8F250 +S315080030C000024FF0FF3599615C615D605C619A6151 +S315080030D0C27898698A4214BF0C4610240C2244F41C +S315080030E08724C4F23802224320EA0200104398617A +S315080030F0084630BC704700BFF8B50546D0F80C0145 +S315080031002A6900210160166861F3CC2616600B4611 +S31508003110E97A012956D010212846FFF751FF28469B +S31508003120FFF77AFF2E6900224FF0FF333261726192 +S31508003130B361F2616878002830D029462C46964655 +S31508003140FF27A3691868C0F3076000F08000C0B2C3 +S31508003150002814BF4FF0904000201860C3F810E014 +S315080031609F606B78013204349342EAD8B3B10022E7 +S315080031701746FF244B6D1868C0F3076000F08000FF +S31508003180C0B2002814BF4FF09040002018601F619D +S315080031909C606B78013204319342EBD8306940F475 +S315080031A080733361EA78012A07D102F58171C0F28A +S315080031B00101402060F3594131632846FFF778FF43 +S315080031C00020F8BD1668E868A02780244FF400118F +S315080031D067F30F0346F00306166064F31F4364F3B0 +S315080031E00F014FF4907244628162C0F8043162F3B1 +S315080031F00F03C0F220034FF4A071C0F8083161F341 +S315080032000F036FF31F43C0F80C3184E7036998680E +S31508003210C0F341014B1E022B02D8024AD05C70470C +S3150800322003207047C49D000803698269986811687D +S31508003230C0F34100022808D06FF30A0111605A68EA +S3150800324042F48071596000207047032060F30A0138 +S31508003250F4E700BF70B44B780022012B24D00B781A +S3150800326000EB8304012505FA03F3646D63F31F423B +S315080032702368C3F3072505F08005EDB26DB98E689E +S31508003280CD78C98866F30A0365F3934361F39953C6 +S3150800329043F0805343F4004121600069C3691A432F +S315080032A0C261002070BC70470C7800EB840503FAF5 +S315080032B004F363F30F02AC69DAE700BF30B44A7867 +S315080032C00023012A1C4613D00A7800EB8201012547 +S315080032D005FA02F2496D62F31F4400696FF3CF33B2 +S315080032E00B60C36923EA0404C461002030BC70473C +S315080032F0097800EB810502FA01F262F30F04A96965 +S31508003300EBE700BFF0B44B78012B3ED00A784D6945 +S3150800331000EB8204636D1C681A69EDB18F68EE19BB +S31508003320751EB5FBF7F5AE05B60D65F3DC4207FB72 +S3150800333006F666F312021A61C378012B16D0CB780B +S31508003340012B1CD0097800EB810044F00444436D3E +S315080033501C600020F0BC70478D6865F312020125D9 +S3150800336065F3DC421A61C378012BE8D10A780B6948 +S3150800337000EB8202526D5361CB78012BE2D14A7978 +S31508003380002A67D044F00054DCE70E784A6900EB5F +S315080033908605AD692E682C69002A56D08B68CF78C9 +S315080033A002EB030C0CF1FF3C62F31204BCFBF3F3D3 +S315080033B063F3DC44012F08BF67F35E742C61C4789D +S315080033C0012C51D0CB78012B47D052B103690C7828 +S315080033D05D6B012707FA04F42C435C63CB78012B59 +S315080033E03BD00C7800EB840346F004469C692660C3 +S315080033F0CC78012CADD1C578CB680978002DA8D139 +S3150800340092B200EB8100D11C8A10D0F8D000A0D06F +S3150800341053F8041B551E0433012A016005F0010503 +S31508003420214696D035B153F8044C022104338A421A +S3150800343004608ED053F8044C046053F8044B0231F0 +S3150800344004338A420460F5D183E762F3120463F316 +S31508003450DC44B3E744F0805474E70469A368DC05E8 +S3150800346009D446F00056BCE70C780B6900EB8404D7 +S31508003470A4696361B2E746F08056B2E7F0B44B78C8 +S31508003480012B82B02DD00C784A6900EB84056B6D50 +S315080034901D681E690096F2B18E689DF800409DF879 +S315080034A002204E6166F30604012666F3C4028DF80F +S315080034B000408DF80220009A1A61C378012B3FD08C +S315080034C0097800EB810045F00442436D1A6000203C +S315080034D002B0F0BC70479DF800409DF802208E6847 +S315080034E0E0E782694C69166815690095002C2ED0AC +S315080034F08B689C423FD99DF800404B6163F30604F4 +S315080035008DF800409DF80230012464F3C4038DF859 +S315080035100230009B1361C378012B25D046F0044383 +S315080035201360C278002AD2D14B69002BCFD0036929 +S315080035300A78596B012000FA02F20A435A63C6E771 +S315080035400A780B6900EB8202526D5361B8E79DF861 +S3150800355000709DF8025064F3060763F3C4058DF8FE +S3150800356000708DF80250D4E70C780B6900EB8404E0 +S31508003570A4696361D2E79DF8003064F306038DF809 +S315080035800030BFE74B780978012B00EB810006D0A5 +S31508003590436D1A6842F4001119600020704780696B +S315080035A00368C3F3076202F08001CAB20AB143F0A6 +S315080035B0804343F400110160002070474B78012BCB +S315080035C00B78C97800EB83000CBF8269426D1368DB +S315080035D0881E6FF35553012898BF43F08053136034 +S315080035E00020704703699A69D8691040000C704733 +S315080035F000EB810102694B6D996850690840704774 +S3150800360003699869D969084080B2704782B0012277 +S31508003610002362F3C40300210091C0228DF8023012 +S3150800362018238DF803208DF80030416D009A0A6141 +S31508003630C378012B06D100F2CC5048610A684FF0D6 +S3150800364080220A6002B0704770B50446FFF76AFB2D +S3150800365062780126002384F8126184F814318AB34B +S315080036601946402503EB830004EBC00282F81C319F +S31508003670A2F8223182F81D6182F81F11C2F824517E +S31508003680C2F82811C2F83011607801339842E9D897 +S31508003690C0B100231946402503EB830204EBC200A0 +S315080036A080F87433A0F87A3380F8751380F87713A6 +S315080036B0C0F87C53C0F88013C0F8881362780133C9 +S315080036C09A42E9D82046FFF773FC2046FFF722FC0A +S315080036D000212046FFF7C8FC2046FFF70DFD2046CF +S315080036E0BDE87040FFF75CBC38B501F07F0404EB19 +S315080036F08405090600EBC50511D405F55D7185F845 +S315080037007443002405F55C754C708A60CB70022BF7 +S3150800371001D100230B71FFF79DFD002038BD05F58B +S315080037208E7185F81C4101254D708A60CB70CC805E +S31508003730EDE700BF08B501F07F03CAB203EB8301CA +S3150800374000EBC10112F0800F14BF01F58E7101F56F +S315080037505D71D2090B704A70FFF7B0FD002008BDF5 +S3150800376070B501F07F0404EB840500EBC50505F58B +S315080037705D71002685F87443CA604B618E614E7090 +S31508003780C378012B05F55C7508BF0A611CB1FFF704 +S31508003790B9FD002070BDFFF771FE002070BD00BFA7 +S315080037A070B501F07F0404EB840500EBC50505F54B +S315080037B08E710126CA600A61002285F81C414E7086 +S315080037C005F58C758A614B611CB1FFF79BFD0020DE +S315080037D070BDFFF753FE002070BD00BFCAB21306C6 +S315080037E010B511D401EB810300EBC30404F55D7336 +S315080037F001F07F01D209012419709C705A7019468C +S31508003800FFF7C0FE002010BD01F07F0101EB810427 +S3150800381000EBC40303F58E73ECE700BFCAB210B51C +S31508003820140611D401EB810300EBC30404F55D73A0 +S3150800383001F07F010024D20919709C705A7019464C +S31508003840FFF7BCFE204610BD01F07F0101EB8104A5 +S3150800385000EBC40303F58E73ECE700BF036900228F +S31508003860186861F30A1202431A60704703695A68B6 +S3150800387042F002005860032000F01ABC2DE9F04F10 +S3150800388085B00446FFF706FC10B905B0BDE8F08F11 +S315080038902046FFF707FC83460028F6D0C0F3074802 +S315080038A008F00800C0B2002840F0C48008F00408F8 +S315080038B05FFA88F3002B56D15FFA8BF505F0020301 +S315080038C0DAB212B1E16802264E61CBF3076303F060 +S315080038D08002D1B2002940F05C81CBF3072606F0BE +S315080038E00803D9B2002940F0228105F00802D3B2B4 +S315080038F0002B40F0128105F01005E9B2002940F0CE +S31508003900E58006F01003D9B2002940F0968106F04A +S315080039102006F6B2002E40F07881CBF3074505F075 +S315080039201003DAB2002A40F0658105F02005EDB2F1 +S31508003930002D40F05481CBF3076303F04002D1B267 +S31508003940002940F041810BF00403DAB2002A9CD02A +S31508003950E3685D6805F00401C8B2002840F01682E5 +S315080039605D60012091E72046FFF74AFE07460028DA +S315080039705ED026464FF00009CDF804B0A24626E0F0 +S3150800398003F00801CCB214B1B0690823836003F0D0 +S315080039901002D5B215B1B16910238B6003F040044B +S315080039A0E0B210B1B2694023936003F00205E9B2B0 +S315080039B011B1B4690223A36003F08000C2B2002AE1 +S315080039C040F0908104367F0809F101092DD0F807E7 +S315080039D0F8D5DAF810205FFA89F81469506B0AEB03 +S315080039E0880120FA08F58869EB018168DDB225436C +S315080039F00D40EBB2D907C3D540F21804C2F2000451 +S31508003A00536B2168012404FA09F023EA000353637F +S31508003A10B5694A68AC605046414690479AF80350E3 +S31508003A20A54200F09A812346AAE7DDF804B0544679 +S31508003A30012041E72046FFF7D5FD0546002843D07B +S31508003A40A2462646002705E0013704366D080AF126 +S31508003A50280A39D0EA07F7D55FFA87F92046494692 +S31508003A60FFF7C6FDC0B2C30716D5736D012199606D +S31508003A70E2788A4200F0818140F21800C2F2000022 +S31508003A804946036820461A68904794F80390B9F1A6 +S31508003A90010F00F06B81012000F00203DAB212B1C7 +S31508003AA0716D0220886000F00803DAB2002ACBD0D4 +S31508003AB040F21801C2F2000120460B689A68904746 +S31508003AC0716D08208860BFE70120EFE6E3689F690B +S31508003AD027F010029A611D6A05F00F0000EB8001BD +S31508003AE0C5F3434204EBC107022A07F55D7700F0E8 +S31508003AF0DB80062A0BD104F2CC5120460822FFF7B8 +S31508003B00E9F8B869E368C5F30A154119B96198690E +S31508003B1040F010029A610120F3E6A24801682046A7 +S31508003B20CA689047E368082058610120E3E69D4883 +S31508003B3094F81221036800215B698DF80F1020465E +S31508003B408DF80F2098472269E06891684FF4006362 +S31508003B504361A27ADAB1CB0719D594F81501012881 +S31508003B6015D19DF80F10032911D1D4F80C311A6814 +S31508003B7042F00100186019684FF46D42CEF2000257 +S31508003B8041F003001860136943F006011161012032 +S31508003B90ABE6A07A40B1D4F80C61D4F80C316FF3D7 +S31508003BA041066FF300061E6020697E4A4168166862 +S31508003BB021F001034360B16920468847E0684FF069 +S31508003BC000424261012088E67648036820465A6A20 +S31508003BD09047E1684FF0804048610120B3E671499B +S31508003BE00B6820461A6A9047E0684FF40011416155 +S31508003BF00120A0E66B4801682046CB699847E06833 +S31508003C004FF48012426101208FE62046FFF70CFB35 +S31508003C10E5682046ED68FFF7F9FA032859D0012030 +S31508003C2040220521A070A28061F38D25E168CD6050 +S31508003C304FF4005501204D616FE625696868002735 +S31508003C4020F001026A6020463946FFF7B9F9637821 +S31508003C505BB123463A46FF2599698D60586D8560A4 +S31508003C606178013204338A42F6D30125236965F364 +S31508003C700F070B204FF0FF3165F31F479961DF618E +S31508003C80586118611A686FF30A121A602046FFF71E +S31508003C90BDFC4448E36802684FF4805159612046E8 +S31508003CA013699847284632E647F6F0722A40002AF2 +S31508003CB03FF42DAFC5F30A152A46F9682046FFF7E3 +S31508003CC009F8F868BA69E36841195519F960BD61D8 +S31508003CD01DE700234FF400700922A370A08062F349 +S31508003CE08D25A3E709EB89050AEBC50101F58E7554 +S31508003CF0B1696A69A869AC68D1F818C0131AA342F1 +S31508003D0034BF9B46A3460BF1030E1FFA8CFCBCEB93 +S31508003D109E0F1FD982421DD9E2B1E96804E06C6999 +S31508003D209C4216D9E31AAC689C4228BF1C46A3B22B +S31508003D3042465046FEF7A4FFE968AB690919E3183D +S31508003D40E960AB61B0698269033492B2B2EB940F51 +S31508003D50E5D8014680258D6034E6B9F1000F03D118 +S31508003D609AF81131042B1FD02B4609E61FB994F88F +S31508003D701111052911D048468EE61869DAF87C3300 +S31508003D80C0F312015A1ACAF88C2375E6054B1A684D +S31508003D902046916A8847E368E2E52046FFF736FC45 +S31508003DA0E9E700BF180000205046FFF72FFCDBE7C5 +S31508003DB0704700BF704700BF704700BF0020012151 +S31508003DC008B5C4F20200FDF713FD10F1FF3018BF65 +S31508003DD0012008BD10B588B000240C480094694637 +S31508003DE0019402940394049405940694079404F0A9 +S31508003DF02DFB48B9009828B19DF8080080F01001FD +S31508003E00C1F3001008B010BD2046FBE7C89D0008A6 +S31508003E1049F6C850C0F60000704700BF10B5074CF9 +S31508003E200749002320460A2284F8243203F01AFFA1 +S31508003E3010B9012084F8240210BD00BFD410002058 +S31508003E40E89D000808B50B4890F82432012B0DD0E0 +S31508003E504FF4A050C4F201004021FDF7C5FE00282A +S31508003E60F6D00548BDE8084004F016BB04F022FA6F +S31508003E70EEE700BFD4100020C89D0008034890F85C +S31508003E802432012B00D0704704F014BAD410002055 +S31508003E9038B5144D95F82432012B044615D02178EF +S31508003EA091B14FF4A050C4F20100FDF795FE4FF40E +S31508003EB0A050C4F201008021FDF796FE0028F6D036 +S31508003EC014F8011F0029ECD138BD294604F092FBED +S31508003ED00028E4DA0021284685F8241204F0EAF9D5 +S31508003EE0DDE700BFD410002000B583B0FDF7A0FAC7 +S31508003EF001200146FDF7F4FC0020012402250646B0 +S31508003F006946C4F2020000948DF804608DF80760D3 +S31508003F108DF80550FDF7C4FB20202146FDF70AFD64 +S31508003F2004202146FDF7DCFC4FF40060C4F20200D1 +S31508003F3006210822FDF762FC4FF400600822C4F24D +S31508003F4002000721FDF75AFC4FF400604023C4F233 +S31508003F500200694600938DF806608DF807408DF8D3 +S31508003F6004508DF80550FDF79BFB4FF40060802246 +S31508003F70C4F20200694600928DF80450FDF790FBE2 +S31508003F8028462146FDF7ACFC4FF48060C4F20200D7 +S31508003F9005210922FDF732FC4FF480600922C4F29C +S31508003FA002000621FDF72AFC4FF480606023C4F264 +S31508003FB00200694600938DF804508DF805508DF877 +S31508003FC006608DF80740FDF76BFB4FF0C060214691 +S31508003FD0FDF7A2FC01F046F901F054F9FCE700BF31 +S31508003FE0F0B50120002483B0C4F202040146FDF7AF +S31508003FF077FC00264FF4C853032702226946204659 +S3150800400000938DF804208DF805708DF806608DF8FC +S315080040100760FDF745FB204608210A22FDF7EEFB5F +S3150800402020460B210A22FDF7E9FB0A2220460C212D +S31508004030FDF7E4FB01254FF400732046694600931B +S315080040408DF805708DF804608DF806508DF80760B8 +S31508004050FDF726FB694620464FF4806200928DF8EC +S3150800406006508DF807508DF80570FDF719FB0A21E3 +S315080040700A462046FDF7C2FB29464FF48040FDF765 +S3150800408059FC80202946FDF739FC03B0F0BD00BF76 +S31508004090704700BF10F1FF3008D31C2100BF4B1E2C +S315080040A000BF591EFAD110F1FF30F6D2704700BF93 +S315080040B04FF47A7303FB00F010F1FF3008D31C228B +S315080040C000BF511E00BF4A1EFAD110F1FF30F6D2CA +S315080040D0704700BF202340F248000B80C2F2000060 +S315080040E0704700BF08B590F81231032B01D00020A5 +S315080040F008BD00F095FF002008BD00BF08B500F018 +S315080041008FFF002008BD00BF084608B501F002F879 +S31508004110002008BD10B581210446FFF70BFB204699 +S315080041200121FFF707FB002010BD00BF10B5812154 +S31508004130044640220223FFF7D7FA01214022022330 +S315080041402046FFF7D1FA41F2FC2220460121C2F2AD +S3150800415000024023FFF704FB002010BD10B50A78C3 +S3150800416012F0600F0B46044606D14A780A2A05D093 +S315080041700B2A14D0062A07D0002010BD0F490122A9 +S31508004180FEF7A2FA002010BD4888010A21290ED0A0 +S315080041900B4917222046FEF797FA002010BD8B78A8 +S315080041A013B9064A1360E7E7FEF7F4FAE4E7DA8894 +S315080041B00449172A28BF1722ECE700BF3C13002042 +S315080041C0510000205A00002041F2FC20C2F20000F3 +S315080041D0704700BF122340F2B4000B80C2F2000001 +S315080041E0704700BF042340F2B0000B80C2F2000003 +S315080041F0704700BF10B540F6C474C2F2000449F611 +S31508004200F8500A46C0F600002146FEF7CBFC2046C9 +S3150800421010BD00BF10B540F6C474C2F2000449F6DA +S3150800422010600A46C0F600002146FEF7BBFC204691 +S3150800423010BD00BF10B540F6C474C2F2000449F6BA +S3150800424018600A46C0F600002146FEF7ABFC204679 +S3150800425010BD00BF10B540F6C474C2F2000449F69A +S3150800426028600A46C0F600002146FEF79BFC204659 +S3150800427010BD00BF10B540F6C474C2F2000449F67A +S3150800428038600A46C0F600002146FEF78BFC204639 +S3150800429010BD00BF704700BF704700BF704700BF22 +S315080042A00020FFF785BD00BF0120FFF781BD00BFD5 +S315080042B0FFF782BDFFF77EBD49F64C60C0F60000E9 +S315080042C03D2100F08DBF00BF08B500F0F3FA00B934 +S315080042D008BDFFF773FD0028FAD001F039F800F0A1 +S315080042E009FB00F0DBFA4EF60853CEF2000320F085 +S315080042F0604020F07F021A6000F0D0FA41688847D3 +S3150800430008BD00BFF8B5571EBFB20AB30E1A441C43 +S31508004310825DC343E719F918027001F0010501F03F +S3150800432067F8BC4215D035B1A05D04F8010B01F061 +S315080043305FF8BC420ED0A25D254605F8012B01F0B8 +S3150800434057F8AB5D63706C1C01F052F8BC42F2D1B1 +S31508004350F8BDF8BDF8BD00BF10B5044601F048F831 +S315080043604BF6FF73C0F600039C4205D94FF6FF7063 +S31508004370C0F60000844279D901F03AF84FF6FF7189 +S31508004380C0F600018C4205D94FF6FF72C0F601024D +S31508004390944269D901F02CF84FF6FF73C0F6010371 +S315080043A09C4205D94FF6FF70C0F6030084425FD9D8 +S315080043B001F01EF84FF6FF71C0F603018C4205D9CD +S315080043C04FF6FF72C0F60502944255D901F010F86F +S315080043D04FF6FF73C0F605039C4205D94FF6FF70EA +S315080043E0C0F60700844245D901F002F84FF6FF717E +S315080043F0C0F607018C4205D94FF6FF72C0F60902CE +S3150800440094423DD900F0F4FF4FF6FF73C0F6090356 +S315080044109C4205D94FF6FF70C0F60B0084422DD991 +S3150800442000F0E6FF4FF6FF71C0F60B018C4205D986 +S315080044304FF6FF72C0F60D0294420DD900F0D8FF70 +S315080044404FF6FF73C0F60D039C4203D90820B4F15A +S31508004450016F02D3FF2010BD07200A4A00EB400176 +S3150800446002EB8103187A10BD0120F6E70020F4E775 +S315080044700220F2E70420F0E70320EEE70620ECE747 +S315080044800520EAE7089F00082DE9F8430646006874 +S31508004490FFF762FFFF283AD0FDF756F8F320FDF73D +S315080044A06FF8FDF773F8012837D0002418E054F8A0 +S315080044B008202C1D974224D1D6F800804F6805EBBA +S315080044C0080900F095FF48463946FDF78DF8082893 +S315080044D017D155F80800874213D1B4F5007F1AD0D2 +S315080044E03319D6F800805F6804EB080900F080FFEE +S315080044F039464846FDF778F8251D082806EB0501D4 +S31508004500D5D00024FDF732F82046BDE8F88300240C +S315080045102046BDE8F8830124F4E7FDF727F80024D0 +S31508004520F2E700BF124A904238B504460D461CD041 +S315080045304FF44043C0F60003994208D0FFF7A4FFA2 +S3150800454010B1E805C10D19B10024204638BD14463E +S315080045502268954207D02046294640F8045B4FF466 +S315080045600072FFF7CFFE204638BD024CE9E700BFD0 +S3150800457040130020441500202DE9F84F0646006830 +S315080045804FEA512A9946431C0C4615464FEA4A2AD1 +S3150800459070D0824507D030465146FFF7C3FF06461E +S315080045A0002864D00068241A31190C1D371D00F044 +S315080045B01FFF40F2FF18E31B09F1FF3B43450BF0D1 +S315080045C0010B0AF5007A40D815F8012BB9F1010953 +S315080045D004F8012B2DD0BBF1000F0BD000F008FF1B +S315080045E0E01B40453AD815F8011BB9F1010904F852 +S315080045F0011B1ED000F0FCFEE31B434509F1FF3901 +S315080046001AD815F8012B04F8012B00F0F1FEE01B6F +S315080046104045E8D930465146FFF784FF0646071D50 +S3150800462028B33C4615F8011BB9F1010904F8011B2A +S31508004630E0D10120BDE8F88F30465146FFF772FFFA +S315080046400646071D98B13C46DBE730465146FFF75C +S3150800465069FF064658B1071D3C46B5E73046514640 +S31508004660FFF760FF064610B1071D3C46BBE7002072 +S31508004670BDE8F88F3046514640F804AB4FF4007257 +S31508004680FFF740FE306884E741F2445241F2403376 +S31508004690C2F20002C2F200034FF0FF311160196046 +S315080046A0704700BF70B504460D461646FFF754FE20 +S315080046B0FF2816D0601E4019FFF74EFEFF2810D0BF +S315080046C04FF44043620AC0F60003B3EB422F0CBF17 +S315080046D005480648214632462B46BDE87040FFF796 +S315080046E04BBF002070BD00BF4013002044150020BA +S315080046F0F8B505460E46FFF72FFE0446681E8019D4 +S31508004700FFF72AFEFF2C05464CD0FF284AD08442E4 +S3150800471048D8022C46D90B2844D8FCF715FFF320B5 +S31508004720FCF72EFFFCF732FF012837D0204E2B1B53 +S3150800473003F0010700F05CFE022136F81400FCF7CE +S3150800474073FF08282AD10134E4B2A5422CD3D7B185 +S3150800475000F04EFE022136F81400FCF765FF082823 +S315080047601CD1611CCCB2A5420DD21DE000F040FE62 +S3150800477036F814000221FCF757FF631C0828DCB240 +S315080047800CD1A54210D300F033FE022136F81400EE +S31508004790FCF74AFF621C0828D4B2E7D0FCF7E6FE0D +S315080047A00020F8BD0020F8BDFCF7E0FE0120F8BDAA +S315080047B0D89E0008F0B5104B1A68013283B019D09C +S315080047C003F114009F685E68DD681C6907C8BB1999 +S315080047D05B191B19181841188B1802AA584242F877 +S315080047E0040D4CF28810C0F600000421FFF75AFFAA +S315080047F003B0F0BD0120FBE7401300204CF2040093 +S315080048004FF440414CF20803C0F60000C0F6000120 +S31508004810C0F600034CF20C0270B4C0F600020D6834 +S3150800482004681E684CF21003C0F600034CF214012B +S315080048306019C0F6000115681C6809684CF2180270 +S315080048408019C0F600024CF288134019C0F600031E +S31508004850001912681B6841188A18D018D0F101008F +S3150800486038BF002070BC70470A4808B50368013392 +S3150800487002D0FFF709FE58B1074801684B1C05D05E +S31508004880FFF702FE003018BF012008BD012008BD51 +S3150800489008BD00BF40130020441500204FF44040D7 +S315080048A0C0F60000704700BFFFF7EEBEFFF7FABE7E +S315080048B0FFF71EBFFFF7A2BF08B5FFF77BFF00B9DA +S315080048C008BDBDE80840FFF7CFBF00BF4EF2100392 +S315080048D0CEF2000341F2487249F23F000021C0F2CD +S315080048E00200C2F20002196058600520996018603B +S315080048F0116070474EF21003CEF2000300221A60D0 +S31508004900704700BF4EF21003CEF200031868C303C7 +S3150800491003D502490A68531C0B60704748170020E4 +S315080049204EF21003CEF200030449186810F4803FD3 +S31508004930086802D0013008607047704748170020A1 +S3150800494038B505464FF4A0502021C4F20100FDF702 +S315080049504BF90128044602D00024204638BD4FF4FE +S31508004960A050C4F20100FDF73BF92870204638BD77 +S3150800497010B54FF4A05484B00023C4F2010469466C +S3150800498020464FF46142ADF80430ADF80630ADF874 +S315080049900830ADF80C300C230092ADF80A30FDF75C +S315080049A09DF820460121FDF709F904B010BD00BFA6 +S315080049B04029F8B50E4607464AD84FF4A050C4F227 +S315080049C001008021FDF710F9002830D123487B210A +S315080049D000F006FC56B3002407E0842101341F4882 +S315080049E000F0FEFBA3B29E421FD900F001FD4FF472 +S315080049F0A050C4F2010080213D5DFDF7F5F80028BE +S31508004A00EBD04FF4A050C4F201002946FDF7E4F8B4 +S31508004A104FF4A050C4F201008021FDF7E5F8002804 +S31508004A20F6D00134A3B29E42DFD8F8BDF8BD4FF4E4 +S31508004A30A050C4F201003146FDF7CEF84FF4A0505D +S31508004A40C4F201008021FDF7CFF80028F6D0C1E7AF +S31508004A500248772100F0C4FBAFE700BF749F000847 +S31508004A602DE9F041174D2C78804644B9164E30464C +S31508004A70FFF766FF01281CD00020BDE8F081134E21 +S31508004A80114F3078411C7818FFF75AFF0128044661 +S31508004A90F2D133783A78581CC1B28A423170EBD1D8 +S31508004AA04046791CFFF72EFC00222A702046BDE8F6 +S31508004AB0F0813378002BDFD0287004480470204634 +S31508004AC0BDE8F081911700204C17002090170020B0 +S31508004AD02DE9F04F594B83B000204FF4FA724AF291 +S31508004AE0104840F2FF3B1C18861C6178185C451874 +S31508004AF005FB022498FBF4FC04FB0CF4C4F52444DF +S31508004B000CF1FF35103403EB06091FFA85FA14B9C0 +S31508004B10DA4540F28F80985D99F80110451805FB33 +S31508004B20022498FBF4F504FB05F4C4F52444103478 +S31508004B301CB9013DACB25C457CD9B01C2428D2D145 +S31508004B403F48F02100F04CFB4FF0FF354FF4D044BE +S31508004B50C4F2000400236361226842F40041216024 +S31508004B602068020404D500F043FC23681804FAD42C +S31508004B704FF4D044C4F20004226822F002012160F6 +S31508004B80206840F0010323606268D30704D400F06C +S31508004B902FFC6168CA07FAD5019C013F601E3B05D8 +S31508004BA04FF4D044C4F2000443EA00473D43E561AC +S31508004BB0226822F0010121606068C10704D500F06F +S31508004BC017FC6368DB07FAD44FF4C840C4F2000048 +S31508004BD00022D0F8001241F00103C0F80032D0F8E4 +S31508004BE01C1221F48043C0F81C32D0F80C1241F490 +S31508004BF08043C0F80C32C0F8B022C0F8B422D0F80E +S31508004C00042222F48041C0F80412D0F8143223F4A6 +S31508004C108042C0F81422D0F81C1241F48043C0F830 +S31508004C201C32D0F8002222F00101C0F8001203B0AD +S31508004C30BDE8F08F01900F4688E700BF74A0000812 +S31508004C40F49F000838B54FF4D043C4F20003044675 +S31508004C50986843010D463BD54FF4D043C4F2000390 +S31508004C60D3F8802102F00101C3F88011D3F880013E +S31508004C7040F07C4242F40011C3F88011C3F8845115 +S31508004C80A278E57820786178120442EA056505433A +S31508004C9045EA0120C3F88801A279E5792079617986 +S31508004CA0120442EA0562024342EA0120C3F88C0173 +S31508004CB0D3F8801141F00102C3F8802198684001B9 +S31508004CC005D41C4600F094FBA3685901FAD538BDF3 +S31508004CD002484FF4A27100F083FABDE7F49F00087A +S31508004CE04FF4D043C4F20003DA6812F0030110D07F +S31508004CF0D3F8B01140F26762B2EB515F0BD00020D7 +S31508004D004FF4D043C4F20003DA6842F02001D960B8 +S31508004D10704708467047D3F8B8110170D3F8B82120 +S31508004D20110A4170D3F8B821110C8170D3F8B82153 +S31508004D30110EC170D3F8BC210271D3F8BC110A0A4E +S31508004D404271D3F8BC110A0C8271D3F8BC31190E22 +S31508004D50C1710120D4E700BF012838B504460D46C5 +S31508004D6004D9104840F29F1100F03AFA0E4A04EBB3 +S31508004D70440002EBC003197C5C7C8C4210D0DC68D2 +S31508004D8025705A7CD9685868541C4A1C82425C743F +S31508004D90DA6003D919680120D96038BD012038BD09 +S31508004DA0002038BD98A00008D8170020012838B57B +S31508004DB004460D4604D90F4840F2C11100F010FA16 +S31508004DC00D4A04EB440402EBC403587C80B199688D +S31508004DD0087828709A685C7C5868511C013C8142A6 +S31508004DE05C74996003D91A6801209A6038BD01205D +S31508004DF038BD00BF98A00008D81700202DE9F04F4D +S31508004E0041F6080585B0C2F200050395039E41F2F6 +S31508004E10D87441F69407C2F200044FF0010EC2F2AC +S31508004E2000074FF0400A06EB0E0C41F2D47807EB68 +S31508004E300A0640F2C803C2F20008C2F2000366601E +S31508004E40039E0093002541F6D80040F2940240F2F2 +S31508004E50680307EB0E0904F1180BA574E56265747F +S31508004E603D70C8F8005084F82950C2F200000CF1D1 +S31508004E703F057146C2F20002C2F2000386F800E05E +S31508004E80C4F814B084F82AE084F810A0C4F808908E +S31508004E90C4F80C90C4F8009084F828A0C4F820C080 +S31508004EA0C4F824C0C4F818C0E561FDF7DDFB05B0F9 +S31508004EB0BDE8F08F08B541F6D800C2F20000FEF74B +S31508004EC0D5FC0020BDE80840FEF772BF3F292DE952 +S31508004ED0F0418846074654D82D4E41463078FFF7AC +S31508004EE03BFF012803D02B48A32100F079F9B8F13C +S31508004EF0000F44D008F1FF3303F0010500F078FAFB +S31508004F0030783978FFF728FF012803D02148AC21EB +S31508004F1000F066F90124444531D27DB100F068FA03 +S31508004F203078395DFFF718FFA04203D01948AC2145 +S31508004F3000F056F90134A0B2404527D200F058FADD +S31508004F40395D3078FFF708FF651C01284FF0AC0182 +S31508004F50104801D000F044F900F04AFA795D30783B +S31508004F60FFF7FAFE01284FF0AC010A4801D000F01D +S31508004F7037F96C1CA1B24145E0D3BDE8F081BDE824 +S31508004F80F08104489F2100F02BF9A5E7BDE8F081E0 +S31508004F909418002098A000082DE9F0411B4D804682 +S31508004FA01B48FEF76BFC2C7854B91A4E1A48314642 +S31508004FB00078FFF7FBFE01281ED00020BDE8F0812F +S31508004FC0164E154B3178134F18784A1CB918FFF747 +S31508004FD0EDFE01280446F0D130783A78411CCBB270 +S31508004FE09A423370E9D14046791CFFF78BF90022C3 +S31508004FF02A702046BDE8F08131780029DDD0074BBC +S3150800500028701C702046BDE8F08100BF901800206B +S31508005010D818002050180020081800204C18002026 +S315080050202DE9F041364E3478012C82B004D9354842 +S3150800503040F2E11100F0D4F8334B04EB440003EBE3 +S31508005040C004617C002958D0402934BF88464FF0F7 +S31508005050400830782D4F0DF10701FFF7A7FE08F13C +S31508005060FF35012805F0010504D0264840F229112C +S3150800507000F0B6F89DF807200124A0453A7036D905 +S3150800508095B130780DF10701FFF790FEA04204D0E4 +S315080050901C4840F2291100F0A3F89DF8070038557E +S315080050A00134E3B2984522D90DF107013078FFF7AC +S315080050B07DFE651C012840F22911124801D000F036 +S315080050C08FF89DF80710307839550DF10701FFF76D +S315080050D06DFE012840F229110A4801D000F080F837 +S315080050E06C1C9DF80700E2B290457855DCD8084854 +S315080050F0064A81214346FEF753FB02B0BDE8F0811C +S315080051009418002098A00008D817002094170020AB +S31508005110D81800202F4B00EB800003EBC0012DE9C7 +S31508005120F041B1F88C73002F49D02B4E7A1E347893 +S3150800513002F00105FFF748F801782046FFF70CFE54 +S31508005140012804D025484FF4A47100F049F8012439 +S31508005150A74234D98DB13578FFF736F8015D284670 +S31508005160FFF7FAFDA04204D01C484FF4A47100F0E2 +S3150800517037F80134A0B2874221D996F80080FFF7A4 +S3150800518023F8015D4046FFF7E7FD651C01284FF44B +S31508005190A471124801D000F023F83478FFF714F808 +S315080051A0415D2046FFF7D8FD01284FF4A4710B484E +S315080051B001D000F015F86C1CA3B29F42DDD8FFF7AA +S315080051C003F80246034801214023BDE8F041FEF7F3 +S315080051D0C7BA00BFD81800200818002098A00008F1 +S315080051E008B5034B18600348016000F001F9FCE7B5 +S315080051F0CC1E0020D01E002010B500F0F5F80128BE +S3150800520006D000F00BFB18B10B4C2378012B00D00D +S3150800521010BDFFF785FB09490A6802F51C531033D0 +S315080052209842F5D30020207000F002FB0028EFD149 +S31508005230BDE81040FFF748B8D41E0020D81E00204D +S3150800524008B541F6D463C2F2000301221A70FFF7CB +S3150800525067FB41F6D861C2F200010860BDE8084064 +S31508005260FFF7CABF08B500F0C1F8FFF72FFBFFF735 +S315080052701BFB00F0BDFA00F013F8BDE80840FFF785 +S31508005280DFBF00BF08B500F0B3F8FFF73BFB00F03F +S31508005290E1FB00F01DF8BDE80840FFF7ADBF00BF11 +S315080052A010B540F2E404C2F2000400F0A3F8FFF7D8 +S315080052B00FFC01232370FFF75BFB00202070FFF72C +S315080052C09DFD0221217004F0B7FB0322227010BD58 +S315080052D008B51D48FFF704FD0128034617D01A48EC +S315080052E0FFF7BEFB01281CD01748FFF755FE01281B +S315080052F022D0154804F00CFC012800D008BD134B39 +S31508005300114803221A70BDE8084000F093B80F4A06 +S315080053100D48137000F08EF80B48FFF7A1FB012823 +S31508005320E2D10A4B08480021197000F083F80648B4 +S31508005330FFF732FE0128DCD10449034802220A702D +S3150800534000F078F8D5E700BFDC1E0020E400002056 +S31508005350FFF7B0BD70B5134C2378012B06460D46F2 +S315080053601BD03BB1022B0CD0032B11D0BDE87040EB +S3150800537000F058B83046E9B2FFF71AFB2378022B3B +S31508005380F2D13046E9B2FFF7A1FD2378032BEDD120 +S315080053903046E9B204F08CFBE8E7C9B2FFF752FCE5 +S315080053A02378DEE7E4000020054B1878411ECBB2CF +S315080053B0012B01D940207047024A32F81300704782 +S315080053C0E400002018A10008054B1878411ECBB24E +S315080053D0012B01D940207047024A32F81300704762 +S315080053E0E40000201CA1000800F012B8704700BFB6 +S315080053F0704700BF41F61C73C2F2000300221A7000 +S315080054009A6483F84320A3F844209A705A70704728 +S3150800541041F61C73C2F200031878003018BF012049 +S31508005420704700BF41F61C73C2F20003002283F8DE +S3150800543043207047F8B50578FF2D06463FD0A94C9E +S315080054402378012B00D0F8BDC93D352D7ED8DFE87D +S3150800545015F085007D007D0099007D007D00C30064 +S31508005460A100B600CB007D007D007D007D007D009B +S315080054707D007D007D007D007D007D007D007D0036 +S315080054807D007D007D007D007D007D007D007D0026 +S315080054907D007D007D007D007D007D007D007D0016 +S315080054A07D007D007D00DA000801150129017D00D7 +S315080054B07D007D0031017D0040015101740000F03E +S315080054C0ADF9884C08BBFE2110230220E170237138 +S315080054D0A4F8440094F84320824B012A0DD0B3F86F +S315080054E0441008B20028AEDD89B27F48012384F84B +S315080054F04330BDE8F840FFF72DBF0221FE221020F9 +S31508005500DA701871A3F84410EFE70021102301267A +S315080055106170237161712670E570FFF745FFA07110 +S31508005520FFF752FFE071FFF74FFF0822000A2072CB +S315080055306672A672A4F84420CCE70020FF21012257 +S3150800554020706070E170A4F84420C3E7FE23202091 +S315080055500222E3702071A4F84420BBE7A76C614DD2 +S31508005560FFF722FF721C411E3846FFF79FF90028F5 +S3150800557040F0D280FE2031220221E8702A71A5F877 +S315080055804410A7E7FE2131230220E1702371A4F815 +S3150800559044009FE7FFF708FF73780138984265DDF6 +S315080055A0FF250122E570A4F8442071784D4D0029A5 +S315080055B040F0BE80FFF780F900288BD1DAE7A06CAF +S315080055C07168484DFFF774F90028D3D0FF220121EE +S315080055D0EA70A5F844107DE7FEF776FEFF20012263 +S315080055E0E070A4F8442075E70025FF20E0702571D7 +S315080055F06571FFF7D9FE0723A071E57125726572FB +S31508005600A4F8443066E7FF25E5704568A26C002DCE +S3150800561000F09A801346D04313F8011BAD184219BF +S31508005620AB4202F0010011D028B113F8012B8918FA +S31508005630AB42C9B20AD01A465B7812F8010B0918B0 +S3150800564053FA81F0531CAB42C1B2F4D10023C4F81B +S3150800565007100122082122716371A371A4F844106E +S3150800566038E7FFF7A1FE7278904250DCFE2222212D +S315080056700223E2702171A4F844302BE7FFF794FE69 +S3150800568072789042F2DD1948A16CFEF73BFEFF20C6 +S31508005690E0707178A36CCA18A2647078411CA4F8EB +S315080056A0441017E7FF22E27043680121A364A4F8B7 +S315080056B044100FE700200E4B2071FF226071A07185 +S315080056C007210820E270A364C4F80710A4F8440070 +S315080056D000E7FE2000230221E0702371A4F844109D +S315080056E0F8E600BF1C1F00201F1F0020201F0020F7 +S315080056F020A1000860780023FF210622E1702371AB +S315080057006071A371E3712372A4F84420E2E671681C +S315080057100E48A1647278B8E7FF22AE6CEA70FFF70C +S3150800572043FE013E31180123A964A5F84430D1E6A9 +S31508005730A86CB21CFFF7BAF800283FF41BAF7178C3 +S31508005740AB6CC818A864C5E629467FE7201F002069 +S3150800575038B50546007804F079FAC0B2A0F13004ED +S31508005760E4B2162C1FD8A0F13A02062A1BD9092C36 +S3150800577088BFA0F13704687888BFE4B204F066FAF7 +S31508005780C1B2A1F13003D8B216280CD8A1F13A0259 +S31508005790062A08D9092884BFA1F13700C0B200EB50 +S315080057A00414E0B238BD002038BD00BF38B5054640 +S315080057B0000909280C460CD905F00F053730092DC4 +S315080057C020700FD905F1370000236070A3702046BA +S315080057D038BD303004F03AFA05F00F05C0B2092D8D +S315080057E02070EFD805F1300004F030FAC0B2EBE7CC +S315080057F008B5074B07490020187002F023FA00B9CC +S3150800580008BD05487C21BDE80840FFF7E9BC00BF94 +S31508005810A81F0020B41F002028A1000841F6A8737D +S31508005820C2F200031878D0F1010038BF0020704793 +S3150800583010B5FFF7D9FD012802D0054C23780BB126 +S31508005840002010BDFEF7C6FA0128F9D1207010BD58 +S31508005850A81F002010B50446007804F0F7F953286D +S3150800586001D0032010BD607804F0E8F90028F8D0CC +S315080058706078312806D0322806D0332814BF032092 +S31508005880022010BD002010BD012010BDF8B5074646 +S315080058900230FFF75DFF0546381DFFF759FF6C1EFE +S315080058A0A4B2281805F00103BD1D012CC6B21DD9E6 +S315080058B053B12846FFF74CFF611E8CB23218012CF3 +S315080058C0D6B207F1080511D92846FFF741FF023578 +S315080058D03318013C2846DEB2A4B2FFF739FF611E31 +S315080058E08CB230180235012CC6B2EDD82846FFF71F +S315080058F02FFFF243D6B2331A594251EB0300F8BDD3 +S315080059002DE9F0410F4605461646002939D00028EC +S3150800591037D02846FFF79EFF032804462DD0284691 +S31508005920FFF7B4FF002800F08F80012C2FD022D279 +S31508005930A81CFFF70DFF8046281DFFF709FF040284 +S315080059403C60A81DFFF704FFA8F10303201899B2CD +S31508005950386008350CB28EB1002C0FDD00272846BA +S31508005960FFF7F6FE7A1CF05597B20235A742F6DB2A +S315080059702046BDE8F081022C34D000242046BDE83C +S31508005980F081334840F23621FFF72AFCC1E7A81C0C +S31508005990FFF7DEFE8046281DFFF7DAFE04043C60AA +S315080059A0A81DFFF7D5FE04EB00243C6005F10800AE +S315080059B0FFF7CEFEA8F10403201899B238600A351D +S315080059C00CB2002EDAD0002CD8DD00272846FFF7C7 +S315080059D0BFFE7A1CF05597B20235A742F6DB204681 +S315080059E0BDE8F081A81CFFF7B3FE8046281DFFF727 +S315080059F0AFFE04063C60A81DFFF7AAFE04EB0044B0 +S31508005A003C6005F10800FFF7A3FE04EB00243C60A8 +S31508005A1005F10A00FFF79CFEA8F10503201899B2C4 +S31508005A2038600C350CB2002EA8D0002CA6DD002755 +S31508005A302846FFF78DFE7A1CF05597B20235A74225 +S31508005A40F6DB2046BDE8F0814FF0FF3496E700BF4D +S31508005A5028A100082DE9F843A94D2C783CB1012C62 +S31508005A6000F03381022C00F09780032C01D0BDE8AA +S31508005A70F883A44FA44E4FF48071304607F50D7293 +S31508005A8002F076FD97F93A32002BC0F28C8158B1B4 +S31508005A90304606F5C07106F58072FFF731FFB0F1A2 +S31508005AA0FF3F804600F092810FFA88F8B8F1000FA0 +S31508005AB04FDD9648964CFEF7EBF94CF6CD4043463B +S31508005AC0CCF6CC40A0FB031221460134D308F9D109 +S31508005AD04CF6CD400B700A464446CCF6CC40A0FBAB +S31508005AE00413DB0803EB8301A4EB410404F1300142 +S31508005AF002F8011D1C46002BF1D18648FEF7C8F9AD +S31508005B008548FEF7C5F9834996F88301FFF74EFEE7 +S31508005B10824996F88201FFF749FE814996F8810184 +S31508005B20FFF744FE7F4996F88001FFF73FFE794864 +S31508005B30FEF7AEF97C48FEF7ABF9D6F880017B4A4A +S31508005B404146FEF7B3FE002800F021817848FEF7AB +S31508005B509FF9D7F83C02D7F84022904287D175487A +S31508005B60FEF796F9FEF7A8FE0446002800F04081E5 +S31508005B706F48FEF78DF97048FEF78AF96F4802F00C +S31508005B8099FB6F48FEF784F900232B70FEF75AF944 +S31508005B90BDE8F843FEF798BB5A4E5B4F06F50D7203 +S31508005BA04FF48071384602F0E3FC96F93A22002A4F +S31508005BB0C0F20781B8B10022384607F5C071FFF771 +S31508005BC09FFEB0F1FF3F81460DD15E48FEF760F9B2 +S31508005BD00320FEF753F906F50D7002F06BFB002360 +S31508005BE02B70BDE8F8830FFA89F0002808DD564BBC +S31508005BF05A68002A40F0C280D7F8802158601A6097 +S31508005C00D6F83C12D6F8403299427FF430AF4B486A +S31508005C10002102F057FB002840F0DD8044484A4E38 +S31508005C20FEF736F94948FEF733F97468384B4CF6EF +S31508005C30CD402246CCF6CC40A0FB021219460133D1 +S31508005C40D208F9D14CF6CD400A70CCF6CC400A46BB +S31508005C50A0FB0413DB0803EB8301A4EB410404F166 +S31508005C60300102F8011D1C46002BF1D12948FEF728 +S31508005C700FF93748FEF70CF92649F078FFF796FD35 +S31508005C802649B078FFF792FD25497078FFF78EFD13 +S31508005C9024493078FFF78AFD1E48FEF7F9F82248AE +S31508005CA0FEF7F6F896E80300FEF702FE002840F035 +S31508005CB0AB802448FEF7ECF80520FEF7DFF81F480E +S31508005CC002F0F8FA2C70BDE8F883FEF7A7F8214829 +S31508005CD0FEF7DEF82048FEF7DBF8FEF799F82246CD +S31508005CE00146164801F0BEFF0646002836D015487C +S31508005CF0FEF7CEF82046BDE8F843FEF7BFB800BF6A +S31508005D00A81F0020B41F00200C240020BCA20008F5 +S31508005D10691F0020681F0020CCA200086A1F002007 +S31508005D206C1F00206E1F0020FCA200080C25002016 +S31508005D30F0A10008E4A2000800A30008E82100205A +S31508005D4018A30008E8A10008AC1F00204CA2000810 +S31508005D5058A200089CA10008C0A100082E48FEF71A +S31508005D6097F82E48FEF794F82D48FEF791F82D4936 +S31508005D7002200E604E602870BDE8F883D7F88011BF +S31508005D801C688018A14238BF1960586038E7264851 +S31508005D90FEF77EF80620FEF771F8244802F08AFA24 +S31508005DA02C70BDE8F8832248FEF772F80220FEF749 +S31508005DB065F807F50D7002F07DFA00212970BDE837 +S31508005DC0F8831948FEF764F8204602E71948FEF7F3 +S31508005DD05FF82046EBE71448FEF75AF80420FEF76A +S31508005DE04DF8124802F066FA00222A70BDE8F883D8 +S31508005DF00D48FEF74DF80720FEF740F80B4802F06D +S31508005E0059FA2C70BDE8F8830348FEF741F80320D9 +S31508005E102870BDE8F88300BFF0A10008F8A10008C3 +S31508005E201CA20008AC1F0020E8A10008E8210020F9 +S31508005E3074A2000898A2000808B518B103680BB147 +S31508005E401A780AB9092008BDD98880888142F9D10B +S31508005E505878FBF753FA10F0010F0CBF0020032007 +S31508005E6008BD00BFF8B503690C4601F10902002B0D +S31508005E7000F0C980436919781E7B20297DD006F079 +S31508005E800805052914BF0A46E52205F0FF0725B1CE +S31508005E90A2F14101192940F2DB8062725D78202D5A +S31508005EA004F10A0269D0052D08BFE52527B1A5F139 +S31508005EB04101192940F2CF80A5729978202904F169 +S31508005EC00B025AD0052908BFE52127B1A1F14102E5 +S31508005ED0192A40F2C380E172DD78202D04F10C0204 +S31508005EE04BD0052D08BFE52527B1A5F14102192A92 +S31508005EF040F2B78025731D79202D04F10D023CD0A0 +S31508005F00052D08BFE5252FB1A5F14101192901D8AD +S31508005F102035EDB265735979202904F10E022CD08B +S31508005F20052908BFE5212FB1A1F14102192A01D897 +S31508005F302031C9B2A1739D79202D04F10F021CD01E +S31508005F40052D08BFE5252FB1A5F14102192A01D86B +S31508005F502035EDB2E573D979202904F110020CD069 +S31508005F60052908BFE5212FB1A1F14107192F01D84D +S31508005F702031C9B2217404F111021D7A202D2BD0CB +S31508005F8017462E2107F8011B197A20296ED006F02C +S31508005F90100606F0FF052EB1A1F14107192F01D809 +S31508005FA02031C9B251705F7A961C202F5CD02DB172 +S31508005FB0A7F14106192E01D82037FFB29770997AB2 +S31508005FC0D61C202950D02DB1A1F14105192D01D893 +S31508005FD02031C9B2D1700432DF7A2772997FDF7F08 +S31508005FE01E7F5D7F090441EA0761314341EA0526C0 +S31508005FF026605D7E197E41EA0526A680DD7D9B7DAD +S3150800600043EA0521E18000251570A66936B1E269E3 +S3150800601022B103691BB9002500207055F8BD018C13 +S315080060204FF6FF729142F6D0C769388850B9F2E741 +S31508006030E369591E8D42EED2705537F8020F0135C5 +S315080060400028E9D0002102F0E9FA0028F0D1E2E7B9 +S315080060502032D2B221E72035EDB22DE72031C9B280 +S3150800606039E72035EDB245E73246B5E73A46B3E7B4 +S3150800607038B504460A46407804F134010123FBF793 +S3150800608051F908B1032038BD94F8322294F8331236 +S315080060904AF6552342EA01210AB2CFF6FF739A421D +S315080060A001D0022038BD94F86C3094F86D5094F8FD +S315080060B06A1094F86B201B0443EA05630B4343EA12 +S315080060C0022144F2461321F07F42C0F254039A4259 +S315080060D0E8D094F8882094F8895094F8861094F8B3 +S315080060E08700120442EA05620A4342EA002121F0C7 +S315080060F07F40C01A18BF012038BD00BF2DE9F04106 +S3150800610003681C78303C092C154602D85A783A2A76 +S3150800611018D000200860B24C2468002C25D00C60EA +S315080061202178C1B16078FBF7E9F8C20713D4002DCE +S3150800613026D000F00400C2B2002A14BF0A200020AC +S31508006140BDE8F0810233002203600A60002CE2D029 +S315080061500B20BDE8F081002020706070FBF7B6F8D0 +S31508006160C30705D50320BDE8F0810C20BDE8F08102 +S315080061704DB100F00400C3B22BB10A20BDE8F0818E +S315080061802846BDE8F08100212046FFF771FF012867 +S3150800619007D00025032800F0B980D0B10D20BDE84E +S315080061A0F08194F8F621002AF8D094F8FC0194F8C6 +S315080061B0FD1194F8FA3194F8FB51020442EA0160A1 +S315080061C040EA030141EA052520462946FFF750FF24 +S315080061D0E0E794F8402094F83F3043EA0220B0F50F +S315080061E0007FDBD194F84B1094F84A2052EA01223A +S315080061F00DD194F85A1094F85B0094F8583094F836 +S315080062005920090441EA0060034343EA022294F84C +S315080062104400E261411E0129E070BFD894F841307C +S31508006220A370002BBAD0591E1942B7D194F845105D +S3150800623094F8466041EA0626B1B216F00F0F21819E +S31508006240ACD194F8487094F8476056EA07260FD1FF +S3150800625094F856C094F8578094F8546094F855709A +S315080062604FEA0C4E4EEA086C4CEA060646EA072642 +S3150800627094F843E094F8427057EA0E278ED000FB54 +S3150800628002FC07EB11106044864287D3361AB6FB28 +S31508006290F3F3002B82D040F6F576B34240F2C08085 +S315080062A006F57046B34200F29F8002260233EF19C4 +S315080062B04019A36125626762E06200293FF46EAF68 +S315080062C06744022EA76200F08980032101FB03F6CA +S315080062D003F0010303EB5600012600F2FF13B2EBAD +S315080062E0532FFFF45BAF00204FF0FF32032E2261DD +S315080062F0E0600ED03B4A26701388591C00208BB2EA +S315080063001380E38020632071BDE8F0810120BDE899 +S31508006310F08194F8651094F86430607143EA0120BE +S315080063202A186261607804F134010123FAF7FAFF4A +S315080063300028DFD194F8331294F832224AF655230E +S3150800634042EA012001B2CFF6FF739942D2D194F8FE +S31508006350362094F8370094F8343094F8351012043F +S3150800636042EA0060184345F2522340EA0121C4F28A +S3150800637061139942BED194F81A2294F81B0294F834 +S31508006380183294F81912120442EA0060184347F2C8 +S31508006390722340EA0121C6F241139942AAD194F820 +S315080063A0227294F81E5294F8238294F81FE294F805 +S315080063B0202294F81C3294F8210294F81D123F0406 +S315080063C02D0447EA086745EA0E653A432B4342EA35 +S315080063D0002043EA0121E06021618BE758007CE751 +S315080063E094270020902700200233EF194019A36153 +S315080063F025626762E06200297FF4D0AE94F8626095 +S3150800640094F8637094F8601094F86100360446EACC +S315080064100766314341EA0020A062032698005CE73C +S31508006420012643E7F8B50446007900B9F8BD256B9F +S31508006430607804F1340631462A460123FAF79AFFB2 +S3150800644028BB626A207195421FD3E3699818854272 +S315080064501BD2E778012F18D9F9070CD5ED18607803 +S3150800646002E0E16960786D18012331462A46FAF799 +S3150800647081FFE369013FED18314601232A4660781A +S31508006480013FFAF777FF012FEBD10020F8BD012075 +S31508006490F8BD00BF2DE9F84F0546FFF7C3FF0446D0 +S315080064A054B92B78032B09D0002168780A46FAF7E5 +S315080064B08BFF003018BF0120BDE8F88F68790028E7 +S315080064C0F2D005F134012C6305F50D760F463A46F0 +S315080064D002F8014B7C70571CB742F8D1EB682A6961 +S315080064E085F820324FF0550B61204FEA134C4FEADE +S315080064F0136E85F81C22522741247226C2F3072AF6 +S315080065004FEA1249C3F30728120E85F832B24FF044 +S31508006510AA0B85F8360085F81B0285F81F2285F830 +S3150800652033B285F8347085F8357085F8374085F8C4 +S31508006530186285F8196285F81A4285F81DA285F849 +S315080065401E9285F8218285F822C285F823E26878AA +S315080065506A690123FAF70EFF00216971A4E700BFF3 +S3150800656038B5036B8B4204460D460FD0FFF75AFF2A +S3150800657008B1012038BD607804F134012A460123A8 +S31508006580FAF7D0FE0028F4D1256338BD002038BDBF +S315080065900129F8B50C4605460CD98369994209D2F2 +S315080065A00178022946D0032928D0012904D04FF0C2 +S315080065B0FF30F8BD0120F8BD426A04EB540602EB31 +S315080065C05621FFF7CDFF0028F1D1F005C70D696AFE +S315080065D0EB190136284601EB562193F83470FFF77C +S315080065E0BFFF0028E3D1F605F60DAD19E30795F8C8 +S315080065F0342047EA02202FD50009F8BD436A03EB89 +S31508006600D411FFF7ADFF0028D1D16406E20DA81812 +S31508006610044690F8372090F8361090F8350094F82C +S315080066203430120642EA014141EA0020184320F0BC +S315080066307040F8BD436A03EB1421FFF791FF002869 +S31508006640B5D12406E20DA9180C4691F8343091F814 +S31508006650350043EA0020F8BD0105080DF8BD00BF66 +S3150800666070B50C468168C4800129054603D00068C8 +S315080066708369994201D3022070BDB1B90178032913 +S3150800668010D001890023A142EB60F4D9826A02EB9B +S315080066901411296104F00F0400EB441034306861CA +S315080066A0002070BD816A0029EBD086783601B44295 +S315080066B008D210E00128DED9286883699942DAD21F +S315080066C0A64208D8FFF764FFA41B421C0146A4B2E1 +S315080066D0F0D1012070BD8369E960023B0239994215 +S315080066E03DBF8278C36A02FB0131002101EB141217 +S315080066F02A61CFE7F0B5012983B00C46054602D9D1 +S315080067008369994202D3022003B0F0BD01780229B9 +S3150800671027D0032905D0012937D0022001222A7162 +S31508006720F2E7436A019203EBD411FFF719FF019AC6 +S315080067300028F3D16406E70DEB191C4693F8376079 +S31508006740310601F070473A43C2F30727160C110EBB +S3150800675083F8342083F8357083F8366083F8371069 +S31508006760DCE7436A019203EB1421FFF7F9FE019A6D +S315080067700028D3D12406E10D6918C2F307230C4675 +S3150800678081F8342081F83530C8E7436A019204EB72 +S31508006790540603EB5621FFF7E3FE019A0028BDD104 +S315080067A0F005C10D14F0010420D06B18D0B293F88F +S315080067B0341001F00F0141EA0010C0B2696A83F88B +S315080067C03400013601232B71284601EB562101922C +S315080067D0FFF7C6FE019A0028A0D1F605F10D44B1CF +S315080067E0C2F307126E1886F8342097E7D0B26B18F2 +S315080067F0E4E76E18C2F3032296F8343023F00F014B +S315080068000A43F0E7F8B505460F4601BBC668836933 +S31508006810CEB19E4228BF0126344601349C4202D39B +S31508006820012E12D9022428462146FFF7B1FEB8B137 +S31508006830431C20D001281CD0B44206D0AB690134D1 +S315080068409C42EDD2EFE70126E6E70020F8BDFFF708 +S315080068509FFE01280DD9AB6998420BD33E46DBE76C +S31508006860284621466FF07042FFF744FF30B10128F1 +S3150800687001D00120F8BD4FF0FF30F8BD4FB92869A7 +S31508006880EC60411C03D0411E012229616A71204631 +S31508006890F8BD284639462246FFF72CFF0028EED0D9 +S315080068A0E5E700BF2DE9F047C5880446681C85B2B0 +S315080068B00E4615B90420BDE8F0872369002BF9D0E8 +S315080068C015F00F0708D0206800EB47123432E58030 +S315080068D062610020BDE8F087E16820685A1C2261E1 +S315080068E0F9B183785A1E12EA1512EDD1FFF750FE58 +S315080068F00128804619D9B0F1FF3F23D02068836963 +S31508006900984515D2A8F102068269C4F80C80931E30 +S315080069109E423DBF8178C36A01FB06360026266182 +S31508006920D2E70389AB42C5D9CEE70220BDE8F08796 +S31508006930002EBFD0E168FFF765FF804628B907201B +S31508006940BDE8F0870120BDE8F0870128EDD0B0F159 +S31508006950FF3FF7D02068FFF765FD0028F2D12668CB +S31508006960014606F1340306F50D701A4602F8011BB6 +S315080069705970531C8342F8D122689069A8F102061F +S31508006980831E9E423DBFD36A917801FB06330023DE +S3150800699013634FF000094FF0010A0EE082F804A0D5 +S315080069A02068FFF73FFD09F101090028CAD12268CE +S315080069B0116B481C10635FFA89F9917849451046AE +S315080069C0ECD8126BC9EB020303639DE72DE9F04F80 +S315080069D085B0FF22019281461646D9F80000D9F8FB +S315080069E01010FFF7BDFDC8B9D9F814402578002D59 +S315080069F000F09081E37AE52D03F03F0107D003F01C +S31508006A000802D3B2002B00F0E2800F290BD0FF2634 +S31508006A1048460021FFF746FF0028DED08346584641 +S31508006A2005B0BDE8F08FD9F81C70002FF0D005F03E +S31508006A304000C2B2002A00F06981667BB9F80610E8 +S31508006A400196A9F8201005F0BF0594F80D80019B62 +S31508006A509845DCD12178A078627821F04006731E2B +S31508006A6003EB430A42EA002003EB8A0B01F0FEFD22 +S31508006A70BBF1FE0F824600F26C8137F81B0001F06D +S31508006A80F5FD82450BF1010640F063812179E07836 +S31508006A9040EA0120BAF1000F40F05F814FF6FF721D +S31508006AA0904240F05681A179637943EA0120BAF110 +S31508006AB0000F40F061814FF6FF72904240F0498125 +S31508006AC0207AE17941EA0020BAF1000F40F070819E +S31508006AD04FF6FF73984240F03C81A27A607A40EA0A +S31508006AE00220BAF1000F40F055814FF6FF71884237 +S31508006AF040F02F81E27BA37B43EA0220BAF1000F24 +S31508006B0040F072814FF6FF71884240F02281607C26 +S31508006B10227C42EA0020BAF1000F40F057814FF676 +S31508006B20FF73984240F01581E17CA07C40EA012081 +S31508006B30BAF1000F40F074814FF6FF72904240F0B0 +S31508006B400881617D237D43EA0120BAF1000F40F0F8 +S31508006B5059814FF6FF72904240F0FB80E07DA17D9F +S31508006B6041EA0020BAF1000F40F085814FF6FF7325 +S31508006B70984240F0EE80627E207E40EA0220BAF11A +S31508006B80000F40F069814FF6FF71884240F0E180BE +S31508006B90627F237F43EA0220BAF1000F40F04E815C +S31508006BA04FF6FF71884240F0D480E07FA27F42EA28 +S31508006BB00020BAF1000F40F0B0804FF6FF739842FC +S31508006BC040F0C780013DEEB2CDF8048020E70F29DA +S31508006BD03FF429AF002E57D14FEAC51B94F801A000 +S31508006BE094F8028094F803C027796679A179E27946 +S31508006BF002914BEA550505EB0A0E5FFA8EFB4FEA42 +S31508006C00CB1545EA5B0A58FA8AF85FFA88FE4FEA16 +S31508006C10CE1545EA5E085CFA88FC5FFA8CFB4FEAFB +S31508006C20CB1545EA5B0E57FA8EF7FFB2FD0145EA2A +S31508006C30570756FA87F6F6B2F50145EA5605029E53 +S31508006C40039256FA85F5EDB2EE0146EA5505039E1E +S31508006C50217A627AA37A56FA85F5EDB2EE0146EA0A +S31508006C60550551FA85F1C9B2CD0145EA510152FAE5 +S31508006C7081F2D2B2D10141EA520253FA82F3019A61 +S31508006C80D9B291423FF4CAAED9F818304FF0FF3660 +S31508006C90A9F82060D97ACA073FF5B9AE21781A78DB +S31508006CA091427FF4B4AE61785A7891427FF4AFAEE0 +S31508006CB0A1789A7891427FF4AAAEE178DA7891427F +S31508006CC07FF4A5AE21791A7991427FF4A0AE617955 +S31508006CD05A7991427FF49BAEA1799A7991427FF4D1 +S31508006CE096AEE179DA7991427FF491AE217A1A7AF1 +S31508006CF091427FF48CAE617A5A7A91427FF487AEDC +S31508006D00A17A9B7A99423FF489AE80E6B5427FF430 +S31508006D107EAE9AE64FF0040B81E601F0A7FCFF2E43 +S31508006D20824616D037F8160001F0A0FC01368245D7 +S31508006D300FD1217801F04000C2B2002A3FF442AFD9 +S31508006D40BAF1000F3FF43EAF37F81630002B3FF488 +S31508006D5039AFCDF80480FF265AE601F087FCFF2EEE +S31508006D608246F6D037F8160001F080FC82450BF112 +S31508006D7002063FF498AEECE701F078FCFF2E824657 +S31508006D80E7D037F8160001F071FC013682453FF46A +S31508006D9097AEDEE701F06AFCFF2E8246D9D037F8B7 +S31508006DA0160001F063FC013682453FF4A3AED0E736 +S31508006DB001F05CFCFF2E8246CBD037F8160001F0B6 +S31508006DC055FC013682453FF488AEC2E701F04EFC19 +S31508006DD0FF2E8246BDD037F8160001F047FC013673 +S31508006DE082453FF4A1AEB4E701F040FCFF2E82468F +S31508006DF0AFD037F8160001F039FC013682453FF46A +S31508006E0086AEA6E701F032FCFF2E8246A1D037F8FF +S31508006E10160001F02BFC013682453FF49FAE98E739 +S31508006E2001F024FCFF2E824693D037F8160001F0B5 +S31508006E301DFC013682453FF484AE8AE701F016FC54 +S31508006E40FF2E824685D037F8160001F00FFC013672 +S31508006E5082453FF4AAAE7CE701F008FCFF2E824685 +S31508006E603FF477AF37F8160001F000FC013682458B +S31508006E703FF48EAE6DE701F0F9FBFF2E82463FF434 +S31508006E8068AF37F8160001F0F1FB013682453FF48A +S31508006E9072AE5EE72DE9F04F0B782F2B83B089464B +S31508006EA0054600F074815C2B00F071810027AF6005 +S31508006EB099F800001F2802D872E119F8010F2F2847 +S31508006EC0FBD05C28F9D01F28EE6940F22E812F28C6 +S31508006ED02CD00121A6F1020BCA46012401F09EFB23 +S31508006EE000B37F2809D822281CD0B24A01E088427C +S31508006EF018D012F8011F0029F9D12BF8020F1AF839 +S31508006F00010F631C1F2840F212812F2810D05C281D +S31508006F100ED0B3F5807F05D001211C4601F07EFB1B +S31508006F200028DED1062003B0BDE8F08F0024012337 +S31508006F3099444FF0000B002CF4D006EB4400621E77 +S31508006F4030F8023D202B02F0010101D02E2B1BD177 +S31508006F50013CE7D039B130F8022D202A01D02E2A7B +S31508006F6012D1013CDED030F8023D202B01D02E2B69 +S31508006F700AD130F8021D013C2029224601D02E29CB +S31508006F8002D1541EEFD1CDE7A86926F81470202344 +S31508006F9006EB440E037043708370C370037143712C +S31508006FA08371C371037243728372B11E4FF0000A74 +S31508006FB001E00AF1010A31F8020F2028F9D02E283B +S31508006FC0F7D0BAF1000F01D04BF0030B7346621EDF +S31508006FD033F8028DB8F12E0F02F0010112D01446D3 +S31508006FE082B121B133F8022D2E2A09D10AE033F8ED +S31508006FF0021D2E2906D033F8022D013C2E2A01D077 +S31508007000013CF4D10022082390460AF1010A88B30C +S31508007010202821D02E281DD09A4222D2544500F08D +S315080070208A807F2800F291802B2800F0A280DFF862 +S3150800703088E102E0884200F09C801EF8011F0029C2 +S31508007040F8D1A0F14101192900F2B88048F00208E8 +S31508007050C0B291E054456ED04BF0030B36F81A00D7 +S31508007060D3E70B2B00F0B580544566D0A2454BF00C +S31508007070030B62D9AA691078E52800F08480082BEA +S3150800708004BF4FEA880C5FFA8CF808F00C030C2B47 +S3150800709076D008F00300032872D00BF00201C8B2BC +S315080070A050B908F0030CBCF1010F08BF4BF0100BE8 +S315080070B0042B08BF4BF0080B82F80BB028460021BA +S315080070C0FFF7CEFAF0B92846FFF780FCAA69D37A0B +S315080070D0D0B903F00403D9B200297FF424AF6B6951 +S315080070E0D87A00F01002D1B2002970D02C68DE7E62 +S315080070F02178987E032940EA06220FD0AA6099F8DB +S315080071000000DCE6A969CB7A04287FF40CAF03F00B +S315080071100402D1B2002908BF052004E75C7D1B7D67 +S3150800712043EA042642EA0642E8E700240123994492 +S315080071304FF0040BFFE60B2B4BD04FEA880C5FFA97 +S315080071408CF8A2460B23082288E7002101920093B7 +S3150800715001F064FA019A009B40B34AF25831C0F62E +S31508007160000108184BF0020B10F8800C00287FF479 +S315080071705BAF4BF0030B5F20A969885401326DE7BA +S315080071804BF0020B89E705211170AA6977E70027FA +S3150800719009F10109AF6099F800001F283FF68FAE84 +S315080071A028463946FFF75CFA6F61BCE64BF0020BDE +S315080071B0DFE700BF44A3000850A30008A0F161015F +S315080071C0192902D8203848F00108C0B2D4E70520AA +S315080071D0A9E64BF0030B0B234CE700BFF8B5018C6F +S315080071E0C5884FF6FF73994208BF29460446FFF73C +S315080071F037FA0346C0B9E527012621692068FFF753 +S31508007200AFF90346014620465BB9626917702268E2 +S315080072101671E288AA4207D2FFF744FB0346002804 +S31508007220EBD0042B08BF02231846F8BD2DE9F04F12 +S31508007230FF25044683B02E4604204FF000084FF67B +S31508007240FF772169002900F0E7802068FFF788F9B1 +S31508007250A0B962691378002B00F0E280E52BD17A99 +S3150800726005D02E2B03D001F03F0108290BD1FF26AC +S3150800727020460021FFF716FB0028E2D000212161F5 +S3150800728003B0BDE8F08F0F2940F0CC8003F0400032 +S31508007290C1B2002900F0BC80E688557B268403F03D +S315080072A0BF03507BA842E2D1117892F802C0557804 +S315080072B0E66901F03F01013901EB410E01EB8E0E43 +S315080072C0BEF1FE0F45EA0C2500F2118126F81E5084 +S315080072D092F8049092F803C00EF101014CEA092CC9 +S315080072E0002D40F0FA80BC4540F0018192F806C0B6 +S315080072F092F805E04EEA0C2C002D40F0FB80BC45C8 +S3150800730040F0F58092F808C092F807E04EEA0C2C97 +S31508007310002D40F0F680BC4540F0E98092F80AC09E +S3150800732092F809E04EEA0C2C002D40F0F180BC459D +S3150800733040F0DD8092F80FC092F80EE04EEA0C2C71 +S31508007340002D40F0F380BC4540F0D18092F811C082 +S3150800735092F810E04EEA0C2C002D40F0E080BC4577 +S3150800736040F0C58092F813C092F812E04EEA0C2C51 +S31508007370002D40F0E280BC4540F0B98092F815C077 +S3150800738092F814E04EEA0C2C002D40F0DD80BC4546 +S3150800739040F0AD8092F817C092F816E04EEA0C2C31 +S315080073A0002D40F0D880BC4540F0A18092F819C065 +S315080073B092F818E04EEA0C2C002D40F0D380BC451C +S315080073C040F0958092F81DC092F81CE04EEA0C2C0D +S315080073D0002D40F0CE80BC4540F0898092F81FC051 +S315080073E092F81EE04EEA0C2C002D7ED0FF297ED0A6 +S315080073F026F811C00131127802F04005EAB21AB136 +S31508007400FF2974D026F81180013BDEB205462FE726 +S31508007410B3427FF42CAF44E700283FF431AF2DE7A1 +S3150800742004202BE7002E54D192F801A092F802907E +S3150800743092F8038092F804C057799679D1794FEA81 +S31508007440C31B4BEA53035344DBB24FEAC31A4AEA57 +S31508007450530359FA83F3DBB24FEAC31949EA5303D4 +S3150800746058FA83F3DBB24FEAC31848EA53035CFAC7 +S3150800747083F3DBB24FEAC31E4EEA530357FA83F788 +S31508007480FBB2DF0147EA530356FA83F6F3B2DE018D +S31508007490009146EA5303009E117A56FA83F3DBB24B +S315080074A0DE01019146EA5303019E517A927A56FA11 +S315080074B083F3DBB2DE0146EA530351FA83F1CBB21A +S315080074C0D90141EA530352FA83F2D1B2A9423FF4F1 +S315080074D0D7AE4FF6FF732384D2E6FF2907D026F8E6 +S315080074E011C065460EF1020100E7BC4583D005468A +S315080074F0FF26BDE6FF29FAD026F811C065460131F8 +S3150800750000E7FF29F3D026F811C06546013105E7E3 +S31508007510FF29ECD026F811C0654601310AE7FF2994 +S31508007520E5D026F811C0654601311BE7FF29DED0F4 +S3150800753026F811C06546013108E7FF29D7D026F895 +S3150800754011C06546013119E7FF29D0D026F811C0C8 +S31508007550654601311EE7FF29C9D026F811C06546E0 +S31508007560013123E7FF29C2D026F811C0654601314B +S3150800757028E7FF29BBD026F811C0654601312DE75B +S31508007580012970B50D46044602D98369994201D38B +S31508007590022070BD012629462046FEF7F9FF03465C +S315080075A0294600220546204683B1012BF0D0013337 +S315080075B00ED0FFF79FF80028EBD12069411C02D0B6 +S315080075C0411C21616671A2699542E4D3002070BD11 +S315080075D0012070BD30B40C7804704D7845708C78F5 +S315080075E08470CD78C5700C7904714D7945718C79A4 +S315080075F08471CD79C5710C7A04724D7A4572897A8F +S31508007600052B82B081720AD911885C0844EAC33313 +S3150800761011FA83F532F8021FABB20029F5D1072219 +S3150800762003F00F0404F13005392D88BF04F137053E +S315080076300DF80250013A1B09F2D102A98D187E24D1 +S3150800764005F8084C002A5BD00178202908D0D40711 +S31508007650054629D40546012315F8014F202C23D1C8 +S31508007660C3F10705072A05F0010526D802A98C18D3 +S31508007670013214F8084C591C0729C45408D8002D9F +S315080076802FD0072A36D9202343540131072928D970 +S3150800769002B030BC704715F8011F2029E0D015F854 +S315080076A0014F0133202CDBD001339342F3D1C3F1D0 +S315080076B00705072A05F00105D8D92024DBE702AB20 +S315080076C09C18013214F8084C4B1C072A44540FD84E +S315080076D002A98C18013214F8084C591C0729C454FD +S315080076E0D6D8072AEBD920244B1C072A4454EFD9AD +S315080076F02024F2E702ACA318013213F8083CC3E7CA +S315080077001346ADE72DE9F04F8569C669697AEF79C1 +S315080077102A7895F801B095F802A095F8039095F89F +S31508007720048095F805C095F806E0EB7A87B004461C +S315080077300091A97A287A01918DF81370009F8DF827 +S31508007740140001988DF81570DF078DF80C208DF858 +S315080077500DB01A468DF80EA08DF80F908DF8108092 +S315080077608DF811C08DF812E08DF816008DF81730D7 +S3150800777057D50023EB724FF00108E36137E0FFF7B6 +S3150800778025F908F101021FFA82F8074632464346F0 +S31508007790284603A9002F38D1FFF71CFF3946204693 +S315080077A0FEF75EFF07462046002F2ED1FFF70EF99B +S315080077B008F1010807461FFA88F832464346284664 +S315080077C003A917BBFFF706FF39462046FEF748FF11 +S315080077D007462046CFB9FFF7F9F808F10101074631 +S315080077E01FFA81F888B9B8F1640F00F0948043460F +S315080077F0324603A92846FFF7EDFE20460021FEF78C +S315080078002FFF07462046002FB9D0042F03D038464D +S3150800781007B0BDE8F08F9DF81770EF729DF8172036 +S31508007820E66102F00200C3B2002B5DD10126B04624 +S3150800783020460021FEF714FF07460028E7D1054633 +S3150800784005E03D46FFF72EF807460028DFD12169F7 +S315080078502068FEF785FE0746013501212046002FE0 +S31508007860D5D162691378E52B01D0002BE9D1AE4258 +S31508007870E8D108F1FF381FFA88FBBBF1000F4CD19D +S3150800788020682169FEF76CFE07460028BFD16369A8 +S31508007890394603F120001A4602F8011B5970531C99 +S315080078A08342F8D1A06963690178197042785A70E1 +S315080078B081789970C278DA700179197142795A71AA +S315080078C081799971C279DA71017A1972427A5A7292 +S315080078D0807A9872A1696369CA7A02F018001873E7 +S315080078E0216801230B7192E7318800299ED0002078 +S315080078F0471CB8B236F81020002AF9D14EF64F4682 +S315080079001930C4F6C46686FB0021C317C3EBA1066B +S315080079101FFA86F88CE7072779E7E788CBEB070194 +S31508007920204689B2FEF79CFE074600287FF46FAF13 +S31508007930A3691A7893F801A093F8029093F8038044 +S3150800794093F804C093F805E09F79DE791D7A587A92 +S31508007950997AD30143EA520202EB0A03DBB2DA014F +S3150800796042EA530359FA83F2D3B2DA0142EA5303DD +S3150800797058FA83F2D3B2DA0142EA53035CFA83F285 +S31508007980D3B2DA0142EA53035EFA83F2D3B2DA01DA +S3150800799042EA530357FA83F7FBB2DA0142EA53077E +S315080079A056FA87F6F3B2DA0142EA530755FA87F52B +S315080079B0EEB2F30143EA560250FA82F0C7B2FD016D +S315080079C045EA570651FA86FA5FFA8AF80F264FF003 +S315080079D0FF0A4FF6FF7901255F468BE083F803A07F +S315080079E083F804A04FF6FF70484500F0B68031F8DA +S315080079F012004FEA102C0132587183F806C000288D +S31508007A0040F0B18083F807A083F808A04FF6FF700E +S31508007A10484500F0B68031F812004FEA102C0132C2 +S31508007A20587283F80AC0002840F0B18083F80EA087 +S31508007A3083F80FA04FF6FF70484500F0B68031F87E +S31508007A4012004FEA102C0132187483F811C000286E +S31508007A5040F0B18083F812A083F813A04FF6FF70A8 +S31508007A60484500F0B68031F812004FEA102C013272 +S31508007A70187583F815C0002840F0B18083F816A061 +S31508007A8083F817A04FF6FF70484500F0B68031F826 +S31508007A9012004FEA102C0132187683F819C0002814 +S31508007AA040F0B18083F81CA083F81DA04FF6FF7044 +S31508007AB0484500F0B68031F812004FEA102C013222 +S31508007AC0987783F81FC0002840F0B18047F0400E31 +S31508007AD05FFA8EFE83F800E0236820461D710021B8 +S31508007AE0FEF7E0FE002840F0AB80013FBFB2002F52 +S31508007AF03FF4C6AE20682169FEF732FD0246002A29 +S31508007B0040F09E805FFA87FE0EF1FF306369E169F7 +S31508007B101A7300EB400B00EB8B0C9A76DA7683F837 +S31508007B200D80DE7231F81C004FEA102B0CF10102B1 +S31508007B30587083F802B000283FF450AF48453FF428 +S31508007B404DAF31F812004FEA102B0CF10202D87033 +S31508007B5083F804B000287FF447AF83F805A083F8BC +S31508007B6006A04FF6FF7048453FF44CAF31F81200B7 +S31508007B704FEA102C0132D87183F808C000287FF428 +S31508007B8047AF83F809A083F80AA04FF6FF70484567 +S31508007B903FF44CAF31F812004FEA102C01329873BB +S31508007BA083F80FC000287FF447AF83F810A083F846 +S31508007BB011A04FF6FF7048453FF44CAF31F812005C +S31508007BC04FEA102C0132987483F813C000287FF40A +S31508007BD047AF83F814A083F815A04FF6FF70484501 +S31508007BE03FF44CAF31F812004FEA102C0132987569 +S31508007BF083F817C000287FF447AF83F818A083F8E6 +S31508007C0019A04FF6FF7048453FF44CAF31F8120003 +S31508007C104FEA102C0132187783F81DC000287FF42C +S31508007C2047AF83F81EA083F81FA04FF6FF7048459C +S31508007C303FF44CAF31F8121000293FF447AF49E73B +S31508007C400746E4E508B10B207047054B1A6802B1F0 +S31508007C50107009B10020087019600020704700BF35 +S31508007C60942700202DE9F0438FB00546019116466A +S31508007C7068B10023036005A901A802F01E02FEF7F9 +S31508007C803DFA044628B120460FB0BDE8F083092422 +S31508007C90F9E7564801990C9002AA05A80B92FFF736 +S31508007CA0F9F806F01F080A9F30B116F01C0F01D02C +S31508007CB0042843D00446E6E7002F58D016F01C0FD8 +S31508007CC032D1F97A01F01003D8B200284DD106F066 +S31508007CD00202D3B20BB1CB073ED406F00806F1B2C6 +S31508007CE0059B09B148F020081E6B2F62EE6185F8E6 +S31508007CF006801978F87EBA7E032942EA00222DD03A +S31508007D002A61B97F97F81FE03E7F787FDA882B6073 +S31508007D100B0443EA0E613143002341EA0020E86080 +S31508007D20AB60AB61AA80AEE7F87A10F0110F13D1F9 +S31508007D3006F00402D6B24EB10824A4E705A8FFF758 +S31508007D40E1FC48F008080A9F0028B3D108F00806A5 +S31508007D50F1B271B9059BC7E7072494E77E7D387DA4 +S31508007D6040EA062142EA0142CAE704248BE70624D0 +S31508007D7089E7F9F759FB0022060C010EC0F3072C18 +S31508007D80059BB8733E7487F80FC07974FA723A7710 +S31508007D907A77BA77FA771A78F87EBE7E032A46EAA1 +S31508007DA000261BD000210120B976F9763975797538 +S31508007DB01871002E96D018463146D3F83090FFF742 +S31508007DC0DFFB00287FF476AF0598013EC66049467A +S31508007DD0FEF7C6FB059B002884D06BE7797D387DC6 +S31508007DE040EA012246EA0246DCE700BF9025002069 +S31508007DF02DE9F04F9B46002383B0CBF800300746A9 +S31508007E000D461646FEF718F8814630B9B8790206C7 +S31508007E1007D4C00708D44FF00709484603B0BDE8A1 +S31508007E20F08F4FF00209F8E7BC68F9680A1B96421A +S31508007E3034BFB0469046B8F1000FEED007F1240AD9 +S31508007E40E305DA0D002A35D13B689878411E01EA28 +S31508007E50542212F0FF0260D0786999690238023913 +S31508007E60884268D3B97961F07F02BA714FF0020986 +S31508007E70D3E7BA69B24219D0B87900F04001C8B25E +S31508007E8060B1587851460123F9F774FA002840F092 +S31508007E908580BA793B6822F04001B9715878514615 +S31508007EA032460123F9F73EFA002877D1BC68BE614D +S31508007EB0E005C20DC2F50071414528BF4146203292 +S31508007EC0BA182B46E9B12C46167904F8016B6B18DB +S31508007ED0ED435819161D9C4200F0010510D02DB12E +S31508007EE0567904F8016B561D9C4209D072782046D3 +S31508007EF000F8012BB5786570441C02369C42F5D112 +S31508007F00BC68DBF8005064186A18B8EB0108BC6056 +S31508007F101D46CBF8002093D17FE7002C45D1386960 +S31508007F2001289FD9411C39D03B6878619969023884 +S31508007F300239884296D29978DE6A01FB0066002EDD +S31508007F4090D05FEA5824164493D01019884288BF07 +S31508007F50C2EB010458782946E3B23246F9F7E2F94A +S31508007F60BB79E0B903F04001CBB29BB1BA69901B6B +S31508007F7084420FD905EB402307F1230103F5007668 +S31508007F8048781A4602F8010B88785870531C023153 +S31508007F90B342F5D161026B18BC68B2E7BB7963F0EE +S31508007FA07F00B8714FF0010937E7796901921846E1 +S31508007FB0FEF7EEFA019AB3E72DE9F04F984600234B +S31508007FC083B0C8F8003004460E461546FDF734FF60 +S31508007FD0074638B9A179080608D401F00202D0B2DA +S31508007FE030B90727384603B0BDE8F08F0227F9E70E +S31508007FF0E068A268C54206D3904241F0200138BF26 +S31508008000E260A171EEE7002DF6D004F1240ACDF85E +S3150800801004A004F50979D105C90D002937D12368CB +S3150800802093F802A00AF1FF3000EA522111F0FF0A84 +S315080080300DD1002A40F0CC802069002800F0D380BA +S31508008040012812D0411C00F0BD8023686061A27926 +S3150800805002F04000C1B2002940F0A78061699A6920 +S31508008060A1F1020B901E834552D3A37963F07F00DA +S31508008070A0710227B6E7A169A268594503D0E0684E +S315080080808242C0F0B980D305C4F818B0D90DC1F53D +S315080080900070203104EB010BA84228BF28460BF1DB +S315080080A0040320B303EB000ADA4331780BF1050326 +S315080080B0524453458BF8041002F00102314615D09C +S315080080C03AB171780BF106038BF80510711C53450C +S315080080D00CD091F801E01A4602F801EB91F802C0BB +S315080080E083F801C0531C02315345F2D1A268A37923 +S315080080F043F04001A171D8F8001012180B182D1A78 +S31508008100A2600644C8F8003085D1E068A17973E713 +S315080081109978DA6A0BFB01200028A6D05FEA552C6D +S315080081200AEB000BA7D00AEB0C00884288BFCAEB03 +S31508008130010C5878CDF800C05FFA8CF331465A46E0 +S31508008140F9F718F9DDF800C000283BD1A269CBEB96 +S31508008150020BDC4525D94FEA4B21019B705CDA43BB +S3150800816003F8010B09EB02004B4500F0010231440C +S3150800817013D042B111F8010FDDF804A001334B45C5 +S315080081808AF8010009D048781A4602F8010B88785F +S315080081905870531C02314B45F5D1A17921F04003A3 +S315080081A0A3714FEA4C20A268A5E75878A2690199FD +S315080081B00123F9F7DFF828B9A279236822F04000ED +S315080081C0A0714BE7A77967F07F02A271012709E73B +S315080081D018466169FEF716FB00287FF431AFA268DE +S315080081E0E068A17908E718465146FEF70BFB2061BF +S315080081F000287FF425AFF2E7587801995A460123FB +S31508008200F9F790F80028DDD1A2683CE770B5044676 +S31508008210FDF712FEE0B9A37903F02002D1B2B9B195 +S3150800822003F04000C3B26BB12146A26951F8240B92 +S3150800823001234078F9F79EF8002839D1A67926F067 +S315080082404002A2712068E169FEF78AF9064606B17E +S3150800825070BD256AE97A41F02003EB72E068287759 +S31508008260A289110A6977E389AB77E07BE877236906 +S315080082701A0C110AC3F30720AB762A756975E876D6 +S31508008280F9F7D2F8020C030EC0F307212A766B76AB +S31508008290A875E975AE74EE74A079216820F02002FD +S315080082A00123A2710B712068BDE87040FEF7F2B891 +S315080082B00120CDE710B50446FFF7A8FF00B92060F6 +S315080082C010BD00BFF8B504460D46FDF7B5FD0646D8 +S315080082D0002846D1A379180645D4E268AA4205D2F1 +S315080082E003F00200C1B2002908BF15460023A268A0 +S315080082F0A360002D35D0206887787F023AB1013A0D +S31508008300691EB1FBF7F1B2FBF7F3994272D2226903 +S31508008310002A75D06261002A28D1A1681546C805C9 +S31508008320C30D002B76D0A269AA4273D0A77907F0AD +S315080083304001C8B200284ED104F124072368394603 +S3150800834058782A460123F8F7EDFF00283DD1A168A1 +S31508008350E068A561814204D9A279E16042F0200370 +S31508008360A3713046F8BD02263046F8BDBD4253D942 +S31508008370236812E0FEF746FA0246002863D0531C2B +S3150800838023D0012A1BD9236899698A4217D2A06883 +S3150800839062613918AF42A1603FD294F806E00EF048 +S315080083A0020C5FFA8CFEED1B18461146BEF1000F53 +S315080083B0E0D111461846FEF7EBF80246DFE7A0794A +S315080083C060F07F02A2710226CBE7A17961F07F06F1 +S315080083D0A6710126C5E72746012357F8241B4878C6 +S315080083E03946F8F7C7FFA1790028EFD121F04002F6 +S315080083F0A271A3E778420240A260AD1A62698AE7D1 +S315080084001146FEF7FFF901280246D8D0411CDCD0F8 +S3150800841020617FE7E0689DE7A168EB054919D80D5B +S31508008420A16070B123689869023A02388242C6D2BE +S315080084309878DB6A00FB0232002AC0D002EB552589 +S315080084406DE705466BE7A1683D46E6E730B58FB0B0 +S315080084500EAB0D4643F8340D05A918460022FDF764 +S315080084604DFE044610B120460FB030BD09480199AB +S315080084700C9002AA05A80B92FEF70CFD04460028EC +S31508008480F1D10A9921B105A82946FDF7EBFCEAE7DF +S315080084900624E8E790250020F0B599B018AB06AC9D +S315080084A043F85C0D214618460122FDF727FE08B160 +S315080084B019B0F0BD2D4801990D9003AA20460C92DB +S315080084C0FEF7E8FC0028F3D10B9B002B49D0D97A9C +S315080084D011F0010F0CBF00200720069ADF7E1278E4 +S315080084E0997E032A41EA072729D00028E0D1DB7ABA +S315080084F003F01002D1B2C1B1012F30D903460FAD36 +S315080085005A1CE65CA05CEE540233242BA854F7D11F +S31508008510284602211197FEF7A3F80028C8D1284655 +S31508008520FEF784FEF8B10428C2D12046FEF756FEAF +S315080085300028BDD167B90698FDF7ACFFB8E7597DA5 +S315080085401A7D42EA012147EA01470028B0D1CEE761 +S3150800855006983946FFF714F80028A9D1EBE7022058 +S31508008560A6E70620B9E70720A2E700BF9025002066 +S315080085702DE9F041804682B016464F1E0546002476 +S3150800858011E0012201AB30466946FFF731FC019B39 +S31508008590012B0AD19DF800000D28F2D001340A28D3 +S315080085A005F8010B01D0BC42EBDB002129708C4297 +S315080085B014BF4046084602B0BDE8F08130B50A2827 +S315080085C083B004460D4610D002A9284601F8084D86 +S315080085D00122694601ABFFF7EFFC0198012814BF99 +S315080085E04FF0FF30012003B030BD0D20FFF7E6FF46 +S315080085F0EAE700BF70B5054600780E4650B100247C +S3150800860003E015F8010F013428B13146FFF7D6FF0C +S31508008610431CF6D10446204670BD00BF7F2830B4FF +S3150800862014D9A9B90F4B07E05288A9B24C1C82424B +S3150800863009D0A1B2802912D05C889A1C4D1C8442AC +S3150800864002F10203F0D101F1800080B230BC70471C +S31508008650FF2804D88038044931F81000F6E70020CE +S31508008660F4E700BFB6A50008B8A5000861280AD037 +S315080086700749002201E0834206D031F8023F013261 +S31508008680002BF8D170470022024830F812007047D4 +S31508008690D8A30008B8A60008013A70B48D18A942F4 +S315080086A03ED24B780A7803EB022293B2C018CA432B +S315080086B080B2AA188342C2F3400235D88B1C9D4269 +S315080086C028D96AB11C785A7802EB042292B280182B +S315080086D080B2824201D9421C90B202339D4219D916 +S315080086E01E785C7804EB0624A4B2001980B29A1CA2 +S315080086F0844201D9441CA0B29C78537803EB042326 +S315080087009BB2C01880B2834201D9431C98B2931C0D +S315080087109D42E5D8CA43AB1823F00102931CC91839 +S31508008720A94204D070BC7047431C98B2C6E70978C2 +S315080087300A02101880B28242F4D9431C98B2F1E7B3 +S3150800874038B50E4C657C237C143D05EB03218DB2B0 +S31508008750401904F11A01082280B2FFF79DFF04F1BF +S3150800876022012A46FFF798FF10B94FF6FF7038BD69 +S31508008770020A42EA002398B238BD00BF1428002036 +S3150800878070B4C478134B0A19D4B2DC7086780D0A13 +S31508008790AA19D2B29A7046785E7000789542187017 +S315080087A003D90136F6B25E708EB1C9B28C420CDAC4 +S315080087B00132D0B20749987038B94B785A1CD0B2F2 +S315080087C0487010B90B785A1C0A7070BC7047013093 +S315080087D01870EAE7682E002010B5094C2368014690 +S315080087E003F10800FFF7CCFF064A2368507814788F +S315080087F09178D2781C7258729972DA7210BD00BFDD +S3150800880098270020682E002008B500200649142263 +S31508008810FFF742FF10B94FF6FF7008BD030A43EA97 +S31508008820002080B208BD00BF222800200620FFF7DE +S3150800883087BF00BF42F67C6042F29C71C2F200001C +S31508008840C2F2000142F6786242F66C6330B4C2F2B4 +S3150800885000020024C2F2000304804C7601204FF483 +S31508008860806125461070198030BC7047064B074A50 +S31508008870198810B40024147019B10120107010BCA6 +S3150800888070471880FBE700BF7C2E0020782E00205A +S315080088902DE9F04FB74CB84AB84FB94BD2F800900B +S315080088A004F1360103288BB0396019600DD002280F +S315080088B01AD0A07B452800F0C780B24EB24D0020E2 +S315080088C0288030700BB0BDE8F08F99F8195005F084 +S315080088D00F06032EF1D1B9F81000AA4EAA4D0028AA +S315080088E0EDD1DFF8B0822EE0A84DEE78711CC8B243 +S315080088F0E87060B9AA78561CF1B2A97039B96878D7 +S31508008900421CD6B26E7016B92978481C287099F898 +S3150800891019209D4DDFF87C820026072A2E80A8F8AC +S31508008920006000F0E080052A00F0DD80002A00F0F3 +S31508008930E380B9F81010002940F0E08002F00F003B +S315080089400328904EBBD108223270009301F040F9FB +S31508008950009B327802F02001C9B2002900F06A8132 +S315080089600021A8F800101420DFF82C8289F81910C5 +S3150800897084F82F0028222A80502784F82E7099F828 +S315080089800810B8F8007084F82A1099F80930B8F871 +S31508008990021084F82B3099F80A00764B84F82C00DC +S315080089A099F80B2084F82D2099F80C0084F82600F5 +S315080089B099F80D2084F8272099F80E0084F82800E5 +S315080089C099F80F00062284F82900E275B9F8040020 +S315080089D06084B9F806006783A084A183B9F80010FB +S315080089E0E183B9F80200208499F8191001F0100003 +S315080089F0C1B2002900F00C81002083F8310083F809 +S31508008A0030002B88402100251A0AA1752274637448 +S31508008A1084F8355084F834506586FFF707FF5C4ABA +S31508008A20E57313886575591C8BB2C043190A6086AD +S31508008A3045201380A0732575A174E3742583FFF779 +S31508008A40E3FEC24322834BE04F4D94F81090667CB8 +S31508008A50298806EB092989454EDC207D1FFA89F904 +S31508008A608006A5F8009047D1667D002E44D1DFF830 +S31508008A702881B8F80060002E40F0D080B8F80210BF +S31508008A80002940F0CB8001920093FFF7BDFE4FF618 +S31508008A90FF7290428246009B01982DD1E17DDFF856 +S31508008AA0D4B0062900F01A81012925D19BF8222085 +S31508008AB0082A21D1BBF824004FF6F6710023884214 +S31508008AC08BF8223040F29E810930ABF82400608B87 +S31508008AD0A28BB8F8023066832A4EE0832284A383E9 +S31508008AE000233370EEE699F81A60701CC2B2782A31 +S31508008AF089F81A2000F08780224EE0E699F81A6075 +S31508008B00711E89F81A10002EF6D199F81B60082EE6 +S31508008B1000F0CF80501E012840F2C880042E00F2D3 +S31508008B20C180032101FA06F1C8B202F00F0201362C +S31508008B30511E89F81A0089F81B600729DCD801A09C +S31508008B4050F821F0FF8B0008CF8B00089D8B00089A +S31508008B50658B0008F98A0008658B0008F98A000801 +S31508008B60658B0008074EDFF83080112384F82F3014 +S31508008B7000E700BF1428002098270020582E002060 +S31508008B80802E0020642E0020082800205C2E00205D +S31508008B900A28002010280020602E0020C24E04203B +S31508008BA03070009301F014F8B8F80020009B1B6899 +S31508008BB03B60002A67D0B9F81000002863D0283037 +S31508008BC01823288084F82F30DFF8F482D4E6DFF8FB +S31508008BD0F0820227042684F82F70022206210A232F +S31508008BE02C20602784F8376084F8362084F83810FB +S31508008BF084F83930288084F82E70AB4EBFE6DFF84B +S31508008C00C0821227E6E7002189F81910A64E56E613 +S31508008C1083F830200A2283F83120F2E6E08BB0424E +S31508008C207FF46AAFA149088CB8F8021088427FF42D +S31508008C3063AF28E702F01000C0B278B10120042221 +S31508008C401127A9F8100089F8192089F81B10A8F827 +S31508008C50001084F82F70DFF868828BE6B8F80010E9 +S31508008C6011B3D20733D5A9F81000B9F812209142EA +S31508008C7088BFA8F80020B8F80020A9F8102000211D +S31508008C8089F81B1093E7327802F00201CBB2002B69 +S31508008C903FF415AE282710212F8084F82F10DFF80F +S31508008CA0208269E6302040E70A46E8E7052E7FF489 +S31508008CB035AF00227C4E89F819208021317000F0EA +S31508008CC087FF142384F82F30DFF8F48152E6B9F8C9 +S31508008CD01020002AC9D076480280D0E70093019078 +S31508008CE0FFF7A4FD5045019A009B7FF405AFDFF816 +S31508008CF0D4A19AF8190030B1BBF82460BAF8041068 +S31508008D008E4200F0838094F82F3003F03F06022E3F +S31508008D105ED0654E94F82F20644B02F00400C1B271 +S31508008D2000297FF4CCAD93F82DA093F82BC093F8C7 +S31508008D30297083F829A04FF0140A93F8262093F88F +S31508008D40280093F82C9093F8271093F82AE083F8D4 +S31508008D502FA001374FF0280A83F827C0DFF85CC137 +S31508008D60A5F800A0FFB24FF0500A83F82EA083F8AA +S31508008D70289083F82C0083F82B108CF8002083F8B1 +S31508008D8026E083F82A2083F82D7067B90130C7B228 +S31508008D9083F82C703FB90131C8B283F82B0010B99B +S31508008DA0013283F82A20638CB4F824E0678BB4F880 +S31508008DB01CC0B8F80010B8F802203E48A4F822E013 +S31508008DC00380A384E783A4F820C06183A28318E6FE +S31508008DD0364F3949BB8C0988DFF8D890374FA9F840 +S31508008DE00030002699423E7003D001222E4E3A707A +S31508008DF090E7002800F02381072800F01E81012053 +S31508008E00387079E60830ABF8240060E6BBF82260D3 +S31508008E10BAF806108E427FF476AFBBF81A60BAF835 +S31508008E2000108E427FF46FAFBBF81C60BAF80210D0 +S31508008E308E427FF468AF9BF82FC01B4ECDF808C052 +S31508008E400CF0040E00215FFA8EFCC2F800A0317007 +S31508008E50BCF1000F66D19BF82EE0DFF860B04FEA50 +S31508008E601E1C4FEA8C01A9F11409C1EB090E00F08A +S31508008E700F001FFA8EF902288BF80010A5F800904B +S31508008E8022D0B9F1000F02D10298810722D0B4F896 +S31508008E9026E0BAF808108E4558D01027DFF8249037 +S31508008EA084F82F7066E500BF642E00201428002081 +S31508008EB0102800206E2E00207C2E0020782E002000 +S31508008EC0602E00209C270020DDF808C00CF03F012A +S31508008ED01229D6D1DDF808E00EF01001C8B220B18B +S31508008EE0BAF81010DFF84893C1BB9AF8191001F0C8 +S31508008EF00F00013807283FF6E2AC0FF2080C5CF8C1 +S31508008F0020F000BF0B930008E5920008D5910008F1 +S31508008F1099910008439100082B9100089B8E000840 +S31508008F20338F000820228AF81910327000F050FE9C +S31508008F30C5E43378DB077FF5C2AC0022BA488AF865 +S31508008F4019201021017000F043FEB8E4B748B8496B +S31508008F50B0F828C0488984459FD1BBE709F10C00C1 +S31508008F6001920093FFF70CFCB24994F82A2091F875 +S31508008F7000C0009BCDF808C09445019AB5D142F6C9 +S31508008F801400C2F2000091F801E090F82B00CDF829 +S31508008F900CE08645A9D142F61400C2F2000091F809 +S31508008FA002C090F82C00CDF814C084459DD142F635 +S31508008FB01400C2F20000C97890F82D00814294D1BD +S31508008FC0DDF808E0DDF80CC089F80CE099F81B001C +S31508008FD0DDF814E089F80DC089F80EE089F80F105D +S31508008FE008BB99F818C099F81A0099F81610C0EB3A +S31508008FF00C00A0EBD100C0B241185FFA81FEC1B2E5 +S3150800900011F0800F89F816E001D04042C1B29AF8F3 +S315080090101700A0EB90004118C8B200EBDE0C8AF8E6 +S3150800902017008AF818C09AF8181001208AF81A103A +S3150800903000213070AAF8101057E7012139707E4ECA +S31508009040C2F800A096F800C096F801E0B178F0786A +S3150800905094F82960AAF80430069694F827600590D3 +S315080090604FF0030B8AF81AB08AF818B008964FF032 +S31508009070040B00268AF816608AF817B08AF81B606F +S31508009080638C94F82800AAF80630638B0790AAF830 +S31508009090003094F82600A38B8AF80CC08AF80E10C4 +S315080090A0DDF814C00699099001221046AAF8023084 +S315080090B08AF819208AF80DE08AF80FC0AAF8102055 +S315080090C08AF80B10079ADDF820E0099B8AF80A202F +S315080090D08AF809E08AF80830FFF77EFB94F82E0034 +S315080090E000F0F001502940F34D8120FA0BF3534A62 +S315080090F0581F800013780EE091F836307BB1012BAB +S3150800910000F04481022B2BD09EF8371001EB060E97 +S3150800911029B15FFA8EF6A11986428E46ECDB3E70BF +S315080091201370DFF80C91122754E53378DB077FF5C7 +S31508009130C6AB072200218AF819208AF81A10FFF709 +S31508009140BEBB288808B1FFF747FB94F82F00C20773 +S3150800915000F11F812A88002A7FF49FAEFFF7AFBB74 +S3150800916091F837C0BCF1040FCED191F8380091F8C8 +S315080091703910137041EA002203F5C1639A4238BFD9 +S3150800918013463E70A9F80020AAF81230AAF814303F +S31508009190DFF89C9012271DE5288808B1FFF71CFB0D +S315080091A094F82F1011F0010000F091803778F80735 +S315080091B040F18980002307228AF819208AF81A3094 +S315080091C0AAF810300120FFF707FB1021317000F0D4 +S315080091D0FFFC62E694F82F20D00731D501F0100085 +S315080091E0C0B268BBBAF81030002B7FF468AB2F8882 +S315080091F0791C88B2FFF7F0FA30782A8840F0100315 +S3150800920033701AB1084940F012070F7000F0E0FCFD +S31508009210012008220023DFF81890AAF810008AF81F +S3150800922019208AF81B30A0E4642E00201428002098 +S315080092309C270020682E00205C2E0020842E00200B +S3150800924002F02002D0B268B194F8348094F8350060 +S315080092503A68B5F800E040EA08201218C0EB0E009C +S315080092603A602880288858B101F01001CAB23AB984 +S31508009270317841F0020232700093FFF7ADFA009B95 +S3150800928094F830C094F83110BAF814006C4A01EB1F +S315080092900C2189B28142118000D801B9108010884A +S315080092A03278AAF8120091073FF409ABDFF8A081DB +S315080092B0DFF8A0910020A8F80000009300F088FCD1 +S315080092C0009BFFF746BB06208AF819007AE7337831 +S315080092D0D9077FF53FAF05218AF81910AAF81000BB +S315080092E0FFF7EDBA3178C90705D594F82F0000F0D5 +S315080092F03F01122920D020233370019200F068FC28 +S31508009300019A10680021417604E531784D4AC8076C +S315080093107FF5D5AA03218AF81910288840211170EB +S315080093200021AAF810100028C0D04221117000931D +S31508009330FFF752FA009BB9E7434991F82E2002F04D +S31508009340F00050284CDD41481109A1F105080178C3 +S315080093504FEA880C002204EB020E6245F04668DAF2 +S315080093609EF83610002964D0012966D002291ED03D +S3150800937098F837E00EEB0208BEF1000F59D05FFAF5 +S3150800938088F2E8E7DFF8CC90122723E40136F6B234 +S31508009390C1E60023072701208AF819708AF81A30CF +S315080093A0FFF71AFA1022327000F012FC75E59EF8E3 +S315080093B03790B9F1040FDBD19EF838C09EF8399082 +S315080093C001708BF8002049EA0C2001F5C1611C4A9E +S315080093D0884238BF01461080AAF81210AAF814105D +S315080093E094F8260094F827E094F8281094F8292091 +S315080093F08AF808004FF0030C8AF819C08AF809E0C1 +S315080094008AF80A108AF80B2001200093DFF84080BA +S31508009410DFF84090FFF7E0F900234220AAF8103061 +S315080094202B80A8F80030307000F0D2FB009BFFF7C5 +S3150800943090BA01708BF80020D2E70132D2B28AE7DF +S315080094406E2E0020642E002014280020842E002072 +S31508009450102800209C270020030A43EA002080B237 +S31508009460704700BF0A1E034609DD05490868054915 +S3150800947083420A8003D0194692B200F0EFBB7047C8 +S31508009480802E002010280020F8B59C4B9C4A18888E +S315080094909C4E918BD48B20B15A8812B1884200F029 +S315080094A0DA809A89954822B1C58915B18A4200F0B1 +S315080094B0ED801A8B914822B1458B15B18A4200F08E +S315080094C0EC809A8C8D4822B1C58C15B18A4200F081 +S315080094D0EB801A8E894822B1458E15B18A4200F072 +S315080094E0EA809A8F854822B1C58F15B18A4200F065 +S315080094F0C680B3F8482081482AB1B0F84A5015B159 +S315080095008A4200F0AE80B3F854207C482AB1B0F8FD +S31508009510565015B18A4200F0AB801D88774C1DB9AC +S315080095206588002D00F094809989744C19B9E289F0 +S31508009530002A00F0D080188B704C18B9658B002D66 +S3150800954000F0CC80998C6D4C19B9E28C002A00F099 +S31508009550C880188E694C18B9658E002D00F0C48035 +S31508009560998F664C19B9E28F002A00F0C080B3F8CB +S315080095704800624C20B9B4F84A50002D00F0BA8071 +S31508009580B3F854105D4C00295CD05F4D9F7A29785A +S315080095900024CF1B22462046A7429C7DC8BFFAB2AC +S315080095A00C1B9442C8BFE2B293F82240C4EB0104F4 +S315080095B0C8BF01209442C8BFE2B293F82E40C4EB5C +S315080095C00104C8BF02209442C8BFE2B293F83A40E9 +S315080095D0C4EB0104C8BF03209442C8BFE2B293F8A3 +S315080095E04640C4EB0104C8BF04209442C8BFE2B297 +S315080095F093F85240C4EB0104C8BF05209442C8BF83 +S31508009600E2B293F85E40C4EB0101C8BF062091425E +S31508009610C8BFCAB23D49C8BF07200A703C4A307065 +S3150800962000EB4004107003EB84043A4904222046F8 +S3150800963000F014FB201D3849062200F00FFB2B789A +S31508009640A372F8BDB4F85620002A9ED107255434D3 +S3150800965035702D4DE9E7A2427FF423AF00221C4660 +S315080096602FE0A5427FF44FAF062200F1480428E018 +S31508009670A5427FF452AF072200F1540421E0A54227 +S315080096807FF437AF052200F13C041AE0A5427FF4C7 +S3150800969010AF012200F10C0413E0A5427FF411AFCC +S315080096A0022200F118040CE0A5427FF412AF03224F +S315080096B000F1240405E0A5427FF413AF042200F16B +S315080096C0300415493270201D062200F0C7FA0E48EC +S315080096D00178A172F8BD01250C34B9E702251834C2 +S315080096E0B6E703252434B3E704253034B0E7052567 +S315080096F03C34ADE706254834AAE700BF882E00208B +S3150800970014280020852E0020E92E0020862E002011 +S31508009710E82E0020302800202A28002070B5154E93 +S31508009720154C3278154D0023501C3070237005E017 +S315080097302078421CD3B2072B23701AD803EB4303B5 +S3150800974005EB830035F82310428842EA010399B2F3 +S315080097500029EDD03278837AD11A7729E8DD0422F8 +S31508009760002100F09FFA2078421CD3B2072B237001 +S31508009770E4D970BDE92E0020852E0020882E002011 +S31508009780F8B52A4C2388292B40D9294DAA8A0020C6 +S31508009790B2F5807F2080074603D0B2F5007F38D027 +S315080097A0F8BD244EE98C32889142F9D1288D738808 +S315080097B09842F5D1FFF768FE022305F11601062245 +S315080097C005F120006B752F7500F048FA1A49062234 +S315080097D005F1160000F042FA06221749A81800F00B +S315080097E03DFA05F120010622284600F037FAA88B33 +S315080097F0E98B32887388E8842985AA83082006219C +S315080098002A22EB83287369732280F8BD00232380FC +S31508009810F8BD084BE98C1A889142C1D1288D5B881E +S315080098209842BDD1BDE8F840FFF72EBE08280020B3 +S3150800983014280020602E0020702E0020F8B56F4CEA +S31508009840E38B4FF6FF7293427AD06D4E6D4D328898 +S31508009850298883EA0200084267D06B496B4D0B885A +S3150800986048882B8068806A4ADFF8C8E110886988CA +S3150800987098427BD09089664F984200F08480108B7E +S31508009880634F984200F08F80908C614F984200F0A9 +S315080098908280108E5E4F984200F08D80908F5C4FCC +S315080098A0984200F09080B2F84800594F984200F06C +S315080098B09B80B2F8542056489A4200F08C800827BC +S315080098C0FF2106224D488EF8007000F0EBF90021C2 +S315080098D00622504800F0E6F94F495048062200F0A3 +S315080098E0BDF94D494E48062200F0B8F92988708816 +S315080098F0E18400230121E0830420B5F802C0E07466 +S31508009900062223756175A373E17363743588454927 +S31508009910454B46486273A2742A2227742773A4F813 +S3150800992028C0A58319600280F8BD218C70886D88CF +S3150800993081EA00022A4290D1344D2B80698092E751 +S31508009940208C984281D120463949062200F086F9B2 +S3150800995031493248062200F081F934480288082342 +S315080099600E320021237361730280F8BD5088884245 +S3150800997080D1002311460431062220488EF8003093 +S3150800998000F06CF9E4E7F88988427FF478AF0123A0 +S3150800999007F10C01EFE7F88C88427FF47AAF0323CE +S315080099A007F12401E7E7788B88427FF46DAF02233D +S315080099B007F11801DFE7788E88427FF46FAF04233A +S315080099C007F13001D7E7F88F88427FF46CAF05239B +S315080099D007F13C01CFE7B0F856308B427FF46FAF02 +S315080099E0072300F15401C6E7B7F84A0088427FF416 +S315080099F060AF062307F14801BDE700BF1428002021 +S31508009A00602E0020042800200C280020EC2E0020C0 +S31508009A10882E002034280020702E00201A280020C6 +S31508009A202A2800204A280020582E0020082800202E +S31508009A3098A80008852E002038B5F8F75FFBFAF7D6 +S31508009A406FFF42F6F463C2F2000300F5FA7018607D +S31508009A50FAF766FF42F6F061C2F2000100F51C5201 +S31508009A6010320A60FEF7E6FE42F66061C2F20001B5 +S31508009A7042F60402C2F200024FF6A96443F61375D1 +S31508009A800C804D8042F60C034FF6FF71C2F20003BC +S31508009A901180002151804EF6030040F213121C80FB +S31508009AA05A80FEF7E3FEBDE83840F8F755BC00BF1C +S31508009AB0F8B5164B1F68FA693A62E1B14C1EA4B2B2 +S31508009AC0661C012307F11C020578B342157204EAE5 +S31508009AD0030410D02CB144780223B34287F82540FA +S31508009AE009D0C55CD41801332572C55CD418013376 +S31508009AF0B3422572F5D10431A7F8641007F12000A6 +S31508009B00FFF7B0FCF869411CF961F8BD98270020F9 +S31508009B1070B5F8F733FCF8B9FAF702FF264B1A685E +S31508009B2090420BD325482649264C086002F5FA725E +S31508009B3002201A60FEF7ACFE238843BBFAF7F0FE54 +S31508009B4021490A68904205D302F51C5310330B606D +S31508009B50FFF7E4FD002070BD1A4D1C4C28804FF419 +S31508009B600060A689FFF778FC864217D040F6060003 +S31508009B70A489FFF771FC8442CED1FFF701FE2B883A +S31508009B80002BC9D0F8F71EFC00202880C4E7FFF791 +S31508009B9055FEF8F717FC00202080CFE70120FEF7D6 +S31508009BA077FE29880029B7D0FFF748FEF8F70AFCA0 +S31508009BB000222A80B0E700BFF42E00209C27002050 +S31508009BC09827002008280020F02E002014280020BE +S31508009BD038B5174D174A2B78146803F04000C2B2FF +S31508009BE0CAB9D90703F00401C8B248BFA4F864206B +S31508009BF010B1B4F86410A1B903F00202D1B201B9E8 +S31508009C0038BD0D4802680023101DA4F86430BDE86D +S31508009C103840FBF70FBC01210020E161A4F864007D +S31508009C2038BD04F12000FFF71DFC2B78E4E700BFE0 +S31508009C30642E002098270020582E0020A0F130001E +S31508009C4009288CBF00200120704700BFA0F16103DE +S31508009C50D9B2192998BF2038704700BF844640EA10 +S31508009C60010313F0030F40F01080242AC0F00D8082 +S31508009C702DE9F00FB1E8F80FA0E8F80FA2F12402D9 +S31508009C80242ABFF4F7AFBDE8F00F002A00F00780DA +S31508009C9011F8013B00F8013B013A7FF4F9AF604641 +S31508009CA0704700BF8446002A00F0328010F0030F88 +S31508009CB000F0078000F8011B013A00F02980FFF741 +S31508009CC0F5BF282AC0F01F80A2F128022DE9F00F5F +S31508009CD001F0FF0141EA012141EA014141EA01613E +S31508009CE00B460C460D460E460F46884689468A465A +S31508009CF08B46A0E8FA0F283ABFF4FBAFBDE8F00F91 +S31508009D00283200F0058000F8011B013A7FF4FBAF0A +S31508009D106046704738B504460D4600F019F842F615 +S31508009D20F863C2F200031D6044F0800442F6FC604A +S31508009D30C2F200000460024611680029FCD100F056 +S31508009D4009F842F6F863C2F20003186838BD00BF86 +S30D08009D50704700BF704700BF11 +S31508009D58433A2F576F726B2F736F66747761726504 +S31508009D682F4F70656E424C542F5461726765742F75 +S31508009D7844656D6F2F41524D434D345F53544D33EF +S31508009D88325F4F6C696D65785F53544D333245348D +S31508009D9830375F43726F7373776F726B732F426FC7 +S31508009DA86F742F6964652F2E2E2F6C69622F75695B +S31508009DB8702F6E65746465762E63000002010200D2 +S31508009DC82F64656D6F70726F675F6F6C696D657804 +S31508009DD85F73746D3332653430372E73726563007A +S31508009DE82F626F6F746C6F672E74787400000000AA +S31508009DF857696E5553422042756C6B20496E7465D7 +S31508009E08726661636500000044656661756C740076 +S31508009E1830303030303030303035304300000000D4 +S31508009E284F70656E424C54205573657200000000E9 +S31508009E3857696E5553422042756C6B20446576699E +S31508009E4863650000433A2F576F726B2F736F6674FA +S31508009E58776172652F4F70656E424C542F54617244 +S31508009E686765742F44656D6F2F41524D434D345FB6 +S31508009E7853544D33325F4F6C696D65785F53544D53 +S31508009E883332453430375F43726F7373776F726B4B +S31508009E98732F426F6F742F6964652F2E2E2F2E2EFF +S31508009EA82F2E2E2F2E2E2F536F757263652F415224 +S31508009EB84D434D345F53544D33322F43726F73738A +S31508009EC8776F726B732F766563746F72732E630080 +S31508009ED8000008001000180020002800300038008C +S31508009EE840004800500058008000880090009800FC +S31508009EF8A000A800B000B800C000C800D000D8006C +S31508009F0800C0000800400000030000000000010827 +S31508009F18000001000400000000000208000002001A +S31508009F280500000000000408000002000600000002 +S31508009F3800000608000002000700000000000808E4 +S31508009F48000002000800000000000A0800000200DD +S31508009F580900000000000C08000002000A000000C2 +S31508009F6800000E08000002000B000000433A2F57B5 +S31508009F786F726B2F736F6674776172652F4F706592 +S31508009F886E424C542F5461726765742F44656D6F21 +S31508009F982F41524D434D345F53544D33325F4F6C06 +S31508009FA8696D65785F53544D3332453430375F43AE +S31508009FB8726F7373776F726B732F426F6F742F6933 +S31508009FC864652F2E2E2F2E2E2F2E2E2F2E2E2F5304 +S31508009FD86F757263652F41524D434D345F53544D27 +S31508009FE833322F756172742E63000000433A2F5777 +S31508009FF86F726B2F736F6674776172652F4F706512 +S3150800A0086E424C542F5461726765742F44656D6FA0 +S3150800A0182F41524D434D345F53544D33325F4F6C85 +S3150800A028696D65785F53544D3332453430375F432D +S3150800A038726F7373776F726B732F426F6F742F69B2 +S3150800A04864652F2E2E2F2E2E2F2E2E2F2E2E2F5383 +S3150800A0586F757263652F41524D434D345F53544DA6 +S3150800A06833322F63616E2E63000000000502060274 +S3150800A078060307030803090309040A040B040C0466 +S3150800A0880C050D050E050F050F0610061007100816 +S3150800A098433A2F576F726B2F736F667477617265C1 +S3150800A0A82F4F70656E424C542F5461726765742F32 +S3150800A0B844656D6F2F41524D434D345F53544D33AC +S3150800A0C8325F4F6C696D65785F53544D333245344A +S3150800A0D830375F43726F7373776F726B732F426F84 +S3150800A0E86F742F6964652F2E2E2F2E2E2F2E2E2F46 +S3150800A0F82E2E2F536F757263652F41524D434D347B +S3150800A1085F53544D33322F7573622E630000000077 +S3150800A11808003F0008003F004F70656E424C540027 +S3150800A128433A2F576F726B2F736F66747761726530 +S3150800A1382F4F70656E424C542F5461726765742FA1 +S3150800A14844656D6F2F41524D434D345F53544D331B +S3150800A158325F4F6C696D65785F53544D33324534B9 +S3150800A16830375F43726F7373776F726B732F426FF3 +S3150800A1786F742F6964652F2E2E2F2E2E2F2E2E2FB5 +S3150800A1882E2E2F536F757263652F66696C652E635D +S3150800A198000000004669726D776172652075706403 +S3150800A1A86174652072657175657374206465746574 +S3150800A1B8637465640A0D00004F70656E696E6720E2 +S3150800A1C86669726D776172652066696C6520666F67 +S3150800A1D8722072656164696E672E2E2E0000000073 +S3150800A1E84552524F520A0D004F4B0A0D0000000007 +S3150800A1F85374617274696E67207468652070726F2B +S3150800A2086772616D6D696E672073657175656E63D2 +S3150800A218650A0D0050617273696E67206669726D0A +S3150800A228776172652066696C6520746F206F627441 +S3150800A23861696E2065726173652073697A652E2E69 +S3150800A2482E00000045726173696E672000000000E1 +S3150800A2582062797465732066726F6D206D656D6FFF +S3150800A26872792061742030780000000052656164B4 +S3150800A278696E67206C696E652066726F6D206669FF +S3150800A2886C652E2E2E4552524F520A0D00000000BC +S3150800A298496E76616C696420636865636B73756D6E +S3150800A2A820666F756E642E2E2E4552524F520A0D31 +S3150800A2B80000000050726F6772616D6D696E6720E5 +S3150800A2C80000000020627974657320746F206D653C +S3150800A2D86D6F72792061742030780000577269743E +S3150800A2E8696E672070726F6772616D20636865634F +S3150800A2F86B73756D2E2E2E00436C6F73696E67200F +S3150800A3086669726D776172652066696C650A0D0003 +S3150800A3184669726D77617265207570646174652027 +S3150800A3287375636365737366756C6C7920636F6D93 +S3150800A338706C657465640A0D00000000222A3A3CB0 +S3150800A3483E3F7C7F000000002B2C3B3D5B5D0000F8 +S3150800A358809A90418E418F804545454949498E8F57 +S3150800A3689092924F994F555559999A9B9C9D9E9FA5 +S3150800A37841494F55A5A5A6A7A8A9AAABAC21AEAF32 +S3150800A388B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF3F +S3150800A398C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF2F +S3150800A3A8D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF1F +S3150800A3B8E0E1E2E3E4E5E6E7E8E9EAEBECEDEEEF0F +S3150800A3C8F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFFFF +S3150800A3D86100620063006400650066006700680043 +S3150800A3E869006A006B006C006D006E006F007000F3 +S3150800A3F871007200730074007500760077007800A3 +S3150800A40879007A00A100A200A300A500AC00AF005D +S3150800A418E000E100E200E300E400E500E600E7000A +S3150800A428E800E900EA00EB00EC00ED00EE00EF00BA +S3150800A438F000F100F200F300F400F500F600F80069 +S3150800A448F900FA00FB00FC00FD00FE00FF00010110 +S3150800A45803010501070109010B010D010F0111018E +S3150800A46813011501170119011B011D011F012101FE +S3150800A47823012501270129012B012D012F0131016E +S3150800A4883301350137013A013C013E0140014201D9 +S3150800A4984401460148014B014D014F015101530141 +S3150800A4A85501570159015B015D015F0161016301AE +S3150800A4B86501670169016B016D016F01710173011E +S3150800A4C8750177017A017C017E019201B103B20315 +S3150800A4D8B303B403B503B603B703B803B903BA039A +S3150800A4E8BB03BC03BD03BE03BF03C003C103C30349 +S3150800A4F8C403C503C603C703C803C903CA0330048C +S3150800A5083104320433043404350436043704380471 +S3150800A51839043A043B043C043D043E043F04400421 +S3150800A52841044204430444044504460447044804D1 +S3150800A53849044A044B044C044D044E044F04510480 +S3150800A5485204530454045504560457045804590429 +S3150800A5585A045B045C045E045F047021712172214D +S3150800A56873217421752176217721782179217A2119 +S3150800A5787B217C217D217E217F2141FF42FF43FFEC +S3150800A58844FF45FF46FF47FF48FF49FF4AFF4BFF81 +S3150800A5984CFF4DFF4EFF4FFF50FF51FF52FF53FF31 +S3150800A5A854FF55FF56FF57FF58FF59FF5AFF00003B +S3150800A5B8C700FC00E900E200E400E000E500E70067 +S3150800A5C8EA00EB00E800EF00EE00EC00C400C50066 +S3150800A5D8C900E600C600F400F600F200FB00F90020 +S3150800A5E8FF00D600DC00A200A300A500A720920160 +S3150800A5F8E100ED00F300FA00F100D100AA00BA0064 +S3150800A608BF001023AC00BD00BC00A100AB00BB0016 +S3150800A6189125922593250225242561256225562507 +S3150800A62855256325512557255D255C255B25102568 +S3150800A638142534252C251C2500253C255E255F2553 +S3150800A6485A25542569256625602550256C256725CC +S3150800A65868256425652559255825522553256B25CA +S3150800A6686A2518250C25882584258C259025802576 +S3150800A678B103DF009303C003A303C303B500C403F0 +S3150800A688A6039803A903B4031E22C603B503292201 +S3150800A6986122B1006522642220232123F70048227B +S3150800A6A8B0001922B7001A227F20B200A025A00000 +S3150800A6B84100420043004400450046004700480060 +S3150800A6C849004A004B004C004D004E004F00500010 +S3150800A6D851005200530054005500560057005800C0 +S3150800A6E859005A002100E0FFE1FFE5FFE2FFE3FF1A +S3150800A6F8C000C100C200C300C400C500C600C70028 +S3150800A708C800C900CA00CB00CC00CD00CE00CF00D7 +S3150800A718D000D100D200D300D400D500D600D80086 +S3150800A728D900DA00DB00DC00DD00DE007801000174 +S3150800A73802010401060108010A010C010E011001B3 +S3150800A74812011401160118011A011C011E01200123 +S3150800A75822012401260128012A012C012E01300193 +S3150800A76832013401360139013B013D013F014101FE +S3150800A7784301450147014A014C014E015001520166 +S3150800A7885401560158015A015C015E0160016201D3 +S3150800A7986401660168016A016C016E017001720143 +S3150800A7A87401760179017B017D0191019103920378 +S3150800A7B893039403950396039703980399039A03B7 +S3150800A7C89B039C039D039E039F03A003A103A30366 +S3150800A7D8A403A503A603A703A803A903AA031004A9 +S3150800A7E8110412041304140415041604170418048F +S3150800A7F819041A041B041C041D041E041F0420043F +S3150800A80821042204230424042504260427042804EE +S3150800A81829042A042B042C042D042E042F040104CD +S3150800A82802040304040405040604070408040904C6 +S3150800A8380A040B040C040E040F046021612162212A +S3150800A84863216421652166216721682169216A21B6 +S3150800A8586B216C216D216E216F2121FF22FF23FFB9 +S3150800A86824FF25FF26FF27FF28FF29FF2AFF2BFF9E +S3150800A8782CFF2DFF2EFF2FFF30FF31FF32FF33FF4E +S3150800A88834FF35FF36FF37FF38FF39FF3AFF000038 +S30D0800A898FFFFFFFFFFFF0000B0 +S3150800A8A0010000000100000000000000010203048E +S3150800A8B001020304060708091C000020ED2500080C +S3150800A8C031250008E52400084D240008B5240008B1 +S3150800A8D031240008192400085D2400086D240008A6 +S3150800A8E07D2400089524000809022000010100C003 +S3150800A8F0320904000002FF0000000705810240003B +S3150800A900FF070501024000FF2D4100081541000818 +S3150800A9105D4100080000000000000000FD4000083E +S3150800A92009410008E540000800000000000000009A +S3150800A930D5400008D5410008E54100085542000801 +S3150800A940754200083542000815420008F54100081E +S3150800A9500403090412011001000000404501230008 +S3150800A960000101020301000095420008994200080F +S3150800A9709D420008B5420008B1420008A9420008F5 +S30A0800A980A142000804D5 S7050800018968 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 de43df14..b77ace81 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 @@ -55,7 +55,7 @@ /** \brief Motorola or Intel style byte ordering. */ #define BOOT_CPU_BYTE_ORDER_MOTOROLA (0) /** \brief Enable/disable hook function call right before user program start. */ -#define BOOT_CPU_USER_PROGRAM_START_HOOK (0) +#define BOOT_CPU_USER_PROGRAM_START_HOOK (1) /**************************************************************************************** @@ -108,6 +108,20 @@ #define BOOT_COM_UART_CHANNEL_INDEX (5) +/* The USB communication interface is selected by setting the BOOT_COM_USB_ENABLE + * configurable to 1. The maximum amount of data bytes in a message for data transmission + * and reception is set through BOOT_COM_USB_TX_MAX_DATA and BOOT_COM_USB_RX_MAX_DATA, + * respectively. + * + */ +/** \brief Enable/disable USB transport layer. */ +#define BOOT_COM_USB_ENABLE (1) +/** \brief Configure number of bytes in the target->host data packet. */ +#define BOOT_COM_USB_TX_MAX_DATA (63) +/** \brief Configure number of bytes in the host->target data packet. */ +#define BOOT_COM_USB_RX_MAX_DATA (63) + + /* 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 diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/hooks.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/hooks.c index 36fbe521..5ac48350 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/hooks.c +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/hooks.c @@ -69,6 +69,48 @@ blt_bool BackDoorEntryHook(void) #endif /* BOOT_BACKDOOR_HOOKS_ENABLE > 0 */ +/**************************************************************************************** +* U S B C O M M U N I C A T I O N I N T E R F A C E H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_COM_USB_ENABLE > 0) +/************************************************************************************//** +** \brief Callback that gets called whenever the USB device should be connected +** to the USB bus. +** \param connect BLT_TRUE to connect and BLT_FALSE to disconnect. +** \return none. +** +****************************************************************************************/ +void UsbConnectHook(blt_bool connect) +{ +} /*** end of UsbConnect ***/ + + +/************************************************************************************//** +** \brief Callback that gets called whenever the USB host requests the device +** to enter a low power mode. +** \return none. +** +****************************************************************************************/ +void UsbEnterLowPowerModeHook(void) +{ + /* support to enter a low power mode can be implemented here */ +} /*** end of UsbEnterLowPowerMode ***/ + + +/************************************************************************************//** +** \brief Callback that gets called whenever the USB host requests the device to +** exit low power mode. +** \return none. +** +****************************************************************************************/ +void UsbLeaveLowPowerModeHook(void) +{ + /* support to leave a low power mode can be implemented here */ +} /*** end of UsbLeaveLowPowerMode ***/ +#endif /* BOOT_COM_USB_ENABLE > 0 */ + + /**************************************************************************************** * C P U D R I V E R H O O K F U N C T I O N S ****************************************************************************************/ @@ -85,7 +127,11 @@ blt_bool BackDoorEntryHook(void) ****************************************************************************************/ blt_bool CpuUserProgramStartHook(void) { - /* okay to start the user program */ + /* do not start the user program is the pushbutton is pressed */ + if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET) + { + return BLT_FALSE; + } return BLT_TRUE; } /*** end of CpuUserProgramStartHook ***/ #endif /* BOOT_CPU_USER_PROGRAM_START_HOOK > 0 */ 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 742ba27c..3cfce0f6 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 @@ - + @@ -90,10 +90,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -115,6 +142,8 @@ + + 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 5d09cabd..703820db 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 @@ -48,9 +48,9 @@ - - + + @@ -63,8 +63,9 @@ - - + + + - + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_core.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_core.h new file mode 100644 index 00000000..e0884cac --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_core.h @@ -0,0 +1,120 @@ +/** + ****************************************************************************** + * @file usbd_core.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief Header file for usbd_core.c + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_CORE_H +#define __USBD_CORE_H + +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd.h" +#include "usbd_def.h" +#include "usbd_conf.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_CORE + * @brief This file is the Header file for usbd_core.c file + * @{ + */ + + +/** @defgroup USBD_CORE_Exported_Defines + * @{ + */ + +typedef enum { + USBD_OK = 0, + USBD_BUSY, + USBD_FAIL, +}USBD_Status; +/** + * @} + */ + + +/** @defgroup USBD_CORE_Exported_TypesDefinitions + * @{ + */ + + +/** + * @} + */ + + + +/** @defgroup USBD_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_FunctionsPrototype + * @{ + */ +void USBD_Init(USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID, + USBD_DEVICE *pDevice, + USBD_Class_cb_TypeDef *class_cb, + USBD_Usr_cb_TypeDef *usr_cb); + +USBD_Status USBD_DeInit(USB_OTG_CORE_HANDLE *pdev); + +USBD_Status USBD_ClrCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx); + +USBD_Status USBD_SetCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx); + +/** + * @} + */ + +#endif /* __USBD_CORE_H */ + +/** + * @} + */ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + + + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_def.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_def.h new file mode 100644 index 00000000..7c0cff76 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_def.h @@ -0,0 +1,156 @@ +/** + ****************************************************************************** + * @file usbd_def.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief general defines for the usb device library + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USBD_DEF_H +#define __USBD_DEF_H + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_conf.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USB_DEF + * @brief general defines for the usb device library file + * @{ + */ + +/** @defgroup USB_DEF_Exported_Defines + * @{ + */ + +#ifndef NULL +#define NULL 0 +#endif + +#define USB_LEN_DEV_QUALIFIER_DESC 0x0A +#define USB_LEN_DEV_DESC 0x12 +#define USB_LEN_CFG_DESC 0x09 +#define USB_LEN_IF_DESC 0x09 +#define USB_LEN_EP_DESC 0x07 +#define USB_LEN_OTG_DESC 0x03 + +#define USBD_IDX_LANGID_STR 0x00 +#define USBD_IDX_MFC_STR 0x01 +#define USBD_IDX_PRODUCT_STR 0x02 +#define USBD_IDX_SERIAL_STR 0x03 +#define USBD_IDX_CONFIG_STR 0x04 +#define USBD_IDX_INTERFACE_STR 0x05 + +#define USB_REQ_TYPE_STANDARD 0x00 +#define USB_REQ_TYPE_CLASS 0x20 +#define USB_REQ_TYPE_VENDOR 0x40 +#define USB_REQ_TYPE_MASK 0x60 + +#define USB_REQ_RECIPIENT_DEVICE 0x00 +#define USB_REQ_RECIPIENT_INTERFACE 0x01 +#define USB_REQ_RECIPIENT_ENDPOINT 0x02 +#define USB_REQ_RECIPIENT_MASK 0x03 + +#define USB_REQ_GET_STATUS 0x00 +#define USB_REQ_CLEAR_FEATURE 0x01 +#define USB_REQ_SET_FEATURE 0x03 +#define USB_REQ_SET_ADDRESS 0x05 +#define USB_REQ_GET_DESCRIPTOR 0x06 +#define USB_REQ_SET_DESCRIPTOR 0x07 +#define USB_REQ_GET_CONFIGURATION 0x08 +#define USB_REQ_SET_CONFIGURATION 0x09 +#define USB_REQ_GET_INTERFACE 0x0A +#define USB_REQ_SET_INTERFACE 0x0B +#define USB_REQ_SYNCH_FRAME 0x0C + +#define USB_DESC_TYPE_DEVICE 1 +#define USB_DESC_TYPE_CONFIGURATION 2 +#define USB_DESC_TYPE_STRING 3 +#define USB_DESC_TYPE_INTERFACE 4 +#define USB_DESC_TYPE_ENDPOINT 5 +#define USB_DESC_TYPE_DEVICE_QUALIFIER 6 +#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 7 + + +#define USB_CONFIG_REMOTE_WAKEUP 2 +#define USB_CONFIG_SELF_POWERED 1 + +#define USB_FEATURE_EP_HALT 0 +#define USB_FEATURE_REMOTE_WAKEUP 1 +#define USB_FEATURE_TEST_MODE 2 + +/** + * @} + */ + + +/** @defgroup USBD_DEF_Exported_TypesDefinitions + * @{ + */ +/** + * @} + */ + + + +/** @defgroup USBD_DEF_Exported_Macros + * @{ + */ +#define SWAPBYTE(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ + (((uint16_t)(*(((uint8_t *)(addr)) + 1))) << 8)) + +#define LOBYTE(x) ((uint8_t)(x & 0x00FF)) +#define HIBYTE(x) ((uint8_t)((x & 0xFF00) >>8)) +/** + * @} + */ + +/** @defgroup USBD_DEF_Exported_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_DEF_Exported_FunctionsPrototype + * @{ + */ + +/** + * @} + */ + +#endif /* __USBD_DEF_H */ + +/** + * @} + */ + +/** +* @} +*/ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_ioreq.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_ioreq.h new file mode 100644 index 00000000..3f6aea1a --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_ioreq.h @@ -0,0 +1,121 @@ +/** + ****************************************************************************** + * @file usbd_ioreq.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief header file for the usbd_ioreq.c file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USBD_IOREQ_H_ +#define __USBD_IOREQ_H_ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" +#include "usbd_core.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_IOREQ + * @brief header file for the usbd_ioreq.c file + * @{ + */ + +/** @defgroup USBD_IOREQ_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Exported_Types + * @{ + */ + + +/** + * @} + */ + + + +/** @defgroup USBD_IOREQ_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_IOREQ_Exported_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_IOREQ_Exported_FunctionsPrototype + * @{ + */ + +USBD_Status USBD_CtlSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *buf, + uint16_t len); + +USBD_Status USBD_CtlContinueSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len); + +USBD_Status USBD_CtlPrepareRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len); + +USBD_Status USBD_CtlContinueRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len); + +USBD_Status USBD_CtlSendStatus (USB_OTG_CORE_HANDLE *pdev); + +USBD_Status USBD_CtlReceiveStatus (USB_OTG_CORE_HANDLE *pdev); + +uint16_t USBD_GetRxCount (USB_OTG_CORE_HANDLE *pdev , + uint8_t epnum); + +/** + * @} + */ + +#endif /* __USBD_IOREQ_H_ */ + +/** + * @} + */ + +/** +* @} +*/ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_req.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_req.h new file mode 100644 index 00000000..f88416df --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_req.h @@ -0,0 +1,108 @@ +/** + ****************************************************************************** + * @file usbd_req.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief header file for the usbd_req.c file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USB_REQUEST_H_ +#define __USB_REQUEST_H_ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" +#include "usbd_core.h" +#include "usbd_conf.h" + + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_REQ + * @brief header file for the usbd_ioreq.c file + * @{ + */ + +/** @defgroup USBD_REQ_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_REQ_Exported_Types + * @{ + */ +/** + * @} + */ + + + +/** @defgroup USBD_REQ_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_REQ_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_REQ_Exported_FunctionsPrototype + * @{ + */ + +USBD_Status USBD_StdDevReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req); +USBD_Status USBD_StdItfReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req); +USBD_Status USBD_StdEPReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req); +void USBD_ParseSetupRequest( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +void USBD_CtlError( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len); +/** + * @} + */ + +#endif /* __USB_REQUEST_H_ */ + +/** + * @} + */ + +/** +* @} +*/ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_usr.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_usr.h new file mode 100644 index 00000000..bd5ff3e2 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_usr.h @@ -0,0 +1,141 @@ +/** + ****************************************************************************** + * @file usbd_usr.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief Header file for usbd_usr.c + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_USR_H__ +#define __USBD_USR_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_core.h" + + +/** @addtogroup USBD_USER + * @{ + */ + +/** @addtogroup USBD_MSC_DEMO_USER_CALLBACKS + * @{ + */ + +/** @defgroup USBD_USR + * @brief This file is the Header file for usbd_usr.c + * @{ + */ + + +/** @defgroup USBD_USR_Exported_Types + * @{ + */ + +extern USBD_Usr_cb_TypeDef USR_cb; +extern USBD_Usr_cb_TypeDef USR_FS_cb; +extern USBD_Usr_cb_TypeDef USR_HS_cb; + + + +/** + * @} + */ + + + +/** @defgroup USBD_USR_Exported_Defines + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_USR_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_USR_Exported_Variables + * @{ + */ + +void USBD_USR_Init(void); +void USBD_USR_DeviceReset (uint8_t speed); +void USBD_USR_DeviceConfigured (void); +void USBD_USR_DeviceSuspended(void); +void USBD_USR_DeviceResumed(void); + +void USBD_USR_DeviceConnected(void); +void USBD_USR_DeviceDisconnected(void); + +void USBD_USR_FS_Init(void); +void USBD_USR_FS_DeviceReset (uint8_t speed); +void USBD_USR_FS_DeviceConfigured (void); +void USBD_USR_FS_DeviceSuspended(void); +void USBD_USR_FS_DeviceResumed(void); + +void USBD_USR_FS_DeviceConnected(void); +void USBD_USR_FS_DeviceDisconnected(void); + +void USBD_USR_HS_Init(void); +void USBD_USR_HS_DeviceReset (uint8_t speed); +void USBD_USR_HS_DeviceConfigured (void); +void USBD_USR_HS_DeviceSuspended(void); +void USBD_USR_HS_DeviceResumed(void); + +void USBD_USR_HS_DeviceConnected(void); +void USBD_USR_HS_DeviceDisconnected(void); + +/** + * @} + */ + +/** @defgroup USBD_USR_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + +#endif /*__USBD_USR_H__*/ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + + + + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/src/usbd_core.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/src/usbd_core.c new file mode 100644 index 00000000..fa647eb0 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/src/usbd_core.c @@ -0,0 +1,506 @@ +/** + ****************************************************************************** + * @file usbd_core.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file provides all the USBD core functions. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_core.h" +#include "usbd_req.h" +#include "usbd_ioreq.h" +#include "usb_dcd_int.h" +#include "usb_bsp.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY +* @{ +*/ + + +/** @defgroup USBD_CORE +* @brief usbd core module +* @{ +*/ + +/** @defgroup USBD_CORE_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USBD_CORE_Private_Defines +* @{ +*/ + +/** +* @} +*/ + + +/** @defgroup USBD_CORE_Private_Macros +* @{ +*/ +/** +* @} +*/ + + + + +/** @defgroup USBD_CORE_Private_FunctionPrototypes +* @{ +*/ +static uint8_t USBD_SetupStage(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); +static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); +static uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev); +#ifdef VBUS_SENSING_ENABLED +static uint8_t USBD_DevConnected(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_DevDisconnected(USB_OTG_CORE_HANDLE *pdev); +#endif +static uint8_t USBD_IsoINIncomplete(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_IsoOUTIncomplete(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_RunTestMode (USB_OTG_CORE_HANDLE *pdev) ; +/** +* @} +*/ + +/** @defgroup USBD_CORE_Private_Variables +* @{ +*/ + +__IO USB_OTG_DCTL_TypeDef SET_TEST_MODE; + +USBD_DCD_INT_cb_TypeDef USBD_DCD_INT_cb = +{ + USBD_DataOutStage, + USBD_DataInStage, + USBD_SetupStage, + USBD_SOF, + USBD_Reset, + USBD_Suspend, + USBD_Resume, + USBD_IsoINIncomplete, + USBD_IsoOUTIncomplete, +#ifdef VBUS_SENSING_ENABLED +USBD_DevConnected, +USBD_DevDisconnected, +#endif +}; + +USBD_DCD_INT_cb_TypeDef *USBD_DCD_INT_fops = &USBD_DCD_INT_cb; +/** +* @} +*/ + +/** @defgroup USBD_CORE_Private_Functions +* @{ +*/ + +/** +* @brief USBD_Init +* Initailizes the device stack and load the class driver +* @param pdev: device instance +* @param core_address: USB OTG core ID +* @param class_cb: Class callback structure address +* @param usr_cb: User callback structure address +* @retval None +*/ +void USBD_Init(USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID, + USBD_DEVICE *pDevice, + USBD_Class_cb_TypeDef *class_cb, + USBD_Usr_cb_TypeDef *usr_cb) +{ + /* Hardware Init */ + USB_OTG_BSP_Init(pdev); + + USBD_DeInit(pdev); + + /*Register class and user callbacks */ + pdev->dev.class_cb = class_cb; + pdev->dev.usr_cb = usr_cb; + pdev->dev.usr_device = pDevice; + + /* set USB OTG core params */ + DCD_Init(pdev , coreID); + + /* Upon Init call usr callback */ + pdev->dev.usr_cb->Init(); + + /* Enable Interrupts */ + USB_OTG_BSP_EnableInterrupt(pdev); +} + +/** +* @brief USBD_DeInit +* Re-Initialize th device library +* @param pdev: device instance +* @retval status: status +*/ +USBD_Status USBD_DeInit(USB_OTG_CORE_HANDLE *pdev) +{ + /* Software Init */ + + return USBD_OK; +} + +/** +* @brief USBD_SetupStage +* Handle the setup stage +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_SetupStage(USB_OTG_CORE_HANDLE *pdev) +{ + USB_SETUP_REQ req; + + USBD_ParseSetupRequest(pdev , &req); + + switch (req.bmRequest & 0x1F) + { + case USB_REQ_RECIPIENT_DEVICE: + USBD_StdDevReq (pdev, &req); + break; + + case USB_REQ_RECIPIENT_INTERFACE: + USBD_StdItfReq(pdev, &req); + break; + + case USB_REQ_RECIPIENT_ENDPOINT: + USBD_StdEPReq(pdev, &req); + break; + + default: + DCD_EP_Stall(pdev , req.bmRequest & 0x80); + break; + } + return USBD_OK; +} + +/** +* @brief USBD_DataOutStage +* Handle data out stage +* @param pdev: device instance +* @param epnum: endpoint index +* @retval status +*/ +static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + USB_OTG_EP *ep; + + if(epnum == 0) + { + ep = &pdev->dev.out_ep[0]; + if ( pdev->dev.device_state == USB_OTG_EP0_DATA_OUT) + { + if(ep->rem_data_len > ep->maxpacket) + { + ep->rem_data_len -= ep->maxpacket; + + if(pdev->cfg.dma_enable == 1) + { + /* in slave mode this, is handled by the RxSTSQLvl ISR */ + ep->xfer_buff += ep->maxpacket; + } + USBD_CtlContinueRx (pdev, + ep->xfer_buff, + MIN(ep->rem_data_len ,ep->maxpacket)); + } + else + { + if((pdev->dev.class_cb->EP0_RxReady != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->EP0_RxReady(pdev); + } + USBD_CtlSendStatus(pdev); + } + } + } + else if((pdev->dev.class_cb->DataOut != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->DataOut(pdev, epnum); + } + return USBD_OK; +} + +/** +* @brief USBD_DataInStage +* Handle data in stage +* @param pdev: device instance +* @param epnum: endpoint index +* @retval status +*/ +static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + USB_OTG_EP *ep; + + if(epnum == 0) + { + ep = &pdev->dev.in_ep[0]; + if ( pdev->dev.device_state == USB_OTG_EP0_DATA_IN) + { + if(ep->rem_data_len > ep->maxpacket) + { + ep->rem_data_len -= ep->maxpacket; + if(pdev->cfg.dma_enable == 1) + { + /* in slave mode this, is handled by the TxFifoEmpty ISR */ + ep->xfer_buff += ep->maxpacket; + } + USBD_CtlContinueSendData (pdev, + ep->xfer_buff, + ep->rem_data_len); + } + else + { /* last packet is MPS multiple, so send ZLP packet */ + if((ep->total_data_len % ep->maxpacket == 0) && + (ep->total_data_len >= ep->maxpacket) && + (ep->total_data_len < ep->ctl_data_len )) + { + + USBD_CtlContinueSendData(pdev , NULL, 0); + ep->ctl_data_len = 0; + } + else + { + if((pdev->dev.class_cb->EP0_TxSent != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->EP0_TxSent(pdev); + } + USBD_CtlReceiveStatus(pdev); + } + } + } + if (pdev->dev.test_mode == 1) + { + USBD_RunTestMode(pdev); + pdev->dev.test_mode = 0; + } + } + else if((pdev->dev.class_cb->DataIn != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->DataIn(pdev, epnum); + } + return USBD_OK; +} + + + + +/** +* @brief USBD_RunTestMode +* Launch test mode process +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_RunTestMode (USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, SET_TEST_MODE.d32); + return USBD_OK; +} + +/** +* @brief USBD_Reset +* Handle Reset event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev) +{ + /* Open EP0 OUT */ + DCD_EP_Open(pdev, + 0x00, + USB_OTG_MAX_EP0_SIZE, + EP_TYPE_CTRL); + + /* Open EP0 IN */ + DCD_EP_Open(pdev, + 0x80, + USB_OTG_MAX_EP0_SIZE, + EP_TYPE_CTRL); + + /* Upon Reset call usr call back */ + pdev->dev.device_status = USB_OTG_DEFAULT; + pdev->dev.usr_cb->DeviceReset(pdev->cfg.speed); + + return USBD_OK; +} + +/** +* @brief USBD_Resume +* Handle Resume event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev) +{ + /* Upon Resume call usr call back */ + pdev->dev.usr_cb->DeviceResumed(); + pdev->dev.device_status = pdev->dev.device_old_status; + pdev->dev.device_status = USB_OTG_CONFIGURED; + return USBD_OK; +} + + +/** +* @brief USBD_Suspend +* Handle Suspend event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.device_old_status = pdev->dev.device_status; + pdev->dev.device_status = USB_OTG_SUSPENDED; + /* Upon Resume call usr call back */ + pdev->dev.usr_cb->DeviceSuspended(); + return USBD_OK; +} + + +/** +* @brief USBD_SOF +* Handle SOF event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev) +{ + if(pdev->dev.class_cb->SOF) + { + pdev->dev.class_cb->SOF(pdev); + } + return USBD_OK; +} +/** +* @brief USBD_SetCfg +* Configure device and start the interface +* @param pdev: device instance +* @param cfgidx: configuration index +* @retval status +*/ + +USBD_Status USBD_SetCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx) +{ + pdev->dev.class_cb->Init(pdev, cfgidx); + + /* Upon set config call usr call back */ + pdev->dev.usr_cb->DeviceConfigured(); + return USBD_OK; +} + +/** +* @brief USBD_ClrCfg +* Clear current configuration +* @param pdev: device instance +* @param cfgidx: configuration index +* @retval status: USBD_Status +*/ +USBD_Status USBD_ClrCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx) +{ + pdev->dev.class_cb->DeInit(pdev, cfgidx); + return USBD_OK; +} + +/** +* @brief USBD_IsoINIncomplete +* Handle iso in incomplete event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_IsoINIncomplete(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.class_cb->IsoINIncomplete(pdev); + return USBD_OK; +} + +/** +* @brief USBD_IsoOUTIncomplete +* Handle iso out incomplete event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_IsoOUTIncomplete(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.class_cb->IsoOUTIncomplete(pdev); + return USBD_OK; +} + +#ifdef VBUS_SENSING_ENABLED +/** +* @brief USBD_DevConnected +* Handle device connection event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_DevConnected(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.usr_cb->DeviceConnected(); + pdev->dev.connection_status = 1; + return USBD_OK; +} + +/** +* @brief USBD_DevDisconnected +* Handle device disconnection event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_DevDisconnected(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.usr_cb->DeviceDisconnected(); + pdev->dev.class_cb->DeInit(pdev, 0); + pdev->dev.connection_status = 0; + return USBD_OK; +} +#endif +/** +* @} +*/ + + +/** +* @} +*/ + + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/src/usbd_ioreq.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/src/usbd_ioreq.c new file mode 100644 index 00000000..a9e4a863 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/src/usbd_ioreq.c @@ -0,0 +1,244 @@ +/** + ****************************************************************************** + * @file usbd_ioreq.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file provides the IO requests APIs for control endpoints. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_ioreq.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_IOREQ + * @brief control I/O requests module + * @{ + */ + +/** @defgroup USBD_IOREQ_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Variables + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_FunctionPrototypes + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Functions + * @{ + */ + +/** +* @brief USBD_CtlSendData +* send data on the ctl pipe +* @param pdev: device instance +* @param buff: pointer to data buffer +* @param len: length of data to be sent +* @retval status +*/ +USBD_Status USBD_CtlSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + pdev->dev.in_ep[0].total_data_len = len; + pdev->dev.in_ep[0].rem_data_len = len; + pdev->dev.device_state = USB_OTG_EP0_DATA_IN; + + DCD_EP_Tx (pdev, 0, pbuf, len); + + return ret; +} + +/** +* @brief USBD_CtlContinueSendData +* continue sending data on the ctl pipe +* @param pdev: device instance +* @param buff: pointer to data buffer +* @param len: length of data to be sent +* @retval status +*/ +USBD_Status USBD_CtlContinueSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + DCD_EP_Tx (pdev, 0, pbuf, len); + + + return ret; +} + +/** +* @brief USBD_CtlPrepareRx +* receive data on the ctl pipe +* @param pdev: USB OTG device instance +* @param buff: pointer to data buffer +* @param len: length of data to be received +* @retval status +*/ +USBD_Status USBD_CtlPrepareRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + pdev->dev.out_ep[0].total_data_len = len; + pdev->dev.out_ep[0].rem_data_len = len; + pdev->dev.device_state = USB_OTG_EP0_DATA_OUT; + + DCD_EP_PrepareRx (pdev, + 0, + pbuf, + len); + + + return ret; +} + +/** +* @brief USBD_CtlContinueRx +* continue receive data on the ctl pipe +* @param pdev: USB OTG device instance +* @param buff: pointer to data buffer +* @param len: length of data to be received +* @retval status +*/ +USBD_Status USBD_CtlContinueRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + DCD_EP_PrepareRx (pdev, + 0, + pbuf, + len); + return ret; +} +/** +* @brief USBD_CtlSendStatus +* send zero lzngth packet on the ctl pipe +* @param pdev: USB OTG device instance +* @retval status +*/ +USBD_Status USBD_CtlSendStatus (USB_OTG_CORE_HANDLE *pdev) +{ + USBD_Status ret = USBD_OK; + pdev->dev.device_state = USB_OTG_EP0_STATUS_IN; + DCD_EP_Tx (pdev, + 0, + NULL, + 0); + + USB_OTG_EP0_OutStart(pdev); + + return ret; +} + +/** +* @brief USBD_CtlReceiveStatus +* receive zero lzngth packet on the ctl pipe +* @param pdev: USB OTG device instance +* @retval status +*/ +USBD_Status USBD_CtlReceiveStatus (USB_OTG_CORE_HANDLE *pdev) +{ + USBD_Status ret = USBD_OK; + pdev->dev.device_state = USB_OTG_EP0_STATUS_OUT; + DCD_EP_PrepareRx ( pdev, + 0, + NULL, + 0); + + USB_OTG_EP0_OutStart(pdev); + + return ret; +} + + +/** +* @brief USBD_GetRxCount +* returns the received data length +* @param pdev: USB OTG device instance +* epnum: endpoint index +* @retval Rx Data blength +*/ +uint16_t USBD_GetRxCount (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + return pdev->dev.out_ep[epnum].xfer_count; +} + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/src/usbd_req.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/src/usbd_req.c new file mode 100644 index 00000000..f954bd9a --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/src/usbd_req.c @@ -0,0 +1,868 @@ +/** + ****************************************************************************** + * @file usbd_req.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file provides the standard USB requests following chapter 9. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_req.h" +#include "usbd_ioreq.h" +#include "usbd_desc.h" + + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_REQ + * @brief USB standard requests module + * @{ + */ + +/** @defgroup USBD_REQ_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Variables + * @{ + */ +extern __IO USB_OTG_DCTL_TypeDef SET_TEST_MODE; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint32_t USBD_ep_status __ALIGN_END = 0; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint32_t USBD_default_cfg __ALIGN_END = 0; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint32_t USBD_cfg_status __ALIGN_END = 0; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ] __ALIGN_END ; +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_FunctionPrototypes + * @{ + */ +static void USBD_GetDescriptor(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_SetAddress(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_SetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_GetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_GetStatus(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_SetFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_ClrFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static uint8_t USBD_GetLen(uint8_t *buf); +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Functions + * @{ + */ + + +/** +* @brief USBD_StdDevReq +* Handle standard usb device requests +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +USBD_Status USBD_StdDevReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req) +{ + USBD_Status ret = USBD_OK; + + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + + USBD_GetDescriptor (pdev, req) ; + break; + + case USB_REQ_SET_ADDRESS: + USBD_SetAddress(pdev, req); + break; + + case USB_REQ_SET_CONFIGURATION: + USBD_SetConfig (pdev , req); + break; + + case USB_REQ_GET_CONFIGURATION: + USBD_GetConfig (pdev , req); + break; + + case USB_REQ_GET_STATUS: + USBD_GetStatus (pdev , req); + break; + + + case USB_REQ_SET_FEATURE: + USBD_SetFeature (pdev , req); + break; + + case USB_REQ_CLEAR_FEATURE: + USBD_ClrFeature (pdev , req); + break; + + default: + USBD_CtlError(pdev , req); + break; + } + + return ret; +} + +/** +* @brief USBD_StdItfReq +* Handle standard usb interface requests +* @param pdev: USB OTG device instance +* @param req: usb request +* @retval status +*/ +USBD_Status USBD_StdItfReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req) +{ + USBD_Status ret = USBD_OK; + + switch (pdev->dev.device_status) + { + case USB_OTG_CONFIGURED: + + if (LOBYTE(req->wIndex) <= USBD_ITF_MAX_NUM) + { + pdev->dev.class_cb->Setup (pdev, req); + + if((req->wLength == 0)&& (ret == USBD_OK)) + { + USBD_CtlSendStatus(pdev); + } + } + else + { + USBD_CtlError(pdev , req); + } + break; + + default: + USBD_CtlError(pdev , req); + break; + } + return ret; +} + +/** +* @brief USBD_StdEPReq +* Handle standard usb endpoint requests +* @param pdev: USB OTG device instance +* @param req: usb request +* @retval status +*/ +USBD_Status USBD_StdEPReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req) +{ + + uint8_t ep_addr; + USBD_Status ret = USBD_OK; + + ep_addr = LOBYTE(req->wIndex); + + switch (req->bRequest) + { + + case USB_REQ_SET_FEATURE : + + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + } + break; + + case USB_OTG_CONFIGURED: + if (req->wValue == USB_FEATURE_EP_HALT) + { + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + + } + } + pdev->dev.class_cb->Setup (pdev, req); + USBD_CtlSendStatus(pdev); + + break; + + default: + USBD_CtlError(pdev , req); + break; + } + break; + + case USB_REQ_CLEAR_FEATURE : + + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + } + break; + + case USB_OTG_CONFIGURED: + if (req->wValue == USB_FEATURE_EP_HALT) + { + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_ClrStall(pdev , ep_addr); + pdev->dev.class_cb->Setup (pdev, req); + } + USBD_CtlSendStatus(pdev); + } + break; + + default: + USBD_CtlError(pdev , req); + break; + } + break; + + case USB_REQ_GET_STATUS: + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + } + break; + + case USB_OTG_CONFIGURED: + + + if ((ep_addr & 0x80)== 0x80) + { + if(pdev->dev.in_ep[ep_addr & 0x7F].is_stall) + { + USBD_ep_status = 0x0001; + } + else + { + USBD_ep_status = 0x0000; + } + } + else if ((ep_addr & 0x80)== 0x00) + { + if(pdev->dev.out_ep[ep_addr].is_stall) + { + USBD_ep_status = 0x0001; + } + + else + { + USBD_ep_status = 0x0000; + } + } + USBD_CtlSendData (pdev, + (uint8_t *)&USBD_ep_status, + 2); + break; + + default: + USBD_CtlError(pdev , req); + break; + } + break; + + default: + break; + } + return ret; +} +/** +* @brief USBD_GetDescriptor +* Handle Get Descriptor requests +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_GetDescriptor(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + uint16_t len; + uint8_t *pbuf; + + + switch (req->wValue >> 8) + { + case USB_DESC_TYPE_DEVICE: + pbuf = pdev->dev.usr_device->GetDeviceDescriptor(pdev->cfg.speed, &len); + if ((req->wLength == 64) ||( pdev->dev.device_status == USB_OTG_DEFAULT)) + { + len = 8; + } + break; + + case USB_DESC_TYPE_CONFIGURATION: + pbuf = (uint8_t *)pdev->dev.class_cb->GetConfigDescriptor(pdev->cfg.speed, &len); +#ifdef USB_OTG_HS_CORE + if((pdev->cfg.speed == USB_OTG_SPEED_FULL )&& + (pdev->cfg.phy_itface == USB_OTG_ULPI_PHY)) + { + pbuf = (uint8_t *)pdev->dev.class_cb->GetOtherConfigDescriptor(pdev->cfg.speed, &len); + } +#endif + pbuf[1] = USB_DESC_TYPE_CONFIGURATION; + pdev->dev.pConfig_descriptor = pbuf; + break; + + case USB_DESC_TYPE_STRING: + switch ((uint8_t)(req->wValue)) + { + case USBD_IDX_LANGID_STR: + pbuf = pdev->dev.usr_device->GetLangIDStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_MFC_STR: + pbuf = pdev->dev.usr_device->GetManufacturerStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_PRODUCT_STR: + pbuf = pdev->dev.usr_device->GetProductStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_SERIAL_STR: + pbuf = pdev->dev.usr_device->GetSerialStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_CONFIG_STR: + pbuf = pdev->dev.usr_device->GetConfigurationStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_INTERFACE_STR: + pbuf = pdev->dev.usr_device->GetInterfaceStrDescriptor(pdev->cfg.speed, &len); + break; + + default: +#ifdef USB_SUPPORT_USER_STRING_DESC + pbuf = pdev->dev.class_cb->GetUsrStrDescriptor(pdev->cfg.speed, (req->wValue) , &len); + break; +#else + USBD_CtlError(pdev , req); + return; +#endif /* USBD_CtlError(pdev , req); */ + } + break; + case USB_DESC_TYPE_DEVICE_QUALIFIER: +#ifdef USB_OTG_HS_CORE + if(pdev->cfg.speed == USB_OTG_SPEED_HIGH ) + { + + pbuf = (uint8_t *)pdev->dev.class_cb->GetConfigDescriptor(pdev->cfg.speed, &len); + + USBD_DeviceQualifierDesc[4]= pbuf[14]; + USBD_DeviceQualifierDesc[5]= pbuf[15]; + USBD_DeviceQualifierDesc[6]= pbuf[16]; + + pbuf = USBD_DeviceQualifierDesc; + len = USB_LEN_DEV_QUALIFIER_DESC; + break; + } + else + { + USBD_CtlError(pdev , req); + return; + } +#else + USBD_CtlError(pdev , req); + return; +#endif + + case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: +#ifdef USB_OTG_HS_CORE + + if(pdev->cfg.speed == USB_OTG_SPEED_HIGH ) + { + pbuf = (uint8_t *)pdev->dev.class_cb->GetOtherConfigDescriptor(pdev->cfg.speed, &len); + pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION; + break; + } + else + { + USBD_CtlError(pdev , req); + return; + } +#else + USBD_CtlError(pdev , req); + return; +#endif + + + default: + USBD_CtlError(pdev , req); + return; + } + + if((len != 0)&& (req->wLength != 0)) + { + + len = MIN(len , req->wLength); + + USBD_CtlSendData (pdev, + pbuf, + len); + } + +} + +/** +* @brief USBD_SetAddress +* Set device address +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_SetAddress(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + uint8_t dev_addr; + + if ((req->wIndex == 0) && (req->wLength == 0)) + { + dev_addr = (uint8_t)(req->wValue) & 0x7F; + + if (pdev->dev.device_status == USB_OTG_CONFIGURED) + { + USBD_CtlError(pdev , req); + } + else + { + pdev->dev.device_address = dev_addr; + DCD_EP_SetAddress(pdev, dev_addr); + USBD_CtlSendStatus(pdev); + + if (dev_addr != 0) + { + pdev->dev.device_status = USB_OTG_ADDRESSED; + } + else + { + pdev->dev.device_status = USB_OTG_DEFAULT; + } + } + } + else + { + USBD_CtlError(pdev , req); + } +} + +/** +* @brief USBD_SetConfig +* Handle Set device configuration request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_SetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + static uint8_t cfgidx; + + cfgidx = (uint8_t)(req->wValue); + + if (cfgidx > USBD_CFG_MAX_NUM ) + { + USBD_CtlError(pdev , req); + } + else + { + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if (cfgidx) + { + pdev->dev.device_config = cfgidx; + pdev->dev.device_status = USB_OTG_CONFIGURED; + USBD_SetCfg(pdev , cfgidx); + USBD_CtlSendStatus(pdev); + } + else + { + USBD_CtlSendStatus(pdev); + } + break; + + case USB_OTG_CONFIGURED: + if (cfgidx == 0) + { + pdev->dev.device_status = USB_OTG_ADDRESSED; + pdev->dev.device_config = cfgidx; + USBD_ClrCfg(pdev , cfgidx); + USBD_CtlSendStatus(pdev); + + } + else if (cfgidx != pdev->dev.device_config) + { + /* Clear old configuration */ + USBD_ClrCfg(pdev , pdev->dev.device_config); + + /* set new configuration */ + pdev->dev.device_config = cfgidx; + USBD_SetCfg(pdev , cfgidx); + USBD_CtlSendStatus(pdev); + } + else + { + USBD_CtlSendStatus(pdev); + } + break; + + default: + USBD_CtlError(pdev , req); + break; + } + } +} + +/** +* @brief USBD_GetConfig +* Handle Get device configuration request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_GetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + if (req->wLength != 1) + { + USBD_CtlError(pdev , req); + } + else + { + switch (pdev->dev.device_status ) + { + case USB_OTG_ADDRESSED: + + USBD_CtlSendData (pdev, + (uint8_t *)&USBD_default_cfg, + 1); + break; + + case USB_OTG_CONFIGURED: + + USBD_CtlSendData (pdev, + &pdev->dev.device_config, + 1); + break; + + default: + USBD_CtlError(pdev , req); + break; + } + } +} + +/** +* @brief USBD_GetStatus +* Handle Get Status request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_GetStatus(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + case USB_OTG_CONFIGURED: + +#ifdef USBD_SELF_POWERED + USBD_cfg_status = USB_CONFIG_SELF_POWERED; +#else + USBD_cfg_status = 0x00; +#endif + + if (pdev->dev.DevRemoteWakeup) + { + USBD_cfg_status |= USB_CONFIG_REMOTE_WAKEUP; + } + + USBD_CtlSendData (pdev, + (uint8_t *)&USBD_cfg_status, + 2); + break; + + default : + USBD_CtlError(pdev , req); + break; + } +} + + +/** +* @brief USBD_SetFeature +* Handle Set device feature request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_SetFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + USB_OTG_DCTL_TypeDef dctl; + uint8_t test_mode = 0; + + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) + { + pdev->dev.DevRemoteWakeup = 1; + pdev->dev.class_cb->Setup (pdev, req); + USBD_CtlSendStatus(pdev); + } + + else if ((req->wValue == USB_FEATURE_TEST_MODE) && + ((req->wIndex & 0xFF) == 0)) + { + dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL); + + test_mode = req->wIndex >> 8; + switch (test_mode) + { + case 1: // TEST_J + dctl.b.tstctl = 1; + break; + + case 2: // TEST_K + dctl.b.tstctl = 2; + break; + + case 3: // TEST_SE0_NAK + dctl.b.tstctl = 3; + break; + + case 4: // TEST_PACKET + dctl.b.tstctl = 4; + break; + + case 5: // TEST_FORCE_ENABLE + dctl.b.tstctl = 5; + break; + } + SET_TEST_MODE = dctl; + pdev->dev.test_mode = 1; + USBD_CtlSendStatus(pdev); + } + +} + + +/** +* @brief USBD_ClrFeature +* Handle clear device feature request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_ClrFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + case USB_OTG_CONFIGURED: + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) + { + pdev->dev.DevRemoteWakeup = 0; + pdev->dev.class_cb->Setup (pdev, req); + USBD_CtlSendStatus(pdev); + } + break; + + default : + USBD_CtlError(pdev , req); + break; + } +} + +/** +* @brief USBD_ParseSetupRequest +* Copy buffer into setup structure +* @param pdev: device instance +* @param req: usb request +* @retval None +*/ + +void USBD_ParseSetupRequest( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet); + req->bRequest = *(uint8_t *) (pdev->dev.setup_packet + 1); + req->wValue = SWAPBYTE (pdev->dev.setup_packet + 2); + req->wIndex = SWAPBYTE (pdev->dev.setup_packet + 4); + req->wLength = SWAPBYTE (pdev->dev.setup_packet + 6); + + pdev->dev.in_ep[0].ctl_data_len = req->wLength ; + pdev->dev.device_state = USB_OTG_EP0_SETUP; +} + +/** +* @brief USBD_CtlError +* Handle USB low level Error +* @param pdev: device instance +* @param req: usb request +* @retval None +*/ + +void USBD_CtlError( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + DCD_EP_Stall(pdev , 0x80); + DCD_EP_Stall(pdev , 0); + USB_OTG_EP0_OutStart(pdev); +} + + +/** + * @brief USBD_GetString + * Convert Ascii string into unicode one + * @param desc : descriptor buffer + * @param unicode : Formatted string buffer (unicode) + * @param len : descriptor length + * @retval None + */ +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) +{ + uint8_t idx = 0; + + if (desc != NULL) + { + *len = USBD_GetLen(desc) * 2 + 2; + unicode[idx++] = *len; + unicode[idx++] = USB_DESC_TYPE_STRING; + + while (*desc != NULL) + { + unicode[idx++] = *desc++; + unicode[idx++] = 0x00; + } + } +} + +/** + * @brief USBD_GetLen + * return the string length + * @param buf : pointer to the ascii string buffer + * @retval string length + */ +static uint8_t USBD_GetLen(uint8_t *buf) +{ + uint8_t len = 0; + + while (*buf != NULL) + { + len++; + buf++; + } + + return len; +} +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Release_Notes.html b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Release_Notes.html new file mode 100644 index 00000000..60f8ab87 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Release_Notes.html @@ -0,0 +1,950 @@ + + + + + + + + +Release Notes for STM32F105/7xx, STM32F2xx and STM32F4xx USB Device Library + + + + + +
+ +

 

+ +
+ + + + + +
+ + + + + + + +
+

Back to Release page

+
+

Release Notes for STM32F105/7xx, STM32F2xx and STM32F4xx USB Device Library

+

Copyright + 2012 STMicroelectronics

+

+
+

 

+ + + + +
+

Contents

+
    +
  1. Update History
  2. +
  3. License
  4. +
+

Update History

V1.1.0 / 19-March-2012

+

Main +Changes

+ +
  • Official support of STM32F4xx devices
  • All source files: license disclaimer text update and add link to the License file on ST Internet.
  • Handle test mode in the set feature request
  • Handle dynamically the USB SELF POWERED feature
  • Handle correctly the USBD_CtlError process to take into account error during Control OUT stage
  • Miscellaneous bug fix

V1.0.0 / 22-July-2011

Main +Changes

+
  • First official version for STM32F105/7xx and STM32F2xx devices

+

License

+

Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); You may not use this package except in compliance with the License. You may obtain a copy of the License at:


Unless +required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See +the License for the specific language governing permissions and +limitations under the License.
+
+
+
+

For + complete documentation on STM32 + Microcontrollers visit www.st.com/STM32

+
+

+
+ +
+ +

 

+ +
+ + \ No newline at end of file diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/Release_Notes.html b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/Release_Notes.html new file mode 100644 index 00000000..1116edd3 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/Release_Notes.html @@ -0,0 +1,950 @@ + + + + + + + + +Release Notes for STM32F105/7xx, STM32F2xx and STM32F4xx USB OTG Driver + + + + + +
+ +

 

+ +
+ + + + + +
+ + + + + + + +
+

Back to Release page

+
+

Release Notes for STM32F105/7xx, STM32F2xx and STM32F4xx USB OTG Driver

+

Copyright + 2012 STMicroelectronics

+

+
+

 

+ + + + +
+

Contents

+
    +
  1. Update History
  2. +
  3. License
  4. +
+

Update History

V2.1.0 / 19-March-2012

+

Main +Changes

+ +
  • Official support of STM32F4xx devices
  • All source files: license disclaimer text update and add link to the License file on ST Internet
  • Unmask Session request interrupt to handle the connect event during the core start-up
  • Remove any reference to the USB HS external I2C PHY
  • Update optimization pragma for AR Compiler
  • Handle Correctly the Low Speed device connection in HS mode
  • Add a wrapper to isolate the library from the low level driver: connection done through ISR structure
  • Miscellaneous bug fix

V2.0.0 / 22-July-2011

Main +Changes

+
  • Second official version supporting STM32F105/7 and STM32F2xx devices
  • Rename the Library from "STM32_USB_HOST_Driver" to "STM32_USB_OTG_Driver"
  • Add support for STM32F2xx devices
  • Add support for Device and OTG modes
  • Change HCD layer to support High speed core
  • Change the Low level driver to support multi core support for Host mode
  • Add Stop mechanism for Host and Device modes
  • Change VBUS enabling method, to use the external or the internal VBUS when using the ULPI

V1.0.0 - 11/29/2010

+
  • Created 

License

+

Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); You may not use this package except in compliance with the License. You may obtain a copy of the License at:


Unless +required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See +the License for the specific language governing permissions and +limitations under the License.
+
+
+
+

For + complete documentation on STM32 + Microcontrollers visit www.st.com/STM32

+
+

+
+ +
+ +

 

+ +
+ + \ No newline at end of file diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_bsp.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_bsp.h new file mode 100644 index 00000000..29763a90 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_bsp.h @@ -0,0 +1,103 @@ +/** + ****************************************************************************** + * @file usb_bsp.h + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Specific api's relative to the used hardware platform + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_BSP__H__ +#define __USB_BSP__H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_core.h" +#include "usb_conf.h" + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_BSP + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_BSP_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_BSP_Exported_Types + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_BSP_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_BSP_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_BSP_Exported_FunctionsPrototype + * @{ + */ +void BSP_Init(void); + +void USB_OTG_BSP_Init (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_BSP_uDelay (const uint32_t usec); +void USB_OTG_BSP_mDelay (const uint32_t msec); +void USB_OTG_BSP_EnableInterrupt (USB_OTG_CORE_HANDLE *pdev); +#ifdef USE_HOST_MODE +void USB_OTG_BSP_ConfigVBUS(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_BSP_DriveVBUS(USB_OTG_CORE_HANDLE *pdev,uint8_t state); +#endif +/** + * @} + */ + +#endif //__USB_BSP__H__ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_core.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_core.h new file mode 100644 index 00000000..c574665c --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_core.h @@ -0,0 +1,417 @@ +/** + ****************************************************************************** + * @file usb_core.h + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Header of the Core Layer + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_CORE_H__ +#define __USB_CORE_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" +#include "usb_regs.h" +#include "usb_defines.h" + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_CORE + * @brief usb otg driver core layer + * @{ + */ + + +/** @defgroup USB_CORE_Exported_Defines + * @{ + */ + +#define USB_OTG_EP0_IDLE 0 +#define USB_OTG_EP0_SETUP 1 +#define USB_OTG_EP0_DATA_IN 2 +#define USB_OTG_EP0_DATA_OUT 3 +#define USB_OTG_EP0_STATUS_IN 4 +#define USB_OTG_EP0_STATUS_OUT 5 +#define USB_OTG_EP0_STALL 6 + +#define USB_OTG_EP_TX_DIS 0x0000 +#define USB_OTG_EP_TX_STALL 0x0010 +#define USB_OTG_EP_TX_NAK 0x0020 +#define USB_OTG_EP_TX_VALID 0x0030 + +#define USB_OTG_EP_RX_DIS 0x0000 +#define USB_OTG_EP_RX_STALL 0x1000 +#define USB_OTG_EP_RX_NAK 0x2000 +#define USB_OTG_EP_RX_VALID 0x3000 +/** + * @} + */ +#define MAX_DATA_LENGTH 0x200 + +/** @defgroup USB_CORE_Exported_Types + * @{ + */ + + +typedef enum { + USB_OTG_OK = 0, + USB_OTG_FAIL +}USB_OTG_STS; + +typedef enum { + HC_IDLE = 0, + HC_XFRC, + HC_HALTED, + HC_NAK, + HC_NYET, + HC_STALL, + HC_XACTERR, + HC_BBLERR, + HC_DATATGLERR, +}HC_STATUS; + +typedef enum { + URB_IDLE = 0, + URB_DONE, + URB_NOTREADY, + URB_ERROR, + URB_STALL +}URB_STATE; + +typedef enum { + CTRL_START = 0, + CTRL_XFRC, + CTRL_HALTED, + CTRL_NAK, + CTRL_STALL, + CTRL_XACTERR, + CTRL_BBLERR, + CTRL_DATATGLERR, + CTRL_FAIL +}CTRL_STATUS; + + +typedef struct USB_OTG_hc +{ + uint8_t dev_addr ; + uint8_t ep_num; + uint8_t ep_is_in; + uint8_t speed; + uint8_t do_ping; + uint8_t ep_type; + uint16_t max_packet; + uint8_t data_pid; + uint8_t *xfer_buff; + uint32_t xfer_len; + uint32_t xfer_count; + uint8_t toggle_in; + uint8_t toggle_out; + uint32_t dma_addr; +} +USB_OTG_HC , *PUSB_OTG_HC; + +typedef struct USB_OTG_ep +{ + uint8_t num; + uint8_t is_in; + uint8_t is_stall; + uint8_t type; + uint8_t data_pid_start; + uint8_t even_odd_frame; + uint16_t tx_fifo_num; + uint32_t maxpacket; + /* transaction level variables*/ + uint8_t *xfer_buff; + uint32_t dma_addr; + uint32_t xfer_len; + uint32_t xfer_count; + /* Transfer level variables*/ + uint32_t rem_data_len; + uint32_t total_data_len; + uint32_t ctl_data_len; + +} + +USB_OTG_EP , *PUSB_OTG_EP; + + + +typedef struct USB_OTG_core_cfg +{ + uint8_t host_channels; + uint8_t dev_endpoints; + uint8_t speed; + uint8_t dma_enable; + uint16_t mps; + uint16_t TotalFifoSize; + uint8_t phy_itface; + uint8_t Sof_output; + uint8_t low_power; + uint8_t coreID; + +} +USB_OTG_CORE_CFGS, *PUSB_OTG_CORE_CFGS; + + + +typedef struct usb_setup_req { + + uint8_t bmRequest; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; +} USB_SETUP_REQ; + +typedef struct _Device_TypeDef +{ + uint8_t *(*GetDeviceDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetLangIDStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetManufacturerStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetProductStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetSerialStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetConfigurationStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetInterfaceStrDescriptor)( uint8_t speed , uint16_t *length); +} USBD_DEVICE, *pUSBD_DEVICE; + +//typedef struct USB_OTG_hPort +//{ +// void (*Disconnect) (void *phost); +// void (*Connect) (void *phost); +// uint8_t ConnStatus; +// uint8_t DisconnStatus; +// uint8_t ConnHandled; +// uint8_t DisconnHandled; +//} USB_OTG_hPort_TypeDef; + +typedef struct _Device_cb +{ + uint8_t (*Init) (void *pdev , uint8_t cfgidx); + uint8_t (*DeInit) (void *pdev , uint8_t cfgidx); + /* Control Endpoints*/ + uint8_t (*Setup) (void *pdev , USB_SETUP_REQ *req); + uint8_t (*EP0_TxSent) (void *pdev ); + uint8_t (*EP0_RxReady) (void *pdev ); + /* Class Specific Endpoints*/ + uint8_t (*DataIn) (void *pdev , uint8_t epnum); + uint8_t (*DataOut) (void *pdev , uint8_t epnum); + uint8_t (*SOF) (void *pdev); + uint8_t (*IsoINIncomplete) (void *pdev); + uint8_t (*IsoOUTIncomplete) (void *pdev); + + uint8_t *(*GetConfigDescriptor)( uint8_t speed , uint16_t *length); +#ifdef USB_OTG_HS_CORE + uint8_t *(*GetOtherConfigDescriptor)( uint8_t speed , uint16_t *length); +#endif + +#ifdef USB_SUPPORT_USER_STRING_DESC + uint8_t *(*GetUsrStrDescriptor)( uint8_t speed ,uint8_t index, uint16_t *length); +#endif + +} USBD_Class_cb_TypeDef; + + + +typedef struct _USBD_USR_PROP +{ + void (*Init)(void); + void (*DeviceReset)(uint8_t speed); + void (*DeviceConfigured)(void); + void (*DeviceSuspended)(void); + void (*DeviceResumed)(void); + + void (*DeviceConnected)(void); + void (*DeviceDisconnected)(void); + +} +USBD_Usr_cb_TypeDef; + +typedef struct _DCD +{ + uint8_t device_config; + uint8_t device_state; + uint8_t device_status; + uint8_t device_old_status; + uint8_t device_address; + uint8_t connection_status; + uint8_t test_mode; + uint32_t DevRemoteWakeup; + USB_OTG_EP in_ep [USB_OTG_MAX_TX_FIFOS]; + USB_OTG_EP out_ep [USB_OTG_MAX_TX_FIFOS]; + uint8_t setup_packet [8*3]; + USBD_Class_cb_TypeDef *class_cb; + USBD_Usr_cb_TypeDef *usr_cb; + USBD_DEVICE *usr_device; + uint8_t *pConfig_descriptor; + } +DCD_DEV , *DCD_PDEV; + + +typedef struct _HCD +{ + uint8_t Rx_Buffer [MAX_DATA_LENGTH]; + __IO uint32_t ConnSts; + __IO uint32_t ErrCnt[USB_OTG_MAX_TX_FIFOS]; + __IO uint32_t XferCnt[USB_OTG_MAX_TX_FIFOS]; + __IO HC_STATUS HC_Status[USB_OTG_MAX_TX_FIFOS]; + __IO URB_STATE URB_State[USB_OTG_MAX_TX_FIFOS]; + USB_OTG_HC hc [USB_OTG_MAX_TX_FIFOS]; + uint16_t channel [USB_OTG_MAX_TX_FIFOS]; +// USB_OTG_hPort_TypeDef *port_cb; +} +HCD_DEV , *USB_OTG_USBH_PDEV; + + +typedef struct _OTG +{ + uint8_t OTG_State; + uint8_t OTG_PrevState; + uint8_t OTG_Mode; +} +OTG_DEV , *USB_OTG_USBO_PDEV; + +typedef struct USB_OTG_handle +{ + USB_OTG_CORE_CFGS cfg; + USB_OTG_CORE_REGS regs; +#ifdef USE_DEVICE_MODE + DCD_DEV dev; +#endif +#ifdef USE_HOST_MODE + HCD_DEV host; +#endif +#ifdef USE_OTG_MODE + OTG_DEV otg; +#endif +} +USB_OTG_CORE_HANDLE , *PUSB_OTG_CORE_HANDLE; + +/** + * @} + */ + + +/** @defgroup USB_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_FunctionsPrototype + * @{ + */ + + +USB_OTG_STS USB_OTG_CoreInit (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_SelectCore (USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID); +USB_OTG_STS USB_OTG_EnableGlobalInt (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_DisableGlobalInt(USB_OTG_CORE_HANDLE *pdev); +void* USB_OTG_ReadPacket (USB_OTG_CORE_HANDLE *pdev , + uint8_t *dest, + uint16_t len); +USB_OTG_STS USB_OTG_WritePacket (USB_OTG_CORE_HANDLE *pdev , + uint8_t *src, + uint8_t ch_ep_num, + uint16_t len); +USB_OTG_STS USB_OTG_FlushTxFifo (USB_OTG_CORE_HANDLE *pdev , uint32_t num); +USB_OTG_STS USB_OTG_FlushRxFifo (USB_OTG_CORE_HANDLE *pdev); + +uint32_t USB_OTG_ReadCoreItr (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadOtgItr (USB_OTG_CORE_HANDLE *pdev); +uint8_t USB_OTG_IsHostMode (USB_OTG_CORE_HANDLE *pdev); +uint8_t USB_OTG_IsDeviceMode (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_GetMode (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_PhyInit (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_SetCurrentMode (USB_OTG_CORE_HANDLE *pdev, + uint8_t mode); + +/*********************** HOST APIs ********************************************/ +#ifdef USE_HOST_MODE +USB_OTG_STS USB_OTG_CoreInitHost (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EnableHostInt (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_HC_Init (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num); +USB_OTG_STS USB_OTG_HC_Halt (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num); +USB_OTG_STS USB_OTG_HC_StartXfer (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num); +USB_OTG_STS USB_OTG_HC_DoPing (USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num); +uint32_t USB_OTG_ReadHostAllChannels_intr (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ResetPort (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadHPRT0 (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_DriveVbus (USB_OTG_CORE_HANDLE *pdev, uint8_t state); +void USB_OTG_InitFSLSPClkSel (USB_OTG_CORE_HANDLE *pdev ,uint8_t freq); +uint8_t USB_OTG_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev) ; +void USB_OTG_StopHost (USB_OTG_CORE_HANDLE *pdev); +#endif +/********************* DEVICE APIs ********************************************/ +#ifdef USE_DEVICE_MODE +USB_OTG_STS USB_OTG_CoreInitDev (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EnableDevInt (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadDevAllInEPItr (USB_OTG_CORE_HANDLE *pdev); +enum USB_OTG_SPEED USB_OTG_GetDeviceSpeed (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EP0Activate (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EPActivate (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPDeactivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPStartXfer (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EP0StartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPSetStall (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPClearStall (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +uint32_t USB_OTG_ReadDevAllOutEp_itr (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadDevOutEP_itr (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); +uint32_t USB_OTG_ReadDevAllInEPItr (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_InitDevSpeed (USB_OTG_CORE_HANDLE *pdev , uint8_t speed); +uint8_t USBH_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_EP0_OutStart(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_ActiveRemoteWakeup(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_UngateClock(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_StopDevice(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep , uint32_t Status); +uint32_t USB_OTG_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,USB_OTG_EP *ep); +#endif +/** + * @} + */ + +#endif /* __USB_CORE_H__ */ + + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_dcd.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_dcd.h new file mode 100644 index 00000000..6922782a --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_dcd.h @@ -0,0 +1,164 @@ +/** + ****************************************************************************** + * @file usb_dcd.h + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Peripheral Driver Header file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __DCD_H__ +#define __DCD_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_core.h" + + +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_DCD +* @brief This file is the +* @{ +*/ + + +/** @defgroup USB_DCD_Exported_Defines +* @{ +*/ +#define USB_OTG_EP_CONTROL 0 +#define USB_OTG_EP_ISOC 1 +#define USB_OTG_EP_BULK 2 +#define USB_OTG_EP_INT 3 +#define USB_OTG_EP_MASK 3 + +/* Device Status */ +#define USB_OTG_DEFAULT 1 +#define USB_OTG_ADDRESSED 2 +#define USB_OTG_CONFIGURED 3 +#define USB_OTG_SUSPENDED 4 + +/** +* @} +*/ + + +/** @defgroup USB_DCD_Exported_Types +* @{ +*/ +/******************************************************************************** +Data structure type +********************************************************************************/ +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; +} +EP_DESCRIPTOR , *PEP_DESCRIPTOR; + +/** +* @} +*/ + + +/** @defgroup USB_DCD_Exported_Macros +* @{ +*/ +/** +* @} +*/ + +/** @defgroup USB_DCD_Exported_Variables +* @{ +*/ +/** +* @} +*/ + +/** @defgroup USB_DCD_Exported_FunctionsPrototype +* @{ +*/ +/******************************************************************************** +EXPORTED FUNCTION FROM THE USB-OTG LAYER +********************************************************************************/ +void DCD_Init(USB_OTG_CORE_HANDLE *pdev , + USB_OTG_CORE_ID_TypeDef coreID); + +void DCD_DevConnect (USB_OTG_CORE_HANDLE *pdev); +void DCD_DevDisconnect (USB_OTG_CORE_HANDLE *pdev); +void DCD_EP_SetAddress (USB_OTG_CORE_HANDLE *pdev, + uint8_t address); +uint32_t DCD_EP_Open(USB_OTG_CORE_HANDLE *pdev , + uint8_t ep_addr, + uint16_t ep_mps, + uint8_t ep_type); + +uint32_t DCD_EP_Close (USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr); + + +uint32_t DCD_EP_PrepareRx ( USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint16_t buf_len); + +uint32_t DCD_EP_Tx (USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint32_t buf_len); +uint32_t DCD_EP_Stall (USB_OTG_CORE_HANDLE *pdev, + uint8_t epnum); +uint32_t DCD_EP_ClrStall (USB_OTG_CORE_HANDLE *pdev, + uint8_t epnum); +uint32_t DCD_EP_Flush (USB_OTG_CORE_HANDLE *pdev, + uint8_t epnum); +uint32_t DCD_Handle_ISR(USB_OTG_CORE_HANDLE *pdev); + +uint32_t DCD_GetEPStatus(USB_OTG_CORE_HANDLE *pdev , + uint8_t epnum); + +void DCD_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , + uint8_t epnum , + uint32_t Status); + +/** +* @} +*/ + + +#endif //__DCD_H__ + + +/** +* @} +*/ + +/** +* @} +*/ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_dcd_int.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_dcd_int.h new file mode 100644 index 00000000..e2369e5d --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_dcd_int.h @@ -0,0 +1,127 @@ +/** + ****************************************************************************** + * @file usb_dcd_int.h + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Peripheral Device Interface Layer + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef USB_DCD_INT_H__ +#define USB_DCD_INT_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd.h" + + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_DCD_INT + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_DCD_INT_Exported_Defines + * @{ + */ + +typedef struct _USBD_DCD_INT +{ + uint8_t (* DataOutStage) (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); + uint8_t (* DataInStage) (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); + uint8_t (* SetupStage) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* SOF) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* Reset) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* Suspend) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* Resume) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* IsoINIncomplete) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* IsoOUTIncomplete) (USB_OTG_CORE_HANDLE *pdev); + + uint8_t (* DevConnected) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* DevDisconnected) (USB_OTG_CORE_HANDLE *pdev); + +}USBD_DCD_INT_cb_TypeDef; + +extern USBD_DCD_INT_cb_TypeDef *USBD_DCD_INT_fops; +/** + * @} + */ + + +/** @defgroup USB_DCD_INT_Exported_Types + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DCD_INT_Exported_Macros + * @{ + */ + +#define CLEAR_IN_EP_INTR(epnum,intr) \ + diepint.d32=0; \ + diepint.b.intr = 1; \ + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[epnum]->DIEPINT,diepint.d32); + +#define CLEAR_OUT_EP_INTR(epnum,intr) \ + doepint.d32=0; \ + doepint.b.intr = 1; \ + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[epnum]->DOEPINT,doepint.d32); + +/** + * @} + */ + +/** @defgroup USB_DCD_INT_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DCD_INT_Exported_FunctionsPrototype + * @{ + */ + +uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev); + +/** + * @} + */ + + +#endif // USB_DCD_INT_H__ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_defines.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_defines.h new file mode 100644 index 00000000..28e6d168 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_defines.h @@ -0,0 +1,249 @@ +/** + ****************************************************************************** + * @file usb_defines.h + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Header of the Core Layer + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_DEF_H__ +#define __USB_DEF_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_DEFINES + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_DEFINES_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup _CORE_DEFINES_ + * @{ + */ + +#define USB_OTG_SPEED_PARAM_HIGH 0 +#define USB_OTG_SPEED_PARAM_HIGH_IN_FULL 1 +#define USB_OTG_SPEED_PARAM_FULL 3 + +#define USB_OTG_SPEED_HIGH 0 +#define USB_OTG_SPEED_FULL 1 + +#define USB_OTG_ULPI_PHY 1 +#define USB_OTG_EMBEDDED_PHY 2 + +/** + * @} + */ + + +/** @defgroup _GLOBAL_DEFINES_ + * @{ + */ +#define GAHBCFG_TXFEMPTYLVL_EMPTY 1 +#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 +#define GAHBCFG_GLBINT_ENABLE 1 +#define GAHBCFG_INT_DMA_BURST_SINGLE 0 +#define GAHBCFG_INT_DMA_BURST_INCR 1 +#define GAHBCFG_INT_DMA_BURST_INCR4 3 +#define GAHBCFG_INT_DMA_BURST_INCR8 5 +#define GAHBCFG_INT_DMA_BURST_INCR16 7 +#define GAHBCFG_DMAENABLE 1 +#define GAHBCFG_TXFEMPTYLVL_EMPTY 1 +#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 +#define GRXSTS_PKTSTS_IN 2 +#define GRXSTS_PKTSTS_IN_XFER_COMP 3 +#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR 5 +#define GRXSTS_PKTSTS_CH_HALTED 7 +/** + * @} + */ + + +/** @defgroup _OnTheGo_DEFINES_ + * @{ + */ +#define MODE_HNP_SRP_CAPABLE 0 +#define MODE_SRP_ONLY_CAPABLE 1 +#define MODE_NO_HNP_SRP_CAPABLE 2 +#define MODE_SRP_CAPABLE_DEVICE 3 +#define MODE_NO_SRP_CAPABLE_DEVICE 4 +#define MODE_SRP_CAPABLE_HOST 5 +#define MODE_NO_SRP_CAPABLE_HOST 6 +#define A_HOST 1 +#define A_SUSPEND 2 +#define A_PERIPHERAL 3 +#define B_PERIPHERAL 4 +#define B_HOST 5 +#define DEVICE_MODE 0 +#define HOST_MODE 1 +#define OTG_MODE 2 +/** + * @} + */ + + +/** @defgroup __DEVICE_DEFINES_ + * @{ + */ +#define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ 0 +#define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ 1 +#define DSTS_ENUMSPD_LS_PHY_6MHZ 2 +#define DSTS_ENUMSPD_FS_PHY_48MHZ 3 + +#define DCFG_FRAME_INTERVAL_80 0 +#define DCFG_FRAME_INTERVAL_85 1 +#define DCFG_FRAME_INTERVAL_90 2 +#define DCFG_FRAME_INTERVAL_95 3 + +#define DEP0CTL_MPS_64 0 +#define DEP0CTL_MPS_32 1 +#define DEP0CTL_MPS_16 2 +#define DEP0CTL_MPS_8 3 + +#define EP_SPEED_LOW 0 +#define EP_SPEED_FULL 1 +#define EP_SPEED_HIGH 2 + +#define EP_TYPE_CTRL 0 +#define EP_TYPE_ISOC 1 +#define EP_TYPE_BULK 2 +#define EP_TYPE_INTR 3 +#define EP_TYPE_MSK 3 + +#define STS_GOUT_NAK 1 +#define STS_DATA_UPDT 2 +#define STS_XFER_COMP 3 +#define STS_SETUP_COMP 4 +#define STS_SETUP_UPDT 6 +/** + * @} + */ + + +/** @defgroup __HOST_DEFINES_ + * @{ + */ +#define HC_PID_DATA0 0 +#define HC_PID_DATA2 1 +#define HC_PID_DATA1 2 +#define HC_PID_SETUP 3 + +#define HPRT0_PRTSPD_HIGH_SPEED 0 +#define HPRT0_PRTSPD_FULL_SPEED 1 +#define HPRT0_PRTSPD_LOW_SPEED 2 + +#define HCFG_30_60_MHZ 0 +#define HCFG_48_MHZ 1 +#define HCFG_6_MHZ 2 + +#define HCCHAR_CTRL 0 +#define HCCHAR_ISOC 1 +#define HCCHAR_BULK 2 +#define HCCHAR_INTR 3 + +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) + +/** + * @} + */ + + +/** @defgroup USB_DEFINES_Exported_Types + * @{ + */ + +typedef enum +{ + USB_OTG_HS_CORE_ID = 0, + USB_OTG_FS_CORE_ID = 1 +}USB_OTG_CORE_ID_TypeDef; +/** + * @} + */ + + +/** @defgroup USB_DEFINES_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DEFINES_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DEFINES_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +/** @defgroup Internal_Macro's + * @{ + */ +#define USB_OTG_READ_REG32(reg) (*(__IO uint32_t *)reg) +#define USB_OTG_WRITE_REG32(reg,value) (*(__IO uint32_t *)reg = value) +#define USB_OTG_MODIFY_REG32(reg,clear_mask,set_mask) \ + USB_OTG_WRITE_REG32(reg, (((USB_OTG_READ_REG32(reg)) & ~clear_mask) | set_mask ) ) + +/******************************************************************************** + ENUMERATION TYPE +********************************************************************************/ +enum USB_OTG_SPEED { + USB_SPEED_UNKNOWN = 0, + USB_SPEED_LOW, + USB_SPEED_FULL, + USB_SPEED_HIGH +}; + +#endif //__USB_DEFINES__H__ + + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_regs.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_regs.h new file mode 100644 index 00000000..323e8705 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_regs.h @@ -0,0 +1,1188 @@ +/** + ****************************************************************************** + * @file usb_regs.h + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief hardware registers + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_OTG_REGS_H__ +#define __USB_OTG_REGS_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_REGS + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_REGS_Exported_Defines + * @{ + */ + +#define USB_OTG_HS_BASE_ADDR 0x40040000 +#define USB_OTG_FS_BASE_ADDR 0x50000000 + +#define USB_OTG_CORE_GLOBAL_REGS_OFFSET 0x000 +#define USB_OTG_DEV_GLOBAL_REG_OFFSET 0x800 +#define USB_OTG_DEV_IN_EP_REG_OFFSET 0x900 +#define USB_OTG_EP_REG_OFFSET 0x20 +#define USB_OTG_DEV_OUT_EP_REG_OFFSET 0xB00 +#define USB_OTG_HOST_GLOBAL_REG_OFFSET 0x400 +#define USB_OTG_HOST_PORT_REGS_OFFSET 0x440 +#define USB_OTG_HOST_CHAN_REGS_OFFSET 0x500 +#define USB_OTG_CHAN_REGS_OFFSET 0x20 +#define USB_OTG_PCGCCTL_OFFSET 0xE00 +#define USB_OTG_DATA_FIFO_OFFSET 0x1000 +#define USB_OTG_DATA_FIFO_SIZE 0x1000 + + +#define USB_OTG_MAX_TX_FIFOS 15 + +#define USB_OTG_HS_MAX_PACKET_SIZE 512 +#define USB_OTG_FS_MAX_PACKET_SIZE 64 +#define USB_OTG_MAX_EP0_SIZE 64 +/** + * @} + */ + +/** @defgroup USB_REGS_Exported_Types + * @{ + */ + +/** @defgroup __USB_OTG_Core_register + * @{ + */ +typedef struct _USB_OTG_GREGS //000h +{ + __IO uint32_t GOTGCTL; /* USB_OTG Control and Status Register 000h*/ + __IO uint32_t GOTGINT; /* USB_OTG Interrupt Register 004h*/ + __IO uint32_t GAHBCFG; /* Core AHB Configuration Register 008h*/ + __IO uint32_t GUSBCFG; /* Core USB Configuration Register 00Ch*/ + __IO uint32_t GRSTCTL; /* Core Reset Register 010h*/ + __IO uint32_t GINTSTS; /* Core Interrupt Register 014h*/ + __IO uint32_t GINTMSK; /* Core Interrupt Mask Register 018h*/ + __IO uint32_t GRXSTSR; /* Receive Sts Q Read Register 01Ch*/ + __IO uint32_t GRXSTSP; /* Receive Sts Q Read & POP Register 020h*/ + __IO uint32_t GRXFSIZ; /* Receive FIFO Size Register 024h*/ + __IO uint32_t DIEPTXF0_HNPTXFSIZ; /* EP0 / Non Periodic Tx FIFO Size Register 028h*/ + __IO uint32_t HNPTXSTS; /* Non Periodic Tx FIFO/Queue Sts reg 02Ch*/ + uint32_t Reserved30[2]; /* Reserved 030h*/ + __IO uint32_t GCCFG; /* General Purpose IO Register 038h*/ + __IO uint32_t CID; /* User ID Register 03Ch*/ + uint32_t Reserved40[48]; /* Reserved 040h-0FFh*/ + __IO uint32_t HPTXFSIZ; /* Host Periodic Tx FIFO Size Reg 100h*/ + __IO uint32_t DIEPTXF[USB_OTG_MAX_TX_FIFOS];/* dev Periodic Transmit FIFO */ +} +USB_OTG_GREGS; +/** + * @} + */ + + +/** @defgroup __device_Registers + * @{ + */ +typedef struct _USB_OTG_DREGS // 800h +{ + __IO uint32_t DCFG; /* dev Configuration Register 800h*/ + __IO uint32_t DCTL; /* dev Control Register 804h*/ + __IO uint32_t DSTS; /* dev Status Register (RO) 808h*/ + uint32_t Reserved0C; /* Reserved 80Ch*/ + __IO uint32_t DIEPMSK; /* dev IN Endpoint Mask 810h*/ + __IO uint32_t DOEPMSK; /* dev OUT Endpoint Mask 814h*/ + __IO uint32_t DAINT; /* dev All Endpoints Itr Reg 818h*/ + __IO uint32_t DAINTMSK; /* dev All Endpoints Itr Mask 81Ch*/ + uint32_t Reserved20; /* Reserved 820h*/ + uint32_t Reserved9; /* Reserved 824h*/ + __IO uint32_t DVBUSDIS; /* dev VBUS discharge Register 828h*/ + __IO uint32_t DVBUSPULSE; /* dev VBUS Pulse Register 82Ch*/ + __IO uint32_t DTHRCTL; /* dev thr 830h*/ + __IO uint32_t DIEPEMPMSK; /* dev empty msk 834h*/ + __IO uint32_t DEACHINT; /* dedicated EP interrupt 838h*/ + __IO uint32_t DEACHMSK; /* dedicated EP msk 83Ch*/ + uint32_t Reserved40; /* dedicated EP mask 840h*/ + __IO uint32_t DINEP1MSK; /* dedicated EP mask 844h*/ + uint32_t Reserved44[15]; /* Reserved 844-87Ch*/ + __IO uint32_t DOUTEP1MSK; /* dedicated EP msk 884h*/ +} +USB_OTG_DREGS; +/** + * @} + */ + + +/** @defgroup __IN_Endpoint-Specific_Register + * @{ + */ +typedef struct _USB_OTG_INEPREGS +{ + __IO uint32_t DIEPCTL; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h*/ + uint32_t Reserved04; /* Reserved 900h + (ep_num * 20h) + 04h*/ + __IO uint32_t DIEPINT; /* dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h*/ + uint32_t Reserved0C; /* Reserved 900h + (ep_num * 20h) + 0Ch*/ + __IO uint32_t DIEPTSIZ; /* IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h*/ + __IO uint32_t DIEPDMA; /* IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h*/ + __IO uint32_t DTXFSTS;/*IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h*/ + uint32_t Reserved18; /* Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch*/ +} +USB_OTG_INEPREGS; +/** + * @} + */ + + +/** @defgroup __OUT_Endpoint-Specific_Registers + * @{ + */ +typedef struct _USB_OTG_OUTEPREGS +{ + __IO uint32_t DOEPCTL; /* dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h*/ + uint32_t Reserved04; /* Reserved B00h + (ep_num * 20h) + 04h*/ + __IO uint32_t DOEPINT; /* dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h*/ + uint32_t Reserved0C; /* Reserved B00h + (ep_num * 20h) + 0Ch*/ + __IO uint32_t DOEPTSIZ; /* dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h*/ + __IO uint32_t DOEPDMA; /* dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h*/ + uint32_t Reserved18[2]; /* Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch*/ +} +USB_OTG_OUTEPREGS; +/** + * @} + */ + + +/** @defgroup __Host_Mode_Register_Structures + * @{ + */ +typedef struct _USB_OTG_HREGS +{ + __IO uint32_t HCFG; /* Host Configuration Register 400h*/ + __IO uint32_t HFIR; /* Host Frame Interval Register 404h*/ + __IO uint32_t HFNUM; /* Host Frame Nbr/Frame Remaining 408h*/ + uint32_t Reserved40C; /* Reserved 40Ch*/ + __IO uint32_t HPTXSTS; /* Host Periodic Tx FIFO/ Queue Status 410h*/ + __IO uint32_t HAINT; /* Host All Channels Interrupt Register 414h*/ + __IO uint32_t HAINTMSK; /* Host All Channels Interrupt Mask 418h*/ +} +USB_OTG_HREGS; +/** + * @} + */ + + +/** @defgroup __Host_Channel_Specific_Registers + * @{ + */ +typedef struct _USB_OTG_HC_REGS +{ + __IO uint32_t HCCHAR; + __IO uint32_t HCSPLT; + __IO uint32_t HCINT; + __IO uint32_t HCINTMSK; + __IO uint32_t HCTSIZ; + __IO uint32_t HCDMA; + uint32_t Reserved[2]; +} +USB_OTG_HC_REGS; +/** + * @} + */ + + +/** @defgroup __otg_Core_registers + * @{ + */ +typedef struct USB_OTG_core_regs //000h +{ + USB_OTG_GREGS *GREGS; + USB_OTG_DREGS *DREGS; + USB_OTG_HREGS *HREGS; + USB_OTG_INEPREGS *INEP_REGS[USB_OTG_MAX_TX_FIFOS]; + USB_OTG_OUTEPREGS *OUTEP_REGS[USB_OTG_MAX_TX_FIFOS]; + USB_OTG_HC_REGS *HC_REGS[USB_OTG_MAX_TX_FIFOS]; + __IO uint32_t *HPRT0; + __IO uint32_t *DFIFO[USB_OTG_MAX_TX_FIFOS]; + __IO uint32_t *PCGCCTL; +} +USB_OTG_CORE_REGS , *PUSB_OTG_CORE_REGS; +typedef union _USB_OTG_GOTGCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t sesreqscs : + 1; +uint32_t sesreq : + 1; +uint32_t Reserved2_7 : + 6; +uint32_t hstnegscs : + 1; +uint32_t hnpreq : + 1; +uint32_t hstsethnpen : + 1; +uint32_t devhnpen : + 1; +uint32_t Reserved12_15 : + 4; +uint32_t conidsts : + 1; +uint32_t dbct : + 1; +uint32_t asesvld : + 1; +uint32_t bsesvld : + 1; +uint32_t Reserved20_31 : + 12; + } + b; +} USB_OTG_GOTGCTL_TypeDef ; + +typedef union _USB_OTG_GOTGINT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t Reserved0_1 : + 2; +uint32_t sesenddet : + 1; +uint32_t Reserved3_7 : + 5; +uint32_t sesreqsucstschng : + 1; +uint32_t hstnegsucstschng : + 1; +uint32_t reserver10_16 : + 7; +uint32_t hstnegdet : + 1; +uint32_t adevtoutchng : + 1; +uint32_t debdone : + 1; +uint32_t Reserved31_20 : + 12; + } + b; +} USB_OTG_GOTGINT_TypeDef ; +typedef union _USB_OTG_GAHBCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t glblintrmsk : + 1; +uint32_t hburstlen : + 4; +uint32_t dmaenable : + 1; +uint32_t Reserved : + 1; +uint32_t nptxfemplvl_txfemplvl : + 1; +uint32_t ptxfemplvl : + 1; +uint32_t Reserved9_31 : + 23; + } + b; +} USB_OTG_GAHBCFG_TypeDef ; +typedef union _USB_OTG_GUSBCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t toutcal : + 3; +uint32_t Reserved3_5 : + 3; +uint32_t physel : + 1; +uint32_t Reserved7 : + 1; +uint32_t srpcap : + 1; +uint32_t hnpcap : + 1; +uint32_t usbtrdtim : + 4; +uint32_t Reserved14 : + 1; +uint32_t phylpwrclksel : + 1; +uint32_t Reserved16 : + 1; +uint32_t ulpi_fsls : + 1; +uint32_t ulpi_auto_res : + 1; +uint32_t ulpi_clk_sus_m : + 1; +uint32_t ulpi_ext_vbus_drv : + 1; +uint32_t ulpi_int_vbus_ind : + 1; +uint32_t term_sel_dl_pulse : + 1; +uint32_t ulpi_ind_cpl : + 1; +uint32_t ulpi_passthrough : + 1; +uint32_t ulpi_protect_disable : + 1; +uint32_t Reserved26_28 : + 3; +uint32_t force_host : + 1; +uint32_t force_dev : + 1; +uint32_t corrupt_tx : + 1; + } + b; +} USB_OTG_GUSBCFG_TypeDef ; +typedef union _USB_OTG_GRSTCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t csftrst : + 1; +uint32_t hsftrst : + 1; +uint32_t hstfrm : + 1; +uint32_t Reserved3 : + 1; +uint32_t rxfflsh : + 1; +uint32_t txfflsh : + 1; +uint32_t txfnum : + 5; +uint32_t Reserved11_29 : + 19; +uint32_t dmareq : + 1; +uint32_t ahbidle : + 1; + } + b; +} USB_OTG_GRSTCTL_TypeDef ; +typedef union _USB_OTG_GINTMSK_TypeDef +{ + uint32_t d32; + struct + { +uint32_t Reserved0 : + 1; +uint32_t modemismatch : + 1; +uint32_t otgintr : + 1; +uint32_t sofintr : + 1; +uint32_t rxstsqlvl : + 1; +uint32_t nptxfempty : + 1; +uint32_t ginnakeff : + 1; +uint32_t goutnakeff : + 1; +uint32_t Reserved8_9 : + 2; +uint32_t erlysuspend : + 1; +uint32_t usbsuspend : + 1; +uint32_t usbreset : + 1; +uint32_t enumdone : + 1; +uint32_t isooutdrop : + 1; +uint32_t eopframe : + 1; +uint32_t Reserved16 : + 1; +uint32_t epmismatch : + 1; +uint32_t inepintr : + 1; +uint32_t outepintr : + 1; +uint32_t incomplisoin : + 1; +uint32_t incomplisoout : + 1; +uint32_t Reserved22_23 : + 2; +uint32_t portintr : + 1; +uint32_t hcintr : + 1; +uint32_t ptxfempty : + 1; +uint32_t Reserved27 : + 1; +uint32_t conidstschng : + 1; +uint32_t disconnect : + 1; +uint32_t sessreqintr : + 1; +uint32_t wkupintr : + 1; + } + b; +} USB_OTG_GINTMSK_TypeDef ; +typedef union _USB_OTG_GINTSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t curmode : + 1; +uint32_t modemismatch : + 1; +uint32_t otgintr : + 1; +uint32_t sofintr : + 1; +uint32_t rxstsqlvl : + 1; +uint32_t nptxfempty : + 1; +uint32_t ginnakeff : + 1; +uint32_t goutnakeff : + 1; +uint32_t Reserved8_9 : + 2; +uint32_t erlysuspend : + 1; +uint32_t usbsuspend : + 1; +uint32_t usbreset : + 1; +uint32_t enumdone : + 1; +uint32_t isooutdrop : + 1; +uint32_t eopframe : + 1; +uint32_t Reserved16_17 : + 2; +uint32_t inepint: + 1; +uint32_t outepintr : + 1; +uint32_t incomplisoin : + 1; +uint32_t incomplisoout : + 1; +uint32_t Reserved22_23 : + 2; +uint32_t portintr : + 1; +uint32_t hcintr : + 1; +uint32_t ptxfempty : + 1; +uint32_t Reserved27 : + 1; +uint32_t conidstschng : + 1; +uint32_t disconnect : + 1; +uint32_t sessreqintr : + 1; +uint32_t wkupintr : + 1; + } + b; +} USB_OTG_GINTSTS_TypeDef ; +typedef union _USB_OTG_DRXSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t epnum : + 4; +uint32_t bcnt : + 11; +uint32_t dpid : + 2; +uint32_t pktsts : + 4; +uint32_t fn : + 4; +uint32_t Reserved : + 7; + } + b; +} USB_OTG_DRXSTS_TypeDef ; +typedef union _USB_OTG_GRXSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t chnum : + 4; +uint32_t bcnt : + 11; +uint32_t dpid : + 2; +uint32_t pktsts : + 4; +uint32_t Reserved : + 11; + } + b; +} USB_OTG_GRXFSTS_TypeDef ; +typedef union _USB_OTG_FSIZ_TypeDef +{ + uint32_t d32; + struct + { +uint32_t startaddr : + 16; +uint32_t depth : + 16; + } + b; +} USB_OTG_FSIZ_TypeDef ; +typedef union _USB_OTG_HNPTXSTS_TypeDef +{ + uint32_t d32; + struct + { + uint32_t nptxfspcavail : + 16; + uint32_t nptxqspcavail : + 8; + struct + { + uint32_t terminate : + 1; + uint32_t token : + 2; + uint32_t chnum : + 4; + } nptxqtop; + uint32_t Reserved : + 1; + } + b; +} USB_OTG_HNPTXSTS_TypeDef ; +typedef union _USB_OTG_DTXFSTSn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t txfspcavail : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_DTXFSTSn_TypeDef ; + +typedef union _USB_OTG_GCCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t Reserved_in : + 16; +uint32_t pwdn : + 1; +uint32_t Reserved_17 : + 1; +uint32_t vbussensingA : + 1; +uint32_t vbussensingB : + 1; +uint32_t sofouten : + 1; +uint32_t disablevbussensing : + 1; +uint32_t Reserved_out : + 10; + } + b; +} USB_OTG_GCCFG_TypeDef ; + +typedef union _USB_OTG_DCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t devspd : + 2; +uint32_t nzstsouthshk : + 1; +uint32_t Reserved3 : + 1; +uint32_t devaddr : + 7; +uint32_t perfrint : + 2; +uint32_t Reserved12_31 : + 19; + } + b; +} USB_OTG_DCFG_TypeDef ; +typedef union _USB_OTG_DCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t rmtwkupsig : + 1; +uint32_t sftdiscon : + 1; +uint32_t gnpinnaksts : + 1; +uint32_t goutnaksts : + 1; +uint32_t tstctl : + 3; +uint32_t sgnpinnak : + 1; +uint32_t cgnpinnak : + 1; +uint32_t sgoutnak : + 1; +uint32_t cgoutnak : + 1; +uint32_t poprg_done : + 1; +uint32_t Reserved : + 20; + } + b; +} USB_OTG_DCTL_TypeDef ; +typedef union _USB_OTG_DSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t suspsts : + 1; +uint32_t enumspd : + 2; +uint32_t errticerr : + 1; +uint32_t Reserved4_7: + 4; +uint32_t soffn : + 14; +uint32_t Reserved22_31 : + 10; + } + b; +} USB_OTG_DSTS_TypeDef ; +typedef union _USB_OTG_DIEPINTn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t epdisabled : + 1; +uint32_t Reserved2 : + 1; +uint32_t timeout : + 1; +uint32_t intktxfemp : + 1; +uint32_t Reserved5 : + 1; +uint32_t inepnakeff : + 1; +uint32_t emptyintr : + 1; +uint32_t txfifoundrn : + 1; +uint32_t Reserved14_31 : + 23; + } + b; +} USB_OTG_DIEPINTn_TypeDef ; +typedef union _USB_OTG_DIEPINTn_TypeDef USB_OTG_DIEPMSK_TypeDef ; +typedef union _USB_OTG_DOEPINTn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t epdisabled : + 1; +uint32_t Reserved2 : + 1; +uint32_t setup : + 1; +uint32_t Reserved04_31 : + 28; + } + b; +} USB_OTG_DOEPINTn_TypeDef ; +typedef union _USB_OTG_DOEPINTn_TypeDef USB_OTG_DOEPMSK_TypeDef ; + +typedef union _USB_OTG_DAINT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t in : + 16; +uint32_t out : + 16; + } + ep; +} USB_OTG_DAINT_TypeDef ; + +typedef union _USB_OTG_DTHRCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t non_iso_thr_en : + 1; +uint32_t iso_thr_en : + 1; +uint32_t tx_thr_len : + 9; +uint32_t Reserved11_15 : + 5; +uint32_t rx_thr_en : + 1; +uint32_t rx_thr_len : + 9; +uint32_t Reserved26 : + 1; +uint32_t arp_en : + 1; +uint32_t Reserved28_31 : + 4; + } + b; +} USB_OTG_DTHRCTL_TypeDef ; +typedef union _USB_OTG_DEPCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t mps : + 11; +uint32_t reserved : + 4; +uint32_t usbactep : + 1; +uint32_t dpid : + 1; +uint32_t naksts : + 1; +uint32_t eptype : + 2; +uint32_t snp : + 1; +uint32_t stall : + 1; +uint32_t txfnum : + 4; +uint32_t cnak : + 1; +uint32_t snak : + 1; +uint32_t setd0pid : + 1; +uint32_t setd1pid : + 1; +uint32_t epdis : + 1; +uint32_t epena : + 1; + } + b; +} USB_OTG_DEPCTL_TypeDef ; +typedef union _USB_OTG_DEPXFRSIZ_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfersize : + 19; +uint32_t pktcnt : + 10; +uint32_t mc : + 2; +uint32_t Reserved : + 1; + } + b; +} USB_OTG_DEPXFRSIZ_TypeDef ; +typedef union _USB_OTG_DEP0XFRSIZ_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfersize : + 7; +uint32_t Reserved7_18 : + 12; +uint32_t pktcnt : + 2; +uint32_t Reserved20_28 : + 9; +uint32_t supcnt : + 2; + uint32_t Reserved31; + } + b; +} USB_OTG_DEP0XFRSIZ_TypeDef ; +typedef union _USB_OTG_HCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t fslspclksel : + 2; +uint32_t fslssupp : + 1; + } + b; +} USB_OTG_HCFG_TypeDef ; +typedef union _USB_OTG_HFRMINTRVL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t frint : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_HFRMINTRVL_TypeDef ; + +typedef union _USB_OTG_HFNUM_TypeDef +{ + uint32_t d32; + struct + { +uint32_t frnum : + 16; +uint32_t frrem : + 16; + } + b; +} USB_OTG_HFNUM_TypeDef ; +typedef union _USB_OTG_HPTXSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t ptxfspcavail : + 16; +uint32_t ptxqspcavail : + 8; + struct + { + uint32_t terminate : + 1; + uint32_t token : + 2; + uint32_t chnum : + 4; + uint32_t odd_even : + 1; + } ptxqtop; + } + b; +} USB_OTG_HPTXSTS_TypeDef ; +typedef union _USB_OTG_HPRT0_TypeDef +{ + uint32_t d32; + struct + { +uint32_t prtconnsts : + 1; +uint32_t prtconndet : + 1; +uint32_t prtena : + 1; +uint32_t prtenchng : + 1; +uint32_t prtovrcurract : + 1; +uint32_t prtovrcurrchng : + 1; +uint32_t prtres : + 1; +uint32_t prtsusp : + 1; +uint32_t prtrst : + 1; +uint32_t Reserved9 : + 1; +uint32_t prtlnsts : + 2; +uint32_t prtpwr : + 1; +uint32_t prttstctl : + 4; +uint32_t prtspd : + 2; +uint32_t Reserved19_31 : + 13; + } + b; +} USB_OTG_HPRT0_TypeDef ; +typedef union _USB_OTG_HAINT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t chint : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_HAINT_TypeDef ; +typedef union _USB_OTG_HAINTMSK_TypeDef +{ + uint32_t d32; + struct + { +uint32_t chint : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_HAINTMSK_TypeDef ; +typedef union _USB_OTG_HCCHAR_TypeDef +{ + uint32_t d32; + struct + { +uint32_t mps : + 11; +uint32_t epnum : + 4; +uint32_t epdir : + 1; +uint32_t Reserved : + 1; +uint32_t lspddev : + 1; +uint32_t eptype : + 2; +uint32_t multicnt : + 2; +uint32_t devaddr : + 7; +uint32_t oddfrm : + 1; +uint32_t chdis : + 1; +uint32_t chen : + 1; + } + b; +} USB_OTG_HCCHAR_TypeDef ; +typedef union _USB_OTG_HCSPLT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t prtaddr : + 7; +uint32_t hubaddr : + 7; +uint32_t xactpos : + 2; +uint32_t compsplt : + 1; +uint32_t Reserved : + 14; +uint32_t spltena : + 1; + } + b; +} USB_OTG_HCSPLT_TypeDef ; +typedef union _USB_OTG_HCINTn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t chhltd : + 1; +uint32_t ahberr : + 1; +uint32_t stall : + 1; +uint32_t nak : + 1; +uint32_t ack : + 1; +uint32_t nyet : + 1; +uint32_t xacterr : + 1; +uint32_t bblerr : + 1; +uint32_t frmovrun : + 1; +uint32_t datatglerr : + 1; +uint32_t Reserved : + 21; + } + b; +} USB_OTG_HCINTn_TypeDef ; +typedef union _USB_OTG_HCTSIZn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfersize : + 19; +uint32_t pktcnt : + 10; +uint32_t pid : + 2; +uint32_t dopng : + 1; + } + b; +} USB_OTG_HCTSIZn_TypeDef ; +typedef union _USB_OTG_HCINTMSK_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t chhltd : + 1; +uint32_t ahberr : + 1; +uint32_t stall : + 1; +uint32_t nak : + 1; +uint32_t ack : + 1; +uint32_t nyet : + 1; +uint32_t xacterr : + 1; +uint32_t bblerr : + 1; +uint32_t frmovrun : + 1; +uint32_t datatglerr : + 1; +uint32_t Reserved : + 21; + } + b; +} USB_OTG_HCINTMSK_TypeDef ; + +typedef union _USB_OTG_PCGCCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t stoppclk : + 1; +uint32_t gatehclk : + 1; +uint32_t Reserved2_3 : + 2; +uint32_t phy_susp : + 1; +uint32_t Reserved5_31 : + 27; + } + b; +} USB_OTG_PCGCCTL_TypeDef ; + +/** + * @} + */ + + +/** @defgroup USB_REGS_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_REGS_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_REGS_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +#endif //__USB_OTG_REGS_H__ + + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/src/usb_core.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/src/usb_core.c new file mode 100644 index 00000000..e257e73d --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/src/usb_core.c @@ -0,0 +1,2162 @@ +/** + ****************************************************************************** + * @file usb_core.c + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief USB-OTG Core Layer + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_core.h" +#include "usb_bsp.h" + + +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_CORE +* @brief This file includes the USB-OTG Core Layer +* @{ +*/ + + +/** @defgroup USB_CORE_Private_Defines +* @{ +*/ + +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + + +/** @defgroup USB_CORE_Private_Macros +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_Variables +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_FunctionPrototypes +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_Functions +* @{ +*/ + +/** +* @brief USB_OTG_EnableCommonInt +* Initializes the commmon interrupts, used in both device and modes +* @param pdev : Selected device +* @retval None +*/ +static void USB_OTG_EnableCommonInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTMSK_TypeDef int_mask; + + int_mask.d32 = 0; + /* Clear any pending USB_OTG Interrupts */ +#ifndef USE_OTG_MODE + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GOTGINT, 0xFFFFFFFF); +#endif + /* Clear any pending interrupts */ + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, 0xBFFFFFFF); + /* Enable the interrupts in the INTMSK */ + int_mask.b.wkupintr = 1; + int_mask.b.usbsuspend = 1; + +#ifdef USE_OTG_MODE + int_mask.b.otgintr = 1; + int_mask.b.sessreqintr = 1; + int_mask.b.conidstschng = 1; +#endif + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTMSK, int_mask.d32); +} + +/** +* @brief USB_OTG_CoreReset : Soft reset of the core +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +static USB_OTG_STS USB_OTG_CoreReset(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + __IO USB_OTG_GRSTCTL_TypeDef greset; + uint32_t count = 0; + + greset.d32 = 0; + /* Wait for AHB master IDLE state. */ + do + { + USB_OTG_BSP_uDelay(3); + greset.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + return USB_OTG_OK; + } + } + while (greset.b.ahbidle == 0); + /* Core Soft Reset */ + count = 0; + greset.b.csftrst = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRSTCTL, greset.d32 ); + do + { + greset.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + break; + } + } + while (greset.b.csftrst == 1); + /* Wait for 3 PHY Clocks*/ + USB_OTG_BSP_uDelay(3); + return status; +} + +/** +* @brief USB_OTG_WritePacket : Writes a packet into the Tx FIFO associated +* with the EP +* @param pdev : Selected device +* @param src : source pointer +* @param ch_ep_num : end point number +* @param bytes : No. of bytes +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_WritePacket(USB_OTG_CORE_HANDLE *pdev, + uint8_t *src, + uint8_t ch_ep_num, + uint16_t len) +{ + USB_OTG_STS status = USB_OTG_OK; + if (pdev->cfg.dma_enable == 0) + { + uint32_t count32b= 0 , i= 0; + __IO uint32_t *fifo; + + count32b = (len + 3) / 4; + fifo = pdev->regs.DFIFO[ch_ep_num]; + for (i = 0; i < count32b; i++, src+=4) + { + USB_OTG_WRITE_REG32( fifo, *((__packed uint32_t *)src) ); + } + } + return status; +} + + +/** +* @brief USB_OTG_ReadPacket : Reads a packet from the Rx FIFO +* @param pdev : Selected device +* @param dest : Destination Pointer +* @param bytes : No. of bytes +* @retval None +*/ +void *USB_OTG_ReadPacket(USB_OTG_CORE_HANDLE *pdev, + uint8_t *dest, + uint16_t len) +{ + uint32_t i=0; + uint32_t count32b = (len + 3) / 4; + + __IO uint32_t *fifo = pdev->regs.DFIFO[0]; + + for ( i = 0; i < count32b; i++, dest += 4 ) + { + *(__packed uint32_t *)dest = USB_OTG_READ_REG32(fifo); + + } + return ((void *)dest); +} + +/** +* @brief USB_OTG_SelectCore +* Initialize core registers address. +* @param pdev : Selected device +* @param coreID : USB OTG Core ID +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_SelectCore(USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID) +{ + uint32_t i , baseAddress = 0; + USB_OTG_STS status = USB_OTG_OK; + + pdev->cfg.dma_enable = 0; + + /* at startup the core is in FS mode */ + pdev->cfg.speed = USB_OTG_SPEED_FULL; + pdev->cfg.mps = USB_OTG_FS_MAX_PACKET_SIZE ; + + /* initialize device cfg following its address */ + if (coreID == USB_OTG_FS_CORE_ID) + { + baseAddress = USB_OTG_FS_BASE_ADDR; + pdev->cfg.coreID = USB_OTG_FS_CORE_ID; + pdev->cfg.host_channels = 8 ; + pdev->cfg.dev_endpoints = 4 ; + pdev->cfg.TotalFifoSize = 320; /* in 32-bits */ + pdev->cfg.phy_itface = USB_OTG_EMBEDDED_PHY; + +#ifdef USB_OTG_FS_SOF_OUTPUT_ENABLED + pdev->cfg.Sof_output = 1; +#endif + +#ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT + pdev->cfg.low_power = 1; +#endif + } + else if (coreID == USB_OTG_HS_CORE_ID) + { + baseAddress = USB_OTG_HS_BASE_ADDR; + pdev->cfg.coreID = USB_OTG_HS_CORE_ID; + pdev->cfg.host_channels = 12 ; + pdev->cfg.dev_endpoints = 6 ; + pdev->cfg.TotalFifoSize = 1280;/* in 32-bits */ + +#ifdef USB_OTG_ULPI_PHY_ENABLED + pdev->cfg.phy_itface = USB_OTG_ULPI_PHY; +#else +#ifdef USB_OTG_EMBEDDED_PHY_ENABLED + pdev->cfg.phy_itface = USB_OTG_EMBEDDED_PHY; +#endif +#endif + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + pdev->cfg.dma_enable = 1; +#endif + +#ifdef USB_OTG_HS_SOF_OUTPUT_ENABLED + pdev->cfg.Sof_output = 1; +#endif + +#ifdef USB_OTG_HS_LOW_PWR_MGMT_SUPPORT + pdev->cfg.low_power = 1; +#endif + + } + + pdev->regs.GREGS = (USB_OTG_GREGS *)(baseAddress + \ + USB_OTG_CORE_GLOBAL_REGS_OFFSET); + pdev->regs.DREGS = (USB_OTG_DREGS *) (baseAddress + \ + USB_OTG_DEV_GLOBAL_REG_OFFSET); + + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + pdev->regs.INEP_REGS[i] = (USB_OTG_INEPREGS *) \ + (baseAddress + USB_OTG_DEV_IN_EP_REG_OFFSET + \ + (i * USB_OTG_EP_REG_OFFSET)); + pdev->regs.OUTEP_REGS[i] = (USB_OTG_OUTEPREGS *) \ + (baseAddress + USB_OTG_DEV_OUT_EP_REG_OFFSET + \ + (i * USB_OTG_EP_REG_OFFSET)); + } + pdev->regs.HREGS = (USB_OTG_HREGS *)(baseAddress + \ + USB_OTG_HOST_GLOBAL_REG_OFFSET); + pdev->regs.HPRT0 = (uint32_t *)(baseAddress + USB_OTG_HOST_PORT_REGS_OFFSET); + + for (i = 0; i < pdev->cfg.host_channels; i++) + { + pdev->regs.HC_REGS[i] = (USB_OTG_HC_REGS *)(baseAddress + \ + USB_OTG_HOST_CHAN_REGS_OFFSET + \ + (i * USB_OTG_CHAN_REGS_OFFSET)); + } + for (i = 0; i < pdev->cfg.host_channels; i++) + { + pdev->regs.DFIFO[i] = (uint32_t *)(baseAddress + USB_OTG_DATA_FIFO_OFFSET +\ + (i * USB_OTG_DATA_FIFO_SIZE)); + } + pdev->regs.PCGCCTL = (uint32_t *)(baseAddress + USB_OTG_PCGCCTL_OFFSET); + + return status; +} + + +/** +* @brief USB_OTG_CoreInit +* Initializes the USB_OTG controller registers and prepares the core +* device mode or host mode operation. +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_CoreInit(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GUSBCFG_TypeDef usbcfg; + USB_OTG_GCCFG_TypeDef gccfg; + USB_OTG_GAHBCFG_TypeDef ahbcfg; + + usbcfg.d32 = 0; + gccfg.d32 = 0; + ahbcfg.d32 = 0; + + + + if (pdev->cfg.phy_itface == USB_OTG_ULPI_PHY) + { + gccfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GCCFG); + gccfg.b.pwdn = 0; + + if (pdev->cfg.Sof_output) + { + gccfg.b.sofouten = 1; + } + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GCCFG, gccfg.d32); + + /* Init The ULPI Interface */ + usbcfg.d32 = 0; + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + + usbcfg.b.physel = 0; /* HS Interface */ +#ifdef USB_OTG_INTERNAL_VBUS_ENABLED + usbcfg.b.ulpi_ext_vbus_drv = 0; /* Use internal VBUS */ +#else +#ifdef USB_OTG_EXTERNAL_VBUS_ENABLED + usbcfg.b.ulpi_ext_vbus_drv = 1; /* Use external VBUS */ +#endif +#endif + usbcfg.b.term_sel_dl_pulse = 0; /* Data line pulsing using utmi_txvalid */ + + usbcfg.b.ulpi_fsls = 0; + usbcfg.b.ulpi_clk_sus_m = 0; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + + /* Reset after a PHY select */ + USB_OTG_CoreReset(pdev); + + if(pdev->cfg.dma_enable == 1) + { + + ahbcfg.b.hburstlen = 5; /* 64 x 32-bits*/ + ahbcfg.b.dmaenable = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32); + + } + } + else /* FS interface (embedded Phy) */ + { + + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG);; + usbcfg.b.physel = 1; /* FS Interface */ + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + /* Reset after a PHY select and set Host mode */ + USB_OTG_CoreReset(pdev); + /* Deactivate the power down*/ + gccfg.d32 = 0; + gccfg.b.pwdn = 1; + + gccfg.b.vbussensingA = 1 ; + gccfg.b.vbussensingB = 1 ; +#ifndef VBUS_SENSING_ENABLED + gccfg.b.disablevbussensing = 1; +#endif + + if(pdev->cfg.Sof_output) + { + gccfg.b.sofouten = 1; + } + + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GCCFG, gccfg.d32); + USB_OTG_BSP_mDelay(20); + } + /* case the HS core is working in FS mode */ + if(pdev->cfg.dma_enable == 1) + { + + ahbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GAHBCFG); + ahbcfg.b.hburstlen = 5; /* 64 x 32-bits*/ + ahbcfg.b.dmaenable = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32); + + } + /* initialize OTG features */ +#ifdef USE_OTG_MODE + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + usbcfg.b.hnpcap = 1; + usbcfg.b.srpcap = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + USB_OTG_EnableCommonInt(pdev); +#endif + return status; +} +/** +* @brief USB_OTG_EnableGlobalInt +* Enables the controller's Global Int in the AHB Config reg +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EnableGlobalInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GAHBCFG_TypeDef ahbcfg; + + ahbcfg.d32 = 0; + ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */ + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GAHBCFG, 0, ahbcfg.d32); + return status; +} + + +/** +* @brief USB_OTG_DisableGlobalInt +* Enables the controller's Global Int in the AHB Config reg +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_DisableGlobalInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GAHBCFG_TypeDef ahbcfg; + ahbcfg.d32 = 0; + ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */ + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32, 0); + return status; +} + + +/** +* @brief USB_OTG_FlushTxFifo : Flush a Tx FIFO +* @param pdev : Selected device +* @param num : FO num +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_FlushTxFifo (USB_OTG_CORE_HANDLE *pdev , uint32_t num ) +{ + USB_OTG_STS status = USB_OTG_OK; + __IO USB_OTG_GRSTCTL_TypeDef greset; + + uint32_t count = 0; + greset.d32 = 0; + greset.b.txfflsh = 1; + greset.b.txfnum = num; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GRSTCTL, greset.d32 ); + do + { + greset.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + break; + } + } + while (greset.b.txfflsh == 1); + /* Wait for 3 PHY Clocks*/ + USB_OTG_BSP_uDelay(3); + return status; +} + + +/** +* @brief USB_OTG_FlushRxFifo : Flush a Rx FIFO +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_FlushRxFifo( USB_OTG_CORE_HANDLE *pdev ) +{ + USB_OTG_STS status = USB_OTG_OK; + __IO USB_OTG_GRSTCTL_TypeDef greset; + uint32_t count = 0; + + greset.d32 = 0; + greset.b.rxfflsh = 1; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GRSTCTL, greset.d32 ); + do + { + greset.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + break; + } + } + while (greset.b.rxfflsh == 1); + /* Wait for 3 PHY Clocks*/ + USB_OTG_BSP_uDelay(3); + return status; +} + + +/** +* @brief USB_OTG_SetCurrentMode : Set ID line +* @param pdev : Selected device +* @param mode : (Host/device) +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_SetCurrentMode(USB_OTG_CORE_HANDLE *pdev , uint8_t mode) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GUSBCFG_TypeDef usbcfg; + + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + + usbcfg.b.force_host = 0; + usbcfg.b.force_dev = 0; + + if ( mode == HOST_MODE) + { + usbcfg.b.force_host = 1; + } + else if ( mode == DEVICE_MODE) + { + usbcfg.b.force_dev = 1; + } + + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + USB_OTG_BSP_mDelay(50); + return status; +} + + +/** +* @brief USB_OTG_GetMode : Get current mode +* @param pdev : Selected device +* @retval current mode +*/ +uint32_t USB_OTG_GetMode(USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTSTS ) & 0x1); +} + + +/** +* @brief USB_OTG_IsDeviceMode : Check if it is device mode +* @param pdev : Selected device +* @retval num_in_ep +*/ +uint8_t USB_OTG_IsDeviceMode(USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_GetMode(pdev) != HOST_MODE); +} + + +/** +* @brief USB_OTG_IsHostMode : Check if it is host mode +* @param pdev : Selected device +* @retval num_in_ep +*/ +uint8_t USB_OTG_IsHostMode(USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_GetMode(pdev) == HOST_MODE); +} + + +/** +* @brief USB_OTG_ReadCoreItr : returns the Core Interrupt register +* @param pdev : Selected device +* @retval Status +*/ +uint32_t USB_OTG_ReadCoreItr(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t v = 0; + v = USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTSTS); + v &= USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTMSK); + return v; +} + + +/** +* @brief USB_OTG_ReadOtgItr : returns the USB_OTG Interrupt register +* @param pdev : Selected device +* @retval Status +*/ +uint32_t USB_OTG_ReadOtgItr (USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_READ_REG32 (&pdev->regs.GREGS->GOTGINT)); +} + +#ifdef USE_HOST_MODE +/** +* @brief USB_OTG_CoreInitHost : Initializes USB_OTG controller for host mode +* @param pdev : Selected device +* @retval status +*/ +USB_OTG_STS USB_OTG_CoreInitHost(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_FSIZ_TypeDef nptxfifosize; + USB_OTG_FSIZ_TypeDef ptxfifosize; + USB_OTG_HCFG_TypeDef hcfg; + +#ifdef USE_OTG_MODE + USB_OTG_OTGCTL_TypeDef gotgctl; +#endif + + uint32_t i = 0; + + nptxfifosize.d32 = 0; + ptxfifosize.d32 = 0; +#ifdef USE_OTG_MODE + gotgctl.d32 = 0; +#endif + hcfg.d32 = 0; + + + /* configure charge pump IO */ + USB_OTG_BSP_ConfigVBUS(pdev); + + /* Restart the Phy Clock */ + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, 0); + + /* Initialize Host Configuration Register */ + if (pdev->cfg.phy_itface == USB_OTG_ULPI_PHY) + { + USB_OTG_InitFSLSPClkSel(pdev , HCFG_30_60_MHZ); + } + else + { + USB_OTG_InitFSLSPClkSel(pdev , HCFG_48_MHZ); + } + USB_OTG_ResetPort(pdev); + + hcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HCFG); + hcfg.b.fslssupp = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HCFG, hcfg.d32); + + /* Configure data FIFO sizes */ + /* Rx FIFO */ +#ifdef USB_OTG_FS_CORE + if(pdev->cfg.coreID == USB_OTG_FS_CORE_ID) + { + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_FS_SIZE); + nptxfifosize.b.startaddr = RX_FIFO_FS_SIZE; + nptxfifosize.b.depth = TXH_NP_FS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32); + + ptxfifosize.b.startaddr = RX_FIFO_FS_SIZE + TXH_NP_FS_FIFOSIZ; + ptxfifosize.b.depth = TXH_P_FS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->HPTXFSIZ, ptxfifosize.d32); + } +#endif +#ifdef USB_OTG_HS_CORE + if (pdev->cfg.coreID == USB_OTG_HS_CORE_ID) + { + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_HS_SIZE); + nptxfifosize.b.startaddr = RX_FIFO_HS_SIZE; + nptxfifosize.b.depth = TXH_NP_HS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32); + + ptxfifosize.b.startaddr = RX_FIFO_HS_SIZE + TXH_NP_HS_FIFOSIZ; + ptxfifosize.b.depth = TXH_P_HS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->HPTXFSIZ, ptxfifosize.d32); + } +#endif + +#ifdef USE_OTG_MODE + /* Clear Host Set HNP Enable in the USB_OTG Control Register */ + gotgctl.b.hstsethnpen = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GOTGCTL, gotgctl.d32, 0); +#endif + + /* Make sure the FIFOs are flushed. */ + USB_OTG_FlushTxFifo(pdev, 0x10 ); /* all Tx FIFOs */ + USB_OTG_FlushRxFifo(pdev); + + + /* Clear all pending HC Interrupts */ + for (i = 0; i < pdev->cfg.host_channels; i++) + { + USB_OTG_WRITE_REG32( &pdev->regs.HC_REGS[i]->HCINT, 0xFFFFFFFF ); + USB_OTG_WRITE_REG32( &pdev->regs.HC_REGS[i]->HCINTMSK, 0 ); + } +#ifndef USE_OTG_MODE + USB_OTG_DriveVbus(pdev, 1); +#endif + + USB_OTG_EnableHostInt(pdev); + return status; +} + +/** +* @brief USB_OTG_IsEvenFrame +* This function returns the frame number for sof packet +* @param pdev : Selected device +* @retval Frame number +*/ +uint8_t USB_OTG_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev) +{ + return !(USB_OTG_READ_REG32(&pdev->regs.HREGS->HFNUM) & 0x1); +} + +/** +* @brief USB_OTG_DriveVbus : set/reset vbus +* @param pdev : Selected device +* @param state : VBUS state +* @retval None +*/ +void USB_OTG_DriveVbus (USB_OTG_CORE_HANDLE *pdev, uint8_t state) +{ + USB_OTG_HPRT0_TypeDef hprt0; + + hprt0.d32 = 0; + + /* enable disable the external charge pump */ + USB_OTG_BSP_DriveVBUS(pdev, state); + + /* Turn on the Host port power. */ + hprt0.d32 = USB_OTG_ReadHPRT0(pdev); + if ((hprt0.b.prtpwr == 0 ) && (state == 1 )) + { + hprt0.b.prtpwr = 1; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + } + if ((hprt0.b.prtpwr == 1 ) && (state == 0 )) + { + hprt0.b.prtpwr = 0; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + } + + USB_OTG_BSP_mDelay(200); +} +/** +* @brief USB_OTG_EnableHostInt: Enables the Host mode interrupts +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EnableHostInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GINTMSK_TypeDef intmsk; + intmsk.d32 = 0; + /* Disable all interrupts. */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTMSK, 0); + + /* Clear any pending interrupts. */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, 0xFFFFFFFF); + + /* Enable the common interrupts */ + USB_OTG_EnableCommonInt(pdev); + + if (pdev->cfg.dma_enable == 0) + { + intmsk.b.rxstsqlvl = 1; + } + intmsk.b.portintr = 1; + intmsk.b.hcintr = 1; + intmsk.b.disconnect = 1; + intmsk.b.sofintr = 1; + intmsk.b.incomplisoout = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GINTMSK, intmsk.d32, intmsk.d32); + return status; +} + +/** +* @brief USB_OTG_InitFSLSPClkSel : Initializes the FSLSPClkSel field of the +* HCFG register on the PHY type +* @param pdev : Selected device +* @param freq : clock frequency +* @retval None +*/ +void USB_OTG_InitFSLSPClkSel(USB_OTG_CORE_HANDLE *pdev , uint8_t freq) +{ + USB_OTG_HCFG_TypeDef hcfg; + + hcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HCFG); + hcfg.b.fslspclksel = freq; + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HCFG, hcfg.d32); +} + + +/** +* @brief USB_OTG_ReadHPRT0 : Reads HPRT0 to modify later +* @param pdev : Selected device +* @retval HPRT0 value +*/ +uint32_t USB_OTG_ReadHPRT0(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_HPRT0_TypeDef hprt0; + + hprt0.d32 = USB_OTG_READ_REG32(pdev->regs.HPRT0); + hprt0.b.prtena = 0; + hprt0.b.prtconndet = 0; + hprt0.b.prtenchng = 0; + hprt0.b.prtovrcurrchng = 0; + return hprt0.d32; +} + + +/** +* @brief USB_OTG_ReadHostAllChannels_intr : Register PCD Callbacks +* @param pdev : Selected device +* @retval Status +*/ +uint32_t USB_OTG_ReadHostAllChannels_intr (USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_READ_REG32 (&pdev->regs.HREGS->HAINT)); +} + + +/** +* @brief USB_OTG_ResetPort : Reset Host Port +* @param pdev : Selected device +* @retval status +* @note : (1)The application must wait at least 10 ms (+ 10 ms security) +* before clearing the reset bit. +*/ +uint32_t USB_OTG_ResetPort(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_HPRT0_TypeDef hprt0; + + hprt0.d32 = USB_OTG_ReadHPRT0(pdev); + hprt0.b.prtrst = 1; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + USB_OTG_BSP_mDelay (10); /* See Note #1 */ + hprt0.b.prtrst = 0; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + USB_OTG_BSP_mDelay (20); + return 1; +} + + +/** +* @brief USB_OTG_HC_Init : Prepares a host channel for transferring packets +* @param pdev : Selected device +* @param hc_num : channel number +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_HC_Init(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + uint32_t intr_enable = 0; + USB_OTG_HCINTMSK_TypeDef hcintmsk; + USB_OTG_GINTMSK_TypeDef gintmsk; + USB_OTG_HCCHAR_TypeDef hcchar; + USB_OTG_HCINTn_TypeDef hcint; + + + gintmsk.d32 = 0; + hcintmsk.d32 = 0; + hcchar.d32 = 0; + + /* Clear old interrupt conditions for this host channel. */ + hcint.d32 = 0xFFFFFFFF; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCINT, hcint.d32); + + /* Enable channel interrupts required for this transfer. */ + hcintmsk.d32 = 0; + + if (pdev->cfg.dma_enable == 1) + { + hcintmsk.b.ahberr = 1; + } + + switch (pdev->host.hc[hc_num].ep_type) + { + case EP_TYPE_CTRL: + case EP_TYPE_BULK: + hcintmsk.b.xfercompl = 1; + hcintmsk.b.stall = 1; + hcintmsk.b.xacterr = 1; + hcintmsk.b.datatglerr = 1; + hcintmsk.b.nak = 1; + if (pdev->host.hc[hc_num].ep_is_in) + { + hcintmsk.b.bblerr = 1; + } + else + { + hcintmsk.b.nyet = 1; + if (pdev->host.hc[hc_num].do_ping) + { + hcintmsk.b.ack = 1; + } + } + break; + case EP_TYPE_INTR: + hcintmsk.b.xfercompl = 1; + hcintmsk.b.nak = 1; + hcintmsk.b.stall = 1; + hcintmsk.b.xacterr = 1; + hcintmsk.b.datatglerr = 1; + hcintmsk.b.frmovrun = 1; + + if (pdev->host.hc[hc_num].ep_is_in) + { + hcintmsk.b.bblerr = 1; + } + + break; + case EP_TYPE_ISOC: + hcintmsk.b.xfercompl = 1; + hcintmsk.b.frmovrun = 1; + hcintmsk.b.ack = 1; + + if (pdev->host.hc[hc_num].ep_is_in) + { + hcintmsk.b.xacterr = 1; + hcintmsk.b.bblerr = 1; + } + break; + } + + + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCINTMSK, hcintmsk.d32); + + + /* Enable the top level host channel interrupt. */ + intr_enable = (1 << hc_num); + USB_OTG_MODIFY_REG32(&pdev->regs.HREGS->HAINTMSK, 0, intr_enable); + + /* Make sure host channel interrupts are enabled. */ + gintmsk.b.hcintr = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GINTMSK, 0, gintmsk.d32); + + /* Program the HCCHAR register */ + hcchar.d32 = 0; + hcchar.b.devaddr = pdev->host.hc[hc_num].dev_addr; + hcchar.b.epnum = pdev->host.hc[hc_num].ep_num; + hcchar.b.epdir = pdev->host.hc[hc_num].ep_is_in; + hcchar.b.lspddev = (pdev->host.hc[hc_num].speed == HPRT0_PRTSPD_LOW_SPEED); + hcchar.b.eptype = pdev->host.hc[hc_num].ep_type; + hcchar.b.mps = pdev->host.hc[hc_num].max_packet; + if (pdev->host.hc[hc_num].ep_type == HCCHAR_INTR) + { + hcchar.b.oddfrm = 1; + } + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + return status; +} + + +/** +* @brief USB_OTG_HC_StartXfer : Start transfer +* @param pdev : Selected device +* @param hc_num : channel number +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_HC_StartXfer(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_HCCHAR_TypeDef hcchar; + USB_OTG_HCTSIZn_TypeDef hctsiz; + USB_OTG_HNPTXSTS_TypeDef hnptxsts; + USB_OTG_HPTXSTS_TypeDef hptxsts; + USB_OTG_GINTMSK_TypeDef intmsk; + uint16_t len_words = 0; + + uint16_t num_packets; + uint16_t max_hc_pkt_count; + + max_hc_pkt_count = 256; + hctsiz.d32 = 0; + hcchar.d32 = 0; + intmsk.d32 = 0; + + /* Compute the expected number of packets associated to the transfer */ + if (pdev->host.hc[hc_num].xfer_len > 0) + { + num_packets = (pdev->host.hc[hc_num].xfer_len + \ + pdev->host.hc[hc_num].max_packet - 1) / pdev->host.hc[hc_num].max_packet; + + if (num_packets > max_hc_pkt_count) + { + num_packets = max_hc_pkt_count; + pdev->host.hc[hc_num].xfer_len = num_packets * \ + pdev->host.hc[hc_num].max_packet; + } + } + else + { + num_packets = 1; + } + if (pdev->host.hc[hc_num].ep_is_in) + { + pdev->host.hc[hc_num].xfer_len = num_packets * \ + pdev->host.hc[hc_num].max_packet; + } + /* Initialize the HCTSIZn register */ + hctsiz.b.xfersize = pdev->host.hc[hc_num].xfer_len; + hctsiz.b.pktcnt = num_packets; + hctsiz.b.pid = pdev->host.hc[hc_num].data_pid; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCTSIZ, hctsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCDMA, (unsigned int)pdev->host.hc[hc_num].xfer_buff); + } + + + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR); + hcchar.b.oddfrm = USB_OTG_IsEvenFrame(pdev); + + /* Set host channel enable */ + hcchar.b.chen = 1; + hcchar.b.chdis = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + + if (pdev->cfg.dma_enable == 0) /* Slave mode */ + { + if((pdev->host.hc[hc_num].ep_is_in == 0) && + (pdev->host.hc[hc_num].xfer_len > 0)) + { + switch(pdev->host.hc[hc_num].ep_type) + { + /* Non periodic transfer */ + case EP_TYPE_CTRL: + case EP_TYPE_BULK: + + hnptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->HNPTXSTS); + len_words = (pdev->host.hc[hc_num].xfer_len + 3) / 4; + + /* check if there is enough space in FIFO space */ + if(len_words > hnptxsts.b.nptxfspcavail) + { + /* need to process data in nptxfempty interrupt */ + intmsk.b.nptxfempty = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, intmsk.d32); + } + + break; + /* Periodic transfer */ + case EP_TYPE_INTR: + case EP_TYPE_ISOC: + hptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HPTXSTS); + len_words = (pdev->host.hc[hc_num].xfer_len + 3) / 4; + /* check if there is enough space in FIFO space */ + if(len_words > hptxsts.b.ptxfspcavail) /* split the transfer */ + { + /* need to process data in ptxfempty interrupt */ + intmsk.b.ptxfempty = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, intmsk.d32); + } + break; + + default: + break; + } + + /* Write packet into the Tx FIFO. */ + USB_OTG_WritePacket(pdev, + pdev->host.hc[hc_num].xfer_buff , + hc_num, pdev->host.hc[hc_num].xfer_len); + } + } + return status; +} + + +/** +* @brief USB_OTG_HC_Halt : Halt channel +* @param pdev : Selected device +* @param hc_num : channel number +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_HC_Halt(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_HNPTXSTS_TypeDef nptxsts; + USB_OTG_HPTXSTS_TypeDef hptxsts; + USB_OTG_HCCHAR_TypeDef hcchar; + + nptxsts.d32 = 0; + hptxsts.d32 = 0; + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR); + hcchar.b.chen = 1; + hcchar.b.chdis = 1; + + /* Check for space in the request queue to issue the halt. */ + if (hcchar.b.eptype == HCCHAR_CTRL || hcchar.b.eptype == HCCHAR_BULK) + { + nptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->HNPTXSTS); + if (nptxsts.b.nptxqspcavail == 0) + { + hcchar.b.chen = 0; + } + } + else + { + hptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HPTXSTS); + if (hptxsts.b.ptxqspcavail == 0) + { + hcchar.b.chen = 0; + } + } + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + return status; +} + +/** +* @brief Issue a ping token +* @param None +* @retval : None +*/ +USB_OTG_STS USB_OTG_HC_DoPing(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_HCCHAR_TypeDef hcchar; + USB_OTG_HCTSIZn_TypeDef hctsiz; + + hctsiz.d32 = 0; + hctsiz.b.dopng = 1; + hctsiz.b.pktcnt = 1; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCTSIZ, hctsiz.d32); + + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR); + hcchar.b.chen = 1; + hcchar.b.chdis = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + return status; +} + +/** +* @brief Stop the device and clean up fifo's +* @param None +* @retval : None +*/ +void USB_OTG_StopHost(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_HCCHAR_TypeDef hcchar; + uint32_t i; + + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HAINTMSK , 0); + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HAINT, 0xFFFFFFFF); + /* Flush out any leftover queued requests. */ + + for (i = 0; i < pdev->cfg.host_channels; i++) + { + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[i]->HCCHAR); + hcchar.b.chen = 0; + hcchar.b.chdis = 1; + hcchar.b.epdir = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[i]->HCCHAR, hcchar.d32); + } + + /* Flush the FIFO */ + USB_OTG_FlushRxFifo(pdev); + USB_OTG_FlushTxFifo(pdev , 0x10 ); +} +#endif +#ifdef USE_DEVICE_MODE +/* PCD Core Layer */ + +/** +* @brief USB_OTG_InitDevSpeed :Initializes the DevSpd field of DCFG register +* depending the PHY type and the enumeration speed of the device. +* @param pdev : Selected device +* @retval : None +*/ +void USB_OTG_InitDevSpeed(USB_OTG_CORE_HANDLE *pdev , uint8_t speed) +{ + USB_OTG_DCFG_TypeDef dcfg; + + dcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCFG); + dcfg.b.devspd = speed; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCFG, dcfg.d32); +} + + +/** +* @brief USB_OTG_CoreInitDev : Initializes the USB_OTG controller registers +* for device mode +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_CoreInitDev (USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + uint32_t i; + USB_OTG_DCFG_TypeDef dcfg; + USB_OTG_FSIZ_TypeDef nptxfifosize; + USB_OTG_FSIZ_TypeDef txfifosize; + USB_OTG_DIEPMSK_TypeDef msk; + USB_OTG_DTHRCTL_TypeDef dthrctl; + + depctl.d32 = 0; + dcfg.d32 = 0; + nptxfifosize.d32 = 0; + txfifosize.d32 = 0; + msk.d32 = 0; + + /* Restart the Phy Clock */ + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, 0); + /* Device configuration register */ + dcfg.d32 = USB_OTG_READ_REG32( &pdev->regs.DREGS->DCFG); + dcfg.b.perfrint = DCFG_FRAME_INTERVAL_80; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DCFG, dcfg.d32 ); + +#ifdef USB_OTG_FS_CORE + if(pdev->cfg.coreID == USB_OTG_FS_CORE_ID ) + { + + /* Set Full speed phy */ + USB_OTG_InitDevSpeed (pdev , USB_OTG_SPEED_PARAM_FULL); + + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_FS_SIZE); + + /* EP0 TX*/ + nptxfifosize.b.depth = TX0_FIFO_FS_SIZE; + nptxfifosize.b.startaddr = RX_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32 ); + + + /* EP1 TX*/ + txfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth; + txfifosize.b.depth = TX1_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[0], txfifosize.d32 ); + + + /* EP2 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX2_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[1], txfifosize.d32 ); + + + /* EP3 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX3_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[2], txfifosize.d32 ); + } +#endif +#ifdef USB_OTG_HS_CORE + if(pdev->cfg.coreID == USB_OTG_HS_CORE_ID ) + { + + /* Set High speed phy */ + + if(pdev->cfg.phy_itface == USB_OTG_ULPI_PHY) + { + USB_OTG_InitDevSpeed (pdev , USB_OTG_SPEED_PARAM_HIGH); + } + else /* set High speed phy in Full speed mode */ + { + USB_OTG_InitDevSpeed (pdev , USB_OTG_SPEED_PARAM_HIGH_IN_FULL); + } + + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_HS_SIZE); + + /* EP0 TX*/ + nptxfifosize.b.depth = TX0_FIFO_HS_SIZE; + nptxfifosize.b.startaddr = RX_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32 ); + + + /* EP1 TX*/ + txfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth; + txfifosize.b.depth = TX1_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[0], txfifosize.d32 ); + + + /* EP2 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX2_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[1], txfifosize.d32 ); + + + /* EP3 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX3_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[2], txfifosize.d32 ); + + /* EP4 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX4_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[3], txfifosize.d32 ); + + + /* EP5 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX5_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[4], txfifosize.d32 ); + } +#endif + /* Flush the FIFOs */ + USB_OTG_FlushTxFifo(pdev , 0x10); /* all Tx FIFOs */ + USB_OTG_FlushRxFifo(pdev); + /* Clear all pending Device Interrupts */ + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, 0 ); + + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[i]->DIEPCTL); + if (depctl.b.epena) + { + depctl.d32 = 0; + depctl.b.epdis = 1; + depctl.b.snak = 1; + } + else + { + depctl.d32 = 0; + } + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPCTL, depctl.d32); + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPTSIZ, 0); + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF); + } + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + USB_OTG_DEPCTL_TypeDef depctl; + depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[i]->DOEPCTL); + if (depctl.b.epena) + { + depctl.d32 = 0; + depctl.b.epdis = 1; + depctl.b.snak = 1; + } + else + { + depctl.d32 = 0; + } + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPCTL, depctl.d32); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPTSIZ, 0); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF); + } + msk.d32 = 0; + msk.b.txfifoundrn = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPMSK, msk.d32, msk.d32); + + if (pdev->cfg.dma_enable == 1) + { + dthrctl.d32 = 0; + dthrctl.b.non_iso_thr_en = 1; + dthrctl.b.iso_thr_en = 1; + dthrctl.b.tx_thr_len = 64; + dthrctl.b.rx_thr_en = 1; + dthrctl.b.rx_thr_len = 64; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DTHRCTL, dthrctl.d32); + } + USB_OTG_EnableDevInt(pdev); + return status; +} + + +/** +* @brief USB_OTG_EnableDevInt : Enables the Device mode interrupts +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EnableDevInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GINTMSK_TypeDef intmsk; + + intmsk.d32 = 0; + + /* Disable all interrupts. */ + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTMSK, 0); + /* Clear any pending interrupts */ + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, 0xBFFFFFFF); + /* Enable the common interrupts */ + USB_OTG_EnableCommonInt(pdev); + + if (pdev->cfg.dma_enable == 0) + { + intmsk.b.rxstsqlvl = 1; + } + + /* Enable interrupts matching to the Device mode ONLY */ + intmsk.b.usbsuspend = 1; + intmsk.b.usbreset = 1; + intmsk.b.enumdone = 1; + intmsk.b.inepintr = 1; + intmsk.b.outepintr = 1; + intmsk.b.sofintr = 1; + + intmsk.b.incomplisoin = 1; + intmsk.b.incomplisoout = 1; +#ifdef VBUS_SENSING_ENABLED + intmsk.b.sessreqintr = 1; + intmsk.b.otgintr = 1; +#endif + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, intmsk.d32, intmsk.d32); + return status; +} + + +/** +* @brief USB_OTG_GetDeviceSpeed +* Get the device speed from the device status register +* @param None +* @retval status +*/ +enum USB_OTG_SPEED USB_OTG_GetDeviceSpeed (USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DSTS_TypeDef dsts; + enum USB_OTG_SPEED speed = USB_SPEED_UNKNOWN; + + + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + switch (dsts.b.enumspd) + { + case DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ: + speed = USB_SPEED_HIGH; + break; + case DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ: + case DSTS_ENUMSPD_FS_PHY_48MHZ: + speed = USB_SPEED_FULL; + break; + + case DSTS_ENUMSPD_LS_PHY_6MHZ: + speed = USB_SPEED_LOW; + break; + } + + return speed; +} +/** +* @brief enables EP0 OUT to receive SETUP packets and configures EP0 +* for transmitting packets +* @param None +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EP0Activate(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DSTS_TypeDef dsts; + USB_OTG_DEPCTL_TypeDef diepctl; + USB_OTG_DCTL_TypeDef dctl; + + dctl.d32 = 0; + /* Read the Device Status and Endpoint 0 Control registers */ + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + diepctl.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[0]->DIEPCTL); + /* Set the MPS of the IN EP based on the enumeration speed */ + switch (dsts.b.enumspd) + { + case DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ: + case DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ: + case DSTS_ENUMSPD_FS_PHY_48MHZ: + diepctl.b.mps = DEP0CTL_MPS_64; + break; + case DSTS_ENUMSPD_LS_PHY_6MHZ: + diepctl.b.mps = DEP0CTL_MPS_8; + break; + } + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[0]->DIEPCTL, diepctl.d32); + dctl.b.cgnpinnak = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, dctl.d32); + return status; +} + + +/** +* @brief USB_OTG_EPActivate : Activates an EP +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPActivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DAINT_TypeDef daintmsk; + __IO uint32_t *addr; + + + depctl.d32 = 0; + daintmsk.d32 = 0; + /* Read DEPCTLn register */ + if (ep->is_in == 1) + { + addr = &pdev->regs.INEP_REGS[ep->num]->DIEPCTL; + daintmsk.ep.in = 1 << ep->num; + } + else + { + addr = &pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL; + daintmsk.ep.out = 1 << ep->num; + } + /* If the EP is already active don't change the EP Control + * register. */ + depctl.d32 = USB_OTG_READ_REG32(addr); + if (!depctl.b.usbactep) + { + depctl.b.mps = ep->maxpacket; + depctl.b.eptype = ep->type; + depctl.b.txfnum = ep->tx_fifo_num; + depctl.b.setd0pid = 1; + depctl.b.usbactep = 1; + USB_OTG_WRITE_REG32(addr, depctl.d32); + } + /* Enable the Interrupt for this EP */ +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + if((ep->num == 1)&&(pdev->cfg.coreID == USB_OTG_HS_CORE_ID)) + { + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DEACHMSK, 0, daintmsk.d32); + } + else +#endif + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DAINTMSK, 0, daintmsk.d32); + return status; +} + + +/** +* @brief USB_OTG_EPDeactivate : Deactivates an EP +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPDeactivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DAINT_TypeDef daintmsk; + __IO uint32_t *addr; + + depctl.d32 = 0; + daintmsk.d32 = 0; + /* Read DEPCTLn register */ + if (ep->is_in == 1) + { + addr = &pdev->regs.INEP_REGS[ep->num]->DIEPCTL; + daintmsk.ep.in = 1 << ep->num; + } + else + { + addr = &pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL; + daintmsk.ep.out = 1 << ep->num; + } + depctl.b.usbactep = 0; + USB_OTG_WRITE_REG32(addr, depctl.d32); + /* Disable the Interrupt for this EP */ + +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + if((ep->num == 1)&&(pdev->cfg.coreID == USB_OTG_HS_CORE_ID)) + { + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DEACHMSK, daintmsk.d32, 0); + } + else +#endif + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DAINTMSK, daintmsk.d32, 0); + return status; +} + + +/** +* @brief USB_OTG_EPStartXfer : Handle the setup for data xfer for an EP and +* starts the xfer +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPStartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DEPXFRSIZ_TypeDef deptsiz; + USB_OTG_DSTS_TypeDef dsts; + uint32_t fifoemptymsk = 0; + + depctl.d32 = 0; + deptsiz.d32 = 0; + /* IN endpoint */ + if (ep->is_in == 1) + { + depctl.d32 = USB_OTG_READ_REG32(&(pdev->regs.INEP_REGS[ep->num]->DIEPCTL)); + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.INEP_REGS[ep->num]->DIEPTSIZ)); + /* Zero Length Packet? */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = 0; + deptsiz.b.pktcnt = 1; + } + else + { + /* Program the transfer size and packet count + * as follows: xfersize = N * maxpacket + + * short_packet pktcnt = N + (short_packet + * exist ? 1 : 0) + */ + deptsiz.b.xfersize = ep->xfer_len; + deptsiz.b.pktcnt = (ep->xfer_len - 1 + ep->maxpacket) / ep->maxpacket; + + if (ep->type == EP_TYPE_ISOC) + { + deptsiz.b.mc = 1; + } + } + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPTSIZ, deptsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPDMA, ep->dma_addr); + } + else + { + if (ep->type != EP_TYPE_ISOC) + { + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0) + { + fifoemptymsk = 1 << ep->num; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, 0, fifoemptymsk); + } + } + } + + + if (ep->type == EP_TYPE_ISOC) + { + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + if (((dsts.b.soffn)&0x1) == 0) + { + depctl.b.setd1pid = 1; + } + else + { + depctl.b.setd0pid = 1; + } + } + + /* EP enable, IN data in FIFO */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPCTL, depctl.d32); + + if (ep->type == EP_TYPE_ISOC) + { + USB_OTG_WritePacket(pdev, ep->xfer_buff, ep->num, ep->xfer_len); + } + } + else + { + /* OUT endpoint */ + depctl.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL)); + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ)); + /* Program the transfer size and packet count as follows: + * pktcnt = N + * xfersize = N * maxpacket + */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = ep->maxpacket; + deptsiz.b.pktcnt = 1; + } + else + { + deptsiz.b.pktcnt = (ep->xfer_len + (ep->maxpacket - 1)) / ep->maxpacket; + deptsiz.b.xfersize = deptsiz.b.pktcnt * ep->maxpacket; + } + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ, deptsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPDMA, ep->dma_addr); + } + + if (ep->type == EP_TYPE_ISOC) + { + if (ep->even_odd_frame) + { + depctl.b.setd1pid = 1; + } + else + { + depctl.b.setd0pid = 1; + } + } + /* EP enable */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL, depctl.d32); + } + return status; +} + + +/** +* @brief USB_OTG_EP0StartXfer : Handle the setup for a data xfer for EP0 and +* starts the xfer +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EP0StartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DEP0XFRSIZ_TypeDef deptsiz; + USB_OTG_INEPREGS *in_regs; + uint32_t fifoemptymsk = 0; + + depctl.d32 = 0; + deptsiz.d32 = 0; + /* IN endpoint */ + if (ep->is_in == 1) + { + in_regs = pdev->regs.INEP_REGS[0]; + depctl.d32 = USB_OTG_READ_REG32(&in_regs->DIEPCTL); + deptsiz.d32 = USB_OTG_READ_REG32(&in_regs->DIEPTSIZ); + /* Zero Length Packet? */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = 0; + deptsiz.b.pktcnt = 1; + + } + else + { + if (ep->xfer_len > ep->maxpacket) + { + ep->xfer_len = ep->maxpacket; + deptsiz.b.xfersize = ep->maxpacket; + } + else + { + deptsiz.b.xfersize = ep->xfer_len; + } + deptsiz.b.pktcnt = 1; + } + USB_OTG_WRITE_REG32(&in_regs->DIEPTSIZ, deptsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPDMA, ep->dma_addr); + } + + /* EP enable, IN data in FIFO */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32(&in_regs->DIEPCTL, depctl.d32); + + + + if (pdev->cfg.dma_enable == 0) + { + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0) + { + { + fifoemptymsk |= 1 << ep->num; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, 0, fifoemptymsk); + } + } + } + } + else + { + /* OUT endpoint */ + depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + deptsiz.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ); + /* Program the transfer size and packet count as follows: + * xfersize = N * (maxpacket + 4 - (maxpacket % 4)) + * pktcnt = N */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = ep->maxpacket; + deptsiz.b.pktcnt = 1; + } + else + { + ep->xfer_len = ep->maxpacket; + deptsiz.b.xfersize = ep->maxpacket; + deptsiz.b.pktcnt = 1; + } + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ, deptsiz.d32); + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPDMA, ep->dma_addr); + } + /* EP enable */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32 (&(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL), depctl.d32); + + } + return status; +} + + +/** +* @brief USB_OTG_EPSetStall : Set the EP STALL +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPSetStall(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + + depctl.d32 = 0; + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + /* set the disable and stall bits */ + if (depctl.b.epena) + { + depctl.b.epdis = 1; + } + depctl.b.stall = 1; + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); + } + else + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + /* set the stall bit */ + depctl.b.stall = 1; + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); + } + return status; +} + + +/** +* @brief Clear the EP STALL +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPClearStall(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + + depctl.d32 = 0; + + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + } + else + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + } + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + /* clear the stall bits */ + depctl.b.stall = 0; + if (ep->type == EP_TYPE_INTR || ep->type == EP_TYPE_BULK) + { + depctl.b.setd0pid = 1; /* DATA0 */ + } + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); + return status; +} + + +/** +* @brief USB_OTG_ReadDevAllOutEp_itr : returns OUT endpoint interrupt bits +* @param pdev : Selected device +* @retval OUT endpoint interrupt bits +*/ +uint32_t USB_OTG_ReadDevAllOutEp_itr(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t v; + v = USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINT); + v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINTMSK); + return ((v & 0xffff0000) >> 16); +} + + +/** +* @brief USB_OTG_ReadDevOutEP_itr : returns Device OUT EP Interrupt register +* @param pdev : Selected device +* @param ep : end point number +* @retval Device OUT EP Interrupt register +*/ +uint32_t USB_OTG_ReadDevOutEP_itr(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + uint32_t v; + v = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[epnum]->DOEPINT); + v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DOEPMSK); + return v; +} + + +/** +* @brief USB_OTG_ReadDevAllInEPItr : Get int status register +* @param pdev : Selected device +* @retval int status register +*/ +uint32_t USB_OTG_ReadDevAllInEPItr(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t v; + v = USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINT); + v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINTMSK); + return (v & 0xffff); +} + +/** +* @brief configures EPO to receive SETUP packets +* @param None +* @retval : None +*/ +void USB_OTG_EP0_OutStart(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DEP0XFRSIZ_TypeDef doeptsize0; + doeptsize0.d32 = 0; + doeptsize0.b.supcnt = 3; + doeptsize0.b.pktcnt = 1; + doeptsize0.b.xfersize = 8 * 3; + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPTSIZ, doeptsize0.d32 ); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_DEPCTL_TypeDef doepctl; + doepctl.d32 = 0; + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPDMA, + (uint32_t)&pdev->dev.setup_packet); + + /* EP enable */ + doepctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[0]->DOEPCTL); + doepctl.b.epena = 1; + doepctl.d32 = 0x80008000; + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPCTL, doepctl.d32); + } +} + +/** +* @brief USB_OTG_RemoteWakeup : active remote wakeup signalling +* @param None +* @retval : None +*/ +void USB_OTG_ActiveRemoteWakeup(USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_DCTL_TypeDef dctl; + USB_OTG_DSTS_TypeDef dsts; + USB_OTG_PCGCCTL_TypeDef power; + + if (pdev->dev.DevRemoteWakeup) + { + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + if(dsts.b.suspsts == 1) + { + if(pdev->cfg.low_power) + { + /* un-gate USB Core clock */ + power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL); + power.b.gatehclk = 0; + power.b.stoppclk = 0; + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32); + } + /* active Remote wakeup signaling */ + dctl.d32 = 0; + dctl.b.rmtwkupsig = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, 0, dctl.d32); + USB_OTG_BSP_mDelay(5); + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, 0 ); + } + } +} + + +/** +* @brief USB_OTG_UngateClock : active USB Core clock +* @param None +* @retval : None +*/ +void USB_OTG_UngateClock(USB_OTG_CORE_HANDLE *pdev) +{ + if(pdev->cfg.low_power) + { + + USB_OTG_DSTS_TypeDef dsts; + USB_OTG_PCGCCTL_TypeDef power; + + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + if(dsts.b.suspsts == 1) + { + /* un-gate USB Core clock */ + power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL); + power.b.gatehclk = 0; + power.b.stoppclk = 0; + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32); + + } + } +} + +/** +* @brief Stop the device and clean up fifo's +* @param None +* @retval : None +*/ +void USB_OTG_StopDevice(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t i; + + pdev->dev.device_status = 1; + + for (i = 0; i < pdev->cfg.dev_endpoints ; i++) + { + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF); + } + + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF ); + + /* Flush the FIFO */ + USB_OTG_FlushRxFifo(pdev); + USB_OTG_FlushTxFifo(pdev , 0x10 ); +} + +/** +* @brief returns the EP Status +* @param pdev : Selected device +* ep : endpoint structure +* @retval : EP status +*/ + +uint32_t USB_OTG_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,USB_OTG_EP *ep) +{ + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + uint32_t Status = 0; + + depctl.d32 = 0; + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + if (depctl.b.stall == 1) + Status = USB_OTG_EP_TX_STALL; + else if (depctl.b.naksts == 1) + Status = USB_OTG_EP_TX_NAK; + else + Status = USB_OTG_EP_TX_VALID; + + } + else + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + if (depctl.b.stall == 1) + Status = USB_OTG_EP_RX_STALL; + else if (depctl.b.naksts == 1) + Status = USB_OTG_EP_RX_NAK; + else + Status = USB_OTG_EP_RX_VALID; + } + + /* Return the current status */ + return Status; +} + +/** +* @brief Set the EP Status +* @param pdev : Selected device +* Status : new Status +* ep : EP structure +* @retval : None +*/ +void USB_OTG_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep , uint32_t Status) +{ + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + + depctl.d32 = 0; + + /* Process for IN endpoint */ + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + if (Status == USB_OTG_EP_TX_STALL) + { + USB_OTG_EPSetStall(pdev, ep); return; + } + else if (Status == USB_OTG_EP_TX_NAK) + depctl.b.snak = 1; + else if (Status == USB_OTG_EP_TX_VALID) + { + if (depctl.b.stall == 1) + { + ep->even_odd_frame = 0; + USB_OTG_EPClearStall(pdev, ep); + return; + } + depctl.b.cnak = 1; + depctl.b.usbactep = 1; + depctl.b.epena = 1; + } + else if (Status == USB_OTG_EP_TX_DIS) + depctl.b.usbactep = 0; + } + else /* Process for OUT endpoint */ + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + if (Status == USB_OTG_EP_RX_STALL) { + depctl.b.stall = 1; + } + else if (Status == USB_OTG_EP_RX_NAK) + depctl.b.snak = 1; + else if (Status == USB_OTG_EP_RX_VALID) + { + if (depctl.b.stall == 1) + { + ep->even_odd_frame = 0; + USB_OTG_EPClearStall(pdev, ep); + return; + } + depctl.b.cnak = 1; + depctl.b.usbactep = 1; + depctl.b.epena = 1; + } + else if (Status == USB_OTG_EP_RX_DIS) + { + depctl.b.usbactep = 0; + } + } + + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); +} + +#endif +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/src/usb_dcd.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/src/usb_dcd.c new file mode 100644 index 00000000..eac8c337 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/src/usb_dcd.c @@ -0,0 +1,478 @@ +/** + ****************************************************************************** + * @file usb_dcd.c + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Peripheral Device Interface Layer + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd.h" +#include "usb_bsp.h" + + +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_DCD +* @brief This file is the interface between EFSL ans Host mass-storage class +* @{ +*/ + + +/** @defgroup USB_DCD_Private_Defines +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + + +/** @defgroup USB_DCD_Private_Macros +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_Variables +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_FunctionPrototypes +* @{ +*/ + +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_Functions +* @{ +*/ + + + +void DCD_Init(USB_OTG_CORE_HANDLE *pdev , + USB_OTG_CORE_ID_TypeDef coreID) +{ + uint32_t i; + USB_OTG_EP *ep; + + USB_OTG_SelectCore (pdev , coreID); + + pdev->dev.device_status = USB_OTG_DEFAULT; + pdev->dev.device_address = 0; + + /* Init ep structure */ + for (i = 0; i < pdev->cfg.dev_endpoints ; i++) + { + ep = &pdev->dev.in_ep[i]; + /* Init ep structure */ + ep->is_in = 1; + ep->num = i; + ep->tx_fifo_num = i; + /* Control until ep is actvated */ + ep->type = EP_TYPE_CTRL; + ep->maxpacket = USB_OTG_MAX_EP0_SIZE; + ep->xfer_buff = 0; + ep->xfer_len = 0; + } + + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + ep = &pdev->dev.out_ep[i]; + /* Init ep structure */ + ep->is_in = 0; + ep->num = i; + ep->tx_fifo_num = i; + /* Control until ep is activated */ + ep->type = EP_TYPE_CTRL; + ep->maxpacket = USB_OTG_MAX_EP0_SIZE; + ep->xfer_buff = 0; + ep->xfer_len = 0; + } + + USB_OTG_DisableGlobalInt(pdev); + + /*Init the Core (common init.) */ + USB_OTG_CoreInit(pdev); + + + /* Force Device Mode*/ + USB_OTG_SetCurrentMode(pdev, DEVICE_MODE); + + /* Init Device */ + USB_OTG_CoreInitDev(pdev); + + + /* Enable USB Global interrupt */ + USB_OTG_EnableGlobalInt(pdev); +} + + +/** +* @brief Configure an EP +* @param pdev : Device instance +* @param epdesc : Endpoint Descriptor +* @retval : status +*/ +uint32_t DCD_EP_Open(USB_OTG_CORE_HANDLE *pdev , + uint8_t ep_addr, + uint16_t ep_mps, + uint8_t ep_type) +{ + USB_OTG_EP *ep; + + if ((ep_addr & 0x80) == 0x80) + { + ep = &pdev->dev.in_ep[ep_addr & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[ep_addr & 0x7F]; + } + ep->num = ep_addr & 0x7F; + + ep->is_in = (0x80 & ep_addr) != 0; + ep->maxpacket = ep_mps; + ep->type = ep_type; + if (ep->is_in) + { + /* Assign a Tx FIFO */ + ep->tx_fifo_num = ep->num; + } + /* Set initial data PID. */ + if (ep_type == USB_OTG_EP_BULK ) + { + ep->data_pid_start = 0; + } + USB_OTG_EPActivate(pdev , ep ); + return 0; +} +/** +* @brief called when an EP is disabled +* @param pdev: device instance +* @param ep_addr: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_Close(USB_OTG_CORE_HANDLE *pdev , uint8_t ep_addr) +{ + USB_OTG_EP *ep; + + if ((ep_addr&0x80) == 0x80) + { + ep = &pdev->dev.in_ep[ep_addr & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[ep_addr & 0x7F]; + } + ep->num = ep_addr & 0x7F; + ep->is_in = (0x80 & ep_addr) != 0; + USB_OTG_EPDeactivate(pdev , ep ); + return 0; +} + + +/** +* @brief DCD_EP_PrepareRx +* @param pdev: device instance +* @param ep_addr: endpoint address +* @param pbuf: pointer to Rx buffer +* @param buf_len: data length +* @retval : status +*/ +uint32_t DCD_EP_PrepareRx( USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint16_t buf_len) +{ + USB_OTG_EP *ep; + + ep = &pdev->dev.out_ep[ep_addr & 0x7F]; + + /*setup and start the Xfer */ + ep->xfer_buff = pbuf; + ep->xfer_len = buf_len; + ep->xfer_count = 0; + ep->is_in = 0; + ep->num = ep_addr & 0x7F; + + if (pdev->cfg.dma_enable == 1) + { + ep->dma_addr = (uint32_t)pbuf; + } + + if ( ep->num == 0 ) + { + USB_OTG_EP0StartXfer(pdev , ep); + } + else + { + USB_OTG_EPStartXfer(pdev, ep ); + } + return 0; +} + +/** +* @brief Transmit data over USB +* @param pdev: device instance +* @param ep_addr: endpoint address +* @param pbuf: pointer to Tx buffer +* @param buf_len: data length +* @retval : status +*/ +uint32_t DCD_EP_Tx ( USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint32_t buf_len) +{ + USB_OTG_EP *ep; + + ep = &pdev->dev.in_ep[ep_addr & 0x7F]; + + /* Setup and start the Transfer */ + ep->is_in = 1; + ep->num = ep_addr & 0x7F; + ep->xfer_buff = pbuf; + ep->dma_addr = (uint32_t)pbuf; + ep->xfer_count = 0; + ep->xfer_len = buf_len; + + if ( ep->num == 0 ) + { + USB_OTG_EP0StartXfer(pdev , ep); + } + else + { + USB_OTG_EPStartXfer(pdev, ep ); + } + return 0; +} + + +/** +* @brief Stall an endpoint. +* @param pdev: device instance +* @param epnum: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_Stall (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum) +{ + USB_OTG_EP *ep; + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + ep->is_stall = 1; + ep->num = epnum & 0x7F; + ep->is_in = ((epnum & 0x80) == 0x80); + + USB_OTG_EPSetStall(pdev , ep); + return (0); +} + + +/** +* @brief Clear stall condition on endpoints. +* @param pdev: device instance +* @param epnum: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_ClrStall (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum) +{ + USB_OTG_EP *ep; + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + ep->is_stall = 0; + ep->num = epnum & 0x7F; + ep->is_in = ((epnum & 0x80) == 0x80); + + USB_OTG_EPClearStall(pdev , ep); + return (0); +} + + +/** +* @brief This Function flushes the FIFOs. +* @param pdev: device instance +* @param epnum: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_Flush (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + + if ((epnum & 0x80) == 0x80) + { + USB_OTG_FlushTxFifo(pdev, epnum & 0x7F); + } + else + { + USB_OTG_FlushRxFifo(pdev); + } + + return (0); +} + + +/** +* @brief This Function set USB device address +* @param pdev: device instance +* @param address: new device address +* @retval : status +*/ +void DCD_EP_SetAddress (USB_OTG_CORE_HANDLE *pdev, uint8_t address) +{ + USB_OTG_DCFG_TypeDef dcfg; + dcfg.d32 = 0; + dcfg.b.devaddr = address; + USB_OTG_MODIFY_REG32( &pdev->regs.DREGS->DCFG, 0, dcfg.d32); +} + +/** +* @brief Connect device (enable internal pull-up) +* @param pdev: device instance +* @retval : None +*/ +void DCD_DevConnect (USB_OTG_CORE_HANDLE *pdev) +{ +#ifndef USE_OTG_MODE + USB_OTG_DCTL_TypeDef dctl; + dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL); + /* Connect device */ + dctl.b.sftdiscon = 0; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32); + USB_OTG_BSP_mDelay(3); +#endif +} + + +/** +* @brief Disconnect device (disable internal pull-up) +* @param pdev: device instance +* @retval : None +*/ +void DCD_DevDisconnect (USB_OTG_CORE_HANDLE *pdev) +{ +#ifndef USE_OTG_MODE + USB_OTG_DCTL_TypeDef dctl; + dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL); + /* Disconnect device for 3ms */ + dctl.b.sftdiscon = 1; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32); + USB_OTG_BSP_mDelay(3); +#endif +} + + +/** +* @brief returns the EP Status +* @param pdev : Selected device +* epnum : endpoint address +* @retval : EP status +*/ + +uint32_t DCD_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,uint8_t epnum) +{ + USB_OTG_EP *ep; + uint32_t Status = 0; + + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + Status = USB_OTG_GetEPStatus(pdev ,ep); + + /* Return the current status */ + return Status; +} + +/** +* @brief Set the EP Status +* @param pdev : Selected device +* Status : new Status +* epnum : EP address +* @retval : None +*/ +void DCD_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum , uint32_t Status) +{ + USB_OTG_EP *ep; + + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + USB_OTG_SetEPStatus(pdev ,ep , Status); +} + +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/src/usb_dcd_int.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/src/usb_dcd_int.c new file mode 100644 index 00000000..32984e61 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/src/usb_dcd_int.c @@ -0,0 +1,869 @@ +/** + ****************************************************************************** + * @file usb_dcd_int.c + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Peripheral Device interrupt subroutines + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd_int.h" +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_DCD_INT +* @brief This file contains the interrupt subroutines for the Device mode. +* @{ +*/ + + +/** @defgroup USB_DCD_INT_Private_Defines +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + + +/** @defgroup USB_DCD_INT_Private_Macros +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_Variables +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_FunctionPrototypes +* @{ +*/ +/* static functions */ +static uint32_t DCD_ReadDevInEP (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum); + +/* Interrupt Handlers */ +static uint32_t DCD_HandleInEP_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleOutEP_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleSof_ISR(USB_OTG_CORE_HANDLE *pdev); + +static uint32_t DCD_HandleRxStatusQueueLevel_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev , uint32_t epnum); + +static uint32_t DCD_HandleUsbReset_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleEnumDone_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleResume_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleUSBSuspend_ISR(USB_OTG_CORE_HANDLE *pdev); + +static uint32_t DCD_IsoINIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_IsoOUTIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev); +#ifdef VBUS_SENSING_ENABLED +static uint32_t DCD_SessionRequest_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_OTG_ISR(USB_OTG_CORE_HANDLE *pdev); +#endif + +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_Functions +* @{ +*/ + + +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED +/** +* @brief USBD_OTG_EP1OUT_ISR_Handler +* handles all USB Interrupts +* @param pdev: device instance +* @retval status +*/ +uint32_t USBD_OTG_EP1OUT_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_DOEPINTn_TypeDef doepint; + USB_OTG_DEPXFRSIZ_TypeDef deptsiz; + + doepint.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[1]->DOEPINT); + doepint.d32&= USB_OTG_READ_REG32(&pdev->regs.DREGS->DOUTEP1MSK); + + /* Transfer complete */ + if ( doepint.b.xfercompl ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(1, xfercompl); + if (pdev->cfg.dma_enable == 1) + { + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[1]->DOEPTSIZ)); + /*ToDo : handle more than one single MPS size packet */ + pdev->dev.out_ep[1].xfer_count = pdev->dev.out_ep[1].maxpacket - \ + deptsiz.b.xfersize; + } + /* Inform upper layer: data ready */ + /* RX COMPLETE */ + USBD_DCD_INT_fops->DataOutStage(pdev , 1); + + } + + /* Endpoint disable */ + if ( doepint.b.epdisabled ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(1, epdisabled); + } + + return 1; +} + +/** +* @brief USBD_OTG_EP1IN_ISR_Handler +* handles all USB Interrupts +* @param pdev: device instance +* @retval status +*/ +uint32_t USBD_OTG_EP1IN_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_DIEPINTn_TypeDef diepint; + uint32_t fifoemptymsk, msk, emp; + + msk = USB_OTG_READ_REG32(&pdev->regs.DREGS->DINEP1MSK); + emp = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPEMPMSK); + msk |= ((emp >> 1 ) & 0x1) << 7; + diepint.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[1]->DIEPINT) & msk; + + if ( diepint.b.xfercompl ) + { + fifoemptymsk = 0x1 << 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0); + CLEAR_IN_EP_INTR(1, xfercompl); + /* TX COMPLETE */ + USBD_DCD_INT_fops->DataInStage(pdev , 1); + } + if ( diepint.b.epdisabled ) + { + CLEAR_IN_EP_INTR(1, epdisabled); + } + if ( diepint.b.timeout ) + { + CLEAR_IN_EP_INTR(1, timeout); + } + if (diepint.b.intktxfemp) + { + CLEAR_IN_EP_INTR(1, intktxfemp); + } + if (diepint.b.inepnakeff) + { + CLEAR_IN_EP_INTR(1, inepnakeff); + } + if (diepint.b.emptyintr) + { + DCD_WriteEmptyTxFifo(pdev , 1); + CLEAR_IN_EP_INTR(1, emptyintr); + } + return 1; +} +#endif + +/** +* @brief STM32_USBF_OTG_ISR_Handler +* handles all USB Interrupts +* @param pdev: device instance +* @retval status +*/ +uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintr_status; + uint32_t retval = 0; + + if (USB_OTG_IsDeviceMode(pdev)) /* ensure that we are in device mode */ + { + gintr_status.d32 = USB_OTG_ReadCoreItr(pdev); + if (!gintr_status.d32) /* avoid spurious interrupt */ + { + return 0; + } + + if (gintr_status.b.outepintr) + { + retval |= DCD_HandleOutEP_ISR(pdev); + } + + if (gintr_status.b.inepint) + { + retval |= DCD_HandleInEP_ISR(pdev); + } + + if (gintr_status.b.modemismatch) + { + USB_OTG_GINTSTS_TypeDef gintsts; + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.modemismatch = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + } + + if (gintr_status.b.wkupintr) + { + retval |= DCD_HandleResume_ISR(pdev); + } + + if (gintr_status.b.usbsuspend) + { + retval |= DCD_HandleUSBSuspend_ISR(pdev); + } + if (gintr_status.b.sofintr) + { + retval |= DCD_HandleSof_ISR(pdev); + + } + + if (gintr_status.b.rxstsqlvl) + { + retval |= DCD_HandleRxStatusQueueLevel_ISR(pdev); + + } + + if (gintr_status.b.usbreset) + { + retval |= DCD_HandleUsbReset_ISR(pdev); + + } + if (gintr_status.b.enumdone) + { + retval |= DCD_HandleEnumDone_ISR(pdev); + } + + if (gintr_status.b.incomplisoin) + { + retval |= DCD_IsoINIncomplete_ISR(pdev); + } + + if (gintr_status.b.incomplisoout) + { + retval |= DCD_IsoOUTIncomplete_ISR(pdev); + } +#ifdef VBUS_SENSING_ENABLED + if (gintr_status.b.sessreqintr) + { + retval |= DCD_SessionRequest_ISR(pdev); + } + + if (gintr_status.b.otgintr) + { + retval |= DCD_OTG_ISR(pdev); + } +#endif + } + return retval; +} + +#ifdef VBUS_SENSING_ENABLED +/** +* @brief DCD_SessionRequest_ISR +* Indicates that the USB_OTG controller has detected a connection +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_SessionRequest_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USBD_DCD_INT_fops->DevConnected (pdev); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.sessreqintr = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32); + return 1; +} + +/** +* @brief DCD_OTG_ISR +* Indicates that the USB_OTG controller has detected an OTG event: +* used to detect the end of session i.e. disconnection +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_OTG_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_GOTGINT_TypeDef gotgint; + + gotgint.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GOTGINT); + + if (gotgint.b.sesenddet) + { + USBD_DCD_INT_fops->DevDisconnected (pdev); + } + /* Clear OTG interrupt */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GOTGINT, gotgint.d32); + return 1; +} +#endif +/** +* @brief DCD_HandleResume_ISR +* Indicates that the USB_OTG controller has detected a resume or +* remote Wake-up sequence +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleResume_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USB_OTG_DCTL_TypeDef devctl; + USB_OTG_PCGCCTL_TypeDef power; + + if(pdev->cfg.low_power) + { + /* un-gate USB Core clock */ + power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL); + power.b.gatehclk = 0; + power.b.stoppclk = 0; + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32); + } + + /* Clear the Remote Wake-up Signaling */ + devctl.d32 = 0; + devctl.b.rmtwkupsig = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, devctl.d32, 0); + + /* Inform upper layer by the Resume Event */ + USBD_DCD_INT_fops->Resume (pdev); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.wkupintr = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32); + return 1; +} + +/** +* @brief USB_OTG_HandleUSBSuspend_ISR +* Indicates that SUSPEND state has been detected on the USB +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleUSBSuspend_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USB_OTG_PCGCCTL_TypeDef power; + USB_OTG_DSTS_TypeDef dsts; + __IO uint8_t prev_status = 0; + + prev_status = pdev->dev.device_status; + USBD_DCD_INT_fops->Suspend (pdev); + + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.usbsuspend = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + + if((pdev->cfg.low_power) && (dsts.b.suspsts == 1) && + (pdev->dev.connection_status == 1) && + (prev_status == USB_OTG_CONFIGURED)) + { + /* switch-off the clocks */ + power.d32 = 0; + power.b.stoppclk = 1; + USB_OTG_MODIFY_REG32(pdev->regs.PCGCCTL, 0, power.d32); + + power.b.gatehclk = 1; + USB_OTG_MODIFY_REG32(pdev->regs.PCGCCTL, 0, power.d32); + + /* Request to enter Sleep mode after exit from current ISR */ + SCB->SCR |= (SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk); + } + return 1; +} + +/** +* @brief DCD_HandleInEP_ISR +* Indicates that an IN EP has a pending Interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleInEP_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DIEPINTn_TypeDef diepint; + + uint32_t ep_intr; + uint32_t epnum = 0; + uint32_t fifoemptymsk; + diepint.d32 = 0; + ep_intr = USB_OTG_ReadDevAllInEPItr(pdev); + + while ( ep_intr ) + { + if (ep_intr&0x1) /* In ITR */ + { + diepint.d32 = DCD_ReadDevInEP(pdev , epnum); /* Get In ITR status */ + if ( diepint.b.xfercompl ) + { + fifoemptymsk = 0x1 << epnum; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0); + CLEAR_IN_EP_INTR(epnum, xfercompl); + /* TX COMPLETE */ + USBD_DCD_INT_fops->DataInStage(pdev , epnum); + + if (pdev->cfg.dma_enable == 1) + { + if((epnum == 0) && (pdev->dev.device_state == USB_OTG_EP0_STATUS_IN)) + { + /* prepare to rx more setup packets */ + USB_OTG_EP0_OutStart(pdev); + } + } + } + if ( diepint.b.timeout ) + { + CLEAR_IN_EP_INTR(epnum, timeout); + } + if (diepint.b.intktxfemp) + { + CLEAR_IN_EP_INTR(epnum, intktxfemp); + } + if (diepint.b.inepnakeff) + { + CLEAR_IN_EP_INTR(epnum, inepnakeff); + } + if ( diepint.b.epdisabled ) + { + CLEAR_IN_EP_INTR(epnum, epdisabled); + } + if (diepint.b.emptyintr) + { + + DCD_WriteEmptyTxFifo(pdev , epnum); + + CLEAR_IN_EP_INTR(epnum, emptyintr); + } + } + epnum++; + ep_intr >>= 1; + } + + return 1; +} + +/** +* @brief DCD_HandleOutEP_ISR +* Indicates that an OUT EP has a pending Interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleOutEP_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t ep_intr; + USB_OTG_DOEPINTn_TypeDef doepint; + USB_OTG_DEPXFRSIZ_TypeDef deptsiz; + uint32_t epnum = 0; + + doepint.d32 = 0; + + /* Read in the device interrupt bits */ + ep_intr = USB_OTG_ReadDevAllOutEp_itr(pdev); + + while ( ep_intr ) + { + if (ep_intr&0x1) + { + + doepint.d32 = USB_OTG_ReadDevOutEP_itr(pdev, epnum); + + /* Transfer complete */ + if ( doepint.b.xfercompl ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(epnum, xfercompl); + if (pdev->cfg.dma_enable == 1) + { + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[epnum]->DOEPTSIZ)); + /*ToDo : handle more than one single MPS size packet */ + pdev->dev.out_ep[epnum].xfer_count = pdev->dev.out_ep[epnum].maxpacket - \ + deptsiz.b.xfersize; + } + /* Inform upper layer: data ready */ + /* RX COMPLETE */ + USBD_DCD_INT_fops->DataOutStage(pdev , epnum); + + if (pdev->cfg.dma_enable == 1) + { + if((epnum == 0) && (pdev->dev.device_state == USB_OTG_EP0_STATUS_OUT)) + { + /* prepare to rx more setup packets */ + USB_OTG_EP0_OutStart(pdev); + } + } + } + /* Endpoint disable */ + if ( doepint.b.epdisabled ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(epnum, epdisabled); + } + /* Setup Phase Done (control EPs) */ + if ( doepint.b.setup ) + { + + /* inform the upper layer that a setup packet is available */ + /* SETUP COMPLETE */ + USBD_DCD_INT_fops->SetupStage(pdev); + CLEAR_OUT_EP_INTR(epnum, setup); + } + } + epnum++; + ep_intr >>= 1; + } + return 1; +} + +/** +* @brief DCD_HandleSof_ISR +* Handles the SOF Interrupts +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleSof_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef GINTSTS; + + + USBD_DCD_INT_fops->SOF(pdev); + + /* Clear interrupt */ + GINTSTS.d32 = 0; + GINTSTS.b.sofintr = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, GINTSTS.d32); + + return 1; +} + +/** +* @brief DCD_HandleRxStatusQueueLevel_ISR +* Handles the Rx Status Queue Level Interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleRxStatusQueueLevel_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTMSK_TypeDef int_mask; + USB_OTG_DRXSTS_TypeDef status; + USB_OTG_EP *ep; + + /* Disable the Rx Status Queue Level interrupt */ + int_mask.d32 = 0; + int_mask.b.rxstsqlvl = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, int_mask.d32, 0); + + /* Get the Status from the top of the FIFO */ + status.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRXSTSP ); + + ep = &pdev->dev.out_ep[status.b.epnum]; + + switch (status.b.pktsts) + { + case STS_GOUT_NAK: + break; + case STS_DATA_UPDT: + if (status.b.bcnt) + { + USB_OTG_ReadPacket(pdev,ep->xfer_buff, status.b.bcnt); + ep->xfer_buff += status.b.bcnt; + ep->xfer_count += status.b.bcnt; + } + break; + case STS_XFER_COMP: + break; + case STS_SETUP_COMP: + break; + case STS_SETUP_UPDT: + /* Copy the setup packet received in FIFO into the setup buffer in RAM */ + USB_OTG_ReadPacket(pdev , pdev->dev.setup_packet, 8); + ep->xfer_count += status.b.bcnt; + break; + default: + break; + } + + /* Enable the Rx Status Queue Level interrupt */ + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, int_mask.d32); + + return 1; +} + +/** +* @brief DCD_WriteEmptyTxFifo +* check FIFO for the next packet to be loaded +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev, uint32_t epnum) +{ + USB_OTG_DTXFSTSn_TypeDef txstatus; + USB_OTG_EP *ep; + uint32_t len = 0; + uint32_t len32b; + txstatus.d32 = 0; + + ep = &pdev->dev.in_ep[epnum]; + + len = ep->xfer_len - ep->xfer_count; + + if (len > ep->maxpacket) + { + len = ep->maxpacket; + } + + len32b = (len + 3) / 4; + txstatus.d32 = USB_OTG_READ_REG32( &pdev->regs.INEP_REGS[epnum]->DTXFSTS); + + + + while (txstatus.b.txfspcavail > len32b && + ep->xfer_count < ep->xfer_len && + ep->xfer_len != 0) + { + /* Write the FIFO */ + len = ep->xfer_len - ep->xfer_count; + + if (len > ep->maxpacket) + { + len = ep->maxpacket; + } + len32b = (len + 3) / 4; + + USB_OTG_WritePacket (pdev , ep->xfer_buff, epnum, len); + + ep->xfer_buff += len; + ep->xfer_count += len; + + txstatus.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DTXFSTS); + } + + return 1; +} + +/** +* @brief DCD_HandleUsbReset_ISR +* This interrupt occurs when a USB Reset is detected +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleUsbReset_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DAINT_TypeDef daintmsk; + USB_OTG_DOEPMSK_TypeDef doepmsk; + USB_OTG_DIEPMSK_TypeDef diepmsk; + USB_OTG_DCFG_TypeDef dcfg; + USB_OTG_DCTL_TypeDef dctl; + USB_OTG_GINTSTS_TypeDef gintsts; + uint32_t i; + + dctl.d32 = 0; + daintmsk.d32 = 0; + doepmsk.d32 = 0; + diepmsk.d32 = 0; + dcfg.d32 = 0; + gintsts.d32 = 0; + + /* Clear the Remote Wake-up Signaling */ + dctl.b.rmtwkupsig = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, 0 ); + + /* Flush the Tx FIFO */ + USB_OTG_FlushTxFifo(pdev , 0 ); + + for (i = 0; i < pdev->cfg.dev_endpoints ; i++) + { + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF); + } + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF ); + + daintmsk.ep.in = 1; + daintmsk.ep.out = 1; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, daintmsk.d32 ); + + doepmsk.b.setup = 1; + doepmsk.b.xfercompl = 1; + doepmsk.b.epdisabled = 1; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, doepmsk.d32 ); +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOUTEP1MSK, doepmsk.d32 ); +#endif + diepmsk.b.xfercompl = 1; + diepmsk.b.timeout = 1; + diepmsk.b.epdisabled = 1; + + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, diepmsk.d32 ); +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DINEP1MSK, diepmsk.d32 ); +#endif + /* Reset Device Address */ + dcfg.d32 = USB_OTG_READ_REG32( &pdev->regs.DREGS->DCFG); + dcfg.b.devaddr = 0; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DCFG, dcfg.d32); + + + /* setup EP0 to receive SETUP packets */ + USB_OTG_EP0_OutStart(pdev); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.usbreset = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32); + + /*Reset internal state machine */ + USBD_DCD_INT_fops->Reset(pdev); + return 1; +} + +/** +* @brief DCD_HandleEnumDone_ISR +* Read the device status register and set the device speed +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleEnumDone_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USB_OTG_GUSBCFG_TypeDef gusbcfg; + + USB_OTG_EP0Activate(pdev); + + /* Set USB turn-around time based on device speed and PHY interface. */ + gusbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + + /* Full or High speed */ + if ( USB_OTG_GetDeviceSpeed(pdev) == USB_SPEED_HIGH) + { + pdev->cfg.speed = USB_OTG_SPEED_HIGH; + pdev->cfg.mps = USB_OTG_HS_MAX_PACKET_SIZE ; + gusbcfg.b.usbtrdtim = 9; + } + else + { + pdev->cfg.speed = USB_OTG_SPEED_FULL; + pdev->cfg.mps = USB_OTG_FS_MAX_PACKET_SIZE ; + gusbcfg.b.usbtrdtim = 5; + } + + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, gusbcfg.d32); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.enumdone = 1; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, gintsts.d32 ); + return 1; +} + + +/** +* @brief DCD_IsoINIncomplete_ISR +* handle the ISO IN incomplete interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_IsoINIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + + gintsts.d32 = 0; + + USBD_DCD_INT_fops->IsoINIncomplete (pdev); + + /* Clear interrupt */ + gintsts.b.incomplisoin = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + + return 1; +} + +/** +* @brief DCD_IsoOUTIncomplete_ISR +* handle the ISO OUT incomplete interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_IsoOUTIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + + gintsts.d32 = 0; + + USBD_DCD_INT_fops->IsoOUTIncomplete (pdev); + + /* Clear interrupt */ + gintsts.b.incomplisoout = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + return 1; +} +/** +* @brief DCD_ReadDevInEP +* Reads ep flags +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_ReadDevInEP (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum) +{ + uint32_t v, msk, emp; + msk = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPMSK); + emp = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPEMPMSK); + msk |= ((emp >> epnum) & 0x1) << 7; + v = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DIEPINT) & msk; + return v; +} + + + +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/main.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/main.c index bfca68a1..d3bceb48 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/main.c +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/main.c @@ -74,17 +74,28 @@ void main(void) ****************************************************************************************/ static void Init(void) { + GPIO_InitTypeDef GPIO_InitStructure; #if (BOOT_COM_UART_ENABLE > 0) - GPIO_InitTypeDef GPIO_InitStructure; #elif (BOOT_FILE_SYS_ENABLE > 0) - GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; -#elif (BOOT_COM_CAN_ENABLE > 0) - GPIO_InitTypeDef GPIO_InitStructure; #endif /* initialize the system and its clocks */ SystemInit(); + + /* initialize the button as a digital input. is used to override the starting of + * the user program. + */ + /* enable the GPIO Clock */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); + /* configure the GPIO pin */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + #if (BOOT_COM_UART_ENABLE > 0) /* enable UART peripheral clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE); diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usb_bsp.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usb_bsp.c new file mode 100644 index 00000000..59d81bda --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usb_bsp.c @@ -0,0 +1,194 @@ +/** + ****************************************************************************** + * @file usb_bsp.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file is responsible to offer board support package and is + * configurable by user. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_bsp.h" +#include "usbd_conf.h" + + +extern void HwDelayUs(uint32_t time_us); +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY +* @{ +*/ + +/** @defgroup USB_BSP +* @brief This file is responsible to offer board support package +* @{ +*/ + +/** @defgroup USB_BSP_Private_Defines +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_BSP_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + + + + +/** @defgroup USB_BSP_Private_Macros +* @{ +*/ +/** +* @} +*/ + +/** @defgroup USBH_BSP_Private_Variables +* @{ +*/ + +/** +* @} +*/ + +/** @defgroup USBH_BSP_Private_FunctionPrototypes +* @{ +*/ +/** +* @} +*/ + +/** @defgroup USB_BSP_Private_Functions +* @{ +*/ + + + +/** +* @brief USB_OTG_BSP_Init +* Initilizes BSP configurations +* @param None +* @retval None +*/ +void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA , ENABLE); + + /* Configure SOF ID DM DP Pins */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | + GPIO_Pin_11 | + GPIO_Pin_12; + + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_OTG1_FS) ; + GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_OTG1_FS) ; + GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_OTG1_FS) ; + + /* Configure VBUS Pin */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + /* Configure ID pin */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_Init(GPIOA, &GPIO_InitStructure); + GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_OTG1_FS) ; + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); + RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, ENABLE) ; +} +/** +* @brief USB_OTG_BSP_EnableInterrupt +* Enabele USB Global interrupt +* @param None +* @retval None +*/ +void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev) +{ + /* driver runs in polling mode */ +} +/** +* @brief USB_OTG_BSP_uDelay +* This function provides delay time in micro sec +* @param usec : Value of delay required in micro sec +* @retval None +*/ +void USB_OTG_BSP_uDelay (const uint32_t usec) +{ + #define HW_DELAY_MS_LOOP_COUNT (28000) + + uint32_t delay_counter; + uint32_t time_us = usec; + + /* perform the delay */ + while (time_us-- > 0) + { + /* block program for about 1 millisecond */ + for (delay_counter=0; delay_counter<(HW_DELAY_MS_LOOP_COUNT/1000); delay_counter++) + { + __asm__("nop"); + } + } +} + + +/** +* @brief USB_OTG_BSP_mDelay +* This function provides delay time in milli sec +* @param msec : Value of delay required in milli sec +* @retval None +*/ +void USB_OTG_BSP_mDelay (const uint32_t msec) +{ + USB_OTG_BSP_uDelay(msec * 1000); +} +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usb_conf.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usb_conf.h new file mode 100644 index 00000000..ab61672f --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usb_conf.h @@ -0,0 +1,289 @@ +/** + ****************************************************************************** + * @file usb_conf.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief General low level driver configuration + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_CONF__H__ +#define __USB_CONF__H__ + +/* Includes ------------------------------------------------------------------*/ + #include "stm32f4xx.h" + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_CONF + * @brief USB low level driver configuration file + * @{ + */ + +/** @defgroup USB_CONF_Exported_Defines + * @{ + */ + +/* USB Core and PHY interface configuration. + Tip: To avoid modifying these defines each time you need to change the USB + configuration, you can declare the needed define in your toolchain + compiler preprocessor. + */ +/****************** USB OTG FS PHY CONFIGURATION ******************************* +* The USB OTG FS Core supports one on-chip Full Speed PHY. +* +* The USE_EMBEDDED_PHY symbol is defined in the project compiler preprocessor +* when FS core is used. +*******************************************************************************/ +#ifndef USE_USB_OTG_FS + //#define USE_USB_OTG_FS +#endif /* USE_USB_OTG_FS */ + +#ifdef USE_USB_OTG_FS + #define USB_OTG_FS_CORE +#endif + +/****************** USB OTG HS PHY CONFIGURATION ******************************* +* The USB OTG HS Core supports two PHY interfaces: +* (i) An ULPI interface for the external High Speed PHY: the USB HS Core will +* operate in High speed mode +* (ii) An on-chip Full Speed PHY: the USB HS Core will operate in Full speed mode +* +* You can select the PHY to be used using one of these two defines: +* (i) USE_ULPI_PHY: if the USB OTG HS Core is to be used in High speed mode +* (ii) USE_EMBEDDED_PHY: if the USB OTG HS Core is to be used in Full speed mode +* +* Notes: +* - The USE_ULPI_PHY symbol is defined in the project compiler preprocessor as +* default PHY when HS core is used. +* - On STM322xG-EVAL and STM324xG-EVAL boards, only configuration(i) is available. +* Configuration (ii) need a different hardware, for more details refer to your +* STM32 device datasheet. +*******************************************************************************/ +#ifndef USE_USB_OTG_HS + //#define USE_USB_OTG_HS +#endif /* USE_USB_OTG_HS */ + +#ifndef USE_ULPI_PHY + //#define USE_ULPI_PHY +#endif /* USE_ULPI_PHY */ + +#ifndef USE_EMBEDDED_PHY + //#define USE_EMBEDDED_PHY +#endif /* USE_EMBEDDED_PHY */ + +#ifdef USE_USB_OTG_HS + #define USB_OTG_HS_CORE +#endif + +/******************************************************************************* +* FIFO Size Configuration in Device mode +* +* (i) Receive data FIFO size = RAM for setup packets + +* OUT endpoint control information + +* data OUT packets + miscellaneous +* Space = ONE 32-bits words +* --> RAM for setup packets = 10 spaces +* (n is the nbr of CTRL EPs the device core supports) +* --> OUT EP CTRL info = 1 space +* (one space for status information written to the FIFO along with each +* received packet) +* --> data OUT packets = (Largest Packet Size / 4) + 1 spaces +* (MINIMUM to receive packets) +* --> OR data OUT packets = at least 2*(Largest Packet Size / 4) + 1 spaces +* (if high-bandwidth EP is enabled or multiple isochronous EPs) +* --> miscellaneous = 1 space per OUT EP +* (one space for transfer complete status information also pushed to the +* FIFO with each endpoint's last packet) +* +* (ii)MINIMUM RAM space required for each IN EP Tx FIFO = MAX packet size for +* that particular IN EP. More space allocated in the IN EP Tx FIFO results +* in a better performance on the USB and can hide latencies on the AHB. +* +* (iii) TXn min size = 16 words. (n : Transmit FIFO index) +* (iv) When a TxFIFO is not used, the Configuration should be as follows: +* case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes) +* --> Txm can use the space allocated for Txn. +* case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes) +* --> Txn should be configured with the minimum space of 16 words +* (v) The FIFO is used optimally when used TxFIFOs are allocated in the top +* of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones. +* (vi) In HS case 12 FIFO locations should be reserved for internal DMA registers +* so total FIFO size should be 1012 Only instead of 1024 +*******************************************************************************/ + +/****************** USB OTG HS CONFIGURATION **********************************/ +#ifdef USB_OTG_HS_CORE + #define RX_FIFO_HS_SIZE 512 + #define TX0_FIFO_HS_SIZE 64 + #define TX1_FIFO_HS_SIZE 372 + #define TX2_FIFO_HS_SIZE 64 + #define TX3_FIFO_HS_SIZE 0 + #define TX4_FIFO_HS_SIZE 0 + #define TX5_FIFO_HS_SIZE 0 + +// #define USB_OTG_HS_SOF_OUTPUT_ENABLED + + #ifdef USE_ULPI_PHY + #define USB_OTG_ULPI_PHY_ENABLED + #endif + #ifdef USE_EMBEDDED_PHY + #define USB_OTG_EMBEDDED_PHY_ENABLED + /* wakeup is working only when HS core is configured in FS mode */ + #define USB_OTG_HS_LOW_PWR_MGMT_SUPPORT + #endif + /* #define USB_OTG_HS_INTERNAL_DMA_ENABLED */ /* Be aware that enabling DMA mode will result in data being sent only by + multiple of 4 packet sizes. This is due to the fact that USB DMA does + not allow sending data from non word-aligned addresses. + For this specific application, it is advised to not enable this option + unless required. */ + #define USB_OTG_HS_DEDICATED_EP1_ENABLED +#endif + +/****************** USB OTG FS CONFIGURATION **********************************/ +#ifdef USB_OTG_FS_CORE + #define RX_FIFO_FS_SIZE 128 + #define TX0_FIFO_FS_SIZE 32 + #define TX1_FIFO_FS_SIZE 128 + #define TX2_FIFO_FS_SIZE 32 + #define TX3_FIFO_FS_SIZE 0 + +// #define USB_OTG_FS_LOW_PWR_MGMT_SUPPORT +// #define USB_OTG_FS_SOF_OUTPUT_ENABLED +#endif + +/****************** USB OTG MISC CONFIGURATION ********************************/ +#define VBUS_SENSING_ENABLED + +/****************** USB OTG MODE CONFIGURATION ********************************/ +//#define USE_HOST_MODE +#define USE_DEVICE_MODE +//#define USE_OTG_MODE + +#ifndef USB_OTG_FS_CORE + #ifndef USB_OTG_HS_CORE + #error "USB_OTG_HS_CORE or USB_OTG_FS_CORE should be defined" + #endif +#endif + +#ifndef USE_DEVICE_MODE + #ifndef USE_HOST_MODE + #error "USE_DEVICE_MODE or USE_HOST_MODE should be defined" + #endif +#endif + +#ifndef USE_USB_OTG_HS + #ifndef USE_USB_OTG_FS + #error "USE_USB_OTG_HS or USE_USB_OTG_FS should be defined" + #endif +#else //USE_USB_OTG_HS + #ifndef USE_ULPI_PHY + #ifndef USE_EMBEDDED_PHY + #error "USE_ULPI_PHY or USE_EMBEDDED_PHY should be defined" + #endif + #endif +#endif + +/****************** C Compilers dependant keywords ****************************/ +/* In HS mode and when the DMA is used, all variables and data structures dealing + with the DMA during the transaction process should be 4-bytes aligned */ +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined (__GNUC__) /* GNU Compiler */ + #define __ALIGN_END __attribute__ ((aligned (4))) + #define __ALIGN_BEGIN + #else + #define __ALIGN_END + #if defined (__CC_ARM) /* ARM Compiler */ + #define __ALIGN_BEGIN __align(4) + #elif defined (__ICCARM__) /* IAR Compiler */ + #define __ALIGN_BEGIN + #elif defined (__TASKING__) /* TASKING Compiler */ + #define __ALIGN_BEGIN __align(4) + #endif /* __CC_ARM */ + #endif /* __GNUC__ */ +#else + #define __ALIGN_BEGIN + #define __ALIGN_END +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ + +/* __packed keyword used to decrease the data type alignment to 1-byte */ +#if defined (__CC_ARM) /* ARM Compiler */ + #define __packed __packed +#elif defined (__ICCARM__) /* IAR Compiler */ + #define __packed __packed +#elif defined ( __GNUC__ ) /* GNU Compiler */ + #define __packed __attribute__ ((__packed__)) +#elif defined (__TASKING__) /* TASKING Compiler */ + #define __packed __unaligned +#endif /* __CC_ARM */ + +/** + * @} + */ + + +/** @defgroup USB_CONF_Exported_Types + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_CONF_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +#endif //__USB_CONF__H__ + + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_bulk.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_bulk.c new file mode 100644 index 00000000..6bd165b6 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_bulk.c @@ -0,0 +1,361 @@ +/** + ****************************************************************************** + * @file usbd_bulk.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file provides the high layer firmware functions to manage a + * USB bulk device. + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_bulk.h" +#include "usbd_desc.h" +#include "usbd_req.h" + + +extern void UsbReceivePipeBulkOUT(uint8_t epnum); +extern void UsbTransmitPipeBulkIN(void); + + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup usbd_bulk + * @brief usbd core module + * @{ + */ + +/** @defgroup usbd_bulk_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup usbd_bulk_Private_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup usbd_bulk_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup usbd_bulk_Private_FunctionPrototypes + * @{ + */ + +/********************************************* + BULK Device library callbacks + *********************************************/ +static uint8_t usbd_bulk_Init (void *pdev, uint8_t cfgidx); +static uint8_t usbd_bulk_DeInit (void *pdev, uint8_t cfgidx); +static uint8_t usbd_bulk_Setup (void *pdev, USB_SETUP_REQ *req); +static uint8_t usbd_bulk_DataIn (void *pdev, uint8_t epnum); +static uint8_t usbd_bulk_DataOut (void *pdev, uint8_t epnum); +static uint8_t usbd_bulk_SOF (void *pdev); + +/********************************************* + BULK specific management functions + *********************************************/ +static uint8_t *USBD_bulk_GetCfgDesc (uint8_t speed, uint16_t *length); +/** + * @} + */ + + +/** @defgroup usbd_bulk_Private_Variables + * @{ + */ +__ALIGN_BEGIN static volatile uint32_t usbd_bulk_AltSet __ALIGN_END = 0; + +__ALIGN_BEGIN uint8_t USB_Rx_Buffer[BULK_DATA_MAX_PACKET_SIZE] __ALIGN_END ; + + +/* Bulk interface class callbacks structure */ +USBD_Class_cb_TypeDef USBD_bulk_cb = +{ + usbd_bulk_Init, + usbd_bulk_DeInit, + usbd_bulk_Setup, + NULL, + NULL, + usbd_bulk_DataIn, + usbd_bulk_DataOut, + usbd_bulk_SOF, + NULL, + NULL, + USBD_bulk_GetCfgDesc +}; + + +/* USB CDC device Configuration Descriptor */ +__ALIGN_BEGIN uint8_t usbd_bulk_CfgDesc[USB_BULK_CONFIG_DESC_SIZ] __ALIGN_END = +{ + /*Configuration Descriptor*/ + 0x09, /* bLength: Configuration Descriptor size */ + USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ + USB_BULK_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */ + 0x00, + 0x01, /* bNumInterfaces: 1 interface */ + 0x01, /* bConfigurationValue: Configuration value */ + 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ + 0xC0, /* bmAttributes: self powered */ + 0x32, /* MaxPower 100 mA */ + /*---------------------------------------------------------------------------*/ + /*Interface Descriptor*/ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0xFF, /* bInterfaceClass: vendor specific */ + 0x00, /* bInterfaceSubClass */ + 0x00, /* bInterfaceProtocol */ + 0x00, /* iInterface: */ + /*Endpoint 1 IN Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + BULK_IN_EP, /* bEndpointAddress: (IN1) */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(BULK_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(BULK_DATA_MAX_PACKET_SIZE), + 0xFF, /* bInterval: ignore for Bulk transfer */ + /*Endpoint 1 OUT Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + BULK_OUT_EP, /* bEndpointAddress: (OUT1) */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(BULK_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(BULK_DATA_MAX_PACKET_SIZE), + 0xFF /* bInterval: ignore for Bulk transfer */ +} ; + + +/** + * @} + */ + +/** @defgroup usbd_bulk_Private_Functions + * @{ + */ + +/** + * @brief usbd_bulk_Init + * Initilaize the Bulk interface + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t usbd_bulk_Init (void *pdev, + uint8_t cfgidx) +{ + /* Open EP IN */ + DCD_EP_Open(pdev, + BULK_IN_EP, + BULK_DATA_IN_PACKET_SIZE, + USB_OTG_EP_BULK); + + /* Open EP OUT */ + DCD_EP_Open(pdev, + BULK_OUT_EP, + BULK_DATA_OUT_PACKET_SIZE, + USB_OTG_EP_BULK); + + + /* Prepare Out endpoint to receive next packet */ + DCD_EP_PrepareRx(pdev, + BULK_OUT_EP, + (uint8_t*)(USB_Rx_Buffer), + BULK_DATA_OUT_PACKET_SIZE); + + return USBD_OK; +} + +/** + * @brief usbd_bulk_DeInit + * DeInitialize the layer + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t usbd_bulk_DeInit (void *pdev, + uint8_t cfgidx) +{ + /* Open EP IN */ + DCD_EP_Close(pdev, BULK_IN_EP); + + /* Open EP OUT */ + DCD_EP_Close(pdev, BULK_OUT_EP); + + return USBD_OK; +} + +/** + * @brief usbd_bulk_Setup + * Handle the bulk specific requests + * @param pdev: instance + * @param req: usb requests + * @retval status + */ +static uint8_t usbd_bulk_Setup (void *pdev, + USB_SETUP_REQ *req) +{ + uint16_t len=USB_BULK_DESC_SIZ; + uint8_t *pbuf=usbd_bulk_CfgDesc + 9; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + /* Standard Requests -------------------------------*/ + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + if( (req->wValue >> 8) == BULK_DESCRIPTOR_TYPE) + { + pbuf = usbd_bulk_CfgDesc + 9 + (9 * USBD_ITF_MAX_NUM); + len = MIN(USB_BULK_DESC_SIZ , req->wLength); + } + + USBD_CtlSendData (pdev, + pbuf, + len); + break; + + case USB_REQ_GET_INTERFACE : + USBD_CtlSendData (pdev, + (uint8_t *)&usbd_bulk_AltSet, + 1); + break; + + case USB_REQ_SET_INTERFACE : + if ((uint8_t)(req->wValue) < USBD_ITF_MAX_NUM) + { + usbd_bulk_AltSet = (uint8_t)(req->wValue); + } + else + { + /* Call the error management function (command will be nacked */ + USBD_CtlError (pdev, req); + } + break; + } + } + return USBD_OK; +} + + +/** + * @brief usbd_bulk_DataIn + * Data sent on non-control IN endpoint + * @param pdev: device instance + * @param epnum: endpoint number + * @retval status + */ +static uint8_t usbd_bulk_DataIn (void *pdev, uint8_t epnum) +{ + /* endpoint finished the previous transmission so see if more data is left */ + UsbTransmitPipeBulkIN(); + return USBD_OK; +} + +/** + * @brief usbd_bulk_DataOut + * Data received on non-control Out endpoint + * @param pdev: device instance + * @param epnum: endpoint number + * @retval status + */ +static uint8_t usbd_bulk_DataOut (void *pdev, uint8_t epnum) +{ + /* read the data from the bulk OUT pipe */ + UsbReceivePipeBulkOUT(epnum); + return USBD_OK; +} + + +/** + * @brief usbd_buld_get_rx_buffer_ptr + * Get pointer to the USB rx buffer + * @retval Buffer pointer + */ +uint8_t *usbd_bulk_get_rx_buffer_ptr(void) +{ + return USB_Rx_Buffer; +} + + +/** + * @brief usbd_bulk_SOF + * Start Of Frame event management + * @param pdev: instance + * @param epnum: endpoint number + * @retval status + */ +static uint8_t usbd_bulk_SOF (void *pdev) +{ + if (((USB_OTG_CORE_HANDLE*)pdev)->dev.device_status == USB_OTG_CONFIGURED) + { + /* Check the data to be sent through IN pipe */ + UsbTransmitPipeBulkIN(); + } + return USBD_OK; +} + + +/** + * @brief USBD_bulk_GetCfgDesc + * Return configuration descriptor + * @param speed : current device speed + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t *USBD_bulk_GetCfgDesc (uint8_t speed, uint16_t *length) +{ + *length = sizeof (usbd_bulk_CfgDesc); + return usbd_bulk_CfgDesc; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_bulk.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_bulk.h new file mode 100644 index 00000000..7c17ac87 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_bulk.h @@ -0,0 +1,102 @@ +/** + ****************************************************************************** + * @file usbd_bulk.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief header file for the usbd_bulk.c file. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ + +#ifndef __USB_BULK_H_ +#define __USB_BULK_H_ + +#include "usbd_ioreq.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup usbd_cdc + * @brief This file is the Header file for USBD_cdc.c + * @{ + */ + + +/** @defgroup usbd_bulk_Exported_Defines + * @{ + */ +#define USB_BULK_CONFIG_DESC_SIZ (32) +#define USB_BULK_DESC_SIZ (32-9) + +#define BULK_DESCRIPTOR_TYPE 0x21 + + +#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 +#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 +#define USB_STRING_DESCRIPTOR_TYPE 0x03 +#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 +#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 + +#define STANDARD_ENDPOINT_DESC_SIZE 0x09 + +#define BULK_DATA_IN_PACKET_SIZE BULK_DATA_MAX_PACKET_SIZE +#define BULK_DATA_OUT_PACKET_SIZE BULK_DATA_MAX_PACKET_SIZE + + + + +/** @defgroup USBD_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_Variables + * @{ + */ + +extern USBD_Class_cb_TypeDef USBD_bulk_cb; +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_Functions + * @{ + */ +uint8_t *usbd_bulk_get_rx_buffer_ptr(void); +/** + * @} + */ + +#endif // __USB_CDC_CORE_H_ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_conf.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_conf.h new file mode 100644 index 00000000..be7b1bae --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_conf.h @@ -0,0 +1,91 @@ +/** + ****************************************************************************** + * @file usbd_conf.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief USB Device configuration file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_CONF__H__ +#define __USBD_CONF__H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" + +/** @defgroup USB_CONF_Exported_Defines + * @{ + */ +#define USBD_CFG_MAX_NUM 1 +#define USBD_ITF_MAX_NUM 1 + +#define USBD_SELF_POWERED + +#define USB_MAX_STR_DESC_SIZ 255 + +/** @defgroup USB_VCP_Class_Layer_Parameter + * @{ + */ +#define BULK_IN_EP 0x81 /* EP1 for data IN */ +#define BULK_OUT_EP 0x01 /* EP1 for data OUT */ + +/* Bulk endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */ +#define BULK_DATA_MAX_PACKET_SIZE 64 /* Endpoint IN & OUT Packet size */ + +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_Types + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_CONF_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +#endif //__USBD_CONF__H__ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_desc.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_desc.c new file mode 100644 index 00000000..b648b3c8 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_desc.c @@ -0,0 +1,271 @@ +/** + ****************************************************************************** + * @file usbd_desc.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file provides the USBD descriptors and string formating method. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_core.h" +#include "usbd_desc.h" +#include "usbd_req.h" +#include "usbd_conf.h" +#include "usb_regs.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_DESC + * @brief USBD descriptors module + * @{ + */ + +/** @defgroup USBD_DESC_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Defines + * @{ + */ +#define USBD_VID 0x0145 + +#define USBD_PID 0x0023 + +/** @defgroup USB_String_Descriptors + * @{ + */ +#define USBD_LANGID_STRING 0x409 +#define USBD_MANUFACTURER_STRING "OpenBLT User" + +#define USBD_PRODUCT_FS_STRING "WinUSB Bulk Device" +#define USBD_SERIALNUMBER_FS_STRING "00000000050C" + +#define USBD_CONFIGURATION_FS_STRING "Default" +#define USBD_INTERFACE_FS_STRING "WinUSB Bulk Interface" +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Variables + * @{ + */ + +USBD_DEVICE USR_desc = +{ + USBD_USR_DeviceDescriptor, + USBD_USR_LangIDStrDescriptor, + USBD_USR_ManufacturerStrDescriptor, + USBD_USR_ProductStrDescriptor, + USBD_USR_SerialStrDescriptor, + USBD_USR_ConfigStrDescriptor, + USBD_USR_InterfaceStrDescriptor, + +}; + +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END = + { + 0x12, /*bLength */ + USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/ + 0x10, /*bcdUSB = 1.1 */ + 0x01, + 0x00, /*bDeviceClass*/ + 0x00, /*bDeviceSubClass*/ + 0x00, /*bDeviceProtocol*/ + USB_OTG_MAX_EP0_SIZE, /*bMaxPacketSize*/ + LOBYTE(USBD_VID), /*idVendor*/ + HIBYTE(USBD_VID), /*idVendor*/ + LOBYTE(USBD_PID), /*idVendor*/ + HIBYTE(USBD_PID), /*idVendor*/ + 0x00, /*bcdDevice rel. 1.00*/ + 0x01, + USBD_IDX_MFC_STR, /*Index of manufacturer string*/ + USBD_IDX_PRODUCT_STR, /*Index of product string*/ + USBD_IDX_SERIAL_STR, /*Index of serial number string*/ + USBD_CFG_MAX_NUM /*bNumConfigurations*/ + } ; /* USB_DeviceDescriptor */ + +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN uint8_t USBD_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = +{ + USB_LEN_DEV_QUALIFIER_DESC, + USB_DESC_TYPE_DEVICE_QUALIFIER, + 0x10, + 0x01, + 0x00, + 0x00, + 0x00, + 0x40, + 0x01, + 0x00, +}; + +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_SIZ_STRING_LANGID] __ALIGN_END = +{ + USB_SIZ_STRING_LANGID, + USB_DESC_TYPE_STRING, + LOBYTE(USBD_LANGID_STRING), + HIBYTE(USBD_LANGID_STRING), +}; +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_FunctionPrototypes + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Functions + * @{ + */ + +/** +* @brief USBD_USR_DeviceDescriptor +* return the device descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_DeviceDescriptor( uint8_t speed , uint16_t *length) +{ + *length = sizeof(USBD_DeviceDesc); + return USBD_DeviceDesc; +} + +/** +* @brief USBD_USR_LangIDStrDescriptor +* return the LangID string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_LangIDStrDescriptor( uint8_t speed , uint16_t *length) +{ + *length = sizeof(USBD_LangIDDesc); + return USBD_LangIDDesc; +} + + +/** +* @brief USBD_USR_ProductStrDescriptor +* return the product string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_ProductStrDescriptor( uint8_t speed , uint16_t *length) +{ + USBD_GetString ((uint8_t *)USBD_PRODUCT_FS_STRING, USBD_StrDesc, length); + return USBD_StrDesc; +} + +/** +* @brief USBD_USR_ManufacturerStrDescriptor +* return the manufacturer string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_ManufacturerStrDescriptor( uint8_t speed , uint16_t *length) +{ + USBD_GetString ((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length); + return USBD_StrDesc; +} + +/** +* @brief USBD_USR_SerialStrDescriptor +* return the serial number string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_SerialStrDescriptor( uint8_t speed , uint16_t *length) +{ + USBD_GetString ((uint8_t *)USBD_SERIALNUMBER_FS_STRING, USBD_StrDesc, length); + return USBD_StrDesc; +} + +/** +* @brief USBD_USR_ConfigStrDescriptor +* return the configuration string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length) +{ + USBD_GetString ((uint8_t *)USBD_CONFIGURATION_FS_STRING, USBD_StrDesc, length); + return USBD_StrDesc; +} + + +/** +* @brief USBD_USR_InterfaceStrDescriptor +* return the interface string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length) +{ + USBD_GetString ((uint8_t *)USBD_INTERFACE_FS_STRING, USBD_StrDesc, length); + return USBD_StrDesc; +} + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_desc.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_desc.h new file mode 100644 index 00000000..e28e14ae --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_desc.h @@ -0,0 +1,120 @@ +/** + ****************************************************************************** + * @file usbd_desc.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief header file for the usbd_desc.c file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USB_DESC_H +#define __USB_DESC_H + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USB_DESC + * @brief general defines for the usb device library file + * @{ + */ + +/** @defgroup USB_DESC_Exported_Defines + * @{ + */ +#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 +#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 +#define USB_STRING_DESCRIPTOR_TYPE 0x03 +#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 +#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 +#define USB_SIZ_DEVICE_DESC 18 +#define USB_SIZ_STRING_LANGID 4 + +/** + * @} + */ + + +/** @defgroup USBD_DESC_Exported_TypesDefinitions + * @{ + */ +/** + * @} + */ + + + +/** @defgroup USBD_DESC_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_Variables + * @{ + */ +extern uint8_t USBD_DeviceDesc [USB_SIZ_DEVICE_DESC]; +extern uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ]; +extern uint8_t USBD_OtherSpeedCfgDesc[USB_LEN_CFG_DESC]; +extern uint8_t USBD_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC]; +extern uint8_t USBD_LangIDDesc[USB_SIZ_STRING_LANGID]; +extern USBD_DEVICE USR_desc; +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_FunctionsPrototype + * @{ + */ + + +uint8_t * USBD_USR_DeviceDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_LangIDStrDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_ManufacturerStrDescriptor ( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_ProductStrDescriptor ( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_SerialStrDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length); + +#ifdef USB_SUPPORT_USER_STRING_DESC +uint8_t * USBD_USR_USRStringDesc (uint8_t speed, uint8_t idx , uint16_t *length); +#endif /* USB_SUPPORT_USER_STRING_DESC */ + +/** + * @} + */ + +#endif /* __USBD_DESC_H */ + +/** + * @} + */ + +/** +* @} +*/ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_usr.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_usr.c new file mode 100644 index 00000000..ef9aefc8 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_usr.c @@ -0,0 +1,206 @@ +/** + ****************************************************************************** + * @file usbd_usr.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file includes the user application layer + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_usr.h" +#include "usbd_ioreq.h" +#include "boot.h" /* bootloader generic header */ +#include "usb.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY +* @{ +*/ + +/** @defgroup USBD_USR +* @brief This file includes the user application layer +* @{ +*/ + +/** @defgroup USBD_USR_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USBD_USR_Private_Defines +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USBD_USR_Private_Macros +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USBD_USR_Private_Variables +* @{ +*/ + +USBD_Usr_cb_TypeDef USR_cb = +{ + USBD_USR_Init, + USBD_USR_DeviceReset, + USBD_USR_DeviceConfigured, + USBD_USR_DeviceSuspended, + USBD_USR_DeviceResumed, + USBD_USR_DeviceConnected, + USBD_USR_DeviceDisconnected, +}; + +/** +* @} +*/ + +/** @defgroup USBD_USR_Private_Constants +* @{ +*/ + +/** +* @} +*/ + + + +/** @defgroup USBD_USR_Private_FunctionPrototypes +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USBD_USR_Private_Functions +* @{ +*/ + +/** +* @brief USBD_USR_Init +* Displays the message on LCD for host lib initialization +* @param None +* @retval None +*/ +void USBD_USR_Init(void) +{ +} + +/** +* @brief USBD_USR_DeviceReset +* Displays the message on LCD on device Reset Event +* @param speed : device speed +* @retval None +*/ +void USBD_USR_DeviceReset(uint8_t speed ) +{ + switch (speed) + { + case USB_OTG_SPEED_HIGH: + break; + + case USB_OTG_SPEED_FULL: + break; + default: + break; + } +} + + +/** +* @brief USBD_USR_DeviceConfigured +* Displays the message on LCD on device configuration Event +* @param None +* @retval Staus +*/ +void USBD_USR_DeviceConfigured (void) +{ +} + +/** +* @brief USBD_USR_DeviceSuspended +* Displays the message on LCD on device suspend Event +* @param None +* @retval None +*/ +void USBD_USR_DeviceSuspended(void) +{ + /* Users can do their application actions here for the USB-Reset */ + UsbEnterLowPowerModeHook(); +} + + +/** +* @brief USBD_USR_DeviceResumed +* Displays the message on LCD on device resume Event +* @param None +* @retval None +*/ +void USBD_USR_DeviceResumed(void) +{ + /* Users can do their application actions here for the USB-Reset */ + UsbLeaveLowPowerModeHook(); +} + + +/** +* @brief USBD_USR_DeviceConnected +* Displays the message on LCD on device connection Event +* @param None +* @retval Staus +*/ +void USBD_USR_DeviceConnected (void) +{ + /* cable plugged-in */ + UsbConnectHook(BLT_TRUE); +} + +/** +* @brief USBD_USR_DeviceDisonnected +* Displays the message on LCD on device disconnection Event +* @param None +* @retval Staus +*/ +void USBD_USR_DeviceDisconnected (void) +{ + /* Disable the Pull-Up */ + UsbConnectHook(BLT_FALSE); +} +/** +* @} +*/ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ 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 2eaffa06..ac079859 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 8353b5e9..3c8fae7c 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,45 +7,45 @@ start address 0x08000000 Program Header: LOAD off 0x00008000 vaddr 0x08000000 paddr 0x08000000 align 2**15 - filesz 0x00007ef4 memsz 0x00007ef4 flags r-x - LOAD off 0x00010000 vaddr 0x20000000 paddr 0x08007ef4 align 2**15 - filesz 0x00000020 memsz 0x00000020 flags rw- - LOAD off 0x00010080 vaddr 0x20000080 paddr 0x08007f80 align 2**15 - filesz 0x00000000 memsz 0x00002ce4 flags rw- + filesz 0x0000a010 memsz 0x0000a010 flags r-x + LOAD off 0x00018000 vaddr 0x20000000 paddr 0x0800a010 align 2**15 + filesz 0x000000ec memsz 0x000000ec flags rw- + LOAD off 0x00018100 vaddr 0x20000100 paddr 0x0800a180 align 2**15 + filesz 0x00000000 memsz 0x00003564 flags rw- private flags = 5000202: [Version5 EABI] [soft-float ABI] [has entry point] Sections: Idx Name Size VMA LMA File off Algn - 0 .text 00007ef4 08000000 08000000 00008000 2**2 + 0 .text 0000a010 08000000 08000000 00008000 2**2 CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .data 00000020 20000000 08007ef4 00010000 2**2 + 1 .data 000000ec 20000000 0800a010 00018000 2**2 CONTENTS, ALLOC, LOAD, DATA - 2 .bss 00002ce4 20000080 08007f80 00010080 2**7 + 2 .bss 00003564 20000100 0800a180 00018100 2**7 ALLOC - 3 .debug_info 00012c85 00000000 00000000 00010020 2**0 + 3 .debug_info 0001fb2d 00000000 00000000 000180ec 2**0 CONTENTS, READONLY, DEBUGGING - 4 .debug_abbrev 000036b6 00000000 00000000 00022ca5 2**0 + 4 .debug_abbrev 00005409 00000000 00000000 00037c19 2**0 CONTENTS, READONLY, DEBUGGING - 5 .debug_loc 0000b713 00000000 00000000 0002635b 2**0 + 5 .debug_loc 0000f432 00000000 00000000 0003d022 2**0 CONTENTS, READONLY, DEBUGGING - 6 .debug_aranges 000010b8 00000000 00000000 00031a6e 2**0 + 6 .debug_aranges 00001558 00000000 00000000 0004c454 2**0 CONTENTS, READONLY, DEBUGGING - 7 .debug_ranges 00000fe8 00000000 00000000 00032b26 2**0 + 7 .debug_ranges 00001408 00000000 00000000 0004d9ac 2**0 CONTENTS, READONLY, DEBUGGING - 8 .debug_line 00005ce7 00000000 00000000 00033b0e 2**0 + 8 .debug_line 000079d5 00000000 00000000 0004edb4 2**0 CONTENTS, READONLY, DEBUGGING - 9 .debug_str 000054aa 00000000 00000000 000397f5 2**0 + 9 .debug_str 000073b3 00000000 00000000 00056789 2**0 CONTENTS, READONLY, DEBUGGING - 10 .comment 00000030 00000000 00000000 0003ec9f 2**0 + 10 .comment 00000030 00000000 00000000 0005db3c 2**0 CONTENTS, READONLY - 11 .ARM.attributes 00000033 00000000 00000000 0003eccf 2**0 + 11 .ARM.attributes 00000033 00000000 00000000 0005db6c 2**0 CONTENTS, READONLY - 12 .debug_frame 00002a64 00000000 00000000 0003ed04 2**2 + 12 .debug_frame 000036c0 00000000 00000000 0005dba0 2**2 CONTENTS, READONLY, DEBUGGING SYMBOL TABLE: 08000000 l d .text 00000000 .text 20000000 l d .data 00000000 .data -20000080 l d .bss 00000000 .bss +20000100 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 @@ -58,331 +58,468 @@ SYMBOL TABLE: 00000000 l d .debug_frame 00000000 .debug_frame 00000000 l df *ABS* 00000000 vectors.c 00000000 l df *ABS* 00000000 hooks.c -08007544 l O .text 00000020 firmwareFilename -20000080 l O .bss 00000228 logfile +080095e8 l O .text 00000020 firmwareFilename +20000100 l O .bss 00000228 logfile 00000000 l df *ABS* 00000000 main.c +00000000 l df *ABS* 00000000 usbd_bulk.c +080003cc l F .text 0000000e USBD_bulk_GetCfgDesc +080003dc l F .text 00000012 usbd_bulk_SOF +080003f0 l F .text 0000000a usbd_bulk_DataIn +080003fc l F .text 0000000c usbd_bulk_DataOut +08000408 l F .text 00000068 usbd_bulk_Setup +08000470 l F .text 00000016 usbd_bulk_DeInit +08000488 l F .text 00000030 usbd_bulk_Init +20000328 l O .bss 00000004 usbd_bulk_AltSet +00000000 l df *ABS* 00000000 usbd_desc.c +00000000 l df *ABS* 00000000 usbd_usr.c +00000000 l df *ABS* 00000000 usb_bsp.c +00000000 l df *ABS* 00000000 usbd_core.c +08000694 l F .text 00000016 USBD_Resume +080006ac l F .text 0000001c USBD_Suspend +080006c8 l F .text 00000010 USBD_SOF +080006d8 l F .text 0000000e USBD_IsoINIncomplete +080006e8 l F .text 0000000e USBD_IsoOUTIncomplete +080006f8 l F .text 00000016 USBD_DevConnected +08000710 l F .text 00000020 USBD_DevDisconnected +08000730 l F .text 0000002e USBD_Reset +08000760 l F .text 0000004e USBD_SetupStage +080007b0 l F .text 000000b8 USBD_DataInStage +08000868 l F .text 00000076 USBD_DataOutStage +00000000 l df *ABS* 00000000 usbd_ioreq.c +00000000 l df *ABS* 00000000 usbd_req.c +20000338 l O .bss 00000001 cfgidx.8604 +00000000 l df *ABS* 00000000 usb_core.c +08000f38 l F .text 00000072 USB_OTG_CoreReset +00000000 l df *ABS* 00000000 usb_dcd.c +00000000 l df *ABS* 00000000 usb_dcd_int.c 00000000 l df *ABS* 00000000 mmc.c -08000388 l F .text 0000004e CmdResp2Error -080003d8 l F .text 00000130 CmdResp1Error -08000508 l F .text 0000024e SDEnWideBus -200002a8 l O .bss 00000001 TransferError -20000000 l O .data 00000004 DMAEndOfTransfer -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 -20000374 l O .bss 00000004 StopCondition +08001f74 l F .text 0000004e CmdResp2Error +08001fc4 l F .text 00000130 CmdResp1Error +080020f4 l F .text 0000024e SDEnWideBus +20000339 l O .bss 00000001 TransferError +200000cc l O .data 00000004 DMAEndOfTransfer +2000033c l O .bss 00000018 SDIO_DataInitStructure +20000354 l O .bss 00000010 CSD_Tab +20000364 l O .bss 00000004 CardType +20000368 l O .bss 00000010 CID_Tab +20000378 l O .bss 00000004 TransferEnd +2000037c l O .bss 00000018 SDIO_InitStructure +20000394 l O .bss 00000004 RCA +20000398 l O .bss 00000058 SDCardInfo +200003f0 l O .bss 00000014 SDIO_CmdInitStructure +200000d0 l O .data 00000001 Stat +20000404 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 +200000d4 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 -080025a4 l F .text 00000012 mem_cpy -080025b8 l F .text 0000001e ld_clust -080025d8 l F .text 0000001e sum_sfn -080025f8 l F .text 00000096 check_fs -08002690 l F .text 00000076 sync_window -08002708 l F .text 00000032 move_window -0800273c l F .text 00000038 validate -08002774 l F .text 00000394 chk_mounted -08002b08 l F .text 0000012c get_fileinfo -08002c34 l F .text 000000bc sync_fs -08002df4 l F .text 00000098 dir_sdi -08002f9c l F .text 000000cc create_chain -08003068 l F .text 0000012a dir_next -08003194 l F .text 000001a2 dir_find -08003338 l F .text 00000332 follow_path -0800366c l F .text 00000130 dir_read -0800379c l F .text 00000058 dir_remove -080037f4 l F .text 0000006e remove_chain -080038fc l F .text 00000236 dir_register -20000378 l O .bss 00000200 LfnBuf -20000578 l O .bss 00000002 Fsid -0800759c l O .text 00000080 ExCvt -0800761c l O .text 0000000d LfnOfs -2000057c l O .bss 00000004 FatFs +080041b4 l F .text 00000012 mem_cpy +080041c8 l F .text 0000001e ld_clust +080041e8 l F .text 0000001e sum_sfn +08004208 l F .text 00000096 check_fs +080042a0 l F .text 00000076 sync_window +08004318 l F .text 00000032 move_window +0800434c l F .text 00000038 validate +08004384 l F .text 00000394 chk_mounted +08004718 l F .text 0000012c get_fileinfo +08004844 l F .text 000000bc sync_fs +08004a04 l F .text 00000098 dir_sdi +08004bac l F .text 000000cc create_chain +08004c78 l F .text 0000012a dir_next +08004da4 l F .text 000001a2 dir_find +08004f48 l F .text 00000332 follow_path +0800527c l F .text 00000130 dir_read +080053ac l F .text 00000058 dir_remove +08005404 l F .text 0000006e remove_chain +0800550c l F .text 00000236 dir_register +20000408 l O .bss 00000200 LfnBuf +20000608 l O .bss 00000002 Fsid +08009694 l O .text 00000080 ExCvt +08009714 l O .text 0000000d LfnOfs +2000060c l O .bss 00000004 FatFs 00000000 l df *ABS* 00000000 unicode.c -0800762c l O .text 000001e0 tbl_lower.4259 -0800780c l O .text 00000100 Tbl -0800790c l O .text 000001e0 tbl_upper.4260 +08009724 l O .text 000001e0 tbl_lower.4259 +08009904 l O .text 00000100 Tbl +08009a04 l O .text 000001e0 tbl_upper.4260 00000000 l df *ABS* 00000000 uip.c -080044d8 l F .text 0000004c chksum -08004524 l F .text 00000042 upper_layer_chksum -080045e8 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 +080060e8 l F .text 0000004c chksum +08006134 l F .text 00000042 upper_layer_chksum +080061f8 l F .text 00000030 uip_add_rcv_nxt +20000610 l O .bss 00000002 tmp16 +20000612 l O .bss 00000002 ipid +20000614 l O .bss 00000004 iss +20000618 l O .bss 00000002 lastport +20000624 l O .bss 00000001 c +20000625 l O .bss 00000001 opt 00000000 l df *ABS* 00000000 uip_arp.c -08005608 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 -08007aec l O .text 00000006 broadcast_ethaddr -200005f8 l O .bss 00000001 c -200005f9 l O .bss 00000001 arptime -200005fc l O .bss 00000004 ipaddr +08007218 l F .text 00000116 uip_arp_update +20000626 l O .bss 00000001 i +20000627 l O .bss 00000001 tmpage +20000628 l O .bss 00000060 arp_table +08009be4 l O .text 00000006 broadcast_ethaddr +20000688 l O .bss 00000001 c +20000689 l O .bss 00000001 arptime +2000068c l O .bss 00000004 ipaddr 00000000 l df *ABS* 00000000 boot.c 00000000 l df *ABS* 00000000 com.c -20000018 l O .data 00000001 comActiveInterface -20000600 l O .bss 00000040 xcpCtoReqPacket.4409 +200000e4 l O .data 00000001 comActiveInterface +20000690 l O .bss 00000040 xcpCtoReqPacket.4424 00000000 l df *ABS* 00000000 net.c -20000640 l O .bss 00000004 ARPTimerTimeOut -20000644 l O .bss 00000004 periodicTimerTimeOut +200006d0 l O .bss 00000004 ARPTimerTimeOut +200006d4 l O .bss 00000004 periodicTimerTimeOut 00000000 l df *ABS* 00000000 xcp.c -08005e18 l F .text 00000016 XcpSetCtoError -08007af4 l O .text 00000008 xcpStationId -20000648 l O .bss 0000004c xcpInfo +08007a70 l F .text 00000016 XcpSetCtoError +08009bec l O .text 00000008 xcpStationId +200006d8 l O .bss 0000004c xcpInfo 00000000 l df *ABS* 00000000 backdoor.c -20000694 l O .bss 00000001 backdoorOpen -20000698 l O .bss 00000004 backdoorOpenTime +20000724 l O .bss 00000001 backdoorOpen +20000728 l O .bss 00000004 backdoorOpenTime 00000000 l df *ABS* 00000000 cop.c 00000000 l df *ABS* 00000000 file.c -08006270 l F .text 0000002e FileLibByteNibbleToChar -080062a0 l F .text 00000020 FileLibByteToHexString -080062c0 l F .text 00000046 FileLibLongToIntString -08006308 l F .text 00000066 FileLibHexStringToByte -2000069c l O .bss 00000040 loggingStr -200006dc l O .bss 00000001 firmwareUpdateState -200006e0 l O .bss 00000008 eraseInfo -200006e8 l O .bss 00000458 fatFsObjects -20000b40 l O .bss 00000184 lineParseObject +08007ec8 l F .text 0000002e FileLibByteNibbleToChar +08007ef8 l F .text 00000020 FileLibByteToHexString +08007f18 l F .text 00000046 FileLibLongToIntString +08007f60 l F .text 00000066 FileLibHexStringToByte +2000072c l O .bss 00000040 loggingStr +2000076c l O .bss 00000001 firmwareUpdateState +20000770 l O .bss 00000008 eraseInfo +20000778 l O .bss 00000458 fatFsObjects +20000bd0 l O .bss 00000184 lineParseObject 00000000 l df *ABS* 00000000 assert.c -20000cc4 l O .bss 00000004 assert_failure_file -20000cc8 l O .bss 00000004 assert_failure_line +20000d54 l O .bss 00000004 assert_failure_file +20000d58 l O .bss 00000004 assert_failure_line 00000000 l df *ABS* 00000000 can.c -08007ce0 l O .text 00000024 canTiming +08009dd8 l O .text 00000024 canTiming 00000000 l df *ABS* 00000000 cpu.c 00000000 l df *ABS* 00000000 flash.c -08006d70 l F .text 00000044 FlashGetSector -08006db4 l F .text 00000078 FlashWriteBlock -08006e2c l F .text 00000062 FlashSwitchBlock -08006e90 l F .text 00000084 FlashAddToBlock -08007d04 l O .text 00000030 flashSectorNumToMask -08007d34 l O .text 0000006c flashLayout -20000ccc l O .bss 00000204 bootBlockInfo -20000ed0 l O .bss 00000204 blockInfo +080089d0 l F .text 00000044 FlashGetSector +08008a14 l F .text 00000078 FlashWriteBlock +08008a8c l F .text 00000062 FlashSwitchBlock +08008af0 l F .text 00000084 FlashAddToBlock +08009dfc l O .text 00000030 flashSectorNumToMask +08009e2c l O .text 0000006c flashLayout +20000d5c l O .bss 00000204 bootBlockInfo +20000f60 l O .bss 00000204 blockInfo 00000000 l df *ABS* 00000000 uart.c -08007124 l F .text 00000042 UartTransmitByte -08007168 l F .text 0000002c UartReceiveByte -200010d4 l O .bss 00000041 xcpCtoReqPacket.7776 -20001118 l O .bss 00000001 xcpCtoRxLength.7777 -20001119 l O .bss 00000001 xcpCtoRxInProgress.7778 +08008d84 l F .text 00000042 UartTransmitByte +08008dc8 l F .text 0000002c UartReceiveByte +20001164 l O .bss 00000041 xcpCtoReqPacket.7776 +200011a8 l O .bss 00000001 xcpCtoRxLength.7777 +200011a9 l O .bss 00000001 xcpCtoRxInProgress.7778 +00000000 l df *ABS* 00000000 usb.c +08008f44 l F .text 0000007c UsbFifoMgrWrite +08008fc0 l F .text 00000076 UsbFifoMgrRead +200011ac l O .bss 00000040 xcpCtoReqPacket.8947 +200011ec l O .bss 00000004 fifoCtrlFree +200011f0 l O .bss 00000030 fifoCtrl +20001220 l O .bss 00000041 fifoPipeBulkOUT +20001264 l O .bss 00000040 USB_Tx_Buffer.8961 +200012a4 l O .bss 00000001 xcpCtoRxLength.8948 +200012a8 l O .bss 00000041 fifoPipeBulkIN +200012ec l O .bss 00000001 xcpCtoRxInProgress.8949 +200012f0 l O .bss 000005f4 USB_OTG_dev 00000000 l df *ABS* 00000000 nvm.c 00000000 l df *ABS* 00000000 timer.c -2000111c l O .bss 00000004 millisecond_counter +200018e4 l O .bss 00000004 millisecond_counter 00000000 l df *ABS* 00000000 cstart.c -080073de l F .text 00000000 zero_loop +08009482 l F .text 00000000 zero_loop 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__ -08005ab0 g F .text 00000028 ComInit -08006f30 g F .text 00000050 FlashWrite -080043ac g F .text 0000004e f_gets -08001e44 g F .text 0000002c FLASH_Unlock -08001ac4 g F .text 00000012 ETH_FlushTransmitFIFO -08006a6c g F .text 0000001c AssertFailure -08002d08 g F .text 000000ea get_fat -08006c98 g F .text 00000088 CanReceivePacket -0800739c g F .text 00000058 reset_handler -08002068 g F .text 00000028 GPIO_PinAFConfig -08007350 g F .text 00000022 TimerUpdate -08005e60 g F .text 00000010 XcpPacketTransmitted -08001618 g F .text 0000009e ETH_StructInit -08005ad8 g F .text 0000007c ComTask -08002354 g F .text 0000000c SDIO_ClearFlag -08001440 g F .text 00000018 SD_GetStatus -08001f8c g F .text 0000003e FLASH_ProgramWord -08002278 g F .text 0000000c SDIO_SetPowerState -08001790 g F .text 000002be ETH_Init -20001e90 g O .bss 00000002 uip_len -2000058c g O .bss 00000006 uip_ethaddr -08004568 g F .text 0000007e uip_add32 -08005a7c g F .text 0000001c BootInit -08006434 g F .text 00000038 FileSrecVerifyChecksum -08006244 g F .text 00000022 BackDoorInit -080021d8 g F .text 00000024 RCC_AHB1PeriphResetCmd -08002478 g F .text 0000000c USART_GetFlagStatus -0800626c g F .text 00000002 CopService -08007ef4 g .text 00000000 _etext -0800122c g F .text 0000019a SD_WriteBlock -080044a8 g F .text 0000002e ff_wtoupper -08001d94 g F .text 00000050 netdev_read -080046b0 g F .text 00000f1e uip_process -08007118 g F .text 0000000a FlashGetUserProgBaseAddress -08001600 g F .text 00000018 ETH_DeInit -080073fc g F .text 000000a6 memcpy -080065ec g F .text 00000480 FileTask -08007340 g F .text 0000000e TimerReset -08001458 g F .text 00000038 disk_initialize -20001e94 g O .bss 00000004 uip_sappdata -08001b48 g F .text 00000226 netdev_init -20001e98 g O .bss 00000004 uip_acc32 -08004618 g F .text 00000024 uip_ipchksum -08000ba8 g F .text 000002b6 SD_GetCardInfo -08002340 g F .text 00000014 SDIO_GetFlagStatus -08002470 g F .text 00000008 USART_ReceiveData -08005a98 g F .text 00000018 BootTask -08001414 g F .text 0000002c SD_GetState -0800700c g F .text 00000058 FlashWriteChecksum -08000e60 g F .text 00000084 SD_EnableWideBusOperation -080021b4 g F .text 00000024 RCC_APB2PeriphClockCmd -080022c4 g F .text 0000000e SDIO_GetCommandResponse -08005b58 g F .text 0000004a ComTransmitPacket -08001fcc g F .text 00000090 GPIO_Init -08001490 g F .text 00000032 disk_status -0800646c g F .text 0000017e FileSrecParseLine -0800467c g F .text 00000032 uip_listen -0800244c g F .text 0000001c USART_Cmd -08001de4 g F .text 00000060 netdev_send -08001594 g F .text 00000062 disk_ioctl -080063b0 g F .text 00000036 FileHandleFirmwareUpdateRequest -08002190 g F .text 00000024 RCC_APB1PeriphClockCmd -08003864 g F .text 00000098 gen_numname -20001e9c g O .bss 00000001 uip_flags -20001180 g O .bss 00000010 EnetDmaRx -08000208 g F .text 00000042 FileFirmwareUpdateCompletedHook -08005e4c g F .text 00000012 XcpIsConnected -080042f0 g F .text 000000bc f_unlink -08001a50 g F .text 00000026 ETH_MACTransmissionCmd -080072e4 g F .text 00000008 NvmInit -08006f14 g F .text 0000001a FlashInit -08001e70 g F .text 00000012 FLASH_Lock -20002564 g .bss 00000000 _ebss -080043fc g F .text 00000034 f_putc -08004430 g F .text 0000002c f_puts -08007388 g F .text 00000012 UnusedISR -0800226c g F .text 0000000c SDIO_ClockCmd -08005b54 g F .text 00000002 ComFree -080022f0 g F .text 00000030 SDIO_DataConfig -08001aa0 g F .text 00000012 ETH_SoftwareReset -08001728 g F .text 00000068 ETH_WritePHYRegister -08007194 g F .text 0000003e UartInit -08002090 g F .text 000000da RCC_GetClocksFreq -080072f4 g F .text 00000008 NvmErase -08001d70 g F .text 00000022 netdev_init_mac -0800236c g F .text 000000de USART_Init -20000080 g .bss 00000000 _bss -080040f8 g F .text 00000014 f_close -08001e90 g F .text 00000054 FLASH_GetStatus -08005e70 g F .text 00000384 XcpPacketReceived -0800463c g F .text 0000000a uip_tcpchksum -08001e84 g F .text 0000000c FLASH_ClearFlag -08001ee4 g F .text 00000038 FLASH_WaitForLastOperation -08001b00 g F .text 00000026 ETH_DMAReceptionCmd -08003ccc g F .text 000001a8 f_read -080070cc g F .text 0000004c FlashDone -08000f10 g F .text 00000172 SD_Init -20001ea0 g O .bss 00000004 uip_appdata -20001ea4 g O .bss 00000004 uip_conn -08001ab4 g F .text 00000010 ETH_GetSoftwareResetStatus -08000ee4 g F .text 0000002c SD_SelectDeselect -08006bf0 g F .text 000000a8 CanTransmitPacket -08002294 g F .text 00000030 SDIO_SendCommand -080016b8 g F .text 0000006e ETH_ReadPHYRegister -20001ea8 g O .bss 00000068 uip_conns -080015f8 g F .text 00000008 get_fattime -08005e30 g F .text 0000001c XcpInit -08006370 g F .text 0000002c FileInit -08002320 g F .text 0000000e SDIO_ReadData -080058ac g F .text 000001d0 uip_arp_out -08006f80 g F .text 0000008a FlashErase -080074a4 g F .text 0000009e memset -0800024c g F .text 00000020 FileFirmwareUpdateErrorHook -080002cc g F .text 000000ba main -08001f1c g F .text 0000006e FLASH_EraseSector -0800404c g F .text 000000ac f_sync -080013c8 g F .text 0000004c SD_SendStatus -080063e8 g F .text 0000004c FileSrecGetLineType -08007304 g F .text 00000012 NvmDone -08003b34 g F .text 0000002a f_mount -080071d4 g F .text 00000066 UartTransmitPacket -080072fc g F .text 00000008 NvmVerifyChecksum -08006d50 g F .text 0000001e CpuMemCopy -080022d4 g F .text 0000001a SDIO_GetResponse -08002484 g F .text 00000120 SystemInit -08002e8c g F .text 0000010e put_fat -0800410c g F .text 00000198 f_lseek -08002360 g F .text 0000000a SYSCFG_ETH_MediaInterfaceConfig -08005778 g F .text 00000134 uip_arp_arpin -08005bc0 g F .text 0000001c ComGetActiveInterfaceMaxTxLen -0800723c g F .text 000000a8 UartReceivePacket -080001cc g F .text 0000000a FileGetFirmwareFilenameHook -08001084 g F .text 000001a6 SD_ReadBlock -08005720 g F .text 00000058 uip_arp_timer -20001f10 g O .bss 00000002 uip_listenports -20001f14 g O .bss 00000004 uip_draddr +080076c0 g F .text 00000030 ComInit +08008b90 g F .text 00000050 FlashWrite +2000006c g O .data 00000012 USBD_DeviceDesc +080004e4 g F .text 0000001e USBD_USR_ProductStrDescriptor +08005fbc g F .text 0000004e f_gets +08001780 g F .text 00000010 USB_OTG_ReadDevOutEP_itr +08003a30 g F .text 0000002c FLASH_Unlock +08000684 g F .text 00000010 USB_OTG_BSP_mDelay +080005a0 g F .text 0000000a USBD_USR_DeviceConnected +080036b0 g F .text 00000012 ETH_FlushTransmitFIFO +080086c4 g F .text 0000001c AssertFailure +08004918 g F .text 000000ea get_fat +080088f0 g F .text 00000088 CanReceivePacket +2000009c g O .data 00000004 USBD_DCD_INT_fops +08009440 g F .text 00000058 reset_handler +08003c54 g F .text 00000028 GPIO_PinAFConfig +080017e0 g F .text 0000009a DCD_Init +080093f4 g F .text 00000022 TimerUpdate +08007ab8 g F .text 00000010 XcpPacketTransmitted +080004b8 g F .text 0000000a usbd_bulk_get_rx_buffer_ptr +08003204 g F .text 0000009e ETH_StructInit +080076f0 g F .text 000000a4 ComTask +08003f64 g F .text 0000000c SDIO_ClearFlag +0800302c g F .text 00000018 SD_GetStatus +08003b78 g F .text 0000003e FLASH_ProgramWord +08003e88 g F .text 0000000c SDIO_SetPowerState +0800337c g F .text 000002be ETH_Init +080011c8 g F .text 00000046 USB_OTG_FlushRxFifo +20002790 g O .bss 00000002 uip_len +2000061c g O .bss 00000006 uip_ethaddr +08006178 g F .text 0000007e uip_add32 +0800768c g F .text 0000001c BootInit +080018d0 g F .text 00000032 DCD_EP_Close +0800808c g F .text 00000038 FileSrecVerifyChecksum +0800187c g F .text 00000054 DCD_EP_Open +20001928 g O .bss 00000004 SET_TEST_MODE +08007e9c g F .text 00000022 BackDoorInit +08000a28 g F .text 00000354 USBD_StdDevReq +08000564 g F .text 0000001e USBD_USR_InterfaceStrDescriptor +08003de8 g F .text 00000024 RCC_AHB1PeriphResetCmd +08004088 g F .text 0000000c USART_GetFlagStatus +08007ec4 g F .text 00000002 CopService +0800a010 g .text 00000000 _etext +20000330 g O .bss 00000004 USBD_ep_status +08002e18 g F .text 0000019a SD_WriteBlock +20000080 g O .data 0000001c USR_cb +080060b8 g F .text 0000002e ff_wtoupper +08001a00 g F .text 00000014 DCD_DevDisconnect +08003980 g F .text 00000050 netdev_read +080062c0 g F .text 00000f1e uip_process +08008d78 g F .text 0000000a FlashGetUserProgBaseAddress +08000590 g F .text 00000008 USBD_USR_DeviceSuspended +080031ec g F .text 00000018 ETH_DeInit +080094a0 g F .text 000000a6 memcpy +08008244 g F .text 00000480 FileTask +08000db4 g F .text 00000138 USBD_StdEPReq +080093e4 g F .text 0000000e TimerReset +08003044 g F .text 00000038 disk_initialize +20002794 g O .bss 00000004 uip_sappdata +08000190 g F .text 00000002 UsbLeaveLowPowerModeHook +08003734 g F .text 00000226 netdev_init +08000988 g F .text 0000001e USBD_CtlSendStatus +20002798 g O .bss 00000004 uip_acc32 +08000d7c g F .text 00000036 USBD_StdItfReq +08006228 g F .text 00000024 uip_ipchksum +08002794 g F .text 000002b6 SD_GetCardInfo +08003f50 g F .text 00000014 SDIO_GetFlagStatus +080009c8 g F .text 00000044 USBD_ParseSetupRequest +08004080 g F .text 00000008 USART_ReceiveData +080076a8 g F .text 00000018 BootTask +08001a14 g F .text 0000055e USBD_OTG_ISR_Handler +08003000 g F .text 0000002c SD_GetState +08008c6c g F .text 00000058 FlashWriteChecksum +08002a4c g F .text 00000084 SD_EnableWideBusOperation +08003dc4 g F .text 00000024 RCC_APB2PeriphClockCmd +08003ed4 g F .text 0000000e SDIO_GetCommandResponse +08001000 g F .text 000000c8 USB_OTG_SelectCore +0800779c g F .text 00000060 ComTransmitPacket +08003bb8 g F .text 00000090 GPIO_Init +0800307c g F .text 00000032 disk_status +080080c4 g F .text 0000017e FileSrecParseLine +08001210 g F .text 0000002a USB_OTG_SetCurrentMode +0800628c g F .text 00000032 uip_listen +0800405c g F .text 0000001c USART_Cmd +080039d0 g F .text 00000060 netdev_send +0800124c g F .text 0000000a USB_OTG_ReadCoreItr +08000588 g F .text 00000002 USBD_USR_DeviceReset +0800092c g F .text 0000000e USBD_ClrCfg +08003180 g F .text 00000062 disk_ioctl +080008e0 g F .text 00000034 USBD_Init +08008008 g F .text 00000036 FileHandleFirmwareUpdateRequest +20000020 g O .data 0000002c USBD_bulk_cb +08003da0 g F .text 00000024 RCC_APB1PeriphClockCmd +08005474 g F .text 00000098 gen_numname +2000279c g O .bss 00000001 uip_flags +08000974 g F .text 00000012 USBD_CtlContinueRx +20001a80 g O .bss 00000010 EnetDmaRx +08003d7c g F .text 00000024 RCC_AHB2PeriphClockCmd +0800022c g F .text 00000042 FileFirmwareUpdateCompletedHook +08007aa4 g F .text 00000012 XcpIsConnected +08005f00 g F .text 000000bc f_unlink +0800018c g F .text 00000002 UsbEnterLowPowerModeHook +0800363c g F .text 00000026 ETH_MACTransmissionCmd +08009388 g F .text 00000008 NvmInit +08008b74 g F .text 0000001a FlashInit +08003a5c g F .text 00000012 FLASH_Lock +20002e64 g .bss 00000000 _ebss +0800600c g F .text 00000034 f_putc +08001790 g F .text 0000000c USB_OTG_ReadDevAllInEPItr +08001714 g F .text 00000034 USB_OTG_EPSetStall +08006040 g F .text 0000002c f_puts +08000504 g F .text 0000001e USBD_USR_ManufacturerStrDescriptor +0800942c g F .text 00000012 UnusedISR +08000598 g F .text 00000008 USBD_USR_DeviceResumed +08003e7c g F .text 0000000c SDIO_ClockCmd +08007794 g F .text 00000008 ComFree +08003f00 g F .text 00000030 SDIO_DataConfig +080005b8 g F .text 000000ae USB_OTG_BSP_Init +08000524 g F .text 0000001e USBD_USR_SerialStrDescriptor +0800368c g F .text 00000012 ETH_SoftwareReset +08003314 g F .text 00000068 ETH_WritePHYRegister +080015f0 g F .text 00000122 USB_OTG_EP0StartXfer +080009a8 g F .text 0000001e USBD_CtlReceiveStatus +08008df4 g F .text 0000003e UartInit +0800066c g F .text 00000018 USB_OTG_BSP_uDelay +08001258 g F .text 0000000c USB_OTG_InitDevSpeed +080014c0 g F .text 0000012e USB_OTG_EPStartXfer +0800931c g F .text 0000006c UsbReceivePipeBulkOUT +08003c7c g F .text 000000da RCC_GetClocksFreq +08009398 g F .text 00000008 NvmErase +08000194 g F .text 00000018 CpuUserProgramStartHook +08000a0c g F .text 0000001a USBD_CtlError +0800395c g F .text 00000022 netdev_init_mac +08003f7c g F .text 000000de USART_Init +080019b0 g F .text 00000040 DCD_EP_ClrStall +20000100 g .bss 00000000 _bss +08005d08 g F .text 00000014 f_close +0800058c g F .text 00000002 USBD_USR_DeviceConfigured +08003a7c g F .text 00000054 FLASH_GetStatus +08007ac8 g F .text 00000384 XcpPacketReceived +0800624c g F .text 0000000a uip_tcpchksum +08003a70 g F .text 0000000c FLASH_ClearFlag +08003ad0 g F .text 00000038 FLASH_WaitForLastOperation +080036ec g F .text 00000026 ETH_DMAReceptionCmd +08000584 g F .text 00000002 USBD_USR_Init +080058dc g F .text 000001a8 f_read +08008d2c g F .text 0000004c FlashDone +08001774 g F .text 0000000c USB_OTG_ReadDevAllOutEp_itr +08002afc g F .text 00000172 SD_Init +0800123c g F .text 00000010 USB_OTG_IsDeviceMode +08000fac g F .text 0000002a USB_OTG_WritePacket +200027a0 g O .bss 00000004 uip_appdata +08001970 g F .text 00000040 DCD_EP_Stall +200027a4 g O .bss 00000004 uip_conn +080036a0 g F .text 00000010 ETH_GetSoftwareResetStatus +08001748 g F .text 0000002a USB_OTG_EPClearStall +200018e8 g O .bss 00000040 USB_Rx_Buffer +08009128 g F .text 0000007a UsbTransmitPacket +08002ad0 g F .text 0000002c SD_SelectDeselect +08008848 g F .text 000000a8 CanTransmitPacket +08000188 g F .text 00000002 UsbConnectHook +08003ea4 g F .text 00000030 SDIO_SendCommand +080032a4 g F .text 0000006e ETH_ReadPHYRegister +200027a8 g O .bss 00000068 uip_conns +08001904 g F .text 00000038 DCD_EP_PrepareRx +08001420 g F .text 0000005c USB_OTG_EPActivate +080031e4 g F .text 00000008 get_fattime +08007a88 g F .text 0000001c XcpInit +08000914 g F .text 00000018 USBD_SetCfg +08007fc8 g F .text 0000002c FileInit +08003f30 g F .text 0000000e SDIO_ReadData +08009038 g F .text 000000d8 UsbInit +080074bc g F .text 000001d0 uip_arp_out +08009110 g F .text 00000016 UsbFree +08008be0 g F .text 0000008a FlashErase +080004c4 g F .text 0000000e USBD_USR_DeviceDescriptor +08009548 g F .text 0000009e memset +08000270 g F .text 00000020 FileFirmwareUpdateErrorHook +080002f0 g F .text 000000dc main +08003b08 g F .text 0000006e FLASH_EraseSector +08005c5c g F .text 000000ac f_sync +08002fb4 g F .text 0000004c SD_SendStatus +080012b4 g F .text 0000011e USB_OTG_CoreInitDev +08001178 g F .text 0000004e USB_OTG_FlushTxFifo +08008040 g F .text 0000004c FileSrecGetLineType +080093a8 g F .text 00000012 NvmDone +08005744 g F .text 0000002a f_mount +08008e34 g F .text 00000066 UartTransmitPacket +080093a0 g F .text 00000008 NvmVerifyChecksum +080089b0 g F .text 0000001e CpuMemCopy +08003ee4 g F .text 0000001a SDIO_GetResponse +20000068 g O .data 00000004 USBD_LangIDDesc +08001168 g F .text 0000000e USB_OTG_DisableGlobalInt +0800179c g F .text 00000042 USB_OTG_EP0_OutStart +080010c8 g F .text 00000090 USB_OTG_CoreInit +2000032c g O .bss 00000004 USBD_cfg_status +08004094 g F .text 00000120 SystemInit +20000334 g O .bss 00000004 USBD_default_cfg +08004a9c g F .text 0000010e put_fat +0800193c g F .text 00000034 DCD_EP_Tx +08005d1c g F .text 00000198 f_lseek +08003f70 g F .text 0000000a SYSCFG_ETH_MediaInterfaceConfig +08007388 g F .text 00000134 uip_arp_arpin +08007818 g F .text 0000001c ComGetActiveInterfaceMaxTxLen +08008e9c g F .text 000000a8 UartReceivePacket +080001f0 g F .text 0000000a FileGetFirmwareFilenameHook +080005ac g F .text 0000000a USBD_USR_DeviceDisconnected +08000668 g F .text 00000002 USB_OTG_BSP_EnableInterrupt +08002c70 g F .text 000001a6 SD_ReadBlock +08007330 g F .text 00000058 uip_arp_timer +08000960 g F .text 00000012 USBD_CtlContinueSendData +20002810 g O .bss 00000002 uip_listenports +20002814 g O .bss 00000004 uip_draddr +080004d4 g F .text 0000000e USBD_USR_LangIDStrDescriptor +080013d4 g F .text 00000020 USB_OTG_GetDeviceSpeed 20000000 g .data 00000000 _data -08001b28 g F .text 00000020 ETH_Start -20001190 g O .bss 00000640 RxBuff -080042a4 g F .text 0000004a f_stat -08006268 g F .text 00000002 CopInit -08000758 g F .text 0000002c SD_Detect -08006a88 g F .text 00000168 CanInit -080072ec g F .text 00000008 NvmWrite -08006d20 g F .text 00000030 CpuStartUserProgram -08002cf0 g F .text 00000016 clust2sect -20002d64 g .bss 00000000 _estack -08002468 g F .text 00000008 USART_SendData -08007064 g F .text 00000068 FlashVerifyChecksum -08005c58 g F .text 00000044 NetTransmitPacket -20000020 g .data 00000000 _edata -0800639c g F .text 00000014 FileIsIdle -080055d0 g F .text 0000000a htons -08003e74 g F .text 000001d8 f_write +08003714 g F .text 00000020 ETH_Start +20001a90 g O .bss 00000640 RxBuff +08005eb4 g F .text 0000004a f_stat +08007ec0 g F .text 00000002 CopInit +08002344 g F .text 0000002c SD_Detect +080086e0 g F .text 00000168 CanInit +08009390 g F .text 00000008 NvmWrite +08008978 g F .text 00000036 CpuStartUserProgram +08000eec g F .text 0000004c USBD_GetString +08004900 g F .text 00000016 clust2sect +20003664 g .bss 00000000 _estack +08004078 g F .text 00000008 USART_SendData +080091a4 g F .text 000000c8 UsbReceivePacket +08008cc4 g F .text 00000068 FlashVerifyChecksum +080078b0 g F .text 00000044 NetTransmitPacket +200000ec g .data 00000000 _edata +08007ff4 g F .text 00000014 FileIsIdle +080071e0 g F .text 0000000a htons +08005a84 g F .text 000001d8 f_write +08001264 g F .text 00000050 USB_OTG_EnableDevInt 08000000 g O .text 00000188 _vectab -08003b60 g F .text 0000016a f_open -08001528 g F .text 0000006c disk_write -08001a78 g F .text 00000026 ETH_MACReceptionCmd -0800026c g F .text 00000060 FileFirmwareUpdateLogHook -200017d0 g O .bss 00000640 TxBuff -2000001c g O .data 00000004 __ctype_ptr__ -08005bdc g F .text 00000008 ComIsConnected -08007df0 g O .text 00000101 _ctype_ -08001ad8 g F .text 00000026 ETH_DMATransmissionCmd -08002238 g F .text 00000034 SDIO_Init -08000188 g F .text 00000044 FileIsFirmwareUpdateRequestedHook -08004648 g F .text 00000032 uip_init -08000784 g F .text 0000027e SD_PowerON -08005ba4 g F .text 0000001c ComGetActiveInterfaceMaxRxLen -0800216c g F .text 00000024 RCC_AHB1PeriphClockCmd -08005c9c g F .text 0000010a NetReceivePacket -080014c4 g F .text 00000064 disk_read -080061f4 g F .text 0000004e BackDoorCheck -20002564 g .bss 00000000 _stack -080021fc g F .text 00000024 RCC_APB2PeriphResetCmd -20001f18 g O .bss 00000004 uip_netmask -20001f1c g O .bss 00000004 uip_hostaddr -0800445c g F .text 0000004a ff_convert -08007374 g F .text 00000012 TimerGet -08002284 g F .text 00000010 SDIO_GetPowerState -20001e80 g O .bss 00000010 EnetDmaTx -08005da8 g F .text 00000070 NetApp -08005be4 g F .text 00000074 NetInit -08000a04 g F .text 000001a4 SD_InitializeCards -0800205c g F .text 0000000c GPIO_ReadInputDataBit -08007318 g F .text 00000028 TimerInit -08002330 g F .text 0000000e SDIO_WriteData -20001f20 g O .bss 00000642 uip_buf -080055dc g F .text 0000002a uip_send -20002562 g O .bss 00000002 uip_slen -080001d8 g F .text 00000030 FileFirmwareUpdateStartedHook -08002220 g F .text 00000018 SDIO_DeInit +08000544 g F .text 0000001e USBD_USR_ConfigStrDescriptor +08005770 g F .text 0000016a f_open +08003114 g F .text 0000006c disk_write +08003664 g F .text 00000026 ETH_MACReceptionCmd +0800093c g F .text 00000022 USBD_CtlSendData +08000290 g F .text 00000060 FileFirmwareUpdateLogHook +200020d0 g O .bss 00000640 TxBuff +200000e8 g O .data 00000004 __ctype_ptr__ +08007834 g F .text 00000008 ComIsConnected +080013f4 g F .text 0000002a USB_OTG_EP0Activate +08000fd8 g F .text 00000026 USB_OTG_ReadPacket +08009f0c g O .text 00000101 _ctype_ +080036c4 g F .text 00000026 ETH_DMATransmissionCmd +08003e48 g F .text 00000034 SDIO_Init +080001ac g F .text 00000044 FileIsFirmwareUpdateRequestedHook +080019f0 g F .text 00000010 DCD_EP_SetAddress +08006258 g F .text 00000032 uip_init +08002370 g F .text 0000027e SD_PowerON +2000192c g O .bss 000000ff USBD_StrDesc +080077fc g F .text 0000001c ComGetActiveInterfaceMaxRxLen +08003d58 g F .text 00000024 RCC_AHB1PeriphClockCmd +080078f4 g F .text 0000010a NetReceivePacket +080030b0 g F .text 00000064 disk_read +08007e4c g F .text 0000004e BackDoorCheck +20002e64 g .bss 00000000 _stack +08003e0c g F .text 00000024 RCC_APB2PeriphResetCmd +20002818 g O .bss 00000004 uip_netmask +20000000 g O .data 00000020 usbd_bulk_CfgDesc +2000281c g O .bss 00000004 uip_hostaddr +0800606c g F .text 0000004a ff_convert +08009418 g F .text 00000012 TimerGet +08003e94 g F .text 00000010 SDIO_GetPowerState +0800926c g F .text 000000ae UsbTransmitPipeBulkIN +20002780 g O .bss 00000010 EnetDmaTx +08007a00 g F .text 00000070 NetApp +2000004c g O .data 0000001c USR_desc +0800783c g F .text 00000074 NetInit +0800147c g F .text 00000042 USB_OTG_EPDeactivate +080025f0 g F .text 000001a4 SD_InitializeCards +08003c48 g F .text 0000000c GPIO_ReadInputDataBit +080093bc g F .text 00000028 TimerInit +08003f40 g F .text 0000000e SDIO_WriteData +20002820 g O .bss 00000642 uip_buf +200000a0 g O .data 0000002c USBD_DCD_INT_cb +080071ec g F .text 0000002a uip_send +20002e62 g O .bss 00000002 uip_slen +080001fc g F .text 00000030 FileFirmwareUpdateStartedHook +08001158 g F .text 0000000e USB_OTG_EnableGlobalInt +08003e30 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 78736e6f..e06f9db2 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,2036 +1,2578 @@ S024000062696E2F6F70656E62746C5F6F6C696D65785F73746D3332653430372E737265639F -S31508000000642D00209D730008897300088973000811 -S3150800001089730008897300088973000889730008C2 -S3150800002089730008897300088973000889730008B2 -S3150800003089730008897300088973000889730008A2 -S315080000408973000889730008897300088973000892 -S315080000508973000889730008897300088973000882 -S315080000608973000889730008897300088973000872 -S315080000708973000889730008897300088973000862 -S315080000808973000889730008897300088973000852 -S315080000908973000889730008897300088973000842 -S315080000A08973000889730008897300088973000832 -S315080000B08973000889730008897300088973000822 -S315080000C08973000889730008897300088973000812 -S315080000D08973000889730008897300088973000802 -S315080000E089730008897300088973000889730008F2 -S315080000F089730008897300088973000889730008E2 -S3150800010089730008897300088973000889730008D1 -S3150800011089730008897300088973000889730008C1 -S3150800012089730008897300088973000889730008B1 -S3150800013089730008897300088973000889730008A1 -S315080001408973000889730008897300088973000891 -S315080001508973000889730008897300088973000881 -S315080001608973000889730008897300088973000871 -S315080001708973000889730008897300088973000861 -S31508000180897300088973000800B589B000230093B5 -S31508000190019302930393049305930693079347F2F7 -S315080001A04450C0F60000694604F07CF848B9009B44 -S315080001B0002043B19DF8080080F01000C0F300103D -S315080001C001E00020FFE709B05DF804FB47F2445060 -S315080001D0C0F60000704700BF08B540F28000C2F2C2 -S315080001E00000002380F8243247F26451C0F600016B -S315080001F00A2203F0B5FC30B940F28003C2F20003CC -S31508000200012283F8242208BD38B540F28003C2F2E1 -S31508000210000393F82432012B05D140F28000C2F284 -S31508000220000003F069FF4FF4A054C4F2010440250E -S315080002302046294602F020F90028F9D047F2445012 -S31508000240C0F6000004F054F838BD00BF08B540F207 -S315080002508003C2F2000393F82432012B05D140F241 -S315080002608000C2F2000003F047FF08BD70B50646DD -S3150800027040F28003C2F2000393F82432012B10D116 -S3150800028040F28001C2F2000104F0D2F8002808DA30 -S3150800029040F28000C2F20000002380F8243203F006 -S315080002A02BFF317889B14FF4A054C4F2010480259C -S315080002B0204602F0D9F82046294602F0DDF8002843 -S315080002C0F9D016F8011F0029F2D170BD80B582B0A9 -S315080002D002F0D8F82020012101F06CFF042001214A -S315080002E001F044FF4FF40065C4F2020528460621D2 -S315080002F0082201F0B9FE28460721082201F0B4FEBB -S3150800030000278DF8067001268DF8076002248DF8FF -S315080003100440402300938DF805402846694601F0BD -S3150800032055FE8DF80440802300932846694601F05F -S315080003304DFE2046314601F019FF4FF48065C4F2A0 -S31508000340020528460521092201F08EFE28460621C7 -S31508000350092201F089FE602300938DF804408DF888 -S3150800036005408DF806708DF807602846694601F045 -S315080003702DFE4FF0C060314601F00AFF05F07EFB06 -S3150800038005F08AFBFCE700BF08B54FF43053C4F20A -S3150800039001035B6B13F0450F07D14FF43052C4F2DB -S315080003A00102536B13F0450FFBD013F0040F04D072 -S315080003B0042001F0CFFF032008BD13F0010F04D07D -S315080003C0012001F0C7FF012008BD40F2FF5001F0EF -S315080003D0C1FF002008BD00BF10B504464FF43053D6 -S315080003E0C4F201035B6B13F0450F07D14FF430528B -S315080003F0C4F20102536B13F0450FFBD013F0040F40 -S3150800040004D0042001F0A6FF032010BD13F0010F4D -S3150800041004D0012001F09EFF012010BD01F052FF1B -S31508000420A04249D140F2FF5001F094FF002001F0AC -S3150800043051FF4EF20803CFF6FF530340002B3DD081 -S3150800044000283DDB10F0804F3CD110F0005F3BD117 -S3150800045010F0805F3AD110F0006F39D110F0806F3C -S3150800046038D110F0807F37D110F4000F36D110F450 -S31508000470800F35D110F4001F34D110F4801F33D10A -S3150800048010F4002F32D110F4802F31D110F4003F30 -S3150800049030D110F4803F2FD110F4004F2ED110F434 -S315080004A0804F2DD110F4005F2CD100F008000028F1 -S315080004B014BF1A20002010BD102010BD002010BD4A -S315080004C01C2010BD092010BD0A2010BD0B2010BD30 -S315080004D00C2010BD0D2010BD0E2010BD0F2010BD24 -S315080004E0102010BD112010BD122010BD132010BD04 -S315080004F0142010BD152010BD162010BD172010BDE4 -S31508000500182010BD192010BD2DE9F04182B004460F -S31508000510002001F0DFFE10F0007F18BF0E2040F02B -S31508000520178100220092019240F26030C2F2000068 -S31508000530082101601025456040218160C2604FF4A2 -S315080005408062026101F0A6FE2846FFF745FF0028F3 -S3150800055040F0FC8040F26030C2F2000040F2043203 -S31508000560C2F200021268AA4002603725456040229E -S3150800057082600022C2604FF48062026101F08AFE46 -S315080005802846FFF729FF002840F0E18040F2AC201A -S31508000590C2F200004FF0FF330360082343603023A4 -S315080005A083600223C360002505610123436101F0CE -S315080005B09FFE40F26030C2F20000056033264660B6 -S315080005C040228260C5604FF48062026101F062FEDB -S315080005D03046FFF701FF002840F0BA80ADF1040865 -S315080005E04FF43055C4F2010540F22A664FF400175D -S315080005F007E0384601F0A4FE18B101F091FE48F86C -S31508000600040F6B6B3342F4D0082001F099FE20B139 -S31508000610082001F09FFE04209AE0022001F090FED7 -S3150800062020B1022001F096FE022091E0202001F080 -S3150800063087FE20B1202001F08DFE062088E04FF4C9 -S31508000640007001F07DFE28B14FF4007001F082FEC3 -S3150800065007207DE040F2FF5001F07CFE009A130669 -S3150800066043EA126302F47F4143EA012302F47F025C -S3150800067043EA1223012C34D113F4802F08BF252016 -S3150800068066D040F26030C2F2000040F20432C2F294 -S315080006900002126812040260372444604022826015 -S315080006A00022C2604FF48062026101F0F3FD204629 -S315080006B0FFF792FE002847D140F26030C2F20000F0 -S315080006C00222026006244460402282600022C26040 -S315080006D04FF48062026101F0DDFD2046FFF77CFEE3 -S315080006E036E013F4803F08BF252031D040F2603051 -S315080006F0C2F2000040F20432C2F20002126812048A -S31508000700026037244460402282600022C2604FF4AF -S315080007108062026101F0BEFD2046FFF75DFEA0B9CA -S3150800072040F26030C2F200000022026006244460F3 -S3150800073040218160C2604FF48062026101F0AAFD27 -S315080007402046FFF749FE03E002E001E000E0FFE78C -S3150800075002B0BDE8F08100BF00B583B001238DF873 -S3150800076007304FF40060C4F202004FF4006101F054 -S3150800077075FC10B900238DF807309DF8070003B003 -S315080007805DF804FB2DE9F04782B000248DF8074098 -S3150800079040F2EC20C2F20000762303750460446040 -S315080007A08460C460046101F047FD032001F064FD24 -S315080007B0012001F05BFD40F26030C2F200000460E7 -S315080007C044608460C4604FF48063036101F062FD95 -S315080007D04FF48034802501E0013C0CD0284601F016 -S315080007E0AFFD0028F8D003233CB140F2FF5001F0DA -S315080007F0B1FD002301E00323FFE78DF807309DF8DC -S31508000800073013F0FF0F03D09DF80700C0B2F5E0DC -S3150800081040F26030C2F200004FF4D573036008233B -S315080008204360402383600023C3604FF48063036101 -S3150800083001F030FD4FF43053C4F201035A6B12F045 -S31508000840450F0ED14FF480334FF43051C4F20101F5 -S31508000850013B4A6B12F0450F02D1002BF8D103E099 -S3150800086013B112F0040F04D0042001F073FD032322 -S3150800087009E012F0400F08BF002304D0402001F021 -S3150800088069FD0023FFE78DF807309DF8073013F060 -S31508000890FF0F08D140F2D423C2F2000301221A60E6 -S315080008A04FF0804514E040F26030C2F200000025A7 -S315080008B005603724446040228260C5604FF4806238 -S315080008C0026101F0E7FC2046FFF786FD8DF8070078 -S315080008D040F26030C2F20000002202603724446011 -S315080008E040218160C2604FF48062026101F0D2FC4F -S315080008F02046FFF771FD8DF807009DF8073013F0C5 -S31508000900FF0F78D1002740F26034C2F20004B846DF -S31508000910B94645F0004545F4801A4FF43055C4F2FF -S315080009200105C4F80090372666604023A360C4F822 -S315080009300C904FF480632361204601F0ABFC3046EF -S31508000940FFF74AFD8DF807009DF8073013F0FF0FF3 -S3150800095003D09DF80700C0B250E0C4F800A02923D0 -S3150800096063604023A360C4F80C804FF4806323615E -S31508000970204601F08FFC6B6B13F0450F03D16B6BB0 -S3150800098013F0450FFBD013F0040F04D0042001F038 -S31508000990E1FC032304E040F2FF5001F0DBFC434690 -S315080009A08DF807309DF8073013F0FF0F03D09DF838 -S315080009B00700C0B222E0404601F08CFC0137014630 -S315080009C04FF6FE73C043C00F9F4288BF0020002821 -S315080009D0A7D19F4206D91B238DF807309DF807003B -S315080009E0C0B20BE011F0804F1FBF40F2D423C2F211 -S315080009F0000302221A609DF80700C0B202B0BDE8E3 -S31508000A00F08700BF38B501F03DFC002800F0BC8037 -S31508000A1040F2D423C2F200031B68042B00F0B68010 -S31508000A2040F26030C2F200000023036002224260F6 -S31508000A30C0228260C3604FF48063036101F02AFC20 -S31508000A40FFF7A2FC002840F0A38001F043FC40F227 -S31508000A50D824C2F200042060042001F03BFC606048 -S31508000A60082001F037FCA0600C2001F033FCE060A0 -S31508000A7040F2D423C2F200031B68062B18BF022BD0 -S31508000A8088BF01224AD840F26030C2F20000002333 -S31508000A9003600322426040228260C3604FF4806391 -S31508000AA0036101F0F7FB4FF43053C4F201035B6BAB -S31508000AB013F0450F07D14FF43052C4F20102536BBD -S31508000AC013F0450FFBD013F0040F04D0042001F0F7 -S31508000AD041FC032038BD13F0010F04D0012001F0BA -S31508000AE039FC012038BD01F0EDFB032854D140F252 -S31508000AF0FF5001F02FFC002001F0ECFB10F4604FD2 -S31508000B0008BF020C0AD010F4005F47D110F4804FDA -S31508000B1046D110F4004F45D10122FFE740F2D42315 -S31508000B20C2F200031B68042B33D040F20433C2F22E -S31508000B3000031A6040F26030C2F20000120402603C -S31508000B4009234360C02383600023C3604FF4806396 -S31508000B50036101F09FFBFFF717FC0546D8B901F0C2 -S31508000B60B9FB40F2C424C2F200042060042001F05C -S31508000B70B1FB6060082001F0ADFBA0600C2001F01D -S31508000B80A9FBE060284638BD252038BD002038BDC1 -S31508000B9038BD002038BD38BD102038BD132038BDFB -S31508000BA0102038BD0F2038BDF0B4014640F2D423DA -S31508000BB0C2F200031C6880F8564040F20433C2F2C1 -S31508000BC000031B68A0F8543040F2C423C2F20003A5 -S31508000BD01A68150EE8B286090E70C5F383054D70BE -S31508000BE000F003008870C2F30740C870C2F30720FC -S31508000BF00871D2B24A715B681A0E1201CA80C3F331 -S31508000C000742C88880B240EA1210C88002F00F0274 -S31508000C100A72C3F30720C2094A72C0F380128A72A5 -S31508000C20C0F34012CA72C0F300120A7300224A7354 -S31508000C30012C42D800F00300800208610A69DBB281 -S31508000C4042EA83030B6140F2C423C2F200039868A8 -S31508000C50020ED3B20C6944EA93140C61C2F3C202C1 -S31508000C600A7503F007034B75C0F307435A098A75DB -S31508000C70C3F38202CA7503F003035B000B76C0F365 -S31508000C8007200B7E43EAD0130B760F690A7E0E7A8D -S31508000C90F6B2012303FA06F60E65023203FA02F2E9 -S31508000CA0D517A2FB062306FB05337E1CA2FB0645C9 -S31508000CB006FB0355C1E9124524E0022C22D103F0B4 -S31508000CC03F031B040B6140F2C423C2F20003986879 -S31508000CD00B69020E43EA02230B610B69C0F3074254 -S31508000CE013430B61C0F307200A690023013243F15D -S31508000CF00003DB0443EA5233D2048A64CB644FF41C -S31508000D0000730B65C0F380134B7600F03F0040007C -S31508000D10887640F2C423C2F200031A7A887E40EA33 -S31508000D20D210887602F07F02CA76DA68130ED8B235 -S31508000D30C4090C77C3F341144C77C3F382038B774A -S31508000D4000F003008000C877C2F30743C87F40EA73 -S31508000D509310C877C3F3401081F82000002081F86B -S31508000D60210003F0010381F82230C2F30723DC09CE -S31508000D7081F82340C3F3801481F82440C3F3401458 -S31508000D8081F82540C3F3001481F82640C3F3810493 -S31508000D9081F8274003F0030381F82830C2F346029E -S31508000DA081F82920012481F82A4040F2D823C2F28A -S31508000DB000031A68150E81F82C50C2F307452D0258 -S31508000DC0CD85CD8DADB2C2F307263543CD85120646 -S31508000DD00A635A680D6B160E45EA06450D630D6BD8 -S31508000DE0C2F3074645EA06250D630D6BC2F30726CF -S31508000DF035430D63D2B281F834209A68150E81F80E -S31508000E003550C2F307452D068D638D6BC2F3072651 -S31508000E1045EA06458D638D6BD2B245EA02228A639E -S31508000E20DB688A6B42EA13628A63C3F3074291F866 -S31508000E303C5045EA121581F83C5002F00F021202A6 -S31508000E40CA87CA8F92B2C3F307252A43CA87C3F350 -S31508000E50460381F8403081F84140F0BC704700BF36 -S31508000E6010B540F2D423C2F200031B68032B31D01D -S31508000E70022B31D8B0F5805F30D0B0F5006F15D1B0 -S31508000E800120FFF741FB044650BB40F2EC20C2F2BA -S31508000E900000002202750260426082604FF4006121 -S31508000EA0C160026101F0C8F9204610BD0020FFF7B5 -S31508000EB02BFB0446A8B940F2EC20C2F2000000223F -S31508000EC00275026042608260C260026101F0B4F994 -S31508000ED0204610BD272010BD002010BD272010BDBC -S31508000EE010BD10BD10B540F26033C2F200031860A1 -S31508000EF007245C6040229A600022DA604FF4806220 -S31508000F001A61184601F0C6F92046FFF765FA10BDC2 -S31508000F102DE9F04184B000268DF80F600C200121E0 -S31508000F2001F024F94FF40064C4F2020420460821B3 -S31508000F300C2201F099F8204609210C2201F094F8B8 -S31508000F4020460A210C2201F08FF820460B210C229C -S31508000F5001F08AF820460C210A4601F085F84FF47C -S31508000F604067C4F20207384602210C2201F07CF8D9 -S31508000F704FF47063019301258DF809504FF002086C -S31508000F808DF808808DF80A608DF80B50204601A967 -S31508000F9001F01CF80423019338460DEB030101F018 -S31508000FA015F84FF4805301938DF80B60204601A97C -S31508000FB001F00CF84FF4006701978DF808808DF85A -S31508000FC00B60204601A901F001F83846294601F0D0 -S31508000FD0F1F84FF48000294601F0C8F801F020F92D -S31508000FE0FFF7D0FB8DF80F009DF80F3013F0FF0FB9 -S31508000FF003D09DF80F00C0B240E0FFF703FD8DF85F -S315080010000F009DF80F3013F0FF0F03D09DF80F0067 -S31508001010C0B233E040F2EC20C2F2000000230375B0 -S31508001020036043608360C360036101F005F940F221 -S315080010300830C2F20000FFF7B7FD8DF80F009DF8E3 -S315080010400F3013F0FF0F0BD140F20833C2F2000342 -S31508001050B3F8540000040021FFF744FF8DF80F0091 -S315080010609DF80F3013F0FF0F05D14FF40060FFF71E -S31508001070F7FE8DF80F009DF80F00C0B204B0BDE86A -S31508001080F08100BF2DE9F84307461646BDF8204013 -S3150800109040F2A822C2F200020021117040F2E822B2 -S315080010A0C2F20002116040F27430C2F20000016020 -S315080010B04FF43052C4F20102D16240F2D421C2F296 -S315080010C000010A68022A02BF760A46EAC3564FF4A6 -S315080010D00074A04640F26030C2F20000046010229C -S315080010E04260402282600022C2604FF48062026140 -S315080010F001F0D0F84FF48034802501E0013C04D09B -S31508001100284601F01DF90028F8D01020FFF764F9E9 -S31508001110002840F0868040F2AC20C2F200004FF072 -S31508001120FF330360C0F80480902383600223C36002 -S31508001130002505610123436101F0DAF840F26030C9 -S31508001140C2F2000006601124446040228260C56035 -S315080011504FF48062026101F09DF82046FFF73CF9E2 -S31508001160002860D14FF43055C4F2010540F22A66D2 -S315080011704FF400484FF000090BE0404601F0E0F854 -S3150800118038B14C4601F0CCF838510434202CF9D14A -S3150800119020376B6B3342F0D0082001F0D1F828B124 -S315080011A0082001F0D7F80420BDE8F883022001F0F2 -S315080011B0C7F828B1022001F0CDF80220BDE8F8836F -S315080011C0202001F0BDF828B1202001F0C3F8062040 -S315080011D0BDE8F8834FF4007001F0B2F84FF0FF3421 -S315080011E04FF4001558B14FF4007001F0B3F807201A -S315080011F0BDE8F88301F094F847F8040B013C28464B -S3150800120001F09EF808B1002CF4D140F2FF5001F02D -S31508001210A1F840F20003C2F2000300201860BDE8FE -S31508001220F883BDE8F883BDE8F88300BF2DE9F84FD9 -S3150800123080461446BDF8282040F2A820C2F20000D5 -S315080012400021017040F2E820C2F20000016040F27D -S315080012507430C2F2000001604FF43050C4F201004D -S31508001260C16240F2D421C2F200010968022902BF14 -S31508001270640A44EAC3544FF40072164640F26030DA -S31508001280C2F20000026010254560402282600022FA -S31508001290C2604FF48062026100F0FCFF2846FFF747 -S315080012A09BF8002840F08B8040F26030C2F20000C4 -S315080012B0046018244460402282600022C2604FF411 -S315080012C08062026100F0E6FF2046FFF785F80028F5 -S315080012D077D140F2AC20C2F200004FF0FF33036032 -S315080012E04660902383600024C4600461012343613F -S315080012F000F0FEFFA3464FF43054C4F2010440F256 -S315080013001A654FF4804625E0304601F019F808B30F -S31508001310CBF5007ABAF11F0F10D85FEA9A0A19D0EE -S31508001320C146002759F8040B01F002F80137574562 -S31508001330F8D14FEA8A0AD044D3440BE0002758F87C -S31508001340070000F0F5FF0437202FF8D108F1200830 -S315080013500BF1200B636B2B42D6D0082000F0F0FF70 -S3150800136028B1082000F0F6FF0420BDE8F88F022017 -S3150800137000F0E6FF28B1022000F0ECFF0220BDE8ED -S31508001380F88F102000F0DCFF28B1102000F0E2FFF3 -S315080013900520BDE8F88F4FF4007000F0D1FF30B19A -S315080013A04FF4007000F0D6FF0720BDE8F88F40F232 -S315080013B00003C2F2000300201860BDE8F88FBDE8FC -S315080013C0F88FBDE8F88F00BF38B50546F8B140F28A -S315080013D06030C2F2000040F20432C2F20002126823 -S315080013E0120402600D244460402282600022C2601A -S315080013F04FF48062026100F04DFF2046FEF7ECFFD5 -S31508001400044630B900F066FF2860204638BD26201D -S3150800141038BD38BD00B583B000230193FFF79CF9AA -S31508001420012818BFFF2008D101A8FFF7CDFF18B97A -S315080014300198C0F3432000E0FF2003B05DF804FBE9 -S3150800144008B5FFF7E7FF042804D0FF2814BF0120DA -S31508001450022008BD002008BD00B597B0FFF758FD6B -S3150800146060B940F20403C2F200031A7802F0FE02E1 -S315080014701A706846FFF798FB002006E040F204035E -S31508001480C2F2000301221A70032017B05DF804FBAC -S3150800149008B540F20403C2F2000301221A7050B9DB -S315080014A0FFF7CEFF38B940F20403C2F200031A78F8 -S315080014B002F0FE021A7040F20403C2F20003187822 -S315080014C008BD00BF2DE9F043ADF5037D88461746F4 -S315080014D0D0B11CE0013BDCB24FF000094FF40075B7 -S315080014E0E619009502A872024B46FFF7CBFD80B9B4 -S315080014F0FFF7A6FF0128FBD008EB442002A92A46DD -S3150800150005F07CFF4CB906E001204BB1E2E701206B -S3150800151006E0012004E0002002E0013CE4B2DFE737 -S315080015200DF5037DBDE8F0832DE9F043ADF5037DA8 -S315080015300F469046F0B120E0013BDCB24FF400754F -S315080015404FF0000902A807EB44212A4605F056FF8A -S3150800155004EB0806009502A872024B46FFF766FEE2 -S31508001560052818BF00280AD1FFF76AFF0128FBD013 -S315080015704CB906E001204BB1DEE7012006E0012068 -S3150800158004E0002002E0013CE4B2DBE70DF5037D50 -S31508001590BDE8F08310B596B0144640F20403C2F2D3 -S315080015A000031B7813F0010F18BF032021D103296C -S315080015B01AD8DFE801F002041015002019E0A8B9CE -S315080015C06846FFF7F1FA129B5B0A139A43EAC2537D -S315080015D0236000200DE04FF400731380002008E01C -S315080015E030B92023136004E0042002E0002000E064 -S315080015F0002016B010BD00BF0020C4F2AA20704714 -S3150800160008B54FF00070012100F0E6FD4FF00070BC -S31508001610002100F0E1FD08BD0023036043608360FC -S31508001620C360036143618361C3610362436283628A -S31508001630C362036343638363C36340220264202255 -S3150800164042648364C364036543658365C36503664F -S31508001650802242668366C366036743678367C367F8 -S315080016604FF08062C0F880204FF00072C0F88420E6 -S315080016704FF08071C0F888104FF40011C0F88C1034 -S31508001680C0F89030C0F89430C0F89830C0F89C3054 -S31508001690C0F8A030C0F8A420C0F8A8304FF4003233 -S315080016A0C0F8AC204FF48072C0F8B020C0F8B4304F -S315080016B0C0F8B830704700BF82B0002301934FF4DA -S315080016C00043C4F202031A6902F01C02890101F4FC -S315080016D0F8610A43C00281B20A4342F001021A6164 -S315080016E04FF40042C4F202024FF6FE71C0F2040142 -S315080016F0019B01330193136913F0010F02D0019B7B -S315080017008B42F5D9019A4FF6FF73C0F204039A4249 -S315080017101FBF4FF40043C4F20203586980B208BFE2 -S31508001720002002B0704700BF10B483B000230193B5 -S315080017304FF40043C4F202031C6904F01C0444F08D -S315080017400304890101F4F8610C43C00281B20C4319 -S315080017505A611C614FF40042C4F202024FF6FE7150 -S31508001760C0F20401019B01330193136913F0010FC1 -S3150800177002D0019B8B42F5D901984FF6FF73C0F250 -S315080017800403C01A18BF012003B05DF8044B704764 -S31508001790F0B587B004460D460023059300934FF431 -S315080017A00043C4F202031E6926F01C0601A800F0D5 -S315080017B06FFC02994FF45343CFF6CE630B444EF2B7 -S315080017C0BF12C0F2E402934298BF46F008061AD93F -S315080017D04FF24013CFF6E9530B4447F63F02C0F2E7 -S315080017E07D12934298BF46F00C060CD94FF4F2438B -S315080017F0CFF66C430B444FF4B442C0F262229342D4 -S3150800180088BF46F004064FF40043C4F202031E6183 -S31508001810284600214FF40042FFF786FF002800F013 -S315080018200F814FF080630593059B2BB1059B013B08 -S315080018300593059B002BF9D12368002B5ED0012761 -S315080018404FF6FE76C0F20406009B01330093284645 -S315080018503946FFF731FF00F0040083B213B9009B45 -S31508001860B342F1D9009A4FF6FF73C0F204039A42C5 -S3150800187008BF002000F0E9800021009128464FF4B7 -S315080018808052FFF751FF002800F0DC8001274FF651 -S31508001890FE76C0F20406009B0133009328463946BB -S315080018A0FFF70AFF00F0200080B210B9009BB34290 -S315080018B0F1D9009A4FF6FF73C0F204039A4208BFA3 -S315080018C0002000F0C2800023009328461021FFF76D -S315080018D0F3FE00F004039BB21BB14FF400632362CE -S315080018E001E00023236200F002039BB213B1002338 -S315080018F063611BE04FF48043636117E06369226A02 -S31508001900D20842EA53022846002192B2FFF70CFF9A -S31508001910002800F099806FF07F430593059B2BB153 -S31508001920059B013B0593059B002BF9D14FF400431A -S31508001930C4F20203196848F20F12CFF620720A4061 -S31508001940A06861680843E16808432169084361693A -S315080019500843A1690843E1690843216A0843616AA3 -S315080019600843A16A0843E16A0843216B0843616B8F -S3150800197001430A431A60E16BA26B1143226C1143BF -S31508001980626C1143A26C1143E26C1143226D114340 -S31508001990626D0A435A60A26D9A60E26DDA609869D0 -S315080019A0A16E626E1143E26E1143226F1143626F9C -S315080019B011434FF6417202400A43216E42EA014141 -S315080019C09961E16FA26F0A43DA6103F58053996959 -S315080019D043F62372CFF6DE020A40D4F88400D4F820 -S315080019E080100843D4F888100843D4F88C100843AC -S315080019F0D4F890100843D4F894100843D4F89810F3 -S31508001A000843D4F89C100843D4F8A01001430A43AD -S31508001A109A61D4F8A410D4F8A820114341F400011F -S31508001A20D4F8AC201143D4F8B0201143D4F8B82028 -S31508001A300A43D4F8B41042EA81021A60012004E08D -S31508001A40002002E0002000E0002007B0F0BD00BF43 -S31508001A5040B14FF40043C4F202031A6842F0080288 -S31508001A601A6070474FF40043C4F202031A6822F062 -S31508001A7008021A60704700BF40B14FF40043C4F231 -S31508001A8002031A6842F004021A6070474FF40043D2 -S31508001A90C4F202031A6822F004021A60704700BFF3 -S31508001AA04FF41043C4F202031A6842F001021A60A6 -S31508001AB0704700BF4FF41043C4F20203186800F0E1 -S31508001AC0010070474FF41043C4F202039A6942F4C6 -S31508001AD080129A61704700BF40B14FF41043C4F2B8 -S31508001AE002039A6942F400529A6170474FF4104310 -S31508001AF0C4F202039A6922F400529A61704700BF41 -S31508001B0040B14FF41043C4F202039A6942F002024C -S31508001B109A6170474FF41043C4F202039A6922F09F -S31508001B2002029A61704700BF08B50120FFF790FFCF -S31508001B30FFF7C8FF0120FFF79FFF0120FFF7CCFF43 -S31508001B400120FFF7DDFF08BD2DE9F047B2B04FF0E1 -S31508001B50F050012100F00AFB4720012100F006FBA6 -S31508001B604FF48040012100F025FB012000F0F8FB2E -S31508001B708E23309300268DF8C66002248DF8C44063 -S31508001B808DF8C7608DF8C5403746C4F20207384657 -S31508001B9030A900F01BFA384601210B2200F064FA3E -S31508001BA0384621460B2200F05FFA384603210B22FD -S31508001BB000F05AFA384607210B2200F055FA4FF47E -S31508001BC0006330938DF8C6608DF8C4408DF8C76001 -S31508001BD08DF8C5404FF4C057C4F20207384630A9FD -S31508001BE000F0F4F938460B210A4600F03DFA322394 -S31508001BF030938DF8C6608DF8C4408DF8C7608DF8AF -S31508001C00C5404FF40068C4F20208404630A900F007 -S31508001C10DDF9404601210B2200F026FA4046042150 -S31508001C200B2200F021FA404605210B2200F01CFA8F -S31508001C304FF4C04330938DF8C6608DF8C4408DF8D4 -S31508001C40C7608DF8C540384630A900F0BFF9384658 -S31508001C500D210B2200F008FA38460E210B2200F05F -S31508001C6003FAFFF7CDFCFFF71BFFFFF723FF012859 -S31508001C70FBD001A8FFF7D0FC0024019408944FF488 -S31508001C8000730B930C944FF000430F932023129389 -S31508001C901494159416944FF4006309934FF48043F3 -S31508001CA006934FF0020A4FF003094CF2F108C0F20E -S31508001CB0070841F21967C0F22207A6B23046514614 -S31508001CC0FFF7FAFC60F31F4530464946FFF7F4FC78 -S31508001CD060F30F05BD4218BF454503D00134202CDB -S31508001CE0EBD109E0202C07D947F27450C0F6000062 -S31508001CF04FF4A17104F0BAFE01A8A1B2FFF748FD9E -S31508001D0038B947F27450C0F6000040F2471104F0A3 -S31508001D10ADFE41F68063C2F2000341F2D072C2F210 -S31508001D2000029A60DB6000221A605A604FF4104184 -S31508001D30C4F202010B6141F28013C2F2000341F2C0 -S31508001D409010C2F2000098601A60DB605A60402268 -S31508001D505A719A884FF4C86060F30C029A80802200 -S31508001D60DA70CB60FFF7E0FE32B0BDE8F08700BF5F -S31508001D7040F28C53C2F2000308221A7000225A70ED -S31508001D8027229A706922DA705B221A7145225A71E3 -S31508001D90704700BF38B541F28013C2F20003DB7802 -S31508001DA0DB091DD141F28014C2F200046588C5F32F -S31508001DB00D0541F62070C2F2000041F29011C2F200 -S31508001DC000012A4605F01AFBE37843F08003E37026 -S31508001DD04FF41043C4F2020301229A60284638BD24 -S31508001DE0002038BD38B541F68063C2F20003DB78BF -S31508001DF0DB0900D0FEE741F69063C2F200031D88B6 -S31508001E0041F2D074C2F20004204641F62071C2F2B3 -S31508001E1000012A4605F0F2FA41F68063C2F2000391 -S31508001E209C6000221A60102199705A60C5F30B0550 -S31508001E309D80B022DA704FF41043C4F202030122E7 -S31508001E405A6038BD4FF47053C4F202031B69002B65 -S31508001E500DDA4FF47053C4F2020340F22312C4F2AF -S31508001E6067525A6048F6AB12CCF6EF525A60704782 -S31508001E704FF47053C4F202031A6942F000421A6121 -S31508001E80704700BF4FF47053C4F20203D86070471E -S31508001E904FF47053C4F20203DB6813F4803F1BD17E -S31508001EA04FF47053C4F20203DB6813F0100F15D118 -S31508001EB04FF47053C4F20203DB6813F0EF0F0FD12F -S31508001EC04FF47053C4F20203D86800F002000028E9 -S31508001ED00CBF08200720704701207047052070476F -S31508001EE00620704700B583B008238DF80730FFF742 -S31508001EF0CFFF8DF807009DF80730DBB2012B08D11C -S31508001F00FFF7C6FF8DF807009DF80730DBB2012BF7 -S31508001F10F6D09DF8070003B05DF804FB70B50546DA -S31508001F20002659B1012908BF4FF4807606D0022948 -S31508001F3014BF4FF440764FF40076FFE7FFF7D2FF61 -S31508001F40082821D14FF47054C4F20204236923F4FB -S31508001F504073236123691E432661236923F0F8032E -S31508001F602361236943F002031D432561236943F472 -S31508001F7080332361FFF7B6FF236923F00203236149 -S31508001F80236923F0F803236170BD00BF70B50546C9 -S31508001F900E46FFF7A7FF082816D14FF47054C4F26F -S31508001FA00204236923F440732361236943F400730D -S31508001FB02361236943F0010323612E60FFF792FF33 -S31508001FC0236923F00103236170BD00BFF0B4002329 -S31508001FD00125032605FA03F20C681440944238D109 -S31508001FE007685A0006FA02F4E443274007600768C0 -S31508001FF091F804C00CFA02FC4CEA070707600F794F -S31508002000013FFFB2012F16D887683C408460876875 -S315080020104C7994403C43846047689CB205FA04FCBA -S3150800202027EA0C074760476891F806C00CFA04F4DB -S31508002030A4B23C434460C7689CB2640006FA04F440 -S3150800204027EA0404C460C468CF7907FA02F2224377 -S31508002050C2600133102BBDD1F0BC70470369194229 -S315080020600CBF00200120704710B401F007039B0045 -S31508002070C90800EB8100046A0F21994024EA01018E -S315080020800162016A9A40114301625DF8044B704788 -S3150800209010B44FF46053C4F202039B6803F00C03B8 -S315080020A0042B09D0082B0DD0002B36D14FF4105332 -S315080020B0C0F2F403036035E04FF4D853C0F2B70317 -S315080020C003602FE04FF46053C4F202035C685A6859 -S315080020D002F03F0214F4800F4FF46053C4F2020377 -S315080020E05B68C3F3881319BF4FF4D854C0F2B7041A -S315080020F04FF41054C0F2F404B4FBF2F101FB03F1FF -S315080021004FF46053C4F202035A68C2F30142013223 -S315080021105200B1FBF2F3036004E04FF41053C0F22F -S31508002120F40303604FF46052C4F202029168C1F3EB -S31508002130031140F20803C2F20003595CC9B20468ED -S3150800214024FA01F141609468C4F382241C5DE4B268 -S3150800215021FA04F484609268C2F342329B5CDBB2D3 -S31508002160D940C1605DF8044B704700BF39B14FF4E0 -S315080021706053C4F202031A6B1043186370474FF496 -S315080021806053C4F202031A6B22EA00001863704710 -S3150800219039B14FF46053C4F202031A6C1043186441 -S315080021A070474FF46053C4F202031A6C22EA000027 -S315080021B01864704739B14FF46053C4F202035A6C7D -S315080021C01043586470474FF46053C4F202035A6CC4 -S315080021D022EA00005864704739B14FF46053C4F2DC -S315080021E002031A691043186170474FF46053C4F22A -S315080021F002031A6922EA00001861704739B14FF4E0 -S315080022006053C4F202035A6A1043586270474FF487 -S315080022106053C4F202035A6A22EA00005862704701 -S3150800222008B54FF400600121FFF7E8FF4FF400609E -S315080022300021FFF7E3FF08BD10B44FF43053C4F292 -S3150800224001035C68416882681143C26811430268E9 -S31508002250114302690A4324F4FD4424F07F0422430F -S31508002260017D0A435A605DF8044B704748F2A003A3 -S31508002270C4F22523186070474FF43053C4F20103A3 -S31508002280186070474FF43053C4F20103186800F021 -S315080022900300704710B402684FF43053C4F20103C8 -S315080022A09A60DC6824F4FF6424F0070482684168B5 -S315080022B01143C2680A43006902432243DA605DF8A3 -S315080022C0044B70474FF43053C4F201031869C0B287 -S315080022D0704700BF82B00023019342F61443C4F24C -S315080022E0010303440193019B186802B0704700BFBD -S315080022F010B402684FF43053C4F201035A624268BC -S315080023009A62DC6A24F0F704C2688168114302699C -S315080023100A43406902432243DA625DF8044B704778 -S315080023204FF43053C4F20103D3F88000704700BF5E -S315080023304FF43053C4F20103C3F88000704700BF5E -S315080023404FF43053C4F201035B6B18420CBF0020F4 -S31508002350012070474FF43053C4F201039863704765 -S31508002360DC23C4F227231860704700BF30B585B058 -S3150800237004460D46038A23F440531B041B0CCA88E3 -S3150800238013430382838923F4B05323F00C031B04FD -S315080023901B0C0989AA880A4369890A4392B213431E -S315080023A08381838A23F440731B041B0CAA89134375 -S315080023B083826846FFF76CFE4FF4A052C4F201020E -S315080023C04FF48053C4F201039C4218BF94420CBFD9 -S315080023D0039A029AA3891BB2002B02EB820202EB34 -S315080023E08202BDBF2B685B00B2FBF3F22968A4BF6B -S315080023F08900B2FBF1F248F21F53C5F2EB13A3FBB7 -S3150800240002135B091D01642003FB1023A08900B297 -S3150800241000280BDADB00323348F21F51C5F2EB1104 -S31508002420A1FB0321C1F3421129430AE01B01323300 -S3150800243048F21F51C5F2EB11A1FB0321C1F3431169 -S31508002440294389B2218105B030BD00BF29B18389EE -S315080024509BB243F4005383817047838923F4005366 -S315080024601B041B0C83817047C1F3080181807047E8 -S315080024708088C0F308007047038819420CBF002003 -S315080024800120704782B04FF46053C4F202031A6801 -S3150800249042F001021A6000229A60196821F08471DC -S315080024A021F48031196043F21001C2F200415960EB -S315080024B0196821F480211960DA60009201921A687D -S315080024C042F480321A604FF46052C4F20202136872 -S315080024D003F400330193009B01330093019B1BB95E -S315080024E0009BB3F5A06FF2D14FF46053C4F2020318 -S315080024F01B6813F4003F14BF012300230193019BBB -S31508002500012B46D14FF46053C4F202031A6C42F011 -S3150800251080521A644FF4E042C4F20002116841F492 -S31508002520404111609A689A609A6842F400429A603B -S315080025309A6842F4A0529A6045F20C42C0F2407280 -S315080025405A601A6842F080721A604FF46052C4F2F8 -S315080025500202136813F0007FFBD04FF47053C4F2E5 -S31508002560020340F205621A604FF46053C4F2020394 -S315080025709A6822F003029A609A6842F002029A6008 -S315080025804FF46052C4F20202936803F00C03082B5E -S31508002590FAD14FF46D43CEF200034FF000629A6011 -S315080025A002B0704732B1821811F8013B00F8013BBE -S315080025B09042F9D1704700BFCA7E8B7E43EA022358 -S315080025C00278032A01BF487D0A7D42EA002243EACF -S315080025D002431846704700BF00F10B010023DA01D9 -S315080025E042EA530310F8012B52FA83F3DBB288420E -S315080025F0F5D11846704700BF10B504460A4640781C -S3150800260004F134010123FEF75DFFD0BB94F83322B1 -S3150800261094F8323243EA022212B24AF65523CFF62A -S31508002620FF739A422FD194F86D2094F86C301B04EE -S3150800263043EA026294F86A30134394F86B2043EA3B -S31508002640022222F07F4244F24613C0F254039A4211 -S315080026501BD094F8890094F888301B0443EA00607C -S3150800266094F88630034394F8870043EA002020F064 -S315080026707F4044F24613C0F25403C01A18BF012023 -S3150800268010BD032010BD022010BD002010BD00BFE4 -S315080026902DE9F041044603791BB3056B00F13407B5 -S315080026A0407839462A460123FEF73EFFE0B9002363 -S315080026B02371636A9D421AD3E26913449D4219D273 -S315080026C0E678012E19D94FF00108E26915446078B9 -S315080026D039462A464346FEF727FF013E012EF4D126 -S315080026E00EE00020BDE8F0810120BDE8F081002061 -S315080026F0BDE8F0810020BDE8F0810020BDE8F0814A -S315080027000020BDE8F08100BF38B504460D46036BCE -S315080027108B420CD0FFF7BCFF58B9607804F134013E -S315080027202A460123FEF7CEFE28B9256338BD0020C8 -S3150800273038BD012038BD012038BD00BF08B588B1B5 -S3150800274003688BB1197889B1D988828891420FD1EB -S315080027505878FEF79DFE00F00100002814BF0320FC -S31508002760002008BD092008BD092008BD092008BDAC -S31508002770092008BD2DE9F041154603681C78303C50 -S31508002780092C00F2B5815A783A2A40F0B181023311 -S31508002790036000230B60002C40F0718140F27C53EB -S315080027A0C2F200031C68002C00F06C810C602378D0 -S315080027B08BB16078FEF76CFE10F0010F0BD1002D7F -S315080027C000F0638100F00400C0B2002814BF0A209C -S315080027D00020BDE8F081002020706070FEF73CFE06 -S315080027E010F0010F40F054811DB110F0040F40F0B5 -S315080027F0528120460021FFF7FFFE012818BF002559 -S3150800280017D194F8F631002B00F0488194F8FD2191 -S3150800281094F8FC311B0443EA026294F8FA31134334 -S3150800282094F8FB5143EA052520462946FFF7E4FEBE -S31508002830FFE7032800F03581002840F0358194F839 -S31508002840402094F83F3043EA02231BB2B3F5007FD9 -S3150800285040F02D8194F84B0094F84A3053EA002052 -S315080028600DD194F85B2094F85A301B0443EA0262AF -S3150800287094F85830134394F8590043EA0020E0616D -S3150800288094F84410E1704B1EDBB2012B00F2128162 -S3150800289094F84130A370002B00F00F815A1E1A429B -S315080028A040F00E8194F8466094F8452042EA0622E4 -S315080028B0228112F00F0F40F0068194F8487094F8C0 -S315080028C0476056EA07260DD194F8577094F8566073 -S315080028D0360446EA076794F854603E4394F8557000 -S315080028E046EA072694F843C094F8427057EA0C273C -S315080028F000F0EC8001FB00FC07EB121161448E42EC -S31508002900C0F0E780761AB6FBF3F3002B00F0E480FC -S3150800291040F6F576B3428CBF022601264FF6F578C7 -S31508002920434500F2E8800233A36125622F446762BB -S315080029302944E162032E13D1002A40F0D08094F88E -S31508002940631094F86220120442EA016194F8602048 -S315080029500A4394F8611042EA0122A2629B000EE043 -S31508002960002A00F0BF806744A762022E0FBF5B00F3 -S3150800297003225A4303F0010318BF03EB520303F281 -S31508002980FF13B0EB532FC0F0B0804FF0FF33236135 -S315080029900023E360032E63D1637194F8652094F8ED -S315080029A0643043EA02222A446261607804F1340101 -S315080029B00123FEF787FD002852D194F8332294F8B4 -S315080029C0323243EA022212B24AF65523CFF6FF7391 -S315080029D09A4245D194F8372094F836301B0443EAD6 -S315080029E0026294F83430134394F8352043EA0222FD -S315080029F045F25223C4F261139A4231D194F81B224C -S31508002A0094F81A321B0443EA026294F81832134304 -S31508002A1094F8192243EA022247F27223C6F24113B6 -S31508002A209A421DD194F8232294F822321B0443EAD1 -S31508002A30026294F82032134394F8212243EA0223CF -S31508002A40E36094F81F2294F81E321B0443EA0262DC -S31508002A5094F81C32134394F81D2243EA0223236197 -S31508002A60267040F27853C2F200031A88013292B2F5 -S31508002A701A80E280002020632071BDE8F0810B20D7 -S31508002A80BDE8F0810C20BDE8F0810020BDE8F081AA -S31508002A900320BDE8F0810A20BDE8F0810D20BDE8DD -S31508002AA0F0810120BDE8F0810D20BDE8F0810D2000 -S31508002AB0BDE8F0810D20BDE8F0810D20BDE8F0816C -S31508002AC00D20BDE8F0810D20BDE8F0810D20BDE8A0 -S31508002AD0F0810D20BDE8F0810D20BDE8F0810D20C4 -S31508002AE0BDE8F0810D20BDE8F0810D20BDE8F0813C -S31508002AF000230B6052E60233A36125622F44676206 -S31508002B002944E162032617E72DE9F0410D4601F154 -S31508002B1009020369002B5ED0416991F80C800B7895 -S31508002B20202B1BD00E46002408F00807FFB203E04E -S31508002B3016F8013F202B11D0052B08BFE52347B116 -S31508002B40A3F1410C5FFA8CFCBCF1190F9CBF203332 -S31508002B50DBB202F8013B0134082CE9D10B7A202BB1 -S31508002B6022D0561C2E2313700B7A202B1BD001F172 -S31508002B700804171D324608F010085FFA88F603E0C5 -S31508002B8014F8013F202B0FD046B1A3F1410C5FFA90 -S31508002B908CFCBCF1190F9CBF2033DBB202F8013B59 -S31508002BA0BA42EDD100E03246CB7A2B72CC7F8B7FCE -S31508002BB01B0443EA04630C7F23434C7F43EA042344 -S31508002BC02B604C7E0B7E43EA0423AB80CC7D8B7D49 -S31508002BD043EA0423EB8000231370AE6946B3EB691E -S31508002BE033B3036900240BB3028C4FF6FF739A4282 -S31508002BF008BF00241AD0C769388890B10024A046B7 -S31508002C00414601F02BFC70B1EA69013AA2420CD99F -S31508002C100134321902F8010C37F8020F0028EFD1F7 -S31508002C2004E0002402E0002400E0002400233355D9 -S31508002C30BDE8F08110B50446FFF72AFD03460028D3 -S31508002C4054D12378032B49D16379002B46D000232E -S31508002C50236304F1340104F50D700B46002203F8D2 -S31508002C60012B8342FBD1552384F83232AA2384F8F8 -S31508002C703332522384F8343084F83530612384F8AB -S31508002C803630412284F83720722084F8180284F8F6 -S31508002C90190284F81A2284F81B32236984F81C3234 -S31508002CA0C3F3072284F81D221A0C84F81E221B0E71 -S31508002CB084F81F32E36884F82032C3F3072284F8C5 -S31508002CC021221A0C84F822221B0E84F823326078FB -S31508002CD062690123FEF728FC0023637160780021EE -S31508002CE00A46FEF757FC031C18BF0123184610BDF9 -S31508002CF002398369023B99423DBF8278C36A02FB67 -S31508002D0001300020704700BFF8B505460C4601297A -S31508002D105CD9836999425BD20378022B28D0032BAE -S31508002D2038D0012B56D101EB5106416A01EB5621E9 -S31508002D30FFF7EAFC002850D1C6F308032B4493F8A2 -S31508002D4034700136696A284601EB5621FFF7DCFC28 -S31508002D50002845D1C6F30806354495F8340047EAF5 -S31508002D60002014F0010F14BF0009C0F30B00F8BDD2 -S31508002D70416A01EB1421FFF7C7FCA0BB640004F409 -S31508002D80FF742B1993F834302C4494F8350043EA31 -S31508002D900020F8BD416A01EBD411FFF7B5FC28BB4A -S31508002DA0A40004F4FE742B1993F8360093F8372020 -S31508002DB0120642EA004293F8350042EA00202C4403 -S31508002DC094F83430184320F07040F8BD0120F8BD5F -S31508002DD00120F8BD4FF0FF30F8BD4FF0FF30F8BDC9 -S31508002DE04FF0FF30F8BD4FF0FF30F8BD4FF0FF3021 -S31508002DF0F8BD00BF70B504460D46E180816801291B -S31508002E0038D003689A69914236D271B91A78032A7A -S31508002E1001D1996A49B90022E2601A89AA422DD9D4 -S31508002E209B6A03EB151323611BE09E783601B542B6 -S31508002E3010D32068FFF768FF0146B0F1FF3F1FD0A7 -S31508002E4001281FD923689B6998421DD2AD1BADB2D4 -S31508002E50AE42EED9E1602068FFF74AFF00EB151095 -S31508002E60206105F00F05236803EB451334336361CE -S31508002E70002070BD022070BD022070BD022070BD0A -S31508002E80012070BD022070BD022070BDF8B5054650 -S31508002E900C461646012998BF02237CD983699942B4 -S31508002EA028BF022377D20378022B40D0032B50D0B9 -S31508002EB0012B18BF02236BD101EB5107416A01EBC5 -S31508002EC05721FFF721FC0346002861D1C7F3080301 -S31508002ED014F001041FBFEA1892F8342002F00F021A -S31508002EE0F1B21ABF42EA0112D2B2F2B22B4483F807 -S31508002EF03420013701232B71696A284601EB5721D3 -S31508002F00FFF702FC0346002842D1C7F3080714B1AD -S31508002F10C6F3071607E0EA1992F8342022F00F02E2 -S31508002F20C6F3032616432F4487F8346030E0416A17 -S31508002F3001EB1421FFF7E8FB034648BB640004F4E1 -S31508002F40FF742A1982F83460C6F3072682F83560BA -S31508002F501EE0416A01EBD411FFF7D6FB0346B8B968 -S31508002F60A40004F4FE742A1992F8371009062C44B2 -S31508002F7001F070410E4384F83460C6F3072182F8E5 -S31508002F803510310C82F83610360E82F83760FFE7B6 -S31508002F9001222A71FFE71846F8BD00BF2DE9F04166 -S31508002FA00546884631B9C66876B183699E4228BF08 -S31508002FB001260AE0FFF7A8FE012847D9AB6998421F -S31508002FC028BF464601D24DE0012634460227013481 -S31508002FD0AB699C4202D3012E3BD93C462846214682 -S31508002FE0FFF792FE38B1B0F1FF3F18BF012833D082 -S31508002FF0B442ECD132E02646284621466FF07042AC -S31508003000FFF744FF0346D0F1010038BF0020B8F1AE -S31508003010000F08BF002028B1284641462246FFF780 -S3150800302035FF03465BB9EE602B69B3F1FF3F18D055 -S31508003030013B2B6101236B712046BDE8F081012B12 -S3150800304014BF01204FF0FF30BDE8F0810120BDE834 -S31508003050F0810020BDE8F081BDE8F0810020BDE8E0 -S31508003060F0812046BDE8F0812DE9F84304460E4676 -S31508003070C5880135ADB2002D6AD00369002B6AD028 -S3150800308015F00F075BD101330361C16821B90368E5 -S315080030901B89AB4262D952E000688378013B13EA88 -S315080030A015134CD1FFF730FE8046012859D9B0F1E7 -S315080030B0FF3F59D020688369984539D3002E56D0EA -S315080030C0E168FFF76BFF8046002853D0012854D0EB -S315080030D0B0F1FF3F54D02068FFF7DAFA002852D142 -S315080030E0236803F1340100231A46CA540133B3F5A1 -S315080030F0007FFAD1266830464146FFF7F9FD30636E -S3150800310000264FF001090CE083F804902068FFF7C9 -S31508003110BFFA00283AD123681A6B01321A630136BE -S31508003120F6B223689A78B242EED81A6B921B1A63E3 -S31508003130C4F80C8020684146FFF7DAFD2061E58077 -S31508003140236803EB4713343363610020BDE8F88333 -S315080031500420BDE8F8830420BDE8F8830420BDE810 -S31508003160F8830220BDE8F8830120BDE8F88304202F -S31508003170BDE8F8830720BDE8F8830220BDE8F88398 -S315080031800120BDE8F8830120BDE8F8830120BDE8E9 -S31508003190F88300BF2DE9F04F89B005460021FFF7F7 -S315080031A029FE002840F0AC804FF0FF09C8464F467C -S315080031B047F21C61C0F60001029101F10C0204926B -S315080031C04FF6FF7A4FF0000B28682969FFF79CFA3B -S315080031D0002840F096806C692678002E00F09280D0 -S315080031E0E37A03F03F02E52E7FD013F0080F04D0F0 -S315080031F00F2A18BFB8467BD101E00F2A58D1EB69D0 -S315080032000193002B74D016F0400F06D094F80D9059 -S3150800321006F0BF06EB882B8403E0B04518BFB84616 -S3150800322066D1617B0391494518BFB84660D12378BA -S3150800323023F04003013B03EB430203EB82020592B2 -S31508003240029A02F1FF394FF001080796059E069586 -S315080032504546DDF8108019F8013FE2185078E35C1E -S3150800326043EA00207DB101F01FF90546FE2E56D827 -S31508003270731C0593019931F8160001F015F985427A -S315080032804FD1059E01E050454DD1C145E3D1A84631 -S315080032900596079E069D237813F0400F39D0B8F19E -S315080032A0000F36D0059A019931F812308BB33BE0FE -S315080032B0B8F1000F04D12046FFF78EF9484523D010 -S315080032C0A5F820A0AB69DA7A12F0010F08BF04F15D -S315080032D00B0002D00BE0844218D014F8011B13F837 -S315080032E0012B9142F7D0B84602E0B84600E0B8464E -S315080032F028465946FFF7B8FE00283FF465AF07E0B1 -S3150800330016E015E0042013E0002011E000200FE08D -S315080033100EE0013E5FFA86F8DDF80C90E8E7069DB8 -S3150800332002E0069D00E0069DDDF80C90B846DFE752 -S3150800333009B0BDE8F08F00BF2DE9F04F87B0814690 -S3150800334088460B782F2B18BF5C2B08BF01F10108A4 -S315080033500023836098F800301F2B07D80021FFF759 -S3150800336049FD03460022C9F814207AE14FF0010A04 -S3150800337047F2885BC0F6000B47F29451C0F600018D -S31508003380049147F29C52C0F60002059298F8003064 -S315080033902F2B18BF5C2B08D108F10103984613F8A8 -S315080033A0012B2F2A18BF5C2AF8D0D9F81C5098F898 -S315080033B000002F2818BF1F282CD95C2800F02D8163 -S315080033C0AF1E4646544607E05C2B00F02881B2F54E -S315080033D0807F00F041811446514601F03FF80146CE -S315080033E0002800F039817F2809D8222900F0348185 -S315080033F05A4612F8013F13B19842FAD12CE127F840 -S31508003400021F621C16F8013F18462F2B18BF1F2BE8 -S31508003410DAD801E00024524690441F2898BF0426B3 -S3150800342001D90026FFE7002C00F0168104F10043BD -S31508003430013B5A0035F813302E2B18BF202B40F0CD -S31508003440F080931C2B4407E033F8042C023B2E2A09 -S3150800345018BF202A40F0E580013CF5D1FCE003F8CE -S31508003460011B8342FBD12B88202B18BF2E2B40F043 -S31508003470E48028460023013330F8021F202918BFAC -S315080034802E29F8D0002B00F0D98046F00306D5E0A7 -S31508003490013C05D10821039100220192029205E020 -S315080034A0023A32F8021C2E29F2D1F3E75F1C35F8EE -S315080034B01300002861D0202808D0E31B18BF012379 -S315080034C02E2814BF002203F001021AB146F00306A3 -S315080034D03B46EBE7019A0399BC4218BF8A4214D3CC -S315080034E00B2903D146F00306029A49E00BB146F0D0 -S315080034F00306A74243D8029A9300DBB202932346F7 -S315080035000B21039108220192D0E77F280DD90021CB -S3150800351000F0A4FF0346002800F0A08005990B449C -S3150800352013F8800C46F0020650B101462B2807D046 -S31508003530049A12F8013F002B00F087809942F8D1CF -S3150800354046F003065F2010E0029A42F00202029259 -S315080035500BE0A0F161039BB2192B9FBF029B43F0BE -S3150800356001030293203898BF80B2D9F81830019920 -S3150800357058543B460131019198E7029A00E0029AB5 -S31508003580D9F818301978E52904BF05211970039B65 -S31508003590082B02BF9200D2B20292029901F00C03E4 -S315080035A00C2B03D001F00302032A01D146F00206D0 -S315080035B016F0020F0AD1029901F00302012A08BF88 -S315080035C046F01006042B08BF46F00806D9F818304E -S315080035D0DE724846FFF7DEFDD9F81830DA7A034678 -S315080035E048B104283DD102F00403DBB2002B14BF16 -S315080035F00346052335E012F0040F32D1D9F814102A -S31508003600CB7A13F0100F06D0D9F80000FEF7D4FFD6 -S31508003610C9F80800BAE6052323E000245246904478 -S31508003620FFE66700EA194FF0000325F81430D9F8C9 -S31508003630183003F10B00202111E700232F4437F837 -S31508003640021C2E293FF426AF22E7A0F141039BB2C4 -S31508003650192B7FF679AF7CE7062302E046F00206CF -S315080036606EE7184607B0BDE8F08F00BF2DE9F04FAA -S3150800367083B0044689464FF0FF0B5E460425D846BC -S3150800368047F21C6AC0F6000A0AF10C0300930027E9 -S3150800369070E02068FFF738F8054600286ED16269A1 -S315080036A01378002B74D0D17AE52B18BF2E2B59D05E -S315080036B001F03F01082914BF00200120484518BF22 -S315080036C0464651D10F2943D113F0400F06D092F840 -S315080036D00DB003F0BF03E188218403E09E4218BFC2 -S315080036E0464641D192F80DE0DE4518BF46463BD125 -S315080036F0D4F81CC0117801F03F01013901EB4105EE -S3150800370001EB85050AF1FF3101260193DDF800B0CA -S3150800371011F8013FD0184078D35C43EA002036B14F -S31508003720FE2D32D82CF815000646013503E04FF673 -S31508003730FF73984229D15945EAD1019B127812F0B4 -S31508003740400F1ED0FE2D98BF2CF8157019D91CE015 -S3150800375010461EB9FEF740FF58451BD04FF6FF73BB -S31508003760238417E04646FFE720463946FFF77CFCE8 -S31508003770054618B9216900298BD15DB1002323615B -S3150800378008E0013BDEB2F346EEE7F3464646EBE7D2 -S315080037900425F3E7284603B0BDE8F08F2DE9F0418C -S315080037A00446C588018C4FF6FF73994208BF29461F -S315080037B0FFF720FB0346D0B9E52701264FF000089E -S315080037C020682169FEF7A0FF034668B96269177089 -S315080037D022681671E288AA4209D220464146FFF7B6 -S315080037E043FC03460028EBD0042B08BF02231846E7 -S315080037F0BDE8F0812DE9F04104460E46012998BF3F -S3150800380002212BD983699E4228BF022126D200278E -S315080038104FF0010820463146FFF776FA0546C0B153 -S31508003820012818D0B0F1FF3F17D0204631463A4656 -S31508003830FFF72CFB014688B92369B3F1FF3F1EBF8A -S315080038400133236184F80580A369AB4206D92E4665 -S31508003850E0E7002102E0022100E001210846BDE878 -S31508003860F08100BF70B582B0054616461C460B228D -S31508003870FEF798FE052C0BD9B21EE30343EA54045F -S3150800388032F8023F13FA84F4A4B25388002BF4D119 -S31508003890072204F00F0101F13003392B88BF01F12B -S315080038A03703013A00A911444B702409F1D1144693 -S315080038B07E2102AB134403F8081C62B12B78202B37 -S315080038C00BD0294600230133A34207D011F8010F74 -S315080038D02028F8D102E0002300E000232020072A50 -S315080038E09FBF02A9891811F8081C013288BF014632 -S315080038F0E9540133072BF2D902B070BD2DE9F04F18 -S3150800390087B004468769C66903A839460C22FEF7BC -S3150800391049FE9DF8173013F0010F21D00023FB72E2 -S31508003920E3610125384603A932462B46FFF79AFF7D -S315080039302046FFF72FFC034620B90135ADB2642DAA -S31508003940F0D1D5E0642D08BF072000F0EF80042BE6 -S3150800395018BF184640F0EA809DF81730FB72E661FA -S315080039609DF8173013F0020F08BF012716D03388C9 -S315080039703BB1002301339BB236F81320002AF9D154 -S3150800398000E0002319334EF64F42C4F6C46282FBA8 -S315080039900317DB17C3EBA707BFB2FFE720460021D3 -S315080039A0FFF728FA0346002840F0BF800025A846FE -S315080039B0012620682169FEF7A7FE0346002840F085 -S315080039C0B48063691B78E52B18BF002B03D101353A -S315080039D0AF4201D18EE0454620463146FFF744FB0B -S315080039E003460028E5D0A0E0E188C9EB010120469E -S315080039F089B2FFF7FFF90346002840F09680A069D0 -S31508003A00FEF7EAFD01904FF000084FF6FF7547F202 -S31508003A101C66C0F60006FF2720682169FEF774FEBB -S31508003A200346002840F08180D4F81CA061695FFA3B -S31508003A3089FB019A4A734FF00F03CB7281F80C8009 -S31508003A4081F81A8081F81B800BF1FF3303EB4300E2 -S31508003A5003EB80000122434602E070462B46013202 -S31508003A60AB424ED000F1010E3AF81030B01810F8FB -S31508003A70010C0B5408444FEA132C80F801C0002BA4 -S31508003A8049D070460C2AEAD9AB4202D03AF810302F -S31508003A900BB94BF0400B81F800B023684FF00101D9 -S31508003AA0197120464146FFF7DFFA034600283CD144 -S31508003AB009F1FF391FFA89F9B9F1000FACD12DE0E8 -S31508003AC0636903F12001002203F8012B8B42FBD125 -S31508003AD06069A1690B22FEF765FD6369A269D27A5E -S31508003AE002F018021A73236801221A7100201DE0D9 -S31508003AF007201BE0013F1FFA87F9B9F1000F0DD027 -S31508003B0072E706EB020E1EF801EC01F80E708E4401 -S31508003B108EF80170B6E70C2A9FD9BAE720682169A2 -S31508003B20FEF7F2FD0028CBD000E0184607B0BDE846 -S31508003B30F08F00BF88B940F27C53C2F200031B68BD -S31508003B400BB100221A7009B100230B7040F27C53A6 -S31508003B50C2F200031960002070470B20704700BFAF -S31508003B602DE9F0438FB0019115460446002800F070 -S31508003B7094800023036001A805A902F01E02FEF73F -S31508003B80F9FD002840F08B8005F01F0702AB0B9368 -S31508003B9040F27833C2F200030C9305A80199FFF7A7 -S31508003BA0CBFB0A9E034600287FD1002E78D17BE006 -S31508003BB05BB1042B40F0858005A8FFF79FFE47F010 -S31508003BC008070A9E034638B17BE0F37A13F0110F13 -S31508003BD070D115F0040F6FD117F0080F3CD0FDF720 -S31508003BE00BFDB073C0F30723F373030C3374000E95 -S31508003BF070740025F57235777577B577F577DDF842 -S31508003C00148040463146FEF7D7FCB576F57635750D -S31508003C107575012388F804300546E8B1D8F8309060 -S31508003C2040462946FFF7E6FD0346002849D1059890 -S31508003C30013DC5604946FEF767FD03460AE0F37A8B -S31508003C4013F0100F3AD115F0020F05D013F0010F3B -S31508003C5036D101E0002B34D117F0080F18BF47F012 -S31508003C602007059D2B6BE3612662A771284631461E -S31508003C70FEF7A2FC2061F27FB37F1B0443EA0263CE -S31508003C80327F1343727F43EA0223E3600020A06079 -S31508003C90A0612560EB88A38014E0092012E011E0FA -S31508003CA015F01C0F91D1CAE7062315F01C0F7FF4F7 -S31508003CB07FAFCFE7072304E0082302E0042300E0F0 -S31508003CC0072318460FB0BDE8F08300BF2DE9F04F73 -S31508003CD083B004460F4690461E4600233360FEF71F -S31508003CE02DFD002840F0BF80A37913F0800F18BF80 -S31508003CF0022040F0BC8013F0010F08BF072000F037 -S31508003D00B680E568A368ED1AA84538BF4546002D74 -S31508003D1000F0AA8004F124030193A368C3F3080200 -S31508003D20002A40F08680206890F802A00AF1FF3A3F -S31508003D300AEA532A1AF0FF0A17D10BB9206902E0DA -S31508003D406169FEF7E1FF012805D8A37963F07F03CF -S31508003D50A37102208BE0B0F1FF3F05D1A37963F090 -S31508003D607F03A371012082E06061D4F80080404699 -S31508003D706169FEF7BDFF814628B9A37963F07F0321 -S31508003D80A371022073E0D1445FEA552B29D098F835 -S31508003D9002300BEB0A029A4288BFCAEB030B98F86B -S31508003DA0010039464A465FFA8BF3FDF78BFB28B1CB -S31508003DB0A37963F07F03A371012058E0A37913F078 -S31508003DC0400F0BD0A369C9EB0300834506D907EB5F -S31508003DD0402001994FF40072FEF7E4FB4FEA4B2BA3 -S31508003DE035E0A2694A4522D0A37913F0400F10D0D6 -S31508003DF098F8010001990123FDF796FB28B1A379EC -S31508003E0063F07F03A371012031E0A37923F0400317 -S31508003E10A3712368587801994A460123FDF752FB96 -S31508003E2028B1A37963F07F03A37101201FE0C4F8CA -S31508003E301890A168C1F30801C1F5007B5D4538BF3C -S31508003E40AB462144384624315A46FEF7ABFB5F445D -S31508003E50A3685B44A36033685B443360B5EB0B052A -S31508003E607FF45BAF02E002E0002000E0002003B030 -S31508003E70BDE8F08F2DE9F04F83B004460F4615468E -S31508003E801E4600233360FEF759FC002840F0DA800E -S31508003E90A37913F0800F18BF022040F0D48013F0E6 -S31508003EA0020F08BF072000F0CE80E368DD4280F0ED -S31508003EB0BE80002D00F0BB8004F124030193A368A3 -S31508003EC0C3F30802002A40F09580206890F802B0F3 -S31508003ED00BF1FF3B0BEA532B1BF0FF0B21D13BB930 -S31508003EE0236963B90021FFF759F80346206103E007 -S31508003EF06169FFF753F80346002B00F09880012B01 -S31508003F0005D1A37963F07F03A37102209BE0B3F187 -S31508003F10FF3F05D1A37963F07F03A371012092E0E7 -S31508003F206361A37913F0400F11D02368587801997B -S31508003F30A2690123FDF7F8FA28B1A37963F07F0394 -S31508003F40A37101207FE0A37923F04003A371D4F87D -S31508003F50008040466169FEF7CBFE814628B9A37901 -S31508003F6063F07F03A37102206DE0D9445FEA552A06 -S31508003F7029D098F802300AEB0B029A4288BFCBEB9D -S31508003F80030A98F8010039464A465FFA8AF3FDF7AC -S31508003F90CBFA28B1A37963F07F03A371012052E01D -S31508003FA0A369C9EB03018A450AD9019807EB4121A0 -S31508003FB04FF40072FEF7F6FAA37923F04003A371D3 -S31508003FC04FEA4A2A28E0A3694B4511D0A268E3685C -S31508003FD09A420DD298F8010001994A460123FDF745 -S31508003FE071FA28B1A37963F07F03A37101202AE04F -S31508003FF0C4F81890A068C0F30800C0F5007A5545C3 -S3150800400038BFAA462044243039465246FEF7CAFA33 -S31508004010A37943F04003A3715744A3685344A360AC -S31508004020336853443360B5EB0A057FF448AFA36899 -S31508004030E268934288BFE360A37943F02003A37143 -S31508004040002000E0FFE703B0BDE8F08F38B504466E -S31508004050FEF774FB002849D1A37913F0200F46D048 -S3150800406013F0400F0DD0214651F8243B5878A26929 -S315080040700123FDF759FA00283BD1A37923F0400321 -S31508004080A3712068E169FEF73FFB002833D1256A52 -S31508004090EB7A43F02003EB72E3682B77A3891B0ABC -S315080040A06B77E389AB77E37BEB772369AB76C3F36F -S315080040B00722EA761B0C2B751B0A6B75FDF79CFA13 -S315080040C0A875C0F30723EB75030C2B76000E6876EC -S315080040D00023AB74EB74A37923F02003A371236840 -S315080040E001221A712068FEF7A5FD38BD38BD0020EB -S315080040F038BD012038BD38BD10B50446FFF7A6FF08 -S31508004100034608B900222260184610BD70B5044659 -S315080041100D46FEF713FB002840F0BD80A37913F087 -S31508004120800F40F0B980E268AA4205D203F0020384 -S31508004130DBB2002B08BF1546A2680023A360002D3A -S3150800414000F0AC802068867876026AB1013A691E6A -S31508004150B1FBF6F1B2FBF6F3994205D373421A4066 -S31508004160A260AD1A616918E02169A9B9FEF716FFC0 -S315080041700146012805D1A37963F07F03A3710220C4 -S3150800418070BDB0F1FF3F18BF206105D1A37963F078 -S315080041907F03A371012070BD6161002940D0B5423B -S315080041A02BD9A27912F0020F05D02068FEF7F6FE89 -S315080041B0014620B920E02068FEF7A6FD0146B1F1C8 -S315080041C0FF3F05D1A37963F07F03A371012070BD7A -S315080041D0012903D922689269914205D3A37963F02C -S315080041E07F03A371022070BD6161A2683244A26098 -S315080041F0AD1BAE42D5D300E03546A2682A44A2607C -S31508004200C5F3080272B12068FEF772FD28B9A379D2 -S3150800421063F07F03A371022070BD00EB552502E011 -S31508004220002500E00025A368C3F3080343B3A26989 -S31508004230AA4225D0A37913F0400F11D0214651F890 -S31508004240243B58780123FDF76FF928B1A37963F069 -S315080042507F03A371012070BDA37923F04003A371E6 -S31508004260214651F8243B58782A460123FDF72AF9B6 -S3150800427028B1A37963F07F03A371012070BDA561FE -S31508004280A368E26893420BD9E360A37943F020035D -S31508004290A371002070BD70BD022070BD002070BDE6 -S315080042A0002070BD30B58FB00EAB43F8340D0D4607 -S315080042B0184605A90022FEF75DFA0446A0B902AB26 -S315080042C00B9340F27833C2F200030C9305A80199C8 -S315080042D0FFF732F8044638B90A9B23B105A82946E0 -S315080042E0FEF712FC00E0062420460FB030BD00BFE2 -S315080042F030B599B018AB43F85C0D18460FA90122E2 -S31508004300FEF738FA034600284DD103AB159340F261 -S315080043107833C2F2000316930FA80199FFF70CF839 -S31508004320034600283FD11499062300293BD0CC7AAE -S3150800433014F0010F18BF072335D124E0012D98BFCB -S31508004340022330D906A80FA92422FEF72BF90895CF -S3150800435006A80221FEF74EFD034620BB06A800214B -S31508004360FFF784F90346E8B1042814D01BE02DB101 -S315080043700F982946FFF73EFA0346A0B90F98FEF7AD -S3150800438059FC03460FE00F98FEF716F9054614F098 -S31508004390100FD3D1FFE70FA8FFF700FA034600284E -S315080043A0E5D000E00723184619B030BD2DE9F043E3 -S315080043B083B081469046054600244E1E012711E02B -S315080043C0404601A93A466B46FFF780FC009B012B45 -S315080043D00AD19DF804300D2B04D005F8013B0134B1 -S315080043E00A2B01D0A642EBDC00232B709C4214BF9B -S315080043F04846184603B0BDE8F08300BF30B583B021 -S3150800440004460D460A2802D10D20FFF7F7FF02A938 -S3150800441001F8084D28466946012201ABFFF72AFD37 -S315080044200198012814BF4FF0FF30012003B030BDBA -S3150800443070B505460E46007860B100243146FFF790 -S31508004440DDFFB0F1FF3F08D0013415F8010F002851 -S31508004450F4D101E0002070BD204670BD7F2821D927 -S3150800446041B9C7281EBF47F60C02C0F60002012351 -S315080044700AD112E0FF2814D8803847F60C03C0F694 -S31508004480000333F81000704732F8021F814205D046 -S3150800449001339BB2802BF7D100E000238033D8B2DA -S315080044A070470020704700BF61280CD047F22C6285 -S315080044B0C0F600020021013132F8023F53B18342AF -S315080044C0F9D10BB97047002147F60C13C0F6000363 -S315080044D033F81100704700BF30B4013A8D18A9426D -S315080044E014D20B461C785A7802EB042292B2104476 -S315080044F080B2824284BF013080B202339D42F1D835 -S31508004500CB432B4423F0010302331944A94207D1B4 -S315080045100B781B02184480B2834284BF013080B2F4 -S3150800452030BC704738B541F62074C2F20004657C89 -S31508004530143D237C05EB0325ADB2284480B204F173 -S315080045401A010822FFF7C8FF04F122012A46FFF7DD -S31508004550C3FF034620B1000A40EA032080B238BDF3 -S315080045604FF6FF7038BD00BF70B4C4780C44E4B28F -S3150800457041F69863C2F20003DC700D0A82782A4479 -S31508004580D2B29A7046785E700078187095420DD946 -S315080045900136F6B241F69863C2F200035E702EB990 -S315080045A041F69863C2F2000301301870C9B28C4212 -S315080045B017DA0132D2B241F69863C2F200039A7052 -S315080045C07AB941F69863C2F200035A780132D2B238 -S315080045D05A7032B941F69863C2F200031A7801326A -S315080045E01A7070BC704700BF10B5014641F6A46446 -S315080045F0C2F2000420680830FFF7B6FF226841F6C9 -S315080046009863C2F200031978117259785172997831 -S315080046109172DB78D37210BD08B5002006491422C2 -S31508004620FFF75AFF034620B1000A40EA032080B28A -S3150800463008BD4FF6FF7008BD2E1F002008B50620DE -S31508004640FFF770FF08BD00BF41F61073C2F2000302 -S3150800465000221A8041F6A863C2F200035A7640F295 -S315080046609453C2F2000301221A7040F28853C2F230 -S3150800467000034FF480621A80704700BF40F29453DB -S31508004680C2F2000300221A7041F61073C2F2000348 -S315080046901B882BB941F61073C2F2000318807047C5 -S315080046A040F29453C2F2000301221A70704700BF09 -S315080046B038B541F6A463C2F200031C6841F6A0634C -S315080046C0C2F20003A54A1A6041F69463C2F20003D7 -S315080046D01A60032813D1637E03F00F03032B40F0FF -S315080046E05B87238A002B40F0578741F69C63C2F20A -S315080046F0000308221A7001F057FB00F097BD022844 -S3150800470040F09E8040F28453C2F20003DA78013208 -S31508004710D2B2DA70C2B940F28453C2F200039A7870 -S315080047200132D2B29A707AB940F28453C2F20003C7 -S315080047305A780132D2B25A7032B940F28453C2F270 -S3150800474000031A7801321A7041F69063C2F2000328 -S3150800475000221A8042F26253C2F200031A80637E74 -S3150800476003F0FD02052A09D1A37E0133DBB2A37645 -S31508004770782B04BF0023637600F00EBF002B00F0F1 -S315080047800B87228A002A4CD0A27E511EA176002AC7 -S3150800479040F00287E27E082A05D0591EC9B20129CF -S315080047A014D8052A12D10023637641F69C63C2F217 -S315080047B0000380221A7001F0F7FA41F62073C2F25C -S315080047C00003142283F82F2000F063BE042A9DBF3D -S315080047D003219140C9B23021A1760132E27603F075 -S315080047E00F03013B072B00F2D786DFE813F05D02C3 -S315080047F008001000AC04D506AC04D506AC0441F696 -S315080048002073C2F20003002283F82F2053E241F6F8 -S315080048109C63C2F2000304221A7001F0C5FA00F084 -S3150800482056BD03F00F03032B40F0B68641F69C6392 -S31508004830C2F2000308221A7001F0B6FA00F0F6BCBC -S3150800484041F62073C2F200039B7B452B40F0A486F9 -S3150800485041F62073C2F20003197C5A7C02EB012050 -S3150800486041F69063C2F200031B88984200F39486CF -S3150800487084B241F69063C2F200031C8041F62073AD -S31508004880C2F200031B7D13F03F0F40F0858641F608 -S315080048902073C2F200035B7D002B40F07D8641F653 -S315080048A01C73C2F200031D882DB941F61C73C2F2AF -S315080048B000035B88A3B141F62073C2F20003DB8BC9 -S315080048C0AB4240F0698641F62072C2F2000241F618 -S315080048D01C73C2F20003128C5B889A4240F05C8615 -S315080048E0FFF79AFE4FF6FF73984240F0558641F659 -S315080048F02073C2F20003DB7D062B31D0012B40F07A -S315080049004B8641F62073C2F2000393F82230082B37 -S3150800491040F0428641F62073C2F20003002283F873 -S3150800492022209A8C4FF6F6739A4241F62073C2F209 -S3150800493000038CBF093208329A8441F62073C2F20A -S3150800494000035A8BDA839A8B1A845D8341F61C72AC -S31508004950C2F2000252889A8300F017BE561F002042 -S31508004960FFF76CFE4FF6FF73984240F0158641F646 -S31508004970A863C2F20003597E81B341F62072C2F2DF -S31508004980000241F6A863C2F20003928C9B889A4201 -S3150800499024D141F62072C2F2000241F6A863C2F29F -S315080049A00003528CDB889A4218D141F62072C2F273 -S315080049B0000241F6A863C2F20003528B1B889A4292 -S315080049C00CD141F62072C2F2000241F6A863C2F287 -S315080049D00003928B5B889A4200F08D8141F6207322 -S315080049E0C2F2000393F82F3003F03F03022B1CD1C9 -S315080049F041F62073C2F200039A8C40F28053C2F249 -S31508004A0000031A8040F29453C2F200030021197081 -S31508004A1041F61073C2F200031B8893427BD040F222 -S31508004A209453C2F2000301221A7041F62073C2F2AF -S31508004A30000393F82F3013F0040F40F0AD8541F6CC -S31508004A402073C2F20003142283F82F2041F69062E5 -S31508004A50C2F2000228211180502283F82E2093F8F2 -S31508004A60295093F82D2083F8292093F8284093F8A5 -S31508004A702C2083F8282083F82C4093F8270093F8F5 -S31508004A802B2083F8272083F82B0093F8262040F262 -S31508004A909451C2F200010A7093F82A1083F826107E -S31508004AA083F82A20691CC9B283F82D10C1B9611C84 -S31508004AB0C9B241F62073C2F2000383F82C1079B903 -S31508004AC0411CC9B241F62073C2F2000383F82B10C9 -S31508004AD031B941F62073C2F20003013283F82A2065 -S31508004AE041F62073C2F20003598C40F28052C2F29A -S31508004AF0000211809A8C5A8499845A8BDA839A8B8D -S31508004B001A8441F61C72C2F200021188598352882F -S31508004B109A8300F00DBD41F6A863C2F200035B7EDE -S31508004B2023B1072B40F04C8500F042BD41F6A46145 -S31508004B30C2F2000141F6A863C2F200030B6003212A -S31508004B4099761976002199750420D875D9769A80B0 -S31508004B5041F62074C2F20004628CDA80628B1A80F5 -S31508004B60A28B5A800120587640F28452C2F2000283 -S31508004B70117819735178597391789973D278DA73D1 -S31508004B80188294F82920DA7294F828209A7294F8F0 -S31508004B9027205A7294F826201A72FFF725FD94F8F2 -S31508004BA02E3003F0F002502A7ADD1B095C1FA400A0 -S31508004BB040F29553C2F200031A78002341F6207199 -S31508004BC0C2F200015AE0CA1892F8362072B940F2C9 -S31508004BD09451C2F200010B7040F29553C2F20003E1 -S31508004BE01A7041F6A864C2F200045DE0012A02D1F7 -S31508004BF00133DBB242E0022A2BD10D1895F8375063 -S31508004C00042D26D140F29452C2F20002137040F2EB -S31508004C109553C2F2000302221A7041F62073C2F2BB -S31508004C200003034493F8382093F8393043EA022204 -S31508004C3040F28053C2F200031A8040F20A639A4295 -S31508004C4038BF134641F6A864C2F200046382A38201 -S31508004C502AE0084490F8370070B940F29451C2F23D -S31508004C6000010B7040F29553C2F200031A7041F628 -S31508004C70A864C2F2000417E00344DBB21846A34254 -S31508004C80A1DB40F29451C2F200010B7040F2955339 -S31508004C90C2F200031A7041F6A864C2F2000403E0E7 -S31508004CA041F6A864C2F2000441F62073C2F200037A -S31508004CB0102283F82F2041F62073C2F2000393F8DE -S31508004CC02F2042F0020283F82F20022283F8362092 -S31508004CD0042283F83720062283F838200A2283F82C -S31508004CE0392041F69062C2F200022C21118060221E -S31508004CF083F82E20DAE341F6A463C2F2000341F6F4 -S31508004D00A862C2F200021A6041F69C63C2F200036E -S31508004D1000221A7041F62073C2F2000393F82F306E -S31508004D2013F0040F0ED041F6A863C2F200035A76B8 -S31508004D3041F69C63C2F2000320221A7001F034F88F -S31508004D4000F02ABC41F62072C2F2000292F82E0048 -S31508004D500009800040F29452C2F200021070143C1E -S31508004D60201A80B241F69062C2F20002108001F069 -S31508004D700F01022903D103F03F02122A1DD010B9F0 -S31508004D8013F0030F19D041F62071C2F2000141F663 -S31508004D90A862C2F20002C98C1289914240F06E8361 -S31508004DA041F62071C2F2000141F6A862C2F2000281 -S31508004DB0098D5289914240F0618313F0100F77D024 -S31508004DC041F6A863C2F20003198A002970D003F1DC -S31508004DD00C00FFF7C9FB41F62073C2F2000393F8F3 -S31508004DE02A4041F69863C2F200031B78A3425FD1BA -S31508004DF041F62073C2F2000393F82B0041F698633C -S31508004E00C2F200035B78834252D141F62073C2F2A4 -S31508004E10000393F82C1041F69863C2F200039B78BE -S31508004E208B4245D141F62073C2F2000393F82D2038 -S31508004E3041F69863C2F20003DB78934238D141F613 -S31508004E40A863C2F200031C7358739973DA73DB7E86 -S31508004E5003BB41F6A863C2F20003987D197E9A7EC9 -S31508004E60891AA1EBD001C9B2CAB20844C0B2987572 -S31508004E7012F0800F1CBF4A42D2B241F6A863C2F2B2 -S31508004E800003D97DA1EB91010A44D2B2DA7502EB8F -S31508004E90D0021A7641F69C63C2F2000301221A7008 -S31508004EA041F6A863C2F200031A7E9A7600221A8295 -S31508004EB041F6A863C2F200035A7E02F00F03013BD3 -S31508004EC0072B00F26983DFE813F008003A000401B3 -S31508004ED051029B02C702D902390241F69C63C2F20B -S31508004EE000031B7813F0010F00F0568341F6A86300 -S31508004EF0C2F2000303225A7641F69C62C2F200020D -S31508004F004021117000221A8241F69063C2F2000312 -S31508004F10188838B141F69C63C2F2000342221A701F -S31508004F20FFF762FB42F26253C2F2000300221A80C4 -S31508004F3000F03AFF41F6A864C2F2000476E141F6B1 -S31508004F409C63C2F200031B7813F0010F00F0B180D6 -S31508004F5041F62073C2F2000393F82F3003F03F03A3 -S31508004F60122B40F0A68041F62073C2F2000393F894 -S31508004F702E3003F0F002502A6DDD1B095C1FA400D9 -S31508004F8040F29553C2F200031A78002341F62071C5 -S31508004F90C2F2000152E0CA1892F8362052B940F21D -S31508004FA09451C2F200010B7040F29553C2F200030D -S31508004FB01A7050E0012A02D10133DBB23EE0022A20 -S31508004FC02BD10D1895F83750042D26D140F294525E -S31508004FD0C2F20002137040F29553C2F20003022295 -S31508004FE01A7041F62073C2F20003034493F838207E -S31508004FF093F8393043EA022240F28053C2F20003A2 -S315080050001A8040F20A639A4228BF1A4641F6A863F4 -S31508005010C2F200035A829A821DE0084490F83700CB -S3150800502050B940F29451C2F200010B7040F2955308 -S31508005030C2F200031A700EE00344DBB21846A3421C -S31508005040A9DB40F29451C2F200010B7040F295536D -S31508005050C2F200031A7041F6A864C2F200040323E0 -S31508005060637641F62073C2F2000393F82620227273 -S3150800507093F82720627293F82820A27293F82930B1 -S31508005080E3720120FFF7B0FA41F69C63C2F200030F -S3150800509042221A700022228241F69063C2F200036D -S315080050A01A8042F26253C2F200031A8000F07CFEB4 -S315080050B0BCE041F69C63C2F2000320221A7000F09D -S315080050C073FE41F6A463C2F200031B6800225A76F7 -S315080050D0ABE441F62073C2F2000393F82F3013F0C5 -S315080050E0010F38D012F0100F35D141F6A863C2F27D -S315080050F000031B8A002B40F04F8241F69064C2F2EF -S3150800510000042088013080B2FFF76EFA41F69C63EE -S31508005110C2F200031A7842F010011970238833B1DD -S3150800512041F69C63C2F2000342F012021A7000F0C4 -S315080051303BFE41F6A864C2F2000401232382082339 -S3150800514063760023E37641F62073C2F20003112248 -S3150800515083F82F209DE113F0200F18D041F6207315 -S31508005160C2F2000393F83400000293F8351041F6B2 -S31508005170A063C2F2000340EA01051C682C441C60C7 -S3150800518041F69063C2F200031888411B198041F664 -S315080051909063C2F20003188860B112F0100F09D1AB -S315080051A041F69C63C2F200031A7842F002021A70B2 -S315080051B0FFF71AFA41F62073C2F2000393F830207B -S315080051C093F8313003EB02239BB240F28052C2F2CD -S315080051D00002138041F6A862C2F20002928A934244 -S315080051E000D823B940F28053C2F200031A8041F670 -S315080051F0A863C2F2000340F28052C2F2000212888B -S315080052005A8241F69C63C2F200031B7813F0030F1F -S3150800521000F0C28142F26253C2F2000300221A80F1 -S3150800522000F0C2FD41F6A864C2F2000441F69C6390 -S31508005230C2F200031B7813F0200F0ED042F262531D -S31508005240C2F2000300221A80627641F62073C2F287 -S315080052500003142283F82F201BE113F0100F12D03D -S3150800526042F26253C2F2000300221A80012323820B -S3150800527004236376E27641F62073C2F20003112214 -S3150800528083F82F2005E142F26252C2F20002128828 -S31508005290DAB113F0010F1CBF0023238201D1218A42 -S315080052A071B9618A8A4282BF42F26253C2F200032E -S315080052B0198042F26253C2F200031B88238204E07B -S315080052C042F26253C2F2000319800023E37641F6E4 -S315080052D0A063C2F2000341F69462C2F200021268A9 -S315080052E01A6042F26253C2F200031B887BB1238A1A -S315080052F06BB141F69062C2F200022833138041F680 -S315080053002073C2F20003182283F82F20C7E041F663 -S315080053109C63C2F200031B7813F0020F00F03C8175 -S3150800532041F69063C2F2000328221A8041F62073E0 -S31508005330C2F20003102283F82F20B0E041F69C63E6 -S31508005340C2F200031B7813F0010F00F0258141F625 -S31508005350A863C2F2000300225A7641F69C63C2F2A1 -S31508005360000310221A7000F01FFD15E141F6906344 -S31508005370C2F20003188808B1FFF736F941F6207320 -S31508005380C2F2000393F82F3013F0010F1FD041F635 -S315080053909C63C2F200031B7813F0010F41F6A86361 -S315080053A0C2F200031FBF07225A7600229A7612BF5E -S315080053B01A8206225A760120FFF716F941F69C63EF -S315080053C0C2F2000310221A7000F0EEFC56E041F615 -S315080053D09C63C2F200031B7813F0010F08D041F654 -S315080053E0A863C2F2000305225A7600221A82D3E085 -S315080053F041F69063C2F200031B88002B3ED1CBE036 -S3150800540041F69063C2F20003188808B1FFF7ECF87A -S3150800541041F62073C2F2000393F82F3013F0010F00 -S3150800542013D041F6A863C2F2000307225A76002277 -S315080054309A760120FFF7D8F841F69C63C2F200037A -S3150800544010221A7000F0B0FC18E041F69063C2F220 -S3150800545000031B8893B99FE041F69C63C2F20003E0 -S315080054601B7813F0010F00F0978041F6A863C2F28B -S31508005470000307225A7600229A768DE041F62073B9 -S31508005480C2F20003102283F82F2041F6A864C2F264 -S31508005490000441F69063C2F2000328221A8041F6FE -S315080054A02073C2F20003502283F82E20227A41F696 -S315080054B02073C2F2000383F82A20627A83F82B202D -S315080054C0A27A83F82C20E27A83F82D20227B83F8AF -S315080054D02620627B83F82720A27B83F82820E27B9C -S315080054E083F829200622DA75A2885A84E2889A84E3 -S315080054F041F61C72C2F200021188598352889A83B7 -S315080055002288DA8362881A84637E13F0100F41F6C4 -S315080055102073C2F200031DBF002283F8312083F8EE -S315080055203020062202BF83F830200A2283F8312071 -S3150800553041F62074C2F200044023A37541F6906335 -S31508005540C2F200031B881A0A22746374002584F8C1 -S31508005550355084F834506586FFF770F8C043608686 -S315080055604523A373E5736575257540F28253C2F228 -S3150800557000031A88013292B21A80130AA374E274DD -S315080055802583FFF749F8C043208341F69C63C2F29E -S31508005590000300221A7038BD41F69063C2F2000378 -S315080055A000221A8041F69C63C2F200031A7038BDC5 -S315080055B040F29453C2F2000301211970FFF7B6BAFC -S315080055C040F29453C2F2000301221A70E4E700BFC6 -S315080055D0030A43EA002080B2704700BF10B50446AC -S315080055E00A1E0FDD42F26253C2F200031A8041F628 -S315080055F09463C2F200031868844203D0214692B22B -S3150800560001F0FCFE10BD00BF2DE9F00340F29653F1 -S31508005610C2F200034FF0000C83F800C040F2985520 -S31508005620C2F200052B4601221F461C88CCB15E88B3 -S31508005630BEB1B0F80080A04513D14488B44210D159 -S3150800564040F29653C2F2000383F800C008687860F7 -S315080056508B883B8140F2F953C2F200031B78BB7278 -S315080056605AE0541CE4B20C33092C02D09446224664 -S31508005670DAE72B4600221E461C884CB95C883CB9E2 -S3150800568040F29653C2F200031A70082A36D104E093 -S315080056900132D2B20C33082AEDD1002340F2F95276 -S315080056A0C2F200021678B0461F4699465FFA83FC96 -S315080056B0AA7AC2EB0804BC42C2BFC2EB0602E146A4 -S315080056C0D7B201330C35082BF0D140F29753C2F20A -S315080056D000031F7040F2F853C2F2000383F80090EB -S315080056E040F29653C2F2000383F8009040F29853B2 -S315080056F0C2F2000309EB490903EB8906026833463F -S3150800570043F8042B0A6872608A889A8040F2F95333 -S31508005710C2F200031B78B372BDE8F003704700BFFE -S31508005720F0B440F2F953C2F200031E780136F6B21D -S315080057301E7040F29853C2F200030122002740F27D -S315080057409654C2F2000458881988014389B259B19F -S31508005750997A711A772907DD194601F8017B5F7076 -S31508005760013101F8017B0F7022700132D2B20C337D -S31508005770092AE8D1F0BC704738B541F69063C2F201 -S3150800578000031B88292B06D841F69063C2F2000352 -S3150800579000221A8038BD41F69063C2F20003002247 -S315080057A01A8041F62073C2F200039B8AB3F5807F04 -S315080057B003D0B3F5007F59D038BD41F62072C2F246 -S315080057C0000241F61C73C2F20003D28C1B889A426F -S315080057D069D141F62072C2F2000241F61C73C2F288 -S315080057E00003128D5B889A425DD12F4CA51F204677 -S315080057F02946FFF709FFA4F11C03002204F8082C28 -S31508005800022204F8072C54F8062C626034F8022C9D -S31508005810228140F28C52C2F20002106844F8060C4B -S31508005820928824F8022C44F8160C24F8122C626884 -S3150800583044F81C2C228924F8182C9A8B62816288D9 -S31508005840A28141F61C72C2F200021188998352881D -S315080058506280082204F8102C062204F80F2C41F660 -S315080058609063C2F200032A221A8038BD41F62072DC -S31508005870C2F2000241F61C73C2F20003D28C1B88E6 -S315080058809A4210D141F62072C2F2000241F61C7308 -S31508005890C2F20003128D5B889A4204D10249084677 -S315080058A00639FFF7B1FE38BD3C1F002038B541F672 -S315080058B02073C2F20003D98B8AB24FF6FF739A425D -S315080058C015D141F62073C2F20003188C4FF6FF7308 -S315080058D098420CD141F62073C2F2000347F6EC2237 -S315080058E0C0F600021068186092889A80ADE041F60A -S315080058F01C73C2F200031B885A4041F61873C2F2A1 -S3150800590000031B881A4212D141F62073C2F2000323 -S315080059101A8C90B241F61C73C2F200035B88584099 -S3150800592041F61873C2F200035B8818420CD040F2A5 -S31508005930FC53C2F2000341F61472C2F20002118847 -S31508005940198052885A8005E040F2FC53C2F20003DF -S3150800595019805A8040F2FC53C2F2000318885D8809 -S3150800596040F29853C2F2000300221C46198881426D -S315080059700AD15988A94207D140F29653C2F20003C8 -S315080059801A70082A58D109E00132D2B20C33082A13 -S31508005990EBD140F29653C2F200031A7041F6207416 -S315080059A0C2F200042046FF21062201F07BFD0023F7 -S315080059B084F8203084F8213084F8223084F82330A3 -S315080059C084F8243084F8253040F28C52C2F2000262 -S315080059D01168C4F8061092886281C4F816106283AA -S315080059E040F2FC52C2F200021188E18452882285F4 -S315080059F041F61C72C2F200021188A1835288E28322 -S31508005A00237501226275A373E273082222746374F4 -S31508005A100623A3740423E37422730623637341F6EF -S31508005A20A063C2F2000336341C6041F69063C2F2EA -S31508005A3000032A221A8038BD41F62073C2F20003F9 -S31508005A4054F8040F1860A2889A8041F62073C2F2AF -S31508005A50000340F28C52C2F200021168C3F8061025 -S31508005A6092885A8108221A7300225A7341F6906363 -S31508005A70C2F200031A880E321A8038BD08B500F043 -S31508005A80F3FB01F049FC01F02DFC00F071FC00F07D -S31508005A900FF800F0D7FB08BD08B500F0E7FB01F0EA -S31508005AA057FC00F0A3FD00F017F800F0A3FB08BDB3 -S31508005AB010B500F0BDF900F0E7FF40F21804C2F295 -S31508005AC000040123237001F065FB0023237000F016 -S31508005AD089F80323237010BD08B540F20060C2F2AE -S31508005AE0000001F0D9F801280BD140F21803C2F2E0 -S31508005AF0000301221A7040F20060C2F2000000F0B2 -S31508005B00B7F940F20060C2F2000001F097FB0128E5 -S31508005B100BD140F21803C2F2000300221A7040F2B9 -S31508005B200060C2F2000000F0A3F940F20060C2F281 -S31508005B30000000F0B3F801280BD140F21803C2F2B6 -S31508005B40000303221A7040F20060C2F2000000F05F -S31508005B508FF908BD704700BF38B505460C4640F2B8 -S31508005B601803C2F200031B78012B02D1C9B201F057 -S31508005B703FF840F21803C2F200031B781BB9284607 -S31508005B80E1B201F027FB40F21803C2F200031B78CA -S31508005B90032B03D12846E1B200F05EF800F060F965 -S31508005BA038BD00BF40F21803C2F200031878012876 -S31508005BB004D0022814BF40200020704708207047F0 -S31508005BC040F21803C2F200031878012804D002280C -S31508005BD014BF4020002070470820704708B500F021 -S31508005BE035F908BD08B5FBF7AFFF01F0C3FB40F276 -S31508005BF04463C2F2000300F5FA70186001F0BAFBBC -S31508005C0040F24063C2F2000300F51C5010301860E1 -S31508005C10FEF71AFD41F61C73C2F200034FF6A9629D -S31508005C201A8043F61371598041F61873C2F20003BD -S31508005C304FF6FF7119800021598041F61473C2F29C -S31508005C4000031A8040F213125A804EF60300FEF73C -S31508005C5015FDFCF78DF808BDF8B541F6A463C2F248 -S31508005C6000031F68FB693B628E4659B14E1EB6B2E9 -S31508005C700136002307F11C05C45CEA1814720133C7 -S31508005C80B342F9D10EF10401A7F8641007F1200018 -S31508005C90FFF7A4FCFB690133FB61F8BD10B5FCF7FF -S31508005CA079F800283ED041F69062C2F200021080D0 -S31508005CB041F62073C2F200039C894FF40060FFF797 -S31508005CC087FC844213D10120FEF7F2FC41F690636B -S31508005CD0C2F200031B882BB3FFF7E8FDFCF782F836 -S31508005CE041F69063C2F2000300221A801AE041F6D8 -S31508005CF02073C2F200039C8940F60600FFF768FC91 -S31508005D0084420FD1FFF738FD41F69063C2F20003D3 -S31508005D101B883BB1FCF766F841F69063C2F20003B4 -S31508005D2000221A8001F026FB40F24463C2F2000307 -S31508005D301B68984222D340F24462C2F2000203F57D -S31508005D40FA73136041F6A463C2F2000341F6A8622F -S31508005D50C2F200021A600220FEF7AAFC41F690631E -S31508005D60C2F200031B884BB1FFF7A0FDFCF73AF817 -S31508005D7041F69063C2F2000300221A8001F0FAFA93 -S31508005D8040F24063C2F200031B68984209D340F20E -S31508005D904062C2F2000203F51C5310331360FFF78A -S31508005DA0BFFC002010BD00BF10B541F6A463C2F2C7 -S31508005DB000031C6841F69C63C2F200031B7813F0CB -S31508005DC0400F05D00123E3610023A4F8643010BD19 -S31508005DD013F0010F1CBF0022A4F8642013F0040F6F -S31508005DE006D0B4F8641019B104F12000FFF7F6FBE9 -S31508005DF041F69C63C2F200031B7813F0020F0AD027 -S31508005E000023A4F8643041F6A063C2F200031868C0 -S31508005E10043000F02DF810BD40F24863C2F20003CA -S31508005E20FE22DA7018710222A3F84420704700BFD8 -S31508005E3040F24863C2F2000300221A709A6483F89B -S31508005E404320A3F844209A705A70704740F248637A -S31508005E50C2F200031878003018BF0120704700BF4F -S31508005E6040F24863C2F20003002283F843207047D9 -S31508005E7038B504460178FF2923D100F08FFA18B9FE -S31508005E801020FFF7C9FF96E140F24864C2F2000409 -S31508005E900023637001252570FF22E270102222710B -S31508005EA06371FFF77FFEA071FFF78AFEE071FFF7C7 -S31508005EB087FE000A20726572A5720823A4F844308A -S31508005EC079E140F24863C2F200031B78012B40F0E7 -S31508005ED09081C939352900F26B81DFE811F0DB00C2 -S31508005EE0690169016501690169015901FC004201FD -S31508005EF02F0169016901690169016901690169017E -S31508005F006901690169016901690169016901690133 -S31508005F106901690169016901690169016901690123 -S31508005F206901690169016901690169016901690113 -S31508005F3069017F005400360073006901690169012F -S31508005F40A1006901B900BD00CE004578FFF72AFE19 -S31508005F500138854203DD2220FFF75EFF2BE140F280 -S31508005F604865C2F20005281DA96C627800F0F0FEAB -S31508005F70FF23EB706278AB6C1344AB646378013330 -S31508005F80A5F8443017E14578FFF70CFE013885423D -S31508005F9003DD2220FFF740FF0DE1616840F2486506 -S31508005FA0C2F20005A964281D627800F0D1FEFF231D -S31508005FB0EB706278AB6C1344AB6463780133A5F875 -S31508005FC04430F8E040F24863C2F20003FF22DA7078 -S31508005FD042689A640122A3F84420ECE040F2486340 -S31508005FE0C2F20003FF22DA709B6C406840B1184485 -S31508005FF0002213F8011B0A44D2B28342F9D100E009 -S31508006000002240F24863C2F20003C3F807200122C7 -S315080060101A7100225A719A710822A3F84420CAE01C -S3150800602040F24863C2F20003FF22DA7047F6F42210 -S31508006030C0F600029A6400221A715A719A710721F1 -S31508006040D9711A725A729A720822A3F84420B2E0D9 -S315080060500020FFF7E1FEAEE040F24863C2F200031B -S31508006060FF22DA7000221A71597859719A71DA7119 -S315080060701A720622A3F844209DE040F24863C2F251 -S31508006080000300221A705A70FF22DA700122A3F860 -S31508006090442090E040F24863C2F200039D6CFFF78B -S315080060A081FD411E2846621C01F020F918B93120ED -S315080060B0FFF7B2FE7FE040F24864C2F20004FF2315 -S315080060C0E370A56CFFF76EFD013D2844A06401232B -S315080060D0A4F844306FE04578FFF764FD023885423E -S315080060E003DD2220FFF798FE65E040F24863C2F21E -S315080060F00003FF22DA700122A3F84420617839B937 -S3150800610001F000F9002856D13120FFF785FE52E04C -S3150800611040F24863C2F20003986CA21C01F0E6F84C -S3150800612018B93120FFF778FE45E040F24863C2F21D -S31508006130000361789A6C0A449A643CE040F2486429 -S31508006140C2F20004FF23E370002525716571FFF78D -S3150800615029FDA071E571257265720723A4F84430FC -S3150800616029E040F24863C2F20003986C616801F0C6 -S31508006170C1F818B93120FFF74FFE1CE040F248631A -S31508006180C2F20003FF22DA700122A3F8442012E0CB -S3150800619000F0C6FD40F24863C2F20003FF22DA703F -S315080061A00122A3F8442006E03120FFF735FE02E07D -S315080061B02020FFF731FE40F24863C2F2000393F84D -S315080061C04330012B02D11020FFF726FE40F2486328 -S315080061D0C2F20003B3F844100BB2002B09DD40F2FB -S315080061E04860C2F20000012380F843300330FFF70D -S315080061F0B3FC38BD08B5FFF7F1FC012820D000F044 -S31508006200CDF8E8B140F29463C2F200031B78012B83 -S3150800621016D101F0AFF840F29863C2F200031B688A -S3150800622003F51C53103398420AD340F29463C2F222 -S31508006230000300221A7000F0BBF808B900F070FDE0 -S3150800624008BD00BF08B540F29463C2F200030122FC -S315080062501A7001F08FF840F29863C2F200031860D2 -S31508006260FFF7C8FF08BD00BF704700BF704700BFF3 -S3150800627000F00F03092802D903F13700704703F12C -S31508006280300040F21C03C2F200031B6803445B782B -S3150800629003F00303022B08BF2038C0B2704700BFC3 -S315080062A038B505460C460009FFF7E2FF207005F0F1 -S315080062B00F00FFF7DDFF60700023A370204638BD8E -S315080062C030B4024603464CF6CD40CCF6CC400131FC -S315080062D0A0FB0343DB08FAD1002301F801394CF689 -S315080062E0CD45CCF6CC450846A5FB0243DB0803EBB7 -S315080062F08304A2EB4402303201F801291A46002B26 -S31508006300F1D130BC704700BFF0B440F21C03C2F2B2 -S3150800631000031F6800231C46C15C7A18527802F0F5 -S315080063200302022A08BF2039C9B2A1F13002D2B24B -S31508006330A1F13A05EDB2162A94BF00260126062DCC -S315080063408CBF354646F0010565B9092A84BFA1F117 -S315080063503702D2B22401E4B22244D4B20133022B6A -S31508006360DAD101E0002000E02046F0BC704700BF0B -S3150800637008B540F2DC63C2F200030020187040F250 -S31508006380E861C2F20001FDF7D5FB30B147F6FC2003 -S31508006390C0F600007C2100F069FB08BD40F2DC6312 -S315080063A0C2F200031878D0F1010038BF0020704708 -S315080063B008B5FFF713FC01280FD040F2DC63C2F2E0 -S315080063C000031B785BB9F9F7DFFE012809D140F213 -S315080063D0DC63C2F20003187008BD002008BD002067 -S315080063E008BD002008BD00BF027840F21C03C2F2B7 -S315080063F000031B689918497801F00301022908BFB0 -S31508006400203A532A0ED1407803445B7813F0040FE0 -S315080064100AD031280AD032280AD0332814BF0320DC -S3150800642002207047032070470320704700207047FA -S315080064300120704770B504460230FFF765FF06462F -S31508006440054604342046FFF75FFF3044C6B2013DD7 -S31508006450ADB20234012DF5D82046FFF755FFF643B5 -S31508006460F6B2864214BF0020012070BD2DE9F04126 -S3150800647015460F460446002918BF002807D147F6D7 -S31508006480FC20C0F6000040F2362100F0EFFA204664 -S31508006490FFF7AAFF0646032808BF002000F0A280DF -S315080064A02046FFF7C7FF002800F08C80012E29D070 -S315080064B016B1022E53D088E0A01CFFF725FF8046B0 -S315080064C0201DFFF721FF06023E60A01DFFF71CFFF7 -S315080064D03044386004F10806A8F103081FFA88F862 -S315080064E04046002D7ED00FFA88F7002F6FDD002476 -S315080064F03046FFF709FF285502360134A4B2BC42DC -S31508006500F6DB66E0A01CFFF7FFFE8046201DFFF7BE -S31508006510FBFE06043E60A01DFFF7F6FE06EB00260E -S315080065203E6004F10800FFF7EFFE3044386004F1DE -S315080065300A06A8F104081FFA88F84046002D51D02B -S315080065400FFA88F7002F46DD00243046FFF7DCFEF9 -S31508006550285502360134A4B2BC42F6DB3DE0A01C45 -S31508006560FFF7D2FE8046201DFFF7CEFE06063E60E8 -S31508006570A01DFFF7C9FE06EB00463E6004F10800C1 -S31508006580FFF7C2FE06EB00263E6004F10A00FFF79D -S31508006590BBFE3044386004F10C06A8F105081FFA62 -S315080065A088F84046F5B10FFA88F7002F17DD002462 -S315080065B03046FFF7A9FE285502360134A4B2BC427C -S315080065C0F6DB0EE04FF6FF700CE000200AE04046CE -S315080065D008E0404606E0404604E0404602E0404601 -S315080065E000E0404600B2BDE8F08100BF70B540F259 -S315080065F0DC63C2F200031B78002B00F03382012B08 -S315080066003FD1F9F7E9FD47F61430C0F60000F9F76F -S315080066102DFE47F63830C0F60000F9F727FEF9F7E1 -S31508006620D5FD0146BD480122FDF79AFA48B147F65D -S315080066306030C0F60000F9F719FE0120F9F706FEEA -S3150800664070BD47F66830C0F60000F9F70FFE47F64A -S315080066507030C0F60000F9F709FE47F69430C0F628 -S315080066600000F9F703FE40F2E063C2F200030022DD -S315080066701A605A6040F2DC63C2F2000302221A7002 -S3150800668070BD022B40F0FD8040F2E864C2F20004BF -S3150800669040F64030C2F200004FF4807104F50D72E6 -S315080066A0FDF784FE94F93A32002B13DA47F6603088 -S315080066B0C0F60000F9F7DAFD0220F9F7C7FD04F580 -S315080066C00D70FDF719FD40F2DC63C2F200030022EB -S315080066D01A7070BD00B340F64031C2F20001084698 -S315080066E001F5C0710022FFF7C1FE0546B0F1FF3F74 -S315080066F012D147F66030C0F60000F9F7B7FD03205F -S31508006700F9F7A4FD8548FDF7F7FC40F2DC63C2F211 -S31508006710000300221A7070BD2BB2002B2CDD40F24C -S31508006720E063C2F200035B686BB940F2E063C2F251 -S31508006730000340F64032C2F20002D2F880211A6005 -S315080067402DB25D6018E040F64032C2F20002D2F87F -S31508006750801140F2E062C2F20002126891423EBF26 -S3150800676040F2E062C2F20002116040F2E062C2F258 -S31508006770000203FA85F3536040F2E863C2F20003AD -S31508006780D3F83C22D3F840329A4240F06B816348F2 -S315080067900021FDF7BBFC90B147F66030C0F600005B -S315080067A0F9F764FD0420F9F751FD5C48FDF7A4FCF0 -S315080067B040F2DC63C2F2000300221A7070BD47F68D -S315080067C06830C0F60000F9F751FD47F6C430C0F648 -S315080067D00000F9F74BFD40F2E065C2F2000540F211 -S315080067E09C64C2F2000468682146FFF769FD2046EA -S315080067F0F9F73CFD47F6D030C0F60000F9F736FD4C -S315080068002E68300E2146FFF74BFDC6F30740A11C44 -S31508006810FFF746FDC6F30720211DFFF741FDF0B23D -S31508006820A11DFFF73DFD2046F9F720FD47F6744008 -S31508006830C0F60000F9F71AFD2868696800F05AFDE5 -S3150800684090B947F66030C0F60000F9F70FFD05204D -S31508006850F9F7FCFC3148FDF74FFC40F2DC63C2F265 -S31508006860000300221A7070BD47F66830C0F60000B3 -S31508006870F9F7FCFC40F2DC63C2F2000303221A704B -S3150800688070BD032B40F0EE8040F2E864C2F20004CB -S3150800689040F64030C2F200004FF4807104F50D72E4 -S315080068A0FDF784FD94F93A32002B13DA47F6EC30FB -S315080068B0C0F60000F9F7DAFC0220F9F7C7FC04F580 -S315080068C00D70FDF719FC40F2DC63C2F200030022EA -S315080068D01A7070BD20B340F64032C2F2000210466C -S315080068E002F5C07102F58072FFF7C0FD0546B0F1EA -S315080068F0FF3F15D147F61040C0F60000F9F7B6FC81 -S315080069000320F9F7A3FC0548FDF7F6FB40F2DC6324 -S31508006910C2F2000300221A7070BD00BF1C090020D5 -S315080069202BB2002B59DD47F63440C0F60000F9F7C4 -S315080069309DFC2DB240F29C64C2F200042846214612 -S31508006940FFF7BEFC2046F9F791FC47F64440C0F62F -S315080069500000F9F78BFC40F64036C2F2000696F8BE -S3150800696083012146FFF79CFC96F88201A11CFFF7DC -S3150800697097FC96F88101211DFFF792FC96F8800195 -S31508006980A11DFFF78DFC2046F9F770FC47F6744009 -S31508006990C0F60000F9F76AFCD6F88001294606F524 -S315080069A0807200F0A3FC90B947F66030C0F600008C -S315080069B0F9F75CFC0620F9F749FC2B48FDF79CFB28 -S315080069C040F2DC63C2F2000300221A7070BD47F67B -S315080069D06830C0F60000F9F749FC40F2E863C2F2F5 -S315080069E00003D3F83C22D3F840329A423AD147F60C -S315080069F05C40C0F60000F9F739FC00F083FC90B95A -S31508006A0047F66030C0F60000F9F730FC0720F9F7C2 -S31508006A101DFC1548FDF770FB40F2DC63C2F200036B -S31508006A2000221A7070BD47F66830C0F60000F9F704 -S31508006A301DFC47F67840C0F60000F9F717FC0A482F -S31508006A40FDF75AFB47F69040C0F60000F9F70EFC32 -S31508006A5040F2DC63C2F2000300221A70F9F7D4FB95 -S31508006A6000F05EF970BD00BF1C09002008B540F6AD -S31508006A70C443C2F20003186040F6C843C2F20003DA -S31508006A801960FFF7F3FBFCE72DE9F047002347F60B -S31508006A90E040C0F600004FF4FA744AF2104113F8C9 -S31508006AA00080C21892F801C008EB0C0202FB0442EF -S31508006AB091FBF2F902FB191636B94D4609F1FF3278 -S31508006AC092B2B2F5806F03D30233242BE7D187E065 -S31508006AD04746E2464FF4D043C4F2000300225A6107 -S31508006AE01A6842F400421A601B6813F4004F09D072 -S31508006AF04FF4D044C4F20004FFF7B8FB236813F43C -S31508006B00004FF9D14FF4D043C4F200031A6822F0BB -S31508006B1002021A601A6842F001021A605B6813F0F2 -S31508006B20010F09D14FF4D044C4F20004FFF79EFBCD -S31508006B30636813F0010FF9D0013F0AF1FF363605F5 -S31508006B4046EA0747013D3D434FF4D043C4F20003EC -S31508006B50DD611A6822F001021A605B6813F0010F02 -S31508006B6009D04FF4D044C4F20004FFF77FFB6368F2 -S31508006B7013F0010FF9D14FF4C843C4F20003D3F858 -S31508006B80002242F00102C3F80022D3F81C2222F4A4 -S31508006B908042C3F81C22D3F80C2242F48042C3F880 -S31508006BA00C220022C3F8B022C3F8B422D3F8042278 -S31508006BB022F48042C3F80422D3F8142222F4804235 -S31508006BC0C3F81422D3F81C2242F48042C3F81C22CC -S31508006BD0D3F8002222F00102C3F80022BDE8F087AC -S31508006BE047F6BC40C0F60000F021FFF73FFF71E70B -S31508006BF038B504460D464FF4D043C4F200039B68EB -S31508006C0013F0806F07D147F6BC40C0F600004FF47A -S31508006C10A271FFF72BFF4FF4D043C4F20003D3F859 -S31508006C20802102F00102C3F88021D3F8802142F0C6 -S31508006C307C4242F40012C3F88021C3F88451E178FB -S31508006C40A278120442EA016221780A43617842EA8C -S31508006C500122C3F88821E179A279120442EA016285 -S31508006C6021790A43617942EA0122C3F88C21D3F8D3 -S31508006C70802142F00102C3F880219B6813F0806FDF -S31508006C8009D14FF4D044C4F20004FFF7EFFAA36821 -S31508006C9013F0806FF9D038BD4FF4D043C4F2000327 -S31508006CA0DB6813F0030F39D04FF4D043C4F2000366 -S31508006CB0D3F8B02140F26763B3EB525F18BF0020E8 -S31508006CC023D14FF4D043C4F20003D3F8B82102709D -S31508006CD0D3F8B821120A4270D3F8B821120C827080 -S31508006CE0D3F8B821120EC270D3F8BC210271D3F8BA -S31508006CF0BC21120A4271D3F8BC21120C8271D3F856 -S31508006D00BC311B0EC3710120FFE74FF4D043C4F218 -S31508006D100003DA6842F02002DA6070470020704704 -S31508006D2008B500F0EBFA90B1FEF714FF00F008FB87 -S31508006D3000F0F2F920F0604020F07F004EF608538C -S31508006D40CEF20003186000F0E7F94368984708BDDB -S31508006D5070B5561EB6B24AB14C1E0E44451A14F802 -S31508006D60013F2B55FFF782FAB442F8D170BD00BF38 -S31508006D70F8B507460024254647F63456C0F60006F9 -S31508006D80FFF774FAA359BB420ED8311949680B4468 -S31508006D909F4209D247F63453C0F6000305EB450275 -S31508006DA003EB8203187AF8BD01350C346C2CE7D155 -S31508006DB0FF20F8BD2DE9F84380460068FFF7D8FFA5 -S31508006DC0FF2830D0FBF73EF8F320FBF75BF8FBF71C -S31508006DD05FF801281CBF002408F1040904D1FBF759 -S31508006DE047F80020BDE8F883D8F80060A71959F8D5 -S31508006DF00450FFF73BFA38462946FBF7C7F8082838 -S31508006E0007D1A359AB4206D10434B4F5007FEBD1C0 -S31508006E1003E0002402E0002400E00124FBF728F840 -S31508006E202046BDE8F8830020BDE8F88338B5044657 -S31508006E300D4640F6CC43C2F20003984209D04FF4FF -S31508006E404043C0F6000399420BD0FFF7B3FF20B9C1 -S31508006E5017E040F6D064C2F20004C5F3080393B9FC -S31508006E6003E040F6CC44C2F2000423689D420CD0ED -S31508006E70204640F8045B29464FF40072FFF768FF86 -S31508006E8003E0002038BD002038BD204638BD00BFCD -S31508006E902DE9F04106460C4617461D464FEA51288D -S31508006EA04FEA48280368B3F1FF3F06D140F8048B40 -S31508006EB041464FF40072FFF74BFF3368434505D050 -S31508006EC030464146FFF7B2FF0646D0B13368E41AAA -S31508006ED03444043408F50078FFF7C8F9331DE31A7B -S31508006EE0B3F5007F06D330464146FFF79FFF0646B7 -S31508006EF050B1041D17F8013B04F8013B013DEBD1E5 -S31508006F0005E00020BDE8F0810020BDE8F081012001 -S31508006F10BDE8F08140F6D063C2F200034FF0FF32BD -S31508006F201A6040F6CC43C2F200031A60704700BFED -S31508006F3070B504460D461646FFF71AFFFF281BD004 -S31508006F40681E2044FFF714FFFF2817D0620A4FF483 -S31508006F504043C0F60003B3EB422F07BF40F6CC40D0 -S31508006F60C2F2000040F6D060C2F200002146324666 -S31508006F702B46FFF78DFF70BD002070BD002070BD49 -S31508006F80F8B505460E46FFF7F3FE0446701E28447C -S31508006F90FFF7EEFE0546FF2C18BFFF2833D08442C4 -S31508006FA02BD8022C2BD90B282BD8FAF74BFFF3201A -S31508006FB0FAF768FFFAF76CFF01281EBF47F6045672 -S31508006FC0C0F60006022703D1FAF752FF0020F8BDE3 -S31508006FD0FFF74CF936F814003946FAF79FFF0828E8 -S31508006FE003D0FAF745FF0020F8BD0134E4B2A54204 -S31508006FF0EED2FAF73DFF0120F8BD0020F8BD0020CB -S31508007000F8BD0020F8BD0020F8BD00BF00B583B06C -S3150800701040F6CC43C2F200031B68B3F1FF3F08BF3A -S3150800702001201CD040F6CC43C2F2000399685A6886 -S315080070301144DA6811441A6911445A6911449A6963 -S315080070400A44D96953185B4202AA42F8043D4CF235 -S315080070508810C0F600000421FFF76AFFFFE703B0B7 -S315080070605DF804FB4CF20402C0F600024FF44043FC -S31508007070C0F6000310681B6818444CF20803C0F6F3 -S3150800708000031B6818444CF20C03C0F600031B6887 -S3150800709018444CF21003C0F600031B6818444CF25F -S315080070A01403C0F600031B6818444CF21803C0F614 -S315080070B000031B6818444CF28813C0F600031B68CB -S315080070C01844D0F1010038BF0020704708B540F6D3 -S315080070D0CC43C2F200031B68B3F1FF3F06D040F66B -S315080070E0CC40C2F20000FFF765FE88B140F6D063D7 -S315080070F0C2F200031B68B3F1FF3F0BD040F6D06025 -S31508007100C2F20000FFF756FE003018BF012008BD86 -S31508007110002008BD012008BD4FF44040C0F600001D -S31508007120704700BF38B504464FF4A050C4F20100BA -S315080071308021FBF7A1F990B14FF4A050C4F20100E9 -S315080071402146FBF791F94FF4A054C4F201048025B7 -S3150800715020462946FBF790F90028F9D001E00020DF -S3150800716038BD012038BD00BF10B504464FF4A05005 -S31508007170C4F201002021FBF77FF9012808D14FF45A -S31508007180A050C4F20100FBF773F92070012010BD6E -S31508007190002010BD10B584B04FF46143009300235E -S315080071A0ADF80430ADF80630ADF80830ADF80C305F -S315080071B00C23ADF80A304FF4A054C4F2010420465B -S315080071C06946FBF7D3F820460121FBF73FF904B0DF -S315080071D010BD00BF2DE9F04106460C46402906D9E8 -S315080071E047F6A050C0F600007721FFF73FFC20467F -S315080071F0FFF798FF012806D047F6A050C0F6000012 -S315080072007B21FFF733FC2546ACB1002447F6A0578F -S31508007210C0F600074FF08408FFF728F8305DFFF73F -S3150800722081FF012803D038464146FFF71FFC013489 -S31508007230A3B2AB42F0D3BDE8F08100BF10B5044657 -S3150800724041F21913C2F200031B78D3B941F2D400F4 -S31508007250C2F20000FFF788FF012838D141F2D403B3 -S31508007260C2F200031B78A3B341F21913C2F200035A -S3150800727001221A7041F21813C2F200030020187096 -S3150800728010BD41F21813C2F200031878144B1844C3 -S31508007290FFF76AFF01281ED141F21813C2F2000354 -S315080072A01A780132D2B21A7041F2D403C2F200033C -S315080072B01B78934211D120460949FFF749FD41F24F -S315080072C01913C2F2000300221A70012010BD002013 -S315080072D010BD002010BD002010BD002010BD00BF4D -S315080072E0D510002008B5FFF715FE08BD08B5FFF74D -S315080072F01FFE08BD08B5FFF743FE08BD08B5FFF732 -S31508007300B1FE08BD08B5FFF781FE10B1FFF7DEFE36 -S3150800731008BD002008BD00BF4EF21003CEF20003E0 -S3150800732000221A6049F23F01C0F2020159609A60D0 -S315080073300521196041F21C13C2F200031A60704756 -S315080073404EF21003CEF2000300221A60704700BF07 -S315080073504EF21003CEF200031B6813F4803F1FBFE2 -S3150800736041F21C13C2F200031A68013218BF1A60F0 -S31508007370704700BF08B5FFF7EBFF41F21C13C2F2D6 -S315080073800003186808BD00BF08B547F6C450C0F624 -S3150800739000003621FFF76AFB08BD00BF10B572B6BC -S315080073A040F20002C2F2000240F22003C2F20003D9 -S315080073B09A4210D2131D0E4CE41A24F00304043426 -S315080073C00023104647F6F461C0F600015A581A50D1 -S315080073D00433A342FAD1074807494FF0000288420E -S315080073E0B8BF40F8042BFADBF8F770FF10BD00BFF2 -S315080073F02300002080000020642500200F2AF0B416 -S3150800740045D940EA01039B0745D1A2F110070C466E -S3150800741003463F0900EB071610362568103310346B -S3150800742043F8105C54F80C5C43F80C5C54F8085CA0 -S3150800743043F8085C54F8045C43F8045CB342ECD1A6 -S315080074407B1C02F00F0CBCF1030F4FEA031319441F -S31508007450034422D90E461D46644656F8047B043C6E -S31508007460032C45F8047BF8D8ACF1040402F00302B7 -S3150800747024F0030404342344214432B10A4411F8A5 -S31508007480014B914203F8014BF9D1F0BC7047034612 -S31508007490002AF3D1F9E70346F0E76246002AEDD160 -S315080074A0F3E700BF8307F0B448D0541E002A43D040 -S315080074B0CDB2034602E0002C3ED0144603F8015B29 -S315080074C013F0030F04F1FF32F5D1032C2DD9CDB2F9 -S315080074D00F2C45EA052545EA054518D9A4F11007F4 -S315080074E003F110061A463F0906EB07161560103217 -S315080074F042F80C5C42F8085C42F8045CB242F5D1EA -S3150800750004F00F040137032C03EB07130DD91E46AD -S315080075102246043A46F8045B032AFAD8221F04F0E6 -S31508007520030422F00302043213442CB1C9B21C44EA -S3150800753003F8011BA342FBD1F0BC7047144603466F -S31508007540C3E700BF2F64656D6F70726F675F6F6CFE -S31508007550696D65785F73746D3332653430372E73B1 -S31508007560726563002F626F6F746C6F672E74787420 -S31508007570000000002E2F6C69622F7569702F6E65EA -S31508007580746465762E630000222A3A3C3E3F7C7F6F -S31508007590000000002B2C3B3D5B5D0000809A90416B -S315080075A08E418F804545454949498E8F9092924F25 -S315080075B0994F555559999A9B9C9D9E9F41494F5560 -S315080075C0A5A5A6A7A8A9AAABAC21AEAFB0B1B2B380 -S315080075D0B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3E5 -S315080075E0C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D5 -S315080075F0D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3C5 -S31508007600E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3B4 -S31508007610F4F5F6F7F8F9FAFBFCFDFEFF010305079A -S31508007620090E10121416181C1E00000061006200D4 -S3150800763063006400650066006700680069006A0008 -S315080076406B006C006D006E006F00700071007200B8 -S3150800765073007400750076007700780079007A0068 -S31508007660A100A200A300A500AC00AF00E000E10065 -S31508007670E200E300E400E500E600E700E800E900D0 -S31508007680EA00EB00EC00ED00EE00EF00F000F10080 -S31508007690F200F300F400F500F600F800F900FA002D -S315080076A0FB00FC00FD00FE00FF00010103010501CF -S315080076B0070109010B010D010F0111011301150144 -S315080076C0170119011B011D011F01210123012501B4 -S315080076D0270129012B012D012F0131013301350124 -S315080076E037013A013C013E0140014201440146018D -S315080076F048014B014D014F015101530155015701F5 -S3150800770059015B015D015F01610163016501670163 -S3150800771069016B016D016F017101730175017701D3 -S315080077207A017C017E019201B103B203B303B4036B -S31508007730B503B603B703B803B903BA03BB03BC035F -S31508007740BD03BE03BF03C003C103C303C403C5030C -S31508007750C603C703C803C903CA0330043104320485 -S3150800776033043404350436043704380439043A0437 -S315080077703B043C043D043E043F04400441044204E7 -S3150800778043044404450446044704480449044A0497 -S315080077904B044C044D044E044F0451045204530444 -S315080077A05404550456045704580459045A045B04EF -S315080077B05C045E045F0470217121722173217421B7 -S315080077C0752176217721782179217A217B217C21DF -S315080077D07D217E217F2141FF42FF43FF44FF45FF74 -S315080077E046FF47FF48FF49FF4AFF4BFF4CFF4DFF47 -S315080077F04EFF4FFF50FF51FF52FF53FF54FF55FFF7 -S3150800780056FF57FF58FF59FF5AFF0000C700FC00F4 -S31508007810E900E200E400E000E500E700EA00EB002A -S31508007820E800EF00EE00EC00C400C500C900E60061 -S31508007830C600F400F600F200FB00F900FF00D600CF -S31508007840DC00A200A300A500A7209201E100ED003C -S31508007850F300FA00F100D100AA00BA00BF00102315 -S31508007860AC00BD00BC00A100AB00BB009125922571 -S315080078709325022524256125622556255525632548 -S31508007880512557255D255C255B25102514253425AE -S315080078902C251C2500253C255E255F255A255425C3 -S315080078A069256625602550256C2567256825642584 -S315080078B0652559255825522553256B256A251825EA -S315080078C00C25882584258C2590258025B103DF0085 -S315080078D09303C003A303C303B500C403A603980315 -S315080078E0A903B4031E22C603B50329226122B100E7 -S315080078F06522642220232123F7004822B00019229A -S31508007900B7001A227F20B200A025A000410042003D -S3150800791043004400450046004700480049004A0025 -S315080079204B004C004D004E004F00500051005200D5 -S3150800793053005400550056005700580059005A0085 -S315080079402100E0FFE1FFE5FFE2FFE3FFC000C10021 -S31508007950C200C300C400C500C600C700C800C900ED -S31508007960CA00CB00CC00CD00CE00CF00D000D1009D -S31508007970D200D300D400D500D600D800D900DA004A -S31508007980DB00DC00DD00DE007801000102010401F5 -S31508007990060108010A010C010E0110011201140169 -S315080079A0160118011A011C011E01200122012401D9 -S315080079B0260128012A012C012E0130013201340149 -S315080079C0360139013B013D013F01410143014501B2 -S315080079D047014A014C014E0150015201540156011A -S315080079E058015A015C015E01600162016401660189 -S315080079F068016A016C016E017001720174017601F9 -S31508007A0079017B017D01910191039203930394030C -S31508007A10950396039703980399039A039B039C037C -S31508007A209D039E039F03A003A103A303A403A50329 -S31508007A30A603A703A803A903AA03100411041204A2 -S31508007A4013041404150416041704180419041A0454 -S31508007A501B041C041D041E041F0420042104220404 -S31508007A6023042404250426042704280429042A04B4 -S31508007A702B042C042D042E042F04010402040304F1 -S31508007A800404050406040704080409040A040B048C -S31508007A900C040E040F046021612162216321642114 -S31508007AA0652166216721682169216A216B216C217C -S31508007AB06D216E216F2121FF22FF23FF24FF25FF61 -S31508007AC026FF27FF28FF29FF2AFF2BFF2CFF2DFF64 -S31508007AD02EFF2FFF30FF31FF32FF33FF34FF35FF14 -S31508007AE036FF37FF38FF39FF3AFF0000FFFFFFFF79 -S31508007AF0FFFF00004F70656E424C54002E2E2F2E4D -S31508007B002E2F2E2E2F536F757263652F66696C653F -S31508007B102E6300004669726D776172652075706420 -S31508007B206174652072657175657374206465746522 -S31508007B30637465640A0D00004F70656E696E672090 -S31508007B406669726D776172652066696C6520666F15 -S31508007B50722072656164696E672E2E2E0000000021 -S31508007B604552524F520A0D004F4B0A0D00000000B5 -S31508007B705374617274696E67207468652070726FD9 -S31508007B806772616D6D696E672073657175656E6381 -S31508007B90650A0D0050617273696E67206669726DB9 -S31508007BA0776172652066696C6520746F206F6274F0 -S31508007BB061696E2065726173652073697A652E2E18 -S31508007BC02E00000045726173696E67200000000090 -S31508007BD02062797465732066726F6D206D656D6FAE -S31508007BE07279206174203078000000005265616463 -S31508007BF0696E67206C696E652066726F6D206669AE -S31508007C006C652E2E2E4552524F520A0D000000006A -S31508007C10496E76616C696420636865636B73756D1C -S31508007C2020666F756E642E2E2E4552524F520A0DDF -S31508007C300000000050726F6772616D6D696E672093 -S31508007C400000000020627974657320746F206D65EA -S31508007C506D6F7279206174203078000057726974EC -S31508007C60696E672070726F6772616D2063686563FD -S31508007C706B73756D2E2E2E00436C6F73696E6720BD -S31508007C806669726D776172652066696C650A0D00B2 -S31508007C904669726D776172652075706461746520D6 -S31508007CA07375636365737366756C6C7920636F6D42 -S31508007CB0706C657465640A0D000000002E2E2F2E68 -S31508007CC02E2F2E2E2F536F757263652F41524D43FB -S31508007CD04D345F53544D33322F63616E2E6300006B -S31508007CE005020602060307030803090309040A0432 -S31508007CF00B040C040C050D050E050F050F061006E2 -S31508007D0010071008000008001000180020002800BE -S31508007D1030003800400048005000580080008800B5 -S31508007D2090009800A000A800B000B800C000C800E5 -S31508007D30D000D80000C00008004000000300000082 -S31508007D40000001080000010004000000000002080D -S31508007D500000020005000000000004080000020000 -S31508007D6006000000000006080000020007000000E8 -S31508007D7000000808000002000800000000000A08C9 -S31508007D80000002000900000000000C0800000200C4 -S31508007D900A00000000000E08000002000B000000A8 -S31508007DA02E2E2F2E2E2F2E2E2F536F757263652F84 -S31508007DB041524D434D345F53544D33322F756172E2 -S31508007DC0742E63002E2E2F2E2E2F2E2E2F536F75C8 -S31508007DD07263652F41524D434D345F53544D3332D0 -S31508007DE02F4743432F766563746F72732E630000C3 -S31508007DF0002020202020202020202828282828206D -S31508007E002020202020202020202020202020202064 -S31508007E1020881010101010101010101010101010CC -S31508007E2010040404040404040404041010101010BC -S31508007E301010414141414141010101010101010186 -S31508007E4001010101010101010101010110101010D8 -S31508007E501010424242424242020202020202020258 -S31508007E6002020202020202020202020210101010AC -S31508007E7020000000000000000000000000000000D4 -S31508007E8000000000000000000000000000000000E4 -S31508007E9000000000000000000000000000000000D4 -S31508007EA000000000000000000000000000000000C4 -S31508007EB000000000000000000000000000000000B4 -S31508007EC000000000000000000000000000000000A4 -S31508007ED00000000000000000000000000000000094 -S31508007EE00000000000000000000000000000000084 -S30908007EF00000000080 -S31508007EF40100000001000000000000000102030464 -S31508007F04010203040607080904000000F07D0008BE +S3150800000064360020419400082D9400082D940008B9 +S315080000102D9400082D9400082D9400082D940008AE +S315080000202D9400082D9400082D9400082D9400089E +S315080000302D9400082D9400082D9400082D9400088E +S315080000402D9400082D9400082D9400082D9400087E +S315080000502D9400082D9400082D9400082D9400086E +S315080000602D9400082D9400082D9400082D9400085E +S315080000702D9400082D9400082D9400082D9400084E +S315080000802D9400082D9400082D9400082D9400083E +S315080000902D9400082D9400082D9400082D9400082E +S315080000A02D9400082D9400082D9400082D9400081E +S315080000B02D9400082D9400082D9400082D9400080E +S315080000C02D9400082D9400082D9400082D940008FE +S315080000D02D9400082D9400082D9400082D940008EE +S315080000E02D9400082D9400082D9400082D940008DE +S315080000F02D9400082D9400082D9400082D940008CE +S315080001002D9400082D9400082D9400082D940008BD +S315080001102D9400082D9400082D9400082D940008AD +S315080001202D9400082D9400082D9400082D9400089D +S315080001302D9400082D9400082D9400082D9400088D +S315080001402D9400082D9400082D9400082D9400087D +S315080001502D9400082D9400082D9400082D9400086D +S315080001602D9400082D9400082D9400082D9400085D +S315080001702D9400082D9400082D9400082D9400084D +S315080001802D9400082D940008704700BF704700BFE3 +S31508000190704700BF08B50020C4F20200012103F031 +S315080001A053FD10F1FF3018BF012008BD00B589B016 +S315080001B000230093019302930393049305930693F4 +S315080001C0079349F2E850C0F60000694605F072FE4A +S315080001D048B9009B002043B19DF8080080F0100044 +S315080001E0C0F3001001E00020FFE709B05DF804FB4A +S315080001F049F2E850C0F60000704700BF08B540F263 +S315080002000010C2F20000002380F8243249F2086187 +S31508000210C0F600010A2205F0ABFA30B940F2001325 +S31508000220C2F20003012283F8242208BD38B540F241 +S315080002300013C2F2000393F82432012B05D140F2D1 +S315080002400010C2F2000005F05FFD4FF4A054C4F29E +S31508000250010440252046294603F016FF0028F9D058 +S3150800026049F2E850C0F6000005F04AFE38BD00BF66 +S3150800027008B540F20013C2F2000393F82432012BAA +S3150800028005D140F20010C2F2000005F03DFD08BDA0 +S3150800029070B5064640F20013C2F2000393F8243202 +S315080002A0012B10D140F20011C2F2000105F0C8FE80 +S315080002B0002808DA40F20010C2F20000002380F895 +S315080002C0243205F021FD317889B14FF4A054C4F2E7 +S315080002D001048025204603F0CFFE2046294603F078 +S315080002E0D3FE0028F9D016F8011F0029F2D170BDF7 +S315080002F080B582B003F0CEFE0120014603F02CFD46 +S315080003000124009400278DF804708DF807700225E3 +S315080003108DF805503846C4F20200694603F04CFCD5 +S315080003202020214603F04EFD0420214603F014FD4B +S315080003304FF40066C4F2020630460621082203F08E +S3150800034089FC30460721082203F084FC8DF80670E4 +S315080003508DF807408DF80450402300938DF805501A +S315080003603046694603F028FC8DF804508023009334 +S315080003703046694603F020FC2846214603F0ECFC8B +S315080003804FF48066C4F2020630460521092203F0BE +S3150800039061FC30460621092203F05CFC60230093C9 +S315080003A08DF804508DF805508DF806708DF80740C5 +S315080003B03046694603F000FC4FF0C060214603F062 +S315080003C0EFFC07F063F907F06FF9FCE720230B80D1 +S315080003D040F20000C2F20000704700BF08B590F86E +S315080003E01231032B01D108F041FF002008BD00BFE0 +S315080003F008B508F03BFF002008BD00BF08B5084651 +S3150800040008F08CFF002008BD08B50B7813F0600FC4 +S3150800041028D14B780A2B12D00B2B18D0062B21D1BA +S315080004204B881B0A212B05D1CA88172A28BF1722F1 +S315080004300D4901E00D49172200F080FA12E040F25A +S315080004402831C2F20001012200F078FA0AE08B781E +S3150800045033B940F22833C2F2000300221A6001E0E1 +S3150800046000F0D4FA002008BD120000200900002080 +S3150800047010B50446812101F02BFA2046012101F02E +S3150800048027FA002010BD00BF10B50446812140227E +S31508000490022301F0F3F9204601214022022301F04C +S315080004A0EDF92046012141F6E802C2F20002402396 +S315080004B001F028FA002010BD41F6E800C2F200005B +S315080004C0704700BF12230B8040F26C00C2F2000096 +S315080004D0704700BF04230B8040F26800C2F2000098 +S315080004E0704700BF10B50A4641F62C14C2F2000444 +S315080004F049F21860C0F60000214600F0F7FC2046D5 +S3150800050010BD00BF10B50A4641F62C14C2F200040D +S3150800051049F22C60C0F60000214600F0E7FC2046B0 +S3150800052010BD00BF10B50A4641F62C14C2F20004ED +S3150800053049F23C60C0F60000214600F0D7FC204690 +S3150800054010BD00BF10B50A4641F62C14C2F20004CD +S3150800055049F24C60C0F60000214600F0C7FC204670 +S3150800056010BD00BF10B50A4641F62C14C2F20004AD +S3150800057049F25460C0F60000214600F0B7FC204658 +S3150800058010BD00BF704700BF704700BF704700BF6F +S3150800059008B5FFF7FBFD08BD08B5FFF7F9FD08BD6F +S315080005A008B50120FFF7F0FD08BD00BF08B500201B +S315080005B0FFF7EAFD08BD00BFF0B583B0012001468C +S315080005C003F0CAFB4FF4C853009303278DF8057050 +S315080005D002238DF8043000268DF806608DF8076032 +S315080005E03446C4F202042046694603F0E5FA20467A +S315080005F008210A2203F02EFB20460B210A2203F0CB +S3150800060029FB20460C210A2203F024FB4FF4007331 +S3150800061000938DF805708DF8046001258DF8065055 +S315080006208DF807602046694603F0C6FA4FF48063E2 +S3150800063000938DF806508DF807508DF80570204602 +S31508000640694603F0B9FA20460A210A4603F002FB76 +S315080006504FF48040294603F0B5FB8020294603F075 +S315080006608DFB03B0F0BD00BF704700BF1C2202E03F +S3150800067000BF013BFCD10138B0F1FF3F01D0134662 +S31508000680F6E7704708B54FF47A7303FB00F0FFF7F7 +S31508000690EDFF08BD10B50446D0F8E8351B69984744 +S315080006A0032384F81231002010BD00BF08B590F866 +S315080006B0123180F81331042380F81231D0F8E83566 +S315080006C0DB689847002008BD08B5D0F8E435DB6933 +S315080006D003B19847002008BD08B5D0F8E4351B6A71 +S315080006E09847002008BD00BF08B5D0F8E4355B6A16 +S315080006F09847002008BD00BF10B50446D0F8E83575 +S315080007005B699847012384F81531002010BD00BFA6 +S3150800071010B50446D0F8E8359B699847D4F8E4350F +S315080007205B68204600219847002084F8150110BD13 +S3150800073010B50446002140220B4601F09FF82046DA +S3150800074080214022002301F099F8012384F8123110 +S31508000750D4F8E8355B68A0789847002010BD00BF3C +S3150800076010B582B00446694600F02EF99DF80010CF +S3150800077001F01F03012B08D013B1022B0AD00EE09B +S315080007802046694600F050F90EE02046694600F01A +S31508000790F5FA09E02046694600F00CFB04E020461D +S315080007A001F0800101F0E4F8002002B010BD00BF9E +S315080007B010B504460A4600294AD190F81131022B91 +S315080007C037D1D0F83821D0F824319A4210D9D21A24 +S315080007D0C0F83821C178012902BFD0F828115B1862 +S315080007E0C0F82831D4F8281192B200F0B9F820E000 +S315080007F0D0F83C21B2FBF3F103FB112161B9934216 +S315080008000AD8D0F840319A4206D20A4600F0A8F82B +S315080008100023C4F840310CE0D4F8E435DB682BB18A +S3150800082094F81221032A01D120469847204600F061 +S31508000830BBF894F81631012B14D1226941F6281316 +S31508000840C2F200031B685360002384F8163109E0DE +S31508000850D0F8E4355B692BB190F81211032901D160 +S3150800086011469847002010BD10B504460A4651BBEC +S3150800087090F81131032B30D1D0F89023D0F87C337F +S315080008809A4213D9D21AC0F89023C178012902BF17 +S31508000890D0F88013C918C0F880139A4228BF1A46A0 +S315080008A0D4F8801392B200F065F816E0D0F8E43573 +S315080008B01B6923B190F81221032A00D198472046D4 +S315080008C000F062F809E0D0F8E4359B692BB190F89E +S315080008D01211032901D111469847002010BD00BF07 +S315080008E0F8B504460D4616461F46FFF765FEC4F8DA +S315080008F0E475069BC4F8E835C4F8EC652046294635 +S3150800090000F06EFFD4F8E8351B6898472046FFF7D5 +S31508000910ABFEF8BD10B50446D0F8E4351B68984719 +S31508000920D4F8E8359B689847002010BD08B5D0F87C +S31508000930E4355B689847002008BD00BF38B5044613 +S315080009400D461346C4F83C21C4F83821022280F823 +S31508000950112100212A4600F0F1FF002038BD00BF12 +S3150800096010B50C4613460021224600F0E7FF00208A +S3150800097010BD00BF10B50C4613460021224600F0F4 +S31508000980C1FF002010BD00BF10B50446042380F83F +S31508000990113100210A460B4600F0D0FF204600F030 +S315080009A0FDFE002010BD00BF10B50446052380F8E3 +S315080009B0113100210A460B4600F0A4FF204600F03C +S315080009C0EDFE002010BD00BF90F8CC350B7090F8F6 +S315080009D0CD354B7090F8CF2590F8CE3503EB022332 +S315080009E04B8090F8D12590F8D03503EB02238B8005 +S315080009F090F8D32590F8D23503EB02239BB2CB802F +S31508000A00C0F84031012380F81131704710B504460B +S31508000A10802100F0ADFF2046002100F0A9FF204606 +S31508000A2000F0BCFE10BD00BF70B582B005460C468E +S31508000A304B78092B00F29C81DFE813F02301820131 +S31508000A409A0144019A0193000A009A010301B80029 +S31508000A506288130A013B062B6DD8DFE803F00415FC +S31508000A60226C6C646800D0F8EC351B6880780DF150 +S31508000A70060198470146E388402B03D095F81231C2 +S31508000A80012B5CD108235FE0D0F8E4359B6A8078B7 +S31508000A900DF106019847014602234370C5F8F00593 +S31508000AA04DE0D2B2052A3AD8DFE802F0030C151E4B +S31508000AB02730D0F8EC355B6880780DF10601984749 +S31508000AC001463CE0D0F8EC359B6880780DF10601CC +S31508000AD09847014633E0D0F8EC35DB6880780DF1AD +S31508000AE00601984701462AE0D0F8EC351B6980785C +S31508000AF00DF106019847014621E0D0F8EC355B690F +S31508000B0080780DF106019847014618E0D0F8EC35D3 +S31508000B109B6980780DF10601984701460FE021464A +S31508000B20FFF774FF27E12146FFF770FF23E121460F +S31508000B30FFF76CFF1FE12146FFF768FF1BE1BDF8D1 +S31508000B400630002B00F01781E288002A00F0138196 +S31508000B50934238BF1A46ADF806202846FFF7EEFE40 +S31508000B6009E1A388EBB9E388DBB9A67806F07F0626 +S31508000B7090F81231032B03D12146FFF747FFFAE01D +S31508000B8080F81461314600F033FF2846FFF7FCFE73 +S31508000B901EB1022385F81231EDE0012385F81231E2 +S31508000BA0E9E028462146FFF731FFE4E0A27840F263 +S31508000BB03833C2F200031A70012A03D92146FFF717 +S31508000BC025FFD8E090F81231022B02D0032B10D063 +S31508000BD033E05AB180F81021032380F81231114608 +S31508000BE0FFF798FE2846FFF7CFFEC4E0FFF7CCFED6 +S31508000BF0C1E05AB9022380F81231002180F8101199 +S31508000C00FFF794FE2846FFF7BFFEB4E090F81011F0 +S31508000C108A420FD0FFF78AFE40F23833C2F2000349 +S31508000C20197885F810112846FFF774FE2846FFF74D +S31508000C30ABFEA0E0FFF7A8FE9DE02146FFF7E6FE23 +S31508000C4099E0E388012B03D02146FFF7DFFE92E007 +S31508000C5090F81231022B02D0032B08D00DE040F297 +S31508000C603431C2F200010122FFF768FE83E005F580 +S31508000C7088710122FFF762FE7DE02146FFF7C6FE76 +S31508000C8079E090F81231023B012B17D840F22C3349 +S31508000C90C2F2000301221A60D0F818312BB140F2D3 +S31508000CA02C33C2F2000303221A60284640F22C3184 +S31508000CB0C2F200010222FFF741FE5CE02146FFF77F +S31508000CC0A5FE58E06388012B0AD1C0F81831D0F880 +S31508000CD0E4359B68214698472846FFF755FE4AE0C3 +S31508000CE0022B48D1A38813F0FF0F44D1026952683A +S31508000CF01B0A013B042B17D8DFE803F003070B0F89 +S31508000D001300012363F306120EE0022363F30612AF +S31508000D100AE0032363F3061206E0042363F30612CC +S31508000D2002E0052363F3061241F62813C2F2000314 +S31508000D301A60012385F816312846FFF725FE1AE0C2 +S31508000D4090F81231023B012B0ED86388012B12D181 +S31508000D500023C0F81831D0F8E4359B682146984737 +S31508000D602846FFF711FE06E02146FFF74FFE02E090 +S31508000D702146FFF74BFE002002B070BD38B5044689 +S31508000D800D4690F81231032B0FD10B79012B09D898 +S31508000D90D0F8E4359B689847EB8843B92046FFF7B7 +S31508000DA0F3FD04E0FFF732FE01E0FFF72FFE002017 +S31508000DB038BD00BF38B505460C468A88D1B2637877 +S31508000DC0012B27D0002B48D0032B40F08D8090F8BC +S31508000DD01231022B02D0032B07D017E011F07F0F38 +S31508000DE000F0828000F0C4FD7EE0638823B911F02C +S31508000DF07F0F01D000F0BCFDD5F8E4359B68284686 +S31508000E00214698472846FFF7BFFD6DE02146FFF7C4 +S31508000E10FDFD69E090F81231022B02D0032B06D0B3 +S31508000E2017E011F07F0F5FD000F0A2FD5CE0638849 +S31508000E30002B59D111F07F0F07D000F0B9FDD5F876 +S31508000E40E4359B682846214698472846FFF79CFDC7 +S31508000E504AE02146FFF7DAFD46E090F81231022B08 +S31508000E6002D0032B06D03CE011F07F0F3CD000F0F7 +S31508000E707FFD39E012F0800F16D001F07F0101EBFB +S31508000E80810100EBC10191F81E3133B140F23033D4 +S31508000E90C2F2000301221A601AE040F23033C2F2AD +S31508000EA0000300221A6013E001EB810100EBC10187 +S31508000EB091F8763333B140F23033C2F2000301229F +S31508000EC01A6005E040F23033C2F2000300221A60CD +S31508000ED0284640F23031C2F200010222FFF72EFD09 +S31508000EE002E02146FFF792FD002038BD70B40646A1 +S31508000EF000B3037843B1044600230133DBB214F888 +S31508000F00015F002DF9D100E000235B000233138056 +S31508000F100B7003234B70327862B1304602230025EA +S31508000F205C1CE4B2CA540233DBB20D5510F8012F2B +S31508000F30002AF5D170BC704770B582B0054600230B +S31508000F4001930320FFF792FBEB681A6901924FF4AD +S31508000F505464C0F20304032607E03046FFF786FB15 +S31508000F60EB681A690192013C1CD0019A002AF4DA4E +S31508000F70019A42F001020192019A1A61EB681B6913 +S31508000F8001934FF45463C0F2030304E0EA6812695C +S31508000F900192013B03D0019A12F0010FF6D103200A +S31508000FA0FFF764FB002002B070BD00BF10B4C47820 +S31508000FB06CB9033300EB8200D0F8D0409B1006D002 +S31508000FC0002251F8040B206001329342F9D1002027 +S31508000FD05DF8044B704700BF70B40332D0F8D06098 +S31508000FE0951009D00A460023346842F8044B0133A9 +S31508000FF09D42F9D101EB8501084670BC704700BFD8 +S3150800100070B40023C37001238370402383800129B1 +S315080010100DD10123C37208230370042343704FF4D0 +S31508001020A073C380022303724FF0A0450EE000258B +S3150800103061B90023C3720C230370062343704FF46F +S31508001040A063C3800025C4F20405FFE7C56005F563 +S3150800105000630361467866B105F510620346002110 +S315080010609A6102F500745C650131203204338E42C0 +S31508001070F6D805F58063436105F58863C0F8CC307A +S315080010800678D6B1344605F5A06102460023C2F8B3 +S3150800109090100133203104329C42F8D86EB105F520 +S315080010A0805305EB063101F580510246C2F8D0306F +S315080010B003F5805304328B42F8D105F56065C0F814 +S315080010C00C51002070BC704738B504460025037AD9 +S315080010D0012B21D1C268936B6FF31043417A09B192 +S315080010E043F480139363E268D3686FF386136FF350 +S315080010F096536FF351436FF3D343D3602046FFF7FC +S315080011001BFFE378012B25D1052363F3440545F03E +S315080011102005E3689D6012E0C268D36843F0400387 +S31508001120D360FFF709FF637A002B0CBF4FF45023F7 +S315080011304FF4E813E26893631420FFF7A3FAE37801 +S31508001140012B07D1E3689D68052262F3440545F043 +S3150800115020059D60002038BDC3689A6842F00102E8 +S315080011609A600020704700BFC3689A6822F001029F +S315080011709A600020704700BF00B583B00023019332 +S31508001180019B43F020030193019B61F38A130193AA +S31508001190C368019A1A61C3681B6901934FF45463C3 +S315080011A0C0F2030304E0C26812690192013B03D04E +S315080011B0019A12F0200FF6D10320FFF757FA002004 +S315080011C003B05DF804FB00BF00B583B000230193AC +S315080011D0019B43F010030193C368019A1A61C3681F +S315080011E01B6901934FF45463C0F2030304E0C26819 +S315080011F012690192013B03D0019A12F0100FF6D141 +S315080012000320FFF733FA002003B05DF804FB00BFA4 +S3150800121008B5C268D3686FF35D736FF39E730129CF +S3150800122008BF43F0005302D009B943F08043D360A6 +S315080012303220FFF727FA002008BD00BFC3685B69A4 +S3150800124013F0010F14BF002001207047C3685A69C4 +S3150800125098691040704700BF03691A6861F3010274 +S315080012601A60704710B40023C2689361C1686FF0B2 +S3150800127080424A61C1684FF0FF344C60C1684A61D8 +S315080012804FF40062C8F20002C1688A61C2789A42C5 +S3150800129008BF102343F0804343F4701343F46053AC +S315080012A043F00C03C26891690B43936100205DF813 +S315080012B0044B704770B5044600252E46D0F80C310D +S315080012C01D6003691A6865F3CC221A60C37A012B7C +S315080012D026D10321FFF7C0FFE2688023536220224C +S315080012E062F31F4563F30F05E1688D62A02161F380 +S315080012F00F0663F31F46E368C3F804614FF490735F +S3150800130063F30F0662F31F46E368C3F808614FF4F8 +S31508001310A07363F30F066FF31F46E368C3F80C6107 +S3150800132020461021FFF728FF2046FFF74DFF2269C8 +S31508001330002313612269536122694FF0FF319161DD +S315080013402269D3616378002B2CD0234600221646E7 +S31508001350FF2599690868C00F002814BF4FF0904010 +S315080013600020086099690E6199698D60013261787B +S3150800137004339142EDD8A9B1234600221646FF252B +S31508001380596D0868C00F002814BF4FF09040002020 +S315080013900860596D0E61596D8D60013204336178AC +S315080013A09142EDD823691A6942F480721A61E3788A +S315080013B0012B09D10323402262F38A0343F48033C5 +S315080013C062F35943226913632046FFF74BFF002057 +S315080013D070BD00BF03699B68C3F34103022B05D0A8 +S315080013E0032B05D0012B03D003207047012070473B +S315080013F0022070470369996883691A68C1F3410135 +S31508001400022912BF6FF30A02032161F30A021A6066 +S3150800141003695A6842F480725A600020704700BF18 +S3150800142030B400224B78012B0B7800EB830401BF04 +S31508001430A469012505FA03F363F30F021FBF646D60 +S31508001440012505FA03F363F31F42236813F4004FDB +S315080014500DD18D6865F30A03CD7865F39343C98882 +S3150800146061F3995343F0805343F4004323600369BF +S31508001470D9690A43DA61002030BC704730B40023CA +S315080014801A464C78012C097800EB810401BFA4693F +S31508001490012505FA01F161F30F021FBF646D0125ED +S315080014A005FA01F161F31F426FF3CF332360036935 +S315080014B0D96921EA0202DA61002030BC704700BF10 +S315080014C070B50B464A78012A53D10A7800EB820296 +S315080014D091690A6809695C692CB96FF312010124DC +S315080014E064F3DC410DE064F312019D682C44013C71 +S315080014F0B4FBF5F565F3DC41DC78012C08BF64F331 +S315080015005E711C7800EB8404A4692161C178012905 +S3150800151006D1197800EB81018C69196961610CE0C3 +S31508001520D97801290CD0596999B101694D6B1C7894 +S31508001530012606FA04F42C434C63D978012908D10C +S315080015400169896811F4807F0CBF42F0005242F0AD +S31508001550805242F00442197800EB810189690A60D9 +S31508001560DA78012A41D1D9681A789B8AFFF71EFDD5 +S315080015703BE00A7800EB8202516D0A6809695C69EA +S3150800158034B99C6864F31201012464F3DC410CE06D +S315080015909D682C44013CB4FBF5F4C4F3090464F3D8 +S315080015A0DC4105FB04F565F312011C7800EB8404A5 +S315080015B0646D2161C178012901BF197800EB8101A9 +S315080015C04C6D196908BF6161D978012906D1597925 +S315080015D011B142F0005201E042F0805242F004425A +S315080015E01B7800EB8300436D1A60002070BD00BFB6 +S315080015F030B482B04B78012B49D1826913681469DB +S3150800160000944C696CB99DF800406FF306048DF898 +S3150800161000409DF80240012565F3C4048DF8024098 +S3150800162017E08D68AC4281BF4D619DF8004065F3B7 +S3150800163006048DF800409EBF9DF8005064F3060529 +S315080016408DF800509DF80240012565F3C4048DF815 +S315080016500240009C1461C478012C01BF0C7800EB91 +S315080016608404A5690C6908BF6C6143F004431360E0 +S31508001670C378002B49D14B69002B46D00369586BB8 +S315080016800A78012101FA02F202435A633DE00B7817 +S3150800169000EB83035A6D1368126900924A6972B99E +S315080016A08C689DF8002064F306028DF800209DF8EA +S315080016B00220012464F3C4028DF802200EE08C682F +S315080016C04C619DF8002064F306028DF800209DF811 +S315080016D00220012464F3C4028DF802200A7800EB84 +S315080016E08202546D009A2261C278012A01BF0A78E3 +S315080016F000EB8202546D0A6908BF626143F0044335 +S315080017000A7800EB8200426D1360002002B030BCFC +S31508001710704700BF4B78012B0CD10B7800EB830088 +S3150800172082691368002BB8BF43F0804343F4001363 +S31508001730136007E00B7800EB8300426D136843F4EF +S3150800174000131360002070474B78012B0B7800EBD1 +S3150800175083000CBF8269426D13686FF35553C978CD +S315080017600239C9B2012998BF43F08053136000209B +S31508001770704700BF03699A69D8691040000C704722 +S3150800178000EB81014B6D9B680269506918407047F0 +S3150800179003699869DB69184080B2704782B00023F4 +S315080017A00093C0238DF803304FF00003012262F343 +S315080017B0C4038DF8023018238DF80030436D009A63 +S315080017C01A61C378012B08D1436D00F2CC525A61D5 +S315080017D0436D1A684FF080221A6002B0704700BF46 +S315080017E070B50446FFF70CFC012384F81231002378 +S315080017F084F8143163787BB3234600220126114608 +S31508001800402583F81D6183F81C21A3F8222183F85B +S315080018101F11C3F82451C3F82811C3F83011013237 +S31508001820607828339042ECD8B0B12346002211469E +S31508001830402583F8751383F87423A3F87A2383F86D +S315080018407713C3F87C53C3F88013C3F8881301329F +S31508001850283360789042ECD82046FFF785FC20466E +S31508001860FFF732FC20460021FFF7D2FC2046FFF79F +S3150800187021FD2046FFF770FC70BD00BF38B511F09A +S31508001880800F0FD001F07F0404EB840500EBC5053B +S3150800189005F58E7185F81C4101254D708A60CB705F +S315080018A0CC800DE001F07F0404EB840500EBC50550 +S315080018B005F55D7185F8744300244C708A60CB7019 +S315080018C0022B04BF00230B71FFF7AAFD002038BDC9 +S315080018D008B5CAB212F0800F01F07F0303EB830349 +S315080018E000EBC30314BF03F58E7303F55D7301F0B4 +S315080018F07F011970D2095A701946FFF7BFFD0020FB +S3150800190008BD00BF38B501F07F0404EB840500EB81 +S31508001910C50505F55D71CA604B6100238B614B7087 +S3150800192085F87443C378012B08BF0A6114B9FFF719 +S315080019305FFE01E0FFF7C4FD002038BD70B501F079 +S315080019407F0404EB840500EBC50505F58E710126B9 +S315080019504E7085F81C41CA600A6100228A614B6193 +S3150800196014B9FFF745FE01E0FFF7AAFD002070BD98 +S3150800197010B5CAB212F0800F1FBF01F07F0303EB48 +S31508001980830300EBC30303F58E7302BF01EB8103E8 +S3150800199000EBC30303F55D7301249C7001F07F011E +S315080019A01970D2095A701946FFF7B4FE002010BD07 +S315080019B010B5CAB212F0800F1FBF01F07F0303EB08 +S315080019C0830300EBC30303F58E7302BF01EB8103A8 +S315080019D000EBC30303F55D7300249C7001F07F01DF +S315080019E01970D2095A701946FFF7AEFE204610BD87 +S315080019F0002361F30A13026911680B4313607047E9 +S31508001A0008B503695A6842F002025A600320FEF7D5 +S31508001A1039FE08BD2DE9F04F87B08146FFF70EFC69 +S31508001A20002800F0A0824846FFF710FC83460028ED +S31508001A3000F09B8210F4002F08BF00205CD04846B7 +S31508001A40FFF798FE0446002854D04D464F46002618 +S31508001A5040F29C08C2F20008CDF800B0C34614F064 +S31508001A60010F40D05FFA86FA48465146FFF788FECE +S31508001A70804610F0010F23D04FF001086B6DC3F8B4 +S31508001A80088099F80330434508D16B6D1A69C2F38B +S31508001A901202D7F87C339B1AC7F88C33DBF8003070 +S31508001AA01B6848465146984799F80330012B07D1D9 +S31508001AB036B999F81131052B02D14846FFF76EFE63 +S31508001AC018F0020F1FBF4FF002086B6D42469A606E +S31508001AD018F0080F07D0DBF800309B68484698478F +S31508001AE06B6D082098600136043528376408B6D12E +S31508001AF0DDF800B00120FFE71BF4802F00F0BC8062 +S31508001B004846FFF745FE0646002800F0B4804F46D3 +S31508001B10CA464FF0000840F29C02C2F20002019247 +S31508001B20CDF808B0CDF8009016F0010F00F09780B8 +S31508001B305FFA88F90098036919695C6B00EB8902FA +S31508001B409269926824FA09F4E401E4B20C43144059 +S31508001B5014F0010F1CD0596B012202FA08F021EA91 +S31508001B60000159631446BB699A60019A13685B6859 +S31508001B700098494698470098C378A34208D1B8F117 +S31508001B80000F05D190F81131042B01D1FFF706FE9D +S31508001B9014F0080F1EBF0824BB699C6014F0100FD0 +S31508001BA01EBF1024BB699C6014F0400F1EBF402462 +S31508001BB0BB699C6014F0020F1EBF0224BB699C60BF +S31508001BC014F0800F4BD05446DAF83021DAF8343165 +S31508001BD0D01ADAF82431BB46BA69916989B29842B3 +S31508001BE038BF03460333B1EB930F34D9DAF83451CF +S31508001BF0DAF83031AB422ED96BB30396009E5D1BE3 +S31508001C00D4F82421AA4238BF15463046D4F82811FC +S31508001C104A46ABB2FFF7CAF9D4F828312B44C4F8C0 +S31508001C202831D4F834312B44C4F83431DBF8183071 +S31508001C309B6903359BB2B3EB950F09D9D4F8345198 +S31508001C40D4F83031AB4205D9002BD8D1039E02E037 +S31508001C50039E00E0039EDBF8183080229A6008F1A4 +S31508001C60010804370AF1280A76087FF45DAFDDF823 +S31508001C7008B0DDF8009001201BF0020F1EBFD9F84E +S31508001C800C3002225A61BBF1000F1FDA99F80A30AC +S31508001C9043B1D9F80C316FF341036FF30003D9F858 +S31508001CA00C211360D9F810305A6822F001025A60E4 +S31508001CB040F29C03C2F200031B689B69484698479A +S31508001CC0D9F80C304FF000425A6101201BF4006F1E +S31508001CD03AD000238DF8173099F812318DF817305D +S31508001CE040F29C03C2F200031B685B6948469847AA +S31508001CF0D9F810309968D9F80C304FF400625A6157 +S31508001D0099F80A30FBB111F0010F1CD099F815317A +S31508001D10012B18D19DF81730DBB2032B13D1D9F854 +S31508001D200C311A6842F001021A60D9F80C311A68A7 +S31508001D3042F003021A604FF46D43CEF200031A69AB +S31508001D4042F006021A6101201BF0080F0CD040F27F +S31508001D509C03C2F200031B68DB6848469847D9F81B +S31508001D600C3008225A6101201BF0100F38D0D9F820 +S31508001D700C309A6922F010029A61D9F80C301C6A64 +S31508001D8004F00F0303EB830309EBC30505F55D7543 +S31508001D90C4F34343022B02D0062B0FD019E0C4F339 +S31508001DA00A14B4B14846E9682246FFF715F9EB6804 +S31508001DB02344EB60AB692344AB610AE0484609F269 +S31508001DC0CC510822FFF708F9C4F30A14AB69234477 +S31508001DD0AB61D9F80C309A6942F010029A61012079 +S31508001DE01BF4805F4CD00024274626462546D9F8A2 +S31508001DF010305A6822F001025A6048462146FFF719 +S31508001E00BBF999F8013063B14B462246FF21986920 +S31508001E108160586D81600132043399F8010082426D +S31508001E20F5D3D9F810304FF0FF329A614FF0010818 +S31508001E3068F30F0468F31F44D9F81030DC6147F0E3 +S31508001E400B07D9F810305F6146F00B06D9F8103049 +S31508001E501E61D9F810301A686FF30A121A604846DC +S31508001E60FFF79CFC45F48055D9F80C305D6140F2CB +S31508001E709C03C2F200031B681B6948469847404604 +S31508001E801BF4005F26D04846FFF7B4FAD9F80C30A1 +S31508001E90DC684846FFF79EFA032801BF002389F845 +S31508001EA002304FF40073A9F804300FBF0923012349 +S31508001EB089F8023040231CBFA9F80430052363F3D0 +S31508001EC08D24D9F80C30DC60D9F80C304FF4005268 +S31508001ED05A6101201BF4801F0DD040F29C03C2F208 +S31508001EE000031B68DB6948469847D9F80C304FF45D +S31508001EF080125A6101201BF4001F0DD040F29C038A +S31508001F00C2F200031B681B6A48469847D9F80C308A +S31508001F104FF400125A6101201BF0804F0DD040F299 +S31508001F209C03C2F200031B685B6A48469847D9F8C7 +S31508001F300C304FF080425A6101201BF0040F15D077 +S31508001F40D9F80C305C6814F0040F07D040F29C03F3 +S31508001F50C2F200031B689B6A48469847D9F80C30BA +S31508001F605C60012002E0002000E0002007B0BDE828 +S31508001F70F08F00BF08B54FF43053C4F201035B6B12 +S31508001F8013F0450F07D14FF43052C4F20102536BD8 +S31508001F9013F0450FFBD013F0040F04D0042001F012 +S31508001FA0E1FF032008BD13F0010F04D0012001F062 +S31508001FB0D9FF012008BD40F2FF5001F0D3FF0020F1 +S31508001FC008BD00BF10B504464FF43053C4F20103F0 +S31508001FD05B6B13F0450F07D14FF43052C4F2010280 +S31508001FE0536B13F0450FFBD013F0040F04D00420F5 +S31508001FF001F0B8FF032010BD13F0010F04D0012033 +S3150800200001F0B0FF012010BD01F064FFA04249D1E4 +S3150800201040F2FF5001F0A6FF002001F063FF4EF2E8 +S315080020200803CFF6FF530340002B3DD000283DDBC5 +S3150800203010F0804F3CD110F0005F3BD110F0805F6C +S315080020403AD110F0006F39D110F0806F38D110F006 +S31508002050807F37D110F4000F36D110F4800F35D1B8 +S3150800206010F4001F34D110F4801F33D110F4002F60 +S3150800207032D110F4802F31D110F4003F30D110F452 +S31508002080803F2FD110F4004F2ED110F4804F2DD160 +S3150800209010F4005F2CD100F00800002814BF1A20A5 +S315080020A0002010BD102010BD002010BD1C2010BD42 +S315080020B0092010BD0A2010BD0B2010BD0C2010BD34 +S315080020C00D2010BD0E2010BD0F2010BD102010BD14 +S315080020D0112010BD122010BD132010BD142010BDF4 +S315080020E0152010BD162010BD172010BD182010BDD4 +S315080020F0192010BD2DE9F04182B00446002001F0F8 +S31508002100F1FE10F0007F18BF0E2040F01781002264 +S315080021100092019240F2F030C2F2000008210160FC +S315080021201025456040218160C2604FF480620261DB +S3150800213001F0B8FE2846FFF745FF002840F0FC806E +S3150800214040F2F030C2F2000040F29432C2F20002CD +S315080021501268AA4002603725456040228260002244 +S31508002160C2604FF48062026101F09CFE2846FFF7C8 +S3150800217029FF002840F0E18040F23C30C2F200001E +S315080021804FF0FF3303600823436030238360022344 +S31508002190C360002505610123436101F0B1FE40F2E9 +S315080021A0F030C2F2000005603326466040228260A5 +S315080021B0C5604FF48062026101F074FE3046FFF795 +S315080021C001FF002840F0BA80ADF104084FF43055FD +S315080021D0C4F2010540F22A664FF4001707E03846B4 +S315080021E001F0B6FE18B101F0A3FE48F8040F6B6BB8 +S315080021F03342F4D0082001F0ABFE20B1082001F0EC +S31508002200B1FE04209AE0022001F0A2FE20B10220CD +S3150800221001F0A8FE022091E0202001F099FE20B1ED +S31508002220202001F09FFE062088E04FF4007001F0A0 +S315080022308FFE28B14FF4007001F094FE07207DE070 +S3150800224040F2FF5001F08EFE009A130643EA12632D +S3150800225002F47F4143EA012302F47F0243EA122390 +S31508002260012C34D113F4802F08BF252066D040F204 +S31508002270F030C2F2000040F29432C2F20002126854 +S315080022801204026037244460402282600022C26041 +S315080022904FF48062026101F005FE2046FFF792FEC8 +S315080022A0002847D140F2F030C2F200000222026054 +S315080022B006244460402282600022C2604FF4806295 +S315080022C0026101F0EFFD2046FFF77CFE36E013F4CD +S315080022D0803F08BF252031D040F2F030C2F200001E +S315080022E040F29432C2F200021268120402603724E5 +S315080022F04460402282600022C2604FF4806202611C +S3150800230001F0D0FD2046FFF75DFEA0B940F2F0309F +S31508002310C2F2000000220260062444604021816067 +S31508002320C2604FF48062026101F0BCFD2046FFF7EF +S3150800233049FE03E002E001E000E0FFE702B0BDE885 +S31508002340F08100BF00B583B001238DF807304FF444 +S315080023500060C4F202004FF4006101F075FC10B988 +S3150800236000238DF807309DF8070003B05DF804FBDD +S315080023702DE9F04782B000248DF8074040F27C3002 +S31508002380C2F2000076230375046044608460C4606A +S31508002390046101F059FD032001F076FD012001F0EA +S315080023A06DFD40F2F030C2F20000046044608460C3 +S315080023B0C4604FF48063036101F074FD4FF4803408 +S315080023C0802501E0013C0CD0284601F0C1FD00281B +S315080023D0F8D003233CB140F2FF5001F0C3FD0023BF +S315080023E001E00323FFE78DF807309DF8073013F067 +S315080023F0FF0F03D09DF80700C0B2F5E040F2F030B9 +S31508002400C2F200004FF4D5730360082343604023EB +S3150800241083600023C3604FF48063036101F042FDCB +S315080024204FF43053C4F201035A6B12F0450F0ED124 +S315080024304FF480334FF43051C4F20101013B4A6B2B +S3150800244012F0450F02D1002BF8D103E013B112F0B8 +S31508002450040F04D0042001F085FD032309E012F0DF +S31508002460400F08BF002304D0402001F07BFD002365 +S31508002470FFE78DF807309DF8073013F0FF0F08D1F6 +S3150800248040F26433C2F2000301221A604FF080451D +S3150800249014E040F2F030C2F200000025056037244F +S315080024A0446040228260C5604FF48062026101F098 +S315080024B0F9FC2046FFF786FD8DF8070040F2F0305C +S315080024C0C2F2000000220260372444604021816085 +S315080024D0C2604FF48062026101F0E4FC2046FFF717 +S315080024E071FD8DF807009DF8073013F0FF0F78D1BE +S315080024F0002740F2F034C2F20004B846B94645F067 +S31508002500004545F4801A4FF43055C4F20105C4F865 +S315080025100090372666604023A360C4F80C904FF4F9 +S3150800252080632361204601F0BDFC3046FFF74AFD73 +S315080025308DF807009DF8073013F0FF0F03D09DF8BC +S315080025400700C0B250E0C4F800A029236360402306 +S31508002550A360C4F80C804FF480632361204601F021 +S31508002560A1FC6B6B13F0450F03D16B6B13F0450F92 +S31508002570FBD013F0040F04D0042001F0F3FC03236E +S3150800258004E040F2FF5001F0EDFC43468DF80730B9 +S315080025909DF8073013F0FF0F03D09DF80700C0B26F +S315080025A022E0404601F09EFC013701464FF6FE73D5 +S315080025B0C043C00F9F4288BF00200028A7D19F4272 +S315080025C006D91B238DF807309DF80700C0B20BE02B +S315080025D011F0804F1FBF40F26433C2F2000302229B +S315080025E01A609DF80700C0B202B0BDE8F08700BFC8 +S315080025F038B501F04FFC002800F0BC8040F2643387 +S31508002600C2F200031B68042B00F0B68040F2F030DB +S31508002610C2F200000023036002224260C0228260E8 +S31508002620C3604FF48063036101F03CFCFFF7A2FC32 +S31508002630002840F0A38001F055FC40F26834C2F24D +S3150800264000042060042001F04DFC6060082001F0C1 +S3150800265049FCA0600C2001F045FCE06040F26433C0 +S31508002660C2F200031B68062B18BF022B88BF012283 +S315080026704AD840F2F030C2F2000000230360032279 +S31508002680426040228260C3604FF48063036101F0B8 +S3150800269009FC4FF43053C4F201035B6B13F0450F8A +S315080026A007D14FF43052C4F20102536B13F0450FB1 +S315080026B0FBD013F0040F04D0042001F053FC0320D0 +S315080026C038BD13F0010F04D0012001F04BFC0120A6 +S315080026D038BD01F0FFFB032854D140F2FF5001F04A +S315080026E041FC002001F0FEFB10F4604F08BF020C0D +S315080026F00AD010F4005F47D110F4804F46D110F489 +S31508002700004F45D10122FFE740F26433C2F20003CD +S315080027101B68042B33D040F29433C2F200031A60CC +S3150800272040F2F030C2F2000012040260092343604E +S31508002730C02383600023C3604FF48063036101F004 +S31508002740B1FBFFF717FC0546D8B901F0CBFB40F201 +S315080027505434C2F200042060042001F0C3FB606018 +S31508002760082001F0BFFBA0600C2001F0BBFBE06075 +S31508002770284638BD252038BD002038BD38BD002084 +S3150800278038BD38BD102038BD132038BD102038BDDF +S315080027900F2038BDF0B4014640F26433C2F200039C +S315080027A01C6880F8564040F29433C2F200031B6856 +S315080027B0A0F8543040F25433C2F200031A68150EDA +S315080027C0E8B286090E70C5F383054D7000F0030064 +S315080027D08870C2F30740C870C2F307200871D2B2E6 +S315080027E04A715B681A0E1201CA80C3F30742C88889 +S315080027F080B240EA1210C88002F00F020A72C3F3D0 +S315080028000720C2094A72C0F380128A72C0F34012C6 +S31508002810CA72C0F300120A7300224A73012C42D806 +S3150800282000F00300800208610A69DBB242EA83030A +S315080028300B6140F25433C2F200039868020ED3B219 +S315080028400C6944EA93140C61C2F3C2020A7503F0D8 +S3150800285007034B75C0F307435A098A75C3F3820207 +S31508002860CA7503F003035B000B76C0F307200B7EE3 +S3150800287043EAD0130B760F690A7E0E7AF6B2012365 +S3150800288003FA06F60E65023203FA02F2D517A2FB20 +S31508002890062306FB05337E1CA2FB064506FB0355ED +S315080028A0C1E9124524E0022C22D103F03F031B04A0 +S315080028B00B6140F25433C2F2000398680B69020EAA +S315080028C043EA02230B610B69C0F3074213430B610A +S315080028D0C0F307200A690023013243F10003DB0431 +S315080028E043EA5233D2048A64CB644FF400730B650F +S315080028F0C0F380134B7600F03F004000887640F224 +S315080029005433C2F200031A7A887E40EAD2108876D7 +S3150800291002F07F02CA76DA68130ED8B2C4090C77B9 +S31508002920C3F341144C77C3F382038B7700F003009B +S315080029308000C877C2F30743C87F40EA9310C87778 +S31508002940C3F3401081F82000002081F8210003F02D +S31508002950010381F82230C2F30723DC0981F82340FA +S31508002960C3F3801481F82440C3F3401481F825404A +S31508002970C3F3001481F82640C3F3810481F8274085 +S3150800298003F0030381F82830C2F3460281F82920B0 +S31508002990012481F82A4040F26833C2F200031A681B +S315080029A0150E81F82C50C2F307452D02CD85CD8D25 +S315080029B0ADB2C2F307263543CD8512060A635A68B7 +S315080029C00D6B160E45EA06450D630D6BC2F30746F9 +S315080029D045EA06250D630D6BC2F3072635430D63DD +S315080029E0D2B281F834209A68150E81F83550C2F3B0 +S315080029F007452D068D638D6BC2F3072645EA064506 +S31508002A008D638D6BD2B245EA02228A63DB688A6BD4 +S31508002A1042EA13628A63C3F3074291F83C5045EAD7 +S31508002A20121581F83C5002F00F021202CA87CA8FAB +S31508002A3092B2C3F307252A43CA87C3F3460381F82C +S31508002A40403081F84140F0BC704700BF10B540F2F5 +S31508002A506433C2F200031B68032B31D0022B31D832 +S31508002A60B0F5805F30D0B0F5006F15D10120FFF7C3 +S31508002A7041FB044650BB40F27C30C2F20000002203 +S31508002A8002750260426082604FF40061C1600261B3 +S31508002A9001F0DAF9204610BD0020FFF72BFB0446AB +S31508002AA0A8B940F27C30C2F200000022027502602A +S31508002AB042608260C260026101F0C6F9204610BD1C +S31508002AC0272010BD002010BD272010BD10BD10BD49 +S31508002AD010B540F2F033C2F20003186007245C60B8 +S31508002AE040229A600022DA604FF480621A61184622 +S31508002AF001F0D8F92046FFF765FA10BD2DE9F04137 +S31508002B0084B000268DF80F600C20012101F024F90D +S31508002B104FF40064C4F20204204608210C2201F096 +S31508002B2099F8204609210C2201F094F820460A213A +S31508002B300C2201F08FF820460B210C2201F08AF8AE +S31508002B4020460C210A4601F085F84FF44067C4F286 +S31508002B500207384602210C2201F07CF84FF4706314 +S31508002B60019301258DF809504FF002088DF8088069 +S31508002B708DF80A608DF80B50204601A901F01CF863 +S31508002B800423019338460DEB030101F015F84FF4C1 +S31508002B90805301938DF80B60204601A901F00CF8CB +S31508002BA04FF4006701978DF808808DF80B60204672 +S31508002BB001A901F001F83846294601F003F94FF456 +S31508002BC08000294601F0C8F801F032F9FFF7D0FB7A +S31508002BD08DF80F009DF80F3013F0FF0F03D09DF806 +S31508002BE00F00C0B240E0FFF703FD8DF80F009DF817 +S31508002BF00F3013F0FF0F03D09DF80F00C0B233E07B +S31508002C0040F27C30C2F20000002303750360436083 +S31508002C108360C360036101F017F940F29830C2F28D +S31508002C200000FFF7B7FD8DF80F009DF80F3013F081 +S31508002C30FF0F0BD140F29833C2F20003B3F85400E9 +S31508002C4000040021FFF744FF8DF80F009DF80F30B0 +S31508002C5013F0FF0F05D14FF40060FFF7F7FE8DF86C +S31508002C600F009DF80F00C0B204B0BDE8F08100BFA8 +S31508002C702DE9F84307461646BDF8204040F239329A +S31508002C80C2F200020021117040F27832C2F200024C +S31508002C90116040F20440C2F2000001604FF4305265 +S31508002CA0C4F20102D16240F26431C2F200010A683C +S31508002CB0022A02BF760A46EAC3564FF40074A046B3 +S31508002CC040F2F030C2F20000046010224260402256 +S31508002CD082600022C2604FF48062026101F0E2F86D +S31508002CE04FF48034802501E0013C04D0284601F0E9 +S31508002CF02FF90028F8D01020FFF764F9002840F0D3 +S31508002D00868040F23C30C2F200004FF0FF33036089 +S31508002D10C0F80480902383600223C3600025056100 +S31508002D200123436101F0ECF840F2F030C2F20000F2 +S31508002D3006601124446040228260C5604FF48062B8 +S31508002D40026101F0AFF82046FFF73CF9002860D190 +S31508002D504FF43055C4F2010540F22A664FF4004894 +S31508002D604FF000090BE0404601F0F2F838B14C4646 +S31508002D7001F0DEF838510434202CF9D120376B6B7A +S31508002D803342F0D0082001F0E3F828B1082001F01A +S31508002D90E9F80420BDE8F883022001F0D9F828B143 +S31508002DA0022001F0DFF80220BDE8F883202001F0B8 +S31508002DB0CFF828B1202001F0D5F80620BDE8F88321 +S31508002DC04FF4007001F0C4F84FF0FF344FF40015CB +S31508002DD058B14FF4007001F0C5F80720BDE8F88334 +S31508002DE001F0A6F847F8040B013C284601F0B0F8B4 +S31508002DF008B1002CF4D140F2FF5001F0B3F840F2CC +S31508002E00CC03C2F2000300201860BDE8F883BDE8D1 +S31508002E10F883BDE8F88300BF2DE9F84F80461446CD +S31508002E20BDF8282040F23930C2F2000000210170B6 +S31508002E3040F27830C2F20000016040F20440C2F26B +S31508002E40000001604FF43050C4F20100C16240F244 +S31508002E506431C2F200010968022902BF640A44EA21 +S31508002E60C3544FF40072164640F2F030C2F2000026 +S31508002E70026010254560402282600022C2604FF43D +S31508002E808062026101F00EF82846FFF79BF80028D9 +S31508002E9040F08B8040F2F030C2F200000460182443 +S31508002EA04460402282600022C2604FF48062026160 +S31508002EB000F0F8FF2046FFF785F8002877D140F2A2 +S31508002EC03C30C2F200004FF0FF33036046609023A7 +S31508002ED083600024C46004610123436101F010F893 +S31508002EE0A3464FF43054C4F2010440F21A654FF475 +S31508002EF0804625E0304601F02BF808B3CBF5007A7A +S31508002F00BAF11F0F10D85FEA9A0A19D0C1460027EE +S31508002F1059F8040B01F014F801375745F8D14FEA70 +S31508002F208A0AD044D3440BE0002758F8070001F07A +S31508002F3007F80437202FF8D108F120080BF1200BE9 +S31508002F40636B2B42D6D0082001F002F828B108207E +S31508002F5001F008F80420BDE8F88F022000F0F8FF19 +S31508002F6028B1022000F0FEFF0220BDE8F88F1020ED +S31508002F7000F0EEFF28B1102000F0F4FF0520BDE8B0 +S31508002F80F88F4FF4007000F0E3FF30B14FF4007093 +S31508002F9000F0E8FF0720BDE8F88F40F2CC03C2F244 +S31508002FA0000300201860BDE8F88FBDE8F88FBDE87B +S31508002FB0F88F00BF38B50546F8B140F2F030C2F2D6 +S31508002FC0000040F29432C2F2000212681204026053 +S31508002FD00D244460402282600022C2604FF4806261 +S31508002FE0026100F05FFF2046FEF7ECFF044630B9A9 +S31508002FF000F078FF2860204638BD262038BD38BD49 +S3150800300000B583B000230193FFF79CF9012818BF88 +S31508003010FF2008D101A8FFF7CDFF18B90198C0F322 +S31508003020432000E0FF2003B05DF804FB08B5FFF776 +S31508003030E7FF042804D0FF2814BF0120022008BD9A +S31508003040002008BD00B597B0FFF758FD60B940F2FB +S31508003050D003C2F200031A7802F0FE021A7068461C +S31508003060FFF798FB002006E040F2D003C2F2000307 +S3150800307001221A70032017B05DF804FB08B540F268 +S31508003080D003C2F2000301221A7050B9FFF7CEFF2F +S3150800309038B940F2D003C2F200031A7802F0FE02F1 +S315080030A01A7040F2D003C2F20003187808BD00BFB8 +S315080030B02DE9F043ADF5037D88461746D0B11CE0EF +S315080030C0013BDCB24FF000094FF40075E619009594 +S315080030D002A872024B46FFF7CBFD80B9FFF7A6FFA1 +S315080030E00128FBD008EB442002A92A4606F0D8F9A5 +S315080030F04CB906E001204BB1E2E7012006E00120C9 +S3150800310004E0002002E0013CE4B2DFE70DF5037DB0 +S31508003110BDE8F0832DE9F043ADF5037D0F469046F3 +S31508003120F0B120E0013BDCB24FF400754FF0000926 +S3150800313002A807EB44212A4606F0B2F904EB080672 +S31508003140009502A872024B46FFF766FE052818BFCF +S3150800315000280AD1FFF76AFF0128FBD04CB906E020 +S3150800316001204BB1DEE7012006E0012004E0002043 +S3150800317002E0013CE4B2DBE70DF5037DBDE8F08330 +S3150800318010B596B0144640F2D003C2F200031B787D +S3150800319013F0010F18BF032021D103291AD8DFE83D +S315080031A001F002041015002019E0A8B96846FFF7D7 +S315080031B0F1FA129B5B0A139A43EAC2532360002072 +S315080031C00DE04FF400731380002008E030B9202387 +S315080031D0136004E0042002E0002000E0002016B09E +S315080031E010BD00BF0020C4F2AA20704708B54FF0F2 +S315080031F00070012100F0F8FD4FF00070002100F08A +S31508003200F3FD08BD0023036043608360C360036168 +S3150800321043618361C361036243628362C36203637A +S3150800322043638363C3634022026420224264836447 +S31508003230C364036543658365C36503668022426686 +S315080032408366C366036743678367C3674FF0806215 +S31508003250C0F880204FF00072C0F884204FF08071CB +S31508003260C0F888104FF40011C0F88C10C0F89030E0 +S31508003270C0F89430C0F89830C0F89C30C0F8A03038 +S31508003280C0F8A420C0F8A8304FF40032C0F8AC202B +S315080032904FF48072C0F8B020C0F8B430C0F8B83027 +S315080032A0704700BF82B0002301934FF40043C4F275 +S315080032B002031A6902F01C02890101F4F8610A4343 +S315080032C0C00281B20A4342F001021A614FF4004279 +S315080032D0C4F202024FF6FE71C0F20401019B0133EB +S315080032E00193136913F0010F02D0019B8B42F5D9A4 +S315080032F0019A4FF6FF73C0F204039A421FBF4FF4B8 +S315080033000043C4F20203586980B208BF002002B025 +S31508003310704700BF10B483B0002301934FF40043F5 +S31508003320C4F202031C6904F01C0444F00304890176 +S3150800333001F4F8610C43C00281B20C435A611C6166 +S315080033404FF40042C4F202024FF6FE71C0F20401C5 +S31508003350019B01330193136913F0010F02D0019BFE +S315080033608B42F5D901984FF6FF73C0F20403C01AD1 +S3150800337018BF012003B05DF8044B7047F0B587B05D +S3150800338004460D460023059300934FF40043C4F208 +S3150800339002031E6926F01C0601A800F06FFC0299BC +S315080033A04FF45343CFF6CE630B444EF2BF12C0F22E +S315080033B0E402934298BF46F008061AD94FF2401322 +S315080033C0CFF6E9530B4447F63F02C0F27D1293420B +S315080033D098BF46F00C060CD94FF4F243CFF66C436F +S315080033E00B444FF4B442C0F26222934288BF46F0BF +S315080033F004064FF40043C4F202031E612846002166 +S315080034004FF40042FFF786FF002800F00F814FF0C7 +S3150800341080630593059B2BB1059B013B0593059B93 +S31508003420002BF9D12368002B5ED001274FF6FE76D4 +S31508003430C0F20406009B0133009328463946FFF77D +S3150800344031FF00F0040083B213B9009BB342F1D9EF +S31508003450009A4FF6FF73C0F204039A4208BF002091 +S3150800346000F0E9800021009128464FF48052FFF7CA +S3150800347051FF002800F0DC8001274FF6FE76C0F2E7 +S315080034800406009B0133009328463946FFF70AFFD6 +S3150800349000F0200080B210B9009BB342F1D9009A1F +S315080034A04FF6FF73C0F204039A4208BF002000F0EB +S315080034B0C2800023009328461021FFF7F3FE00F090 +S315080034C004039BB21BB14FF40063236201E000239F +S315080034D0236200F002039BB213B1002363611BE071 +S315080034E04FF48043636117E06369226AD20842EAAF +S315080034F053022846002192B2FFF70CFF002800F07D +S3150800350099806FF07F430593059B2BB1059B013B83 +S315080035100593059B002BF9D14FF40043C4F202032F +S31508003520196848F20F12CFF620720A40A06861683F +S315080035300843E16808432169084361690843A169AA +S315080035400843E1690843216A0843616A0843A16A96 +S315080035500843E16A0843216B0843616B01430A4348 +S315080035601A60E16BA26B1143226C1143626C114322 +S31508003570A26C1143E26C1143226D1143626D0A433A +S315080035805A60A26D9A60E26DDA609869A16E626E01 +S315080035901143E26E1143226F1143626F11434FF6D6 +S315080035A0417202400A43216E42EA01419961E16F84 +S315080035B0A26F0A43DA6103F58053996943F62372C9 +S315080035C0CFF6DE020A40D4F88400D4F88010084307 +S315080035D0D4F888100843D4F88C100843D4F890100F +S315080035E00843D4F894100843D4F898100843D4F83C +S315080035F09C100843D4F8A01001430A439A61D4F8F2 +S31508003600A410D4F8A820114341F40001D4F8AC2042 +S315080036101143D4F8B0201143D4F8B8200A43D4F89B +S31508003620B41042EA81021A60012004E0002002E098 +S31508003630002000E0002007B0F0BD00BF40B14FF405 +S315080036400043C4F202031A6842F008021A6070477F +S315080036504FF40043C4F202031A6822F008021A6003 +S31508003660704700BF40B14FF40043C4F202031A6822 +S3150800367042F004021A6070474FF40043C4F2020392 +S315080036801A6822F004021A60704700BF4FF410430C +S31508003690C4F202031A6842F001021A60704700BFBA +S315080036A04FF41043C4F20203186800F00100704793 +S315080036B04FF41043C4F202039A6942F480129A61E5 +S315080036C0704700BF40B14FF41043C4F202039A6931 +S315080036D042F400529A6170474FF41043C4F2020351 +S315080036E09A6922F400529A61704700BF40B14FF4BC +S315080036F01043C4F202039A6942F002029A617047C3 +S315080037004FF41043C4F202039A6922F002029A6146 +S31508003710704700BF08B50120FFF790FFFFF7C8FF05 +S315080037200120FFF79FFF0120FFF7CCFF0120FFF7DD +S31508003730DDFF08BD2DE9F047B2B04FF0F05001218A +S3150800374000F00AFB4720012100F006FB4FF48040F9 +S31508003750012100F037FB012000F00AFC8E2330938C +S3150800376000268DF8C66002248DF8C4408DF8C7601F +S315080037708DF8C5403746C4F20207384630A900F02E +S315080037801BFA384601210B2200F064FA3846214616 +S315080037900B2200F05FFA384603210B2200F05AFA92 +S315080037A0384607210B2200F055FA4FF40063309390 +S315080037B08DF8C6608DF8C4408DF8C7608DF8C54091 +S315080037C04FF4C057C4F20207384630A900F0F4F99E +S315080037D038460B210A4600F03DFA322330938DF81D +S315080037E0C6608DF8C4408DF8C7608DF8C5404FF4A3 +S315080037F00068C4F20208404630A900F0DDF94046E8 +S3150800380001210B2200F026FA404604210B2200F083 +S3150800381021FA404605210B2200F01CFA4FF4C0435A +S3150800382030938DF8C6608DF8C4408DF8C7608DF862 +S31508003830C540384630A900F0BFF938460D210B229D +S3150800384000F008FA38460E210B2200F003FAFFF7BB +S31508003850CDFCFFF71BFFFFF723FF0128FBD001A8CC +S31508003860FFF7D0FC0024019408944FF400730B93DF +S315080038700C944FF000430F9320231293149415943D +S3150800388016944FF4006309934FF4804306934FF060 +S31508003890020A4FF003094CF2F108C0F2070841F298 +S315080038A01967C0F22207A6B230465146FFF7FAFC5E +S315080038B060F31F4530464946FFF7F4FC60F30F05F1 +S315080038C0BD4218BF454503D00134202CEBD109E091 +S315080038D0202C07D949F26C60C0F600004FF4A1719C +S315080038E004F0F0FE01A8A1B2FFF748FD38B949F285 +S315080038F06C60C0F6000040F2471104F0E3FE42F2A5 +S315080039008073C2F2000342F2D002C2F200029A6049 +S31508003910DB6000221A605A604FF41041C4F20201BB +S315080039200B6141F68023C2F2000341F69020C2F2F1 +S31508003930000098601A60DB605A6040225A719A88C3 +S315080039404FF4C86060F30C029A808022DA70CB606C +S31508003950FFF7E0FE32B0BDE8F08700BF40F21C6317 +S31508003960C2F2000308221A7000225A7027229A709F +S315080039706922DA705B221A7145225A71704700BFB4 +S3150800398038B541F68023C2F20003DB78DB091DD186 +S3150800399041F68024C2F200046588C5F30D0542F697 +S315080039A02000C2F2000041F69021C2F200012A4628 +S315080039B005F076FDE37843F08003E3704FF4104397 +S315080039C0C4F2020301229A60284638BD002038BD99 +S315080039D038B542F28073C2F20003DB78DB0900D007 +S315080039E0FEE742F29073C2F200031D8842F2D00449 +S315080039F0C2F20004204642F62001C2F200012A461D +S31508003A0005F04EFD42F28073C2F200039C6000226C +S31508003A101A60102199705A60C5F30B059D80B02273 +S31508003A20DA704FF41043C4F2020301225A6038BD1B +S31508003A304FF47053C4F202031B69002B0DDA4FF4DE +S31508003A407053C4F2020340F22312C4F267525A605A +S31508003A5048F6AB12CCF6EF525A6070474FF47053E3 +S31508003A60C4F202031A6942F000421A61704700BFA5 +S31508003A704FF47053C4F20203D86070474FF4705382 +S31508003A80C4F20203DB6813F4803F1BD14FF4705372 +S31508003A90C4F20203DB6813F0100F15D14FF470530C +S31508003AA0C4F20203DB6813F0EF0F0FD14FF4705323 +S31508003AB0C4F20203D86800F0020000280CBF0820F0 +S31508003AC00720704701207047052070470620704779 +S31508003AD000B583B008238DF80730FFF7CFFF8DF8C0 +S31508003AE007009DF80730DBB2012B08D1FFF7C6FFA8 +S31508003AF08DF807009DF80730DBB2012BF6D09DF84C +S31508003B00070003B05DF804FB70B50546002659B1F9 +S31508003B10012908BF4FF4807606D0022914BF4FF456 +S31508003B2040764FF40076FFE7FFF7D2FF082821D149 +S31508003B304FF47054C4F20204236923F440732361DA +S31508003B4023691E432661236923F0F8032361236949 +S31508003B5043F002031D432561236943F4803323613F +S31508003B60FFF7B6FF236923F002032361236923F0D5 +S31508003B70F803236170BD00BF70B505460E46FFF712 +S31508003B80A7FF082816D14FF47054C4F2020423691B +S31508003B9023F440732361236943F400732361236983 +S31508003BA043F0010323612E60FFF792FF236923F098 +S31508003BB00103236170BD00BFF0B40023012503266D +S31508003BC005FA03F20C681440944238D107685A0083 +S31508003BD006FA02F4E44327400760076891F804C030 +S31508003BE00CFA02FC4CEA070707600F79013FFFB29F +S31508003BF0012F16D887683C40846087684C799440C2 +S31508003C003C43846047689CB205FA04FC27EA0C0723 +S31508003C104760476891F806C00CFA04F4A4B23C431E +S31508003C204460C7689CB2640006FA04F427EA0404F0 +S31508003C30C460C468CF7907FA02F22243C26001332E +S31508003C40102BBDD1F0BC7047036919420CBF002088 +S31508003C500120704710B401F007039B00C90800EB68 +S31508003C608100046A0F21994024EA01010162016A70 +S31508003C709A40114301625DF8044B704710B44FF443 +S31508003C806053C4F202039B6803F00C03042B09D0AB +S31508003C90082B0DD0002B36D14FF41053C0F2F40385 +S31508003CA0036035E04FF4D853C0F2B70303602FE042 +S31508003CB04FF46053C4F202035C685A6802F03F028C +S31508003CC014F4800F4FF46053C4F202035B68C3F325 +S31508003CD0881319BF4FF4D854C0F2B7044FF41054E0 +S31508003CE0C0F2F404B4FBF2F101FB03F14FF46053A4 +S31508003CF0C4F202035A68C2F3014201325200B1FB10 +S31508003D00F2F3036004E04FF41053C0F2F4030360C7 +S31508003D104FF46052C4F202029168C1F3031140F2F3 +S31508003D20D403C2F20003595CC9B2046824FA01F14B +S31508003D3041609468C4F382241C5DE4B221FA04F459 +S31508003D4084609268C2F342329B5CDBB2D940C160A0 +S31508003D505DF8044B704700BF39B14FF46053C4F2A5 +S31508003D6002031A6B1043186370474FF46053C4F28A +S31508003D7002031A6B22EA00001863704739B14FF440 +S31508003D806053C4F202035A6B1043586370474FF4EA +S31508003D906053C4F202035A6B22EA00005863704764 +S31508003DA039B14FF46053C4F202031A6C1043186415 +S31508003DB070474FF46053C4F202031A6C22EA0000FB +S31508003DC01864704739B14FF46053C4F202035A6C51 +S31508003DD01043586470474FF46053C4F202035A6C98 +S31508003DE022EA00005864704739B14FF46053C4F2B0 +S31508003DF002031A691043186170474FF46053C4F2FE +S31508003E0002031A6922EA00001861704739B14FF4B3 +S31508003E106053C4F202035A6A1043586270474FF45B +S31508003E206053C4F202035A6A22EA000058627047D5 +S31508003E3008B54FF400600121FFF7E8FF4FF4006072 +S31508003E400021FFF7E3FF08BD10B44FF43053C4F266 +S31508003E5001035C68416882681143C26811430268BD +S31508003E60114302690A4324F4FD4424F07F042243E3 +S31508003E70017D0A435A605DF8044B704748F2A00377 +S31508003E80C4F22523186070474FF43053C4F2010377 +S31508003E90186070474FF43053C4F20103186800F0F5 +S31508003EA00300704710B402684FF43053C4F201039C +S31508003EB09A60DC6824F4FF6424F007048268416889 +S31508003EC01143C2680A43006902432243DA605DF877 +S31508003ED0044B70474FF43053C4F201031869C0B25B +S31508003EE0704700BF82B00023019342F61443C4F220 +S31508003EF0010303440193019B186802B0704700BF91 +S31508003F0010B402684FF43053C4F201035A6242688F +S31508003F109A62DC6A24F0F704C26881681143026970 +S31508003F200A43406902432243DA625DF8044B70474C +S31508003F304FF43053C4F20103D3F88000704700BF32 +S31508003F404FF43053C4F20103C3F88000704700BF32 +S31508003F504FF43053C4F201035B6B18420CBF0020C8 +S31508003F60012070474FF43053C4F201039863704739 +S31508003F70DC23C4F227231860704700BF30B585B02C +S31508003F8004460D46038A23F440531B041B0CCA88B7 +S31508003F9013430382838923F4B05323F00C031B04D1 +S31508003FA01B0C0989AA880A4369890A4392B21343F2 +S31508003FB08381838A23F440731B041B0CAA89134349 +S31508003FC083826846FFF75AFE4FF4A052C4F20102F4 +S31508003FD04FF48053C4F201039C4218BF94420CBFAD +S31508003FE0039A029AA3891BB2002B02EB820202EB08 +S31508003FF08202BDBF2B685B00B2FBF3F22968A4BF3F +S315080040008900B2FBF1F248F21F53C5F2EB13A3FB8A +S3150800401002135B091D01642003FB1023A08900B26B +S3150800402000280BDADB00323348F21F51C5F2EB11D8 +S31508004030A1FB0321C1F3421129430AE01B013233D4 +S3150800404048F21F51C5F2EB11A1FB0321C1F343113D +S31508004050294389B2218105B030BD00BF29B18389C2 +S315080040609BB243F4005383817047838923F400533A +S315080040701B041B0C83817047C1F3080181807047BC +S315080040808088C0F308007047038819420CBF0020D7 +S315080040900120704782B04FF46053C4F202031A68D5 +S315080040A042F001021A6000229A60196821F08471B0 +S315080040B021F48031196043F21001C2F200415960BF +S315080040C0196821F480211960DA60009201921A6851 +S315080040D042F480321A604FF46052C4F20202136846 +S315080040E003F400330193009B01330093019B1BB932 +S315080040F0009BB3F5A06FF2D14FF46053C4F20203EC +S315080041001B6813F4003F14BF012300230193019B8E +S31508004110012B46D14FF46053C4F202031A6C42F0E5 +S3150800412080521A644FF4E042C4F20002116841F466 +S31508004130404111609A689A609A6842F400429A600F +S315080041409A6842F4A0529A6045F20C42C0F2407254 +S315080041505A601A6842F080721A604FF46052C4F2CC +S315080041600202136813F0007FFBD04FF47053C4F2B9 +S31508004170020340F205621A604FF46053C4F2020368 +S315080041809A6822F003029A609A6842F002029A60DC +S315080041904FF46052C4F20202936803F00C03082B32 +S315080041A0FAD14FF46D43CEF200034FF000629A60E5 +S315080041B002B0704732B1821811F8013B00F8013B92 +S315080041C09042F9D1704700BFCA7E8B7E43EA02232C +S315080041D00278032A01BF487D0A7D42EA002243EAA3 +S315080041E002431846704700BF00F10B010023DA01AD +S315080041F042EA530310F8012B52FA83F3DBB28842E2 +S31508004200F5D11846704700BF10B504460A464078EF +S3150800421004F134010123FEF74BFFD0BB94F8332297 +S3150800422094F8323243EA022212B24AF65523CFF6FE +S31508004230FF739A422FD194F86D2094F86C301B04C2 +S3150800424043EA026294F86A30134394F86B2043EA0F +S31508004250022222F07F4244F24613C0F254039A42E5 +S315080042601BD094F8890094F888301B0443EA006050 +S3150800427094F88630034394F8870043EA002020F038 +S315080042807F4044F24613C0F25403C01A18BF0120F7 +S3150800429010BD032010BD022010BD002010BD00BFB8 +S315080042A02DE9F041044603791BB3056B00F1340789 +S315080042B0407839462A460123FEF72CFFE0B9002349 +S315080042C02371636A9D421AD3E26913449D4219D247 +S315080042D0E678012E19D94FF00108E269154460788D +S315080042E039462A464346FEF715FF013E012EF4D10C +S315080042F00EE00020BDE8F0810120BDE8F081002035 +S31508004300BDE8F0810020BDE8F0810020BDE8F0811D +S315080043100020BDE8F08100BF38B504460D46036BA2 +S315080043208B420CD0FFF7BCFF58B9607804F1340112 +S315080043302A460123FEF7BCFE28B9256338BD0020AE +S3150800434038BD012038BD012038BD00BF08B588B189 +S3150800435003688BB1197889B1D988828891420FD1BF +S315080043605878FEF78BFE00F00100002814BF0320E2 +S31508004370002008BD092008BD092008BD092008BD80 +S31508004380092008BD2DE9F041154603681C78303C24 +S31508004390092C00F2B5815A783A2A40F0B1810233E5 +S315080043A0036000230B60002C40F0718140F20C631F +S315080043B0C2F200031C68002C00F06C810C602378A4 +S315080043C08BB16078FEF75AFE10F0010F0BD1002D65 +S315080043D000F0638100F00400C0B2002814BF0A2070 +S315080043E00020BDE8F081002020706070FEF72AFEEC +S315080043F010F0010F40F054811DB110F0040F40F089 +S31508004400528120460021FFF7FFFE012818BF00252C +S3150800441017D194F8F631002B00F0488194F8FD2165 +S3150800442094F8FC311B0443EA026294F8FA31134308 +S3150800443094F8FB5143EA052520462946FFF7E4FE92 +S31508004440FFE7032800F03581002840F0358194F80D +S31508004450402094F83F3043EA02231BB2B3F5007FAD +S3150800446040F02D8194F84B0094F84A3053EA002026 +S315080044700DD194F85B2094F85A301B0443EA026283 +S3150800448094F85830134394F8590043EA0020E06141 +S3150800449094F84410E1704B1EDBB2012B00F2128136 +S315080044A094F84130A370002B00F00F815A1E1A426F +S315080044B040F00E8194F8466094F8452042EA0622B8 +S315080044C0228112F00F0F40F0068194F8487094F894 +S315080044D0476056EA07260DD194F8577094F8566047 +S315080044E0360446EA076794F854603E4394F85570D4 +S315080044F046EA072694F843C094F8427057EA0C2710 +S3150800450000F0EC8001FB00FC07EB121161448E42BF +S31508004510C0F0E780761AB6FBF3F3002B00F0E480D0 +S3150800452040F6F576B3428CBF022601264FF6F5789B +S31508004530434500F2E8800233A36125622F4467628F +S315080045402944E162032E13D1002A40F0D08094F862 +S31508004550631094F86220120442EA016194F860201C +S315080045600A4394F8611042EA0122A2629B000EE017 +S31508004570002A00F0BF806744A762022E0FBF5B00C7 +S3150800458003225A4303F0010318BF03EB520303F255 +S31508004590FF13B0EB532FC0F0B0804FF0FF33236109 +S315080045A00023E360032E63D1637194F8652094F8C1 +S315080045B0643043EA02222A446261607804F13401D5 +S315080045C00123FEF775FD002852D194F8332294F89A +S315080045D0323243EA022212B24AF65523CFF6FF7365 +S315080045E09A4245D194F8372094F836301B0443EAAA +S315080045F0026294F83430134394F8352043EA0222D1 +S3150800460045F25223C4F261139A4231D194F81B221F +S3150800461094F81A321B0443EA026294F818321343D8 +S3150800462094F8192243EA022247F27223C6F241138A +S315080046309A421DD194F8232294F822321B0443EAA5 +S31508004640026294F82032134394F8212243EA0223A3 +S31508004650E36094F81F2294F81E321B0443EA0262B0 +S3150800466094F81C32134394F81D2243EA022323616B +S31508004670267040F20863C2F200031A88013292B229 +S315080046801A80E280002020632071BDE8F0810B20AB +S31508004690BDE8F0810C20BDE8F0810020BDE8F0817E +S315080046A00320BDE8F0810A20BDE8F0810D20BDE8B1 +S315080046B0F0810120BDE8F0810D20BDE8F0810D20D4 +S315080046C0BDE8F0810D20BDE8F0810D20BDE8F08140 +S315080046D00D20BDE8F0810D20BDE8F0810D20BDE874 +S315080046E0F0810D20BDE8F0810D20BDE8F0810D2098 +S315080046F0BDE8F0810D20BDE8F0810D20BDE8F08110 +S3150800470000230B6052E60233A36125622F446762D9 +S315080047102944E162032617E72DE9F0410D4601F128 +S3150800472009020369002B5ED0416991F80C800B7869 +S31508004730202B1BD00E46002408F00807FFB203E022 +S3150800474016F8013F202B11D0052B08BFE52347B1EA +S31508004750A3F1410C5FFA8CFCBCF1190F9CBF203306 +S31508004760DBB202F8013B0134082CE9D10B7A202B85 +S3150800477022D0561C2E2313700B7A202B1BD001F146 +S315080047800804171D324608F010085FFA88F603E099 +S3150800479014F8013F202B0FD046B1A3F1410C5FFA64 +S315080047A08CFCBCF1190F9CBF2033DBB202F8013B2D +S315080047B0BA42EDD100E03246CB7A2B72CC7F8B7FA2 +S315080047C01B0443EA04630C7F23434C7F43EA042318 +S315080047D02B604C7E0B7E43EA0423AB80CC7D8B7D1D +S315080047E043EA0423EB8000231370AE6946B3EB69F2 +S315080047F033B3036900240BB3028C4FF6FF739A4256 +S3150800480008BF00241AD0C769388890B10024A0468A +S31508004810414601F02BFC70B1EA69013AA2420CD973 +S315080048200134321902F8010C37F8020F0028EFD1CB +S3150800483004E0002402E0002400E0002400233355AD +S31508004840BDE8F08110B50446FFF72AFD03460028A7 +S3150800485054D12378032B49D16379002B46D0002302 +S31508004860236304F1340104F50D700B46002203F8A6 +S31508004870012B8342FBD1552384F83232AA2384F8CC +S315080048803332522384F8343084F83530612384F87F +S315080048903630412284F83720722084F8180284F8CA +S315080048A0190284F81A2284F81B32236984F81C3208 +S315080048B0C3F3072284F81D221A0C84F81E221B0E45 +S315080048C084F81F32E36884F82032C3F3072284F899 +S315080048D021221A0C84F822221B0E84F823326078CF +S315080048E062690123FEF716FC0023637160780021D4 +S315080048F00A46FEF745FC031C18BF0123184610BDDF +S3150800490002398369023B99423DBF8278C36A02FB3A +S3150800491001300020704700BFF8B505460C4601294E +S315080049205CD9836999425BD20378022B28D0032B82 +S3150800493038D0012B56D101EB5106416A01EB5621BD +S31508004940FFF7EAFC002850D1C6F308032B4493F876 +S3150800495034700136696A284601EB5621FFF7DCFCFC +S31508004960002845D1C6F30806354495F8340047EAC9 +S31508004970002014F0010F14BF0009C0F30B00F8BDA6 +S31508004980416A01EB1421FFF7C7FCA0BB640004F4DD +S31508004990FF742B1993F834302C4494F8350043EA05 +S315080049A00020F8BD416A01EBD411FFF7B5FC28BB1E +S315080049B0A40004F4FE742B1993F8360093F83720F4 +S315080049C0120642EA004293F8350042EA00202C44D7 +S315080049D094F83430184320F07040F8BD0120F8BD33 +S315080049E00120F8BD4FF0FF30F8BD4FF0FF30F8BD9D +S315080049F04FF0FF30F8BD4FF0FF30F8BD4FF0FF30F5 +S31508004A00F8BD00BF70B504460D46E18081680129EE +S31508004A1038D003689A69914236D271B91A78032A4E +S31508004A2001D1996A49B90022E2601A89AA422DD9A8 +S31508004A309B6A03EB151323611BE09E783601B5428A +S31508004A4010D32068FFF768FF0146B0F1FF3F1FD07B +S31508004A5001281FD923689B6998421DD2AD1BADB2A8 +S31508004A60AE42EED9E1602068FFF74AFF00EB151069 +S31508004A70206105F00F05236803EB451334336361A2 +S31508004A80002070BD022070BD022070BD022070BDDE +S31508004A90012070BD022070BD022070BDF8B5054624 +S31508004AA00C461646012998BF02237CD98369994288 +S31508004AB028BF022377D20378022B40D0032B50D08D +S31508004AC0012B18BF02236BD101EB5107416A01EB99 +S31508004AD05721FFF721FC0346002861D1C7F30803D5 +S31508004AE014F001041FBFEA1892F8342002F00F02EE +S31508004AF0F1B21ABF42EA0112D2B2F2B22B4483F8DB +S31508004B003420013701232B71696A284601EB5721A6 +S31508004B10FFF702FC0346002842D1C7F3080714B181 +S31508004B20C6F3071607E0EA1992F8342022F00F02B6 +S31508004B30C6F3032616432F4487F8346030E0416AEB +S31508004B4001EB1421FFF7E8FB034648BB640004F4B5 +S31508004B50FF742A1982F83460C6F3072682F835608E +S31508004B601EE0416A01EBD411FFF7D6FB0346B8B93C +S31508004B70A40004F4FE742A1992F8371009062C4486 +S31508004B8001F070410E4384F83460C6F3072182F8B9 +S31508004B903510310C82F83610360E82F83760FFE78A +S31508004BA001222A71FFE71846F8BD00BF2DE9F0413A +S31508004BB00546884631B9C66876B183699E4228BFDC +S31508004BC001260AE0FFF7A8FE012847D9AB699842F3 +S31508004BD028BF464601D24DE0012634460227013455 +S31508004BE0AB699C4202D3012E3BD93C462846214656 +S31508004BF0FFF792FE38B1B0F1FF3F18BF012833D056 +S31508004C00B442ECD132E02646284621466FF070427F +S31508004C10FFF744FF0346D0F1010038BF0020B8F182 +S31508004C20000F08BF002028B1284641462246FFF754 +S31508004C3035FF03465BB9EE602B69B3F1FF3F18D029 +S31508004C40013B2B6101236B712046BDE8F081012BE6 +S31508004C5014BF01204FF0FF30BDE8F0810120BDE808 +S31508004C60F0810020BDE8F081BDE8F0810020BDE8B4 +S31508004C70F0812046BDE8F0812DE9F84304460E464A +S31508004C80C5880135ADB2002D6AD00369002B6AD0FC +S31508004C9015F00F075BD101330361C16821B90368B9 +S31508004CA01B89AB4262D952E000688378013B13EA5C +S31508004CB015134CD1FFF730FE8046012859D9B0F1BB +S31508004CC0FF3F59D020688369984539D3002E56D0BE +S31508004CD0E168FFF76BFF8046002853D0012854D0BF +S31508004CE0B0F1FF3F54D02068FFF7DAFA002852D116 +S31508004CF0236803F1340100231A46CA540133B3F575 +S31508004D00007FFAD1266830464146FFF7F9FD306341 +S31508004D1000264FF001090CE083F804902068FFF79D +S31508004D20BFFA00283AD123681A6B01321A63013692 +S31508004D30F6B223689A78B242EED81A6B921B1A63B7 +S31508004D40C4F80C8020684146FFF7DAFD2061E5804B +S31508004D50236803EB4713343363610020BDE8F88307 +S31508004D600420BDE8F8830420BDE8F8830420BDE8E4 +S31508004D70F8830220BDE8F8830120BDE8F883042003 +S31508004D80BDE8F8830720BDE8F8830220BDE8F8836C +S31508004D900120BDE8F8830120BDE8F8830120BDE8BD +S31508004DA0F88300BF2DE9F04F89B005460021FFF7CB +S31508004DB029FE002840F0AC804FF0FF09C8464F4650 +S31508004DC049F21471C0F60001029101F10C02049235 +S31508004DD04FF6FF7A4FF0000B28682969FFF79CFA0F +S31508004DE0002840F096806C692678002E00F09280A4 +S31508004DF0E37A03F03F02E52E7FD013F0080F04D0C4 +S31508004E000F2A18BFB8467BD101E00F2A58D1EB69A3 +S31508004E100193002B74D016F0400F06D094F80D902D +S31508004E2006F0BF06EB882B8403E0B04518BFB846EA +S31508004E3066D1617B0391494518BFB84660D123788E +S31508004E4023F04003013B03EB430203EB8202059286 +S31508004E50029A02F1FF394FF001080796059E06955A +S31508004E604546DDF8108019F8013FE2185078E35CF2 +S31508004E7043EA00207DB101F01FF90546FE2E56D8FB +S31508004E80731C0593019931F8160001F015F985424E +S31508004E904FD1059E01E050454DD1C145E3D1A84605 +S31508004EA00596079E069D237813F0400F39D0B8F172 +S31508004EB0000F36D0059A019931F812308BB33BE0D2 +S31508004EC0B8F1000F04D12046FFF78EF9484523D0E4 +S31508004ED0A5F820A0AB69DA7A12F0010F08BF04F131 +S31508004EE00B0002D00BE0844218D014F8011B13F80B +S31508004EF0012B9142F7D0B84602E0B84600E0B84622 +S31508004F0028465946FFF7B8FE00283FF465AF07E084 +S31508004F1016E015E0042013E0002011E000200FE061 +S31508004F200EE0013E5FFA86F8DDF80C90E8E7069D8C +S31508004F3002E0069D00E0069DDDF80C90B846DFE726 +S31508004F4009B0BDE8F08F00BF2DE9F04F87B0814664 +S31508004F5088460B782F2B18BF5C2B08BF01F1010878 +S31508004F600023836098F800301F2B07D80021FFF72D +S31508004F7049FD03460022C9F814207AE14FF0010AD8 +S31508004F8049F2806BC0F6000B49F28C61C0F600014D +S31508004F90049149F29462C0F60002059298F800302E +S31508004FA02F2B18BF5C2B08D108F10103984613F87C +S31508004FB0012B2F2A18BF5C2AF8D0D9F81C5098F86C +S31508004FC000002F2818BF1F282CD95C2800F02D8137 +S31508004FD0AF1E4646544607E05C2B00F02881B2F522 +S31508004FE0807F00F041811446514601F03FF80146A2 +S31508004FF0002800F039817F2809D8222900F0348159 +S315080050005A4612F8013F13B19842FAD12CE127F813 +S31508005010021F621C16F8013F18462F2B18BF1F2BBC +S31508005020DAD801E00024524690441F2898BF042687 +S3150800503001D90026FFE7002C00F0168104F1004391 +S31508005040013B5A0035F813302E2B18BF202B40F0A1 +S31508005050F080931C2B4407E033F8042C023B2E2ADD +S3150800506018BF202A40F0E580013CF5D1FCE003F8A2 +S31508005070011B8342FBD12B88202B18BF2E2B40F017 +S31508005080E48028460023013330F8021F202918BF80 +S315080050902E29F8D0002B00F0D98046F00306D5E07B +S315080050A0013C05D10821039100220192029205E0F4 +S315080050B0023A32F8021C2E29F2D1F3E75F1C35F8C2 +S315080050C01300002861D0202808D0E31B18BF01234D +S315080050D02E2814BF002203F001021AB146F0030677 +S315080050E03B46EBE7019A0399BC4218BF8A4214D3A0 +S315080050F00B2903D146F00306029A49E00BB146F0A4 +S315080051000306A74243D8029A9300DBB202932346CA +S315080051100B21039108220192D0E77F280DD900219F +S3150800512000F0A4FF0346002800F0A08005990B4470 +S3150800513013F8800C46F0020650B101462B2807D01A +S31508005140049A12F8013F002B00F087809942F8D1A3 +S3150800515046F003065F2010E0029A42F0020202922D +S315080051600BE0A0F161039BB2192B9FBF029B43F092 +S3150800517001030293203898BF80B2D9F818300199F4 +S3150800518058543B460131019198E7029A00E0029A89 +S31508005190D9F818301978E52904BF05211970039B39 +S315080051A0082B02BF9200D2B20292029901F00C03B8 +S315080051B00C2B03D001F00302032A01D146F00206A4 +S315080051C016F0020F0AD1029901F00302012A08BF5C +S315080051D046F01006042B08BF46F00806D9F8183022 +S315080051E0DE724846FFF7DEFDD9F81830DA7A03464C +S315080051F048B104283DD102F00403DBB2002B14BFEA +S315080052000346052335E012F0040F32D1D9F81410FD +S31508005210CB7A13F0100F06D0D9F80000FEF7D4FFAA +S31508005220C9F80800BAE6052323E00024524690444C +S31508005230FFE66700EA194FF0000325F81430D9F89D +S31508005240183003F10B00202111E700232F4437F80B +S31508005250021C2E293FF426AF22E7A0F141039BB298 +S31508005260192B7FF679AF7CE7062302E046F00206A3 +S315080052706EE7184607B0BDE8F08F00BF2DE9F04F7E +S3150800528083B0044689464FF0FF0B5E460425D84690 +S3150800529049F2147AC0F6000A0AF10C0300930027B3 +S315080052A070E02068FFF738F8054600286ED1626975 +S315080052B01378002B74D0D17AE52B18BF2E2B59D032 +S315080052C001F03F01082914BF00200120484518BFF6 +S315080052D0464651D10F2943D113F0400F06D092F814 +S315080052E00DB003F0BF03E188218403E09E4218BF96 +S315080052F0464641D192F80DE0DE4518BF46463BD1F9 +S31508005300D4F81CC0117801F03F01013901EB4105C1 +S3150800531001EB85050AF1FF3101260193DDF800B09E +S3150800532011F8013FD0184078D35C43EA002036B123 +S31508005330FE2D32D82CF815000646013503E04FF647 +S31508005340FF73984229D15945EAD1019B127812F088 +S31508005350400F1ED0FE2D98BF2CF8157019D91CE0E9 +S3150800536010461EB9FEF740FF58451BD04FF6FF738F +S31508005370238417E04646FFE720463946FFF77CFCBC +S31508005380054618B9216900298BD15DB1002323612F +S3150800539008E0013BDEB2F346EEE7F3464646EBE7A6 +S315080053A00425F3E7284603B0BDE8F08F2DE9F04160 +S315080053B00446C588018C4FF6FF73994208BF2946F3 +S315080053C0FFF720FB0346D0B9E52701264FF0000872 +S315080053D020682169FEF7A0FF034668B9626917705D +S315080053E022681671E288AA4209D220464146FFF78A +S315080053F043FC03460028EBD0042B08BF02231846BB +S31508005400BDE8F0812DE9F04104460E46012998BF12 +S3150800541002212BD983699E4228BF022126D2002762 +S315080054204FF0010820463146FFF776FA0546C0B127 +S31508005430012818D0B0F1FF3F17D0204631463A462A +S31508005440FFF72CFB014688B92369B3F1FF3F1EBF5E +S315080054500133236184F80580A369AB4206D92E4639 +S31508005460E0E7002102E0022100E001210846BDE84C +S31508005470F08100BF70B582B0054616461C460B2261 +S31508005480FEF798FE052C0BD9B21EE30343EA540433 +S3150800549032F8023F13FA84F4A4B25388002BF4D1ED +S315080054A0072204F00F0101F13003392B88BF01F1FF +S315080054B03703013A00A911444B702409F1D1144667 +S315080054C07E2102AB134403F8081C62B12B78202B0B +S315080054D00BD0294600230133A34207D011F8010F48 +S315080054E02028F8D102E0002300E000232020072A24 +S315080054F09FBF02A9891811F8081C013288BF014606 +S31508005500E9540133072BF2D902B070BD2DE9F04FEB +S3150800551087B004468769C66903A839460C22FEF790 +S3150800552049FE9DF8173013F0010F21D00023FB72B6 +S31508005530E3610125384603A932462B46FFF79AFF51 +S315080055402046FFF72FFC034620B90135ADB2642D7E +S31508005550F0D1D5E0642D08BF072000F0EF80042BBA +S3150800556018BF184640F0EA809DF81730FB72E661CE +S315080055709DF8173013F0020F08BF012716D033889D +S315080055803BB1002301339BB236F81320002AF9D128 +S3150800559000E0002319334EF64F42C4F6C46282FB7C +S315080055A00317DB17C3EBA707BFB2FFE720460021A7 +S315080055B0FFF728FA0346002840F0BF800025A846D2 +S315080055C0012620682169FEF7A7FE0346002840F059 +S315080055D0B48063691B78E52B18BF002B03D101350E +S315080055E0AF4201D18EE0454620463146FFF744FBDF +S315080055F003460028E5D0A0E0E188C9EB0101204672 +S3150800560089B2FFF7FFF90346002840F09680A069A3 +S31508005610FEF7EAFD01904FF000084FF6FF7549F2D4 +S315080056201476C0F60006FF2720682169FEF774FE87 +S315080056300346002840F08180D4F81CA061695FFA0F +S3150800564089FB019A4A734FF00F03CB7281F80C80DD +S3150800565081F81A8081F81B800BF1FF3303EB4300B6 +S3150800566003EB80000122434602E070462B460132D6 +S31508005670AB424ED000F1010E3AF81030B01810F8CF +S31508005680010C0B5408444FEA132C80F801C0002B78 +S3150800569049D070460C2AEAD9AB4202D03AF8103003 +S315080056A00BB94BF0400B81F800B023684FF00101AD +S315080056B0197120464146FFF7DFFA034600283CD118 +S315080056C009F1FF391FFA89F9B9F1000FACD12DE0BC +S315080056D0636903F12001002203F8012B8B42FBD1F9 +S315080056E06069A1690B22FEF765FD6369A269D27A32 +S315080056F002F018021A73236801221A7100201DE0AD +S3150800570007201BE0013F1FFA87F9B9F1000F0DD0FA +S3150800571072E706EB020E1EF801EC01F80E708E44D5 +S315080057208EF80170B6E70C2A9FD9BAE72068216976 +S31508005730FEF7F2FD0028CBD000E0184607B0BDE81A +S31508005740F08F00BF88B940F20C63C2F200031B68F1 +S315080057500BB100221A7009B100230B7040F20C63DA +S31508005760C2F200031960002070470B20704700BF83 +S315080057702DE9F0438FB0019115460446002800F044 +S3150800578094800023036001A805A902F01E02FEF713 +S31508005790F9FD002840F08B8005F01F0702AB0B933C +S315080057A040F20843C2F200030C9305A80199FFF7DB +S315080057B0CBFB0A9E034600287FD1002E78D17BE0DA +S315080057C05BB1042B40F0858005A8FFF79FFE47F0E4 +S315080057D008070A9E034638B17BE0F37A13F0110FE7 +S315080057E070D115F0040F6FD117F0080F3CD0FDF7F4 +S315080057F0F9FCB073C0F30723F373030C3374000E7C +S3150800580070740025F57235777577B577F577DDF815 +S31508005810148040463146FEF7D7FCB576F5763575E1 +S315080058207575012388F804300546E8B1D8F8309034 +S3150800583040462946FFF7E6FD0346002849D1059864 +S31508005840013DC5604946FEF767FD03460AE0F37A5F +S3150800585013F0100F3AD115F0020F05D013F0010F0F +S3150800586036D101E0002B34D117F0080F18BF47F0E6 +S315080058702007059D2B6BE3612662A77128463146F2 +S31508005880FEF7A2FC2061F27FB37F1B0443EA0263A2 +S31508005890327F1343727F43EA0223E3600020A0604D +S315080058A0A0612560EB88A38014E0092012E011E0CE +S315080058B015F01C0F91D1CAE7062315F01C0F7FF4CB +S315080058C07FAFCFE7072304E0082302E0042300E0C4 +S315080058D0072318460FB0BDE8F08300BF2DE9F04F47 +S315080058E083B004460F4690461E4600233360FEF7F3 +S315080058F02DFD002840F0BF80A37913F0800F18BF54 +S31508005900022040F0BC8013F0010F08BF072000F00A +S31508005910B680E568A368ED1AA84538BF4546002D48 +S3150800592000F0AA8004F124030193A368C3F30802D4 +S31508005930002A40F08680206890F802A00AF1FF3A13 +S315080059400AEA532A1AF0FF0A17D10BB9206902E0AE +S315080059506169FEF7E1FF012805D8A37963F07F03A3 +S31508005960A37102208BE0B0F1FF3F05D1A37963F064 +S315080059707F03A371012082E06061D4F8008040466D +S315080059806169FEF7BDFF814628B9A37963F07F03F5 +S31508005990A371022073E0D1445FEA552B29D098F809 +S315080059A002300BEB0A029A4288BFCAEB030B98F83F +S315080059B0010039464A465FFA8BF3FDF779FB28B1B1 +S315080059C0A37963F07F03A371012058E0A37913F04C +S315080059D0400F0BD0A369C9EB0300834506D907EB33 +S315080059E0402001994FF40072FEF7E4FB4FEA4B2B77 +S315080059F035E0A2694A4522D0A37913F0400F10D0AA +S31508005A0098F8010001990123FDF784FB28B1A379D1 +S31508005A1063F07F03A371012031E0A37923F04003EB +S31508005A20A3712368587801994A460123FDF740FB7C +S31508005A3028B1A37963F07F03A37101201FE0C4F89E +S31508005A401890A168C1F30801C1F5007B5D4538BF10 +S31508005A50AB462144384624315A46FEF7ABFB5F4431 +S31508005A60A3685B44A36033685B443360B5EB0B05FE +S31508005A707FF45BAF02E002E0002000E0002003B004 +S31508005A80BDE8F08F2DE9F04F83B004460F46154662 +S31508005A901E4600233360FEF759FC002840F0DA80E2 +S31508005AA0A37913F0800F18BF022040F0D48013F0BA +S31508005AB0020F08BF072000F0CE80E368DD4280F0C1 +S31508005AC0BE80002D00F0BB8004F124030193A36877 +S31508005AD0C3F30802002A40F09580206890F802B0C7 +S31508005AE00BF1FF3B0BEA532B1BF0FF0B21D13BB904 +S31508005AF0236963B90021FFF759F80346206103E0DB +S31508005B006169FFF753F80346002B00F09880012BD4 +S31508005B1005D1A37963F07F03A37102209BE0B3F15B +S31508005B20FF3F05D1A37963F07F03A371012092E0BB +S31508005B306361A37913F0400F11D02368587801994F +S31508005B40A2690123FDF7E6FA28B1A37963F07F037A +S31508005B50A37101207FE0A37923F04003A371D4F851 +S31508005B60008040466169FEF7CBFE814628B9A379D5 +S31508005B7063F07F03A37102206DE0D9445FEA552ADA +S31508005B8029D098F802300AEB0B029A4288BFCBEB71 +S31508005B90030A98F8010039464A465FFA8AF3FDF780 +S31508005BA0B9FA28B1A37963F07F03A371012052E003 +S31508005BB0A369C9EB03018A450AD9019807EB412174 +S31508005BC04FF40072FEF7F6FAA37923F04003A371A7 +S31508005BD04FEA4A2A28E0A3694B4511D0A268E36830 +S31508005BE09A420DD298F8010001994A460123FDF719 +S31508005BF05FFA28B1A37963F07F03A37101202AE035 +S31508005C00C4F81890A068C0F30800C0F5007A554596 +S31508005C1038BFAA462044243039465246FEF7CAFA07 +S31508005C20A37943F04003A3715744A3685344A36080 +S31508005C30336853443360B5EB0A057FF448AFA3686D +S31508005C40E268934288BFE360A37943F02003A37117 +S31508005C50002000E0FFE703B0BDE8F08F38B5044642 +S31508005C60FEF774FB002849D1A37913F0200F46D01C +S31508005C7013F0400F0DD0214651F8243B5878A269FD +S31508005C800123FDF747FA00283BD1A37923F0400307 +S31508005C90A3712068E169FEF73FFB002833D1256A26 +S31508005CA0EB7A43F02003EB72E3682B77A3891B0A90 +S31508005CB06B77E389AB77E37BEB772369AB76C3F343 +S31508005CC00722EA761B0C2B751B0A6B75FDF78AFAF9 +S31508005CD0A875C0F30723EB75030C2B76000E6876C0 +S31508005CE00023AB74EB74A37923F02003A371236814 +S31508005CF001221A712068FEF7A5FD38BD38BD0020BF +S31508005D0038BD012038BD38BD10B50446FFF7A6FFDB +S31508005D10034608B900222260184610BD70B504462D +S31508005D200D46FEF713FB002840F0BD80A37913F05B +S31508005D30800F40F0B980E268AA4205D203F0020358 +S31508005D40DBB2002B08BF1546A2680023A360002D0E +S31508005D5000F0AC802068867876026AB1013A691E3E +S31508005D60B1FBF6F1B2FBF6F3994205D373421A403A +S31508005D70A260AD1A616918E02169A9B9FEF716FF94 +S31508005D800146012805D1A37963F07F03A371022098 +S31508005D9070BDB0F1FF3F18BF206105D1A37963F04C +S31508005DA07F03A371012070BD6161002940D0B5420F +S31508005DB02BD9A27912F0020F05D02068FEF7F6FE5D +S31508005DC0014620B920E02068FEF7A6FD0146B1F19C +S31508005DD0FF3F05D1A37963F07F03A371012070BD4E +S31508005DE0012903D922689269914205D3A37963F000 +S31508005DF07F03A371022070BD6161A2683244A2606C +S31508005E00AD1BAE42D5D300E03546A2682A44A2604F +S31508005E10C5F3080272B12068FEF772FD28B9A379A6 +S31508005E2063F07F03A371022070BD00EB552502E0E5 +S31508005E30002500E00025A368C3F3080343B3A2695D +S31508005E40AA4225D0A37913F0400F11D0214651F864 +S31508005E50243B58780123FDF75DF928B1A37963F04F +S31508005E607F03A371012070BDA37923F04003A371BA +S31508005E70214651F8243B58782A460123FDF718F99C +S31508005E8028B1A37963F07F03A371012070BDA561D2 +S31508005E90A368E26893420BD9E360A37943F0200331 +S31508005EA0A371002070BD70BD022070BD002070BDBA +S31508005EB0002070BD30B58FB00EAB43F8340D0D46DB +S31508005EC0184605A90022FEF75DFA0446A0B902ABFA +S31508005ED00B9340F20843C2F200030C9305A80199FC +S31508005EE0FFF732F8044638B90A9B23B105A82946B4 +S31508005EF0FEF712FC00E0062420460FB030BD00BFB6 +S31508005F0030B599B018AB43F85C0D18460FA90122B5 +S31508005F10FEF738FA034600284DD103AB159340F235 +S31508005F200843C2F2000316930FA80199FFF70CF86D +S31508005F30034600283FD11499062300293BD0CC7A82 +S31508005F4014F0010F18BF072335D124E0012D98BF9F +S31508005F50022330D906A80FA92422FEF72BF90895A3 +S31508005F6006A80221FEF74EFD034620BB06A800211F +S31508005F70FFF784F90346E8B1042814D01BE02DB1D5 +S31508005F800F982946FFF73EFA0346A0B90F98FEF781 +S31508005F9059FC03460FE00F98FEF716F9054614F06C +S31508005FA0100FD3D1FFE70FA8FFF700FA0346002822 +S31508005FB0E5D000E00723184619B030BD2DE9F043B7 +S31508005FC083B081469046054600244E1E012711E0FF +S31508005FD0404601A93A466B46FFF780FC009B012B19 +S31508005FE00AD19DF804300D2B04D005F8013B013485 +S31508005FF00A2B01D0A642EBDC00232B709C4214BF6F +S315080060004846184603B0BDE8F08300BF30B583B0F4 +S3150800601004460D460A2802D10D20FFF7F7FF02A90C +S3150800602001F8084D28466946012201ABFFF72AFD0B +S315080060300198012814BF4FF0FF30012003B030BD8E +S3150800604070B505460E46007860B100243146FFF764 +S31508006050DDFFB0F1FF3F08D0013415F8010F002825 +S31508006060F4D101E0002070BD204670BD7F2821D9FB +S3150800607041B9C7281EBF49F60412C0F6000201231B +S315080060800AD112E0FF2814D8803849F60413C0F65E +S31508006090000333F81000704732F8021F814205D01A +S315080060A001339BB2802BF7D100E000238033D8B2AE +S315080060B070470020704700BF61280CD049F224724F +S315080060C0C0F600020021013132F8023F53B1834283 +S315080060D0F9D10BB97047002149F60423C0F600032D +S315080060E033F81100704700BF30B4013A8D18A94241 +S315080060F014D20B461C785A7802EB042292B210444A +S3150800610080B2824284BF013080B202339D42F1D808 +S31508006110CB432B4423F0010302331944A94207D188 +S315080061200B781B02184480B2834284BF013080B2C8 +S3150800613030BC704738B542F62004C2F20004657CCC +S31508006140143D237C05EB0325ADB2284480B204F147 +S315080061501A010822FFF7C8FF04F122012A46FFF7B1 +S31508006160C3FF034620B1000A40EA032080B238BDC7 +S315080061704FF6FF7038BD00BF70B4C4780C44E4B263 +S3150800618042F29873C2F20003DC700D0A82782A4440 +S31508006190D2B29A7046785E700078187095420DD91A +S315080061A00136F6B242F29873C2F200035E702EB957 +S315080061B042F29873C2F2000301301870C9B28C42D9 +S315080061C017DA0132D2B242F29873C2F200039A7019 +S315080061D07AB942F29873C2F200035A780132D2B2FF +S315080061E05A7032B942F29873C2F200031A78013231 +S315080061F01A7070BC704700BF10B5014642F2A4740D +S31508006200C2F2000420680830FFF7B6FF226842F29F +S315080062109873C2F2000319781172597851729978F5 +S315080062209172DB78D37210BD08B500200649142296 +S31508006230FFF75AFF034620B1000A40EA032080B25E +S3150800624008BD4FF6FF7008BD2E28002008B50620A9 +S31508006250FFF770FF08BD00BF42F61003C2F2000345 +S3150800626000221A8042F2A873C2F200035A7640F25C +S315080062702463C2F2000301221A7040F21863C2F2C4 +S3150800628000034FF480621A80704700BF40F224630F +S31508006290C2F2000300221A7042F61003C2F200038B +S315080062A01B882BB942F61003C2F200031880704708 +S315080062B040F22463C2F2000301221A70704700BF3D +S315080062C038B542F2A473C2F200031C6842F2A07306 +S315080062D0C2F20003A54A1A6042F29473C2F200039E +S315080062E01A60032813D1637E03F00F03032B40F0D3 +S315080062F05B87238A002B40F0578742F29C73C2F2D1 +S31508006300000308221A7001F07BFB00F097BD0228F3 +S3150800631040F09E8040F21463C2F20003DA7801323C +S31508006320D2B2DA70C2B940F21463C2F200039A78A4 +S315080063300132D2B29A707AB940F21463C2F20003FB +S315080063405A780132D2B25A7032B940F21463C2F2A4 +S3150800635000031A7801321A7042F29073C2F20003EF +S3150800636000221A8042F66263C2F200031A80637E34 +S3150800637003F0FD02052A09D1A37E0133DBB2A37619 +S31508006380782B04BF0023637600F00EBF002B00F0C5 +S315080063900B87228A002A4CD0A27E511EA176002A9B +S315080063A040F00287E27E082A05D0591EC9B20129A3 +S315080063B014D8052A12D10023637642F29C73C2F2DE +S315080063C0000380221A7001F01BFB42F62003C2F27A +S315080063D00003142283F82F2000F063BE042A9DBF11 +S315080063E003219140C9B23021A1760132E27603F049 +S315080063F00F03013B072B00F2D786DFE813F05D0297 +S3150800640008001000AC04D506AC04D506AC0442F668 +S315080064102003C2F20003002283F82F2053E242F23F +S315080064209C73C2F2000304221A7001F0E9FA00F024 +S3150800643056BD03F00F03032B40F0B68642F29C7359 +S31508006440C2F2000308221A7001F0DAFA00F0F6BC6C +S3150800645042F62003C2F200039B7B452B40F0A4863C +S3150800646042F62003C2F20003197C5A7C02EB012093 +S3150800647042F29073C2F200031B88984200F3948696 +S3150800648084B242F29073C2F200031C8042F62003E3 +S31508006490C2F200031B7D13F03F0F40F0858642F6DB +S315080064A02003C2F200035B7D002B40F07D8642F696 +S315080064B01C03C2F200031D882DB942F61C03C2F262 +S315080064C000035B88A3B142F62003C2F20003DB8B0C +S315080064D0AB4240F0698642F62002C2F2000242F65A +S315080064E01C03C2F20003128C5B889A4240F05C8659 +S315080064F0FFF79AFE4FF6FF73984240F0558642F62C +S315080065002003C2F20003DB7D062B31D0012B40F0BD +S315080065104B8642F62003C2F2000393F82230082B7A +S3150800652040F0428642F62003C2F20003002283F8B6 +S3150800653022209A8C4FF6F6739A4242F62003C2F24C +S3150800654000038CBF093208329A8442F62003C2F24D +S3150800655000035A8BDA839A8B1A845D8342F61C02EF +S31508006560C2F2000252889A8300F017BE562800200D +S31508006570FFF76CFE4FF6FF73984240F0158642F21D +S31508006580A873C2F20003597E81B342F62002C2F212 +S31508006590000242F2A873C2F20003928C9B889A42C8 +S315080065A024D142F62002C2F2000242F2A873C2F2D5 +S315080065B00003528CDB889A4218D142F62002C2F2B6 +S315080065C0000242F2A873C2F20003528B1B889A4259 +S315080065D00CD142F62002C2F2000242F2A873C2F2BD +S315080065E00003928B5B889A4200F08D8142F6200365 +S315080065F0C2F2000393F82F3003F03F03022B1CD19D +S3150800660042F62003C2F200039A8C40F21063C2F2EB +S3150800661000031A8040F22463C2F2000300211970B5 +S3150800662042F61003C2F200031B8893427BD040F265 +S315080066302463C2F2000301221A7042F62003C2F252 +S31508006640000393F82F3013F0040F40F0AD8542F69F +S315080066502003C2F20003142283F82F2042F290721C +S31508006660C2F2000228211180502283F82E2093F8C6 +S31508006670295093F82D2083F8292093F8284093F879 +S315080066802C2083F8282083F82C4093F8270093F8C9 +S315080066902B2083F8272083F82B0093F8262040F236 +S315080066A02461C2F200010A7093F82A1083F82610B2 +S315080066B083F82A20691CC9B283F82D10C1B9611C58 +S315080066C0C9B242F62003C2F2000383F82C1079B946 +S315080066D0411CC9B242F62003C2F2000383F82B100C +S315080066E031B942F62003C2F20003013283F82A20A8 +S315080066F042F62003C2F20003598C40F21062C2F23D +S31508006700000211809A8C5A8499845A8BDA839A8B60 +S315080067101A8442F61C02C2F2000211885983528872 +S315080067209A8300F00DBD42F2A873C2F200035B7EA5 +S3150800673023B1072B40F04C8500F042BD42F2A4710C +S31508006740C2F2000142F2A873C2F200030B600321F1 +S3150800675099761976002199750420D875D9769A8084 +S3150800676042F62004C2F20004628CDA80628B1A8038 +S31508006770A28B5A800120587640F21462C2F20002B7 +S31508006780117819735178597391789973D278DA73A5 +S31508006790188294F82920DA7294F828209A7294F8C4 +S315080067A027205A7294F826201A72FFF725FD94F8C6 +S315080067B02E3003F0F002502A7ADD1B095C1FA40074 +S315080067C040F22563C2F200031A78002342F620013C +S315080067D0C2F200015AE0CA1892F8362072B940F29D +S315080067E02461C2F200010B7040F22563C2F2000375 +S315080067F01A7042F2A874C2F200045DE0012A02D1BE +S315080068000133DBB242E0022A2BD10D1895F8375036 +S31508006810042D26D140F22462C2F20002137040F21F +S315080068202563C2F2000302221A7042F62003C2F25E +S315080068300003034493F8382093F8393043EA0222D8 +S3150800684040F21063C2F200031A8040F20A639A42C9 +S3150800685038BF134642F2A874C2F200046382A382C8 +S315080068602AE0084490F8370070B940F22461C2F271 +S3150800687000010B7040F22563C2F200031A7042F25F +S31508006880A874C2F2000417E00344DBB21846A34218 +S31508006890A1DB40F22461C2F200010B7040F22563CD +S315080068A0C2F200031A7042F2A874C2F2000403E0AE +S315080068B042F2A874C2F2000442F62003C2F20003B0 +S315080068C0102283F82F2042F62003C2F2000393F821 +S315080068D02F2042F0020283F82F20022283F8362066 +S315080068E0042283F83720062283F838200A2283F800 +S315080068F0392042F29072C2F200022C2111806022E5 +S3150800690083F82E20DAE342F2A473C2F2000342F2BD +S31508006910A872C2F200021A6042F29C73C2F2000325 +S3150800692000221A7042F62003C2F2000393F82F30B1 +S3150800693013F0040F0ED042F2A873C2F200035A767F +S3150800694042F29C73C2F2000320221A7001F058F832 +S3150800695000F02ABC42F62002C2F2000292F82E008B +S315080069600009800040F22462C2F200021070143C52 +S31508006970201A80B242F29072C2F20002108001F030 +S315080069800F01022903D103F03F02122A1DD010B9C4 +S3150800699013F0030F19D042F62001C2F2000142F2A9 +S315080069A0A872C2F20002C98C1289914240F06E8325 +S315080069B042F62001C2F2000142F2A872C2F20002B7 +S315080069C0098D5289914240F0618313F0100F77D0F8 +S315080069D042F2A873C2F20003198A002970D003F1A3 +S315080069E00C00FFF7C9FB42F62003C2F2000393F836 +S315080069F02A4042F29873C2F200031B78A3425FD181 +S31508006A0042F62003C2F2000393F82B0042F2987371 +S31508006A10C2F200035B78834252D142F62003C2F2E7 +S31508006A20000393F82C1042F29873C2F200039B7885 +S31508006A308B4245D142F62003C2F2000393F82D207B +S31508006A4042F29873C2F20003DB78934238D142F2DD +S31508006A50A873C2F200031C7358739973DA73DB7E4A +S31508006A6003BB42F2A873C2F20003987D197E9A7E90 +S31508006A70891AA1EBD001C9B2CAB20844C0B2987546 +S31508006A8012F0800F1CBF4A42D2B242F2A873C2F279 +S31508006A900003D97DA1EB91010A44D2B2DA7502EB63 +S31508006AA0D0021A7642F29C73C2F2000301221A70CF +S31508006AB042F2A873C2F200031A7E9A7600221A825C +S31508006AC042F2A873C2F200035A7E02F00F03013B9A +S31508006AD0072B00F26983DFE813F008003A00040187 +S31508006AE051029B02C702D902390242F29C73C2F2D2 +S31508006AF000031B7813F0010F00F0568342F2A873C7 +S31508006B00C2F2000303225A7642F29C72C2F20002D3 +S31508006B104021117000221A8242F29073C2F20003D9 +S31508006B20188838B142F29C73C2F2000342221A70E6 +S31508006B30FFF762FB42F66263C2F2000300221A8084 +S31508006B4000F05EFF42F2A874C2F2000476E142F257 +S31508006B509C73C2F200031B7813F0010F00F0B1809A +S31508006B6042F62003C2F2000393F82F3003F03F03E6 +S31508006B70122B40F0A68042F62003C2F2000393F8D7 +S31508006B802E3003F0F002502A6DDD1B095C1FA400AD +S31508006B9040F22563C2F200031A78002342F6200168 +S31508006BA0C2F2000152E0CA1892F8362052B940F2F1 +S31508006BB02461C2F200010B7040F22563C2F20003A1 +S31508006BC01A7050E0012A02D10133DBB23EE0022AF4 +S31508006BD02BD10D1895F83750042D26D140F2246292 +S31508006BE0C2F20002137040F22563C2F200030222C9 +S31508006BF01A7042F62003C2F20003034493F83820C1 +S31508006C0093F8393043EA022240F21063C2F20003D5 +S31508006C101A8040F20A639A4228BF1A4642F2A873BB +S31508006C20C2F200035A829A821DE0084490F837009F +S31508006C3050B940F22461C2F200010B7040F225639C +S31508006C40C2F200031A700EE00344DBB21846A342F0 +S31508006C50A9DB40F22461C2F200010B7040F2256301 +S31508006C60C2F200031A7042F2A874C2F200040323A7 +S31508006C70637642F62003C2F2000393F826202272B6 +S31508006C8093F82720627293F82820A27293F8293085 +S31508006C90E3720120FFF7B0FA42F29C73C2F20003D6 +S31508006CA042221A700022228242F29073C2F2000334 +S31508006CB01A8042F66263C2F200031A8000F0A0FE50 +S31508006CC0BCE042F29C73C2F2000320221A7000F064 +S31508006CD097FE42F2A473C2F200031B6800225A769A +S31508006CE0ABE442F62003C2F2000393F82F3013F008 +S31508006CF0010F38D012F0100F35D142F2A873C2F244 +S31508006D0000031B8A002B40F04F8242F29074C2F2B5 +S31508006D1000042088013080B2FFF76EFA42F29C73B5 +S31508006D20C2F200031A7842F010011970238833B1B1 +S31508006D3042F29C73C2F2000342F012021A7000F08B +S31508006D405FFE42F2A874C2F20004012323820823DC +S31508006D5063760023E37642F62003C2F2000311228B +S31508006D6083F82F209DE113F0200F18D042F6200358 +S31508006D70C2F2000393F83400000293F8351042F289 +S31508006D80A073C2F2000340EA01051C682C441C608B +S31508006D9042F29073C2F200031888411B198042F22E +S31508006DA09073C2F20003188860B112F0100F09D16F +S31508006DB042F29C73C2F200031A7842F002021A7079 +S31508006DC0FFF71AFA42F62003C2F2000393F83020BE +S31508006DD093F8313003EB02239BB240F21062C2F201 +S31508006DE00002138042F2A872C2F20002928A93420B +S31508006DF000D823B940F21063C2F200031A8042F2A7 +S31508006E00A873C2F2000340F21062C2F200021288AE +S31508006E105A8242F29C73C2F200031B7813F0030FE6 +S31508006E2000F0C28142F66263C2F2000300221A80B1 +S31508006E3000F0E6FD42F2A874C2F2000442F29C7326 +S31508006E40C2F200031B7813F0200F0ED042F66263DD +S31508006E50C2F2000300221A80627642F62003C2F2CA +S31508006E600003142283F82F201BE113F0100F12D011 +S31508006E7042F66263C2F2000300221A8001232382CB +S31508006E8004236376E27642F62003C2F20003112257 +S31508006E9083F82F2005E142F66262C2F200021288E8 +S31508006EA0DAB113F0010F1CBF0023238201D1218A16 +S31508006EB071B9618A8A4282BF42F66263C2F20003EE +S31508006EC0198042F66263C2F200031B88238204E03B +S31508006ED042F66263C2F2000319800023E37642F2A7 +S31508006EE0A073C2F2000342F29472C2F20002126860 +S31508006EF01A6042F66263C2F200031B887BB1238ADA +S31508006F006BB142F29072C2F200022833138042F645 +S31508006F102003C2F20003182283F82F20C7E042F2AA +S31508006F209C73C2F200031B7813F0020F00F03C8139 +S31508006F3042F29073C2F2000328221A8042F6200316 +S31508006F40C2F20003102283F82F20B0E042F29C73AD +S31508006F50C2F200031B7813F0010F00F0258142F2FC +S31508006F60A873C2F2000300225A7642F29C73C2F258 +S31508006F70000310221A7000F043FD15E142F29073E7 +S31508006F80C2F20003188808B1FFF736F942F6200363 +S31508006F90C2F2000393F82F3013F0010F1FD042F20C +S31508006FA09C73C2F200031B7813F0010F42F2A87318 +S31508006FB0C2F200031FBF07225A7600229A7612BF32 +S31508006FC01A8206225A760120FFF716F942F29C73B6 +S31508006FD0C2F2000310221A7000F012FD56E042F2C7 +S31508006FE09C73C2F200031B7813F0010F08D042F21B +S31508006FF0A873C2F2000305225A7600221A82D3E049 +S3150800700042F29073C2F200031B88002B3ED1CBE0FC +S3150800701042F29073C2F20003188808B1FFF7ECF841 +S3150800702042F62003C2F2000393F82F3013F0010F43 +S3150800703013D042F2A873C2F2000307225A7600223E +S315080070409A760120FFF7D8F842F29C73C2F2000341 +S3150800705010221A7000F0D4FC18E042F29073C2F2C3 +S3150800706000031B8893B99FE042F29C73C2F20003A7 +S315080070701B7813F0010F00F0978042F2A873C2F252 +S31508007080000307225A7600229A768DE042F62003FC +S31508007090C2F20003102283F82F2042F2A874C2F22B +S315080070A0000442F29073C2F2000328221A8042F6C4 +S315080070B02003C2F20003502283F82E20227A42F6D9 +S315080070C02003C2F2000383F82A20627A83F82B2071 +S315080070D0A27A83F82C20E27A83F82D20227B83F883 +S315080070E02620627B83F82720A27B83F82820E27B70 +S315080070F083F829200622DA75A2885A84E2889A84B7 +S3150800710042F61C02C2F200021188598352889A83F9 +S315080071102288DA8362881A84637E13F0100F42F697 +S315080071202003C2F200031DBF002283F8312083F832 +S315080071303020062202BF83F830200A2283F8312045 +S3150800714042F62004C2F200044023A37542F290736B +S31508007150C2F200031B881A0A22746374002584F895 +S31508007160355084F834506586FFF770F8C04360865A +S315080071704523A373E5736575257540F21263C2F25C +S3150800718000031A88013292B21A80130AA374E274B1 +S315080071902583FFF749F8C043208342F29C73C2F265 +S315080071A0000300221A7038BD42F29073C2F200033F +S315080071B000221A8042F29C73C2F200031A7038BD8C +S315080071C040F22463C2F2000301211970FFF7B6BA30 +S315080071D040F22463C2F2000301221A70E4E700BFFA +S315080071E0030A43EA002080B2704700BF10B5044680 +S315080071F00A1E0FDD42F66263C2F200031A8042F2EB +S315080072009473C2F200031868844203D0214692B2EE +S3150800721002F046F910BD00BF2DE9F00340F22663DF +S31508007220C2F200034FF0000C83F800C040F2286554 +S31508007230C2F200052B4601221F461C88CCB15E8887 +S31508007240BEB1B0F80080A04513D14488B44210D12D +S3150800725040F22663C2F2000383F800C0086878602B +S315080072608B883B8140F28963C2F200031B78BB72AC +S315080072705AE0541CE4B20C33092C02D09446224638 +S31508007280DAE72B4600221E461C884CB95C883CB9B6 +S3150800729040F22663C2F200031A70082A36D104E0C7 +S315080072A00132D2B20C33082AEDD1002340F28962AA +S315080072B0C2F200021678B0461F4699465FFA83FC6A +S315080072C0AA7AC2EB0804BC42C2BFC2EB0602E14678 +S315080072D0D7B201330C35082BF0D140F22763C2F23E +S315080072E000031F7040F28863C2F2000383F800901F +S315080072F040F22663C2F2000383F8009040F2286346 +S31508007300C2F2000309EB490903EB89060268334612 +S3150800731043F8042B0A6872608A889A8040F2896367 +S31508007320C2F200031B78B372BDE8F003704700BFD2 +S31508007330F0B440F28963C2F200031E780136F6B251 +S315080073401E7040F22863C2F200030122002740F2B1 +S315080073502664C2F2000458881988014389B259B1D3 +S31508007360997A711A772907DD194601F8017B5F704A +S31508007370013101F8017B0F7022700132D2B20C3351 +S31508007380092AE8D1F0BC704738B542F29073C2F2C8 +S3150800739000031B88292B06D842F29073C2F2000319 +S315080073A000221A8038BD42F29073C2F2000300220E +S315080073B01A8042F62003C2F200039B8AB3F5807F47 +S315080073C003D0B3F5007F59D038BD42F62002C2F289 +S315080073D0000242F61C03C2F20003D28C1B889A42B2 +S315080073E069D142F62002C2F2000242F61C03C2F23A +S315080073F00003128D5B889A425DD12F4CA51F20464B +S315080074002946FFF709FFA4F11C03002204F8082CFB +S31508007410022204F8072C54F8062C626034F8022C71 +S31508007420228140F21C62C2F20002106844F8060C7F +S31508007430928824F8022C44F8160C24F8122C626858 +S3150800744044F81C2C228924F8182C9A8B62816288AD +S31508007450A28142F61C02C2F2000211889983528860 +S315080074606280082204F8102C062204F80F2C42F237 +S315080074709073C2F200032A221A8038BD42F620020F +S31508007480C2F2000242F61C03C2F20003D28C1B8829 +S315080074909A4210D142F62002C2F2000242F61C03BA +S315080074A0C2F20003128D5B889A4204D1024908464B +S315080074B00639FFF7B1FE38BD3C28002038B542F63C +S315080074C02003C2F20003D98B8AB24FF6FF739A42A1 +S315080074D015D142F62003C2F20003188C4FF6FF734B +S315080074E098420CD142F62003C2F2000349F6E43270 +S315080074F0C0F600021068186092889A80ADE042F6DD +S315080075001C03C2F200031B885A4042F61803C2F253 +S3150800751000031B881A4212D142F62003C2F2000366 +S315080075201A8C90B242F61C03C2F200035B885840DC +S3150800753042F61803C2F200035B8818420CD040F2E8 +S315080075408C63C2F2000342F61402C2F200021188EA +S31508007550198052885A8005E040F28C63C2F2000313 +S3150800756019805A8040F28C63C2F2000318885D883D +S3150800757040F22863C2F2000300221C4619888142A1 +S315080075800AD15988A94207D140F22663C2F20003FC +S315080075901A70082A58D109E00132D2B20C33082AE7 +S315080075A0EBD140F22663C2F200031A7042F62004B9 +S315080075B0C2F200042046FF21062201F0C5FF00237F +S315080075C084F8203084F8213084F8223084F8233077 +S315080075D084F8243084F8253040F21C62C2F2000296 +S315080075E01168C4F8061092886281C4F8161062837E +S315080075F040F28C62C2F200021188E1845288228528 +S3150800760042F61C02C2F200021188A1835288E28364 +S31508007610237501226275A373E273082222746374C8 +S315080076200623A3740423E37422730623637342F2C6 +S31508007630A073C2F2000336341C6042F29073C2F2A1 +S3150800764000032A221A8038BD42F62003C2F200033C +S3150800765054F8040F1860A2889A8042F62003C2F2F2 +S31508007660000340F21C62C2F200021168C3F8061059 +S3150800767092885A8108221A7300225A7342F290732A +S31508007680C2F200031A880E321A8038BD08B500F017 +S3150800769017FC01F093FE01F077FE00F095FC00F070 +S315080076A00FF800F0FBFB08BD08B500F00BFC01F075 +S315080076B0A1FE00F0C7FD00F01BF800F0C7FB08BDEF +S315080076C010B500F0E1F901F00BF840F2E404C2F25B +S315080076D000040123237001F08DFB0023237001F0C1 +S315080076E0ABFC0223237000F0A9F80323237010BD16 +S315080076F008B540F29060C2F2000001F0F9F80128DE +S315080077000BD140F2E403C2F2000301221A7040F2E0 +S315080077109060C2F2000000F0D7F940F29060C2F221 +S31508007720000001F0BBFB01280BD140F2E403C2F2D2 +S31508007730000300221A7040F29060C2F2000000F0C6 +S31508007740C3F940F29060C2F2000001F02BFD012857 +S315080077500BD140F2E403C2F2000302221A7040F28F +S315080077609060C2F2000000F0AFF940F29060C2F2F9 +S31508007770000000F0BFF801280BD140F2E403C2F282 +S31508007780000303221A7040F29060C2F2000000F073 +S315080077909BF908BD08B501F0BBFC08BD38B5054620 +S315080077A00C4640F2E403C2F200031B78012B02D117 +S315080077B0C9B201F049F840F2E403C2F200031B78AB +S315080077C01BB92846E1B201F035FB40F2E403C2F2E8 +S315080077D000031B78022B03D12846E1B201F0A4FC72 +S315080077E040F2E403C2F200031B78032B03D12846B8 +S315080077F0E1B200F05DF800F05FF938BD40F2E4034D +S31508007800C2F200031878012804D002280CBF3F20D2 +S31508007810402070470820704740F2E403C2F2000394 +S315080078201878012804D002280CBF3F204020704752 +S315080078300820704708B500F035F908BD08B5FBF70C +S3150800784079FF01F0E9FD40F2D463C2F2000300F5C6 +S31508007850FA70186001F0E0FD40F2D063C2F200034E +S3150800786000F51C5010301860FEF7F6FC42F61C03B3 +S31508007870C2F200034FF6A9621A8043F613715980C3 +S3150800788042F61803C2F200034FF6FF711980002171 +S31508007890598042F61403C2F200031A8040F213120A +S315080078A05A804EF60300FEF7F1FCFCF757F808BDC0 +S315080078B0F8B542F2A473C2F200031F68FB693B6283 +S315080078C08E4659B14E1EB6B20136002307F11C0585 +S315080078D0C45CEA1814720133B342F9D10EF10401FB +S315080078E0A7F8641007F12000FFF780FCFB69013355 +S315080078F0FB61F8BD10B5FCF743F800283ED042F20C +S315080079009072C2F20002108042F62003C2F200030F +S315080079109C894FF40060FFF763FC844213D1012071 +S31508007920FEF7CEFC42F29073C2F200031B882BB31B +S31508007930FFF7C4FDFCF74CF842F29073C2F200035D +S3150800794000221A801AE042F62003C2F200039C893C +S3150800795040F60600FFF744FC84420FD1FFF714FDFA +S3150800796042F29073C2F200031B883BB1FCF730F871 +S3150800797042F29073C2F2000300221A8001F04CFD15 +S3150800798040F2D463C2F200031B68984222D340F245 +S31508007990D462C2F2000203F5FA73136042F2A473CA +S315080079A0C2F2000342F2A872C2F200021A60022072 +S315080079B0FEF786FC42F29073C2F200031B884BB1B5 +S315080079C0FFF77CFDFCF704F842F29073C2F200035D +S315080079D000221A8001F020FD40F2D063C2F20003B3 +S315080079E01B68984209D340F2D062C2F2000203F53E +S315080079F01C5310331360FFF79BFC002010BD00BF1B +S31508007A0010B542F2A473C2F200031C6842F29C73DA +S31508007A10C2F200031B7813F0400F05D00123E3617F +S31508007A200023A4F8643010BD13F0010F1CBF002218 +S31508007A30A4F8642013F0040F06D0B4F8641019B142 +S31508007A4004F12000FFF7D2FB42F29C73C2F2000356 +S31508007A501B7813F0020F0AD00023A4F8643042F210 +S31508007A60A073C2F200031868043000F02DF810BDA8 +S31508007A7040F2D863C2F20003FE22DA7018710222BD +S31508007A80A3F84420704700BF40F2D863C2F200034F +S31508007A9000221A709A6483F84320A3F844209A7047 +S31508007AA05A70704740F2D863C2F200031878003063 +S31508007AB018BF0120704700BF40F2D863C2F2000326 +S31508007AC0002283F84320704738B504460178FF2919 +S31508007AD023D100F08FFA18B91020FFF7C9FF96E1F5 +S31508007AE040F2D864C2F200040023637001252570B1 +S31508007AF0FF22E270102222716371FFF77FFEA071E8 +S31508007B00FFF78AFEE071FFF787FE000A20726572AA +S31508007B10A5720823A4F8443079E140F2D863C2F28A +S31508007B2000031B78012B40F09081C939352900F2F2 +S31508007B306B81DFE811F0DB00690169016501690104 +S31508007B4069015901FC0042012F01690169016901B6 +S31508007B5069016901690169016901690169016901C7 +S31508007B6069016901690169016901690169016901B7 +S31508007B7069016901690169016901690169016901A7 +S31508007B80690169016901690169017F0054003600CC +S31508007B907300690169016901A1006901B900BD00A5 +S31508007BA0CE004578FFF72AFE0138854203DD2220FC +S31508007BB0FFF75EFF2BE140F2D865C2F20005281DEB +S31508007BC0A96C627800F0F4FEFF23EB706278AB6C68 +S31508007BD01344AB6463780133A5F8443017E145785C +S31508007BE0FFF70CFE0138854203DD2220FFF740FF30 +S31508007BF00DE1616840F2D865C2F20005A964281D46 +S31508007C00627800F0D5FEFF23EB706278AB6C134404 +S31508007C10AB6463780133A5F84430F8E040F2D863E2 +S31508007C20C2F20003FF22DA7042689A640122A3F8BE +S31508007C304420ECE040F2D863C2F20003FF22DA7077 +S31508007C409B6C406840B11844002213F8011B0A4493 +S31508007C50D2B28342F9D100E0002240F2D863C2F2E0 +S31508007C600003C3F8072001221A7100225A719A717B +S31508007C700822A3F84420CAE040F2D863C2F20003FF +S31508007C80FF22DA7049F6EC32C0F600029A64002246 +S31508007C901A715A719A710721D9711A725A729A729F +S31508007CA00822A3F84420B2E00020FFF7E1FEAEE088 +S31508007CB040F2D863C2F20003FF22DA7000221A717A +S31508007CC0597859719A71DA711A720622A3F8442002 +S31508007CD09DE040F2D863C2F2000300221A705A707F +S31508007CE0FF22DA700122A3F8442090E040F2D8631C +S31508007CF0C2F200039D6CFFF781FD411E2846621CF7 +S31508007D0001F046FB18B93120FFF7B2FE7FE040F2DA +S31508007D10D864C2F20004FF23E370A56CFFF76EFD7A +S31508007D20013D2844A0640123A4F844306FE0457857 +S31508007D30FFF764FD0238854203DD2220FFF798FE2F +S31508007D4065E040F2D863C2F20003FF22DA7001222E +S31508007D50A3F84420617839B901F026FB002856D1EA +S31508007D603120FFF785FE52E040F2D863C2F20003E5 +S31508007D70986CA21C01F00CFB18B93120FFF778FEAD +S31508007D8045E040F2D863C2F2000361789A6C0A446F +S31508007D909A643CE040F2D864C2F20004FF23E37020 +S31508007DA0002525716571FFF729FDA071E57125721A +S31508007DB065720723A4F8443029E040F2D863C2F27A +S31508007DC00003986C616801F0E7FA18B93120FFF7EB +S31508007DD04FFE1CE040F2D863C2F20003FF22DA70BD +S31508007DE00122A3F8442012E000F0C6FD40F2D86351 +S31508007DF0C2F20003FF22DA700122A3F8442006E04B +S31508007E003120FFF735FE02E02020FFF731FE40F271 +S31508007E10D863C2F2000393F84330012B02D1102035 +S31508007E20FFF726FE40F2D863C2F20003B3F8441007 +S31508007E300BB2002B09DD40F2D860C2F20000012324 +S31508007E4080F843300330FFF7A9FC38BD08B5FFF7C3 +S31508007E50F1FC012820D000F0CDF8E8B140F22473F7 +S31508007E60C2F200031B78012B16D101F0D5FA40F2B5 +S31508007E702873C2F200031B6803F51C53103398429B +S31508007E800AD340F22473C2F2000300221A7000F0EB +S31508007E90BBF808B900F070FD08BD00BF08B540F290 +S31508007EA02473C2F2000301221A7001F0B5FA40F2F7 +S31508007EB02873C2F200031860FFF7C8FF08BD00BFA9 +S31508007EC0704700BF704700BF00F00F03092802D9AA +S31508007ED003F13700704703F1300040F2E803C2F2BD +S31508007EE000031B6803445B7803F00303022B08BFF7 +S31508007EF02038C0B2704700BF38B505460C460009A1 +S31508007F00FFF7E2FF207005F00F00FFF7DDFF607056 +S31508007F100023A370204638BD30B4024603464CF60B +S31508007F20CD40CCF6CC400131A0FB0343DB08FAD1A7 +S31508007F30002301F801394CF6CD45CCF6CC45084668 +S31508007F40A5FB0243DB0803EB8304A2EB44023032B1 +S31508007F5001F801291A46002BF1D130BC704700BF41 +S31508007F60F0B440F2E803C2F200031F6800231C467F +S31508007F70C15C7A18527802F00302022A08BF203937 +S31508007F80C9B2A1F13002D2B2A1F13A05EDB2162A70 +S31508007F9094BF00260126062D8CBF354646F00105FE +S31508007FA065B9092A84BFA1F13702D2B22401E4B225 +S31508007FB02244D4B20133022BDAD101E0002000E0DA +S31508007FC02046F0BC704700BF08B540F26C73C2F299 +S31508007FD000030020187040F27871C2F20001FDF724 +S31508007FE0B1FB30B149F6F430C0F600007C2100F050 +S31508007FF069FB08BD40F26C73C2F200031878D0F131 +S31508008000010038BF0020704708B5FFF713FC0128A8 +S315080080100FD040F26C73C2F200031B785BB9F8F715 +S31508008020C5F8012809D140F26C73C2F20003187032 +S3150800803008BD002008BD002008BD002008BD00BFFF +S31508008040027840F2E803C2F200031B6899184978DF +S3150800805001F00301022908BF203A532A0ED14078BD +S3150800806003445B7813F0040F0AD031280AD032286B +S315080080700AD0332814BF0320022070470320704714 +S3150800808003207047002070470120704770B50446EA +S315080080900230FFF765FF0646054604342046FFF71B +S315080080A05FFF3044C6B2013DADB20234012DF5D8AA +S315080080B02046FFF755FFF643F6B2864214BF002066 +S315080080C0012070BD2DE9F04115460F4604460029EA +S315080080D018BF002807D149F6F430C0F6000040F270 +S315080080E0362100F0EFFA2046FFF7AAFF06460328D6 +S315080080F008BF002000F0A2802046FFF7C7FF00282F +S3150800810000F08C80012E29D016B1022E53D088E0BB +S31508008110A01CFFF725FF8046201DFFF721FF06025A +S315080081203E60A01DFFF71CFF3044386004F10806C6 +S31508008130A8F103081FFA88F84046002D7ED00FFAEA +S3150800814088F7002F6FDD00243046FFF709FF285512 +S3150800815002360134A4B2BC42F6DB66E0A01CFFF787 +S31508008160FFFE8046201DFFF7FBFE06043E60A01DAD +S31508008170FFF7F6FE06EB00263E6004F10800FFF75F +S31508008180EFFE3044386004F10A06A8F104081FFA25 +S3150800819088F84046002D51D00FFA88F7002F46DDA3 +S315080081A000243046FFF7DCFE285502360134A4B217 +S315080081B0BC42F6DB3DE0A01CFFF7D2FE8046201D40 +S315080081C0FFF7CEFE06063E60A01DFFF7C9FE06EBCA +S315080081D000463E6004F10800FFF7C2FE06EB0026E3 +S315080081E03E6004F10A00FFF7BBFE3044386004F134 +S315080081F00C06A8F105081FFA88F84046F5B10FFAEB +S3150800820088F7002F17DD00243046FFF7A9FE28550A +S3150800821002360134A4B2BC42F6DB0EE04FF6FF701C +S315080082200CE000200AE0404608E0404606E04046EA +S3150800823004E0404602E0404600E0404600B2BDE8A1 +S31508008240F08100BF70B540F26C73C2F200031B7870 +S31508008250002B00F03382012B3FD1F7F7CFFF49F609 +S315080082600C40C0F60000F8F713F849F63040C0F69F +S315080082700000F8F70DF8F7F7BBFF0146BD480122E5 +S31508008280FDF776FA48B149F65840C0F60000F7F708 +S31508008290FFFF0120F7F7ECFF70BD49F66040C0F616 +S315080082A00000F7F7F5FF49F66840C0F60000F7F753 +S315080082B0EFFF49F68C40C0F60000F7F7E9FF40F2F9 +S315080082C07073C2F2000300221A605A6040F26C739F +S315080082D0C2F2000302221A7070BD022B40F0FD8024 +S315080082E040F27874C2F2000440F6D030C2F20000C0 +S315080082F04FF4807104F50D72FDF760FE94F93A3279 +S31508008300002B13DA49F65840C0F60000F7F7C0FF0D +S315080083100220F7F7ADFF04F50D70FDF7F5FC40F206 +S315080083206C73C2F2000300221A7070BD00B340F6E7 +S31508008330D031C2F20001084601F5C0710022FFF7EC +S31508008340C1FE0546B0F1FF3F12D149F65840C0F6C6 +S315080083500000F7F79DFF0320F7F78AFF8548FDF72A +S31508008360D3FC40F26C73C2F2000300221A7070BD8F +S315080083702BB2002B2CDD40F27073C2F200035B684F +S315080083806BB940F27073C2F2000340F6D032C2F203 +S315080083900002D2F880211A602DB25D6018E040F61E +S315080083A0D032C2F20002D2F8801140F27072C2F2E4 +S315080083B00002126891423EBF40F27072C2F2000299 +S315080083C0116040F27072C2F2000203FA85F353603C +S315080083D040F27873C2F20003D3F83C22D3F8403255 +S315080083E09A4240F06B8163480021FDF797FC90B1F3 +S315080083F049F65840C0F60000F7F74AFF0420F7F799 +S3150800840037FF5C48FDF780FC40F26C73C2F200034C +S3150800841000221A7070BD49F66040C0F60000F7F7F2 +S3150800842037FF49F6BC40C0F60000F7F731FF40F2C7 +S315080084307075C2F2000540F22C74C2F20004686836 +S315080084402146FFF769FD2046F7F722FF49F6C8409F +S31508008450C0F60000F7F71CFF2E68300E2146FFF71E +S315080084604BFDC6F30740A11CFFF746FDC6F30720E0 +S31508008470211DFFF741FDF0B2A11DFFF73DFD204686 +S31508008480F7F706FF49F66C50C0F60000F7F700FF4D +S315080084902868696800F080FF90B949F65840C0F628 +S315080084A00000F7F7F5FE0520F7F7E2FE3148FDF77D +S315080084B02BFC40F26C73C2F2000300221A7070BDE6 +S315080084C049F66040C0F60000F7F7E2FE40F26C732A +S315080084D0C2F2000303221A7070BD032B40F0EE802F +S315080084E040F27874C2F2000440F6D030C2F20000BE +S315080084F04FF4807104F50D72FDF760FD94F93A3278 +S31508008500002B13DA49F6E440C0F60000F7F7C0FE80 +S315080085100220F7F7ADFE04F50D70FDF7F5FB40F206 +S315080085206C73C2F2000300221A7070BD20B340F6C5 +S31508008530D032C2F20002104602F5C07102F580720E +S31508008540FFF7C0FD0546B0F1FF3F15D149F60850C3 +S31508008550C0F60000F7F79CFE0320F7F789FE0548EA +S31508008560FDF7D2FB40F26C73C2F2000300221A70C8 +S3150800857070BD00BFAC0900202BB2002B59DD49F6AF +S315080085802C50C0F60000F7F783FE2DB240F22C748B +S31508008590C2F2000428462146FFF7BEFC2046F7F73C +S315080085A077FE49F63C50C0F60000F7F771FE40F634 +S315080085B0D036C2F2000696F883012146FFF79CFCE6 +S315080085C096F88201A11CFFF797FC96F88101211DF8 +S315080085D0FFF792FC96F88001A11DFFF78DFC204657 +S315080085E0F7F756FE49F66C50C0F60000F7F750FE4E +S315080085F0D6F88001294606F5807200F0C9FE90B9C2 +S3150800860049F65840C0F60000F7F742FE0620F7F78D +S315080086102FFE2B48FDF778FB40F26C73C2F200037D +S3150800862000221A7070BD49F66040C0F60000F7F7E0 +S315080086302FFE40F27873C2F20003D3F83C22D3F837 +S3150800864040329A423AD149F65450C0F60000F7F73C +S315080086501FFE00F0A9FE90B949F65840C0F6000082 +S31508008660F7F716FE0720F7F703FE1548FDF74CFB4C +S3150800867040F26C73C2F2000300221A7070BD49F60C +S315080086806040C0F60000F7F703FE49F67050C0F6E2 +S315080086900000F7F7FDFD0A48FDF736FB49F6885056 +S315080086A0C0F60000F7F7F4FD40F26C73C2F200035F +S315080086B000221A70F7F7BAFD00F05EF970BD00BF28 +S315080086C0AC09002008B540F65453C2F200031860FE +S315080086D040F65853C2F200031960FFF7F3FBFCE7B4 +S315080086E02DE9F047002349F6D850C0F600004FF4AC +S315080086F0FA744AF2104113F80080C21892F801C0C1 +S3150800870008EB0C0202FB044291FBF2F902FB191674 +S3150800871036B94D4609F1FF3292B2B2F5806F03D3EE +S315080087200233242BE7D187E04746E2464FF4D0438D +S31508008730C4F2000300225A611A6842F400421A6021 +S315080087401B6813F4004F09D04FF4D044C4F2000458 +S31508008750FFF7B8FB236813F4004FF9D14FF4D04361 +S31508008760C4F200031A6822F002021A601A6842F07C +S3150800877001021A605B6813F0010F09D14FF4D04467 +S31508008780C4F20004FFF79EFB636813F0010FF9D0EB +S31508008790013F0AF1FF36360546EA0747013D3D43E4 +S315080087A04FF4D043C4F20003DD611A6822F00102D7 +S315080087B01A605B6813F0010F09D04FF4D044C4F275 +S315080087C00004FFF77FFB636813F0010FF9D14FF43C +S315080087D0C843C4F20003D3F8002242F00102C3F8EA +S315080087E00022D3F81C2222F48042C3F81C22D3F8B4 +S315080087F00C2242F48042C3F80C220022C3F8B022AD +S31508008800C3F8B422D3F8042222F48042C3F804221F +S31508008810D3F8142222F48042C3F81422D3F81C2277 +S3150800882042F48042C3F81C22D3F8002222F0010247 +S31508008830C3F80022BDE8F08749F6B450C0F6000038 +S31508008840F021FFF73FFF71E738B504460D464FF4B0 +S31508008850D043C4F200039B6813F0806F07D149F632 +S31508008860B450C0F600004FF4A271FFF72BFF4FF487 +S31508008870D043C4F20003D3F8802102F00102C3F802 +S315080088808021D3F8802142F07C4242F40012C3F8DA +S315080088908021C3F88451E178A278120442EA016281 +S315080088A021780A43617842EA0122C3F88821E179EE +S315080088B0A279120442EA016221790A43617942EAFD +S315080088C00122C3F88C21D3F8802142F00102C3F8B3 +S315080088D080219B6813F0806F09D14FF4D044C4F20D +S315080088E00004FFF7EFFAA36813F0806FF9D038BDDC +S315080088F04FF4D043C4F20003DB6813F0030F39D0FA +S315080089004FF4D043C4F20003D3F8B02140F26763B2 +S31508008910B3EB525F18BF002023D14FF4D043C4F203 +S315080089200003D3F8B8210270D3F8B821120A4270AE +S31508008930D3F8B821120C8270D3F8B821120EC2707F +S31508008940D3F8BC210271D3F8BC21120A4271D3F8BC +S31508008950BC21120C8271D3F8BC311B0EC3710120E5 +S31508008960FFE74FF4D043C4F20003DA6842F020026E +S31508008970DA6070470020704708B500F011FDA8B10D +S31508008980F7F708FC90B1FEF705FF00F02BFD00F0A5 +S31508008990F3F920F0604020F07F024EF60853CEF23D +S315080089A000031A6000F0E8F94368984708BD00BF5D +S315080089B070B5561EB6B24AB14C1E0E44451A14F886 +S315080089C0013F2B55FFF77EFAB442F8D170BD00BFC0 +S315080089D0F8B507460024254649F62C66C0F6000673 +S315080089E0FFF770FAA359BB420ED8311949680B44F0 +S315080089F09F4209D249F62C63C0F6000305EB4502EF +S31508008A0003EB8203187AF8BD01350C346C2CE7D1D8 +S31508008A10FF20F8BD2DE9F84380460068FFF7D8FF28 +S31508008A20FF2830D0FBF704F8F320FBF721F8FBF713 +S31508008A3025F801281CBF002408F1040904D1FBF716 +S31508008A400DF80020BDE8F883D8F80060A71959F892 +S31508008A500450FFF737FA38462946FBF78DF80828F9 +S31508008A6007D1A359AB4206D10434B4F5007FEBD144 +S31508008A7003E0002402E0002400E00124FAF7EEFFF8 +S31508008A802046BDE8F8830020BDE8F88338B50446DB +S31508008A900D4640F65C53C2F20003984209D04FF4E3 +S31508008AA04043C0F6000399420BD0FFF7B3FF20B945 +S31508008AB017E040F66074C2F20004C5F3080393B9E0 +S31508008AC003E040F65C54C2F2000423689D420CD0D1 +S31508008AD0204640F8045B29464FF40072FFF768FF0A +S31508008AE003E0002038BD002038BD204638BD00BF51 +S31508008AF02DE9F04106460C4617461D464FEA512811 +S31508008B004FEA48280368B3F1FF3F06D140F8048BC3 +S31508008B1041464FF40072FFF74BFF3368434505D0D3 +S31508008B2030464146FFF7B2FF0646D0B13368E41A2D +S31508008B303444043408F50078FFF7C4F9331DE31A02 +S31508008B40B3F5007F06D330464146FFF79FFF06463A +S31508008B5050B1041D17F8013B04F8013B013DEBD168 +S31508008B6005E00020BDE8F0810020BDE8F081012085 +S31508008B70BDE8F08140F66073C2F200034FF0FF32A1 +S31508008B801A6040F65C53C2F200031A60704700BFD1 +S31508008B9070B504460D461646FFF71AFFFF281BD088 +S31508008BA0681E2044FFF714FFFF2817D0620A4FF407 +S31508008BB04043C0F60003B3EB422F07BF40F65C50B4 +S31508008BC0C2F2000040F66070C2F20000214632464A +S31508008BD02B46FFF78DFF70BD002070BD002070BDCD +S31508008BE0F8B505460E46FFF7F3FE0446701E284400 +S31508008BF0FFF7EEFE0546FF2C18BFFF2833D0844248 +S31508008C002BD8022C2BD90B282BD8FAF711FFF320D7 +S31508008C10FAF72EFFFAF732FF01281EBF49F6FC566F +S31508008C20C0F60006022703D1FAF718FF0020F8BDA0 +S31508008C30FFF748F936F814003946FAF765FF0828A9 +S31508008C4003D0FAF70BFF0020F8BD0134E4B2A542C1 +S31508008C50EED2FAF703FF0120F8BD0020F8BD002088 +S31508008C60F8BD0020F8BD0020F8BD00BF00B583B0F0 +S31508008C7040F65C53C2F200031B68B3F1FF3F08BF1E +S31508008C8001201CD040F65C53C2F2000399685A686A +S31508008C901144DA6811441A6911445A6911449A69E7 +S31508008CA00A44D96953185B4202AA42F8043D4CF2B9 +S31508008CB08810C0F600000421FFF76AFFFFE703B03B +S31508008CC05DF804FB4CF20402C0F600024FF4404380 +S31508008CD0C0F6000310681B6818444CF20803C0F677 +S31508008CE000031B6818444CF20C03C0F600031B680B +S31508008CF018444CF21003C0F600031B6818444CF2E3 +S31508008D001403C0F600031B6818444CF21803C0F697 +S31508008D1000031B6818444CF28813C0F600031B684E +S31508008D201844D0F1010038BF0020704708B540F656 +S31508008D305C53C2F200031B68B3F1FF3F06D040F64E +S31508008D405C50C2F20000FFF765FE88B140F660731A +S31508008D50C2F200031B68B3F1FF3F0BD040F6607008 +S31508008D60C2F20000FFF756FE003018BF012008BD0A +S31508008D70002008BD012008BD4FF44040C0F60000A1 +S31508008D80704700BF38B504464FF4A050C4F201003E +S31508008D908021FBF779F990B14FF4A050C4F2010095 +S31508008DA02146FBF769F94FF4A054C4F20104802563 +S31508008DB020462946FBF768F90028F9D001E000208B +S31508008DC038BD012038BD00BF10B504464FF4A05089 +S31508008DD0C4F201002021FBF757F9012808D14FF406 +S31508008DE0A050C4F20100FBF74BF92070012010BD1A +S31508008DF0002010BD10B584B04FF4614300930023E2 +S31508008E00ADF80430ADF80630ADF80830ADF80C30E2 +S31508008E100C23ADF80A304FF4A054C4F201042046DE +S31508008E206946FBF7ABF820460121FBF717F904B0B2 +S31508008E3010BD00BF2DE9F04106460C46402906D96B +S31508008E4049F69860C0F600007721FFF73BFC2046FC +S31508008E50FFF798FF012806D049F69860C0F600008B +S31508008E607B21FFF72FFC2546ACB1002449F698670D +S31508008E70C0F600074FF08408FFF724F8305DFFF7C7 +S31508008E8081FF012803D038464146FFF71BFC013411 +S31508008E90A3B2AB42F0D3BDE8F08100BF10B50446DB +S31508008EA041F2A913C2F200031B78D3B941F2641048 +S31508008EB0C2F20000FFF788FF012838D141F2641397 +S31508008EC0C2F200031B78A3B341F2A913C2F200034E +S31508008ED001221A7041F2A813C2F20003002018708A +S31508008EE010BD41F2A813C2F200031878144B1844B7 +S31508008EF0FFF76AFF01281ED141F2A813C2F2000348 +S31508008F001A780132D2B21A7041F26413C2F200031F +S31508008F101B78934211D120460949FFF749FD41F2D2 +S31508008F20A913C2F2000300221A70012010BD002006 +S31508008F3010BD002010BD002010BD002010BD00BFD0 +S31508008F406511002038B504460D46012807D949F6AB +S31508008F50BC60C0F6000040F29F11FFF7B3FB41F278 +S31508008F60F013C2F2000304EB440203EBC2035A7C7B +S31508008F701B7C9A4220D041F2F013C2F2000304EBA4 +S31508008F80440203EBC203DA681570597C013159743F +S31508008F90DA680132DA605B689A420FD941F2F01357 +S31508008FA0C2F200036200111953F83110144403EB9E +S31508008FB0C403D960012038BD002038BD012038BD62 +S31508008FC038B504460D46012807D949F6BC60C0F6EF +S31508008FD0000040F2C111FFF775FB41F2F013C2F22F +S31508008FE0000304EB440203EBC2035B7CFBB141F2D2 +S31508008FF0F013C2F2000303EBC2039A6812782A70D0 +S31508009000597C013959749A6801329A605B689A42A8 +S315080090100FD941F2F013C2F200036200111953F896 +S315080090203110144403EBC4039960012038BD0020B5 +S3150800903038BD012038BD00BF10B582B041F2F0132B +S31508009040C2F200030020987403F118025A61012144 +S3150800905083F82A10D86241F2EC11C2F200010A60C4 +S315080090604021197441F2A821C2F200014C1C9C60EF +S31508009070DC6058741C6001F140045C600870002ACA +S315080090803DD041F2EC11C2F20001D86A08604021D5 +S3150800909083F8281041F22021C2F20001481C186208 +S315080090A05862002483F82940986101F1400353600F +S315080090B0927C0A7041F2A823C2F200031B78FF2BA8 +S315080090C001D0FF2A06D149F6BC60C0F600007E2111 +S315080090D0FFF7F8FA40F28003C2F20003009341F268 +S315080090E0F020C2F20000012140F24C02C2F2000256 +S315080090F040F22003C2F20003F7F7F2FB06E041F262 +S315080091002023C2F20003FF221A70DCE702B010BD6A +S3150800911008B541F2F020C2F20000F8F771FC002011 +S31508009120F7F732F808BD00BF2DE9F84307460C46A5 +S315080091303F2906D949F6BC60C0F600009F21FFF713 +S31508009140C1FA41F2A823C2F2000318782146FFF7B4 +S31508009150F9FE012806D049F6BC60C0F60000A32136 +S31508009160FFF7B0FA2646D4B1002441F2A825C2F288 +S31508009170000549F6BC68C0F600084FF0AC09FEF7D2 +S31508009180A1FE2878395DFFF7DDFE012803D04046A9 +S315080091904946FFF797FA0134A3B2B342EFD3BDE8C5 +S315080091A0F88300BF10B5044641F2F020C2F2000071 +S315080091B0F8F730FC41F2EC23C2F200031B7803BB3C +S315080091C041F22023C2F20003187841F2AC11C2F230 +S315080091D00001FFF7F5FE01283ED141F2AC13C2F2B9 +S315080091E000031B78002B39D041F2EC23C2F20003AE +S315080091F001221A7041F2A423C2F20003002018705B +S3150800920010BD41F22023C2F2000341F2A422C2F2A9 +S31508009210000211781878144B1944FFF7D1FE01287B +S315080092201ED141F2A423C2F200031A780132D2B247 +S315080092301A7041F2AC13C2F200031B78934211D1A3 +S3150800924020460949FFF7B4FB41F2EC23C2F20003BA +S3150800925000221A70012010BD002010BD002010BD8C +S31508009260002010BD002010BDAD1100202DE9F043EF +S3150800927083B041F2A823C2F200031C78012C07D957 +S3150800928049F6BC60C0F6000040F2E111FFF71AFA91 +S3150800929041F2F013C2F2000304EB440403EBC403E7 +S315080092A05B7CBBB3402B34BF99464FF04009B9F1FC +S315080092B0000F23D041F26422C2F20002541E09F1C3 +S315080092C0FF3652FA86F641F2A825C2F2000549F69B +S315080092D0BC67C0F6000740F2291828780DF1070187 +S315080092E0FFF76EFE012803D038464146FFF7EAF934 +S315080092F09DF8072004F8012FB442EED141F2F02080 +S31508009300C2F20000812141F26422C2F200024B46F9 +S31508009310F8F714FB03B0BDE8F08300BF2DE9F84366 +S3150800932041F2F023C2F2000300EB800003EBC00316 +S31508009330B3F88C73DFB1002441F22026C2F200068E +S3150800934049F6BC68C0F600084FF4A4793578F7F7F3 +S31508009350B3F8015D2846FFF7F5FD012803D040461E +S315080093604946FFF7AFF90134A3B29F42EED8F7F7A3 +S31508009370A3F8024641F2F020C2F200000121402380 +S31508009380F8F7C0FABDE8F88308B5FFF7F3FB08BDA0 +S3150800939008B5FFF7FDFB08BD08B5FFF721FC08BDBA +S315080093A008B5FFF78FFC08BD08B5FFF75FFC10B1DD +S315080093B0FFF7BCFC08BD002008BD00BF4EF2100335 +S315080093C0CEF2000300221A6049F23F01C0F2020100 +S315080093D059609A600521196041F6E403C2F2000358 +S315080093E01A6070474EF21003CEF2000300221A608C +S315080093F0704700BF4EF21003CEF200031B6813F449 +S31508009400803F1FBF41F6E403C2F200031A68013227 +S3150800941018BF1A60704700BF08B5FFF7EBFF41F6A3 +S31508009420E403C2F20003186808BD00BF08B549F690 +S31508009430E060C0F600003621FFF744F908BD00BF1A +S3150800944010B572B640F20002C2F2000240F2EC0316 +S31508009450C2F200039A4210D2131D0E4CE41A24F0ED +S3150800946003040434002310464AF21001C0F6000132 +S315080094705A581A500433A342FAD1074807494FF0FD +S3150800948000028842B8BF40F8042BFADBF6F730FF33 +S3150800949010BD00BFEF00002000010020642E002050 +S315080094A00F2AF0B445D940EA01039B0745D1A2F13A +S315080094B010070C4603463F0900EB071610362568C9 +S315080094C01033103443F8105C54F80C5C43F80C5C09 +S315080094D054F8085C43F8085C54F8045C43F8045CE8 +S315080094E0B342ECD17B1C02F00F0CBCF1030F4FEA20 +S315080094F003131944034422D90E461D46644656F8FA +S31508009500047B043C032C45F8047BF8D8ACF104042E +S3150800951002F0030224F0030404342344214432B144 +S315080095200A4411F8014B914203F8014BF9D1F0BCFA +S3150800953070470346002AF3D1F9E70346F0E7624687 +S31508009540002AEDD1F3E700BF8307F0B448D0541ED4 +S31508009550002A43D0CDB2034602E0002C3ED0144682 +S3150800956003F8015B13F0030F04F1FF32F5D1032C66 +S315080095702DD9CDB20F2C45EA052545EA054518D95A +S31508009580A4F1100703F110061A463F0906EB071661 +S315080095901560103242F80C5C42F8085C42F8045C2C +S315080095A0B242F5D104F00F040137032C03EB07137D +S315080095B00DD91E462246043A46F8045B032AFAD811 +S315080095C0221F04F0030422F00302043213442CB1D0 +S315080095D0C9B21C4403F8011BA342FBD1F0BC704777 +S315080095E014460346C3E700BF2F64656D6F70726F3C +S315080095F0675F6F6C696D65785F73746D3332653458 +S3150800960030372E73726563002F626F6F746C6F67E5 +S315080096102E7478740000000057696E555342204234 +S31508009620756C6B2044657669636500004F70656EDE +S31508009630424C5420557365720000000030303030BB +S315080096403030303030353043000000004465666104 +S31508009650756C740057696E5553422042756C6B20C1 +S31508009660496E746572666163650000002E2F6C6929 +S31508009670622F7569702F6E65746465762E630000B7 +S31508009680222A3A3C3E3F7C7F000000002B2C3B3DC3 +S315080096905B5D0000809A90418E418F804545454923 +S315080096A049498E8F9092924F994F555559999A9B41 +S315080096B09C9D9E9F41494F55A5A5A6A7A8A9AAABBB +S315080096C0AC21AEAFB0B1B2B3B4B5B6B7B8B9BABBE0 +S315080096D0BCBDBEBFC0C1C2C3C4C5C6C7C8C9CACB44 +S315080096E0CCCDCECFD0D1D2D3D4D5D6D7D8D9DADB34 +S315080096F0DCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEB24 +S31508009700ECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFB13 +S31508009710FCFDFEFF01030507090E10121416181C9E +S315080097201E000000610062006300640065006600B8 +S315080097306700680069006A006B006C006D006E00C7 +S315080097406F00700071007200730074007500760077 +S315080097507700780079007A00A100A200A300A5008E +S31508009760AC00AF00E000E100E200E300E400E50041 +S31508009770E600E700E800E900EA00EB00EC00ED008F +S31508009780EE00EF00F000F100F200F300F400F5003F +S31508009790F600F800F900FA00FB00FC00FD00FE00E8 +S315080097A0FF00010103010501070109010B010D0174 +S315080097B00F01110113011501170119011B011D01E3 +S315080097C01F01210123012501270129012B012D0153 +S315080097D02F0131013301350137013A013C013E01C0 +S315080097E0400142014401460148014B014D014F0128 +S315080097F0510153015501570159015B015D015F0193 +S31508009800610163016501670169016B016D016F0102 +S3150800981071017301750177017A017C017E0192015C +S31508009820B103B203B303B403B503B603B703B8036E +S31508009830B903BA03BB03BC03BD03BE03BF03C0031E +S31508009840C103C303C403C503C603C703C803C903C7 +S31508009850CA033004310432043304340435043604AC +S315080098603704380439043A043B043C043D043E04F6 +S315080098703F044004410442044304440445044604A6 +S315080098804704480449044A044B044C044D044E0456 +S315080098904F045104520453045404550456045704FF +S315080098A0580459045A045B045C045E045F0470217E +S315080098B071217221732174217521762177217821EE +S315080098C079217A217B217C217D217E217F2141FFFF +S315080098D042FF43FF44FF45FF46FF47FF48FF49FF56 +S315080098E04AFF4BFF4CFF4DFF4EFF4FFF50FF51FF06 +S315080098F052FF53FF54FF55FF56FF57FF58FF59FFB6 +S315080099005AFF0000C700FC00E900E200E400E0009E +S31508009910E500E700EA00EB00E800EF00EE00EC00E7 +S31508009920C400C500C900E600C600F400F600F2004F +S31508009930FB00F900FF00D600DC00A200A300A5008A +S31508009940A7209201E100ED00F300FA00F100D10032 +S31508009950AA00BA00BF001023AC00BD00BC00A100DD +S31508009960AB00BB0091259225932502252425612568 +S315080099706225562555256325512557255D255C25E0 +S315080099805B251025142534252C251C2500253C256A +S315080099905E255F255A2554256925662560255025A7 +S315080099A06C2567256825642565255925582552257A +S315080099B053256B256A2518250C25882584258C258D +S315080099C090258025B103DF009303C003A303C303D7 +S315080099D0B500C403A6039803A903B4031E22C6034D +S315080099E0B50329226122B10065226422202321239E +S315080099F0F7004822B0001922B7001A227F20B200C9 +S31508009A00A025A0004100420043004400450046004E +S31508009A104700480049004A004B004C004D004E00E4 +S31508009A204F00500051005200530054005500560094 +S31508009A305700580059005A002100E0FFE1FFE5FFF2 +S31508009A40E2FFE3FFC000C100C200C300C400C500B6 +S31508009A50C600C700C800C900CA00CB00CC00CD00AC +S31508009A60CE00CF00D000D100D200D300D400D5005C +S31508009A70D600D800D900DA00DB00DC00DD00DE0005 +S31508009A807801000102010401060108010A010C011E +S31508009A900E01100112011401160118011A011C0108 +S31508009AA01E01200122012401260128012A012C0178 +S31508009AB02E01300132013401360139013B013D01E5 +S31508009AC03F0141014301450147014A014C014E014D +S31508009AD0500152015401560158015A015C015E01B8 +S31508009AE0600162016401660168016A016C016E0128 +S31508009AF0700172017401760179017B017D01910182 +S31508009B00910392039303940395039603970398038B +S31508009B1099039A039B039C039D039E039F03A0033B +S31508009B20A103A303A403A503A603A703A803A903E4 +S31508009B30AA031004110412041304140415041604C9 +S31508009B401704180419041A041B041C041D041E0413 +S31508009B501F042004210422042304240425042604C3 +S31508009B602704280429042A042B042C042D042E0473 +S31508009B702F0401040204030404040504060407046C +S31508009B80080409040A040B040C040E040F046021DB +S31508009B90612162216321642165216621672168218B +S31508009BA069216A216B216C216D216E216F2121FFAC +S31508009BB022FF23FF24FF25FF26FF27FF28FF29FF73 +S31508009BC02AFF2BFF2CFF2DFF2EFF2FFF30FF31FF23 +S31508009BD032FF33FF34FF35FF36FF37FF38FF39FFD3 +S31508009BE03AFF0000FFFFFFFFFFFF00004F70656EA2 +S31508009BF0424C54002E2E2F2E2E2F2E2E2F536F759D +S31508009C007263652F66696C652E6300004669726D1E +S31508009C107761726520757064617465207265717507 +S31508009C206573742064657465637465640A0D000061 +S31508009C304F70656E696E67206669726D77617265C9 +S31508009C402066696C6520666F722072656164696E4C +S31508009C50672E2E2E000000004552524F520A0D0064 +S31508009C604F4B0A0D000000005374617274696E67E9 +S31508009C70207468652070726F6772616D6D696E67B2 +S31508009C802073657175656E63650A0D0050617273A0 +S31508009C90696E67206669726D776172652066696CA0 +S31508009CA06520746F206F627461696E2065726173D6 +S31508009CB0652073697A652E2E2E0000004572617341 +S31508009CC0696E67200000000020627974657320665B +S31508009CD0726F6D206D656D6F7279206174203078B2 +S31508009CE00000000052656164696E67206C696E65E4 +S31508009CF02066726F6D2066696C652E2E2E4552524F +S31508009D004F520A0D00000000496E76616C696420A6 +S31508009D10636865636B73756D20666F756E642E2E4A +S31508009D202E4552524F520A0D0000000050726F67BE +S31508009D3072616D6D696E672000000000206279749B +S31508009D40657320746F206D656D6F7279206174205C +S31508009D503078000057726974696E672070726F6791 +S31508009D6072616D20636865636B73756D2E2E2E00A8 +S31508009D70436C6F73696E67206669726D7761726589 +S31508009D802066696C650A0D004669726D77617265B1 +S31508009D902075706461746520737563636573736693 +S31508009DA0756C6C7920636F6D706C657465640A0DEB +S31508009DB0000000002E2E2F2E2E2F2E2E2F536F75BD +S31508009DC07263652F41524D434D345F53544D3332C0 +S31508009DD02F63616E2E630000050206020603070361 +S31508009DE00803090309040A040B040C040C050D05F1 +S31508009DF00E050F050F0610061007100800000800CC +S31508009E0010001800200028003000380040004800E4 +S31508009E10500058008000880090009800A000A80014 +S31508009E20B000B800C000C800D000D80000C00008C4 +S31508009E3000400000030000000000010800000100C7 +S31508009E4004000000000002080000020005000000EF +S31508009E5000000408000002000600000000000608D2 +S31508009E6000000200070000000000080800000200C9 +S31508009E700800000000000A080000020009000000AF +S31508009E8000000C08000002000A00000000000E088E +S31508009E90000002000B0000002E2E2F2E2E2F2E2E35 +S31508009EA02F536F757263652F41524D434D345F537F +S31508009EB0544D33322F756172742E63002E2E2F2E59 +S31508009EC02E2F2E2E2F536F757263652F41524D43D9 +S31508009ED04D345F53544D33322F7573622E63000031 +S31508009EE02E2E2F2E2E2F2E2E2F536F757263652F23 +S31508009EF041524D434D345F53544D33322F474343FC +S31508009F002F766563746F72732E630000002020201D +S31508009F10202020202020282828282820202020200B +S31508009F2020202020202020202020202020881010DB +S31508009F301010101010101010101010101004040437 +S31508009F4004040404040404101010101010104141F5 +S31508009F5041414141010101010101010101010101E3 +S31508009F6001010101010101011010101010104242F7 +S31508009F7042424242020202020202020202020202B3 +S31508009F800202020202020202101010102000000053 +S31508009F9000000000000000000000000000000000B3 +S31508009FA000000000000000000000000000000000A3 +S31508009FB00000000000000000000000000000000093 +S31508009FC00000000000000000000000000000000083 +S31508009FD00000000000000000000000000000000073 +S31508009FE00000000000000000000000000000000063 +S31508009FF00000000000000000000000000000000053 +S3150800A0000000000000000000000000000000000042 +S3150800A01009022000010100C0320904000002FF0005 +S3150800A0200000070581024000FF070501024000FF06 +S3150800A03089040008710400080904000800000000EB +S3150800A04000000000F1030008FD030008DD03000816 +S3150800A0500000000000000000CD030008C504000849 +S3150800A060D504000805050008E504000825050008CC +S3150800A07045050008650500080403090412011001D6 +S3150800A0800000004045012300000101020301000011 +S3150800A09085050008890500088D0500089105000852 +S3150800A0A099050008A1050008AD050008A0000020D4 +S3150800A0B069080008B107000861070008C906000812 +S3150800A0C031070008AD06000895060008D9060008FD +S3150800A0D0E9060008F9060008110700080100000053 +S3150800A0E0010000000000000001020304010203044D +S3110800A0F006070809040000000C9F000881 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 a9d0e997..f7340117 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 @@ -55,7 +55,7 @@ /** \brief Motorola or Intel style byte ordering. */ #define BOOT_CPU_BYTE_ORDER_MOTOROLA (0) /** \brief Enable/disable hook function call right before user program start. */ -#define BOOT_CPU_USER_PROGRAM_START_HOOK (0) +#define BOOT_CPU_USER_PROGRAM_START_HOOK (1) /**************************************************************************************** @@ -108,6 +108,20 @@ #define BOOT_COM_UART_CHANNEL_INDEX (5) +/* The USB communication interface is selected by setting the BOOT_COM_USB_ENABLE + * configurable to 1. The maximum amount of data bytes in a message for data transmission + * and reception is set through BOOT_COM_USB_TX_MAX_DATA and BOOT_COM_USB_RX_MAX_DATA, + * respectively. + * + */ +/** \brief Enable/disable USB transport layer. */ +#define BOOT_COM_USB_ENABLE (1) +/** \brief Configure number of bytes in the target->host data packet. */ +#define BOOT_COM_USB_TX_MAX_DATA (63) +/** \brief Configure number of bytes in the host->target data packet. */ +#define BOOT_COM_USB_RX_MAX_DATA (63) + + /* 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 diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/hooks.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/hooks.c index 0f9671bc..b6dcc645 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/hooks.c +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/hooks.c @@ -69,6 +69,48 @@ blt_bool BackDoorEntryHook(void) #endif /* BOOT_BACKDOOR_HOOKS_ENABLE > 0 */ +/**************************************************************************************** +* U S B C O M M U N I C A T I O N I N T E R F A C E H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_COM_USB_ENABLE > 0) +/************************************************************************************//** +** \brief Callback that gets called whenever the USB device should be connected +** to the USB bus. +** \param connect BLT_TRUE to connect and BLT_FALSE to disconnect. +** \return none. +** +****************************************************************************************/ +void UsbConnectHook(blt_bool connect) +{ +} /*** end of UsbConnect ***/ + + +/************************************************************************************//** +** \brief Callback that gets called whenever the USB host requests the device +** to enter a low power mode. +** \return none. +** +****************************************************************************************/ +void UsbEnterLowPowerModeHook(void) +{ + /* support to enter a low power mode can be implemented here */ +} /*** end of UsbEnterLowPowerMode ***/ + + +/************************************************************************************//** +** \brief Callback that gets called whenever the USB host requests the device to +** exit low power mode. +** \return none. +** +****************************************************************************************/ +void UsbLeaveLowPowerModeHook(void) +{ + /* support to leave a low power mode can be implemented here */ +} /*** end of UsbLeaveLowPowerMode ***/ +#endif /* BOOT_COM_USB_ENABLE > 0 */ + + /**************************************************************************************** * C P U D R I V E R H O O K F U N C T I O N S ****************************************************************************************/ @@ -85,7 +127,11 @@ blt_bool BackDoorEntryHook(void) ****************************************************************************************/ blt_bool CpuUserProgramStartHook(void) { - /* okay to start the user program */ + /* do not start the user program is the pushbutton is pressed */ + if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET) + { + return BLT_FALSE; + } return BLT_TRUE; } /*** end of CpuUserProgramStartHook ***/ #endif /* BOOT_CPU_USER_PROGRAM_START_HOOK > 0 */ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/ide/DemoBoot.project b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/ide/DemoBoot.project index e9c5ec65..dd8c9802 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/ide/DemoBoot.project +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/ide/DemoBoot.project @@ -9,6 +9,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -119,6 +150,14 @@ + + + + + + + + @@ -333,6 +372,8 @@ continue + + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_core.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_core.h new file mode 100644 index 00000000..e0884cac --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_core.h @@ -0,0 +1,120 @@ +/** + ****************************************************************************** + * @file usbd_core.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief Header file for usbd_core.c + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_CORE_H +#define __USBD_CORE_H + +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd.h" +#include "usbd_def.h" +#include "usbd_conf.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_CORE + * @brief This file is the Header file for usbd_core.c file + * @{ + */ + + +/** @defgroup USBD_CORE_Exported_Defines + * @{ + */ + +typedef enum { + USBD_OK = 0, + USBD_BUSY, + USBD_FAIL, +}USBD_Status; +/** + * @} + */ + + +/** @defgroup USBD_CORE_Exported_TypesDefinitions + * @{ + */ + + +/** + * @} + */ + + + +/** @defgroup USBD_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_FunctionsPrototype + * @{ + */ +void USBD_Init(USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID, + USBD_DEVICE *pDevice, + USBD_Class_cb_TypeDef *class_cb, + USBD_Usr_cb_TypeDef *usr_cb); + +USBD_Status USBD_DeInit(USB_OTG_CORE_HANDLE *pdev); + +USBD_Status USBD_ClrCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx); + +USBD_Status USBD_SetCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx); + +/** + * @} + */ + +#endif /* __USBD_CORE_H */ + +/** + * @} + */ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + + + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_def.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_def.h new file mode 100644 index 00000000..7c0cff76 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_def.h @@ -0,0 +1,156 @@ +/** + ****************************************************************************** + * @file usbd_def.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief general defines for the usb device library + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USBD_DEF_H +#define __USBD_DEF_H + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_conf.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USB_DEF + * @brief general defines for the usb device library file + * @{ + */ + +/** @defgroup USB_DEF_Exported_Defines + * @{ + */ + +#ifndef NULL +#define NULL 0 +#endif + +#define USB_LEN_DEV_QUALIFIER_DESC 0x0A +#define USB_LEN_DEV_DESC 0x12 +#define USB_LEN_CFG_DESC 0x09 +#define USB_LEN_IF_DESC 0x09 +#define USB_LEN_EP_DESC 0x07 +#define USB_LEN_OTG_DESC 0x03 + +#define USBD_IDX_LANGID_STR 0x00 +#define USBD_IDX_MFC_STR 0x01 +#define USBD_IDX_PRODUCT_STR 0x02 +#define USBD_IDX_SERIAL_STR 0x03 +#define USBD_IDX_CONFIG_STR 0x04 +#define USBD_IDX_INTERFACE_STR 0x05 + +#define USB_REQ_TYPE_STANDARD 0x00 +#define USB_REQ_TYPE_CLASS 0x20 +#define USB_REQ_TYPE_VENDOR 0x40 +#define USB_REQ_TYPE_MASK 0x60 + +#define USB_REQ_RECIPIENT_DEVICE 0x00 +#define USB_REQ_RECIPIENT_INTERFACE 0x01 +#define USB_REQ_RECIPIENT_ENDPOINT 0x02 +#define USB_REQ_RECIPIENT_MASK 0x03 + +#define USB_REQ_GET_STATUS 0x00 +#define USB_REQ_CLEAR_FEATURE 0x01 +#define USB_REQ_SET_FEATURE 0x03 +#define USB_REQ_SET_ADDRESS 0x05 +#define USB_REQ_GET_DESCRIPTOR 0x06 +#define USB_REQ_SET_DESCRIPTOR 0x07 +#define USB_REQ_GET_CONFIGURATION 0x08 +#define USB_REQ_SET_CONFIGURATION 0x09 +#define USB_REQ_GET_INTERFACE 0x0A +#define USB_REQ_SET_INTERFACE 0x0B +#define USB_REQ_SYNCH_FRAME 0x0C + +#define USB_DESC_TYPE_DEVICE 1 +#define USB_DESC_TYPE_CONFIGURATION 2 +#define USB_DESC_TYPE_STRING 3 +#define USB_DESC_TYPE_INTERFACE 4 +#define USB_DESC_TYPE_ENDPOINT 5 +#define USB_DESC_TYPE_DEVICE_QUALIFIER 6 +#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 7 + + +#define USB_CONFIG_REMOTE_WAKEUP 2 +#define USB_CONFIG_SELF_POWERED 1 + +#define USB_FEATURE_EP_HALT 0 +#define USB_FEATURE_REMOTE_WAKEUP 1 +#define USB_FEATURE_TEST_MODE 2 + +/** + * @} + */ + + +/** @defgroup USBD_DEF_Exported_TypesDefinitions + * @{ + */ +/** + * @} + */ + + + +/** @defgroup USBD_DEF_Exported_Macros + * @{ + */ +#define SWAPBYTE(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ + (((uint16_t)(*(((uint8_t *)(addr)) + 1))) << 8)) + +#define LOBYTE(x) ((uint8_t)(x & 0x00FF)) +#define HIBYTE(x) ((uint8_t)((x & 0xFF00) >>8)) +/** + * @} + */ + +/** @defgroup USBD_DEF_Exported_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_DEF_Exported_FunctionsPrototype + * @{ + */ + +/** + * @} + */ + +#endif /* __USBD_DEF_H */ + +/** + * @} + */ + +/** +* @} +*/ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_ioreq.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_ioreq.h new file mode 100644 index 00000000..3f6aea1a --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_ioreq.h @@ -0,0 +1,121 @@ +/** + ****************************************************************************** + * @file usbd_ioreq.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief header file for the usbd_ioreq.c file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USBD_IOREQ_H_ +#define __USBD_IOREQ_H_ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" +#include "usbd_core.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_IOREQ + * @brief header file for the usbd_ioreq.c file + * @{ + */ + +/** @defgroup USBD_IOREQ_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Exported_Types + * @{ + */ + + +/** + * @} + */ + + + +/** @defgroup USBD_IOREQ_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_IOREQ_Exported_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_IOREQ_Exported_FunctionsPrototype + * @{ + */ + +USBD_Status USBD_CtlSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *buf, + uint16_t len); + +USBD_Status USBD_CtlContinueSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len); + +USBD_Status USBD_CtlPrepareRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len); + +USBD_Status USBD_CtlContinueRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len); + +USBD_Status USBD_CtlSendStatus (USB_OTG_CORE_HANDLE *pdev); + +USBD_Status USBD_CtlReceiveStatus (USB_OTG_CORE_HANDLE *pdev); + +uint16_t USBD_GetRxCount (USB_OTG_CORE_HANDLE *pdev , + uint8_t epnum); + +/** + * @} + */ + +#endif /* __USBD_IOREQ_H_ */ + +/** + * @} + */ + +/** +* @} +*/ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_req.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_req.h new file mode 100644 index 00000000..f88416df --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_req.h @@ -0,0 +1,108 @@ +/** + ****************************************************************************** + * @file usbd_req.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief header file for the usbd_req.c file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USB_REQUEST_H_ +#define __USB_REQUEST_H_ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" +#include "usbd_core.h" +#include "usbd_conf.h" + + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_REQ + * @brief header file for the usbd_ioreq.c file + * @{ + */ + +/** @defgroup USBD_REQ_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_REQ_Exported_Types + * @{ + */ +/** + * @} + */ + + + +/** @defgroup USBD_REQ_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_REQ_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_REQ_Exported_FunctionsPrototype + * @{ + */ + +USBD_Status USBD_StdDevReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req); +USBD_Status USBD_StdItfReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req); +USBD_Status USBD_StdEPReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req); +void USBD_ParseSetupRequest( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +void USBD_CtlError( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len); +/** + * @} + */ + +#endif /* __USB_REQUEST_H_ */ + +/** + * @} + */ + +/** +* @} +*/ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_usr.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_usr.h new file mode 100644 index 00000000..bd5ff3e2 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_usr.h @@ -0,0 +1,141 @@ +/** + ****************************************************************************** + * @file usbd_usr.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief Header file for usbd_usr.c + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_USR_H__ +#define __USBD_USR_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_core.h" + + +/** @addtogroup USBD_USER + * @{ + */ + +/** @addtogroup USBD_MSC_DEMO_USER_CALLBACKS + * @{ + */ + +/** @defgroup USBD_USR + * @brief This file is the Header file for usbd_usr.c + * @{ + */ + + +/** @defgroup USBD_USR_Exported_Types + * @{ + */ + +extern USBD_Usr_cb_TypeDef USR_cb; +extern USBD_Usr_cb_TypeDef USR_FS_cb; +extern USBD_Usr_cb_TypeDef USR_HS_cb; + + + +/** + * @} + */ + + + +/** @defgroup USBD_USR_Exported_Defines + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_USR_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_USR_Exported_Variables + * @{ + */ + +void USBD_USR_Init(void); +void USBD_USR_DeviceReset (uint8_t speed); +void USBD_USR_DeviceConfigured (void); +void USBD_USR_DeviceSuspended(void); +void USBD_USR_DeviceResumed(void); + +void USBD_USR_DeviceConnected(void); +void USBD_USR_DeviceDisconnected(void); + +void USBD_USR_FS_Init(void); +void USBD_USR_FS_DeviceReset (uint8_t speed); +void USBD_USR_FS_DeviceConfigured (void); +void USBD_USR_FS_DeviceSuspended(void); +void USBD_USR_FS_DeviceResumed(void); + +void USBD_USR_FS_DeviceConnected(void); +void USBD_USR_FS_DeviceDisconnected(void); + +void USBD_USR_HS_Init(void); +void USBD_USR_HS_DeviceReset (uint8_t speed); +void USBD_USR_HS_DeviceConfigured (void); +void USBD_USR_HS_DeviceSuspended(void); +void USBD_USR_HS_DeviceResumed(void); + +void USBD_USR_HS_DeviceConnected(void); +void USBD_USR_HS_DeviceDisconnected(void); + +/** + * @} + */ + +/** @defgroup USBD_USR_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + +#endif /*__USBD_USR_H__*/ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + + + + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/src/usbd_core.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/src/usbd_core.c new file mode 100644 index 00000000..fa647eb0 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/src/usbd_core.c @@ -0,0 +1,506 @@ +/** + ****************************************************************************** + * @file usbd_core.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file provides all the USBD core functions. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_core.h" +#include "usbd_req.h" +#include "usbd_ioreq.h" +#include "usb_dcd_int.h" +#include "usb_bsp.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY +* @{ +*/ + + +/** @defgroup USBD_CORE +* @brief usbd core module +* @{ +*/ + +/** @defgroup USBD_CORE_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USBD_CORE_Private_Defines +* @{ +*/ + +/** +* @} +*/ + + +/** @defgroup USBD_CORE_Private_Macros +* @{ +*/ +/** +* @} +*/ + + + + +/** @defgroup USBD_CORE_Private_FunctionPrototypes +* @{ +*/ +static uint8_t USBD_SetupStage(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); +static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); +static uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev); +#ifdef VBUS_SENSING_ENABLED +static uint8_t USBD_DevConnected(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_DevDisconnected(USB_OTG_CORE_HANDLE *pdev); +#endif +static uint8_t USBD_IsoINIncomplete(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_IsoOUTIncomplete(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_RunTestMode (USB_OTG_CORE_HANDLE *pdev) ; +/** +* @} +*/ + +/** @defgroup USBD_CORE_Private_Variables +* @{ +*/ + +__IO USB_OTG_DCTL_TypeDef SET_TEST_MODE; + +USBD_DCD_INT_cb_TypeDef USBD_DCD_INT_cb = +{ + USBD_DataOutStage, + USBD_DataInStage, + USBD_SetupStage, + USBD_SOF, + USBD_Reset, + USBD_Suspend, + USBD_Resume, + USBD_IsoINIncomplete, + USBD_IsoOUTIncomplete, +#ifdef VBUS_SENSING_ENABLED +USBD_DevConnected, +USBD_DevDisconnected, +#endif +}; + +USBD_DCD_INT_cb_TypeDef *USBD_DCD_INT_fops = &USBD_DCD_INT_cb; +/** +* @} +*/ + +/** @defgroup USBD_CORE_Private_Functions +* @{ +*/ + +/** +* @brief USBD_Init +* Initailizes the device stack and load the class driver +* @param pdev: device instance +* @param core_address: USB OTG core ID +* @param class_cb: Class callback structure address +* @param usr_cb: User callback structure address +* @retval None +*/ +void USBD_Init(USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID, + USBD_DEVICE *pDevice, + USBD_Class_cb_TypeDef *class_cb, + USBD_Usr_cb_TypeDef *usr_cb) +{ + /* Hardware Init */ + USB_OTG_BSP_Init(pdev); + + USBD_DeInit(pdev); + + /*Register class and user callbacks */ + pdev->dev.class_cb = class_cb; + pdev->dev.usr_cb = usr_cb; + pdev->dev.usr_device = pDevice; + + /* set USB OTG core params */ + DCD_Init(pdev , coreID); + + /* Upon Init call usr callback */ + pdev->dev.usr_cb->Init(); + + /* Enable Interrupts */ + USB_OTG_BSP_EnableInterrupt(pdev); +} + +/** +* @brief USBD_DeInit +* Re-Initialize th device library +* @param pdev: device instance +* @retval status: status +*/ +USBD_Status USBD_DeInit(USB_OTG_CORE_HANDLE *pdev) +{ + /* Software Init */ + + return USBD_OK; +} + +/** +* @brief USBD_SetupStage +* Handle the setup stage +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_SetupStage(USB_OTG_CORE_HANDLE *pdev) +{ + USB_SETUP_REQ req; + + USBD_ParseSetupRequest(pdev , &req); + + switch (req.bmRequest & 0x1F) + { + case USB_REQ_RECIPIENT_DEVICE: + USBD_StdDevReq (pdev, &req); + break; + + case USB_REQ_RECIPIENT_INTERFACE: + USBD_StdItfReq(pdev, &req); + break; + + case USB_REQ_RECIPIENT_ENDPOINT: + USBD_StdEPReq(pdev, &req); + break; + + default: + DCD_EP_Stall(pdev , req.bmRequest & 0x80); + break; + } + return USBD_OK; +} + +/** +* @brief USBD_DataOutStage +* Handle data out stage +* @param pdev: device instance +* @param epnum: endpoint index +* @retval status +*/ +static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + USB_OTG_EP *ep; + + if(epnum == 0) + { + ep = &pdev->dev.out_ep[0]; + if ( pdev->dev.device_state == USB_OTG_EP0_DATA_OUT) + { + if(ep->rem_data_len > ep->maxpacket) + { + ep->rem_data_len -= ep->maxpacket; + + if(pdev->cfg.dma_enable == 1) + { + /* in slave mode this, is handled by the RxSTSQLvl ISR */ + ep->xfer_buff += ep->maxpacket; + } + USBD_CtlContinueRx (pdev, + ep->xfer_buff, + MIN(ep->rem_data_len ,ep->maxpacket)); + } + else + { + if((pdev->dev.class_cb->EP0_RxReady != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->EP0_RxReady(pdev); + } + USBD_CtlSendStatus(pdev); + } + } + } + else if((pdev->dev.class_cb->DataOut != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->DataOut(pdev, epnum); + } + return USBD_OK; +} + +/** +* @brief USBD_DataInStage +* Handle data in stage +* @param pdev: device instance +* @param epnum: endpoint index +* @retval status +*/ +static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + USB_OTG_EP *ep; + + if(epnum == 0) + { + ep = &pdev->dev.in_ep[0]; + if ( pdev->dev.device_state == USB_OTG_EP0_DATA_IN) + { + if(ep->rem_data_len > ep->maxpacket) + { + ep->rem_data_len -= ep->maxpacket; + if(pdev->cfg.dma_enable == 1) + { + /* in slave mode this, is handled by the TxFifoEmpty ISR */ + ep->xfer_buff += ep->maxpacket; + } + USBD_CtlContinueSendData (pdev, + ep->xfer_buff, + ep->rem_data_len); + } + else + { /* last packet is MPS multiple, so send ZLP packet */ + if((ep->total_data_len % ep->maxpacket == 0) && + (ep->total_data_len >= ep->maxpacket) && + (ep->total_data_len < ep->ctl_data_len )) + { + + USBD_CtlContinueSendData(pdev , NULL, 0); + ep->ctl_data_len = 0; + } + else + { + if((pdev->dev.class_cb->EP0_TxSent != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->EP0_TxSent(pdev); + } + USBD_CtlReceiveStatus(pdev); + } + } + } + if (pdev->dev.test_mode == 1) + { + USBD_RunTestMode(pdev); + pdev->dev.test_mode = 0; + } + } + else if((pdev->dev.class_cb->DataIn != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->DataIn(pdev, epnum); + } + return USBD_OK; +} + + + + +/** +* @brief USBD_RunTestMode +* Launch test mode process +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_RunTestMode (USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, SET_TEST_MODE.d32); + return USBD_OK; +} + +/** +* @brief USBD_Reset +* Handle Reset event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev) +{ + /* Open EP0 OUT */ + DCD_EP_Open(pdev, + 0x00, + USB_OTG_MAX_EP0_SIZE, + EP_TYPE_CTRL); + + /* Open EP0 IN */ + DCD_EP_Open(pdev, + 0x80, + USB_OTG_MAX_EP0_SIZE, + EP_TYPE_CTRL); + + /* Upon Reset call usr call back */ + pdev->dev.device_status = USB_OTG_DEFAULT; + pdev->dev.usr_cb->DeviceReset(pdev->cfg.speed); + + return USBD_OK; +} + +/** +* @brief USBD_Resume +* Handle Resume event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev) +{ + /* Upon Resume call usr call back */ + pdev->dev.usr_cb->DeviceResumed(); + pdev->dev.device_status = pdev->dev.device_old_status; + pdev->dev.device_status = USB_OTG_CONFIGURED; + return USBD_OK; +} + + +/** +* @brief USBD_Suspend +* Handle Suspend event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.device_old_status = pdev->dev.device_status; + pdev->dev.device_status = USB_OTG_SUSPENDED; + /* Upon Resume call usr call back */ + pdev->dev.usr_cb->DeviceSuspended(); + return USBD_OK; +} + + +/** +* @brief USBD_SOF +* Handle SOF event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev) +{ + if(pdev->dev.class_cb->SOF) + { + pdev->dev.class_cb->SOF(pdev); + } + return USBD_OK; +} +/** +* @brief USBD_SetCfg +* Configure device and start the interface +* @param pdev: device instance +* @param cfgidx: configuration index +* @retval status +*/ + +USBD_Status USBD_SetCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx) +{ + pdev->dev.class_cb->Init(pdev, cfgidx); + + /* Upon set config call usr call back */ + pdev->dev.usr_cb->DeviceConfigured(); + return USBD_OK; +} + +/** +* @brief USBD_ClrCfg +* Clear current configuration +* @param pdev: device instance +* @param cfgidx: configuration index +* @retval status: USBD_Status +*/ +USBD_Status USBD_ClrCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx) +{ + pdev->dev.class_cb->DeInit(pdev, cfgidx); + return USBD_OK; +} + +/** +* @brief USBD_IsoINIncomplete +* Handle iso in incomplete event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_IsoINIncomplete(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.class_cb->IsoINIncomplete(pdev); + return USBD_OK; +} + +/** +* @brief USBD_IsoOUTIncomplete +* Handle iso out incomplete event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_IsoOUTIncomplete(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.class_cb->IsoOUTIncomplete(pdev); + return USBD_OK; +} + +#ifdef VBUS_SENSING_ENABLED +/** +* @brief USBD_DevConnected +* Handle device connection event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_DevConnected(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.usr_cb->DeviceConnected(); + pdev->dev.connection_status = 1; + return USBD_OK; +} + +/** +* @brief USBD_DevDisconnected +* Handle device disconnection event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_DevDisconnected(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.usr_cb->DeviceDisconnected(); + pdev->dev.class_cb->DeInit(pdev, 0); + pdev->dev.connection_status = 0; + return USBD_OK; +} +#endif +/** +* @} +*/ + + +/** +* @} +*/ + + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/src/usbd_ioreq.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/src/usbd_ioreq.c new file mode 100644 index 00000000..a9e4a863 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/src/usbd_ioreq.c @@ -0,0 +1,244 @@ +/** + ****************************************************************************** + * @file usbd_ioreq.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file provides the IO requests APIs for control endpoints. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_ioreq.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_IOREQ + * @brief control I/O requests module + * @{ + */ + +/** @defgroup USBD_IOREQ_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Variables + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_FunctionPrototypes + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Functions + * @{ + */ + +/** +* @brief USBD_CtlSendData +* send data on the ctl pipe +* @param pdev: device instance +* @param buff: pointer to data buffer +* @param len: length of data to be sent +* @retval status +*/ +USBD_Status USBD_CtlSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + pdev->dev.in_ep[0].total_data_len = len; + pdev->dev.in_ep[0].rem_data_len = len; + pdev->dev.device_state = USB_OTG_EP0_DATA_IN; + + DCD_EP_Tx (pdev, 0, pbuf, len); + + return ret; +} + +/** +* @brief USBD_CtlContinueSendData +* continue sending data on the ctl pipe +* @param pdev: device instance +* @param buff: pointer to data buffer +* @param len: length of data to be sent +* @retval status +*/ +USBD_Status USBD_CtlContinueSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + DCD_EP_Tx (pdev, 0, pbuf, len); + + + return ret; +} + +/** +* @brief USBD_CtlPrepareRx +* receive data on the ctl pipe +* @param pdev: USB OTG device instance +* @param buff: pointer to data buffer +* @param len: length of data to be received +* @retval status +*/ +USBD_Status USBD_CtlPrepareRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + pdev->dev.out_ep[0].total_data_len = len; + pdev->dev.out_ep[0].rem_data_len = len; + pdev->dev.device_state = USB_OTG_EP0_DATA_OUT; + + DCD_EP_PrepareRx (pdev, + 0, + pbuf, + len); + + + return ret; +} + +/** +* @brief USBD_CtlContinueRx +* continue receive data on the ctl pipe +* @param pdev: USB OTG device instance +* @param buff: pointer to data buffer +* @param len: length of data to be received +* @retval status +*/ +USBD_Status USBD_CtlContinueRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + DCD_EP_PrepareRx (pdev, + 0, + pbuf, + len); + return ret; +} +/** +* @brief USBD_CtlSendStatus +* send zero lzngth packet on the ctl pipe +* @param pdev: USB OTG device instance +* @retval status +*/ +USBD_Status USBD_CtlSendStatus (USB_OTG_CORE_HANDLE *pdev) +{ + USBD_Status ret = USBD_OK; + pdev->dev.device_state = USB_OTG_EP0_STATUS_IN; + DCD_EP_Tx (pdev, + 0, + NULL, + 0); + + USB_OTG_EP0_OutStart(pdev); + + return ret; +} + +/** +* @brief USBD_CtlReceiveStatus +* receive zero lzngth packet on the ctl pipe +* @param pdev: USB OTG device instance +* @retval status +*/ +USBD_Status USBD_CtlReceiveStatus (USB_OTG_CORE_HANDLE *pdev) +{ + USBD_Status ret = USBD_OK; + pdev->dev.device_state = USB_OTG_EP0_STATUS_OUT; + DCD_EP_PrepareRx ( pdev, + 0, + NULL, + 0); + + USB_OTG_EP0_OutStart(pdev); + + return ret; +} + + +/** +* @brief USBD_GetRxCount +* returns the received data length +* @param pdev: USB OTG device instance +* epnum: endpoint index +* @retval Rx Data blength +*/ +uint16_t USBD_GetRxCount (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + return pdev->dev.out_ep[epnum].xfer_count; +} + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/src/usbd_req.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/src/usbd_req.c new file mode 100644 index 00000000..f954bd9a --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/src/usbd_req.c @@ -0,0 +1,868 @@ +/** + ****************************************************************************** + * @file usbd_req.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file provides the standard USB requests following chapter 9. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_req.h" +#include "usbd_ioreq.h" +#include "usbd_desc.h" + + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_REQ + * @brief USB standard requests module + * @{ + */ + +/** @defgroup USBD_REQ_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Variables + * @{ + */ +extern __IO USB_OTG_DCTL_TypeDef SET_TEST_MODE; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint32_t USBD_ep_status __ALIGN_END = 0; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint32_t USBD_default_cfg __ALIGN_END = 0; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint32_t USBD_cfg_status __ALIGN_END = 0; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ] __ALIGN_END ; +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_FunctionPrototypes + * @{ + */ +static void USBD_GetDescriptor(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_SetAddress(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_SetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_GetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_GetStatus(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_SetFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_ClrFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static uint8_t USBD_GetLen(uint8_t *buf); +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Functions + * @{ + */ + + +/** +* @brief USBD_StdDevReq +* Handle standard usb device requests +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +USBD_Status USBD_StdDevReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req) +{ + USBD_Status ret = USBD_OK; + + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + + USBD_GetDescriptor (pdev, req) ; + break; + + case USB_REQ_SET_ADDRESS: + USBD_SetAddress(pdev, req); + break; + + case USB_REQ_SET_CONFIGURATION: + USBD_SetConfig (pdev , req); + break; + + case USB_REQ_GET_CONFIGURATION: + USBD_GetConfig (pdev , req); + break; + + case USB_REQ_GET_STATUS: + USBD_GetStatus (pdev , req); + break; + + + case USB_REQ_SET_FEATURE: + USBD_SetFeature (pdev , req); + break; + + case USB_REQ_CLEAR_FEATURE: + USBD_ClrFeature (pdev , req); + break; + + default: + USBD_CtlError(pdev , req); + break; + } + + return ret; +} + +/** +* @brief USBD_StdItfReq +* Handle standard usb interface requests +* @param pdev: USB OTG device instance +* @param req: usb request +* @retval status +*/ +USBD_Status USBD_StdItfReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req) +{ + USBD_Status ret = USBD_OK; + + switch (pdev->dev.device_status) + { + case USB_OTG_CONFIGURED: + + if (LOBYTE(req->wIndex) <= USBD_ITF_MAX_NUM) + { + pdev->dev.class_cb->Setup (pdev, req); + + if((req->wLength == 0)&& (ret == USBD_OK)) + { + USBD_CtlSendStatus(pdev); + } + } + else + { + USBD_CtlError(pdev , req); + } + break; + + default: + USBD_CtlError(pdev , req); + break; + } + return ret; +} + +/** +* @brief USBD_StdEPReq +* Handle standard usb endpoint requests +* @param pdev: USB OTG device instance +* @param req: usb request +* @retval status +*/ +USBD_Status USBD_StdEPReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req) +{ + + uint8_t ep_addr; + USBD_Status ret = USBD_OK; + + ep_addr = LOBYTE(req->wIndex); + + switch (req->bRequest) + { + + case USB_REQ_SET_FEATURE : + + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + } + break; + + case USB_OTG_CONFIGURED: + if (req->wValue == USB_FEATURE_EP_HALT) + { + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + + } + } + pdev->dev.class_cb->Setup (pdev, req); + USBD_CtlSendStatus(pdev); + + break; + + default: + USBD_CtlError(pdev , req); + break; + } + break; + + case USB_REQ_CLEAR_FEATURE : + + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + } + break; + + case USB_OTG_CONFIGURED: + if (req->wValue == USB_FEATURE_EP_HALT) + { + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_ClrStall(pdev , ep_addr); + pdev->dev.class_cb->Setup (pdev, req); + } + USBD_CtlSendStatus(pdev); + } + break; + + default: + USBD_CtlError(pdev , req); + break; + } + break; + + case USB_REQ_GET_STATUS: + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + } + break; + + case USB_OTG_CONFIGURED: + + + if ((ep_addr & 0x80)== 0x80) + { + if(pdev->dev.in_ep[ep_addr & 0x7F].is_stall) + { + USBD_ep_status = 0x0001; + } + else + { + USBD_ep_status = 0x0000; + } + } + else if ((ep_addr & 0x80)== 0x00) + { + if(pdev->dev.out_ep[ep_addr].is_stall) + { + USBD_ep_status = 0x0001; + } + + else + { + USBD_ep_status = 0x0000; + } + } + USBD_CtlSendData (pdev, + (uint8_t *)&USBD_ep_status, + 2); + break; + + default: + USBD_CtlError(pdev , req); + break; + } + break; + + default: + break; + } + return ret; +} +/** +* @brief USBD_GetDescriptor +* Handle Get Descriptor requests +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_GetDescriptor(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + uint16_t len; + uint8_t *pbuf; + + + switch (req->wValue >> 8) + { + case USB_DESC_TYPE_DEVICE: + pbuf = pdev->dev.usr_device->GetDeviceDescriptor(pdev->cfg.speed, &len); + if ((req->wLength == 64) ||( pdev->dev.device_status == USB_OTG_DEFAULT)) + { + len = 8; + } + break; + + case USB_DESC_TYPE_CONFIGURATION: + pbuf = (uint8_t *)pdev->dev.class_cb->GetConfigDescriptor(pdev->cfg.speed, &len); +#ifdef USB_OTG_HS_CORE + if((pdev->cfg.speed == USB_OTG_SPEED_FULL )&& + (pdev->cfg.phy_itface == USB_OTG_ULPI_PHY)) + { + pbuf = (uint8_t *)pdev->dev.class_cb->GetOtherConfigDescriptor(pdev->cfg.speed, &len); + } +#endif + pbuf[1] = USB_DESC_TYPE_CONFIGURATION; + pdev->dev.pConfig_descriptor = pbuf; + break; + + case USB_DESC_TYPE_STRING: + switch ((uint8_t)(req->wValue)) + { + case USBD_IDX_LANGID_STR: + pbuf = pdev->dev.usr_device->GetLangIDStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_MFC_STR: + pbuf = pdev->dev.usr_device->GetManufacturerStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_PRODUCT_STR: + pbuf = pdev->dev.usr_device->GetProductStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_SERIAL_STR: + pbuf = pdev->dev.usr_device->GetSerialStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_CONFIG_STR: + pbuf = pdev->dev.usr_device->GetConfigurationStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_INTERFACE_STR: + pbuf = pdev->dev.usr_device->GetInterfaceStrDescriptor(pdev->cfg.speed, &len); + break; + + default: +#ifdef USB_SUPPORT_USER_STRING_DESC + pbuf = pdev->dev.class_cb->GetUsrStrDescriptor(pdev->cfg.speed, (req->wValue) , &len); + break; +#else + USBD_CtlError(pdev , req); + return; +#endif /* USBD_CtlError(pdev , req); */ + } + break; + case USB_DESC_TYPE_DEVICE_QUALIFIER: +#ifdef USB_OTG_HS_CORE + if(pdev->cfg.speed == USB_OTG_SPEED_HIGH ) + { + + pbuf = (uint8_t *)pdev->dev.class_cb->GetConfigDescriptor(pdev->cfg.speed, &len); + + USBD_DeviceQualifierDesc[4]= pbuf[14]; + USBD_DeviceQualifierDesc[5]= pbuf[15]; + USBD_DeviceQualifierDesc[6]= pbuf[16]; + + pbuf = USBD_DeviceQualifierDesc; + len = USB_LEN_DEV_QUALIFIER_DESC; + break; + } + else + { + USBD_CtlError(pdev , req); + return; + } +#else + USBD_CtlError(pdev , req); + return; +#endif + + case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: +#ifdef USB_OTG_HS_CORE + + if(pdev->cfg.speed == USB_OTG_SPEED_HIGH ) + { + pbuf = (uint8_t *)pdev->dev.class_cb->GetOtherConfigDescriptor(pdev->cfg.speed, &len); + pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION; + break; + } + else + { + USBD_CtlError(pdev , req); + return; + } +#else + USBD_CtlError(pdev , req); + return; +#endif + + + default: + USBD_CtlError(pdev , req); + return; + } + + if((len != 0)&& (req->wLength != 0)) + { + + len = MIN(len , req->wLength); + + USBD_CtlSendData (pdev, + pbuf, + len); + } + +} + +/** +* @brief USBD_SetAddress +* Set device address +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_SetAddress(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + uint8_t dev_addr; + + if ((req->wIndex == 0) && (req->wLength == 0)) + { + dev_addr = (uint8_t)(req->wValue) & 0x7F; + + if (pdev->dev.device_status == USB_OTG_CONFIGURED) + { + USBD_CtlError(pdev , req); + } + else + { + pdev->dev.device_address = dev_addr; + DCD_EP_SetAddress(pdev, dev_addr); + USBD_CtlSendStatus(pdev); + + if (dev_addr != 0) + { + pdev->dev.device_status = USB_OTG_ADDRESSED; + } + else + { + pdev->dev.device_status = USB_OTG_DEFAULT; + } + } + } + else + { + USBD_CtlError(pdev , req); + } +} + +/** +* @brief USBD_SetConfig +* Handle Set device configuration request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_SetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + static uint8_t cfgidx; + + cfgidx = (uint8_t)(req->wValue); + + if (cfgidx > USBD_CFG_MAX_NUM ) + { + USBD_CtlError(pdev , req); + } + else + { + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if (cfgidx) + { + pdev->dev.device_config = cfgidx; + pdev->dev.device_status = USB_OTG_CONFIGURED; + USBD_SetCfg(pdev , cfgidx); + USBD_CtlSendStatus(pdev); + } + else + { + USBD_CtlSendStatus(pdev); + } + break; + + case USB_OTG_CONFIGURED: + if (cfgidx == 0) + { + pdev->dev.device_status = USB_OTG_ADDRESSED; + pdev->dev.device_config = cfgidx; + USBD_ClrCfg(pdev , cfgidx); + USBD_CtlSendStatus(pdev); + + } + else if (cfgidx != pdev->dev.device_config) + { + /* Clear old configuration */ + USBD_ClrCfg(pdev , pdev->dev.device_config); + + /* set new configuration */ + pdev->dev.device_config = cfgidx; + USBD_SetCfg(pdev , cfgidx); + USBD_CtlSendStatus(pdev); + } + else + { + USBD_CtlSendStatus(pdev); + } + break; + + default: + USBD_CtlError(pdev , req); + break; + } + } +} + +/** +* @brief USBD_GetConfig +* Handle Get device configuration request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_GetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + if (req->wLength != 1) + { + USBD_CtlError(pdev , req); + } + else + { + switch (pdev->dev.device_status ) + { + case USB_OTG_ADDRESSED: + + USBD_CtlSendData (pdev, + (uint8_t *)&USBD_default_cfg, + 1); + break; + + case USB_OTG_CONFIGURED: + + USBD_CtlSendData (pdev, + &pdev->dev.device_config, + 1); + break; + + default: + USBD_CtlError(pdev , req); + break; + } + } +} + +/** +* @brief USBD_GetStatus +* Handle Get Status request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_GetStatus(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + case USB_OTG_CONFIGURED: + +#ifdef USBD_SELF_POWERED + USBD_cfg_status = USB_CONFIG_SELF_POWERED; +#else + USBD_cfg_status = 0x00; +#endif + + if (pdev->dev.DevRemoteWakeup) + { + USBD_cfg_status |= USB_CONFIG_REMOTE_WAKEUP; + } + + USBD_CtlSendData (pdev, + (uint8_t *)&USBD_cfg_status, + 2); + break; + + default : + USBD_CtlError(pdev , req); + break; + } +} + + +/** +* @brief USBD_SetFeature +* Handle Set device feature request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_SetFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + USB_OTG_DCTL_TypeDef dctl; + uint8_t test_mode = 0; + + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) + { + pdev->dev.DevRemoteWakeup = 1; + pdev->dev.class_cb->Setup (pdev, req); + USBD_CtlSendStatus(pdev); + } + + else if ((req->wValue == USB_FEATURE_TEST_MODE) && + ((req->wIndex & 0xFF) == 0)) + { + dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL); + + test_mode = req->wIndex >> 8; + switch (test_mode) + { + case 1: // TEST_J + dctl.b.tstctl = 1; + break; + + case 2: // TEST_K + dctl.b.tstctl = 2; + break; + + case 3: // TEST_SE0_NAK + dctl.b.tstctl = 3; + break; + + case 4: // TEST_PACKET + dctl.b.tstctl = 4; + break; + + case 5: // TEST_FORCE_ENABLE + dctl.b.tstctl = 5; + break; + } + SET_TEST_MODE = dctl; + pdev->dev.test_mode = 1; + USBD_CtlSendStatus(pdev); + } + +} + + +/** +* @brief USBD_ClrFeature +* Handle clear device feature request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_ClrFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + case USB_OTG_CONFIGURED: + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) + { + pdev->dev.DevRemoteWakeup = 0; + pdev->dev.class_cb->Setup (pdev, req); + USBD_CtlSendStatus(pdev); + } + break; + + default : + USBD_CtlError(pdev , req); + break; + } +} + +/** +* @brief USBD_ParseSetupRequest +* Copy buffer into setup structure +* @param pdev: device instance +* @param req: usb request +* @retval None +*/ + +void USBD_ParseSetupRequest( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet); + req->bRequest = *(uint8_t *) (pdev->dev.setup_packet + 1); + req->wValue = SWAPBYTE (pdev->dev.setup_packet + 2); + req->wIndex = SWAPBYTE (pdev->dev.setup_packet + 4); + req->wLength = SWAPBYTE (pdev->dev.setup_packet + 6); + + pdev->dev.in_ep[0].ctl_data_len = req->wLength ; + pdev->dev.device_state = USB_OTG_EP0_SETUP; +} + +/** +* @brief USBD_CtlError +* Handle USB low level Error +* @param pdev: device instance +* @param req: usb request +* @retval None +*/ + +void USBD_CtlError( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + DCD_EP_Stall(pdev , 0x80); + DCD_EP_Stall(pdev , 0); + USB_OTG_EP0_OutStart(pdev); +} + + +/** + * @brief USBD_GetString + * Convert Ascii string into unicode one + * @param desc : descriptor buffer + * @param unicode : Formatted string buffer (unicode) + * @param len : descriptor length + * @retval None + */ +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) +{ + uint8_t idx = 0; + + if (desc != NULL) + { + *len = USBD_GetLen(desc) * 2 + 2; + unicode[idx++] = *len; + unicode[idx++] = USB_DESC_TYPE_STRING; + + while (*desc != NULL) + { + unicode[idx++] = *desc++; + unicode[idx++] = 0x00; + } + } +} + +/** + * @brief USBD_GetLen + * return the string length + * @param buf : pointer to the ascii string buffer + * @retval string length + */ +static uint8_t USBD_GetLen(uint8_t *buf) +{ + uint8_t len = 0; + + while (*buf != NULL) + { + len++; + buf++; + } + + return len; +} +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Release_Notes.html b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Release_Notes.html new file mode 100644 index 00000000..60f8ab87 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Release_Notes.html @@ -0,0 +1,950 @@ + + + + + + + + +Release Notes for STM32F105/7xx, STM32F2xx and STM32F4xx USB Device Library + + + + + +
+ +

 

+ +
+ + + + + +
+ + + + + + + +
+

Back to Release page

+
+

Release Notes for STM32F105/7xx, STM32F2xx and STM32F4xx USB Device Library

+

Copyright + 2012 STMicroelectronics

+

+
+

 

+ + + + +
+

Contents

+
    +
  1. Update History
  2. +
  3. License
  4. +
+

Update History

V1.1.0 / 19-March-2012

+

Main +Changes

+ +
  • Official support of STM32F4xx devices
  • All source files: license disclaimer text update and add link to the License file on ST Internet.
  • Handle test mode in the set feature request
  • Handle dynamically the USB SELF POWERED feature
  • Handle correctly the USBD_CtlError process to take into account error during Control OUT stage
  • Miscellaneous bug fix

V1.0.0 / 22-July-2011

Main +Changes

+
  • First official version for STM32F105/7xx and STM32F2xx devices

+

License

+

Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); You may not use this package except in compliance with the License. You may obtain a copy of the License at:


Unless +required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See +the License for the specific language governing permissions and +limitations under the License.
+
+
+
+

For + complete documentation on STM32 + Microcontrollers visit www.st.com/STM32

+
+

+
+ +
+ +

 

+ +
+ + \ No newline at end of file diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/Release_Notes.html b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/Release_Notes.html new file mode 100644 index 00000000..1116edd3 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/Release_Notes.html @@ -0,0 +1,950 @@ + + + + + + + + +Release Notes for STM32F105/7xx, STM32F2xx and STM32F4xx USB OTG Driver + + + + + +
+ +

 

+ +
+ + + + + +
+ + + + + + + +
+

Back to Release page

+
+

Release Notes for STM32F105/7xx, STM32F2xx and STM32F4xx USB OTG Driver

+

Copyright + 2012 STMicroelectronics

+

+
+

 

+ + + + +
+

Contents

+
    +
  1. Update History
  2. +
  3. License
  4. +
+

Update History

V2.1.0 / 19-March-2012

+

Main +Changes

+ +
  • Official support of STM32F4xx devices
  • All source files: license disclaimer text update and add link to the License file on ST Internet
  • Unmask Session request interrupt to handle the connect event during the core start-up
  • Remove any reference to the USB HS external I2C PHY
  • Update optimization pragma for AR Compiler
  • Handle Correctly the Low Speed device connection in HS mode
  • Add a wrapper to isolate the library from the low level driver: connection done through ISR structure
  • Miscellaneous bug fix

V2.0.0 / 22-July-2011

Main +Changes

+
  • Second official version supporting STM32F105/7 and STM32F2xx devices
  • Rename the Library from "STM32_USB_HOST_Driver" to "STM32_USB_OTG_Driver"
  • Add support for STM32F2xx devices
  • Add support for Device and OTG modes
  • Change HCD layer to support High speed core
  • Change the Low level driver to support multi core support for Host mode
  • Add Stop mechanism for Host and Device modes
  • Change VBUS enabling method, to use the external or the internal VBUS when using the ULPI

V1.0.0 - 11/29/2010

+
  • Created 

License

+

Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); You may not use this package except in compliance with the License. You may obtain a copy of the License at:


Unless +required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See +the License for the specific language governing permissions and +limitations under the License.
+
+
+
+

For + complete documentation on STM32 + Microcontrollers visit www.st.com/STM32

+
+

+
+ +
+ +

 

+ +
+ + \ No newline at end of file diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_bsp.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_bsp.h new file mode 100644 index 00000000..29763a90 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_bsp.h @@ -0,0 +1,103 @@ +/** + ****************************************************************************** + * @file usb_bsp.h + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Specific api's relative to the used hardware platform + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_BSP__H__ +#define __USB_BSP__H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_core.h" +#include "usb_conf.h" + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_BSP + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_BSP_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_BSP_Exported_Types + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_BSP_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_BSP_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_BSP_Exported_FunctionsPrototype + * @{ + */ +void BSP_Init(void); + +void USB_OTG_BSP_Init (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_BSP_uDelay (const uint32_t usec); +void USB_OTG_BSP_mDelay (const uint32_t msec); +void USB_OTG_BSP_EnableInterrupt (USB_OTG_CORE_HANDLE *pdev); +#ifdef USE_HOST_MODE +void USB_OTG_BSP_ConfigVBUS(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_BSP_DriveVBUS(USB_OTG_CORE_HANDLE *pdev,uint8_t state); +#endif +/** + * @} + */ + +#endif //__USB_BSP__H__ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_core.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_core.h new file mode 100644 index 00000000..c574665c --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_core.h @@ -0,0 +1,417 @@ +/** + ****************************************************************************** + * @file usb_core.h + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Header of the Core Layer + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_CORE_H__ +#define __USB_CORE_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" +#include "usb_regs.h" +#include "usb_defines.h" + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_CORE + * @brief usb otg driver core layer + * @{ + */ + + +/** @defgroup USB_CORE_Exported_Defines + * @{ + */ + +#define USB_OTG_EP0_IDLE 0 +#define USB_OTG_EP0_SETUP 1 +#define USB_OTG_EP0_DATA_IN 2 +#define USB_OTG_EP0_DATA_OUT 3 +#define USB_OTG_EP0_STATUS_IN 4 +#define USB_OTG_EP0_STATUS_OUT 5 +#define USB_OTG_EP0_STALL 6 + +#define USB_OTG_EP_TX_DIS 0x0000 +#define USB_OTG_EP_TX_STALL 0x0010 +#define USB_OTG_EP_TX_NAK 0x0020 +#define USB_OTG_EP_TX_VALID 0x0030 + +#define USB_OTG_EP_RX_DIS 0x0000 +#define USB_OTG_EP_RX_STALL 0x1000 +#define USB_OTG_EP_RX_NAK 0x2000 +#define USB_OTG_EP_RX_VALID 0x3000 +/** + * @} + */ +#define MAX_DATA_LENGTH 0x200 + +/** @defgroup USB_CORE_Exported_Types + * @{ + */ + + +typedef enum { + USB_OTG_OK = 0, + USB_OTG_FAIL +}USB_OTG_STS; + +typedef enum { + HC_IDLE = 0, + HC_XFRC, + HC_HALTED, + HC_NAK, + HC_NYET, + HC_STALL, + HC_XACTERR, + HC_BBLERR, + HC_DATATGLERR, +}HC_STATUS; + +typedef enum { + URB_IDLE = 0, + URB_DONE, + URB_NOTREADY, + URB_ERROR, + URB_STALL +}URB_STATE; + +typedef enum { + CTRL_START = 0, + CTRL_XFRC, + CTRL_HALTED, + CTRL_NAK, + CTRL_STALL, + CTRL_XACTERR, + CTRL_BBLERR, + CTRL_DATATGLERR, + CTRL_FAIL +}CTRL_STATUS; + + +typedef struct USB_OTG_hc +{ + uint8_t dev_addr ; + uint8_t ep_num; + uint8_t ep_is_in; + uint8_t speed; + uint8_t do_ping; + uint8_t ep_type; + uint16_t max_packet; + uint8_t data_pid; + uint8_t *xfer_buff; + uint32_t xfer_len; + uint32_t xfer_count; + uint8_t toggle_in; + uint8_t toggle_out; + uint32_t dma_addr; +} +USB_OTG_HC , *PUSB_OTG_HC; + +typedef struct USB_OTG_ep +{ + uint8_t num; + uint8_t is_in; + uint8_t is_stall; + uint8_t type; + uint8_t data_pid_start; + uint8_t even_odd_frame; + uint16_t tx_fifo_num; + uint32_t maxpacket; + /* transaction level variables*/ + uint8_t *xfer_buff; + uint32_t dma_addr; + uint32_t xfer_len; + uint32_t xfer_count; + /* Transfer level variables*/ + uint32_t rem_data_len; + uint32_t total_data_len; + uint32_t ctl_data_len; + +} + +USB_OTG_EP , *PUSB_OTG_EP; + + + +typedef struct USB_OTG_core_cfg +{ + uint8_t host_channels; + uint8_t dev_endpoints; + uint8_t speed; + uint8_t dma_enable; + uint16_t mps; + uint16_t TotalFifoSize; + uint8_t phy_itface; + uint8_t Sof_output; + uint8_t low_power; + uint8_t coreID; + +} +USB_OTG_CORE_CFGS, *PUSB_OTG_CORE_CFGS; + + + +typedef struct usb_setup_req { + + uint8_t bmRequest; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; +} USB_SETUP_REQ; + +typedef struct _Device_TypeDef +{ + uint8_t *(*GetDeviceDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetLangIDStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetManufacturerStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetProductStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetSerialStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetConfigurationStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetInterfaceStrDescriptor)( uint8_t speed , uint16_t *length); +} USBD_DEVICE, *pUSBD_DEVICE; + +//typedef struct USB_OTG_hPort +//{ +// void (*Disconnect) (void *phost); +// void (*Connect) (void *phost); +// uint8_t ConnStatus; +// uint8_t DisconnStatus; +// uint8_t ConnHandled; +// uint8_t DisconnHandled; +//} USB_OTG_hPort_TypeDef; + +typedef struct _Device_cb +{ + uint8_t (*Init) (void *pdev , uint8_t cfgidx); + uint8_t (*DeInit) (void *pdev , uint8_t cfgidx); + /* Control Endpoints*/ + uint8_t (*Setup) (void *pdev , USB_SETUP_REQ *req); + uint8_t (*EP0_TxSent) (void *pdev ); + uint8_t (*EP0_RxReady) (void *pdev ); + /* Class Specific Endpoints*/ + uint8_t (*DataIn) (void *pdev , uint8_t epnum); + uint8_t (*DataOut) (void *pdev , uint8_t epnum); + uint8_t (*SOF) (void *pdev); + uint8_t (*IsoINIncomplete) (void *pdev); + uint8_t (*IsoOUTIncomplete) (void *pdev); + + uint8_t *(*GetConfigDescriptor)( uint8_t speed , uint16_t *length); +#ifdef USB_OTG_HS_CORE + uint8_t *(*GetOtherConfigDescriptor)( uint8_t speed , uint16_t *length); +#endif + +#ifdef USB_SUPPORT_USER_STRING_DESC + uint8_t *(*GetUsrStrDescriptor)( uint8_t speed ,uint8_t index, uint16_t *length); +#endif + +} USBD_Class_cb_TypeDef; + + + +typedef struct _USBD_USR_PROP +{ + void (*Init)(void); + void (*DeviceReset)(uint8_t speed); + void (*DeviceConfigured)(void); + void (*DeviceSuspended)(void); + void (*DeviceResumed)(void); + + void (*DeviceConnected)(void); + void (*DeviceDisconnected)(void); + +} +USBD_Usr_cb_TypeDef; + +typedef struct _DCD +{ + uint8_t device_config; + uint8_t device_state; + uint8_t device_status; + uint8_t device_old_status; + uint8_t device_address; + uint8_t connection_status; + uint8_t test_mode; + uint32_t DevRemoteWakeup; + USB_OTG_EP in_ep [USB_OTG_MAX_TX_FIFOS]; + USB_OTG_EP out_ep [USB_OTG_MAX_TX_FIFOS]; + uint8_t setup_packet [8*3]; + USBD_Class_cb_TypeDef *class_cb; + USBD_Usr_cb_TypeDef *usr_cb; + USBD_DEVICE *usr_device; + uint8_t *pConfig_descriptor; + } +DCD_DEV , *DCD_PDEV; + + +typedef struct _HCD +{ + uint8_t Rx_Buffer [MAX_DATA_LENGTH]; + __IO uint32_t ConnSts; + __IO uint32_t ErrCnt[USB_OTG_MAX_TX_FIFOS]; + __IO uint32_t XferCnt[USB_OTG_MAX_TX_FIFOS]; + __IO HC_STATUS HC_Status[USB_OTG_MAX_TX_FIFOS]; + __IO URB_STATE URB_State[USB_OTG_MAX_TX_FIFOS]; + USB_OTG_HC hc [USB_OTG_MAX_TX_FIFOS]; + uint16_t channel [USB_OTG_MAX_TX_FIFOS]; +// USB_OTG_hPort_TypeDef *port_cb; +} +HCD_DEV , *USB_OTG_USBH_PDEV; + + +typedef struct _OTG +{ + uint8_t OTG_State; + uint8_t OTG_PrevState; + uint8_t OTG_Mode; +} +OTG_DEV , *USB_OTG_USBO_PDEV; + +typedef struct USB_OTG_handle +{ + USB_OTG_CORE_CFGS cfg; + USB_OTG_CORE_REGS regs; +#ifdef USE_DEVICE_MODE + DCD_DEV dev; +#endif +#ifdef USE_HOST_MODE + HCD_DEV host; +#endif +#ifdef USE_OTG_MODE + OTG_DEV otg; +#endif +} +USB_OTG_CORE_HANDLE , *PUSB_OTG_CORE_HANDLE; + +/** + * @} + */ + + +/** @defgroup USB_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_FunctionsPrototype + * @{ + */ + + +USB_OTG_STS USB_OTG_CoreInit (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_SelectCore (USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID); +USB_OTG_STS USB_OTG_EnableGlobalInt (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_DisableGlobalInt(USB_OTG_CORE_HANDLE *pdev); +void* USB_OTG_ReadPacket (USB_OTG_CORE_HANDLE *pdev , + uint8_t *dest, + uint16_t len); +USB_OTG_STS USB_OTG_WritePacket (USB_OTG_CORE_HANDLE *pdev , + uint8_t *src, + uint8_t ch_ep_num, + uint16_t len); +USB_OTG_STS USB_OTG_FlushTxFifo (USB_OTG_CORE_HANDLE *pdev , uint32_t num); +USB_OTG_STS USB_OTG_FlushRxFifo (USB_OTG_CORE_HANDLE *pdev); + +uint32_t USB_OTG_ReadCoreItr (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadOtgItr (USB_OTG_CORE_HANDLE *pdev); +uint8_t USB_OTG_IsHostMode (USB_OTG_CORE_HANDLE *pdev); +uint8_t USB_OTG_IsDeviceMode (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_GetMode (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_PhyInit (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_SetCurrentMode (USB_OTG_CORE_HANDLE *pdev, + uint8_t mode); + +/*********************** HOST APIs ********************************************/ +#ifdef USE_HOST_MODE +USB_OTG_STS USB_OTG_CoreInitHost (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EnableHostInt (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_HC_Init (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num); +USB_OTG_STS USB_OTG_HC_Halt (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num); +USB_OTG_STS USB_OTG_HC_StartXfer (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num); +USB_OTG_STS USB_OTG_HC_DoPing (USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num); +uint32_t USB_OTG_ReadHostAllChannels_intr (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ResetPort (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadHPRT0 (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_DriveVbus (USB_OTG_CORE_HANDLE *pdev, uint8_t state); +void USB_OTG_InitFSLSPClkSel (USB_OTG_CORE_HANDLE *pdev ,uint8_t freq); +uint8_t USB_OTG_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev) ; +void USB_OTG_StopHost (USB_OTG_CORE_HANDLE *pdev); +#endif +/********************* DEVICE APIs ********************************************/ +#ifdef USE_DEVICE_MODE +USB_OTG_STS USB_OTG_CoreInitDev (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EnableDevInt (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadDevAllInEPItr (USB_OTG_CORE_HANDLE *pdev); +enum USB_OTG_SPEED USB_OTG_GetDeviceSpeed (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EP0Activate (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EPActivate (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPDeactivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPStartXfer (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EP0StartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPSetStall (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPClearStall (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +uint32_t USB_OTG_ReadDevAllOutEp_itr (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadDevOutEP_itr (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); +uint32_t USB_OTG_ReadDevAllInEPItr (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_InitDevSpeed (USB_OTG_CORE_HANDLE *pdev , uint8_t speed); +uint8_t USBH_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_EP0_OutStart(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_ActiveRemoteWakeup(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_UngateClock(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_StopDevice(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep , uint32_t Status); +uint32_t USB_OTG_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,USB_OTG_EP *ep); +#endif +/** + * @} + */ + +#endif /* __USB_CORE_H__ */ + + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_dcd.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_dcd.h new file mode 100644 index 00000000..6922782a --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_dcd.h @@ -0,0 +1,164 @@ +/** + ****************************************************************************** + * @file usb_dcd.h + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Peripheral Driver Header file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __DCD_H__ +#define __DCD_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_core.h" + + +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_DCD +* @brief This file is the +* @{ +*/ + + +/** @defgroup USB_DCD_Exported_Defines +* @{ +*/ +#define USB_OTG_EP_CONTROL 0 +#define USB_OTG_EP_ISOC 1 +#define USB_OTG_EP_BULK 2 +#define USB_OTG_EP_INT 3 +#define USB_OTG_EP_MASK 3 + +/* Device Status */ +#define USB_OTG_DEFAULT 1 +#define USB_OTG_ADDRESSED 2 +#define USB_OTG_CONFIGURED 3 +#define USB_OTG_SUSPENDED 4 + +/** +* @} +*/ + + +/** @defgroup USB_DCD_Exported_Types +* @{ +*/ +/******************************************************************************** +Data structure type +********************************************************************************/ +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; +} +EP_DESCRIPTOR , *PEP_DESCRIPTOR; + +/** +* @} +*/ + + +/** @defgroup USB_DCD_Exported_Macros +* @{ +*/ +/** +* @} +*/ + +/** @defgroup USB_DCD_Exported_Variables +* @{ +*/ +/** +* @} +*/ + +/** @defgroup USB_DCD_Exported_FunctionsPrototype +* @{ +*/ +/******************************************************************************** +EXPORTED FUNCTION FROM THE USB-OTG LAYER +********************************************************************************/ +void DCD_Init(USB_OTG_CORE_HANDLE *pdev , + USB_OTG_CORE_ID_TypeDef coreID); + +void DCD_DevConnect (USB_OTG_CORE_HANDLE *pdev); +void DCD_DevDisconnect (USB_OTG_CORE_HANDLE *pdev); +void DCD_EP_SetAddress (USB_OTG_CORE_HANDLE *pdev, + uint8_t address); +uint32_t DCD_EP_Open(USB_OTG_CORE_HANDLE *pdev , + uint8_t ep_addr, + uint16_t ep_mps, + uint8_t ep_type); + +uint32_t DCD_EP_Close (USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr); + + +uint32_t DCD_EP_PrepareRx ( USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint16_t buf_len); + +uint32_t DCD_EP_Tx (USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint32_t buf_len); +uint32_t DCD_EP_Stall (USB_OTG_CORE_HANDLE *pdev, + uint8_t epnum); +uint32_t DCD_EP_ClrStall (USB_OTG_CORE_HANDLE *pdev, + uint8_t epnum); +uint32_t DCD_EP_Flush (USB_OTG_CORE_HANDLE *pdev, + uint8_t epnum); +uint32_t DCD_Handle_ISR(USB_OTG_CORE_HANDLE *pdev); + +uint32_t DCD_GetEPStatus(USB_OTG_CORE_HANDLE *pdev , + uint8_t epnum); + +void DCD_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , + uint8_t epnum , + uint32_t Status); + +/** +* @} +*/ + + +#endif //__DCD_H__ + + +/** +* @} +*/ + +/** +* @} +*/ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_dcd_int.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_dcd_int.h new file mode 100644 index 00000000..e2369e5d --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_dcd_int.h @@ -0,0 +1,127 @@ +/** + ****************************************************************************** + * @file usb_dcd_int.h + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Peripheral Device Interface Layer + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef USB_DCD_INT_H__ +#define USB_DCD_INT_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd.h" + + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_DCD_INT + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_DCD_INT_Exported_Defines + * @{ + */ + +typedef struct _USBD_DCD_INT +{ + uint8_t (* DataOutStage) (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); + uint8_t (* DataInStage) (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); + uint8_t (* SetupStage) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* SOF) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* Reset) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* Suspend) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* Resume) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* IsoINIncomplete) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* IsoOUTIncomplete) (USB_OTG_CORE_HANDLE *pdev); + + uint8_t (* DevConnected) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* DevDisconnected) (USB_OTG_CORE_HANDLE *pdev); + +}USBD_DCD_INT_cb_TypeDef; + +extern USBD_DCD_INT_cb_TypeDef *USBD_DCD_INT_fops; +/** + * @} + */ + + +/** @defgroup USB_DCD_INT_Exported_Types + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DCD_INT_Exported_Macros + * @{ + */ + +#define CLEAR_IN_EP_INTR(epnum,intr) \ + diepint.d32=0; \ + diepint.b.intr = 1; \ + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[epnum]->DIEPINT,diepint.d32); + +#define CLEAR_OUT_EP_INTR(epnum,intr) \ + doepint.d32=0; \ + doepint.b.intr = 1; \ + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[epnum]->DOEPINT,doepint.d32); + +/** + * @} + */ + +/** @defgroup USB_DCD_INT_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DCD_INT_Exported_FunctionsPrototype + * @{ + */ + +uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev); + +/** + * @} + */ + + +#endif // USB_DCD_INT_H__ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_defines.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_defines.h new file mode 100644 index 00000000..28e6d168 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_defines.h @@ -0,0 +1,249 @@ +/** + ****************************************************************************** + * @file usb_defines.h + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Header of the Core Layer + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_DEF_H__ +#define __USB_DEF_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_DEFINES + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_DEFINES_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup _CORE_DEFINES_ + * @{ + */ + +#define USB_OTG_SPEED_PARAM_HIGH 0 +#define USB_OTG_SPEED_PARAM_HIGH_IN_FULL 1 +#define USB_OTG_SPEED_PARAM_FULL 3 + +#define USB_OTG_SPEED_HIGH 0 +#define USB_OTG_SPEED_FULL 1 + +#define USB_OTG_ULPI_PHY 1 +#define USB_OTG_EMBEDDED_PHY 2 + +/** + * @} + */ + + +/** @defgroup _GLOBAL_DEFINES_ + * @{ + */ +#define GAHBCFG_TXFEMPTYLVL_EMPTY 1 +#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 +#define GAHBCFG_GLBINT_ENABLE 1 +#define GAHBCFG_INT_DMA_BURST_SINGLE 0 +#define GAHBCFG_INT_DMA_BURST_INCR 1 +#define GAHBCFG_INT_DMA_BURST_INCR4 3 +#define GAHBCFG_INT_DMA_BURST_INCR8 5 +#define GAHBCFG_INT_DMA_BURST_INCR16 7 +#define GAHBCFG_DMAENABLE 1 +#define GAHBCFG_TXFEMPTYLVL_EMPTY 1 +#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 +#define GRXSTS_PKTSTS_IN 2 +#define GRXSTS_PKTSTS_IN_XFER_COMP 3 +#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR 5 +#define GRXSTS_PKTSTS_CH_HALTED 7 +/** + * @} + */ + + +/** @defgroup _OnTheGo_DEFINES_ + * @{ + */ +#define MODE_HNP_SRP_CAPABLE 0 +#define MODE_SRP_ONLY_CAPABLE 1 +#define MODE_NO_HNP_SRP_CAPABLE 2 +#define MODE_SRP_CAPABLE_DEVICE 3 +#define MODE_NO_SRP_CAPABLE_DEVICE 4 +#define MODE_SRP_CAPABLE_HOST 5 +#define MODE_NO_SRP_CAPABLE_HOST 6 +#define A_HOST 1 +#define A_SUSPEND 2 +#define A_PERIPHERAL 3 +#define B_PERIPHERAL 4 +#define B_HOST 5 +#define DEVICE_MODE 0 +#define HOST_MODE 1 +#define OTG_MODE 2 +/** + * @} + */ + + +/** @defgroup __DEVICE_DEFINES_ + * @{ + */ +#define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ 0 +#define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ 1 +#define DSTS_ENUMSPD_LS_PHY_6MHZ 2 +#define DSTS_ENUMSPD_FS_PHY_48MHZ 3 + +#define DCFG_FRAME_INTERVAL_80 0 +#define DCFG_FRAME_INTERVAL_85 1 +#define DCFG_FRAME_INTERVAL_90 2 +#define DCFG_FRAME_INTERVAL_95 3 + +#define DEP0CTL_MPS_64 0 +#define DEP0CTL_MPS_32 1 +#define DEP0CTL_MPS_16 2 +#define DEP0CTL_MPS_8 3 + +#define EP_SPEED_LOW 0 +#define EP_SPEED_FULL 1 +#define EP_SPEED_HIGH 2 + +#define EP_TYPE_CTRL 0 +#define EP_TYPE_ISOC 1 +#define EP_TYPE_BULK 2 +#define EP_TYPE_INTR 3 +#define EP_TYPE_MSK 3 + +#define STS_GOUT_NAK 1 +#define STS_DATA_UPDT 2 +#define STS_XFER_COMP 3 +#define STS_SETUP_COMP 4 +#define STS_SETUP_UPDT 6 +/** + * @} + */ + + +/** @defgroup __HOST_DEFINES_ + * @{ + */ +#define HC_PID_DATA0 0 +#define HC_PID_DATA2 1 +#define HC_PID_DATA1 2 +#define HC_PID_SETUP 3 + +#define HPRT0_PRTSPD_HIGH_SPEED 0 +#define HPRT0_PRTSPD_FULL_SPEED 1 +#define HPRT0_PRTSPD_LOW_SPEED 2 + +#define HCFG_30_60_MHZ 0 +#define HCFG_48_MHZ 1 +#define HCFG_6_MHZ 2 + +#define HCCHAR_CTRL 0 +#define HCCHAR_ISOC 1 +#define HCCHAR_BULK 2 +#define HCCHAR_INTR 3 + +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) + +/** + * @} + */ + + +/** @defgroup USB_DEFINES_Exported_Types + * @{ + */ + +typedef enum +{ + USB_OTG_HS_CORE_ID = 0, + USB_OTG_FS_CORE_ID = 1 +}USB_OTG_CORE_ID_TypeDef; +/** + * @} + */ + + +/** @defgroup USB_DEFINES_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DEFINES_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DEFINES_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +/** @defgroup Internal_Macro's + * @{ + */ +#define USB_OTG_READ_REG32(reg) (*(__IO uint32_t *)reg) +#define USB_OTG_WRITE_REG32(reg,value) (*(__IO uint32_t *)reg = value) +#define USB_OTG_MODIFY_REG32(reg,clear_mask,set_mask) \ + USB_OTG_WRITE_REG32(reg, (((USB_OTG_READ_REG32(reg)) & ~clear_mask) | set_mask ) ) + +/******************************************************************************** + ENUMERATION TYPE +********************************************************************************/ +enum USB_OTG_SPEED { + USB_SPEED_UNKNOWN = 0, + USB_SPEED_LOW, + USB_SPEED_FULL, + USB_SPEED_HIGH +}; + +#endif //__USB_DEFINES__H__ + + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_regs.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_regs.h new file mode 100644 index 00000000..323e8705 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_regs.h @@ -0,0 +1,1188 @@ +/** + ****************************************************************************** + * @file usb_regs.h + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief hardware registers + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_OTG_REGS_H__ +#define __USB_OTG_REGS_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_REGS + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_REGS_Exported_Defines + * @{ + */ + +#define USB_OTG_HS_BASE_ADDR 0x40040000 +#define USB_OTG_FS_BASE_ADDR 0x50000000 + +#define USB_OTG_CORE_GLOBAL_REGS_OFFSET 0x000 +#define USB_OTG_DEV_GLOBAL_REG_OFFSET 0x800 +#define USB_OTG_DEV_IN_EP_REG_OFFSET 0x900 +#define USB_OTG_EP_REG_OFFSET 0x20 +#define USB_OTG_DEV_OUT_EP_REG_OFFSET 0xB00 +#define USB_OTG_HOST_GLOBAL_REG_OFFSET 0x400 +#define USB_OTG_HOST_PORT_REGS_OFFSET 0x440 +#define USB_OTG_HOST_CHAN_REGS_OFFSET 0x500 +#define USB_OTG_CHAN_REGS_OFFSET 0x20 +#define USB_OTG_PCGCCTL_OFFSET 0xE00 +#define USB_OTG_DATA_FIFO_OFFSET 0x1000 +#define USB_OTG_DATA_FIFO_SIZE 0x1000 + + +#define USB_OTG_MAX_TX_FIFOS 15 + +#define USB_OTG_HS_MAX_PACKET_SIZE 512 +#define USB_OTG_FS_MAX_PACKET_SIZE 64 +#define USB_OTG_MAX_EP0_SIZE 64 +/** + * @} + */ + +/** @defgroup USB_REGS_Exported_Types + * @{ + */ + +/** @defgroup __USB_OTG_Core_register + * @{ + */ +typedef struct _USB_OTG_GREGS //000h +{ + __IO uint32_t GOTGCTL; /* USB_OTG Control and Status Register 000h*/ + __IO uint32_t GOTGINT; /* USB_OTG Interrupt Register 004h*/ + __IO uint32_t GAHBCFG; /* Core AHB Configuration Register 008h*/ + __IO uint32_t GUSBCFG; /* Core USB Configuration Register 00Ch*/ + __IO uint32_t GRSTCTL; /* Core Reset Register 010h*/ + __IO uint32_t GINTSTS; /* Core Interrupt Register 014h*/ + __IO uint32_t GINTMSK; /* Core Interrupt Mask Register 018h*/ + __IO uint32_t GRXSTSR; /* Receive Sts Q Read Register 01Ch*/ + __IO uint32_t GRXSTSP; /* Receive Sts Q Read & POP Register 020h*/ + __IO uint32_t GRXFSIZ; /* Receive FIFO Size Register 024h*/ + __IO uint32_t DIEPTXF0_HNPTXFSIZ; /* EP0 / Non Periodic Tx FIFO Size Register 028h*/ + __IO uint32_t HNPTXSTS; /* Non Periodic Tx FIFO/Queue Sts reg 02Ch*/ + uint32_t Reserved30[2]; /* Reserved 030h*/ + __IO uint32_t GCCFG; /* General Purpose IO Register 038h*/ + __IO uint32_t CID; /* User ID Register 03Ch*/ + uint32_t Reserved40[48]; /* Reserved 040h-0FFh*/ + __IO uint32_t HPTXFSIZ; /* Host Periodic Tx FIFO Size Reg 100h*/ + __IO uint32_t DIEPTXF[USB_OTG_MAX_TX_FIFOS];/* dev Periodic Transmit FIFO */ +} +USB_OTG_GREGS; +/** + * @} + */ + + +/** @defgroup __device_Registers + * @{ + */ +typedef struct _USB_OTG_DREGS // 800h +{ + __IO uint32_t DCFG; /* dev Configuration Register 800h*/ + __IO uint32_t DCTL; /* dev Control Register 804h*/ + __IO uint32_t DSTS; /* dev Status Register (RO) 808h*/ + uint32_t Reserved0C; /* Reserved 80Ch*/ + __IO uint32_t DIEPMSK; /* dev IN Endpoint Mask 810h*/ + __IO uint32_t DOEPMSK; /* dev OUT Endpoint Mask 814h*/ + __IO uint32_t DAINT; /* dev All Endpoints Itr Reg 818h*/ + __IO uint32_t DAINTMSK; /* dev All Endpoints Itr Mask 81Ch*/ + uint32_t Reserved20; /* Reserved 820h*/ + uint32_t Reserved9; /* Reserved 824h*/ + __IO uint32_t DVBUSDIS; /* dev VBUS discharge Register 828h*/ + __IO uint32_t DVBUSPULSE; /* dev VBUS Pulse Register 82Ch*/ + __IO uint32_t DTHRCTL; /* dev thr 830h*/ + __IO uint32_t DIEPEMPMSK; /* dev empty msk 834h*/ + __IO uint32_t DEACHINT; /* dedicated EP interrupt 838h*/ + __IO uint32_t DEACHMSK; /* dedicated EP msk 83Ch*/ + uint32_t Reserved40; /* dedicated EP mask 840h*/ + __IO uint32_t DINEP1MSK; /* dedicated EP mask 844h*/ + uint32_t Reserved44[15]; /* Reserved 844-87Ch*/ + __IO uint32_t DOUTEP1MSK; /* dedicated EP msk 884h*/ +} +USB_OTG_DREGS; +/** + * @} + */ + + +/** @defgroup __IN_Endpoint-Specific_Register + * @{ + */ +typedef struct _USB_OTG_INEPREGS +{ + __IO uint32_t DIEPCTL; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h*/ + uint32_t Reserved04; /* Reserved 900h + (ep_num * 20h) + 04h*/ + __IO uint32_t DIEPINT; /* dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h*/ + uint32_t Reserved0C; /* Reserved 900h + (ep_num * 20h) + 0Ch*/ + __IO uint32_t DIEPTSIZ; /* IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h*/ + __IO uint32_t DIEPDMA; /* IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h*/ + __IO uint32_t DTXFSTS;/*IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h*/ + uint32_t Reserved18; /* Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch*/ +} +USB_OTG_INEPREGS; +/** + * @} + */ + + +/** @defgroup __OUT_Endpoint-Specific_Registers + * @{ + */ +typedef struct _USB_OTG_OUTEPREGS +{ + __IO uint32_t DOEPCTL; /* dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h*/ + uint32_t Reserved04; /* Reserved B00h + (ep_num * 20h) + 04h*/ + __IO uint32_t DOEPINT; /* dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h*/ + uint32_t Reserved0C; /* Reserved B00h + (ep_num * 20h) + 0Ch*/ + __IO uint32_t DOEPTSIZ; /* dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h*/ + __IO uint32_t DOEPDMA; /* dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h*/ + uint32_t Reserved18[2]; /* Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch*/ +} +USB_OTG_OUTEPREGS; +/** + * @} + */ + + +/** @defgroup __Host_Mode_Register_Structures + * @{ + */ +typedef struct _USB_OTG_HREGS +{ + __IO uint32_t HCFG; /* Host Configuration Register 400h*/ + __IO uint32_t HFIR; /* Host Frame Interval Register 404h*/ + __IO uint32_t HFNUM; /* Host Frame Nbr/Frame Remaining 408h*/ + uint32_t Reserved40C; /* Reserved 40Ch*/ + __IO uint32_t HPTXSTS; /* Host Periodic Tx FIFO/ Queue Status 410h*/ + __IO uint32_t HAINT; /* Host All Channels Interrupt Register 414h*/ + __IO uint32_t HAINTMSK; /* Host All Channels Interrupt Mask 418h*/ +} +USB_OTG_HREGS; +/** + * @} + */ + + +/** @defgroup __Host_Channel_Specific_Registers + * @{ + */ +typedef struct _USB_OTG_HC_REGS +{ + __IO uint32_t HCCHAR; + __IO uint32_t HCSPLT; + __IO uint32_t HCINT; + __IO uint32_t HCINTMSK; + __IO uint32_t HCTSIZ; + __IO uint32_t HCDMA; + uint32_t Reserved[2]; +} +USB_OTG_HC_REGS; +/** + * @} + */ + + +/** @defgroup __otg_Core_registers + * @{ + */ +typedef struct USB_OTG_core_regs //000h +{ + USB_OTG_GREGS *GREGS; + USB_OTG_DREGS *DREGS; + USB_OTG_HREGS *HREGS; + USB_OTG_INEPREGS *INEP_REGS[USB_OTG_MAX_TX_FIFOS]; + USB_OTG_OUTEPREGS *OUTEP_REGS[USB_OTG_MAX_TX_FIFOS]; + USB_OTG_HC_REGS *HC_REGS[USB_OTG_MAX_TX_FIFOS]; + __IO uint32_t *HPRT0; + __IO uint32_t *DFIFO[USB_OTG_MAX_TX_FIFOS]; + __IO uint32_t *PCGCCTL; +} +USB_OTG_CORE_REGS , *PUSB_OTG_CORE_REGS; +typedef union _USB_OTG_GOTGCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t sesreqscs : + 1; +uint32_t sesreq : + 1; +uint32_t Reserved2_7 : + 6; +uint32_t hstnegscs : + 1; +uint32_t hnpreq : + 1; +uint32_t hstsethnpen : + 1; +uint32_t devhnpen : + 1; +uint32_t Reserved12_15 : + 4; +uint32_t conidsts : + 1; +uint32_t dbct : + 1; +uint32_t asesvld : + 1; +uint32_t bsesvld : + 1; +uint32_t Reserved20_31 : + 12; + } + b; +} USB_OTG_GOTGCTL_TypeDef ; + +typedef union _USB_OTG_GOTGINT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t Reserved0_1 : + 2; +uint32_t sesenddet : + 1; +uint32_t Reserved3_7 : + 5; +uint32_t sesreqsucstschng : + 1; +uint32_t hstnegsucstschng : + 1; +uint32_t reserver10_16 : + 7; +uint32_t hstnegdet : + 1; +uint32_t adevtoutchng : + 1; +uint32_t debdone : + 1; +uint32_t Reserved31_20 : + 12; + } + b; +} USB_OTG_GOTGINT_TypeDef ; +typedef union _USB_OTG_GAHBCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t glblintrmsk : + 1; +uint32_t hburstlen : + 4; +uint32_t dmaenable : + 1; +uint32_t Reserved : + 1; +uint32_t nptxfemplvl_txfemplvl : + 1; +uint32_t ptxfemplvl : + 1; +uint32_t Reserved9_31 : + 23; + } + b; +} USB_OTG_GAHBCFG_TypeDef ; +typedef union _USB_OTG_GUSBCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t toutcal : + 3; +uint32_t Reserved3_5 : + 3; +uint32_t physel : + 1; +uint32_t Reserved7 : + 1; +uint32_t srpcap : + 1; +uint32_t hnpcap : + 1; +uint32_t usbtrdtim : + 4; +uint32_t Reserved14 : + 1; +uint32_t phylpwrclksel : + 1; +uint32_t Reserved16 : + 1; +uint32_t ulpi_fsls : + 1; +uint32_t ulpi_auto_res : + 1; +uint32_t ulpi_clk_sus_m : + 1; +uint32_t ulpi_ext_vbus_drv : + 1; +uint32_t ulpi_int_vbus_ind : + 1; +uint32_t term_sel_dl_pulse : + 1; +uint32_t ulpi_ind_cpl : + 1; +uint32_t ulpi_passthrough : + 1; +uint32_t ulpi_protect_disable : + 1; +uint32_t Reserved26_28 : + 3; +uint32_t force_host : + 1; +uint32_t force_dev : + 1; +uint32_t corrupt_tx : + 1; + } + b; +} USB_OTG_GUSBCFG_TypeDef ; +typedef union _USB_OTG_GRSTCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t csftrst : + 1; +uint32_t hsftrst : + 1; +uint32_t hstfrm : + 1; +uint32_t Reserved3 : + 1; +uint32_t rxfflsh : + 1; +uint32_t txfflsh : + 1; +uint32_t txfnum : + 5; +uint32_t Reserved11_29 : + 19; +uint32_t dmareq : + 1; +uint32_t ahbidle : + 1; + } + b; +} USB_OTG_GRSTCTL_TypeDef ; +typedef union _USB_OTG_GINTMSK_TypeDef +{ + uint32_t d32; + struct + { +uint32_t Reserved0 : + 1; +uint32_t modemismatch : + 1; +uint32_t otgintr : + 1; +uint32_t sofintr : + 1; +uint32_t rxstsqlvl : + 1; +uint32_t nptxfempty : + 1; +uint32_t ginnakeff : + 1; +uint32_t goutnakeff : + 1; +uint32_t Reserved8_9 : + 2; +uint32_t erlysuspend : + 1; +uint32_t usbsuspend : + 1; +uint32_t usbreset : + 1; +uint32_t enumdone : + 1; +uint32_t isooutdrop : + 1; +uint32_t eopframe : + 1; +uint32_t Reserved16 : + 1; +uint32_t epmismatch : + 1; +uint32_t inepintr : + 1; +uint32_t outepintr : + 1; +uint32_t incomplisoin : + 1; +uint32_t incomplisoout : + 1; +uint32_t Reserved22_23 : + 2; +uint32_t portintr : + 1; +uint32_t hcintr : + 1; +uint32_t ptxfempty : + 1; +uint32_t Reserved27 : + 1; +uint32_t conidstschng : + 1; +uint32_t disconnect : + 1; +uint32_t sessreqintr : + 1; +uint32_t wkupintr : + 1; + } + b; +} USB_OTG_GINTMSK_TypeDef ; +typedef union _USB_OTG_GINTSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t curmode : + 1; +uint32_t modemismatch : + 1; +uint32_t otgintr : + 1; +uint32_t sofintr : + 1; +uint32_t rxstsqlvl : + 1; +uint32_t nptxfempty : + 1; +uint32_t ginnakeff : + 1; +uint32_t goutnakeff : + 1; +uint32_t Reserved8_9 : + 2; +uint32_t erlysuspend : + 1; +uint32_t usbsuspend : + 1; +uint32_t usbreset : + 1; +uint32_t enumdone : + 1; +uint32_t isooutdrop : + 1; +uint32_t eopframe : + 1; +uint32_t Reserved16_17 : + 2; +uint32_t inepint: + 1; +uint32_t outepintr : + 1; +uint32_t incomplisoin : + 1; +uint32_t incomplisoout : + 1; +uint32_t Reserved22_23 : + 2; +uint32_t portintr : + 1; +uint32_t hcintr : + 1; +uint32_t ptxfempty : + 1; +uint32_t Reserved27 : + 1; +uint32_t conidstschng : + 1; +uint32_t disconnect : + 1; +uint32_t sessreqintr : + 1; +uint32_t wkupintr : + 1; + } + b; +} USB_OTG_GINTSTS_TypeDef ; +typedef union _USB_OTG_DRXSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t epnum : + 4; +uint32_t bcnt : + 11; +uint32_t dpid : + 2; +uint32_t pktsts : + 4; +uint32_t fn : + 4; +uint32_t Reserved : + 7; + } + b; +} USB_OTG_DRXSTS_TypeDef ; +typedef union _USB_OTG_GRXSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t chnum : + 4; +uint32_t bcnt : + 11; +uint32_t dpid : + 2; +uint32_t pktsts : + 4; +uint32_t Reserved : + 11; + } + b; +} USB_OTG_GRXFSTS_TypeDef ; +typedef union _USB_OTG_FSIZ_TypeDef +{ + uint32_t d32; + struct + { +uint32_t startaddr : + 16; +uint32_t depth : + 16; + } + b; +} USB_OTG_FSIZ_TypeDef ; +typedef union _USB_OTG_HNPTXSTS_TypeDef +{ + uint32_t d32; + struct + { + uint32_t nptxfspcavail : + 16; + uint32_t nptxqspcavail : + 8; + struct + { + uint32_t terminate : + 1; + uint32_t token : + 2; + uint32_t chnum : + 4; + } nptxqtop; + uint32_t Reserved : + 1; + } + b; +} USB_OTG_HNPTXSTS_TypeDef ; +typedef union _USB_OTG_DTXFSTSn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t txfspcavail : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_DTXFSTSn_TypeDef ; + +typedef union _USB_OTG_GCCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t Reserved_in : + 16; +uint32_t pwdn : + 1; +uint32_t Reserved_17 : + 1; +uint32_t vbussensingA : + 1; +uint32_t vbussensingB : + 1; +uint32_t sofouten : + 1; +uint32_t disablevbussensing : + 1; +uint32_t Reserved_out : + 10; + } + b; +} USB_OTG_GCCFG_TypeDef ; + +typedef union _USB_OTG_DCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t devspd : + 2; +uint32_t nzstsouthshk : + 1; +uint32_t Reserved3 : + 1; +uint32_t devaddr : + 7; +uint32_t perfrint : + 2; +uint32_t Reserved12_31 : + 19; + } + b; +} USB_OTG_DCFG_TypeDef ; +typedef union _USB_OTG_DCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t rmtwkupsig : + 1; +uint32_t sftdiscon : + 1; +uint32_t gnpinnaksts : + 1; +uint32_t goutnaksts : + 1; +uint32_t tstctl : + 3; +uint32_t sgnpinnak : + 1; +uint32_t cgnpinnak : + 1; +uint32_t sgoutnak : + 1; +uint32_t cgoutnak : + 1; +uint32_t poprg_done : + 1; +uint32_t Reserved : + 20; + } + b; +} USB_OTG_DCTL_TypeDef ; +typedef union _USB_OTG_DSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t suspsts : + 1; +uint32_t enumspd : + 2; +uint32_t errticerr : + 1; +uint32_t Reserved4_7: + 4; +uint32_t soffn : + 14; +uint32_t Reserved22_31 : + 10; + } + b; +} USB_OTG_DSTS_TypeDef ; +typedef union _USB_OTG_DIEPINTn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t epdisabled : + 1; +uint32_t Reserved2 : + 1; +uint32_t timeout : + 1; +uint32_t intktxfemp : + 1; +uint32_t Reserved5 : + 1; +uint32_t inepnakeff : + 1; +uint32_t emptyintr : + 1; +uint32_t txfifoundrn : + 1; +uint32_t Reserved14_31 : + 23; + } + b; +} USB_OTG_DIEPINTn_TypeDef ; +typedef union _USB_OTG_DIEPINTn_TypeDef USB_OTG_DIEPMSK_TypeDef ; +typedef union _USB_OTG_DOEPINTn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t epdisabled : + 1; +uint32_t Reserved2 : + 1; +uint32_t setup : + 1; +uint32_t Reserved04_31 : + 28; + } + b; +} USB_OTG_DOEPINTn_TypeDef ; +typedef union _USB_OTG_DOEPINTn_TypeDef USB_OTG_DOEPMSK_TypeDef ; + +typedef union _USB_OTG_DAINT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t in : + 16; +uint32_t out : + 16; + } + ep; +} USB_OTG_DAINT_TypeDef ; + +typedef union _USB_OTG_DTHRCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t non_iso_thr_en : + 1; +uint32_t iso_thr_en : + 1; +uint32_t tx_thr_len : + 9; +uint32_t Reserved11_15 : + 5; +uint32_t rx_thr_en : + 1; +uint32_t rx_thr_len : + 9; +uint32_t Reserved26 : + 1; +uint32_t arp_en : + 1; +uint32_t Reserved28_31 : + 4; + } + b; +} USB_OTG_DTHRCTL_TypeDef ; +typedef union _USB_OTG_DEPCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t mps : + 11; +uint32_t reserved : + 4; +uint32_t usbactep : + 1; +uint32_t dpid : + 1; +uint32_t naksts : + 1; +uint32_t eptype : + 2; +uint32_t snp : + 1; +uint32_t stall : + 1; +uint32_t txfnum : + 4; +uint32_t cnak : + 1; +uint32_t snak : + 1; +uint32_t setd0pid : + 1; +uint32_t setd1pid : + 1; +uint32_t epdis : + 1; +uint32_t epena : + 1; + } + b; +} USB_OTG_DEPCTL_TypeDef ; +typedef union _USB_OTG_DEPXFRSIZ_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfersize : + 19; +uint32_t pktcnt : + 10; +uint32_t mc : + 2; +uint32_t Reserved : + 1; + } + b; +} USB_OTG_DEPXFRSIZ_TypeDef ; +typedef union _USB_OTG_DEP0XFRSIZ_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfersize : + 7; +uint32_t Reserved7_18 : + 12; +uint32_t pktcnt : + 2; +uint32_t Reserved20_28 : + 9; +uint32_t supcnt : + 2; + uint32_t Reserved31; + } + b; +} USB_OTG_DEP0XFRSIZ_TypeDef ; +typedef union _USB_OTG_HCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t fslspclksel : + 2; +uint32_t fslssupp : + 1; + } + b; +} USB_OTG_HCFG_TypeDef ; +typedef union _USB_OTG_HFRMINTRVL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t frint : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_HFRMINTRVL_TypeDef ; + +typedef union _USB_OTG_HFNUM_TypeDef +{ + uint32_t d32; + struct + { +uint32_t frnum : + 16; +uint32_t frrem : + 16; + } + b; +} USB_OTG_HFNUM_TypeDef ; +typedef union _USB_OTG_HPTXSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t ptxfspcavail : + 16; +uint32_t ptxqspcavail : + 8; + struct + { + uint32_t terminate : + 1; + uint32_t token : + 2; + uint32_t chnum : + 4; + uint32_t odd_even : + 1; + } ptxqtop; + } + b; +} USB_OTG_HPTXSTS_TypeDef ; +typedef union _USB_OTG_HPRT0_TypeDef +{ + uint32_t d32; + struct + { +uint32_t prtconnsts : + 1; +uint32_t prtconndet : + 1; +uint32_t prtena : + 1; +uint32_t prtenchng : + 1; +uint32_t prtovrcurract : + 1; +uint32_t prtovrcurrchng : + 1; +uint32_t prtres : + 1; +uint32_t prtsusp : + 1; +uint32_t prtrst : + 1; +uint32_t Reserved9 : + 1; +uint32_t prtlnsts : + 2; +uint32_t prtpwr : + 1; +uint32_t prttstctl : + 4; +uint32_t prtspd : + 2; +uint32_t Reserved19_31 : + 13; + } + b; +} USB_OTG_HPRT0_TypeDef ; +typedef union _USB_OTG_HAINT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t chint : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_HAINT_TypeDef ; +typedef union _USB_OTG_HAINTMSK_TypeDef +{ + uint32_t d32; + struct + { +uint32_t chint : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_HAINTMSK_TypeDef ; +typedef union _USB_OTG_HCCHAR_TypeDef +{ + uint32_t d32; + struct + { +uint32_t mps : + 11; +uint32_t epnum : + 4; +uint32_t epdir : + 1; +uint32_t Reserved : + 1; +uint32_t lspddev : + 1; +uint32_t eptype : + 2; +uint32_t multicnt : + 2; +uint32_t devaddr : + 7; +uint32_t oddfrm : + 1; +uint32_t chdis : + 1; +uint32_t chen : + 1; + } + b; +} USB_OTG_HCCHAR_TypeDef ; +typedef union _USB_OTG_HCSPLT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t prtaddr : + 7; +uint32_t hubaddr : + 7; +uint32_t xactpos : + 2; +uint32_t compsplt : + 1; +uint32_t Reserved : + 14; +uint32_t spltena : + 1; + } + b; +} USB_OTG_HCSPLT_TypeDef ; +typedef union _USB_OTG_HCINTn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t chhltd : + 1; +uint32_t ahberr : + 1; +uint32_t stall : + 1; +uint32_t nak : + 1; +uint32_t ack : + 1; +uint32_t nyet : + 1; +uint32_t xacterr : + 1; +uint32_t bblerr : + 1; +uint32_t frmovrun : + 1; +uint32_t datatglerr : + 1; +uint32_t Reserved : + 21; + } + b; +} USB_OTG_HCINTn_TypeDef ; +typedef union _USB_OTG_HCTSIZn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfersize : + 19; +uint32_t pktcnt : + 10; +uint32_t pid : + 2; +uint32_t dopng : + 1; + } + b; +} USB_OTG_HCTSIZn_TypeDef ; +typedef union _USB_OTG_HCINTMSK_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t chhltd : + 1; +uint32_t ahberr : + 1; +uint32_t stall : + 1; +uint32_t nak : + 1; +uint32_t ack : + 1; +uint32_t nyet : + 1; +uint32_t xacterr : + 1; +uint32_t bblerr : + 1; +uint32_t frmovrun : + 1; +uint32_t datatglerr : + 1; +uint32_t Reserved : + 21; + } + b; +} USB_OTG_HCINTMSK_TypeDef ; + +typedef union _USB_OTG_PCGCCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t stoppclk : + 1; +uint32_t gatehclk : + 1; +uint32_t Reserved2_3 : + 2; +uint32_t phy_susp : + 1; +uint32_t Reserved5_31 : + 27; + } + b; +} USB_OTG_PCGCCTL_TypeDef ; + +/** + * @} + */ + + +/** @defgroup USB_REGS_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_REGS_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_REGS_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +#endif //__USB_OTG_REGS_H__ + + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/src/usb_core.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/src/usb_core.c new file mode 100644 index 00000000..e257e73d --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/src/usb_core.c @@ -0,0 +1,2162 @@ +/** + ****************************************************************************** + * @file usb_core.c + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief USB-OTG Core Layer + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_core.h" +#include "usb_bsp.h" + + +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_CORE +* @brief This file includes the USB-OTG Core Layer +* @{ +*/ + + +/** @defgroup USB_CORE_Private_Defines +* @{ +*/ + +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + + +/** @defgroup USB_CORE_Private_Macros +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_Variables +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_FunctionPrototypes +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_Functions +* @{ +*/ + +/** +* @brief USB_OTG_EnableCommonInt +* Initializes the commmon interrupts, used in both device and modes +* @param pdev : Selected device +* @retval None +*/ +static void USB_OTG_EnableCommonInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTMSK_TypeDef int_mask; + + int_mask.d32 = 0; + /* Clear any pending USB_OTG Interrupts */ +#ifndef USE_OTG_MODE + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GOTGINT, 0xFFFFFFFF); +#endif + /* Clear any pending interrupts */ + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, 0xBFFFFFFF); + /* Enable the interrupts in the INTMSK */ + int_mask.b.wkupintr = 1; + int_mask.b.usbsuspend = 1; + +#ifdef USE_OTG_MODE + int_mask.b.otgintr = 1; + int_mask.b.sessreqintr = 1; + int_mask.b.conidstschng = 1; +#endif + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTMSK, int_mask.d32); +} + +/** +* @brief USB_OTG_CoreReset : Soft reset of the core +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +static USB_OTG_STS USB_OTG_CoreReset(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + __IO USB_OTG_GRSTCTL_TypeDef greset; + uint32_t count = 0; + + greset.d32 = 0; + /* Wait for AHB master IDLE state. */ + do + { + USB_OTG_BSP_uDelay(3); + greset.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + return USB_OTG_OK; + } + } + while (greset.b.ahbidle == 0); + /* Core Soft Reset */ + count = 0; + greset.b.csftrst = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRSTCTL, greset.d32 ); + do + { + greset.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + break; + } + } + while (greset.b.csftrst == 1); + /* Wait for 3 PHY Clocks*/ + USB_OTG_BSP_uDelay(3); + return status; +} + +/** +* @brief USB_OTG_WritePacket : Writes a packet into the Tx FIFO associated +* with the EP +* @param pdev : Selected device +* @param src : source pointer +* @param ch_ep_num : end point number +* @param bytes : No. of bytes +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_WritePacket(USB_OTG_CORE_HANDLE *pdev, + uint8_t *src, + uint8_t ch_ep_num, + uint16_t len) +{ + USB_OTG_STS status = USB_OTG_OK; + if (pdev->cfg.dma_enable == 0) + { + uint32_t count32b= 0 , i= 0; + __IO uint32_t *fifo; + + count32b = (len + 3) / 4; + fifo = pdev->regs.DFIFO[ch_ep_num]; + for (i = 0; i < count32b; i++, src+=4) + { + USB_OTG_WRITE_REG32( fifo, *((__packed uint32_t *)src) ); + } + } + return status; +} + + +/** +* @brief USB_OTG_ReadPacket : Reads a packet from the Rx FIFO +* @param pdev : Selected device +* @param dest : Destination Pointer +* @param bytes : No. of bytes +* @retval None +*/ +void *USB_OTG_ReadPacket(USB_OTG_CORE_HANDLE *pdev, + uint8_t *dest, + uint16_t len) +{ + uint32_t i=0; + uint32_t count32b = (len + 3) / 4; + + __IO uint32_t *fifo = pdev->regs.DFIFO[0]; + + for ( i = 0; i < count32b; i++, dest += 4 ) + { + *(__packed uint32_t *)dest = USB_OTG_READ_REG32(fifo); + + } + return ((void *)dest); +} + +/** +* @brief USB_OTG_SelectCore +* Initialize core registers address. +* @param pdev : Selected device +* @param coreID : USB OTG Core ID +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_SelectCore(USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID) +{ + uint32_t i , baseAddress = 0; + USB_OTG_STS status = USB_OTG_OK; + + pdev->cfg.dma_enable = 0; + + /* at startup the core is in FS mode */ + pdev->cfg.speed = USB_OTG_SPEED_FULL; + pdev->cfg.mps = USB_OTG_FS_MAX_PACKET_SIZE ; + + /* initialize device cfg following its address */ + if (coreID == USB_OTG_FS_CORE_ID) + { + baseAddress = USB_OTG_FS_BASE_ADDR; + pdev->cfg.coreID = USB_OTG_FS_CORE_ID; + pdev->cfg.host_channels = 8 ; + pdev->cfg.dev_endpoints = 4 ; + pdev->cfg.TotalFifoSize = 320; /* in 32-bits */ + pdev->cfg.phy_itface = USB_OTG_EMBEDDED_PHY; + +#ifdef USB_OTG_FS_SOF_OUTPUT_ENABLED + pdev->cfg.Sof_output = 1; +#endif + +#ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT + pdev->cfg.low_power = 1; +#endif + } + else if (coreID == USB_OTG_HS_CORE_ID) + { + baseAddress = USB_OTG_HS_BASE_ADDR; + pdev->cfg.coreID = USB_OTG_HS_CORE_ID; + pdev->cfg.host_channels = 12 ; + pdev->cfg.dev_endpoints = 6 ; + pdev->cfg.TotalFifoSize = 1280;/* in 32-bits */ + +#ifdef USB_OTG_ULPI_PHY_ENABLED + pdev->cfg.phy_itface = USB_OTG_ULPI_PHY; +#else +#ifdef USB_OTG_EMBEDDED_PHY_ENABLED + pdev->cfg.phy_itface = USB_OTG_EMBEDDED_PHY; +#endif +#endif + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + pdev->cfg.dma_enable = 1; +#endif + +#ifdef USB_OTG_HS_SOF_OUTPUT_ENABLED + pdev->cfg.Sof_output = 1; +#endif + +#ifdef USB_OTG_HS_LOW_PWR_MGMT_SUPPORT + pdev->cfg.low_power = 1; +#endif + + } + + pdev->regs.GREGS = (USB_OTG_GREGS *)(baseAddress + \ + USB_OTG_CORE_GLOBAL_REGS_OFFSET); + pdev->regs.DREGS = (USB_OTG_DREGS *) (baseAddress + \ + USB_OTG_DEV_GLOBAL_REG_OFFSET); + + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + pdev->regs.INEP_REGS[i] = (USB_OTG_INEPREGS *) \ + (baseAddress + USB_OTG_DEV_IN_EP_REG_OFFSET + \ + (i * USB_OTG_EP_REG_OFFSET)); + pdev->regs.OUTEP_REGS[i] = (USB_OTG_OUTEPREGS *) \ + (baseAddress + USB_OTG_DEV_OUT_EP_REG_OFFSET + \ + (i * USB_OTG_EP_REG_OFFSET)); + } + pdev->regs.HREGS = (USB_OTG_HREGS *)(baseAddress + \ + USB_OTG_HOST_GLOBAL_REG_OFFSET); + pdev->regs.HPRT0 = (uint32_t *)(baseAddress + USB_OTG_HOST_PORT_REGS_OFFSET); + + for (i = 0; i < pdev->cfg.host_channels; i++) + { + pdev->regs.HC_REGS[i] = (USB_OTG_HC_REGS *)(baseAddress + \ + USB_OTG_HOST_CHAN_REGS_OFFSET + \ + (i * USB_OTG_CHAN_REGS_OFFSET)); + } + for (i = 0; i < pdev->cfg.host_channels; i++) + { + pdev->regs.DFIFO[i] = (uint32_t *)(baseAddress + USB_OTG_DATA_FIFO_OFFSET +\ + (i * USB_OTG_DATA_FIFO_SIZE)); + } + pdev->regs.PCGCCTL = (uint32_t *)(baseAddress + USB_OTG_PCGCCTL_OFFSET); + + return status; +} + + +/** +* @brief USB_OTG_CoreInit +* Initializes the USB_OTG controller registers and prepares the core +* device mode or host mode operation. +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_CoreInit(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GUSBCFG_TypeDef usbcfg; + USB_OTG_GCCFG_TypeDef gccfg; + USB_OTG_GAHBCFG_TypeDef ahbcfg; + + usbcfg.d32 = 0; + gccfg.d32 = 0; + ahbcfg.d32 = 0; + + + + if (pdev->cfg.phy_itface == USB_OTG_ULPI_PHY) + { + gccfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GCCFG); + gccfg.b.pwdn = 0; + + if (pdev->cfg.Sof_output) + { + gccfg.b.sofouten = 1; + } + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GCCFG, gccfg.d32); + + /* Init The ULPI Interface */ + usbcfg.d32 = 0; + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + + usbcfg.b.physel = 0; /* HS Interface */ +#ifdef USB_OTG_INTERNAL_VBUS_ENABLED + usbcfg.b.ulpi_ext_vbus_drv = 0; /* Use internal VBUS */ +#else +#ifdef USB_OTG_EXTERNAL_VBUS_ENABLED + usbcfg.b.ulpi_ext_vbus_drv = 1; /* Use external VBUS */ +#endif +#endif + usbcfg.b.term_sel_dl_pulse = 0; /* Data line pulsing using utmi_txvalid */ + + usbcfg.b.ulpi_fsls = 0; + usbcfg.b.ulpi_clk_sus_m = 0; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + + /* Reset after a PHY select */ + USB_OTG_CoreReset(pdev); + + if(pdev->cfg.dma_enable == 1) + { + + ahbcfg.b.hburstlen = 5; /* 64 x 32-bits*/ + ahbcfg.b.dmaenable = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32); + + } + } + else /* FS interface (embedded Phy) */ + { + + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG);; + usbcfg.b.physel = 1; /* FS Interface */ + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + /* Reset after a PHY select and set Host mode */ + USB_OTG_CoreReset(pdev); + /* Deactivate the power down*/ + gccfg.d32 = 0; + gccfg.b.pwdn = 1; + + gccfg.b.vbussensingA = 1 ; + gccfg.b.vbussensingB = 1 ; +#ifndef VBUS_SENSING_ENABLED + gccfg.b.disablevbussensing = 1; +#endif + + if(pdev->cfg.Sof_output) + { + gccfg.b.sofouten = 1; + } + + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GCCFG, gccfg.d32); + USB_OTG_BSP_mDelay(20); + } + /* case the HS core is working in FS mode */ + if(pdev->cfg.dma_enable == 1) + { + + ahbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GAHBCFG); + ahbcfg.b.hburstlen = 5; /* 64 x 32-bits*/ + ahbcfg.b.dmaenable = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32); + + } + /* initialize OTG features */ +#ifdef USE_OTG_MODE + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + usbcfg.b.hnpcap = 1; + usbcfg.b.srpcap = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + USB_OTG_EnableCommonInt(pdev); +#endif + return status; +} +/** +* @brief USB_OTG_EnableGlobalInt +* Enables the controller's Global Int in the AHB Config reg +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EnableGlobalInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GAHBCFG_TypeDef ahbcfg; + + ahbcfg.d32 = 0; + ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */ + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GAHBCFG, 0, ahbcfg.d32); + return status; +} + + +/** +* @brief USB_OTG_DisableGlobalInt +* Enables the controller's Global Int in the AHB Config reg +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_DisableGlobalInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GAHBCFG_TypeDef ahbcfg; + ahbcfg.d32 = 0; + ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */ + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32, 0); + return status; +} + + +/** +* @brief USB_OTG_FlushTxFifo : Flush a Tx FIFO +* @param pdev : Selected device +* @param num : FO num +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_FlushTxFifo (USB_OTG_CORE_HANDLE *pdev , uint32_t num ) +{ + USB_OTG_STS status = USB_OTG_OK; + __IO USB_OTG_GRSTCTL_TypeDef greset; + + uint32_t count = 0; + greset.d32 = 0; + greset.b.txfflsh = 1; + greset.b.txfnum = num; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GRSTCTL, greset.d32 ); + do + { + greset.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + break; + } + } + while (greset.b.txfflsh == 1); + /* Wait for 3 PHY Clocks*/ + USB_OTG_BSP_uDelay(3); + return status; +} + + +/** +* @brief USB_OTG_FlushRxFifo : Flush a Rx FIFO +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_FlushRxFifo( USB_OTG_CORE_HANDLE *pdev ) +{ + USB_OTG_STS status = USB_OTG_OK; + __IO USB_OTG_GRSTCTL_TypeDef greset; + uint32_t count = 0; + + greset.d32 = 0; + greset.b.rxfflsh = 1; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GRSTCTL, greset.d32 ); + do + { + greset.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + break; + } + } + while (greset.b.rxfflsh == 1); + /* Wait for 3 PHY Clocks*/ + USB_OTG_BSP_uDelay(3); + return status; +} + + +/** +* @brief USB_OTG_SetCurrentMode : Set ID line +* @param pdev : Selected device +* @param mode : (Host/device) +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_SetCurrentMode(USB_OTG_CORE_HANDLE *pdev , uint8_t mode) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GUSBCFG_TypeDef usbcfg; + + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + + usbcfg.b.force_host = 0; + usbcfg.b.force_dev = 0; + + if ( mode == HOST_MODE) + { + usbcfg.b.force_host = 1; + } + else if ( mode == DEVICE_MODE) + { + usbcfg.b.force_dev = 1; + } + + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + USB_OTG_BSP_mDelay(50); + return status; +} + + +/** +* @brief USB_OTG_GetMode : Get current mode +* @param pdev : Selected device +* @retval current mode +*/ +uint32_t USB_OTG_GetMode(USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTSTS ) & 0x1); +} + + +/** +* @brief USB_OTG_IsDeviceMode : Check if it is device mode +* @param pdev : Selected device +* @retval num_in_ep +*/ +uint8_t USB_OTG_IsDeviceMode(USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_GetMode(pdev) != HOST_MODE); +} + + +/** +* @brief USB_OTG_IsHostMode : Check if it is host mode +* @param pdev : Selected device +* @retval num_in_ep +*/ +uint8_t USB_OTG_IsHostMode(USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_GetMode(pdev) == HOST_MODE); +} + + +/** +* @brief USB_OTG_ReadCoreItr : returns the Core Interrupt register +* @param pdev : Selected device +* @retval Status +*/ +uint32_t USB_OTG_ReadCoreItr(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t v = 0; + v = USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTSTS); + v &= USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTMSK); + return v; +} + + +/** +* @brief USB_OTG_ReadOtgItr : returns the USB_OTG Interrupt register +* @param pdev : Selected device +* @retval Status +*/ +uint32_t USB_OTG_ReadOtgItr (USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_READ_REG32 (&pdev->regs.GREGS->GOTGINT)); +} + +#ifdef USE_HOST_MODE +/** +* @brief USB_OTG_CoreInitHost : Initializes USB_OTG controller for host mode +* @param pdev : Selected device +* @retval status +*/ +USB_OTG_STS USB_OTG_CoreInitHost(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_FSIZ_TypeDef nptxfifosize; + USB_OTG_FSIZ_TypeDef ptxfifosize; + USB_OTG_HCFG_TypeDef hcfg; + +#ifdef USE_OTG_MODE + USB_OTG_OTGCTL_TypeDef gotgctl; +#endif + + uint32_t i = 0; + + nptxfifosize.d32 = 0; + ptxfifosize.d32 = 0; +#ifdef USE_OTG_MODE + gotgctl.d32 = 0; +#endif + hcfg.d32 = 0; + + + /* configure charge pump IO */ + USB_OTG_BSP_ConfigVBUS(pdev); + + /* Restart the Phy Clock */ + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, 0); + + /* Initialize Host Configuration Register */ + if (pdev->cfg.phy_itface == USB_OTG_ULPI_PHY) + { + USB_OTG_InitFSLSPClkSel(pdev , HCFG_30_60_MHZ); + } + else + { + USB_OTG_InitFSLSPClkSel(pdev , HCFG_48_MHZ); + } + USB_OTG_ResetPort(pdev); + + hcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HCFG); + hcfg.b.fslssupp = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HCFG, hcfg.d32); + + /* Configure data FIFO sizes */ + /* Rx FIFO */ +#ifdef USB_OTG_FS_CORE + if(pdev->cfg.coreID == USB_OTG_FS_CORE_ID) + { + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_FS_SIZE); + nptxfifosize.b.startaddr = RX_FIFO_FS_SIZE; + nptxfifosize.b.depth = TXH_NP_FS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32); + + ptxfifosize.b.startaddr = RX_FIFO_FS_SIZE + TXH_NP_FS_FIFOSIZ; + ptxfifosize.b.depth = TXH_P_FS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->HPTXFSIZ, ptxfifosize.d32); + } +#endif +#ifdef USB_OTG_HS_CORE + if (pdev->cfg.coreID == USB_OTG_HS_CORE_ID) + { + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_HS_SIZE); + nptxfifosize.b.startaddr = RX_FIFO_HS_SIZE; + nptxfifosize.b.depth = TXH_NP_HS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32); + + ptxfifosize.b.startaddr = RX_FIFO_HS_SIZE + TXH_NP_HS_FIFOSIZ; + ptxfifosize.b.depth = TXH_P_HS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->HPTXFSIZ, ptxfifosize.d32); + } +#endif + +#ifdef USE_OTG_MODE + /* Clear Host Set HNP Enable in the USB_OTG Control Register */ + gotgctl.b.hstsethnpen = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GOTGCTL, gotgctl.d32, 0); +#endif + + /* Make sure the FIFOs are flushed. */ + USB_OTG_FlushTxFifo(pdev, 0x10 ); /* all Tx FIFOs */ + USB_OTG_FlushRxFifo(pdev); + + + /* Clear all pending HC Interrupts */ + for (i = 0; i < pdev->cfg.host_channels; i++) + { + USB_OTG_WRITE_REG32( &pdev->regs.HC_REGS[i]->HCINT, 0xFFFFFFFF ); + USB_OTG_WRITE_REG32( &pdev->regs.HC_REGS[i]->HCINTMSK, 0 ); + } +#ifndef USE_OTG_MODE + USB_OTG_DriveVbus(pdev, 1); +#endif + + USB_OTG_EnableHostInt(pdev); + return status; +} + +/** +* @brief USB_OTG_IsEvenFrame +* This function returns the frame number for sof packet +* @param pdev : Selected device +* @retval Frame number +*/ +uint8_t USB_OTG_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev) +{ + return !(USB_OTG_READ_REG32(&pdev->regs.HREGS->HFNUM) & 0x1); +} + +/** +* @brief USB_OTG_DriveVbus : set/reset vbus +* @param pdev : Selected device +* @param state : VBUS state +* @retval None +*/ +void USB_OTG_DriveVbus (USB_OTG_CORE_HANDLE *pdev, uint8_t state) +{ + USB_OTG_HPRT0_TypeDef hprt0; + + hprt0.d32 = 0; + + /* enable disable the external charge pump */ + USB_OTG_BSP_DriveVBUS(pdev, state); + + /* Turn on the Host port power. */ + hprt0.d32 = USB_OTG_ReadHPRT0(pdev); + if ((hprt0.b.prtpwr == 0 ) && (state == 1 )) + { + hprt0.b.prtpwr = 1; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + } + if ((hprt0.b.prtpwr == 1 ) && (state == 0 )) + { + hprt0.b.prtpwr = 0; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + } + + USB_OTG_BSP_mDelay(200); +} +/** +* @brief USB_OTG_EnableHostInt: Enables the Host mode interrupts +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EnableHostInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GINTMSK_TypeDef intmsk; + intmsk.d32 = 0; + /* Disable all interrupts. */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTMSK, 0); + + /* Clear any pending interrupts. */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, 0xFFFFFFFF); + + /* Enable the common interrupts */ + USB_OTG_EnableCommonInt(pdev); + + if (pdev->cfg.dma_enable == 0) + { + intmsk.b.rxstsqlvl = 1; + } + intmsk.b.portintr = 1; + intmsk.b.hcintr = 1; + intmsk.b.disconnect = 1; + intmsk.b.sofintr = 1; + intmsk.b.incomplisoout = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GINTMSK, intmsk.d32, intmsk.d32); + return status; +} + +/** +* @brief USB_OTG_InitFSLSPClkSel : Initializes the FSLSPClkSel field of the +* HCFG register on the PHY type +* @param pdev : Selected device +* @param freq : clock frequency +* @retval None +*/ +void USB_OTG_InitFSLSPClkSel(USB_OTG_CORE_HANDLE *pdev , uint8_t freq) +{ + USB_OTG_HCFG_TypeDef hcfg; + + hcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HCFG); + hcfg.b.fslspclksel = freq; + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HCFG, hcfg.d32); +} + + +/** +* @brief USB_OTG_ReadHPRT0 : Reads HPRT0 to modify later +* @param pdev : Selected device +* @retval HPRT0 value +*/ +uint32_t USB_OTG_ReadHPRT0(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_HPRT0_TypeDef hprt0; + + hprt0.d32 = USB_OTG_READ_REG32(pdev->regs.HPRT0); + hprt0.b.prtena = 0; + hprt0.b.prtconndet = 0; + hprt0.b.prtenchng = 0; + hprt0.b.prtovrcurrchng = 0; + return hprt0.d32; +} + + +/** +* @brief USB_OTG_ReadHostAllChannels_intr : Register PCD Callbacks +* @param pdev : Selected device +* @retval Status +*/ +uint32_t USB_OTG_ReadHostAllChannels_intr (USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_READ_REG32 (&pdev->regs.HREGS->HAINT)); +} + + +/** +* @brief USB_OTG_ResetPort : Reset Host Port +* @param pdev : Selected device +* @retval status +* @note : (1)The application must wait at least 10 ms (+ 10 ms security) +* before clearing the reset bit. +*/ +uint32_t USB_OTG_ResetPort(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_HPRT0_TypeDef hprt0; + + hprt0.d32 = USB_OTG_ReadHPRT0(pdev); + hprt0.b.prtrst = 1; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + USB_OTG_BSP_mDelay (10); /* See Note #1 */ + hprt0.b.prtrst = 0; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + USB_OTG_BSP_mDelay (20); + return 1; +} + + +/** +* @brief USB_OTG_HC_Init : Prepares a host channel for transferring packets +* @param pdev : Selected device +* @param hc_num : channel number +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_HC_Init(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + uint32_t intr_enable = 0; + USB_OTG_HCINTMSK_TypeDef hcintmsk; + USB_OTG_GINTMSK_TypeDef gintmsk; + USB_OTG_HCCHAR_TypeDef hcchar; + USB_OTG_HCINTn_TypeDef hcint; + + + gintmsk.d32 = 0; + hcintmsk.d32 = 0; + hcchar.d32 = 0; + + /* Clear old interrupt conditions for this host channel. */ + hcint.d32 = 0xFFFFFFFF; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCINT, hcint.d32); + + /* Enable channel interrupts required for this transfer. */ + hcintmsk.d32 = 0; + + if (pdev->cfg.dma_enable == 1) + { + hcintmsk.b.ahberr = 1; + } + + switch (pdev->host.hc[hc_num].ep_type) + { + case EP_TYPE_CTRL: + case EP_TYPE_BULK: + hcintmsk.b.xfercompl = 1; + hcintmsk.b.stall = 1; + hcintmsk.b.xacterr = 1; + hcintmsk.b.datatglerr = 1; + hcintmsk.b.nak = 1; + if (pdev->host.hc[hc_num].ep_is_in) + { + hcintmsk.b.bblerr = 1; + } + else + { + hcintmsk.b.nyet = 1; + if (pdev->host.hc[hc_num].do_ping) + { + hcintmsk.b.ack = 1; + } + } + break; + case EP_TYPE_INTR: + hcintmsk.b.xfercompl = 1; + hcintmsk.b.nak = 1; + hcintmsk.b.stall = 1; + hcintmsk.b.xacterr = 1; + hcintmsk.b.datatglerr = 1; + hcintmsk.b.frmovrun = 1; + + if (pdev->host.hc[hc_num].ep_is_in) + { + hcintmsk.b.bblerr = 1; + } + + break; + case EP_TYPE_ISOC: + hcintmsk.b.xfercompl = 1; + hcintmsk.b.frmovrun = 1; + hcintmsk.b.ack = 1; + + if (pdev->host.hc[hc_num].ep_is_in) + { + hcintmsk.b.xacterr = 1; + hcintmsk.b.bblerr = 1; + } + break; + } + + + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCINTMSK, hcintmsk.d32); + + + /* Enable the top level host channel interrupt. */ + intr_enable = (1 << hc_num); + USB_OTG_MODIFY_REG32(&pdev->regs.HREGS->HAINTMSK, 0, intr_enable); + + /* Make sure host channel interrupts are enabled. */ + gintmsk.b.hcintr = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GINTMSK, 0, gintmsk.d32); + + /* Program the HCCHAR register */ + hcchar.d32 = 0; + hcchar.b.devaddr = pdev->host.hc[hc_num].dev_addr; + hcchar.b.epnum = pdev->host.hc[hc_num].ep_num; + hcchar.b.epdir = pdev->host.hc[hc_num].ep_is_in; + hcchar.b.lspddev = (pdev->host.hc[hc_num].speed == HPRT0_PRTSPD_LOW_SPEED); + hcchar.b.eptype = pdev->host.hc[hc_num].ep_type; + hcchar.b.mps = pdev->host.hc[hc_num].max_packet; + if (pdev->host.hc[hc_num].ep_type == HCCHAR_INTR) + { + hcchar.b.oddfrm = 1; + } + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + return status; +} + + +/** +* @brief USB_OTG_HC_StartXfer : Start transfer +* @param pdev : Selected device +* @param hc_num : channel number +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_HC_StartXfer(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_HCCHAR_TypeDef hcchar; + USB_OTG_HCTSIZn_TypeDef hctsiz; + USB_OTG_HNPTXSTS_TypeDef hnptxsts; + USB_OTG_HPTXSTS_TypeDef hptxsts; + USB_OTG_GINTMSK_TypeDef intmsk; + uint16_t len_words = 0; + + uint16_t num_packets; + uint16_t max_hc_pkt_count; + + max_hc_pkt_count = 256; + hctsiz.d32 = 0; + hcchar.d32 = 0; + intmsk.d32 = 0; + + /* Compute the expected number of packets associated to the transfer */ + if (pdev->host.hc[hc_num].xfer_len > 0) + { + num_packets = (pdev->host.hc[hc_num].xfer_len + \ + pdev->host.hc[hc_num].max_packet - 1) / pdev->host.hc[hc_num].max_packet; + + if (num_packets > max_hc_pkt_count) + { + num_packets = max_hc_pkt_count; + pdev->host.hc[hc_num].xfer_len = num_packets * \ + pdev->host.hc[hc_num].max_packet; + } + } + else + { + num_packets = 1; + } + if (pdev->host.hc[hc_num].ep_is_in) + { + pdev->host.hc[hc_num].xfer_len = num_packets * \ + pdev->host.hc[hc_num].max_packet; + } + /* Initialize the HCTSIZn register */ + hctsiz.b.xfersize = pdev->host.hc[hc_num].xfer_len; + hctsiz.b.pktcnt = num_packets; + hctsiz.b.pid = pdev->host.hc[hc_num].data_pid; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCTSIZ, hctsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCDMA, (unsigned int)pdev->host.hc[hc_num].xfer_buff); + } + + + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR); + hcchar.b.oddfrm = USB_OTG_IsEvenFrame(pdev); + + /* Set host channel enable */ + hcchar.b.chen = 1; + hcchar.b.chdis = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + + if (pdev->cfg.dma_enable == 0) /* Slave mode */ + { + if((pdev->host.hc[hc_num].ep_is_in == 0) && + (pdev->host.hc[hc_num].xfer_len > 0)) + { + switch(pdev->host.hc[hc_num].ep_type) + { + /* Non periodic transfer */ + case EP_TYPE_CTRL: + case EP_TYPE_BULK: + + hnptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->HNPTXSTS); + len_words = (pdev->host.hc[hc_num].xfer_len + 3) / 4; + + /* check if there is enough space in FIFO space */ + if(len_words > hnptxsts.b.nptxfspcavail) + { + /* need to process data in nptxfempty interrupt */ + intmsk.b.nptxfempty = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, intmsk.d32); + } + + break; + /* Periodic transfer */ + case EP_TYPE_INTR: + case EP_TYPE_ISOC: + hptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HPTXSTS); + len_words = (pdev->host.hc[hc_num].xfer_len + 3) / 4; + /* check if there is enough space in FIFO space */ + if(len_words > hptxsts.b.ptxfspcavail) /* split the transfer */ + { + /* need to process data in ptxfempty interrupt */ + intmsk.b.ptxfempty = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, intmsk.d32); + } + break; + + default: + break; + } + + /* Write packet into the Tx FIFO. */ + USB_OTG_WritePacket(pdev, + pdev->host.hc[hc_num].xfer_buff , + hc_num, pdev->host.hc[hc_num].xfer_len); + } + } + return status; +} + + +/** +* @brief USB_OTG_HC_Halt : Halt channel +* @param pdev : Selected device +* @param hc_num : channel number +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_HC_Halt(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_HNPTXSTS_TypeDef nptxsts; + USB_OTG_HPTXSTS_TypeDef hptxsts; + USB_OTG_HCCHAR_TypeDef hcchar; + + nptxsts.d32 = 0; + hptxsts.d32 = 0; + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR); + hcchar.b.chen = 1; + hcchar.b.chdis = 1; + + /* Check for space in the request queue to issue the halt. */ + if (hcchar.b.eptype == HCCHAR_CTRL || hcchar.b.eptype == HCCHAR_BULK) + { + nptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->HNPTXSTS); + if (nptxsts.b.nptxqspcavail == 0) + { + hcchar.b.chen = 0; + } + } + else + { + hptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HPTXSTS); + if (hptxsts.b.ptxqspcavail == 0) + { + hcchar.b.chen = 0; + } + } + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + return status; +} + +/** +* @brief Issue a ping token +* @param None +* @retval : None +*/ +USB_OTG_STS USB_OTG_HC_DoPing(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_HCCHAR_TypeDef hcchar; + USB_OTG_HCTSIZn_TypeDef hctsiz; + + hctsiz.d32 = 0; + hctsiz.b.dopng = 1; + hctsiz.b.pktcnt = 1; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCTSIZ, hctsiz.d32); + + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR); + hcchar.b.chen = 1; + hcchar.b.chdis = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + return status; +} + +/** +* @brief Stop the device and clean up fifo's +* @param None +* @retval : None +*/ +void USB_OTG_StopHost(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_HCCHAR_TypeDef hcchar; + uint32_t i; + + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HAINTMSK , 0); + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HAINT, 0xFFFFFFFF); + /* Flush out any leftover queued requests. */ + + for (i = 0; i < pdev->cfg.host_channels; i++) + { + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[i]->HCCHAR); + hcchar.b.chen = 0; + hcchar.b.chdis = 1; + hcchar.b.epdir = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[i]->HCCHAR, hcchar.d32); + } + + /* Flush the FIFO */ + USB_OTG_FlushRxFifo(pdev); + USB_OTG_FlushTxFifo(pdev , 0x10 ); +} +#endif +#ifdef USE_DEVICE_MODE +/* PCD Core Layer */ + +/** +* @brief USB_OTG_InitDevSpeed :Initializes the DevSpd field of DCFG register +* depending the PHY type and the enumeration speed of the device. +* @param pdev : Selected device +* @retval : None +*/ +void USB_OTG_InitDevSpeed(USB_OTG_CORE_HANDLE *pdev , uint8_t speed) +{ + USB_OTG_DCFG_TypeDef dcfg; + + dcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCFG); + dcfg.b.devspd = speed; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCFG, dcfg.d32); +} + + +/** +* @brief USB_OTG_CoreInitDev : Initializes the USB_OTG controller registers +* for device mode +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_CoreInitDev (USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + uint32_t i; + USB_OTG_DCFG_TypeDef dcfg; + USB_OTG_FSIZ_TypeDef nptxfifosize; + USB_OTG_FSIZ_TypeDef txfifosize; + USB_OTG_DIEPMSK_TypeDef msk; + USB_OTG_DTHRCTL_TypeDef dthrctl; + + depctl.d32 = 0; + dcfg.d32 = 0; + nptxfifosize.d32 = 0; + txfifosize.d32 = 0; + msk.d32 = 0; + + /* Restart the Phy Clock */ + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, 0); + /* Device configuration register */ + dcfg.d32 = USB_OTG_READ_REG32( &pdev->regs.DREGS->DCFG); + dcfg.b.perfrint = DCFG_FRAME_INTERVAL_80; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DCFG, dcfg.d32 ); + +#ifdef USB_OTG_FS_CORE + if(pdev->cfg.coreID == USB_OTG_FS_CORE_ID ) + { + + /* Set Full speed phy */ + USB_OTG_InitDevSpeed (pdev , USB_OTG_SPEED_PARAM_FULL); + + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_FS_SIZE); + + /* EP0 TX*/ + nptxfifosize.b.depth = TX0_FIFO_FS_SIZE; + nptxfifosize.b.startaddr = RX_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32 ); + + + /* EP1 TX*/ + txfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth; + txfifosize.b.depth = TX1_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[0], txfifosize.d32 ); + + + /* EP2 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX2_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[1], txfifosize.d32 ); + + + /* EP3 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX3_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[2], txfifosize.d32 ); + } +#endif +#ifdef USB_OTG_HS_CORE + if(pdev->cfg.coreID == USB_OTG_HS_CORE_ID ) + { + + /* Set High speed phy */ + + if(pdev->cfg.phy_itface == USB_OTG_ULPI_PHY) + { + USB_OTG_InitDevSpeed (pdev , USB_OTG_SPEED_PARAM_HIGH); + } + else /* set High speed phy in Full speed mode */ + { + USB_OTG_InitDevSpeed (pdev , USB_OTG_SPEED_PARAM_HIGH_IN_FULL); + } + + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_HS_SIZE); + + /* EP0 TX*/ + nptxfifosize.b.depth = TX0_FIFO_HS_SIZE; + nptxfifosize.b.startaddr = RX_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32 ); + + + /* EP1 TX*/ + txfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth; + txfifosize.b.depth = TX1_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[0], txfifosize.d32 ); + + + /* EP2 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX2_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[1], txfifosize.d32 ); + + + /* EP3 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX3_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[2], txfifosize.d32 ); + + /* EP4 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX4_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[3], txfifosize.d32 ); + + + /* EP5 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX5_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[4], txfifosize.d32 ); + } +#endif + /* Flush the FIFOs */ + USB_OTG_FlushTxFifo(pdev , 0x10); /* all Tx FIFOs */ + USB_OTG_FlushRxFifo(pdev); + /* Clear all pending Device Interrupts */ + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, 0 ); + + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[i]->DIEPCTL); + if (depctl.b.epena) + { + depctl.d32 = 0; + depctl.b.epdis = 1; + depctl.b.snak = 1; + } + else + { + depctl.d32 = 0; + } + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPCTL, depctl.d32); + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPTSIZ, 0); + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF); + } + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + USB_OTG_DEPCTL_TypeDef depctl; + depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[i]->DOEPCTL); + if (depctl.b.epena) + { + depctl.d32 = 0; + depctl.b.epdis = 1; + depctl.b.snak = 1; + } + else + { + depctl.d32 = 0; + } + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPCTL, depctl.d32); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPTSIZ, 0); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF); + } + msk.d32 = 0; + msk.b.txfifoundrn = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPMSK, msk.d32, msk.d32); + + if (pdev->cfg.dma_enable == 1) + { + dthrctl.d32 = 0; + dthrctl.b.non_iso_thr_en = 1; + dthrctl.b.iso_thr_en = 1; + dthrctl.b.tx_thr_len = 64; + dthrctl.b.rx_thr_en = 1; + dthrctl.b.rx_thr_len = 64; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DTHRCTL, dthrctl.d32); + } + USB_OTG_EnableDevInt(pdev); + return status; +} + + +/** +* @brief USB_OTG_EnableDevInt : Enables the Device mode interrupts +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EnableDevInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GINTMSK_TypeDef intmsk; + + intmsk.d32 = 0; + + /* Disable all interrupts. */ + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTMSK, 0); + /* Clear any pending interrupts */ + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, 0xBFFFFFFF); + /* Enable the common interrupts */ + USB_OTG_EnableCommonInt(pdev); + + if (pdev->cfg.dma_enable == 0) + { + intmsk.b.rxstsqlvl = 1; + } + + /* Enable interrupts matching to the Device mode ONLY */ + intmsk.b.usbsuspend = 1; + intmsk.b.usbreset = 1; + intmsk.b.enumdone = 1; + intmsk.b.inepintr = 1; + intmsk.b.outepintr = 1; + intmsk.b.sofintr = 1; + + intmsk.b.incomplisoin = 1; + intmsk.b.incomplisoout = 1; +#ifdef VBUS_SENSING_ENABLED + intmsk.b.sessreqintr = 1; + intmsk.b.otgintr = 1; +#endif + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, intmsk.d32, intmsk.d32); + return status; +} + + +/** +* @brief USB_OTG_GetDeviceSpeed +* Get the device speed from the device status register +* @param None +* @retval status +*/ +enum USB_OTG_SPEED USB_OTG_GetDeviceSpeed (USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DSTS_TypeDef dsts; + enum USB_OTG_SPEED speed = USB_SPEED_UNKNOWN; + + + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + switch (dsts.b.enumspd) + { + case DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ: + speed = USB_SPEED_HIGH; + break; + case DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ: + case DSTS_ENUMSPD_FS_PHY_48MHZ: + speed = USB_SPEED_FULL; + break; + + case DSTS_ENUMSPD_LS_PHY_6MHZ: + speed = USB_SPEED_LOW; + break; + } + + return speed; +} +/** +* @brief enables EP0 OUT to receive SETUP packets and configures EP0 +* for transmitting packets +* @param None +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EP0Activate(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DSTS_TypeDef dsts; + USB_OTG_DEPCTL_TypeDef diepctl; + USB_OTG_DCTL_TypeDef dctl; + + dctl.d32 = 0; + /* Read the Device Status and Endpoint 0 Control registers */ + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + diepctl.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[0]->DIEPCTL); + /* Set the MPS of the IN EP based on the enumeration speed */ + switch (dsts.b.enumspd) + { + case DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ: + case DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ: + case DSTS_ENUMSPD_FS_PHY_48MHZ: + diepctl.b.mps = DEP0CTL_MPS_64; + break; + case DSTS_ENUMSPD_LS_PHY_6MHZ: + diepctl.b.mps = DEP0CTL_MPS_8; + break; + } + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[0]->DIEPCTL, diepctl.d32); + dctl.b.cgnpinnak = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, dctl.d32); + return status; +} + + +/** +* @brief USB_OTG_EPActivate : Activates an EP +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPActivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DAINT_TypeDef daintmsk; + __IO uint32_t *addr; + + + depctl.d32 = 0; + daintmsk.d32 = 0; + /* Read DEPCTLn register */ + if (ep->is_in == 1) + { + addr = &pdev->regs.INEP_REGS[ep->num]->DIEPCTL; + daintmsk.ep.in = 1 << ep->num; + } + else + { + addr = &pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL; + daintmsk.ep.out = 1 << ep->num; + } + /* If the EP is already active don't change the EP Control + * register. */ + depctl.d32 = USB_OTG_READ_REG32(addr); + if (!depctl.b.usbactep) + { + depctl.b.mps = ep->maxpacket; + depctl.b.eptype = ep->type; + depctl.b.txfnum = ep->tx_fifo_num; + depctl.b.setd0pid = 1; + depctl.b.usbactep = 1; + USB_OTG_WRITE_REG32(addr, depctl.d32); + } + /* Enable the Interrupt for this EP */ +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + if((ep->num == 1)&&(pdev->cfg.coreID == USB_OTG_HS_CORE_ID)) + { + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DEACHMSK, 0, daintmsk.d32); + } + else +#endif + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DAINTMSK, 0, daintmsk.d32); + return status; +} + + +/** +* @brief USB_OTG_EPDeactivate : Deactivates an EP +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPDeactivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DAINT_TypeDef daintmsk; + __IO uint32_t *addr; + + depctl.d32 = 0; + daintmsk.d32 = 0; + /* Read DEPCTLn register */ + if (ep->is_in == 1) + { + addr = &pdev->regs.INEP_REGS[ep->num]->DIEPCTL; + daintmsk.ep.in = 1 << ep->num; + } + else + { + addr = &pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL; + daintmsk.ep.out = 1 << ep->num; + } + depctl.b.usbactep = 0; + USB_OTG_WRITE_REG32(addr, depctl.d32); + /* Disable the Interrupt for this EP */ + +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + if((ep->num == 1)&&(pdev->cfg.coreID == USB_OTG_HS_CORE_ID)) + { + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DEACHMSK, daintmsk.d32, 0); + } + else +#endif + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DAINTMSK, daintmsk.d32, 0); + return status; +} + + +/** +* @brief USB_OTG_EPStartXfer : Handle the setup for data xfer for an EP and +* starts the xfer +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPStartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DEPXFRSIZ_TypeDef deptsiz; + USB_OTG_DSTS_TypeDef dsts; + uint32_t fifoemptymsk = 0; + + depctl.d32 = 0; + deptsiz.d32 = 0; + /* IN endpoint */ + if (ep->is_in == 1) + { + depctl.d32 = USB_OTG_READ_REG32(&(pdev->regs.INEP_REGS[ep->num]->DIEPCTL)); + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.INEP_REGS[ep->num]->DIEPTSIZ)); + /* Zero Length Packet? */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = 0; + deptsiz.b.pktcnt = 1; + } + else + { + /* Program the transfer size and packet count + * as follows: xfersize = N * maxpacket + + * short_packet pktcnt = N + (short_packet + * exist ? 1 : 0) + */ + deptsiz.b.xfersize = ep->xfer_len; + deptsiz.b.pktcnt = (ep->xfer_len - 1 + ep->maxpacket) / ep->maxpacket; + + if (ep->type == EP_TYPE_ISOC) + { + deptsiz.b.mc = 1; + } + } + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPTSIZ, deptsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPDMA, ep->dma_addr); + } + else + { + if (ep->type != EP_TYPE_ISOC) + { + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0) + { + fifoemptymsk = 1 << ep->num; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, 0, fifoemptymsk); + } + } + } + + + if (ep->type == EP_TYPE_ISOC) + { + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + if (((dsts.b.soffn)&0x1) == 0) + { + depctl.b.setd1pid = 1; + } + else + { + depctl.b.setd0pid = 1; + } + } + + /* EP enable, IN data in FIFO */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPCTL, depctl.d32); + + if (ep->type == EP_TYPE_ISOC) + { + USB_OTG_WritePacket(pdev, ep->xfer_buff, ep->num, ep->xfer_len); + } + } + else + { + /* OUT endpoint */ + depctl.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL)); + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ)); + /* Program the transfer size and packet count as follows: + * pktcnt = N + * xfersize = N * maxpacket + */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = ep->maxpacket; + deptsiz.b.pktcnt = 1; + } + else + { + deptsiz.b.pktcnt = (ep->xfer_len + (ep->maxpacket - 1)) / ep->maxpacket; + deptsiz.b.xfersize = deptsiz.b.pktcnt * ep->maxpacket; + } + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ, deptsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPDMA, ep->dma_addr); + } + + if (ep->type == EP_TYPE_ISOC) + { + if (ep->even_odd_frame) + { + depctl.b.setd1pid = 1; + } + else + { + depctl.b.setd0pid = 1; + } + } + /* EP enable */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL, depctl.d32); + } + return status; +} + + +/** +* @brief USB_OTG_EP0StartXfer : Handle the setup for a data xfer for EP0 and +* starts the xfer +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EP0StartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DEP0XFRSIZ_TypeDef deptsiz; + USB_OTG_INEPREGS *in_regs; + uint32_t fifoemptymsk = 0; + + depctl.d32 = 0; + deptsiz.d32 = 0; + /* IN endpoint */ + if (ep->is_in == 1) + { + in_regs = pdev->regs.INEP_REGS[0]; + depctl.d32 = USB_OTG_READ_REG32(&in_regs->DIEPCTL); + deptsiz.d32 = USB_OTG_READ_REG32(&in_regs->DIEPTSIZ); + /* Zero Length Packet? */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = 0; + deptsiz.b.pktcnt = 1; + + } + else + { + if (ep->xfer_len > ep->maxpacket) + { + ep->xfer_len = ep->maxpacket; + deptsiz.b.xfersize = ep->maxpacket; + } + else + { + deptsiz.b.xfersize = ep->xfer_len; + } + deptsiz.b.pktcnt = 1; + } + USB_OTG_WRITE_REG32(&in_regs->DIEPTSIZ, deptsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPDMA, ep->dma_addr); + } + + /* EP enable, IN data in FIFO */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32(&in_regs->DIEPCTL, depctl.d32); + + + + if (pdev->cfg.dma_enable == 0) + { + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0) + { + { + fifoemptymsk |= 1 << ep->num; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, 0, fifoemptymsk); + } + } + } + } + else + { + /* OUT endpoint */ + depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + deptsiz.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ); + /* Program the transfer size and packet count as follows: + * xfersize = N * (maxpacket + 4 - (maxpacket % 4)) + * pktcnt = N */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = ep->maxpacket; + deptsiz.b.pktcnt = 1; + } + else + { + ep->xfer_len = ep->maxpacket; + deptsiz.b.xfersize = ep->maxpacket; + deptsiz.b.pktcnt = 1; + } + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ, deptsiz.d32); + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPDMA, ep->dma_addr); + } + /* EP enable */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32 (&(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL), depctl.d32); + + } + return status; +} + + +/** +* @brief USB_OTG_EPSetStall : Set the EP STALL +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPSetStall(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + + depctl.d32 = 0; + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + /* set the disable and stall bits */ + if (depctl.b.epena) + { + depctl.b.epdis = 1; + } + depctl.b.stall = 1; + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); + } + else + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + /* set the stall bit */ + depctl.b.stall = 1; + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); + } + return status; +} + + +/** +* @brief Clear the EP STALL +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPClearStall(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + + depctl.d32 = 0; + + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + } + else + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + } + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + /* clear the stall bits */ + depctl.b.stall = 0; + if (ep->type == EP_TYPE_INTR || ep->type == EP_TYPE_BULK) + { + depctl.b.setd0pid = 1; /* DATA0 */ + } + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); + return status; +} + + +/** +* @brief USB_OTG_ReadDevAllOutEp_itr : returns OUT endpoint interrupt bits +* @param pdev : Selected device +* @retval OUT endpoint interrupt bits +*/ +uint32_t USB_OTG_ReadDevAllOutEp_itr(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t v; + v = USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINT); + v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINTMSK); + return ((v & 0xffff0000) >> 16); +} + + +/** +* @brief USB_OTG_ReadDevOutEP_itr : returns Device OUT EP Interrupt register +* @param pdev : Selected device +* @param ep : end point number +* @retval Device OUT EP Interrupt register +*/ +uint32_t USB_OTG_ReadDevOutEP_itr(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + uint32_t v; + v = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[epnum]->DOEPINT); + v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DOEPMSK); + return v; +} + + +/** +* @brief USB_OTG_ReadDevAllInEPItr : Get int status register +* @param pdev : Selected device +* @retval int status register +*/ +uint32_t USB_OTG_ReadDevAllInEPItr(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t v; + v = USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINT); + v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINTMSK); + return (v & 0xffff); +} + +/** +* @brief configures EPO to receive SETUP packets +* @param None +* @retval : None +*/ +void USB_OTG_EP0_OutStart(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DEP0XFRSIZ_TypeDef doeptsize0; + doeptsize0.d32 = 0; + doeptsize0.b.supcnt = 3; + doeptsize0.b.pktcnt = 1; + doeptsize0.b.xfersize = 8 * 3; + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPTSIZ, doeptsize0.d32 ); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_DEPCTL_TypeDef doepctl; + doepctl.d32 = 0; + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPDMA, + (uint32_t)&pdev->dev.setup_packet); + + /* EP enable */ + doepctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[0]->DOEPCTL); + doepctl.b.epena = 1; + doepctl.d32 = 0x80008000; + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPCTL, doepctl.d32); + } +} + +/** +* @brief USB_OTG_RemoteWakeup : active remote wakeup signalling +* @param None +* @retval : None +*/ +void USB_OTG_ActiveRemoteWakeup(USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_DCTL_TypeDef dctl; + USB_OTG_DSTS_TypeDef dsts; + USB_OTG_PCGCCTL_TypeDef power; + + if (pdev->dev.DevRemoteWakeup) + { + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + if(dsts.b.suspsts == 1) + { + if(pdev->cfg.low_power) + { + /* un-gate USB Core clock */ + power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL); + power.b.gatehclk = 0; + power.b.stoppclk = 0; + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32); + } + /* active Remote wakeup signaling */ + dctl.d32 = 0; + dctl.b.rmtwkupsig = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, 0, dctl.d32); + USB_OTG_BSP_mDelay(5); + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, 0 ); + } + } +} + + +/** +* @brief USB_OTG_UngateClock : active USB Core clock +* @param None +* @retval : None +*/ +void USB_OTG_UngateClock(USB_OTG_CORE_HANDLE *pdev) +{ + if(pdev->cfg.low_power) + { + + USB_OTG_DSTS_TypeDef dsts; + USB_OTG_PCGCCTL_TypeDef power; + + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + if(dsts.b.suspsts == 1) + { + /* un-gate USB Core clock */ + power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL); + power.b.gatehclk = 0; + power.b.stoppclk = 0; + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32); + + } + } +} + +/** +* @brief Stop the device and clean up fifo's +* @param None +* @retval : None +*/ +void USB_OTG_StopDevice(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t i; + + pdev->dev.device_status = 1; + + for (i = 0; i < pdev->cfg.dev_endpoints ; i++) + { + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF); + } + + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF ); + + /* Flush the FIFO */ + USB_OTG_FlushRxFifo(pdev); + USB_OTG_FlushTxFifo(pdev , 0x10 ); +} + +/** +* @brief returns the EP Status +* @param pdev : Selected device +* ep : endpoint structure +* @retval : EP status +*/ + +uint32_t USB_OTG_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,USB_OTG_EP *ep) +{ + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + uint32_t Status = 0; + + depctl.d32 = 0; + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + if (depctl.b.stall == 1) + Status = USB_OTG_EP_TX_STALL; + else if (depctl.b.naksts == 1) + Status = USB_OTG_EP_TX_NAK; + else + Status = USB_OTG_EP_TX_VALID; + + } + else + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + if (depctl.b.stall == 1) + Status = USB_OTG_EP_RX_STALL; + else if (depctl.b.naksts == 1) + Status = USB_OTG_EP_RX_NAK; + else + Status = USB_OTG_EP_RX_VALID; + } + + /* Return the current status */ + return Status; +} + +/** +* @brief Set the EP Status +* @param pdev : Selected device +* Status : new Status +* ep : EP structure +* @retval : None +*/ +void USB_OTG_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep , uint32_t Status) +{ + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + + depctl.d32 = 0; + + /* Process for IN endpoint */ + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + if (Status == USB_OTG_EP_TX_STALL) + { + USB_OTG_EPSetStall(pdev, ep); return; + } + else if (Status == USB_OTG_EP_TX_NAK) + depctl.b.snak = 1; + else if (Status == USB_OTG_EP_TX_VALID) + { + if (depctl.b.stall == 1) + { + ep->even_odd_frame = 0; + USB_OTG_EPClearStall(pdev, ep); + return; + } + depctl.b.cnak = 1; + depctl.b.usbactep = 1; + depctl.b.epena = 1; + } + else if (Status == USB_OTG_EP_TX_DIS) + depctl.b.usbactep = 0; + } + else /* Process for OUT endpoint */ + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + if (Status == USB_OTG_EP_RX_STALL) { + depctl.b.stall = 1; + } + else if (Status == USB_OTG_EP_RX_NAK) + depctl.b.snak = 1; + else if (Status == USB_OTG_EP_RX_VALID) + { + if (depctl.b.stall == 1) + { + ep->even_odd_frame = 0; + USB_OTG_EPClearStall(pdev, ep); + return; + } + depctl.b.cnak = 1; + depctl.b.usbactep = 1; + depctl.b.epena = 1; + } + else if (Status == USB_OTG_EP_RX_DIS) + { + depctl.b.usbactep = 0; + } + } + + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); +} + +#endif +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/src/usb_dcd.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/src/usb_dcd.c new file mode 100644 index 00000000..eac8c337 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/src/usb_dcd.c @@ -0,0 +1,478 @@ +/** + ****************************************************************************** + * @file usb_dcd.c + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Peripheral Device Interface Layer + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd.h" +#include "usb_bsp.h" + + +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_DCD +* @brief This file is the interface between EFSL ans Host mass-storage class +* @{ +*/ + + +/** @defgroup USB_DCD_Private_Defines +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + + +/** @defgroup USB_DCD_Private_Macros +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_Variables +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_FunctionPrototypes +* @{ +*/ + +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_Functions +* @{ +*/ + + + +void DCD_Init(USB_OTG_CORE_HANDLE *pdev , + USB_OTG_CORE_ID_TypeDef coreID) +{ + uint32_t i; + USB_OTG_EP *ep; + + USB_OTG_SelectCore (pdev , coreID); + + pdev->dev.device_status = USB_OTG_DEFAULT; + pdev->dev.device_address = 0; + + /* Init ep structure */ + for (i = 0; i < pdev->cfg.dev_endpoints ; i++) + { + ep = &pdev->dev.in_ep[i]; + /* Init ep structure */ + ep->is_in = 1; + ep->num = i; + ep->tx_fifo_num = i; + /* Control until ep is actvated */ + ep->type = EP_TYPE_CTRL; + ep->maxpacket = USB_OTG_MAX_EP0_SIZE; + ep->xfer_buff = 0; + ep->xfer_len = 0; + } + + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + ep = &pdev->dev.out_ep[i]; + /* Init ep structure */ + ep->is_in = 0; + ep->num = i; + ep->tx_fifo_num = i; + /* Control until ep is activated */ + ep->type = EP_TYPE_CTRL; + ep->maxpacket = USB_OTG_MAX_EP0_SIZE; + ep->xfer_buff = 0; + ep->xfer_len = 0; + } + + USB_OTG_DisableGlobalInt(pdev); + + /*Init the Core (common init.) */ + USB_OTG_CoreInit(pdev); + + + /* Force Device Mode*/ + USB_OTG_SetCurrentMode(pdev, DEVICE_MODE); + + /* Init Device */ + USB_OTG_CoreInitDev(pdev); + + + /* Enable USB Global interrupt */ + USB_OTG_EnableGlobalInt(pdev); +} + + +/** +* @brief Configure an EP +* @param pdev : Device instance +* @param epdesc : Endpoint Descriptor +* @retval : status +*/ +uint32_t DCD_EP_Open(USB_OTG_CORE_HANDLE *pdev , + uint8_t ep_addr, + uint16_t ep_mps, + uint8_t ep_type) +{ + USB_OTG_EP *ep; + + if ((ep_addr & 0x80) == 0x80) + { + ep = &pdev->dev.in_ep[ep_addr & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[ep_addr & 0x7F]; + } + ep->num = ep_addr & 0x7F; + + ep->is_in = (0x80 & ep_addr) != 0; + ep->maxpacket = ep_mps; + ep->type = ep_type; + if (ep->is_in) + { + /* Assign a Tx FIFO */ + ep->tx_fifo_num = ep->num; + } + /* Set initial data PID. */ + if (ep_type == USB_OTG_EP_BULK ) + { + ep->data_pid_start = 0; + } + USB_OTG_EPActivate(pdev , ep ); + return 0; +} +/** +* @brief called when an EP is disabled +* @param pdev: device instance +* @param ep_addr: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_Close(USB_OTG_CORE_HANDLE *pdev , uint8_t ep_addr) +{ + USB_OTG_EP *ep; + + if ((ep_addr&0x80) == 0x80) + { + ep = &pdev->dev.in_ep[ep_addr & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[ep_addr & 0x7F]; + } + ep->num = ep_addr & 0x7F; + ep->is_in = (0x80 & ep_addr) != 0; + USB_OTG_EPDeactivate(pdev , ep ); + return 0; +} + + +/** +* @brief DCD_EP_PrepareRx +* @param pdev: device instance +* @param ep_addr: endpoint address +* @param pbuf: pointer to Rx buffer +* @param buf_len: data length +* @retval : status +*/ +uint32_t DCD_EP_PrepareRx( USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint16_t buf_len) +{ + USB_OTG_EP *ep; + + ep = &pdev->dev.out_ep[ep_addr & 0x7F]; + + /*setup and start the Xfer */ + ep->xfer_buff = pbuf; + ep->xfer_len = buf_len; + ep->xfer_count = 0; + ep->is_in = 0; + ep->num = ep_addr & 0x7F; + + if (pdev->cfg.dma_enable == 1) + { + ep->dma_addr = (uint32_t)pbuf; + } + + if ( ep->num == 0 ) + { + USB_OTG_EP0StartXfer(pdev , ep); + } + else + { + USB_OTG_EPStartXfer(pdev, ep ); + } + return 0; +} + +/** +* @brief Transmit data over USB +* @param pdev: device instance +* @param ep_addr: endpoint address +* @param pbuf: pointer to Tx buffer +* @param buf_len: data length +* @retval : status +*/ +uint32_t DCD_EP_Tx ( USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint32_t buf_len) +{ + USB_OTG_EP *ep; + + ep = &pdev->dev.in_ep[ep_addr & 0x7F]; + + /* Setup and start the Transfer */ + ep->is_in = 1; + ep->num = ep_addr & 0x7F; + ep->xfer_buff = pbuf; + ep->dma_addr = (uint32_t)pbuf; + ep->xfer_count = 0; + ep->xfer_len = buf_len; + + if ( ep->num == 0 ) + { + USB_OTG_EP0StartXfer(pdev , ep); + } + else + { + USB_OTG_EPStartXfer(pdev, ep ); + } + return 0; +} + + +/** +* @brief Stall an endpoint. +* @param pdev: device instance +* @param epnum: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_Stall (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum) +{ + USB_OTG_EP *ep; + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + ep->is_stall = 1; + ep->num = epnum & 0x7F; + ep->is_in = ((epnum & 0x80) == 0x80); + + USB_OTG_EPSetStall(pdev , ep); + return (0); +} + + +/** +* @brief Clear stall condition on endpoints. +* @param pdev: device instance +* @param epnum: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_ClrStall (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum) +{ + USB_OTG_EP *ep; + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + ep->is_stall = 0; + ep->num = epnum & 0x7F; + ep->is_in = ((epnum & 0x80) == 0x80); + + USB_OTG_EPClearStall(pdev , ep); + return (0); +} + + +/** +* @brief This Function flushes the FIFOs. +* @param pdev: device instance +* @param epnum: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_Flush (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + + if ((epnum & 0x80) == 0x80) + { + USB_OTG_FlushTxFifo(pdev, epnum & 0x7F); + } + else + { + USB_OTG_FlushRxFifo(pdev); + } + + return (0); +} + + +/** +* @brief This Function set USB device address +* @param pdev: device instance +* @param address: new device address +* @retval : status +*/ +void DCD_EP_SetAddress (USB_OTG_CORE_HANDLE *pdev, uint8_t address) +{ + USB_OTG_DCFG_TypeDef dcfg; + dcfg.d32 = 0; + dcfg.b.devaddr = address; + USB_OTG_MODIFY_REG32( &pdev->regs.DREGS->DCFG, 0, dcfg.d32); +} + +/** +* @brief Connect device (enable internal pull-up) +* @param pdev: device instance +* @retval : None +*/ +void DCD_DevConnect (USB_OTG_CORE_HANDLE *pdev) +{ +#ifndef USE_OTG_MODE + USB_OTG_DCTL_TypeDef dctl; + dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL); + /* Connect device */ + dctl.b.sftdiscon = 0; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32); + USB_OTG_BSP_mDelay(3); +#endif +} + + +/** +* @brief Disconnect device (disable internal pull-up) +* @param pdev: device instance +* @retval : None +*/ +void DCD_DevDisconnect (USB_OTG_CORE_HANDLE *pdev) +{ +#ifndef USE_OTG_MODE + USB_OTG_DCTL_TypeDef dctl; + dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL); + /* Disconnect device for 3ms */ + dctl.b.sftdiscon = 1; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32); + USB_OTG_BSP_mDelay(3); +#endif +} + + +/** +* @brief returns the EP Status +* @param pdev : Selected device +* epnum : endpoint address +* @retval : EP status +*/ + +uint32_t DCD_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,uint8_t epnum) +{ + USB_OTG_EP *ep; + uint32_t Status = 0; + + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + Status = USB_OTG_GetEPStatus(pdev ,ep); + + /* Return the current status */ + return Status; +} + +/** +* @brief Set the EP Status +* @param pdev : Selected device +* Status : new Status +* epnum : EP address +* @retval : None +*/ +void DCD_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum , uint32_t Status) +{ + USB_OTG_EP *ep; + + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + USB_OTG_SetEPStatus(pdev ,ep , Status); +} + +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/src/usb_dcd_int.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/src/usb_dcd_int.c new file mode 100644 index 00000000..32984e61 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/src/usb_dcd_int.c @@ -0,0 +1,869 @@ +/** + ****************************************************************************** + * @file usb_dcd_int.c + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Peripheral Device interrupt subroutines + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd_int.h" +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_DCD_INT +* @brief This file contains the interrupt subroutines for the Device mode. +* @{ +*/ + + +/** @defgroup USB_DCD_INT_Private_Defines +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + + +/** @defgroup USB_DCD_INT_Private_Macros +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_Variables +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_FunctionPrototypes +* @{ +*/ +/* static functions */ +static uint32_t DCD_ReadDevInEP (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum); + +/* Interrupt Handlers */ +static uint32_t DCD_HandleInEP_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleOutEP_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleSof_ISR(USB_OTG_CORE_HANDLE *pdev); + +static uint32_t DCD_HandleRxStatusQueueLevel_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev , uint32_t epnum); + +static uint32_t DCD_HandleUsbReset_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleEnumDone_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleResume_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleUSBSuspend_ISR(USB_OTG_CORE_HANDLE *pdev); + +static uint32_t DCD_IsoINIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_IsoOUTIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev); +#ifdef VBUS_SENSING_ENABLED +static uint32_t DCD_SessionRequest_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_OTG_ISR(USB_OTG_CORE_HANDLE *pdev); +#endif + +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_Functions +* @{ +*/ + + +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED +/** +* @brief USBD_OTG_EP1OUT_ISR_Handler +* handles all USB Interrupts +* @param pdev: device instance +* @retval status +*/ +uint32_t USBD_OTG_EP1OUT_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_DOEPINTn_TypeDef doepint; + USB_OTG_DEPXFRSIZ_TypeDef deptsiz; + + doepint.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[1]->DOEPINT); + doepint.d32&= USB_OTG_READ_REG32(&pdev->regs.DREGS->DOUTEP1MSK); + + /* Transfer complete */ + if ( doepint.b.xfercompl ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(1, xfercompl); + if (pdev->cfg.dma_enable == 1) + { + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[1]->DOEPTSIZ)); + /*ToDo : handle more than one single MPS size packet */ + pdev->dev.out_ep[1].xfer_count = pdev->dev.out_ep[1].maxpacket - \ + deptsiz.b.xfersize; + } + /* Inform upper layer: data ready */ + /* RX COMPLETE */ + USBD_DCD_INT_fops->DataOutStage(pdev , 1); + + } + + /* Endpoint disable */ + if ( doepint.b.epdisabled ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(1, epdisabled); + } + + return 1; +} + +/** +* @brief USBD_OTG_EP1IN_ISR_Handler +* handles all USB Interrupts +* @param pdev: device instance +* @retval status +*/ +uint32_t USBD_OTG_EP1IN_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_DIEPINTn_TypeDef diepint; + uint32_t fifoemptymsk, msk, emp; + + msk = USB_OTG_READ_REG32(&pdev->regs.DREGS->DINEP1MSK); + emp = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPEMPMSK); + msk |= ((emp >> 1 ) & 0x1) << 7; + diepint.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[1]->DIEPINT) & msk; + + if ( diepint.b.xfercompl ) + { + fifoemptymsk = 0x1 << 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0); + CLEAR_IN_EP_INTR(1, xfercompl); + /* TX COMPLETE */ + USBD_DCD_INT_fops->DataInStage(pdev , 1); + } + if ( diepint.b.epdisabled ) + { + CLEAR_IN_EP_INTR(1, epdisabled); + } + if ( diepint.b.timeout ) + { + CLEAR_IN_EP_INTR(1, timeout); + } + if (diepint.b.intktxfemp) + { + CLEAR_IN_EP_INTR(1, intktxfemp); + } + if (diepint.b.inepnakeff) + { + CLEAR_IN_EP_INTR(1, inepnakeff); + } + if (diepint.b.emptyintr) + { + DCD_WriteEmptyTxFifo(pdev , 1); + CLEAR_IN_EP_INTR(1, emptyintr); + } + return 1; +} +#endif + +/** +* @brief STM32_USBF_OTG_ISR_Handler +* handles all USB Interrupts +* @param pdev: device instance +* @retval status +*/ +uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintr_status; + uint32_t retval = 0; + + if (USB_OTG_IsDeviceMode(pdev)) /* ensure that we are in device mode */ + { + gintr_status.d32 = USB_OTG_ReadCoreItr(pdev); + if (!gintr_status.d32) /* avoid spurious interrupt */ + { + return 0; + } + + if (gintr_status.b.outepintr) + { + retval |= DCD_HandleOutEP_ISR(pdev); + } + + if (gintr_status.b.inepint) + { + retval |= DCD_HandleInEP_ISR(pdev); + } + + if (gintr_status.b.modemismatch) + { + USB_OTG_GINTSTS_TypeDef gintsts; + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.modemismatch = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + } + + if (gintr_status.b.wkupintr) + { + retval |= DCD_HandleResume_ISR(pdev); + } + + if (gintr_status.b.usbsuspend) + { + retval |= DCD_HandleUSBSuspend_ISR(pdev); + } + if (gintr_status.b.sofintr) + { + retval |= DCD_HandleSof_ISR(pdev); + + } + + if (gintr_status.b.rxstsqlvl) + { + retval |= DCD_HandleRxStatusQueueLevel_ISR(pdev); + + } + + if (gintr_status.b.usbreset) + { + retval |= DCD_HandleUsbReset_ISR(pdev); + + } + if (gintr_status.b.enumdone) + { + retval |= DCD_HandleEnumDone_ISR(pdev); + } + + if (gintr_status.b.incomplisoin) + { + retval |= DCD_IsoINIncomplete_ISR(pdev); + } + + if (gintr_status.b.incomplisoout) + { + retval |= DCD_IsoOUTIncomplete_ISR(pdev); + } +#ifdef VBUS_SENSING_ENABLED + if (gintr_status.b.sessreqintr) + { + retval |= DCD_SessionRequest_ISR(pdev); + } + + if (gintr_status.b.otgintr) + { + retval |= DCD_OTG_ISR(pdev); + } +#endif + } + return retval; +} + +#ifdef VBUS_SENSING_ENABLED +/** +* @brief DCD_SessionRequest_ISR +* Indicates that the USB_OTG controller has detected a connection +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_SessionRequest_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USBD_DCD_INT_fops->DevConnected (pdev); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.sessreqintr = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32); + return 1; +} + +/** +* @brief DCD_OTG_ISR +* Indicates that the USB_OTG controller has detected an OTG event: +* used to detect the end of session i.e. disconnection +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_OTG_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_GOTGINT_TypeDef gotgint; + + gotgint.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GOTGINT); + + if (gotgint.b.sesenddet) + { + USBD_DCD_INT_fops->DevDisconnected (pdev); + } + /* Clear OTG interrupt */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GOTGINT, gotgint.d32); + return 1; +} +#endif +/** +* @brief DCD_HandleResume_ISR +* Indicates that the USB_OTG controller has detected a resume or +* remote Wake-up sequence +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleResume_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USB_OTG_DCTL_TypeDef devctl; + USB_OTG_PCGCCTL_TypeDef power; + + if(pdev->cfg.low_power) + { + /* un-gate USB Core clock */ + power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL); + power.b.gatehclk = 0; + power.b.stoppclk = 0; + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32); + } + + /* Clear the Remote Wake-up Signaling */ + devctl.d32 = 0; + devctl.b.rmtwkupsig = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, devctl.d32, 0); + + /* Inform upper layer by the Resume Event */ + USBD_DCD_INT_fops->Resume (pdev); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.wkupintr = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32); + return 1; +} + +/** +* @brief USB_OTG_HandleUSBSuspend_ISR +* Indicates that SUSPEND state has been detected on the USB +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleUSBSuspend_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USB_OTG_PCGCCTL_TypeDef power; + USB_OTG_DSTS_TypeDef dsts; + __IO uint8_t prev_status = 0; + + prev_status = pdev->dev.device_status; + USBD_DCD_INT_fops->Suspend (pdev); + + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.usbsuspend = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + + if((pdev->cfg.low_power) && (dsts.b.suspsts == 1) && + (pdev->dev.connection_status == 1) && + (prev_status == USB_OTG_CONFIGURED)) + { + /* switch-off the clocks */ + power.d32 = 0; + power.b.stoppclk = 1; + USB_OTG_MODIFY_REG32(pdev->regs.PCGCCTL, 0, power.d32); + + power.b.gatehclk = 1; + USB_OTG_MODIFY_REG32(pdev->regs.PCGCCTL, 0, power.d32); + + /* Request to enter Sleep mode after exit from current ISR */ + SCB->SCR |= (SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk); + } + return 1; +} + +/** +* @brief DCD_HandleInEP_ISR +* Indicates that an IN EP has a pending Interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleInEP_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DIEPINTn_TypeDef diepint; + + uint32_t ep_intr; + uint32_t epnum = 0; + uint32_t fifoemptymsk; + diepint.d32 = 0; + ep_intr = USB_OTG_ReadDevAllInEPItr(pdev); + + while ( ep_intr ) + { + if (ep_intr&0x1) /* In ITR */ + { + diepint.d32 = DCD_ReadDevInEP(pdev , epnum); /* Get In ITR status */ + if ( diepint.b.xfercompl ) + { + fifoemptymsk = 0x1 << epnum; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0); + CLEAR_IN_EP_INTR(epnum, xfercompl); + /* TX COMPLETE */ + USBD_DCD_INT_fops->DataInStage(pdev , epnum); + + if (pdev->cfg.dma_enable == 1) + { + if((epnum == 0) && (pdev->dev.device_state == USB_OTG_EP0_STATUS_IN)) + { + /* prepare to rx more setup packets */ + USB_OTG_EP0_OutStart(pdev); + } + } + } + if ( diepint.b.timeout ) + { + CLEAR_IN_EP_INTR(epnum, timeout); + } + if (diepint.b.intktxfemp) + { + CLEAR_IN_EP_INTR(epnum, intktxfemp); + } + if (diepint.b.inepnakeff) + { + CLEAR_IN_EP_INTR(epnum, inepnakeff); + } + if ( diepint.b.epdisabled ) + { + CLEAR_IN_EP_INTR(epnum, epdisabled); + } + if (diepint.b.emptyintr) + { + + DCD_WriteEmptyTxFifo(pdev , epnum); + + CLEAR_IN_EP_INTR(epnum, emptyintr); + } + } + epnum++; + ep_intr >>= 1; + } + + return 1; +} + +/** +* @brief DCD_HandleOutEP_ISR +* Indicates that an OUT EP has a pending Interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleOutEP_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t ep_intr; + USB_OTG_DOEPINTn_TypeDef doepint; + USB_OTG_DEPXFRSIZ_TypeDef deptsiz; + uint32_t epnum = 0; + + doepint.d32 = 0; + + /* Read in the device interrupt bits */ + ep_intr = USB_OTG_ReadDevAllOutEp_itr(pdev); + + while ( ep_intr ) + { + if (ep_intr&0x1) + { + + doepint.d32 = USB_OTG_ReadDevOutEP_itr(pdev, epnum); + + /* Transfer complete */ + if ( doepint.b.xfercompl ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(epnum, xfercompl); + if (pdev->cfg.dma_enable == 1) + { + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[epnum]->DOEPTSIZ)); + /*ToDo : handle more than one single MPS size packet */ + pdev->dev.out_ep[epnum].xfer_count = pdev->dev.out_ep[epnum].maxpacket - \ + deptsiz.b.xfersize; + } + /* Inform upper layer: data ready */ + /* RX COMPLETE */ + USBD_DCD_INT_fops->DataOutStage(pdev , epnum); + + if (pdev->cfg.dma_enable == 1) + { + if((epnum == 0) && (pdev->dev.device_state == USB_OTG_EP0_STATUS_OUT)) + { + /* prepare to rx more setup packets */ + USB_OTG_EP0_OutStart(pdev); + } + } + } + /* Endpoint disable */ + if ( doepint.b.epdisabled ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(epnum, epdisabled); + } + /* Setup Phase Done (control EPs) */ + if ( doepint.b.setup ) + { + + /* inform the upper layer that a setup packet is available */ + /* SETUP COMPLETE */ + USBD_DCD_INT_fops->SetupStage(pdev); + CLEAR_OUT_EP_INTR(epnum, setup); + } + } + epnum++; + ep_intr >>= 1; + } + return 1; +} + +/** +* @brief DCD_HandleSof_ISR +* Handles the SOF Interrupts +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleSof_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef GINTSTS; + + + USBD_DCD_INT_fops->SOF(pdev); + + /* Clear interrupt */ + GINTSTS.d32 = 0; + GINTSTS.b.sofintr = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, GINTSTS.d32); + + return 1; +} + +/** +* @brief DCD_HandleRxStatusQueueLevel_ISR +* Handles the Rx Status Queue Level Interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleRxStatusQueueLevel_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTMSK_TypeDef int_mask; + USB_OTG_DRXSTS_TypeDef status; + USB_OTG_EP *ep; + + /* Disable the Rx Status Queue Level interrupt */ + int_mask.d32 = 0; + int_mask.b.rxstsqlvl = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, int_mask.d32, 0); + + /* Get the Status from the top of the FIFO */ + status.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRXSTSP ); + + ep = &pdev->dev.out_ep[status.b.epnum]; + + switch (status.b.pktsts) + { + case STS_GOUT_NAK: + break; + case STS_DATA_UPDT: + if (status.b.bcnt) + { + USB_OTG_ReadPacket(pdev,ep->xfer_buff, status.b.bcnt); + ep->xfer_buff += status.b.bcnt; + ep->xfer_count += status.b.bcnt; + } + break; + case STS_XFER_COMP: + break; + case STS_SETUP_COMP: + break; + case STS_SETUP_UPDT: + /* Copy the setup packet received in FIFO into the setup buffer in RAM */ + USB_OTG_ReadPacket(pdev , pdev->dev.setup_packet, 8); + ep->xfer_count += status.b.bcnt; + break; + default: + break; + } + + /* Enable the Rx Status Queue Level interrupt */ + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, int_mask.d32); + + return 1; +} + +/** +* @brief DCD_WriteEmptyTxFifo +* check FIFO for the next packet to be loaded +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev, uint32_t epnum) +{ + USB_OTG_DTXFSTSn_TypeDef txstatus; + USB_OTG_EP *ep; + uint32_t len = 0; + uint32_t len32b; + txstatus.d32 = 0; + + ep = &pdev->dev.in_ep[epnum]; + + len = ep->xfer_len - ep->xfer_count; + + if (len > ep->maxpacket) + { + len = ep->maxpacket; + } + + len32b = (len + 3) / 4; + txstatus.d32 = USB_OTG_READ_REG32( &pdev->regs.INEP_REGS[epnum]->DTXFSTS); + + + + while (txstatus.b.txfspcavail > len32b && + ep->xfer_count < ep->xfer_len && + ep->xfer_len != 0) + { + /* Write the FIFO */ + len = ep->xfer_len - ep->xfer_count; + + if (len > ep->maxpacket) + { + len = ep->maxpacket; + } + len32b = (len + 3) / 4; + + USB_OTG_WritePacket (pdev , ep->xfer_buff, epnum, len); + + ep->xfer_buff += len; + ep->xfer_count += len; + + txstatus.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DTXFSTS); + } + + return 1; +} + +/** +* @brief DCD_HandleUsbReset_ISR +* This interrupt occurs when a USB Reset is detected +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleUsbReset_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DAINT_TypeDef daintmsk; + USB_OTG_DOEPMSK_TypeDef doepmsk; + USB_OTG_DIEPMSK_TypeDef diepmsk; + USB_OTG_DCFG_TypeDef dcfg; + USB_OTG_DCTL_TypeDef dctl; + USB_OTG_GINTSTS_TypeDef gintsts; + uint32_t i; + + dctl.d32 = 0; + daintmsk.d32 = 0; + doepmsk.d32 = 0; + diepmsk.d32 = 0; + dcfg.d32 = 0; + gintsts.d32 = 0; + + /* Clear the Remote Wake-up Signaling */ + dctl.b.rmtwkupsig = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, 0 ); + + /* Flush the Tx FIFO */ + USB_OTG_FlushTxFifo(pdev , 0 ); + + for (i = 0; i < pdev->cfg.dev_endpoints ; i++) + { + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF); + } + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF ); + + daintmsk.ep.in = 1; + daintmsk.ep.out = 1; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, daintmsk.d32 ); + + doepmsk.b.setup = 1; + doepmsk.b.xfercompl = 1; + doepmsk.b.epdisabled = 1; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, doepmsk.d32 ); +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOUTEP1MSK, doepmsk.d32 ); +#endif + diepmsk.b.xfercompl = 1; + diepmsk.b.timeout = 1; + diepmsk.b.epdisabled = 1; + + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, diepmsk.d32 ); +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DINEP1MSK, diepmsk.d32 ); +#endif + /* Reset Device Address */ + dcfg.d32 = USB_OTG_READ_REG32( &pdev->regs.DREGS->DCFG); + dcfg.b.devaddr = 0; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DCFG, dcfg.d32); + + + /* setup EP0 to receive SETUP packets */ + USB_OTG_EP0_OutStart(pdev); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.usbreset = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32); + + /*Reset internal state machine */ + USBD_DCD_INT_fops->Reset(pdev); + return 1; +} + +/** +* @brief DCD_HandleEnumDone_ISR +* Read the device status register and set the device speed +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleEnumDone_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USB_OTG_GUSBCFG_TypeDef gusbcfg; + + USB_OTG_EP0Activate(pdev); + + /* Set USB turn-around time based on device speed and PHY interface. */ + gusbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + + /* Full or High speed */ + if ( USB_OTG_GetDeviceSpeed(pdev) == USB_SPEED_HIGH) + { + pdev->cfg.speed = USB_OTG_SPEED_HIGH; + pdev->cfg.mps = USB_OTG_HS_MAX_PACKET_SIZE ; + gusbcfg.b.usbtrdtim = 9; + } + else + { + pdev->cfg.speed = USB_OTG_SPEED_FULL; + pdev->cfg.mps = USB_OTG_FS_MAX_PACKET_SIZE ; + gusbcfg.b.usbtrdtim = 5; + } + + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, gusbcfg.d32); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.enumdone = 1; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, gintsts.d32 ); + return 1; +} + + +/** +* @brief DCD_IsoINIncomplete_ISR +* handle the ISO IN incomplete interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_IsoINIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + + gintsts.d32 = 0; + + USBD_DCD_INT_fops->IsoINIncomplete (pdev); + + /* Clear interrupt */ + gintsts.b.incomplisoin = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + + return 1; +} + +/** +* @brief DCD_IsoOUTIncomplete_ISR +* handle the ISO OUT incomplete interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_IsoOUTIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + + gintsts.d32 = 0; + + USBD_DCD_INT_fops->IsoOUTIncomplete (pdev); + + /* Clear interrupt */ + gintsts.b.incomplisoout = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + return 1; +} +/** +* @brief DCD_ReadDevInEP +* Reads ep flags +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_ReadDevInEP (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum) +{ + uint32_t v, msk, emp; + msk = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPMSK); + emp = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPEMPMSK); + msk |= ((emp >> epnum) & 0x1) << 7; + v = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DIEPINT) & msk; + return v; +} + + + +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/main.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/main.c index b89cd457..df140aa1 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/main.c +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/main.c @@ -74,17 +74,28 @@ void main(void) ****************************************************************************************/ static void Init(void) { + GPIO_InitTypeDef GPIO_InitStructure; #if (BOOT_COM_UART_ENABLE > 0) - GPIO_InitTypeDef GPIO_InitStructure; #elif (BOOT_FILE_SYS_ENABLE > 0) - GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; -#elif (BOOT_COM_CAN_ENABLE > 0) - GPIO_InitTypeDef GPIO_InitStructure; #endif /* initialize the system and its clocks */ SystemInit(); + + /* initialize the button as a digital input. is used to override the starting of + * the user program. + */ + /* enable the GPIO Clock */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); + /* configure the GPIO pin */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + #if (BOOT_COM_UART_ENABLE > 0) /* enable UART peripheral clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE); diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/makefile b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/makefile index c489cc5a..0a7d7cc6 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/makefile +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/makefile @@ -38,6 +38,31 @@ PROJ_FILES= \ blt_conf.h \ hooks.c \ main.c \ +usbd_bulk.c \ +usbd_bulk.h \ +usbd_conf.h \ +usbd_desc.c \ +usbd_desc.h \ +usbd_usr.c \ +usb_bsp.c \ +usb_conf.h \ +./lib/usbdevicelib/Core/inc/usbd_core.h \ +./lib/usbdevicelib/Core/inc/usbd_def.h \ +./lib/usbdevicelib/Core/inc/usbd_ioreq.h \ +./lib/usbdevicelib/Core/inc/usbd_req.h \ +./lib/usbdevicelib/Core/inc/usbd_usr.h \ +./lib/usbdevicelib/Core/src/usbd_core.c \ +./lib/usbdevicelib/Core/src/usbd_ioreq.c \ +./lib/usbdevicelib/Core/src/usbd_req.c \ +./lib/usbotgdriver/inc/usb_bsp.h \ +./lib/usbotgdriver/inc/usb_core.h \ +./lib/usbotgdriver/inc/usb_dcd.h \ +./lib/usbotgdriver/inc/usb_dcd_int.h \ +./lib/usbotgdriver/inc/usb_defines.h \ +./lib/usbotgdriver/inc/usb_regs.h \ +./lib/usbotgdriver/src/usb_core.c \ +./lib/usbotgdriver/src/usb_dcd.c \ +./lib/usbotgdriver/src/usb_dcd_int.c \ ./lib/fatfs/ffconf.h \ ./lib/fatfs/mmc.c \ ./lib/ethernetlib/inc/stm32_eth.h \ @@ -161,6 +186,8 @@ main.c \ ../../../Source/ARMCM4_STM32/flash.h \ ../../../Source/ARMCM4_STM32/uart.c \ ../../../Source/ARMCM4_STM32/uart.h \ +../../../Source/ARMCM4_STM32/usb.c \ +../../../Source/ARMCM4_STM32/usb.h \ ../../../Source/ARMCM4_STM32/nvm.c \ ../../../Source/ARMCM4_STM32/nvm.h \ ../../../Source/ARMCM4_STM32/timer.c \ @@ -208,7 +235,7 @@ CFLAGS = -g -D inline= -mthumb -mcpu=cortex-m4 -O1 -T memory.x CFLAGS += -D PACK_STRUCT_END=__attribute\(\(packed\)\) -Wno-main CFLAGS += -D ALIGN_STRUCT_END=__attribute\(\(aligned\(4\)\)\) CFLAGS += -ffunction-sections -fdata-sections $(INC_PATH) -D STM32F4XX -D GCC_ARMCM3 -CFLAGS += -D USE_STDPERIPH_DRIVER -D HSE_VALUE=12000000 +CFLAGS += -D USE_STDPERIPH_DRIVER -D HSE_VALUE=12000000 -D USE_USB_OTG_FS CFLAGS += -Wa,-adhlns="$(OBJ_PATH)/$(subst .o,.lst,$@)" -Wno-attributes LFLAGS = -nostartfiles -Xlinker -M -Xlinker -Map=$(BIN_PATH)/$(PROJ_NAME).map LFLAGS += $(LIB_PATH) -Xlinker --gc-sections diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usb_bsp.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usb_bsp.c new file mode 100644 index 00000000..43f41ad6 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usb_bsp.c @@ -0,0 +1,194 @@ +/** + ****************************************************************************** + * @file usb_bsp.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file is responsible to offer board support package and is + * configurable by user. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_bsp.h" +#include "usbd_conf.h" + + +extern void HwDelayUs(uint32_t time_us); +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY +* @{ +*/ + +/** @defgroup USB_BSP +* @brief This file is responsible to offer board support package +* @{ +*/ + +/** @defgroup USB_BSP_Private_Defines +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_BSP_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + + + + +/** @defgroup USB_BSP_Private_Macros +* @{ +*/ +/** +* @} +*/ + +/** @defgroup USBH_BSP_Private_Variables +* @{ +*/ + +/** +* @} +*/ + +/** @defgroup USBH_BSP_Private_FunctionPrototypes +* @{ +*/ +/** +* @} +*/ + +/** @defgroup USB_BSP_Private_Functions +* @{ +*/ + + + +/** +* @brief USB_OTG_BSP_Init +* Initilizes BSP configurations +* @param None +* @retval None +*/ +void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA , ENABLE); + + /* Configure SOF ID DM DP Pins */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | + GPIO_Pin_11 | + GPIO_Pin_12; + + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_OTG1_FS) ; + GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_OTG1_FS) ; + GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_OTG1_FS) ; + + /* Configure VBUS Pin */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + /* Configure ID pin */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_Init(GPIOA, &GPIO_InitStructure); + GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_OTG1_FS) ; + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); + RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, ENABLE) ; +} +/** +* @brief USB_OTG_BSP_EnableInterrupt +* Enabele USB Global interrupt +* @param None +* @retval None +*/ +void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev) +{ + /* driver runs in polling mode */ +} +/** +* @brief USB_OTG_BSP_uDelay +* This function provides delay time in micro sec +* @param usec : Value of delay required in micro sec +* @retval None +*/ +void USB_OTG_BSP_uDelay (const uint32_t usec) +{ + #define HW_DELAY_MS_LOOP_COUNT (28000) + + uint32_t delay_counter; + uint32_t time_us = usec; + + /* perform the delay */ + while (time_us-- > 0) + { + /* block program for about 1 millisecond */ + for (delay_counter=0; delay_counter<(HW_DELAY_MS_LOOP_COUNT/1000); delay_counter++) + { + asm("nop"); + } + } +} + + +/** +* @brief USB_OTG_BSP_mDelay +* This function provides delay time in milli sec +* @param msec : Value of delay required in milli sec +* @retval None +*/ +void USB_OTG_BSP_mDelay (const uint32_t msec) +{ + USB_OTG_BSP_uDelay(msec * 1000); +} +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usb_conf.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usb_conf.h new file mode 100644 index 00000000..ab61672f --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usb_conf.h @@ -0,0 +1,289 @@ +/** + ****************************************************************************** + * @file usb_conf.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief General low level driver configuration + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_CONF__H__ +#define __USB_CONF__H__ + +/* Includes ------------------------------------------------------------------*/ + #include "stm32f4xx.h" + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_CONF + * @brief USB low level driver configuration file + * @{ + */ + +/** @defgroup USB_CONF_Exported_Defines + * @{ + */ + +/* USB Core and PHY interface configuration. + Tip: To avoid modifying these defines each time you need to change the USB + configuration, you can declare the needed define in your toolchain + compiler preprocessor. + */ +/****************** USB OTG FS PHY CONFIGURATION ******************************* +* The USB OTG FS Core supports one on-chip Full Speed PHY. +* +* The USE_EMBEDDED_PHY symbol is defined in the project compiler preprocessor +* when FS core is used. +*******************************************************************************/ +#ifndef USE_USB_OTG_FS + //#define USE_USB_OTG_FS +#endif /* USE_USB_OTG_FS */ + +#ifdef USE_USB_OTG_FS + #define USB_OTG_FS_CORE +#endif + +/****************** USB OTG HS PHY CONFIGURATION ******************************* +* The USB OTG HS Core supports two PHY interfaces: +* (i) An ULPI interface for the external High Speed PHY: the USB HS Core will +* operate in High speed mode +* (ii) An on-chip Full Speed PHY: the USB HS Core will operate in Full speed mode +* +* You can select the PHY to be used using one of these two defines: +* (i) USE_ULPI_PHY: if the USB OTG HS Core is to be used in High speed mode +* (ii) USE_EMBEDDED_PHY: if the USB OTG HS Core is to be used in Full speed mode +* +* Notes: +* - The USE_ULPI_PHY symbol is defined in the project compiler preprocessor as +* default PHY when HS core is used. +* - On STM322xG-EVAL and STM324xG-EVAL boards, only configuration(i) is available. +* Configuration (ii) need a different hardware, for more details refer to your +* STM32 device datasheet. +*******************************************************************************/ +#ifndef USE_USB_OTG_HS + //#define USE_USB_OTG_HS +#endif /* USE_USB_OTG_HS */ + +#ifndef USE_ULPI_PHY + //#define USE_ULPI_PHY +#endif /* USE_ULPI_PHY */ + +#ifndef USE_EMBEDDED_PHY + //#define USE_EMBEDDED_PHY +#endif /* USE_EMBEDDED_PHY */ + +#ifdef USE_USB_OTG_HS + #define USB_OTG_HS_CORE +#endif + +/******************************************************************************* +* FIFO Size Configuration in Device mode +* +* (i) Receive data FIFO size = RAM for setup packets + +* OUT endpoint control information + +* data OUT packets + miscellaneous +* Space = ONE 32-bits words +* --> RAM for setup packets = 10 spaces +* (n is the nbr of CTRL EPs the device core supports) +* --> OUT EP CTRL info = 1 space +* (one space for status information written to the FIFO along with each +* received packet) +* --> data OUT packets = (Largest Packet Size / 4) + 1 spaces +* (MINIMUM to receive packets) +* --> OR data OUT packets = at least 2*(Largest Packet Size / 4) + 1 spaces +* (if high-bandwidth EP is enabled or multiple isochronous EPs) +* --> miscellaneous = 1 space per OUT EP +* (one space for transfer complete status information also pushed to the +* FIFO with each endpoint's last packet) +* +* (ii)MINIMUM RAM space required for each IN EP Tx FIFO = MAX packet size for +* that particular IN EP. More space allocated in the IN EP Tx FIFO results +* in a better performance on the USB and can hide latencies on the AHB. +* +* (iii) TXn min size = 16 words. (n : Transmit FIFO index) +* (iv) When a TxFIFO is not used, the Configuration should be as follows: +* case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes) +* --> Txm can use the space allocated for Txn. +* case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes) +* --> Txn should be configured with the minimum space of 16 words +* (v) The FIFO is used optimally when used TxFIFOs are allocated in the top +* of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones. +* (vi) In HS case 12 FIFO locations should be reserved for internal DMA registers +* so total FIFO size should be 1012 Only instead of 1024 +*******************************************************************************/ + +/****************** USB OTG HS CONFIGURATION **********************************/ +#ifdef USB_OTG_HS_CORE + #define RX_FIFO_HS_SIZE 512 + #define TX0_FIFO_HS_SIZE 64 + #define TX1_FIFO_HS_SIZE 372 + #define TX2_FIFO_HS_SIZE 64 + #define TX3_FIFO_HS_SIZE 0 + #define TX4_FIFO_HS_SIZE 0 + #define TX5_FIFO_HS_SIZE 0 + +// #define USB_OTG_HS_SOF_OUTPUT_ENABLED + + #ifdef USE_ULPI_PHY + #define USB_OTG_ULPI_PHY_ENABLED + #endif + #ifdef USE_EMBEDDED_PHY + #define USB_OTG_EMBEDDED_PHY_ENABLED + /* wakeup is working only when HS core is configured in FS mode */ + #define USB_OTG_HS_LOW_PWR_MGMT_SUPPORT + #endif + /* #define USB_OTG_HS_INTERNAL_DMA_ENABLED */ /* Be aware that enabling DMA mode will result in data being sent only by + multiple of 4 packet sizes. This is due to the fact that USB DMA does + not allow sending data from non word-aligned addresses. + For this specific application, it is advised to not enable this option + unless required. */ + #define USB_OTG_HS_DEDICATED_EP1_ENABLED +#endif + +/****************** USB OTG FS CONFIGURATION **********************************/ +#ifdef USB_OTG_FS_CORE + #define RX_FIFO_FS_SIZE 128 + #define TX0_FIFO_FS_SIZE 32 + #define TX1_FIFO_FS_SIZE 128 + #define TX2_FIFO_FS_SIZE 32 + #define TX3_FIFO_FS_SIZE 0 + +// #define USB_OTG_FS_LOW_PWR_MGMT_SUPPORT +// #define USB_OTG_FS_SOF_OUTPUT_ENABLED +#endif + +/****************** USB OTG MISC CONFIGURATION ********************************/ +#define VBUS_SENSING_ENABLED + +/****************** USB OTG MODE CONFIGURATION ********************************/ +//#define USE_HOST_MODE +#define USE_DEVICE_MODE +//#define USE_OTG_MODE + +#ifndef USB_OTG_FS_CORE + #ifndef USB_OTG_HS_CORE + #error "USB_OTG_HS_CORE or USB_OTG_FS_CORE should be defined" + #endif +#endif + +#ifndef USE_DEVICE_MODE + #ifndef USE_HOST_MODE + #error "USE_DEVICE_MODE or USE_HOST_MODE should be defined" + #endif +#endif + +#ifndef USE_USB_OTG_HS + #ifndef USE_USB_OTG_FS + #error "USE_USB_OTG_HS or USE_USB_OTG_FS should be defined" + #endif +#else //USE_USB_OTG_HS + #ifndef USE_ULPI_PHY + #ifndef USE_EMBEDDED_PHY + #error "USE_ULPI_PHY or USE_EMBEDDED_PHY should be defined" + #endif + #endif +#endif + +/****************** C Compilers dependant keywords ****************************/ +/* In HS mode and when the DMA is used, all variables and data structures dealing + with the DMA during the transaction process should be 4-bytes aligned */ +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined (__GNUC__) /* GNU Compiler */ + #define __ALIGN_END __attribute__ ((aligned (4))) + #define __ALIGN_BEGIN + #else + #define __ALIGN_END + #if defined (__CC_ARM) /* ARM Compiler */ + #define __ALIGN_BEGIN __align(4) + #elif defined (__ICCARM__) /* IAR Compiler */ + #define __ALIGN_BEGIN + #elif defined (__TASKING__) /* TASKING Compiler */ + #define __ALIGN_BEGIN __align(4) + #endif /* __CC_ARM */ + #endif /* __GNUC__ */ +#else + #define __ALIGN_BEGIN + #define __ALIGN_END +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ + +/* __packed keyword used to decrease the data type alignment to 1-byte */ +#if defined (__CC_ARM) /* ARM Compiler */ + #define __packed __packed +#elif defined (__ICCARM__) /* IAR Compiler */ + #define __packed __packed +#elif defined ( __GNUC__ ) /* GNU Compiler */ + #define __packed __attribute__ ((__packed__)) +#elif defined (__TASKING__) /* TASKING Compiler */ + #define __packed __unaligned +#endif /* __CC_ARM */ + +/** + * @} + */ + + +/** @defgroup USB_CONF_Exported_Types + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_CONF_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +#endif //__USB_CONF__H__ + + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_bulk.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_bulk.c new file mode 100644 index 00000000..6bd165b6 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_bulk.c @@ -0,0 +1,361 @@ +/** + ****************************************************************************** + * @file usbd_bulk.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file provides the high layer firmware functions to manage a + * USB bulk device. + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_bulk.h" +#include "usbd_desc.h" +#include "usbd_req.h" + + +extern void UsbReceivePipeBulkOUT(uint8_t epnum); +extern void UsbTransmitPipeBulkIN(void); + + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup usbd_bulk + * @brief usbd core module + * @{ + */ + +/** @defgroup usbd_bulk_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup usbd_bulk_Private_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup usbd_bulk_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup usbd_bulk_Private_FunctionPrototypes + * @{ + */ + +/********************************************* + BULK Device library callbacks + *********************************************/ +static uint8_t usbd_bulk_Init (void *pdev, uint8_t cfgidx); +static uint8_t usbd_bulk_DeInit (void *pdev, uint8_t cfgidx); +static uint8_t usbd_bulk_Setup (void *pdev, USB_SETUP_REQ *req); +static uint8_t usbd_bulk_DataIn (void *pdev, uint8_t epnum); +static uint8_t usbd_bulk_DataOut (void *pdev, uint8_t epnum); +static uint8_t usbd_bulk_SOF (void *pdev); + +/********************************************* + BULK specific management functions + *********************************************/ +static uint8_t *USBD_bulk_GetCfgDesc (uint8_t speed, uint16_t *length); +/** + * @} + */ + + +/** @defgroup usbd_bulk_Private_Variables + * @{ + */ +__ALIGN_BEGIN static volatile uint32_t usbd_bulk_AltSet __ALIGN_END = 0; + +__ALIGN_BEGIN uint8_t USB_Rx_Buffer[BULK_DATA_MAX_PACKET_SIZE] __ALIGN_END ; + + +/* Bulk interface class callbacks structure */ +USBD_Class_cb_TypeDef USBD_bulk_cb = +{ + usbd_bulk_Init, + usbd_bulk_DeInit, + usbd_bulk_Setup, + NULL, + NULL, + usbd_bulk_DataIn, + usbd_bulk_DataOut, + usbd_bulk_SOF, + NULL, + NULL, + USBD_bulk_GetCfgDesc +}; + + +/* USB CDC device Configuration Descriptor */ +__ALIGN_BEGIN uint8_t usbd_bulk_CfgDesc[USB_BULK_CONFIG_DESC_SIZ] __ALIGN_END = +{ + /*Configuration Descriptor*/ + 0x09, /* bLength: Configuration Descriptor size */ + USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ + USB_BULK_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */ + 0x00, + 0x01, /* bNumInterfaces: 1 interface */ + 0x01, /* bConfigurationValue: Configuration value */ + 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ + 0xC0, /* bmAttributes: self powered */ + 0x32, /* MaxPower 100 mA */ + /*---------------------------------------------------------------------------*/ + /*Interface Descriptor*/ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0xFF, /* bInterfaceClass: vendor specific */ + 0x00, /* bInterfaceSubClass */ + 0x00, /* bInterfaceProtocol */ + 0x00, /* iInterface: */ + /*Endpoint 1 IN Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + BULK_IN_EP, /* bEndpointAddress: (IN1) */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(BULK_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(BULK_DATA_MAX_PACKET_SIZE), + 0xFF, /* bInterval: ignore for Bulk transfer */ + /*Endpoint 1 OUT Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + BULK_OUT_EP, /* bEndpointAddress: (OUT1) */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(BULK_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(BULK_DATA_MAX_PACKET_SIZE), + 0xFF /* bInterval: ignore for Bulk transfer */ +} ; + + +/** + * @} + */ + +/** @defgroup usbd_bulk_Private_Functions + * @{ + */ + +/** + * @brief usbd_bulk_Init + * Initilaize the Bulk interface + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t usbd_bulk_Init (void *pdev, + uint8_t cfgidx) +{ + /* Open EP IN */ + DCD_EP_Open(pdev, + BULK_IN_EP, + BULK_DATA_IN_PACKET_SIZE, + USB_OTG_EP_BULK); + + /* Open EP OUT */ + DCD_EP_Open(pdev, + BULK_OUT_EP, + BULK_DATA_OUT_PACKET_SIZE, + USB_OTG_EP_BULK); + + + /* Prepare Out endpoint to receive next packet */ + DCD_EP_PrepareRx(pdev, + BULK_OUT_EP, + (uint8_t*)(USB_Rx_Buffer), + BULK_DATA_OUT_PACKET_SIZE); + + return USBD_OK; +} + +/** + * @brief usbd_bulk_DeInit + * DeInitialize the layer + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t usbd_bulk_DeInit (void *pdev, + uint8_t cfgidx) +{ + /* Open EP IN */ + DCD_EP_Close(pdev, BULK_IN_EP); + + /* Open EP OUT */ + DCD_EP_Close(pdev, BULK_OUT_EP); + + return USBD_OK; +} + +/** + * @brief usbd_bulk_Setup + * Handle the bulk specific requests + * @param pdev: instance + * @param req: usb requests + * @retval status + */ +static uint8_t usbd_bulk_Setup (void *pdev, + USB_SETUP_REQ *req) +{ + uint16_t len=USB_BULK_DESC_SIZ; + uint8_t *pbuf=usbd_bulk_CfgDesc + 9; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + /* Standard Requests -------------------------------*/ + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + if( (req->wValue >> 8) == BULK_DESCRIPTOR_TYPE) + { + pbuf = usbd_bulk_CfgDesc + 9 + (9 * USBD_ITF_MAX_NUM); + len = MIN(USB_BULK_DESC_SIZ , req->wLength); + } + + USBD_CtlSendData (pdev, + pbuf, + len); + break; + + case USB_REQ_GET_INTERFACE : + USBD_CtlSendData (pdev, + (uint8_t *)&usbd_bulk_AltSet, + 1); + break; + + case USB_REQ_SET_INTERFACE : + if ((uint8_t)(req->wValue) < USBD_ITF_MAX_NUM) + { + usbd_bulk_AltSet = (uint8_t)(req->wValue); + } + else + { + /* Call the error management function (command will be nacked */ + USBD_CtlError (pdev, req); + } + break; + } + } + return USBD_OK; +} + + +/** + * @brief usbd_bulk_DataIn + * Data sent on non-control IN endpoint + * @param pdev: device instance + * @param epnum: endpoint number + * @retval status + */ +static uint8_t usbd_bulk_DataIn (void *pdev, uint8_t epnum) +{ + /* endpoint finished the previous transmission so see if more data is left */ + UsbTransmitPipeBulkIN(); + return USBD_OK; +} + +/** + * @brief usbd_bulk_DataOut + * Data received on non-control Out endpoint + * @param pdev: device instance + * @param epnum: endpoint number + * @retval status + */ +static uint8_t usbd_bulk_DataOut (void *pdev, uint8_t epnum) +{ + /* read the data from the bulk OUT pipe */ + UsbReceivePipeBulkOUT(epnum); + return USBD_OK; +} + + +/** + * @brief usbd_buld_get_rx_buffer_ptr + * Get pointer to the USB rx buffer + * @retval Buffer pointer + */ +uint8_t *usbd_bulk_get_rx_buffer_ptr(void) +{ + return USB_Rx_Buffer; +} + + +/** + * @brief usbd_bulk_SOF + * Start Of Frame event management + * @param pdev: instance + * @param epnum: endpoint number + * @retval status + */ +static uint8_t usbd_bulk_SOF (void *pdev) +{ + if (((USB_OTG_CORE_HANDLE*)pdev)->dev.device_status == USB_OTG_CONFIGURED) + { + /* Check the data to be sent through IN pipe */ + UsbTransmitPipeBulkIN(); + } + return USBD_OK; +} + + +/** + * @brief USBD_bulk_GetCfgDesc + * Return configuration descriptor + * @param speed : current device speed + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t *USBD_bulk_GetCfgDesc (uint8_t speed, uint16_t *length) +{ + *length = sizeof (usbd_bulk_CfgDesc); + return usbd_bulk_CfgDesc; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_bulk.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_bulk.h new file mode 100644 index 00000000..7c17ac87 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_bulk.h @@ -0,0 +1,102 @@ +/** + ****************************************************************************** + * @file usbd_bulk.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief header file for the usbd_bulk.c file. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ + +#ifndef __USB_BULK_H_ +#define __USB_BULK_H_ + +#include "usbd_ioreq.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup usbd_cdc + * @brief This file is the Header file for USBD_cdc.c + * @{ + */ + + +/** @defgroup usbd_bulk_Exported_Defines + * @{ + */ +#define USB_BULK_CONFIG_DESC_SIZ (32) +#define USB_BULK_DESC_SIZ (32-9) + +#define BULK_DESCRIPTOR_TYPE 0x21 + + +#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 +#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 +#define USB_STRING_DESCRIPTOR_TYPE 0x03 +#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 +#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 + +#define STANDARD_ENDPOINT_DESC_SIZE 0x09 + +#define BULK_DATA_IN_PACKET_SIZE BULK_DATA_MAX_PACKET_SIZE +#define BULK_DATA_OUT_PACKET_SIZE BULK_DATA_MAX_PACKET_SIZE + + + + +/** @defgroup USBD_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_Variables + * @{ + */ + +extern USBD_Class_cb_TypeDef USBD_bulk_cb; +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_Functions + * @{ + */ +uint8_t *usbd_bulk_get_rx_buffer_ptr(void); +/** + * @} + */ + +#endif // __USB_CDC_CORE_H_ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_conf.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_conf.h new file mode 100644 index 00000000..be7b1bae --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_conf.h @@ -0,0 +1,91 @@ +/** + ****************************************************************************** + * @file usbd_conf.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief USB Device configuration file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_CONF__H__ +#define __USBD_CONF__H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" + +/** @defgroup USB_CONF_Exported_Defines + * @{ + */ +#define USBD_CFG_MAX_NUM 1 +#define USBD_ITF_MAX_NUM 1 + +#define USBD_SELF_POWERED + +#define USB_MAX_STR_DESC_SIZ 255 + +/** @defgroup USB_VCP_Class_Layer_Parameter + * @{ + */ +#define BULK_IN_EP 0x81 /* EP1 for data IN */ +#define BULK_OUT_EP 0x01 /* EP1 for data OUT */ + +/* Bulk endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */ +#define BULK_DATA_MAX_PACKET_SIZE 64 /* Endpoint IN & OUT Packet size */ + +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_Types + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_CONF_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +#endif //__USBD_CONF__H__ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_desc.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_desc.c new file mode 100644 index 00000000..b648b3c8 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_desc.c @@ -0,0 +1,271 @@ +/** + ****************************************************************************** + * @file usbd_desc.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file provides the USBD descriptors and string formating method. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_core.h" +#include "usbd_desc.h" +#include "usbd_req.h" +#include "usbd_conf.h" +#include "usb_regs.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_DESC + * @brief USBD descriptors module + * @{ + */ + +/** @defgroup USBD_DESC_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Defines + * @{ + */ +#define USBD_VID 0x0145 + +#define USBD_PID 0x0023 + +/** @defgroup USB_String_Descriptors + * @{ + */ +#define USBD_LANGID_STRING 0x409 +#define USBD_MANUFACTURER_STRING "OpenBLT User" + +#define USBD_PRODUCT_FS_STRING "WinUSB Bulk Device" +#define USBD_SERIALNUMBER_FS_STRING "00000000050C" + +#define USBD_CONFIGURATION_FS_STRING "Default" +#define USBD_INTERFACE_FS_STRING "WinUSB Bulk Interface" +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Variables + * @{ + */ + +USBD_DEVICE USR_desc = +{ + USBD_USR_DeviceDescriptor, + USBD_USR_LangIDStrDescriptor, + USBD_USR_ManufacturerStrDescriptor, + USBD_USR_ProductStrDescriptor, + USBD_USR_SerialStrDescriptor, + USBD_USR_ConfigStrDescriptor, + USBD_USR_InterfaceStrDescriptor, + +}; + +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END = + { + 0x12, /*bLength */ + USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/ + 0x10, /*bcdUSB = 1.1 */ + 0x01, + 0x00, /*bDeviceClass*/ + 0x00, /*bDeviceSubClass*/ + 0x00, /*bDeviceProtocol*/ + USB_OTG_MAX_EP0_SIZE, /*bMaxPacketSize*/ + LOBYTE(USBD_VID), /*idVendor*/ + HIBYTE(USBD_VID), /*idVendor*/ + LOBYTE(USBD_PID), /*idVendor*/ + HIBYTE(USBD_PID), /*idVendor*/ + 0x00, /*bcdDevice rel. 1.00*/ + 0x01, + USBD_IDX_MFC_STR, /*Index of manufacturer string*/ + USBD_IDX_PRODUCT_STR, /*Index of product string*/ + USBD_IDX_SERIAL_STR, /*Index of serial number string*/ + USBD_CFG_MAX_NUM /*bNumConfigurations*/ + } ; /* USB_DeviceDescriptor */ + +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN uint8_t USBD_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = +{ + USB_LEN_DEV_QUALIFIER_DESC, + USB_DESC_TYPE_DEVICE_QUALIFIER, + 0x10, + 0x01, + 0x00, + 0x00, + 0x00, + 0x40, + 0x01, + 0x00, +}; + +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_SIZ_STRING_LANGID] __ALIGN_END = +{ + USB_SIZ_STRING_LANGID, + USB_DESC_TYPE_STRING, + LOBYTE(USBD_LANGID_STRING), + HIBYTE(USBD_LANGID_STRING), +}; +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_FunctionPrototypes + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Functions + * @{ + */ + +/** +* @brief USBD_USR_DeviceDescriptor +* return the device descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_DeviceDescriptor( uint8_t speed , uint16_t *length) +{ + *length = sizeof(USBD_DeviceDesc); + return USBD_DeviceDesc; +} + +/** +* @brief USBD_USR_LangIDStrDescriptor +* return the LangID string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_LangIDStrDescriptor( uint8_t speed , uint16_t *length) +{ + *length = sizeof(USBD_LangIDDesc); + return USBD_LangIDDesc; +} + + +/** +* @brief USBD_USR_ProductStrDescriptor +* return the product string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_ProductStrDescriptor( uint8_t speed , uint16_t *length) +{ + USBD_GetString ((uint8_t *)USBD_PRODUCT_FS_STRING, USBD_StrDesc, length); + return USBD_StrDesc; +} + +/** +* @brief USBD_USR_ManufacturerStrDescriptor +* return the manufacturer string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_ManufacturerStrDescriptor( uint8_t speed , uint16_t *length) +{ + USBD_GetString ((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length); + return USBD_StrDesc; +} + +/** +* @brief USBD_USR_SerialStrDescriptor +* return the serial number string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_SerialStrDescriptor( uint8_t speed , uint16_t *length) +{ + USBD_GetString ((uint8_t *)USBD_SERIALNUMBER_FS_STRING, USBD_StrDesc, length); + return USBD_StrDesc; +} + +/** +* @brief USBD_USR_ConfigStrDescriptor +* return the configuration string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length) +{ + USBD_GetString ((uint8_t *)USBD_CONFIGURATION_FS_STRING, USBD_StrDesc, length); + return USBD_StrDesc; +} + + +/** +* @brief USBD_USR_InterfaceStrDescriptor +* return the interface string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length) +{ + USBD_GetString ((uint8_t *)USBD_INTERFACE_FS_STRING, USBD_StrDesc, length); + return USBD_StrDesc; +} + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_desc.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_desc.h new file mode 100644 index 00000000..e28e14ae --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_desc.h @@ -0,0 +1,120 @@ +/** + ****************************************************************************** + * @file usbd_desc.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief header file for the usbd_desc.c file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USB_DESC_H +#define __USB_DESC_H + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USB_DESC + * @brief general defines for the usb device library file + * @{ + */ + +/** @defgroup USB_DESC_Exported_Defines + * @{ + */ +#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 +#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 +#define USB_STRING_DESCRIPTOR_TYPE 0x03 +#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 +#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 +#define USB_SIZ_DEVICE_DESC 18 +#define USB_SIZ_STRING_LANGID 4 + +/** + * @} + */ + + +/** @defgroup USBD_DESC_Exported_TypesDefinitions + * @{ + */ +/** + * @} + */ + + + +/** @defgroup USBD_DESC_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_Variables + * @{ + */ +extern uint8_t USBD_DeviceDesc [USB_SIZ_DEVICE_DESC]; +extern uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ]; +extern uint8_t USBD_OtherSpeedCfgDesc[USB_LEN_CFG_DESC]; +extern uint8_t USBD_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC]; +extern uint8_t USBD_LangIDDesc[USB_SIZ_STRING_LANGID]; +extern USBD_DEVICE USR_desc; +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_FunctionsPrototype + * @{ + */ + + +uint8_t * USBD_USR_DeviceDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_LangIDStrDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_ManufacturerStrDescriptor ( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_ProductStrDescriptor ( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_SerialStrDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length); + +#ifdef USB_SUPPORT_USER_STRING_DESC +uint8_t * USBD_USR_USRStringDesc (uint8_t speed, uint8_t idx , uint16_t *length); +#endif /* USB_SUPPORT_USER_STRING_DESC */ + +/** + * @} + */ + +#endif /* __USBD_DESC_H */ + +/** + * @} + */ + +/** +* @} +*/ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_usr.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_usr.c new file mode 100644 index 00000000..ef9aefc8 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_usr.c @@ -0,0 +1,206 @@ +/** + ****************************************************************************** + * @file usbd_usr.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file includes the user application layer + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_usr.h" +#include "usbd_ioreq.h" +#include "boot.h" /* bootloader generic header */ +#include "usb.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY +* @{ +*/ + +/** @defgroup USBD_USR +* @brief This file includes the user application layer +* @{ +*/ + +/** @defgroup USBD_USR_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USBD_USR_Private_Defines +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USBD_USR_Private_Macros +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USBD_USR_Private_Variables +* @{ +*/ + +USBD_Usr_cb_TypeDef USR_cb = +{ + USBD_USR_Init, + USBD_USR_DeviceReset, + USBD_USR_DeviceConfigured, + USBD_USR_DeviceSuspended, + USBD_USR_DeviceResumed, + USBD_USR_DeviceConnected, + USBD_USR_DeviceDisconnected, +}; + +/** +* @} +*/ + +/** @defgroup USBD_USR_Private_Constants +* @{ +*/ + +/** +* @} +*/ + + + +/** @defgroup USBD_USR_Private_FunctionPrototypes +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USBD_USR_Private_Functions +* @{ +*/ + +/** +* @brief USBD_USR_Init +* Displays the message on LCD for host lib initialization +* @param None +* @retval None +*/ +void USBD_USR_Init(void) +{ +} + +/** +* @brief USBD_USR_DeviceReset +* Displays the message on LCD on device Reset Event +* @param speed : device speed +* @retval None +*/ +void USBD_USR_DeviceReset(uint8_t speed ) +{ + switch (speed) + { + case USB_OTG_SPEED_HIGH: + break; + + case USB_OTG_SPEED_FULL: + break; + default: + break; + } +} + + +/** +* @brief USBD_USR_DeviceConfigured +* Displays the message on LCD on device configuration Event +* @param None +* @retval Staus +*/ +void USBD_USR_DeviceConfigured (void) +{ +} + +/** +* @brief USBD_USR_DeviceSuspended +* Displays the message on LCD on device suspend Event +* @param None +* @retval None +*/ +void USBD_USR_DeviceSuspended(void) +{ + /* Users can do their application actions here for the USB-Reset */ + UsbEnterLowPowerModeHook(); +} + + +/** +* @brief USBD_USR_DeviceResumed +* Displays the message on LCD on device resume Event +* @param None +* @retval None +*/ +void USBD_USR_DeviceResumed(void) +{ + /* Users can do their application actions here for the USB-Reset */ + UsbLeaveLowPowerModeHook(); +} + + +/** +* @brief USBD_USR_DeviceConnected +* Displays the message on LCD on device connection Event +* @param None +* @retval Staus +*/ +void USBD_USR_DeviceConnected (void) +{ + /* cable plugged-in */ + UsbConnectHook(BLT_TRUE); +} + +/** +* @brief USBD_USR_DeviceDisonnected +* Displays the message on LCD on device disconnection Event +* @param None +* @retval Staus +*/ +void USBD_USR_DeviceDisconnected (void) +{ + /* Disable the Pull-Up */ + UsbConnectHook(BLT_FALSE); +} +/** +* @} +*/ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ 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 6fa1441e..27c88696 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 58fa9f15..0e4bf965 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,29 +1,29 @@ S02000006F70656E62746C5F6F6C696D65785F73746D3332653430372E737265630B -S31508000000902C0020598600089D8600089D860008C9 -S315080000109D8600089D8600089D8600089D86000826 -S315080000209D8600089D8600089D8600089D86000816 -S315080000309D8600089D8600089D8600089D86000806 -S315080000409D8600089D8600089D8600089D860008F6 -S315080000509D8600089D8600089D8600089D860008E6 -S315080000609D8600089D8600089D8600089D860008D6 -S315080000709D8600089D8600089D8600089D860008C6 -S315080000809D8600089D8600089D8600089D860008B6 -S315080000909D8600089D8600089D8600089D860008A6 -S315080000A09D8600089D8600089D8600089D86000896 -S315080000B09D8600089D8600089D8600089D86000886 -S315080000C09D8600089D8600089D8600089D86000876 -S315080000D09D8600089D8600089D8600089D86000866 -S315080000E09D8600089D8600089D8600089D86000856 -S315080000F09D8600089D8600089D8600089D86000846 -S315080001009D8600089D8600089D8600089D86000835 -S315080001109D8600089D8600089D8600089D86000825 -S315080001209D8600089D8600089D8600089D86000815 -S315080001309D8600089D8600089D8600089D86000805 -S315080001409D8600089D8600089D8600089D860008F5 -S315080001509D8600089D8600089D8600089D860008E5 -S315080001609D8600089D8600089D8600089D860008D5 -S315080001709D8600089D8600089D8600089D860008C5 -S30D080001809D8600089D86000813 +S315080000002836002015AB000879AB000879AB000844 +S3150800001079AB000879AB000879AB000879AB000822 +S3150800002079AB000879AB000879AB000879AB000812 +S3150800003079AB000879AB000879AB000879AB000802 +S3150800004079AB000879AB000879AB000879AB0008F2 +S3150800005079AB000879AB000879AB000879AB0008E2 +S3150800006079AB000879AB000879AB000879AB0008D2 +S3150800007079AB000879AB000879AB000879AB0008C2 +S3150800008079AB000879AB000879AB000879AB0008B2 +S3150800009079AB000879AB000879AB000879AB0008A2 +S315080000A079AB000879AB000879AB000879AB000892 +S315080000B079AB000879AB000879AB000879AB000882 +S315080000C079AB000879AB000879AB000879AB000872 +S315080000D079AB000879AB000879AB000879AB000862 +S315080000E079AB000879AB000879AB000879AB000852 +S315080000F079AB000879AB000879AB000879AB000842 +S3150800010079AB000879AB000879AB000879AB000831 +S3150800011079AB000879AB000879AB000879AB000821 +S3150800012079AB000879AB000879AB000879AB000811 +S3150800013079AB000879AB000879AB000879AB000801 +S3150800014079AB000879AB000879AB000879AB0008F1 +S3150800015079AB000879AB000879AB000879AB0008E1 +S3150800016079AB000879AB000879AB000879AB0008D1 +S3150800017079AB000879AB000879AB000879AB0008C1 +S30D0800018079AB000879AB000811 S3150800018803E00B780370491C401C13005A1E002B09 S31508000198F7D1704701E00170401C13005A1E002B66 S315080001A8F9D1704710B400231400621E002C06D03B @@ -353,7 +353,7 @@ S315080015D8211250EA012094F820120843E06094F892 S315080015E81F0294F81E12090451EA006094F81D12A5 S315080015F850EA012094F81C12084320612670DFF887 S31508001608C8090088401CDFF8C0190880E080002057 -S315080016182063002020710020F2BD00006C860008B7 +S315080016182063002020710020F2BD000028AB0008D6 S3150800162880B500280BD00168002908D00168097818 S31508001638002904D00168C9888288914201D0092006 S3150800164808E00068407802F006F8C00701D50320CC @@ -384,8 +384,8 @@ S315080017C8E0612762F6B2002E19D1A5713900009892 S315080017D8FFF76BF82061F87FB97F090451EA0060C2 S315080017E8797F50EA0120397F0843E0600020A0602D S315080017F80020A061009820600098C088A08030006A -S31508001808C0B20DB0BDE8F083AC860008A481000814 -S31508001818D08600082DE9F047050016001F000C00C1 +S31508001808C0B20DB0BDE8F08388AB00083CA5000857 +S31508001818ACAB00082DE9F047050016001F000C00C0 S31508001828002038602800FFF7FBFEC0B2002801D068 S31508001838C0B2E3E0A879000601D50220DEE0A8795F S31508001848C00701D40720D9E0E868A968401AB04259 @@ -495,7 +495,7 @@ S31508001EB80500EDB2002D15D100A80990DFF80C0130 S31508001EC80A900C9903A8FFF77BF90500EDB2002DD7 S31508001ED808D10898002804D0210003A8FFF7F3F8CA S31508001EE800E006252800C0B20DB030BD46415400B2 -S31508001EF82C24002071B595B0012200A915A8FFF772 +S31508001EF8AC2D002071B595B0012200A915A8FFF7E9 S31508001F08D8F90400E4B2002C56D109A806902F483F S31508001F180790159900A8FFF753F90400E4B2002CB6 S31508001F284AD1059D002D01D1062403E0E87AC007A9 @@ -508,7 +508,7 @@ S31508001F88E4B2042C00D10024E4B2002C14D100A831 S31508001F98FEF74AFF0400E4B2002C0DD1002E04D047 S31508001FA831000098FEF7DDFA0400E4B2002C03D1EC S31508001FB80098FEF757F904002000C0B216B070BDA5 -S31508001FC8525261417272416170240020641D0020DA +S31508001FC85252614172724161082E00202424002071 S31508001FD82DE9FC4104000F00904600252600FFE77E S31508001FE8781E854213DA00AB012201A94046FFF79D S31508001FF811FC009801280AD19DF80400C0B20D28E2 @@ -709,8 +709,8 @@ S31508002C18B6FE5FF007084046C0B21BE05FF0FF3912 S31508002C2805E000F09BFE3060361DB9F101095FF436 S31508002C38001000F099FE002802D0B9F1000FF0D173 S31508002C4840F2FF5000F09BFEDFF86804002101609F -S31508002C584046C0B2BDE8F2830000000018230020F1 -S31508002C68B021002000080240482300203024002014 +S31508002C584046C0B2BDE8F28300000000542C0020AC +S31508002C68C029002000080240842C0020B02D00202E S31508002C78000010802DE9F84F14001D005FF00009C8 S31508002C885FF000085FF0000A5FF0000B0600DFF847 S31508002C987C0200210170DFF8780200210160DFF864 @@ -745,15 +745,15 @@ S31508002E58102000F094FD5FF005094846C0B214E05A S31508002E684FF4007000F080FD002808D04FF4007079 S31508002E7800F085FD5FF007094846C0B205E0DFF8AF S31508002E887002002101604846C0B2BDE8F28F000012 -S31508002E986C230020342400205C23002030240020E2 +S31508002E98A82C0020B42D0020982C0020B02D002046 S31508002EA838B504000025002C03D126252800C0B211 S31508002EB82BE0DFF8A80400680004DFF810130860A0 S31508002EC8DFF808030D214160DFF80003402181601F S31508002ED8DFF8F8020021C160DFF8F0024FF48061DC S31508002EE80161DFF8E80200F000FD0D2000F05CF84B S31508002EF80500EDB2002D02D02800C0B205E000207A -S31508002F0800F00BFD20602800C0B232BD80240020E6 -S31508002F183C240020382400202C2C01403023002093 +S31508002F0800F00BFD20602800C0B232BD182E002044 +S31508002F18BC2D0020B82D00202C2C01406C2C00203C S31508002F28342C014038B500245FF4803500E06D1E66 S31508002F38002D04D0802000F017FD0028F7D0002DBA S31508002F4803D103242000C0B205E040F2FF5000F088 @@ -779,11 +779,11 @@ S3150800307813201DE0410301D5142019E0810301D569 S31508003088152015E0C10301D5162011E0010401D564 S3150800309817200DE0410401D5182009E0810401D55F S315080030A8192005E0000701D51A2001E02000C0B262 -S315080030B832BD00001000002010B50024DFF82007F4 +S315080030B832BD0000D400002010B50024DFF8200730 S315080030C8006802E0DFF81807006810F0450FF9D025 S315080030D8400706D50324042000F051FC2000C0B29E S315080030E805E040F2FF5000F04AFC2000C0B210BDCF -S315080030F81000002010B50024DFF8E406006802E096 +S315080030F8D400002010B50024DFF8E406006802E0D2 S31508003108DFF8DC06006810F0450FF9D0410706D548 S315080031180324042000F033FC2000C0B20EE0C007E8 S3150800312806D50124012000F02AFC2000C0B205E0DB @@ -796,7 +796,7 @@ S31508003188C8FBF6B2B04203D010252800C0B21CE02E S3150800319840F2FF5000F0F3FB002000F0BEFB10F4ED S315080031A8604F04D1000C20802800C0B20DE08104CD S315080031B801D5132009E0410401D5102005E00004D3 -S315080031C801D50F2001E02800C0B270BD48230020B1 +S315080031C801D50F2001E02800C0B270BD842C00206C S315080031D830B583B00400002500A80021002206C0E7 S315080031E80838002000F099FB800103D50E25280031 S315080031F8C0B2B2E000A95948006880B200F0B0F839 @@ -821,7 +821,7 @@ S31508003318DFF8D40406214160DFF8CC044021816037 S31508003328DFF8C4040021C160DFF8BC044FF48061EB S315080033380161DFF8B40400F0D8FA0620FFF734FE76 S315080033480500EDB2002D02D02800C0B205E028001D -S31508003358C0B202E025252800C0B23EBD34240020AC +S31508003358C0B202E025252800C0B23EBDB42D002023 S315080033687CB50C000025002600A80021002206C00E S315080033780838DFF8740408210160DFF86C041021A6 S315080033884160DFF8640440218160DFF85C040021AD @@ -865,7 +865,7 @@ S315080035D8884800F0F3F90420009000A9864800F00E S315080035E8EDF94FF48050009000208DF8070000A9E7 S315080035F8804800F0E3F94FF40060009002208DF847 S31508003608040000208DF8070000A97A4800F0D6F9CA -S3150800361801214FF4006000F0FBFA01215FF48000F5 +S3150800361801214FF4006000F00BFB01215FF48000E4 S3150800362800F0D6FA07BD00B597B0FEF741FDC0B25F S3150800363800280AD17148007810F0FE006F49087012 S3150800364800A8FEF7BBFF002003E06C4801210170C3 @@ -878,11 +878,11 @@ S315080036A84FF40070009055FA86F04FF4007101FB4C S315080036B800F2002301A8FFF7D0F90100C9B20029D2 S315080036C801D0012013E0FEF74EFD0128FBD04FF488 S315080036D8007201A9F6B24FF4007000FB064000F02C -S315080036E8DBFAF6B2002ED6D1002000E001200DF54F +S315080036E8EDFAF6B2002ED6D1002000E001200DF53D S315080036F8027D70BD70B5ADF5027D0C0015001E0083 S315080037080021C0B2002801D001202EE03000461E54 S31508003718C0B2002828D04FF40072F6B24FF40070F1 -S3150800372800FB064101A800F0B7FA4FF400700090B4 +S3150800372800FB064101A800F0C9FA4FF400700090A2 S3150800373855FA86F04FF4007101FB00F2002301A840 S31508003748FFF798FA0100C9B2002904D0C9B20529B9 S3150800375801D0012009E0FEF706FD0128FBD0F6B2E4 @@ -894,8 +894,8 @@ S315080037A809D100A8FEF70AFFDDE91201400A40EA36 S315080037B8C150490A206000200CE04FF400702080B0 S315080037C8002007E0DBB2002B01D120202060002072 S315080037D800E00420C0B216B010BD094870470000C2 -S315080037E8342C014008E0FFFD48230020342400203B -S315080037F83023002000080240000C02401500002073 +S315080037E8342C014008E0FFFD842C0020B42D00206D +S315080037F86C2C002000080240000C0240E100002062 S315080038080000AA4280B2802801DA01001EE00029D9 S315080038180CD080B2FF2801DD002106E080B21949E4 S3150800382811EB4000B0F5807001880FE0002100E038 @@ -904,9 +904,9 @@ S3150800384880B29042F4D111F18000C1B2080080B26A S315080038587047002100E0491C0B4A32F81120002A5B S3150800386805D0094A32F8112080B29042F3D1064AA7 S3150800387832F81120002A03D0044830F81100FFE76F -S3150800388880B27047487F0008447A0008247C0008FC -S3150800389880B501214FF4006000F0DAF900214FF4F1 -S315080038A8006000F0D5F901BD0021364A12681100FA +S3150800388880B27047B8A20008B49D0008949F000843 +S3150800389880B501214FF4006000F0EAF900214FF4E1 +S315080038A8006000F0E5F901BD0021364A12681100EA S315080038B8354A1140027D83681A4343681A43C36828 S315080038C81A4303681A430069104301432D480160E7 S315080038D870472E49C0B2086070472D49086070477E @@ -943,1222 +943,1825 @@ S31508003AB8CA1010EB8202126A1A43140089B2C91096 S31508003AC810EB81000462F0BC704750F8041B61B122 S31508003AD850F8042BD30744BFA9F101039A18002309 S31508003AE842F8043B091FFAD1EFE77047F0B4002102 -S31508003AF800220023022400250226DFF874713F6895 +S31508003AF800220023022400250226DFF894713F6875 S31508003B0817F00C073900002904D0042906D008291B -S31508003B1808D035E0DFF86011016034E0DFF85C11A1 -S31508003B28016030E0DFF84C110968C1F38055DFF809 -S31508003B384411096811F03F06002D0BD0DFF83C1137 -S31508003B48B1FBF6F1DFF82C211268C2F3881202FBE2 -S31508003B5801F30AE0DFF82011B1FBF6F1DFF81421CA -S31508003B681268C2F3881202FB01F3DFF80811096824 +S31508003B1808D035E0DFF88011016034E0DFF87C1161 +S31508003B28016030E0DFF86C110968C1F38055DFF8E9 +S31508003B386411096811F03F06002D0BD0DFF85C11F7 +S31508003B48B1FBF6F1DFF84C211268C2F3881202FBC2 +S31508003B5801F30AE0DFF84011B1FBF6F1DFF834218A +S31508003B681268C2F3881202FB01F3DFF82811096804 S31508003B78C1F30141491C4C00B3FBF4F1016002E0B2 -S31508003B88DFF8F4100160DFF8E810096811F0F001B1 -S31508003B980909DFF8EC208A5C0168D1404160DFF842 -S31508003BA8D010096811F4E051890ADFF8D4208A5C34 -S31508003BB84168D14081602E49096811F46041490B72 -S31508003BC8DFF8BC208A5C4168D140C160F0BC704708 -S31508003BD8C9B2002905D02B4909680843294908604C -S31508003BE805E02849096831EA00002649086070474F -S31508003BF8C9B2002905D0244909680843224908603A -S31508003C0805E02149096831EA00001F49086070473C -S31508003C18C9B2002905D01D49096808431B49086027 -S31508003C2805E01A49096831EA00001849086070472A -S31508003C38C9B2002905D01649096808431449086015 -S31508003C4805E01349096831EA000011490860704718 -S31508003C58C9B2002905D00F49096808430D49086003 -S31508003C6805E00C49096831EA00000A490860704706 -S31508003C7808380240043802400024F400001BB70044 -S31508003C8800000020303802404038024044380240DC -S31508003C98103802402438024010B50400200000F00D -S31508003CA803F8200010BD000062B38B0708D0521E27 -S31508003CB811F8013B00F8013B00F024808B07F6D188 -S31508003CC8830740F0208000BF103A07D330B4B1E824 -S31508003CD83810103AA0E83810F9D230BC530724BF78 -S31508003CE8B1E80810A0E8081044BF51F8043B40F8AA -S31508003CF8043BD20724BF31F8022B20F8022B44BF15 -S31508003D080B7803707047083A07D3B1E80810083AE1 -S31508003D1840F8043B40F804CBF7D25307E4E7000021 -S31508003D28C2788A18DFF81832DA70827889B20B0AEC -S31508003D389A18DFF80C329A70DFF804224378537021 -S31508003D48DFF8FC2100781070DFF8F401807889B272 -S31508003D580A0AD2B2904212D2DFF8E4014078401C2F -S31508003D68DFF8DC215070DFF8D8014078002806D142 -S31508003D78DFF8CC010078401CDFF8C4211070DFF8A2 -S31508003D88C001C07889B2C9B2884217DADFF8B0012B -S31508003D988078401C6A4988706948807800280DD15F -S31508003DA867484078401C6649487065484078002846 -S31508003DB804D163480078401C61490870704710B4FC -S31508003DC892B25218531E0AE00A7812024C7812194F -S31508003DD8101880B292B2904200D2401C891C9942AF -S31508003DE8F2D3994207D109780A02101880B292B21A -S31508003DF8904200D2401C80B210BC704780B514228D -S31508003E0850490020FFF7DBFF80B2002802D14FF6A1 -S31508003E18FF7002E080B201F05FF880B202BD10B50B -S31508003E284949097C0902484A527C8918B1F114049F -S31508003E3854FA80F00822454980B2FFF7C0FF2200ED -S31508003E4892B2434980B2FFF7BAFF80B2002802D17E -S31508003E584FF6FF7002E080B201F03EF880B210BD5E -S31508003E6880B50620FFF7DBFF02BD3A48002101703E -S31508003E780AE0384800783849002221F810203548E1 -S31508003E880078401C33490870324800780028F0D07A -S31508003E983048002101700CE02E48007868212F4A26 -S31508003EA801FB0020002141762A480078401C294950 -S31508003EB80870284800780028EED029484FF4806111 -S31508003EC801807047234900220A7004E021490978CD -S31508003ED8491C204A11701F49097800290CD11D4927 -S31508003EE809781D4A32F811100029EFD119490978BD -S31508003EF8194A22F81100FFE7704780B5010089B210 -S31508003F08DFF8DC0D00680830FFF70AFFDFF8D00D88 -S31508003F1800680B4909780172DFF8C40D006808497A -S31508003F2849784172DFF8B80D0068054989788172C1 -S31508003F38DFF8AC0D00680249C978C17201BD0000F6 -S31508003F4868240020260000201800002032000020DF -S31508003F583A0000208424002076240020E820002047 -S31508003F687A24002010B5DFF8781D0C68DFF8C41D20 -S31508003F78DFF8C42D1160DFF8C42D1160C0B203281C -S31508003F8818D1607E10F00F0003280AD1208A00286D -S31508003F9807D1DFF8AC0D0821017001F03CF800F0F4 -S31508003FA864BEDFF8A00D00210180DFF8940D00211A -S31508003FB8017010BDC0B2022840F0CB80DFF8880D2A -S31508003FC8C078401CDFF8801DC870C0B200281AD116 -S31508003FD8DFF8740D8078401CDFF86C1D8870C0B255 -S31508003FE8002810D1DFF8600D4078401CDFF8581D0E -S31508003FF84870C0B2002806D1DFF84C0D0078401C7E -S31508004008DFF8441D0870DFF83C0D00210180DFF851 -S315080040183C0D00210180607E072802D0607E0528B5 -S3150800402808D1A07E401CA076A07E782801D1002061 -S315080040386076B6E7607E0028FBD0208A00287AD00A -S31508004048A07E411EA176C0B20028F2D1E07E0828DB -S3150800405808D0607E022802D0607E012810D1E07E52 -S3150800406805280DD100206076DFF8D40C8021017070 -S3150800407800F0D1FFDFF8A40D142180F82F108DE188 -S31508004088E07E052801DB042000E0E07E032111FA22 -S3150800409800F0A076E07E401CE076607E10F00F0007 -S315080040A8C0B201280AD0022835D0032839D00428F6 -S315080040B83FD006283DD008283BD0BAE7DFF85C0D84 -S315080040C8102180F82F10DFF8540D90F82F0050F0C3 -S315080040D80200DFF8481D81F82F00DFF8400D02219D -S315080040E880F83610DFF8340D042180F83710DFF829 -S315080040F82C0D062180F83810DFF8200D0A2180F8E3 -S315080041083910DFF8400C2C210180DFF8100D6021EA -S3150800411880F82E104BE1DFF8040D002180F82F10E7 -S31508004128D1E7DFF81C0C0421017000F074FF00F0D9 -S31508004138DEBD00F041BD607E10F00F0003287FF455 -S3150800414878AFDFF8FC0B0821017000F064FF00F077 -S315080041588CBDDFF8C80C807B45287FF422AFDFF8D2 -S31508004168E40B0088DFF8B41C097C0902DFF8AC2CDC -S31508004178527C8918884216DBDFF8A00C007C0002FE -S31508004188DFF8981C497C4018DFF8B81B0880DFF868 -S315080041988C0C007D3F21084204D1DFF8800C407D55 -S315080041A8002801D0FDE6FCE6DFF8240D0088DFF8D4 -S315080041B8241D0988884207D1DFF8140D4088DFF8DE -S315080041C8141D4988884210D0DFF8500CC08BDFF8D8 -S315080041D8001D0988884207D1DFF8400C008CDFF8F3 -S315080041E8F01C4988884200D0DBE6FFF707FE4FF641 -S315080041F8FF7188427FF4D5AEDFF8200CC07D06280B -S3150800420808D1FFF72DFE4FF6FF71884244D1DFF833 -S31508004218F84C43E0DFF8040CC07D01287FF4C1AEF2 -S31508004228DFF8F80B90F8220008287FF4BAAEDFF812 -S31508004238EC0B002180F82210DFF8E00B808C4FF693 -S31508004248F771884207DBDFF8D40B808C0930DFF872 -S31508004258CC1B888406E0DFF8C40B808C0830DFF8AE -S31508004268BC1B8884DFF8B40BDFF8B01B498BC18305 -S31508004278DFF8A80BDFF8A41B898B0184DFF89C0BF1 -S31508004288DFF84C1C09884183DFF8900BDFF8401CDF -S315080042984988818300F016BE83E66834DFF8680C1F -S315080042A8A042C0F0DB80607E0028F6D0DFF86C0BF1 -S315080042B8808CA1888842F0D1DFF8600B408CE188B1 -S315080042C88842EAD1DFF8540B408B21888842E4D12A -S315080042D8DFF8480B808B61888842DED1DFF8000A50 -S315080042E80460DFF85C0A00210170DFF8300B90F8EB -S315080042F82F00400700F1BC82DFF8200B90F82E004B -S31508004308C0B200098000DFF8041C0870DFF8340A18 -S315080043180088DFF8F81B0978401A1438DFF8241AD9 -S315080043280880607E10F00F00022808D1DFF8EC0A32 -S3150800433890F82F0010F03F00122800F0A382DFF84B -S31508004348040A0088002807D1DFF8D00A90F82F0059 -S315080043580321084200F09682DFF8C00A90F8260082 -S31508004368217A884215D1DFF8B40A90F82700617ACD -S3150800437888420ED1DFF8A40A90F82800A17A884264 -S3150800438807D1DFF8980A90F82900E17A884200F000 -S315080043987982DFF8880A102180F82F10DFF8A40937 -S315080043A828210180DFF8740A502180F82E10DFF8DA -S315080043B86C0A217A80F82A10DFF8600A617A80F890 -S315080043C82B10DFF8580AA17A80F82C10DFF84C0A67 -S315080043D8E17A80F82D10DFF8440A217B80F8261048 -S315080043E8DFF8380A617B80F82710DFF8300AA17BE6 -S315080043F880F82810DFF8240AE17B80F82910DFF80E -S315080044081C0A0621C175DFF8140AA1884184DFF859 -S315080044180C0AE1888184DFF8040ADFF8B41A0988E7 -S315080044284183DFF8F809DFF8A81A49888183DFF895 -S31508004438EC092188C183DFF8E40961880184607E74 -S31508004448C00640F1F9840020DFF8D01981F8310058 -S31508004458DFF8C81981F8300000F0F6BCDFF8BC09A7 -S3150800446890F82F0010F03F00022806D0DFF8AC09B4 -S3150800447890F82F00400729D593E5DFF8A009808C26 -S31508004488DFF88C1A0880DFF8840A0021017006E034 -S31508004498DFF8780A0078401CDFF8701A0870DFF829 -S315080044A86C0A00780028E1D1DFF8640A0088DFF88A -S315080044B85C1A0978DFF85C2A32F811108842E7D1C5 -S315080044C80024DFF8480A00210170E6E0DFF84C0905 -S315080044D8142180F82F10DFF86C0828210180DFF8EE -S315080044E83C09502180F82E10DFF8300990F8290089 -S315080044F8DFF8181A0870DFF82409DFF8201991F888 -S315080045082D1080F82910DFF81409DFF8001A097841 -S3150800451880F82D10DFF8040990F82800DFF8EC1960 -S315080045280870DFF8F808DFF8F41891F82C1080F806 -S315080045382810DFF8E808DFF8D419097880F82C106D -S31508004548DFF8D80890F82700DFF8C0190870DFF8F0 -S31508004558CC08DFF8C81891F82B1080F82710DFF870 -S31508004568BC08DFF8A819097880F82B10DFF8AC081A -S3150800457890F82600DFF894190870DFF8A008DFF825 -S315080045889C1891F82A1080F82610DFF89008DFF8AA -S315080045987C19097880F82A10DFF8800890F82D0029 -S315080045A8401CDFF8781881F82D00C0B2002820D101 -S315080045B8DFF8680890F82C00401CDFF8601881F8C6 -S315080045C82C00C0B2002814D1DFF8500890F82B0048 -S315080045D8401CDFF8481881F82B00C0B2002808D11B -S315080045E8DFF8380890F82A00401CDFF8301881F8F8 -S315080045F82A00DFF82808408CDFF814190880DFF845 -S315080046081C08DFF81818898C4184DFF81008DFF8C9 -S31508004618001909888184DFF80408DFF80018498B2F -S31508004628C183DFF8F807DFF8F417898B0184DFF808 -S31508004638EC07DFF89C1809884183DFF8E007DFF8FC -S3150800464890184988818300F0FFBBDFF8C008007816 -S315080046586821DFF8B42801FB0020407E072815D119 -S31508004668002C0BD0A07EDFF8A41809786822DFF89A -S31508004678983802FB0131897E884207D2DFF88C0810 -S3150800468800786821DFF8802801FB0024DFF87C0819 -S315080046980078401CDFF874180870DFF8700800788E -S315080046A8002812D1DFF8640800786821DFF858284E -S315080046B801FB0020407E0028C7D1DFF850080078A3 -S315080046C86821DFF8442801FB0024002C3FF469AC74 -S315080046D8DFF80C0604600320A07620760020A07573 -S315080046E80420E0750020E076DFF83007808CA0808B -S315080046F8DFF82807408CE080DFF82007408B208009 -S31508004708DFF81807808B608001206076DFF83806A6 -S3150800471800782073DFF8300640786073DFF82806DB -S315080047288078A073DFF82006C078E073012020821D -S31508004738DFF8E80690F82900E072DFF8E00690F856 -S315080047482800A072DFF8D40690F827006072DFF810 -S31508004758CC0690F8260020720120FFF7CEFBDFF87A -S31508004768BC0690F82E0010F0F0005128FFF6A6AC0B -S31508004778DFF898070021017006E0DFF8900700784F -S31508004788401CDFF888170870DFF880070078DFF81C -S315080047988C1691F82E10C9B20909C9B2491FB0EB8F -S315080047A8810FBFF68BACDFF864070078DFF86C1664 -S315080047B8401890F83600DFF860170870DFF85807D1 -S315080047C8007800283FF47AACDFF84C07007801280F -S315080047D8D3D0DFF84407007802282ED1DFF82C0753 -S315080047E80078DFF83816401890F83700042824D1DE -S315080047F8DFF818070078DFF82416401890F838000C -S31508004808DFF808170978DFF81426891891F8391097 -S3150800481851EA0020DFF8F8160880DFF8F406008861 -S3150800482840F20B61884202DB40F20A6002E0DFF8D8 -S31508004838E00600886082A08240E4DFF8D0060078A7 -S31508004848DFF8D815401890F8370000283FF436AC3A -S31508004858DFF8B8060078DFF8B4160978DFF8BC255B -S31508004868891891F837100818DFF8A01608708BE72A -S3150800487800206076DFF8C8042021017000F0CBFB21 -S31508004888FFF78FBBDFF8940590F82F00C00664D5AC -S31508004898208A002861D0218A14F10C00FFF740FA13 -S315080048A8DFF8780590F82A00DFF870160978884244 -S315080048B853D1DFF8680590F82B00DFF860164978B9 -S315080048C888424AD1DFF8540590F82C00DFF84C16D0 -S315080048D88978884241D1DFF8440590F82D00DFF839 -S315080048E83C16C978884238D1DFF830060078207334 -S315080048F8DFF8280640786073DFF820068078A0730A -S31508004908DFF81806C078E073E07E00281DD194F910 -S31508004918180094F91A10401AA17DC9B2B0EBD10053 -S31508004928A17D4118A17540B2002801D540B2404280 -S31508004938E17DC9B2B0EB9100E17D4018E075A07D34 -S31508004948C0B2E17D11EBD0002076DFF8F40301212F -S315080049580170207EA07600202082607E10F00F006D -S31508004968C0B2012813D0C0F06582032800F0FA8087 -S3150800497835D3052800F02F82C0F0F881072800F003 -S315080049884F82C0F04F82082800F0E48152E2DFF82F -S31508004998B0030078C00720D503206076DFF8A003A7 -S315080049A84021017000202082DFF89803008800283B -S315080049B80CD0DFF88C03007850F00200DFF880137B -S315080049C80870DFF880030088FFF797FADFF87C039A -S315080049D80021018000F01FFB47E1FFF7E2BADFF884 -S315080049E860030078C00740F1B380DFF8300490F818 -S315080049F82F0010F03F00122840F0AA80DFF81C04A8 -S31508004A0890F82E0010F0F000512829DBDFF8FC0496 -S31508004A180021017006E0DFF8F4040078401CDFF88E -S31508004A28EC140870DFF8E4040078DFF8F01391F85E -S31508004A382E10C9B20909C9B2491FB0EB810F0FDA9E -S31508004A48DFF8C8040078DFF8D413401890F8360061 -S31508004A58DFF8C4140870DFF8C0040078002826D1E7 -S31508004A6803206076DFF8B40390F826002072DFF892 -S31508004A78AC0390F827006072DFF8A00390F82800C6 -S31508004A88A072DFF8980390F82900E0720120FFF772 -S31508004A9834FAAB484221017000202082A948002137 -S31508004AA80180AA480021018000F0B5FADDE0DFF8A8 -S31508004AB8680400780128AED0DFF85C04007802287C -S31508004AC82ED1DFF848040078DFF85013401890F81C -S31508004AD83700042824D1DFF834040078DFF83C13BB -S31508004AE8401890F83800DFF824140978DFF82C23E2 -S31508004AF8891891F8391051EA0020DFF8141408804B -S31508004B08DFF80C04008840F20B61884202DB40F2A9 -S31508004B180A6002E0DFF8F80300886082A0829FE74F -S31508004B28DFF8E8030078BD49401890F837000028F0 -S31508004B3896D0DFF8D8030078DFF8D0130978B74A93 -S31508004B48891891F837100818DFF8C013087069E74C -S31508004B587B482021017000F05EFA61480068002150 -S31508004B68417683E4AD4890F82F00C0072AD5607EC1 -S31508004B78C00627D4208A00287FF413AA714800881B -S31508004B88401C80B2FFF7B9F96D48007850F010005C -S31508004B986B4908706B480088002805D06848007873 -S31508004BA850F002006649087000F035FA01202082A4 -S31508004BB8082060760020E0769848112180F82F10A2 -S31508004BC8FFF7ECBB954890F82F00800619D593484F -S31508004BD890F83400914991F8351051EA0020564961 -S31508004BE80968401854490860564800888B4991F85E -S31508004BF834108A4A92F8352052EA0121401A514956 -S31508004C0808805048008800280CD0607EC00609D461 -S31508004C184B48007850F0020049490870494800880E -S31508004C28FFF76BF97D4890F8300000027B4991F848 -S31508004C3831104018B6490880A08AB54909888842BB -S31508004C4803D3B3480088002802D1A08AB04908804F -S31508004C58AF48008860823A4800780321084277D02E -S31508004C683A480021018000F0D6F9354800788006D0 -S31508004C780AD5364800210180002060766748142145 -S31508004C8880F82F10FFF78ABB2D480078C0060ED586 -S31508004C982E48002101800120208204206076002009 -S31508004CA8E0765E48112180F82F10FFF777BB274872 -S31508004CB80088002819D022480078C00701D50020A6 -S31508004CC82082208A00280DD1608A204909888842CE -S31508004CD802D2608A1D4908801C480088208204E0A0 -S31508004CE860240020208A194908800020E0761248A6 -S31508004CF81249096801601548008800280CD0208ADE -S31508004D08002809D0208A28300E49088043481821E7 -S31508004D1880F82F10FFF746BB09480078800717D593 -S31508004D280848282101803D48102180F82F10FFF7F0 -S31508004D3839BB00BF4E000020582400205C24002000 -S31508004D488324002072240020642400207424002070 -S31508004D58FFF727B972480078C00706D5002060769D -S31508004D686F481021017000F056F963E06D48008815 -S31508004D78002803D06B480088FFF7BFF8274890F843 -S31508004D882F00C00716D566480078C00706D507203D -S31508004D9860760020A0760020208201E00620607652 -S31508004DA80120FFF7AAF85E481021017000F033F9D0 -S31508004DB8FFF7EFBA5A480078C00705D50520607688 -S31508004DC800202082FFF7EDB85648008800287FF4AF -S31508004DD8E0AAFFF7E6B853480088002803D05148E8 -S31508004DE80088FFF78AF80D4890F82F00C0070DD5F8 -S31508004DF8072060760020A0760120FFF77EF848484D -S31508004E081021017000F007F9FFF7C3BA4548008872 -S31508004E1800287FF4BEAAFFF7C4B800BF1800002010 -S31508004E28FFF7B7BA3E480078C00703D5072060766B -S31508004E380020A076FFF7B5B83B48062180F8301061 -S31508004E4839480A2180F83110374840218175364893 -S31508004E583449098889B2090A0174334831490988E5 -S31508004E6841740020304981F835002F4981F834000B -S31508004E782D4800214186FEF7F3FFC0432A49488694 -S31508004E8829484521817328480021C17300202649ED -S31508004E9848752549087525480088401C234908800F -S31508004EA821482249098889B2090A81741E481F4976 -S31508004EB80988C1741C4800210183FEF79FFFC04377 -S31508004EC819490883164800210170FFF772B80000CF -S31508004ED84C240020F886000880B2010A51EA00200E -S31508004EE880B2704780B501290CDB114A1180114937 -S31508004EF80968884206D00E490A8801000D480068E4 -S31508004F08FEF7CAFE01BD0000E82000208424002020 -S31508004F187C2400207624002085240020682400208C -S31508004F2883240020722400201800002078240020FA -S31508004F38742400205C24002080B500F01BF900F0DA -S31508004F4819FB10F5FA708049086000F013FB00F5A4 -S31508004F581C5010307D490860FEF787FF4FF6A96098 -S31508004F68ADF8000043F61370ADF802007848BDF8AE -S31508004F78001001807648BDF8021041804FF6FF7090 -S31508004F88ADF800000020ADF802007248BDF8001020 -S31508004F9801807048BDF8021041804FF6A960ADF847 -S31508004FA8000040F21310ADF802006B48BDF8001077 -S31508004FB801806948BDF8021041804EF60300FEF7E5 -S31508004FC881FF00F0C2F901BD38B5644A126812F1CA -S31508004FD81C0422686260002205E092B2131992B294 -S31508004FE8155C1D72521C0B00DBB292B29BB29A4238 -S31508004FF8F3D3C9B2081DA4F84800B4F84810201D10 -S31508005008FFF770FF2068401C206031BD80B500F0AE -S3150800501832F8002002BD10B55048006810F11C048B -S315080050284F480078400605D5012020600020A4F8DE -S3150800503848001FE04A480078C00702D50020A4F8AF -S31508005048480047480078400708D5B4F848000028BB -S3150800505804D0B4F84810201DFFF744FF40480078EC -S31508005068800707D50020A4F848003E480068001DB8 -S3150800507800F0BAFA10BD10B500F094F900282DD042 -S31508005088394908804FF40060FFF726FF37498989B0 -S3150800509880B281420ED10120FEF764FF32480088AB -S315080050A800281BD000F0F1FD00F098F92E480021E1 -S315080050B8018013E040F60600FFF70EFF2B498989A1 -S315080050C880B281420AD100F07AFD27480088002874 -S315080050D804D000F083F924480021018000F04AFA38 -S315080050E81949096888421ED31748006810F5FA70E6 -S315080050F815490860002414E068201D4900FB0410BF -S31508005108164908600220FEF72DFF17480088002870 -S3150800511806D000F0BAFD00F061F9134800210180B5 -S31508005128641C002CE8D000F025FA0849096888426A -S3150800513808D30648006800F51C5010300349086073 -S3150800514800F072FC10BD0000402400204424002012 -S315080051584C240020542400205024002060240020D9 -S3150800516883240020582400207224002018000020D8 -S31508005178E820002010B5B2B001215FF0F050FEF724 -S3150800518827FD01214720FEF723FD01214FF4804022 -S31508005198FEF73EFD012000F051FE8E20009000200B -S315080051A88DF8060002208DF8040000208DF8070007 -S315080051B802208DF8050000A9DFF83803FEF7FEFB84 -S315080051C80B220121CB48FEF757FC0B220221C948BE -S315080051D8FEF752FC0B220321C648FEF74DFC0B22AC -S315080051E80721C448FEF748FC4FF4006000900020E9 -S315080051F88DF8060002208DF8040000208DF80700B7 -S3150800520802208DF8050000A9BB48FEF7D7FB0B223C -S315080052180B21B948FEF730FC3220009000208DF8A3 -S31508005228060002208DF8040000208DF807000220E9 -S315080052388DF8050000A9B148FEF7C0FB0B2201212D -S31508005248AE48FEF719FC0B220421AC48FEF714FCFD -S315080052580B220521A948FEF70FFC4FF4C040009021 -S3150800526800208DF8060002208DF8040000208DF82D -S31508005278070002208DF8050000A99F48FEF79EFB47 -S315080052880B220D219C48FEF7F7FB0B220E219A48A4 -S31508005298FEF7F2FB00F0D8FD01F052F801F059F8D4 -S315080052A80128FBD003A800F031FF00200390002056 -S315080052B80A904FF400700D9000200E905FF00040A1 -S315080052C81190202014900020169000201790002096 -S315080052D818904FF400600B904FF480400890002413 -S315080052E800E0641C202C15D20221200080B200F0B0 -S315080052F892FFADF80A000321200080B200F08BFF68 -S31508005308ADF8080002987E49884203D002987D497C -S315080053188842E6D1212C04D340F247117A4801F095 -S3150800532877F8210089B203A800F09AFD002804D16D -S315080053384FF4A671744801F06BF800F0C4F800F051 -S3150800534898F800F058FF32B010BD82B008208DF8E2 -S31508005358000000208DF8010027208DF8020069203A -S315080053688DF803005B208DF8040045208DF80500AC -S3150800537866489DF80010017064489DF80110417050 -S3150800538862489DF80210817060489DF80310C17044 -S315080053985E489DF8041001715C489DF80510417136 -S315080053A802B0704710B55A480068C00F002813D1D4 -S315080053B857480068C0F30D44220056495648FEF778 -S315080053C86BFC5348006850F0004051490860534840 -S315080053D801210160200000E0002010BD80B550487A -S315080053E80068C00F0028FAD14E4802884A494E4834 -S315080053F8FEF752FC4A484C49816049480021016039 -S315080054084748006850F480104549086044480068D1 -S3150800541850F00050424908604148006850F08050F2 -S315080054283F4908603E48006830F000603C4908601B -S315080054383B48006830F080603949086038480021E0 -S315080054484160384800883649496860F30B01344892 -S3150800545841603348406830F48050314948603048E4 -S31508005468006850F000402E49086030480121016064 -S3150800547801BD27482749816025480021016024483D -S315080054882349C1602248002141602148406830F418 -S3150800549800401F4948601E48406850F480401C492F -S315080054A848604FF4C8601A49496860F30C011848FF -S315080054B841601748006850F00040154908601C48C4 -S315080054C813490160704716481749816014481449FA -S315080054D8C1601348006850F48010114908601048E4 -S315080054E8002101600E480021416012480C490160FC -S315080054F870470000000002400018024000080240F9 -S3150800550819162200F1C00700908200081824002006 -S31508005518802300205C06002018000020089002401E -S3150800552800240020722400209C0C002004900240CD -S315080055380C9002401090024080B500F00DF8104813 -S3150800554810490160104800210160104805210160D2 -S315080055580F480021016001BD0C4800210160704711 -S315080055680A480068C00304D509480068401C084969 -S315080055780860704780B5FFF7F3FF0548006802BD65 -S3150800558814E000E03F90020018E000E010E000E0B8 -S3150800559848240020DFF8700400210170DFF8680449 -S315080055A800218164DFF86004002180F84310DFF8E1 -S315080055B858040021A0F84410DFF84C040021817033 -S315080055C8DFF84404002141707047DFF83C0400788E -S315080055D8002801D1002000E001207047DFF82804E0 -S315080055E8002180F84310704780B50178FF291ED13D -S315080055F800F091F8DFF8100490F84300012802D16A -S31508005608102000F07EF8DFF80004B0F944000128FD -S315080056180CDBDFF8F403012180F84310DFF8E80310 -S31508005628B0F94410DFF8E40300F053F801BDDFF8D9 -S31508005638D813097801294BD10178C92932D0CC2940 -S315080056483FD0CF293AD0D0292FD0D12933D0D22943 -S315080056582ED0F32917D0F4290FD0F5290AD0F62920 -S315080056680ED0FA2912D0FC2913D0FD2914D0FE2908 -S3150800567815D029E000F0DAF8BCE700F0F9F8B9E740 -S3150800568800F0C9F8B6E700F018F9B3E700F0ABF888 -S31508005698B0E700F0A2F8ADE700F087F8AAE700F04F -S315080056A875F8A7E700F03DF9A4E700F05CF9A1E76B -S315080056B800F01AF99EE700F087F99BE700F098F9D9 -S315080056C898E700F0ABF995E7202000F01AF891E77B -S315080056D8ACE780B589B200F0DEFE01BD10B4002340 -S315080056E802E00478E318401C0C00611E002CF8D16F -S315080056F8DBB21360012010BC7047C3480021417013 -S315080057087047C149FE22CA70BF490871BE480221BE -S31508005718A0F84410704710B5040000F022FF0028CE -S3150800572803D11020FFF7EDFF2FE0FFF7E6FFB64895 -S3150800573801210170B448FF21C170B34800210171E5 -S31508005748B148007950F01000AF490871AE480021F9 -S315080057584171AD48AC494979417100F0BDFEAA4985 -S31508005768887100F0CEFEA849C87100F0CAFE80B25A -S31508005778000AA5490872A44801214172A2480121D4 -S315080057888172A1480821A0F8441010BD10B504007C -S315080057989D4800210170FFF7B0FF9B48FF21C170A3 -S315080057A899480121A0F8441010BD9749FF22CA70EC -S315080057B8954900220A719449934A52784A7192493E -S315080057C800228A7190490022CA718F4900220A72FA -S315080057D88D490622A1F84420704710B50400002018 -S315080057E8FFF78FFF10BD8849FF22CA708649884A85 -S315080057F88A64854900220A71834900224A718249C6 -S3150800580800228A7180490722C1F807207E490822A2 -S31508005818A1F8442070477C49FF22CA707A49406833 -S31508005828886479480121A0F84410704710B5040027 -S3150800583800F052FE401E6178884203DA2220FFF7FC -S3150800584860FF14E0627892B26F48816C714801F083 -S315080058585FFA6D48FF21C1706B48806C6178401803 -S31508005868694988646078401C6749A1F8440010BDF6 -S3150800587810B5040000F030FE401E6178884203DA4D -S315080058882220FFF73EFF17E05F4861688164627867 -S3150800589892B25D48816C5F4801F03AFA5A48FF218E -S315080058A8C1705948806C617840185749886460788F -S315080058B8401C5549A1F8440010BD80B55249FF223D -S315080058C8CA70554A41685048806CFFF707FF4E4929 -S315080058D808714D48002141714B48002181714A4899 -S315080058E80821A0F8441001BD10B504004648FF2158 -S315080058F8C17045480021017143480021417100F0F3 -S31508005908EBFD4149887140480021C1713E48002194 -S3150800591801723D48002141723B480721A0F844100E -S3150800592810BD10B5040000F0D7FD621C80B2411EF8 -S315080059383548806C01F001FA002803D13120FFF7B9 -S31508005948E0FE0FE03048FF21C17000F0C5FD2E4982 -S31508005958896C80B2401E40182B4988642A48012160 -S31508005968A0F8441010BD10B5040000F0B5FD801E5F -S315080059786178884203DA2220FFF7C3FE23E022482B -S31508005988FF21C17020480121A0F84410607800283A -S3150800599807D101F0DEF9002802D13120FFF7B1FE60 -S315080059A811E0A21C61781848806C01F0C6F9002835 -S315080059B803D13120FFF7A5FE05E01348806C61780E -S315080059C840181149886410BD80B541680E48806C36 -S315080059D801F0B7F9002803D13120FFF792FE06E057 -S315080059E80948FF21C17008480121A0F8441001BDE3 -S315080059F810B5040001F074F90348FF21C170024884 -S31508005A080121A0F8441010BD082200200B2200200E -S31508005A18F08600080C2200200F22002080B53120CD -S31508005A28FFF76FFE01BD000080B5DFF8C8030078F0 -S31508005A38401CDFF8C0130870DFF8B00300210170B6 -S31508005A481EE0DFF8A80300780C21DFF8A42301FB81 -S31508005A58002001884288114300290AD0DFF89413E8 -S31508005A680978827A891A782903DB0422002101F049 -S31508005A787AF9DFF878030078401CDFF870130870A5 -S31508005A88DFF8680300780828DBDB01BD38B50C00A9 -S31508005A98DFF8581300220A7006E0DFF85013097871 -S31508005AA8491CDFF848231170DFF8401309780829DC -S31508005AB81FDADFF8381309780C22DFF8343302FBCB -S31508005AC8013529880029E8D069880029E5D00188A0 -S31508005AD82A889142E1D141886A889142DDD1062215 -S31508005AE82100281DFEF7D8F8DFF808030078A87201 -S31508005AF864E0DFF8F81200220A7006E0DFF8EC1214 -S31508005B080978491CDFF8E4221170DFF8E0120978F1 -S31508005B1808290DDADFF8D41209780C22DFF8D03212 -S31508005B2802FB013529880029E8D169880029E5D1C9 -S31508005B38AE490978082934D1AF4900220A70AF4915 -S31508005B4800220A70A94900220A701CE0A7490978A8 -S31508005B580C22A74B02FB0135A7490978A54A1278F2 -S31508005B68AB7AD21A914209DAA2490978AA7A891A25 -S31508005B78A14A1170A1499D4A12780A709B49097869 -S31508005B88491C9A4A1170994909780829DEDB974908 -S31508005B989A4A12780A70954909780C22944B02FB9E -S31508005BA80135042201002800FEF776F806222100AE -S31508005BB8281DFEF771F88F480078A87231BD80B5A0 -S31508005BC88F4800882A2803D28D48002101805BE087 -S31508005BD88B48002101808B48808AB0F5807F03D0E6 -S31508005BE8B0F5007F40D04FE08648C08C86490988C2 -S31508005BF8884238D18348008D83494988884232D1FA -S31508005C0882498348FFF742FF7E484FF40071818234 -S31508005C1806227E497F48FEF73FF806227E497B48DA -S31508005C28FEF73AF806227C497C48FEF735F806223C -S31508005C3878497448FEF730F872487249898BC184E6 -S31508005C4870487049C98B01856E486F4909888183F0 -S31508005C586C486D494988C1836A484FF4C161818196 -S31508005C6867482A2101800FE06648C08C664909887A -S31508005C78884209D16348008D63494988884203D117 -S31508005C8862496348FFF702FF01BD80B55D49C98BC4 -S31508005C98634A128891420BD15A49098C604A52883C -S31508005CA8914205D106225F495648FDF7F5FF8EE071 -S31508005CB85449C98B5C4A12881140534A12885A4B70 -S31508005CC81B881A4091420BD14E49098C564A52886C -S31508005CD811404D4A5288544B5B881A40914208D065 -S31508005CE85249534A12880A805049514A52884A806A -S31508005CF807E04449C98B4D4A11804C49414A128CE0 -S31508005D084A803A4900220A7004E038490978491C49 -S31508005D18364A11703549097808290FDA3348007860 -S31508005D280C21334A01FB0020404909880288914220 -S31508005D38EBD13E49498842889142E6D12B490978F0 -S31508005D4808293FD10622FF212E4801F00CF8062221 -S31508005D580021304801F007F806222F492F48FDF799 -S31508005D689BFF06222C492948FDF796FF25482F4907 -S31508005D780988C18423482D4949880185214822492B -S31508005D88098881831F4820494988C1831D484FF4DB -S31508005D98807181821B484FF48071C1811948082196 -S31508005DA8018218480621817416480421C1741548C9 -S31508005DB84FF4C16181811F481F49016010482A2193 -S31508005DC8018011E00622011D0E48FDF765FF06222F -S31508005DD811491248FDF760FF0A48082181810848D9 -S31508005DE800880E300649088001BD00008624002078 -S31508005DF85021002088240020892400208724002098 -S31508005E0872240020180000204C2400202E000020B0 -S31508005E183400002038000020182400201E00002026 -S31508005E28FC860008E8860008542400206C24002014 -S31508005E3850240020582400204E00002001490860FC -S31508005E4870470000DC00274280B501215FF000702A -S31508005E58FDF7EEFE00215FF00070FDF7E9FE01BDD3 -S31508005E682DE9F04186B004000D0000260027002021 -S31508005E780190DFF8488500200090DFF8440500689F -S31508005E88070037F01C0702A8FDF730FE039880467E -S31508005E98DFF83005B8EB0000DFF82C15884202D287 -S31508005EA857F0080714E0DFF82405B8EB0000DFF818 -S31508005EB82015884202D257F00C0709E0DFF81405C6 -S31508005EC8B8EB0000DFF81015884201D357F004072D -S31508005ED8DFF8EC0407604FF400420021280080B27E -S31508005EE800F0CEF9002801D100200CE15FF08060AF -S31508005EF8019002E00198401E019001980028F9D106 -S31508005F082068002851D00098401C009001212800DC -S31508005F1880B200F080F9400704D40098DFF8BC1472 -S31508005F288842F0D30098DFF8B414884201D10020DB -S31508005F38E9E0002000904FF480520021280080B242 -S31508005F4800F09EF9002801D10020DCE00098401CEA -S31508005F5800900121280080B200F05DF9800604D47B -S31508005F680098DFF878148842F0D30098DFF86C14A4 -S31508005F78884201D10020C6E00020009010212800A0 -S31508005F8880B200F048F90600700703D54FF40060A0 -S31508005F98206201E000202062B00702D50020606177 -S31508005FA81CE04FF48040606118E0206A616949087E -S31508005FB851EAD00292B20021280080B200F060F9B6 -S31508005FC8002801D100209EE07FF07F40019002E082 -S31508005FD80198401E019001980028F9D1DFF80004BD -S31508005FE80768DFF8000407406068A1680843E168A5 -S31508005FF808432169084361690843A1690843E169B7 -S315080060080843216A0843616A0843A16A0843E16AA2 -S315080060180843216B0843616B08430743DFF8C0034D -S315080060280760A06BE16B0843216C0843616C084361 -S31508006038A16C0843E16C0843216D0843616D084368 -S31508006048DFF8A4130860A06DDFF8A0130860E06DF8 -S31508006058DFF89C130860DFF89C0307684FF6417061 -S315080060680740206E616E51EA0040A16E0843E16E52 -S315080060780843216F0843616F08430743DFF8740331 -S315080060880760A06FE16F0843DFF86C130860DFF854 -S315080060986C030768DFF868030740D4F88000D4F86B -S315080060A884100843D4F888100843D4F88C10084399 -S315080060B8D4F890100843D4F894100843D4F89810E4 -S315080060C80843D4F89C100843D4F8A010084307439B -S315080060D8DFF828030760D4F8A400D4F8A810084302 -S315080060E8D4F8AC100843D4F8B0100843D4F8B41060 -S315080060F850EA8100D4F8B810084350F40000DFF8D5 -S3150800610804130860012006B0BDE8F081002101608B -S3150800611800214160002181600021C16000210161E0 -S3150800612800214161002181610021C16100210162CC -S3150800613800214162002181620021C16200210163B8 -S3150800614800214163002181630021C1634021016464 -S3150800615820214164002181640021C1640021016570 -S3150800616800214165002181650021C165002101667C -S3150800617880214166002181660021C16600210167E8 -S3150800618800214167002181670021C1675FF08061AE -S31508006198C0F880105FF00071C0F884105FF0807155 -S315080061A8C0F888105FF40011C0F88C100021C0F8F8 -S315080061B890100021C0F894100021C0F8981000210A -S315080061C8C0F89C100021C0F8A0105FF00071C0F854 -S315080061D8A4100021C0F8A8105FF40031C0F8AC106C -S315080061E84FF48071C0F8B0100021C0F8B41000212F -S315080061F8C0F8B810704780B5012000F077F800F0AD -S31508006208B3F8012000F087F8012000F0B4F801205F -S3150800621800F0C2F801BD81B0002200230093DFF820 -S31508006228A0311B681A0012F01C0280B2C00210F4D2 -S315080062387840024389B2880110F4F860024332F0C4 -S31508006248020252F00102DFF8780102600098401C49 -S315080062580090DFF86C010268D00704D50098DFF8CB -S315080062687C118842F2D30098DFF87011884201D170 -S31508006278002003E0DFF89001006880B201B070479B -S3150800628818B4002300240094DFF834412468230056 -S3150800629813F01C0380B2C00210F47840034389B295 -S315080062A8880110F4F860034353F0020353F001031E -S315080062B8DFF8540192B20260DFF80401036000981F -S315080062C8401C0090DFF8F8000368D80704D5009842 -S315080062D8DFF808118842F2D30098DFF800118842DF -S315080062E801D1002000E0012012BC7047C0B2002886 -S315080062F808D0DFF8EC00006850F00800DFF8E01076 -S31508006308086007E0DFF8D800006830F00800DFF812 -S31508006318D01008607047C0B2002808D0DFF8C0005F -S31508006328006850F00400DFF8B810086007E0DFF8E6 -S31508006338B000006830F00400DFF8A4100860704761 -S31508006348DFF8C800006850F00100DFF8C0100860E0 -S3150800635870470020DFF8B4100968C90701D501207D -S3150800636800E00020C0B270472448006850F4801046 -S31508006378224908607047C0B2002806D01F4800683E -S3150800638850F400501D49086005E01C48006830F4C0 -S3150800639800501A4908607047C0B2002806D0174846 -S315080063A8006850F002001549086005E013480068BF -S315080063B830F002001149086070470000000E2707F0 -S315080063C810800240002D3101C0E1E400C00E16021B -S315080063D840787D0100879303015A6202FFFF040093 -S315080063E8008002400F8120FF048002400880024096 -S315080063F80C800240188002401C8002401890024017 -S31508006408233FDEF8009002401480024000900240C4 -S3150800641880B5034A10600348016000F0AFFCFCE74A -S31508006428202400202424002080B5FFF7B3F800F0C4 -S31508006438EEFC3E480121017000F00EFE3B480021A3 -S315080064480170FEF779FD39480321017001BD80B551 -S31508006458374800F09EFD012805D13448012101700E -S315080064683348FFF7C1F8324800F040FE012805D145 -S315080064782E48002101702E48FFF7B6F82C48FEF77B -S31508006488C5FD012805D12948032101702848FFF7C9 -S31508006498ABF801BD704738B504000D0023480078ED -S315080064A8012804D12900C9B2200000F031FD1F488F -S315080064B80078002804D12900C9B2200000F0EAFDB6 -S315080064C81A480078032804D12900C9B22000FEF723 -S315080064D87BFDFFF783F831BD14480078002805D0FE -S315080064E8022807D004D3032806D007E0402006E090 -S315080064F8082004E0002002E0402000E0402080B2A6 -S3150800650870470A480078002805D0022807D004D31F -S31508006518032806D007E0402006E0082004E000200B -S3150800652802E0402000E0402080B2704714000020B6 -S315080065389822002080B5FFF748F802BD80B5DFF835 -S31508006548780600210170DFF874160020FBF783F837 -S31508006558C0B2002804D07C21DFF86406FFF758FF8C -S3150800656801BDDFF854060078002801D1012000E0B3 -S315080065780020704780B5FFF7DDFF012801D100200C -S3150800658811E0DFF834060078002801D000200AE078 -S3150800659800F018FE012805D1DFF81C060121017054 -S315080065A8012000E0002002BD10B5DFF80C060078CF -S315080065B8002800F0FF81DFF800060078012834D1AA -S315080065C800F01AFEDFF8FC0500F044FEDFF8F805CF -S315080065D800F040FE00F00EFE01220100DFF8EC058F -S315080065E8FBF752F8002807D0DFF8E40500F032FE7A -S315080065F8012000F025FEDDE1DFF8D80500F02AFEC7 -S31508006608DFF8D40500F026FEDFF8D00500F022FEF4 -S31508006618DFF8CC0500210160DFF8C40500214160D8 -S31508006628DFF8940502210170C4E1DFF88C050078CB -S31508006638022840F0F780DFF894254FF48071DFF8D8 -S31508006648A405FBF7C5FCDFF8741591F83A12C1F3EF -S31508006658C01111F0010101290FDBDFF8740500F0FC -S31508006668F9FD022000F0ECFDDFF86005FBF72FFBCB -S31508006678DFF84405002101709CE100281BD00022A0 -S31508006688DFF86415DFF85C0500F0D6F9040024B2D3 -S3150800669814F1010F0FD1DFF8380500F0DBFD0320F0 -S315080066A800F0CEFDDFF82405FBF711FBDFF8080537 -S315080066B8002101707EE124B2012C28DBDFF82005D1 -S315080066C8406800280BD1DFF81C05D0F88001DFF8F0 -S315080066D810150860DFF8080524B2446017E0DFF8EB -S315080066E80405D0F88001DFF8F8140968884206D24C -S315080066F8DFF8F004D0F88001DFF8E4140860DFF862 -S31508006708E004406800FA84F0DFF8D4144860DFF83B -S31508006718AC04D0F83C02DFF8A414D1F84012884239 -S3150800672801D1012000E000200128C0F243810021A0 -S31508006738DFF89804FBF7D7FA00280FD0DFF890049B -S3150800674800F088FD042000F07BFDDFF88004FBF7E5 -S31508006758BEFADFF86404002101702BE1DFF874043F -S3150800676800F078FDDFF8840400F074FDDFF8801483 -S31508006778DFF86C04406800F075FADFF8740400F076 -S3150800678869FDDFF8700400F065FDDFF86414DFF8CA -S3150800679850040068000EC0B200F053FADFF8581427 -S315080067A8DFF83C040068000CC0B200F04AFADFF8CB -S315080067B84C14DFF82C040068000AC0B200F041FA4D -S315080067C8DFF83C14DFF818040068C0B200F039FA9C -S315080067D8DFF81C0400F03EFD77A000F03BFDDFF86B -S315080067E800044168DFF8F803006800F0AAFA0028F0 -S315080067F80FD1DFF8DC0300F02DFD052000F020FDA1 -S31508006808DFF8C803FBF763FADFF8AC030021017069 -S31508006818D0E0DFF8C00300F01DFDDFF89C03032174 -S315080068280170C7E0DFF890030078032840F0C280BB -S31508006838DFF898234FF48071DFF8A803FBF7C8FB45 -S31508006848DFF8781391F83A12C1F3C01111F0010173 -S3150800685801290EDBDFF8AC0300F0FCFC022000F08F -S31508006868EFFCDFF86803FBF732FAD348002101701A -S31508006878A0E000281AD0DFF89023DFF86C13DFF8B9 -S31508006888640300F0D9F8040024B214F1010F0DD1FD -S31508006898DFF8780300F0DEFC032000F0D1FCCB48D3 -S315080068A8FBF715FAC4480021017083E024B2012CCD -S315080068B84CDBD74800F0CEFCCD4924B2200000F0C6 -S315080068C8D1F9CB4800F0C6FCD24800F0C3FCC84949 -S315080068D8C448D0F88001000EC0B200F0B2F9C64923 -S315080068E8C048D0F88001000CC0B200F0AAF9C34924 -S315080068F8BC48D0F88001000AC0B200F0A2F9C04925 -S31508006908B848D0F88001C0B200F09BF9B84800F042 -S31508006918A1FC29A000F09EFCBB4A24B22100B1487C -S31508006928D0F8800100F009FA00280CD1A84800F030 -S3150800693891FC062000F084FCA448FBF7C8F99E4899 -S315080069480021017036E0A34800F084FC9B48D0F883 -S315080069583C029A49D1F84012884201D1012000E048 -S315080069680020012826DBAC4800F074FC00F0F1F999 -S3150800697800280CD1964800F06DFC072000F060FC52 -S315080069889248FBF7A4F98C480021017012E0914857 -S3150800699800F060FCA14800F05DFC8C48FBF797F90D -S315080069A89F4800F057FC84480021017000F035FC28 -S315080069B800F096F910BD00002E2E2E0010B5040022 -S315080069C8207800F075FC532804D1607800F074FC30 -S315080069D8002801D103200FE06078312801D1002072 -S315080069E80AE06078322801D1012005E0607833286A -S315080069F801D1022000E0032010BD70B5040000266E -S31508006A08A41C200000F047F90500AE19A41C2000B4 -S31508006A1800F041F986196D1EA41CADB2022DF6DAEE -S31508006A28F6B2F643200000F036F9F6B2864201D0EF -S31508006A38002000E0012070BD2DE9F04105000E0098 -S31508006A4814005FF00008002E01D0002D04D140F292 -S31508006A5836215B48FFF7DCFC2800FFF7AFFF070085 -S31508006A68FFB2032F01D10020A3E02800FFF7C5FFD6 -S31508006A78002802D15FF0FF309BE0FFB2002F03D059 -S31508006A88022F5AD028D392E0AD1C280000F003F94B -S31508006A980700AD1C280000F0FEF800023060AD1CA7 -S31508006AA8D6F80080280000F0F6F858FA80F030602A -S31508006AB8AD1CB7F10308002C0DD0002606E0280007 -S31508006AC800F0E9F8B6B23055AD1C761CB6B20FFA26 -S31508006AD888F84645F3DB6AE0AD1C280000F0DBF8C9 -S31508006AE80700AD1C280000F0D6F800043060AD1C7D -S31508006AF8D6F80080280000F0CEF818EB00203060A1 -S31508006B08AD1CD6F80080280000F0C5F858FA80F0C1 -S31508006B183060AD1CB7F10408002C0DD0002606E03D -S31508006B28280000F0B8F8B6B23055AD1C761CB6B2D7 -S31508006B380FFA88F84645F3DB39E0AD1C280000F063 -S31508006B48AAF80700AD1C280000F0A5F80006306072 -S31508006B58AD1CD6F80080280000F09DF818EB004018 -S31508006B683060AD1CD6F80080280000F094F818EBC1 -S31508006B7800203060AD1CD6F80080280000F08BF89D -S31508006B8858FA80F03060AD1CB7F10508002C0DD016 -S31508006B98002606E0280000F07EF8B6B23055AD1C8F -S31508006BA8761CB6B20FFA88F84645F3DBFFE7404687 -S31508006BB800B2BDE8F08100007F240020DC12002026 -S31508006BC8AC830008DC8400086884000810150020D7 -S31508006BD8D8860008E086000800850008DC830008D7 -S31508006BE810240020641F0020E4200020B88600082E -S31508006BF8D8220020B0850008DA220020DC220020EE -S31508006C08DE22002024850008642000204885000824 -S31508006C187C860008E8850008CC85000800860008F8 -S31508006C283C84000880B5010011F00F003030C9B265 -S31508006C380A2901DBC01D02E0C0B200F039FBC0B268 -S31508006C4802BD38B504000D00E4B22009FFF7EAFFD3 -S31508006C58287014F00F00FFF7E5FF68700020A87089 -S31508006C68280032BD0200491C0A23B2FBF3F2002AA7 -S31508006C78F9D100220A700200491E0A20B2FBF0F375 -S31508006C8800FB1320303008700A20B2FBF0F2002A05 -S31508006C98F2D10800704770B504000025002609E0FF -S31508006CA83038C0B20A2800DBC01FEDB2290151FAF4 -S31508006CB880F5761CF6B2022E0FDAF6B2305D00F0D1 -S31508006CC8F7FAC0B2B0F13001172904D2C0B2B0F150 -S31508006CD83A010729E4D2002001E02800C0B270BDB5 -S31508006CE880B500F032F800280DD0FFF7D3FBFEF781 -S31508006CF833FC00F0B9FB044908400449086000F071 -S31508006D08B3FB4068804701BD80FFFF1F08ED00E020 -S31508006D1870B504000D00160005E0287820706D1C73 -S31508006D28641C00F02BF83000461E80B20028F4D107 -S31508006D3870BD80B500F0C8FA01BD80B500F0CFFA7D -S31508006D4802BD80B500F0F5FA02BD80B500F048FB33 -S31508006D5802BD80B500F007FB002801D1002001E03C -S31508006D6800F067FB02BD10B5040010000A00010018 -S31508006D78200000F0A1FC200010BD704770470000F5 -S31508006D88F0B4002400E0641CE4B2122C3CD24AF2A7 -S31508006D98104580B2E4B2994E16F81460E4B2974FDB -S31508006DA817EB44077F78BE19761C06FB00F695FB99 -S31508006DB8F6F706FB1755002DE5D14AF2104580B2BD -S31508006DC8E4B28E4E16F81460E4B28C4F17EB4407FB -S31508006DD87F78BE19761C06FB00F695FBF6F50D803E -S31508006DE80D88002DCFD00D88B5F5806FCBDCE4B2C1 -S31508006DF8824810F814001070E4B2804810EB44007A -S31508006E0840781870012000E00020F0BC704780B573 -S31508006E1800AB0DF101020DF102014FF4FA70FFF70C -S31508006E28AFFFC0B2012803D0F0217548FFF7F0FA82 -S31508006E387448002101607448006850F4004072499B -S31508006E48086001E0FFF79AFF6F4800680004F9D464 -S31508006E586D48006830F002006B4908606A480068A7 -S31508006E6850F001006849086001E0FFF787FF6748A6 -S31508006E780068C007F9D59DF80100401E9DF8001066 -S31508006E88491E090551EA0040BDF80210491E084383 -S31508006E985F4908605C480068400840005A4908602D -S31508006EA801E0FFF76BFF59480068C007F9D459484D -S31508006EB8006850F00100574908605748006830F4E0 -S31508006EC88040554908605548006850F48040534941 -S31508006ED80860534800210160524800210160524861 -S31508006EE8006830F48040504908605048006830F41B -S31508006EF880404E4908604848006850F48040464932 -S31508006F08086044480068400840004249086001BDD6 -S31508006F1838B504000D0046480068400104D44FF40B -S31508006F28A2713748FFF774FA4248006810F0010062 -S31508006F38404908603F4800683F4908433D4908609A -S31508006F483E48EDB20560E078A178090451EA006088 -S31508006F58617850EA01202178084339490860E079C0 -S31508006F68A179090451EA0060617950EA012021797A -S31508006F780843344908602F48006850F001002D4935 -S31508006F88086001E0FFF7FAFE294800684001F9D5CC -S31508006F9831BD00212C4A126812F0030F2BD02B4A58 -S31508006FA81268520D40F267639A421ED10121284A97 -S31508006FB812680270264A1268120A4270244A12682F -S31508006FC8120C8270224A1268120EC270214A12687E -S31508006FD80271204A1268120A42711E4A1268120C75 -S31508006FE882711C4A1268120EC2711748006850F05E -S31508006FF82000154A10600800C0B27047B884000817 -S31508007008348300081468004000680040046800409B -S315080070181C680040006600401C6600400C6600407C -S31508007028B0660040B4660040046600401466004036 -S315080070380868004080690040000020FC8469004018 -S31508007048886900408C6900400C680040B0690040B7 -S31508007058B8690040BC69004000B585B04FF4614086 -S3150800706800900020ADF804000020ADF806000020C6 -S31508007078ADF808000020ADF80C000C20ADF80A00A1 -S3150800708800A94A4800F04CFB0121484800F0AAFB31 -S3150800709805B000BD70B504000D00EDB2412D03DB47 -S315080070A877214348FFF7B4F92800C0B200F065F81D -S315080070B8C0B2012803D07B213D48FFF7A9F900266D -S315080070C80DE0FFF75BFEB6B2305D00F056F8C0B2C9 -S315080070D8012803D084213648FFF79AF9761C280038 -S315080070E8C0B2B6B280B28642EBD370BD10B5040002 -S315080070F830480078002810D12F4800F02EF80128CB -S3150800710809D12D480078002805D02A4801210170A0 -S315080071182A4800210170002010BD28480078264911 -S315080071284018401C00F019F80128F4D123480078C3 -S31508007138401C22490870214800781F490978884266 -S31508007148E9D11E48027892B21D492000FFF7E0FDF2 -S315080071581848002101700120DEE710B50400202137 -S31508007168124800F055FB012805D1104800F04CFBE1 -S315080071782070012000E0002010BD10B50400802111 -S315080071880A4800F045FB002801D100200CE0E4B2CB -S31508007198210089B2054800F033FB8021034800F036 -S315080071A837FB0028F9D0012010BD00000014014063 -S315080071B8708300088224002054220020812400209D -S315080071C85522002000B589B000A8202100F02EFB22 -S315080071D800A93348FAF764FE002808D10098002861 -S315080071E805D09DF80800C00601D4012000E000205B -S315080071F809B000BD2A48704780B52A48002180F89A -S3150800720824120A2228492748FAF73EFA002803D101 -S315080072182448012180F8241201BD80B5214890F838 -S315080072282402012802D11F48FAF751FD40211F48B8 -S3150800723800F0EEFA0028F9D01948FAF75BFE01BD06 -S3150800724880B5184890F82402012802D11548FAF79B -S315080072583EFD01BD10B50400124890F82402012825 -S3150800726819D110492000FAF7F6FE002813D50D485B -S31508007278002180F824120B48FAF729FD0BE021783B -S3150800728889B20A4800F0BCFA8021084800F0C0FA1A -S315080072980028F9D0641C20780028F0D110BD000019 -S315080072A890850008341700208C86000800140140D1 -S315080072B880B500F0BEFA02BD30380A2801D201208E -S315080072C800E00020C0B27047DFF8DC035FF0FF314A -S315080072D80160DFF8D8035FF0FF310160704770B5C9 -S315080072E804000D001600200000F0B3F9FF2805D0A9 -S315080072F82819401E00F0ADF9FF2801D1002017E033 -S31508007308600A4FF400714843DFF8A41309688842F5 -S3150800731807D12B0032002100DFF8900300F0DFF8D0 -S3150800732806E02B0032002100DFF87C0300F0D7F8CE -S3150800733870BD70B504000D00200000F08AF906003B -S315080073482819401E00F085F9F6B2FF2E02D0C0B201 -S31508007358FF2801D1002005E00100C9B23000C0B2FB -S3150800736800F03BF970BD80B500200090DFF83C03BB -S31508007378006810F1010F01D1012030E00098CB49CF -S315080073884968081800900098C8498968081800903C -S315080073980098C649C968081800900098C349096939 -S315080073A8081800900098C14949690818009000987B -S315080073B8BE498969081800900098BC49C96908181F -S315080073C800900098C04300900098401C009000AABE -S315080073D80421B748006810F5C470FFF780FF02BD9E -S315080073E80020B349096809680818B149096849684D -S315080073F80818AF49096889680818AD490968C96845 -S315080074080818AB49096809690818A949096849693A -S315080074180818A749096889690818A549096811F55E -S31508007428C47109680818002801D1012000E0002065 -S31508007438704780B59D48006810F1010F06D09B4833 -S3150800744800F090F8002801D100200CE09648006862 -S3150800745810F1010F06D0944800F084F8002801D1ED -S31508007468002000E0012002BD91480068704780B5F9 -S315080074784FF40072B1FBF2F303FB1213002B01D091 -S3150800748800200BE002688A4201D1012006E001606B -S315080074984FF40072001DFFF73BFC012002BD38B50A -S315080074A804000D008148844208D17F4C2900200039 -S315080074B8FFF7DDFF002810D100200FE07C480068A0 -S315080074C8854203D1794C7A480568EFE7200000F031 -S315080074D849F80028EAD1002000E0200032BD2DE94D -S315080074E8F04104000F0015001E00780A4FF40071D9 -S315080074F801FB00F8206810F1010F07D1414620006A -S31508007508FFF7B5FF002801D1002029E0206840458B -S3150800751808D041462000FFF7C2FF0400002C01D11D -S3150800752800201DE02068381A0019071DFFF726FCF9 -S31508007538201D381AB0F5007F0AD318F50071200007 -S31508007548FFF7ADFF0400002C01D1002008E0271D35 -S31508007558287838707F1C6D1C761E002EE6D101200F -S31508007568BDE8F0812DE9F04104000125206800F006 -S3150800757870F8C0B2FF2801D100202CE000F064F9A9 -S31508007588F32000F0FBF900F0FCF9012803D100F01C -S315080075986BF900201FE05FF0000801E018F1010808 -S315080075A8B8F1800F13D2206810EB880614EB880010 -S315080075B84768FFF7E3FB3900300000F0B6F90828FA -S315080075C801D0002503E03068B842E7D0002500F06E -S315080075D84BF92800C0B2BDE8F08138B504000D00A3 -S315080075E8EDB2E4B2A54201D2002031E03048007A73 -S315080075F8E4B2844205D32E4890F86800EDB2A84252 -S3150800760801D2002024E000F01FF9F32000F0B6F9B3 -S3150800761800F0B7F9012803D100F026F9002017E091 -S3150800762800E0641CEDB2E4B2A5420ED3FFF7A6FB50 -S315080076380221E4B21F4830F8140000F01EF90828A1 -S31508007648EFD000F011F9002002E000F00DF9012052 -S3150800765832BD38B50400002500E06D1CEDB2092DD1 -S315080076681FD2FFF78BFBEDB20C20114900FB051062 -S3150800767800688442F1D3EDB20C200D4900FB0510D1 -S315080076880068EDB20C210A4A01FB05214968081869 -S315080076988442E2D2EDB20C20054900FB0510007AB7 -S315080076A800E0FF2032BD00005C190020601B0020A6 -S315080076B8248200080C84000862F30F2262F31F4232 -S315080076C8401810F0030308D0C91A1FD3DB0748BFB0 -S315080076D800F8012D28BF20F8022D130030B41446EF -S315080076E81546103928BF20E93C00FAD8490728BFAB -S315080076F820E90C0048BF40F8042D890028BF20F867 -S31508007708022D48BF00F8012D30BC7047C91818BFAC -S3150800771800F8012DCB0728BF00F8012D7047000097 -S315080077287FB504000D000020002100220023AE8941 -S31508007738002E208A30F44050E98808432082A08920 -S3150800774827490840A9882A8911436A8911430843A1 -S31508007758A081A08A30F44070A9890843A08200A8AD -S31508007768FCF7C4F91C48844202D01C48844201D15B -S31508007778039900E00299A089000407D5192000FB9F -S3150800778801F029684900B0FBF1F206E0192000FB70 -S3150800779801F029688900B0FBF1F26420B2FBF0F029 -S315080077A800010109642303FB1123A189090408D5EB -S315080077B8D90032316422B1FBF2F111F0070108430E -S315080077C807E0190132316422B1FBF2F111F00F0119 -S315080077D8084320817FBD00000010014000140140C5 -S315080077E8F3E9FFFFC9B2002904D0818951F4005191 -S315080077F8818104E081894DF6FF72114081817047C5 -S31508007808C905C90D818070478088C005C00D7047B5 -S31508007818002289B2B1F5007F0088084201D001220A -S3150800782800E000221000C0B270470000002200F0F5 -S31508007838E3B810B50400200000F0F7F8002801D0D6 -S31508007848203CFFE7200010BDDFF87001006800281B -S3150800785809D5DFF86C01DFF86C110160DFF8600103 -S31508007868DFF8641101607047DFF85001006850F0CE -S315080078780040DFF848110860704738B5040000254D -S315080078880820C9B2002901D100250DE0C9B201298D -S3150800789802D14FF4807507E0C9B2022902D14FF424 -S315080078A8007501E04FF4407500F092F8C0B2082858 -S315080078B839D1DFF80801006830F44070DFF8FC10A9 -S315080078C80860DFF8F80000682843DFF8F010086059 -S315080078D8DFF8E800006830F0F800DFF8E010086024 -S315080078E8DFF8D800006854F002010843DFF8CC1026 -S315080078F80860DFF8C800006850F48030DFF8BC106C -S31508007908086000F065F8DFF8B410096831F002017C -S31508007918DFF8A8201160DFF8A410096831F0F8012B -S31508007928DFF898201160C0B232BD70B504000D00AA -S31508007938082600F04DF80600F6B2082E1BD11F4897 -S31508007948006830F440701D4908601C48006850F407 -S3150800795800701A4908601948006850F0010017496C -S315080079680860256000F034F80600144800684008E6 -S315080079784000124908603000C0B270BD134908605B -S315080079887047082011490968C90301D5012013E081 -S315080079980E480068C00601D505200DE00B480068AA -S315080079A810F0EF0F01D0062006E0084800688007A7 -S315080079B801D5072000E00820C0B27047103C0240F5 -S315080079C8043C024023016745AB89EFCD0C3C0240D5 -S315080079D880B508208DF80000FFF7D3FF8DF8000062 -S315080079E803E0FFF7CEFF8DF800009DF80000012898 -S315080079F8F7D09DF8000002BD00B500BF13009646F3 -S31508007A089446103928BFA0E80C50FAD85FEA417C9A -S31508007A1828BF0CC048BF40F8042BC90728BF20F860 -S31508007A28022B48BF00F8012B00BD61381A2801D27D -S31508007A38012000E00020C0B2704700006100620023 -S31508007A4863006400650066006700680069006A00EC -S31508007A586B006C006D006E006F007000710072009C -S31508007A6873007400750076007700780079007A004C -S31508007A78A100A200A300A500AC00AF00E000E10049 -S31508007A88E200E300E400E500E600E700E800E900B4 -S31508007A98EA00EB00EC00ED00EE00EF00F000F10064 -S31508007AA8F200F300F400F500F600F800F900FA0011 -S31508007AB8FB00FC00FD00FE00FF00010103010501B3 -S31508007AC8070109010B010D010F0111011301150128 -S31508007AD8170119011B011D011F0121012301250198 -S31508007AE8270129012B012D012F0131013301350108 -S31508007AF837013A013C013E01400142014401460171 -S31508007B0848014B014D014F015101530155015701D8 -S31508007B1859015B015D015F01610163016501670147 -S31508007B2869016B016D016F017101730175017701B7 -S31508007B387A017C017E019201B103B203B303B4034F -S31508007B48B503B603B703B803B903BA03BB03BC0343 -S31508007B58BD03BE03BF03C003C103C303C403C503F0 -S31508007B68C603C703C803C903CA0330043104320469 -S31508007B7833043404350436043704380439043A041B -S31508007B883B043C043D043E043F04400441044204CB -S31508007B9843044404450446044704480449044A047B -S31508007BA84B044C044D044E044F0451045204530428 -S31508007BB85404550456045704580459045A045B04D3 -S31508007BC85C045E045F04702171217221732174219B -S31508007BD8752176217721782179217A217B217C21C3 -S31508007BE87D217E217F2141FF42FF43FF44FF45FF58 -S31508007BF846FF47FF48FF49FF4AFF4BFF4CFF4DFF2B -S31508007C084EFF4FFF50FF51FF52FF53FF54FF55FFDA -S31508007C1856FF57FF58FF59FF5AFF00004100420018 -S31508007C2843004400450046004700480049004A000A -S31508007C384B004C004D004E004F00500051005200BA -S31508007C4853005400550056005700580059005A006A -S31508007C582100E0FFE1FFE5FFE2FFE3FFC000C10006 -S31508007C68C200C300C400C500C600C700C800C900D2 -S31508007C78CA00CB00CC00CD00CE00CF00D000D10082 -S31508007C88D200D300D400D500D600D800D900DA002F -S31508007C98DB00DC00DD00DE007801000102010401DA -S31508007CA8060108010A010C010E011001120114014E -S31508007CB8160118011A011C011E01200122012401BE -S31508007CC8260128012A012C012E013001320134012E -S31508007CD8360139013B013D013F0141014301450197 -S31508007CE847014A014C014E015001520154015601FF -S31508007CF858015A015C015E0160016201640166016E -S31508007D0868016A016C016E017001720174017601DD -S31508007D1879017B017D0191019103920393039403F1 -S31508007D28950396039703980399039A039B039C0361 -S31508007D389D039E039F03A003A103A303A403A5030E -S31508007D48A603A703A803A903AA0310041104120487 -S31508007D5813041404150416041704180419041A0439 -S31508007D681B041C041D041E041F04200421042204E9 -S31508007D7823042404250426042704280429042A0499 -S31508007D882B042C042D042E042F04010402040304D6 -S31508007D980404050406040704080409040A040B0471 -S31508007DA80C040E040F0460216121622163216421F9 -S31508007DB8652166216721682169216A216B216C2161 -S31508007DC86D216E216F2121FF22FF23FF24FF25FF46 -S31508007DD826FF27FF28FF29FF2AFF2BFF2CFF2DFF49 -S31508007DE82EFF2FFF30FF31FF32FF33FF34FF35FFF9 -S31508007DF836FF37FF38FF39FF3AFF000080B5454898 -S31508007E08006850F0010043490860434800210160B2 -S31508007E1840480068414908403E4908604048414989 -S31508007E2801603C48006830F480203A4908603E48BA -S31508007E380021016000F005F83C485FF00061016028 -S31508007E4801BD82B0002001900020009031480068EA -S31508007E5850F480302F4908602E48006810F4003026 -S31508007E6800900198401C01900098002803D10198B9 -S31508007E78B0F5A06FF0D127480068800302D5012025 -S31508007E88009001E000200090009801283ED128487B -S31508007E98006850F08050264908602648006850F463 -S31508007EA84040244908601C481B49096801601A486B -S31508007EB8006850F40040184908601748006850F4EC -S31508007EC8A0501549086016481B4901601148006802 -S31508007ED850F080700F4908600E4800688001FBD58D -S31508007EE8164840F2056101600B4800688008800062 -S31508007EF8094908600848006850F002000649086001 -S31508007F080548006810F00C000828F9D102B0704737 -S31508007F18000000000038024008380240FFFFF6FE5D -S31508007F2804380240103000240C38024008ED00E0FE -S31508007F3840380240007000400C544007003C02409C -S31508007F48C700FC00E900E200E400E000E500E700FD -S31508007F58EA00EB00E800EF00EE00EC00C400C500FC -S31508007F68C900E600C600F400F600F200FB00F900B6 -S31508007F78FF00D600DC00A200A300A500A7209201F6 -S31508007F88E100ED00F300FA00F100D100AA00BA00FA -S31508007F98BF001023AC00BD00BC00A100AB00BB00AD -S31508007FA8912592259325022524256125622556259E -S31508007FB855256325512557255D255C255B251025FF -S31508007FC8142534252C251C2500253C255E255F25EA -S31508007FD85A25542569256625602550256C25672563 -S31508007FE868256425652559255825522553256B2561 -S31508007FF86A2518250C25882584258C25902580250D -S31508008008B103DF009303C003A303C303B500C40386 -S31508008018A6039803A903B4031E22C603B503292297 -S315080080286122B1006522642220232123F700482211 -S31508008038B0001922B7001A227F20B200A025A00096 -S3150800804880B500F005F800F05FF800F06BF8FCE77B -S3150800805800B583B0FFF7D2FE01212020FBF7D8FD33 -S3150800806801210420FBF7B4FD082206212448FBF762 -S3150800807803FD082207212248FBF7FEFC00208DF89D -S31508008088060001208DF8070002208DF8040040201C -S31508008098009002208DF8050000A91948FBF78EFC08 -S315080080A802208DF804008020009000A91448FBF7E8 -S315080080B885FC01210220FBF78BFD092205211148C1 -S315080080C8FBF7DAFC092206210E48FBF7D5FC6020E7 -S315080080D8009002208DF8040002208DF80500002083 -S315080080E88DF8060001208DF8070000A90548FBF75A -S315080080F865FC01215FF0C060FBF77AFD07BD00004B -S31508008108000802400004024080B5FEF736FEFDF777 -S3150800811813FAFEF70EFEFEF711FAFEF785F900F0D8 -S315080081280DF801BD80B5FEF729FEFDF719FAFEF729 -S315080081383BFAFEF78CF900F00CF801BD80B5154836 -S3150800814801210170FDF716FA1349086000F001F8D5 -S3150800815801BD80B5FEF7EEF9012819D0FEF701FA38 -S31508008168002815D00B480078012811D1FDF702FA26 -S315080081780949096801F51C511031884208D3054890 -S3150800818800210170FEF7F6F9002801D1FEF7A8FDCF -S3150800819801BD00007E24002028240020809A9041F2 -S315080081A88E418F804545454949498E8F9092924F11 -S315080081B8994F555559999A9B9C9D9E9F41494F554C -S315080081C8A5A5A6A7A8A9AAABAC21AEAFB0B1B2B36C -S315080081D8B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3D1 -S315080081E8C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3C1 -S315080081F8D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3B1 -S31508008208E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3A0 -S31508008218F4F5F6F7F8F9FAFBFCFDFEFF00C00008CE -S3150800822800400000030000000000010800000100EB -S315080082380400000000000208000002000500000013 -S3150800824800000408000002000600000000000608F6 -S3150800825800000200070000000000080800000200ED -S315080082680800000000000A080000020009000000D3 -S3150800827800000C08000002000A00000000000E08B2 -S31508008288000002000B000000433A5C576F726B5CF3 -S31508008298736F6674776172655C4F70656E424C548D -S315080082A85C5461726765745C44656D6F5C41524DD8 -S315080082B8434D345F53544D33325F4F6C696D65785F -S315080082C85F53544D3332453430375F4941525C4227 -S315080082D86F6F745C6C69625C7569705C6E657464F2 -S315080082E865762E6300000000433A5C576F726B5C34 -S315080082F8736F6674776172655C4F70656E424C542D -S315080083085C5461726765745C536F757263655C412A -S31508008318524D434D345F53544D33325C4941525C98 -S31508008328766563746F72732E63000000433A5C5770 -S315080083386F726B5C736F6674776172655C4F706594 -S315080083486E424C545C5461726765745C536F7572FF -S3150800835863655C41524D434D345F53544D33325C2B -S3150800836863616E2E63000000433A5C576F726B5C5C -S31508008378736F6674776172655C4F70656E424C54AC -S315080083885C5461726765745C536F757263655C41AA -S31508008398524D434D345F53544D33325C7561727494 -S315080083A82E630000433A5C576F726B5C736F667492 -S315080083B8776172655C4F70656E424C545C546172A5 -S315080083C86765745C536F757263655C66696C652E60 -S315080083D86300000050617273696E67206669726D82 -S315080083E8776172652066696C6520746F206F6274A0 -S315080083F861696E2065726173652073697A652E2EC8 -S315080084082E000000000008001000180020002800B0 -S3150800841830003800400048005000580080008800A6 -S3150800842890009800A000A800B000B800C000C800D6 -S31508008438D000D8004669726D7761726520757064D8 -S31508008448617465207375636365737366756C6C7997 -S3150800845820636F6D706C657465640A0D0000000012 -S315080084684F70656E696E67206669726D77617265A9 -S315080084782066696C6520666F722072656164696E2C -S31508008488672E2E2E0000000010B5074979441831CA -S31508008498064C7C44163404E00A68081D51188847B7 -S315080084A80146A142F8D110BDBC000000DC0000005E -S315080084B805020602060307030803090309040A0452 -S315080084C80B040C040C050D050E050F050F06100602 -S315080084D8100710084669726D7761726520757064B1 -S315080084E86174652072657175657374206465746551 -S315080084F8637465640A0D00005374617274696E6763 -S31508008508207468652070726F6772616D6D696E6731 -S315080085182073657175656E63650A0D005265616439 -S31508008528696E67206C696E652066726F6D2066696C -S315080085386C652E2E2E4552524F520A0D0000000029 -S31508008548496E76616C696420636865636B73756DDB -S3150800855820666F756E642E2E2E4552524F520A0D9E -S315080085680000000067B5FFFF74240000180000200B -S31508008578000000000F9BFFFF180000007C010000A8 -S3150800858800000020000000002F64656D6F70726F90 -S31508008598675F6F6C696D65785F73746D33326534C0 -S315080085A830372E73726563002062797465732066A6 -S315080085B8726F6D206D656D6F7279206174203078E1 -S315080085C80000000057726974696E672070726F67D9 -S315080085D872616D20636865636B73756D2E2E2E0048 -S315080085E820627974657320746F206D656D6F727972 -S315080085F82061742030780000436C6F73696E6720B9 -S315080086086669726D776172652066696C650A0D0020 -S3150800861800F009F8002801D0FFF736FF0020FFF719 -S315080086280FFD00F002F80120704700F001B80000BD -S315080086380746384600F002F8FBE7000080B5C04652 -S31508008648C046024A11001820ABBEFBE72600020006 -S31508008658034B9D46C046C046C046C046FFF7D8FFEE -S31508008668902C002001030507090E10121416181C71 -S315080086781E00000050726F6772616D6D696E672023 -S31508008688000000002F626F6F746C6F672E74787421 -S315080086980000000080B541210148FDF7B9FE01BD7B -S315080086A8F0820008222A3A3C3E3F7C7F0000000000 -S315080086B845726173696E672000000000C046C046AF -S315080086C8C046C046FFF7A4FF2B2C3B3D5B5D000068 -S315080086D84552524F520A0D004F4B0A0D0000000032 -S315080086E8FFFFFFFFFFFF00004F70656E424C540006 -S315080086F800000000FFFFFFFF00000000010203045E -S315080087080102030406070809010000000401000025 -S705080086C5A7 +S31508003B88DFF814110160DFF80811096811F0F0016F +S31508003B980909DFF80C218A5C0168D1404160DFF821 +S31508003BA8F010096811F4E051890ADFF8F4208A5CF4 +S31508003BB84168D14081603649096811F46041490B6A +S31508003BC8DFF8DC208A5C4168D140C160F0BC7047E8 +S31508003BD8C9B2002905D0334909680843314908603C +S31508003BE805E03049096831EA00002E49086070473F +S31508003BF8C9B2002905D02C49096808432A4908602A +S31508003C0805E02949096831EA00002749086070472C +S31508003C18C9B2002905D02549096808432349086017 +S31508003C2805E02249096831EA00002049086070471A +S31508003C38C9B2002905D01E49096808431C49086005 +S31508003C4805E01B49096831EA000019490860704708 +S31508003C58C9B2002905D017490968084315490860F3 +S31508003C6805E01449096831EA0000124908607047F6 +S31508003C78C9B2002905D01049096808430E490860E1 +S31508003C8805E00D49096831EA00000B4908607047E4 +S31508003C9808380240043802400024F400001BB70024 +S31508003CA8C400002030380240343802404038024008 +S31508003CB844380240103802402438024010B504003F +S31508003CC8200000F003F8200010BD000062B38B073F +S31508003CD808D0521E11F8013B00F8013B00F0248079 +S31508003CE88B07F6D1830740F0208000BF103A07D328 +S31508003CF830B4B1E83810103AA0E83810F9D230BC18 +S31508003D08530724BFB1E80810A0E8081044BF51F8C3 +S31508003D18043B40F8043BD20724BF31F8022B20F8AD +S31508003D28022B44BF0B7803707047083A07D3B1E8EB +S31508003D380810083A40F8043B40F804CBF7D2530772 +S31508003D48E4E70000C2788A18DFF81832DA70827851 +S31508003D5889B20B0A9A18DFF80C329A70DFF804222F +S31508003D6843785370DFF8FC2100781070DFF8F40107 +S31508003D78807889B20A0AD2B2904212D2DFF8E401F0 +S31508003D884078401CDFF8DC215070DFF8D80140780D +S31508003D98002806D1DFF8CC010078401CDFF8C421DA +S31508003DA81070DFF8C001C07889B2C9B2884217DA3C +S31508003DB8DFF8B0018078401C6A49887069488078BD +S31508003DC800280DD167484078401C66494870654800 +S31508003DD84078002804D163480078401C6149087077 +S31508003DE8704710B492B25218531E0AE00A781202A3 +S31508003DF84C781219101880B292B2904200D2401C20 +S31508003E08891C9942F2D3994207D109780A021018EF +S31508003E1880B292B2904200D2401C80B210BC704761 +S31508003E2880B5142250490020FFF7DBFF80B200282E +S31508003E3802D14FF6FF7002E080B201F05FF880B257 +S31508003E4802BD10B54949097C0902484A527C8918B5 +S31508003E58B1F1140454FA80F00822454980B2FFF7F4 +S31508003E68C0FF220092B2434980B2FFF7BAFF80B278 +S31508003E78002802D14FF6FF7002E080B201F03EF842 +S31508003E8880B210BD80B50620FFF7DBFF02BD3A48B1 +S31508003E98002101700AE0384800783849002221F8DC +S31508003EA8102035480078401C334908703248007895 +S31508003EB80028F0D03048002101700CE02E48007820 +S31508003EC868212F4A01FB0020002141762A480078FC +S31508003ED8401C29490870284800780028EED0294847 +S31508003EE84FF4806101807047234900220A7004E074 +S31508003EF821490978491C204A11701F49097800295F +S31508003F080CD11D4909781D4A32F811100029EFD13C +S31508003F1819490978194A22F81100FFE7704780B548 +S31508003F28010089B2DFF8DC0D00680830FFF70AFFE0 +S31508003F38DFF8D00D00680B4909780172DFF8C40D5F +S31508003F480068084949784172DFF8B80D00680549DC +S31508003F5889788172DFF8AC0D00680249C978C172A0 +S31508003F6801BD0000E82D0020F2000020E400002032 +S31508003F78FE000020060100201C2E00200E2E002020 +S31508003F88A8280020122E002010B5DFF8781D0C6826 +S31508003F98DFF8C41DDFF8C42D1160DFF8C42D1160E1 +S31508003FA8C0B2032818D1607E10F00F0003280AD182 +S31508003FB8208A002807D1DFF8AC0D0821017001F026 +S31508003FC83CF800F064BEDFF8A00D00210180DFF898 +S31508003FD8940D0021017010BDC0B2022840F0CB80B4 +S31508003FE8DFF8880DC078401CDFF8801DC870C0B29D +S31508003FF800281AD1DFF8740D8078401CDFF86C1D8C +S315080040088870C0B2002810D1DFF8600D4078401CCF +S31508004018DFF8581D4870C0B2002806D1DFF84C0DE5 +S315080040280078401CDFF8441D0870DFF83C0D0021B5 +S315080040380180DFF83C0D00210180607E072802D048 +S31508004048607E052808D1A07E401CA076A07E782828 +S3150800405801D100206076B6E7607E0028FBD0208A6A +S3150800406800287AD0A07E411EA176C0B20028F2D1D7 +S31508004078E07E082808D0607E022802D0607E0128E3 +S3150800408810D1E07E05280DD100206076DFF8D40C23 +S315080040988021017000F0D1FFDFF8A40D142180F803 +S315080040A82F108DE1E07E052801DB042000E0E07E84 +S315080040B8032111FA00F0A076E07E401CE076607EC7 +S315080040C810F00F00C0B201280AD0022835D00328FC +S315080040D839D004283FD006283DD008283BD0BAE76F +S315080040E8DFF85C0D102180F82F10DFF8540D90F8D2 +S315080040F82F0050F00200DFF8481D81F82F00DFF87E +S31508004108400D022180F83610DFF8340D042180F8B6 +S315080041183710DFF82C0D062180F83810DFF8200D47 +S315080041280A2180F83910DFF8400C2C210180DFF8C5 +S31508004138100D602180F82E104BE1DFF8040D0021E0 +S3150800414880F82F10D1E7DFF81C0C0421017000F065 +S3150800415874FF00F0DEBD00F041BD607E10F00F0070 +S3150800416803287FF478AFDFF8FC0B0821017000F00C +S3150800417864FF00F08CBDDFF8C80C807B45287FF407 +S3150800418822AFDFF8E40B0088DFF8B41C097C0902C3 +S31508004198DFF8AC2C527C8918884216DBDFF8A00CAD +S315080041A8007C0002DFF8981C497C4018DFF8B81B29 +S315080041B80880DFF88C0C007D3F21084204D1DFF81F +S315080041C8800C407D002801D0FDE6FCE6DFF8240DCA +S315080041D80088DFF8241D0988884207D1DFF8140DFE +S315080041E84088DFF8141D4988884210D0DFF8500C3B +S315080041F8C08BDFF8001D0988884207D1DFF8400C14 +S31508004208008CDFF8F01C4988884200D0DBE6FFF707 +S3150800421807FE4FF6FF7188427FF4D5AEDFF8200C0B +S31508004228C07D062808D1FFF72DFE4FF6FF71884294 +S3150800423844D1DFF8F84C43E0DFF8040CC07D0128C8 +S315080042487FF4C1AEDFF8F80B90F8220008287FF44F +S31508004258BAAEDFF8EC0B002180F82210DFF8E00B85 +S31508004268808C4FF6F771884207DBDFF8D40B808C11 +S315080042780930DFF8CC1B888406E0DFF8C40B808C8D +S315080042880830DFF8BC1B8884DFF8B40BDFF8B01BEE +S31508004298498BC183DFF8A80BDFF8A41B898B018437 +S315080042A8DFF89C0BDFF84C1C09884183DFF8900B74 +S315080042B8DFF8401C4988818300F016BE83E6683417 +S315080042C8DFF8680CA042C0F0DB80607E0028F6D0D4 +S315080042D8DFF86C0B808CA1888842F0D1DFF8600B78 +S315080042E8408CE1888842EAD1DFF8540B408B218854 +S315080042F88842E4D1DFF8480B808B61888842DED192 +S31508004308DFF8000A0460DFF85C0A00210170DFF8AC +S31508004318300B90F82F00400700F1BC82DFF8200B1D +S3150800432890F82E00C0B200098000DFF8041C087057 +S31508004338DFF8340A0088DFF8F81B0978401A1438B9 +S31508004348DFF8241A0880607E10F00F00022808D1CA +S31508004358DFF8EC0A90F82F0010F03F00122800F05A +S31508004368A382DFF8040A0088002807D1DFF8D00AF4 +S3150800437890F82F000321084200F09682DFF8C00A59 +S3150800438890F82600217A884215D1DFF8B40A90F801 +S315080043982700617A88420ED1DFF8A40A90F8280027 +S315080043A8A17A884207D1DFF8980A90F82900E17AB5 +S315080043B8884200F07982DFF8880A102180F82F10E1 +S315080043C8DFF8A40928210180DFF8740A502180F84B +S315080043D82E10DFF86C0A217A80F82A10DFF8600AAE +S315080043E8617A80F82B10DFF8580AA17A80F82C1021 +S315080043F8DFF84C0AE17A80F82D10DFF8440A217BA9 +S3150800440880F82610DFF8380A617B80F82710DFF86D +S31508004418300AA17B80F82810DFF8240AE17B80F8A7 +S315080044282910DFF81C0A0621C175DFF8140AA188C5 +S315080044384184DFF80C0AE1888184DFF8040ADFF88A +S31508004448B41A09884183DFF8F809DFF8A81A4988F1 +S315080044588183DFF8EC092188C183DFF8E4096188DC +S315080044680184607EC00640F1F9840020DFF8D0197F +S3150800447881F83100DFF8C81981F8300000F0F6BC79 +S31508004488DFF8BC0990F82F0010F03F00022806D084 +S31508004498DFF8AC0990F82F00400729D593E5DFF82F +S315080044A8A009808CDFF88C1A0880DFF8840A0021B6 +S315080044B8017006E0DFF8780A0078401CDFF8701A01 +S315080044C80870DFF86C0A00780028E1D1DFF8640A7A +S315080044D80088DFF85C1A0978DFF85C2A32F81110C8 +S315080044E88842E7D10024DFF8480A00210170E6E08F +S315080044F8DFF84C09142180F82F10DFF86C082821FA +S315080045080180DFF83C09502180F82E10DFF83009C1 +S3150800451890F82900DFF8181A0870DFF82409DFF878 +S31508004528201991F82D1080F82910DFF81409DFF8FA +S31508004538001A097880F82D10DFF8040990F8280081 +S31508004548DFF8EC190870DFF8F808DFF8F41891F8BE +S315080045582C1080F82810DFF8E808DFF8D41909784D +S3150800456880F82C10DFF8D80890F82700DFF8C0196B +S315080045780870DFF8CC08DFF8C81891F82B1080F80F +S315080045882710DFF8BC08DFF8A819097880F82B1077 +S31508004598DFF8AC0890F82600DFF894190870DFF8F9 +S315080045A8A008DFF89C1891F82A1080F82610DFF87A +S315080045B89008DFF87C19097880F82A10DFF880084F +S315080045C890F82D00401CDFF8781881F82D00C0B245 +S315080045D8002820D1DFF8680890F82C00401CDFF87E +S315080045E8601881F82C00C0B2002814D1DFF85008EA +S315080045F890F82B00401CDFF8481881F82B00C0B249 +S31508004608002808D1DFF8380890F82A00401CDFF897 +S31508004618301881F82A00DFF82808408CDFF81419C2 +S315080046280880DFF81C08DFF81818898C4184DFF839 +S315080046381008DFF8001909888184DFF80408DFF80C +S315080046480018498BC183DFF8F807DFF8F417898B58 +S315080046580184DFF8EC07DFF89C1809884183DFF83E +S31508004668E007DFF890184988818300F0FFBBDFF878 +S31508004678C00800786821DFF8B42801FB0020407ECE +S31508004688072815D1002C0BD0A07EDFF8A4180978C6 +S315080046986822DFF8983802FB0131897E884207D2FA +S315080046A8DFF88C0800786821DFF8802801FB0024E9 +S315080046B8DFF87C080078401CDFF874180870DFF803 +S315080046C870080078002812D1DFF864080078682195 +S315080046D8DFF8582801FB0020407E0028C7D1DFF8FC +S315080046E8500800786821DFF8442801FB0024002CCC +S315080046F83FF469ACDFF80C0604600320A076207640 +S315080047080020A0750420E0750020E076DFF8300761 +S31508004718808CA080DFF82807408CE080DFF8200727 +S31508004728408B2080DFF81807808B60800120607630 +S31508004738DFF8380600782073DFF8300640786073AB +S31508004748DFF828068078A073DFF82006C078E073BB +S3150800475801202082DFF8E80690F82900E072DFF8E1 +S31508004768E00690F82800A072DFF8D40690F827002B +S315080047786072DFF8CC0690F8260020720120FFF751 +S31508004788CEFBDFF8BC0690F82E0010F0F000512892 +S31508004798FFF6A6ACDFF898070021017006E0DFF8F7 +S315080047A890070078401CDFF888170870DFF880073C +S315080047B80078DFF88C1691F82E10C9B20909C9B223 +S315080047C8491FB0EB810FBFF68BACDFF8640700789A +S315080047D8DFF86C16401890F83600DFF8601708708E +S315080047E8DFF85807007800283FF47AACDFF84C075A +S315080047F800780128D3D0DFF84407007802282ED19C +S31508004808DFF82C070078DFF83816401890F83700D4 +S31508004818042824D1DFF818070078DFF8241640188A +S3150800482890F83800DFF808170978DFF81426891889 +S3150800483891F8391051EA0020DFF8F8160880DFF8F1 +S31508004848F406008840F20B61884202DB40F20A60EF +S3150800485802E0DFF8E00600886082A08240E4DFF81C +S31508004868D0060078DFF8D815401890F837000028E1 +S315080048783FF436ACDFF8B8060078DFF8B4160978DE +S31508004888DFF8BC25891891F837100818DFF8A0163C +S3150800489808708BE700206076DFF8C80420210170CD +S315080048A800F0CBFBFFF78FBBDFF8940590F82F00D5 +S315080048B8C00664D5208A002861D0218A14F10C0024 +S315080048C8FFF740FADFF8780590F82A00DFF870163F +S315080048D80978884253D1DFF8680590F82B00DFF885 +S315080048E86016497888424AD1DFF8540590F82C00B2 +S315080048F8DFF84C168978884241D1DFF8440590F8E4 +S315080049082D00DFF83C16C978884238D1DFF830061A +S3150800491800782073DFF8280640786073DFF82006E9 +S315080049288078A073DFF81806C078E073E07E002860 +S315080049381DD194F9180094F91A10401AA17DC9B224 +S31508004948B0EBD100A17D4118A17540B2002801D568 +S3150800495840B24042E17DC9B2B0EB9100E17D401812 +S31508004968E075A07DC0B2E17D11EBD0002076DFF8B6 +S31508004978F40301210170207EA07600202082607E43 +S3150800498810F00F00C0B2012813D0C0F065820328C2 +S3150800499800F0FA8035D3052800F02F82C0F0F88198 +S315080049A8072800F04F82C0F04F82082800F0E481FB +S315080049B852E2DFF8B0030078C00720D503206076F6 +S315080049C8DFF8A0034021017000202082DFF8980351 +S315080049D8008800280CD0DFF88C03007850F0020015 +S315080049E8DFF880130870DFF880030088FFF797FA66 +S315080049F8DFF87C030021018000F01FFB47E1FFF781 +S31508004A08E2BADFF860030078C00740F1B380DFF840 +S31508004A18300490F82F0010F03F00122840F0AA80C2 +S31508004A28DFF81C0490F82E0010F0F000512829DB56 +S31508004A38DFF8FC040021017006E0DFF8F4040078CA +S31508004A48401CDFF8EC140870DFF8E4040078DFF897 +S31508004A58F01391F82E10C9B20909C9B2491FB0EB6B +S31508004A68810F0FDADFF8C8040078DFF8D413401886 +S31508004A7890F83600DFF8C4140870DFF8C004007828 +S31508004A88002826D103206076DFF8B40390F82600BC +S31508004A982072DFF8AC0390F827006072DFF8A003ED +S31508004AA890F82800A072DFF8980390F82900E072B9 +S31508004AB80120FFF734FAAB48422101700020208212 +S31508004AC8A94800210180AA480021018000F0B5FA0A +S31508004AD8DDE0DFF8680400780128AED0DFF85C046A +S31508004AE8007802282ED1DFF848040078DFF850133A +S31508004AF8401890F83700042824D1DFF834040078E1 +S31508004B08DFF83C13401890F83800DFF824140978C1 +S31508004B18DFF82C23891891F8391051EA0020DFF8B4 +S31508004B2814140880DFF80C04008840F20B618842E8 +S31508004B3802DB40F20A6002E0DFF8F80300886082C8 +S31508004B48A0829FE7DFF8E8030078BD49401890F887 +S31508004B583700002896D0DFF8D8030078DFF8D01396 +S31508004B680978B74A891891F837100818DFF8C01372 +S31508004B78087069E77B482021017000F05EFA6148F1 +S31508004B8800680021417683E4AD4890F82F00C007F5 +S31508004B982AD5607EC00627D4208A00287FF413AA5F +S31508004BA871480088401C80B2FFF7B9F96D4800784B +S31508004BB850F010006B4908706B480088002805D02B +S31508004BC86848007850F002006649087000F035FA1F +S31508004BD801202082082060760020E0769848112176 +S31508004BE880F82F10FFF7ECBB954890F82F00800641 +S31508004BF819D5934890F83400914991F8351051EA37 +S31508004C0800205649096840185449086056480088DB +S31508004C188B4991F834108A4A92F8352052EA0121CC +S31508004C28401A514908805048008800280CD0607EF0 +S31508004C38C00609D44B48007850F002004949087064 +S31508004C4849480088FFF76BF97D4890F8300000025C +S31508004C587B4991F831104018B6490880A08AB549A9 +S31508004C680988884203D3B3480088002802D1A08A55 +S31508004C78B0490880AF48008860823A48007803211E +S31508004C88084277D03A480021018000F0D6F935481D +S31508004C98007880060AD5364800210180002060760B +S31508004CA86748142180F82F10FFF78ABB2D4800782B +S31508004CB8C0060ED52E480021018001202082042036 +S31508004CC860760020E0765E48112180F82F10FFF7FD +S31508004CD877BB27480088002819D022480078C007DB +S31508004CE801D500202082208A00280DD1608A204913 +S31508004CF80988884202D2608A1D4908801C480088AB +S31508004D08208204E0E02D0020208A19490880002026 +S31508004D18E076124812490968016015480088002893 +S31508004D280CD0208A002809D0208A28300E49088005 +S31508004D384348182180F82F10FFF746BB0948007822 +S31508004D48800717D50848282101803D48102180F892 +S31508004D582F10FFF739BB00BF1A010020D82D0020F5 +S31508004D68DC2D00201B2E00200A2E0020E42D002012 +S31508004D780C2E0020FFF727B972480078C00706D519 +S31508004D88002060766F481021017000F056F963E03C +S31508004D986D480088002803D06B480088FFF7BFF8DD +S31508004DA8274890F82F00C00716D566480078C00728 +S31508004DB806D5072060760020A0760020208201E02C +S31508004DC8062060760120FFF7AAF85E4810210170D0 +S31508004DD800F033F9FFF7EFBA5A480078C00705D547 +S31508004DE80520607600202082FFF7EDB8564800882F +S31508004DF800287FF4E0AAFFF7E6B853480088002899 +S31508004E0803D051480088FFF78AF80D4890F82F0014 +S31508004E18C0070DD5072060760020A0760120FFF789 +S31508004E287EF848481021017000F007F9FFF7C3BA61 +S31508004E384548008800287FF4BEAAFFF7C4B800BF13 +S31508004E48E4000020FFF7B7BA3E480078C00703D544 +S31508004E58072060760020A076FFF7B5B83B480621FC +S31508004E6880F8301039480A2180F83110374840212F +S31508004E78817536483449098889B2090A017433485C +S31508004E883149098841740020304981F835002F498D +S31508004E9881F834002D4800214186FEF7F3FFC04308 +S31508004EA82A49488629484521817328480021C1731B +S31508004EB80020264948752549087525480088401C54 +S31508004EC82349088021482249098889B2090A817430 +S31508004ED81E481F490988C1741C4800210183FEF72A +S31508004EE89FFFC04319490883164800210170FFF738 +S31508004EF872B80000CC2D0020DCAB000880B2010A8D +S31508004F0851EA002080B2704780B501290CDB114AA6 +S31508004F18118011490968884206D00E490A88010095 +S31508004F280D480068FEF7CAFE01BD0000A828002043 +S31508004F381C2E0020142E00200E2E00201D2E0020C8 +S31508004F48E82D00201B2E00200A2E0020E400002051 +S31508004F58102E00200C2E0020DC2D002080B500F035 +S31508004F681BF900F019FB10F5FA708049086000F083 +S31508004F7813FB00F51C5010307D490860FEF787FFC3 +S31508004F884FF6A960ADF8000043F61370ADF80200B5 +S31508004F987848BDF8001001807648BDF802104180AF +S31508004FA84FF6FF70ADF800000020ADF80200724811 +S31508004FB8BDF8001001807048BDF8021041804FF610 +S31508004FC8A960ADF8000040F21310ADF802006B486E +S31508004FD8BDF8001001806948BDF8021041804EF6F8 +S31508004FE80300FEF781FF00F0C2F901BD38B5644A2F +S31508004FF8126812F11C0422686260002205E092B267 +S31508005008131992B2155C1D72521C0B00DBB292B2D0 +S315080050189BB29A42F3D3C9B2081DA4F84800B4F85B +S315080050284810201DFFF770FF2068401C206031BD1E +S3150800503880B500F032F8002002BD10B55048006867 +S3150800504810F11C044F480078400605D50120206059 +S315080050580020A4F848001FE04A480078C00702D58F +S315080050680020A4F8480047480078400708D5B4F84F +S315080050784800002804D0B4F84810201DFFF744FF5C +S3150800508840480078800707D50020A4F848003E481D +S315080050980068001D00F0BAFA10BD10B500F094F9C2 +S315080050A800282DD0394908804FF40060FFF726FFFD +S315080050B83749898980B281420ED10120FEF764FFFB +S315080050C83248008800281BD000F0F1FD00F098F956 +S315080050D82E480021018013E040F60600FFF70EFF70 +S315080050E82B49898980B281420AD100F07AFD27487E +S315080050F80088002804D000F083F92448002101809C +S3150800510800F04AFA1949096888421ED31748006800 +S3150800511810F5FA7015490860002414E068201D493E +S3150800512800FB0410164908600220FEF72DFF1748F1 +S315080051380088002806D000F0BAFD00F061F9134887 +S3150800514800210180641C002CE8D000F025FA0849E3 +S315080051580968884208D30648006800F51C501030CC +S315080051680349086000F072FC10BD0000C02D00203D +S31508005178C42D0020CC2D0020D42D0020D02D0020B1 +S31508005188E02D00201B2E0020D82D00200A2E0020F6 +S31508005198E4000020A828002010B5B2B001215FF06D +S315080051A8F050FEF715FD01214720FEF711FD0121F4 +S315080051B84FF48040FEF73CFD012000F051FE8E209A +S315080051C8009000208DF8060002208DF804000020C3 +S315080051D88DF8070002208DF8050000A9DFF83803C6 +S315080051E8FEF7ECFB0B220121CB48FEF745FC0B2208 +S315080051F80221C948FEF740FC0B220321C648FEF7E0 +S315080052083BFC0B220721C448FEF736FC4FF4006026 +S31508005218009000208DF8060002208DF80400002072 +S315080052288DF8070002208DF8050000A9BB48FEF78F +S31508005238C5FB0B220B21B948FEF71EFC322000904D +S3150800524800208DF8060002208DF8040000208DF84D +S31508005258070002208DF8050000A9B148FEF7AEFB45 +S315080052680B220121AE48FEF707FC0B220421AC48A5 +S31508005278FEF702FC0B220521A948FEF7FDFB4FF4B1 +S31508005288C040009000208DF8060002208DF8040022 +S3150800529800208DF8070002208DF8050000A99F4810 +S315080052A8FEF78CFB0B220D219C48FEF7E5FB0B222B +S315080052B80E219A48FEF7E0FB00F0D8FD01F052F8F7 +S315080052C801F059F80128FBD003A800F031FF0020A7 +S315080052D8039000200A904FF400700D9000200E905D +S315080052E85FF00040119020201490002016900020AE +S315080052F81790002018904FF400600B904FF48040E8 +S315080053080890002400E0641C202C15D202212000F5 +S3150800531880B200F092FFADF80A000321200080B29F +S3150800532800F08BFFADF8080002987E49884203D042 +S3150800533802987D498842E6D1212C04D340F24711C8 +S315080053487A4801F077F8210089B203A800F09AFD97 +S31508005358002804D14FF4A671744801F06BF800F0E0 +S31508005368C4F800F098F800F058FF32B010BD82B0C3 +S3150800537808208DF8000000208DF8010027208DF8F8 +S31508005388020069208DF803005B208DF8040045208B +S315080053988DF8050066489DF80010017064489DF868 +S315080053A80110417062489DF80210817060489DF8A6 +S315080053B80310C1705E489DF8041001715C489DF899 +S315080053C80510417102B0704710B55A480068C00FF9 +S315080053D8002813D157480068C0F30D4422005649DF +S315080053E85648FEF76BFC5348006850F00040514990 +S315080053F80860534801210160200000E0002010BD24 +S3150800540880B550480068C00F0028FAD14E4802886F +S315080054184A494E48FEF752FC4A484C498160494871 +S31508005428002101604748006850F480104549086023 +S315080054384448006850F000504249086041480068EE +S3150800544850F080503F4908603E48006830F00060D8 +S315080054583C4908603B48006830F080603949086074 +S31508005468384800214160384800883649496860F359 +S315080054780B01344841603348406830F4805031495C +S3150800548848603048006850F000402E4908603048A7 +S315080054980121016001BD2748274981602548002167 +S315080054A8016024482349C1602248002141602148F7 +S315080054B8406830F400401F4948601E48406850F468 +S315080054C880401C4948604FF4C8601A49496860F327 +S315080054D80C01184841601748006850F00040154903 +S315080054E808601C48134901607047164817498160C7 +S315080054F814481449C1601348006850F480101149CB +S3150800550808601048002101600E48002141601248D1 +S315080055180C4901607047000000000240001802406C +S315080055280008024019162200F1C00700A8A60008BC +S31508005538982D0020002D002028070020E4000020D0 +S3150800554808900240802D00200A2E0020680D0020B1 +S31508005558049002400C9002401090024080B500F07A +S315080055680DF81048104901601048002101601048DC +S31508005578052101600F480021016001BD0C48002182 +S31508005588016070470A480068C00304D509480068DE +S31508005598401C08490860704780B5FFF7F3FF0548BF +S315080055A8006802BD14E000E03F90020018E000E041 +S315080055B810E000E0C82D0020DFF870040021017013 +S315080055C8DFF8680400218164DFF86004002180F8A8 +S315080055D84310DFF858040021A0F84410DFF84C04FB +S315080055E800218170DFF84404002141707047DFF814 +S315080055F83C040078002801D1002000E0012070470B +S31508005608DFF82804002180F84310704780B5017830 +S31508005618FF291ED100F091F8DFF8100490F843002E +S31508005628012802D1102000F07EF8DFF80004B0F94E +S31508005638440001280CDBDFF8F403012180F8431045 +S31508005648DFF8E803B0F94410DFF8E40300F053F88C +S3150800565801BDDFF8D813097801294BD10178C92982 +S3150800566832D0CC293FD0CF293AD0D0292FD0D1292A +S3150800567833D0D2292ED0F32917D0F4290FD0F529FB +S315080056880AD0F6290ED0FA2912D0FC2913D0FD29FA +S3150800569814D0FE2915D029E000F0DAF8BCE700F0A6 +S315080056A8F9F8B9E700F0C9F8B6E700F018F9B3E76A +S315080056B800F0ABF8B0E700F0A2F8ADE700F087F81D +S315080056C8AAE700F075F8A7E700F03DF9A4E700F0A7 +S315080056D85CF9A1E700F01AF99EE700F087F99BE75D +S315080056E800F098F998E700F0ABF995E7202000F064 +S315080056F81AF891E7ACE780B589B200F0F1FE01BD6A +S3150800570810B4002302E00478E318401C0C00611E5C +S31508005718002CF8D1DBB21360012010BC7047C348CF +S31508005728002141707047C149FE22CA70BF490871F5 +S31508005738BE480221A0F84410704710B5040000F0CE +S315080057483EFF002803D11020FFF7EDFF2FE0FFF7F3 +S31508005758E6FFB64801210170B448FF21C170B34875 +S3150800576800210171B148007950F01000AF4908715D +S31508005778AE4800214171AD48AC494979417100F0FC +S31508005788D9FEAA49887100F0EAFEA849C87100F04E +S31508005798E6FE80B2000AA5490872A44801214172AA +S315080057A8A24801218172A1480821A0F8441010BD19 +S315080057B810B504009D4800210170FFF7B0FF9B480B +S315080057C8FF21C17099480121A0F8441010BD9749D6 +S315080057D8FF22CA70954900220A719449934A527859 +S315080057E84A71924900228A7190490022CA718F49E2 +S315080057F800220A728D490622A1F84420704710B57E +S3150800580804000020FFF78FFF10BD8849FF22CA70E1 +S315080058188649884A8A64854900220A71834900228A +S315080058284A71824900228A7180490722C1F80720ED +S315080058387E490822A1F8442070477C49FF22CA708D +S315080058487A494068886479480121A0F84410704765 +S3150800585810B5040000F06EFE401E6178884203DA2F +S315080058682220FFF760FF14E0627892B26F48816CD5 +S31508005878714801F07FFA6D48FF21C1706B48806C4A +S3150800588861784018694988646078401C6749A1F8B6 +S31508005898440010BD10B5040000F04CFE401E6178A7 +S315080058A8884203DA2220FFF73EFF17E05F4861685F +S315080058B88164627892B25D48816C5F4801F05AFA51 +S315080058C85A48FF21C1705948806C61784018574971 +S315080058D888646078401C5549A1F8440010BD80B515 +S315080058E85249FF22CA70554A41685048806CFFF7EA +S315080058F807FF4E4908714D48002141714B48002160 +S3150800590881714A480821A0F8441001BD10B5040061 +S315080059184648FF21C17045480021017143480021C6 +S31508005928417100F007FE4149887140480021C1715C +S315080059383E48002101723D48002141723B48072133 +S31508005948A0F8441010BD10B5040000F0F3FD621C61 +S3150800595880B2411E3548806C01F021FA002803D12F +S315080059683120FFF7E0FE0FE03048FF21C17000F054 +S31508005978E1FD2E49896C80B2401E40182B4988647F +S315080059882A480121A0F8441010BD10B5040000F0FB +S31508005998D1FD801E6178884203DA2220FFF7C3FE0C +S315080059A823E02248FF21C17020480121A0F84410AD +S315080059B86078002807D101F0FEF9002802D13120C5 +S315080059C8FFF7B1FE11E0A21C61781848806C01F057 +S315080059D8E6F9002803D13120FFF7A5FE05E01348AC +S315080059E8806C617840181149886410BD80B5416893 +S315080059F80E48806C01F0D7F9002803D13120FFF74B +S31508005A0892FE06E00948FF21C17008480121A0F85E +S31508005A18441001BD10B5040001F090F90348FF21B0 +S31508005A28C17002480121A0F8441010BD7029002051 +S31508005A3873290020D4AB0008742900207729002090 +S31508005A4880B53120FFF76FFE01BD000080B5DFF88D +S31508005A58C8030078401CDFF8C0130870DFF8B003E5 +S31508005A68002101701EE0DFF8A80300780C21DFF892 +S31508005A78A42301FB002001884288114300290AD083 +S31508005A88DFF894130978827A891A782903DB0422BD +S31508005A98002101F09AF9DFF878030078401CDFF84E +S31508005AA870130870DFF8680300780828DBDB01BD87 +S31508005AB838B50C00DFF8581300220A7006E0DFF83C +S31508005AC850130978491CDFF848231170DFF840138A +S31508005AD8097808291FDADFF8381309780C22DFF85D +S31508005AE8343302FB013529880029E8D0698800295A +S31508005AF8E5D001882A889142E1D141886A8891428D +S31508005B08DDD106222100281DFEF7D8F8DFF808039C +S31508005B180078A87264E0DFF8F81200220A7006E036 +S31508005B28DFF8EC120978491CDFF8E4221170DFF86F +S31508005B38E012097808290DDADFF8D41209780C2258 +S31508005B48DFF8D03202FB013529880029E8D16988AF +S31508005B580029E5D1AE490978082934D1AF49002288 +S31508005B680A70AF4900220A70A94900220A701CE087 +S31508005B78A74909780C22A74B02FB0135A7490978DA +S31508005B88A54A1278AB7AD21A914209DAA249097853 +S31508005B98AA7A891AA14A1170A1499D4A12780A70E7 +S31508005BA89B490978491C9A4A11709949097808291C +S31508005BB8DEDB97499A4A12780A70954909780C22C1 +S31508005BC8944B02FB0135042201002800FEF776F8FB +S31508005BD806222100281DFEF771F88F480078A8725A +S31508005BE831BD80B58F4800882A2803D28D48002100 +S31508005BF801805BE08B48002101808B48808AB0F5DC +S31508005C08807F03D0B0F5007F40D04FE08648C08C2F +S31508005C1886490988884238D18348008D8349498846 +S31508005C28884232D182498348FFF742FF7E484FF4BB +S31508005C380071818206227E497F48FEF73FF80622D0 +S31508005C487E497B48FEF73AF806227C497C48FEF7E7 +S31508005C5835F8062278497448FEF730F872487249CA +S31508005C68898BC18470487049C98B01856E486F490C +S31508005C78098881836C486D494988C1836A484FF405 +S31508005C88C161818167482A2101800FE06648C08C76 +S31508005C9866490988884209D16348008D6349498855 +S31508005CA8884203D162496348FFF702FF01BD80B500 +S31508005CB85D49C98B634A128891420BD15A49098CA6 +S31508005CC8604A5288914205D106225F495648FDF72F +S31508005CD8F5FF8EE05449C98B5C4A12881140534A2D +S31508005CE812885A4B1B881A4091420BD14E49098C87 +S31508005CF8564A528811404D4A5288544B5B881A4076 +S31508005D08914208D05249534A12880A805049514A42 +S31508005D1852884A8007E04449C98B4D4A11804C4944 +S31508005D28414A128C4A803A4900220A7004E03849E6 +S31508005D380978491C364A11703549097808290FDA4D +S31508005D48334800780C21334A01FB0020404909886A +S31508005D5802889142EBD13E49498842889142E6D168 +S31508005D682B49097808293FD10622FF212E4801F038 +S31508005D782CF806220021304801F027F806222F4978 +S31508005D882F48FDF79BFF06222C492948FDF796FF61 +S31508005D9825482F490988C18423482D4949880185FA +S31508005DA821482249098881831F4820494988C1838F +S31508005DB81D484FF4807181821B484FF48071C18158 +S31508005DC819480821018218480621817416480421B1 +S31508005DD8C17415484FF4C16181811F481F49016084 +S31508005DE810482A21018011E00622011D0E48FDF7F8 +S31508005DF865FF062211491248FDF760FF0A4808217F +S31508005E088181084800880E300649088001BD0000CF +S31508005E181E2E002010290020202E0020212E0020CA +S31508005E281F2E00200A2E0020E4000020CC2D00207A +S31508005E38FA0000200001002004010020982D002007 +S31508005E48EA000020E0AB0008C4AB0008D42D002007 +S31508005E58EC2D0020D02D0020D82D00201A01002076 +S31508005E680149086070470000DC00274280B5012117 +S31508005E785FF00070FDF7ECFE00215FF00070FDF79B +S31508005E88E7FE01BD2DE9F04186B004000D000026A5 +S31508005E98002700200190DFF8488500200090DFF8E9 +S31508005EA844050068070037F01C0702A8FDF71EFE20 +S31508005EB803988046DFF83005B8EB0000DFF82C15A4 +S31508005EC8884202D257F0080714E0DFF82405B8EB31 +S31508005ED80000DFF82015884202D257F00C0709E0BF +S31508005EE8DFF81405B8EB0000DFF81015884201D36F +S31508005EF857F00407DFF8EC0407604FF40042002166 +S31508005F08280080B200F0CEF9002801D100200CE163 +S31508005F185FF08060019002E00198401E01900198A8 +S31508005F280028F9D12068002851D00098401C009014 +S31508005F380121280080B200F080F9400704D40098AF +S31508005F48DFF8BC148842F0D30098DFF8B414884206 +S31508005F5801D10020E9E0002000904FF4805200218A +S31508005F68280080B200F09EF9002801D10020DCE064 +S31508005F780098401C00900121280080B200F05DF9C5 +S31508005F88800604D40098DFF878148842F0D300987D +S31508005F98DFF86C14884201D10020C6E00020009082 +S31508005FA81021280080B200F048F90600700703D5CA +S31508005FB84FF40060206201E000202062B00702D595 +S31508005FC8002060611CE04FF48040606118E0206A98 +S31508005FD86169490851EAD00292B20021280080B2C4 +S31508005FE800F060F9002801D100209EE07FF07F408C +S31508005FF8019002E00198401E019001980028F9D105 +S31508006008DFF800040768DFF8000407406068A1683D +S315080060180843E16808432169084361690843A16997 +S315080060280843E1690843216A0843616A0843A16A83 +S315080060380843E16A0843216B0843616B0843074331 +S31508006048DFF8C0030760A06BE16B0843216C0843BF +S31508006058616C0843A16C0843E16C0843216D084349 +S31508006068616D0843DFF8A4130860A06DDFF8A01374 +S315080060780860E06DDFF89C130860DFF89C03076882 +S315080060884FF641700740206E616E51EA0040A16ED6 +S315080060980843E16E0843216F0843616F08430743C5 +S315080060A8DFF874030760A06FE16F0843DFF86C1325 +S315080060B80860DFF86C030768DFF868030740D4F858 +S315080060C88000D4F884100843D4F888100843D4F814 +S315080060D88C100843D4F890100843D4F89410084351 +S315080060E8D4F898100843D4F89C100843D4F8A0109C +S315080060F808430743DFF828030760D4F8A400D4F850 +S31508006108A8100843D4F8AC100843D4F8B0100843CC +S31508006118D4F8B41050EA8100D4F8B810084350F4FB +S315080061280000DFF804130860012006B0BDE8F08116 +S315080061380021016000214160002181600021C160C1 +S315080061480021016100214161002181610021C161AD +S315080061580021016200214162002181620021C16299 +S315080061680021016300214163002181630021C16385 +S315080061784021016420214164002181640021C16411 +S315080061880021016500214165002181650021C1655D +S315080061980021016680214166002181660021C166C9 +S315080061A80021016700214167002181670021C16735 +S315080061B85FF08061C0F880105FF00071C0F8841045 +S315080061C85FF08071C0F888105FF40011C0F88C1071 +S315080061D80021C0F890100021C0F894100021C0F8DA +S315080061E898100021C0F89C100021C0F8A0105FF094 +S315080061F80071C0F8A4100021C0F8A8105FF4003197 +S31508006208C0F8AC104FF48071C0F8B0100021C0F87F +S31508006218B4100021C0F8B810704780B5012000F006 +S3150800622877F800F0B3F8012000F087F8012000F0AD +S31508006238B4F8012000F0C2F801BD81B0002200239D +S315080062480093DFF8A0311B681A0012F01C0280B20E +S31508006258C00210F47840024389B2880110F4F86045 +S31508006268024332F0020252F00102DFF878010260B6 +S315080062780098401C0090DFF86C010268D00704D526 +S315080062880098DFF87C118842F2D30098DFF870117D +S31508006298884201D1002003E0DFF89001006880B247 +S315080062A801B0704718B4002300240094DFF834417D +S315080062B82468230013F01C0380B2C00210F4784047 +S315080062C8034389B2880110F4F860034353F00203C4 +S315080062D853F00103DFF8540192B20260DFF80401B3 +S315080062E803600098401C0090DFF8F8000368D80798 +S315080062F804D50098DFF808118842F2D30098DFF829 +S315080063080011884201D1002000E0012012BC704724 +S31508006318C0B2002808D0DFF8EC00006850F0080082 +S31508006328DFF8E010086007E0DFF8D800006830F00A +S315080063380800DFF8D01008607047C0B2002808D0F7 +S31508006348DFF8C000006850F00400DFF8B8100860ED +S3150800635807E0DFF8B000006830F00400DFF8A410A2 +S3150800636808607047DFF8C800006850F00100DFF8D9 +S31508006378C010086070470020DFF8B4100968C9071C +S3150800638801D5012000E00020C0B270472448006803 +S3150800639850F48010224908607047C0B2002806D019 +S315080063A81F48006850F400501D49086005E01C485D +S315080063B8006830F400501A4908607047C0B20028CF +S315080063C806D01748006850F002001549086005E02D +S315080063D81348006830F00200114908607047000049 +S315080063E8000E270710800240002D3101C0E1E400A5 +S315080063F8C00E160240787D0100879303015A62028F +S31508006408FFFF0400008002400F8120FF048002403D +S31508006418088002400C800240188002401C80024016 +S3150800642818900240233FDEF800900240148002408C +S315080064380090024080B5034A10600348016000F0E6 +S31508006448CFFCFCE7A02D0020A42D002080B5FFF77F +S31508006458B3F800F00EFD4C480121017000F02EFE3D +S3150800646849480021017000F0DFFE47480221017003 +S31508006478FEF774FD44480321017001BD80B5434801 +S3150800648800F0B9FD012805D13F48012101703F48B0 +S31508006498FFF7BCF83D4800F05BFE012805D13A48ED +S315080064A8002101703948FFF7B1F8384800F023FF92 +S315080064B8012805D13448022101703448FFF7A6F8A7 +S315080064C83248FEF7B5FD012805D12F48032101708A +S315080064D82E48FFF79BF801BD80B500F0D4FE01BD34 +S315080064E838B504000D0028480078012804D1290089 +S315080064F8C9B2200000F03EFD23480078002804D1E0 +S315080065082900C9B2200000F0F7FD1F4800780228C4 +S3150800651804D12900C9B2200000F0BEFE1A48007846 +S31508006528032804D12900C9B22000FEF75FFDFFF74A +S3150800653867F831BD14480078002805D0022807D026 +S3150800654804D3032806D007E0402006E0082004E024 +S315080065583F2002E0402000E0402080B270470A4809 +S315080065680078002805D0022807D004D3032806D0C7 +S3150800657807E0402006E0082004E03F2002E040202B +S3150800658800E0402080B27047E0000020E42A00209E +S3150800659880B5FFF72CF802BD80B5DFF8780600212C +S315080065A80170DFF874160020FBF755F8C0B200280A +S315080065B804D07C21DFF86406FFF73CFF01BDDFF84D +S315080065C854060078002801D1012000E00020704711 +S315080065D880B5FFF7DDFF012801D1002011E0DFF8BB +S315080065E834060078002801D000200AE001F03EF8B9 +S315080065F8012805D1DFF81C0601210170012000E0F9 +S31508006608002002BD10B5DFF80C060078002800F057 +S31508006618FF81DFF800060078012834D101F040F838 +S31508006628DFF8FC0501F06AF8DFF8F80501F066F806 +S3150800663801F034F801220100DFF8EC05FBF724F82D +S31508006648002807D0DFF8E40501F058F8012001F022 +S315080066584BF8DDE1DFF8D80501F050F8DFF8D40586 +S3150800666801F04CF8DFF8D00501F048F8DFF8CC055A +S3150800667800210160DFF8C40500214160DFF89405B0 +S3150800668802210170C4E1DFF88C050078022840F081 +S31508006698F780DFF894254FF48071DFF8A405FBF737 +S315080066A897FCDFF8741591F83A12C1F3C01111F086 +S315080066B8010101290FDBDFF8740501F01FF8022034 +S315080066C801F012F8DFF86005FBF701FBDFF844056F +S315080066D8002101709CE100281BD00022DFF8641510 +S315080066E8DFF85C0500F0D6F9040024B214F1010FAE +S315080066F80FD1DFF8380501F001F8032000F0F4FFA0 +S31508006708DFF82405FBF7E3FADFF80805002101702E +S315080067187EE124B2012C28DBDFF820054068002832 +S315080067280BD1DFF81C05D0F88001DFF810150860D2 +S31508006738DFF8080524B2446017E0DFF80405D0F846 +S315080067488001DFF8F8140968884206D2DFF8F004F1 +S31508006758D0F88001DFF8E4140860DFF8E004406840 +S3150800676800FA84F0DFF8D4144860DFF8AC04D0F8EF +S315080067783C02DFF8A414D1F84012884201D101205E +S3150800678800E000200128C0F243810021DFF89804C0 +S31508006798FBF7A9FA00280FD0DFF8900400F0AEFF3F +S315080067A8042000F0A1FFDFF88004FBF790FADFF871 +S315080067B86404002101702BE1DFF8740400F09EFFE1 +S315080067C8DFF8840400F09AFFDFF88014DFF86C0419 +S315080067D8406800F075FADFF8740400F08FFFDFF8F8 +S315080067E8700400F08BFFDFF86414DFF850040068C3 +S315080067F8000EC0B200F053FADFF85814DFF83C046C +S315080068080068000CC0B200F04AFADFF84C14DFF84A +S315080068182C040068000AC0B200F041FADFF83C14FC +S31508006828DFF818040068C0B200F039FADFF81C046B +S3150800683800F064FF77A000F061FFDFF80004416804 +S31508006848DFF8F803006800F0AEFA00280FD1DFF881 +S31508006858DC0300F053FF052000F046FFDFF8C80305 +S31508006868FBF735FADFF8AC0300210170D0E0DFF852 +S31508006878C00300F043FFDFF89C0303210170C7E05B +S31508006888DFF890030078032840F0C280DFF89823E1 +S315080068984FF48071DFF8A803FBF79AFBDFF8781343 +S315080068A891F83A12C1F3C01111F0010101290EDB62 +S315080068B8DFF8AC0300F022FF022000F015FFDFF82E +S315080068C86803FBF704FAD34800210170A0E0002802 +S315080068D81AD0DFF89023DFF86C13DFF8640300F0AA +S315080068E8D9F8040024B214F1010F0DD1DFF87803A2 +S315080068F800F004FF032000F0F7FECB48FBF7E7F9A2 +S31508006908C4480021017083E024B2012C4CDBD74827 +S3150800691800F0F4FECD4924B2200000F0D1F9CB48A6 +S3150800692800F0ECFED24800F0E9FEC849C448D0F8A1 +S315080069388001000EC0B200F0B2F9C649C048D0F8C6 +S315080069488001000CC0B200F0AAF9C349BC48D0F8C7 +S315080069588001000AC0B200F0A2F9C049B848D0F8C8 +S315080069688001C0B200F09BF9B84800F0C7FE29A01C +S3150800697800F0C4FEBB4A24B22100B148D0F8800111 +S3150800698800F00DFA00280CD1A84800F0B7FE06203A +S3150800699800F0AAFEA448FBF79AF99E480021017060 +S315080069A836E0A34800F0AAFE9B48D0F83C029A496C +S315080069B8D1F84012884201D1012000E000200128C0 +S315080069C826DBAC4800F09AFE00F0F5F900280CD151 +S315080069D8964800F093FE072000F086FE9248FBF7DB +S315080069E876F98C480021017012E0914800F086FE7D +S315080069F8A14800F083FE8C48FBF769F99F4800F028 +S31508006A087DFE84480021017000F05BFE00F096F9CF +S31508006A1810BD00002E2E2E0010B50400207800F0B8 +S31508006A289DFE532804D1607800F09CFE002801D109 +S31508006A3803200FE06078312801D100200AE0607849 +S31508006A48322801D1012005E06078332801D10220D7 +S31508006A5800E0032010BD70B504000026A41C200021 +S31508006A6800F047F90500AE19A41C200000F041F90A +S31508006A7886196D1EA41CADB2022DF6DAF6B2F643D7 +S31508006A88200000F036F9F6B2864201D0002000E070 +S31508006A98012070BD2DE9F04105000E0014005FF0D5 +S31508006AA80008002E01D0002D04D140F236215B489B +S31508006AB8FFF7C0FC2800FFF7AFFF0700FFB2032F58 +S31508006AC801D10020A3E02800FFF7C5FF002802D15E +S31508006AD85FF0FF309BE0FFB2002F03D0022F5AD099 +S31508006AE828D392E0AD1C280000F003F90700AD1C76 +S31508006AF8280000F0FEF800023060AD1CD6F80080C9 +S31508006B08280000F0F6F858FA80F03060AD1CB7F1A6 +S31508006B180308002C0DD0002606E0280000F0E9F846 +S31508006B28B6B23055AD1C761CB6B20FFA88F846458B +S31508006B38F3DB6AE0AD1C280000F0DBF80700AD1CA3 +S31508006B48280000F0D6F800043060AD1CD6F800809E +S31508006B58280000F0CEF818EB00203060AD1CD6F8F7 +S31508006B680080280000F0C5F858FA80F03060AD1C9F +S31508006B78B7F10408002C0DD0002606E0280000F01E +S31508006B88B8F8B6B23055AD1C761CB6B20FFA88F806 +S31508006B984645F3DB39E0AD1C280000F0AAF80700E3 +S31508006BA8AD1C280000F0A5F800063060AD1CD6F824 +S31508006BB80080280000F09DF818EB00403060AD1CF6 +S31508006BC8D6F80080280000F094F818EB002030600A +S31508006BD8AD1CD6F80080280000F08BF858FA80F02B +S31508006BE83060AD1CB7F10508002C0DD0002606E06C +S31508006BF8280000F07EF8B6B23055AD1C761CB6B241 +S31508006C080FFA88F84645F3DBFFE7404600B2BDE8C9 +S31508006C18F0810000172E00209C1900203CA80008C7 +S31508006C286CA90008F8A80008D01B0020B4AB000817 +S31508006C38BCAB000890A900086CA80008902D002095 +S31508006C4824260020A427002094AB0008242B002023 +S31508006C5840AA0008262B0020282B00202A2B0020D3 +S31508006C68B4A9000824270020D8A9000838AB0008CA +S31508006C7878AA00085CAA000890AA0008CCA8000808 +S31508006C8880B5010011F00F003030C9B20A2901DBBE +S31508006C98C01D02E0C0B200F061FDC0B202BD38B541 +S31508006CA804000D00E4B22009FFF7EAFF287014F083 +S31508006CB80F00FFF7E5FF68700020A870280032BDAE +S31508006CC80200491C0A23B2FBF3F2002AF9D1002272 +S31508006CD80A700200491E0A20B2FBF0F300FB1320D3 +S31508006CE8303008700A20B2FBF0F2002AF2D1080008 +S31508006CF8704770B504000025002609E03038C0B290 +S31508006D080A2800DBC01FEDB2290151FA80F5761C66 +S31508006D18F6B2022E0FDAF6B2305D00F01FFDC0B2E9 +S31508006D28B0F13001172904D2C0B2B0F13A010729E7 +S31508006D38E4D2002001E02800C0B270BD80B500F09A +S31508006D4836F8002811D000F086FC00280DD0FFF789 +S31508006D58C3FBFEF713FC00F0DDFD044908400449AF +S31508006D68086000F0D7FD4068804701BD80FFFF1F17 +S31508006D7808ED00E070B504000D00160005E0287857 +S31508006D8820706D1C641C00F02BF83000461E80B27B +S31508006D980028F4D170BD80B500F0ECFC01BD80B5C3 +S31508006DA800F0F3FC02BD80B500F019FD02BD80B500 +S31508006DB800F06CFD02BD80B500F02BFD002801D15E +S31508006DC8002001E000F08BFD02BD10B5040010009C +S31508006DD80A000100200000F0C5FE200010BD70471B +S31508006DE870470000F0B4002400E0641CE4B2122CDA +S31508006DF83CD24AF2104580B2E4B2994E16F81460AD +S31508006E08E4B2974F17EB44077F78BE19761C06FB42 +S31508006E1800F695FBF6F706FB1755002DE5D14AF25D +S31508006E28104580B2E4B28E4E16F81460E4B28C4F60 +S31508006E3817EB44077F78BE19761C06FB00F695FB08 +S31508006E48F6F50D800D88002DCFD00D88B5F5806F25 +S31508006E58CBDCE4B2824810F814001070E4B280481B +S31508006E6810EB440040781870012000E00020F0BCC0 +S31508006E78704780B500AB0DF101020DF102014FF420 +S31508006E88FA70FFF7AFFFC0B2012803D0F0217548A2 +S31508006E98FFF7D0FA7448002101607448006850F476 +S31508006EA800407249086001E0FFF79AFF6F480068DA +S31508006EB80004F9D46D48006830F002006B49086090 +S31508006EC86A48006850F001006849086001E0FFF761 +S31508006ED887FF67480068C007F9D59DF80100401E76 +S31508006EE89DF80010491E090551EA0040BDF8021030 +S31508006EF8491E08435F4908605C4800684008400026 +S31508006F085A49086001E0FFF76BFF59480068C0074F +S31508006F18F9D45948006850F001005749086057489D +S31508006F28006830F48040554908605548006850F4B0 +S31508006F38804053490860534800210160524800219F +S31508006F4801605248006830F480405049086050484B +S31508006F58006830F480404E4908604848006850F494 +S31508006F68804046490860444800684008400042494D +S31508006F78086001BD38B504000D00464800684001A0 +S31508006F8804D44FF4A2713748FFF754FA4248006808 +S31508006F9810F00100404908603F4800683F49084327 +S31508006FA83D4908603E48EDB20560E078A1780904D5 +S31508006FB851EA0060617850EA012021780843394986 +S31508006FC80860E079A179090451EA0060617950EA14 +S31508006FD8012021790843344908602F48006850F091 +S31508006FE801002D49086001E0FFF7FAFE2948006804 +S31508006FF84001F9D531BD00212C4A126812F0030F59 +S315080070082BD02B4A1268520D40F267639A421ED15A +S315080070180121284A12680270264A1268120A427022 +S31508007028244A1268120C8270224A1268120EC2701A +S31508007038214A12680271204A1268120A42711E4AC7 +S315080070481268120C82711C4A1268120EC27117480D +S31508007058006850F02000154A10600800C0B2704752 +S3150800706848A900084CA700081468004000680040B2 +S31508007078046800401C680040006600401C66004022 +S315080070880C660040B0660040B466004004660040DE +S31508007098146600400868004080690040000020FC2B +S315080070A884690040886900408C6900400C68004083 +S315080070B8B0690040B8690040BC69004000B585B0B1 +S315080070C84FF4614000900020ADF804000020ADF8A8 +S315080070D806000020ADF808000020ADF80C000C20CA +S315080070E8ADF80A0000A94A4800F070FD0121484891 +S315080070F800F0CEFD05B000BD70B504000D00EDB278 +S31508007108412D03DB77214348FFF794F92800C0B2DD +S3150800711800F065F8C0B2012803D07B213D48FFF787 +S3150800712889F900260DE0FFF75BFEB6B2305D00F080 +S3150800713856F8C0B2012803D084213648FFF77AF9F1 +S31508007148761C2800C0B2B6B280B28642EBD370BDB0 +S3150800715810B5040030480078002810D12F4800F0F0 +S315080071682EF8012809D12D480078002805D02A4884 +S31508007178012101702A4800210170002010BD284805 +S31508007188007826494018401C00F019F80128F4D15F +S3150800719823480078401C22490870214800781F496E +S315080071A809788842E9D11E48027892B21D4920001A +S315080071B8FFF7E0FD1848002101700120DEE710B549 +S315080071C804002021124800F079FD012805D110484D +S315080071D800F070FD2070012000E0002010BD10B5F9 +S315080071E8040080210A4800F069FD002801D1002022 +S315080071F80CE0E4B2210089B2054800F057FD802169 +S31508007208034800F05BFD0028F9D0012010BD0000F6 +S315080072180014014088A700081A2E0020182A002002 +S31508007228192E0020192A002080B500F007F94021F8 +S31508007238DFF8D80300F015F9DFF8D41308704021F1 +S31508007248DFF8D00300F00DF9DFF8CC130870DFF883 +S31508007258C0030078FF2804D0DFF8BC030078FF28AD +S3150800726804D17D21DFF8B403FFF7E4F8DFF8B003AB +S315080072780090DFF8B033DFF8B0230121DFF8AC035C +S3150800728800F02AFD01BD80B5DFF8A00300F0D5FFA0 +S31508007298002000F0DDF901BD70B504000D00EDB25F +S315080072A8402D04DB9F21DFF87403FFF7C3F8280095 +S315080072B8C0B200F062F8C0B2012804D0A321DFF8F2 +S315080072C85C03FFF7B7F800260EE0FFF789FDB6B2AC +S315080072D8305D00F052F8C0B2012804D0AC21DFF8BE +S315080072E83C03FFF7A7F8761C2800C0B2B6B280B2EE +S315080072F88642EAD370BD10B50400CC4800F0A8FF52 +S31508007308CB480078002810D1CA4800F02EF8012882 +S3150800731809D1C8480078002805D0C5480121017058 +S31508007328C54800210170002010BDC3480078C1492E +S315080073384018401C00F019F80128F4D1BE48007816 +S31508007348401CBD490870BC480078BA490978884283 +S31508007358E9D1B948027892B2B8492000FFF70AFD80 +S31508007368B348002101700120DEE780B50100AA486C +S31508007378007800F0E7F8C0B202BD80B50100C9B2CE +S31508007388A348007800F086F8C0B202BD38B5A04810 +S31508007398007800F02AF90400E4B2002C23D0E4B2FD +S315080073A8412C00DB4024002512E000A99848007803 +S315080073B800F0C8F8C0B2012804D040F2291197484D +S315080073C8FFF738F8EDB29E489DF8001029546D1C51 +S315080073D8EDB2E4B2A542E8D3E4B22300984A812183 +S315080073E8924800F0BBFE31BD38B50024C0B228214A +S315080073F88E4A01FB0020D0F88C030400002510E013 +S3150800740801F0AFFAADB2295C8348007800F042F87B +S31508007418C0B2012804D04FF4A4718048FFF70AF8CF +S315080074286D1CADB2A4B2A542EAD301F09AFA0200DD +S31508007438402301217D4800F06EFE31BD8149824A0C +S31508007448002004E088744A6118311832401CC0B21A +S315080074580028F7D08874002048617C48794901607B +S31508007468704710B4794A1268002A01D1FF200FE044 +S31508007478764A12685369754C236011749060D06017 +S31508007488002353741060C9B20818401E5060907CD7 +S3150800749810BC704738B504000D00E4B2022C04DBB2 +S315080074A840F29F115D48FEF7C5FFE4B2182065490A +S315080074B800FB0410407CE4B21821624A01FB04214F +S315080074C8097C884201D100203BE0E4B218205D49D6 +S315080074D800FB0410C0680570E4B21820594900FB7F +S315080074E80410407C401CE4B21821564A01FB0421CA +S315080074F84874E4B21820534900FB0410C068401CBD +S31508007508E4B218214F4A01FB0421C860E4B21820E6 +S315080075184C4900FB04104068E4B21821494A01FBAB +S315080075280421C96888420BD2E4B21820454900FBF1 +S315080075380410E4B21821434A01FB04210968C16012 +S31508007548012032BD38B504000D00E4B2022C04DB74 +S3150800755840F2C1113148FEF76DFFE4B218203949E7 +S3150800756800FB0410407C002801D100203CE0E4B26E +S315080075781820344900FB0410806800782870E4B2A3 +S315080075881820304900FB0410407C401EE4B218213C +S315080075982C4A01FB04214874E4B21820294900FB47 +S315080075A804108068401CE4B21821264A01FB04210D +S315080075B88860E4B21820234900FB04104068E4B246 +S315080075C81821204A01FB0421896888420BD2E4B2B3 +S315080075D818201C4900FB0410E4B21821194A01FBBB +S315080075E8042109688160012032BD10B50400E4B29F +S315080075F8022C04DB40F2E1110848FEF71BFFE4B24F +S315080076081820104900FB0410407C10BD5D2A002094 +S315080076185C2A0020A12A0020A02A0020C4A7000866 +S31508007628940000200000002078000020A8130020FD +S31508007638232E0020642B0020222E0020652B0020F4 +S31508007648A42B0020242C00203C2C0020F02D002000 +S3150800765870477047704780B501213B48FCF701FA27 +S31508007668012801D1002000E0012002BD00B589B03B +S3150800767800A8202101F08EF900A93448FAF710FC71 +S31508007688002808D10098002805D09DF80800C006EB +S3150800769801D4012000E0002009B000BD2B4870473E +S315080076A880B52B48002180F824120A22294928483F +S315080076B8F9F7EAFF002803D12548012180F82412A2 +S315080076C801BD80B5224890F82402012802D1204835 +S315080076D8FAF7FDFA4021204800F0F0FA0028F9D018 +S315080076E81A48FAF707FC01BD80B5194890F824022C +S315080076F8012802D11648FAF7EAFA01BD10B50400BE +S31508007708134890F82402012819D111492000FAF7DC +S31508007718A2FC002813D50E48002180F824120C482C +S31508007728FAF7D5FA0BE0217889B20B4800F0BEFAC9 +S315080077388021094800F0C2FA0028F9D0641C20788C +S315080077480028F0D110BD00000000024020AA000859 +S31508007758F41D002048AB00080014014080B501F06C +S315080077681CF902BD30380A2801D2012000E00020A1 +S31508007778C0B27047DFF8DC035FF0FF310160DFF85D +S31508007788D8035FF0FF310160704770B504000D003B +S315080077981600200000F0B3F9FF2805D02819401E66 +S315080077A800F0ADF9FF2801D1002017E0600A4FF470 +S315080077B800714843DFF8A4130968884207D12B00EB +S315080077C832002100DFF8900300F0DFF806E02B000E +S315080077D832002100DFF87C0300F0D7F870BD70B5D9 +S315080077E804000D00200000F08AF906002819401E3A +S315080077F800F085F9F6B2FF2E02D0C0B2FF2801D1F3 +S31508007808002005E00100C9B23000C0B200F03BF91B +S3150800781870BD80B500200090DFF83C03006810F1C1 +S31508007828010F01D1012030E00098CB4949680818B2 +S3150800783800900098C8498968081800900098C649B1 +S31508007848C968081800900098C3490969081800907B +S315080078580098C1494969081800900098BE4989697D +S31508007868081800900098BC49C9690818009000983B +S31508007878C04300900098401C009000AA0421B7480D +S31508007888006810F5C470FFF780FF02BD0020B349F1 +S31508007898096809680818B149096849680818AF499C +S315080078A8096889680818AD490968C9680818AB4994 +S315080078B8096809690818A949096849690818A7498A +S315080078C8096889690818A549096811F5C471096814 +S315080078D80818002801D1012000E00020704780B56B +S315080078E89D48006810F1010F06D09B4800F090F8F3 +S315080078F8002801D100200CE09648006810F1010F15 +S3150800790806D0944800F084F8002801D1002000E049 +S31508007918012002BD91480068704780B54FF400728F +S31508007928B1FBF2F303FB1213002B01D000200BE086 +S3150800793802688A4201D1012006E001604FF400720C +S31508007948001DFFF717FA012002BD38B504000D001F +S315080079588148844208D17F4C29002000FFF7DDFFC3 +S31508007968002810D100200FE07C480068854203D122 +S31508007978794C7A480568EFE7200000F049F80028AE +S31508007988EAD1002000E0200032BD2DE9F0410400CC +S315080079980F0015001E00780A4FF4007101FB00F865 +S315080079A8206810F1010F07D141462000FFF7B5FFFF +S315080079B8002801D1002029E02068404508D0414622 +S315080079C82000FFF7C2FF0400002C01D100201DE0AB +S315080079D82068381A0019071DFFF702FA201D381AF9 +S315080079E8B0F5007F0AD318F500712000FFF7ADFF40 +S315080079F80400002C01D1002008E0271D28783870DB +S31508007A087F1C6D1C761E002EE6D10120BDE8F0818C +S31508007A182DE9F04104000125206800F070F8C0B28D +S31508007A28FF2801D100202CE000F0C2FFF32001F066 +S31508007A3859F801F05AF8012803D100F0C9FF0020C7 +S31508007A481FE05FF0000801E018F10108B8F1800F9F +S31508007A5813D2206810EB880614EB88004768FFF7EE +S31508007A68BFF93900300001F014F8082801D00025BC +S31508007A7803E03068B842E7D0002500F0A9FF2800DF +S31508007A88C0B2BDE8F08138B504000D00EDB2E4B225 +S31508007A98A54201D2002031E03048007AE4B2844297 +S31508007AA805D32E4890F86800EDB2A84201D2002006 +S31508007AB824E000F07DFFF32001F014F801F015F832 +S31508007AC8012803D100F084FF002017E000E0641CB9 +S31508007AD8EDB2E4B2A5420ED3FFF782F90221E4B269 +S31508007AE81F4830F8140000F07CFF0828EFD000F093 +S31508007AF86FFF002002E000F06BFF012032BD38B5A9 +S31508007B080400002500E06D1CEDB2092D1FD2FFF711 +S31508007B1867F9EDB20C20114900FB0510006884428C +S31508007B28F1D3EDB20C200D4900FB05100068EDB243 +S31508007B380C210A4A01FB0521496808188442E2D241 +S31508007B48EDB20C20054900FB0510007A00E0FF207D +S31508007B5832BD00001C200020202200203CA6000878 +S31508007B689CA8000862F30F2262F31F42401810F01F +S31508007B78030308D0C91A1FD3DB0748BF00F8012D2D +S31508007B8828BF20F8022D130030B4144615461039BC +S31508007B9828BF20E93C00FAD8490728BF20E90C0085 +S31508007BA848BF40F8042D890028BF20F8022D48BF91 +S31508007BB800F8012D30BC7047C91818BF00F8012D08 +S31508007BC8CB0728BF00F8012D704700007FB50400D1 +S31508007BD80D000020002100220023AE89002E208AED +S31508007BE830F44050E98808432082A089274908408C +S31508007BF8A9882A8911436A8911430843A081A08A5A +S31508007C0830F44070A9890843A08200A8FBF76EFFE4 +S31508007C181C48844202D01C48844201D1039900E0DA +S31508007C280299A089000407D5192000FB01F02968E4 +S31508007C384900B0FBF1F206E0192000FB01F02968BB +S31508007C488900B0FBF1F26420B2FBF0F000010109EB +S31508007C58642303FB1123A189090408D5D900323105 +S31508007C686422B1FBF2F111F00701084307E0190194 +S31508007C7832316422B1FBF2F111F00F010843208179 +S31508007C887FBD00000010014000140140F3E9FFFF22 +S31508007C98C9B2002904D0818951F40051818104E0D0 +S31508007CA881894DF6FF72114081817047C905C90D52 +S31508007CB8818070478088C005C00D7047002289B248 +S31508007CC8B1F5007F0088084201D0012200E00022B1 +S31508007CD81000C0B2704700002DE9F04104000D00FD +S31508007CE816001F00DDF81880200000F039FF200074 +S31508007CF800F014F8C4F8E475C4F8E885C4F8EC6527 +S31508007D082900C9B2200000F06EF9D4F8E805006821 +S31508007D188047200000F080FFBDE8F081002070470A +S31508007D281CB5040000A9200001F04CFA9DF80000D3 +S31508007D3810F01F00C0B2002803D002280BD005D3C4 +S31508007D480EE000A9200000F07BFF10E000A9200043 +S31508007D5800F0A2FF0BE000A9200000F0C4FF06E02F +S31508007D689DF8000010F08001200000F016FA0020A7 +S31508007D7816BD10B50400C9B2002933D114F55D70D3 +S31508007D8894F8111103293CD18168C269914217D226 +S31508007D98C1698268891AC161E178012903D18168B4 +S31508007DA8C2688918C160C1698268914201D2C269EC +S31508007DB800E0826892B2C168200001F07FFA20E0EC +S31508007DC8D4F8E4050069002808D094F812010328B5 +S31508007DD804D12000D4F8E41509698847200001F081 +S31508007DE878FA0EE0D4F8E4058069002809D094F8F2 +S31508007DF81201032805D1C9B22000D4F8E4259269EE +S31508007E089047002010BD38B50400C9B200294FD1E3 +S31508007E1814F58E7594F8110102283ED1A868E96907 +S31508007E28884211D2E869A968401AE861E078012809 +S31508007E3803D1A868E9684018E860EA6992B2E9686F +S31508007E48200001F030FA28E0286AA968B0FBF1F2A8 +S31508007E5801FB120000280FD1286AA96888420BD3AB +S31508007E68286A696A884207D200220021200001F0A0 +S31508007E781AFA0020686210E0D4F8E405C0680028F9 +S31508007E8808D094F81201032804D12000D4F8E41580 +S31508007E98C9688847200001F02EFA94F816010128C7 +S31508007EA815D1200000F015F8002084F816010EE018 +S31508007EB8D4F8E4054069002809D094F81201032883 +S31508007EC805D1C9B22000D4F8E425526990470020A4 +S31508007ED832BD006902490968416000207047000000 +S31508007EE8F82D002010B504000023402200212000A8 +S31508007EF800F0C4F8002340228021200000F0BEF8D4 +S31508007F08012084F81201A078D4F8E815496888474A +S31508007F18002010BD10B50400D4F8E80500698047AC +S31508007F2894F8130184F81201032084F8120100203A +S31508007F3810BD80B590F8121180F81311042180F845 +S31508007F481211D0F8E805C0688047002002BD80B540 +S31508007F58D0F8E415C969002903D0D0F8E415C96929 +S31508007F688847002002BD10B50400C9B22000D4F81D +S31508007F78E42512689047D4F8E80580688047002009 +S31508007F8810BD80B5C9B2D0F8E425526890470020DC +S31508007F9802BD80B5D0F8E415096A8847002002BDF5 +S31508007FA880B5D0F8E415496A8847002002BD10B59F +S31508007FB80400D4F8E80540698047012084F81501CB +S31508007FC8002010BD10B50400D4F8E805806980477C +S31508007FD800212000D4F8E42552689047002084F848 +S31508007FE81501002010BD10B50400C9B2200001F023 +S31508007FF809FA012084F81201002084F814010020E7 +S3150800800811E0282101FB004111F58E7101224A7001 +S315080080180870C8800022CA7040228A600022CA6096 +S3150800802800224A61401C61788842EAD3002011E0A0 +S31508008038282101FB004111F55D7100224A7008707C +S31508008048C8800022CA7040228A600022CA600022BC +S315080080584A61401C61788842EAD3200001F0A4FAF4 +S31508008068200001F03CFA0021200001F0F1FA200076 +S3150800807801F029FB200001F08BFA10BD38B5C9B20A +S315080080880C0608D5C9B211F07F04282505FB040497 +S3150800809814F58E7407E0C9B211F07F04282505FB8C +S315080080A8040414F55D7411F07F052570C1F3C01139 +S315080080B8617092B2A260E3706178002901D02178D4 +S315080080C8E180DBB2022B01D100212171210001F0E8 +S315080080D821FC002032BD80B5C9B20A0608D5C9B246 +S315080080E811F07F02282303FB020212F58E7207E0BD +S315080080F8C9B211F07F02282303FB020212F55D724A +S3150800810811F07F031370C1F3C0115170110001F00B +S315080081183AFC002002BD38B5C9B211F07F042825FB +S3150800812805FB040414F55D74E2609BB263610023E1 +S31508008138A3610023637011F07F012170C1780129BA +S3150800814800D122612178002903D1210001F0F9FC28 +S3150800815802E0210001F042FC002032BD38B5C9B260 +S3150800816811F07F04282505FB040414F58E740125EF +S31508008178657011F07F012170E26022610021A1611A +S3150800818863612178002903D1210001F0DAFC02E0B5 +S31508008198210001F023FC002032BD80B5C9B20A06C9 +S315080081A808D5C9B211F07F02282303FB020212F58B +S315080081B88E7205E0C9B2282202FB010212F55D7229 +S315080081C80123937011F07F031370C1F3C011C9B26C +S315080081D811F001015170110001F046FD002002BDA1 +S315080081E880B5C9B20A0608D5C9B211F07F02282394 +S315080081F803FB020212F58E7205E0C9B2282202FBB9 +S31508008208010212F55D720023937011F07F03137053 +S31508008218C1F3C011C9B211F001015170110001F082 +S3150800822843FD002002BD0022C9B261F30A120169A2 +S315080082380968114300690160704780B50169496892 +S3150800824851F0020100694160032000F0F2FC01BD0B +S3150800825870B504000026200001F01AFA00286FD02D +S31508008268200001F01FFA0500002D01D1002068E062 +S31508008278C5F3C040002803D0200000F060F9064383 +S31508008288C5F38040002803D0200000F0E1F8064333 +S31508008298C5F34000002804D0002050F00200E16829 +S315080082A84861E80F002803D0200000F06CF8064360 +S315080082B8C5F3C020002803D0200000F088F806433C +S315080082C8C5F3C000002803D0200000F09AF9064339 +S315080082D8C5F30010002803D0200000F0A0F90643D3 +S315080082E8C5F30030002803D0200000F028FA06431A +S315080082F8C5F34030002803D0200000F07DFA064375 +S31508008308C5F30050002803D0200000F09AFA064367 +S31508008318C5F34050002803D0200000F0A0FA064311 +S31508008328C5F38070002803D0200000F00BF8064338 +S31508008338C5F38000002803D0200000F012F8064391 +S31508008348300070BD10B504002000DFF83015096844 +S31508008358496A8847002050F08040E1684861012052 +S3150800836810BD38B50400E0684568C5F380000028E4 +S3150800837805D02000DFF804150968896A8847E06887 +S315080083884560012032BD10B50400A07A002808D03F +S31508008398D4F80C0130F0020040084000D4F80C115B +S315080083A80860002050F001002169496831EA000098 +S315080083B8216948602000DFF8C41409688969884774 +S315080083C8002050F00040E1684861012010BD10B552 +S315080083D882B0040000208DF8000094F812018DF888 +S315080083E800002000DFF8941409684969884720695D +S315080083F88168002050F40060E2685061A07A00287D +S3150800840824D0C80722D594F8150101281ED19DF84D +S31508008418000003281AD1002050F00100D4F80C11E6 +S3150800842809680143D4F80C21116050F00200D4F809 +S315080084380C1109680843D4F80C110860DFF84004E1 +S31508008448006850F00600DFF838140860012016BDE9 +S31508008458F8B5040000250027200001F055FC0600A1 +S3150800846869E0F00765D52900C9B2200000F00AFAC4 +S315080084780700F80722D50120A8402169496B31EA87 +S31508008488000021694863002757F0010714EB8500A7 +S31508008498806987602900C9B22000DFF8E0231268DE +S315080084A852689047E078012808D1002D06D194F83B +S315080084B81101042802D1200001F02DFCC7F3C000E1 +S315080084C8002806D0002757F0080714EB85008069AE +S315080084D88760C7F30010002806D0002757F0100752 +S315080084E814EB850080698760C7F38010002806D0DA +S315080084F8002757F0400714EB850080698760C7F3A3 +S315080085084000002806D0002757F0020714EB85001C +S3150800851880698760C7F3C01000280AD029002000A0 +S3150800852800F0C9F8002757F0800714EB8500806922 +S3150800853887606D1C7608002E93D10120F2BDF8B528 +S31508008548040000250027200001F0CDFB060054E0B2 +S31508008558F00750D52900C9B2200001F0CBFB070067 +S31508008568F8072DD5002757F0010714EB8500406D4D +S315080085788760E078012810D114EB8500406D006902 +S31508008588282101FB0541D1F87C134003400B081A42 +S31508008598282101FB0541C1F88C032900C9B220002E +S315080085A8B64A126812689047E078012808D1002D63 +S315080085B806D194F81101052802D1200001F0ABFB79 +S315080085C8C7F34000002806D0002757F0020714EB27 +S315080085D88500406D8760C7F3C00000280BD02000CF +S315080085E8A649096889688847002757F0080714EBD9 +S315080085F88500406D87606D1C7608002EA8D101207D +S31508008608F2BD10B5040020009C490968C968884766 +S31508008618002050F00800E1684861012010BDF8B54F +S315080086280400002555F01005E0688069A843E1684C +S315080086388861E068066A16F00F00282101FB0040E9 +S3150800864810F55D77700C10F00F00012808D0022885 +S3150800865807D003281AD0042819D0062818D023E0EA +S3150800866822E03009400510D0C6F30A1292B2F9681A +S31508008678200000F0B2FEC6F30A10F9684018F86040 +S31508008688B869C6F30A110818B8610DE00CE00BE0E2 +S31508008698082204F2CC51200000F09FFEB869C6F300 +S315080086A80A110818B861FFE7E06880692843E16895 +S315080086B888610120F2BD2DE9F04104000D0000266D +S315080086C80020282101FB054111F58E777969BA69D9 +S315080086D8891A0E00B968B14200D2BE68F01C5FEA72 +S315080086E8900814EB8500806980691BE07869B96988 +S315080086F8461AB868B04200D2BE68F01C5FEA90080D +S3150800870833009BB22A00D2B2F968200000F045FE71 +S31508008718F8683018F860B8693018B86114EB85003D +S315080087288069806980B2804506D2B86979698842C5 +S3150800873802D278690028D9D10120BDE8F0812DE94F +S31508008748F843040000200025002600275FF00008EB +S315080087585FF0000950F001002169496831EA000014 +S31508008768216948600021200000F02BFF00200AE05C +S3150800877814EB80018969FF228A6014EB8001496D30 +S31508008788FF228A60401C61788842F1D320695FF02D +S31508008798FF318161012060F30F05012060F31F4551 +S315080087A82069C56156F0080656F0010656F0020615 +S315080087B82069466157F0010757F0080757F002077E +S315080087C8206907612069D0F8008038F4FE682069B6 +S315080087D8C0F80080200001F09EFA5FF0000959F4FD +S315080087E88059E068C0F81490200024490968096986 +S315080087F888470120BDE8F28338B50400200001F057 +S3150800880864F8E068C568200001F049F8032808D12B +S315080088180020A0704FF40070A080092060F38D2511 +S3150800882806E00120A0704020A080052060F38D2571 +S31508008838E068C560002050F40050E16848610120EE +S3150800884832BD38B50400002520000C490968C969F5 +S31508008858884755F48015E0684561012032BD38B56A +S3150800886804000025200005490968096A884755F45F +S315080088780015E0684561012032BD0000D8000020D7 +S3150800888810ED00E00269126903695B6BCB4013F0CF +S31508008898010352EAC312C9B210EB810080698068E5 +S315080088A81040704710B50400022340228121200099 +S315080088B8FFF7E4FB0223402201212000FFF7DEFB35 +S315080088C840232F4A01212000FFF725FC002010BD70 +S315080088D810B5040081212000FFF7FDFB01212000C7 +S315080088E8FFF7F9FB002010BD10B51722254B0C78A9 +S315080088F814F0600F27D14C78062C04D00A2C14D013 +S315080089080B2C17D01FE04C88A4B2240AA4B2212C39 +S3150800891806D11D4BCA88182A01DB172200E0CA8827 +S3150800892892B2190000F0ABFC0DE00122174900F0DD +S31508008938A6FC08E08A78002A03D1887813490860D3 +S3150800894801E000F061FC002010BD80B5FEF71EFDB1 +S31508008958002002BD80B50800C0B2FEF745FD00201C +S3150800896802BD0748704780B590F81201032801D15F +S31508008978FEF70CFD002002BD202008800448704739 +S31508008988E42B0020610000206A000020F42D002056 +S3150800899858000020002201F0E7B910B504002000AD +S315080089A801F0FBF9002801D0203CFFE7200010BDA4 +S315080089B8DFF870010068002809D5DFF86C01DFF8D0 +S315080089C86C110160DFF86001DFF864110160704717 +S315080089D8DFF85001006850F00040DFF848110860D9 +S315080089E8704738B5040000250820C9B2002901D106 +S315080089F800250DE0C9B2012902D14FF4807507E0B8 +S31508008A08C9B2022902D14FF4007501E04FF4407546 +S31508008A1800F092F8C0B2082839D1DFF808010068D2 +S31508008A2830F44070DFF8FC100860DFF8F8000068DA +S31508008A382843DFF8F0100860DFF8E800006830F02F +S31508008A48F800DFF8E0100860DFF8D800006854F08E +S31508008A5802010843DFF8CC100860DFF8C800006890 +S31508008A6850F48030DFF8BC10086000F065F8DFF8CD +S31508008A78B410096831F00201DFF8A8201160DFF8A0 +S31508008A88A410096831F0F801DFF898201160C0B21F +S31508008A9832BD70B504000D00082600F04DF8060032 +S31508008AA8F6B2082E1BD11F48006830F440701D49DD +S31508008AB808601C48006850F400701A49086019488C +S31508008AC8006850F0010017490860256000F034F87E +S31508008AD8060014480068400840001249086030003B +S31508008AE8C0B270BD13490860704708201149096863 +S31508008AF8C90301D5012013E00E480068C00601D550 +S31508008B0805200DE00B48006810F0EF0F01D006208D +S31508008B1806E008480068800701D5072000E0082015 +S31508008B28C0B27047103C0240043C02402301674526 +S31508008B38AB89EFCD0C3C024080B508208DF80000C3 +S31508008B48FFF7D3FF8DF8000003E0FFF7CEFF8DF897 +S31508008B5800009DF800000128F7D09DF8000002BD26 +S31508008B6800B583B001210120FBF732F84FF4C8504D +S31508008B78009003208DF8050002208DF804000020D7 +S31508008B888DF8060000208DF8070000A92148FAF795 +S31508008B9815FF0A2208211F48FAF76EFF0A220B2139 +S31508008BA81C48FAF769FF0A220C211A48FAF764FFE3 +S31508008BB84FF40070009003208DF8050000208DF80A +S31508008BC8040001208DF8060000208DF8070000A98A +S31508008BD81048FAF7F3FE4FF48060009001208DF8EC +S31508008BE8060001208DF8070003208DF8050000A966 +S31508008BF80848FAF7E3FE0A220A210648FAF73CFF6C +S31508008C0801214FF48040FBF713F801218020FAF779 +S31508008C18EFFF07BD00000240704700000100481E2C +S31508008C28002905D000211C29F8D200BF491CFAE7FB +S31508008C38704780B54FF47A714843FFF7EFFF01BDD7 +S31508008C4810B500244A78002A18D0012A1CD0032A0D +S31508008C5817D0052A09D0062A04D0082A0BD0092ACB +S31508008C6806D014E000F0F3F813E000F080F910E0FD +S31508008C7800F0A9F90DE000F006FA0AE000F01FFA7C +S31508008C8807E000F037FA04E000F082FA01E000F0A5 +S31508008C98BBFA2000C0B210BD70B504000D0000264E +S31508008CA894F81201032817D1287902280FDA29001F +S31508008CB82000D4F8E42592689047E88800280AD165 +S31508008CC8F6B2002E07D1200000F003FB03E02900C6 +S31508008CD8200000F099FA03E02900200000F094FA31 +S31508008CE83000C0B270BD70B505000E000024B1880A +S31508008CF87078002860D0012830D0032840F0A48076 +S31508008D0895F81201022802D003280BD021E0C9B22F +S31508008D18002906D0C9B2802903D0C9B22800FFF7AE +S31508008D283CFA1AE07088002809D1C9B2002906D089 +S31508008D38C9B2802903D0C9B22800FFF72EFA310034 +S31508008D482800D5F8E42592689047280000F0C1FA6B +S31508008D5803E03100280000F057FA75E095F812018B +S31508008D68022802D003280BD021E0C9B2002906D070 +S31508008D78C9B2802903D0C9B22800FFF70EFA1AE04B +S31508008D887088002812D1C9B200290CD0C9B2802926 +S31508008D9809D0C9B22800FFF723FA31002800D5F808 +S31508008DA8E42592689047280000F093FA03E031001A +S31508008DB8280000F029FA47E095F81201022802D09F +S31508008DC803280BD03BE0C9B2002906D0C9B28029CE +S31508008DD803D0C9B22800FFF7E0F934E0C9B208069B +S31508008DE813D5C9B211F07F00282101FB005090F86D +S31508008DF81E01002804D0DFF884030121016017E06A +S31508008E08DFF878030021016012E0080610D4C9B219 +S31508008E18282000FB015090F87603002804D0DFF8D4 +S31508008E285C030121016003E0DFF8500300210160BB +S31508008E380222DFF84813280000F021FA03E031007F +S31508008E48280000F0E1F9FFE72000C0B270BD38B588 +S31508008E5804000D00688880B2000AC0B2012808D04C +S31508008E68022825D003282ED0062867D007286AD0D6 +S31508008E786EE000A9A078D4F8EC2512689047E9882E +S31508008E88402903D094F81211012902D10821ADF816 +S31508008E980010BDF80010002968D0E988002965D0B7 +S31508008EA8BDF80010EA88914257D2BDF8001055E07F +S31508008EB800A9A078D4F8E425926A9047022141705F +S31508008EC8C4F8F005E5E7A878002808D0022814D0E1 +S31508008ED80CD304281FD017D3052823D029E000A9C6 +S31508008EE8A078D4F8EC2552689047D2E700A9A0786C +S31508008EF8D4F8EC2592689047F7E700A9A078D4F843 +S31508008F08EC25D2689047F0E700A9A078D4F8EC25B4 +S31508008F1812699047E9E700A9A078D4F8EC255269C0 +S31508008F289047E2E700A9A078D4F8EC25926990471B +S31508008F38DBE72900200000F067F917E02900200080 +S31508008F4800F062F912E02900200000F05DF90DE052 +S31508008F582900200000F058F908E0E988ADF8001063 +S31508008F68BDF800200100200000F089F931BD38B5A8 +S31508008F7804008888002822D1C88800281FD1887844 +S31508008F8810F07F0594F81201032803D1200000F099 +S31508008F983BF917E084F814512900C9B22000FFF7F5 +S31508008FA842F9200000F095F9EDB2002D03D0022011 +S31508008FB884F8120106E0012084F8120102E0200074 +S31508008FC800F022F931BD10B5040048886C4A1070C3 +S31508008FD86B480078022803DB200000F015F951E0F9 +S31508008FE894F81201022802D0032818D047E06448EA +S31508008FF8007800280FD06248007884F8100103200A +S3150800900884F812015E4801782000FEF7ACFF2000BC +S3150800901800F05FF902E0200000F05BF932E05848FA +S31508009028007800280FD1022084F8120154480078E5 +S3150800903884F81001524801782000FEF7A2FF2000A4 +S3150800904800F047F91AE04E48007894F8101188425B +S3150800905811D094F810112000FEF793FF48480078BD +S3150800906884F81001464801782000FEF77CFF2000A6 +S3150800907800F02FF902E0200000F02BF902E02000AA +S3150800908800F0C2F810BD80B5CA88012A02D000F0DF +S31508009098BBF813E090F81221022A02D0032A05D059 +S315080090A80AE00122374900F0EAF807E0012210F53C +S315080090B8887100F0E4F801E000F0A6F801BD80B573 +S315080090C890F81221921E012A11D82F4901220A6006 +S315080090D8D0F81811002905D02B49096851F0020162 +S315080090E8294A11600222284900F0C9F801E000F06F +S315080090F88BF801BD10B504000022488801280BD159 +S315080091080120C4F818012000D4F8E425926890478D +S31508009118200000F0DEF830E0488802282DD10879CA +S3150800912800062AD120694068898889B20A0AD2B213 +S31508009138012A07D019D3032A0CD007D3052A11D038 +S315080091480CD312E0012161F306100EE0022161F347 +S3150800915806100AE0032161F3061006E0042161F30C +S31508009168061002E0052161F3061008490860012087 +S3150800917884F81601200000F0ACF810BDFC2D00207C +S31508009188242E0020002E0020042E0020F82D002072 +S3150800919810B5040094F81201801E01280ED84888D4 +S315080091A801280AD10020C4F818012000D4F8E425BB +S315080091B892689047200000F08CF802E0200000F042 +S315080091C823F810BD90F8CC250A7090F8CD254A707A +S315080091D890F8CE2590F8CF351B029A184A8090F851 +S315080091E8D02590F8D1351B029A188A8090F8D2258E +S315080091F890F8D3351B029A18CA80C988C0F8401156 +S31508009208012180F81111704710B50400802120004B +S31508009218FEF7C3FF00212000FEF7BFFF200000F07D +S315080092287AFD10BDF8B504000D0017000026002CBD +S315080092381AD0200000F019F84000801C3880F6B2D1 +S3150800924838887055761CF6B203207055761C08E0E7 +S31508009258F6B220787055641C761CF6B20020705554 +S31508009268761C20780028F3D1F1BD002101E0491CBD +S31508009278401C0278002AFAD10800C0B2704710B517 +S31508009288002492B2C0F83C2192B2C0F838210223D1 +S3150800929880F8113192B213000A000021FEF75EFF2A +S315080092A82000C0B210BD10B5002492B213000A00FF +S315080092B80021FEF753FF2000C0B210BD10B50024E8 +S315080092C813009BB20A000021FEF725FF2000C0B252 +S315080092D810BD38B504000025042084F811010023C0 +S315080092E8002200212000FEF739FF200000F013FDB8 +S315080092F82800C0B232BD38B504000025052084F818 +S3150800930811010023002200212000FEF704FF200097 +S3150800931800F001FD2800C0B232BD00000021C26875 +S315080093285FF0FF335360C2687FF08043536151F0A2 +S31508009338004151F40061C0688161704770B582B018 +S31508009348040000250026002000900320FFF766FC8D +S31508009358E06800690090761CBB48864201D3002065 +S315080093681AE00098C00F0028EFD00026009850F0A1 +S3150800937801000090E06800990161E06800690090C2 +S31508009388761CB148864202D20098C007F5D4032055 +S31508009398FFF744FC2800C0B276BDF0B41C000023D1 +S315080093A8C578002D15D100250026A4B2E41C04278B +S315080093B894FBF7F42500D2B210EB8200D0F8D0005F +S315080093C80022160003E00A680260761C091DAE42F0 +S315080093D8F9D31800C0B2F0BC704710B4002392B293 +S315080093E8D21C042492FBF4F2D0F8D00000242300FF +S315080093F803E004680C605B1C091D9342F9D3080056 +S3150800940810BC704730B40A00002300210024C47039 +S315080094180124847040248480D2B2012A0DD15FF0D9 +S31508009428A0430122C27208220270042242704FF435 +S31508009438A072C280022202720CE0D2B2002A09D1B6 +S31508009448824B0022C2720C220270062242704FF426 +S31508009458A062C280C36013F50062026100220EE0B2 +S3150800946810EB820413EB421515F51065A56110EB90 +S31508009478820413EB421515F530656565521C447868 +S31508009488A242EDD313F58062426113F58862C0F8EB +S31508009498CC20002208E010EB820413EB421515F5E0 +S315080094A8A065C4F89050521C0478A242F3D300224F +S315080094B80AE010EB82044FF4805505FB023515F5D2 +S315080094C88055C4F8D050521C0478A242F1D313F53B +S315080094D86062C0F80C210800C0B230BC704770B58D +S315080094E804000025002000210026227A012A26D118 +S315080094F8E068816B31F48031607A002801D051F434 +S315080095088011E06881630020E168C968080030F0C6 +S31508009518400030F4800030F4003030F40020E16870 +S31508009528C8602000FFF70AFFE078012821D1052046 +S3150800953860F3440656F02006E068866019E0E0689D +S31508009548C06850F04000E168C8602000FFF7F6FEE2 +S31508009558002151F4803151F4802151F40021607AB8 +S31508009568002801D051F48011E06881631420FFF7C0 +S3150800957860FBE078012808D1E0688668052060F372 +S31508009588440656F02006E06886602800C0B270BD1A +S315080095980021002252F00102C3689B681A43C0687A +S315080095A882600800C0B270470021002252F001020A +S315080095B8C3689B6833EA0202C06882600800C0B2C2 +S315080095C8704710B582B00024002200230093009B40 +S315080095D853F020030093009B61F38A130093C16834 +S315080095E8009B0B61C16809690091521C16498A4299 +S315080095F804D20099C1F340110029F3D10320FFF7DB +S315080096080DFB2000C0B216BD10B582B0002400219B +S3150800961800220092009A52F010020092C268009B3B +S315080096281361C26812690092491C074A914204D21A +S31508009638009AC2F30012002AF3D10320FFF7EEFAC4 +S315080096482000C0B216BD0000410D0300000004400A +S3150800965810B50024C268D26832F0005232F080424F +S31508009668C9B2012902D152F0005204E0C9B2002950 +S3150800967801D152F08042C068C2603220FFF7D9FA99 +S315080096882000C0B210BDC068406910F001007047DC +S3150800969880B5FFF7F8FF012801D0012000E0002077 +S315080096A8C0B202BD0021C26852691100C06880694B +S315080096B801400800704702691268C9B261F30102DD +S315080096C8006902607047F8B50400002500200022EA +S315080096D8002600270021D4F80C315FF0000CC3F8E7 +S315080096E800C023691B681A0032F4C05223691A603D +S315080096F8E27A012A2AD103212000FFF7DCFFE06875 +S3150800970880214162202060F31F46802060F30F06FF +S31508009718E068866216EB164060F30F07802060F350 +S315080097281F47E068C0F8047117EB1740C0EA070737 +S31508009738202060F31F47E068C0F8087117EB174048 +S31508009748C0EA0707BFB2E068C0F80C71102120000C +S31508009758FFF737FF2000FFF757FF2069002101614F +S3150800976820690021416120695FF0FF318161206924 +S315080097780021C16100210FE0002014EB81029269E3 +S31508009788106014EB810080690022026114EB8100E5 +S315080097988069FF228260491C607881420CD214EBEA +S315080097A8810080690068C00F0028E5D0002050F0C5 +S315080097B8804050F00060E0E700210FE0002014EB3D +S315080097C88102526D106014EB8100406D002202611F +S315080097D814EB8100406DFF228260491C6078814243 +S315080097E80CD214EB8100406D0068C00F0028E5D044 +S315080097F8002050F0804050F00060E0E7002151F466 +S315080098088071206900698843084321690861E078FE +S3150800981801280ED1002050F0010050F00200402126 +S3150800982861F38A0050F48030402161F35940216978 +S315080098380863200000F003F82800C0B2F2BD70B52E +S31508009848040000250026E06800218161E0687FF0B1 +S31508009858804141612000FFF761FDE078002801D1C9 +S3150800986856F0100656F4006656F4805656F4005616 +S3150800987856F4802656F4002656F0080656F480163E +S3150800988856F4001656F0804656F00406E0688069D5 +S31508009898B0433043E16888612800C0B270BD002132 +S315080098A800698068400810F00300002805D00228DF +S315080098B807D004D3032802D004E0032102E00221DA +S315080098C800E001210800C0B2704710B40021002446 +S315080098D80269926883691B68520812F00302002A13 +S315080098E804D0022A05D001D3032A05D1DB0ADB02F4 +S315080098F802E0032262F30A038269136054F480744F +S3150800990802695268A2432243006942600800C0B24D +S3150800991810BC704770B40A0000210025002354784B +S31508009928012C0AD1147810EB8404A469012592F94C +S315080099380060B54065F30F0309E0147810EB84045A +S31508009948646D012592F90060B54065F31F432568E3 +S31508009958C5F3C036002E0DD1966866F30A05D67883 +S3150800996866F39345D28862F3995555F0805555F4B0 +S31508009978004525600269D2691A430069C261080070 +S31508009988C0B270BC704770B40A00002100230024D6 +S315080099985578012D0BD1157810EB8505AD6901268B +S315080099A892F9002016FA02F262F30F040AE0157813 +S315080099B810EB85056D6D012692F9002016FA02F25C +S315080099C862F31F4433F400432B600269D269A24349 +S315080099D80069C2610800C0B270BC704770B500243F +S315080099E80025002200234E78012E62D10A7810EB52 +S315080099F88202926912680B7810EB83039B691B69CC +S31508009A084D69002D05D1DB0CDB04012565F3DC4324 +S31508009A1811E04D6965F312034D698E6875196D1E57 +S31508009A288E68B5FBF6F565F3DC43CD78012D02D1D2 +S31508009A38012565F35E730D7810EB8505AD692B6115 +S31508009A48C378012B06D10B7810EB83039B690D6944 +S31508009A585D610FE0CB78012B0CD04B69002B09D040 +S31508009A68012391F9005013FA05F503695B6B2B433B +S31508009A7805696B63CB78012B08D103699B68DB05FD +S31508009A8802D452F0005201E052F0805252F080623D +S31508009A9852F000420B7810EB83039B691A60CA7868 +S31508009AA8012A4BD14B699BB20A78C968FFF775FC3E +S31508009AB844E00A7810EB8202526D12680B7810EBB4 +S31508009AC883035B6D1B694D69002D06D18D6865F3A7 +S31508009AD81203012565F3DC430EE04D698E68751996 +S31508009AE86D1E8E68B5FBF6F565F3DC43C3F3C94509 +S31508009AF88E68754365F312030D7810EB85056D6D51 +S31508009B082B61C378012B05D10B7810EB83035B6DAA +S31508009B180D695D61CB78012B07D14B79002B02D0F3 +S31508009B2852F0005201E052F0805252F0806252F030 +S31508009B380042097810EB8100406D02602000C0B22F +S31508009B4870BDFCB4002200240023002500954D783A +S31508009B58012D48D185692B682E6900964E69002E15 +S31508009B6809D1009EF609F60100960126009F66F3BC +S31508009B78D447009715E08E684F69BE4207D28E68AB +S31508009B884E618E68009F66F30607009704E04E69E3 +S31508009B98009F66F3060700970126009F66F3D447D9 +S31508009BA80097009E2E61C678012E05D10E7810EB17 +S31508009BB88606B6690F69776153F0806353F00043E8 +S31508009BC82B60C378002B4BD14B69002B48D0012357 +S31508009BD891F9001013FA01F10C430169496B214305 +S31508009BE8006941633CE00B7810EB83035B6D1B68E7 +S31508009BF80C7810EB8404646D246900944C69002C75 +S31508009C080AD18C68009D64F3060500950124009D19 +S31508009C1864F3D44500950BE08C684C618C68009D0C +S31508009C2864F3060500950124009D64F3D445009560 +S31508009C380C7810EB8404646D009D2561C478012CAA +S31508009C4805D10C7810EB8404646D0D69656153F0D1 +S31508009C58806353F00043097810EB8100406D036078 +S31508009C681000C0B2F6BC704710B4002200234C7826 +S31508009C78012C0DD1097810EB810080690368D90F8A +S31508009C88002901D053F0804353F40013036007E01A +S31508009C98097810EB8100406D036853F400130360DC +S31508009CA81000C0B210BC704710B4002200234C78CC +S31508009CB8012C04D10B7810EB8300806903E00B783C +S31508009CC810EB8300406D036833F40013CC78032C3B +S31508009CD802D0C978022901D153F0805303601000D5 +S31508009CE8C0B210BC7047016989690069C06901403A +S31508009CF8080C7047C9B210EB8101496D896800697B +S31508009D084069014008007047016989690069C069A6 +S31508009D18014088B2704782B000210091009951F03D +S31508009D28404100910121009A61F3D442009218211A +S31508009D38009A61F306020092416D009A0A61C17899 +S31508009D4801290ED10021426D00F2CC535361426DB0 +S31508009D581268110051F000415FF080221100406D31 +S31508009D68016002B07047000000B500BF13009646B0 +S31508009D789446103928BFA0E80C50FAD85FEA417C07 +S31508009D8828BF0CC048BF40F8042BC90728BF20F8CD +S31508009D98022B48BF00F8012B00BD61381A2801D2EA +S31508009DA8012000E00020C0B2704700006100620090 +S31508009DB863006400650066006700680069006A0059 +S31508009DC86B006C006D006E006F0070007100720009 +S31508009DD873007400750076007700780079007A00B9 +S31508009DE8A100A200A300A500AC00AF00E000E100B6 +S31508009DF8E200E300E400E500E600E700E800E90021 +S31508009E08EA00EB00EC00ED00EE00EF00F000F100D0 +S31508009E18F200F300F400F500F600F800F900FA007D +S31508009E28FB00FC00FD00FE00FF000101030105011F +S31508009E38070109010B010D010F0111011301150194 +S31508009E48170119011B011D011F0121012301250104 +S31508009E58270129012B012D012F0131013301350174 +S31508009E6837013A013C013E014001420144014601DD +S31508009E7848014B014D014F01510153015501570145 +S31508009E8859015B015D015F016101630165016701B4 +S31508009E9869016B016D016F01710173017501770124 +S31508009EA87A017C017E019201B103B203B303B403BC +S31508009EB8B503B603B703B803B903BA03BB03BC03B0 +S31508009EC8BD03BE03BF03C003C103C303C403C5035D +S31508009ED8C603C703C803C903CA03300431043204D6 +S31508009EE833043404350436043704380439043A0488 +S31508009EF83B043C043D043E043F0440044104420438 +S31508009F0843044404450446044704480449044A04E7 +S31508009F184B044C044D044E044F0451045204530494 +S31508009F285404550456045704580459045A045B043F +S31508009F385C045E045F047021712172217321742107 +S31508009F48752176217721782179217A217B217C212F +S31508009F587D217E217F2141FF42FF43FF44FF45FFC4 +S31508009F6846FF47FF48FF49FF4AFF4BFF4CFF4DFF97 +S31508009F784EFF4FFF50FF51FF52FF53FF54FF55FF47 +S31508009F8856FF57FF58FF59FF5AFF00004100420085 +S31508009F9843004400450046004700480049004A0077 +S31508009FA84B004C004D004E004F0050005100520027 +S31508009FB853005400550056005700580059005A00D7 +S31508009FC82100E0FFE1FFE5FFE2FFE3FFC000C10073 +S31508009FD8C200C300C400C500C600C700C800C9003F +S31508009FE8CA00CB00CC00CD00CE00CF00D000D100EF +S31508009FF8D200D300D400D500D600D800D900DA009C +S3150800A008DB00DC00DD00DE00780100010201040146 +S3150800A018060108010A010C010E01100112011401BA +S3150800A028160118011A011C011E012001220124012A +S3150800A038260128012A012C012E013001320134019A +S3150800A048360139013B013D013F0141014301450103 +S3150800A05847014A014C014E0150015201540156016B +S3150800A06858015A015C015E016001620164016601DA +S3150800A07868016A016C016E0170017201740176014A +S3150800A08879017B017D01910191039203930394035E +S3150800A098950396039703980399039A039B039C03CE +S3150800A0A89D039E039F03A003A103A303A403A5037B +S3150800A0B8A603A703A803A903AA03100411041204F4 +S3150800A0C813041404150416041704180419041A04A6 +S3150800A0D81B041C041D041E041F0420042104220456 +S3150800A0E823042404250426042704280429042A0406 +S3150800A0F82B042C042D042E042F0401040204030443 +S3150800A1080404050406040704080409040A040B04DD +S3150800A1180C040E040F046021612162216321642165 +S3150800A128652166216721682169216A216B216C21CD +S3150800A1386D216E216F2121FF22FF23FF24FF25FFB2 +S3150800A14826FF27FF28FF29FF2AFF2BFF2CFF2DFFB5 +S3150800A1582EFF2FFF30FF31FF32FF33FF34FF35FF65 +S3150800A16836FF37FF38FF39FF3AFF000080B5454804 +S3150800A178006850F00100434908604348002101601F +S3150800A18840480068414908403E49086040484149F6 +S3150800A19801603C48006830F480203A4908603E4827 +S3150800A1A80021016000F005F83C485FF00061016095 +S3150800A1B801BD82B000200190002000903148006857 +S3150800A1C850F480302F4908602E48006810F4003093 +S3150800A1D800900198401C01900098002803D1019826 +S3150800A1E8B0F5A06FF0D127480068800302D5012092 +S3150800A1F8009001E000200090009801283ED12848E8 +S3150800A208006850F08050264908602648006850F4CF +S3150800A2184040244908601C481B49096801601A48D7 +S3150800A228006850F40040184908601748006850F458 +S3150800A238A0501549086016481B490160114800686E +S3150800A24850F080700F4908600E4800688001FBD5F9 +S3150800A258164840F2056101600B48006880088000CE +S3150800A268094908600848006850F00200064908606D +S3150800A2780548006810F00C000828F9D102B07047A4 +S3150800A288000000000038024008380240FFFFF6FECA +S3150800A29804380240103000240C38024008ED00E06B +S3150800A2A840380240007000400C544007003C024009 +S3150800A2B8C700FC00E900E200E400E000E500E7006A +S3150800A2C8EA00EB00E800EF00EE00EC00C400C50069 +S3150800A2D8C900E600C600F400F600F200FB00F90023 +S3150800A2E8FF00D600DC00A200A300A500A720920163 +S3150800A2F8E100ED00F300FA00F100D100AA00BA0067 +S3150800A308BF001023AC00BD00BC00A100AB00BB0019 +S3150800A318912592259325022524256125622556250A +S3150800A32855256325512557255D255C255B2510256B +S3150800A338142534252C251C2500253C255E255F2556 +S3150800A3485A25542569256625602550256C256725CF +S3150800A35868256425652559255825522553256B25CD +S3150800A3686A2518250C25882584258C259025802579 +S3150800A378B103DF009303C003A303C303B500C403F3 +S3150800A388A6039803A903B4031E22C603B503292204 +S3150800A3986122B1006522642220232123F70048227E +S3150800A3A8B0001922B7001A227F20B200A025A00003 +S3150800A3B880B500F005F800F073F800F07FF8FCE7C0 +S3150800A3C800B583B0FFF7D2FE01210120F9F700FC9A +S3150800A3D80120009000208DF8040000208DF8070061 +S3150800A3E802208DF8050000A92A48F9F7E7FA01219D +S3150800A3F82020F9F71DFC01210420F9F7E9FB0822BA +S3150800A40806212548F9F738FB082207212248F9F7D3 +S3150800A41833FB00208DF8060001208DF8070002207E +S3150800A4288DF804004020009002208DF8050000A948 +S3150800A4381948F9F7C3FA02208DF80400802000901D +S3150800A44800A91548F9F7BAFA01210220F9F7C0FB5D +S3150800A458092205211148F9F70FFB092206210F4899 +S3150800A468F9F70AFB6020009002208DF80400022004 +S3150800A4788DF8050000208DF8060001208DF80700E4 +S3150800A48800A90648F9F79AFA01215FF0C060F9F7BA +S3150800A498BFFB07BD00000240000802400004024056 +S3150800A4A880B5FCF79CFCFBF759F8FCF774FCFCF73D +S3150800A4B873F8FBF7CBFF00F00DF801BD80B5FCF784 +S3150800A4C88FFCFBF75FF8FCF79DF8FBF7D7FF00F062 +S3150800A4D80CF801BD80B5154801210170FBF75CF839 +S3150800A4E81349086000F001F801BD80B5FCF750F87B +S3150800A4F8012819D0FCF763F8002815D00B4800780E +S3150800A508012811D1FBF748F80949096801F51C51D2 +S3150800A5181031884208D3054800210170FCF758F81D +S3150800A528002801D1FCF70AFC01BD0000162E002000 +S3150800A538A82D0020809A90418E418F80454545492F +S3150800A54849498E8F9092924F994F555559999A9B8A +S3150800A5589C9D9E9F41494F55A5A5A6A7A8A9AAAB04 +S3150800A568AC21AEAFB0B1B2B3B4B5B6B7B8B9BABB29 +S3150800A578BCBDBEBFC0C1C2C3C4C5C6C7C8C9CACB8D +S3150800A588CCCDCECFD0D1D2D3D4D5D6D7D8D9DADB7D +S3150800A598DCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEB6D +S3150800A5A8ECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFB5D +S3150800A5B8FCFDFEFF12200880164870470420088014 +S3150800A5C81548704780B50A0014491548FEF72AFE4B +S3150800A5D8124802BD80B50A0010491248FEF722FE45 +S3150800A5E80E4802BD80B50A000C490F48FEF71AFE48 +S3150800A5F80A4802BD80B50A0008490C48FEF712FE4B +S3150800A608064802BD80B50A0004490948FEF70AFE4D +S3150800A618024802BDB0000020DC000020A827002060 +S3150800A62800AB000858AB000868AB0008CCAB0008BC +S3150800A638A8AA000800C0000800400000030000009F +S3150800A64800000108000001000400000000000208DC +S3150800A65800000200050000000000040800000200CF +S3150800A66806000000000006080000020007000000B7 +S3150800A67800000808000002000800000000000A0898 +S3150800A688000002000900000000000C080000020093 +S3150800A6980A00000000000E08000002000B00000077 +S3150800A6A8433A5C576F726B5C736F66747761726551 +S3150800A6B85C4F70656E424C545C5461726765745C95 +S3150800A6C844656D6F5C41524D434D345F53544D3369 +S3150800A6D8325F4F6C696D65785F53544D3332453434 +S3150800A6E830375F4941525C426F6F745C6C69625CD3 +S3150800A6F87569705C6E65746465762E630000000083 +S3150800A708433A5C576F726B5C736F667477617265F0 +S3150800A7185C4F70656E424C545C5461726765745C34 +S3150800A728536F757263655C41524D434D345F53549C +S3150800A7384D33325C4941525C766563746F72732E89 +S3150800A74863000000433A5C576F726B5C736F6674FC +S3150800A758776172655C4F70656E424C545C546172E1 +S3150800A7686765745C536F757263655C41524D434DFA +S3150800A778345F53544D33325C63616E2E63000000B8 +S3150800A788433A5C576F726B5C736F66747761726570 +S3150800A7985C4F70656E424C545C5461726765745CB4 +S3150800A7A8536F757263655C41524D434D345F53541C +S3150800A7B84D33325C756172742E630000433A5C57F8 +S3150800A7C86F726B5C736F6674776172655C4F7065E0 +S3150800A7D86E424C545C5461726765745C536F75724B +S3150800A7E863655C41524D434D345F53544D33325C77 +S3150800A7F87573622E630000007047C0B2002802D045 +S3150800A808012801D001E000E0FFE77047704780B5EE +S3150800A818FCF71FFF01BD80B5FCF71CFF01BD80B51D +S3150800A8280120FCF715FF01BD80B50020FCF710FFD5 +S3150800A83801BD0000433A5C576F726B5C736F6674B0 +S3150800A848776172655C4F70656E424C545C546172F0 +S3150800A8586765745C536F757263655C66696C652EAB +S3150800A8686300000050617273696E67206669726DCD +S3150800A878776172652066696C6520746F206F6274EB +S3150800A88861696E2065726173652073697A652E2E13 +S3150800A8982E000000000008001000180020002800FC +S3150800A8A830003800400048005000580080008800F2 +S3150800A8B890009800A000A800B000B800C000C80022 +S3150800A8C8D000D8004669726D776172652075706424 +S3150800A8D8617465207375636365737366756C6C79E3 +S3150800A8E820636F6D706C657465640A0D000000005E +S3150800A8F84F70656E696E67206669726D77617265F5 +S3150800A9082066696C6520666F722072656164696E77 +S3150800A918672E2E2E0000000010B507497944183115 +S3150800A928064C7C44163404E00A68081D5118884702 +S3150800A9380146A142F8D110BDBC000000DC000000A9 +S3150800A94805020602060307030803090309040A049D +S3150800A9580B040C040C050D050E050F050F0610064D +S3150800A968100710084669726D7761726520757064FC +S3150800A978617465207265717565737420646574659C +S3150800A988637465640A0D00005374617274696E67AE +S3150800A998207468652070726F6772616D6D696E677D +S3150800A9A82073657175656E63650A0D005265616485 +S3150800A9B8696E67206C696E652066726F6D206669B8 +S3150800A9C86C652E2E2E4552524F520A0D0000000075 +S3150800A9D8496E76616C696420636865636B73756D27 +S3150800A9E820666F756E642E2E2E4552524F520A0DEA +S3150800A9F800000000D790FFFF442D0000E400002067 +S3150800AA08000000007F76FFFFE4000000D001000088 +S3150800AA1800000020000000002F64656D6F70726FDB +S3150800AA28675F6F6C696D65785F73746D333265340B +S3150800AA3830372E73726563002062797465732066F1 +S3150800AA48726F6D206D656D6F72792061742030782C +S3150800AA580000000057726974696E672070726F6724 +S3150800AA6872616D20636865636B73756D2E2E2E0093 +S3150800AA7820627974657320746F206D656D6F7279BD +S3150800AA882061742030780000436C6F73696E672004 +S3150800AA986669726D776172652066696C650A0D006C +S3150800AAA857696E5553422042756C6B20496E74651A +S3150800AAB8726661636500000000F009F8002801D095 +S3150800AAC8FFF72AFF0020FFF773FC00F002F80120C1 +S3150800AAD8704700F001B800000746384600F002F84B +S3150800AAE8FBE7000080B5C046C046024A1100182098 +S3150800AAF8ABBEFBE72600020057696E555342204253 +S3150800AB08756C6B204465766963650000034B9D4642 +S3150800AB18C046C046C046C046FFF7CEFF28360020C6 +S3150800AB2801030507090E10121416181C1E0000004A +S3150800AB3850726F6772616D6D696E6720000000005C +S3150800AB482F626F6F746C6F672E747874000000003C +S3150800AB584F70656E424C54205573657200000000AC +S3150800AB683030303030303030303530430000000077 +S3150800AB7880B541210148FBF75DFC01BD08A700081F +S3150800AB88222A3A3C3E3F7C7F0000000045726173EA +S3150800AB98696E672000000000C046C046C046C04629 +S3150800ABA8FFF78AFF2B2C3B3D5B5D00004552524F51 +S3150800ABB8520A0D004F4B0A0D00000000FFFFFFFF69 +S3150800ABC8FFFF000044656661756C74004F70656E1A +S3150800ABD8424C540000000000FFFFFFFFAD88000844 +S3150800ABE8D9880008F1880008000000000000000065 +S3150800ABF8538900085D8900086F890008000000006D +S3150800AC0800000000818900087B7D00080F7E000887 +S3150800AC18297D0008577F0008ED7E00083B7F00085D +S3150800AC281D7F00089B7F0008A97F0008B77F0008DA +S3150800AC38CD7F000809022000010100C0320904007E +S3150800AC480002FF000000070581024000FF07050112 +S3150800AC58024000FFBDA50008C5A50008DDA5000837 +S3150800AC68CDA50008EDA50008FDA500080DA6000855 +S3150800AC7801A8000803A8000815A8000817A80008CE +S3150800AC881FA8000827A8000831A800081201100103 +S3150800AC9800000040450123000001010203010000ED +S3150800ACA8000000000102030401020304060708095C +S3150800ACB8010000002C000020040309040401000018 +S7050800ABA1A6 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 8b37fafe..deba1745 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 @@ -55,7 +55,7 @@ /** \brief Motorola or Intel style byte ordering. */ #define BOOT_CPU_BYTE_ORDER_MOTOROLA (0) /** \brief Enable/disable hook function call right before user program start. */ -#define BOOT_CPU_USER_PROGRAM_START_HOOK (0) +#define BOOT_CPU_USER_PROGRAM_START_HOOK (1) /**************************************************************************************** @@ -108,6 +108,20 @@ #define BOOT_COM_UART_CHANNEL_INDEX (5) +/* The USB communication interface is selected by setting the BOOT_COM_USB_ENABLE + * configurable to 1. The maximum amount of data bytes in a message for data transmission + * and reception is set through BOOT_COM_USB_TX_MAX_DATA and BOOT_COM_USB_RX_MAX_DATA, + * respectively. + * + */ +/** \brief Enable/disable USB transport layer. */ +#define BOOT_COM_USB_ENABLE (1) +/** \brief Configure number of bytes in the target->host data packet. */ +#define BOOT_COM_USB_TX_MAX_DATA (63) +/** \brief Configure number of bytes in the host->target data packet. */ +#define BOOT_COM_USB_RX_MAX_DATA (63) + + /* 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 diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/hooks.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/hooks.c index 42cdf9b3..e18868ee 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/hooks.c +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/hooks.c @@ -69,6 +69,48 @@ blt_bool BackDoorEntryHook(void) #endif /* BOOT_BACKDOOR_HOOKS_ENABLE > 0 */ +/**************************************************************************************** +* U S B C O M M U N I C A T I O N I N T E R F A C E H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_COM_USB_ENABLE > 0) +/************************************************************************************//** +** \brief Callback that gets called whenever the USB device should be connected +** to the USB bus. +** \param connect BLT_TRUE to connect and BLT_FALSE to disconnect. +** \return none. +** +****************************************************************************************/ +void UsbConnectHook(blt_bool connect) +{ +} /*** end of UsbConnect ***/ + + +/************************************************************************************//** +** \brief Callback that gets called whenever the USB host requests the device +** to enter a low power mode. +** \return none. +** +****************************************************************************************/ +void UsbEnterLowPowerModeHook(void) +{ + /* support to enter a low power mode can be implemented here */ +} /*** end of UsbEnterLowPowerMode ***/ + + +/************************************************************************************//** +** \brief Callback that gets called whenever the USB host requests the device to +** exit low power mode. +** \return none. +** +****************************************************************************************/ +void UsbLeaveLowPowerModeHook(void) +{ + /* support to leave a low power mode can be implemented here */ +} /*** end of UsbLeaveLowPowerMode ***/ +#endif /* BOOT_COM_USB_ENABLE > 0 */ + + /**************************************************************************************** * C P U D R I V E R H O O K F U N C T I O N S ****************************************************************************************/ @@ -85,7 +127,11 @@ blt_bool BackDoorEntryHook(void) ****************************************************************************************/ blt_bool CpuUserProgramStartHook(void) { - /* okay to start the user program */ + /* do not start the user program is the pushbutton is pressed */ + if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == Bit_SET) + { + return BLT_FALSE; + } return BLT_TRUE; } /*** end of CpuUserProgramStartHook ***/ #endif /* BOOT_CPU_USER_PROGRAM_START_HOOK > 0 */ 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 00ef25d5..18b0d531 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 @@ - 125272727 + 212272727 @@ -34,7 +34,7 @@ 20011 - 30010200ExpressionLocationTypeValue100150100100ExpressionLocationTypeValue100150100100200 + 30010200ExpressionLocationTypeValue100150100100ExpressionLocationTypeValue100150100100200FileFunctionLine200700100300 @@ -67,20 +67,20 @@ - 0 + 0TabID-24339-31895DisassemblyDisassembly0 - TextEditor$WS_DIR$\..\main.c000004230693069TextEditor$WS_DIR$\..\blt_conf.h0000071711271121TextEditor$WS_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\cstart.s000001225872587TextEditor$WS_DIR$\..\..\..\..\Source\boot.c000004835093509TextEditor$WS_DIR$\..\..\..\..\Source\com.c000009448874887TextEditor$WS_DIR$\..\..\..\..\Source\backdoor.c000009252785278TextEditor$WS_DIR$\..\..\..\..\Source\xcp.c000002641213412134TextEditor$WS_DIR$\..\..\..\..\Source\ARMCM4_STM32\uart.c00000129718771870100000010000001 + TextEditor$WS_DIR$\..\main.c0000033296329630TextEditor$WS_DIR$\..\blt_conf.h0000096774677460100000010000001 - iaridepm.enu1debuggergui.enu1-2-2741199-2-2201200104688198413104688737103-2-21981922-2-219242001002083198413104688198413 + iaridepm.enu1debuggergui.enu1-2-2741303-2-2201200104688198413158854737103-2-2741198-2-2200200104167198413104167737103-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 0ca2cd54..5f001d6d 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=-624215373 +Checksum=-1491772977 [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 abdde360..9d273820 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 @@ -25,12 +25,12 @@ - 19027326200Build - FileFunctionLine20070010030017367 + 200Build19027326 + FileFunctionLine200700100300173671402024014020240 - + TabID-10231-8055 @@ -38,24 +38,24 @@ Workspace - stm32f407stm32f407/Bootstm32f407/Outputstm32f407/Sourcestm32f407/Source/ARMCM4_STM32stm32f407/Source/ARMCM4_STM32/IARstm32f407/Source/third_partystm32f407/libstm32f407/src + stm32f407stm32f407/Bootstm32f407/Outputstm32f407/libstm32f407/src - 0TabID-19870-1384BuildBuildTabID-11216-22197Debug LogDebug-Log0 + 0TabID-19870-1384BuildBuildTabID-11216-22197Debug LogDebug-LogTabID-16597-313Find All DeclarationsFind-All-DeclarationsTabID-7799-665Ambiguous DefinitionsSelect-Ambiguous-DefinitionsTabID-26870-1945Find in FilesFind-in-Files0 - TextEditor$WS_DIR$\..\main.c000004230693069TextEditor$WS_DIR$\..\blt_conf.h0000071711271121TextEditor$WS_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\cstart.s000001225872587TextEditor$WS_DIR$\..\..\..\..\Source\boot.c000004835093509TextEditor$WS_DIR$\..\..\..\..\Source\com.c000009448874887TextEditor$WS_DIR$\..\..\..\..\Source\backdoor.c000009252785278TextEditor$WS_DIR$\..\..\..\..\Source\xcp.c000002641213412134TextEditor$WS_DIR$\..\..\..\..\Source\ARMCM4_STM32\uart.c00000129718771870100000010000001 + TextEditor$WS_DIR$\..\main.c0000033296329630TextEditor$WS_DIR$\..\blt_conf.h0000096774677460100000010000001 - iaridepm.enu1-2-2963413-2-2200200104167198413216146957341-2-2963413-2-2200200104167198413216146957341 + 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 66050c7b..ab564d4d 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,7 +2,7 @@ 2 - 1032076476 + 213010453 Debug @@ -80,16 +80,40 @@ $PROJ_DIR$\..\lib\uip\netdev.c $PROJ_DIR$\..\lib\uip\netdev.h $PROJ_DIR$\..\lib\uip\uip-conf.h + $PROJ_DIR$\..\lib\usbotgdriver\inc\usb_bsp.h + $PROJ_DIR$\..\lib\usbotgdriver\src\usb_core.c + $PROJ_DIR$\..\lib\usbotgdriver\inc\usb_core.h + $PROJ_DIR$\..\lib\usbotgdriver\src\usb_dcd.c + $PROJ_DIR$\..\lib\usbotgdriver\inc\usb_dcd.h + $PROJ_DIR$\..\lib\usbotgdriver\src\usb_dcd_int.c + $PROJ_DIR$\..\lib\usbotgdriver\inc\usb_dcd_int.h + $PROJ_DIR$\..\lib\usbotgdriver\inc\usb_defines.h + $PROJ_DIR$\..\lib\usbotgdriver\inc\usb_regs.h + $PROJ_DIR$\..\lib\usbdevicelib\Core\src\usbd_core.c + $PROJ_DIR$\..\lib\usbdevicelib\Core\inc\usbd_core.h + $PROJ_DIR$\..\lib\usbdevicelib\Core\inc\usbd_def.h + $PROJ_DIR$\..\lib\usbdevicelib\Core\src\usbd_ioreq.c + $PROJ_DIR$\..\lib\usbdevicelib\Core\inc\usbd_ioreq.h + $PROJ_DIR$\..\lib\usbdevicelib\Core\src\usbd_req.c + $PROJ_DIR$\..\lib\usbdevicelib\Core\inc\usbd_req.h + $PROJ_DIR$\..\lib\usbdevicelib\Core\inc\usbd_usr.h $PROJ_DIR$\..\blt_conf.h $PROJ_DIR$\..\hooks.c $PROJ_DIR$\..\main.c - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uiplib.c + $PROJ_DIR$\..\usb_bsp.c + $PROJ_DIR$\..\usb_conf.h + $PROJ_DIR$\..\usbd_bulk.c + $PROJ_DIR$\..\usbd_bulk.h + $PROJ_DIR$\..\usbd_conf.h + $PROJ_DIR$\..\usbd_desc.c + $PROJ_DIR$\..\usbd_desc.h + $PROJ_DIR$\..\usbd_usr.c + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h $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\fatfs\src\diskio.h $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\cpu.h $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\flash.c $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\flash.h @@ -100,6 +124,9 @@ $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\types.h $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\uart.c $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\uart.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\usb.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\usb.h + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\diskio.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 @@ -114,23 +141,36 @@ $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_arp.h $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$\..\obj\file.lst - $PROJ_DIR$\..\obj\backdoor.lst - $PROJ_DIR$\..\obj\boot.lst + $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\timer.pbi + $PROJ_DIR$\..\obj\main.lst + $PROJ_DIR$\..\obj\com.lst + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\ff.h + $TOOLKIT_DIR$\lib\m7M_tl.a + $PROJ_DIR$\..\obj\mmc.o + $TOOLKIT_DIR$\inc\c\xmtx.h + $TOOLKIT_DIR$\inc\c\stdarg.h $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$\..\..\..\..\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 @@ -214,9 +254,9 @@ $PROJ_DIR$\..\obj\uip.pbi $PROJ_DIR$\..\obj\stm32f4xx_syscfg.pbi $PROJ_DIR$\..\lib\ethernetlib\inc\stm32f4x7_eth_conf.h - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\memory.x $PROJ_DIR$\..\obj\stm32f4xx_cryp.lst $PROJ_DIR$\..\obj\openbtl_olimex_stm32e407.map + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\memory.x $PROJ_DIR$\..\lib\ethernetlib\inc\stm32f4x7_eth.h $PROJ_DIR$\..\obj\unicode.lst $PROJ_DIR$\..\obj\uip_timer.o @@ -238,24 +278,6 @@ $PROJ_DIR$\..\obj\stm32f4xx_dbgmcu.o $PROJ_DIR$\..\obj\stm32f4xx_can.o $PROJ_DIR$\..\obj\stm32f4xx_cryp.o - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uipopt.h - $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\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\stm32f4xx_adc.pbi $PROJ_DIR$\..\obj\cop.o $PROJ_DIR$\..\obj\timer.o @@ -276,10 +298,10 @@ $PROJ_DIR$\..\obj\stm32f4xx_dac.o $PROJ_DIR$\..\obj\stm32f4xx_dcmi.o $PROJ_DIR$\..\obj\stm32f4xx_dma.o - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\ccsbcs.c $PROJ_DIR$\..\obj\stm32f4xx_flash.o $PROJ_DIR$\..\obj\stm32f4xx_exti.o $PROJ_DIR$\..\obj\stm32f4xx_fsmc.o + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\ccsbcs.c $PROJ_DIR$\..\obj\file.o $PROJ_DIR$\..\obj\boot.pbi $TOOLKIT_DIR$\inc\c\string.h @@ -358,1292 +380,51 @@ $PROJ_DIR$\..\obj\main.o $PROJ_DIR$\..\obj\hooks.o $PROJ_DIR$\..\obj\com.o + $PROJ_DIR$\..\obj\usbd_req.pbi + $PROJ_DIR$\..\obj\usb_dcd_int.o + $PROJ_DIR$\..\obj\usb_core.pbi + $PROJ_DIR$\..\obj\usb_dcd_int.pbi + $PROJ_DIR$\..\obj\usb_dcd.pbi + $PROJ_DIR$\..\obj\usb_core.o + $PROJ_DIR$\..\obj\usb_dcd.o + $PROJ_DIR$\..\obj\usbd_usr.lst + $PROJ_DIR$\..\obj\usbd_core.lst + $PROJ_DIR$\..\obj\usbd_req.lst + $PROJ_DIR$\..\obj\usbd_desc.lst + $PROJ_DIR$\..\obj\usb_core.lst + $PROJ_DIR$\..\obj\usbd_ioreq.lst + $PROJ_DIR$\..\obj\usbd_bulk.lst + $PROJ_DIR$\..\obj\usb.lst + $PROJ_DIR$\..\obj\usb_bsp.lst + $PROJ_DIR$\..\obj\usb_dcd.lst + $PROJ_DIR$\..\obj\usb_dcd_int.lst + $PROJ_DIR$\..\obj\usb.pbi + $PROJ_DIR$\..\obj\usb.o + $PROJ_DIR$\..\obj\usbd_core.o + $PROJ_DIR$\..\obj\usbd_ioreq.o + $PROJ_DIR$\..\obj\usbd_req.o + $PROJ_DIR$\..\obj\usbd_ioreq.pbi + $PROJ_DIR$\..\obj\usbd_core.pbi + $PROJ_DIR$\..\obj\usbd_bulk.o + $PROJ_DIR$\..\obj\usbd_desc.o + $PROJ_DIR$\..\obj\usb_bsp.o + $PROJ_DIR$\..\obj\usbd_usr.o + $PROJ_DIR$\..\obj\usbd_usr.pbi + $PROJ_DIR$\..\obj\usb_bsp.pbi + $PROJ_DIR$\..\obj\usbd_bulk.pbi + $PROJ_DIR$\..\obj\usbd_desc.pbi + $PROJ_DIR$\..\obj\backdoor.lst + $PROJ_DIR$\..\obj\file.lst + $PROJ_DIR$\..\obj\boot.lst + $PROJ_DIR$\..\obj\cpu.lst + $PROJ_DIR$\..\obj\flash.lst - - [ROOT_NODE] - - - ILINK - 324 210 - - - $PROJ_DIR$\..\lib\ethernetlib\src\stm32_eth.c ICCARM - 217 146 - - - BICOMP - 215 - - - - - ICCARM - 0 10 5 287 277 265 258 323 175 266 341 6 335 321 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 10 5 287 277 265 258 323 175 266 341 6 335 321 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\fatfs\mmc.c - - - ICCARM - 126 121 - - - BICOMP - 137 - - - - - ICCARM - 276 277 265 258 323 175 266 341 317 124 83 94 10 5 287 6 335 321 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 - 276 277 265 258 323 175 266 341 317 124 83 94 10 5 287 6 335 321 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\misc.c - - - ICCARM - 149 322 - - - BICOMP - 288 - - - - - ICCARM - 9 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 9 10 5 287 277 265 258 323 175 266 341 6 335 321 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_adc.c - - - ICCARM - 293 228 - - - BICOMP - 250 - - - - - ICCARM - 12 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 12 10 5 287 277 265 258 323 175 266 341 6 335 321 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_can.c - - - ICCARM - 141 230 - - - BICOMP - 253 - - - - - ICCARM - 14 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 14 10 5 287 277 265 258 323 175 266 341 6 335 321 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_crc.c - - - ICCARM - 332 263 - - - BICOMP - 279 - - - - - ICCARM - 17 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 17 10 5 287 277 265 258 323 175 266 341 6 335 321 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_cryp.c - - - ICCARM - 209 231 - - - BICOMP - 342 - - - - - ICCARM - 19 10 5 287 277 265 258 323 175 266 341 6 335 321 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 287 277 265 258 323 175 266 341 6 335 321 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_aes.c - - - ICCARM - 142 167 - - - BICOMP - 316 - - - - - ICCARM - 19 10 5 287 277 265 258 323 175 266 341 6 335 321 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 287 277 265 258 323 175 266 341 6 335 321 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_des.c - - - ICCARM - 144 157 - - - BICOMP - 136 - - - - - ICCARM - 19 10 5 287 277 265 258 323 175 266 341 6 335 321 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 287 277 265 258 323 175 266 341 6 335 321 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 - 203 227 - - - BICOMP - 222 - - - - - ICCARM - 19 10 5 287 277 265 258 323 175 266 341 6 335 321 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_dac.c - - - ICCARM - 185 267 - - - BICOMP - 289 - - - - - ICCARM - 24 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 24 10 5 287 277 265 258 323 175 266 341 6 335 321 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$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dbgmcu.c - - - ICCARM - 331 229 - - - BICOMP - 303 - - - - - ICCARM - 26 10 5 287 277 265 258 323 175 266 341 6 335 321 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 287 277 265 258 323 175 266 341 6 335 321 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 - 187 268 - - - BICOMP - 264 - - - - - ICCARM - 28 10 5 287 277 265 258 323 175 266 341 6 335 321 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 287 277 265 258 323 175 266 341 6 335 321 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 - 186 269 - - - BICOMP - 346 - - - - - ICCARM - 30 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - - - BICOMP - 30 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 297 272 - - - BICOMP - 176 - - - - - ICCARM - 32 10 5 287 277 265 258 323 175 266 341 6 335 321 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 287 277 265 258 323 175 266 341 6 335 321 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 - 198 271 - - - BICOMP - 218 - - - - - ICCARM - 34 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 34 10 5 287 277 265 258 323 175 266 341 6 335 321 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$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_fsmc.c - - - ICCARM - 179 273 - - - BICOMP - 178 - - - - - ICCARM - 36 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 36 10 5 287 277 265 258 323 175 266 341 6 335 321 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$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_gpio.c - - - ICCARM - 196 257 - - - BICOMP - 145 - - - - - ICCARM - 38 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 38 10 5 287 277 265 258 323 175 266 341 6 335 321 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$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash.c - - - ICCARM - 184 260 - - - BICOMP - 143 - - - - - ICCARM - 40 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 40 10 5 287 277 265 258 323 175 266 341 6 335 321 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$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash_md5.c - - - ICCARM - 328 262 - - - BICOMP - 140 - - - - - ICCARM - 40 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 40 10 5 287 277 265 258 323 175 266 341 6 335 321 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$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash_sha1.c - - - ICCARM - 190 261 - - - BICOMP - 329 - - - - - ICCARM - 40 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 40 10 5 287 277 265 258 323 175 266 341 6 335 321 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$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_i2c.c - - - ICCARM - 200 135 - - - BICOMP - 344 - - - - - ICCARM - 44 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 44 10 5 287 277 265 258 323 175 266 341 6 335 321 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$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_iwdg.c - - - ICCARM - 193 343 - - - BICOMP - 177 - - - - - ICCARM - 46 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 46 10 5 287 277 265 258 323 175 266 341 6 335 321 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$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_pwr.c - - - ICCARM - 195 256 - - - BICOMP - 299 - - - - - ICCARM - 48 10 5 287 277 265 258 323 175 266 341 6 335 321 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 287 277 265 258 323 175 266 341 6 335 321 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 - 194 345 - - - BICOMP - 254 - - - - - ICCARM - 50 10 5 287 277 265 258 323 175 266 341 6 335 321 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 287 277 265 258 323 175 266 341 6 335 321 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 - 189 219 - - - BICOMP - 339 - - - - - ICCARM - 52 10 5 287 277 265 258 323 175 266 341 6 335 321 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 287 277 265 258 323 175 266 341 6 335 321 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 - 192 220 - - - BICOMP - 301 - - - - - ICCARM - 54 10 5 287 277 265 258 323 175 266 341 6 335 321 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 287 277 265 258 323 175 266 341 6 335 321 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 - 183 221 - - - BICOMP - 300 - - - - - ICCARM - 56 10 5 287 277 265 258 323 175 266 341 6 335 321 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 287 277 265 258 323 175 266 341 6 335 321 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 - 130 223 - - - BICOMP - 334 - - - - - ICCARM - 58 10 5 287 277 265 258 323 175 266 341 6 335 321 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 287 277 265 258 323 175 266 341 6 335 321 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 - 181 337 - - - BICOMP - 206 - - - - - ICCARM - 60 10 5 287 277 265 258 323 175 266 341 6 335 321 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 287 277 265 258 323 175 266 341 6 335 321 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 - 129 138 - - - BICOMP - 302 - - - - - ICCARM - 62 10 5 287 277 265 258 323 175 266 341 6 335 321 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 287 277 265 258 323 175 266 341 6 335 321 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 - 199 336 - - - BICOMP - 133 - - - - - ICCARM - 64 10 5 287 277 265 258 323 175 266 341 6 335 321 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 287 277 265 258 323 175 266 341 6 335 321 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 - 197 280 - - - BICOMP - 278 - - - - - ICCARM - 66 10 5 287 277 265 258 323 175 266 341 6 335 321 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 287 277 265 258 323 175 266 341 6 335 321 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 - 191 158 - - - BICOMP - 152 - - - - - ICCARM - 10 5 287 277 265 258 323 175 266 341 6 335 321 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 287 277 265 258 323 175 266 341 6 335 321 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 - 160 201 - - - BICOMP - 290 - - - - - ICCARM - 70 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 - - - BICOMP - 70 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 - - - - - $PROJ_DIR$\..\lib\uip\netdev.c - - - ICCARM - 171 164 - - - BICOMP - 166 - - - - - ICCARM - 103 232 73 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 246 105 10 5 287 277 265 258 323 175 266 341 6 335 321 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 276 317 124 - - - BICOMP - 103 232 73 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 246 105 10 5 287 277 265 258 323 175 266 341 6 335 321 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 276 317 124 - - - - - $PROJ_DIR$\..\hooks.c - - - ICCARM - 113 350 - - - BICOMP - 310 - - - - - ICCARM - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 10 5 287 277 265 258 323 175 266 341 6 335 321 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$\..\main.c - - - ICCARM - 116 349 - - - BICOMP - 311 - - - - - ICCARM - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 10 5 287 277 265 258 323 175 266 341 6 335 321 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\uip\uip\uiplib.c - - - ICCARM - 172 170 - - - BICOMP - 294 - - - - - ICCARM - 103 232 73 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 246 108 - - - BICOMP - 103 232 73 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 246 108 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\cstart.s - - - AARM - 312 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\vectors.c - - - ICCARM - 151 283 - - - BICOMP - 306 - - - - - ICCARM - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 - - - BICOMP - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\can.c - - - ICCARM - 226 225 - - - BICOMP - 224 - - - - - ICCARM - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 - - - BICOMP - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\cpu.c - - - ICCARM - 115 307 - - - BICOMP - 315 - - - - - ICCARM - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 - - - BICOMP - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\flash.c - - - ICCARM - 117 314 - - - BICOMP - 313 - - - - - ICCARM - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 202 161 - - - BICOMP - 148 - - - - - ICCARM - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 - - - BICOMP - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 - - - - - $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\timer.c - - - ICCARM - 327 252 - - - BICOMP - 118 - - - - - ICCARM - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 132 182 - - - BICOMP - 125 - - - - - ICCARM - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 10 5 287 277 265 258 323 175 266 341 6 335 321 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 - 128 340 - - - BICOMP - 139 - - - - - ICCARM - 96 94 3 83 123 277 265 258 323 175 266 341 - - - BICOMP - 96 94 3 83 123 277 265 258 323 175 266 341 - - - - - $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\unicode.c - - - ICCARM - 212 338 - - - BICOMP - 298 - - - - - ICCARM - 96 94 3 286 - - - BICOMP - 96 94 3 286 - - - - - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip-fw.c - - - ICCARM - 174 330 - - - BICOMP - 204 - - - - - ICCARM - 103 232 73 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 246 101 100 276 277 265 258 323 175 266 341 317 124 - - - BICOMP - 103 232 73 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 246 101 100 276 277 265 258 323 175 266 341 317 124 - - - - - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip.c - - - ICCARM - 163 173 - - - BICOMP - 205 - - - - - ICCARM - 103 232 73 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 246 101 276 277 265 258 323 175 266 341 317 124 - - - BICOMP - 103 232 73 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 246 101 276 277 265 258 323 175 266 341 317 124 - - - - - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_arp.c - - - ICCARM - 295 168 - - - BICOMP - 292 - - - - - ICCARM - 105 103 232 73 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 246 276 277 265 258 323 175 266 341 317 124 - - - BICOMP - 105 103 232 73 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 246 276 277 265 258 323 175 266 341 317 124 - - - - - $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_timer.c - - - ICCARM - 169 213 - - - BICOMP - 296 - - - - - ICCARM - 98 70 107 - - - BICOMP - 98 70 107 - - - - - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\unicode.c - - - ICCARM - 212 338 - - - BICOMP - 298 - - - - - ICCARM - 120 131 3 270 - - - BICOMP - 120 131 3 270 - - - - - $PROJ_DIR$\..\..\..\..\Source\fatfs\src\ff.c - - - ICCARM - 128 340 - - - BICOMP - 139 - - - - - ICCARM - 120 131 3 216 123 277 265 258 323 175 266 341 - - - BICOMP - 120 131 3 216 123 277 265 258 323 175 266 341 - - - - - $PROJ_DIR$\..\..\..\..\Source\assert.c - - - ICCARM - 320 318 - - - BICOMP - 319 - - - - - ICCARM - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 - - - BICOMP - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 - - - - - $PROJ_DIR$\..\..\..\..\Source\backdoor.c - - - ICCARM - 110 347 + 257 186 BICOMP @@ -1653,20 +434,89 @@ ICCARM - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 + 0 10 5 309 299 287 280 345 215 288 363 6 357 343 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 - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 + 0 10 5 309 299 287 280 345 215 288 363 6 357 343 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\boot.c + $PROJ_DIR$\..\lib\fatfs\mmc.c ICCARM - 111 348 + 166 160 + + + BICOMP + 177 + + + + + ICCARM + 298 299 287 280 345 215 288 363 339 102 120 121 10 5 309 6 357 343 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 + 298 299 287 280 345 215 288 363 339 102 120 121 10 5 309 6 357 343 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\misc.c + + + ICCARM + 189 344 + + + BICOMP + 310 + + + + + ICCARM + 9 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 9 10 5 309 299 287 280 345 215 288 363 6 357 343 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_adc.c + + + ICCARM + 315 268 + + + BICOMP + 272 + + + + + ICCARM + 12 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 12 10 5 309 299 287 280 345 215 288 363 6 357 343 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_can.c + + + ICCARM + 181 270 BICOMP @@ -1676,11 +526,1432 @@ ICCARM - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 + 14 10 5 309 299 287 280 345 215 288 363 6 357 343 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 - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 + 14 10 5 309 299 287 280 345 215 288 363 6 357 343 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_crc.c + + + ICCARM + 354 285 + + + BICOMP + 301 + + + + + ICCARM + 17 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 17 10 5 309 299 287 280 345 215 288 363 6 357 343 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_cryp.c + + + ICCARM + 248 271 + + + BICOMP + 364 + + + + + ICCARM + 19 10 5 309 299 287 280 345 215 288 363 6 357 343 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 309 299 287 280 345 215 288 363 6 357 343 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_aes.c + + + ICCARM + 182 207 + + + BICOMP + 338 + + + + + ICCARM + 19 10 5 309 299 287 280 345 215 288 363 6 357 343 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 309 299 287 280 345 215 288 363 6 357 343 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_des.c + + + ICCARM + 184 197 + + + BICOMP + 176 + + + + + ICCARM + 19 10 5 309 299 287 280 345 215 288 363 6 357 343 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 309 299 287 280 345 215 288 363 6 357 343 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 + 243 267 + + + BICOMP + 262 + + + + + ICCARM + 19 10 5 309 299 287 280 345 215 288 363 6 357 343 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 309 299 287 280 345 215 288 363 6 357 343 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_dac.c + + + ICCARM + 225 289 + + + BICOMP + 311 + + + + + ICCARM + 24 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 24 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + + + + + [ROOT_NODE] + + + ILINK + 346 249 + + + + + $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_dbgmcu.c + + + ICCARM + 353 269 + + + BICOMP + 325 + + + + + ICCARM + 26 10 5 309 299 287 280 345 215 288 363 6 357 343 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 309 299 287 280 345 215 288 363 6 357 343 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 + 227 290 + + + BICOMP + 286 + + + + + ICCARM + 28 10 5 309 299 287 280 345 215 288 363 6 357 343 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 309 299 287 280 345 215 288 363 6 357 343 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 + 226 291 + + + BICOMP + 368 + + + + + ICCARM + 30 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + + + BICOMP + 30 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 319 293 + + + BICOMP + 216 + + + + + ICCARM + 32 10 5 309 299 287 280 345 215 288 363 6 357 343 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 309 299 287 280 345 215 288 363 6 357 343 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 + 238 292 + + + BICOMP + 258 + + + + + ICCARM + 34 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 34 10 5 309 299 287 280 345 215 288 363 6 357 343 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$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_fsmc.c + + + ICCARM + 219 294 + + + BICOMP + 218 + + + + + ICCARM + 36 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 36 10 5 309 299 287 280 345 215 288 363 6 357 343 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$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_gpio.c + + + ICCARM + 236 279 + + + BICOMP + 185 + + + + + ICCARM + 38 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 38 10 5 309 299 287 280 345 215 288 363 6 357 343 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$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash.c + + + ICCARM + 224 282 + + + BICOMP + 183 + + + + + ICCARM + 40 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 40 10 5 309 299 287 280 345 215 288 363 6 357 343 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$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash_md5.c + + + ICCARM + 350 284 + + + BICOMP + 180 + + + + + ICCARM + 40 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 40 10 5 309 299 287 280 345 215 288 363 6 357 343 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$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_hash_sha1.c + + + ICCARM + 230 283 + + + BICOMP + 351 + + + + + ICCARM + 40 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 40 10 5 309 299 287 280 345 215 288 363 6 357 343 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$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_i2c.c + + + ICCARM + 240 175 + + + BICOMP + 366 + + + + + ICCARM + 44 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 44 10 5 309 299 287 280 345 215 288 363 6 357 343 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$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_iwdg.c + + + ICCARM + 233 365 + + + BICOMP + 217 + + + + + ICCARM + 46 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 46 10 5 309 299 287 280 345 215 288 363 6 357 343 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$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\src\stm32f4xx_pwr.c + + + ICCARM + 235 278 + + + BICOMP + 321 + + + + + ICCARM + 48 10 5 309 299 287 280 345 215 288 363 6 357 343 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 309 299 287 280 345 215 288 363 6 357 343 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 + 234 367 + + + BICOMP + 276 + + + + + ICCARM + 50 10 5 309 299 287 280 345 215 288 363 6 357 343 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 309 299 287 280 345 215 288 363 6 357 343 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 + 229 259 + + + BICOMP + 361 + + + + + ICCARM + 52 10 5 309 299 287 280 345 215 288 363 6 357 343 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 309 299 287 280 345 215 288 363 6 357 343 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 + 232 260 + + + BICOMP + 323 + + + + + ICCARM + 54 10 5 309 299 287 280 345 215 288 363 6 357 343 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 309 299 287 280 345 215 288 363 6 357 343 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 + 223 261 + + + BICOMP + 322 + + + + + ICCARM + 56 10 5 309 299 287 280 345 215 288 363 6 357 343 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 309 299 287 280 345 215 288 363 6 357 343 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 + 170 263 + + + BICOMP + 356 + + + + + ICCARM + 58 10 5 309 299 287 280 345 215 288 363 6 357 343 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 309 299 287 280 345 215 288 363 6 357 343 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 + 221 359 + + + BICOMP + 246 + + + + + ICCARM + 60 10 5 309 299 287 280 345 215 288 363 6 357 343 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 309 299 287 280 345 215 288 363 6 357 343 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 + 169 178 + + + BICOMP + 324 + + + + + ICCARM + 62 10 5 309 299 287 280 345 215 288 363 6 357 343 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 309 299 287 280 345 215 288 363 6 357 343 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 + 239 358 + + + BICOMP + 173 + + + + + ICCARM + 64 10 5 309 299 287 280 345 215 288 363 6 357 343 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 309 299 287 280 345 215 288 363 6 357 343 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 + 237 302 + + + BICOMP + 300 + + + + + ICCARM + 66 10 5 309 299 287 280 345 215 288 363 6 357 343 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 309 299 287 280 345 215 288 363 6 357 343 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 + 231 198 + + + BICOMP + 192 + + + + + ICCARM + 10 5 309 299 287 280 345 215 288 363 6 357 343 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 309 299 287 280 345 215 288 363 6 357 343 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 + 200 241 + + + BICOMP + 312 + + + + + ICCARM + 70 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 + + + BICOMP + 70 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 + + + + + $PROJ_DIR$\..\lib\uip\netdev.c + + + ICCARM + 211 204 + + + BICOMP + 206 + + + + + ICCARM + 130 138 73 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 151 132 10 5 309 299 287 280 345 215 288 363 6 357 343 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 298 339 102 + + + BICOMP + 130 138 73 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 151 132 10 5 309 299 287 280 345 215 288 363 6 357 343 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 298 339 102 + + + + + $PROJ_DIR$\..\lib\usbotgdriver\src\usb_core.c + + + ICCARM + 385 379 + + + BICOMP + 376 + + + + + ICCARM + 76 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 82 81 74 + + + BICOMP + 76 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 82 81 74 + + + + + $PROJ_DIR$\..\lib\usbotgdriver\src\usb_dcd.c + + + ICCARM + 390 380 + + + BICOMP + 378 + + + + + ICCARM + 78 76 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 82 81 74 + + + BICOMP + 78 76 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 82 81 74 + + + + + $PROJ_DIR$\..\lib\usbotgdriver\src\usb_dcd_int.c + + + ICCARM + 391 375 + + + BICOMP + 377 + + + + + ICCARM + 80 78 76 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 82 81 + + + BICOMP + 80 78 76 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 82 81 + + + + + $PROJ_DIR$\..\lib\usbdevicelib\Core\src\usbd_core.c + + + ICCARM + 382 394 + + + BICOMP + 398 + + + + + ICCARM + 84 78 76 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 82 81 85 98 89 87 80 74 + + + BICOMP + 84 78 76 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 82 81 85 98 89 87 80 74 + + + + + $PROJ_DIR$\..\lib\usbdevicelib\Core\src\usbd_ioreq.c + + + ICCARM + 386 395 + + + BICOMP + 397 + + + + + ICCARM + 87 85 98 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 84 78 76 82 81 + + + BICOMP + 87 85 98 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 84 78 76 82 81 + + + + + $PROJ_DIR$\..\lib\usbdevicelib\Core\src\usbd_req.c + + + ICCARM + 383 396 + + + BICOMP + 374 + + + + + ICCARM + 89 85 98 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 84 78 76 82 81 87 100 + + + BICOMP + 89 85 98 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 84 78 76 82 81 87 100 + + + + + $PROJ_DIR$\..\hooks.c + + + ICCARM + 164 372 + + + BICOMP + 332 + + + + + ICCARM + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 10 5 309 299 287 280 345 215 288 363 6 357 343 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$\..\main.c + + + ICCARM + 156 371 + + + BICOMP + 333 + + + + + ICCARM + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 10 5 309 299 287 280 345 215 288 363 6 357 343 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$\..\usb_bsp.c + + + ICCARM + 389 401 + + + BICOMP + 404 + + + + + ICCARM + 74 76 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 82 81 98 + + + BICOMP + 74 76 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 82 81 98 + + + + + $PROJ_DIR$\..\usbd_bulk.c + + + ICCARM + 387 399 + + + BICOMP + 405 + + + + + ICCARM + 97 87 85 98 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 84 78 76 82 81 100 89 + + + BICOMP + 97 87 85 98 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 84 78 76 82 81 100 89 + + + + + $PROJ_DIR$\..\usbd_desc.c + + + ICCARM + 384 400 + + + BICOMP + 406 + + + + + ICCARM + 84 78 76 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 82 81 85 98 100 89 + + + BICOMP + 84 78 76 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 82 81 85 98 100 89 + + + + + $PROJ_DIR$\..\usbd_usr.c + + + ICCARM + 381 402 + + + BICOMP + 403 + + + + + ICCARM + 90 84 78 76 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 82 81 85 98 87 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 119 + + + BICOMP + 90 84 78 76 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 82 81 85 98 87 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 119 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\cstart.s + + + AARM + 334 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\IAR\vectors.c + + + ICCARM + 191 305 + + + BICOMP + 328 + + + + + ICCARM + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 + + + BICOMP + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\can.c + + + ICCARM + 266 265 + + + BICOMP + 264 + + + + + ICCARM + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 + + + BICOMP + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\cpu.c + + + ICCARM + 410 329 + + + BICOMP + 337 + + + + + ICCARM + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 + + + BICOMP + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\flash.c + + + ICCARM + 411 336 + + + BICOMP + 335 + + + + + ICCARM + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 242 201 + + + BICOMP + 188 + + + + + ICCARM + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 + + + BICOMP + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\timer.c + + + ICCARM + 349 274 + + + BICOMP + 155 + + + + + ICCARM + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 172 222 + + + BICOMP + 165 + + + + + ICCARM + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 10 5 309 299 287 280 345 215 288 363 6 357 343 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 + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 10 5 309 299 287 280 345 215 288 363 6 357 343 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\usb.c + + + ICCARM + 388 393 + + + BICOMP + 392 + + + + + ICCARM + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 119 76 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 82 81 80 78 84 85 98 90 100 97 87 + + + BICOMP + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 119 76 95 10 5 309 299 287 280 345 215 288 363 6 357 343 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 82 81 80 78 84 85 98 90 100 97 87 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\ff.c + + + ICCARM + 168 362 + + + BICOMP + 179 + + + + + ICCARM + 123 121 3 120 162 299 287 280 345 215 288 363 + + + BICOMP + 123 121 3 120 162 299 287 280 345 215 288 363 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src\option\unicode.c + + + ICCARM + 252 360 + + + BICOMP + 320 + + + + + ICCARM + 123 121 3 308 + + + BICOMP + 123 121 3 308 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip-fw.c + + + ICCARM + 214 352 + + + BICOMP + 244 + + + + + ICCARM + 130 138 73 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 151 128 127 298 299 287 280 345 215 288 363 339 102 + + + BICOMP + 130 138 73 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 151 128 127 298 299 287 280 345 215 288 363 339 102 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip.c + + + ICCARM + 203 213 + + + BICOMP + 245 + + + + + ICCARM + 130 138 73 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 151 128 298 299 287 280 345 215 288 363 339 102 + + + BICOMP + 130 138 73 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 151 128 298 299 287 280 345 215 288 363 339 102 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_arp.c + + + ICCARM + 317 208 + + + BICOMP + 314 + + + + + ICCARM + 132 130 138 73 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 151 298 299 287 280 345 215 288 363 339 102 + + + BICOMP + 132 130 138 73 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 151 298 299 287 280 345 215 288 363 339 102 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uip_timer.c + + + ICCARM + 209 253 + + + BICOMP + 318 + + + + + ICCARM + 125 70 134 + + + BICOMP + 125 70 134 + + + + + $PROJ_DIR$\..\..\..\..\Source\assert.c + + + ICCARM + 342 340 + + + BICOMP + 341 + + + + + ICCARM + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 + + + BICOMP + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 + + + + + $PROJ_DIR$\..\..\..\..\Source\third_party\uip\uip\uiplib.c + + + ICCARM + 212 210 + + + BICOMP + 316 + + + + + ICCARM + 130 138 73 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 151 137 + + + BICOMP + 130 138 73 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 151 137 + + + + + $PROJ_DIR$\..\..\..\..\Source\backdoor.c + + + ICCARM + 407 369 + + + BICOMP + 277 + + + + + ICCARM + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 + + + BICOMP + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 + + + + + $PROJ_DIR$\..\..\..\..\Source\boot.c + + + ICCARM + 409 370 + + + BICOMP + 297 + + + + + ICCARM + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 + + + BICOMP + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 @@ -1689,21 +1960,21 @@ ICCARM - 114 351 + 157 373 BICOMP - 305 + 327 ICCARM - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 81 93 246 + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 106 117 119 151 BICOMP - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 81 93 246 + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 106 117 119 151 @@ -1712,21 +1983,21 @@ ICCARM - 112 251 + 163 273 BICOMP - 281 + 303 ICCARM - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 BICOMP - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 @@ -1735,21 +2006,21 @@ ICCARM - 109 274 + 408 296 BICOMP - 282 + 304 ICCARM - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 276 277 265 258 323 175 266 341 317 124 147 150 159 119 308 285 284 155 + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 298 299 287 280 345 215 288 363 339 102 187 190 199 161 330 307 306 195 BICOMP - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 276 277 265 258 323 175 266 341 317 124 147 150 159 119 308 285 284 155 + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 298 299 287 280 345 215 288 363 339 102 187 190 199 161 330 307 306 195 @@ -1758,21 +2029,21 @@ ICCARM - 165 291 + 205 313 BICOMP - 156 + 196 ICCARM - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 72 103 232 73 246 105 + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 72 130 138 73 151 132 BICOMP - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 72 103 232 73 246 105 + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 72 130 138 73 151 132 @@ -1781,21 +2052,67 @@ ICCARM - 325 259 + 347 281 BICOMP - 309 + 331 ICCARM - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 BICOMP - 238 91 234 74 247 84 242 88 86 90 236 244 96 94 3 240 249 + 143 115 139 91 152 108 147 112 110 114 141 149 123 121 3 145 154 + + + + + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\option\unicode.c + + + ICCARM + 252 360 + + + BICOMP + 320 + + + + + ICCARM + 158 171 3 295 + + + BICOMP + 158 171 3 295 + + + + + $PROJ_DIR$\..\..\..\..\Source\fatfs\src\ff.c + + + ICCARM + 168 362 + + + BICOMP + 179 + + + + + ICCARM + 158 171 3 256 162 299 287 280 345 215 288 363 + + + BICOMP + 158 171 3 256 162 299 287 280 345 215 288 363 @@ -1804,17 +2121,17 @@ ILINK - 210 + 249 OBJCOPY - 304 + 326 ILINK - 208 318 347 348 225 201 351 251 307 312 340 274 314 350 349 322 121 291 164 161 146 228 230 263 231 167 157 227 267 229 268 269 272 271 273 257 260 262 261 135 343 256 345 219 220 221 223 337 138 336 280 158 252 182 330 173 168 213 170 338 283 259 326 180 122 188 + 250 340 369 370 265 241 373 273 329 334 362 296 336 372 371 344 160 313 204 201 186 268 270 285 271 207 197 267 289 269 290 291 293 292 294 279 282 284 283 175 365 278 367 259 260 261 263 359 178 358 302 198 274 222 352 213 208 253 210 360 393 401 379 380 375 399 394 400 395 396 402 305 281 348 220 159 228 @@ -1823,21 +2140,21 @@ ICCARM - 162 153 + 202 193 BICOMP - 154 + 194 ICCARM - 211 207 10 5 287 277 265 258 323 175 266 341 6 335 321 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 276 317 124 + 251 247 10 5 309 299 287 280 345 215 288 363 6 357 343 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 298 339 102 BICOMP - 211 207 10 5 287 277 265 258 323 175 266 341 6 335 321 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 276 317 124 + 251 247 10 5 309 299 287 280 345 215 288 363 6 357 343 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 298 339 102 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 80b1491d..a7230c5f 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 @@ -165,6 +165,7 @@ @@ -304,6 +305,10 @@ $PROJ_DIR$\..\lib\fatfs $PROJ_DIR$\..\lib\uip $PROJ_DIR$\..\lib\stdperiphlib\STM32F4xx_StdPeriph_Driver\inc + $PROJ_DIR$\..\lib\usbdevicelib\Core\inc + $PROJ_DIR$\..\lib\usbdevicelib\Core\src + $PROJ_DIR$\..\lib\usbotgdriver\inc + $PROJ_DIR$\..\lib\usbotgdriver\src $PROJ_DIR$\..\..\..\..\Source $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32 $PROJ_DIR$\..\..\..\..\Source\third_party\fatfs\src @@ -2086,6 +2091,60 @@ $PROJ_DIR$\..\lib\uip\uip-conf.h + + usbdevicelib + + $PROJ_DIR$\..\lib\usbotgdriver\inc\usb_bsp.h + + + $PROJ_DIR$\..\lib\usbotgdriver\src\usb_core.c + + + $PROJ_DIR$\..\lib\usbotgdriver\inc\usb_core.h + + + $PROJ_DIR$\..\lib\usbotgdriver\src\usb_dcd.c + + + $PROJ_DIR$\..\lib\usbotgdriver\inc\usb_dcd.h + + + $PROJ_DIR$\..\lib\usbotgdriver\src\usb_dcd_int.c + + + $PROJ_DIR$\..\lib\usbotgdriver\inc\usb_dcd_int.h + + + $PROJ_DIR$\..\lib\usbotgdriver\inc\usb_defines.h + + + $PROJ_DIR$\..\lib\usbotgdriver\inc\usb_regs.h + + + $PROJ_DIR$\..\lib\usbdevicelib\Core\src\usbd_core.c + + + $PROJ_DIR$\..\lib\usbdevicelib\Core\inc\usbd_core.h + + + $PROJ_DIR$\..\lib\usbdevicelib\Core\inc\usbd_def.h + + + $PROJ_DIR$\..\lib\usbdevicelib\Core\src\usbd_ioreq.c + + + $PROJ_DIR$\..\lib\usbdevicelib\Core\inc\usbd_ioreq.h + + + $PROJ_DIR$\..\lib\usbdevicelib\Core\src\usbd_req.c + + + $PROJ_DIR$\..\lib\usbdevicelib\Core\inc\usbd_req.h + + + $PROJ_DIR$\..\lib\usbdevicelib\Core\inc\usbd_usr.h + + $PROJ_DIR$\..\blt_conf.h @@ -2096,6 +2155,30 @@ $PROJ_DIR$\..\main.c + + $PROJ_DIR$\..\usb_bsp.c + + + $PROJ_DIR$\..\usb_conf.h + + + $PROJ_DIR$\..\usbd_bulk.c + + + $PROJ_DIR$\..\usbd_bulk.h + + + $PROJ_DIR$\..\usbd_conf.h + + + $PROJ_DIR$\..\usbd_desc.c + + + $PROJ_DIR$\..\usbd_desc.h + + + $PROJ_DIR$\..\usbd_usr.c + Source @@ -2149,6 +2232,12 @@ $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\uart.h + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\usb.c + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM4_STM32\usb.h + third_party diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_core.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_core.h new file mode 100644 index 00000000..e0884cac --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_core.h @@ -0,0 +1,120 @@ +/** + ****************************************************************************** + * @file usbd_core.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief Header file for usbd_core.c + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_CORE_H +#define __USBD_CORE_H + +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd.h" +#include "usbd_def.h" +#include "usbd_conf.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_CORE + * @brief This file is the Header file for usbd_core.c file + * @{ + */ + + +/** @defgroup USBD_CORE_Exported_Defines + * @{ + */ + +typedef enum { + USBD_OK = 0, + USBD_BUSY, + USBD_FAIL, +}USBD_Status; +/** + * @} + */ + + +/** @defgroup USBD_CORE_Exported_TypesDefinitions + * @{ + */ + + +/** + * @} + */ + + + +/** @defgroup USBD_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_FunctionsPrototype + * @{ + */ +void USBD_Init(USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID, + USBD_DEVICE *pDevice, + USBD_Class_cb_TypeDef *class_cb, + USBD_Usr_cb_TypeDef *usr_cb); + +USBD_Status USBD_DeInit(USB_OTG_CORE_HANDLE *pdev); + +USBD_Status USBD_ClrCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx); + +USBD_Status USBD_SetCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx); + +/** + * @} + */ + +#endif /* __USBD_CORE_H */ + +/** + * @} + */ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + + + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_def.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_def.h new file mode 100644 index 00000000..7c0cff76 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_def.h @@ -0,0 +1,156 @@ +/** + ****************************************************************************** + * @file usbd_def.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief general defines for the usb device library + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USBD_DEF_H +#define __USBD_DEF_H + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_conf.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USB_DEF + * @brief general defines for the usb device library file + * @{ + */ + +/** @defgroup USB_DEF_Exported_Defines + * @{ + */ + +#ifndef NULL +#define NULL 0 +#endif + +#define USB_LEN_DEV_QUALIFIER_DESC 0x0A +#define USB_LEN_DEV_DESC 0x12 +#define USB_LEN_CFG_DESC 0x09 +#define USB_LEN_IF_DESC 0x09 +#define USB_LEN_EP_DESC 0x07 +#define USB_LEN_OTG_DESC 0x03 + +#define USBD_IDX_LANGID_STR 0x00 +#define USBD_IDX_MFC_STR 0x01 +#define USBD_IDX_PRODUCT_STR 0x02 +#define USBD_IDX_SERIAL_STR 0x03 +#define USBD_IDX_CONFIG_STR 0x04 +#define USBD_IDX_INTERFACE_STR 0x05 + +#define USB_REQ_TYPE_STANDARD 0x00 +#define USB_REQ_TYPE_CLASS 0x20 +#define USB_REQ_TYPE_VENDOR 0x40 +#define USB_REQ_TYPE_MASK 0x60 + +#define USB_REQ_RECIPIENT_DEVICE 0x00 +#define USB_REQ_RECIPIENT_INTERFACE 0x01 +#define USB_REQ_RECIPIENT_ENDPOINT 0x02 +#define USB_REQ_RECIPIENT_MASK 0x03 + +#define USB_REQ_GET_STATUS 0x00 +#define USB_REQ_CLEAR_FEATURE 0x01 +#define USB_REQ_SET_FEATURE 0x03 +#define USB_REQ_SET_ADDRESS 0x05 +#define USB_REQ_GET_DESCRIPTOR 0x06 +#define USB_REQ_SET_DESCRIPTOR 0x07 +#define USB_REQ_GET_CONFIGURATION 0x08 +#define USB_REQ_SET_CONFIGURATION 0x09 +#define USB_REQ_GET_INTERFACE 0x0A +#define USB_REQ_SET_INTERFACE 0x0B +#define USB_REQ_SYNCH_FRAME 0x0C + +#define USB_DESC_TYPE_DEVICE 1 +#define USB_DESC_TYPE_CONFIGURATION 2 +#define USB_DESC_TYPE_STRING 3 +#define USB_DESC_TYPE_INTERFACE 4 +#define USB_DESC_TYPE_ENDPOINT 5 +#define USB_DESC_TYPE_DEVICE_QUALIFIER 6 +#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 7 + + +#define USB_CONFIG_REMOTE_WAKEUP 2 +#define USB_CONFIG_SELF_POWERED 1 + +#define USB_FEATURE_EP_HALT 0 +#define USB_FEATURE_REMOTE_WAKEUP 1 +#define USB_FEATURE_TEST_MODE 2 + +/** + * @} + */ + + +/** @defgroup USBD_DEF_Exported_TypesDefinitions + * @{ + */ +/** + * @} + */ + + + +/** @defgroup USBD_DEF_Exported_Macros + * @{ + */ +#define SWAPBYTE(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ + (((uint16_t)(*(((uint8_t *)(addr)) + 1))) << 8)) + +#define LOBYTE(x) ((uint8_t)(x & 0x00FF)) +#define HIBYTE(x) ((uint8_t)((x & 0xFF00) >>8)) +/** + * @} + */ + +/** @defgroup USBD_DEF_Exported_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_DEF_Exported_FunctionsPrototype + * @{ + */ + +/** + * @} + */ + +#endif /* __USBD_DEF_H */ + +/** + * @} + */ + +/** +* @} +*/ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_ioreq.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_ioreq.h new file mode 100644 index 00000000..3f6aea1a --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_ioreq.h @@ -0,0 +1,121 @@ +/** + ****************************************************************************** + * @file usbd_ioreq.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief header file for the usbd_ioreq.c file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USBD_IOREQ_H_ +#define __USBD_IOREQ_H_ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" +#include "usbd_core.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_IOREQ + * @brief header file for the usbd_ioreq.c file + * @{ + */ + +/** @defgroup USBD_IOREQ_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Exported_Types + * @{ + */ + + +/** + * @} + */ + + + +/** @defgroup USBD_IOREQ_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_IOREQ_Exported_Variables + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_IOREQ_Exported_FunctionsPrototype + * @{ + */ + +USBD_Status USBD_CtlSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *buf, + uint16_t len); + +USBD_Status USBD_CtlContinueSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len); + +USBD_Status USBD_CtlPrepareRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len); + +USBD_Status USBD_CtlContinueRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len); + +USBD_Status USBD_CtlSendStatus (USB_OTG_CORE_HANDLE *pdev); + +USBD_Status USBD_CtlReceiveStatus (USB_OTG_CORE_HANDLE *pdev); + +uint16_t USBD_GetRxCount (USB_OTG_CORE_HANDLE *pdev , + uint8_t epnum); + +/** + * @} + */ + +#endif /* __USBD_IOREQ_H_ */ + +/** + * @} + */ + +/** +* @} +*/ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_req.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_req.h new file mode 100644 index 00000000..f88416df --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_req.h @@ -0,0 +1,108 @@ +/** + ****************************************************************************** + * @file usbd_req.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief header file for the usbd_req.c file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USB_REQUEST_H_ +#define __USB_REQUEST_H_ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" +#include "usbd_core.h" +#include "usbd_conf.h" + + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USBD_REQ + * @brief header file for the usbd_ioreq.c file + * @{ + */ + +/** @defgroup USBD_REQ_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_REQ_Exported_Types + * @{ + */ +/** + * @} + */ + + + +/** @defgroup USBD_REQ_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_REQ_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_REQ_Exported_FunctionsPrototype + * @{ + */ + +USBD_Status USBD_StdDevReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req); +USBD_Status USBD_StdItfReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req); +USBD_Status USBD_StdEPReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req); +void USBD_ParseSetupRequest( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +void USBD_CtlError( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len); +/** + * @} + */ + +#endif /* __USB_REQUEST_H_ */ + +/** + * @} + */ + +/** +* @} +*/ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_usr.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_usr.h new file mode 100644 index 00000000..bd5ff3e2 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_usr.h @@ -0,0 +1,141 @@ +/** + ****************************************************************************** + * @file usbd_usr.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief Header file for usbd_usr.c + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_USR_H__ +#define __USBD_USR_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_core.h" + + +/** @addtogroup USBD_USER + * @{ + */ + +/** @addtogroup USBD_MSC_DEMO_USER_CALLBACKS + * @{ + */ + +/** @defgroup USBD_USR + * @brief This file is the Header file for usbd_usr.c + * @{ + */ + + +/** @defgroup USBD_USR_Exported_Types + * @{ + */ + +extern USBD_Usr_cb_TypeDef USR_cb; +extern USBD_Usr_cb_TypeDef USR_FS_cb; +extern USBD_Usr_cb_TypeDef USR_HS_cb; + + + +/** + * @} + */ + + + +/** @defgroup USBD_USR_Exported_Defines + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_USR_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_USR_Exported_Variables + * @{ + */ + +void USBD_USR_Init(void); +void USBD_USR_DeviceReset (uint8_t speed); +void USBD_USR_DeviceConfigured (void); +void USBD_USR_DeviceSuspended(void); +void USBD_USR_DeviceResumed(void); + +void USBD_USR_DeviceConnected(void); +void USBD_USR_DeviceDisconnected(void); + +void USBD_USR_FS_Init(void); +void USBD_USR_FS_DeviceReset (uint8_t speed); +void USBD_USR_FS_DeviceConfigured (void); +void USBD_USR_FS_DeviceSuspended(void); +void USBD_USR_FS_DeviceResumed(void); + +void USBD_USR_FS_DeviceConnected(void); +void USBD_USR_FS_DeviceDisconnected(void); + +void USBD_USR_HS_Init(void); +void USBD_USR_HS_DeviceReset (uint8_t speed); +void USBD_USR_HS_DeviceConfigured (void); +void USBD_USR_HS_DeviceSuspended(void); +void USBD_USR_HS_DeviceResumed(void); + +void USBD_USR_HS_DeviceConnected(void); +void USBD_USR_HS_DeviceDisconnected(void); + +/** + * @} + */ + +/** @defgroup USBD_USR_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + +#endif /*__USBD_USR_H__*/ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + + + + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/src/usbd_core.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/src/usbd_core.c new file mode 100644 index 00000000..fa647eb0 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/src/usbd_core.c @@ -0,0 +1,506 @@ +/** + ****************************************************************************** + * @file usbd_core.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file provides all the USBD core functions. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_core.h" +#include "usbd_req.h" +#include "usbd_ioreq.h" +#include "usb_dcd_int.h" +#include "usb_bsp.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY +* @{ +*/ + + +/** @defgroup USBD_CORE +* @brief usbd core module +* @{ +*/ + +/** @defgroup USBD_CORE_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USBD_CORE_Private_Defines +* @{ +*/ + +/** +* @} +*/ + + +/** @defgroup USBD_CORE_Private_Macros +* @{ +*/ +/** +* @} +*/ + + + + +/** @defgroup USBD_CORE_Private_FunctionPrototypes +* @{ +*/ +static uint8_t USBD_SetupStage(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); +static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); +static uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev); +#ifdef VBUS_SENSING_ENABLED +static uint8_t USBD_DevConnected(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_DevDisconnected(USB_OTG_CORE_HANDLE *pdev); +#endif +static uint8_t USBD_IsoINIncomplete(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_IsoOUTIncomplete(USB_OTG_CORE_HANDLE *pdev); +static uint8_t USBD_RunTestMode (USB_OTG_CORE_HANDLE *pdev) ; +/** +* @} +*/ + +/** @defgroup USBD_CORE_Private_Variables +* @{ +*/ + +__IO USB_OTG_DCTL_TypeDef SET_TEST_MODE; + +USBD_DCD_INT_cb_TypeDef USBD_DCD_INT_cb = +{ + USBD_DataOutStage, + USBD_DataInStage, + USBD_SetupStage, + USBD_SOF, + USBD_Reset, + USBD_Suspend, + USBD_Resume, + USBD_IsoINIncomplete, + USBD_IsoOUTIncomplete, +#ifdef VBUS_SENSING_ENABLED +USBD_DevConnected, +USBD_DevDisconnected, +#endif +}; + +USBD_DCD_INT_cb_TypeDef *USBD_DCD_INT_fops = &USBD_DCD_INT_cb; +/** +* @} +*/ + +/** @defgroup USBD_CORE_Private_Functions +* @{ +*/ + +/** +* @brief USBD_Init +* Initailizes the device stack and load the class driver +* @param pdev: device instance +* @param core_address: USB OTG core ID +* @param class_cb: Class callback structure address +* @param usr_cb: User callback structure address +* @retval None +*/ +void USBD_Init(USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID, + USBD_DEVICE *pDevice, + USBD_Class_cb_TypeDef *class_cb, + USBD_Usr_cb_TypeDef *usr_cb) +{ + /* Hardware Init */ + USB_OTG_BSP_Init(pdev); + + USBD_DeInit(pdev); + + /*Register class and user callbacks */ + pdev->dev.class_cb = class_cb; + pdev->dev.usr_cb = usr_cb; + pdev->dev.usr_device = pDevice; + + /* set USB OTG core params */ + DCD_Init(pdev , coreID); + + /* Upon Init call usr callback */ + pdev->dev.usr_cb->Init(); + + /* Enable Interrupts */ + USB_OTG_BSP_EnableInterrupt(pdev); +} + +/** +* @brief USBD_DeInit +* Re-Initialize th device library +* @param pdev: device instance +* @retval status: status +*/ +USBD_Status USBD_DeInit(USB_OTG_CORE_HANDLE *pdev) +{ + /* Software Init */ + + return USBD_OK; +} + +/** +* @brief USBD_SetupStage +* Handle the setup stage +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_SetupStage(USB_OTG_CORE_HANDLE *pdev) +{ + USB_SETUP_REQ req; + + USBD_ParseSetupRequest(pdev , &req); + + switch (req.bmRequest & 0x1F) + { + case USB_REQ_RECIPIENT_DEVICE: + USBD_StdDevReq (pdev, &req); + break; + + case USB_REQ_RECIPIENT_INTERFACE: + USBD_StdItfReq(pdev, &req); + break; + + case USB_REQ_RECIPIENT_ENDPOINT: + USBD_StdEPReq(pdev, &req); + break; + + default: + DCD_EP_Stall(pdev , req.bmRequest & 0x80); + break; + } + return USBD_OK; +} + +/** +* @brief USBD_DataOutStage +* Handle data out stage +* @param pdev: device instance +* @param epnum: endpoint index +* @retval status +*/ +static uint8_t USBD_DataOutStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + USB_OTG_EP *ep; + + if(epnum == 0) + { + ep = &pdev->dev.out_ep[0]; + if ( pdev->dev.device_state == USB_OTG_EP0_DATA_OUT) + { + if(ep->rem_data_len > ep->maxpacket) + { + ep->rem_data_len -= ep->maxpacket; + + if(pdev->cfg.dma_enable == 1) + { + /* in slave mode this, is handled by the RxSTSQLvl ISR */ + ep->xfer_buff += ep->maxpacket; + } + USBD_CtlContinueRx (pdev, + ep->xfer_buff, + MIN(ep->rem_data_len ,ep->maxpacket)); + } + else + { + if((pdev->dev.class_cb->EP0_RxReady != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->EP0_RxReady(pdev); + } + USBD_CtlSendStatus(pdev); + } + } + } + else if((pdev->dev.class_cb->DataOut != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->DataOut(pdev, epnum); + } + return USBD_OK; +} + +/** +* @brief USBD_DataInStage +* Handle data in stage +* @param pdev: device instance +* @param epnum: endpoint index +* @retval status +*/ +static uint8_t USBD_DataInStage(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + USB_OTG_EP *ep; + + if(epnum == 0) + { + ep = &pdev->dev.in_ep[0]; + if ( pdev->dev.device_state == USB_OTG_EP0_DATA_IN) + { + if(ep->rem_data_len > ep->maxpacket) + { + ep->rem_data_len -= ep->maxpacket; + if(pdev->cfg.dma_enable == 1) + { + /* in slave mode this, is handled by the TxFifoEmpty ISR */ + ep->xfer_buff += ep->maxpacket; + } + USBD_CtlContinueSendData (pdev, + ep->xfer_buff, + ep->rem_data_len); + } + else + { /* last packet is MPS multiple, so send ZLP packet */ + if((ep->total_data_len % ep->maxpacket == 0) && + (ep->total_data_len >= ep->maxpacket) && + (ep->total_data_len < ep->ctl_data_len )) + { + + USBD_CtlContinueSendData(pdev , NULL, 0); + ep->ctl_data_len = 0; + } + else + { + if((pdev->dev.class_cb->EP0_TxSent != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->EP0_TxSent(pdev); + } + USBD_CtlReceiveStatus(pdev); + } + } + } + if (pdev->dev.test_mode == 1) + { + USBD_RunTestMode(pdev); + pdev->dev.test_mode = 0; + } + } + else if((pdev->dev.class_cb->DataIn != NULL)&& + (pdev->dev.device_status == USB_OTG_CONFIGURED)) + { + pdev->dev.class_cb->DataIn(pdev, epnum); + } + return USBD_OK; +} + + + + +/** +* @brief USBD_RunTestMode +* Launch test mode process +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_RunTestMode (USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, SET_TEST_MODE.d32); + return USBD_OK; +} + +/** +* @brief USBD_Reset +* Handle Reset event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_Reset(USB_OTG_CORE_HANDLE *pdev) +{ + /* Open EP0 OUT */ + DCD_EP_Open(pdev, + 0x00, + USB_OTG_MAX_EP0_SIZE, + EP_TYPE_CTRL); + + /* Open EP0 IN */ + DCD_EP_Open(pdev, + 0x80, + USB_OTG_MAX_EP0_SIZE, + EP_TYPE_CTRL); + + /* Upon Reset call usr call back */ + pdev->dev.device_status = USB_OTG_DEFAULT; + pdev->dev.usr_cb->DeviceReset(pdev->cfg.speed); + + return USBD_OK; +} + +/** +* @brief USBD_Resume +* Handle Resume event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_Resume(USB_OTG_CORE_HANDLE *pdev) +{ + /* Upon Resume call usr call back */ + pdev->dev.usr_cb->DeviceResumed(); + pdev->dev.device_status = pdev->dev.device_old_status; + pdev->dev.device_status = USB_OTG_CONFIGURED; + return USBD_OK; +} + + +/** +* @brief USBD_Suspend +* Handle Suspend event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_Suspend(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.device_old_status = pdev->dev.device_status; + pdev->dev.device_status = USB_OTG_SUSPENDED; + /* Upon Resume call usr call back */ + pdev->dev.usr_cb->DeviceSuspended(); + return USBD_OK; +} + + +/** +* @brief USBD_SOF +* Handle SOF event +* @param pdev: device instance +* @retval status +*/ + +static uint8_t USBD_SOF(USB_OTG_CORE_HANDLE *pdev) +{ + if(pdev->dev.class_cb->SOF) + { + pdev->dev.class_cb->SOF(pdev); + } + return USBD_OK; +} +/** +* @brief USBD_SetCfg +* Configure device and start the interface +* @param pdev: device instance +* @param cfgidx: configuration index +* @retval status +*/ + +USBD_Status USBD_SetCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx) +{ + pdev->dev.class_cb->Init(pdev, cfgidx); + + /* Upon set config call usr call back */ + pdev->dev.usr_cb->DeviceConfigured(); + return USBD_OK; +} + +/** +* @brief USBD_ClrCfg +* Clear current configuration +* @param pdev: device instance +* @param cfgidx: configuration index +* @retval status: USBD_Status +*/ +USBD_Status USBD_ClrCfg(USB_OTG_CORE_HANDLE *pdev, uint8_t cfgidx) +{ + pdev->dev.class_cb->DeInit(pdev, cfgidx); + return USBD_OK; +} + +/** +* @brief USBD_IsoINIncomplete +* Handle iso in incomplete event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_IsoINIncomplete(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.class_cb->IsoINIncomplete(pdev); + return USBD_OK; +} + +/** +* @brief USBD_IsoOUTIncomplete +* Handle iso out incomplete event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_IsoOUTIncomplete(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.class_cb->IsoOUTIncomplete(pdev); + return USBD_OK; +} + +#ifdef VBUS_SENSING_ENABLED +/** +* @brief USBD_DevConnected +* Handle device connection event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_DevConnected(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.usr_cb->DeviceConnected(); + pdev->dev.connection_status = 1; + return USBD_OK; +} + +/** +* @brief USBD_DevDisconnected +* Handle device disconnection event +* @param pdev: device instance +* @retval status +*/ +static uint8_t USBD_DevDisconnected(USB_OTG_CORE_HANDLE *pdev) +{ + pdev->dev.usr_cb->DeviceDisconnected(); + pdev->dev.class_cb->DeInit(pdev, 0); + pdev->dev.connection_status = 0; + return USBD_OK; +} +#endif +/** +* @} +*/ + + +/** +* @} +*/ + + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/src/usbd_ioreq.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/src/usbd_ioreq.c new file mode 100644 index 00000000..a9e4a863 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/src/usbd_ioreq.c @@ -0,0 +1,244 @@ +/** + ****************************************************************************** + * @file usbd_ioreq.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file provides the IO requests APIs for control endpoints. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_ioreq.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_IOREQ + * @brief control I/O requests module + * @{ + */ + +/** @defgroup USBD_IOREQ_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Variables + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_FunctionPrototypes + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_IOREQ_Private_Functions + * @{ + */ + +/** +* @brief USBD_CtlSendData +* send data on the ctl pipe +* @param pdev: device instance +* @param buff: pointer to data buffer +* @param len: length of data to be sent +* @retval status +*/ +USBD_Status USBD_CtlSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + pdev->dev.in_ep[0].total_data_len = len; + pdev->dev.in_ep[0].rem_data_len = len; + pdev->dev.device_state = USB_OTG_EP0_DATA_IN; + + DCD_EP_Tx (pdev, 0, pbuf, len); + + return ret; +} + +/** +* @brief USBD_CtlContinueSendData +* continue sending data on the ctl pipe +* @param pdev: device instance +* @param buff: pointer to data buffer +* @param len: length of data to be sent +* @retval status +*/ +USBD_Status USBD_CtlContinueSendData (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + DCD_EP_Tx (pdev, 0, pbuf, len); + + + return ret; +} + +/** +* @brief USBD_CtlPrepareRx +* receive data on the ctl pipe +* @param pdev: USB OTG device instance +* @param buff: pointer to data buffer +* @param len: length of data to be received +* @retval status +*/ +USBD_Status USBD_CtlPrepareRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + pdev->dev.out_ep[0].total_data_len = len; + pdev->dev.out_ep[0].rem_data_len = len; + pdev->dev.device_state = USB_OTG_EP0_DATA_OUT; + + DCD_EP_PrepareRx (pdev, + 0, + pbuf, + len); + + + return ret; +} + +/** +* @brief USBD_CtlContinueRx +* continue receive data on the ctl pipe +* @param pdev: USB OTG device instance +* @param buff: pointer to data buffer +* @param len: length of data to be received +* @retval status +*/ +USBD_Status USBD_CtlContinueRx (USB_OTG_CORE_HANDLE *pdev, + uint8_t *pbuf, + uint16_t len) +{ + USBD_Status ret = USBD_OK; + + DCD_EP_PrepareRx (pdev, + 0, + pbuf, + len); + return ret; +} +/** +* @brief USBD_CtlSendStatus +* send zero lzngth packet on the ctl pipe +* @param pdev: USB OTG device instance +* @retval status +*/ +USBD_Status USBD_CtlSendStatus (USB_OTG_CORE_HANDLE *pdev) +{ + USBD_Status ret = USBD_OK; + pdev->dev.device_state = USB_OTG_EP0_STATUS_IN; + DCD_EP_Tx (pdev, + 0, + NULL, + 0); + + USB_OTG_EP0_OutStart(pdev); + + return ret; +} + +/** +* @brief USBD_CtlReceiveStatus +* receive zero lzngth packet on the ctl pipe +* @param pdev: USB OTG device instance +* @retval status +*/ +USBD_Status USBD_CtlReceiveStatus (USB_OTG_CORE_HANDLE *pdev) +{ + USBD_Status ret = USBD_OK; + pdev->dev.device_state = USB_OTG_EP0_STATUS_OUT; + DCD_EP_PrepareRx ( pdev, + 0, + NULL, + 0); + + USB_OTG_EP0_OutStart(pdev); + + return ret; +} + + +/** +* @brief USBD_GetRxCount +* returns the received data length +* @param pdev: USB OTG device instance +* epnum: endpoint index +* @retval Rx Data blength +*/ +uint16_t USBD_GetRxCount (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + return pdev->dev.out_ep[epnum].xfer_count; +} + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/src/usbd_req.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/src/usbd_req.c new file mode 100644 index 00000000..f954bd9a --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/src/usbd_req.c @@ -0,0 +1,868 @@ +/** + ****************************************************************************** + * @file usbd_req.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file provides the standard USB requests following chapter 9. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_req.h" +#include "usbd_ioreq.h" +#include "usbd_desc.h" + + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_REQ + * @brief USB standard requests module + * @{ + */ + +/** @defgroup USBD_REQ_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Defines + * @{ + */ + +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Variables + * @{ + */ +extern __IO USB_OTG_DCTL_TypeDef SET_TEST_MODE; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint32_t USBD_ep_status __ALIGN_END = 0; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint32_t USBD_default_cfg __ALIGN_END = 0; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint32_t USBD_cfg_status __ALIGN_END = 0; + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined ( __ICCARM__ ) /*!< IAR Compiler */ + #pragma data_alignment=4 + #endif +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ +__ALIGN_BEGIN uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ] __ALIGN_END ; +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_FunctionPrototypes + * @{ + */ +static void USBD_GetDescriptor(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_SetAddress(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_SetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_GetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_GetStatus(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_SetFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static void USBD_ClrFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req); + +static uint8_t USBD_GetLen(uint8_t *buf); +/** + * @} + */ + + +/** @defgroup USBD_REQ_Private_Functions + * @{ + */ + + +/** +* @brief USBD_StdDevReq +* Handle standard usb device requests +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +USBD_Status USBD_StdDevReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req) +{ + USBD_Status ret = USBD_OK; + + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + + USBD_GetDescriptor (pdev, req) ; + break; + + case USB_REQ_SET_ADDRESS: + USBD_SetAddress(pdev, req); + break; + + case USB_REQ_SET_CONFIGURATION: + USBD_SetConfig (pdev , req); + break; + + case USB_REQ_GET_CONFIGURATION: + USBD_GetConfig (pdev , req); + break; + + case USB_REQ_GET_STATUS: + USBD_GetStatus (pdev , req); + break; + + + case USB_REQ_SET_FEATURE: + USBD_SetFeature (pdev , req); + break; + + case USB_REQ_CLEAR_FEATURE: + USBD_ClrFeature (pdev , req); + break; + + default: + USBD_CtlError(pdev , req); + break; + } + + return ret; +} + +/** +* @brief USBD_StdItfReq +* Handle standard usb interface requests +* @param pdev: USB OTG device instance +* @param req: usb request +* @retval status +*/ +USBD_Status USBD_StdItfReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req) +{ + USBD_Status ret = USBD_OK; + + switch (pdev->dev.device_status) + { + case USB_OTG_CONFIGURED: + + if (LOBYTE(req->wIndex) <= USBD_ITF_MAX_NUM) + { + pdev->dev.class_cb->Setup (pdev, req); + + if((req->wLength == 0)&& (ret == USBD_OK)) + { + USBD_CtlSendStatus(pdev); + } + } + else + { + USBD_CtlError(pdev , req); + } + break; + + default: + USBD_CtlError(pdev , req); + break; + } + return ret; +} + +/** +* @brief USBD_StdEPReq +* Handle standard usb endpoint requests +* @param pdev: USB OTG device instance +* @param req: usb request +* @retval status +*/ +USBD_Status USBD_StdEPReq (USB_OTG_CORE_HANDLE *pdev, USB_SETUP_REQ *req) +{ + + uint8_t ep_addr; + USBD_Status ret = USBD_OK; + + ep_addr = LOBYTE(req->wIndex); + + switch (req->bRequest) + { + + case USB_REQ_SET_FEATURE : + + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + } + break; + + case USB_OTG_CONFIGURED: + if (req->wValue == USB_FEATURE_EP_HALT) + { + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + + } + } + pdev->dev.class_cb->Setup (pdev, req); + USBD_CtlSendStatus(pdev); + + break; + + default: + USBD_CtlError(pdev , req); + break; + } + break; + + case USB_REQ_CLEAR_FEATURE : + + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + } + break; + + case USB_OTG_CONFIGURED: + if (req->wValue == USB_FEATURE_EP_HALT) + { + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_ClrStall(pdev , ep_addr); + pdev->dev.class_cb->Setup (pdev, req); + } + USBD_CtlSendStatus(pdev); + } + break; + + default: + USBD_CtlError(pdev , req); + break; + } + break; + + case USB_REQ_GET_STATUS: + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if ((ep_addr != 0x00) && (ep_addr != 0x80)) + { + DCD_EP_Stall(pdev , ep_addr); + } + break; + + case USB_OTG_CONFIGURED: + + + if ((ep_addr & 0x80)== 0x80) + { + if(pdev->dev.in_ep[ep_addr & 0x7F].is_stall) + { + USBD_ep_status = 0x0001; + } + else + { + USBD_ep_status = 0x0000; + } + } + else if ((ep_addr & 0x80)== 0x00) + { + if(pdev->dev.out_ep[ep_addr].is_stall) + { + USBD_ep_status = 0x0001; + } + + else + { + USBD_ep_status = 0x0000; + } + } + USBD_CtlSendData (pdev, + (uint8_t *)&USBD_ep_status, + 2); + break; + + default: + USBD_CtlError(pdev , req); + break; + } + break; + + default: + break; + } + return ret; +} +/** +* @brief USBD_GetDescriptor +* Handle Get Descriptor requests +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_GetDescriptor(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + uint16_t len; + uint8_t *pbuf; + + + switch (req->wValue >> 8) + { + case USB_DESC_TYPE_DEVICE: + pbuf = pdev->dev.usr_device->GetDeviceDescriptor(pdev->cfg.speed, &len); + if ((req->wLength == 64) ||( pdev->dev.device_status == USB_OTG_DEFAULT)) + { + len = 8; + } + break; + + case USB_DESC_TYPE_CONFIGURATION: + pbuf = (uint8_t *)pdev->dev.class_cb->GetConfigDescriptor(pdev->cfg.speed, &len); +#ifdef USB_OTG_HS_CORE + if((pdev->cfg.speed == USB_OTG_SPEED_FULL )&& + (pdev->cfg.phy_itface == USB_OTG_ULPI_PHY)) + { + pbuf = (uint8_t *)pdev->dev.class_cb->GetOtherConfigDescriptor(pdev->cfg.speed, &len); + } +#endif + pbuf[1] = USB_DESC_TYPE_CONFIGURATION; + pdev->dev.pConfig_descriptor = pbuf; + break; + + case USB_DESC_TYPE_STRING: + switch ((uint8_t)(req->wValue)) + { + case USBD_IDX_LANGID_STR: + pbuf = pdev->dev.usr_device->GetLangIDStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_MFC_STR: + pbuf = pdev->dev.usr_device->GetManufacturerStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_PRODUCT_STR: + pbuf = pdev->dev.usr_device->GetProductStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_SERIAL_STR: + pbuf = pdev->dev.usr_device->GetSerialStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_CONFIG_STR: + pbuf = pdev->dev.usr_device->GetConfigurationStrDescriptor(pdev->cfg.speed, &len); + break; + + case USBD_IDX_INTERFACE_STR: + pbuf = pdev->dev.usr_device->GetInterfaceStrDescriptor(pdev->cfg.speed, &len); + break; + + default: +#ifdef USB_SUPPORT_USER_STRING_DESC + pbuf = pdev->dev.class_cb->GetUsrStrDescriptor(pdev->cfg.speed, (req->wValue) , &len); + break; +#else + USBD_CtlError(pdev , req); + return; +#endif /* USBD_CtlError(pdev , req); */ + } + break; + case USB_DESC_TYPE_DEVICE_QUALIFIER: +#ifdef USB_OTG_HS_CORE + if(pdev->cfg.speed == USB_OTG_SPEED_HIGH ) + { + + pbuf = (uint8_t *)pdev->dev.class_cb->GetConfigDescriptor(pdev->cfg.speed, &len); + + USBD_DeviceQualifierDesc[4]= pbuf[14]; + USBD_DeviceQualifierDesc[5]= pbuf[15]; + USBD_DeviceQualifierDesc[6]= pbuf[16]; + + pbuf = USBD_DeviceQualifierDesc; + len = USB_LEN_DEV_QUALIFIER_DESC; + break; + } + else + { + USBD_CtlError(pdev , req); + return; + } +#else + USBD_CtlError(pdev , req); + return; +#endif + + case USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION: +#ifdef USB_OTG_HS_CORE + + if(pdev->cfg.speed == USB_OTG_SPEED_HIGH ) + { + pbuf = (uint8_t *)pdev->dev.class_cb->GetOtherConfigDescriptor(pdev->cfg.speed, &len); + pbuf[1] = USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION; + break; + } + else + { + USBD_CtlError(pdev , req); + return; + } +#else + USBD_CtlError(pdev , req); + return; +#endif + + + default: + USBD_CtlError(pdev , req); + return; + } + + if((len != 0)&& (req->wLength != 0)) + { + + len = MIN(len , req->wLength); + + USBD_CtlSendData (pdev, + pbuf, + len); + } + +} + +/** +* @brief USBD_SetAddress +* Set device address +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_SetAddress(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + uint8_t dev_addr; + + if ((req->wIndex == 0) && (req->wLength == 0)) + { + dev_addr = (uint8_t)(req->wValue) & 0x7F; + + if (pdev->dev.device_status == USB_OTG_CONFIGURED) + { + USBD_CtlError(pdev , req); + } + else + { + pdev->dev.device_address = dev_addr; + DCD_EP_SetAddress(pdev, dev_addr); + USBD_CtlSendStatus(pdev); + + if (dev_addr != 0) + { + pdev->dev.device_status = USB_OTG_ADDRESSED; + } + else + { + pdev->dev.device_status = USB_OTG_DEFAULT; + } + } + } + else + { + USBD_CtlError(pdev , req); + } +} + +/** +* @brief USBD_SetConfig +* Handle Set device configuration request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_SetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + static uint8_t cfgidx; + + cfgidx = (uint8_t)(req->wValue); + + if (cfgidx > USBD_CFG_MAX_NUM ) + { + USBD_CtlError(pdev , req); + } + else + { + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + if (cfgidx) + { + pdev->dev.device_config = cfgidx; + pdev->dev.device_status = USB_OTG_CONFIGURED; + USBD_SetCfg(pdev , cfgidx); + USBD_CtlSendStatus(pdev); + } + else + { + USBD_CtlSendStatus(pdev); + } + break; + + case USB_OTG_CONFIGURED: + if (cfgidx == 0) + { + pdev->dev.device_status = USB_OTG_ADDRESSED; + pdev->dev.device_config = cfgidx; + USBD_ClrCfg(pdev , cfgidx); + USBD_CtlSendStatus(pdev); + + } + else if (cfgidx != pdev->dev.device_config) + { + /* Clear old configuration */ + USBD_ClrCfg(pdev , pdev->dev.device_config); + + /* set new configuration */ + pdev->dev.device_config = cfgidx; + USBD_SetCfg(pdev , cfgidx); + USBD_CtlSendStatus(pdev); + } + else + { + USBD_CtlSendStatus(pdev); + } + break; + + default: + USBD_CtlError(pdev , req); + break; + } + } +} + +/** +* @brief USBD_GetConfig +* Handle Get device configuration request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_GetConfig(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + if (req->wLength != 1) + { + USBD_CtlError(pdev , req); + } + else + { + switch (pdev->dev.device_status ) + { + case USB_OTG_ADDRESSED: + + USBD_CtlSendData (pdev, + (uint8_t *)&USBD_default_cfg, + 1); + break; + + case USB_OTG_CONFIGURED: + + USBD_CtlSendData (pdev, + &pdev->dev.device_config, + 1); + break; + + default: + USBD_CtlError(pdev , req); + break; + } + } +} + +/** +* @brief USBD_GetStatus +* Handle Get Status request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_GetStatus(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + case USB_OTG_CONFIGURED: + +#ifdef USBD_SELF_POWERED + USBD_cfg_status = USB_CONFIG_SELF_POWERED; +#else + USBD_cfg_status = 0x00; +#endif + + if (pdev->dev.DevRemoteWakeup) + { + USBD_cfg_status |= USB_CONFIG_REMOTE_WAKEUP; + } + + USBD_CtlSendData (pdev, + (uint8_t *)&USBD_cfg_status, + 2); + break; + + default : + USBD_CtlError(pdev , req); + break; + } +} + + +/** +* @brief USBD_SetFeature +* Handle Set device feature request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_SetFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + USB_OTG_DCTL_TypeDef dctl; + uint8_t test_mode = 0; + + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) + { + pdev->dev.DevRemoteWakeup = 1; + pdev->dev.class_cb->Setup (pdev, req); + USBD_CtlSendStatus(pdev); + } + + else if ((req->wValue == USB_FEATURE_TEST_MODE) && + ((req->wIndex & 0xFF) == 0)) + { + dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL); + + test_mode = req->wIndex >> 8; + switch (test_mode) + { + case 1: // TEST_J + dctl.b.tstctl = 1; + break; + + case 2: // TEST_K + dctl.b.tstctl = 2; + break; + + case 3: // TEST_SE0_NAK + dctl.b.tstctl = 3; + break; + + case 4: // TEST_PACKET + dctl.b.tstctl = 4; + break; + + case 5: // TEST_FORCE_ENABLE + dctl.b.tstctl = 5; + break; + } + SET_TEST_MODE = dctl; + pdev->dev.test_mode = 1; + USBD_CtlSendStatus(pdev); + } + +} + + +/** +* @brief USBD_ClrFeature +* Handle clear device feature request +* @param pdev: device instance +* @param req: usb request +* @retval status +*/ +static void USBD_ClrFeature(USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + switch (pdev->dev.device_status) + { + case USB_OTG_ADDRESSED: + case USB_OTG_CONFIGURED: + if (req->wValue == USB_FEATURE_REMOTE_WAKEUP) + { + pdev->dev.DevRemoteWakeup = 0; + pdev->dev.class_cb->Setup (pdev, req); + USBD_CtlSendStatus(pdev); + } + break; + + default : + USBD_CtlError(pdev , req); + break; + } +} + +/** +* @brief USBD_ParseSetupRequest +* Copy buffer into setup structure +* @param pdev: device instance +* @param req: usb request +* @retval None +*/ + +void USBD_ParseSetupRequest( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + req->bmRequest = *(uint8_t *) (pdev->dev.setup_packet); + req->bRequest = *(uint8_t *) (pdev->dev.setup_packet + 1); + req->wValue = SWAPBYTE (pdev->dev.setup_packet + 2); + req->wIndex = SWAPBYTE (pdev->dev.setup_packet + 4); + req->wLength = SWAPBYTE (pdev->dev.setup_packet + 6); + + pdev->dev.in_ep[0].ctl_data_len = req->wLength ; + pdev->dev.device_state = USB_OTG_EP0_SETUP; +} + +/** +* @brief USBD_CtlError +* Handle USB low level Error +* @param pdev: device instance +* @param req: usb request +* @retval None +*/ + +void USBD_CtlError( USB_OTG_CORE_HANDLE *pdev, + USB_SETUP_REQ *req) +{ + + DCD_EP_Stall(pdev , 0x80); + DCD_EP_Stall(pdev , 0); + USB_OTG_EP0_OutStart(pdev); +} + + +/** + * @brief USBD_GetString + * Convert Ascii string into unicode one + * @param desc : descriptor buffer + * @param unicode : Formatted string buffer (unicode) + * @param len : descriptor length + * @retval None + */ +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) +{ + uint8_t idx = 0; + + if (desc != NULL) + { + *len = USBD_GetLen(desc) * 2 + 2; + unicode[idx++] = *len; + unicode[idx++] = USB_DESC_TYPE_STRING; + + while (*desc != NULL) + { + unicode[idx++] = *desc++; + unicode[idx++] = 0x00; + } + } +} + +/** + * @brief USBD_GetLen + * return the string length + * @param buf : pointer to the ascii string buffer + * @retval string length + */ +static uint8_t USBD_GetLen(uint8_t *buf) +{ + uint8_t len = 0; + + while (*buf != NULL) + { + len++; + buf++; + } + + return len; +} +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Release_Notes.html b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Release_Notes.html new file mode 100644 index 00000000..60f8ab87 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Release_Notes.html @@ -0,0 +1,950 @@ + + + + + + + + +Release Notes for STM32F105/7xx, STM32F2xx and STM32F4xx USB Device Library + + + + + +
+ +

 

+ +
+ + + + + +
+ + + + + + + +
+

Back to Release page

+
+

Release Notes for STM32F105/7xx, STM32F2xx and STM32F4xx USB Device Library

+

Copyright + 2012 STMicroelectronics

+

+
+

 

+ + + + +
+

Contents

+
    +
  1. Update History
  2. +
  3. License
  4. +
+

Update History

V1.1.0 / 19-March-2012

+

Main +Changes

+ +
  • Official support of STM32F4xx devices
  • All source files: license disclaimer text update and add link to the License file on ST Internet.
  • Handle test mode in the set feature request
  • Handle dynamically the USB SELF POWERED feature
  • Handle correctly the USBD_CtlError process to take into account error during Control OUT stage
  • Miscellaneous bug fix

V1.0.0 / 22-July-2011

Main +Changes

+
  • First official version for STM32F105/7xx and STM32F2xx devices

+

License

+

Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); You may not use this package except in compliance with the License. You may obtain a copy of the License at:


Unless +required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See +the License for the specific language governing permissions and +limitations under the License.
+
+
+
+

For + complete documentation on STM32 + Microcontrollers visit www.st.com/STM32

+
+

+
+ +
+ +

 

+ +
+ + \ No newline at end of file diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/Release_Notes.html b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/Release_Notes.html new file mode 100644 index 00000000..1116edd3 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/Release_Notes.html @@ -0,0 +1,950 @@ + + + + + + + + +Release Notes for STM32F105/7xx, STM32F2xx and STM32F4xx USB OTG Driver + + + + + +
+ +

 

+ +
+ + + + + +
+ + + + + + + +
+

Back to Release page

+
+

Release Notes for STM32F105/7xx, STM32F2xx and STM32F4xx USB OTG Driver

+

Copyright + 2012 STMicroelectronics

+

+
+

 

+ + + + +
+

Contents

+
    +
  1. Update History
  2. +
  3. License
  4. +
+

Update History

V2.1.0 / 19-March-2012

+

Main +Changes

+ +
  • Official support of STM32F4xx devices
  • All source files: license disclaimer text update and add link to the License file on ST Internet
  • Unmask Session request interrupt to handle the connect event during the core start-up
  • Remove any reference to the USB HS external I2C PHY
  • Update optimization pragma for AR Compiler
  • Handle Correctly the Low Speed device connection in HS mode
  • Add a wrapper to isolate the library from the low level driver: connection done through ISR structure
  • Miscellaneous bug fix

V2.0.0 / 22-July-2011

Main +Changes

+
  • Second official version supporting STM32F105/7 and STM32F2xx devices
  • Rename the Library from "STM32_USB_HOST_Driver" to "STM32_USB_OTG_Driver"
  • Add support for STM32F2xx devices
  • Add support for Device and OTG modes
  • Change HCD layer to support High speed core
  • Change the Low level driver to support multi core support for Host mode
  • Add Stop mechanism for Host and Device modes
  • Change VBUS enabling method, to use the external or the internal VBUS when using the ULPI

V1.0.0 - 11/29/2010

+
  • Created 

License

+

Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); You may not use this package except in compliance with the License. You may obtain a copy of the License at:


Unless +required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See +the License for the specific language governing permissions and +limitations under the License.
+
+
+
+

For + complete documentation on STM32 + Microcontrollers visit www.st.com/STM32

+
+

+
+ +
+ +

 

+ +
+ + \ No newline at end of file diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_bsp.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_bsp.h new file mode 100644 index 00000000..29763a90 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_bsp.h @@ -0,0 +1,103 @@ +/** + ****************************************************************************** + * @file usb_bsp.h + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Specific api's relative to the used hardware platform + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_BSP__H__ +#define __USB_BSP__H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_core.h" +#include "usb_conf.h" + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_BSP + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_BSP_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_BSP_Exported_Types + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_BSP_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_BSP_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_BSP_Exported_FunctionsPrototype + * @{ + */ +void BSP_Init(void); + +void USB_OTG_BSP_Init (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_BSP_uDelay (const uint32_t usec); +void USB_OTG_BSP_mDelay (const uint32_t msec); +void USB_OTG_BSP_EnableInterrupt (USB_OTG_CORE_HANDLE *pdev); +#ifdef USE_HOST_MODE +void USB_OTG_BSP_ConfigVBUS(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_BSP_DriveVBUS(USB_OTG_CORE_HANDLE *pdev,uint8_t state); +#endif +/** + * @} + */ + +#endif //__USB_BSP__H__ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_core.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_core.h new file mode 100644 index 00000000..c574665c --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_core.h @@ -0,0 +1,417 @@ +/** + ****************************************************************************** + * @file usb_core.h + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Header of the Core Layer + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_CORE_H__ +#define __USB_CORE_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" +#include "usb_regs.h" +#include "usb_defines.h" + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_CORE + * @brief usb otg driver core layer + * @{ + */ + + +/** @defgroup USB_CORE_Exported_Defines + * @{ + */ + +#define USB_OTG_EP0_IDLE 0 +#define USB_OTG_EP0_SETUP 1 +#define USB_OTG_EP0_DATA_IN 2 +#define USB_OTG_EP0_DATA_OUT 3 +#define USB_OTG_EP0_STATUS_IN 4 +#define USB_OTG_EP0_STATUS_OUT 5 +#define USB_OTG_EP0_STALL 6 + +#define USB_OTG_EP_TX_DIS 0x0000 +#define USB_OTG_EP_TX_STALL 0x0010 +#define USB_OTG_EP_TX_NAK 0x0020 +#define USB_OTG_EP_TX_VALID 0x0030 + +#define USB_OTG_EP_RX_DIS 0x0000 +#define USB_OTG_EP_RX_STALL 0x1000 +#define USB_OTG_EP_RX_NAK 0x2000 +#define USB_OTG_EP_RX_VALID 0x3000 +/** + * @} + */ +#define MAX_DATA_LENGTH 0x200 + +/** @defgroup USB_CORE_Exported_Types + * @{ + */ + + +typedef enum { + USB_OTG_OK = 0, + USB_OTG_FAIL +}USB_OTG_STS; + +typedef enum { + HC_IDLE = 0, + HC_XFRC, + HC_HALTED, + HC_NAK, + HC_NYET, + HC_STALL, + HC_XACTERR, + HC_BBLERR, + HC_DATATGLERR, +}HC_STATUS; + +typedef enum { + URB_IDLE = 0, + URB_DONE, + URB_NOTREADY, + URB_ERROR, + URB_STALL +}URB_STATE; + +typedef enum { + CTRL_START = 0, + CTRL_XFRC, + CTRL_HALTED, + CTRL_NAK, + CTRL_STALL, + CTRL_XACTERR, + CTRL_BBLERR, + CTRL_DATATGLERR, + CTRL_FAIL +}CTRL_STATUS; + + +typedef struct USB_OTG_hc +{ + uint8_t dev_addr ; + uint8_t ep_num; + uint8_t ep_is_in; + uint8_t speed; + uint8_t do_ping; + uint8_t ep_type; + uint16_t max_packet; + uint8_t data_pid; + uint8_t *xfer_buff; + uint32_t xfer_len; + uint32_t xfer_count; + uint8_t toggle_in; + uint8_t toggle_out; + uint32_t dma_addr; +} +USB_OTG_HC , *PUSB_OTG_HC; + +typedef struct USB_OTG_ep +{ + uint8_t num; + uint8_t is_in; + uint8_t is_stall; + uint8_t type; + uint8_t data_pid_start; + uint8_t even_odd_frame; + uint16_t tx_fifo_num; + uint32_t maxpacket; + /* transaction level variables*/ + uint8_t *xfer_buff; + uint32_t dma_addr; + uint32_t xfer_len; + uint32_t xfer_count; + /* Transfer level variables*/ + uint32_t rem_data_len; + uint32_t total_data_len; + uint32_t ctl_data_len; + +} + +USB_OTG_EP , *PUSB_OTG_EP; + + + +typedef struct USB_OTG_core_cfg +{ + uint8_t host_channels; + uint8_t dev_endpoints; + uint8_t speed; + uint8_t dma_enable; + uint16_t mps; + uint16_t TotalFifoSize; + uint8_t phy_itface; + uint8_t Sof_output; + uint8_t low_power; + uint8_t coreID; + +} +USB_OTG_CORE_CFGS, *PUSB_OTG_CORE_CFGS; + + + +typedef struct usb_setup_req { + + uint8_t bmRequest; + uint8_t bRequest; + uint16_t wValue; + uint16_t wIndex; + uint16_t wLength; +} USB_SETUP_REQ; + +typedef struct _Device_TypeDef +{ + uint8_t *(*GetDeviceDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetLangIDStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetManufacturerStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetProductStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetSerialStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetConfigurationStrDescriptor)( uint8_t speed , uint16_t *length); + uint8_t *(*GetInterfaceStrDescriptor)( uint8_t speed , uint16_t *length); +} USBD_DEVICE, *pUSBD_DEVICE; + +//typedef struct USB_OTG_hPort +//{ +// void (*Disconnect) (void *phost); +// void (*Connect) (void *phost); +// uint8_t ConnStatus; +// uint8_t DisconnStatus; +// uint8_t ConnHandled; +// uint8_t DisconnHandled; +//} USB_OTG_hPort_TypeDef; + +typedef struct _Device_cb +{ + uint8_t (*Init) (void *pdev , uint8_t cfgidx); + uint8_t (*DeInit) (void *pdev , uint8_t cfgidx); + /* Control Endpoints*/ + uint8_t (*Setup) (void *pdev , USB_SETUP_REQ *req); + uint8_t (*EP0_TxSent) (void *pdev ); + uint8_t (*EP0_RxReady) (void *pdev ); + /* Class Specific Endpoints*/ + uint8_t (*DataIn) (void *pdev , uint8_t epnum); + uint8_t (*DataOut) (void *pdev , uint8_t epnum); + uint8_t (*SOF) (void *pdev); + uint8_t (*IsoINIncomplete) (void *pdev); + uint8_t (*IsoOUTIncomplete) (void *pdev); + + uint8_t *(*GetConfigDescriptor)( uint8_t speed , uint16_t *length); +#ifdef USB_OTG_HS_CORE + uint8_t *(*GetOtherConfigDescriptor)( uint8_t speed , uint16_t *length); +#endif + +#ifdef USB_SUPPORT_USER_STRING_DESC + uint8_t *(*GetUsrStrDescriptor)( uint8_t speed ,uint8_t index, uint16_t *length); +#endif + +} USBD_Class_cb_TypeDef; + + + +typedef struct _USBD_USR_PROP +{ + void (*Init)(void); + void (*DeviceReset)(uint8_t speed); + void (*DeviceConfigured)(void); + void (*DeviceSuspended)(void); + void (*DeviceResumed)(void); + + void (*DeviceConnected)(void); + void (*DeviceDisconnected)(void); + +} +USBD_Usr_cb_TypeDef; + +typedef struct _DCD +{ + uint8_t device_config; + uint8_t device_state; + uint8_t device_status; + uint8_t device_old_status; + uint8_t device_address; + uint8_t connection_status; + uint8_t test_mode; + uint32_t DevRemoteWakeup; + USB_OTG_EP in_ep [USB_OTG_MAX_TX_FIFOS]; + USB_OTG_EP out_ep [USB_OTG_MAX_TX_FIFOS]; + uint8_t setup_packet [8*3]; + USBD_Class_cb_TypeDef *class_cb; + USBD_Usr_cb_TypeDef *usr_cb; + USBD_DEVICE *usr_device; + uint8_t *pConfig_descriptor; + } +DCD_DEV , *DCD_PDEV; + + +typedef struct _HCD +{ + uint8_t Rx_Buffer [MAX_DATA_LENGTH]; + __IO uint32_t ConnSts; + __IO uint32_t ErrCnt[USB_OTG_MAX_TX_FIFOS]; + __IO uint32_t XferCnt[USB_OTG_MAX_TX_FIFOS]; + __IO HC_STATUS HC_Status[USB_OTG_MAX_TX_FIFOS]; + __IO URB_STATE URB_State[USB_OTG_MAX_TX_FIFOS]; + USB_OTG_HC hc [USB_OTG_MAX_TX_FIFOS]; + uint16_t channel [USB_OTG_MAX_TX_FIFOS]; +// USB_OTG_hPort_TypeDef *port_cb; +} +HCD_DEV , *USB_OTG_USBH_PDEV; + + +typedef struct _OTG +{ + uint8_t OTG_State; + uint8_t OTG_PrevState; + uint8_t OTG_Mode; +} +OTG_DEV , *USB_OTG_USBO_PDEV; + +typedef struct USB_OTG_handle +{ + USB_OTG_CORE_CFGS cfg; + USB_OTG_CORE_REGS regs; +#ifdef USE_DEVICE_MODE + DCD_DEV dev; +#endif +#ifdef USE_HOST_MODE + HCD_DEV host; +#endif +#ifdef USE_OTG_MODE + OTG_DEV otg; +#endif +} +USB_OTG_CORE_HANDLE , *PUSB_OTG_CORE_HANDLE; + +/** + * @} + */ + + +/** @defgroup USB_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_FunctionsPrototype + * @{ + */ + + +USB_OTG_STS USB_OTG_CoreInit (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_SelectCore (USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID); +USB_OTG_STS USB_OTG_EnableGlobalInt (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_DisableGlobalInt(USB_OTG_CORE_HANDLE *pdev); +void* USB_OTG_ReadPacket (USB_OTG_CORE_HANDLE *pdev , + uint8_t *dest, + uint16_t len); +USB_OTG_STS USB_OTG_WritePacket (USB_OTG_CORE_HANDLE *pdev , + uint8_t *src, + uint8_t ch_ep_num, + uint16_t len); +USB_OTG_STS USB_OTG_FlushTxFifo (USB_OTG_CORE_HANDLE *pdev , uint32_t num); +USB_OTG_STS USB_OTG_FlushRxFifo (USB_OTG_CORE_HANDLE *pdev); + +uint32_t USB_OTG_ReadCoreItr (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadOtgItr (USB_OTG_CORE_HANDLE *pdev); +uint8_t USB_OTG_IsHostMode (USB_OTG_CORE_HANDLE *pdev); +uint8_t USB_OTG_IsDeviceMode (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_GetMode (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_PhyInit (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_SetCurrentMode (USB_OTG_CORE_HANDLE *pdev, + uint8_t mode); + +/*********************** HOST APIs ********************************************/ +#ifdef USE_HOST_MODE +USB_OTG_STS USB_OTG_CoreInitHost (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EnableHostInt (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_HC_Init (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num); +USB_OTG_STS USB_OTG_HC_Halt (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num); +USB_OTG_STS USB_OTG_HC_StartXfer (USB_OTG_CORE_HANDLE *pdev, uint8_t hc_num); +USB_OTG_STS USB_OTG_HC_DoPing (USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num); +uint32_t USB_OTG_ReadHostAllChannels_intr (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ResetPort (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadHPRT0 (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_DriveVbus (USB_OTG_CORE_HANDLE *pdev, uint8_t state); +void USB_OTG_InitFSLSPClkSel (USB_OTG_CORE_HANDLE *pdev ,uint8_t freq); +uint8_t USB_OTG_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev) ; +void USB_OTG_StopHost (USB_OTG_CORE_HANDLE *pdev); +#endif +/********************* DEVICE APIs ********************************************/ +#ifdef USE_DEVICE_MODE +USB_OTG_STS USB_OTG_CoreInitDev (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EnableDevInt (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadDevAllInEPItr (USB_OTG_CORE_HANDLE *pdev); +enum USB_OTG_SPEED USB_OTG_GetDeviceSpeed (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EP0Activate (USB_OTG_CORE_HANDLE *pdev); +USB_OTG_STS USB_OTG_EPActivate (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPDeactivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPStartXfer (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EP0StartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPSetStall (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +USB_OTG_STS USB_OTG_EPClearStall (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep); +uint32_t USB_OTG_ReadDevAllOutEp_itr (USB_OTG_CORE_HANDLE *pdev); +uint32_t USB_OTG_ReadDevOutEP_itr (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); +uint32_t USB_OTG_ReadDevAllInEPItr (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_InitDevSpeed (USB_OTG_CORE_HANDLE *pdev , uint8_t speed); +uint8_t USBH_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_EP0_OutStart(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_ActiveRemoteWakeup(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_UngateClock(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_StopDevice(USB_OTG_CORE_HANDLE *pdev); +void USB_OTG_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep , uint32_t Status); +uint32_t USB_OTG_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,USB_OTG_EP *ep); +#endif +/** + * @} + */ + +#endif /* __USB_CORE_H__ */ + + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_dcd.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_dcd.h new file mode 100644 index 00000000..6922782a --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_dcd.h @@ -0,0 +1,164 @@ +/** + ****************************************************************************** + * @file usb_dcd.h + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Peripheral Driver Header file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __DCD_H__ +#define __DCD_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_core.h" + + +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_DCD +* @brief This file is the +* @{ +*/ + + +/** @defgroup USB_DCD_Exported_Defines +* @{ +*/ +#define USB_OTG_EP_CONTROL 0 +#define USB_OTG_EP_ISOC 1 +#define USB_OTG_EP_BULK 2 +#define USB_OTG_EP_INT 3 +#define USB_OTG_EP_MASK 3 + +/* Device Status */ +#define USB_OTG_DEFAULT 1 +#define USB_OTG_ADDRESSED 2 +#define USB_OTG_CONFIGURED 3 +#define USB_OTG_SUSPENDED 4 + +/** +* @} +*/ + + +/** @defgroup USB_DCD_Exported_Types +* @{ +*/ +/******************************************************************************** +Data structure type +********************************************************************************/ +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; +} +EP_DESCRIPTOR , *PEP_DESCRIPTOR; + +/** +* @} +*/ + + +/** @defgroup USB_DCD_Exported_Macros +* @{ +*/ +/** +* @} +*/ + +/** @defgroup USB_DCD_Exported_Variables +* @{ +*/ +/** +* @} +*/ + +/** @defgroup USB_DCD_Exported_FunctionsPrototype +* @{ +*/ +/******************************************************************************** +EXPORTED FUNCTION FROM THE USB-OTG LAYER +********************************************************************************/ +void DCD_Init(USB_OTG_CORE_HANDLE *pdev , + USB_OTG_CORE_ID_TypeDef coreID); + +void DCD_DevConnect (USB_OTG_CORE_HANDLE *pdev); +void DCD_DevDisconnect (USB_OTG_CORE_HANDLE *pdev); +void DCD_EP_SetAddress (USB_OTG_CORE_HANDLE *pdev, + uint8_t address); +uint32_t DCD_EP_Open(USB_OTG_CORE_HANDLE *pdev , + uint8_t ep_addr, + uint16_t ep_mps, + uint8_t ep_type); + +uint32_t DCD_EP_Close (USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr); + + +uint32_t DCD_EP_PrepareRx ( USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint16_t buf_len); + +uint32_t DCD_EP_Tx (USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint32_t buf_len); +uint32_t DCD_EP_Stall (USB_OTG_CORE_HANDLE *pdev, + uint8_t epnum); +uint32_t DCD_EP_ClrStall (USB_OTG_CORE_HANDLE *pdev, + uint8_t epnum); +uint32_t DCD_EP_Flush (USB_OTG_CORE_HANDLE *pdev, + uint8_t epnum); +uint32_t DCD_Handle_ISR(USB_OTG_CORE_HANDLE *pdev); + +uint32_t DCD_GetEPStatus(USB_OTG_CORE_HANDLE *pdev , + uint8_t epnum); + +void DCD_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , + uint8_t epnum , + uint32_t Status); + +/** +* @} +*/ + + +#endif //__DCD_H__ + + +/** +* @} +*/ + +/** +* @} +*/ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_dcd_int.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_dcd_int.h new file mode 100644 index 00000000..e2369e5d --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_dcd_int.h @@ -0,0 +1,127 @@ +/** + ****************************************************************************** + * @file usb_dcd_int.h + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Peripheral Device Interface Layer + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef USB_DCD_INT_H__ +#define USB_DCD_INT_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd.h" + + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_DCD_INT + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_DCD_INT_Exported_Defines + * @{ + */ + +typedef struct _USBD_DCD_INT +{ + uint8_t (* DataOutStage) (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); + uint8_t (* DataInStage) (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum); + uint8_t (* SetupStage) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* SOF) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* Reset) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* Suspend) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* Resume) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* IsoINIncomplete) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* IsoOUTIncomplete) (USB_OTG_CORE_HANDLE *pdev); + + uint8_t (* DevConnected) (USB_OTG_CORE_HANDLE *pdev); + uint8_t (* DevDisconnected) (USB_OTG_CORE_HANDLE *pdev); + +}USBD_DCD_INT_cb_TypeDef; + +extern USBD_DCD_INT_cb_TypeDef *USBD_DCD_INT_fops; +/** + * @} + */ + + +/** @defgroup USB_DCD_INT_Exported_Types + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DCD_INT_Exported_Macros + * @{ + */ + +#define CLEAR_IN_EP_INTR(epnum,intr) \ + diepint.d32=0; \ + diepint.b.intr = 1; \ + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[epnum]->DIEPINT,diepint.d32); + +#define CLEAR_OUT_EP_INTR(epnum,intr) \ + doepint.d32=0; \ + doepint.b.intr = 1; \ + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[epnum]->DOEPINT,doepint.d32); + +/** + * @} + */ + +/** @defgroup USB_DCD_INT_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DCD_INT_Exported_FunctionsPrototype + * @{ + */ + +uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev); + +/** + * @} + */ + + +#endif // USB_DCD_INT_H__ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_defines.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_defines.h new file mode 100644 index 00000000..28e6d168 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_defines.h @@ -0,0 +1,249 @@ +/** + ****************************************************************************** + * @file usb_defines.h + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Header of the Core Layer + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_DEF_H__ +#define __USB_DEF_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_DEFINES + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_DEFINES_Exported_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup _CORE_DEFINES_ + * @{ + */ + +#define USB_OTG_SPEED_PARAM_HIGH 0 +#define USB_OTG_SPEED_PARAM_HIGH_IN_FULL 1 +#define USB_OTG_SPEED_PARAM_FULL 3 + +#define USB_OTG_SPEED_HIGH 0 +#define USB_OTG_SPEED_FULL 1 + +#define USB_OTG_ULPI_PHY 1 +#define USB_OTG_EMBEDDED_PHY 2 + +/** + * @} + */ + + +/** @defgroup _GLOBAL_DEFINES_ + * @{ + */ +#define GAHBCFG_TXFEMPTYLVL_EMPTY 1 +#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 +#define GAHBCFG_GLBINT_ENABLE 1 +#define GAHBCFG_INT_DMA_BURST_SINGLE 0 +#define GAHBCFG_INT_DMA_BURST_INCR 1 +#define GAHBCFG_INT_DMA_BURST_INCR4 3 +#define GAHBCFG_INT_DMA_BURST_INCR8 5 +#define GAHBCFG_INT_DMA_BURST_INCR16 7 +#define GAHBCFG_DMAENABLE 1 +#define GAHBCFG_TXFEMPTYLVL_EMPTY 1 +#define GAHBCFG_TXFEMPTYLVL_HALFEMPTY 0 +#define GRXSTS_PKTSTS_IN 2 +#define GRXSTS_PKTSTS_IN_XFER_COMP 3 +#define GRXSTS_PKTSTS_DATA_TOGGLE_ERR 5 +#define GRXSTS_PKTSTS_CH_HALTED 7 +/** + * @} + */ + + +/** @defgroup _OnTheGo_DEFINES_ + * @{ + */ +#define MODE_HNP_SRP_CAPABLE 0 +#define MODE_SRP_ONLY_CAPABLE 1 +#define MODE_NO_HNP_SRP_CAPABLE 2 +#define MODE_SRP_CAPABLE_DEVICE 3 +#define MODE_NO_SRP_CAPABLE_DEVICE 4 +#define MODE_SRP_CAPABLE_HOST 5 +#define MODE_NO_SRP_CAPABLE_HOST 6 +#define A_HOST 1 +#define A_SUSPEND 2 +#define A_PERIPHERAL 3 +#define B_PERIPHERAL 4 +#define B_HOST 5 +#define DEVICE_MODE 0 +#define HOST_MODE 1 +#define OTG_MODE 2 +/** + * @} + */ + + +/** @defgroup __DEVICE_DEFINES_ + * @{ + */ +#define DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ 0 +#define DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ 1 +#define DSTS_ENUMSPD_LS_PHY_6MHZ 2 +#define DSTS_ENUMSPD_FS_PHY_48MHZ 3 + +#define DCFG_FRAME_INTERVAL_80 0 +#define DCFG_FRAME_INTERVAL_85 1 +#define DCFG_FRAME_INTERVAL_90 2 +#define DCFG_FRAME_INTERVAL_95 3 + +#define DEP0CTL_MPS_64 0 +#define DEP0CTL_MPS_32 1 +#define DEP0CTL_MPS_16 2 +#define DEP0CTL_MPS_8 3 + +#define EP_SPEED_LOW 0 +#define EP_SPEED_FULL 1 +#define EP_SPEED_HIGH 2 + +#define EP_TYPE_CTRL 0 +#define EP_TYPE_ISOC 1 +#define EP_TYPE_BULK 2 +#define EP_TYPE_INTR 3 +#define EP_TYPE_MSK 3 + +#define STS_GOUT_NAK 1 +#define STS_DATA_UPDT 2 +#define STS_XFER_COMP 3 +#define STS_SETUP_COMP 4 +#define STS_SETUP_UPDT 6 +/** + * @} + */ + + +/** @defgroup __HOST_DEFINES_ + * @{ + */ +#define HC_PID_DATA0 0 +#define HC_PID_DATA2 1 +#define HC_PID_DATA1 2 +#define HC_PID_SETUP 3 + +#define HPRT0_PRTSPD_HIGH_SPEED 0 +#define HPRT0_PRTSPD_FULL_SPEED 1 +#define HPRT0_PRTSPD_LOW_SPEED 2 + +#define HCFG_30_60_MHZ 0 +#define HCFG_48_MHZ 1 +#define HCFG_6_MHZ 2 + +#define HCCHAR_CTRL 0 +#define HCCHAR_ISOC 1 +#define HCCHAR_BULK 2 +#define HCCHAR_INTR 3 + +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) + +/** + * @} + */ + + +/** @defgroup USB_DEFINES_Exported_Types + * @{ + */ + +typedef enum +{ + USB_OTG_HS_CORE_ID = 0, + USB_OTG_FS_CORE_ID = 1 +}USB_OTG_CORE_ID_TypeDef; +/** + * @} + */ + + +/** @defgroup USB_DEFINES_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DEFINES_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_DEFINES_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +/** @defgroup Internal_Macro's + * @{ + */ +#define USB_OTG_READ_REG32(reg) (*(__IO uint32_t *)reg) +#define USB_OTG_WRITE_REG32(reg,value) (*(__IO uint32_t *)reg = value) +#define USB_OTG_MODIFY_REG32(reg,clear_mask,set_mask) \ + USB_OTG_WRITE_REG32(reg, (((USB_OTG_READ_REG32(reg)) & ~clear_mask) | set_mask ) ) + +/******************************************************************************** + ENUMERATION TYPE +********************************************************************************/ +enum USB_OTG_SPEED { + USB_SPEED_UNKNOWN = 0, + USB_SPEED_LOW, + USB_SPEED_FULL, + USB_SPEED_HIGH +}; + +#endif //__USB_DEFINES__H__ + + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_regs.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_regs.h new file mode 100644 index 00000000..323e8705 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_regs.h @@ -0,0 +1,1188 @@ +/** + ****************************************************************************** + * @file usb_regs.h + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief hardware registers + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_OTG_REGS_H__ +#define __USB_OTG_REGS_H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_REGS + * @brief This file is the + * @{ + */ + + +/** @defgroup USB_REGS_Exported_Defines + * @{ + */ + +#define USB_OTG_HS_BASE_ADDR 0x40040000 +#define USB_OTG_FS_BASE_ADDR 0x50000000 + +#define USB_OTG_CORE_GLOBAL_REGS_OFFSET 0x000 +#define USB_OTG_DEV_GLOBAL_REG_OFFSET 0x800 +#define USB_OTG_DEV_IN_EP_REG_OFFSET 0x900 +#define USB_OTG_EP_REG_OFFSET 0x20 +#define USB_OTG_DEV_OUT_EP_REG_OFFSET 0xB00 +#define USB_OTG_HOST_GLOBAL_REG_OFFSET 0x400 +#define USB_OTG_HOST_PORT_REGS_OFFSET 0x440 +#define USB_OTG_HOST_CHAN_REGS_OFFSET 0x500 +#define USB_OTG_CHAN_REGS_OFFSET 0x20 +#define USB_OTG_PCGCCTL_OFFSET 0xE00 +#define USB_OTG_DATA_FIFO_OFFSET 0x1000 +#define USB_OTG_DATA_FIFO_SIZE 0x1000 + + +#define USB_OTG_MAX_TX_FIFOS 15 + +#define USB_OTG_HS_MAX_PACKET_SIZE 512 +#define USB_OTG_FS_MAX_PACKET_SIZE 64 +#define USB_OTG_MAX_EP0_SIZE 64 +/** + * @} + */ + +/** @defgroup USB_REGS_Exported_Types + * @{ + */ + +/** @defgroup __USB_OTG_Core_register + * @{ + */ +typedef struct _USB_OTG_GREGS //000h +{ + __IO uint32_t GOTGCTL; /* USB_OTG Control and Status Register 000h*/ + __IO uint32_t GOTGINT; /* USB_OTG Interrupt Register 004h*/ + __IO uint32_t GAHBCFG; /* Core AHB Configuration Register 008h*/ + __IO uint32_t GUSBCFG; /* Core USB Configuration Register 00Ch*/ + __IO uint32_t GRSTCTL; /* Core Reset Register 010h*/ + __IO uint32_t GINTSTS; /* Core Interrupt Register 014h*/ + __IO uint32_t GINTMSK; /* Core Interrupt Mask Register 018h*/ + __IO uint32_t GRXSTSR; /* Receive Sts Q Read Register 01Ch*/ + __IO uint32_t GRXSTSP; /* Receive Sts Q Read & POP Register 020h*/ + __IO uint32_t GRXFSIZ; /* Receive FIFO Size Register 024h*/ + __IO uint32_t DIEPTXF0_HNPTXFSIZ; /* EP0 / Non Periodic Tx FIFO Size Register 028h*/ + __IO uint32_t HNPTXSTS; /* Non Periodic Tx FIFO/Queue Sts reg 02Ch*/ + uint32_t Reserved30[2]; /* Reserved 030h*/ + __IO uint32_t GCCFG; /* General Purpose IO Register 038h*/ + __IO uint32_t CID; /* User ID Register 03Ch*/ + uint32_t Reserved40[48]; /* Reserved 040h-0FFh*/ + __IO uint32_t HPTXFSIZ; /* Host Periodic Tx FIFO Size Reg 100h*/ + __IO uint32_t DIEPTXF[USB_OTG_MAX_TX_FIFOS];/* dev Periodic Transmit FIFO */ +} +USB_OTG_GREGS; +/** + * @} + */ + + +/** @defgroup __device_Registers + * @{ + */ +typedef struct _USB_OTG_DREGS // 800h +{ + __IO uint32_t DCFG; /* dev Configuration Register 800h*/ + __IO uint32_t DCTL; /* dev Control Register 804h*/ + __IO uint32_t DSTS; /* dev Status Register (RO) 808h*/ + uint32_t Reserved0C; /* Reserved 80Ch*/ + __IO uint32_t DIEPMSK; /* dev IN Endpoint Mask 810h*/ + __IO uint32_t DOEPMSK; /* dev OUT Endpoint Mask 814h*/ + __IO uint32_t DAINT; /* dev All Endpoints Itr Reg 818h*/ + __IO uint32_t DAINTMSK; /* dev All Endpoints Itr Mask 81Ch*/ + uint32_t Reserved20; /* Reserved 820h*/ + uint32_t Reserved9; /* Reserved 824h*/ + __IO uint32_t DVBUSDIS; /* dev VBUS discharge Register 828h*/ + __IO uint32_t DVBUSPULSE; /* dev VBUS Pulse Register 82Ch*/ + __IO uint32_t DTHRCTL; /* dev thr 830h*/ + __IO uint32_t DIEPEMPMSK; /* dev empty msk 834h*/ + __IO uint32_t DEACHINT; /* dedicated EP interrupt 838h*/ + __IO uint32_t DEACHMSK; /* dedicated EP msk 83Ch*/ + uint32_t Reserved40; /* dedicated EP mask 840h*/ + __IO uint32_t DINEP1MSK; /* dedicated EP mask 844h*/ + uint32_t Reserved44[15]; /* Reserved 844-87Ch*/ + __IO uint32_t DOUTEP1MSK; /* dedicated EP msk 884h*/ +} +USB_OTG_DREGS; +/** + * @} + */ + + +/** @defgroup __IN_Endpoint-Specific_Register + * @{ + */ +typedef struct _USB_OTG_INEPREGS +{ + __IO uint32_t DIEPCTL; /* dev IN Endpoint Control Reg 900h + (ep_num * 20h) + 00h*/ + uint32_t Reserved04; /* Reserved 900h + (ep_num * 20h) + 04h*/ + __IO uint32_t DIEPINT; /* dev IN Endpoint Itr Reg 900h + (ep_num * 20h) + 08h*/ + uint32_t Reserved0C; /* Reserved 900h + (ep_num * 20h) + 0Ch*/ + __IO uint32_t DIEPTSIZ; /* IN Endpoint Txfer Size 900h + (ep_num * 20h) + 10h*/ + __IO uint32_t DIEPDMA; /* IN Endpoint DMA Address Reg 900h + (ep_num * 20h) + 14h*/ + __IO uint32_t DTXFSTS;/*IN Endpoint Tx FIFO Status Reg 900h + (ep_num * 20h) + 18h*/ + uint32_t Reserved18; /* Reserved 900h+(ep_num*20h)+1Ch-900h+ (ep_num * 20h) + 1Ch*/ +} +USB_OTG_INEPREGS; +/** + * @} + */ + + +/** @defgroup __OUT_Endpoint-Specific_Registers + * @{ + */ +typedef struct _USB_OTG_OUTEPREGS +{ + __IO uint32_t DOEPCTL; /* dev OUT Endpoint Control Reg B00h + (ep_num * 20h) + 00h*/ + uint32_t Reserved04; /* Reserved B00h + (ep_num * 20h) + 04h*/ + __IO uint32_t DOEPINT; /* dev OUT Endpoint Itr Reg B00h + (ep_num * 20h) + 08h*/ + uint32_t Reserved0C; /* Reserved B00h + (ep_num * 20h) + 0Ch*/ + __IO uint32_t DOEPTSIZ; /* dev OUT Endpoint Txfer Size B00h + (ep_num * 20h) + 10h*/ + __IO uint32_t DOEPDMA; /* dev OUT Endpoint DMA Address B00h + (ep_num * 20h) + 14h*/ + uint32_t Reserved18[2]; /* Reserved B00h + (ep_num * 20h) + 18h - B00h + (ep_num * 20h) + 1Ch*/ +} +USB_OTG_OUTEPREGS; +/** + * @} + */ + + +/** @defgroup __Host_Mode_Register_Structures + * @{ + */ +typedef struct _USB_OTG_HREGS +{ + __IO uint32_t HCFG; /* Host Configuration Register 400h*/ + __IO uint32_t HFIR; /* Host Frame Interval Register 404h*/ + __IO uint32_t HFNUM; /* Host Frame Nbr/Frame Remaining 408h*/ + uint32_t Reserved40C; /* Reserved 40Ch*/ + __IO uint32_t HPTXSTS; /* Host Periodic Tx FIFO/ Queue Status 410h*/ + __IO uint32_t HAINT; /* Host All Channels Interrupt Register 414h*/ + __IO uint32_t HAINTMSK; /* Host All Channels Interrupt Mask 418h*/ +} +USB_OTG_HREGS; +/** + * @} + */ + + +/** @defgroup __Host_Channel_Specific_Registers + * @{ + */ +typedef struct _USB_OTG_HC_REGS +{ + __IO uint32_t HCCHAR; + __IO uint32_t HCSPLT; + __IO uint32_t HCINT; + __IO uint32_t HCINTMSK; + __IO uint32_t HCTSIZ; + __IO uint32_t HCDMA; + uint32_t Reserved[2]; +} +USB_OTG_HC_REGS; +/** + * @} + */ + + +/** @defgroup __otg_Core_registers + * @{ + */ +typedef struct USB_OTG_core_regs //000h +{ + USB_OTG_GREGS *GREGS; + USB_OTG_DREGS *DREGS; + USB_OTG_HREGS *HREGS; + USB_OTG_INEPREGS *INEP_REGS[USB_OTG_MAX_TX_FIFOS]; + USB_OTG_OUTEPREGS *OUTEP_REGS[USB_OTG_MAX_TX_FIFOS]; + USB_OTG_HC_REGS *HC_REGS[USB_OTG_MAX_TX_FIFOS]; + __IO uint32_t *HPRT0; + __IO uint32_t *DFIFO[USB_OTG_MAX_TX_FIFOS]; + __IO uint32_t *PCGCCTL; +} +USB_OTG_CORE_REGS , *PUSB_OTG_CORE_REGS; +typedef union _USB_OTG_GOTGCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t sesreqscs : + 1; +uint32_t sesreq : + 1; +uint32_t Reserved2_7 : + 6; +uint32_t hstnegscs : + 1; +uint32_t hnpreq : + 1; +uint32_t hstsethnpen : + 1; +uint32_t devhnpen : + 1; +uint32_t Reserved12_15 : + 4; +uint32_t conidsts : + 1; +uint32_t dbct : + 1; +uint32_t asesvld : + 1; +uint32_t bsesvld : + 1; +uint32_t Reserved20_31 : + 12; + } + b; +} USB_OTG_GOTGCTL_TypeDef ; + +typedef union _USB_OTG_GOTGINT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t Reserved0_1 : + 2; +uint32_t sesenddet : + 1; +uint32_t Reserved3_7 : + 5; +uint32_t sesreqsucstschng : + 1; +uint32_t hstnegsucstschng : + 1; +uint32_t reserver10_16 : + 7; +uint32_t hstnegdet : + 1; +uint32_t adevtoutchng : + 1; +uint32_t debdone : + 1; +uint32_t Reserved31_20 : + 12; + } + b; +} USB_OTG_GOTGINT_TypeDef ; +typedef union _USB_OTG_GAHBCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t glblintrmsk : + 1; +uint32_t hburstlen : + 4; +uint32_t dmaenable : + 1; +uint32_t Reserved : + 1; +uint32_t nptxfemplvl_txfemplvl : + 1; +uint32_t ptxfemplvl : + 1; +uint32_t Reserved9_31 : + 23; + } + b; +} USB_OTG_GAHBCFG_TypeDef ; +typedef union _USB_OTG_GUSBCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t toutcal : + 3; +uint32_t Reserved3_5 : + 3; +uint32_t physel : + 1; +uint32_t Reserved7 : + 1; +uint32_t srpcap : + 1; +uint32_t hnpcap : + 1; +uint32_t usbtrdtim : + 4; +uint32_t Reserved14 : + 1; +uint32_t phylpwrclksel : + 1; +uint32_t Reserved16 : + 1; +uint32_t ulpi_fsls : + 1; +uint32_t ulpi_auto_res : + 1; +uint32_t ulpi_clk_sus_m : + 1; +uint32_t ulpi_ext_vbus_drv : + 1; +uint32_t ulpi_int_vbus_ind : + 1; +uint32_t term_sel_dl_pulse : + 1; +uint32_t ulpi_ind_cpl : + 1; +uint32_t ulpi_passthrough : + 1; +uint32_t ulpi_protect_disable : + 1; +uint32_t Reserved26_28 : + 3; +uint32_t force_host : + 1; +uint32_t force_dev : + 1; +uint32_t corrupt_tx : + 1; + } + b; +} USB_OTG_GUSBCFG_TypeDef ; +typedef union _USB_OTG_GRSTCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t csftrst : + 1; +uint32_t hsftrst : + 1; +uint32_t hstfrm : + 1; +uint32_t Reserved3 : + 1; +uint32_t rxfflsh : + 1; +uint32_t txfflsh : + 1; +uint32_t txfnum : + 5; +uint32_t Reserved11_29 : + 19; +uint32_t dmareq : + 1; +uint32_t ahbidle : + 1; + } + b; +} USB_OTG_GRSTCTL_TypeDef ; +typedef union _USB_OTG_GINTMSK_TypeDef +{ + uint32_t d32; + struct + { +uint32_t Reserved0 : + 1; +uint32_t modemismatch : + 1; +uint32_t otgintr : + 1; +uint32_t sofintr : + 1; +uint32_t rxstsqlvl : + 1; +uint32_t nptxfempty : + 1; +uint32_t ginnakeff : + 1; +uint32_t goutnakeff : + 1; +uint32_t Reserved8_9 : + 2; +uint32_t erlysuspend : + 1; +uint32_t usbsuspend : + 1; +uint32_t usbreset : + 1; +uint32_t enumdone : + 1; +uint32_t isooutdrop : + 1; +uint32_t eopframe : + 1; +uint32_t Reserved16 : + 1; +uint32_t epmismatch : + 1; +uint32_t inepintr : + 1; +uint32_t outepintr : + 1; +uint32_t incomplisoin : + 1; +uint32_t incomplisoout : + 1; +uint32_t Reserved22_23 : + 2; +uint32_t portintr : + 1; +uint32_t hcintr : + 1; +uint32_t ptxfempty : + 1; +uint32_t Reserved27 : + 1; +uint32_t conidstschng : + 1; +uint32_t disconnect : + 1; +uint32_t sessreqintr : + 1; +uint32_t wkupintr : + 1; + } + b; +} USB_OTG_GINTMSK_TypeDef ; +typedef union _USB_OTG_GINTSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t curmode : + 1; +uint32_t modemismatch : + 1; +uint32_t otgintr : + 1; +uint32_t sofintr : + 1; +uint32_t rxstsqlvl : + 1; +uint32_t nptxfempty : + 1; +uint32_t ginnakeff : + 1; +uint32_t goutnakeff : + 1; +uint32_t Reserved8_9 : + 2; +uint32_t erlysuspend : + 1; +uint32_t usbsuspend : + 1; +uint32_t usbreset : + 1; +uint32_t enumdone : + 1; +uint32_t isooutdrop : + 1; +uint32_t eopframe : + 1; +uint32_t Reserved16_17 : + 2; +uint32_t inepint: + 1; +uint32_t outepintr : + 1; +uint32_t incomplisoin : + 1; +uint32_t incomplisoout : + 1; +uint32_t Reserved22_23 : + 2; +uint32_t portintr : + 1; +uint32_t hcintr : + 1; +uint32_t ptxfempty : + 1; +uint32_t Reserved27 : + 1; +uint32_t conidstschng : + 1; +uint32_t disconnect : + 1; +uint32_t sessreqintr : + 1; +uint32_t wkupintr : + 1; + } + b; +} USB_OTG_GINTSTS_TypeDef ; +typedef union _USB_OTG_DRXSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t epnum : + 4; +uint32_t bcnt : + 11; +uint32_t dpid : + 2; +uint32_t pktsts : + 4; +uint32_t fn : + 4; +uint32_t Reserved : + 7; + } + b; +} USB_OTG_DRXSTS_TypeDef ; +typedef union _USB_OTG_GRXSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t chnum : + 4; +uint32_t bcnt : + 11; +uint32_t dpid : + 2; +uint32_t pktsts : + 4; +uint32_t Reserved : + 11; + } + b; +} USB_OTG_GRXFSTS_TypeDef ; +typedef union _USB_OTG_FSIZ_TypeDef +{ + uint32_t d32; + struct + { +uint32_t startaddr : + 16; +uint32_t depth : + 16; + } + b; +} USB_OTG_FSIZ_TypeDef ; +typedef union _USB_OTG_HNPTXSTS_TypeDef +{ + uint32_t d32; + struct + { + uint32_t nptxfspcavail : + 16; + uint32_t nptxqspcavail : + 8; + struct + { + uint32_t terminate : + 1; + uint32_t token : + 2; + uint32_t chnum : + 4; + } nptxqtop; + uint32_t Reserved : + 1; + } + b; +} USB_OTG_HNPTXSTS_TypeDef ; +typedef union _USB_OTG_DTXFSTSn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t txfspcavail : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_DTXFSTSn_TypeDef ; + +typedef union _USB_OTG_GCCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t Reserved_in : + 16; +uint32_t pwdn : + 1; +uint32_t Reserved_17 : + 1; +uint32_t vbussensingA : + 1; +uint32_t vbussensingB : + 1; +uint32_t sofouten : + 1; +uint32_t disablevbussensing : + 1; +uint32_t Reserved_out : + 10; + } + b; +} USB_OTG_GCCFG_TypeDef ; + +typedef union _USB_OTG_DCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t devspd : + 2; +uint32_t nzstsouthshk : + 1; +uint32_t Reserved3 : + 1; +uint32_t devaddr : + 7; +uint32_t perfrint : + 2; +uint32_t Reserved12_31 : + 19; + } + b; +} USB_OTG_DCFG_TypeDef ; +typedef union _USB_OTG_DCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t rmtwkupsig : + 1; +uint32_t sftdiscon : + 1; +uint32_t gnpinnaksts : + 1; +uint32_t goutnaksts : + 1; +uint32_t tstctl : + 3; +uint32_t sgnpinnak : + 1; +uint32_t cgnpinnak : + 1; +uint32_t sgoutnak : + 1; +uint32_t cgoutnak : + 1; +uint32_t poprg_done : + 1; +uint32_t Reserved : + 20; + } + b; +} USB_OTG_DCTL_TypeDef ; +typedef union _USB_OTG_DSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t suspsts : + 1; +uint32_t enumspd : + 2; +uint32_t errticerr : + 1; +uint32_t Reserved4_7: + 4; +uint32_t soffn : + 14; +uint32_t Reserved22_31 : + 10; + } + b; +} USB_OTG_DSTS_TypeDef ; +typedef union _USB_OTG_DIEPINTn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t epdisabled : + 1; +uint32_t Reserved2 : + 1; +uint32_t timeout : + 1; +uint32_t intktxfemp : + 1; +uint32_t Reserved5 : + 1; +uint32_t inepnakeff : + 1; +uint32_t emptyintr : + 1; +uint32_t txfifoundrn : + 1; +uint32_t Reserved14_31 : + 23; + } + b; +} USB_OTG_DIEPINTn_TypeDef ; +typedef union _USB_OTG_DIEPINTn_TypeDef USB_OTG_DIEPMSK_TypeDef ; +typedef union _USB_OTG_DOEPINTn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t epdisabled : + 1; +uint32_t Reserved2 : + 1; +uint32_t setup : + 1; +uint32_t Reserved04_31 : + 28; + } + b; +} USB_OTG_DOEPINTn_TypeDef ; +typedef union _USB_OTG_DOEPINTn_TypeDef USB_OTG_DOEPMSK_TypeDef ; + +typedef union _USB_OTG_DAINT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t in : + 16; +uint32_t out : + 16; + } + ep; +} USB_OTG_DAINT_TypeDef ; + +typedef union _USB_OTG_DTHRCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t non_iso_thr_en : + 1; +uint32_t iso_thr_en : + 1; +uint32_t tx_thr_len : + 9; +uint32_t Reserved11_15 : + 5; +uint32_t rx_thr_en : + 1; +uint32_t rx_thr_len : + 9; +uint32_t Reserved26 : + 1; +uint32_t arp_en : + 1; +uint32_t Reserved28_31 : + 4; + } + b; +} USB_OTG_DTHRCTL_TypeDef ; +typedef union _USB_OTG_DEPCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t mps : + 11; +uint32_t reserved : + 4; +uint32_t usbactep : + 1; +uint32_t dpid : + 1; +uint32_t naksts : + 1; +uint32_t eptype : + 2; +uint32_t snp : + 1; +uint32_t stall : + 1; +uint32_t txfnum : + 4; +uint32_t cnak : + 1; +uint32_t snak : + 1; +uint32_t setd0pid : + 1; +uint32_t setd1pid : + 1; +uint32_t epdis : + 1; +uint32_t epena : + 1; + } + b; +} USB_OTG_DEPCTL_TypeDef ; +typedef union _USB_OTG_DEPXFRSIZ_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfersize : + 19; +uint32_t pktcnt : + 10; +uint32_t mc : + 2; +uint32_t Reserved : + 1; + } + b; +} USB_OTG_DEPXFRSIZ_TypeDef ; +typedef union _USB_OTG_DEP0XFRSIZ_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfersize : + 7; +uint32_t Reserved7_18 : + 12; +uint32_t pktcnt : + 2; +uint32_t Reserved20_28 : + 9; +uint32_t supcnt : + 2; + uint32_t Reserved31; + } + b; +} USB_OTG_DEP0XFRSIZ_TypeDef ; +typedef union _USB_OTG_HCFG_TypeDef +{ + uint32_t d32; + struct + { +uint32_t fslspclksel : + 2; +uint32_t fslssupp : + 1; + } + b; +} USB_OTG_HCFG_TypeDef ; +typedef union _USB_OTG_HFRMINTRVL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t frint : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_HFRMINTRVL_TypeDef ; + +typedef union _USB_OTG_HFNUM_TypeDef +{ + uint32_t d32; + struct + { +uint32_t frnum : + 16; +uint32_t frrem : + 16; + } + b; +} USB_OTG_HFNUM_TypeDef ; +typedef union _USB_OTG_HPTXSTS_TypeDef +{ + uint32_t d32; + struct + { +uint32_t ptxfspcavail : + 16; +uint32_t ptxqspcavail : + 8; + struct + { + uint32_t terminate : + 1; + uint32_t token : + 2; + uint32_t chnum : + 4; + uint32_t odd_even : + 1; + } ptxqtop; + } + b; +} USB_OTG_HPTXSTS_TypeDef ; +typedef union _USB_OTG_HPRT0_TypeDef +{ + uint32_t d32; + struct + { +uint32_t prtconnsts : + 1; +uint32_t prtconndet : + 1; +uint32_t prtena : + 1; +uint32_t prtenchng : + 1; +uint32_t prtovrcurract : + 1; +uint32_t prtovrcurrchng : + 1; +uint32_t prtres : + 1; +uint32_t prtsusp : + 1; +uint32_t prtrst : + 1; +uint32_t Reserved9 : + 1; +uint32_t prtlnsts : + 2; +uint32_t prtpwr : + 1; +uint32_t prttstctl : + 4; +uint32_t prtspd : + 2; +uint32_t Reserved19_31 : + 13; + } + b; +} USB_OTG_HPRT0_TypeDef ; +typedef union _USB_OTG_HAINT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t chint : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_HAINT_TypeDef ; +typedef union _USB_OTG_HAINTMSK_TypeDef +{ + uint32_t d32; + struct + { +uint32_t chint : + 16; +uint32_t Reserved : + 16; + } + b; +} USB_OTG_HAINTMSK_TypeDef ; +typedef union _USB_OTG_HCCHAR_TypeDef +{ + uint32_t d32; + struct + { +uint32_t mps : + 11; +uint32_t epnum : + 4; +uint32_t epdir : + 1; +uint32_t Reserved : + 1; +uint32_t lspddev : + 1; +uint32_t eptype : + 2; +uint32_t multicnt : + 2; +uint32_t devaddr : + 7; +uint32_t oddfrm : + 1; +uint32_t chdis : + 1; +uint32_t chen : + 1; + } + b; +} USB_OTG_HCCHAR_TypeDef ; +typedef union _USB_OTG_HCSPLT_TypeDef +{ + uint32_t d32; + struct + { +uint32_t prtaddr : + 7; +uint32_t hubaddr : + 7; +uint32_t xactpos : + 2; +uint32_t compsplt : + 1; +uint32_t Reserved : + 14; +uint32_t spltena : + 1; + } + b; +} USB_OTG_HCSPLT_TypeDef ; +typedef union _USB_OTG_HCINTn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t chhltd : + 1; +uint32_t ahberr : + 1; +uint32_t stall : + 1; +uint32_t nak : + 1; +uint32_t ack : + 1; +uint32_t nyet : + 1; +uint32_t xacterr : + 1; +uint32_t bblerr : + 1; +uint32_t frmovrun : + 1; +uint32_t datatglerr : + 1; +uint32_t Reserved : + 21; + } + b; +} USB_OTG_HCINTn_TypeDef ; +typedef union _USB_OTG_HCTSIZn_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfersize : + 19; +uint32_t pktcnt : + 10; +uint32_t pid : + 2; +uint32_t dopng : + 1; + } + b; +} USB_OTG_HCTSIZn_TypeDef ; +typedef union _USB_OTG_HCINTMSK_TypeDef +{ + uint32_t d32; + struct + { +uint32_t xfercompl : + 1; +uint32_t chhltd : + 1; +uint32_t ahberr : + 1; +uint32_t stall : + 1; +uint32_t nak : + 1; +uint32_t ack : + 1; +uint32_t nyet : + 1; +uint32_t xacterr : + 1; +uint32_t bblerr : + 1; +uint32_t frmovrun : + 1; +uint32_t datatglerr : + 1; +uint32_t Reserved : + 21; + } + b; +} USB_OTG_HCINTMSK_TypeDef ; + +typedef union _USB_OTG_PCGCCTL_TypeDef +{ + uint32_t d32; + struct + { +uint32_t stoppclk : + 1; +uint32_t gatehclk : + 1; +uint32_t Reserved2_3 : + 2; +uint32_t phy_susp : + 1; +uint32_t Reserved5_31 : + 27; + } + b; +} USB_OTG_PCGCCTL_TypeDef ; + +/** + * @} + */ + + +/** @defgroup USB_REGS_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_REGS_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_REGS_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +#endif //__USB_OTG_REGS_H__ + + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/src/usb_core.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/src/usb_core.c new file mode 100644 index 00000000..e257e73d --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/src/usb_core.c @@ -0,0 +1,2162 @@ +/** + ****************************************************************************** + * @file usb_core.c + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief USB-OTG Core Layer + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_core.h" +#include "usb_bsp.h" + + +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_CORE +* @brief This file includes the USB-OTG Core Layer +* @{ +*/ + + +/** @defgroup USB_CORE_Private_Defines +* @{ +*/ + +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + + +/** @defgroup USB_CORE_Private_Macros +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_Variables +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_FunctionPrototypes +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_CORE_Private_Functions +* @{ +*/ + +/** +* @brief USB_OTG_EnableCommonInt +* Initializes the commmon interrupts, used in both device and modes +* @param pdev : Selected device +* @retval None +*/ +static void USB_OTG_EnableCommonInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTMSK_TypeDef int_mask; + + int_mask.d32 = 0; + /* Clear any pending USB_OTG Interrupts */ +#ifndef USE_OTG_MODE + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GOTGINT, 0xFFFFFFFF); +#endif + /* Clear any pending interrupts */ + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, 0xBFFFFFFF); + /* Enable the interrupts in the INTMSK */ + int_mask.b.wkupintr = 1; + int_mask.b.usbsuspend = 1; + +#ifdef USE_OTG_MODE + int_mask.b.otgintr = 1; + int_mask.b.sessreqintr = 1; + int_mask.b.conidstschng = 1; +#endif + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTMSK, int_mask.d32); +} + +/** +* @brief USB_OTG_CoreReset : Soft reset of the core +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +static USB_OTG_STS USB_OTG_CoreReset(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + __IO USB_OTG_GRSTCTL_TypeDef greset; + uint32_t count = 0; + + greset.d32 = 0; + /* Wait for AHB master IDLE state. */ + do + { + USB_OTG_BSP_uDelay(3); + greset.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + return USB_OTG_OK; + } + } + while (greset.b.ahbidle == 0); + /* Core Soft Reset */ + count = 0; + greset.b.csftrst = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRSTCTL, greset.d32 ); + do + { + greset.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + break; + } + } + while (greset.b.csftrst == 1); + /* Wait for 3 PHY Clocks*/ + USB_OTG_BSP_uDelay(3); + return status; +} + +/** +* @brief USB_OTG_WritePacket : Writes a packet into the Tx FIFO associated +* with the EP +* @param pdev : Selected device +* @param src : source pointer +* @param ch_ep_num : end point number +* @param bytes : No. of bytes +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_WritePacket(USB_OTG_CORE_HANDLE *pdev, + uint8_t *src, + uint8_t ch_ep_num, + uint16_t len) +{ + USB_OTG_STS status = USB_OTG_OK; + if (pdev->cfg.dma_enable == 0) + { + uint32_t count32b= 0 , i= 0; + __IO uint32_t *fifo; + + count32b = (len + 3) / 4; + fifo = pdev->regs.DFIFO[ch_ep_num]; + for (i = 0; i < count32b; i++, src+=4) + { + USB_OTG_WRITE_REG32( fifo, *((__packed uint32_t *)src) ); + } + } + return status; +} + + +/** +* @brief USB_OTG_ReadPacket : Reads a packet from the Rx FIFO +* @param pdev : Selected device +* @param dest : Destination Pointer +* @param bytes : No. of bytes +* @retval None +*/ +void *USB_OTG_ReadPacket(USB_OTG_CORE_HANDLE *pdev, + uint8_t *dest, + uint16_t len) +{ + uint32_t i=0; + uint32_t count32b = (len + 3) / 4; + + __IO uint32_t *fifo = pdev->regs.DFIFO[0]; + + for ( i = 0; i < count32b; i++, dest += 4 ) + { + *(__packed uint32_t *)dest = USB_OTG_READ_REG32(fifo); + + } + return ((void *)dest); +} + +/** +* @brief USB_OTG_SelectCore +* Initialize core registers address. +* @param pdev : Selected device +* @param coreID : USB OTG Core ID +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_SelectCore(USB_OTG_CORE_HANDLE *pdev, + USB_OTG_CORE_ID_TypeDef coreID) +{ + uint32_t i , baseAddress = 0; + USB_OTG_STS status = USB_OTG_OK; + + pdev->cfg.dma_enable = 0; + + /* at startup the core is in FS mode */ + pdev->cfg.speed = USB_OTG_SPEED_FULL; + pdev->cfg.mps = USB_OTG_FS_MAX_PACKET_SIZE ; + + /* initialize device cfg following its address */ + if (coreID == USB_OTG_FS_CORE_ID) + { + baseAddress = USB_OTG_FS_BASE_ADDR; + pdev->cfg.coreID = USB_OTG_FS_CORE_ID; + pdev->cfg.host_channels = 8 ; + pdev->cfg.dev_endpoints = 4 ; + pdev->cfg.TotalFifoSize = 320; /* in 32-bits */ + pdev->cfg.phy_itface = USB_OTG_EMBEDDED_PHY; + +#ifdef USB_OTG_FS_SOF_OUTPUT_ENABLED + pdev->cfg.Sof_output = 1; +#endif + +#ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT + pdev->cfg.low_power = 1; +#endif + } + else if (coreID == USB_OTG_HS_CORE_ID) + { + baseAddress = USB_OTG_HS_BASE_ADDR; + pdev->cfg.coreID = USB_OTG_HS_CORE_ID; + pdev->cfg.host_channels = 12 ; + pdev->cfg.dev_endpoints = 6 ; + pdev->cfg.TotalFifoSize = 1280;/* in 32-bits */ + +#ifdef USB_OTG_ULPI_PHY_ENABLED + pdev->cfg.phy_itface = USB_OTG_ULPI_PHY; +#else +#ifdef USB_OTG_EMBEDDED_PHY_ENABLED + pdev->cfg.phy_itface = USB_OTG_EMBEDDED_PHY; +#endif +#endif + +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + pdev->cfg.dma_enable = 1; +#endif + +#ifdef USB_OTG_HS_SOF_OUTPUT_ENABLED + pdev->cfg.Sof_output = 1; +#endif + +#ifdef USB_OTG_HS_LOW_PWR_MGMT_SUPPORT + pdev->cfg.low_power = 1; +#endif + + } + + pdev->regs.GREGS = (USB_OTG_GREGS *)(baseAddress + \ + USB_OTG_CORE_GLOBAL_REGS_OFFSET); + pdev->regs.DREGS = (USB_OTG_DREGS *) (baseAddress + \ + USB_OTG_DEV_GLOBAL_REG_OFFSET); + + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + pdev->regs.INEP_REGS[i] = (USB_OTG_INEPREGS *) \ + (baseAddress + USB_OTG_DEV_IN_EP_REG_OFFSET + \ + (i * USB_OTG_EP_REG_OFFSET)); + pdev->regs.OUTEP_REGS[i] = (USB_OTG_OUTEPREGS *) \ + (baseAddress + USB_OTG_DEV_OUT_EP_REG_OFFSET + \ + (i * USB_OTG_EP_REG_OFFSET)); + } + pdev->regs.HREGS = (USB_OTG_HREGS *)(baseAddress + \ + USB_OTG_HOST_GLOBAL_REG_OFFSET); + pdev->regs.HPRT0 = (uint32_t *)(baseAddress + USB_OTG_HOST_PORT_REGS_OFFSET); + + for (i = 0; i < pdev->cfg.host_channels; i++) + { + pdev->regs.HC_REGS[i] = (USB_OTG_HC_REGS *)(baseAddress + \ + USB_OTG_HOST_CHAN_REGS_OFFSET + \ + (i * USB_OTG_CHAN_REGS_OFFSET)); + } + for (i = 0; i < pdev->cfg.host_channels; i++) + { + pdev->regs.DFIFO[i] = (uint32_t *)(baseAddress + USB_OTG_DATA_FIFO_OFFSET +\ + (i * USB_OTG_DATA_FIFO_SIZE)); + } + pdev->regs.PCGCCTL = (uint32_t *)(baseAddress + USB_OTG_PCGCCTL_OFFSET); + + return status; +} + + +/** +* @brief USB_OTG_CoreInit +* Initializes the USB_OTG controller registers and prepares the core +* device mode or host mode operation. +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_CoreInit(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GUSBCFG_TypeDef usbcfg; + USB_OTG_GCCFG_TypeDef gccfg; + USB_OTG_GAHBCFG_TypeDef ahbcfg; + + usbcfg.d32 = 0; + gccfg.d32 = 0; + ahbcfg.d32 = 0; + + + + if (pdev->cfg.phy_itface == USB_OTG_ULPI_PHY) + { + gccfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GCCFG); + gccfg.b.pwdn = 0; + + if (pdev->cfg.Sof_output) + { + gccfg.b.sofouten = 1; + } + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GCCFG, gccfg.d32); + + /* Init The ULPI Interface */ + usbcfg.d32 = 0; + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + + usbcfg.b.physel = 0; /* HS Interface */ +#ifdef USB_OTG_INTERNAL_VBUS_ENABLED + usbcfg.b.ulpi_ext_vbus_drv = 0; /* Use internal VBUS */ +#else +#ifdef USB_OTG_EXTERNAL_VBUS_ENABLED + usbcfg.b.ulpi_ext_vbus_drv = 1; /* Use external VBUS */ +#endif +#endif + usbcfg.b.term_sel_dl_pulse = 0; /* Data line pulsing using utmi_txvalid */ + + usbcfg.b.ulpi_fsls = 0; + usbcfg.b.ulpi_clk_sus_m = 0; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + + /* Reset after a PHY select */ + USB_OTG_CoreReset(pdev); + + if(pdev->cfg.dma_enable == 1) + { + + ahbcfg.b.hburstlen = 5; /* 64 x 32-bits*/ + ahbcfg.b.dmaenable = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32); + + } + } + else /* FS interface (embedded Phy) */ + { + + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG);; + usbcfg.b.physel = 1; /* FS Interface */ + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + /* Reset after a PHY select and set Host mode */ + USB_OTG_CoreReset(pdev); + /* Deactivate the power down*/ + gccfg.d32 = 0; + gccfg.b.pwdn = 1; + + gccfg.b.vbussensingA = 1 ; + gccfg.b.vbussensingB = 1 ; +#ifndef VBUS_SENSING_ENABLED + gccfg.b.disablevbussensing = 1; +#endif + + if(pdev->cfg.Sof_output) + { + gccfg.b.sofouten = 1; + } + + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GCCFG, gccfg.d32); + USB_OTG_BSP_mDelay(20); + } + /* case the HS core is working in FS mode */ + if(pdev->cfg.dma_enable == 1) + { + + ahbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GAHBCFG); + ahbcfg.b.hburstlen = 5; /* 64 x 32-bits*/ + ahbcfg.b.dmaenable = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32); + + } + /* initialize OTG features */ +#ifdef USE_OTG_MODE + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + usbcfg.b.hnpcap = 1; + usbcfg.b.srpcap = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + USB_OTG_EnableCommonInt(pdev); +#endif + return status; +} +/** +* @brief USB_OTG_EnableGlobalInt +* Enables the controller's Global Int in the AHB Config reg +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EnableGlobalInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GAHBCFG_TypeDef ahbcfg; + + ahbcfg.d32 = 0; + ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */ + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GAHBCFG, 0, ahbcfg.d32); + return status; +} + + +/** +* @brief USB_OTG_DisableGlobalInt +* Enables the controller's Global Int in the AHB Config reg +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_DisableGlobalInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GAHBCFG_TypeDef ahbcfg; + ahbcfg.d32 = 0; + ahbcfg.b.glblintrmsk = 1; /* Enable interrupts */ + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GAHBCFG, ahbcfg.d32, 0); + return status; +} + + +/** +* @brief USB_OTG_FlushTxFifo : Flush a Tx FIFO +* @param pdev : Selected device +* @param num : FO num +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_FlushTxFifo (USB_OTG_CORE_HANDLE *pdev , uint32_t num ) +{ + USB_OTG_STS status = USB_OTG_OK; + __IO USB_OTG_GRSTCTL_TypeDef greset; + + uint32_t count = 0; + greset.d32 = 0; + greset.b.txfflsh = 1; + greset.b.txfnum = num; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GRSTCTL, greset.d32 ); + do + { + greset.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + break; + } + } + while (greset.b.txfflsh == 1); + /* Wait for 3 PHY Clocks*/ + USB_OTG_BSP_uDelay(3); + return status; +} + + +/** +* @brief USB_OTG_FlushRxFifo : Flush a Rx FIFO +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_FlushRxFifo( USB_OTG_CORE_HANDLE *pdev ) +{ + USB_OTG_STS status = USB_OTG_OK; + __IO USB_OTG_GRSTCTL_TypeDef greset; + uint32_t count = 0; + + greset.d32 = 0; + greset.b.rxfflsh = 1; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GRSTCTL, greset.d32 ); + do + { + greset.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRSTCTL); + if (++count > 200000) + { + break; + } + } + while (greset.b.rxfflsh == 1); + /* Wait for 3 PHY Clocks*/ + USB_OTG_BSP_uDelay(3); + return status; +} + + +/** +* @brief USB_OTG_SetCurrentMode : Set ID line +* @param pdev : Selected device +* @param mode : (Host/device) +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_SetCurrentMode(USB_OTG_CORE_HANDLE *pdev , uint8_t mode) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GUSBCFG_TypeDef usbcfg; + + usbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + + usbcfg.b.force_host = 0; + usbcfg.b.force_dev = 0; + + if ( mode == HOST_MODE) + { + usbcfg.b.force_host = 1; + } + else if ( mode == DEVICE_MODE) + { + usbcfg.b.force_dev = 1; + } + + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, usbcfg.d32); + USB_OTG_BSP_mDelay(50); + return status; +} + + +/** +* @brief USB_OTG_GetMode : Get current mode +* @param pdev : Selected device +* @retval current mode +*/ +uint32_t USB_OTG_GetMode(USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTSTS ) & 0x1); +} + + +/** +* @brief USB_OTG_IsDeviceMode : Check if it is device mode +* @param pdev : Selected device +* @retval num_in_ep +*/ +uint8_t USB_OTG_IsDeviceMode(USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_GetMode(pdev) != HOST_MODE); +} + + +/** +* @brief USB_OTG_IsHostMode : Check if it is host mode +* @param pdev : Selected device +* @retval num_in_ep +*/ +uint8_t USB_OTG_IsHostMode(USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_GetMode(pdev) == HOST_MODE); +} + + +/** +* @brief USB_OTG_ReadCoreItr : returns the Core Interrupt register +* @param pdev : Selected device +* @retval Status +*/ +uint32_t USB_OTG_ReadCoreItr(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t v = 0; + v = USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTSTS); + v &= USB_OTG_READ_REG32(&pdev->regs.GREGS->GINTMSK); + return v; +} + + +/** +* @brief USB_OTG_ReadOtgItr : returns the USB_OTG Interrupt register +* @param pdev : Selected device +* @retval Status +*/ +uint32_t USB_OTG_ReadOtgItr (USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_READ_REG32 (&pdev->regs.GREGS->GOTGINT)); +} + +#ifdef USE_HOST_MODE +/** +* @brief USB_OTG_CoreInitHost : Initializes USB_OTG controller for host mode +* @param pdev : Selected device +* @retval status +*/ +USB_OTG_STS USB_OTG_CoreInitHost(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_FSIZ_TypeDef nptxfifosize; + USB_OTG_FSIZ_TypeDef ptxfifosize; + USB_OTG_HCFG_TypeDef hcfg; + +#ifdef USE_OTG_MODE + USB_OTG_OTGCTL_TypeDef gotgctl; +#endif + + uint32_t i = 0; + + nptxfifosize.d32 = 0; + ptxfifosize.d32 = 0; +#ifdef USE_OTG_MODE + gotgctl.d32 = 0; +#endif + hcfg.d32 = 0; + + + /* configure charge pump IO */ + USB_OTG_BSP_ConfigVBUS(pdev); + + /* Restart the Phy Clock */ + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, 0); + + /* Initialize Host Configuration Register */ + if (pdev->cfg.phy_itface == USB_OTG_ULPI_PHY) + { + USB_OTG_InitFSLSPClkSel(pdev , HCFG_30_60_MHZ); + } + else + { + USB_OTG_InitFSLSPClkSel(pdev , HCFG_48_MHZ); + } + USB_OTG_ResetPort(pdev); + + hcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HCFG); + hcfg.b.fslssupp = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HCFG, hcfg.d32); + + /* Configure data FIFO sizes */ + /* Rx FIFO */ +#ifdef USB_OTG_FS_CORE + if(pdev->cfg.coreID == USB_OTG_FS_CORE_ID) + { + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_FS_SIZE); + nptxfifosize.b.startaddr = RX_FIFO_FS_SIZE; + nptxfifosize.b.depth = TXH_NP_FS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32); + + ptxfifosize.b.startaddr = RX_FIFO_FS_SIZE + TXH_NP_FS_FIFOSIZ; + ptxfifosize.b.depth = TXH_P_FS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->HPTXFSIZ, ptxfifosize.d32); + } +#endif +#ifdef USB_OTG_HS_CORE + if (pdev->cfg.coreID == USB_OTG_HS_CORE_ID) + { + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_HS_SIZE); + nptxfifosize.b.startaddr = RX_FIFO_HS_SIZE; + nptxfifosize.b.depth = TXH_NP_HS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32); + + ptxfifosize.b.startaddr = RX_FIFO_HS_SIZE + TXH_NP_HS_FIFOSIZ; + ptxfifosize.b.depth = TXH_P_HS_FIFOSIZ; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->HPTXFSIZ, ptxfifosize.d32); + } +#endif + +#ifdef USE_OTG_MODE + /* Clear Host Set HNP Enable in the USB_OTG Control Register */ + gotgctl.b.hstsethnpen = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GOTGCTL, gotgctl.d32, 0); +#endif + + /* Make sure the FIFOs are flushed. */ + USB_OTG_FlushTxFifo(pdev, 0x10 ); /* all Tx FIFOs */ + USB_OTG_FlushRxFifo(pdev); + + + /* Clear all pending HC Interrupts */ + for (i = 0; i < pdev->cfg.host_channels; i++) + { + USB_OTG_WRITE_REG32( &pdev->regs.HC_REGS[i]->HCINT, 0xFFFFFFFF ); + USB_OTG_WRITE_REG32( &pdev->regs.HC_REGS[i]->HCINTMSK, 0 ); + } +#ifndef USE_OTG_MODE + USB_OTG_DriveVbus(pdev, 1); +#endif + + USB_OTG_EnableHostInt(pdev); + return status; +} + +/** +* @brief USB_OTG_IsEvenFrame +* This function returns the frame number for sof packet +* @param pdev : Selected device +* @retval Frame number +*/ +uint8_t USB_OTG_IsEvenFrame (USB_OTG_CORE_HANDLE *pdev) +{ + return !(USB_OTG_READ_REG32(&pdev->regs.HREGS->HFNUM) & 0x1); +} + +/** +* @brief USB_OTG_DriveVbus : set/reset vbus +* @param pdev : Selected device +* @param state : VBUS state +* @retval None +*/ +void USB_OTG_DriveVbus (USB_OTG_CORE_HANDLE *pdev, uint8_t state) +{ + USB_OTG_HPRT0_TypeDef hprt0; + + hprt0.d32 = 0; + + /* enable disable the external charge pump */ + USB_OTG_BSP_DriveVBUS(pdev, state); + + /* Turn on the Host port power. */ + hprt0.d32 = USB_OTG_ReadHPRT0(pdev); + if ((hprt0.b.prtpwr == 0 ) && (state == 1 )) + { + hprt0.b.prtpwr = 1; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + } + if ((hprt0.b.prtpwr == 1 ) && (state == 0 )) + { + hprt0.b.prtpwr = 0; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + } + + USB_OTG_BSP_mDelay(200); +} +/** +* @brief USB_OTG_EnableHostInt: Enables the Host mode interrupts +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EnableHostInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GINTMSK_TypeDef intmsk; + intmsk.d32 = 0; + /* Disable all interrupts. */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTMSK, 0); + + /* Clear any pending interrupts. */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, 0xFFFFFFFF); + + /* Enable the common interrupts */ + USB_OTG_EnableCommonInt(pdev); + + if (pdev->cfg.dma_enable == 0) + { + intmsk.b.rxstsqlvl = 1; + } + intmsk.b.portintr = 1; + intmsk.b.hcintr = 1; + intmsk.b.disconnect = 1; + intmsk.b.sofintr = 1; + intmsk.b.incomplisoout = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GINTMSK, intmsk.d32, intmsk.d32); + return status; +} + +/** +* @brief USB_OTG_InitFSLSPClkSel : Initializes the FSLSPClkSel field of the +* HCFG register on the PHY type +* @param pdev : Selected device +* @param freq : clock frequency +* @retval None +*/ +void USB_OTG_InitFSLSPClkSel(USB_OTG_CORE_HANDLE *pdev , uint8_t freq) +{ + USB_OTG_HCFG_TypeDef hcfg; + + hcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HCFG); + hcfg.b.fslspclksel = freq; + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HCFG, hcfg.d32); +} + + +/** +* @brief USB_OTG_ReadHPRT0 : Reads HPRT0 to modify later +* @param pdev : Selected device +* @retval HPRT0 value +*/ +uint32_t USB_OTG_ReadHPRT0(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_HPRT0_TypeDef hprt0; + + hprt0.d32 = USB_OTG_READ_REG32(pdev->regs.HPRT0); + hprt0.b.prtena = 0; + hprt0.b.prtconndet = 0; + hprt0.b.prtenchng = 0; + hprt0.b.prtovrcurrchng = 0; + return hprt0.d32; +} + + +/** +* @brief USB_OTG_ReadHostAllChannels_intr : Register PCD Callbacks +* @param pdev : Selected device +* @retval Status +*/ +uint32_t USB_OTG_ReadHostAllChannels_intr (USB_OTG_CORE_HANDLE *pdev) +{ + return (USB_OTG_READ_REG32 (&pdev->regs.HREGS->HAINT)); +} + + +/** +* @brief USB_OTG_ResetPort : Reset Host Port +* @param pdev : Selected device +* @retval status +* @note : (1)The application must wait at least 10 ms (+ 10 ms security) +* before clearing the reset bit. +*/ +uint32_t USB_OTG_ResetPort(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_HPRT0_TypeDef hprt0; + + hprt0.d32 = USB_OTG_ReadHPRT0(pdev); + hprt0.b.prtrst = 1; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + USB_OTG_BSP_mDelay (10); /* See Note #1 */ + hprt0.b.prtrst = 0; + USB_OTG_WRITE_REG32(pdev->regs.HPRT0, hprt0.d32); + USB_OTG_BSP_mDelay (20); + return 1; +} + + +/** +* @brief USB_OTG_HC_Init : Prepares a host channel for transferring packets +* @param pdev : Selected device +* @param hc_num : channel number +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_HC_Init(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + uint32_t intr_enable = 0; + USB_OTG_HCINTMSK_TypeDef hcintmsk; + USB_OTG_GINTMSK_TypeDef gintmsk; + USB_OTG_HCCHAR_TypeDef hcchar; + USB_OTG_HCINTn_TypeDef hcint; + + + gintmsk.d32 = 0; + hcintmsk.d32 = 0; + hcchar.d32 = 0; + + /* Clear old interrupt conditions for this host channel. */ + hcint.d32 = 0xFFFFFFFF; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCINT, hcint.d32); + + /* Enable channel interrupts required for this transfer. */ + hcintmsk.d32 = 0; + + if (pdev->cfg.dma_enable == 1) + { + hcintmsk.b.ahberr = 1; + } + + switch (pdev->host.hc[hc_num].ep_type) + { + case EP_TYPE_CTRL: + case EP_TYPE_BULK: + hcintmsk.b.xfercompl = 1; + hcintmsk.b.stall = 1; + hcintmsk.b.xacterr = 1; + hcintmsk.b.datatglerr = 1; + hcintmsk.b.nak = 1; + if (pdev->host.hc[hc_num].ep_is_in) + { + hcintmsk.b.bblerr = 1; + } + else + { + hcintmsk.b.nyet = 1; + if (pdev->host.hc[hc_num].do_ping) + { + hcintmsk.b.ack = 1; + } + } + break; + case EP_TYPE_INTR: + hcintmsk.b.xfercompl = 1; + hcintmsk.b.nak = 1; + hcintmsk.b.stall = 1; + hcintmsk.b.xacterr = 1; + hcintmsk.b.datatglerr = 1; + hcintmsk.b.frmovrun = 1; + + if (pdev->host.hc[hc_num].ep_is_in) + { + hcintmsk.b.bblerr = 1; + } + + break; + case EP_TYPE_ISOC: + hcintmsk.b.xfercompl = 1; + hcintmsk.b.frmovrun = 1; + hcintmsk.b.ack = 1; + + if (pdev->host.hc[hc_num].ep_is_in) + { + hcintmsk.b.xacterr = 1; + hcintmsk.b.bblerr = 1; + } + break; + } + + + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCINTMSK, hcintmsk.d32); + + + /* Enable the top level host channel interrupt. */ + intr_enable = (1 << hc_num); + USB_OTG_MODIFY_REG32(&pdev->regs.HREGS->HAINTMSK, 0, intr_enable); + + /* Make sure host channel interrupts are enabled. */ + gintmsk.b.hcintr = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.GREGS->GINTMSK, 0, gintmsk.d32); + + /* Program the HCCHAR register */ + hcchar.d32 = 0; + hcchar.b.devaddr = pdev->host.hc[hc_num].dev_addr; + hcchar.b.epnum = pdev->host.hc[hc_num].ep_num; + hcchar.b.epdir = pdev->host.hc[hc_num].ep_is_in; + hcchar.b.lspddev = (pdev->host.hc[hc_num].speed == HPRT0_PRTSPD_LOW_SPEED); + hcchar.b.eptype = pdev->host.hc[hc_num].ep_type; + hcchar.b.mps = pdev->host.hc[hc_num].max_packet; + if (pdev->host.hc[hc_num].ep_type == HCCHAR_INTR) + { + hcchar.b.oddfrm = 1; + } + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + return status; +} + + +/** +* @brief USB_OTG_HC_StartXfer : Start transfer +* @param pdev : Selected device +* @param hc_num : channel number +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_HC_StartXfer(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_HCCHAR_TypeDef hcchar; + USB_OTG_HCTSIZn_TypeDef hctsiz; + USB_OTG_HNPTXSTS_TypeDef hnptxsts; + USB_OTG_HPTXSTS_TypeDef hptxsts; + USB_OTG_GINTMSK_TypeDef intmsk; + uint16_t len_words = 0; + + uint16_t num_packets; + uint16_t max_hc_pkt_count; + + max_hc_pkt_count = 256; + hctsiz.d32 = 0; + hcchar.d32 = 0; + intmsk.d32 = 0; + + /* Compute the expected number of packets associated to the transfer */ + if (pdev->host.hc[hc_num].xfer_len > 0) + { + num_packets = (pdev->host.hc[hc_num].xfer_len + \ + pdev->host.hc[hc_num].max_packet - 1) / pdev->host.hc[hc_num].max_packet; + + if (num_packets > max_hc_pkt_count) + { + num_packets = max_hc_pkt_count; + pdev->host.hc[hc_num].xfer_len = num_packets * \ + pdev->host.hc[hc_num].max_packet; + } + } + else + { + num_packets = 1; + } + if (pdev->host.hc[hc_num].ep_is_in) + { + pdev->host.hc[hc_num].xfer_len = num_packets * \ + pdev->host.hc[hc_num].max_packet; + } + /* Initialize the HCTSIZn register */ + hctsiz.b.xfersize = pdev->host.hc[hc_num].xfer_len; + hctsiz.b.pktcnt = num_packets; + hctsiz.b.pid = pdev->host.hc[hc_num].data_pid; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCTSIZ, hctsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCDMA, (unsigned int)pdev->host.hc[hc_num].xfer_buff); + } + + + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR); + hcchar.b.oddfrm = USB_OTG_IsEvenFrame(pdev); + + /* Set host channel enable */ + hcchar.b.chen = 1; + hcchar.b.chdis = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + + if (pdev->cfg.dma_enable == 0) /* Slave mode */ + { + if((pdev->host.hc[hc_num].ep_is_in == 0) && + (pdev->host.hc[hc_num].xfer_len > 0)) + { + switch(pdev->host.hc[hc_num].ep_type) + { + /* Non periodic transfer */ + case EP_TYPE_CTRL: + case EP_TYPE_BULK: + + hnptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->HNPTXSTS); + len_words = (pdev->host.hc[hc_num].xfer_len + 3) / 4; + + /* check if there is enough space in FIFO space */ + if(len_words > hnptxsts.b.nptxfspcavail) + { + /* need to process data in nptxfempty interrupt */ + intmsk.b.nptxfempty = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, intmsk.d32); + } + + break; + /* Periodic transfer */ + case EP_TYPE_INTR: + case EP_TYPE_ISOC: + hptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HPTXSTS); + len_words = (pdev->host.hc[hc_num].xfer_len + 3) / 4; + /* check if there is enough space in FIFO space */ + if(len_words > hptxsts.b.ptxfspcavail) /* split the transfer */ + { + /* need to process data in ptxfempty interrupt */ + intmsk.b.ptxfempty = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, intmsk.d32); + } + break; + + default: + break; + } + + /* Write packet into the Tx FIFO. */ + USB_OTG_WritePacket(pdev, + pdev->host.hc[hc_num].xfer_buff , + hc_num, pdev->host.hc[hc_num].xfer_len); + } + } + return status; +} + + +/** +* @brief USB_OTG_HC_Halt : Halt channel +* @param pdev : Selected device +* @param hc_num : channel number +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_HC_Halt(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_HNPTXSTS_TypeDef nptxsts; + USB_OTG_HPTXSTS_TypeDef hptxsts; + USB_OTG_HCCHAR_TypeDef hcchar; + + nptxsts.d32 = 0; + hptxsts.d32 = 0; + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR); + hcchar.b.chen = 1; + hcchar.b.chdis = 1; + + /* Check for space in the request queue to issue the halt. */ + if (hcchar.b.eptype == HCCHAR_CTRL || hcchar.b.eptype == HCCHAR_BULK) + { + nptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->HNPTXSTS); + if (nptxsts.b.nptxqspcavail == 0) + { + hcchar.b.chen = 0; + } + } + else + { + hptxsts.d32 = USB_OTG_READ_REG32(&pdev->regs.HREGS->HPTXSTS); + if (hptxsts.b.ptxqspcavail == 0) + { + hcchar.b.chen = 0; + } + } + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + return status; +} + +/** +* @brief Issue a ping token +* @param None +* @retval : None +*/ +USB_OTG_STS USB_OTG_HC_DoPing(USB_OTG_CORE_HANDLE *pdev , uint8_t hc_num) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_HCCHAR_TypeDef hcchar; + USB_OTG_HCTSIZn_TypeDef hctsiz; + + hctsiz.d32 = 0; + hctsiz.b.dopng = 1; + hctsiz.b.pktcnt = 1; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCTSIZ, hctsiz.d32); + + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR); + hcchar.b.chen = 1; + hcchar.b.chdis = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[hc_num]->HCCHAR, hcchar.d32); + return status; +} + +/** +* @brief Stop the device and clean up fifo's +* @param None +* @retval : None +*/ +void USB_OTG_StopHost(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_HCCHAR_TypeDef hcchar; + uint32_t i; + + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HAINTMSK , 0); + USB_OTG_WRITE_REG32(&pdev->regs.HREGS->HAINT, 0xFFFFFFFF); + /* Flush out any leftover queued requests. */ + + for (i = 0; i < pdev->cfg.host_channels; i++) + { + hcchar.d32 = USB_OTG_READ_REG32(&pdev->regs.HC_REGS[i]->HCCHAR); + hcchar.b.chen = 0; + hcchar.b.chdis = 1; + hcchar.b.epdir = 0; + USB_OTG_WRITE_REG32(&pdev->regs.HC_REGS[i]->HCCHAR, hcchar.d32); + } + + /* Flush the FIFO */ + USB_OTG_FlushRxFifo(pdev); + USB_OTG_FlushTxFifo(pdev , 0x10 ); +} +#endif +#ifdef USE_DEVICE_MODE +/* PCD Core Layer */ + +/** +* @brief USB_OTG_InitDevSpeed :Initializes the DevSpd field of DCFG register +* depending the PHY type and the enumeration speed of the device. +* @param pdev : Selected device +* @retval : None +*/ +void USB_OTG_InitDevSpeed(USB_OTG_CORE_HANDLE *pdev , uint8_t speed) +{ + USB_OTG_DCFG_TypeDef dcfg; + + dcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCFG); + dcfg.b.devspd = speed; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCFG, dcfg.d32); +} + + +/** +* @brief USB_OTG_CoreInitDev : Initializes the USB_OTG controller registers +* for device mode +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_CoreInitDev (USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + uint32_t i; + USB_OTG_DCFG_TypeDef dcfg; + USB_OTG_FSIZ_TypeDef nptxfifosize; + USB_OTG_FSIZ_TypeDef txfifosize; + USB_OTG_DIEPMSK_TypeDef msk; + USB_OTG_DTHRCTL_TypeDef dthrctl; + + depctl.d32 = 0; + dcfg.d32 = 0; + nptxfifosize.d32 = 0; + txfifosize.d32 = 0; + msk.d32 = 0; + + /* Restart the Phy Clock */ + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, 0); + /* Device configuration register */ + dcfg.d32 = USB_OTG_READ_REG32( &pdev->regs.DREGS->DCFG); + dcfg.b.perfrint = DCFG_FRAME_INTERVAL_80; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DCFG, dcfg.d32 ); + +#ifdef USB_OTG_FS_CORE + if(pdev->cfg.coreID == USB_OTG_FS_CORE_ID ) + { + + /* Set Full speed phy */ + USB_OTG_InitDevSpeed (pdev , USB_OTG_SPEED_PARAM_FULL); + + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_FS_SIZE); + + /* EP0 TX*/ + nptxfifosize.b.depth = TX0_FIFO_FS_SIZE; + nptxfifosize.b.startaddr = RX_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32 ); + + + /* EP1 TX*/ + txfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth; + txfifosize.b.depth = TX1_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[0], txfifosize.d32 ); + + + /* EP2 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX2_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[1], txfifosize.d32 ); + + + /* EP3 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX3_FIFO_FS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[2], txfifosize.d32 ); + } +#endif +#ifdef USB_OTG_HS_CORE + if(pdev->cfg.coreID == USB_OTG_HS_CORE_ID ) + { + + /* Set High speed phy */ + + if(pdev->cfg.phy_itface == USB_OTG_ULPI_PHY) + { + USB_OTG_InitDevSpeed (pdev , USB_OTG_SPEED_PARAM_HIGH); + } + else /* set High speed phy in Full speed mode */ + { + USB_OTG_InitDevSpeed (pdev , USB_OTG_SPEED_PARAM_HIGH_IN_FULL); + } + + /* set Rx FIFO size */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GRXFSIZ, RX_FIFO_HS_SIZE); + + /* EP0 TX*/ + nptxfifosize.b.depth = TX0_FIFO_HS_SIZE; + nptxfifosize.b.startaddr = RX_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF0_HNPTXFSIZ, nptxfifosize.d32 ); + + + /* EP1 TX*/ + txfifosize.b.startaddr = nptxfifosize.b.startaddr + nptxfifosize.b.depth; + txfifosize.b.depth = TX1_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[0], txfifosize.d32 ); + + + /* EP2 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX2_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[1], txfifosize.d32 ); + + + /* EP3 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX3_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[2], txfifosize.d32 ); + + /* EP4 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX4_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[3], txfifosize.d32 ); + + + /* EP5 TX*/ + txfifosize.b.startaddr += txfifosize.b.depth; + txfifosize.b.depth = TX5_FIFO_HS_SIZE; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->DIEPTXF[4], txfifosize.d32 ); + } +#endif + /* Flush the FIFOs */ + USB_OTG_FlushTxFifo(pdev , 0x10); /* all Tx FIFOs */ + USB_OTG_FlushRxFifo(pdev); + /* Clear all pending Device Interrupts */ + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, 0 ); + + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[i]->DIEPCTL); + if (depctl.b.epena) + { + depctl.d32 = 0; + depctl.b.epdis = 1; + depctl.b.snak = 1; + } + else + { + depctl.d32 = 0; + } + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPCTL, depctl.d32); + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPTSIZ, 0); + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF); + } + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + USB_OTG_DEPCTL_TypeDef depctl; + depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[i]->DOEPCTL); + if (depctl.b.epena) + { + depctl.d32 = 0; + depctl.b.epdis = 1; + depctl.b.snak = 1; + } + else + { + depctl.d32 = 0; + } + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPCTL, depctl.d32); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPTSIZ, 0); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF); + } + msk.d32 = 0; + msk.b.txfifoundrn = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPMSK, msk.d32, msk.d32); + + if (pdev->cfg.dma_enable == 1) + { + dthrctl.d32 = 0; + dthrctl.b.non_iso_thr_en = 1; + dthrctl.b.iso_thr_en = 1; + dthrctl.b.tx_thr_len = 64; + dthrctl.b.rx_thr_en = 1; + dthrctl.b.rx_thr_len = 64; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DTHRCTL, dthrctl.d32); + } + USB_OTG_EnableDevInt(pdev); + return status; +} + + +/** +* @brief USB_OTG_EnableDevInt : Enables the Device mode interrupts +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EnableDevInt(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_GINTMSK_TypeDef intmsk; + + intmsk.d32 = 0; + + /* Disable all interrupts. */ + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTMSK, 0); + /* Clear any pending interrupts */ + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, 0xBFFFFFFF); + /* Enable the common interrupts */ + USB_OTG_EnableCommonInt(pdev); + + if (pdev->cfg.dma_enable == 0) + { + intmsk.b.rxstsqlvl = 1; + } + + /* Enable interrupts matching to the Device mode ONLY */ + intmsk.b.usbsuspend = 1; + intmsk.b.usbreset = 1; + intmsk.b.enumdone = 1; + intmsk.b.inepintr = 1; + intmsk.b.outepintr = 1; + intmsk.b.sofintr = 1; + + intmsk.b.incomplisoin = 1; + intmsk.b.incomplisoout = 1; +#ifdef VBUS_SENSING_ENABLED + intmsk.b.sessreqintr = 1; + intmsk.b.otgintr = 1; +#endif + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, intmsk.d32, intmsk.d32); + return status; +} + + +/** +* @brief USB_OTG_GetDeviceSpeed +* Get the device speed from the device status register +* @param None +* @retval status +*/ +enum USB_OTG_SPEED USB_OTG_GetDeviceSpeed (USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DSTS_TypeDef dsts; + enum USB_OTG_SPEED speed = USB_SPEED_UNKNOWN; + + + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + switch (dsts.b.enumspd) + { + case DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ: + speed = USB_SPEED_HIGH; + break; + case DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ: + case DSTS_ENUMSPD_FS_PHY_48MHZ: + speed = USB_SPEED_FULL; + break; + + case DSTS_ENUMSPD_LS_PHY_6MHZ: + speed = USB_SPEED_LOW; + break; + } + + return speed; +} +/** +* @brief enables EP0 OUT to receive SETUP packets and configures EP0 +* for transmitting packets +* @param None +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EP0Activate(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DSTS_TypeDef dsts; + USB_OTG_DEPCTL_TypeDef diepctl; + USB_OTG_DCTL_TypeDef dctl; + + dctl.d32 = 0; + /* Read the Device Status and Endpoint 0 Control registers */ + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + diepctl.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[0]->DIEPCTL); + /* Set the MPS of the IN EP based on the enumeration speed */ + switch (dsts.b.enumspd) + { + case DSTS_ENUMSPD_HS_PHY_30MHZ_OR_60MHZ: + case DSTS_ENUMSPD_FS_PHY_30MHZ_OR_60MHZ: + case DSTS_ENUMSPD_FS_PHY_48MHZ: + diepctl.b.mps = DEP0CTL_MPS_64; + break; + case DSTS_ENUMSPD_LS_PHY_6MHZ: + diepctl.b.mps = DEP0CTL_MPS_8; + break; + } + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[0]->DIEPCTL, diepctl.d32); + dctl.b.cgnpinnak = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, dctl.d32); + return status; +} + + +/** +* @brief USB_OTG_EPActivate : Activates an EP +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPActivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DAINT_TypeDef daintmsk; + __IO uint32_t *addr; + + + depctl.d32 = 0; + daintmsk.d32 = 0; + /* Read DEPCTLn register */ + if (ep->is_in == 1) + { + addr = &pdev->regs.INEP_REGS[ep->num]->DIEPCTL; + daintmsk.ep.in = 1 << ep->num; + } + else + { + addr = &pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL; + daintmsk.ep.out = 1 << ep->num; + } + /* If the EP is already active don't change the EP Control + * register. */ + depctl.d32 = USB_OTG_READ_REG32(addr); + if (!depctl.b.usbactep) + { + depctl.b.mps = ep->maxpacket; + depctl.b.eptype = ep->type; + depctl.b.txfnum = ep->tx_fifo_num; + depctl.b.setd0pid = 1; + depctl.b.usbactep = 1; + USB_OTG_WRITE_REG32(addr, depctl.d32); + } + /* Enable the Interrupt for this EP */ +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + if((ep->num == 1)&&(pdev->cfg.coreID == USB_OTG_HS_CORE_ID)) + { + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DEACHMSK, 0, daintmsk.d32); + } + else +#endif + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DAINTMSK, 0, daintmsk.d32); + return status; +} + + +/** +* @brief USB_OTG_EPDeactivate : Deactivates an EP +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPDeactivate(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DAINT_TypeDef daintmsk; + __IO uint32_t *addr; + + depctl.d32 = 0; + daintmsk.d32 = 0; + /* Read DEPCTLn register */ + if (ep->is_in == 1) + { + addr = &pdev->regs.INEP_REGS[ep->num]->DIEPCTL; + daintmsk.ep.in = 1 << ep->num; + } + else + { + addr = &pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL; + daintmsk.ep.out = 1 << ep->num; + } + depctl.b.usbactep = 0; + USB_OTG_WRITE_REG32(addr, depctl.d32); + /* Disable the Interrupt for this EP */ + +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + if((ep->num == 1)&&(pdev->cfg.coreID == USB_OTG_HS_CORE_ID)) + { + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DEACHMSK, daintmsk.d32, 0); + } + else +#endif + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DAINTMSK, daintmsk.d32, 0); + return status; +} + + +/** +* @brief USB_OTG_EPStartXfer : Handle the setup for data xfer for an EP and +* starts the xfer +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPStartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DEPXFRSIZ_TypeDef deptsiz; + USB_OTG_DSTS_TypeDef dsts; + uint32_t fifoemptymsk = 0; + + depctl.d32 = 0; + deptsiz.d32 = 0; + /* IN endpoint */ + if (ep->is_in == 1) + { + depctl.d32 = USB_OTG_READ_REG32(&(pdev->regs.INEP_REGS[ep->num]->DIEPCTL)); + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.INEP_REGS[ep->num]->DIEPTSIZ)); + /* Zero Length Packet? */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = 0; + deptsiz.b.pktcnt = 1; + } + else + { + /* Program the transfer size and packet count + * as follows: xfersize = N * maxpacket + + * short_packet pktcnt = N + (short_packet + * exist ? 1 : 0) + */ + deptsiz.b.xfersize = ep->xfer_len; + deptsiz.b.pktcnt = (ep->xfer_len - 1 + ep->maxpacket) / ep->maxpacket; + + if (ep->type == EP_TYPE_ISOC) + { + deptsiz.b.mc = 1; + } + } + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPTSIZ, deptsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPDMA, ep->dma_addr); + } + else + { + if (ep->type != EP_TYPE_ISOC) + { + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0) + { + fifoemptymsk = 1 << ep->num; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, 0, fifoemptymsk); + } + } + } + + + if (ep->type == EP_TYPE_ISOC) + { + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + if (((dsts.b.soffn)&0x1) == 0) + { + depctl.b.setd1pid = 1; + } + else + { + depctl.b.setd0pid = 1; + } + } + + /* EP enable, IN data in FIFO */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPCTL, depctl.d32); + + if (ep->type == EP_TYPE_ISOC) + { + USB_OTG_WritePacket(pdev, ep->xfer_buff, ep->num, ep->xfer_len); + } + } + else + { + /* OUT endpoint */ + depctl.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL)); + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ)); + /* Program the transfer size and packet count as follows: + * pktcnt = N + * xfersize = N * maxpacket + */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = ep->maxpacket; + deptsiz.b.pktcnt = 1; + } + else + { + deptsiz.b.pktcnt = (ep->xfer_len + (ep->maxpacket - 1)) / ep->maxpacket; + deptsiz.b.xfersize = deptsiz.b.pktcnt * ep->maxpacket; + } + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ, deptsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPDMA, ep->dma_addr); + } + + if (ep->type == EP_TYPE_ISOC) + { + if (ep->even_odd_frame) + { + depctl.b.setd1pid = 1; + } + else + { + depctl.b.setd0pid = 1; + } + } + /* EP enable */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL, depctl.d32); + } + return status; +} + + +/** +* @brief USB_OTG_EP0StartXfer : Handle the setup for a data xfer for EP0 and +* starts the xfer +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EP0StartXfer(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + USB_OTG_DEP0XFRSIZ_TypeDef deptsiz; + USB_OTG_INEPREGS *in_regs; + uint32_t fifoemptymsk = 0; + + depctl.d32 = 0; + deptsiz.d32 = 0; + /* IN endpoint */ + if (ep->is_in == 1) + { + in_regs = pdev->regs.INEP_REGS[0]; + depctl.d32 = USB_OTG_READ_REG32(&in_regs->DIEPCTL); + deptsiz.d32 = USB_OTG_READ_REG32(&in_regs->DIEPTSIZ); + /* Zero Length Packet? */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = 0; + deptsiz.b.pktcnt = 1; + + } + else + { + if (ep->xfer_len > ep->maxpacket) + { + ep->xfer_len = ep->maxpacket; + deptsiz.b.xfersize = ep->maxpacket; + } + else + { + deptsiz.b.xfersize = ep->xfer_len; + } + deptsiz.b.pktcnt = 1; + } + USB_OTG_WRITE_REG32(&in_regs->DIEPTSIZ, deptsiz.d32); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.INEP_REGS[ep->num]->DIEPDMA, ep->dma_addr); + } + + /* EP enable, IN data in FIFO */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32(&in_regs->DIEPCTL, depctl.d32); + + + + if (pdev->cfg.dma_enable == 0) + { + /* Enable the Tx FIFO Empty Interrupt for this EP */ + if (ep->xfer_len > 0) + { + { + fifoemptymsk |= 1 << ep->num; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, 0, fifoemptymsk); + } + } + } + } + else + { + /* OUT endpoint */ + depctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + deptsiz.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ); + /* Program the transfer size and packet count as follows: + * xfersize = N * (maxpacket + 4 - (maxpacket % 4)) + * pktcnt = N */ + if (ep->xfer_len == 0) + { + deptsiz.b.xfersize = ep->maxpacket; + deptsiz.b.pktcnt = 1; + } + else + { + ep->xfer_len = ep->maxpacket; + deptsiz.b.xfersize = ep->maxpacket; + deptsiz.b.pktcnt = 1; + } + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPTSIZ, deptsiz.d32); + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_WRITE_REG32(&pdev->regs.OUTEP_REGS[ep->num]->DOEPDMA, ep->dma_addr); + } + /* EP enable */ + depctl.b.cnak = 1; + depctl.b.epena = 1; + USB_OTG_WRITE_REG32 (&(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL), depctl.d32); + + } + return status; +} + + +/** +* @brief USB_OTG_EPSetStall : Set the EP STALL +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPSetStall(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + + depctl.d32 = 0; + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + /* set the disable and stall bits */ + if (depctl.b.epena) + { + depctl.b.epdis = 1; + } + depctl.b.stall = 1; + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); + } + else + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + /* set the stall bit */ + depctl.b.stall = 1; + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); + } + return status; +} + + +/** +* @brief Clear the EP STALL +* @param pdev : Selected device +* @retval USB_OTG_STS : status +*/ +USB_OTG_STS USB_OTG_EPClearStall(USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep) +{ + USB_OTG_STS status = USB_OTG_OK; + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + + depctl.d32 = 0; + + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + } + else + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + } + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + /* clear the stall bits */ + depctl.b.stall = 0; + if (ep->type == EP_TYPE_INTR || ep->type == EP_TYPE_BULK) + { + depctl.b.setd0pid = 1; /* DATA0 */ + } + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); + return status; +} + + +/** +* @brief USB_OTG_ReadDevAllOutEp_itr : returns OUT endpoint interrupt bits +* @param pdev : Selected device +* @retval OUT endpoint interrupt bits +*/ +uint32_t USB_OTG_ReadDevAllOutEp_itr(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t v; + v = USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINT); + v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINTMSK); + return ((v & 0xffff0000) >> 16); +} + + +/** +* @brief USB_OTG_ReadDevOutEP_itr : returns Device OUT EP Interrupt register +* @param pdev : Selected device +* @param ep : end point number +* @retval Device OUT EP Interrupt register +*/ +uint32_t USB_OTG_ReadDevOutEP_itr(USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + uint32_t v; + v = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[epnum]->DOEPINT); + v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DOEPMSK); + return v; +} + + +/** +* @brief USB_OTG_ReadDevAllInEPItr : Get int status register +* @param pdev : Selected device +* @retval int status register +*/ +uint32_t USB_OTG_ReadDevAllInEPItr(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t v; + v = USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINT); + v &= USB_OTG_READ_REG32(&pdev->regs.DREGS->DAINTMSK); + return (v & 0xffff); +} + +/** +* @brief configures EPO to receive SETUP packets +* @param None +* @retval : None +*/ +void USB_OTG_EP0_OutStart(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DEP0XFRSIZ_TypeDef doeptsize0; + doeptsize0.d32 = 0; + doeptsize0.b.supcnt = 3; + doeptsize0.b.pktcnt = 1; + doeptsize0.b.xfersize = 8 * 3; + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPTSIZ, doeptsize0.d32 ); + + if (pdev->cfg.dma_enable == 1) + { + USB_OTG_DEPCTL_TypeDef doepctl; + doepctl.d32 = 0; + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPDMA, + (uint32_t)&pdev->dev.setup_packet); + + /* EP enable */ + doepctl.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[0]->DOEPCTL); + doepctl.b.epena = 1; + doepctl.d32 = 0x80008000; + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[0]->DOEPCTL, doepctl.d32); + } +} + +/** +* @brief USB_OTG_RemoteWakeup : active remote wakeup signalling +* @param None +* @retval : None +*/ +void USB_OTG_ActiveRemoteWakeup(USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_DCTL_TypeDef dctl; + USB_OTG_DSTS_TypeDef dsts; + USB_OTG_PCGCCTL_TypeDef power; + + if (pdev->dev.DevRemoteWakeup) + { + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + if(dsts.b.suspsts == 1) + { + if(pdev->cfg.low_power) + { + /* un-gate USB Core clock */ + power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL); + power.b.gatehclk = 0; + power.b.stoppclk = 0; + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32); + } + /* active Remote wakeup signaling */ + dctl.d32 = 0; + dctl.b.rmtwkupsig = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, 0, dctl.d32); + USB_OTG_BSP_mDelay(5); + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, 0 ); + } + } +} + + +/** +* @brief USB_OTG_UngateClock : active USB Core clock +* @param None +* @retval : None +*/ +void USB_OTG_UngateClock(USB_OTG_CORE_HANDLE *pdev) +{ + if(pdev->cfg.low_power) + { + + USB_OTG_DSTS_TypeDef dsts; + USB_OTG_PCGCCTL_TypeDef power; + + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + if(dsts.b.suspsts == 1) + { + /* un-gate USB Core clock */ + power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL); + power.b.gatehclk = 0; + power.b.stoppclk = 0; + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32); + + } + } +} + +/** +* @brief Stop the device and clean up fifo's +* @param None +* @retval : None +*/ +void USB_OTG_StopDevice(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t i; + + pdev->dev.device_status = 1; + + for (i = 0; i < pdev->cfg.dev_endpoints ; i++) + { + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF); + } + + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, 0 ); + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF ); + + /* Flush the FIFO */ + USB_OTG_FlushRxFifo(pdev); + USB_OTG_FlushTxFifo(pdev , 0x10 ); +} + +/** +* @brief returns the EP Status +* @param pdev : Selected device +* ep : endpoint structure +* @retval : EP status +*/ + +uint32_t USB_OTG_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,USB_OTG_EP *ep) +{ + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + uint32_t Status = 0; + + depctl.d32 = 0; + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + if (depctl.b.stall == 1) + Status = USB_OTG_EP_TX_STALL; + else if (depctl.b.naksts == 1) + Status = USB_OTG_EP_TX_NAK; + else + Status = USB_OTG_EP_TX_VALID; + + } + else + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + if (depctl.b.stall == 1) + Status = USB_OTG_EP_RX_STALL; + else if (depctl.b.naksts == 1) + Status = USB_OTG_EP_RX_NAK; + else + Status = USB_OTG_EP_RX_VALID; + } + + /* Return the current status */ + return Status; +} + +/** +* @brief Set the EP Status +* @param pdev : Selected device +* Status : new Status +* ep : EP structure +* @retval : None +*/ +void USB_OTG_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , USB_OTG_EP *ep , uint32_t Status) +{ + USB_OTG_DEPCTL_TypeDef depctl; + __IO uint32_t *depctl_addr; + + depctl.d32 = 0; + + /* Process for IN endpoint */ + if (ep->is_in == 1) + { + depctl_addr = &(pdev->regs.INEP_REGS[ep->num]->DIEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + if (Status == USB_OTG_EP_TX_STALL) + { + USB_OTG_EPSetStall(pdev, ep); return; + } + else if (Status == USB_OTG_EP_TX_NAK) + depctl.b.snak = 1; + else if (Status == USB_OTG_EP_TX_VALID) + { + if (depctl.b.stall == 1) + { + ep->even_odd_frame = 0; + USB_OTG_EPClearStall(pdev, ep); + return; + } + depctl.b.cnak = 1; + depctl.b.usbactep = 1; + depctl.b.epena = 1; + } + else if (Status == USB_OTG_EP_TX_DIS) + depctl.b.usbactep = 0; + } + else /* Process for OUT endpoint */ + { + depctl_addr = &(pdev->regs.OUTEP_REGS[ep->num]->DOEPCTL); + depctl.d32 = USB_OTG_READ_REG32(depctl_addr); + + if (Status == USB_OTG_EP_RX_STALL) { + depctl.b.stall = 1; + } + else if (Status == USB_OTG_EP_RX_NAK) + depctl.b.snak = 1; + else if (Status == USB_OTG_EP_RX_VALID) + { + if (depctl.b.stall == 1) + { + ep->even_odd_frame = 0; + USB_OTG_EPClearStall(pdev, ep); + return; + } + depctl.b.cnak = 1; + depctl.b.usbactep = 1; + depctl.b.epena = 1; + } + else if (Status == USB_OTG_EP_RX_DIS) + { + depctl.b.usbactep = 0; + } + } + + USB_OTG_WRITE_REG32(depctl_addr, depctl.d32); +} + +#endif +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/src/usb_dcd.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/src/usb_dcd.c new file mode 100644 index 00000000..eac8c337 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/src/usb_dcd.c @@ -0,0 +1,478 @@ +/** + ****************************************************************************** + * @file usb_dcd.c + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Peripheral Device Interface Layer + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd.h" +#include "usb_bsp.h" + + +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_DCD +* @brief This file is the interface between EFSL ans Host mass-storage class +* @{ +*/ + + +/** @defgroup USB_DCD_Private_Defines +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + + +/** @defgroup USB_DCD_Private_Macros +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_Variables +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_FunctionPrototypes +* @{ +*/ + +/** +* @} +*/ + + +/** @defgroup USB_DCD_Private_Functions +* @{ +*/ + + + +void DCD_Init(USB_OTG_CORE_HANDLE *pdev , + USB_OTG_CORE_ID_TypeDef coreID) +{ + uint32_t i; + USB_OTG_EP *ep; + + USB_OTG_SelectCore (pdev , coreID); + + pdev->dev.device_status = USB_OTG_DEFAULT; + pdev->dev.device_address = 0; + + /* Init ep structure */ + for (i = 0; i < pdev->cfg.dev_endpoints ; i++) + { + ep = &pdev->dev.in_ep[i]; + /* Init ep structure */ + ep->is_in = 1; + ep->num = i; + ep->tx_fifo_num = i; + /* Control until ep is actvated */ + ep->type = EP_TYPE_CTRL; + ep->maxpacket = USB_OTG_MAX_EP0_SIZE; + ep->xfer_buff = 0; + ep->xfer_len = 0; + } + + for (i = 0; i < pdev->cfg.dev_endpoints; i++) + { + ep = &pdev->dev.out_ep[i]; + /* Init ep structure */ + ep->is_in = 0; + ep->num = i; + ep->tx_fifo_num = i; + /* Control until ep is activated */ + ep->type = EP_TYPE_CTRL; + ep->maxpacket = USB_OTG_MAX_EP0_SIZE; + ep->xfer_buff = 0; + ep->xfer_len = 0; + } + + USB_OTG_DisableGlobalInt(pdev); + + /*Init the Core (common init.) */ + USB_OTG_CoreInit(pdev); + + + /* Force Device Mode*/ + USB_OTG_SetCurrentMode(pdev, DEVICE_MODE); + + /* Init Device */ + USB_OTG_CoreInitDev(pdev); + + + /* Enable USB Global interrupt */ + USB_OTG_EnableGlobalInt(pdev); +} + + +/** +* @brief Configure an EP +* @param pdev : Device instance +* @param epdesc : Endpoint Descriptor +* @retval : status +*/ +uint32_t DCD_EP_Open(USB_OTG_CORE_HANDLE *pdev , + uint8_t ep_addr, + uint16_t ep_mps, + uint8_t ep_type) +{ + USB_OTG_EP *ep; + + if ((ep_addr & 0x80) == 0x80) + { + ep = &pdev->dev.in_ep[ep_addr & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[ep_addr & 0x7F]; + } + ep->num = ep_addr & 0x7F; + + ep->is_in = (0x80 & ep_addr) != 0; + ep->maxpacket = ep_mps; + ep->type = ep_type; + if (ep->is_in) + { + /* Assign a Tx FIFO */ + ep->tx_fifo_num = ep->num; + } + /* Set initial data PID. */ + if (ep_type == USB_OTG_EP_BULK ) + { + ep->data_pid_start = 0; + } + USB_OTG_EPActivate(pdev , ep ); + return 0; +} +/** +* @brief called when an EP is disabled +* @param pdev: device instance +* @param ep_addr: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_Close(USB_OTG_CORE_HANDLE *pdev , uint8_t ep_addr) +{ + USB_OTG_EP *ep; + + if ((ep_addr&0x80) == 0x80) + { + ep = &pdev->dev.in_ep[ep_addr & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[ep_addr & 0x7F]; + } + ep->num = ep_addr & 0x7F; + ep->is_in = (0x80 & ep_addr) != 0; + USB_OTG_EPDeactivate(pdev , ep ); + return 0; +} + + +/** +* @brief DCD_EP_PrepareRx +* @param pdev: device instance +* @param ep_addr: endpoint address +* @param pbuf: pointer to Rx buffer +* @param buf_len: data length +* @retval : status +*/ +uint32_t DCD_EP_PrepareRx( USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint16_t buf_len) +{ + USB_OTG_EP *ep; + + ep = &pdev->dev.out_ep[ep_addr & 0x7F]; + + /*setup and start the Xfer */ + ep->xfer_buff = pbuf; + ep->xfer_len = buf_len; + ep->xfer_count = 0; + ep->is_in = 0; + ep->num = ep_addr & 0x7F; + + if (pdev->cfg.dma_enable == 1) + { + ep->dma_addr = (uint32_t)pbuf; + } + + if ( ep->num == 0 ) + { + USB_OTG_EP0StartXfer(pdev , ep); + } + else + { + USB_OTG_EPStartXfer(pdev, ep ); + } + return 0; +} + +/** +* @brief Transmit data over USB +* @param pdev: device instance +* @param ep_addr: endpoint address +* @param pbuf: pointer to Tx buffer +* @param buf_len: data length +* @retval : status +*/ +uint32_t DCD_EP_Tx ( USB_OTG_CORE_HANDLE *pdev, + uint8_t ep_addr, + uint8_t *pbuf, + uint32_t buf_len) +{ + USB_OTG_EP *ep; + + ep = &pdev->dev.in_ep[ep_addr & 0x7F]; + + /* Setup and start the Transfer */ + ep->is_in = 1; + ep->num = ep_addr & 0x7F; + ep->xfer_buff = pbuf; + ep->dma_addr = (uint32_t)pbuf; + ep->xfer_count = 0; + ep->xfer_len = buf_len; + + if ( ep->num == 0 ) + { + USB_OTG_EP0StartXfer(pdev , ep); + } + else + { + USB_OTG_EPStartXfer(pdev, ep ); + } + return 0; +} + + +/** +* @brief Stall an endpoint. +* @param pdev: device instance +* @param epnum: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_Stall (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum) +{ + USB_OTG_EP *ep; + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + ep->is_stall = 1; + ep->num = epnum & 0x7F; + ep->is_in = ((epnum & 0x80) == 0x80); + + USB_OTG_EPSetStall(pdev , ep); + return (0); +} + + +/** +* @brief Clear stall condition on endpoints. +* @param pdev: device instance +* @param epnum: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_ClrStall (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum) +{ + USB_OTG_EP *ep; + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + ep->is_stall = 0; + ep->num = epnum & 0x7F; + ep->is_in = ((epnum & 0x80) == 0x80); + + USB_OTG_EPClearStall(pdev , ep); + return (0); +} + + +/** +* @brief This Function flushes the FIFOs. +* @param pdev: device instance +* @param epnum: endpoint address +* @retval : status +*/ +uint32_t DCD_EP_Flush (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum) +{ + + if ((epnum & 0x80) == 0x80) + { + USB_OTG_FlushTxFifo(pdev, epnum & 0x7F); + } + else + { + USB_OTG_FlushRxFifo(pdev); + } + + return (0); +} + + +/** +* @brief This Function set USB device address +* @param pdev: device instance +* @param address: new device address +* @retval : status +*/ +void DCD_EP_SetAddress (USB_OTG_CORE_HANDLE *pdev, uint8_t address) +{ + USB_OTG_DCFG_TypeDef dcfg; + dcfg.d32 = 0; + dcfg.b.devaddr = address; + USB_OTG_MODIFY_REG32( &pdev->regs.DREGS->DCFG, 0, dcfg.d32); +} + +/** +* @brief Connect device (enable internal pull-up) +* @param pdev: device instance +* @retval : None +*/ +void DCD_DevConnect (USB_OTG_CORE_HANDLE *pdev) +{ +#ifndef USE_OTG_MODE + USB_OTG_DCTL_TypeDef dctl; + dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL); + /* Connect device */ + dctl.b.sftdiscon = 0; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32); + USB_OTG_BSP_mDelay(3); +#endif +} + + +/** +* @brief Disconnect device (disable internal pull-up) +* @param pdev: device instance +* @retval : None +*/ +void DCD_DevDisconnect (USB_OTG_CORE_HANDLE *pdev) +{ +#ifndef USE_OTG_MODE + USB_OTG_DCTL_TypeDef dctl; + dctl.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DCTL); + /* Disconnect device for 3ms */ + dctl.b.sftdiscon = 1; + USB_OTG_WRITE_REG32(&pdev->regs.DREGS->DCTL, dctl.d32); + USB_OTG_BSP_mDelay(3); +#endif +} + + +/** +* @brief returns the EP Status +* @param pdev : Selected device +* epnum : endpoint address +* @retval : EP status +*/ + +uint32_t DCD_GetEPStatus(USB_OTG_CORE_HANDLE *pdev ,uint8_t epnum) +{ + USB_OTG_EP *ep; + uint32_t Status = 0; + + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + Status = USB_OTG_GetEPStatus(pdev ,ep); + + /* Return the current status */ + return Status; +} + +/** +* @brief Set the EP Status +* @param pdev : Selected device +* Status : new Status +* epnum : EP address +* @retval : None +*/ +void DCD_SetEPStatus (USB_OTG_CORE_HANDLE *pdev , uint8_t epnum , uint32_t Status) +{ + USB_OTG_EP *ep; + + if ((0x80 & epnum) == 0x80) + { + ep = &pdev->dev.in_ep[epnum & 0x7F]; + } + else + { + ep = &pdev->dev.out_ep[epnum]; + } + + USB_OTG_SetEPStatus(pdev ,ep , Status); +} + +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/src/usb_dcd_int.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/src/usb_dcd_int.c new file mode 100644 index 00000000..32984e61 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/src/usb_dcd_int.c @@ -0,0 +1,869 @@ +/** + ****************************************************************************** + * @file usb_dcd_int.c + * @author MCD Application Team + * @version V2.1.0 + * @date 19-March-2012 + * @brief Peripheral Device interrupt subroutines + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_dcd_int.h" +/** @addtogroup USB_OTG_DRIVER +* @{ +*/ + +/** @defgroup USB_DCD_INT +* @brief This file contains the interrupt subroutines for the Device mode. +* @{ +*/ + + +/** @defgroup USB_DCD_INT_Private_Defines +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + + +/** @defgroup USB_DCD_INT_Private_Macros +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_Variables +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_FunctionPrototypes +* @{ +*/ +/* static functions */ +static uint32_t DCD_ReadDevInEP (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum); + +/* Interrupt Handlers */ +static uint32_t DCD_HandleInEP_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleOutEP_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleSof_ISR(USB_OTG_CORE_HANDLE *pdev); + +static uint32_t DCD_HandleRxStatusQueueLevel_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev , uint32_t epnum); + +static uint32_t DCD_HandleUsbReset_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleEnumDone_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleResume_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_HandleUSBSuspend_ISR(USB_OTG_CORE_HANDLE *pdev); + +static uint32_t DCD_IsoINIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_IsoOUTIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev); +#ifdef VBUS_SENSING_ENABLED +static uint32_t DCD_SessionRequest_ISR(USB_OTG_CORE_HANDLE *pdev); +static uint32_t DCD_OTG_ISR(USB_OTG_CORE_HANDLE *pdev); +#endif + +/** +* @} +*/ + + +/** @defgroup USB_DCD_INT_Private_Functions +* @{ +*/ + + +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED +/** +* @brief USBD_OTG_EP1OUT_ISR_Handler +* handles all USB Interrupts +* @param pdev: device instance +* @retval status +*/ +uint32_t USBD_OTG_EP1OUT_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_DOEPINTn_TypeDef doepint; + USB_OTG_DEPXFRSIZ_TypeDef deptsiz; + + doepint.d32 = USB_OTG_READ_REG32(&pdev->regs.OUTEP_REGS[1]->DOEPINT); + doepint.d32&= USB_OTG_READ_REG32(&pdev->regs.DREGS->DOUTEP1MSK); + + /* Transfer complete */ + if ( doepint.b.xfercompl ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(1, xfercompl); + if (pdev->cfg.dma_enable == 1) + { + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[1]->DOEPTSIZ)); + /*ToDo : handle more than one single MPS size packet */ + pdev->dev.out_ep[1].xfer_count = pdev->dev.out_ep[1].maxpacket - \ + deptsiz.b.xfersize; + } + /* Inform upper layer: data ready */ + /* RX COMPLETE */ + USBD_DCD_INT_fops->DataOutStage(pdev , 1); + + } + + /* Endpoint disable */ + if ( doepint.b.epdisabled ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(1, epdisabled); + } + + return 1; +} + +/** +* @brief USBD_OTG_EP1IN_ISR_Handler +* handles all USB Interrupts +* @param pdev: device instance +* @retval status +*/ +uint32_t USBD_OTG_EP1IN_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_DIEPINTn_TypeDef diepint; + uint32_t fifoemptymsk, msk, emp; + + msk = USB_OTG_READ_REG32(&pdev->regs.DREGS->DINEP1MSK); + emp = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPEMPMSK); + msk |= ((emp >> 1 ) & 0x1) << 7; + diepint.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[1]->DIEPINT) & msk; + + if ( diepint.b.xfercompl ) + { + fifoemptymsk = 0x1 << 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0); + CLEAR_IN_EP_INTR(1, xfercompl); + /* TX COMPLETE */ + USBD_DCD_INT_fops->DataInStage(pdev , 1); + } + if ( diepint.b.epdisabled ) + { + CLEAR_IN_EP_INTR(1, epdisabled); + } + if ( diepint.b.timeout ) + { + CLEAR_IN_EP_INTR(1, timeout); + } + if (diepint.b.intktxfemp) + { + CLEAR_IN_EP_INTR(1, intktxfemp); + } + if (diepint.b.inepnakeff) + { + CLEAR_IN_EP_INTR(1, inepnakeff); + } + if (diepint.b.emptyintr) + { + DCD_WriteEmptyTxFifo(pdev , 1); + CLEAR_IN_EP_INTR(1, emptyintr); + } + return 1; +} +#endif + +/** +* @brief STM32_USBF_OTG_ISR_Handler +* handles all USB Interrupts +* @param pdev: device instance +* @retval status +*/ +uint32_t USBD_OTG_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintr_status; + uint32_t retval = 0; + + if (USB_OTG_IsDeviceMode(pdev)) /* ensure that we are in device mode */ + { + gintr_status.d32 = USB_OTG_ReadCoreItr(pdev); + if (!gintr_status.d32) /* avoid spurious interrupt */ + { + return 0; + } + + if (gintr_status.b.outepintr) + { + retval |= DCD_HandleOutEP_ISR(pdev); + } + + if (gintr_status.b.inepint) + { + retval |= DCD_HandleInEP_ISR(pdev); + } + + if (gintr_status.b.modemismatch) + { + USB_OTG_GINTSTS_TypeDef gintsts; + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.modemismatch = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + } + + if (gintr_status.b.wkupintr) + { + retval |= DCD_HandleResume_ISR(pdev); + } + + if (gintr_status.b.usbsuspend) + { + retval |= DCD_HandleUSBSuspend_ISR(pdev); + } + if (gintr_status.b.sofintr) + { + retval |= DCD_HandleSof_ISR(pdev); + + } + + if (gintr_status.b.rxstsqlvl) + { + retval |= DCD_HandleRxStatusQueueLevel_ISR(pdev); + + } + + if (gintr_status.b.usbreset) + { + retval |= DCD_HandleUsbReset_ISR(pdev); + + } + if (gintr_status.b.enumdone) + { + retval |= DCD_HandleEnumDone_ISR(pdev); + } + + if (gintr_status.b.incomplisoin) + { + retval |= DCD_IsoINIncomplete_ISR(pdev); + } + + if (gintr_status.b.incomplisoout) + { + retval |= DCD_IsoOUTIncomplete_ISR(pdev); + } +#ifdef VBUS_SENSING_ENABLED + if (gintr_status.b.sessreqintr) + { + retval |= DCD_SessionRequest_ISR(pdev); + } + + if (gintr_status.b.otgintr) + { + retval |= DCD_OTG_ISR(pdev); + } +#endif + } + return retval; +} + +#ifdef VBUS_SENSING_ENABLED +/** +* @brief DCD_SessionRequest_ISR +* Indicates that the USB_OTG controller has detected a connection +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_SessionRequest_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USBD_DCD_INT_fops->DevConnected (pdev); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.sessreqintr = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32); + return 1; +} + +/** +* @brief DCD_OTG_ISR +* Indicates that the USB_OTG controller has detected an OTG event: +* used to detect the end of session i.e. disconnection +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_OTG_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + + USB_OTG_GOTGINT_TypeDef gotgint; + + gotgint.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GOTGINT); + + if (gotgint.b.sesenddet) + { + USBD_DCD_INT_fops->DevDisconnected (pdev); + } + /* Clear OTG interrupt */ + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GOTGINT, gotgint.d32); + return 1; +} +#endif +/** +* @brief DCD_HandleResume_ISR +* Indicates that the USB_OTG controller has detected a resume or +* remote Wake-up sequence +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleResume_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USB_OTG_DCTL_TypeDef devctl; + USB_OTG_PCGCCTL_TypeDef power; + + if(pdev->cfg.low_power) + { + /* un-gate USB Core clock */ + power.d32 = USB_OTG_READ_REG32(&pdev->regs.PCGCCTL); + power.b.gatehclk = 0; + power.b.stoppclk = 0; + USB_OTG_WRITE_REG32(pdev->regs.PCGCCTL, power.d32); + } + + /* Clear the Remote Wake-up Signaling */ + devctl.d32 = 0; + devctl.b.rmtwkupsig = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, devctl.d32, 0); + + /* Inform upper layer by the Resume Event */ + USBD_DCD_INT_fops->Resume (pdev); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.wkupintr = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32); + return 1; +} + +/** +* @brief USB_OTG_HandleUSBSuspend_ISR +* Indicates that SUSPEND state has been detected on the USB +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleUSBSuspend_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USB_OTG_PCGCCTL_TypeDef power; + USB_OTG_DSTS_TypeDef dsts; + __IO uint8_t prev_status = 0; + + prev_status = pdev->dev.device_status; + USBD_DCD_INT_fops->Suspend (pdev); + + dsts.d32 = USB_OTG_READ_REG32(&pdev->regs.DREGS->DSTS); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.usbsuspend = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + + if((pdev->cfg.low_power) && (dsts.b.suspsts == 1) && + (pdev->dev.connection_status == 1) && + (prev_status == USB_OTG_CONFIGURED)) + { + /* switch-off the clocks */ + power.d32 = 0; + power.b.stoppclk = 1; + USB_OTG_MODIFY_REG32(pdev->regs.PCGCCTL, 0, power.d32); + + power.b.gatehclk = 1; + USB_OTG_MODIFY_REG32(pdev->regs.PCGCCTL, 0, power.d32); + + /* Request to enter Sleep mode after exit from current ISR */ + SCB->SCR |= (SCB_SCR_SLEEPDEEP_Msk | SCB_SCR_SLEEPONEXIT_Msk); + } + return 1; +} + +/** +* @brief DCD_HandleInEP_ISR +* Indicates that an IN EP has a pending Interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleInEP_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DIEPINTn_TypeDef diepint; + + uint32_t ep_intr; + uint32_t epnum = 0; + uint32_t fifoemptymsk; + diepint.d32 = 0; + ep_intr = USB_OTG_ReadDevAllInEPItr(pdev); + + while ( ep_intr ) + { + if (ep_intr&0x1) /* In ITR */ + { + diepint.d32 = DCD_ReadDevInEP(pdev , epnum); /* Get In ITR status */ + if ( diepint.b.xfercompl ) + { + fifoemptymsk = 0x1 << epnum; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0); + CLEAR_IN_EP_INTR(epnum, xfercompl); + /* TX COMPLETE */ + USBD_DCD_INT_fops->DataInStage(pdev , epnum); + + if (pdev->cfg.dma_enable == 1) + { + if((epnum == 0) && (pdev->dev.device_state == USB_OTG_EP0_STATUS_IN)) + { + /* prepare to rx more setup packets */ + USB_OTG_EP0_OutStart(pdev); + } + } + } + if ( diepint.b.timeout ) + { + CLEAR_IN_EP_INTR(epnum, timeout); + } + if (diepint.b.intktxfemp) + { + CLEAR_IN_EP_INTR(epnum, intktxfemp); + } + if (diepint.b.inepnakeff) + { + CLEAR_IN_EP_INTR(epnum, inepnakeff); + } + if ( diepint.b.epdisabled ) + { + CLEAR_IN_EP_INTR(epnum, epdisabled); + } + if (diepint.b.emptyintr) + { + + DCD_WriteEmptyTxFifo(pdev , epnum); + + CLEAR_IN_EP_INTR(epnum, emptyintr); + } + } + epnum++; + ep_intr >>= 1; + } + + return 1; +} + +/** +* @brief DCD_HandleOutEP_ISR +* Indicates that an OUT EP has a pending Interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleOutEP_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + uint32_t ep_intr; + USB_OTG_DOEPINTn_TypeDef doepint; + USB_OTG_DEPXFRSIZ_TypeDef deptsiz; + uint32_t epnum = 0; + + doepint.d32 = 0; + + /* Read in the device interrupt bits */ + ep_intr = USB_OTG_ReadDevAllOutEp_itr(pdev); + + while ( ep_intr ) + { + if (ep_intr&0x1) + { + + doepint.d32 = USB_OTG_ReadDevOutEP_itr(pdev, epnum); + + /* Transfer complete */ + if ( doepint.b.xfercompl ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(epnum, xfercompl); + if (pdev->cfg.dma_enable == 1) + { + deptsiz.d32 = USB_OTG_READ_REG32(&(pdev->regs.OUTEP_REGS[epnum]->DOEPTSIZ)); + /*ToDo : handle more than one single MPS size packet */ + pdev->dev.out_ep[epnum].xfer_count = pdev->dev.out_ep[epnum].maxpacket - \ + deptsiz.b.xfersize; + } + /* Inform upper layer: data ready */ + /* RX COMPLETE */ + USBD_DCD_INT_fops->DataOutStage(pdev , epnum); + + if (pdev->cfg.dma_enable == 1) + { + if((epnum == 0) && (pdev->dev.device_state == USB_OTG_EP0_STATUS_OUT)) + { + /* prepare to rx more setup packets */ + USB_OTG_EP0_OutStart(pdev); + } + } + } + /* Endpoint disable */ + if ( doepint.b.epdisabled ) + { + /* Clear the bit in DOEPINTn for this interrupt */ + CLEAR_OUT_EP_INTR(epnum, epdisabled); + } + /* Setup Phase Done (control EPs) */ + if ( doepint.b.setup ) + { + + /* inform the upper layer that a setup packet is available */ + /* SETUP COMPLETE */ + USBD_DCD_INT_fops->SetupStage(pdev); + CLEAR_OUT_EP_INTR(epnum, setup); + } + } + epnum++; + ep_intr >>= 1; + } + return 1; +} + +/** +* @brief DCD_HandleSof_ISR +* Handles the SOF Interrupts +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleSof_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef GINTSTS; + + + USBD_DCD_INT_fops->SOF(pdev); + + /* Clear interrupt */ + GINTSTS.d32 = 0; + GINTSTS.b.sofintr = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, GINTSTS.d32); + + return 1; +} + +/** +* @brief DCD_HandleRxStatusQueueLevel_ISR +* Handles the Rx Status Queue Level Interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleRxStatusQueueLevel_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTMSK_TypeDef int_mask; + USB_OTG_DRXSTS_TypeDef status; + USB_OTG_EP *ep; + + /* Disable the Rx Status Queue Level interrupt */ + int_mask.d32 = 0; + int_mask.b.rxstsqlvl = 1; + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, int_mask.d32, 0); + + /* Get the Status from the top of the FIFO */ + status.d32 = USB_OTG_READ_REG32( &pdev->regs.GREGS->GRXSTSP ); + + ep = &pdev->dev.out_ep[status.b.epnum]; + + switch (status.b.pktsts) + { + case STS_GOUT_NAK: + break; + case STS_DATA_UPDT: + if (status.b.bcnt) + { + USB_OTG_ReadPacket(pdev,ep->xfer_buff, status.b.bcnt); + ep->xfer_buff += status.b.bcnt; + ep->xfer_count += status.b.bcnt; + } + break; + case STS_XFER_COMP: + break; + case STS_SETUP_COMP: + break; + case STS_SETUP_UPDT: + /* Copy the setup packet received in FIFO into the setup buffer in RAM */ + USB_OTG_ReadPacket(pdev , pdev->dev.setup_packet, 8); + ep->xfer_count += status.b.bcnt; + break; + default: + break; + } + + /* Enable the Rx Status Queue Level interrupt */ + USB_OTG_MODIFY_REG32( &pdev->regs.GREGS->GINTMSK, 0, int_mask.d32); + + return 1; +} + +/** +* @brief DCD_WriteEmptyTxFifo +* check FIFO for the next packet to be loaded +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_WriteEmptyTxFifo(USB_OTG_CORE_HANDLE *pdev, uint32_t epnum) +{ + USB_OTG_DTXFSTSn_TypeDef txstatus; + USB_OTG_EP *ep; + uint32_t len = 0; + uint32_t len32b; + txstatus.d32 = 0; + + ep = &pdev->dev.in_ep[epnum]; + + len = ep->xfer_len - ep->xfer_count; + + if (len > ep->maxpacket) + { + len = ep->maxpacket; + } + + len32b = (len + 3) / 4; + txstatus.d32 = USB_OTG_READ_REG32( &pdev->regs.INEP_REGS[epnum]->DTXFSTS); + + + + while (txstatus.b.txfspcavail > len32b && + ep->xfer_count < ep->xfer_len && + ep->xfer_len != 0) + { + /* Write the FIFO */ + len = ep->xfer_len - ep->xfer_count; + + if (len > ep->maxpacket) + { + len = ep->maxpacket; + } + len32b = (len + 3) / 4; + + USB_OTG_WritePacket (pdev , ep->xfer_buff, epnum, len); + + ep->xfer_buff += len; + ep->xfer_count += len; + + txstatus.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DTXFSTS); + } + + return 1; +} + +/** +* @brief DCD_HandleUsbReset_ISR +* This interrupt occurs when a USB Reset is detected +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleUsbReset_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_DAINT_TypeDef daintmsk; + USB_OTG_DOEPMSK_TypeDef doepmsk; + USB_OTG_DIEPMSK_TypeDef diepmsk; + USB_OTG_DCFG_TypeDef dcfg; + USB_OTG_DCTL_TypeDef dctl; + USB_OTG_GINTSTS_TypeDef gintsts; + uint32_t i; + + dctl.d32 = 0; + daintmsk.d32 = 0; + doepmsk.d32 = 0; + diepmsk.d32 = 0; + dcfg.d32 = 0; + gintsts.d32 = 0; + + /* Clear the Remote Wake-up Signaling */ + dctl.b.rmtwkupsig = 1; + USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DCTL, dctl.d32, 0 ); + + /* Flush the Tx FIFO */ + USB_OTG_FlushTxFifo(pdev , 0 ); + + for (i = 0; i < pdev->cfg.dev_endpoints ; i++) + { + USB_OTG_WRITE_REG32( &pdev->regs.INEP_REGS[i]->DIEPINT, 0xFF); + USB_OTG_WRITE_REG32( &pdev->regs.OUTEP_REGS[i]->DOEPINT, 0xFF); + } + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINT, 0xFFFFFFFF ); + + daintmsk.ep.in = 1; + daintmsk.ep.out = 1; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DAINTMSK, daintmsk.d32 ); + + doepmsk.b.setup = 1; + doepmsk.b.xfercompl = 1; + doepmsk.b.epdisabled = 1; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOEPMSK, doepmsk.d32 ); +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DOUTEP1MSK, doepmsk.d32 ); +#endif + diepmsk.b.xfercompl = 1; + diepmsk.b.timeout = 1; + diepmsk.b.epdisabled = 1; + + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DIEPMSK, diepmsk.d32 ); +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DINEP1MSK, diepmsk.d32 ); +#endif + /* Reset Device Address */ + dcfg.d32 = USB_OTG_READ_REG32( &pdev->regs.DREGS->DCFG); + dcfg.b.devaddr = 0; + USB_OTG_WRITE_REG32( &pdev->regs.DREGS->DCFG, dcfg.d32); + + + /* setup EP0 to receive SETUP packets */ + USB_OTG_EP0_OutStart(pdev); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.usbreset = 1; + USB_OTG_WRITE_REG32 (&pdev->regs.GREGS->GINTSTS, gintsts.d32); + + /*Reset internal state machine */ + USBD_DCD_INT_fops->Reset(pdev); + return 1; +} + +/** +* @brief DCD_HandleEnumDone_ISR +* Read the device status register and set the device speed +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_HandleEnumDone_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + USB_OTG_GUSBCFG_TypeDef gusbcfg; + + USB_OTG_EP0Activate(pdev); + + /* Set USB turn-around time based on device speed and PHY interface. */ + gusbcfg.d32 = USB_OTG_READ_REG32(&pdev->regs.GREGS->GUSBCFG); + + /* Full or High speed */ + if ( USB_OTG_GetDeviceSpeed(pdev) == USB_SPEED_HIGH) + { + pdev->cfg.speed = USB_OTG_SPEED_HIGH; + pdev->cfg.mps = USB_OTG_HS_MAX_PACKET_SIZE ; + gusbcfg.b.usbtrdtim = 9; + } + else + { + pdev->cfg.speed = USB_OTG_SPEED_FULL; + pdev->cfg.mps = USB_OTG_FS_MAX_PACKET_SIZE ; + gusbcfg.b.usbtrdtim = 5; + } + + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GUSBCFG, gusbcfg.d32); + + /* Clear interrupt */ + gintsts.d32 = 0; + gintsts.b.enumdone = 1; + USB_OTG_WRITE_REG32( &pdev->regs.GREGS->GINTSTS, gintsts.d32 ); + return 1; +} + + +/** +* @brief DCD_IsoINIncomplete_ISR +* handle the ISO IN incomplete interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_IsoINIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + + gintsts.d32 = 0; + + USBD_DCD_INT_fops->IsoINIncomplete (pdev); + + /* Clear interrupt */ + gintsts.b.incomplisoin = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + + return 1; +} + +/** +* @brief DCD_IsoOUTIncomplete_ISR +* handle the ISO OUT incomplete interrupt +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_IsoOUTIncomplete_ISR(USB_OTG_CORE_HANDLE *pdev) +{ + USB_OTG_GINTSTS_TypeDef gintsts; + + gintsts.d32 = 0; + + USBD_DCD_INT_fops->IsoOUTIncomplete (pdev); + + /* Clear interrupt */ + gintsts.b.incomplisoout = 1; + USB_OTG_WRITE_REG32(&pdev->regs.GREGS->GINTSTS, gintsts.d32); + return 1; +} +/** +* @brief DCD_ReadDevInEP +* Reads ep flags +* @param pdev: device instance +* @retval status +*/ +static uint32_t DCD_ReadDevInEP (USB_OTG_CORE_HANDLE *pdev, uint8_t epnum) +{ + uint32_t v, msk, emp; + msk = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPMSK); + emp = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPEMPMSK); + msk |= ((emp >> epnum) & 0x1) << 7; + v = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[epnum]->DIEPINT) & msk; + return v; +} + + + +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/main.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/main.c index c2ddafff..9539e82f 100644 --- a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/main.c +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/main.c @@ -74,18 +74,28 @@ void main(void) ****************************************************************************************/ static void Init(void) { + GPIO_InitTypeDef GPIO_InitStructure; #if (BOOT_COM_UART_ENABLE > 0) - GPIO_InitTypeDef GPIO_InitStructure; #elif (BOOT_FILE_SYS_ENABLE > 0) - GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; -#elif (BOOT_COM_CAN_ENABLE > 0) - GPIO_InitTypeDef GPIO_InitStructure; #endif /* initialize the system and its clocks */ SystemInit(); + /* initialize the button as a digital input. is used to override the starting of + * the user program. + */ + /* enable the GPIO Clock */ + RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); + /* configure the GPIO pin */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + #if (BOOT_COM_UART_ENABLE > 0) /* enable UART peripheral clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE); diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usb_bsp.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usb_bsp.c new file mode 100644 index 00000000..43f41ad6 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usb_bsp.c @@ -0,0 +1,194 @@ +/** + ****************************************************************************** + * @file usb_bsp.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file is responsible to offer board support package and is + * configurable by user. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_bsp.h" +#include "usbd_conf.h" + + +extern void HwDelayUs(uint32_t time_us); +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY +* @{ +*/ + +/** @defgroup USB_BSP +* @brief This file is responsible to offer board support package +* @{ +*/ + +/** @defgroup USB_BSP_Private_Defines +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USB_BSP_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + + + + +/** @defgroup USB_BSP_Private_Macros +* @{ +*/ +/** +* @} +*/ + +/** @defgroup USBH_BSP_Private_Variables +* @{ +*/ + +/** +* @} +*/ + +/** @defgroup USBH_BSP_Private_FunctionPrototypes +* @{ +*/ +/** +* @} +*/ + +/** @defgroup USB_BSP_Private_Functions +* @{ +*/ + + + +/** +* @brief USB_OTG_BSP_Init +* Initilizes BSP configurations +* @param None +* @retval None +*/ +void USB_OTG_BSP_Init(USB_OTG_CORE_HANDLE *pdev) +{ + GPIO_InitTypeDef GPIO_InitStructure; + + RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA , ENABLE); + + /* Configure SOF ID DM DP Pins */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | + GPIO_Pin_11 | + GPIO_Pin_12; + + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_OTG1_FS) ; + GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_OTG1_FS) ; + GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_OTG1_FS) ; + + /* Configure VBUS Pin */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; + GPIO_Init(GPIOA, &GPIO_InitStructure); + + /* Configure ID pin */ + GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; + GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; + GPIO_Init(GPIOA, &GPIO_InitStructure); + GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_OTG1_FS) ; + + RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); + RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_OTG_FS, ENABLE) ; +} +/** +* @brief USB_OTG_BSP_EnableInterrupt +* Enabele USB Global interrupt +* @param None +* @retval None +*/ +void USB_OTG_BSP_EnableInterrupt(USB_OTG_CORE_HANDLE *pdev) +{ + /* driver runs in polling mode */ +} +/** +* @brief USB_OTG_BSP_uDelay +* This function provides delay time in micro sec +* @param usec : Value of delay required in micro sec +* @retval None +*/ +void USB_OTG_BSP_uDelay (const uint32_t usec) +{ + #define HW_DELAY_MS_LOOP_COUNT (28000) + + uint32_t delay_counter; + uint32_t time_us = usec; + + /* perform the delay */ + while (time_us-- > 0) + { + /* block program for about 1 millisecond */ + for (delay_counter=0; delay_counter<(HW_DELAY_MS_LOOP_COUNT/1000); delay_counter++) + { + asm("nop"); + } + } +} + + +/** +* @brief USB_OTG_BSP_mDelay +* This function provides delay time in milli sec +* @param msec : Value of delay required in milli sec +* @retval None +*/ +void USB_OTG_BSP_mDelay (const uint32_t msec) +{ + USB_OTG_BSP_uDelay(msec * 1000); +} +/** +* @} +*/ + +/** +* @} +*/ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usb_conf.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usb_conf.h new file mode 100644 index 00000000..ab61672f --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usb_conf.h @@ -0,0 +1,289 @@ +/** + ****************************************************************************** + * @file usb_conf.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief General low level driver configuration + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USB_CONF__H__ +#define __USB_CONF__H__ + +/* Includes ------------------------------------------------------------------*/ + #include "stm32f4xx.h" + + +/** @addtogroup USB_OTG_DRIVER + * @{ + */ + +/** @defgroup USB_CONF + * @brief USB low level driver configuration file + * @{ + */ + +/** @defgroup USB_CONF_Exported_Defines + * @{ + */ + +/* USB Core and PHY interface configuration. + Tip: To avoid modifying these defines each time you need to change the USB + configuration, you can declare the needed define in your toolchain + compiler preprocessor. + */ +/****************** USB OTG FS PHY CONFIGURATION ******************************* +* The USB OTG FS Core supports one on-chip Full Speed PHY. +* +* The USE_EMBEDDED_PHY symbol is defined in the project compiler preprocessor +* when FS core is used. +*******************************************************************************/ +#ifndef USE_USB_OTG_FS + //#define USE_USB_OTG_FS +#endif /* USE_USB_OTG_FS */ + +#ifdef USE_USB_OTG_FS + #define USB_OTG_FS_CORE +#endif + +/****************** USB OTG HS PHY CONFIGURATION ******************************* +* The USB OTG HS Core supports two PHY interfaces: +* (i) An ULPI interface for the external High Speed PHY: the USB HS Core will +* operate in High speed mode +* (ii) An on-chip Full Speed PHY: the USB HS Core will operate in Full speed mode +* +* You can select the PHY to be used using one of these two defines: +* (i) USE_ULPI_PHY: if the USB OTG HS Core is to be used in High speed mode +* (ii) USE_EMBEDDED_PHY: if the USB OTG HS Core is to be used in Full speed mode +* +* Notes: +* - The USE_ULPI_PHY symbol is defined in the project compiler preprocessor as +* default PHY when HS core is used. +* - On STM322xG-EVAL and STM324xG-EVAL boards, only configuration(i) is available. +* Configuration (ii) need a different hardware, for more details refer to your +* STM32 device datasheet. +*******************************************************************************/ +#ifndef USE_USB_OTG_HS + //#define USE_USB_OTG_HS +#endif /* USE_USB_OTG_HS */ + +#ifndef USE_ULPI_PHY + //#define USE_ULPI_PHY +#endif /* USE_ULPI_PHY */ + +#ifndef USE_EMBEDDED_PHY + //#define USE_EMBEDDED_PHY +#endif /* USE_EMBEDDED_PHY */ + +#ifdef USE_USB_OTG_HS + #define USB_OTG_HS_CORE +#endif + +/******************************************************************************* +* FIFO Size Configuration in Device mode +* +* (i) Receive data FIFO size = RAM for setup packets + +* OUT endpoint control information + +* data OUT packets + miscellaneous +* Space = ONE 32-bits words +* --> RAM for setup packets = 10 spaces +* (n is the nbr of CTRL EPs the device core supports) +* --> OUT EP CTRL info = 1 space +* (one space for status information written to the FIFO along with each +* received packet) +* --> data OUT packets = (Largest Packet Size / 4) + 1 spaces +* (MINIMUM to receive packets) +* --> OR data OUT packets = at least 2*(Largest Packet Size / 4) + 1 spaces +* (if high-bandwidth EP is enabled or multiple isochronous EPs) +* --> miscellaneous = 1 space per OUT EP +* (one space for transfer complete status information also pushed to the +* FIFO with each endpoint's last packet) +* +* (ii)MINIMUM RAM space required for each IN EP Tx FIFO = MAX packet size for +* that particular IN EP. More space allocated in the IN EP Tx FIFO results +* in a better performance on the USB and can hide latencies on the AHB. +* +* (iii) TXn min size = 16 words. (n : Transmit FIFO index) +* (iv) When a TxFIFO is not used, the Configuration should be as follows: +* case 1 : n > m and Txn is not used (n,m : Transmit FIFO indexes) +* --> Txm can use the space allocated for Txn. +* case2 : n < m and Txn is not used (n,m : Transmit FIFO indexes) +* --> Txn should be configured with the minimum space of 16 words +* (v) The FIFO is used optimally when used TxFIFOs are allocated in the top +* of the FIFO.Ex: use EP1 and EP2 as IN instead of EP1 and EP3 as IN ones. +* (vi) In HS case 12 FIFO locations should be reserved for internal DMA registers +* so total FIFO size should be 1012 Only instead of 1024 +*******************************************************************************/ + +/****************** USB OTG HS CONFIGURATION **********************************/ +#ifdef USB_OTG_HS_CORE + #define RX_FIFO_HS_SIZE 512 + #define TX0_FIFO_HS_SIZE 64 + #define TX1_FIFO_HS_SIZE 372 + #define TX2_FIFO_HS_SIZE 64 + #define TX3_FIFO_HS_SIZE 0 + #define TX4_FIFO_HS_SIZE 0 + #define TX5_FIFO_HS_SIZE 0 + +// #define USB_OTG_HS_SOF_OUTPUT_ENABLED + + #ifdef USE_ULPI_PHY + #define USB_OTG_ULPI_PHY_ENABLED + #endif + #ifdef USE_EMBEDDED_PHY + #define USB_OTG_EMBEDDED_PHY_ENABLED + /* wakeup is working only when HS core is configured in FS mode */ + #define USB_OTG_HS_LOW_PWR_MGMT_SUPPORT + #endif + /* #define USB_OTG_HS_INTERNAL_DMA_ENABLED */ /* Be aware that enabling DMA mode will result in data being sent only by + multiple of 4 packet sizes. This is due to the fact that USB DMA does + not allow sending data from non word-aligned addresses. + For this specific application, it is advised to not enable this option + unless required. */ + #define USB_OTG_HS_DEDICATED_EP1_ENABLED +#endif + +/****************** USB OTG FS CONFIGURATION **********************************/ +#ifdef USB_OTG_FS_CORE + #define RX_FIFO_FS_SIZE 128 + #define TX0_FIFO_FS_SIZE 32 + #define TX1_FIFO_FS_SIZE 128 + #define TX2_FIFO_FS_SIZE 32 + #define TX3_FIFO_FS_SIZE 0 + +// #define USB_OTG_FS_LOW_PWR_MGMT_SUPPORT +// #define USB_OTG_FS_SOF_OUTPUT_ENABLED +#endif + +/****************** USB OTG MISC CONFIGURATION ********************************/ +#define VBUS_SENSING_ENABLED + +/****************** USB OTG MODE CONFIGURATION ********************************/ +//#define USE_HOST_MODE +#define USE_DEVICE_MODE +//#define USE_OTG_MODE + +#ifndef USB_OTG_FS_CORE + #ifndef USB_OTG_HS_CORE + #error "USB_OTG_HS_CORE or USB_OTG_FS_CORE should be defined" + #endif +#endif + +#ifndef USE_DEVICE_MODE + #ifndef USE_HOST_MODE + #error "USE_DEVICE_MODE or USE_HOST_MODE should be defined" + #endif +#endif + +#ifndef USE_USB_OTG_HS + #ifndef USE_USB_OTG_FS + #error "USE_USB_OTG_HS or USE_USB_OTG_FS should be defined" + #endif +#else //USE_USB_OTG_HS + #ifndef USE_ULPI_PHY + #ifndef USE_EMBEDDED_PHY + #error "USE_ULPI_PHY or USE_EMBEDDED_PHY should be defined" + #endif + #endif +#endif + +/****************** C Compilers dependant keywords ****************************/ +/* In HS mode and when the DMA is used, all variables and data structures dealing + with the DMA during the transaction process should be 4-bytes aligned */ +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined (__GNUC__) /* GNU Compiler */ + #define __ALIGN_END __attribute__ ((aligned (4))) + #define __ALIGN_BEGIN + #else + #define __ALIGN_END + #if defined (__CC_ARM) /* ARM Compiler */ + #define __ALIGN_BEGIN __align(4) + #elif defined (__ICCARM__) /* IAR Compiler */ + #define __ALIGN_BEGIN + #elif defined (__TASKING__) /* TASKING Compiler */ + #define __ALIGN_BEGIN __align(4) + #endif /* __CC_ARM */ + #endif /* __GNUC__ */ +#else + #define __ALIGN_BEGIN + #define __ALIGN_END +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ + +/* __packed keyword used to decrease the data type alignment to 1-byte */ +#if defined (__CC_ARM) /* ARM Compiler */ + #define __packed __packed +#elif defined (__ICCARM__) /* IAR Compiler */ + #define __packed __packed +#elif defined ( __GNUC__ ) /* GNU Compiler */ + #define __packed __attribute__ ((__packed__)) +#elif defined (__TASKING__) /* TASKING Compiler */ + #define __packed __unaligned +#endif /* __CC_ARM */ + +/** + * @} + */ + + +/** @defgroup USB_CONF_Exported_Types + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_CONF_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +#endif //__USB_CONF__H__ + + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_bulk.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_bulk.c new file mode 100644 index 00000000..6bd165b6 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_bulk.c @@ -0,0 +1,361 @@ +/** + ****************************************************************************** + * @file usbd_bulk.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file provides the high layer firmware functions to manage a + * USB bulk device. + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_bulk.h" +#include "usbd_desc.h" +#include "usbd_req.h" + + +extern void UsbReceivePipeBulkOUT(uint8_t epnum); +extern void UsbTransmitPipeBulkIN(void); + + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup usbd_bulk + * @brief usbd core module + * @{ + */ + +/** @defgroup usbd_bulk_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup usbd_bulk_Private_Defines + * @{ + */ +/** + * @} + */ + + +/** @defgroup usbd_bulk_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup usbd_bulk_Private_FunctionPrototypes + * @{ + */ + +/********************************************* + BULK Device library callbacks + *********************************************/ +static uint8_t usbd_bulk_Init (void *pdev, uint8_t cfgidx); +static uint8_t usbd_bulk_DeInit (void *pdev, uint8_t cfgidx); +static uint8_t usbd_bulk_Setup (void *pdev, USB_SETUP_REQ *req); +static uint8_t usbd_bulk_DataIn (void *pdev, uint8_t epnum); +static uint8_t usbd_bulk_DataOut (void *pdev, uint8_t epnum); +static uint8_t usbd_bulk_SOF (void *pdev); + +/********************************************* + BULK specific management functions + *********************************************/ +static uint8_t *USBD_bulk_GetCfgDesc (uint8_t speed, uint16_t *length); +/** + * @} + */ + + +/** @defgroup usbd_bulk_Private_Variables + * @{ + */ +__ALIGN_BEGIN static volatile uint32_t usbd_bulk_AltSet __ALIGN_END = 0; + +__ALIGN_BEGIN uint8_t USB_Rx_Buffer[BULK_DATA_MAX_PACKET_SIZE] __ALIGN_END ; + + +/* Bulk interface class callbacks structure */ +USBD_Class_cb_TypeDef USBD_bulk_cb = +{ + usbd_bulk_Init, + usbd_bulk_DeInit, + usbd_bulk_Setup, + NULL, + NULL, + usbd_bulk_DataIn, + usbd_bulk_DataOut, + usbd_bulk_SOF, + NULL, + NULL, + USBD_bulk_GetCfgDesc +}; + + +/* USB CDC device Configuration Descriptor */ +__ALIGN_BEGIN uint8_t usbd_bulk_CfgDesc[USB_BULK_CONFIG_DESC_SIZ] __ALIGN_END = +{ + /*Configuration Descriptor*/ + 0x09, /* bLength: Configuration Descriptor size */ + USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */ + USB_BULK_CONFIG_DESC_SIZ, /* wTotalLength:no of returned bytes */ + 0x00, + 0x01, /* bNumInterfaces: 1 interface */ + 0x01, /* bConfigurationValue: Configuration value */ + 0x00, /* iConfiguration: Index of string descriptor describing the configuration */ + 0xC0, /* bmAttributes: self powered */ + 0x32, /* MaxPower 100 mA */ + /*---------------------------------------------------------------------------*/ + /*Interface Descriptor*/ + 0x09, /* bLength: Endpoint Descriptor size */ + USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType: */ + 0x00, /* bInterfaceNumber: Number of Interface */ + 0x00, /* bAlternateSetting: Alternate setting */ + 0x02, /* bNumEndpoints: Two endpoints used */ + 0xFF, /* bInterfaceClass: vendor specific */ + 0x00, /* bInterfaceSubClass */ + 0x00, /* bInterfaceProtocol */ + 0x00, /* iInterface: */ + /*Endpoint 1 IN Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + BULK_IN_EP, /* bEndpointAddress: (IN1) */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(BULK_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(BULK_DATA_MAX_PACKET_SIZE), + 0xFF, /* bInterval: ignore for Bulk transfer */ + /*Endpoint 1 OUT Descriptor*/ + 0x07, /* bLength: Endpoint Descriptor size */ + USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: Endpoint */ + BULK_OUT_EP, /* bEndpointAddress: (OUT1) */ + 0x02, /* bmAttributes: Bulk */ + LOBYTE(BULK_DATA_MAX_PACKET_SIZE), /* wMaxPacketSize: */ + HIBYTE(BULK_DATA_MAX_PACKET_SIZE), + 0xFF /* bInterval: ignore for Bulk transfer */ +} ; + + +/** + * @} + */ + +/** @defgroup usbd_bulk_Private_Functions + * @{ + */ + +/** + * @brief usbd_bulk_Init + * Initilaize the Bulk interface + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t usbd_bulk_Init (void *pdev, + uint8_t cfgidx) +{ + /* Open EP IN */ + DCD_EP_Open(pdev, + BULK_IN_EP, + BULK_DATA_IN_PACKET_SIZE, + USB_OTG_EP_BULK); + + /* Open EP OUT */ + DCD_EP_Open(pdev, + BULK_OUT_EP, + BULK_DATA_OUT_PACKET_SIZE, + USB_OTG_EP_BULK); + + + /* Prepare Out endpoint to receive next packet */ + DCD_EP_PrepareRx(pdev, + BULK_OUT_EP, + (uint8_t*)(USB_Rx_Buffer), + BULK_DATA_OUT_PACKET_SIZE); + + return USBD_OK; +} + +/** + * @brief usbd_bulk_DeInit + * DeInitialize the layer + * @param pdev: device instance + * @param cfgidx: Configuration index + * @retval status + */ +static uint8_t usbd_bulk_DeInit (void *pdev, + uint8_t cfgidx) +{ + /* Open EP IN */ + DCD_EP_Close(pdev, BULK_IN_EP); + + /* Open EP OUT */ + DCD_EP_Close(pdev, BULK_OUT_EP); + + return USBD_OK; +} + +/** + * @brief usbd_bulk_Setup + * Handle the bulk specific requests + * @param pdev: instance + * @param req: usb requests + * @retval status + */ +static uint8_t usbd_bulk_Setup (void *pdev, + USB_SETUP_REQ *req) +{ + uint16_t len=USB_BULK_DESC_SIZ; + uint8_t *pbuf=usbd_bulk_CfgDesc + 9; + + switch (req->bmRequest & USB_REQ_TYPE_MASK) + { + /* Standard Requests -------------------------------*/ + case USB_REQ_TYPE_STANDARD: + switch (req->bRequest) + { + case USB_REQ_GET_DESCRIPTOR: + if( (req->wValue >> 8) == BULK_DESCRIPTOR_TYPE) + { + pbuf = usbd_bulk_CfgDesc + 9 + (9 * USBD_ITF_MAX_NUM); + len = MIN(USB_BULK_DESC_SIZ , req->wLength); + } + + USBD_CtlSendData (pdev, + pbuf, + len); + break; + + case USB_REQ_GET_INTERFACE : + USBD_CtlSendData (pdev, + (uint8_t *)&usbd_bulk_AltSet, + 1); + break; + + case USB_REQ_SET_INTERFACE : + if ((uint8_t)(req->wValue) < USBD_ITF_MAX_NUM) + { + usbd_bulk_AltSet = (uint8_t)(req->wValue); + } + else + { + /* Call the error management function (command will be nacked */ + USBD_CtlError (pdev, req); + } + break; + } + } + return USBD_OK; +} + + +/** + * @brief usbd_bulk_DataIn + * Data sent on non-control IN endpoint + * @param pdev: device instance + * @param epnum: endpoint number + * @retval status + */ +static uint8_t usbd_bulk_DataIn (void *pdev, uint8_t epnum) +{ + /* endpoint finished the previous transmission so see if more data is left */ + UsbTransmitPipeBulkIN(); + return USBD_OK; +} + +/** + * @brief usbd_bulk_DataOut + * Data received on non-control Out endpoint + * @param pdev: device instance + * @param epnum: endpoint number + * @retval status + */ +static uint8_t usbd_bulk_DataOut (void *pdev, uint8_t epnum) +{ + /* read the data from the bulk OUT pipe */ + UsbReceivePipeBulkOUT(epnum); + return USBD_OK; +} + + +/** + * @brief usbd_buld_get_rx_buffer_ptr + * Get pointer to the USB rx buffer + * @retval Buffer pointer + */ +uint8_t *usbd_bulk_get_rx_buffer_ptr(void) +{ + return USB_Rx_Buffer; +} + + +/** + * @brief usbd_bulk_SOF + * Start Of Frame event management + * @param pdev: instance + * @param epnum: endpoint number + * @retval status + */ +static uint8_t usbd_bulk_SOF (void *pdev) +{ + if (((USB_OTG_CORE_HANDLE*)pdev)->dev.device_status == USB_OTG_CONFIGURED) + { + /* Check the data to be sent through IN pipe */ + UsbTransmitPipeBulkIN(); + } + return USBD_OK; +} + + +/** + * @brief USBD_bulk_GetCfgDesc + * Return configuration descriptor + * @param speed : current device speed + * @param length : pointer data length + * @retval pointer to descriptor buffer + */ +static uint8_t *USBD_bulk_GetCfgDesc (uint8_t speed, uint16_t *length) +{ + *length = sizeof (usbd_bulk_CfgDesc); + return usbd_bulk_CfgDesc; +} + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_bulk.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_bulk.h new file mode 100644 index 00000000..7c17ac87 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_bulk.h @@ -0,0 +1,102 @@ +/** + ****************************************************************************** + * @file usbd_bulk.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief header file for the usbd_bulk.c file. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ + +#ifndef __USB_BULK_H_ +#define __USB_BULK_H_ + +#include "usbd_ioreq.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup usbd_cdc + * @brief This file is the Header file for USBD_cdc.c + * @{ + */ + + +/** @defgroup usbd_bulk_Exported_Defines + * @{ + */ +#define USB_BULK_CONFIG_DESC_SIZ (32) +#define USB_BULK_DESC_SIZ (32-9) + +#define BULK_DESCRIPTOR_TYPE 0x21 + + +#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 +#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 +#define USB_STRING_DESCRIPTOR_TYPE 0x03 +#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 +#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 + +#define STANDARD_ENDPOINT_DESC_SIZE 0x09 + +#define BULK_DATA_IN_PACKET_SIZE BULK_DATA_MAX_PACKET_SIZE +#define BULK_DATA_OUT_PACKET_SIZE BULK_DATA_MAX_PACKET_SIZE + + + + +/** @defgroup USBD_CORE_Exported_Macros + * @{ + */ + +/** + * @} + */ + +/** @defgroup USBD_CORE_Exported_Variables + * @{ + */ + +extern USBD_Class_cb_TypeDef USBD_bulk_cb; +/** + * @} + */ + +/** @defgroup USB_CORE_Exported_Functions + * @{ + */ +uint8_t *usbd_bulk_get_rx_buffer_ptr(void); +/** + * @} + */ + +#endif // __USB_CDC_CORE_H_ +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_conf.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_conf.h new file mode 100644 index 00000000..be7b1bae --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_conf.h @@ -0,0 +1,91 @@ +/** + ****************************************************************************** + * @file usbd_conf.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief USB Device configuration file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __USBD_CONF__H__ +#define __USBD_CONF__H__ + +/* Includes ------------------------------------------------------------------*/ +#include "usb_conf.h" + +/** @defgroup USB_CONF_Exported_Defines + * @{ + */ +#define USBD_CFG_MAX_NUM 1 +#define USBD_ITF_MAX_NUM 1 + +#define USBD_SELF_POWERED + +#define USB_MAX_STR_DESC_SIZ 255 + +/** @defgroup USB_VCP_Class_Layer_Parameter + * @{ + */ +#define BULK_IN_EP 0x81 /* EP1 for data IN */ +#define BULK_OUT_EP 0x01 /* EP1 for data OUT */ + +/* Bulk endpoints parameters: you can fine tune these values depending on the needed baudrates and performance. */ +#define BULK_DATA_MAX_PACKET_SIZE 64 /* Endpoint IN & OUT Packet size */ + +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_Types + * @{ + */ +/** + * @} + */ + + +/** @defgroup USB_CONF_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_Variables + * @{ + */ +/** + * @} + */ + +/** @defgroup USB_CONF_Exported_FunctionsPrototype + * @{ + */ +/** + * @} + */ + + +#endif //__USBD_CONF__H__ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_desc.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_desc.c new file mode 100644 index 00000000..b648b3c8 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_desc.c @@ -0,0 +1,271 @@ +/** + ****************************************************************************** + * @file usbd_desc.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file provides the USBD descriptors and string formating method. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_core.h" +#include "usbd_desc.h" +#include "usbd_req.h" +#include "usbd_conf.h" +#include "usb_regs.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + + +/** @defgroup USBD_DESC + * @brief USBD descriptors module + * @{ + */ + +/** @defgroup USBD_DESC_Private_TypesDefinitions + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Defines + * @{ + */ +#define USBD_VID 0x0145 + +#define USBD_PID 0x0023 + +/** @defgroup USB_String_Descriptors + * @{ + */ +#define USBD_LANGID_STRING 0x409 +#define USBD_MANUFACTURER_STRING "OpenBLT User" + +#define USBD_PRODUCT_FS_STRING "WinUSB Bulk Device" +#define USBD_SERIALNUMBER_FS_STRING "00000000050C" + +#define USBD_CONFIGURATION_FS_STRING "Default" +#define USBD_INTERFACE_FS_STRING "WinUSB Bulk Interface" +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Macros + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Variables + * @{ + */ + +USBD_DEVICE USR_desc = +{ + USBD_USR_DeviceDescriptor, + USBD_USR_LangIDStrDescriptor, + USBD_USR_ManufacturerStrDescriptor, + USBD_USR_ProductStrDescriptor, + USBD_USR_SerialStrDescriptor, + USBD_USR_ConfigStrDescriptor, + USBD_USR_InterfaceStrDescriptor, + +}; + +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END = + { + 0x12, /*bLength */ + USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/ + 0x10, /*bcdUSB = 1.1 */ + 0x01, + 0x00, /*bDeviceClass*/ + 0x00, /*bDeviceSubClass*/ + 0x00, /*bDeviceProtocol*/ + USB_OTG_MAX_EP0_SIZE, /*bMaxPacketSize*/ + LOBYTE(USBD_VID), /*idVendor*/ + HIBYTE(USBD_VID), /*idVendor*/ + LOBYTE(USBD_PID), /*idVendor*/ + HIBYTE(USBD_PID), /*idVendor*/ + 0x00, /*bcdDevice rel. 1.00*/ + 0x01, + USBD_IDX_MFC_STR, /*Index of manufacturer string*/ + USBD_IDX_PRODUCT_STR, /*Index of product string*/ + USBD_IDX_SERIAL_STR, /*Index of serial number string*/ + USBD_CFG_MAX_NUM /*bNumConfigurations*/ + } ; /* USB_DeviceDescriptor */ + +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN uint8_t USBD_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC] __ALIGN_END = +{ + USB_LEN_DEV_QUALIFIER_DESC, + USB_DESC_TYPE_DEVICE_QUALIFIER, + 0x10, + 0x01, + 0x00, + 0x00, + 0x00, + 0x40, + 0x01, + 0x00, +}; + +/* USB Standard Device Descriptor */ +__ALIGN_BEGIN uint8_t USBD_LangIDDesc[USB_SIZ_STRING_LANGID] __ALIGN_END = +{ + USB_SIZ_STRING_LANGID, + USB_DESC_TYPE_STRING, + LOBYTE(USBD_LANGID_STRING), + HIBYTE(USBD_LANGID_STRING), +}; +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_FunctionPrototypes + * @{ + */ +/** + * @} + */ + + +/** @defgroup USBD_DESC_Private_Functions + * @{ + */ + +/** +* @brief USBD_USR_DeviceDescriptor +* return the device descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_DeviceDescriptor( uint8_t speed , uint16_t *length) +{ + *length = sizeof(USBD_DeviceDesc); + return USBD_DeviceDesc; +} + +/** +* @brief USBD_USR_LangIDStrDescriptor +* return the LangID string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_LangIDStrDescriptor( uint8_t speed , uint16_t *length) +{ + *length = sizeof(USBD_LangIDDesc); + return USBD_LangIDDesc; +} + + +/** +* @brief USBD_USR_ProductStrDescriptor +* return the product string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_ProductStrDescriptor( uint8_t speed , uint16_t *length) +{ + USBD_GetString ((uint8_t *)USBD_PRODUCT_FS_STRING, USBD_StrDesc, length); + return USBD_StrDesc; +} + +/** +* @brief USBD_USR_ManufacturerStrDescriptor +* return the manufacturer string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_ManufacturerStrDescriptor( uint8_t speed , uint16_t *length) +{ + USBD_GetString ((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length); + return USBD_StrDesc; +} + +/** +* @brief USBD_USR_SerialStrDescriptor +* return the serial number string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_SerialStrDescriptor( uint8_t speed , uint16_t *length) +{ + USBD_GetString ((uint8_t *)USBD_SERIALNUMBER_FS_STRING, USBD_StrDesc, length); + return USBD_StrDesc; +} + +/** +* @brief USBD_USR_ConfigStrDescriptor +* return the configuration string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length) +{ + USBD_GetString ((uint8_t *)USBD_CONFIGURATION_FS_STRING, USBD_StrDesc, length); + return USBD_StrDesc; +} + + +/** +* @brief USBD_USR_InterfaceStrDescriptor +* return the interface string descriptor +* @param speed : current device speed +* @param length : pointer to data length variable +* @retval pointer to descriptor buffer +*/ +uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length) +{ + USBD_GetString ((uint8_t *)USBD_INTERFACE_FS_STRING, USBD_StrDesc, length); + return USBD_StrDesc; +} + +/** + * @} + */ + + +/** + * @} + */ + + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ + diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_desc.h b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_desc.h new file mode 100644 index 00000000..e28e14ae --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_desc.h @@ -0,0 +1,120 @@ +/** + ****************************************************************************** + * @file usbd_desc.h + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief header file for the usbd_desc.c file + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ + +#ifndef __USB_DESC_H +#define __USB_DESC_H + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_def.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY + * @{ + */ + +/** @defgroup USB_DESC + * @brief general defines for the usb device library file + * @{ + */ + +/** @defgroup USB_DESC_Exported_Defines + * @{ + */ +#define USB_DEVICE_DESCRIPTOR_TYPE 0x01 +#define USB_CONFIGURATION_DESCRIPTOR_TYPE 0x02 +#define USB_STRING_DESCRIPTOR_TYPE 0x03 +#define USB_INTERFACE_DESCRIPTOR_TYPE 0x04 +#define USB_ENDPOINT_DESCRIPTOR_TYPE 0x05 +#define USB_SIZ_DEVICE_DESC 18 +#define USB_SIZ_STRING_LANGID 4 + +/** + * @} + */ + + +/** @defgroup USBD_DESC_Exported_TypesDefinitions + * @{ + */ +/** + * @} + */ + + + +/** @defgroup USBD_DESC_Exported_Macros + * @{ + */ +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_Variables + * @{ + */ +extern uint8_t USBD_DeviceDesc [USB_SIZ_DEVICE_DESC]; +extern uint8_t USBD_StrDesc[USB_MAX_STR_DESC_SIZ]; +extern uint8_t USBD_OtherSpeedCfgDesc[USB_LEN_CFG_DESC]; +extern uint8_t USBD_DeviceQualifierDesc[USB_LEN_DEV_QUALIFIER_DESC]; +extern uint8_t USBD_LangIDDesc[USB_SIZ_STRING_LANGID]; +extern USBD_DEVICE USR_desc; +/** + * @} + */ + +/** @defgroup USBD_DESC_Exported_FunctionsPrototype + * @{ + */ + + +uint8_t * USBD_USR_DeviceDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_LangIDStrDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_ManufacturerStrDescriptor ( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_ProductStrDescriptor ( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_SerialStrDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_ConfigStrDescriptor( uint8_t speed , uint16_t *length); +uint8_t * USBD_USR_InterfaceStrDescriptor( uint8_t speed , uint16_t *length); + +#ifdef USB_SUPPORT_USER_STRING_DESC +uint8_t * USBD_USR_USRStringDesc (uint8_t speed, uint8_t idx , uint16_t *length); +#endif /* USB_SUPPORT_USER_STRING_DESC */ + +/** + * @} + */ + +#endif /* __USBD_DESC_H */ + +/** + * @} + */ + +/** +* @} +*/ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_usr.c b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_usr.c new file mode 100644 index 00000000..ef9aefc8 --- /dev/null +++ b/Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_usr.c @@ -0,0 +1,206 @@ +/** + ****************************************************************************** + * @file usbd_usr.c + * @author MCD Application Team + * @version V1.1.0 + * @date 19-March-2012 + * @brief This file includes the user application layer + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2012 STMicroelectronics

+ * + * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License"); + * You may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.st.com/software_license_agreement_liberty_v2 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usbd_usr.h" +#include "usbd_ioreq.h" +#include "boot.h" /* bootloader generic header */ +#include "usb.h" + +/** @addtogroup STM32_USB_OTG_DEVICE_LIBRARY +* @{ +*/ + +/** @defgroup USBD_USR +* @brief This file includes the user application layer +* @{ +*/ + +/** @defgroup USBD_USR_Private_TypesDefinitions +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USBD_USR_Private_Defines +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USBD_USR_Private_Macros +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USBD_USR_Private_Variables +* @{ +*/ + +USBD_Usr_cb_TypeDef USR_cb = +{ + USBD_USR_Init, + USBD_USR_DeviceReset, + USBD_USR_DeviceConfigured, + USBD_USR_DeviceSuspended, + USBD_USR_DeviceResumed, + USBD_USR_DeviceConnected, + USBD_USR_DeviceDisconnected, +}; + +/** +* @} +*/ + +/** @defgroup USBD_USR_Private_Constants +* @{ +*/ + +/** +* @} +*/ + + + +/** @defgroup USBD_USR_Private_FunctionPrototypes +* @{ +*/ +/** +* @} +*/ + + +/** @defgroup USBD_USR_Private_Functions +* @{ +*/ + +/** +* @brief USBD_USR_Init +* Displays the message on LCD for host lib initialization +* @param None +* @retval None +*/ +void USBD_USR_Init(void) +{ +} + +/** +* @brief USBD_USR_DeviceReset +* Displays the message on LCD on device Reset Event +* @param speed : device speed +* @retval None +*/ +void USBD_USR_DeviceReset(uint8_t speed ) +{ + switch (speed) + { + case USB_OTG_SPEED_HIGH: + break; + + case USB_OTG_SPEED_FULL: + break; + default: + break; + } +} + + +/** +* @brief USBD_USR_DeviceConfigured +* Displays the message on LCD on device configuration Event +* @param None +* @retval Staus +*/ +void USBD_USR_DeviceConfigured (void) +{ +} + +/** +* @brief USBD_USR_DeviceSuspended +* Displays the message on LCD on device suspend Event +* @param None +* @retval None +*/ +void USBD_USR_DeviceSuspended(void) +{ + /* Users can do their application actions here for the USB-Reset */ + UsbEnterLowPowerModeHook(); +} + + +/** +* @brief USBD_USR_DeviceResumed +* Displays the message on LCD on device resume Event +* @param None +* @retval None +*/ +void USBD_USR_DeviceResumed(void) +{ + /* Users can do their application actions here for the USB-Reset */ + UsbLeaveLowPowerModeHook(); +} + + +/** +* @brief USBD_USR_DeviceConnected +* Displays the message on LCD on device connection Event +* @param None +* @retval Staus +*/ +void USBD_USR_DeviceConnected (void) +{ + /* cable plugged-in */ + UsbConnectHook(BLT_TRUE); +} + +/** +* @brief USBD_USR_DeviceDisonnected +* Displays the message on LCD on device disconnection Event +* @param None +* @retval Staus +*/ +void USBD_USR_DeviceDisconnected (void) +{ + /* Disable the Pull-Up */ + UsbConnectHook(BLT_FALSE); +} +/** +* @} +*/ + +/** +* @} +*/ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Target/Source/ARMCM4_STM32/usb.c b/Target/Source/ARMCM4_STM32/usb.c new file mode 100644 index 00000000..6b963461 --- /dev/null +++ b/Target/Source/ARMCM4_STM32/usb.c @@ -0,0 +1,488 @@ +/************************************************************************************//** +* \file Source\ARMCM3_STM32\usb.c +* \brief Bootloader USB communication interface source file. +* \ingroup Target_ARMCM3_STM32 +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2011 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 "boot.h" /* bootloader generic header */ +#if (BOOT_COM_USB_ENABLE > 0) +#include "usb.h" /* USB bootloader driver */ +#include "usb_core.h" /* USB library core */ +#include "usb_conf.h" /* USB descriptor */ +#include "usb_dcd_int.h" /* USB core interrupts */ +#include "usbd_core.h" /* USB driver core */ +#include "usbd_usr.h" /* USB driver configuration */ +#include "usbd_desc.h" /* USB driver descriptor */ +#include "usbd_bulk.h" /* USB driver bulk device */ + + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +/** \brief Total number of fifo buffers. */ +#define FIFO_MAX_BUFFERS (2) +/** \brief Invalid value for a fifo buffer handle. */ +#define FIFO_ERR_INVALID_HANDLE (255) +/** \brief Number of bytes that fit in the fifo pipe. */ +#define FIFO_PIPE_SIZE (64) + + +/**************************************************************************************** +* Type definitions +****************************************************************************************/ +/** \brief Structure type for fifo control. */ +typedef struct t_fifo_ctrl +{ + blt_int8u *startptr; /**< pointer to start of buffer */ + blt_int8u *endptr; /**< pointer to end of buffer */ + blt_int8u *readptr; /**< pointer to next read location */ + blt_int8u *writeptr; /**< pointer to next free location */ + blt_int8u length; /**< number of buffer elements */ + blt_int8u entries; /**< # of full buffer elements */ + blt_int8u handle; /**< handle of the buffer */ + struct t_fifo_ctrl *fifoctrlptr; /**< pointer to free buffer control */ +} tFifoCtrl; + +/** \brief Structure type for a fifo pipe. */ +typedef struct +{ + blt_int8u handle; /**< fifo handle */ + blt_int8u data[FIFO_PIPE_SIZE]; /**< fifo data buffer */ +} tFifoPipe; /**< USB pipe fifo type */ + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +static blt_bool UsbReceiveByte(blt_int8u *data); +static blt_bool UsbTransmitByte(blt_int8u data); +static void UsbFifoMgrInit(void); +static blt_int8u UsbFifoMgrCreate(blt_int8u *buffer, blt_int8u length); +static blt_bool UsbFifoMgrWrite(blt_int8u handle, blt_int8u data); +static blt_bool UsbFifoMgrRead(blt_int8u handle, blt_int8u *data); +static blt_int8u UsbFifoMgrScan(blt_int8u handle); + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/** \brief Local variable that holds the fifo control structures. */ +static tFifoCtrl fifoCtrl[FIFO_MAX_BUFFERS]; +/** \brief Local pointer that points to the next free fifo control structure. */ +static tFifoCtrl *fifoCtrlFree; +/** \brief Fifo pipe used for the bulk in endpoint. */ +static tFifoPipe fifoPipeBulkIN; +/** \brief Fifo pipe used for the bulk out endpoint. */ +static tFifoPipe fifoPipeBulkOUT; +/** \brief USB device handle. */ +static USB_OTG_CORE_HANDLE USB_OTG_dev; + + + +/************************************************************************************//** +** \brief Initializes the USB communication interface. +** \return none. +** +****************************************************************************************/ +void UsbInit(void) +{ + /* initialize the FIFO manager */ + UsbFifoMgrInit(); + /* place 2 buffers under FIFO management */ + fifoPipeBulkIN.handle = UsbFifoMgrCreate(fifoPipeBulkIN.data, FIFO_PIPE_SIZE); + fifoPipeBulkOUT.handle = UsbFifoMgrCreate(fifoPipeBulkOUT.data, FIFO_PIPE_SIZE); + /* validate fifo handles */ + ASSERT_RT( (fifoPipeBulkIN.handle != FIFO_ERR_INVALID_HANDLE) && \ + (fifoPipeBulkOUT.handle != FIFO_ERR_INVALID_HANDLE) ); + /* initialize the low level USB driver */ + USBD_Init(&USB_OTG_dev, USB_OTG_FS_CORE_ID, &USR_desc, &USBD_bulk_cb, &USR_cb); +} /*** end of UsbInit ***/ + + +/************************************************************************************//** +** \brief Releases the USB communication interface. +** \return none. +** +****************************************************************************************/ +void UsbFree(void) +{ + /* disconnect the USB device from the USB host */ + DCD_DevDisconnect(&USB_OTG_dev); + /* invoke hook function */ + UsbConnectHook(BLT_FALSE); +} /*** end of UsbFree ***/ + + +/************************************************************************************//** +** \brief Transmits a packet formatted for the communication interface. +** \param data Pointer to byte array with data that it to be transmitted. +** \param len Number of bytes that are to be transmitted. +** \return none. +** +****************************************************************************************/ +void UsbTransmitPacket(blt_int8u *data, blt_int8u len) +{ + blt_int16u data_index; + blt_bool result; + + /* verify validity of the len-paramenter */ + ASSERT_RT(len <= BOOT_COM_USB_TX_MAX_DATA); + + /* first transmit the length of the packet */ + result = UsbTransmitByte(len); + ASSERT_RT(result == BLT_TRUE); + + /* transmit all the packet bytes one-by-one */ + for (data_index = 0; data_index < len; data_index++) + { + /* keep the watchdog happy */ + CopService(); + /* write byte */ + result = UsbTransmitByte(data[data_index]); + ASSERT_RT(result == BLT_TRUE); + } +} /*** end of UsbTransmitPacket ***/ + + +/************************************************************************************//** +** \brief Receives a communication interface packet if one is present. +** \param data Pointer to byte array where the data is to be stored. +** \return BLT_TRUE if a packet was received, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool UsbReceivePacket(blt_int8u *data) +{ + static blt_int8u xcpCtoReqPacket[BOOT_COM_USB_RX_MAX_DATA+1]; /* one extra for length */ + static blt_int8u xcpCtoRxLength; + static blt_bool xcpCtoRxInProgress = BLT_FALSE; + + /* poll USB interrupt flags to process USB related events */ + USBD_OTG_ISR_Handler (&USB_OTG_dev); + + /* start of cto packet received? */ + if (xcpCtoRxInProgress == BLT_FALSE) + { + /* store the message length when received */ + if (UsbReceiveByte(&xcpCtoReqPacket[0]) == BLT_TRUE) + { + if (xcpCtoReqPacket[0] > 0) + { + /* indicate that a cto packet is being received */ + xcpCtoRxInProgress = BLT_TRUE; + /* reset packet data count */ + xcpCtoRxLength = 0; + } + } + } + else + { + /* store the next packet byte */ + if (UsbReceiveByte(&xcpCtoReqPacket[xcpCtoRxLength+1]) == BLT_TRUE) + { + /* increment the packet data count */ + xcpCtoRxLength++; + + /* check to see if the entire packet was received */ + if (xcpCtoRxLength == xcpCtoReqPacket[0]) + { + /* copy the packet data */ + CpuMemCopy((blt_int32u)data, (blt_int32u)&xcpCtoReqPacket[1], xcpCtoRxLength); + /* done with cto packet reception */ + xcpCtoRxInProgress = BLT_FALSE; + + /* packet reception complete */ + return BLT_TRUE; + } + } + } + /* packet reception not yet complete */ + return BLT_FALSE; +} /*** end of UsbReceivePacket ***/ + + +/************************************************************************************//** +** \brief Receives a communication interface byte if one is present. +** \param data Pointer to byte where the data is to be stored. +** \return BLT_TRUE if a byte was received, BLT_FALSE otherwise. +** +****************************************************************************************/ +static blt_bool UsbReceiveByte(blt_int8u *data) +{ + blt_bool result; + + /* obtain data from the fifo */ + result = UsbFifoMgrRead(fifoPipeBulkOUT.handle, data); + return result; +} /*** end of UsbReceiveByte ***/ + + +/************************************************************************************//** +** \brief Transmits a communication interface byte. +** \param data Value of byte that is to be transmitted. +** \return BLT_TRUE if the byte was transmitted, BLT_FALSE otherwise. +** +****************************************************************************************/ +static blt_bool UsbTransmitByte(blt_int8u data) +{ + blt_bool result; + + /* write data from to fifo */ + result = UsbFifoMgrWrite(fifoPipeBulkIN.handle, data); + return result; +} /*** end of UsbTransmitByte ***/ + + +/************************************************************************************//** +** \brief Checks if there is still data left to transmit and if so submits it +** for transmission with the USB endpoint. +** \return none. +** +****************************************************************************************/ +void UsbTransmitPipeBulkIN(void) +{ + /* USB_Tx_Buffer is static for run-time optimalization */ + static uint8_t USB_Tx_Buffer[BULK_DATA_MAX_PACKET_SIZE]; + blt_int8u nr_of_bytes_for_tx_endpoint; + blt_int8u byte_counter; + blt_int8u byte_value; + blt_bool result; + + /* read how many bytes should be transmitted */ + nr_of_bytes_for_tx_endpoint = UsbFifoMgrScan(fifoPipeBulkIN.handle); + /* only continue if there is actually data left to transmit */ + if (nr_of_bytes_for_tx_endpoint == 0) + { + return; + } + /* make sure to not transmit more than the USB endpoint can handle */ + if (nr_of_bytes_for_tx_endpoint > BULK_DATA_MAX_PACKET_SIZE) + { + nr_of_bytes_for_tx_endpoint = BULK_DATA_MAX_PACKET_SIZE; + } + /* copy the transmit data to the transmit buffer */ + for (byte_counter=0; byte_counter < nr_of_bytes_for_tx_endpoint; byte_counter++) + { + /* obtain data from the fifo */ + result = UsbFifoMgrRead(fifoPipeBulkIN.handle, &byte_value); + ASSERT_RT(result == BLT_TRUE); + /* store it in the endpoint's RAM */ + USB_Tx_Buffer[byte_counter] = byte_value; + } + /* copy data to endpoint's RAM and start the transmission */ + DCD_EP_Tx(&USB_OTG_dev, BULK_IN_EP, &USB_Tx_Buffer[0], nr_of_bytes_for_tx_endpoint); +} /*** end of UsbTransmitPipeBulkIN ***/ + + +/************************************************************************************//** +** \brief Stores data that was received on the Bulk OUT pipe in the fifo. +** \return none. +** +****************************************************************************************/ +void UsbReceivePipeBulkOUT(uint8_t epnum) +{ + uint16_t USB_Rx_Cnt=0; + uint16_t byte_counter; + blt_bool result; + + /* Get the received data buffer and update the counter */ + USB_Rx_Cnt = USB_OTG_dev.dev.out_ep[epnum].xfer_count; + + /* USB data will be immediately processed, this allow next USB traffic being + * NAKed till the end of the USART Xfer + */ + for (byte_counter=0; byte_counterhandle = i; + pbc1->fifoctrlptr = pbc2; + pbc1++; + pbc2++; + } + /* initialize handle for the last one and use null-pointer for the next free fifo */ + pbc1->handle = i; + pbc1->fifoctrlptr = (tFifoCtrl *)0; + fifoCtrlFree = &fifoCtrl[0]; +} /*** end of UsbFifoMgrInit ***/ + + +/************************************************************************************//** +** \brief Places a data storage array under fifo management control. A handle +** for identifying the fifo in subsequent fifo management function +** calls is returned, if successful. +** \param buffer Pointer to the first element in the data storage fifo. +** \param length Maximum number of data elements that can be stored in the fifo. +** \return Fifo handle if successfull, or FIFO_ERR_INVALID_HANDLE. +** +****************************************************************************************/ +static blt_int8u UsbFifoMgrCreate(blt_int8u *buffer, blt_int8u length) +{ + tFifoCtrl *pbc; + + /* first determine if these is still a free fifo control available */ + if (fifoCtrlFree == (tFifoCtrl *)0) + { + return FIFO_ERR_INVALID_HANDLE; + } + /* store pointer to free fifo and update pointer to next free one */ + pbc = fifoCtrlFree; + fifoCtrlFree = pbc->fifoctrlptr; + + /* initialize the buffer control */ + pbc->length = length; + pbc->readptr = buffer; + pbc->writeptr = buffer; + pbc->entries = 0; + pbc->startptr = buffer; + pbc->endptr = (blt_int8u*)(buffer + length - 1); + + /* return the handle to the successfully created fifo control */ + return pbc->handle; +} /*** end of UsbFifoMgrCreate ***/ + + +/************************************************************************************//** +** \brief Stores data in the fifo. +** \param handle Identifies the fifo to write data to. +** \param data Pointer to the data that is to be written to the fifo. +** \return BLT_TRUE if the data was successfully stored in the fifo, BLT_FALSE +** otherwise. +** +****************************************************************************************/ +static blt_bool UsbFifoMgrWrite(blt_int8u handle, blt_int8u data) +{ + /* check the validity of the handle parameter */ + ASSERT_RT(handle < FIFO_MAX_BUFFERS); + /* check if fifo is full */ + if (fifoCtrl[handle].entries == fifoCtrl[handle].length) + { + return BLT_FALSE; + } + /* copy data to fifo */ + *fifoCtrl[handle].writeptr = data; + /* data written so update number of entries */ + fifoCtrl[handle].entries++; + /* update write pointer */ + fifoCtrl[handle].writeptr++; + /* check end of fifo */ + if (fifoCtrl[handle].writeptr > fifoCtrl[handle].endptr) + { + /* set write pointer to start of the cyclic fifo */ + fifoCtrl[handle].writeptr = fifoCtrl[handle].startptr; + } + /* still here so all is okay */ + return BLT_TRUE; +} /*** end of UsbFifoMgrWrite ***/ + + +/************************************************************************************//** +** \brief Retrieves data from the fifo. +** \param handle Identifies the fifo to read data from. +** \param data Pointer to where the read data is to be stored. +** \return BLT_TRUE if the data was successfully read from the fifo, BLT_FALSE +** otherwise. +** +****************************************************************************************/ +static blt_bool UsbFifoMgrRead(blt_int8u handle, blt_int8u *data) +{ + /* check the validity of the handle parameter */ + ASSERT_RT(handle < FIFO_MAX_BUFFERS); + /* check if fifo is empty */ + if (fifoCtrl[handle].entries == 0) + { + return BLT_FALSE; + } + /* read the data */ + *data = *fifoCtrl[handle].readptr; + /* data read so update number of entries */ + fifoCtrl[handle].entries--; + /* update read pointer */ + fifoCtrl[handle].readptr++; + /* check end of fifo */ + if (fifoCtrl[handle].readptr > fifoCtrl[handle].endptr) + { + /* set read pointer to start of the cyclic fifo */ + fifoCtrl[handle].readptr = fifoCtrl[handle].startptr; + } + /* still here so all is good */ + return BLT_TRUE; +} /*** end of UsbFifoMgrRead ***/ + + +/************************************************************************************//** +** \brief Returns the number of data entries currently present in the fifo. +** \param handle Identifies the fifo that is to be scanned. +** \return Number of data entries in the fifo if successful, otherwise 0. +** +****************************************************************************************/ +static blt_int8u UsbFifoMgrScan(blt_int8u handle) +{ + /* check the validity of the handle parameter */ + ASSERT_RT(handle < FIFO_MAX_BUFFERS); + /* read and return the number of data entries */ + return fifoCtrl[handle].entries; +} /*** end of UsbFifoMgrScan ***/ +#endif /* BOOT_COM_USB_ENABLE > 0 */ + + +/*********************************** end of usb.c **************************************/ diff --git a/Target/Source/ARMCM4_STM32/usb.h b/Target/Source/ARMCM4_STM32/usb.h new file mode 100644 index 00000000..fa0e2137 --- /dev/null +++ b/Target/Source/ARMCM4_STM32/usb.h @@ -0,0 +1,57 @@ +/************************************************************************************//** +* \file Source\ARMCM3_STM32\usb.h +* \brief Bootloader USB communication interface header file. +* \ingroup Target_ARMCM3_STM32 +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2011 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 USB_H +#define USB_H + +#if (BOOT_COM_USB_ENABLE > 0) +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +void UsbInit(void); +void UsbFree(void); +void UsbTransmitPacket(blt_int8u *data, blt_int8u len); +blt_bool UsbReceivePacket(blt_int8u *data); + +/**************************************************************************************** +* Hook functions +****************************************************************************************/ +extern void UsbEnterLowPowerModeHook(void); +extern void UsbLeaveLowPowerModeHook(void); +extern void UsbConnectHook(blt_bool connect); + + +#endif /* BOOT_COM_USB_ENABLE > 0 */ + + +#endif /* USB_H */ +/*********************************** end of usb.h **************************************/