From db9cf3a96c1652773452e8ae79121f5cdac49c63 Mon Sep 17 00:00:00 2001 From: Frank Voorburg Date: Thu, 27 Nov 2014 14:26:13 +0000 Subject: [PATCH] - Added USB support to the STM32CM4 target and the Olimex STM32-E407 demos. git-svn-id: https://svn.code.sf.net/p/openblt/code/trunk@112 5dc33758-31d5-4daf-9ae8-b24bf3d40d73 --- .../Boot/bin/openbtl_olimex_stm32e407.elf | Bin 326598 -> 461801 bytes .../Boot/bin/openbtl_olimex_stm32e407.map | 3557 +++++++----- .../Boot/bin/openbtl_olimex_stm32e407.srec | 5160 +++++++++-------- .../Boot/blt_conf.h | 16 +- .../Boot/hooks.c | 48 +- .../Boot/ide/stm32f407_crossworks.hzp | 31 +- .../Boot/ide/stm32f407_crossworks.hzs | 11 +- .../lib/usbdevicelib/Core/inc/usbd_core.h | 120 + .../Boot/lib/usbdevicelib/Core/inc/usbd_def.h | 156 + .../lib/usbdevicelib/Core/inc/usbd_ioreq.h | 121 + .../Boot/lib/usbdevicelib/Core/inc/usbd_req.h | 108 + .../Boot/lib/usbdevicelib/Core/inc/usbd_usr.h | 141 + .../lib/usbdevicelib/Core/src/usbd_core.c | 506 ++ .../lib/usbdevicelib/Core/src/usbd_ioreq.c | 244 + .../Boot/lib/usbdevicelib/Core/src/usbd_req.c | 868 +++ .../Boot/lib/usbdevicelib/Release_Notes.html | 950 +++ .../Boot/lib/usbotgdriver/Release_Notes.html | 950 +++ .../Boot/lib/usbotgdriver/inc/usb_bsp.h | 103 + .../Boot/lib/usbotgdriver/inc/usb_core.h | 417 ++ .../Boot/lib/usbotgdriver/inc/usb_dcd.h | 164 + .../Boot/lib/usbotgdriver/inc/usb_dcd_int.h | 127 + .../Boot/lib/usbotgdriver/inc/usb_defines.h | 249 + .../Boot/lib/usbotgdriver/inc/usb_regs.h | 1188 ++++ .../Boot/lib/usbotgdriver/src/usb_core.c | 2162 +++++++ .../Boot/lib/usbotgdriver/src/usb_dcd.c | 478 ++ .../Boot/lib/usbotgdriver/src/usb_dcd_int.c | 869 +++ .../Boot/main.c | 19 +- .../Boot/usb_bsp.c | 194 + .../Boot/usb_conf.h | 289 + .../Boot/usbd_bulk.c | 361 ++ .../Boot/usbd_bulk.h | 102 + .../Boot/usbd_conf.h | 91 + .../Boot/usbd_desc.c | 271 + .../Boot/usbd_desc.h | 120 + .../Boot/usbd_usr.c | 206 + .../Boot/bin/openbtl_olimex_stm32e407.elf | Bin 283943 -> 420757 bytes .../Boot/bin/openbtl_olimex_stm32e407.map | 753 ++- .../Boot/bin/openbtl_olimex_stm32e407.srec | 4610 ++++++++------- .../Boot/blt_conf.h | 16 +- .../Boot/hooks.c | 48 +- .../Boot/ide/DemoBoot.project | 41 + .../lib/usbdevicelib/Core/inc/usbd_core.h | 120 + .../Boot/lib/usbdevicelib/Core/inc/usbd_def.h | 156 + .../lib/usbdevicelib/Core/inc/usbd_ioreq.h | 121 + .../Boot/lib/usbdevicelib/Core/inc/usbd_req.h | 108 + .../Boot/lib/usbdevicelib/Core/inc/usbd_usr.h | 141 + .../lib/usbdevicelib/Core/src/usbd_core.c | 506 ++ .../lib/usbdevicelib/Core/src/usbd_ioreq.c | 244 + .../Boot/lib/usbdevicelib/Core/src/usbd_req.c | 868 +++ .../Boot/lib/usbdevicelib/Release_Notes.html | 950 +++ .../Boot/lib/usbotgdriver/Release_Notes.html | 950 +++ .../Boot/lib/usbotgdriver/inc/usb_bsp.h | 103 + .../Boot/lib/usbotgdriver/inc/usb_core.h | 417 ++ .../Boot/lib/usbotgdriver/inc/usb_dcd.h | 164 + .../Boot/lib/usbotgdriver/inc/usb_dcd_int.h | 127 + .../Boot/lib/usbotgdriver/inc/usb_defines.h | 249 + .../Boot/lib/usbotgdriver/inc/usb_regs.h | 1188 ++++ .../Boot/lib/usbotgdriver/src/usb_core.c | 2162 +++++++ .../Boot/lib/usbotgdriver/src/usb_dcd.c | 478 ++ .../Boot/lib/usbotgdriver/src/usb_dcd_int.c | 869 +++ .../Boot/main.c | 19 +- .../Boot/makefile | 29 +- .../Boot/usb_bsp.c | 194 + .../Boot/usb_conf.h | 289 + .../Boot/usbd_bulk.c | 361 ++ .../Boot/usbd_bulk.h | 102 + .../Boot/usbd_conf.h | 91 + .../Boot/usbd_desc.c | 271 + .../Boot/usbd_desc.h | 120 + .../Boot/usbd_usr.c | 206 + .../Boot/bin/openbtl_olimex_stm32e407.out | Bin 575720 -> 846876 bytes .../Boot/bin/openbtl_olimex_stm32e407.srec | 3131 ++++++---- .../Boot/blt_conf.h | 16 +- .../Boot/hooks.c | 48 +- .../Boot/ide/settings/stm32f407.dbgdt | 10 +- .../Boot/ide/settings/stm32f407.dni | 2 +- .../Boot/ide/settings/stm32f407.wsdt | 14 +- .../Boot/ide/stm32f407.dep | 3017 +++++----- .../Boot/ide/stm32f407.ewp | 89 + .../lib/usbdevicelib/Core/inc/usbd_core.h | 120 + .../Boot/lib/usbdevicelib/Core/inc/usbd_def.h | 156 + .../lib/usbdevicelib/Core/inc/usbd_ioreq.h | 121 + .../Boot/lib/usbdevicelib/Core/inc/usbd_req.h | 108 + .../Boot/lib/usbdevicelib/Core/inc/usbd_usr.h | 141 + .../lib/usbdevicelib/Core/src/usbd_core.c | 506 ++ .../lib/usbdevicelib/Core/src/usbd_ioreq.c | 244 + .../Boot/lib/usbdevicelib/Core/src/usbd_req.c | 868 +++ .../Boot/lib/usbdevicelib/Release_Notes.html | 950 +++ .../Boot/lib/usbotgdriver/Release_Notes.html | 950 +++ .../Boot/lib/usbotgdriver/inc/usb_bsp.h | 103 + .../Boot/lib/usbotgdriver/inc/usb_core.h | 417 ++ .../Boot/lib/usbotgdriver/inc/usb_dcd.h | 164 + .../Boot/lib/usbotgdriver/inc/usb_dcd_int.h | 127 + .../Boot/lib/usbotgdriver/inc/usb_defines.h | 249 + .../Boot/lib/usbotgdriver/inc/usb_regs.h | 1188 ++++ .../Boot/lib/usbotgdriver/src/usb_core.c | 2162 +++++++ .../Boot/lib/usbotgdriver/src/usb_dcd.c | 478 ++ .../Boot/lib/usbotgdriver/src/usb_dcd_int.c | 869 +++ .../Boot/main.c | 18 +- .../Boot/usb_bsp.c | 194 + .../Boot/usb_conf.h | 289 + .../Boot/usbd_bulk.c | 361 ++ .../Boot/usbd_bulk.h | 102 + .../Boot/usbd_conf.h | 91 + .../Boot/usbd_desc.c | 271 + .../Boot/usbd_desc.h | 120 + .../Boot/usbd_usr.c | 206 + Target/Source/ARMCM4_STM32/usb.c | 488 ++ Target/Source/ARMCM4_STM32/usb.h | 57 + 109 files changed, 46952 insertions(+), 8961 deletions(-) create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_core.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_def.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_ioreq.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_req.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/inc/usbd_usr.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/src/usbd_core.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/src/usbd_ioreq.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Core/src/usbd_req.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbdevicelib/Release_Notes.html create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/Release_Notes.html create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_bsp.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_core.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_dcd.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_dcd_int.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_defines.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/inc/usb_regs.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/src/usb_core.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/src/usb_dcd.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/lib/usbotgdriver/src/usb_dcd_int.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usb_bsp.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usb_conf.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_bulk.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_bulk.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_conf.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_desc.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_desc.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_Crossworks/Boot/usbd_usr.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_core.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_def.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_ioreq.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_req.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/inc/usbd_usr.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/src/usbd_core.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/src/usbd_ioreq.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Core/src/usbd_req.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbdevicelib/Release_Notes.html create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/Release_Notes.html create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_bsp.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_core.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_dcd.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_dcd_int.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_defines.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/inc/usb_regs.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/src/usb_core.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/src/usb_dcd.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/lib/usbotgdriver/src/usb_dcd_int.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usb_bsp.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usb_conf.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_bulk.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_bulk.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_conf.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_desc.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_desc.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_GCC/Boot/usbd_usr.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_core.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_def.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_ioreq.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_req.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/inc/usbd_usr.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/src/usbd_core.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/src/usbd_ioreq.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Core/src/usbd_req.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbdevicelib/Release_Notes.html create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/Release_Notes.html create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_bsp.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_core.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_dcd.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_dcd_int.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_defines.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/inc/usb_regs.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/src/usb_core.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/src/usb_dcd.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/lib/usbotgdriver/src/usb_dcd_int.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usb_bsp.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usb_conf.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_bulk.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_bulk.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_conf.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_desc.c create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_desc.h create mode 100644 Target/Demo/ARMCM4_STM32_Olimex_STM32E407_IAR/Boot/usbd_usr.c create mode 100644 Target/Source/ARMCM4_STM32/usb.c create mode 100644 Target/Source/ARMCM4_STM32/usb.h 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 acc77b89dbc3ae9331f3bb3f8fd507b53dbdb01c..d35ab603cb6fcb22e7f0e34d33ee3d36747673ce 100644 GIT binary patch literal 461801 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�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±zlx6VN9W{~f+(OASJLH$Fw=H>R_ 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%0Al3)X2U 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 literal 326598 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 __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 2eaffa06962deb98461884141328e6a68d68cba3..ac079859c1f707f0f84c3460eaf8d24a2f5556cb 100644 GIT binary patch literal 420757 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 literal 283943 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 z
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 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 6fa1441ec95e56d6934ed2bed98603dca7960de9..27c88696b98c8f27863b1780eb1965af2e5d3607 100644 GIT binary patch literal 846876 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 oeX84~L)$&6hs$%^&k1UykP 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

J|HQfQA#rj1owSEac(=ss-~%rP``-rV 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

d-e~wAY%uD4r81b{KTAL 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 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 **************************************/

Y7KC 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