From dac4af8d252809b83f01be48247f2bd90db60757 Mon Sep 17 00:00:00 2001 From: Joe Kearney Date: Sat, 1 Feb 2025 19:22:12 -0600 Subject: [PATCH] Initial public release. --- .gitignore | 31 + .gitmodules | 6 + 2020TPC Nonvolatile Memory.xlsx | Bin 0 -> 7818 bytes 2020TPC.cywrk | 24 + 2020TPCApp0.cydsn/2020TPCApp0.cydwr | 711 ++ 2020TPCApp0.cydsn/2020TPCApp0.cyprj | 3572 +++++++++ 2020TPCApp0.cydsn/TopDesign/TopDesign.cysch | Bin 0 -> 132677 bytes 2020TPCApp0.cydsn/cy8c6xx7_cm0plus.icf | 218 + 2020TPCApp0.cydsn/cy8c6xx7_cm0plus.ld | 402 + 2020TPCApp0.cydsn/cy8c6xx7_cm0plus.scat | 207 + 2020TPCApp0.cydsn/cy8c6xx7_cm4_dual.icf | 219 + 2020TPCApp0.cydsn/cy8c6xx7_cm4_dual.ld | 408 ++ 2020TPCApp0.cydsn/cy8c6xx7_cm4_dual.scat | 213 + 2020TPCApp0.cydsn/cy_ble_config.h | 66 + 2020TPCApp0.cydsn/cy_si_config.h | 131 + 2020TPCApp0.cydsn/cy_si_keystorage.c | 198 + 2020TPCApp0.cydsn/cy_si_keystorage.h | 110 + 2020TPCApp0.cydsn/debug.c | 162 + 2020TPCApp0.cydsn/debug.h | 82 + 2020TPCApp0.cydsn/dfu_cm0p.icf | 251 + 2020TPCApp0.cydsn/dfu_cm0p.ld | 479 ++ 2020TPCApp0.cydsn/dfu_cm0p.scat | 189 + 2020TPCApp0.cydsn/dfu_cm4.icf | 248 + 2020TPCApp0.cydsn/dfu_cm4.ld | 478 ++ 2020TPCApp0.cydsn/dfu_cm4.scat | 206 + 2020TPCApp0.cydsn/dfu_mdk_common.h | 114 + 2020TPCApp0.cydsn/dfu_mdk_symbols.c | 66 + 2020TPCApp0.cydsn/dfu_user.c | 303 + 2020TPCApp0.cydsn/dfu_user.h | 151 + .../gcc/startup_psoc6_01_cm0plus.S | 404 ++ 2020TPCApp0.cydsn/gcc/startup_psoc6_01_cm4.S | 635 ++ .../iar/startup_psoc6_01_cm0plus.s | 423 ++ 2020TPCApp0.cydsn/iar/startup_psoc6_01_cm4.s | 1142 +++ 2020TPCApp0.cydsn/ias.c | 62 + 2020TPCApp0.cydsn/ias.h | 31 + 2020TPCApp0.cydsn/key_copy.bat | 78 + 2020TPCApp0.cydsn/keygen.bat | 143 + 2020TPCApp0.cydsn/main_cm0p.c | 237 + 2020TPCApp0.cydsn/main_cm4.c | 812 +++ .../mdk/startup_psoc6_01_cm0plus.s | 321 + 2020TPCApp0.cydsn/mdk/startup_psoc6_01_cm4.s | 696 ++ 2020TPCApp0.cydsn/post_build_core1.bat | 42 + 2020TPCApp0.cydsn/rsa_to_c.py | 254 + 2020TPCApp0.cydsn/system_psoc6.h | 648 ++ 2020TPCApp0.cydsn/system_psoc6_cm0plus.c | 699 ++ 2020TPCApp0.cydsn/system_psoc6_cm4.c | 542 ++ 2020TPCApp0.cydsn/transport_ble.c | 328 + 2020TPCApp0.cydsn/transport_ble.h | 55 + 2020TPCApp1.cydsn/2020TPCApp1.cydwr | 1242 ++++ 2020TPCApp1.cydsn/2020TPCApp1.cyprj | 6435 +++++++++++++++++ 2020TPCApp1.cydsn/2020TPCApp1_datasheet.pdf | Bin 0 -> 1481175 bytes 2020TPCApp1.cydsn/Audio.c | 288 + 2020TPCApp1.cydsn/Audio.h | 7 + 2020TPCApp1.cydsn/COMM/BLE/COMM_BLE.c | 1013 +++ 2020TPCApp1.cydsn/COMM/BLE/COMM_BLE.h | 79 + 2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_Bond.c | 252 + 2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_Bond.h | 32 + 2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_UART.c | 177 + 2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_UART.h | 30 + 2020TPCApp1.cydsn/COMM/COMM.h | 50 + 2020TPCApp1.cydsn/COMM/COMM_Console.c | 639 ++ 2020TPCApp1.cydsn/COMM/COMM_Console.h | 144 + 2020TPCApp1.cydsn/COMM/COMM_Console_Util.c | 254 + 2020TPCApp1.cydsn/COMM/COMM_Console_Util.h | 50 + 2020TPCApp1.cydsn/COMM/COMM_I2C_Bus.c | 33 + 2020TPCApp1.cydsn/COMM/COMM_I2C_Bus.h | 29 + 2020TPCApp1.cydsn/COMM/COMM_IPC_Messages.c | 285 + 2020TPCApp1.cydsn/COMM/COMM_IPC_Messages.h | 49 + 2020TPCApp1.cydsn/COMM/COMM_Util.c | 48 + 2020TPCApp1.cydsn/COMM/COMM_Util.h | 27 + .../COMM_BLE_ConsoleCommands.c | 78 + .../COMM_BLE_ConsoleCommands.h | 29 + .../ConsoleCommands/COMM_ConsoleCommands.c | 73 + .../ConsoleCommands/COMM_ConsoleCommands.h | 30 + .../COMM_NVM_ConsoleCommands.c | 207 + .../COMM_NVM_ConsoleCommands.h | 29 + .../COMM_RTOS_ConsoleCommands.c | 120 + .../COMM_RTOS_ConsoleCommands.h | 33 + .../COMM_STATE_ConsoleCommands.c | 189 + .../COMM_STATE_ConsoleCommands.h | 29 + 2020TPCApp1.cydsn/CONFIG/CONFIG.h | 83 + 2020TPCApp1.cydsn/CONFIG/CONFIG_RTOS.c | 113 + 2020TPCApp1.cydsn/CONFIG/CONFIG_RTOS.h | 29 + 2020TPCApp1.cydsn/Fire_Control.c | 223 + 2020TPCApp1.cydsn/Fire_Control.h | 13 + 2020TPCApp1.cydsn/FreeRTOSConfig.h | 228 + 2020TPCApp1.cydsn/HW/HW.h | 50 + 2020TPCApp1.cydsn/HW/HW_CapSense.c | 125 + 2020TPCApp1.cydsn/HW/HW_CapSense.h | 40 + 2020TPCApp1.cydsn/HW/HW_NeoPixels.c | 392 + 2020TPCApp1.cydsn/KTag.h | 81 + .../Menu/GameSettings/GameMenuItem.c | 79 + .../Menu/GameSettings/GameMenuItem.h | 6 + .../Menu/GameSettings/PlayerIDMenuItem.c | 66 + .../Menu/GameSettings/PlayerIDMenuItem.h | 6 + .../Menu/GameSettings/TeamIDMenuItem.c | 66 + .../Menu/GameSettings/TeamIDMenuItem.h | 6 + .../Menu/HardwareSettings/HandedMenuItem.c | 64 + .../Menu/HardwareSettings/HandedMenuItem.h | 6 + .../Menu/HardwareSettings/HardwareMenuItem.c | 79 + .../Menu/HardwareSettings/HardwareMenuItem.h | 6 + .../Menu/HardwareSettings/VolumeMenuItem.c | 72 + .../Menu/HardwareSettings/VolumeMenuItem.h | 6 + 2020TPCApp1.cydsn/Menu/Menu.c | 86 + 2020TPCApp1.cydsn/Menu/Menu.h | 28 + 2020TPCApp1.cydsn/NVM/NVM.h | 105 + 2020TPCApp1.cydsn/NVM/NVM_CRC.c | 72 + 2020TPCApp1.cydsn/NVM/NVM_CRC.h | 115 + 2020TPCApp1.cydsn/NVM/NVM_ExternalEEPROM.c | 302 + 2020TPCApp1.cydsn/NVM/NVM_ExternalEEPROM.h | 44 + .../NVM/NVM_ExternalEEPROMEntries.c | 153 + .../NVM/NVM_ExternalEEPROMEntries.h | 135 + 2020TPCApp1.cydsn/NVM/NVM_OnChipEEPROM.c | 260 + 2020TPCApp1.cydsn/NVM/NVM_OnChipEEPROM.h | 42 + .../NVM/NVM_OnChipEEPROMEntries.c | 63 + .../NVM/NVM_OnChipEEPROMEntries.h | 60 + 2020TPCApp1.cydsn/NVM/NVM_Settings.c | 125 + 2020TPCApp1.cydsn/Sample_Tasks.c | 93 + 2020TPCApp1.cydsn/Sample_Tasks.h | 9 + 2020TPCApp1.cydsn/Switches.c | 196 + 2020TPCApp1.cydsn/Switches.h | 9 + 2020TPCApp1.cydsn/SystemK | 1 + 2020TPCApp1.cydsn/Tag_Sensors.c | 582 ++ 2020TPCApp1.cydsn/Tag_Sensors.h | 16 + 2020TPCApp1.cydsn/TopDesign/TopDesign.cysch | Bin 0 -> 648476 bytes 2020TPCApp1.cydsn/UTIL/UTIL.h | 41 + 2020TPCApp1.cydsn/UTIL/UTIL_CircularBuffer.c | 160 + 2020TPCApp1.cydsn/UTIL/UTIL_CircularBuffer.h | 41 + 2020TPCApp1.cydsn/common.h | 94 + 2020TPCApp1.cydsn/cy8c6xx7_cm0plus.icf | 218 + 2020TPCApp1.cydsn/cy8c6xx7_cm0plus.ld | 402 + 2020TPCApp1.cydsn/cy8c6xx7_cm0plus.scat | 207 + 2020TPCApp1.cydsn/cy8c6xx7_cm4_dual.icf | 219 + 2020TPCApp1.cydsn/cy8c6xx7_cm4_dual.ld | 408 ++ 2020TPCApp1.cydsn/cy8c6xx7_cm4_dual.scat | 213 + 2020TPCApp1.cydsn/cy_ble_config.h | 66 + 2020TPCApp1.cydsn/cy_si_config.h | 129 + 2020TPCApp1.cydsn/debug.c | 297 + 2020TPCApp1.cydsn/dfu_cm0p.icf | 251 + 2020TPCApp1.cydsn/dfu_cm0p.ld | 485 ++ 2020TPCApp1.cydsn/dfu_cm0p.scat | 189 + 2020TPCApp1.cydsn/dfu_cm4.icf | 248 + 2020TPCApp1.cydsn/dfu_cm4.ld | 484 ++ 2020TPCApp1.cydsn/dfu_cm4.scat | 206 + 2020TPCApp1.cydsn/dfu_mdk_common.h | 114 + 2020TPCApp1.cydsn/dfu_mdk_symbols.c | 66 + 2020TPCApp1.cydsn/dfu_user.h | 151 + .../gcc/startup_psoc6_01_cm0plus.S | 404 ++ 2020TPCApp1.cydsn/gcc/startup_psoc6_01_cm4.S | 635 ++ 2020TPCApp1.cydsn/host_main.c | 505 ++ .../iar/startup_psoc6_01_cm0plus.s | 423 ++ 2020TPCApp1.cydsn/iar/startup_psoc6_01_cm4.s | 1142 +++ 2020TPCApp1.cydsn/ias.c | 62 + 2020TPCApp1.cydsn/ias.h | 41 + 2020TPCApp1.cydsn/main_cm0p.c | 81 + 2020TPCApp1.cydsn/main_cm4.c | 114 + .../mdk/startup_psoc6_01_cm0plus.s | 321 + 2020TPCApp1.cydsn/mdk/startup_psoc6_01_cm4.s | 696 ++ 2020TPCApp1.cydsn/post_build_core1.bat | 44 + 2020TPCApp1.cydsn/scps.c | 141 + 2020TPCApp1.cydsn/scps.h | 26 + 2020TPCApp1.cydsn/stdio_user.c | 65 + 2020TPCApp1.cydsn/stdio_user.h | 200 + 2020TPCApp1.cydsn/system_psoc6.h | 648 ++ 2020TPCApp1.cydsn/system_psoc6_cm0plus.c | 699 ++ 2020TPCApp1.cydsn/system_psoc6_cm4.c | 542 ++ 2020TPCAppNoDFU.cydsn/2020TPCAppNoDFU.cydwr | 1295 ++++ 2020TPCAppNoDFU.cydsn/2020TPCAppNoDFU.cyprj | 6297 ++++++++++++++++ 2020TPCAppNoDFU.cydsn/Audio.c | 288 + 2020TPCAppNoDFU.cydsn/Audio.h | 7 + 2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE.c | 1013 +++ 2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE.h | 79 + .../COMM/BLE/COMM_BLE_Bond.c | 252 + .../COMM/BLE/COMM_BLE_Bond.h | 32 + .../COMM/BLE/COMM_BLE_UART.c | 177 + .../COMM/BLE/COMM_BLE_UART.h | 30 + 2020TPCAppNoDFU.cydsn/COMM/COMM.h | 50 + 2020TPCAppNoDFU.cydsn/COMM/COMM_Console.c | 639 ++ 2020TPCAppNoDFU.cydsn/COMM/COMM_Console.h | 144 + .../COMM/COMM_Console_Util.c | 254 + .../COMM/COMM_Console_Util.h | 50 + 2020TPCAppNoDFU.cydsn/COMM/COMM_I2C_Bus.c | 33 + 2020TPCAppNoDFU.cydsn/COMM/COMM_I2C_Bus.h | 29 + .../COMM/COMM_IPC_Messages.c | 285 + .../COMM/COMM_IPC_Messages.h | 49 + 2020TPCAppNoDFU.cydsn/COMM/COMM_Util.c | 48 + 2020TPCAppNoDFU.cydsn/COMM/COMM_Util.h | 27 + .../COMM_BLE_ConsoleCommands.c | 78 + .../COMM_BLE_ConsoleCommands.h | 29 + .../ConsoleCommands/COMM_ConsoleCommands.c | 72 + .../ConsoleCommands/COMM_ConsoleCommands.h | 30 + .../COMM_NVM_ConsoleCommands.c | 207 + .../COMM_NVM_ConsoleCommands.h | 29 + .../COMM_RTOS_ConsoleCommands.c | 109 + .../COMM_RTOS_ConsoleCommands.h | 32 + .../COMM_STATE_ConsoleCommands.c | 189 + .../COMM_STATE_ConsoleCommands.h | 29 + 2020TPCAppNoDFU.cydsn/CONFIG/CONFIG.h | 84 + 2020TPCAppNoDFU.cydsn/CONFIG/CONFIG_RTOS.c | 113 + 2020TPCAppNoDFU.cydsn/CONFIG/CONFIG_RTOS.h | 29 + 2020TPCAppNoDFU.cydsn/Fire_Control.c | 223 + 2020TPCAppNoDFU.cydsn/Fire_Control.h | 13 + 2020TPCAppNoDFU.cydsn/FreeRTOSConfig.h | 228 + 2020TPCAppNoDFU.cydsn/HW/HW.h | 50 + 2020TPCAppNoDFU.cydsn/HW/HW_CapSense.c | 125 + 2020TPCAppNoDFU.cydsn/HW/HW_CapSense.h | 40 + 2020TPCAppNoDFU.cydsn/HW/HW_NeoPixels.c | 392 + 2020TPCAppNoDFU.cydsn/KTag.h | 81 + 2020TPCAppNoDFU.cydsn/NVM/NVM.h | 105 + 2020TPCAppNoDFU.cydsn/NVM/NVM_CRC.c | 72 + 2020TPCAppNoDFU.cydsn/NVM/NVM_CRC.h | 115 + .../NVM/NVM_ExternalEEPROM.c | 302 + .../NVM/NVM_ExternalEEPROM.h | 44 + .../NVM/NVM_ExternalEEPROMEntries.c | 153 + .../NVM/NVM_ExternalEEPROMEntries.h | 135 + 2020TPCAppNoDFU.cydsn/NVM/NVM_OnChipEEPROM.c | 260 + 2020TPCAppNoDFU.cydsn/NVM/NVM_OnChipEEPROM.h | 42 + .../NVM/NVM_OnChipEEPROMEntries.c | 63 + .../NVM/NVM_OnChipEEPROMEntries.h | 60 + 2020TPCAppNoDFU.cydsn/NVM/NVM_Settings.c | 125 + 2020TPCAppNoDFU.cydsn/Sample_Tasks.c | 93 + 2020TPCAppNoDFU.cydsn/Sample_Tasks.h | 9 + 2020TPCAppNoDFU.cydsn/Switches.c | 196 + 2020TPCAppNoDFU.cydsn/Switches.h | 9 + 2020TPCAppNoDFU.cydsn/SystemK | 1 + 2020TPCAppNoDFU.cydsn/Tag_Sensors.c | 582 ++ 2020TPCAppNoDFU.cydsn/Tag_Sensors.h | 16 + .../TopDesign/TopDesign.cysch | Bin 0 -> 653620 bytes 2020TPCAppNoDFU.cydsn/UTIL/UTIL.h | 41 + .../UTIL/UTIL_CircularBuffer.c | 160 + .../UTIL/UTIL_CircularBuffer.h | 41 + 2020TPCAppNoDFU.cydsn/cy8c6xx7_cm0plus.icf | 218 + 2020TPCAppNoDFU.cydsn/cy8c6xx7_cm0plus.ld | 402 + 2020TPCAppNoDFU.cydsn/cy8c6xx7_cm0plus.scat | 207 + 2020TPCAppNoDFU.cydsn/cy8c6xx7_cm4_dual.icf | 219 + 2020TPCAppNoDFU.cydsn/cy8c6xx7_cm4_dual.ld | 408 ++ 2020TPCAppNoDFU.cydsn/cy8c6xx7_cm4_dual.scat | 213 + 2020TPCAppNoDFU.cydsn/cy_ble_config.h | 66 + 2020TPCAppNoDFU.cydsn/cyapicallbacks.h | 28 + .../gcc/startup_psoc6_01_cm0plus.S | 404 ++ .../gcc/startup_psoc6_01_cm4.S | 635 ++ .../iar/startup_psoc6_01_cm0plus.s | 423 ++ .../iar/startup_psoc6_01_cm4.s | 1142 +++ 2020TPCAppNoDFU.cydsn/main_cm0p.c | 30 + 2020TPCAppNoDFU.cydsn/main_cm4.c | 107 + .../mdk/startup_psoc6_01_cm0plus.s | 321 + .../mdk/startup_psoc6_01_cm4.s | 696 ++ 2020TPCAppNoDFU.cydsn/stdio_user.c | 65 + 2020TPCAppNoDFU.cydsn/stdio_user.h | 200 + 2020TPCAppNoDFU.cydsn/system_psoc6.h | 648 ++ 2020TPCAppNoDFU.cydsn/system_psoc6_cm0plus.c | 699 ++ 2020TPCAppNoDFU.cydsn/system_psoc6_cm4.c | 542 ++ Keys/Keys_README.md | 4 + README.md | 54 +- autocode.py | 392 + 255 files changed, 68595 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 2020TPC Nonvolatile Memory.xlsx create mode 100644 2020TPC.cywrk create mode 100644 2020TPCApp0.cydsn/2020TPCApp0.cydwr create mode 100644 2020TPCApp0.cydsn/2020TPCApp0.cyprj create mode 100644 2020TPCApp0.cydsn/TopDesign/TopDesign.cysch create mode 100644 2020TPCApp0.cydsn/cy8c6xx7_cm0plus.icf create mode 100644 2020TPCApp0.cydsn/cy8c6xx7_cm0plus.ld create mode 100644 2020TPCApp0.cydsn/cy8c6xx7_cm0plus.scat create mode 100644 2020TPCApp0.cydsn/cy8c6xx7_cm4_dual.icf create mode 100644 2020TPCApp0.cydsn/cy8c6xx7_cm4_dual.ld create mode 100644 2020TPCApp0.cydsn/cy8c6xx7_cm4_dual.scat create mode 100644 2020TPCApp0.cydsn/cy_ble_config.h create mode 100644 2020TPCApp0.cydsn/cy_si_config.h create mode 100644 2020TPCApp0.cydsn/cy_si_keystorage.c create mode 100644 2020TPCApp0.cydsn/cy_si_keystorage.h create mode 100644 2020TPCApp0.cydsn/debug.c create mode 100644 2020TPCApp0.cydsn/debug.h create mode 100644 2020TPCApp0.cydsn/dfu_cm0p.icf create mode 100644 2020TPCApp0.cydsn/dfu_cm0p.ld create mode 100644 2020TPCApp0.cydsn/dfu_cm0p.scat create mode 100644 2020TPCApp0.cydsn/dfu_cm4.icf create mode 100644 2020TPCApp0.cydsn/dfu_cm4.ld create mode 100644 2020TPCApp0.cydsn/dfu_cm4.scat create mode 100644 2020TPCApp0.cydsn/dfu_mdk_common.h create mode 100644 2020TPCApp0.cydsn/dfu_mdk_symbols.c create mode 100644 2020TPCApp0.cydsn/dfu_user.c create mode 100644 2020TPCApp0.cydsn/dfu_user.h create mode 100644 2020TPCApp0.cydsn/gcc/startup_psoc6_01_cm0plus.S create mode 100644 2020TPCApp0.cydsn/gcc/startup_psoc6_01_cm4.S create mode 100644 2020TPCApp0.cydsn/iar/startup_psoc6_01_cm0plus.s create mode 100644 2020TPCApp0.cydsn/iar/startup_psoc6_01_cm4.s create mode 100644 2020TPCApp0.cydsn/ias.c create mode 100644 2020TPCApp0.cydsn/ias.h create mode 100644 2020TPCApp0.cydsn/key_copy.bat create mode 100644 2020TPCApp0.cydsn/keygen.bat create mode 100644 2020TPCApp0.cydsn/main_cm0p.c create mode 100644 2020TPCApp0.cydsn/main_cm4.c create mode 100644 2020TPCApp0.cydsn/mdk/startup_psoc6_01_cm0plus.s create mode 100644 2020TPCApp0.cydsn/mdk/startup_psoc6_01_cm4.s create mode 100644 2020TPCApp0.cydsn/post_build_core1.bat create mode 100644 2020TPCApp0.cydsn/rsa_to_c.py create mode 100644 2020TPCApp0.cydsn/system_psoc6.h create mode 100644 2020TPCApp0.cydsn/system_psoc6_cm0plus.c create mode 100644 2020TPCApp0.cydsn/system_psoc6_cm4.c create mode 100644 2020TPCApp0.cydsn/transport_ble.c create mode 100644 2020TPCApp0.cydsn/transport_ble.h create mode 100644 2020TPCApp1.cydsn/2020TPCApp1.cydwr create mode 100644 2020TPCApp1.cydsn/2020TPCApp1.cyprj create mode 100644 2020TPCApp1.cydsn/2020TPCApp1_datasheet.pdf create mode 100644 2020TPCApp1.cydsn/Audio.c create mode 100644 2020TPCApp1.cydsn/Audio.h create mode 100644 2020TPCApp1.cydsn/COMM/BLE/COMM_BLE.c create mode 100644 2020TPCApp1.cydsn/COMM/BLE/COMM_BLE.h create mode 100644 2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_Bond.c create mode 100644 2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_Bond.h create mode 100644 2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_UART.c create mode 100644 2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_UART.h create mode 100644 2020TPCApp1.cydsn/COMM/COMM.h create mode 100644 2020TPCApp1.cydsn/COMM/COMM_Console.c create mode 100644 2020TPCApp1.cydsn/COMM/COMM_Console.h create mode 100644 2020TPCApp1.cydsn/COMM/COMM_Console_Util.c create mode 100644 2020TPCApp1.cydsn/COMM/COMM_Console_Util.h create mode 100644 2020TPCApp1.cydsn/COMM/COMM_I2C_Bus.c create mode 100644 2020TPCApp1.cydsn/COMM/COMM_I2C_Bus.h create mode 100644 2020TPCApp1.cydsn/COMM/COMM_IPC_Messages.c create mode 100644 2020TPCApp1.cydsn/COMM/COMM_IPC_Messages.h create mode 100644 2020TPCApp1.cydsn/COMM/COMM_Util.c create mode 100644 2020TPCApp1.cydsn/COMM/COMM_Util.h create mode 100644 2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_BLE_ConsoleCommands.c create mode 100644 2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_BLE_ConsoleCommands.h create mode 100644 2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_ConsoleCommands.c create mode 100644 2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_ConsoleCommands.h create mode 100644 2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_NVM_ConsoleCommands.c create mode 100644 2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_NVM_ConsoleCommands.h create mode 100644 2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_RTOS_ConsoleCommands.c create mode 100644 2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_RTOS_ConsoleCommands.h create mode 100644 2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_STATE_ConsoleCommands.c create mode 100644 2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_STATE_ConsoleCommands.h create mode 100644 2020TPCApp1.cydsn/CONFIG/CONFIG.h create mode 100644 2020TPCApp1.cydsn/CONFIG/CONFIG_RTOS.c create mode 100644 2020TPCApp1.cydsn/CONFIG/CONFIG_RTOS.h create mode 100644 2020TPCApp1.cydsn/Fire_Control.c create mode 100644 2020TPCApp1.cydsn/Fire_Control.h create mode 100644 2020TPCApp1.cydsn/FreeRTOSConfig.h create mode 100644 2020TPCApp1.cydsn/HW/HW.h create mode 100644 2020TPCApp1.cydsn/HW/HW_CapSense.c create mode 100644 2020TPCApp1.cydsn/HW/HW_CapSense.h create mode 100644 2020TPCApp1.cydsn/HW/HW_NeoPixels.c create mode 100644 2020TPCApp1.cydsn/KTag.h create mode 100644 2020TPCApp1.cydsn/Menu/GameSettings/GameMenuItem.c create mode 100644 2020TPCApp1.cydsn/Menu/GameSettings/GameMenuItem.h create mode 100644 2020TPCApp1.cydsn/Menu/GameSettings/PlayerIDMenuItem.c create mode 100644 2020TPCApp1.cydsn/Menu/GameSettings/PlayerIDMenuItem.h create mode 100644 2020TPCApp1.cydsn/Menu/GameSettings/TeamIDMenuItem.c create mode 100644 2020TPCApp1.cydsn/Menu/GameSettings/TeamIDMenuItem.h create mode 100644 2020TPCApp1.cydsn/Menu/HardwareSettings/HandedMenuItem.c create mode 100644 2020TPCApp1.cydsn/Menu/HardwareSettings/HandedMenuItem.h create mode 100644 2020TPCApp1.cydsn/Menu/HardwareSettings/HardwareMenuItem.c create mode 100644 2020TPCApp1.cydsn/Menu/HardwareSettings/HardwareMenuItem.h create mode 100644 2020TPCApp1.cydsn/Menu/HardwareSettings/VolumeMenuItem.c create mode 100644 2020TPCApp1.cydsn/Menu/HardwareSettings/VolumeMenuItem.h create mode 100644 2020TPCApp1.cydsn/Menu/Menu.c create mode 100644 2020TPCApp1.cydsn/Menu/Menu.h create mode 100644 2020TPCApp1.cydsn/NVM/NVM.h create mode 100644 2020TPCApp1.cydsn/NVM/NVM_CRC.c create mode 100644 2020TPCApp1.cydsn/NVM/NVM_CRC.h create mode 100644 2020TPCApp1.cydsn/NVM/NVM_ExternalEEPROM.c create mode 100644 2020TPCApp1.cydsn/NVM/NVM_ExternalEEPROM.h create mode 100644 2020TPCApp1.cydsn/NVM/NVM_ExternalEEPROMEntries.c create mode 100644 2020TPCApp1.cydsn/NVM/NVM_ExternalEEPROMEntries.h create mode 100644 2020TPCApp1.cydsn/NVM/NVM_OnChipEEPROM.c create mode 100644 2020TPCApp1.cydsn/NVM/NVM_OnChipEEPROM.h create mode 100644 2020TPCApp1.cydsn/NVM/NVM_OnChipEEPROMEntries.c create mode 100644 2020TPCApp1.cydsn/NVM/NVM_OnChipEEPROMEntries.h create mode 100644 2020TPCApp1.cydsn/NVM/NVM_Settings.c create mode 100644 2020TPCApp1.cydsn/Sample_Tasks.c create mode 100644 2020TPCApp1.cydsn/Sample_Tasks.h create mode 100644 2020TPCApp1.cydsn/Switches.c create mode 100644 2020TPCApp1.cydsn/Switches.h create mode 160000 2020TPCApp1.cydsn/SystemK create mode 100644 2020TPCApp1.cydsn/Tag_Sensors.c create mode 100644 2020TPCApp1.cydsn/Tag_Sensors.h create mode 100644 2020TPCApp1.cydsn/TopDesign/TopDesign.cysch create mode 100644 2020TPCApp1.cydsn/UTIL/UTIL.h create mode 100644 2020TPCApp1.cydsn/UTIL/UTIL_CircularBuffer.c create mode 100644 2020TPCApp1.cydsn/UTIL/UTIL_CircularBuffer.h create mode 100644 2020TPCApp1.cydsn/common.h create mode 100644 2020TPCApp1.cydsn/cy8c6xx7_cm0plus.icf create mode 100644 2020TPCApp1.cydsn/cy8c6xx7_cm0plus.ld create mode 100644 2020TPCApp1.cydsn/cy8c6xx7_cm0plus.scat create mode 100644 2020TPCApp1.cydsn/cy8c6xx7_cm4_dual.icf create mode 100644 2020TPCApp1.cydsn/cy8c6xx7_cm4_dual.ld create mode 100644 2020TPCApp1.cydsn/cy8c6xx7_cm4_dual.scat create mode 100644 2020TPCApp1.cydsn/cy_ble_config.h create mode 100644 2020TPCApp1.cydsn/cy_si_config.h create mode 100644 2020TPCApp1.cydsn/debug.c create mode 100644 2020TPCApp1.cydsn/dfu_cm0p.icf create mode 100644 2020TPCApp1.cydsn/dfu_cm0p.ld create mode 100644 2020TPCApp1.cydsn/dfu_cm0p.scat create mode 100644 2020TPCApp1.cydsn/dfu_cm4.icf create mode 100644 2020TPCApp1.cydsn/dfu_cm4.ld create mode 100644 2020TPCApp1.cydsn/dfu_cm4.scat create mode 100644 2020TPCApp1.cydsn/dfu_mdk_common.h create mode 100644 2020TPCApp1.cydsn/dfu_mdk_symbols.c create mode 100644 2020TPCApp1.cydsn/dfu_user.h create mode 100644 2020TPCApp1.cydsn/gcc/startup_psoc6_01_cm0plus.S create mode 100644 2020TPCApp1.cydsn/gcc/startup_psoc6_01_cm4.S create mode 100644 2020TPCApp1.cydsn/host_main.c create mode 100644 2020TPCApp1.cydsn/iar/startup_psoc6_01_cm0plus.s create mode 100644 2020TPCApp1.cydsn/iar/startup_psoc6_01_cm4.s create mode 100644 2020TPCApp1.cydsn/ias.c create mode 100644 2020TPCApp1.cydsn/ias.h create mode 100644 2020TPCApp1.cydsn/main_cm0p.c create mode 100644 2020TPCApp1.cydsn/main_cm4.c create mode 100644 2020TPCApp1.cydsn/mdk/startup_psoc6_01_cm0plus.s create mode 100644 2020TPCApp1.cydsn/mdk/startup_psoc6_01_cm4.s create mode 100644 2020TPCApp1.cydsn/post_build_core1.bat create mode 100644 2020TPCApp1.cydsn/scps.c create mode 100644 2020TPCApp1.cydsn/scps.h create mode 100644 2020TPCApp1.cydsn/stdio_user.c create mode 100644 2020TPCApp1.cydsn/stdio_user.h create mode 100644 2020TPCApp1.cydsn/system_psoc6.h create mode 100644 2020TPCApp1.cydsn/system_psoc6_cm0plus.c create mode 100644 2020TPCApp1.cydsn/system_psoc6_cm4.c create mode 100644 2020TPCAppNoDFU.cydsn/2020TPCAppNoDFU.cydwr create mode 100644 2020TPCAppNoDFU.cydsn/2020TPCAppNoDFU.cyprj create mode 100644 2020TPCAppNoDFU.cydsn/Audio.c create mode 100644 2020TPCAppNoDFU.cydsn/Audio.h create mode 100644 2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE.c create mode 100644 2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE.h create mode 100644 2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE_Bond.c create mode 100644 2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE_Bond.h create mode 100644 2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE_UART.c create mode 100644 2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE_UART.h create mode 100644 2020TPCAppNoDFU.cydsn/COMM/COMM.h create mode 100644 2020TPCAppNoDFU.cydsn/COMM/COMM_Console.c create mode 100644 2020TPCAppNoDFU.cydsn/COMM/COMM_Console.h create mode 100644 2020TPCAppNoDFU.cydsn/COMM/COMM_Console_Util.c create mode 100644 2020TPCAppNoDFU.cydsn/COMM/COMM_Console_Util.h create mode 100644 2020TPCAppNoDFU.cydsn/COMM/COMM_I2C_Bus.c create mode 100644 2020TPCAppNoDFU.cydsn/COMM/COMM_I2C_Bus.h create mode 100644 2020TPCAppNoDFU.cydsn/COMM/COMM_IPC_Messages.c create mode 100644 2020TPCAppNoDFU.cydsn/COMM/COMM_IPC_Messages.h create mode 100644 2020TPCAppNoDFU.cydsn/COMM/COMM_Util.c create mode 100644 2020TPCAppNoDFU.cydsn/COMM/COMM_Util.h create mode 100644 2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_BLE_ConsoleCommands.c create mode 100644 2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_BLE_ConsoleCommands.h create mode 100644 2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_ConsoleCommands.c create mode 100644 2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_ConsoleCommands.h create mode 100644 2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_NVM_ConsoleCommands.c create mode 100644 2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_NVM_ConsoleCommands.h create mode 100644 2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_RTOS_ConsoleCommands.c create mode 100644 2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_RTOS_ConsoleCommands.h create mode 100644 2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_STATE_ConsoleCommands.c create mode 100644 2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_STATE_ConsoleCommands.h create mode 100644 2020TPCAppNoDFU.cydsn/CONFIG/CONFIG.h create mode 100644 2020TPCAppNoDFU.cydsn/CONFIG/CONFIG_RTOS.c create mode 100644 2020TPCAppNoDFU.cydsn/CONFIG/CONFIG_RTOS.h create mode 100644 2020TPCAppNoDFU.cydsn/Fire_Control.c create mode 100644 2020TPCAppNoDFU.cydsn/Fire_Control.h create mode 100644 2020TPCAppNoDFU.cydsn/FreeRTOSConfig.h create mode 100644 2020TPCAppNoDFU.cydsn/HW/HW.h create mode 100644 2020TPCAppNoDFU.cydsn/HW/HW_CapSense.c create mode 100644 2020TPCAppNoDFU.cydsn/HW/HW_CapSense.h create mode 100644 2020TPCAppNoDFU.cydsn/HW/HW_NeoPixels.c create mode 100644 2020TPCAppNoDFU.cydsn/KTag.h create mode 100644 2020TPCAppNoDFU.cydsn/NVM/NVM.h create mode 100644 2020TPCAppNoDFU.cydsn/NVM/NVM_CRC.c create mode 100644 2020TPCAppNoDFU.cydsn/NVM/NVM_CRC.h create mode 100644 2020TPCAppNoDFU.cydsn/NVM/NVM_ExternalEEPROM.c create mode 100644 2020TPCAppNoDFU.cydsn/NVM/NVM_ExternalEEPROM.h create mode 100644 2020TPCAppNoDFU.cydsn/NVM/NVM_ExternalEEPROMEntries.c create mode 100644 2020TPCAppNoDFU.cydsn/NVM/NVM_ExternalEEPROMEntries.h create mode 100644 2020TPCAppNoDFU.cydsn/NVM/NVM_OnChipEEPROM.c create mode 100644 2020TPCAppNoDFU.cydsn/NVM/NVM_OnChipEEPROM.h create mode 100644 2020TPCAppNoDFU.cydsn/NVM/NVM_OnChipEEPROMEntries.c create mode 100644 2020TPCAppNoDFU.cydsn/NVM/NVM_OnChipEEPROMEntries.h create mode 100644 2020TPCAppNoDFU.cydsn/NVM/NVM_Settings.c create mode 100644 2020TPCAppNoDFU.cydsn/Sample_Tasks.c create mode 100644 2020TPCAppNoDFU.cydsn/Sample_Tasks.h create mode 100644 2020TPCAppNoDFU.cydsn/Switches.c create mode 100644 2020TPCAppNoDFU.cydsn/Switches.h create mode 160000 2020TPCAppNoDFU.cydsn/SystemK create mode 100644 2020TPCAppNoDFU.cydsn/Tag_Sensors.c create mode 100644 2020TPCAppNoDFU.cydsn/Tag_Sensors.h create mode 100644 2020TPCAppNoDFU.cydsn/TopDesign/TopDesign.cysch create mode 100644 2020TPCAppNoDFU.cydsn/UTIL/UTIL.h create mode 100644 2020TPCAppNoDFU.cydsn/UTIL/UTIL_CircularBuffer.c create mode 100644 2020TPCAppNoDFU.cydsn/UTIL/UTIL_CircularBuffer.h create mode 100644 2020TPCAppNoDFU.cydsn/cy8c6xx7_cm0plus.icf create mode 100644 2020TPCAppNoDFU.cydsn/cy8c6xx7_cm0plus.ld create mode 100644 2020TPCAppNoDFU.cydsn/cy8c6xx7_cm0plus.scat create mode 100644 2020TPCAppNoDFU.cydsn/cy8c6xx7_cm4_dual.icf create mode 100644 2020TPCAppNoDFU.cydsn/cy8c6xx7_cm4_dual.ld create mode 100644 2020TPCAppNoDFU.cydsn/cy8c6xx7_cm4_dual.scat create mode 100644 2020TPCAppNoDFU.cydsn/cy_ble_config.h create mode 100644 2020TPCAppNoDFU.cydsn/cyapicallbacks.h create mode 100644 2020TPCAppNoDFU.cydsn/gcc/startup_psoc6_01_cm0plus.S create mode 100644 2020TPCAppNoDFU.cydsn/gcc/startup_psoc6_01_cm4.S create mode 100644 2020TPCAppNoDFU.cydsn/iar/startup_psoc6_01_cm0plus.s create mode 100644 2020TPCAppNoDFU.cydsn/iar/startup_psoc6_01_cm4.s create mode 100644 2020TPCAppNoDFU.cydsn/main_cm0p.c create mode 100644 2020TPCAppNoDFU.cydsn/main_cm4.c create mode 100644 2020TPCAppNoDFU.cydsn/mdk/startup_psoc6_01_cm0plus.s create mode 100644 2020TPCAppNoDFU.cydsn/mdk/startup_psoc6_01_cm4.s create mode 100644 2020TPCAppNoDFU.cydsn/stdio_user.c create mode 100644 2020TPCAppNoDFU.cydsn/stdio_user.h create mode 100644 2020TPCAppNoDFU.cydsn/system_psoc6.h create mode 100644 2020TPCAppNoDFU.cydsn/system_psoc6_cm0plus.c create mode 100644 2020TPCAppNoDFU.cydsn/system_psoc6_cm4.c create mode 100644 Keys/Keys_README.md create mode 100644 autocode.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9a23a2b --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +# Ignore file for the KTag 2020TPC PSoC Creator workspace. + +*.log +*/codegentemp/* +*/CortexM0p/* +*/CortexM4/ARM_GCC_541/* +*/Export/* +*/Generated_Source/* +/2020TPC.cywrk.* + +/2020TPCApp0.cydsn/2020TPCApp0_timing.html +/2020TPCApp0.cydsn/2020TPCApp0.cycdx +/2020TPCApp0.cydsn/2020TPCApp0.cyfit +/2020TPCApp0.cydsn/2020TPCApp0.cyprj.* +/2020TPCApp0.cydsn/2020TPCApp0.rpt + +/2020TPCApp1.cydsn/2020TPCApp1_timing.html +/2020TPCApp1.cydsn/2020TPCApp1.cycdx +/2020TPCApp1.cydsn/2020TPCApp1.cyfit +/2020TPCApp1.cydsn/2020TPCApp1.cyprj.* +/2020TPCApp1.cydsn/2020TPCApp1.rpt +/2020TPCApp1.cydsn/2020TPCApp1.svd + +/2020TPCAppNoDFU.cydsn/2020TPCAppNoDFU_timing.html +/2020TPCAppNoDFU.cydsn/2020TPCAppNoDFU.cycdx +/2020TPCAppNoDFU.cydsn/2020TPCAppNoDFU.cyfit +/2020TPCAppNoDFU.cydsn/2020TPCAppNoDFU.cyprj.* +/2020TPCAppNoDFU.cydsn/2020TPCAppNoDFU.rpt +/2020TPCAppNoDFU.cydsn/2020TPCAppNoDFU.svd + +/Keys/*.txt diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..5794282 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "2020TPCApp1.cydsn/SystemK"] + path = 2020TPCApp1.cydsn/SystemK + url = https://git.ktag.clubk.club/Software/SystemK +[submodule "2020TPCAppNoDFU.cydsn/SystemK"] + path = 2020TPCAppNoDFU.cydsn/SystemK + url = https://git.ktag.clubk.club/Software/SystemK diff --git a/2020TPC Nonvolatile Memory.xlsx b/2020TPC Nonvolatile Memory.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..9daca867b3a320f694d926d0a6ae2f9672a2a1de GIT binary patch literal 7818 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 P+Wp7xKEa%kKK%PH5I3Ss literal 0 HcmV?d00001 diff --git a/2020TPC.cywrk b/2020TPC.cywrk new file mode 100644 index 0000000..05ef7dd --- /dev/null +++ b/2020TPC.cywrk @@ -0,0 +1,24 @@ + + + + + + + + + +.\2020TPCApp0.cydsn\2020TPCApp0.cyprj +.\2020TPCApp1.cydsn\2020TPCApp1.cyprj +.\2020TPCAppNoDFU.cydsn\2020TPCAppNoDFU.cyprj + + + + + + + + + + + + \ No newline at end of file diff --git a/2020TPCApp0.cydsn/2020TPCApp0.cydwr b/2020TPCApp0.cydsn/2020TPCApp0.cydwr new file mode 100644 index 0000000..c21cff1 --- /dev/null +++ b/2020TPCApp0.cydsn/2020TPCApp0.cydwr @@ -0,0 +1,711 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/2020TPCApp0.cydsn/2020TPCApp0.cyprj b/2020TPCApp0.cydsn/2020TPCApp0.cyprj new file mode 100644 index 0000000..175efa0 --- /dev/null +++ b/2020TPCApp0.cydsn/2020TPCApp0.cyprj @@ -0,0 +1,3572 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/2020TPCApp0.cydsn/TopDesign/TopDesign.cysch b/2020TPCApp0.cydsn/TopDesign/TopDesign.cysch new file mode 100644 index 0000000000000000000000000000000000000000..d5b6999e688fc3f17498843057e407f6e0c6026b GIT binary patch literal 132677 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 U2C_F7oP~nF)>d#o9FzV32PvBAnE(I) literal 0 HcmV?d00001 diff --git a/2020TPCApp0.cydsn/cy8c6xx7_cm0plus.icf b/2020TPCApp0.cydsn/cy8c6xx7_cm0plus.icf new file mode 100644 index 0000000..71ba887 --- /dev/null +++ b/2020TPCApp0.cydsn/cy8c6xx7_cm0plus.icf @@ -0,0 +1,218 @@ +/***************************************************************************//** +* \file cy8c6xx7_cm0plus.icf +* \version 2.20 +* +* Linker file for the IAR compiler. +* +* The main purpose of the linker script is to describe how the sections in the +* input files should be mapped into the output file, and to control the memory +* layout of the output file. +* +* \note The entry point is fixed and starts at 0x10000000. The valid application +* image should be placed there. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case you may see warnings during the +* build process. In your project, you can simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x00000000; + +/* The symbols below define the location and size of blocks of memory in the target. + * Use these symbols to specify the memory regions available for allocation. + */ + +/* The following symbols control RAM and flash memory allocation for the CM0+ core. + * You can change the memory allocation by editing RAM and Flash symbols. + * Your changes must be aligned with the corresponding symbols for CM4 core in 'xx_cm4_dual.icf', + * where 'xx' is the device group; for example, 'cy8c6xx7_cm4_dual.icf'. + */ +/* RAM */ +define symbol __ICFEDIT_region_IRAM1_start__ = 0x08000000; +define symbol __ICFEDIT_region_IRAM1_end__ = 0x08024000; +/* Flash */ +define symbol __ICFEDIT_region_IROM1_start__ = 0x10000000; +define symbol __ICFEDIT_region_IROM1_end__ = 0x10080000; + +/* The following symbols define a 32K flash region used for EEPROM emulation. + * This region can also be used as the general purpose flash. + * You can assign sections to this memory region for only one of the cores. + * Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. + * Therefore, repurposing this memory region will prevent such middleware from operation. + */ +define symbol __ICFEDIT_region_IROM2_start__ = 0x14000000; +define symbol __ICFEDIT_region_IROM2_end__ = 0x14007FFF; + +/* The following symbols define device specific memory regions and must not be changed. */ +/* Supervisory FLASH - User Data */ +define symbol __ICFEDIT_region_IROM3_start__ = 0x16000800; +define symbol __ICFEDIT_region_IROM3_end__ = 0x160007FF; + +/* Supervisory FLASH - Normal Access Restrictions (NAR) */ +define symbol __ICFEDIT_region_IROM4_start__ = 0x16001A00; +define symbol __ICFEDIT_region_IROM4_end__ = 0x16001BFF; + +/* Supervisory FLASH - Public Key */ +define symbol __ICFEDIT_region_IROM5_start__ = 0x16005A00; +define symbol __ICFEDIT_region_IROM5_end__ = 0x160065FF; + +/* Supervisory FLASH - Table of Content # 2 */ +define symbol __ICFEDIT_region_IROM6_start__ = 0x16007C00; +define symbol __ICFEDIT_region_IROM6_end__ = 0x16007DFF; + +/* Supervisory FLASH - Table of Content # 2 Copy */ +define symbol __ICFEDIT_region_IROM7_start__ = 0x16007E00; +define symbol __ICFEDIT_region_IROM7_end__ = 0x16007FFF; + +/* eFuse */ +define symbol __ICFEDIT_region_IROM8_start__ = 0x90700000; +define symbol __ICFEDIT_region_IROM8_end__ = 0x907FFFFF; + +/* XIP */ +define symbol __ICFEDIT_region_EROM1_start__ = 0x18000000; +define symbol __ICFEDIT_region_EROM1_end__ = 0x1FFFFFFF; + +define symbol __ICFEDIT_region_EROM2_start__ = 0x0; +define symbol __ICFEDIT_region_EROM2_end__ = 0x0; +define symbol __ICFEDIT_region_EROM3_start__ = 0x0; +define symbol __ICFEDIT_region_EROM3_end__ = 0x0; + + +define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; +define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM1_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM1_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM2_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM2_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; +/*-Sizes-*/ +if (!isdefinedsymbol(__STACK_SIZE)) { + define symbol __ICFEDIT_size_cstack__ = 0x1000; +} else { + define symbol __ICFEDIT_size_cstack__ = __STACK_SIZE; +} +define symbol __ICFEDIT_size_proc_stack__ = 0x0; +if (!isdefinedsymbol(__HEAP_SIZE)) { + define symbol __ICFEDIT_size_heap__ = 0x0400; +} else { + define symbol __ICFEDIT_size_heap__ = __HEAP_SIZE; +} +/**** End of ICF editor section. ###ICF###*/ + + +define memory mem with size = 4G; +define region IROM1_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__]; +define region IROM2_region = mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__]; +define region IROM3_region = mem:[from __ICFEDIT_region_IROM3_start__ to __ICFEDIT_region_IROM3_end__]; +define region IROM4_region = mem:[from __ICFEDIT_region_IROM4_start__ to __ICFEDIT_region_IROM4_end__]; +define region IROM5_region = mem:[from __ICFEDIT_region_IROM5_start__ to __ICFEDIT_region_IROM5_end__]; +define region IROM6_region = mem:[from __ICFEDIT_region_IROM6_start__ to __ICFEDIT_region_IROM6_end__]; +define region IROM7_region = mem:[from __ICFEDIT_region_IROM7_start__ to __ICFEDIT_region_IROM7_end__]; +define region IROM8_region = mem:[from __ICFEDIT_region_IROM8_start__ to __ICFEDIT_region_IROM8_end__]; +define region EROM1_region = mem:[from __ICFEDIT_region_EROM1_start__ to __ICFEDIT_region_EROM1_end__]; +define region IRAM1_region = mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; +define block HSTACK {block HEAP, block PROC_STACK, last block CSTACK}; +define block RO {first section .intvec, readonly}; + +/*-Initializations-*/ +initialize by copy { readwrite }; +do not initialize { section .noinit, section .intvec_ram }; + + +/*-Placement-*/ + +/* Flash */ +".cy_app_header" : place at start of IROM1_region { section .cy_app_header }; +place in IROM1_region { block RO }; + +/* Emulated EEPROM Flash area */ +".cy_em_eeprom" : place at start of IROM2_region { section .cy_em_eeprom }; + +/* Supervisory Flash - User Data */ +".cy_sflash_user_data" : place at start of IROM3_region { section .cy_sflash_user_data }; + +/* Supervisory Flash - NAR */ +".cy_sflash_nar" : place at start of IROM4_region { section .cy_sflash_nar }; + +/* Supervisory Flash - Public Key */ +".cy_sflash_public_key" : place at start of IROM5_region { section .cy_sflash_public_key }; + +/* Supervisory Flash - TOC2 */ +".cy_toc_part2" : place at start of IROM6_region { section .cy_toc_part2 }; + +/* Supervisory Flash - RTOC2 */ +".cy_rtoc_part2" : place at start of IROM7_region { section .cy_rtoc_part2 }; + +/* eFuse */ +".cy_efuse" : place at start of IROM8_region { section .cy_efuse }; + +/* Execute in Place (XIP). See the smif driver documentation for details. */ +".cy_xip" : place at start of EROM1_region { section .cy_xip }; + +/* RAM */ +place at start of IRAM1_region { readwrite section .intvec_ram}; +place in IRAM1_region { readwrite }; +place at end of IRAM1_region { block HSTACK }; + +/* These sections are used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. */ +".cymeta" : place at address mem : 0x90500000 { readonly section .cymeta }; + + +keep { section .cy_app_header, + section .cy_em_eeprom, + section .cy_sflash_user_data, + section .cy_sflash_nar, + section .cy_sflash_public_key, + section .cy_toc_part2, + section .cy_rtoc_part2, + section .cy_efuse, + section .cy_xip, + section .cymeta, + }; + + +/* The following symbols used by the cymcuelftool. */ +/* Flash */ +define exported symbol __cy_memory_0_start = 0x10000000; +define exported symbol __cy_memory_0_length = 0x00100000; +define exported symbol __cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +define exported symbol __cy_memory_1_start = 0x14000000; +define exported symbol __cy_memory_1_length = 0x8000; +define exported symbol __cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +define exported symbol __cy_memory_2_start = 0x16000000; +define exported symbol __cy_memory_2_length = 0x8000; +define exported symbol __cy_memory_2_row_size = 0x200; + +/* XIP */ +define exported symbol __cy_memory_3_start = 0x18000000; +define exported symbol __cy_memory_3_length = 0x08000000; +define exported symbol __cy_memory_3_row_size = 0x200; + +/* eFuse */ +define exported symbol __cy_memory_4_start = 0x90700000; +define exported symbol __cy_memory_4_length = 0x100000; +define exported symbol __cy_memory_4_row_size = 1; + +/* EOF */ diff --git a/2020TPCApp0.cydsn/cy8c6xx7_cm0plus.ld b/2020TPCApp0.cydsn/cy8c6xx7_cm0plus.ld new file mode 100644 index 0000000..1f50d64 --- /dev/null +++ b/2020TPCApp0.cydsn/cy8c6xx7_cm0plus.ld @@ -0,0 +1,402 @@ +/***************************************************************************//** +* \file cy8c6xx7_cm0plus.ld +* \version 2.20 +* +* Linker file for the GNU C compiler. +* +* The main purpose of the linker script is to describe how the sections in the +* input files should be mapped into the output file, and to control the memory +* layout of the output file. +* +* \note The entry point location is fixed and starts at 0x10000000. The valid +* application image should be placed there. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case you may see warnings during the +* build process. In your project, you can simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +SEARCH_DIR(.) +GROUP(-lgcc -lc -lnosys) +ENTRY(Reset_Handler) + + +/* Force symbol to be entered in the output file as an undefined symbol. Doing +* this may, for example, trigger linking of additional modules from standard +* libraries. You may list several symbols for each EXTERN, and you may use +* EXTERN multiple times. This command has the same effect as the -u command-line +* option. +*/ +EXTERN(Reset_Handler) + +/* The MEMORY section below describes the location and size of blocks of memory in the target. +* Use this section to specify the memory regions available for allocation. +*/ +MEMORY +{ + /* The ram and flash regions control RAM and flash memory allocation for the CM0+ core. + * You can change the memory allocation by editing the 'ram' and 'flash' regions. + * Your changes must be aligned with the corresponding memory regions for the CM4 core in 'xx_cm4_dual.ld', + * where 'xx' is the device group; for example, 'cy8c6xx7_cm4_dual.ld'. + */ + ram (rwx) : ORIGIN = 0x08000000, LENGTH = 0x24000 + flash (rx) : ORIGIN = 0x10000000, LENGTH = 0x80000 + + /* This is a 32K flash region used for EEPROM emulation. This region can also be used as the general purpose flash. + * You can assign sections to this memory region for only one of the cores. + * Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. + * Therefore, repurposing this memory region will prevent such middleware from operation. + */ + em_eeprom (rx) : ORIGIN = 0x14000000, LENGTH = 0x8000 /* 32 KB */ + + /* The following regions define device specific memory regions and must not be changed. */ + sflash_user_data (rx) : ORIGIN = 0x16000800, LENGTH = 0x800 /* Supervisory flash: User data */ + sflash_nar (rx) : ORIGIN = 0x16001A00, LENGTH = 0x200 /* Supervisory flash: Normal Access Restrictions (NAR) */ + sflash_public_key (rx) : ORIGIN = 0x16005A00, LENGTH = 0xC00 /* Supervisory flash: Public Key */ + sflash_toc_2 (rx) : ORIGIN = 0x16007C00, LENGTH = 0x200 /* Supervisory flash: Table of Content # 2 */ + sflash_rtoc_2 (rx) : ORIGIN = 0x16007E00, LENGTH = 0x200 /* Supervisory flash: Table of Content # 2 Copy */ + xip (rx) : ORIGIN = 0x18000000, LENGTH = 0x8000000 /* 128 MB */ + efuse (r) : ORIGIN = 0x90700000, LENGTH = 0x100000 /* 1 MB */ +} + +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a libnosys.a) + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __Vectors_End + * __Vectors_Size + */ + + +SECTIONS +{ + .cy_app_header : + { + KEEP(*(.cy_app_header)) + } > flash + + .text : + { + . = ALIGN(4); + __Vectors = . ; + KEEP(*(.vectors)) + . = ALIGN(4); + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + __end__ = .; + + . = ALIGN(4); + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + /* Read-only code (constants). */ + *(.rodata .rodata.* .constdata .constdata.* .conststring .conststring.*) + + KEEP(*(.eh_frame*)) + } > flash + + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > flash + + __exidx_start = .; + + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > flash + __exidx_end = .; + + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_psoc6_01_cm0plus.S */ + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + + /* Copy interrupt vectors from flash to RAM */ + LONG (__Vectors) /* From */ + LONG (__ram_vectors_start__) /* To */ + LONG (__Vectors_End - __Vectors) /* Size */ + + /* Copy data section to RAM */ + LONG (__etext) /* From */ + LONG (__data_start__) /* To */ + LONG (__data_end__ - __data_start__) /* Size */ + + __copy_table_end__ = .; + } > flash + + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_psoc6_01_cm0plus.S */ + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + __zero_table_end__ = .; + } > flash + + __etext = . ; + + + .ramVectors (NOLOAD) : ALIGN(8) + { + __ram_vectors_start__ = .; + KEEP(*(.ram_vectors)) + __ram_vectors_end__ = .; + } > ram + + + .data __ram_vectors_end__ : AT (__etext) + { + __data_start__ = .; + + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + + KEEP(*(.cy_ramfunc*)) + . = ALIGN(4); + + __data_end__ = .; + + } > ram + + + /* Place variables in the section that should not be initialized during the + * device startup. + */ + .noinit (NOLOAD) : ALIGN(8) + { + KEEP(*(.noinit)) + } > ram + + + /* The uninitialized global or static variables are placed in this section. + * + * The NOLOAD attribute tells linker that .bss section does not consume + * any space in the image. The NOLOAD attribute changes the .bss type to + * NOBITS, and that makes linker to A) not allocate section in memory, and + * A) put information to clear the section with all zeros during application + * loading. + * + * Without the NOLOAD attribute, the .bss section might get PROGBITS type. + * This makes linker to A) allocate zeroed section in memory, and B) copy + * this section to RAM during application loading. + */ + .bss (NOLOAD): + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > ram + + + .heap (NOLOAD): + { + __HeapBase = .; + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + __HeapLimit = .; + } > ram + + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (NOLOAD): + { + KEEP(*(.stack*)) + } > ram + + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(ram) + LENGTH(ram); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") + + + /* Emulated EEPROM Flash area */ + .cy_em_eeprom : + { + KEEP(*(.cy_em_eeprom)) + } > em_eeprom + + + /* Supervisory Flash: User data */ + .cy_sflash_user_data : + { + KEEP(*(.cy_sflash_user_data)) + } > sflash_user_data + + + /* Supervisory Flash: Normal Access Restrictions (NAR) */ + .cy_sflash_nar : + { + KEEP(*(.cy_sflash_nar)) + } > sflash_nar + + + /* Supervisory Flash: Public Key */ + .cy_sflash_public_key : + { + KEEP(*(.cy_sflash_public_key)) + } > sflash_public_key + + + /* Supervisory Flash: Table of Content # 2 */ + .cy_toc_part2 : + { + KEEP(*(.cy_toc_part2)) + } > sflash_toc_2 + + + /* Supervisory Flash: Table of Content # 2 Copy */ + .cy_rtoc_part2 : + { + KEEP(*(.cy_rtoc_part2)) + } > sflash_rtoc_2 + + + /* Places the code in the Execute in Place (XIP) section. See the smif driver + * documentation for details. + */ + .cy_xip : + { + KEEP(*(.cy_xip)) + } > xip + + + /* eFuse */ + .cy_efuse : + { + KEEP(*(.cy_efuse)) + } > efuse + + + /* These sections are used for additional metadata (silicon revision, + * Silicon/JTAG ID, etc.) storage. + */ + .cymeta 0x90500000 : { KEEP(*(.cymeta)) } :NONE +} + + +/* The following symbols used by the cymcuelftool. */ +/* Flash */ +__cy_memory_0_start = 0x10000000; +__cy_memory_0_length = 0x00100000; +__cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +__cy_memory_1_start = 0x14000000; +__cy_memory_1_length = 0x8000; +__cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +__cy_memory_2_start = 0x16000000; +__cy_memory_2_length = 0x8000; +__cy_memory_2_row_size = 0x200; + +/* XIP */ +__cy_memory_3_start = 0x18000000; +__cy_memory_3_length = 0x08000000; +__cy_memory_3_row_size = 0x200; + +/* eFuse */ +__cy_memory_4_start = 0x90700000; +__cy_memory_4_length = 0x100000; +__cy_memory_4_row_size = 1; + +/* EOF */ diff --git a/2020TPCApp0.cydsn/cy8c6xx7_cm0plus.scat b/2020TPCApp0.cydsn/cy8c6xx7_cm0plus.scat new file mode 100644 index 0000000..6c49340 --- /dev/null +++ b/2020TPCApp0.cydsn/cy8c6xx7_cm0plus.scat @@ -0,0 +1,207 @@ +#! armcc -E +; The first line specifies a preprocessor command that the linker invokes +; to pass a scatter file through a C preprocessor. + +;******************************************************************************* +;* \file cy8c6xx7_cm0plus.scat +;* \version 2.20 +;* +;* Linker file for the ARMCC. +;* +;* The main purpose of the linker script is to describe how the sections in the +;* input files should be mapped into the output file, and to control the memory +;* layout of the output file. +;* +;* \note The entry point location is fixed and starts at 0x10000000. The valid +;* application image should be placed there. +;* +;* \note The linker files included with the PDL template projects must be +;* generic and handle all common use cases. Your project may not use every +;* section defined in the linker files. In that case you may see the warnings +;* during the build process: L6314W (no section matches pattern) and/or L6329W +;* (pattern only matches removed unused sections). In your project, you can +;* suppress the warning by passing the "--diag_suppress=L6314W,L6329W" option to +;* the linker, simply comment out or remove the relevant code in the linker +;* file. +;* +;******************************************************************************* +;* \copyright +;* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +;* You may use this file only in accordance with the license, terms, conditions, +;* disclaimers, and limitations in the end user license agreement accompanying +;* the software package with which this file was provided. +;******************************************************************************/ + +; The defines below describe the location and size of blocks of memory in the target. +; Use these defines to specify the memory regions available for allocation. + +; The following defines control RAM and flash memory allocation for the CM0+ core. +; You can change the memory allocation by editing the RAM and Flash defines. +; Your changes must be aligned with the corresponding defines for the CM4 core in 'xx_cm4_dual.scat', +; where 'xx' is the device group; for example, 'cy8c6xx7_cm4_dual.scat'. +; RAM +#define RAM_START 0x08000000 +#define RAM_SIZE 0x00024000 +; Flash +#define FLASH_START 0x10000000 +#define FLASH_SIZE 0x00080000 + +; The following defines describe a 32K flash region used for EEPROM emulation. +; This region can also be used as the general purpose flash. +; You can assign sections to this memory region for only one of the cores. +; Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. +; Therefore, repurposing this memory region will prevent such middleware from operation. +#define EM_EEPROM_START 0x14000000 +#define EM_EEPROM_SIZE 0x8000 + +; The following defines describe device specific memory regions and must not be changed. +; Supervisory flash: User data +#define SFLASH_USER_DATA_START 0x16000800 +#define SFLASH_USER_DATA_SIZE 0x00000800 + +; Supervisory flash: Normal Access Restrictions (NAR) +#define SFLASH_NAR_START 0x16001A00 +#define SFLASH_NAR_SIZE 0x00000200 + +; Supervisory flash: Public Key +#define SFLASH_PUBLIC_KEY_START 0x16005A00 +#define SFLASH_PUBLIC_KEY_SIZE 0x00000C00 + +; Supervisory flash: Table of Content # 2 +#define SFLASH_TOC_2_START 0x16007C00 +#define SFLASH_TOC_2_SIZE 0x00000200 + +; Supervisory flash: Table of Content # 2 Copy +#define SFLASH_RTOC_2_START 0x16007E00 +#define SFLASH_RTOC_2_SIZE 0x00000200 + +; External memory +#define XIP_START 0x18000000 +#define XIP_SIZE 0x08000000 + +; eFuse +#define EFUSE_START 0x90700000 +#define EFUSE_SIZE 0x100000 + + +LR_FLASH FLASH_START FLASH_SIZE +{ + .cy_app_header +0 + { + * (.cy_app_header) + } + + ER_FLASH_VECTORS +0 + { + * (RESET, +FIRST) + } + + ER_FLASH_CODE +0 FIXED + { + * (InRoot$$Sections) + * (+RO) + } + + ER_RAM_VECTORS RAM_START UNINIT + { + * (RESET_RAM, +FIRST) + } + + ER_RAM_DATA +0 + { + * (.cy_ramfunc) + .ANY (+RW, +ZI) + } + + ; Place variables in the section that should not be initialized during the + ; device startup. + ER_RAM_NOINIT_DATA +0 UNINIT + { + * (.noinit) + } +} + + +; Emulated EEPROM Flash area +LR_EM_EEPROM EM_EEPROM_START EM_EEPROM_SIZE +{ + .cy_em_eeprom +0 + { + * (.cy_em_eeprom) + } +} + +; Supervisory flash: User data +LR_SFLASH_USER_DATA SFLASH_USER_DATA_START SFLASH_USER_DATA_SIZE +{ + .cy_sflash_user_data +0 + { + * (.cy_sflash_user_data) + } +} + +; Supervisory flash: Normal Access Restrictions (NAR) +LR_SFLASH_NAR SFLASH_NAR_START SFLASH_NAR_SIZE +{ + .cy_sflash_nar +0 + { + * (.cy_sflash_nar) + } +} + +; Supervisory flash: Public Key +LR_SFLASH_PUBLIC_KEY SFLASH_PUBLIC_KEY_START SFLASH_PUBLIC_KEY_SIZE +{ + .cy_sflash_public_key +0 + { + * (.cy_sflash_public_key) + } +} + +; Supervisory flash: Table of Content # 2 +LR_SFLASH_TOC_2 SFLASH_TOC_2_START SFLASH_TOC_2_SIZE +{ + .cy_toc_part2 +0 + { + * (.cy_toc_part2) + } +} + +; Supervisory flash: Table of Content # 2 Copy +LR_SFLASH_RTOC_2 SFLASH_RTOC_2_START SFLASH_RTOC_2_SIZE +{ + .cy_rtoc_part2 +0 + { + * (.cy_rtoc_part2) + } +} + + +; Places the code in the Execute in Place (XIP) section. See the smif driver documentation for details. +LR_EROM XIP_START XIP_SIZE +{ + .cy_xip +0 + { + * (.cy_xip) + } +} + + +; eFuse +LR_EFUSE EFUSE_START EFUSE_SIZE +{ + .cy_efuse +0 + { + * (.cy_efuse) + } +} + + +; The section is used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. +CYMETA 0x90500000 +{ + .cymeta +0 { * (.cymeta) } +} + + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/cy8c6xx7_cm4_dual.icf b/2020TPCApp0.cydsn/cy8c6xx7_cm4_dual.icf new file mode 100644 index 0000000..0f831e7 --- /dev/null +++ b/2020TPCApp0.cydsn/cy8c6xx7_cm4_dual.icf @@ -0,0 +1,219 @@ +/***************************************************************************//** +* \file cy8c6xx7_cm4_dual.icf +* \version 2.20 +* +* Linker file for the IAR compiler. +* +* The main purpose of the linker script is to describe how the sections in the +* input files should be mapped into the output file, and to control the memory +* layout of the output file. +* +* \note The entry point is fixed and starts at 0x10000000. The valid application +* image should be placed there. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case you may see warnings during the +* build process. In your project, you can simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x00000000; + +/* The symbols below define the location and size of blocks of memory in the target. + * Use these symbols to specify the memory regions available for allocation. + */ + +/* The following symbols control RAM and flash memory allocation for the CM4 core. + * You can change the memory allocation by editing RAM and Flash symbols. + * Note that 2 KB of RAM (at the end of the RAM section) are reserved for system use. + * Using this memory region for other purposes will lead to unexpected behavior. + * Your changes must be aligned with the corresponding symbols for CM0+ core in 'xx_cm0plus.icf', + * where 'xx' is the device group; for example, 'cy8c6xx7_cm0plus.icf'. + */ +/* RAM */ +define symbol __ICFEDIT_region_IRAM1_start__ = 0x08024000; +define symbol __ICFEDIT_region_IRAM1_end__ = 0x08047800; +/* Flash */ +define symbol __ICFEDIT_region_IROM1_start__ = 0x10080000; +define symbol __ICFEDIT_region_IROM1_end__ = 0x10100000; + +/* The following symbols define a 32K flash region used for EEPROM emulation. + * This region can also be used as the general purpose flash. + * You can assign sections to this memory region for only one of the cores. + * Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. + * Therefore, repurposing this memory region will prevent such middleware from operation. + */ +define symbol __ICFEDIT_region_IROM2_start__ = 0x14000000; +define symbol __ICFEDIT_region_IROM2_end__ = 0x14007FFF; + +/* The following symbols define device specific memory regions and must not be changed. */ +/* Supervisory FLASH - User Data */ +define symbol __ICFEDIT_region_IROM3_start__ = 0x16000800; +define symbol __ICFEDIT_region_IROM3_end__ = 0x160007FF; + +/* Supervisory FLASH - Normal Access Restrictions (NAR) */ +define symbol __ICFEDIT_region_IROM4_start__ = 0x16001A00; +define symbol __ICFEDIT_region_IROM4_end__ = 0x16001BFF; + +/* Supervisory FLASH - Public Key */ +define symbol __ICFEDIT_region_IROM5_start__ = 0x16005A00; +define symbol __ICFEDIT_region_IROM5_end__ = 0x160065FF; + +/* Supervisory FLASH - Table of Content # 2 */ +define symbol __ICFEDIT_region_IROM6_start__ = 0x16007C00; +define symbol __ICFEDIT_region_IROM6_end__ = 0x16007DFF; + +/* Supervisory FLASH - Table of Content # 2 Copy */ +define symbol __ICFEDIT_region_IROM7_start__ = 0x16007E00; +define symbol __ICFEDIT_region_IROM7_end__ = 0x16007FFF; + +/* eFuse */ +define symbol __ICFEDIT_region_IROM8_start__ = 0x90700000; +define symbol __ICFEDIT_region_IROM8_end__ = 0x907FFFFF; + +/* XIP */ +define symbol __ICFEDIT_region_EROM1_start__ = 0x18000000; +define symbol __ICFEDIT_region_EROM1_end__ = 0x1FFFFFFF; + +define symbol __ICFEDIT_region_EROM2_start__ = 0x0; +define symbol __ICFEDIT_region_EROM2_end__ = 0x0; +define symbol __ICFEDIT_region_EROM3_start__ = 0x0; +define symbol __ICFEDIT_region_EROM3_end__ = 0x0; + + +define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; +define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM1_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM1_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM2_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM2_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; +/*-Sizes-*/ +if (!isdefinedsymbol(__STACK_SIZE)) { + define symbol __ICFEDIT_size_cstack__ = 0x1000; +} else { + define symbol __ICFEDIT_size_cstack__ = __STACK_SIZE; +} +define symbol __ICFEDIT_size_proc_stack__ = 0x0; +if (!isdefinedsymbol(__HEAP_SIZE)) { + define symbol __ICFEDIT_size_heap__ = 0x0400; +} else { + define symbol __ICFEDIT_size_heap__ = __HEAP_SIZE; +} +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region IROM1_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__]; +define region IROM2_region = mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__]; +define region IROM3_region = mem:[from __ICFEDIT_region_IROM3_start__ to __ICFEDIT_region_IROM3_end__]; +define region IROM4_region = mem:[from __ICFEDIT_region_IROM4_start__ to __ICFEDIT_region_IROM4_end__]; +define region IROM5_region = mem:[from __ICFEDIT_region_IROM5_start__ to __ICFEDIT_region_IROM5_end__]; +define region IROM6_region = mem:[from __ICFEDIT_region_IROM6_start__ to __ICFEDIT_region_IROM6_end__]; +define region IROM7_region = mem:[from __ICFEDIT_region_IROM7_start__ to __ICFEDIT_region_IROM7_end__]; +define region IROM8_region = mem:[from __ICFEDIT_region_IROM8_start__ to __ICFEDIT_region_IROM8_end__]; +define region EROM1_region = mem:[from __ICFEDIT_region_EROM1_start__ to __ICFEDIT_region_EROM1_end__]; +define region IRAM1_region = mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; +define block HSTACK {block HEAP, block PROC_STACK, last block CSTACK}; +define block RO {first section .intvec, readonly}; + +/*-Initializations-*/ +initialize by copy { readwrite }; +do not initialize { section .noinit, section .intvec_ram }; + + +/*-Placement-*/ + +/* Flash */ +place at start of IROM1_region { block RO }; +".cy_app_signature" : place at address (__ICFEDIT_region_IROM1_end__ - 0x200) { section .cy_app_signature }; + +/* Emulated EEPROM Flash area */ +".cy_em_eeprom" : place at start of IROM2_region { section .cy_em_eeprom }; + +/* Supervisory Flash - User Data */ +".cy_sflash_user_data" : place at start of IROM3_region { section .cy_sflash_user_data }; + +/* Supervisory Flash - NAR */ +".cy_sflash_nar" : place at start of IROM4_region { section .cy_sflash_nar }; + +/* Supervisory Flash - Public Key */ +".cy_sflash_public_key" : place at start of IROM5_region { section .cy_sflash_public_key }; + +/* Supervisory Flash - TOC2 */ +".cy_toc_part2" : place at start of IROM6_region { section .cy_toc_part2 }; + +/* Supervisory Flash - RTOC2 */ +".cy_rtoc_part2" : place at start of IROM7_region { section .cy_rtoc_part2 }; + +/* eFuse */ +".cy_efuse" : place at start of IROM8_region { section .cy_efuse }; + +/* Execute in Place (XIP). See the smif driver documentation for details. */ +".cy_xip" : place at start of EROM1_region { section .cy_xip }; + +/* RAM */ +place at start of IRAM1_region { readwrite section .intvec_ram}; +place in IRAM1_region { readwrite }; +place at end of IRAM1_region { block HSTACK }; + +/* These sections are used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. */ +".cymeta" : place at address mem : 0x90500000 { readonly section .cymeta }; + + +keep { section .cy_app_signature, + section .cy_em_eeprom, + section .cy_sflash_user_data, + section .cy_sflash_nar, + section .cy_sflash_public_key, + section .cy_toc_part2, + section .cy_rtoc_part2, + section .cy_efuse, + section .cy_xip, + section .cymeta, + }; + + +/* The following symbols used by the cymcuelftool. */ +/* Flash */ +define exported symbol __cy_memory_0_start = 0x10000000; +define exported symbol __cy_memory_0_length = 0x00100000; +define exported symbol __cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +define exported symbol __cy_memory_1_start = 0x14000000; +define exported symbol __cy_memory_1_length = 0x8000; +define exported symbol __cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +define exported symbol __cy_memory_2_start = 0x16000000; +define exported symbol __cy_memory_2_length = 0x8000; +define exported symbol __cy_memory_2_row_size = 0x200; + +/* XIP */ +define exported symbol __cy_memory_3_start = 0x18000000; +define exported symbol __cy_memory_3_length = 0x08000000; +define exported symbol __cy_memory_3_row_size = 0x200; + +/* eFuse */ +define exported symbol __cy_memory_4_start = 0x90700000; +define exported symbol __cy_memory_4_length = 0x100000; +define exported symbol __cy_memory_4_row_size = 1; + +/* EOF */ diff --git a/2020TPCApp0.cydsn/cy8c6xx7_cm4_dual.ld b/2020TPCApp0.cydsn/cy8c6xx7_cm4_dual.ld new file mode 100644 index 0000000..90f6fca --- /dev/null +++ b/2020TPCApp0.cydsn/cy8c6xx7_cm4_dual.ld @@ -0,0 +1,408 @@ +/***************************************************************************//** +* \file cy8c6xx7_cm4_dual.ld +* \version 2.20 +* +* Linker file for the GNU C compiler. +* +* The main purpose of the linker script is to describe how the sections in the +* input files should be mapped into the output file, and to control the memory +* layout of the output file. +* +* \note The entry point location is fixed and starts at 0x10000000. The valid +* application image should be placed there. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case you may see warnings during the +* build process. In your project, you can simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +SEARCH_DIR(.) +GROUP(-lgcc -lc -lnosys) +ENTRY(Reset_Handler) + + +/* Force symbol to be entered in the output file as an undefined symbol. Doing +* this may, for example, trigger linking of additional modules from standard +* libraries. You may list several symbols for each EXTERN, and you may use +* EXTERN multiple times. This command has the same effect as the -u command-line +* option. +*/ +EXTERN(Reset_Handler) + +/* The MEMORY section below describes the location and size of blocks of memory in the target. +* Use this section to specify the memory regions available for allocation. +*/ +MEMORY +{ + /* The ram and flash regions control RAM and flash memory allocation for the CM4 core. + * You can change the memory allocation by editing the 'ram' and 'flash' regions. + * Note that 2 KB of RAM (at the end of the RAM section) are reserved for system use. + * Using this memory region for other purposes will lead to unexpected behavior. + * Your changes must be aligned with the corresponding memory regions for CM0+ core in 'xx_cm0plus.ld', + * where 'xx' is the device group; for example, 'cy8c6xx7_cm0plus.ld'. + */ + ram (rwx) : ORIGIN = 0x08024000, LENGTH = 0x23800 + flash (rx) : ORIGIN = 0x10080000, LENGTH = 0x80000 + + /* This is a 32K flash region used for EEPROM emulation. This region can also be used as the general purpose flash. + * You can assign sections to this memory region for only one of the cores. + * Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. + * Therefore, repurposing this memory region will prevent such middleware from operation. + */ + em_eeprom (rx) : ORIGIN = 0x14000000, LENGTH = 0x8000 /* 32 KB */ + + /* The following regions define device specific memory regions and must not be changed. */ + sflash_user_data (rx) : ORIGIN = 0x16000800, LENGTH = 0x800 /* Supervisory flash: User data */ + sflash_nar (rx) : ORIGIN = 0x16001A00, LENGTH = 0x200 /* Supervisory flash: Normal Access Restrictions (NAR) */ + sflash_public_key (rx) : ORIGIN = 0x16005A00, LENGTH = 0xC00 /* Supervisory flash: Public Key */ + sflash_toc_2 (rx) : ORIGIN = 0x16007C00, LENGTH = 0x200 /* Supervisory flash: Table of Content # 2 */ + sflash_rtoc_2 (rx) : ORIGIN = 0x16007E00, LENGTH = 0x200 /* Supervisory flash: Table of Content # 2 Copy */ + xip (rx) : ORIGIN = 0x18000000, LENGTH = 0x8000000 /* 128 MB */ + efuse (r) : ORIGIN = 0x90700000, LENGTH = 0x100000 /* 1 MB */ +} + +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a libnosys.a) + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __Vectors_End + * __Vectors_Size + */ + + +SECTIONS +{ + .text : + { + . = ALIGN(4); + __Vectors = . ; + KEEP(*(.vectors)) + . = ALIGN(4); + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + __end__ = .; + + . = ALIGN(4); + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + /* Read-only code (constants). */ + *(.rodata .rodata.* .constdata .constdata.* .conststring .conststring.*) + + KEEP(*(.eh_frame*)) + } > flash + + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > flash + + __exidx_start = .; + + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > flash + __exidx_end = .; + + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_psoc6_01_cm4.S */ + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + + /* Copy interrupt vectors from flash to RAM */ + LONG (__Vectors) /* From */ + LONG (__ram_vectors_start__) /* To */ + LONG (__Vectors_End - __Vectors) /* Size */ + + /* Copy data section to RAM */ + LONG (__etext) /* From */ + LONG (__data_start__) /* To */ + LONG (__data_end__ - __data_start__) /* Size */ + + __copy_table_end__ = .; + } > flash + + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_psoc6_01_cm4.S */ + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + __zero_table_end__ = .; + } > flash + + __etext = . ; + + + .ramVectors (NOLOAD) : ALIGN(8) + { + __ram_vectors_start__ = .; + KEEP(*(.ram_vectors)) + __ram_vectors_end__ = .; + } > ram + + + .data __ram_vectors_end__ : AT (__etext) + { + __data_start__ = .; + + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + + KEEP(*(.cy_ramfunc*)) + . = ALIGN(4); + + __data_end__ = .; + + } > ram + + + /* Place variables in the section that should not be initialized during the + * device startup. + */ + .noinit (NOLOAD) : ALIGN(8) + { + KEEP(*(.noinit)) + } > ram + + + /* The uninitialized global or static variables are placed in this section. + * + * The NOLOAD attribute tells linker that .bss section does not consume + * any space in the image. The NOLOAD attribute changes the .bss type to + * NOBITS, and that makes linker to A) not allocate section in memory, and + * A) put information to clear the section with all zeros during application + * loading. + * + * Without the NOLOAD attribute, the .bss section might get PROGBITS type. + * This makes linker to A) allocate zeroed section in memory, and B) copy + * this section to RAM during application loading. + */ + .bss (NOLOAD): + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > ram + + + .heap (NOLOAD): + { + __HeapBase = .; + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + __HeapLimit = .; + } > ram + + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (NOLOAD): + { + KEEP(*(.stack*)) + } > ram + + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(ram) + LENGTH(ram); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") + + + /* Used for the digital signature of the secure application and the Bootloader SDK application. + * The size of the section depends on the required data size. */ + .cy_app_signature ORIGIN(flash) + LENGTH(flash) - 256 : + { + KEEP(*(.cy_app_signature)) + } > flash + + + /* Emulated EEPROM Flash area */ + .cy_em_eeprom : + { + KEEP(*(.cy_em_eeprom)) + } > em_eeprom + + + /* Supervisory Flash: User data */ + .cy_sflash_user_data : + { + KEEP(*(.cy_sflash_user_data)) + } > sflash_user_data + + + /* Supervisory Flash: Normal Access Restrictions (NAR) */ + .cy_sflash_nar : + { + KEEP(*(.cy_sflash_nar)) + } > sflash_nar + + + /* Supervisory Flash: Public Key */ + .cy_sflash_public_key : + { + KEEP(*(.cy_sflash_public_key)) + } > sflash_public_key + + + /* Supervisory Flash: Table of Content # 2 */ + .cy_toc_part2 : + { + KEEP(*(.cy_toc_part2)) + } > sflash_toc_2 + + + /* Supervisory Flash: Table of Content # 2 Copy */ + .cy_rtoc_part2 : + { + KEEP(*(.cy_rtoc_part2)) + } > sflash_rtoc_2 + + + /* Places the code in the Execute in Place (XIP) section. See the smif driver + * documentation for details. + */ + .cy_xip : + { + KEEP(*(.cy_xip)) + } > xip + + + /* eFuse */ + .cy_efuse : + { + KEEP(*(.cy_efuse)) + } > efuse + + + /* These sections are used for additional metadata (silicon revision, + * Silicon/JTAG ID, etc.) storage. + */ + .cymeta 0x90500000 : { KEEP(*(.cymeta)) } :NONE +} + + +/* The following symbols used by the cymcuelftool. */ +/* Flash */ +__cy_memory_0_start = 0x10000000; +__cy_memory_0_length = 0x00100000; +__cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +__cy_memory_1_start = 0x14000000; +__cy_memory_1_length = 0x8000; +__cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +__cy_memory_2_start = 0x16000000; +__cy_memory_2_length = 0x8000; +__cy_memory_2_row_size = 0x200; + +/* XIP */ +__cy_memory_3_start = 0x18000000; +__cy_memory_3_length = 0x08000000; +__cy_memory_3_row_size = 0x200; + +/* eFuse */ +__cy_memory_4_start = 0x90700000; +__cy_memory_4_length = 0x100000; +__cy_memory_4_row_size = 1; + +/* EOF */ diff --git a/2020TPCApp0.cydsn/cy8c6xx7_cm4_dual.scat b/2020TPCApp0.cydsn/cy8c6xx7_cm4_dual.scat new file mode 100644 index 0000000..d45ccea --- /dev/null +++ b/2020TPCApp0.cydsn/cy8c6xx7_cm4_dual.scat @@ -0,0 +1,213 @@ +#! armcc -E +; The first line specifies a preprocessor command that the linker invokes +; to pass a scatter file through a C preprocessor. + +;******************************************************************************* +;* \file cy8c6xx7_cm4_dual.scat +;* \version 2.20 +;* +;* Linker file for the ARMCC. +;* +;* The main purpose of the linker script is to describe how the sections in the +;* input files should be mapped into the output file, and to control the memory +;* layout of the output file. +;* +;* \note The entry point location is fixed and starts at 0x10000000. The valid +;* application image should be placed there. +;* +;* \note The linker files included with the PDL template projects must be +;* generic and handle all common use cases. Your project may not use every +;* section defined in the linker files. In that case you may see the warnings +;* during the build process: L6314W (no section matches pattern) and/or L6329W +;* (pattern only matches removed unused sections). In your project, you can +;* suppress the warning by passing the "--diag_suppress=L6314W,L6329W" option to +;* the linker, simply comment out or remove the relevant code in the linker +;* file. +;* +;******************************************************************************* +;* \copyright +;* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +;* You may use this file only in accordance with the license, terms, conditions, +;* disclaimers, and limitations in the end user license agreement accompanying +;* the software package with which this file was provided. +;******************************************************************************/ + +; The defines below describe the location and size of blocks of memory in the target. +; Use these defines to specify the memory regions available for allocation. + +; The following defines control RAM and flash memory allocation for the CM4 core. +; You can change the memory allocation by editing RAM and Flash defines. +; Note that 2 KB of RAM (at the end of the RAM section) are reserved for system use. +; Using this memory region for other purposes will lead to unexpected behavior. +; Your changes must be aligned with the corresponding defines for CM0+ core in 'xx_cm0plus.scat', +; where 'xx' is the device group; for example, 'cy8c6xx7_cm0plus.scat'. +; RAM +#define RAM_START 0x08024000 +#define RAM_SIZE 0x00023800 +; Flash +#define FLASH_START 0x10080000 +#define FLASH_SIZE 0x00080000 + +; The following defines describe a 32K flash region used for EEPROM emulation. +; This region can also be used as the general purpose flash. +; You can assign sections to this memory region for only one of the cores. +; Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. +; Therefore, repurposing this memory region will prevent such middleware from operation. +#define EM_EEPROM_START 0x14000000 +#define EM_EEPROM_SIZE 0x8000 + +; The following defines describe device specific memory regions and must not be changed. +; Supervisory flash: User data +#define SFLASH_USER_DATA_START 0x16000800 +#define SFLASH_USER_DATA_SIZE 0x00000800 + +; Supervisory flash: Normal Access Restrictions (NAR) +#define SFLASH_NAR_START 0x16001A00 +#define SFLASH_NAR_SIZE 0x00000200 + +; Supervisory flash: Public Key +#define SFLASH_PUBLIC_KEY_START 0x16005A00 +#define SFLASH_PUBLIC_KEY_SIZE 0x00000C00 + +; Supervisory flash: Table of Content # 2 +#define SFLASH_TOC_2_START 0x16007C00 +#define SFLASH_TOC_2_SIZE 0x00000200 + +; Supervisory flash: Table of Content # 2 Copy +#define SFLASH_RTOC_2_START 0x16007E00 +#define SFLASH_RTOC_2_SIZE 0x00000200 + +; External memory +#define XIP_START 0x18000000 +#define XIP_SIZE 0x08000000 + +; eFuse +#define EFUSE_START 0x90700000 +#define EFUSE_SIZE 0x100000 + + +LR_FLASH FLASH_START FLASH_SIZE +{ + ER_FLASH_VECTORS +0 + { + * (RESET, +FIRST) + } + + ER_FLASH_CODE +0 FIXED + { + * (InRoot$$Sections) + * (+RO) + } + + ER_RAM_VECTORS RAM_START UNINIT + { + * (RESET_RAM, +FIRST) + } + + ER_RAM_DATA +0 + { + * (.cy_ramfunc) + .ANY (+RW, +ZI) + } + + ; Place variables in the section that should not be initialized during the + ; device startup. + ER_RAM_NOINIT_DATA +0 UNINIT + { + * (.noinit) + } + + + ; Used for the digital signature of the secure application and the + ; Bootloader SDK application. The size of the section depends on the required + ; data size. + .cy_app_signature (FLASH_START + FLASH_SIZE - 256) 256 + { + * (.cy_app_signature) + } +} + + +; Emulated EEPROM Flash area +LR_EM_EEPROM EM_EEPROM_START EM_EEPROM_SIZE +{ + .cy_em_eeprom +0 + { + * (.cy_em_eeprom) + } +} + +; Supervisory flash: User data +LR_SFLASH_USER_DATA SFLASH_USER_DATA_START SFLASH_USER_DATA_SIZE +{ + .cy_sflash_user_data +0 + { + * (.cy_sflash_user_data) + } +} + +; Supervisory flash: Normal Access Restrictions (NAR) +LR_SFLASH_NAR SFLASH_NAR_START SFLASH_NAR_SIZE +{ + .cy_sflash_nar +0 + { + * (.cy_sflash_nar) + } +} + +; Supervisory flash: Public Key +LR_SFLASH_PUBLIC_KEY SFLASH_PUBLIC_KEY_START SFLASH_PUBLIC_KEY_SIZE +{ + .cy_sflash_public_key +0 + { + * (.cy_sflash_public_key) + } +} + +; Supervisory flash: Table of Content # 2 +LR_SFLASH_TOC_2 SFLASH_TOC_2_START SFLASH_TOC_2_SIZE +{ + .cy_toc_part2 +0 + { + * (.cy_toc_part2) + } +} + +; Supervisory flash: Table of Content # 2 Copy +LR_SFLASH_RTOC_2 SFLASH_RTOC_2_START SFLASH_RTOC_2_SIZE +{ + .cy_rtoc_part2 +0 + { + * (.cy_rtoc_part2) + } +} + + +; Places the code in the Execute in Place (XIP) section. See the smif driver documentation for details. +LR_EROM XIP_START XIP_SIZE +{ + .cy_xip +0 + { + * (.cy_xip) + } +} + + +; eFuse +LR_EFUSE EFUSE_START EFUSE_SIZE +{ + .cy_efuse +0 + { + * (.cy_efuse) + } +} + + +; The section is used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. +CYMETA 0x90500000 +{ + .cymeta +0 { * (.cymeta) } +} + + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/cy_ble_config.h b/2020TPCApp0.cydsn/cy_ble_config.h new file mode 100644 index 0000000..2f382ef --- /dev/null +++ b/2020TPCApp0.cydsn/cy_ble_config.h @@ -0,0 +1,66 @@ +/***************************************************************************//** +* \file cy_ble_config.h +* \version 2.80 +* +* \brief +* The user BLE configuration file. Allows redefining the configuration #define(s) +* generated by the BLE customizer. +* +******************************************************************************** +* \copyright +* Copyright 2017-2023, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef CY_BLE_CONF_H +#define CY_BLE_CONF_H + +#include "ble/cy_ble_defines.h" + +/** + * The BLE_config.h file is generated by the BLE customizer and includes all common + * configuration defines (CY_BLE_CONFIG_***). + */ +#include "BLE_config.h" + +#include +#ifndef CY_IP_MXBLESS + #error "The BLE middleware is not supported on this device" +#endif + +/** + * The BLE Interrupt Notification Feature - Exposes BLE interrupt notifications + * to an application that indicates a different link layer and radio state + * transition to the user from the BLESS interrupt context. + * This callback is triggered at the beginning of a received BLESS interrupt + * (based on the registered interrupt mask). After this feature is enabled, + * the following APIs are available: + * Cy_BLE_RegisterInterruptCallback() and Cy_BLE_UnRegisterInterruptCallback(). + * + * The valid value: 1u - enable / 0u - disable. + * + * BLE Dual mode requires an additional define IPC channel and IPC Interrupt + * structure to send notification from the controller core to host core. + * Use the following defines: + * #define CY_BLE_INTR_NOTIFY_IPC_CHAN (9..15) + * #define CY_BLE_INTR_NOTIFY_IPC_INTR (9..15) + * #define CY_BLE_INTR_NOTIFY_IPC_INTR_PRIOR (0..7) + */ +#define CY_BLE_INTR_NOTIFY_FEATURE_ENABLE (0u) + + +/** + * To redefine the config #define(s) generated by the BLE customizer, + * use the construction #undef... #define. + * + * #undef CY_BLE_CONFIG_ENABLE_LL_PRIVACY + * #define CY_BLE_CONFIG_ENABLE_LL_PRIVACY (1u) + * + */ + + +#endif /* !defined(CY_BLE_CONF_H)*/ + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/cy_si_config.h b/2020TPCApp0.cydsn/cy_si_config.h new file mode 100644 index 0000000..aa539d7 --- /dev/null +++ b/2020TPCApp0.cydsn/cy_si_config.h @@ -0,0 +1,131 @@ +/***************************************************************************//** +* \file cy_si_config.h +* \version 1.0.1 +* +* \brief +* Definitions for Secure Image. +* +******************************************************************************** +* \copyright +* Copyright 2017-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CY_SI_CONFIG_H_ +#define _CY_SI_CONFIG_H_ + +#include "cy_si_keystorage.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/*************************************** +* Macros +***************************************/ +/* +* Macros to define the secure image version and ID. +*/ +#define CY_SI_VERSION_MAJOR 1UL /**< Major version */ +#define CY_SI_VERSION_MINOR 0UL /**< Minor version */ +#define CY_SI_APP_VERSION ((CY_SI_VERSION_MAJOR << 24u) | (CY_SI_VERSION_MINOR << 16u)) /**< App Version */ +#define CY_SI_ID CY_PDL_DRV_ID(0x38u) /**< Secure Image ID */ +#define CY_SI_ID_INFO (uint32_t)( CY_SI_ID | CY_PDL_STATUS_INFO ) /**< Secure Image INFO ID */ +#define CY_SI_ID_WARNING (uint32_t)( CY_SI_ID | CY_PDL_STATUS_WARNING) /**< Secure Image WARNING ID */ +#define CY_SI_ID_ERROR (uint32_t)( CY_SI_ID | CY_PDL_STATUS_ERROR) /**< Secure Image ERROR ID */ +#define CY_SI_CHECKID(val) ((uint32_t)(val) & (CY_PDL_MODULE_ID_Msk << CY_PDL_MODULE_ID_Pos)) /**< Check ID macro */ + +/* +* Clock selection for Flash boot execution. +*/ +#define CY_SI_FLASHBOOT_CLK_25MHZ (0x00UL) /**< 25MHz clock selection for Flashboot */ +#define CY_SI_FLASHBOOT_CLK_8MHZ (0x01UL) /**< 8MHz clock selection for Flashboot */ +#define CY_SI_FLASHBOOT_CLK_50MHZ (0x02UL) /**< 50MHz clock selection for Flashboot */ + +/* +* Debugger wait window selection for Flash boot execution. +*/ +#define CY_SI_FLASHBOOT_WAIT_20MS (0x00UL) /**< 20ms debugger wait window for Flashboot */ +#define CY_SI_FLASHBOOT_WAIT_10MS (0x01UL) /**< 10ms debugger wait window for Flashboot */ +#define CY_SI_FLASHBOOT_WAIT_1MS (0x02UL) /**< 1ms debugger wait window for Flashboot */ +#define CY_SI_FLASHBOOT_WAIT_0MS (0x03UL) /**< 0ms debugger wait window for Flashboot */ +#define CY_SI_FLASHBOOT_WAIT_100MS (0x04UL) /**< 100ms debugger wait window for Flashboot */ + +/* +* Flash boot validation selection in chip NORMAL mode. +*/ +#define CY_SI_FLASHBOOT_VALIDATE_NO (0x00UL) /**< Do not validate app1 in NORMAL mode */ +#define CY_SI_FLASHBOOT_VALIDATE_YES (0x01UL) /**< Validate app1 in NORMAL mode */ + +/* +* Application format selection for secure boot. +*/ +#define CY_SI_APP_FORMAT_BASIC (0UL) /**< Basic application format (no header) */ +#define CY_SI_APP_FORMAT_CYPRESS (1UL) /**< Cypress application format (Cypress header) */ + + +/* +* Application type selection for secure boot. +*/ +#define CY_SI_APP_ID_FLASHBOOT (0x8001UL) /**< Flash boot ID Type */ +#define CY_SI_APP_ID_SECUREIMG (0x8002UL) /**< Secure image ID Type */ +#define CY_SI_APP_ID_BOOTLOADER (0x8003UL) /**< Bootloader ID Type */ + + +/*************************************** +* Constants +***************************************/ +#define CY_ARM_CM0P_CPUID (0xC6000000u) /** CM0+ partNo value from ARM CPUID[15:4] register shifted to [31:20] bits */ +#define CY_ARM_CM4_CPUID (0xC2400000u) /** CM4 partNo value from ARM CPUID[15:4] register shifted to [31:20] bits */ + +#define CY_SI_TOC_FLAGS_CLOCKS_MASK (0x00000003UL) /**< Mask for Flashboot clock selection */ +#define CY_SI_TOC_FLAGS_CLOCKS_POS (0UL) /**< Bit position of Flashboot clock selection */ +#define CY_SI_TOC_FLAGS_DELAY_MASK (0x0000001CUL) /**< Mask for Flashboot wait window selection */ +#define CY_SI_TOC_FLAGS_DELAY_POS (2UL) /**< Bit position of Flashboot wait window selection */ +#define CY_SI_TOC_FLAGS_APP_VERIFY_MASK (0x80000000UL) /**< Mask for Flashboot NORMAL mode app1 validation */ +#define CY_SI_TOC_FLAGS_APP_VERIFY_POS (31UL) /**< Bit position of Flashboot NORMAL mode app1 validation */ + +#define CY_SI_TOC2_MAGICNUMBER (0x01211220UL) /**< TOC2 identifier */ + +/*************************************** +* Structs +***************************************/ +/** Table of Content structure */ +typedef struct{ + volatile uint32_t objSize; /**< Object size (Bytes) */ + volatile uint32_t magicNum; /**< TOC ID (magic number) */ + volatile uint32_t userKeyAddr; /**< Secure key address in user Flash */ + volatile uint32_t smifCfgAddr; /**< SMIF configuration structure */ + volatile uint32_t appAddr1; /**< First user application object address */ + volatile uint32_t appFormat1; /**< First user application format */ + volatile uint32_t appAddr2; /**< Second user application object address */ + volatile uint32_t appFormat2; /**< Second user application format */ + volatile uint32_t shashObj; /**< Number of additional objects to be verified (S-HASH) */ + volatile uint32_t sigKeyAddr; /**< Signature verification key address */ + volatile uint32_t addObj[116]; /**< Additional objects to include in S-HASH */ + volatile uint32_t tocFlags; /**< Flags in TOC to control Flash boot options */ + volatile uint32_t crc; /**< CRC16-CCITT */ +}cy_stc_si_toc_t; + +/** User application header in Cypress format */ +typedef struct{ + volatile uint32_t objSize; /**< Object size (Bytes) */ + volatile uint32_t appId; /**< Application ID/version */ + volatile uint32_t appAttributes; /**< Attributes (reserved for future use) */ + volatile uint32_t numCores; /**< Number of cores */ + volatile uint32_t core0Vt; /**< (CM0+)VT offset - offset to the vector table from that entry */ + volatile uint32_t core1Vt; /**< (CM4)VT offset - offset to the vector table from that entry */ + volatile uint32_t core0Id; /**< CM0+ core ID */ + volatile uint32_t core1Id; /**< CM4 core ID */ +}cy_stc_user_appheader_t; + + +#if defined(__cplusplus) +} +#endif + +#endif /* _CY_SI_CONFIG_H_ */ + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/cy_si_keystorage.c b/2020TPCApp0.cydsn/cy_si_keystorage.c new file mode 100644 index 0000000..b88079d --- /dev/null +++ b/2020TPCApp0.cydsn/cy_si_keystorage.c @@ -0,0 +1,198 @@ +/***************************************************************************//** +* \file cy_si_keystorage.c +* \version 1.00 +* +* \brief +* Secure key storage for the secure image. +* +******************************************************************************** +* \copyright +* Copyright 2017-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "cy_si_keystorage.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/** Secure Key Storage (Note: Ensure that the alignment matches the Protection unit configuration) */ +CY_ALIGN(1024) __USED const uint8_t CySecureKeyStorage[CY_SI_SECURE_KEY_ARRAY_SIZE][CY_SI_SECURE_KEY_LENGTH] = { + {0x00u}, /* Insert user key #1 values */ + {0x00u}, /* Insert user key #2 values */ + {0x00u}, /* Insert user key #3 values */ + {0x00u} /* Insert user key #4 values */ +}; + +/** Public key in SFlash */ +CY_SECTION(".cy_sflash_public_key") __USED const cy_si_stc_public_key_t cy_publicKey = +{ + .objSize = sizeof(cy_si_stc_public_key_t), + .signatureScheme = CY_SI_PUBLIC_KEY_RSA_2048, + .publicKeyStruct = + { + .moduloAddr = (uint32_t)&(SFLASH->PUBLIC_KEY) + offsetof(cy_si_stc_public_key_t, moduloData), + .moduloSize = CY_SI_PUBLIC_KEY_SIZEOF_BYTE * CY_SI_PUBLIC_KEY_MODULOLENGTH, + .expAddr = (uint32_t)&(SFLASH->PUBLIC_KEY) + offsetof(cy_si_stc_public_key_t, expData), + .expSize = CY_SI_PUBLIC_KEY_SIZEOF_BYTE * CY_SI_PUBLIC_KEY_EXPLENGTH, + .barrettAddr = (uint32_t)&(SFLASH->PUBLIC_KEY) + offsetof(cy_si_stc_public_key_t, barrettData), + .inverseModuloAddr = (uint32_t)&(SFLASH->PUBLIC_KEY) + offsetof(cy_si_stc_public_key_t, inverseModuloData), + .rBarAddr = (uint32_t)&(SFLASH->PUBLIC_KEY) + offsetof(cy_si_stc_public_key_t, rBarData), + }, + /* Replace key data from this point */ + .moduloData = + { + 0x0Du, 0x10u, 0x58u, 0x3Fu, 0x4Fu, 0x25u, 0x70u, 0x63u, + 0x6Du, 0x3Bu, 0xE6u, 0x10u, 0x9Eu, 0x7Cu, 0x7Cu, 0x9Cu, + 0x02u, 0x8Bu, 0x43u, 0x07u, 0x61u, 0x91u, 0xF6u, 0xBFu, + 0x12u, 0x7Cu, 0x2Bu, 0xDAu, 0x45u, 0xD5u, 0x75u, 0xBEu, + 0xB5u, 0xF1u, 0xBDu, 0x36u, 0x3Au, 0xC1u, 0xD1u, 0x39u, + 0x20u, 0x11u, 0x99u, 0x22u, 0x2Fu, 0xE8u, 0xFEu, 0x98u, + 0xFBu, 0xCDu, 0x34u, 0xD4u, 0xE2u, 0x2Cu, 0xC5u, 0x7Cu, + 0xC5u, 0x50u, 0x62u, 0xFFu, 0xFDu, 0x61u, 0x14u, 0x90u, + 0xFAu, 0x43u, 0xBDu, 0xADu, 0xA3u, 0xD5u, 0x86u, 0x85u, + 0x4Du, 0xF1u, 0x24u, 0x62u, 0x5Au, 0xECu, 0x87u, 0x4Du, + 0xD0u, 0x18u, 0xB0u, 0xE1u, 0x4Fu, 0x40u, 0xDEu, 0x87u, + 0xBBu, 0x74u, 0xC5u, 0x5Du, 0x48u, 0x90u, 0x26u, 0x68u, + 0x5Cu, 0xECu, 0xC3u, 0x5Cu, 0xC7u, 0x03u, 0x8Au, 0x05u, + 0x2Eu, 0x37u, 0xB8u, 0xA0u, 0x05u, 0xC5u, 0x21u, 0x0Fu, + 0x76u, 0x9Cu, 0xEEu, 0x19u, 0x4Cu, 0x2Eu, 0x89u, 0xA2u, + 0x21u, 0x44u, 0x61u, 0x9Fu, 0x7Fu, 0xD2u, 0x51u, 0x72u, + 0xABu, 0x2Cu, 0xA5u, 0xC6u, 0x7Cu, 0x0Au, 0x9Bu, 0x06u, + 0x14u, 0xECu, 0x91u, 0x3Du, 0x5Eu, 0x08u, 0x71u, 0x6Au, + 0xFEu, 0xABu, 0x3Eu, 0x1Bu, 0x99u, 0x3Cu, 0xF0u, 0x12u, + 0x57u, 0x0Cu, 0xF2u, 0x42u, 0x78u, 0xA5u, 0x3Bu, 0xAAu, + 0x49u, 0x98u, 0x03u, 0x8Eu, 0x0Fu, 0x5Au, 0xC9u, 0xFCu, + 0x26u, 0xC9u, 0x93u, 0xB8u, 0xB8u, 0xEBu, 0x6Fu, 0xF1u, + 0x65u, 0x78u, 0x43u, 0x0Au, 0xE5u, 0xFBu, 0x2Bu, 0xCCu, + 0x8Bu, 0x2Cu, 0x31u, 0x0Du, 0xE1u, 0x49u, 0x06u, 0x25u, + 0xE3u, 0xFAu, 0x92u, 0x7Fu, 0xC7u, 0x96u, 0x35u, 0x17u, + 0x2Cu, 0xEEu, 0xEEu, 0x40u, 0xC1u, 0x18u, 0x1Cu, 0x5Cu, + 0x45u, 0x4Du, 0xE9u, 0xB5u, 0xFDu, 0x23u, 0x60u, 0x14u, + 0x5Fu, 0x78u, 0x88u, 0xB9u, 0x17u, 0xAAu, 0xD5u, 0xB4u, + 0x68u, 0xCCu, 0x5Cu, 0xE2u, 0x3Fu, 0xD7u, 0xD4u, 0x6Eu, + 0x29u, 0x2Au, 0xD7u, 0x6Fu, 0xE8u, 0x89u, 0xCBu, 0xE3u, + 0x97u, 0x54u, 0xBCu, 0x4Eu, 0x85u, 0xA7u, 0x63u, 0xAFu, + 0x8Au, 0xFDu, 0xB8u, 0xF2u, 0x8Bu, 0xA4u, 0x36u, 0xD4u, + }, + .expData = + { + 0x01u, 0x00u, 0x01u, 0x00u, + }, + .barrettData = + { + 0x44u, 0x94u, 0xA5u, 0xF4u, 0x4Fu, 0xCEu, 0x24u, 0xD0u, + 0x3Bu, 0xDCu, 0x6Eu, 0x1Cu, 0x72u, 0xE8u, 0x6Fu, 0x5Eu, + 0x32u, 0x38u, 0x0Bu, 0xEDu, 0x73u, 0x8Bu, 0x7Cu, 0x1Cu, + 0x8Au, 0x03u, 0x36u, 0x88u, 0xB0u, 0x20u, 0x7Au, 0x90u, + 0x7Bu, 0x0Du, 0x44u, 0xA2u, 0xF2u, 0x21u, 0x4Fu, 0xD9u, + 0xA3u, 0x31u, 0xD8u, 0x87u, 0xD6u, 0xC8u, 0x36u, 0x94u, + 0x9Eu, 0x32u, 0x01u, 0xD6u, 0x18u, 0x2Fu, 0x77u, 0x0Cu, + 0xD6u, 0xAAu, 0x9Bu, 0x15u, 0xD8u, 0x50u, 0x6Eu, 0x88u, + 0xD7u, 0x28u, 0x11u, 0x84u, 0xE3u, 0x7Au, 0x52u, 0x08u, + 0x12u, 0xB8u, 0x05u, 0xECu, 0x70u, 0x1Fu, 0xD7u, 0x0Au, + 0x53u, 0x18u, 0x62u, 0xEBu, 0x37u, 0x16u, 0x04u, 0x6Du, + 0x86u, 0x4Cu, 0x8Au, 0x1Au, 0x6Eu, 0xCEu, 0x5Au, 0xD4u, + 0x8Fu, 0x17u, 0xEBu, 0x20u, 0x03u, 0x36u, 0xACu, 0xDDu, + 0x74u, 0x16u, 0xB4u, 0xE7u, 0x40u, 0x81u, 0x82u, 0x7Bu, + 0x2Fu, 0x31u, 0x95u, 0x64u, 0xFDu, 0x6Eu, 0x75u, 0xB7u, + 0x8Bu, 0xC8u, 0x6Au, 0x5Au, 0x48u, 0x28u, 0x5Du, 0xAEu, + 0x0Au, 0x11u, 0x86u, 0xC0u, 0x5Au, 0x4Du, 0xDBu, 0x3Eu, + 0x85u, 0xCCu, 0xDFu, 0x0Bu, 0x0Eu, 0xCBu, 0x52u, 0xB7u, + 0x45u, 0xACu, 0x42u, 0xC2u, 0x39u, 0x1Fu, 0xE1u, 0x18u, + 0xFDu, 0x7Bu, 0x77u, 0x7Fu, 0xE9u, 0xFCu, 0x25u, 0x8Cu, + 0xB7u, 0x9Eu, 0x38u, 0x6Fu, 0x22u, 0xE6u, 0x6Du, 0xC5u, + 0xB8u, 0x79u, 0x15u, 0x0Fu, 0xD1u, 0xAFu, 0x3Du, 0xC2u, + 0xB1u, 0xD8u, 0x4Fu, 0x81u, 0x09u, 0xB7u, 0x02u, 0xF0u, + 0xCDu, 0x65u, 0xF9u, 0xDFu, 0x0Bu, 0x74u, 0x14u, 0xDEu, + 0x17u, 0xDDu, 0xE6u, 0x85u, 0x19u, 0x7Eu, 0x49u, 0x2Fu, + 0x82u, 0xBAu, 0x73u, 0x1Du, 0x44u, 0x84u, 0x4Du, 0x5Cu, + 0x5Fu, 0x5Bu, 0x6Du, 0x78u, 0x73u, 0xA3u, 0x6Fu, 0x07u, + 0x76u, 0xF3u, 0xCDu, 0x52u, 0xE3u, 0xC3u, 0x89u, 0xE8u, + 0xA6u, 0x8Au, 0xFAu, 0xF5u, 0x21u, 0xC3u, 0x25u, 0x16u, + 0xD5u, 0x10u, 0xFDu, 0x30u, 0x5Du, 0xC5u, 0xB9u, 0xCAu, + 0x2Bu, 0x5Au, 0x92u, 0xEDu, 0xE5u, 0xF4u, 0x3Bu, 0xBFu, + 0x08u, 0x06u, 0x8Au, 0x75u, 0x88u, 0x36u, 0xD2u, 0x34u, + 0x01u, 0x00u, 0x00u, 0x00u, + }, + .inverseModuloData = + { + 0x3Bu, 0x41u, 0xE5u, 0xABu, 0xC8u, 0x05u, 0x56u, 0xBFu, + 0xF8u, 0xF5u, 0xE6u, 0x9Au, 0x46u, 0xF3u, 0x01u, 0x17u, + 0xBEu, 0x0Eu, 0x81u, 0x9Bu, 0x54u, 0x2Fu, 0x2Eu, 0x3Du, + 0xCBu, 0xA6u, 0xC3u, 0x35u, 0x02u, 0x18u, 0x38u, 0x1Au, + 0x38u, 0x15u, 0x54u, 0x0Eu, 0xA4u, 0xCDu, 0xD1u, 0xEDu, + 0x10u, 0x8Eu, 0x6Eu, 0xB9u, 0xCDu, 0x2Fu, 0x8Cu, 0xD6u, + 0x56u, 0x95u, 0xE8u, 0x14u, 0x79u, 0xC6u, 0x32u, 0x02u, + 0xA6u, 0x03u, 0xA1u, 0x8Du, 0x26u, 0x47u, 0xA1u, 0x99u, + 0x96u, 0xECu, 0xA3u, 0x77u, 0x22u, 0xEAu, 0x25u, 0x72u, + 0xBCu, 0xB8u, 0x77u, 0xE9u, 0x11u, 0x78u, 0x8Cu, 0x55u, + 0xB9u, 0x8Eu, 0x90u, 0x19u, 0x3Cu, 0xFFu, 0x9Fu, 0x40u, + 0x46u, 0x6Du, 0x51u, 0x22u, 0x21u, 0x15u, 0x5Cu, 0x4Fu, + 0xCAu, 0x15u, 0xB0u, 0xE8u, 0x67u, 0x0Au, 0x2Cu, 0x4Au, + 0xB1u, 0x77u, 0xFAu, 0xE6u, 0x3Cu, 0xA6u, 0x02u, 0x2Fu, + 0x16u, 0x96u, 0xE3u, 0xADu, 0x29u, 0x83u, 0x4Au, 0x88u, + 0xB1u, 0x6Bu, 0x13u, 0x38u, 0xA4u, 0xB0u, 0xE8u, 0xA6u, + 0xDBu, 0xA5u, 0xFBu, 0x36u, 0x7Au, 0x10u, 0xB1u, 0x75u, + 0x93u, 0x00u, 0xECu, 0x2Bu, 0x1Du, 0x86u, 0xE0u, 0x4Fu, + 0x85u, 0xC8u, 0x70u, 0x23u, 0xEBu, 0x96u, 0x87u, 0x70u, + 0x39u, 0x58u, 0x2Du, 0xAEu, 0xC3u, 0xC9u, 0xB6u, 0xFDu, + 0x27u, 0xEEu, 0x5Fu, 0x14u, 0x4Du, 0xB6u, 0xFAu, 0x55u, + 0xC3u, 0x2Cu, 0xFAu, 0x2Au, 0x60u, 0x67u, 0x37u, 0xBAu, + 0xB3u, 0xA0u, 0x17u, 0x9Du, 0x5Cu, 0xDCu, 0x0Au, 0x82u, + 0xFEu, 0x0Eu, 0xC9u, 0xE7u, 0x36u, 0x09u, 0x38u, 0xF3u, + 0xA7u, 0x83u, 0x9Au, 0x71u, 0xD2u, 0x07u, 0x2Bu, 0x4Fu, + 0x4Eu, 0xABu, 0x49u, 0xE8u, 0x0Eu, 0xE0u, 0x1Cu, 0x48u, + 0x73u, 0x87u, 0x62u, 0xC9u, 0x95u, 0x17u, 0xCCu, 0xE6u, + 0xECu, 0x34u, 0x18u, 0xE0u, 0xF0u, 0xCFu, 0x64u, 0x48u, + 0xD9u, 0x92u, 0x1Au, 0x82u, 0x21u, 0x68u, 0xBCu, 0x70u, + 0x31u, 0xA3u, 0xE0u, 0xC9u, 0xAEu, 0xC8u, 0x94u, 0x83u, + 0x4Du, 0x95u, 0x3Bu, 0x4Cu, 0x65u, 0x8Eu, 0xC7u, 0x46u, + 0x91u, 0x3Cu, 0xF4u, 0xD1u, 0x0Bu, 0xA5u, 0x64u, 0x13u, + }, + .rBarData = + { + 0xF3u, 0xEFu, 0xA7u, 0xC0u, 0xB0u, 0xDAu, 0x8Fu, 0x9Cu, + 0x92u, 0xC4u, 0x19u, 0xEFu, 0x61u, 0x83u, 0x83u, 0x63u, + 0xFDu, 0x74u, 0xBCu, 0xF8u, 0x9Eu, 0x6Eu, 0x09u, 0x40u, + 0xEDu, 0x83u, 0xD4u, 0x25u, 0xBAu, 0x2Au, 0x8Au, 0x41u, + 0x4Au, 0x0Eu, 0x42u, 0xC9u, 0xC5u, 0x3Eu, 0x2Eu, 0xC6u, + 0xDFu, 0xEEu, 0x66u, 0xDDu, 0xD0u, 0x17u, 0x01u, 0x67u, + 0x04u, 0x32u, 0xCBu, 0x2Bu, 0x1Du, 0xD3u, 0x3Au, 0x83u, + 0x3Au, 0xAFu, 0x9Du, 0x00u, 0x02u, 0x9Eu, 0xEBu, 0x6Fu, + 0x05u, 0xBCu, 0x42u, 0x52u, 0x5Cu, 0x2Au, 0x79u, 0x7Au, + 0xB2u, 0x0Eu, 0xDBu, 0x9Du, 0xA5u, 0x13u, 0x78u, 0xB2u, + 0x2Fu, 0xE7u, 0x4Fu, 0x1Eu, 0xB0u, 0xBFu, 0x21u, 0x78u, + 0x44u, 0x8Bu, 0x3Au, 0xA2u, 0xB7u, 0x6Fu, 0xD9u, 0x97u, + 0xA3u, 0x13u, 0x3Cu, 0xA3u, 0x38u, 0xFCu, 0x75u, 0xFAu, + 0xD1u, 0xC8u, 0x47u, 0x5Fu, 0xFAu, 0x3Au, 0xDEu, 0xF0u, + 0x89u, 0x63u, 0x11u, 0xE6u, 0xB3u, 0xD1u, 0x76u, 0x5Du, + 0xDEu, 0xBBu, 0x9Eu, 0x60u, 0x80u, 0x2Du, 0xAEu, 0x8Du, + 0x54u, 0xD3u, 0x5Au, 0x39u, 0x83u, 0xF5u, 0x64u, 0xF9u, + 0xEBu, 0x13u, 0x6Eu, 0xC2u, 0xA1u, 0xF7u, 0x8Eu, 0x95u, + 0x01u, 0x54u, 0xC1u, 0xE4u, 0x66u, 0xC3u, 0x0Fu, 0xEDu, + 0xA8u, 0xF3u, 0x0Du, 0xBDu, 0x87u, 0x5Au, 0xC4u, 0x55u, + 0xB6u, 0x67u, 0xFCu, 0x71u, 0xF0u, 0xA5u, 0x36u, 0x03u, + 0xD9u, 0x36u, 0x6Cu, 0x47u, 0x47u, 0x14u, 0x90u, 0x0Eu, + 0x9Au, 0x87u, 0xBCu, 0xF5u, 0x1Au, 0x04u, 0xD4u, 0x33u, + 0x74u, 0xD3u, 0xCEu, 0xF2u, 0x1Eu, 0xB6u, 0xF9u, 0xDAu, + 0x1Cu, 0x05u, 0x6Du, 0x80u, 0x38u, 0x69u, 0xCAu, 0xE8u, + 0xD3u, 0x11u, 0x11u, 0xBFu, 0x3Eu, 0xE7u, 0xE3u, 0xA3u, + 0xBAu, 0xB2u, 0x16u, 0x4Au, 0x02u, 0xDCu, 0x9Fu, 0xEBu, + 0xA0u, 0x87u, 0x77u, 0x46u, 0xE8u, 0x55u, 0x2Au, 0x4Bu, + 0x97u, 0x33u, 0xA3u, 0x1Du, 0xC0u, 0x28u, 0x2Bu, 0x91u, + 0xD6u, 0xD5u, 0x28u, 0x90u, 0x17u, 0x76u, 0x34u, 0x1Cu, + 0x68u, 0xABu, 0x43u, 0xB1u, 0x7Au, 0x58u, 0x9Cu, 0x50u, + 0x75u, 0x02u, 0x47u, 0x0Du, 0x74u, 0x5Bu, 0xC9u, 0x2Bu, + }, + /* End of key data */ +}; + +#if defined(__cplusplus) +} +#endif + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/cy_si_keystorage.h b/2020TPCApp0.cydsn/cy_si_keystorage.h new file mode 100644 index 0000000..7a0496f --- /dev/null +++ b/2020TPCApp0.cydsn/cy_si_keystorage.h @@ -0,0 +1,110 @@ +/***************************************************************************//** +* \file cy_si_keystorage.h +* \version 1.00 +* +* \brief +* Secure key storage header for the secure image. +* +******************************************************************************** +* \copyright +* Copyright 2017-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CY_KEY_STORAGE_H_ +#define _CY_KEY_STORAGE_H_ + +#include +#include +#include "syslib/cy_syslib.h" + +#if defined(__cplusplus) +extern "C" { +#endif + +/*************************************** +* Macros +***************************************/ + +/** \addtogroup group_secure_image_macro +* \{ +*/ + +/** \defgroup group_secure_image_userkey_macros User Key Macros +* Macros used to define the user-defined key array. +* \{ +*/ +#define CY_SI_SECURE_KEY_LENGTH (256u) /**< Key length (Bytes) */ +#define CY_SI_SECURE_KEY_ARRAY_SIZE (4u) /**< Number of Keys */ +/** \} group_secure_image_userkey_macros */ + +/** \defgroup group_secure_image_pubkey_macros Public Key Macros +* Macros used to define the Public key. +* \{ +*/ +#define CY_SI_PUBLIC_KEY_RSA_2048 (0UL) /**< RSASSA-PKCS1-v1_5-2048 signature scheme */ +#define CY_SI_PUBLIC_KEY_RSA_1024 (1UL) /**< RSASSA-PKCS1-v1_5-1024 signature scheme */ +#define CY_SI_PUBLIC_KEY_STRUCT_OFFSET (8UL) /**< Offset to public key struct in number of bytes */ +#define CY_SI_PUBLIC_KEY_MODULOLENGTH (256UL) /**< Modulus length of the RSA key */ +#define CY_SI_PUBLIC_KEY_EXPLENGTH (32UL) /**< Exponent length of the RSA key */ +#define CY_SI_PUBLIC_KEY_SIZEOF_BYTE (8UL) /**< Size of Byte in number of bits */ +/** \} group_secure_image_pubkey_macros */ + +/** \} group_secure_image_macro */ + + +/*************************************** +* Structs +***************************************/ + +/** +* \addtogroup group_secure_image_data_structures +* \{ +*/ + +/** Public key definition structure as expected by the Crypto driver */ +typedef struct +{ + uint32_t moduloAddr; /**< Address of the public key modulus */ + uint32_t moduloSize; /**< Size (bits) of the modulus part of the public key */ + uint32_t expAddr; /**< Address of the public key exponent */ + uint32_t expSize; /**< Size (bits) of the exponent part of the public key */ + uint32_t barrettAddr; /**< Address of the Barret coefficient */ + uint32_t inverseModuloAddr; /**< Address of the binary inverse modulo */ + uint32_t rBarAddr; /**< Address of the (2^moduloLength mod modulo) */ +} cy_si_stc_crypto_public_key_t; + +/** Public key structure */ +typedef struct +{ + uint32_t objSize; /**< Public key Object size */ + uint32_t signatureScheme; /**< Signature scheme */ + cy_si_stc_crypto_public_key_t publicKeyStruct; /**< Public key definition struct */ + uint8_t moduloData[CY_SI_PUBLIC_KEY_MODULOLENGTH]; /**< Modulo data */ + uint8_t expData[CY_SI_PUBLIC_KEY_EXPLENGTH]; /**< Exponent data */ + uint8_t barrettData[CY_SI_PUBLIC_KEY_MODULOLENGTH + 4UL]; /**< Barret coefficient data */ + uint8_t inverseModuloData[CY_SI_PUBLIC_KEY_MODULOLENGTH]; /**< Binary inverse modulo data */ + uint8_t rBarData[CY_SI_PUBLIC_KEY_MODULOLENGTH]; /**< 2^moduloLength mod modulo data */ +} cy_si_stc_public_key_t; + +/** \} group_secure_image_data_structures */ + + +/*************************************** +* Globals +***************************************/ +/** Secure Key Storage (Note: Ensure that the alignment matches the Protection unit configuration) */ +extern const uint8_t CySecureKeyStorage[CY_SI_SECURE_KEY_ARRAY_SIZE][CY_SI_SECURE_KEY_LENGTH]; + +/** Public key in SFlash */ +extern const cy_si_stc_public_key_t cy_publicKey; + +#if defined(__cplusplus) +} +#endif + +#endif + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/debug.c b/2020TPCApp0.cydsn/debug.c new file mode 100644 index 0000000..1ae42b1 --- /dev/null +++ b/2020TPCApp0.cydsn/debug.c @@ -0,0 +1,162 @@ +/******************************************************************************* +* File Name: debug.c +* +* Version: 1.0 +* +* Description: +* This file contains functions for printf functionality +* and LED status notification. +* +* Hardware Dependency: +* CY8CKIT-062 PSoC6 BLE Pioneer Kit +* +******************************************************************************** +* Copyright 2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "project.h" +#include "debug.h" + + +#if (DEBUG_UART_ENABLED == ENABLED) + +#if defined(__ARMCC_VERSION) + +/* For MDK/RVDS compiler revise fputc function for printf functionality */ +struct __FILE +{ + int handle; +}; + +enum +{ + STDIN_HANDLE, + STDOUT_HANDLE, + STDERR_HANDLE +}; + +FILE __stdin = {STDIN_HANDLE}; +FILE __stdout = {STDOUT_HANDLE}; +FILE __stderr = {STDERR_HANDLE}; + +int fputc(int ch, FILE *file) +{ + int ret = EOF; + + switch( file->handle ) + { + case STDOUT_HANDLE: + UART_DEB_PUT_CHAR(ch); + ret = ch ; + break ; + + case STDERR_HANDLE: + ret = ch ; + break ; + + default: + file = file; + break ; + } + return ret ; +} + +#elif defined (__ICCARM__) /* IAR */ + +/* For IAR compiler revise __write() function for printf functionality */ +size_t __write(int handle, const unsigned char * buffer, size_t size) +{ + size_t nChars = 0; + (void) handle; + + if (buffer == 0) + { + /* + * This means that we should flush internal buffers. Since we + * don't we just return. (Remember, "handle" == -1 means that all + * handles should be flushed.) + */ + return (0); + } + + for (/* Empty */; size != 0; --size) + { + UART_DEB_PUT_CHAR(*buffer); + ++buffer; + ++nChars; + } + + return (nChars); +} + +#else /* (__GNUC__) GCC */ + +/* For GCC compiler revise _write() function for printf functionality */ +int _write(int file, char *ptr, int len) +{ + int i; + file = file; + for (i = 0; i < len; i++) + { + UART_DEB_PUT_CHAR(*ptr); + ++ptr; + } + return len; +} + + +#endif /* (__ARMCC_VERSION) */ + +#endif /* DEBUG_UART_ENABLED == ENABLED */ + +#if (DEBUG_LED_ENABLED == ENABLED) + +void InitLED(void) +{ + #if CYDEV_VDD_MV >= RGB_LED_MIN_VOLTAGE_MV + Cy_GPIO_SetDrivemode(PIN_LED_RED_0_PORT, PIN_LED_RED_0_NUM, CY_GPIO_DM_STRONG_IN_OFF); + Cy_GPIO_Write(PIN_LED_RED_0_PORT, PIN_LED_RED_0_NUM, LED_OFF); + Cy_GPIO_SetDrivemode(PIN_LED_GREEN_0_PORT, PIN_LED_GREEN_0_NUM, CY_GPIO_DM_STRONG_IN_OFF); + Cy_GPIO_Write(PIN_LED_GREEN_0_PORT, PIN_LED_GREEN_0_NUM, LED_OFF); + #else + Cy_GPIO_SetDrivemode(PIN_LED_RED_0_PORT, PIN_LED_RED_0_NUM, CY_GPIO_DM_STRONG_IN_OFF); + Cy_GPIO_Write(PIN_LED_RED_0_PORT, PIN_LED_RED_0_NUM, LED_OFF); + #endif +} + +void HibernateLED(void) +{ + #if CYDEV_VDD_MV >= RGB_LED_MIN_VOLTAGE_MV + Cy_GPIO_Write(PIN_LED_RED_0_PORT, PIN_LED_RED_0_NUM, LED_ON); + Cy_GPIO_Write(PIN_LED_GREEN_0_PORT, PIN_LED_GREEN_0_NUM, LED_OFF); + #else + Cy_GPIO_Write(PIN_LED_RED_0_PORT, PIN_LED_RED_0_NUM, LED_ON); + #endif +} + +void BlinkLED(void) +{ + #if CYDEV_VDD_MV >= RGB_LED_MIN_VOLTAGE_MV + Cy_GPIO_Inv(PIN_LED_RED_0_PORT, PIN_LED_RED_0_NUM); + Cy_GPIO_Inv(PIN_LED_GREEN_0_PORT, PIN_LED_GREEN_0_NUM); + #else + Cy_GPIO_Inv(PIN_LED_RED_0_PORT, PIN_LED_RED_0_NUM); + #endif +} + +void ConnectedLED(void) +{ + #if CYDEV_VDD_MV >= RGB_LED_MIN_VOLTAGE_MV + Cy_GPIO_Write(PIN_LED_RED_0_PORT, PIN_LED_RED_0_NUM, LED_OFF); + Cy_GPIO_Write(PIN_LED_GREEN_0_PORT, PIN_LED_GREEN_0_NUM, LED_OFF); + #else + Cy_GPIO_Write(PIN_LED_RED_0_PORT, PIN_LED_RED_0_NUM, LED_OFF); + #endif +} + +#endif /* DEBUG_LED == ENABLED */ + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/debug.h b/2020TPCApp0.cydsn/debug.h new file mode 100644 index 0000000..5637adb --- /dev/null +++ b/2020TPCApp0.cydsn/debug.h @@ -0,0 +1,82 @@ +/***************************************************************************//** +* \file debug.h +* +* \version 1.0 +* +* Contains the function prototypes and constants for the UART debugging +* and LED status notification. +* +******************************************************************************** +* Copyright 2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include +#include "project.h" + +#define ENABLED (1u) +#define DISABLED (0u) + +/*************************************** +* Conditional Compilation Parameters +***************************************/ +#define DEBUG_UART_ENABLED ENABLED +#define DEBUG_LED_ENABLED ENABLED + +/*************************************** +* API Constants +***************************************/ +#define LED_ON (0u) +#define LED_OFF (1u) +#define RGB_LED_MIN_VOLTAGE_MV (2700u) +#define ADV_TIMER_TIMEOUT (1u) + +/*************************************** +* External Function Prototypes +***************************************/ +#if (DEBUG_LED_ENABLED) + +void InitLED(void); +void HibernateLED(void); +void BlinkLED(void); +void ConnectedLED(void); + +#else + +#define InitLED() +#define HibernateLED() +#define BlinkLED() +#define ConnectedLED() + +#endif +/*************************************** +* Macros +***************************************/ +#if (DEBUG_UART_ENABLED == ENABLED) + #define DBG_PRINTF(...) (printf(__VA_ARGS__)) + #define UART_DEB_PUT_CHAR(ch) while(0UL == UART_DEB_Put(ch)) + + __STATIC_INLINE char8 UART_DEB_GET_CHAR(void) + { + uint32 rec; + rec = UART_DEB_Get(); + return((rec == CY_SCB_UART_RX_NO_DATA) ? 0u : (char8)(rec & 0xff)); + } + + #define UART_DEB_GET_TX_BUFF_SIZE() ( UART_DEB_GetNumInTxFifo() ) + #define UART_START() ( UART_DEB_Start() ) +#else + #define DBG_PRINTF(...) + #define UART_DEB_PUT_CHAR(ch) + #define UART_DEB_GET_CHAR(ch) (0u) + #ifndef UART_DEB_GET_TX_FIFO_SR_VALID + #define UART_DEB_GET_TX_FIFO_SR_VALID (0u) + #endif + #define UART_DEB_GET_TX_BUFF_SIZE(...) (0u) + #define UART_START() +#endif /* (DEBUG_UART_ENABLED == ENABLED) */ + + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/dfu_cm0p.icf b/2020TPCApp0.cydsn/dfu_cm0p.icf new file mode 100644 index 0000000..2495c11 --- /dev/null +++ b/2020TPCApp0.cydsn/dfu_cm0p.icf @@ -0,0 +1,251 @@ +/***************************************************************************//** +* \file dfu_cm0p.icf +* \version 3.0 +* +* The linker file for the the IAR compiler. +* +* \note The entry point is fixed and starts at 0x10000000. The valid application +* image should be placed there. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case, you may see warnings during the +* build process. In your project, you can simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ + + +/******************************************************************************* +* Start of CM4 and CM0+ linker script common region +*******************************************************************************/ + +/*-Memory Regions-*/ +/* Flash */ +define exported symbol __cy_memory_0_start = 0x10000000; +define exported symbol __cy_memory_0_length = 0x00100000; +define exported symbol __cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +define exported symbol __cy_memory_1_start = 0x14000000; +define exported symbol __cy_memory_1_length = 0x8000; +define exported symbol __cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +define exported symbol __cy_memory_2_start = 0x16000000; +define exported symbol __cy_memory_2_length = 0x8000; +define exported symbol __cy_memory_2_row_size = 0x200; + +/* XIP */ +define exported symbol __cy_memory_3_start = 0x18000000; +define exported symbol __cy_memory_3_length = 0x08000000; +define exported symbol __cy_memory_3_row_size = 0x200; + +/* eFuse */ +define exported symbol __cy_memory_4_start = 0x90700000; +define exported symbol __cy_memory_4_length = 0x100000; +define exported symbol __cy_memory_4_row_size = 1; + + +define memory mem with size = 4G; + +/* Memory regions for all applications are defined here */ +define region FLASH_app0_core0 = mem:[from 0x10000000 size 0x10000]; +define region FLASH_app0_core1 = mem:[from 0x10010000 size 0x10000]; +define region FLASH_app1_core0 = mem:[from 0x10040000 size 0x10000]; +define region FLASH_app1_core1 = mem:[from 0x10050000 size 0x10000]; + +/* +* The region for DFU SDK metadata +* when it is outside of any application +*/ +define region FLASH_boot_meta = mem:[from 0x100FFA00 size 0x200]; + + +/* eFuse */ +define region ROM_EFUSE = mem:[from 0x90700000 size 0x100000]; + +/* SFlash NAR */ +define region SFLASH_NAR = mem:[from 0x16001A00 size 0x200]; + +/* SFlash User Data */ +define region SFLASH_USER_DATA = mem:[from 0x16000800 size 0x800]; + +/* SFlash Public Key, 6 SFlash rows */ +define region SFLASH_PUBLIC_KEY = mem:[from 0x16005A00 size 0xC00]; + +/* Table of Content part 2, two SFlash rows */ +define region SFLASH_TOC = mem:[from 0x16007C00 size 0x400]; + + +/* Emulated EEPROM app regions */ +define region EM_EEPROM_app0_core0 = mem:[from 0x14000000 size 0x8000]; +define region EM_EEPROM_app0_core1 = mem:[from 0x14000000 size 0x8000]; +define region EM_EEPROM_app1_core0 = mem:[from 0x14000000 size 0x8000]; +define region EM_EEPROM_app1_core1 = mem:[from 0x14000000 size 0x8000]; + +/* XIP/SMIF app regions */ +define region EROM_app0_core0 = mem:[from 0x18000000 size 0x1000]; +define region EROM_app0_core1 = mem:[from 0x18000000 size 0x1000]; +define region EROM_app1_core0 = mem:[from 0x18000000 size 0x1000]; +define region EROM_app1_core1 = mem:[from 0x18000000 size 0x1000]; + +/* used for RAM sharing across applications */ +define region IRAM_common = mem:[from 0x08000000 size 0x0100]; + +/* note: all the IRAM_appX_core0 regions has to be 0x100 aligned */ +/* and the IRAM_appX_core1 regions has to be 0x400 aligned */ +/* as they contain Interrupt Vector Table Remapped at the start */ +define region IRAM_app0_core0 = mem:[from 0x08000100 size 0x1F00]; +define region IRAM_app0_core1 = mem:[from 0x08002000 size 0x8000]; +define region IRAM_app1_core0 = mem:[from 0x08000100 size 0x1F00]; +define region IRAM_app1_core1 = mem:[from 0x08002000 size 0x8000]; + + +/* Used by all DFU SDK and CyMCUElfTool */ +define exported symbol __cy_boot_metadata_addr = 0x100FFA00; +define exported symbol __cy_boot_metadata_length = __cy_memory_0_row_size; + +/* Used by CyMCUElfTool to generate ProductID for DFU SDK apps */ +define exported symbol __cy_product_id = 0x01020304; + +/* Used by CyMCUElfTool to generate ChecksumType for DFU SDK apps */ +define exported symbol __cy_checksum_type = 0; + +/* +* The size of the application signature. +* E.g. 4 for CRC-32, +* 32 for SHA256, +* 256 for RSA 2048. +*/ +define exported symbol __cy_boot_signature_size = 4; + +/* Used by DFU SDK projects, in dfu_user.c to fill in the metadata table */ +define exported symbol __cy_app0_verify_start = start(FLASH_app0_core0); +define exported symbol __cy_app0_verify_length = size (FLASH_app0_core0) + size (FLASH_app0_core1) + - __cy_boot_signature_size; + +define exported symbol __cy_app1_verify_start = start(FLASH_app1_core0); +define exported symbol __cy_app1_verify_length = size (FLASH_app1_core0) + size (FLASH_app1_core1) + - __cy_boot_signature_size; + +/******************************************************************************* +* End of CM4 and CM0+ linker script common region +*******************************************************************************/ + + +/* +* Used by CM0+ to start the CM4 core in DFU SDK applications. +* Make sure the correct app no. is entered here. +*/ +define exported symbol __cy_app_core1_start_addr = start(FLASH_app0_core1); + +/* CyMCUElfTool uses this symbol to set a proper app number */ +define exported symbol __cy_app_id = 0; + +/* CyMCUElfTool uses these to generate an application signature */ +/* The size of the default signature (CRC-32C) is 4 bytes */ +define exported symbol __cy_app_verify_start = start(FLASH_app0_core0); +define exported symbol __cy_app_verify_length = size(FLASH_app0_core0) + size(FLASH_app0_core1) + - __cy_boot_signature_size; + + +/*-Sizes-*/ +if (!isdefinedsymbol(__STACK_SIZE)) { + define symbol __ICFEDIT_size_cstack__ = 0x1000; +} else { + define symbol __ICFEDIT_size_cstack__ = __STACK_SIZE; +} +define symbol __ICFEDIT_size_proc_stack__ = 0x0; +if (!isdefinedsymbol(__HEAP_SIZE)) { + define symbol __ICFEDIT_size_heap__ = 0x0400; +} else { + define symbol __ICFEDIT_size_heap__ = __HEAP_SIZE; +} + + +define region IROM1_region = FLASH_app0_core0; /* Flash, user app */ +define region IROM2_region = EM_EEPROM_app0_core0; /* Emulated EEPROM */ +define region IROM3_region = SFLASH_USER_DATA; /* SFlash User Data */ +define region IROM4_region = SFLASH_NAR; /* SFlash NAR */ +define region IROM5_region = SFLASH_PUBLIC_KEY; /* SFlash Public Key */ +define region IROM6_region = SFLASH_TOC; /* SFlash TOC part 2 */ +define region IROM7_region = ROM_EFUSE; /* eFuse */ +define region EROM1_region = EROM_app0_core0; /* XIP / SMIF */ +define region IRAM1_region = IRAM_app0_core0; /* RAM */ + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; +define block HSTACK {block HEAP, block PROC_STACK, last block CSTACK}; +define block RO {first section .intvec, readonly}; + +/*-Initializations-*/ +initialize by copy { readwrite }; +do not initialize { section .noinit, section .intvec_ram, + section .cy_boot_noinit.appId, section .cy_boot_noinit }; + + +/*-Placement-*/ + +/* Flash */ +".cy_app_header" : place at start of IROM1_region { section .cy_app_header }; +place in IROM1_region { block RO }; + +/* Emulated EEPROM Flash area */ +".cy_em_eeprom" : place at start of IROM2_region { section .cy_em_eeprom }; + +/* Supervisory Flash - User Data */ +".cy_sflash_user_data" : place at start of IROM3_region { section .cy_sflash_user_data }; + +/* Supervisory Flash - NAR */ +".cy_sflash_nar" : place at start of IROM4_region { section .cy_sflash_nar }; + +/* Supervisory Flash - Public Key */ +".cy_sflash_public_key" : place at start of IROM5_region { section .cy_sflash_public_key }; + +/* Supervisory Flash - TOC2 */ +".cy_toc_part2" : place at start of IROM6_region { section .cy_toc_part2 }; + +/* eFuse */ +".cy_efuse" : place at start of IROM7_region { section .cy_efuse }; + +/* Execute in Place (XIP). See the smif driver documentation for details. */ +".cy_xip" : place at start of EROM1_region { section .cy_xip }; + +/* RAM */ +place at start of IRAM_common { readwrite section .cy_boot_noinit.appId }; +place in IRAM_common { readwrite section .cy_boot_noinit }; +place at start of IRAM1_region { readwrite section .intvec_ram}; +place in IRAM1_region { readwrite }; +place at end of IRAM1_region { block HSTACK }; + +/* These sections are used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. */ +".cymeta" : place at address mem : 0x90500000 { readonly section .cymeta }; + + +keep { section .cy_app_header, + section .cy_em_eeprom, + section .cy_sflash_user_data, + section .cy_sflash_nar, + section .cy_sflash_public_key, + section .cy_sflash_toc_2, + section .cy_efuse, + section .cy_xip, + section .cymeta, + section .cy_boot_noinit, + section .cy_boot_noinit.appId, + }; + + + +/* EOF */ diff --git a/2020TPCApp0.cydsn/dfu_cm0p.ld b/2020TPCApp0.cydsn/dfu_cm0p.ld new file mode 100644 index 0000000..585816c --- /dev/null +++ b/2020TPCApp0.cydsn/dfu_cm0p.ld @@ -0,0 +1,479 @@ +/***************************************************************************//** +* \file dfu_cm0p.ld +* \version 3.0 +* +* The linker file for the GNU C compiler. +* Used for DFU SDK core0 firmware projects. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case, you may see warnings during the +* build process. In your project, simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +SEARCH_DIR(.) +GROUP(-lgcc -lc -lnosys) +ENTRY(Reset_Handler) + + +/* +* Forces symbol to be added to the output file. +* Otherwise linker may remove it if founds that it is not used in the project. +* This command has the same effect as the -u command-line option. +*/ +EXTERN(Reset_Handler) + + +/******************************************************************************* +* Start of CM4 and CM0+ linker script common region +*******************************************************************************/ + +/* +* Memory regions, for each application and MCU core. +*/ +MEMORY +{ + flash_app0_core0 (rx) : ORIGIN = 0x10000000, LENGTH = 0x10000 + flash_app0_core1 (rx) : ORIGIN = 0x10010000, LENGTH = 0x30000 + flash_app1_core0 (rx) : ORIGIN = 0x10040000, LENGTH = 0x30000 + flash_app1_core1 (rx) : ORIGIN = 0x10070000, LENGTH = 0x50000 + + flash_storage (rw) : ORIGIN = 0x100D0000, LENGTH = 0x1000 + flash_boot_meta (rw) : ORIGIN = 0x100FFA00, LENGTH = 0x400 + + sflash_user_data (rx) : ORIGIN = 0x16000800, LENGTH = 0x800 + sflash_nar (rx) : ORIGIN = 0x16001A00, LENGTH = 0x200 + sflash_public_key (rx) : ORIGIN = 0x16005A00, LENGTH = 0xC00 + sflash_toc_2 (rx) : ORIGIN = 0x16007C00, LENGTH = 0x400 + + efuse (r) : ORIGIN = 0x90700000, LENGTH = 0x100000 + + ram_common (rwx) : ORIGIN = 0x08000000, LENGTH = 0x0100 + + /* note: all the ram_appX_core0 regions has to be 0x100 aligned */ + /* and the ram_appX_core1 regions has to be 0x400 aligned */ + /* as they contain Interrupt Vector Table Remapped at the start */ + ram_app0_core0 (rwx) : ORIGIN = 0x08000100, LENGTH = 0x7F00 + ram_app0_core1 (rwx) : ORIGIN = 0x08008000, LENGTH = 0x8000 + + ram_app1_core0 (rwx) : ORIGIN = 0x08000100, LENGTH = 0x7F00 + ram_app1_core1 (rwx) : ORIGIN = 0x08008000, LENGTH = 0x30000 + + em_eeprom (rx) : ORIGIN = 0x14000000, LENGTH = 0x8000 + xip (rx) : ORIGIN = 0x18000000, LENGTH = 0x08000000 +} + +/* Regions parameters */ +/* Flash */ +__cy_memory_0_start = 0x10000000; +__cy_memory_0_length = 0x00100000; +__cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +__cy_memory_1_start = 0x14000000; +__cy_memory_1_length = 0x8000; +__cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +__cy_memory_2_start = 0x16000000; +__cy_memory_2_length = 0x8000; +__cy_memory_2_row_size = 0x200; + +/* XIP */ +__cy_memory_3_start = 0x18000000; +__cy_memory_3_length = 0x08000000; +__cy_memory_3_row_size = 0x200; + +/* eFuse */ +__cy_memory_4_start = 0x90700000; +__cy_memory_4_length = 0x100000; +__cy_memory_4_row_size = 1; + +/* The DFU SDK metadata limits */ +__cy_boot_metadata_addr = ORIGIN(flash_boot_meta); +__cy_boot_metadata_length = __cy_memory_0_row_size; + +/* The Product ID, used by CyMCUElfTool to generate a updating file */ +__cy_product_id = 0x01020304; + +/* The checksum type used by CyMCUElfTool to generate a updating file */ +__cy_checksum_type = 0x00; + +/* Used by the DFU SDK application to set the metadata */ +__cy_app0_verify_start = ORIGIN(flash_app0_core0); +__cy_app0_verify_length = LENGTH(flash_app0_core0) + LENGTH(flash_app0_core1) - __cy_boot_signature_size; +__cy_app1_verify_start = ORIGIN(flash_app1_core0); +__cy_app1_verify_length = LENGTH(flash_app1_core0) + LENGTH(flash_app1_core1) - __cy_boot_signature_size; + +/* +* The size of the application signature. +* E.g. 4 for CRC-32, +* 32 for SHA256, +* 256 for RSA 2048. +*/ +__cy_boot_signature_size = 256; + +/******************************************************************************* +* End of CM4 and CM0+ linker script common region +*******************************************************************************/ + + +/* +* DFU SDK specific: aliases regions, so the rest of code does not use +* application specific memory region names +*/ +REGION_ALIAS("flash", flash_app0_core0); +REGION_ALIAS("flash_core1", flash_app0_core1); +REGION_ALIAS("ram", ram_app0_core0); + +/* DFU SDK specific: sets an app Id */ +__cy_app_id = 0; + +/* +* DFU SDK specific: sets a start address of the Core1 application image, +* more specifically an address of the Core1 interrupt vector table. +* CM0+ uses this information to launch Core1. +*/ +__cy_app_core1_start_addr = ORIGIN(flash_core1); /* used to start Core1 from Core0 */ + +/* DFU SDK specific */ +/* CyMCUElfTool uses these ELF symbols to generate an application signature */ +__cy_app_verify_start = ORIGIN(flash); +__cy_app_verify_length = LENGTH(flash) + LENGTH(flash_core1) - __cy_boot_signature_size; + + +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a libnosys.a) + +/* The linker script defines how to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * This linker script defines the symbols, which can be used by code without a definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __Vectors_End + * __Vectors_Size + * + * For the DFU SDK, these additional symbols are defined: + * __cy_app_id + * __cy_product_id + * __cy_checksum_type + * __cy_app_core1_start_addr + * __cy_boot_metadata_addr + * __cy_boot_metadata_length + */ + + +SECTIONS +{ + /* DFU SDK specific */ + /* The noinit section, used across all the applications */ + .cy_boot_noinit (NOLOAD) : + { + KEEP(*(.cy_boot_noinit)); + } > ram_common + + /* The last byte of the section is used for AppId to be shared between all the applications */ + .cy_boot_noinit.appId ORIGIN(ram_common) + LENGTH(ram_common) - 1 (NOLOAD) : + { + KEEP(*(.cy_boot_noinit.appId)); + } > ram_common + + /* App0 uses it to initialize DFU SDK metadata, in the dfu_user.c file */ + .cy_boot_metadata : + { + KEEP(*(.cy_boot_metadata)) + } > flash_boot_meta + + .cy_app_header : + { + KEEP(*(.cy_app_header)) + } > flash + + .text : + { + . = ALIGN(4); + __Vectors = . ; + KEEP(*(.vectors)) + . = ALIGN(4); + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + __end__ = .; + + . = ALIGN(4); + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + /* Read-only code (constants). */ + *(.rodata .rodata.* .constdata .constdata.* .conststring .conststring.*) + + KEEP(*(.eh_frame*)) + } > flash + + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > flash + + __exidx_start = .; + + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > flash + __exidx_end = .; + + + /* To copy multiple ROM to the RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_{device}_cm0plus.S */ + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + + /* Copy interrupt vectors from Flash to RAM */ + LONG (__Vectors) /* From */ + LONG (__ram_vectors_start__) /* To */ + LONG (__Vectors_End - __Vectors) /* Size */ + + /* Copy data section to RAM */ + LONG (__etext) /* From */ + LONG (__data_start__) /* To */ + LONG (__data_end__ - __data_start__) /* Size */ + + __copy_table_end__ = .; + } > flash + + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_{device}_cm0plus.S */ + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + __zero_table_end__ = .; + } > flash + + __etext = . ; + + + .ramVectors (NOLOAD) : ALIGN(8) + { + __ram_vectors_start__ = .; + KEEP(*(.ram_vectors)) + __ram_vectors_end__ = .; + } > ram + + + .data __ram_vectors_end__ : AT (__etext) + { + __data_start__ = .; + + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + + KEEP(*(.cy_ramfunc*)) + . = ALIGN(4); + + __data_end__ = .; + + } > ram + + + /* Place variables in the section that should not be initialized during the + * device startup. + */ + .noinit (NOLOAD) : ALIGN(8) + { + KEEP(*(.noinit)) + } > ram + + + /* The uninitialized global or static variables are placed in this section. + * + * The NOLOAD attribute tells the linker that the .bss section does not consume + * any space in the image. The NOLOAD attribute changes the .bss type to + * NOBITS, and that makes the linker: A) not allocate the section in memory; + * B) put information to clear the section with all zeros during application + * loading. + * + * Without the NOLOAD attribute, the .bss section might get the PROGBITS type. + * This makes the linker: A) allocate the zeroed section in memory; B) copy + * this section to RAM during application loading. + */ + .bss (NOLOAD): + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > ram + + + .heap (NOLOAD): + { + __HeapBase = .; + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + __HeapLimit = .; + } > ram + + + /* The .stack_dummy section doesn't contain any symbols. It is only + * used for the linker to calculate the size of the stack sections, and assign + * values to the stack symbols later */ + .stack_dummy (NOLOAD): + { + KEEP(*(.stack*)) + } > ram + + + /* Set the stack top to the end of RAM, and the stack limit move down by + * the size of the stack_dummy section */ + __StackTop = ORIGIN(ram) + LENGTH(ram); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") + + + /* Emulated EEPROM Flash area */ + .cy_em_eeprom : + { + KEEP(*(.cy_em_eeprom)) + } > em_eeprom + + + /* Supervisory Flash: User data */ + .cy_sflash_user_data : + { + KEEP(*(.cy_sflash_user_data)) + } > sflash_user_data + + + /* Supervisory Flash: Normal Access Restrictions (NAR) */ + .cy_sflash_nar : + { + KEEP(*(.cy_sflash_nar)) + } > sflash_nar + + + /* Supervisory Flash: Public Key */ + .cy_sflash_public_key : + { + KEEP(*(.cy_sflash_public_key)) + } > sflash_public_key + + + /* Supervisory Flash: Table of Content # 2 */ + .cy_toc_part2 : + { + KEEP(*(.cy_toc_part2)) + } > sflash_toc_2 + + + /* Places the code in the Execute in the Place (XIP) section. See the smif driver + * documentation for details. + */ + .cy_xip : + { + KEEP(*(.cy_xip)) + } > xip + + + /* eFuse */ + .cy_efuse : + { + KEEP(*(.cy_efuse)) + } > efuse + + + /* These sections are used for additional metadata (silicon revision, + * Silicon/JTAG ID, etc.) storage. + */ + .cymeta 0x90500000 : { KEEP(*(.cymeta)) } :NONE +} + + +/* EOF */ diff --git a/2020TPCApp0.cydsn/dfu_cm0p.scat b/2020TPCApp0.cydsn/dfu_cm0p.scat new file mode 100644 index 0000000..a774dc4 --- /dev/null +++ b/2020TPCApp0.cydsn/dfu_cm0p.scat @@ -0,0 +1,189 @@ +#! armcc -E +; The first line specifies a preprocessor command that the linker invokes +; to pass a scatter file through a C preprocessor. + +;******************************************************************************* +;* \file dfu_cm0p.scat +;* \version 3.0 +;* +;* The linker file for the ARMCC. +;* +;* \note The entry point location is fixed and starts at 0x10000000. The valid +;* application image should be placed there. +;* +;* \note The linker files included with the PDL template projects must be +;* generic and handle all common use cases. Your project may not use every +;* section defined in the linker files. In that case, you may see the warnings +;* during the build process: L6314W (no section matches pattern) and/or L6329W +;* (pattern only matches removed unused sections). In your project, you can +;* suppress the warning by passing the "--diag_suppress=L6314W,L6329W" option to +;* the linker, simply comment out or remove the relevant code in the linker +;* file. +;* +;******************************************************************************* +;* \copyright +;* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +;* You may use this file only in accordance with the license, terms, conditions, +;* disclaimers, and limitations in the end user license agreement accompanying +;* the software package with which this file was provided. +;******************************************************************************/ + +;* DFU SDK specific: includes defines common across all the applications +#include "dfu_mdk_common.h" + +;* DFU SDK specific: defines the memory regions +;* Make sure the correct app no. is entered here. + +; Flash +#define FLASH_START CY_APP0_CORE0_FLASH_ADDR +#define FLASH_SIZE CY_APP0_CORE0_FLASH_LENGTH + +; Emulated EEPROM Flash area +#define EM_EEPROM_START CY_APP0_CORE0_EM_EEPROM_ADDR +#define EM_EEPROM_SIZE CY_APP0_CORE0_EM_EEPROM_LENGTH + +; Supervisory flash: User data +#define SFLASH_USER_DATA_START 0x16000800 +#define SFLASH_USER_DATA_SIZE 0x00000800 + +; Supervisory flash: Normal Access Restrictions (NAR) +#define SFLASH_NAR_START 0x16001A00 +#define SFLASH_NAR_SIZE 0x00000200 + +; Supervisory flash: Public Key +#define SFLASH_PUBLIC_KEY_START 0x16005A00 +#define SFLASH_PUBLIC_KEY_SIZE 0x00000C00 + +; Supervisory flash: Table of Content # 2 +#define SFLASH_TOC_2_START 0x16007C00 +#define SFLASH_TOC_2_SIZE 0x00000400 + +; External memory +#define XIP_START CY_APP0_CORE0_SMIF_ADDR +#define XIP_SIZE CY_APP0_CORE0_SMIF_LENGTH + +; eFuse +#define EFUSE_START 0x90700000 +#define EFUSE_SIZE 0x100000 + +; RAM +#define RAM_START CY_APP0_CORE0_RAM_ADDR +#define RAM_SIZE CY_APP0_CORE0_RAM_LENGTH + + +LR_FLASH FLASH_START FLASH_SIZE +{ + .cy_app_header +0 + { + * (.cy_app_header) + } + + ER_FLASH_VECTORS +0 + { + * (RESET, +FIRST) + } + + ER_FLASH_CODE +0 FIXED + { + * (InRoot$$Sections) + * (+RO) + } + + ER_RAM_COMMON CY_APP_RAM_COMMON_ADDR UNINIT + { + * (.cy_boot_noinit.appId) + } + + ER_RAM_VECTORS RAM_START UNINIT + { + * (RESET_RAM, +FIRST) + } + + ER_RAM_DATA +0 + { + * (.cy_ramfunc) + .ANY (+RW, +ZI) + } + + ; Place variables in the section that should not be initialized during the + ; device startup. + ER_RAM_NOINIT_DATA +0 UNINIT + { + * (.noinit) + } +} + + +; Emulated EEPROM Flash area +LR_EM_EEPROM EM_EEPROM_START EM_EEPROM_SIZE +{ + .cy_em_eeprom +0 + { + * (.cy_em_eeprom) + } +} + +; Supervisory flash: User data +LR_SFLASH_USER_DATA SFLASH_USER_DATA_START SFLASH_USER_DATA_SIZE +{ + .cy_sflash_user_data +0 + { + * (.cy_sflash_user_data) + } +} + +; Supervisory flash: Normal Access Restrictions (NAR) +LR_SFLASH_NAR SFLASH_NAR_START SFLASH_NAR_SIZE +{ + .cy_sflash_nar +0 + { + * (.cy_sflash_nar) + } +} + +; Supervisory flash: Public Key +LR_SFLASH_PUBLIC_KEY SFLASH_PUBLIC_KEY_START SFLASH_PUBLIC_KEY_SIZE +{ + .cy_sflash_public_key +0 + { + * (.cy_sflash_public_key) + } +} + +; Supervisory flash: Table of Content # 2 +LR_SFLASH_TOC_2 SFLASH_TOC_2_START SFLASH_TOC_2_SIZE +{ + .cy_toc_part2 +0 + { + * (.cy_toc_part2) + } +} + +; Places the code in the Execute in the Place (XIP) section. See the smif driver documentation for details. +LR_EROM XIP_START XIP_SIZE +{ + .cy_xip +0 + { + * (.cy_xip) + } +} + + +; eFuse +LR_EFUSE EFUSE_START EFUSE_SIZE +{ + .cy_efuse +0 + { + * (.cy_efuse) + } +} + + +; The section is used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. +CYMETA 0x90500000 +{ + .cymeta +0 { * (.cymeta) } +} + + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/dfu_cm4.icf b/2020TPCApp0.cydsn/dfu_cm4.icf new file mode 100644 index 0000000..ca971bc --- /dev/null +++ b/2020TPCApp0.cydsn/dfu_cm4.icf @@ -0,0 +1,248 @@ +/***************************************************************************//** +* \file dfu_cm4.icf +* \version 3.0 +* +* The linker file for the the IAR compiler. +* +* \note The entry point is fixed and starts at 0x10000000. The valid application +* image should be placed there. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case, you may see warnings during the +* build process. In your project, you can simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ + + +/******************************************************************************* +* Start of CM4 and CM0+ linker script common region +*******************************************************************************/ + +/*-Memory Regions-*/ +/* Flash */ +define exported symbol __cy_memory_0_start = 0x10000000; +define exported symbol __cy_memory_0_length = 0x00100000; +define exported symbol __cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +define exported symbol __cy_memory_1_start = 0x14000000; +define exported symbol __cy_memory_1_length = 0x8000; +define exported symbol __cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +define exported symbol __cy_memory_2_start = 0x16000000; +define exported symbol __cy_memory_2_length = 0x8000; +define exported symbol __cy_memory_2_row_size = 0x200; + +/* XIP */ +define exported symbol __cy_memory_3_start = 0x18000000; +define exported symbol __cy_memory_3_length = 0x08000000; +define exported symbol __cy_memory_3_row_size = 0x200; + +/* eFuse */ +define exported symbol __cy_memory_4_start = 0x90700000; +define exported symbol __cy_memory_4_length = 0x100000; +define exported symbol __cy_memory_4_row_size = 1; + + +define memory mem with size = 4G; + +/* Memory regions for all applications are defined here */ +define region FLASH_app0_core0 = mem:[from 0x10000000 size 0x10000]; +define region FLASH_app0_core1 = mem:[from 0x10010000 size 0x10000]; +define region FLASH_app1_core0 = mem:[from 0x10040000 size 0x10000]; +define region FLASH_app1_core1 = mem:[from 0x10050000 size 0x10000]; + +/* +* The region for DFU SDK metadata +* when it is outside of any application +*/ +define region FLASH_boot_meta = mem:[from 0x100FFA00 size 0x200]; + + +/* eFuse */ +define region ROM_EFUSE = mem:[from 0x90700000 size 0x100000]; + +/* SFlash NAR */ +define region SFLASH_NAR = mem:[from 0x16001A00 size 0x200]; + +/* SFlash User Data */ +define region SFLASH_USER_DATA = mem:[from 0x16000800 size 0x800]; + +/* SFlash Public Key, 6 SFlash rows */ +define region SFLASH_PUBLIC_KEY = mem:[from 0x16005A00 size 0xC00]; + +/* Table of Content part 2, two SFlash rows */ +define region SFLASH_TOC = mem:[from 0x16007C00 size 0x400]; + + +/* Emulated EEPROM app regions */ +define region EM_EEPROM_app0_core0 = mem:[from 0x14000000 size 0x8000]; +define region EM_EEPROM_app0_core1 = mem:[from 0x14000000 size 0x8000]; +define region EM_EEPROM_app1_core0 = mem:[from 0x14000000 size 0x8000]; +define region EM_EEPROM_app1_core1 = mem:[from 0x14000000 size 0x8000]; + +/* XIP/SMIF app regions */ +define region EROM_app0_core0 = mem:[from 0x18000000 size 0x1000]; +define region EROM_app0_core1 = mem:[from 0x18000000 size 0x1000]; +define region EROM_app1_core0 = mem:[from 0x18000000 size 0x1000]; +define region EROM_app1_core1 = mem:[from 0x18000000 size 0x1000]; + +/* used for RAM sharing across applications */ +define region IRAM_common = mem:[from 0x08000000 size 0x0100]; + +/* note: all the IRAM_appX_core0 regions has to be 0x100 aligned */ +/* and the IRAM_appX_core1 regions has to be 0x400 aligned */ +/* as they contain Interrupt Vector Table Remapped at the start */ +define region IRAM_app0_core0 = mem:[from 0x08000100 size 0x1F00]; +define region IRAM_app0_core1 = mem:[from 0x08002000 size 0x8000]; +define region IRAM_app1_core0 = mem:[from 0x08000100 size 0x1F00]; +define region IRAM_app1_core1 = mem:[from 0x08002000 size 0x8000]; + + +/* Used by all DFU SDK and CyMCUElfTool */ +define exported symbol __cy_boot_metadata_addr = 0x100FFA00; +define exported symbol __cy_boot_metadata_length = __cy_memory_0_row_size; + +/* Used by CyMCUElfTool to generate ProductID for DFU SDK apps */ +define exported symbol __cy_product_id = 0x01020304; + +/* Used by CyMCUElfTool to generate ChecksumType for DFU SDK apps */ +define exported symbol __cy_checksum_type = 0; + +/* +* The size of the application signature. +* E.g. 4 for CRC-32, +* 32 for SHA256, +* 256 for RSA 2048. +*/ +define exported symbol __cy_boot_signature_size = 4; + +/* Used by DFU SDK projects, in dfu_user.c to fill in the metadata table */ +define exported symbol __cy_app0_verify_start = start(FLASH_app0_core0); +define exported symbol __cy_app0_verify_length = size (FLASH_app0_core0) + size (FLASH_app0_core1) + - __cy_boot_signature_size; + +define exported symbol __cy_app1_verify_start = start(FLASH_app1_core0); +define exported symbol __cy_app1_verify_length = size (FLASH_app1_core0) + size (FLASH_app1_core1) + - __cy_boot_signature_size; + +/******************************************************************************* +* End of CM4 and CM0+ linker script common region +*******************************************************************************/ + + +/* CyMCUElfTool uses this symbol to set a proper app number */ +define exported symbol __cy_app_id = 0; + +/* CyMCUElfTool uses these to generate an application signature */ +/* The size of the default signature (CRC-32C) is 4 bytes */ +define exported symbol __cy_app_verify_start = start(FLASH_app0_core0); +define exported symbol __cy_app_verify_length = size(FLASH_app0_core0) + size(FLASH_app0_core1) + - __cy_boot_signature_size; + + +/*-Sizes-*/ +if (!isdefinedsymbol(__STACK_SIZE)) { + define symbol __ICFEDIT_size_cstack__ = 0x1000; +} else { + define symbol __ICFEDIT_size_cstack__ = __STACK_SIZE; +} +define symbol __ICFEDIT_size_proc_stack__ = 0x0; +if (!isdefinedsymbol(__HEAP_SIZE)) { + define symbol __ICFEDIT_size_heap__ = 0x0400; +} else { + define symbol __ICFEDIT_size_heap__ = __HEAP_SIZE; +} + + +define region IROM1_region = FLASH_app0_core1; /* Flash, user app */ +define region IROM2_region = EM_EEPROM_app0_core1; /* Emulated EEPROM */ +define region IROM3_region = SFLASH_USER_DATA; /* SFlash User Data */ +define region IROM4_region = SFLASH_NAR; /* SFlash NAR */ +define region IROM5_region = SFLASH_PUBLIC_KEY; /* SFlash Public Key */ +define region IROM6_region = SFLASH_TOC; /* SFlash TOC part 2 */ +define region IROM7_region = ROM_EFUSE; /* eFuse */ +define region EROM1_region = EROM_app0_core1; /* XIP / SMIF */ +define region IRAM1_region = IRAM_app0_core1; /* RAM */ + + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; +define block HSTACK {block HEAP, block PROC_STACK, last block CSTACK}; +define block RO {first section .intvec, readonly}; + +/*-Initializations-*/ +initialize by copy { readwrite }; +do not initialize { section .noinit, section .intvec_ram, + section .cy_boot_noinit.appId, section .cy_boot_noinit }; + + +/*-Placement-*/ + +/* Flash */ +place at start of IROM1_region { block RO }; +".cy_app_signature": place at end of IROM1_region { section .cy_app_signature }; + +/* Emulated EEPROM Flash area */ +".cy_em_eeprom" : place at start of IROM2_region { section .cy_em_eeprom }; + +/* Supervisory Flash - User Data */ +".cy_sflash_user_data" : place at start of IROM3_region { section .cy_sflash_user_data }; + +/* Supervisory Flash - NAR */ +".cy_sflash_nar" : place at start of IROM4_region { section .cy_sflash_nar }; + +/* Supervisory Flash - Public Key */ +".cy_sflash_public_key" : place at start of IROM5_region { section .cy_sflash_public_key }; + +/* Supervisory Flash - TOC2 */ +".cy_toc_part2" : place at start of IROM6_region { section .cy_toc_part2 }; + +/* eFuse */ +".cy_efuse" : place at start of IROM7_region { section .cy_efuse }; + +/* Execute in Place (XIP). See the smif driver documentation for details. */ +".cy_xip" : place at start of EROM1_region { section .cy_xip }; + +/* RAM */ +place at start of IRAM_common { readwrite section .cy_boot_noinit.appId }; +place in IRAM_common { readwrite section .cy_boot_noinit }; +place at start of IRAM1_region { readwrite section .intvec_ram}; +place in IRAM1_region { readwrite }; +place at end of IRAM1_region { block HSTACK }; + +/* These sections are used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. */ +".cymeta" : place at address mem : 0x90500000 { readonly section .cymeta }; + +/* App0 uses it to initialize DFU SDK metadata, in the dfu_user.c file */ +".cy_boot_metadata" : place at start of FLASH_boot_meta { section .cy_boot_metadata }; + +keep { section .cy_app_signature, + section .cy_em_eeprom, + section .cy_sflash_user_data, + section .cy_sflash_nar, + section .cy_sflash_public_key, + section .cy_sflash_toc_2, + section .cy_efuse, + section .cy_xip, + section .cymeta, + section .cy_boot_metadata, + section .cy_boot_noinit, + section .cy_boot_noinit.appId, + }; + + +/* EOF */ diff --git a/2020TPCApp0.cydsn/dfu_cm4.ld b/2020TPCApp0.cydsn/dfu_cm4.ld new file mode 100644 index 0000000..8c8bfb3 --- /dev/null +++ b/2020TPCApp0.cydsn/dfu_cm4.ld @@ -0,0 +1,478 @@ +/***************************************************************************//** +* \file dfu_cm4.ld +* \version 3.0 +* +* The linker file for the GNU C compiler. +* Used for DFU SDK core1 firmware projects. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case, you may see warnings during the +* build process. In your project, simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +SEARCH_DIR(.) +GROUP(-lgcc -lc -lnosys) +ENTRY(Reset_Handler) + + +/* +* Forces symbol to be added to the output file. +* Otherwise linker may remove it if founds that it is not used in the project. +* This command has the same effect as the -u command-line option. +*/ +EXTERN(Reset_Handler) + + +/******************************************************************************* +* Start of CM4 and CM0+ linker script common region +*******************************************************************************/ + +/* +* Memory regions, for each application and MCU core. +*/ +MEMORY +{ + flash_app0_core0 (rx) : ORIGIN = 0x10000000, LENGTH = 0x10000 + flash_app0_core1 (rx) : ORIGIN = 0x10010000, LENGTH = 0x30000 + flash_app1_core0 (rx) : ORIGIN = 0x10040000, LENGTH = 0x30000 + flash_app1_core1 (rx) : ORIGIN = 0x10070000, LENGTH = 0x50000 + + flash_storage (rw) : ORIGIN = 0x100D0000, LENGTH = 0x1000 + flash_boot_meta (rw) : ORIGIN = 0x100FFA00, LENGTH = 0x400 + + sflash_user_data (rx) : ORIGIN = 0x16000800, LENGTH = 0x800 + sflash_nar (rx) : ORIGIN = 0x16001A00, LENGTH = 0x200 + sflash_public_key (rx) : ORIGIN = 0x16005A00, LENGTH = 0xC00 + sflash_toc_2 (rx) : ORIGIN = 0x16007C00, LENGTH = 0x400 + + efuse (r) : ORIGIN = 0x90700000, LENGTH = 0x100000 + + ram_common (rwx) : ORIGIN = 0x08000000, LENGTH = 0x0100 + + /* note: all the ram_appX_core0 regions has to be 0x100 aligned */ + /* and the ram_appX_core1 regions has to be 0x400 aligned */ + /* as they contain Interrupt Vector Table Remapped at the start */ + ram_app0_core0 (rwx) : ORIGIN = 0x08000100, LENGTH = 0x7F00 + ram_app0_core1 (rwx) : ORIGIN = 0x08008000, LENGTH = 0x8000 + + ram_app1_core0 (rwx) : ORIGIN = 0x08000100, LENGTH = 0x7F00 + ram_app1_core1 (rwx) : ORIGIN = 0x08008000, LENGTH = 0x30000 + + em_eeprom (rx) : ORIGIN = 0x14000000, LENGTH = 0x8000 + xip (rx) : ORIGIN = 0x18000000, LENGTH = 0x08000000 +} + +/* Regions parameters */ +/* Flash */ +__cy_memory_0_start = 0x10000000; +__cy_memory_0_length = 0x00100000; +__cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +__cy_memory_1_start = 0x14000000; +__cy_memory_1_length = 0x8000; +__cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +__cy_memory_2_start = 0x16000000; +__cy_memory_2_length = 0x8000; +__cy_memory_2_row_size = 0x200; + +/* XIP */ +__cy_memory_3_start = 0x18000000; +__cy_memory_3_length = 0x08000000; +__cy_memory_3_row_size = 0x200; + +/* eFuse */ +__cy_memory_4_start = 0x90700000; +__cy_memory_4_length = 0x100000; +__cy_memory_4_row_size = 1; + +/* The DFU SDK metadata limits */ +__cy_boot_metadata_addr = ORIGIN(flash_boot_meta); +__cy_boot_metadata_length = __cy_memory_0_row_size; + +/* The Product ID, used by CyMCUElfTool to generate a updating file */ +__cy_product_id = 0x01020304; + +/* The checksum type used by CyMCUElfTool to generate a updating file */ +__cy_checksum_type = 0x00; + +/* Used by the DFU SDK application to set the metadata */ +__cy_app0_verify_start = ORIGIN(flash_app0_core0); +__cy_app0_verify_length = LENGTH(flash_app0_core0) + LENGTH(flash_app0_core1) - __cy_boot_signature_size; +__cy_app1_verify_start = ORIGIN(flash_app1_core0); +__cy_app1_verify_length = LENGTH(flash_app1_core0) + LENGTH(flash_app1_core1) - __cy_boot_signature_size; + +/* +* The size of the application signature. +* E.g. 4 for CRC-32, +* 32 for SHA256, +* 256 for RSA 2048. +*/ +__cy_boot_signature_size = 256; + +/******************************************************************************* +* End of CM4 and CM0+ linker script common region +*******************************************************************************/ + + +/* +* DFU SDK specific: aliases regions, so the rest of code does not use +* application specific memory region names +*/ +REGION_ALIAS("flash_core0", flash_app0_core0); +REGION_ALIAS("flash", flash_app0_core1); +REGION_ALIAS("ram", ram_app0_core1); + +/* DFU SDK specific: sets an app Id */ +__cy_app_id = 0; + + +/* DFU SDK specific */ +/* CyMCUElfTool uses these ELF symbols to generate an application signature */ +__cy_app_verify_start = ORIGIN(flash_core0); +__cy_app_verify_length = LENGTH(flash_core0) + LENGTH(flash) - __cy_boot_signature_size; + + +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a libnosys.a) + +/* The linker script defines how to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * This linker script defines the symbols, which can be used by code without a definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __Vectors_End + * __Vectors_Size + * + * For the DFU SDK, these additional symbols are defined: + * __cy_app_id + * __cy_product_id + * __cy_checksum_type + * __cy_app_core1_start_addr + * __cy_boot_metadata_addr + * __cy_boot_metadata_length + */ + + +SECTIONS +{ + /* DFU SDK specific */ + /* The noinit section, used across all the applications */ + .cy_boot_noinit (NOLOAD) : + { + KEEP(*(.cy_boot_noinit)); + } > ram_common + + /* The last byte of the section is used for AppId to be shared between all the applications */ + .cy_boot_noinit.appId ORIGIN(ram_common) + LENGTH(ram_common) - 1 (NOLOAD) : + { + KEEP(*(.cy_boot_noinit.appId)); + } > ram_common + + /* App0 uses it to initialize DFU SDK metadata, in the dfu_user.c file */ + .cy_boot_metadata : + { + KEEP(*(.cy_boot_metadata)) + } > flash_boot_meta + + + .text : + { + . = ALIGN(4); + __Vectors = . ; + KEEP(*(.vectors)) + . = ALIGN(4); + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + __end__ = .; + + . = ALIGN(4); + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + /* Read-only code (constants). */ + *(.rodata .rodata.* .constdata .constdata.* .conststring .conststring.*) + + KEEP(*(.eh_frame*)) + } > flash + + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > flash + + __exidx_start = .; + + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > flash + __exidx_end = .; + + + /* To copy multiple ROM to the RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_{device}_cm4.S */ + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + + /* Copy interrupt vectors from flash to RAM */ + LONG (__Vectors) /* From */ + LONG (__ram_vectors_start__) /* To */ + LONG (__Vectors_End - __Vectors) /* Size */ + + /* Copy data section to RAM */ + LONG (__etext) /* From */ + LONG (__data_start__) /* To */ + LONG (__data_end__ - __data_start__) /* Size */ + + __copy_table_end__ = .; + } > flash + + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_{device}_cm4.S */ + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + __zero_table_end__ = .; + } > flash + + __etext = . ; + + /* + * The DFU SDK section for an app verification signature. + * Must be placed at the end of the application. + * In this case, last N bytes of the last Flash row inside the application. + */ + .cy_app_signature ABSOLUTE(ORIGIN(flash) + LENGTH(flash) - __cy_boot_signature_size) : + { + KEEP(*(.cy_app_signature)) + } > flash = 0 + + .ramVectors (NOLOAD) : ALIGN(8) + { + __ram_vectors_start__ = .; + KEEP(*(.ram_vectors)) + __ram_vectors_end__ = .; + } > ram + + + .data __ram_vectors_end__ : AT (__etext) + { + __data_start__ = .; + + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + + KEEP(*(.cy_ramfunc*)) + . = ALIGN(4); + + __data_end__ = .; + + } > ram + + + /* Place variables in the section that should not be initialized during the + * device startup. + */ + .noinit (NOLOAD) : ALIGN(8) + { + KEEP(*(.noinit)) + } > ram + + + /* The uninitialized global or static variables are placed in this section. + * + * The NOLOAD attribute tells the linker that the .bss section does not consume + * any space in the image. The NOLOAD attribute changes the .bss type to + * NOBITS, and that makes the linker: A) not allocate the section in memory; + * B) put information to clear the section with all zeros during application + * loading. + * + * Without the NOLOAD attribute, the .bss section might get the PROGBITS type. + * This makes the linker: A) allocate the zeroed section in memory; B) copy + * this section to RAM during application loading. + */ + .bss (NOLOAD): + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > ram + + + .heap (NOLOAD): + { + __HeapBase = .; + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + __HeapLimit = .; + } > ram + + + /* The .stack_dummy section doesn't contain any symbols. It is only + * used for the linker to calculate the size of the stack sections, and assign + * values to the stack symbols later */ + .stack_dummy (NOLOAD): + { + KEEP(*(.stack*)) + } > ram + + + /* Set the stack top to the end of RAM, and the stack limit move down by + * the size of the stack_dummy section */ + __StackTop = ORIGIN(ram) + LENGTH(ram); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") + + + /* Emulated EEPROM Flash area */ + .cy_em_eeprom : + { + KEEP(*(.cy_em_eeprom)) + } > em_eeprom + + + /* Supervisory Flash: User data */ + .cy_sflash_user_data : + { + KEEP(*(.cy_sflash_user_data)) + } > sflash_user_data + + + /* Supervisory Flash: Normal Access Restrictions (NAR) */ + .cy_sflash_nar : + { + KEEP(*(.cy_sflash_nar)) + } > sflash_nar + + + /* Supervisory Flash: Public Key */ + .cy_sflash_public_key : + { + KEEP(*(.cy_sflash_public_key)) + } > sflash_public_key + + + /* Supervisory Flash: Table of Content # 2 */ + .cy_toc_part2 : + { + KEEP(*(.cy_toc_part2)) + } > sflash_toc_2 + + + /* Places the code in the Execute in the Place (XIP) section. See the smif driver + * documentation for details. + */ + .cy_xip : + { + KEEP(*(.cy_xip)) + } > xip + + + /* eFuse */ + .cy_efuse : + { + KEEP(*(.cy_efuse)) + } > efuse + + + /* These sections are used for additional metadata (silicon revision, + * Silicon/JTAG ID, etc.) storage. + */ + .cymeta 0x90500000 : { KEEP(*(.cymeta)) } :NONE +} + + +/* EOF */ diff --git a/2020TPCApp0.cydsn/dfu_cm4.scat b/2020TPCApp0.cydsn/dfu_cm4.scat new file mode 100644 index 0000000..8aab5d9 --- /dev/null +++ b/2020TPCApp0.cydsn/dfu_cm4.scat @@ -0,0 +1,206 @@ +#! armcc -E +; The first line specifies a preprocessor command that the linker invokes +; to pass a scatter file through a C preprocessor. + +;******************************************************************************* +;* \file dfu_cm4.scat +;* \version 3.0 +;* +;* The linker file for the ARMCC. +;* +;* \note The entry point location is fixed and starts at 0x10000000. The valid +;* application image should be placed there. +;* +;* \note The linker files included with the PDL template projects must be +;* generic and handle all common use cases. Your project may not use every +;* section defined in the linker files. In that case, you may see the warnings +;* during the build process: L6314W (no section matches pattern) and/or L6329W +;* (pattern only matches removed unused sections). In your project, you can +;* suppress the warning by passing the "--diag_suppress=L6314W,L6329W" option to +;* the linker, simply comment out or remove the relevant code in the linker +;* file. +;* +;******************************************************************************* +;* \copyright +;* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +;* You may use this file only in accordance with the license, terms, conditions, +;* disclaimers, and limitations in the end user license agreement accompanying +;* the software package with which this file was provided. +;******************************************************************************/ + +;* DFU SDK specific: includes defines common across all the applications +#include "dfu_mdk_common.h" + +;* DFU SDK specific: defines the memory regions +;* Make sure the correct app no. is entered here + +; Flash +#define FLASH_START CY_APP0_CORE1_FLASH_ADDR +#define FLASH_SIZE CY_APP0_CORE1_FLASH_LENGTH + +; Flash Toc +#define FLASH_TOC_START CY_TOC_START +#define FLASH_TOC_SIZE CY_TOC_SIZE + +; Emulated EEPROM Flash area +#define EM_EEPROM_START CY_APP0_CORE1_EM_EEPROM_ADDR +#define EM_EEPROM_SIZE CY_APP0_CORE1_EM_EEPROM_LENGTH + +; Supervisory flash: User data +#define SFLASH_USER_DATA_START 0x16000800 +#define SFLASH_USER_DATA_SIZE 0x00000800 + +; Supervisory flash: Normal Access Restrictions (NAR) +#define SFLASH_NAR_START 0x16001A00 +#define SFLASH_NAR_SIZE 0x00000200 + +; Supervisory flash: Public Key +#define SFLASH_PUBLIC_KEY_START 0x16005A00 +#define SFLASH_PUBLIC_KEY_SIZE 0x00000C00 + +; Supervisory flash: Table of Content # 2 +#define SFLASH_TOC_2_START 0x16007C00 +#define SFLASH_TOC_2_SIZE 0x00000400 + +; External memory +#define XIP_START CY_APP0_CORE1_SMIF_ADDR +#define XIP_SIZE CY_APP0_CORE1_SMIF_LENGTH + +; eFuse +#define EFUSE_START 0x90700000 +#define EFUSE_SIZE 0x100000 + +; RAM +#define RAM_START CY_APP0_CORE1_RAM_ADDR +#define RAM_SIZE CY_APP0_CORE1_RAM_LENGTH + + +LR_FLASH FLASH_START FLASH_SIZE +{ + ER_FLASH_VECTORS +0 + { + * (RESET, +FIRST) + } + + ER_FLASH_CODE +0 FIXED + { + * (InRoot$$Sections) + * (+RO) + } + + ER_RAM_COMMON CY_APP_RAM_COMMON_ADDR UNINIT + { + * (.cy_boot_noinit.appId) + } + + ER_RAM_VECTORS RAM_START UNINIT + { + * (RESET_RAM, +FIRST) + } + + ER_RAM_DATA +0 + { + * (.cy_ramfunc) + .ANY (+RW, +ZI) + } + + ; Place variables in the section that should not be initialized during + ; a device startup. + ER_RAM_NOINIT_DATA +0 UNINIT + { + * (.noinit) + } + + + ; Used for the digital signature of the secure application and the + ; DFU SDK application. The size of the section depends on the required + ; data size. + .cy_app_signature (FLASH_START + FLASH_SIZE - CY_BOOT_SIGNATURE_SIZE) FIXED + { + * (.cy_app_signature) + } +} + +; App0 uses it to initialize DFU SDK metadata, in dfu_user.c file +LR_CY_BOOT_METADATA CY_BOOT_META_FLASH_ADDR CY_BOOT_META_FLASH_LENGTH +{ + .cy_boot_metadata + 0 + { + * (.cy_boot_metadata) + } +} + +; Emulated EEPROM Flash area +LR_EM_EEPROM EM_EEPROM_START EM_EEPROM_SIZE +{ + .cy_em_eeprom +0 + { + * (.cy_em_eeprom) + } +} + +; Supervisory Flash: User data +LR_SFLASH_USER_DATA SFLASH_USER_DATA_START SFLASH_USER_DATA_SIZE +{ + .cy_sflash_user_data +0 + { + * (.cy_sflash_user_data) + } +} + +; Supervisory Flash: Normal Access Restrictions (NAR) +LR_SFLASH_NAR SFLASH_NAR_START SFLASH_NAR_SIZE +{ + .cy_sflash_nar +0 + { + * (.cy_sflash_nar) + } +} + +; Supervisory Flash: Public Key +LR_SFLASH_PUBLIC_KEY SFLASH_PUBLIC_KEY_START SFLASH_PUBLIC_KEY_SIZE +{ + .cy_sflash_public_key +0 + { + * (.cy_sflash_public_key) + } +} + +; Supervisory Flash: Table of Content # 2 +LR_SFLASH_TOC_2 SFLASH_TOC_2_START SFLASH_TOC_2_SIZE +{ + .cy_toc_part2 +0 + { + * (.cy_toc_part2) + } +} + + +; Places the code in the Execute in Place (XIP) section. See the smif driver documentation for details. +LR_EROM XIP_START XIP_SIZE +{ + .cy_xip +0 + { + * (.cy_xip) + } +} + + +; eFuse +LR_EFUSE EFUSE_START EFUSE_SIZE +{ + .cy_efuse +0 + { + * (.cy_efuse) + } +} + + +; The section is used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. +CYMETA 0x90500000 +{ + .cymeta +0 { * (.cymeta) } +} + + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/dfu_mdk_common.h b/2020TPCApp0.cydsn/dfu_mdk_common.h new file mode 100644 index 0000000..e50b562 --- /dev/null +++ b/2020TPCApp0.cydsn/dfu_mdk_common.h @@ -0,0 +1,114 @@ +/******************************************************************************* +* \file dfu_mdk_common.h +* \version 3.0 +* +* This file provides only macro definitions to use for +* project configuration. +* They may be used in both scatter files and source code files. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef DFU_MDK_COMMON_H_ +#define DFU_MDK_COMMON_H_ + +/* DFU SDK parameters */ +/* The user application may either update them or leave the defaults if they fit */ +#define CY_BOOT_METADATA_ADDR 0x100FFA00 +#define CY_BOOT_METADATA_LENGTH 0x200 +#define CY_PRODUCT_ID 0x01020304 +#define CY_CHECKSUM_TYPE 0x00 + +/* +* The size of the section .cy_app_signature. +* 1,2, or 4 for a checksum +* 4 for CRC-32 +* 20 for SHA1 +* 32 for SHA256 +* 256 for RSASSA-PKCS1-v1.5 with the 2048 bit RSA key. +* +* SHA1 must be used. +*/ +#define CY_BOOT_SIGNATURE_SIZE 4 + +/* For the MDK linker script, defines TOC parameters */ +/* Update per device series to be in the last Flash row */ +#define CY_TOC_START 0x16007C00 +#define CY_TOC_SIZE 0x400 + + +/* Memory region ranges per core and app */ +#define CY_APP0_CORE0_FLASH_ADDR 0x10000000 +#define CY_APP0_CORE0_FLASH_LENGTH 0x10000 + +#define CY_APP0_CORE1_FLASH_ADDR 0x10010000 +#define CY_APP0_CORE1_FLASH_LENGTH 0x10000 + +#define CY_APP1_CORE0_FLASH_ADDR 0x10040000 +#define CY_APP1_CORE0_FLASH_LENGTH 0x10000 + +#define CY_APP1_CORE1_FLASH_ADDR 0x10050000 +#define CY_APP1_CORE1_FLASH_LENGTH 0x10000 + +/* DFU SDK metadata address range in Flash */ +#define CY_BOOT_META_FLASH_ADDR 0x100FFA00 +#define CY_BOOT_META_FLASH_LENGTH 0x200 + +/* Application ranges in emulated EEPROM */ +#define CY_APP0_CORE0_EM_EEPROM_ADDR 0x14000000 +#define CY_APP0_CORE0_EM_EEPROM_LENGTH 0x00000000 + +#define CY_APP0_CORE1_EM_EEPROM_ADDR (CY_APP0_CORE0_EM_EEPROM_ADDR + CY_APP0_CORE0_EM_EEPROM_LENGTH) +#define CY_APP0_CORE1_EM_EEPROM_LENGTH 0x0000 + +#define CY_APP1_CORE0_EM_EEPROM_ADDR 0x14000000 +#define CY_APP1_CORE0_EM_EEPROM_LENGTH 0x00000000 + +#define CY_APP1_CORE1_EM_EEPROM_ADDR (CY_APP1_CORE0_EM_EEPROM_ADDR + CY_APP1_CORE0_EM_EEPROM_LENGTH) +#define CY_APP1_CORE1_EM_EEPROM_LENGTH 0x00000000 + +/* Application ranges in SMIF XIP */ +#define CY_APP0_CORE0_SMIF_ADDR 0x18000000 +#define CY_APP0_CORE0_SMIF_LENGTH 0x00000000 + +#define CY_APP0_CORE1_SMIF_ADDR (CY_APP0_CORE0_SMIF_ADDR + CY_APP0_CORE0_SMIF_LENGTH) +#define CY_APP0_CORE1_SMIF_LENGTH 0x00000000 + +#define CY_APP1_CORE0_SMIF_ADDR 0x14000200 +#define CY_APP1_CORE0_SMIF_LENGTH 0x00000000 + +#define CY_APP1_CORE1_SMIF_ADDR (CY_APP1_CORE0_SMIF_ADDR + CY_APP1_CORE0_SMIF_LENGTH) +#define CY_APP1_CORE1_SMIF_LENGTH 0x00000000 + +/* Application ranges in RAM */ +#define CY_APP_RAM_COMMON_ADDR 0x08000000 +#define CY_APP_RAM_COMMON_LENGTH 0x00000100 + +/* note: all the CY_APPX_CORE0_RAM regions has to be 0x100 aligned */ +/* and the CY_APPX_CORE1_RAM regions has to be 0x400 aligned */ +/* as they contain Interrupt Vector Table Remapped at the start */ + +#define CY_APP0_CORE0_RAM_ADDR 0x08000100 +#define CY_APP0_CORE0_RAM_LENGTH 0x00001F00 + +#define CY_APP0_CORE1_RAM_ADDR (CY_APP0_CORE0_RAM_ADDR + CY_APP0_CORE0_RAM_LENGTH) +#define CY_APP0_CORE1_RAM_LENGTH 0x00008000 + +#define CY_APP1_CORE0_RAM_ADDR CY_APP0_CORE0_RAM_ADDR +#define CY_APP1_CORE0_RAM_LENGTH 0x00001F00 + +#define CY_APP1_CORE1_RAM_ADDR (CY_APP1_CORE0_RAM_ADDR + CY_APP1_CORE0_RAM_LENGTH) +#define CY_APP1_CORE1_RAM_LENGTH 0x00008000 + + +__asm void cy_DFU_mdkAsmDummy(void); + +#endif /* DFU_MDK_COMMON_H_ */ + + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/dfu_mdk_symbols.c b/2020TPCApp0.cydsn/dfu_mdk_symbols.c new file mode 100644 index 0000000..fd3a950 --- /dev/null +++ b/2020TPCApp0.cydsn/dfu_mdk_symbols.c @@ -0,0 +1,66 @@ +/******************************************************************************* +* \file dfu_mdk_symbols.c +* \version 3.0 +* +* This file provides symbols to add to an ELF file required by +* CyMCUElfTool to generate correct HEX and CYACD2 files. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "dfu_mdk_common.h" + +/******************************************************************************* +* Function Name: cy_DFU_mdkAsmDummy +******************************************************************************** +* This function provides ELF file symbols through +* the inline assembly. +* The inline assembly in the *.c file is chosen, because it allows using +* #include where the user configuration is updated. +* +* Note that this function does not have code, so no additional memory +* is allocated for it. +*******************************************************************************/ +__asm void cy_DFU_mdkAsmDummy(void) +{ + EXPORT __cy_boot_metadata_addr + EXPORT __cy_boot_metadata_length + + EXPORT __cy_app_core1_start_addr + + EXPORT __cy_product_id + EXPORT __cy_checksum_type + EXPORT __cy_app_id + + EXPORT __cy_app_verify_start + EXPORT __cy_app_verify_length + +/* Used by all DFU SDK applications to switch to another app */ +__cy_boot_metadata_addr EQU __cpp(CY_BOOT_METADATA_ADDR) +/* Used by CyMCUElfTool to update DFU SDK metadata with CRC-32C */ +__cy_boot_metadata_length EQU __cpp(CY_BOOT_METADATA_LENGTH) + +/* Used by CM0+ to start CM4 core in the DFU SDK applications. */ +/* Make sure the correct app no. is entered here */ +__cy_app_core1_start_addr EQU __cpp(CY_APP0_CORE1_FLASH_ADDR) + +/* Used by CyMCUElfTool to generate ProductID */ +__cy_product_id EQU __cpp(CY_PRODUCT_ID) +/* Used by CyMCUElfTool to generate ChecksumType */ +__cy_checksum_type EQU __cpp(CY_CHECKSUM_TYPE) +/* Application number (ID) */ +__cy_app_id EQU 0 + +/* CyMCUElfTool uses these to generate an application signature */ +/* The size of the default signature (CRC-32C) is 4 bytes */ +__cy_app_verify_start EQU __cpp(CY_APP0_CORE0_FLASH_ADDR) +__cy_app_verify_length EQU __cpp(CY_APP0_CORE0_FLASH_LENGTH + CY_APP0_CORE1_FLASH_LENGTH - CY_BOOT_SIGNATURE_SIZE) +} + + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/dfu_user.c b/2020TPCApp0.cydsn/dfu_user.c new file mode 100644 index 0000000..136e60d --- /dev/null +++ b/2020TPCApp0.cydsn/dfu_user.c @@ -0,0 +1,303 @@ +/***************************************************************************//** +* \file dfu_user.c +* \version 3.0 +* +* This file provides the custom API for a firmware application with +* DFU SDK. +* - Cy_DFU_ReadData (address, length, ctl, params) - to read the NVM block +* - Cy_DFU_WriteData(address, length, ctl, params) - to write the NVM block +* +* - Cy_DFU_TransportStart() to start a communication interface +* - Cy_DFU_TransportStop () to stop a communication interface +* - Cy_DFU_TransportReset() to reset a communication interface +* - Cy_DFU_TransportRead (buffer, size, count, timeout) +* - Cy_DFU_TransportWrite(buffer, size, count, timeout) +* +******************************************************************************** +* \copyright +* Copyright 2016-2019, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include +#include "transport_ble.h" +#include "cy_syslib.h" +#include "cy_flash.h" +#include "cy_dfu.h" + + +/* +* The DFU SDK metadata initial value is placed here +* Note: the number of elements equal to the number of the app multiplies by 2 +* because of the two fields per app plus one element for the CRC-32C field. +*/ +CY_SECTION(".cy_boot_metadata") __USED +static const uint32_t cy_dfu_metadata[CY_FLASH_SIZEOF_ROW / sizeof(uint32_t)] = +{ + CY_DFU_APP0_VERIFY_START, CY_DFU_APP0_VERIFY_LENGTH, /* The App0 base address and length */ + CY_DFU_APP1_VERIFY_START, CY_DFU_APP1_VERIFY_LENGTH, /* The App1 base address and length */ + 0u /* The rest does not matter */ +}; + + +static uint32_t IsMultipleOf(uint32_t value, uint32_t multiple); +static void GetStartEndAddress(uint32_t appId, uint32_t *startAddress, uint32_t *endAddress); + + +/******************************************************************************* +* Function Name: IsMultipleOf +****************************************************************************//** +* +* This internal function check if value parameter is a multiple of parameter +* multiple +* +* \param value value that will be checked +* \param multiple value with which value is checked +* +* \return 1 - value is multiple of parameter multiple, else 0 +* +*******************************************************************************/ +static uint32_t IsMultipleOf(uint32_t value, uint32_t multiple) +{ + return ( ((value % multiple) == 0u)? 1ul : 0ul); +} + + +/******************************************************************************* +* Function Name: GetStartEndAddress +****************************************************************************//** +* +* This internal function returns start and end address of application +* +* \param appId The application number +* \param startAddress The pointer to a variable where an application start +* address is stored +* \param endAddress The pointer to a variable where a size of application +* area is stored. +* +*******************************************************************************/ +static void GetStartEndAddress(uint32_t appId, uint32_t *startAddress, uint32_t *endAddress) +{ + uint32_t verifyStart; + uint32_t verifySize; + + (void)Cy_DFU_GetAppMetadata(appId, &verifyStart, &verifySize); + +#if (CY_DFU_APP_FORMAT == CY_DFU_SIMPLIFIED_APP) + *startAddress = verifyStart - CY_DFU_SIGNATURE_SIZE; + *endAddress = verifyStart + verifySize; +#else + *startAddress = verifyStart; + *endAddress = verifyStart + verifySize + CY_DFU_SIGNATURE_SIZE; +#endif +} + + +/******************************************************************************* +* Function Name: Cy_DFU_WriteData +****************************************************************************//** +* +* This function documentation is part of the DFU SDK API, see the +* cy_dfu.h file or DFU SDK API Reference Manual for details. +* +*******************************************************************************/ +cy_en_dfu_status_t Cy_DFU_WriteData (uint32_t address, uint32_t length, uint32_t ctl, + cy_stc_dfu_params_t *params) +{ + /* User Flash Limits */ + /* Note that App0 is out of range */ + const uint32_t minUFlashAddress = CY_FLASH_BASE + CY_DFU_APP0_VERIFY_LENGTH; + const uint32_t maxUFlashAddress = CY_FLASH_BASE + CY_FLASH_SIZE; + /* EM_EEPROM Limits*/ + const uint32_t minEmEepromAddress = CY_EM_EEPROM_BASE; + const uint32_t maxEmEepromAddress = CY_EM_EEPROM_BASE + CY_EM_EEPROM_SIZE; + + cy_en_dfu_status_t status = CY_DFU_SUCCESS; + + uint32_t app = Cy_DFU_GetRunningApp(); + uint32_t startAddress; + uint32_t endAddress; + + GetStartEndAddress(app, &startAddress, &endAddress); + + /* Check if the address and length are valid + * Note Length = 0 is valid for erase command */ + if ( (IsMultipleOf(address, CY_FLASH_SIZEOF_ROW) == 0u) || + ( (length != CY_FLASH_SIZEOF_ROW) && ( (ctl & CY_DFU_IOCTL_ERASE) == 0u) ) ) + { + status = CY_DFU_ERROR_LENGTH; + } + + /* Refuse to write to a row within a range of the current application */ + if ( (startAddress <= address) && (address < endAddress) ) + { /* It is forbidden to overwrite the currently running application */ + status = CY_DFU_ERROR_ADDRESS; + } +#if CY_DFU_OPT_GOLDEN_IMAGE + if (status == CY_DFU_SUCCESS) + { + uint8_t goldenImages[] = { CY_DFU_GOLDEN_IMAGE_IDS() }; + uint32_t count = sizeof(goldenImages) / sizeof(goldenImages[0]); + uint32_t idx; + for (idx = 0u; idx < count; ++idx) + { + app = goldenImages[idx]; + GetStartEndAddress(app, &startAddress, &endAddress); + + if ( (startAddress <= address) && (address < endAddress) ) + { + status = Cy_DFU_ValidateApp(app, params); + status = (status == CY_DFU_SUCCESS) ? CY_DFU_ERROR_ADDRESS : CY_DFU_SUCCESS; + break; + } + } + } +#endif /* #if CY_DFU_OPT_GOLDEN_IMAGE != 0 */ + + /* Check if the address is inside the valid range */ + if ( ( (minUFlashAddress <= address) && (address < maxUFlashAddress) ) + || ( (minEmEepromAddress <= address) && (address < maxEmEepromAddress) ) ) + { /* Do nothing, this is an allowed memory range to update to */ + } + else + { + status = CY_DFU_ERROR_ADDRESS; + } + + if (status == CY_DFU_SUCCESS) + { + if ((ctl & CY_DFU_IOCTL_ERASE) != 0u) + { + (void) memset(params->dataBuffer, 0, CY_FLASH_SIZEOF_ROW); + } + cy_en_flashdrv_status_t fstatus = Cy_Flash_WriteRow(address, (uint32_t*)params->dataBuffer); + status = (fstatus == CY_FLASH_DRV_SUCCESS) ? CY_DFU_SUCCESS : CY_DFU_ERROR_DATA; + } + return (status); +} + + +/******************************************************************************* +* Function Name: Cy_DFU_ReadData +****************************************************************************//** +* +* This function documentation is part of the DFU SDK API, see the +* cy_dfu.h file or DFU SDK API Reference Manual for details. +* +*******************************************************************************/ +cy_en_dfu_status_t Cy_DFU_ReadData (uint32_t address, uint32_t length, uint32_t ctl, + cy_stc_dfu_params_t *params) +{ + /* User Flash Limits */ + /* Note that App0 is out of range */ + const uint32_t minUFlashAddress = CY_FLASH_BASE + CY_DFU_APP0_VERIFY_LENGTH; + const uint32_t maxUFlashAddress = CY_FLASH_BASE + CY_FLASH_SIZE; + /* EM_EEPROM Limits*/ + const uint32_t minEmEepromAddress = CY_EM_EEPROM_BASE; + const uint32_t maxEmEepromAddress = CY_EM_EEPROM_BASE + CY_EM_EEPROM_SIZE; + + cy_en_dfu_status_t status = CY_DFU_SUCCESS; + + /* Check if the length is valid */ + if (IsMultipleOf(length, CY_FLASH_SIZEOF_ROW) == 0u) + { + status = CY_DFU_ERROR_LENGTH; + } + + /* Check if the address is inside the valid range */ + if ( ( (minUFlashAddress <= address) && (address < maxUFlashAddress) ) + || ( (minEmEepromAddress <= address) && (address < maxEmEepromAddress) ) ) + { /* Do nothing, this is an allowed memory range to update to */ + } + else + { + status = CY_DFU_ERROR_ADDRESS; + } + + /* Read or Compare */ + if (status == CY_DFU_SUCCESS) + { + if ((ctl & CY_DFU_IOCTL_COMPARE) == 0u) + { + (void) memcpy(params->dataBuffer, (const void *)address, length); + status = CY_DFU_SUCCESS; + } + else + { + status = ( memcmp(params->dataBuffer, (const void *)address, length) == 0 ) + ? CY_DFU_SUCCESS : CY_DFU_ERROR_VERIFY; + } + } + return (status); +} + + +/******************************************************************************* +* Function Name: Cy_DFU_TransportRead +****************************************************************************//** +* +* This function documentation is part of the DFU SDK API, see the +* cy_dfu.h file or DFU SDK API Reference Manual for details. +* +*******************************************************************************/ +cy_en_dfu_status_t Cy_DFU_TransportRead (uint8_t *buffer, uint32_t size, uint32_t *count, uint32_t timeout) +{ + return (CyBLE_CyBtldrCommRead(buffer, size, count, timeout)); +} + +/******************************************************************************* +* Function Name: Cy_DFU_TransportWrite +****************************************************************************//** +* +* This function documentation is part of the DFU SDK API, see the +* cy_dfu.h file or DFU SDK API Reference Manual for details. +* +*******************************************************************************/ +cy_en_dfu_status_t Cy_DFU_TransportWrite(uint8_t *buffer, uint32_t size, uint32_t *count, uint32_t timeout) +{ + return (CyBLE_CyBtldrCommWrite(buffer, size, count, timeout)); +} + +/******************************************************************************* +* Function Name: Cy_DFU_TransportReset +****************************************************************************//** +* +* This function documentation is part of the DFU SDK API, see the +* cy_dfu.h file or DFU SDK API Reference Manual for details. +* +*******************************************************************************/ +void Cy_DFU_TransportReset(void) +{ + CyBLE_CyBtldrCommReset(); +} + +/******************************************************************************* +* Function Name: Cy_DFU_TransportStart +****************************************************************************//** +* +* This function documentation is part of the DFU SDK API, see the +* cy_dfu.h file or DFU SDK API Reference Manual for details. +* +*******************************************************************************/ +void Cy_DFU_TransportStart(void) +{ + CyBLE_CyBtldrCommStart(); +} + +/******************************************************************************* +* Function Name: Cy_DFU_TransportStop +****************************************************************************//** +* +* This function documentation is part of the DFU SDK API, see the +* cy_dfu.h file or DFU SDK API Reference Manual for details. +* +*******************************************************************************/ +void Cy_DFU_TransportStop(void) +{ + CyBLE_CyBtldrCommStop(); +} + + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/dfu_user.h b/2020TPCApp0.cydsn/dfu_user.h new file mode 100644 index 0000000..c9e0fa1 --- /dev/null +++ b/2020TPCApp0.cydsn/dfu_user.h @@ -0,0 +1,151 @@ +/***************************************************************************//** +* \file dfu_user.h +* \version 3.0 +* +* This file provides declarations that can be modified by the user but +* are used by the DFU SDK. +* +******************************************************************************** +* \copyright +* Copyright 2016-2019, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#if !defined(DFU_USER_H) +#define DFU_USER_H + +#include +#include "cy_flash.h" + + +/** +* \addtogroup group_dfu_macro_config +* \{ +*/ + +/** The size of a buffer to hold DFU commands */ +/* 16 bytes is a maximum overhead of a DFU packet and additional data for the Program Data command */ +#define CY_DFU_SIZEOF_CMD_BUFFER (CY_FLASH_SIZEOF_ROW + 16u) + +/** The size of a buffer to hold an NVM row of data to write or verify */ +#define CY_DFU_SIZEOF_DATA_BUFFER (CY_FLASH_SIZEOF_ROW + 16u) + +/** +* Set to non-zero for the DFU SDK Program Data command to check +* if the Golden image is going to be overwritten while updating. +*/ +#define CY_DFU_OPT_GOLDEN_IMAGE (0) + +/** +* List of Golden Image Application IDs. +* Here "Golden Image Application" means an application that cannot be changed with +* CommandProgramData() +* +* Usage. Define the list of Golden Image Application IDs without enclosing +* parenthesis, e.g. +* \code #define CY_DFU_GOLDEN_IMAGE_IDS() 0u, 1u, 3u \endcode +* later it is used in cy_dfu.c file: +* \code uint8_t goldenImages[] = { CY_DFU_GOLDEN_IMAGE_IDS() }; \endcode +*/ +#define CY_DFU_GOLDEN_IMAGE_IDS() 0u + +/** +* The number of applications in the metadata, +* for 512 bytes in a Flash row - 63 is the maximum possible value, +* because 4 bytes are reserved for the entire metadata CRC. +* +* The smallest metadata size if CY_DFU_MAX_APPS * 8 (bytes per one app) + 4 (bytes for CRC-32C) +*/ +#define CY_DFU_MAX_APPS (2u) + + +/** A non-zero value enables the Verify Data DFU command */ +#define CY_DFU_OPT_VERIFY_DATA (1) + +/** A non-zero value enables the Erase Data DFU command */ +#define CY_DFU_OPT_ERASE_DATA (1) + +/** A non-zero value enables the Verify App DFU command */ +#define CY_DFU_OPT_VERIFY_APP (1) + +/** +* A non-zero value enables the Send Data DFU command. +* If the "Send Data" DFU command is enabled, \c packetBuffer and \c dataBuffer +* must be non-overlapping. +* +* Else, \c dataBuffer must be inside \c packetBuffer with an offset of +* \c CY_DFU_PACKET_DATA_IDX, typically 4 bytes. \n +* params->dataBuffer = &packetBuffer[4]; \n +* \note that \c packetBuffer in this case must be 4 bytes aligned, as +* \c dataBuffer is required to be 4 bytes aligned. +*/ +#define CY_DFU_OPT_SEND_DATA (1) + +/** A non-zero value enables the Get Metadata DFU command */ +#define CY_DFU_OPT_GET_METADATA (1) + +/** A non-zero value enables the Set EI Vector DFU command */ +#define CY_DFU_OPT_SET_EIVECTOR (0) + +/** +* A non-zero value allows writing metadata +* with the Set App Metadata DFU command. +*/ +#define CY_DFU_METADATA_WRITABLE (1) + +/** Non-zero value enables the usage of hardware Crypto API */ +#define CY_DFU_OPT_CRYPTO_HW (1) + +/** A non-zero value enables the usage of CRC-16 for DFU packet verification */ +#define CY_DFU_OPT_PACKET_CRC (0) + +/** Set the default application-format-possible values defined in \ref group_dfu_macro_app_type */ +#define CY_DFU_APP_FORMAT (CY_DFU_CYPRESS_APP) + +/** Set the default secure application-verification-type possible values + * defined in \ref group_dfu_macro_ver_type */ +#define CY_DFU_SEC_APP_VERIFY_TYPE (CY_DFU_VERIFY_FAST) + +/** \} group_dfu_macro_config */ + +#if !defined(CY_DOXYGEN) + #if defined(__GNUC__) || defined(__ICCARM__) + /* + * These variables are defined in the linker scripts, the values of their addresses define + * corresponding applications start address and length. + */ + extern uint8_t __cy_app0_verify_start; + extern uint8_t __cy_app0_verify_length; + extern uint8_t __cy_app1_verify_start; + extern uint8_t __cy_app1_verify_length; + extern uint8_t __cy_boot_signature_size; + + #define CY_DFU_APP0_VERIFY_START ( (uint32_t)&__cy_app0_verify_start ) + #define CY_DFU_APP0_VERIFY_LENGTH ( (uint32_t)&__cy_app0_verify_length ) + #define CY_DFU_APP1_VERIFY_START ( (uint32_t)&__cy_app1_verify_start ) + #define CY_DFU_APP1_VERIFY_LENGTH ( (uint32_t)&__cy_app1_verify_length ) + #define CY_DFU_SIGNATURE_SIZE ( (uint32_t)&__cy_boot_signature_size ) + + #elif defined(__ARMCC_VERSION) + #include "dfu_mdk_common.h" + + #define CY_DFU_APP0_VERIFY_START ( CY_APP0_CORE0_FLASH_ADDR ) + #define CY_DFU_APP0_VERIFY_LENGTH ( CY_APP0_CORE0_FLASH_LENGTH + CY_APP0_CORE1_FLASH_LENGTH \ + - CY_BOOT_SIGNATURE_SIZE) + #define CY_DFU_APP1_VERIFY_START ( CY_APP1_CORE0_FLASH_ADDR ) + #define CY_DFU_APP1_VERIFY_LENGTH ( CY_APP1_CORE0_FLASH_LENGTH + CY_APP1_CORE1_FLASH_LENGTH \ + - CY_BOOT_SIGNATURE_SIZE) + #define CY_DFU_SIGNATURE_SIZE CY_BOOT_SIGNATURE_SIZE + + #else + #error "Not implemented for this compiler" + #endif /* defined(__GNUC__) || defined(__ICCARM__) */ +#endif /* !defined(CY_DOXYGEN) */ + + +#endif /* !defined(DFU_USER_H) */ + + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/gcc/startup_psoc6_01_cm0plus.S b/2020TPCApp0.cydsn/gcc/startup_psoc6_01_cm0plus.S new file mode 100644 index 0000000..e26df0a --- /dev/null +++ b/2020TPCApp0.cydsn/gcc/startup_psoc6_01_cm0plus.S @@ -0,0 +1,404 @@ +/**************************************************************************//** + * @file startup_psoc6_01_cm0plus.S + * @brief CMSIS Core Device Startup File for + * ARMCM0plus Device Series + * @version V5.00 + * @date 02. March 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + /* Address of the NMI handler */ + #define CY_NMI_HANLDER_ADDR 0x0000000D + + /* The CPU VTOR register */ + #define CY_CPU_VTOR_ADDR 0xE000ED08 + + /* Copy flash vectors and data section to RAM */ + #define __STARTUP_COPY_MULTIPLE + + /* Clear single BSS section */ + #define __STARTUP_CLEAR_BSS + + .syntax unified + .arch armv6-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00001000 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000400 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long CY_NMI_HANLDER_ADDR /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts Description */ + .long NvicMux0_IRQHandler /* CM0+ NVIC Mux input 0 */ + .long NvicMux1_IRQHandler /* CM0+ NVIC Mux input 1 */ + .long NvicMux2_IRQHandler /* CM0+ NVIC Mux input 2 */ + .long NvicMux3_IRQHandler /* CM0+ NVIC Mux input 3 */ + .long NvicMux4_IRQHandler /* CM0+ NVIC Mux input 4 */ + .long NvicMux5_IRQHandler /* CM0+ NVIC Mux input 5 */ + .long NvicMux6_IRQHandler /* CM0+ NVIC Mux input 6 */ + .long NvicMux7_IRQHandler /* CM0+ NVIC Mux input 7 */ + .long NvicMux8_IRQHandler /* CM0+ NVIC Mux input 8 */ + .long NvicMux9_IRQHandler /* CM0+ NVIC Mux input 9 */ + .long NvicMux10_IRQHandler /* CM0+ NVIC Mux input 10 */ + .long NvicMux11_IRQHandler /* CM0+ NVIC Mux input 11 */ + .long NvicMux12_IRQHandler /* CM0+ NVIC Mux input 12 */ + .long NvicMux13_IRQHandler /* CM0+ NVIC Mux input 13 */ + .long NvicMux14_IRQHandler /* CM0+ NVIC Mux input 14 */ + .long NvicMux15_IRQHandler /* CM0+ NVIC Mux input 15 */ + .long NvicMux16_IRQHandler /* CM0+ NVIC Mux input 16 */ + .long NvicMux17_IRQHandler /* CM0+ NVIC Mux input 17 */ + .long NvicMux18_IRQHandler /* CM0+ NVIC Mux input 18 */ + .long NvicMux19_IRQHandler /* CM0+ NVIC Mux input 19 */ + .long NvicMux20_IRQHandler /* CM0+ NVIC Mux input 20 */ + .long NvicMux21_IRQHandler /* CM0+ NVIC Mux input 21 */ + .long NvicMux22_IRQHandler /* CM0+ NVIC Mux input 22 */ + .long NvicMux23_IRQHandler /* CM0+ NVIC Mux input 23 */ + .long NvicMux24_IRQHandler /* CM0+ NVIC Mux input 24 */ + .long NvicMux25_IRQHandler /* CM0+ NVIC Mux input 25 */ + .long NvicMux26_IRQHandler /* CM0+ NVIC Mux input 26 */ + .long NvicMux27_IRQHandler /* CM0+ NVIC Mux input 27 */ + .long NvicMux28_IRQHandler /* CM0+ NVIC Mux input 28 */ + .long NvicMux29_IRQHandler /* CM0+ NVIC Mux input 29 */ + .long NvicMux30_IRQHandler /* CM0+ NVIC Mux input 30 */ + .long NvicMux31_IRQHandler /* CM0+ NVIC Mux input 31 */ + + .size __Vectors, . - __Vectors + .equ __VectorsSize, . - __Vectors + + .section .ram_vectors + .align 2 + .globl __ramVectors +__ramVectors: + .space __VectorsSize + .size __ramVectors, . - __ramVectors + + + .text + .thumb + .thumb_func + .align 2 + + /* + * Device startup customization + * + * Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) + * because this function is executed as the first instruction in the ResetHandler. + * The PDL is also not initialized to use the proper register offsets. + * The user of this function is responsible for initializing the PDL and resources before using them. + */ + .weak Cy_OnResetUser + .func Cy_OnResetUser, Cy_OnResetUser + .type Cy_OnResetUser, %function + +Cy_OnResetUser: + bx lr + .size Cy_OnResetUser, . - Cy_OnResetUser + .endfunc + + /* Reset handler */ + .weak Reset_Handler + .type Reset_Handler, %function + +Reset_Handler: + bl Cy_OnResetUser + cpsid i + +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + blt .L_loop0_0_done + ldr r0, [r1, r3] + str r0, [r2, r3] + b .L_loop0_0 + +.L_loop0_0_done: + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + + subs r3, r2 + ble .L_loop1_done + +.L_loop1: + subs r3, #4 + ldr r0, [r1,r3] + str r0, [r2,r3] + bgt .L_loop1 + +.L_loop1_done: +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise define macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + blt .L_loop2_0_done + str r0, [r1, r2] + b .L_loop2_0 +.L_loop2_0_done: + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 + + subs r2, r1 + ble .L_loop3_done + +.L_loop3: + subs r2, #4 + str r0, [r1, r2] + bgt .L_loop3 +.L_loop3_done: +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + + /* Update Vector Table Offset Register. */ + ldr r0, =__ramVectors + ldr r1, =CY_CPU_VTOR_ADDR + str r0, [r1] + dsb 0xF + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + + bl main + + /* Should never get here */ + b . + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + .weak Cy_SysLib_FaultHandler + .type Cy_SysLib_FaultHandler, %function + +Cy_SysLib_FaultHandler: + b . + .size Cy_SysLib_FaultHandler, . - Cy_SysLib_FaultHandler + .type Fault_Handler, %function + +Fault_Handler: + /* Storing LR content for Creator call stack trace */ + push {LR} + movs r0, #4 + mov r1, LR + tst r0, r1 + beq .L_MSP + mrs r0, PSP + b .L_API_call +.L_MSP: + mrs r0, MSP +.L_API_call: + /* Compensation of stack pointer address due to pushing 4 bytes of LR */ + adds r0, r0, #4 + bl Cy_SysLib_FaultHandler + b . + .size Fault_Handler, . - Fault_Handler + +.macro def_fault_Handler fault_handler_name + .weak \fault_handler_name + .set \fault_handler_name, Fault_Handler + .endm + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + + def_fault_Handler HardFault_Handler + + def_irq_handler SVC_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler NvicMux0_IRQHandler /* CM0+ NVIC Mux input 0 */ + def_irq_handler NvicMux1_IRQHandler /* CM0+ NVIC Mux input 1 */ + def_irq_handler NvicMux2_IRQHandler /* CM0+ NVIC Mux input 2 */ + def_irq_handler NvicMux3_IRQHandler /* CM0+ NVIC Mux input 3 */ + def_irq_handler NvicMux4_IRQHandler /* CM0+ NVIC Mux input 4 */ + def_irq_handler NvicMux5_IRQHandler /* CM0+ NVIC Mux input 5 */ + def_irq_handler NvicMux6_IRQHandler /* CM0+ NVIC Mux input 6 */ + def_irq_handler NvicMux7_IRQHandler /* CM0+ NVIC Mux input 7 */ + def_irq_handler NvicMux8_IRQHandler /* CM0+ NVIC Mux input 8 */ + def_irq_handler NvicMux9_IRQHandler /* CM0+ NVIC Mux input 9 */ + def_irq_handler NvicMux10_IRQHandler /* CM0+ NVIC Mux input 10 */ + def_irq_handler NvicMux11_IRQHandler /* CM0+ NVIC Mux input 11 */ + def_irq_handler NvicMux12_IRQHandler /* CM0+ NVIC Mux input 12 */ + def_irq_handler NvicMux13_IRQHandler /* CM0+ NVIC Mux input 13 */ + def_irq_handler NvicMux14_IRQHandler /* CM0+ NVIC Mux input 14 */ + def_irq_handler NvicMux15_IRQHandler /* CM0+ NVIC Mux input 15 */ + def_irq_handler NvicMux16_IRQHandler /* CM0+ NVIC Mux input 16 */ + def_irq_handler NvicMux17_IRQHandler /* CM0+ NVIC Mux input 17 */ + def_irq_handler NvicMux18_IRQHandler /* CM0+ NVIC Mux input 18 */ + def_irq_handler NvicMux19_IRQHandler /* CM0+ NVIC Mux input 19 */ + def_irq_handler NvicMux20_IRQHandler /* CM0+ NVIC Mux input 20 */ + def_irq_handler NvicMux21_IRQHandler /* CM0+ NVIC Mux input 21 */ + def_irq_handler NvicMux22_IRQHandler /* CM0+ NVIC Mux input 22 */ + def_irq_handler NvicMux23_IRQHandler /* CM0+ NVIC Mux input 23 */ + def_irq_handler NvicMux24_IRQHandler /* CM0+ NVIC Mux input 24 */ + def_irq_handler NvicMux25_IRQHandler /* CM0+ NVIC Mux input 25 */ + def_irq_handler NvicMux26_IRQHandler /* CM0+ NVIC Mux input 26 */ + def_irq_handler NvicMux27_IRQHandler /* CM0+ NVIC Mux input 27 */ + def_irq_handler NvicMux28_IRQHandler /* CM0+ NVIC Mux input 28 */ + def_irq_handler NvicMux29_IRQHandler /* CM0+ NVIC Mux input 29 */ + def_irq_handler NvicMux30_IRQHandler /* CM0+ NVIC Mux input 30 */ + def_irq_handler NvicMux31_IRQHandler /* CM0+ NVIC Mux input 31 */ + + .end + + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/gcc/startup_psoc6_01_cm4.S b/2020TPCApp0.cydsn/gcc/startup_psoc6_01_cm4.S new file mode 100644 index 0000000..b904621 --- /dev/null +++ b/2020TPCApp0.cydsn/gcc/startup_psoc6_01_cm4.S @@ -0,0 +1,635 @@ +/**************************************************************************//** + * @file startup_psoc6_01_cm4.S + * @brief CMSIS Core Device Startup File for + * ARMCM4 Device Series + * @version V5.00 + * @date 02. March 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + /* Address of the NMI handler */ + #define CY_NMI_HANLDER_ADDR 0x0000000D + + /* The CPU VTOR register */ + #define CY_CPU_VTOR_ADDR 0xE000ED08 + + /* Copy flash vectors and data section to RAM */ + #define __STARTUP_COPY_MULTIPLE + + /* Clear single BSS section */ + #define __STARTUP_CLEAR_BSS + + .syntax unified + .arch armv7-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00001000 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000400 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long CY_NMI_HANLDER_ADDR /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long MemManage_Handler /* MPU Fault Handler */ + .long BusFault_Handler /* Bus Fault Handler */ + .long UsageFault_Handler /* Usage Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long DebugMon_Handler /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts Description */ + .long ioss_interrupts_gpio_0_IRQHandler /* GPIO Port Interrupt #0 */ + .long ioss_interrupts_gpio_1_IRQHandler /* GPIO Port Interrupt #1 */ + .long ioss_interrupts_gpio_2_IRQHandler /* GPIO Port Interrupt #2 */ + .long ioss_interrupts_gpio_3_IRQHandler /* GPIO Port Interrupt #3 */ + .long ioss_interrupts_gpio_4_IRQHandler /* GPIO Port Interrupt #4 */ + .long ioss_interrupts_gpio_5_IRQHandler /* GPIO Port Interrupt #5 */ + .long ioss_interrupts_gpio_6_IRQHandler /* GPIO Port Interrupt #6 */ + .long ioss_interrupts_gpio_7_IRQHandler /* GPIO Port Interrupt #7 */ + .long ioss_interrupts_gpio_8_IRQHandler /* GPIO Port Interrupt #8 */ + .long ioss_interrupts_gpio_9_IRQHandler /* GPIO Port Interrupt #9 */ + .long ioss_interrupts_gpio_10_IRQHandler /* GPIO Port Interrupt #10 */ + .long ioss_interrupts_gpio_11_IRQHandler /* GPIO Port Interrupt #11 */ + .long ioss_interrupts_gpio_12_IRQHandler /* GPIO Port Interrupt #12 */ + .long ioss_interrupts_gpio_13_IRQHandler /* GPIO Port Interrupt #13 */ + .long ioss_interrupts_gpio_14_IRQHandler /* GPIO Port Interrupt #14 */ + .long ioss_interrupt_gpio_IRQHandler /* GPIO All Ports */ + .long ioss_interrupt_vdd_IRQHandler /* GPIO Supply Detect Interrupt */ + .long lpcomp_interrupt_IRQHandler /* Low Power Comparator Interrupt */ + .long scb_8_interrupt_IRQHandler /* Serial Communication Block #8 (DeepSleep capable) */ + .long srss_interrupt_mcwdt_0_IRQHandler /* Multi Counter Watchdog Timer interrupt */ + .long srss_interrupt_mcwdt_1_IRQHandler /* Multi Counter Watchdog Timer interrupt */ + .long srss_interrupt_backup_IRQHandler /* Backup domain interrupt */ + .long srss_interrupt_IRQHandler /* Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) */ + .long pass_interrupt_ctbs_IRQHandler /* CTBm Interrupt (all CTBms) */ + .long bless_interrupt_IRQHandler /* Bluetooth Radio interrupt */ + .long cpuss_interrupts_ipc_0_IRQHandler /* CPUSS Inter Process Communication Interrupt #0 */ + .long cpuss_interrupts_ipc_1_IRQHandler /* CPUSS Inter Process Communication Interrupt #1 */ + .long cpuss_interrupts_ipc_2_IRQHandler /* CPUSS Inter Process Communication Interrupt #2 */ + .long cpuss_interrupts_ipc_3_IRQHandler /* CPUSS Inter Process Communication Interrupt #3 */ + .long cpuss_interrupts_ipc_4_IRQHandler /* CPUSS Inter Process Communication Interrupt #4 */ + .long cpuss_interrupts_ipc_5_IRQHandler /* CPUSS Inter Process Communication Interrupt #5 */ + .long cpuss_interrupts_ipc_6_IRQHandler /* CPUSS Inter Process Communication Interrupt #6 */ + .long cpuss_interrupts_ipc_7_IRQHandler /* CPUSS Inter Process Communication Interrupt #7 */ + .long cpuss_interrupts_ipc_8_IRQHandler /* CPUSS Inter Process Communication Interrupt #8 */ + .long cpuss_interrupts_ipc_9_IRQHandler /* CPUSS Inter Process Communication Interrupt #9 */ + .long cpuss_interrupts_ipc_10_IRQHandler /* CPUSS Inter Process Communication Interrupt #10 */ + .long cpuss_interrupts_ipc_11_IRQHandler /* CPUSS Inter Process Communication Interrupt #11 */ + .long cpuss_interrupts_ipc_12_IRQHandler /* CPUSS Inter Process Communication Interrupt #12 */ + .long cpuss_interrupts_ipc_13_IRQHandler /* CPUSS Inter Process Communication Interrupt #13 */ + .long cpuss_interrupts_ipc_14_IRQHandler /* CPUSS Inter Process Communication Interrupt #14 */ + .long cpuss_interrupts_ipc_15_IRQHandler /* CPUSS Inter Process Communication Interrupt #15 */ + .long scb_0_interrupt_IRQHandler /* Serial Communication Block #0 */ + .long scb_1_interrupt_IRQHandler /* Serial Communication Block #1 */ + .long scb_2_interrupt_IRQHandler /* Serial Communication Block #2 */ + .long scb_3_interrupt_IRQHandler /* Serial Communication Block #3 */ + .long scb_4_interrupt_IRQHandler /* Serial Communication Block #4 */ + .long scb_5_interrupt_IRQHandler /* Serial Communication Block #5 */ + .long scb_6_interrupt_IRQHandler /* Serial Communication Block #6 */ + .long scb_7_interrupt_IRQHandler /* Serial Communication Block #7 */ + .long csd_interrupt_IRQHandler /* CSD (Capsense) interrupt */ + .long cpuss_interrupts_dw0_0_IRQHandler /* CPUSS DataWire #0, Channel #0 */ + .long cpuss_interrupts_dw0_1_IRQHandler /* CPUSS DataWire #0, Channel #1 */ + .long cpuss_interrupts_dw0_2_IRQHandler /* CPUSS DataWire #0, Channel #2 */ + .long cpuss_interrupts_dw0_3_IRQHandler /* CPUSS DataWire #0, Channel #3 */ + .long cpuss_interrupts_dw0_4_IRQHandler /* CPUSS DataWire #0, Channel #4 */ + .long cpuss_interrupts_dw0_5_IRQHandler /* CPUSS DataWire #0, Channel #5 */ + .long cpuss_interrupts_dw0_6_IRQHandler /* CPUSS DataWire #0, Channel #6 */ + .long cpuss_interrupts_dw0_7_IRQHandler /* CPUSS DataWire #0, Channel #7 */ + .long cpuss_interrupts_dw0_8_IRQHandler /* CPUSS DataWire #0, Channel #8 */ + .long cpuss_interrupts_dw0_9_IRQHandler /* CPUSS DataWire #0, Channel #9 */ + .long cpuss_interrupts_dw0_10_IRQHandler /* CPUSS DataWire #0, Channel #10 */ + .long cpuss_interrupts_dw0_11_IRQHandler /* CPUSS DataWire #0, Channel #11 */ + .long cpuss_interrupts_dw0_12_IRQHandler /* CPUSS DataWire #0, Channel #12 */ + .long cpuss_interrupts_dw0_13_IRQHandler /* CPUSS DataWire #0, Channel #13 */ + .long cpuss_interrupts_dw0_14_IRQHandler /* CPUSS DataWire #0, Channel #14 */ + .long cpuss_interrupts_dw0_15_IRQHandler /* CPUSS DataWire #0, Channel #15 */ + .long cpuss_interrupts_dw1_0_IRQHandler /* CPUSS DataWire #1, Channel #0 */ + .long cpuss_interrupts_dw1_1_IRQHandler /* CPUSS DataWire #1, Channel #1 */ + .long cpuss_interrupts_dw1_2_IRQHandler /* CPUSS DataWire #1, Channel #2 */ + .long cpuss_interrupts_dw1_3_IRQHandler /* CPUSS DataWire #1, Channel #3 */ + .long cpuss_interrupts_dw1_4_IRQHandler /* CPUSS DataWire #1, Channel #4 */ + .long cpuss_interrupts_dw1_5_IRQHandler /* CPUSS DataWire #1, Channel #5 */ + .long cpuss_interrupts_dw1_6_IRQHandler /* CPUSS DataWire #1, Channel #6 */ + .long cpuss_interrupts_dw1_7_IRQHandler /* CPUSS DataWire #1, Channel #7 */ + .long cpuss_interrupts_dw1_8_IRQHandler /* CPUSS DataWire #1, Channel #8 */ + .long cpuss_interrupts_dw1_9_IRQHandler /* CPUSS DataWire #1, Channel #9 */ + .long cpuss_interrupts_dw1_10_IRQHandler /* CPUSS DataWire #1, Channel #10 */ + .long cpuss_interrupts_dw1_11_IRQHandler /* CPUSS DataWire #1, Channel #11 */ + .long cpuss_interrupts_dw1_12_IRQHandler /* CPUSS DataWire #1, Channel #12 */ + .long cpuss_interrupts_dw1_13_IRQHandler /* CPUSS DataWire #1, Channel #13 */ + .long cpuss_interrupts_dw1_14_IRQHandler /* CPUSS DataWire #1, Channel #14 */ + .long cpuss_interrupts_dw1_15_IRQHandler /* CPUSS DataWire #1, Channel #15 */ + .long cpuss_interrupts_fault_0_IRQHandler /* CPUSS Fault Structure Interrupt #0 */ + .long cpuss_interrupts_fault_1_IRQHandler /* CPUSS Fault Structure Interrupt #1 */ + .long cpuss_interrupt_crypto_IRQHandler /* CRYPTO Accelerator Interrupt */ + .long cpuss_interrupt_fm_IRQHandler /* FLASH Macro Interrupt */ + .long cpuss_interrupts_cm0_cti_0_IRQHandler /* CM0+ CTI #0 */ + .long cpuss_interrupts_cm0_cti_1_IRQHandler /* CM0+ CTI #1 */ + .long cpuss_interrupts_cm4_cti_0_IRQHandler /* CM4 CTI #0 */ + .long cpuss_interrupts_cm4_cti_1_IRQHandler /* CM4 CTI #1 */ + .long tcpwm_0_interrupts_0_IRQHandler /* TCPWM #0, Counter #0 */ + .long tcpwm_0_interrupts_1_IRQHandler /* TCPWM #0, Counter #1 */ + .long tcpwm_0_interrupts_2_IRQHandler /* TCPWM #0, Counter #2 */ + .long tcpwm_0_interrupts_3_IRQHandler /* TCPWM #0, Counter #3 */ + .long tcpwm_0_interrupts_4_IRQHandler /* TCPWM #0, Counter #4 */ + .long tcpwm_0_interrupts_5_IRQHandler /* TCPWM #0, Counter #5 */ + .long tcpwm_0_interrupts_6_IRQHandler /* TCPWM #0, Counter #6 */ + .long tcpwm_0_interrupts_7_IRQHandler /* TCPWM #0, Counter #7 */ + .long tcpwm_1_interrupts_0_IRQHandler /* TCPWM #1, Counter #0 */ + .long tcpwm_1_interrupts_1_IRQHandler /* TCPWM #1, Counter #1 */ + .long tcpwm_1_interrupts_2_IRQHandler /* TCPWM #1, Counter #2 */ + .long tcpwm_1_interrupts_3_IRQHandler /* TCPWM #1, Counter #3 */ + .long tcpwm_1_interrupts_4_IRQHandler /* TCPWM #1, Counter #4 */ + .long tcpwm_1_interrupts_5_IRQHandler /* TCPWM #1, Counter #5 */ + .long tcpwm_1_interrupts_6_IRQHandler /* TCPWM #1, Counter #6 */ + .long tcpwm_1_interrupts_7_IRQHandler /* TCPWM #1, Counter #7 */ + .long tcpwm_1_interrupts_8_IRQHandler /* TCPWM #1, Counter #8 */ + .long tcpwm_1_interrupts_9_IRQHandler /* TCPWM #1, Counter #9 */ + .long tcpwm_1_interrupts_10_IRQHandler /* TCPWM #1, Counter #10 */ + .long tcpwm_1_interrupts_11_IRQHandler /* TCPWM #1, Counter #11 */ + .long tcpwm_1_interrupts_12_IRQHandler /* TCPWM #1, Counter #12 */ + .long tcpwm_1_interrupts_13_IRQHandler /* TCPWM #1, Counter #13 */ + .long tcpwm_1_interrupts_14_IRQHandler /* TCPWM #1, Counter #14 */ + .long tcpwm_1_interrupts_15_IRQHandler /* TCPWM #1, Counter #15 */ + .long tcpwm_1_interrupts_16_IRQHandler /* TCPWM #1, Counter #16 */ + .long tcpwm_1_interrupts_17_IRQHandler /* TCPWM #1, Counter #17 */ + .long tcpwm_1_interrupts_18_IRQHandler /* TCPWM #1, Counter #18 */ + .long tcpwm_1_interrupts_19_IRQHandler /* TCPWM #1, Counter #19 */ + .long tcpwm_1_interrupts_20_IRQHandler /* TCPWM #1, Counter #20 */ + .long tcpwm_1_interrupts_21_IRQHandler /* TCPWM #1, Counter #21 */ + .long tcpwm_1_interrupts_22_IRQHandler /* TCPWM #1, Counter #22 */ + .long tcpwm_1_interrupts_23_IRQHandler /* TCPWM #1, Counter #23 */ + .long udb_interrupts_0_IRQHandler /* UDB Interrupt #0 */ + .long udb_interrupts_1_IRQHandler /* UDB Interrupt #1 */ + .long udb_interrupts_2_IRQHandler /* UDB Interrupt #2 */ + .long udb_interrupts_3_IRQHandler /* UDB Interrupt #3 */ + .long udb_interrupts_4_IRQHandler /* UDB Interrupt #4 */ + .long udb_interrupts_5_IRQHandler /* UDB Interrupt #5 */ + .long udb_interrupts_6_IRQHandler /* UDB Interrupt #6 */ + .long udb_interrupts_7_IRQHandler /* UDB Interrupt #7 */ + .long udb_interrupts_8_IRQHandler /* UDB Interrupt #8 */ + .long udb_interrupts_9_IRQHandler /* UDB Interrupt #9 */ + .long udb_interrupts_10_IRQHandler /* UDB Interrupt #10 */ + .long udb_interrupts_11_IRQHandler /* UDB Interrupt #11 */ + .long udb_interrupts_12_IRQHandler /* UDB Interrupt #12 */ + .long udb_interrupts_13_IRQHandler /* UDB Interrupt #13 */ + .long udb_interrupts_14_IRQHandler /* UDB Interrupt #14 */ + .long udb_interrupts_15_IRQHandler /* UDB Interrupt #15 */ + .long pass_interrupt_sar_IRQHandler /* SAR ADC interrupt */ + .long audioss_interrupt_i2s_IRQHandler /* I2S Audio interrupt */ + .long audioss_interrupt_pdm_IRQHandler /* PDM/PCM Audio interrupt */ + .long profile_interrupt_IRQHandler /* Energy Profiler interrupt */ + .long smif_interrupt_IRQHandler /* Serial Memory Interface interrupt */ + .long usb_interrupt_hi_IRQHandler /* USB Interrupt */ + .long usb_interrupt_med_IRQHandler /* USB Interrupt */ + .long usb_interrupt_lo_IRQHandler /* USB Interrupt */ + .long pass_interrupt_dacs_IRQHandler /* Consolidated interrrupt for all DACs */ + + + .size __Vectors, . - __Vectors + .equ __VectorsSize, . - __Vectors + + .section .ram_vectors + .align 2 + .globl __ramVectors +__ramVectors: + .space __VectorsSize + .size __ramVectors, . - __ramVectors + + + .text + .thumb + .thumb_func + .align 2 + + /* + * Device startup customization + * + * Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) + * because this function is executed as the first instruction in the ResetHandler. + * The PDL is also not initialized to use the proper register offsets. + * The user of this function is responsible for initializing the PDL and resources before using them. + */ + .weak Cy_OnResetUser + .func Cy_OnResetUser, Cy_OnResetUser + .type Cy_OnResetUser, %function + +Cy_OnResetUser: + bx lr + .size Cy_OnResetUser, . - Cy_OnResetUser + .endfunc + + /* Reset handler */ + .weak Reset_Handler + .type Reset_Handler, %function + +Reset_Handler: + bl Cy_OnResetUser + cpsid i + +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + ittt ge + ldrge r0, [r1, r3] + strge r0, [r2, r3] + bge .L_loop0_0 + + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + +.L_loop1: + cmp r2, r3 + ittt lt + ldrlt r0, [r1], #4 + strlt r0, [r2], #4 + blt .L_loop1 +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise define macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + itt ge + strge r0, [r1, r2] + bge .L_loop2_0 + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 +.L_loop3: + cmp r1, r2 + itt lt + strlt r0, [r1], #4 + blt .L_loop3 +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + + /* Update Vector Table Offset Register. */ + ldr r0, =__ramVectors + ldr r1, =CY_CPU_VTOR_ADDR + str r0, [r1] + dsb 0xF + + /* Enable the FPU if used */ + bl Cy_SystemInitFpuEnable + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + + bl main + + /* Should never get here */ + b . + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function + +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + + + .weak Cy_SysLib_FaultHandler + .type Cy_SysLib_FaultHandler, %function + +Cy_SysLib_FaultHandler: + b . + .size Cy_SysLib_FaultHandler, . - Cy_SysLib_FaultHandler + .type Fault_Handler, %function + +Fault_Handler: + /* Storing LR content for Creator call stack trace */ + push {LR} + movs r0, #4 + mov r1, LR + tst r0, r1 + beq .L_MSP + mrs r0, PSP + b .L_API_call +.L_MSP: + mrs r0, MSP +.L_API_call: + /* Compensation of stack pointer address due to pushing 4 bytes of LR */ + adds r0, r0, #4 + bl Cy_SysLib_FaultHandler + b . + .size Fault_Handler, . - Fault_Handler + +.macro def_fault_Handler fault_handler_name + .weak \fault_handler_name + .set \fault_handler_name, Fault_Handler + .endm + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + + def_fault_Handler HardFault_Handler + def_fault_Handler MemManage_Handler + def_fault_Handler BusFault_Handler + def_fault_Handler UsageFault_Handler + + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler ioss_interrupts_gpio_0_IRQHandler /* GPIO Port Interrupt #0 */ + def_irq_handler ioss_interrupts_gpio_1_IRQHandler /* GPIO Port Interrupt #1 */ + def_irq_handler ioss_interrupts_gpio_2_IRQHandler /* GPIO Port Interrupt #2 */ + def_irq_handler ioss_interrupts_gpio_3_IRQHandler /* GPIO Port Interrupt #3 */ + def_irq_handler ioss_interrupts_gpio_4_IRQHandler /* GPIO Port Interrupt #4 */ + def_irq_handler ioss_interrupts_gpio_5_IRQHandler /* GPIO Port Interrupt #5 */ + def_irq_handler ioss_interrupts_gpio_6_IRQHandler /* GPIO Port Interrupt #6 */ + def_irq_handler ioss_interrupts_gpio_7_IRQHandler /* GPIO Port Interrupt #7 */ + def_irq_handler ioss_interrupts_gpio_8_IRQHandler /* GPIO Port Interrupt #8 */ + def_irq_handler ioss_interrupts_gpio_9_IRQHandler /* GPIO Port Interrupt #9 */ + def_irq_handler ioss_interrupts_gpio_10_IRQHandler /* GPIO Port Interrupt #10 */ + def_irq_handler ioss_interrupts_gpio_11_IRQHandler /* GPIO Port Interrupt #11 */ + def_irq_handler ioss_interrupts_gpio_12_IRQHandler /* GPIO Port Interrupt #12 */ + def_irq_handler ioss_interrupts_gpio_13_IRQHandler /* GPIO Port Interrupt #13 */ + def_irq_handler ioss_interrupts_gpio_14_IRQHandler /* GPIO Port Interrupt #14 */ + def_irq_handler ioss_interrupt_gpio_IRQHandler /* GPIO All Ports */ + def_irq_handler ioss_interrupt_vdd_IRQHandler /* GPIO Supply Detect Interrupt */ + def_irq_handler lpcomp_interrupt_IRQHandler /* Low Power Comparator Interrupt */ + def_irq_handler scb_8_interrupt_IRQHandler /* Serial Communication Block #8 (DeepSleep capable) */ + def_irq_handler srss_interrupt_mcwdt_0_IRQHandler /* Multi Counter Watchdog Timer interrupt */ + def_irq_handler srss_interrupt_mcwdt_1_IRQHandler /* Multi Counter Watchdog Timer interrupt */ + def_irq_handler srss_interrupt_backup_IRQHandler /* Backup domain interrupt */ + def_irq_handler srss_interrupt_IRQHandler /* Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) */ + def_irq_handler pass_interrupt_ctbs_IRQHandler /* CTBm Interrupt (all CTBms) */ + def_irq_handler bless_interrupt_IRQHandler /* Bluetooth Radio interrupt */ + def_irq_handler cpuss_interrupts_ipc_0_IRQHandler /* CPUSS Inter Process Communication Interrupt #0 */ + def_irq_handler cpuss_interrupts_ipc_1_IRQHandler /* CPUSS Inter Process Communication Interrupt #1 */ + def_irq_handler cpuss_interrupts_ipc_2_IRQHandler /* CPUSS Inter Process Communication Interrupt #2 */ + def_irq_handler cpuss_interrupts_ipc_3_IRQHandler /* CPUSS Inter Process Communication Interrupt #3 */ + def_irq_handler cpuss_interrupts_ipc_4_IRQHandler /* CPUSS Inter Process Communication Interrupt #4 */ + def_irq_handler cpuss_interrupts_ipc_5_IRQHandler /* CPUSS Inter Process Communication Interrupt #5 */ + def_irq_handler cpuss_interrupts_ipc_6_IRQHandler /* CPUSS Inter Process Communication Interrupt #6 */ + def_irq_handler cpuss_interrupts_ipc_7_IRQHandler /* CPUSS Inter Process Communication Interrupt #7 */ + def_irq_handler cpuss_interrupts_ipc_8_IRQHandler /* CPUSS Inter Process Communication Interrupt #8 */ + def_irq_handler cpuss_interrupts_ipc_9_IRQHandler /* CPUSS Inter Process Communication Interrupt #9 */ + def_irq_handler cpuss_interrupts_ipc_10_IRQHandler /* CPUSS Inter Process Communication Interrupt #10 */ + def_irq_handler cpuss_interrupts_ipc_11_IRQHandler /* CPUSS Inter Process Communication Interrupt #11 */ + def_irq_handler cpuss_interrupts_ipc_12_IRQHandler /* CPUSS Inter Process Communication Interrupt #12 */ + def_irq_handler cpuss_interrupts_ipc_13_IRQHandler /* CPUSS Inter Process Communication Interrupt #13 */ + def_irq_handler cpuss_interrupts_ipc_14_IRQHandler /* CPUSS Inter Process Communication Interrupt #14 */ + def_irq_handler cpuss_interrupts_ipc_15_IRQHandler /* CPUSS Inter Process Communication Interrupt #15 */ + def_irq_handler scb_0_interrupt_IRQHandler /* Serial Communication Block #0 */ + def_irq_handler scb_1_interrupt_IRQHandler /* Serial Communication Block #1 */ + def_irq_handler scb_2_interrupt_IRQHandler /* Serial Communication Block #2 */ + def_irq_handler scb_3_interrupt_IRQHandler /* Serial Communication Block #3 */ + def_irq_handler scb_4_interrupt_IRQHandler /* Serial Communication Block #4 */ + def_irq_handler scb_5_interrupt_IRQHandler /* Serial Communication Block #5 */ + def_irq_handler scb_6_interrupt_IRQHandler /* Serial Communication Block #6 */ + def_irq_handler scb_7_interrupt_IRQHandler /* Serial Communication Block #7 */ + def_irq_handler csd_interrupt_IRQHandler /* CSD (Capsense) interrupt */ + def_irq_handler cpuss_interrupts_dw0_0_IRQHandler /* CPUSS DataWire #0, Channel #0 */ + def_irq_handler cpuss_interrupts_dw0_1_IRQHandler /* CPUSS DataWire #0, Channel #1 */ + def_irq_handler cpuss_interrupts_dw0_2_IRQHandler /* CPUSS DataWire #0, Channel #2 */ + def_irq_handler cpuss_interrupts_dw0_3_IRQHandler /* CPUSS DataWire #0, Channel #3 */ + def_irq_handler cpuss_interrupts_dw0_4_IRQHandler /* CPUSS DataWire #0, Channel #4 */ + def_irq_handler cpuss_interrupts_dw0_5_IRQHandler /* CPUSS DataWire #0, Channel #5 */ + def_irq_handler cpuss_interrupts_dw0_6_IRQHandler /* CPUSS DataWire #0, Channel #6 */ + def_irq_handler cpuss_interrupts_dw0_7_IRQHandler /* CPUSS DataWire #0, Channel #7 */ + def_irq_handler cpuss_interrupts_dw0_8_IRQHandler /* CPUSS DataWire #0, Channel #8 */ + def_irq_handler cpuss_interrupts_dw0_9_IRQHandler /* CPUSS DataWire #0, Channel #9 */ + def_irq_handler cpuss_interrupts_dw0_10_IRQHandler /* CPUSS DataWire #0, Channel #10 */ + def_irq_handler cpuss_interrupts_dw0_11_IRQHandler /* CPUSS DataWire #0, Channel #11 */ + def_irq_handler cpuss_interrupts_dw0_12_IRQHandler /* CPUSS DataWire #0, Channel #12 */ + def_irq_handler cpuss_interrupts_dw0_13_IRQHandler /* CPUSS DataWire #0, Channel #13 */ + def_irq_handler cpuss_interrupts_dw0_14_IRQHandler /* CPUSS DataWire #0, Channel #14 */ + def_irq_handler cpuss_interrupts_dw0_15_IRQHandler /* CPUSS DataWire #0, Channel #15 */ + def_irq_handler cpuss_interrupts_dw1_0_IRQHandler /* CPUSS DataWire #1, Channel #0 */ + def_irq_handler cpuss_interrupts_dw1_1_IRQHandler /* CPUSS DataWire #1, Channel #1 */ + def_irq_handler cpuss_interrupts_dw1_2_IRQHandler /* CPUSS DataWire #1, Channel #2 */ + def_irq_handler cpuss_interrupts_dw1_3_IRQHandler /* CPUSS DataWire #1, Channel #3 */ + def_irq_handler cpuss_interrupts_dw1_4_IRQHandler /* CPUSS DataWire #1, Channel #4 */ + def_irq_handler cpuss_interrupts_dw1_5_IRQHandler /* CPUSS DataWire #1, Channel #5 */ + def_irq_handler cpuss_interrupts_dw1_6_IRQHandler /* CPUSS DataWire #1, Channel #6 */ + def_irq_handler cpuss_interrupts_dw1_7_IRQHandler /* CPUSS DataWire #1, Channel #7 */ + def_irq_handler cpuss_interrupts_dw1_8_IRQHandler /* CPUSS DataWire #1, Channel #8 */ + def_irq_handler cpuss_interrupts_dw1_9_IRQHandler /* CPUSS DataWire #1, Channel #9 */ + def_irq_handler cpuss_interrupts_dw1_10_IRQHandler /* CPUSS DataWire #1, Channel #10 */ + def_irq_handler cpuss_interrupts_dw1_11_IRQHandler /* CPUSS DataWire #1, Channel #11 */ + def_irq_handler cpuss_interrupts_dw1_12_IRQHandler /* CPUSS DataWire #1, Channel #12 */ + def_irq_handler cpuss_interrupts_dw1_13_IRQHandler /* CPUSS DataWire #1, Channel #13 */ + def_irq_handler cpuss_interrupts_dw1_14_IRQHandler /* CPUSS DataWire #1, Channel #14 */ + def_irq_handler cpuss_interrupts_dw1_15_IRQHandler /* CPUSS DataWire #1, Channel #15 */ + def_irq_handler cpuss_interrupts_fault_0_IRQHandler /* CPUSS Fault Structure Interrupt #0 */ + def_irq_handler cpuss_interrupts_fault_1_IRQHandler /* CPUSS Fault Structure Interrupt #1 */ + def_irq_handler cpuss_interrupt_crypto_IRQHandler /* CRYPTO Accelerator Interrupt */ + def_irq_handler cpuss_interrupt_fm_IRQHandler /* FLASH Macro Interrupt */ + def_irq_handler cpuss_interrupts_cm0_cti_0_IRQHandler /* CM0+ CTI #0 */ + def_irq_handler cpuss_interrupts_cm0_cti_1_IRQHandler /* CM0+ CTI #1 */ + def_irq_handler cpuss_interrupts_cm4_cti_0_IRQHandler /* CM4 CTI #0 */ + def_irq_handler cpuss_interrupts_cm4_cti_1_IRQHandler /* CM4 CTI #1 */ + def_irq_handler tcpwm_0_interrupts_0_IRQHandler /* TCPWM #0, Counter #0 */ + def_irq_handler tcpwm_0_interrupts_1_IRQHandler /* TCPWM #0, Counter #1 */ + def_irq_handler tcpwm_0_interrupts_2_IRQHandler /* TCPWM #0, Counter #2 */ + def_irq_handler tcpwm_0_interrupts_3_IRQHandler /* TCPWM #0, Counter #3 */ + def_irq_handler tcpwm_0_interrupts_4_IRQHandler /* TCPWM #0, Counter #4 */ + def_irq_handler tcpwm_0_interrupts_5_IRQHandler /* TCPWM #0, Counter #5 */ + def_irq_handler tcpwm_0_interrupts_6_IRQHandler /* TCPWM #0, Counter #6 */ + def_irq_handler tcpwm_0_interrupts_7_IRQHandler /* TCPWM #0, Counter #7 */ + def_irq_handler tcpwm_1_interrupts_0_IRQHandler /* TCPWM #1, Counter #0 */ + def_irq_handler tcpwm_1_interrupts_1_IRQHandler /* TCPWM #1, Counter #1 */ + def_irq_handler tcpwm_1_interrupts_2_IRQHandler /* TCPWM #1, Counter #2 */ + def_irq_handler tcpwm_1_interrupts_3_IRQHandler /* TCPWM #1, Counter #3 */ + def_irq_handler tcpwm_1_interrupts_4_IRQHandler /* TCPWM #1, Counter #4 */ + def_irq_handler tcpwm_1_interrupts_5_IRQHandler /* TCPWM #1, Counter #5 */ + def_irq_handler tcpwm_1_interrupts_6_IRQHandler /* TCPWM #1, Counter #6 */ + def_irq_handler tcpwm_1_interrupts_7_IRQHandler /* TCPWM #1, Counter #7 */ + def_irq_handler tcpwm_1_interrupts_8_IRQHandler /* TCPWM #1, Counter #8 */ + def_irq_handler tcpwm_1_interrupts_9_IRQHandler /* TCPWM #1, Counter #9 */ + def_irq_handler tcpwm_1_interrupts_10_IRQHandler /* TCPWM #1, Counter #10 */ + def_irq_handler tcpwm_1_interrupts_11_IRQHandler /* TCPWM #1, Counter #11 */ + def_irq_handler tcpwm_1_interrupts_12_IRQHandler /* TCPWM #1, Counter #12 */ + def_irq_handler tcpwm_1_interrupts_13_IRQHandler /* TCPWM #1, Counter #13 */ + def_irq_handler tcpwm_1_interrupts_14_IRQHandler /* TCPWM #1, Counter #14 */ + def_irq_handler tcpwm_1_interrupts_15_IRQHandler /* TCPWM #1, Counter #15 */ + def_irq_handler tcpwm_1_interrupts_16_IRQHandler /* TCPWM #1, Counter #16 */ + def_irq_handler tcpwm_1_interrupts_17_IRQHandler /* TCPWM #1, Counter #17 */ + def_irq_handler tcpwm_1_interrupts_18_IRQHandler /* TCPWM #1, Counter #18 */ + def_irq_handler tcpwm_1_interrupts_19_IRQHandler /* TCPWM #1, Counter #19 */ + def_irq_handler tcpwm_1_interrupts_20_IRQHandler /* TCPWM #1, Counter #20 */ + def_irq_handler tcpwm_1_interrupts_21_IRQHandler /* TCPWM #1, Counter #21 */ + def_irq_handler tcpwm_1_interrupts_22_IRQHandler /* TCPWM #1, Counter #22 */ + def_irq_handler tcpwm_1_interrupts_23_IRQHandler /* TCPWM #1, Counter #23 */ + def_irq_handler udb_interrupts_0_IRQHandler /* UDB Interrupt #0 */ + def_irq_handler udb_interrupts_1_IRQHandler /* UDB Interrupt #1 */ + def_irq_handler udb_interrupts_2_IRQHandler /* UDB Interrupt #2 */ + def_irq_handler udb_interrupts_3_IRQHandler /* UDB Interrupt #3 */ + def_irq_handler udb_interrupts_4_IRQHandler /* UDB Interrupt #4 */ + def_irq_handler udb_interrupts_5_IRQHandler /* UDB Interrupt #5 */ + def_irq_handler udb_interrupts_6_IRQHandler /* UDB Interrupt #6 */ + def_irq_handler udb_interrupts_7_IRQHandler /* UDB Interrupt #7 */ + def_irq_handler udb_interrupts_8_IRQHandler /* UDB Interrupt #8 */ + def_irq_handler udb_interrupts_9_IRQHandler /* UDB Interrupt #9 */ + def_irq_handler udb_interrupts_10_IRQHandler /* UDB Interrupt #10 */ + def_irq_handler udb_interrupts_11_IRQHandler /* UDB Interrupt #11 */ + def_irq_handler udb_interrupts_12_IRQHandler /* UDB Interrupt #12 */ + def_irq_handler udb_interrupts_13_IRQHandler /* UDB Interrupt #13 */ + def_irq_handler udb_interrupts_14_IRQHandler /* UDB Interrupt #14 */ + def_irq_handler udb_interrupts_15_IRQHandler /* UDB Interrupt #15 */ + def_irq_handler pass_interrupt_sar_IRQHandler /* SAR ADC interrupt */ + def_irq_handler audioss_interrupt_i2s_IRQHandler /* I2S Audio interrupt */ + def_irq_handler audioss_interrupt_pdm_IRQHandler /* PDM/PCM Audio interrupt */ + def_irq_handler profile_interrupt_IRQHandler /* Energy Profiler interrupt */ + def_irq_handler smif_interrupt_IRQHandler /* Serial Memory Interface interrupt */ + def_irq_handler usb_interrupt_hi_IRQHandler /* USB Interrupt */ + def_irq_handler usb_interrupt_med_IRQHandler /* USB Interrupt */ + def_irq_handler usb_interrupt_lo_IRQHandler /* USB Interrupt */ + def_irq_handler pass_interrupt_dacs_IRQHandler /* Consolidated interrrupt for all DACs */ + + .end + + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/iar/startup_psoc6_01_cm0plus.s b/2020TPCApp0.cydsn/iar/startup_psoc6_01_cm0plus.s new file mode 100644 index 0000000..a867384 --- /dev/null +++ b/2020TPCApp0.cydsn/iar/startup_psoc6_01_cm0plus.s @@ -0,0 +1,423 @@ +;/**************************************************************************//** +; * @file startup_psoc6_01_cm0plus.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0plus Device Series +; * @version V5.00 +; * @date 08. March 2016 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2016 ARM Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * Licensed under the Apache License, Version 2.0 (the License); you may +; * not use this file except in compliance with the License. +; * You may obtain a copy of the License at +; * +; * www.apache.org/licenses/LICENSE-2.0 +; * +; * 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. +; */ + +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + SECTION .intvec_ram:DATA:NOROOT(2) + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + EXTERN __iar_data_init3 + PUBLIC __vector_table + PUBLIC __vector_table_0x1c + PUBLIC __Vectors + PUBLIC __Vectors_End + PUBLIC __Vectors_Size + PUBLIC __ramVectors + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler + + DCD 0x0000000D ; NMI_Handler is defined in ROM code + DCD HardFault_Handler + DCD 0 + DCD 0 + DCD 0 +__vector_table_0x1c + DCD 0 + DCD 0 + DCD 0 + DCD 0 + DCD SVC_Handler + DCD 0 + DCD 0 + DCD PendSV_Handler + DCD SysTick_Handler + + ; External interrupts Power Mode Description + DCD NvicMux0_IRQHandler ; CM0+ NVIC Mux input 0 + DCD NvicMux1_IRQHandler ; CM0+ NVIC Mux input 1 + DCD NvicMux2_IRQHandler ; CM0+ NVIC Mux input 2 + DCD NvicMux3_IRQHandler ; CM0+ NVIC Mux input 3 + DCD NvicMux4_IRQHandler ; CM0+ NVIC Mux input 4 + DCD NvicMux5_IRQHandler ; CM0+ NVIC Mux input 5 + DCD NvicMux6_IRQHandler ; CM0+ NVIC Mux input 6 + DCD NvicMux7_IRQHandler ; CM0+ NVIC Mux input 7 + DCD NvicMux8_IRQHandler ; CM0+ NVIC Mux input 8 + DCD NvicMux9_IRQHandler ; CM0+ NVIC Mux input 9 + DCD NvicMux10_IRQHandler ; CM0+ NVIC Mux input 10 + DCD NvicMux11_IRQHandler ; CM0+ NVIC Mux input 11 + DCD NvicMux12_IRQHandler ; CM0+ NVIC Mux input 12 + DCD NvicMux13_IRQHandler ; CM0+ NVIC Mux input 13 + DCD NvicMux14_IRQHandler ; CM0+ NVIC Mux input 14 + DCD NvicMux15_IRQHandler ; CM0+ NVIC Mux input 15 + DCD NvicMux16_IRQHandler ; CM0+ NVIC Mux input 16 + DCD NvicMux17_IRQHandler ; CM0+ NVIC Mux input 17 + DCD NvicMux18_IRQHandler ; CM0+ NVIC Mux input 18 + DCD NvicMux19_IRQHandler ; CM0+ NVIC Mux input 19 + DCD NvicMux20_IRQHandler ; CM0+ NVIC Mux input 20 + DCD NvicMux21_IRQHandler ; CM0+ NVIC Mux input 21 + DCD NvicMux22_IRQHandler ; CM0+ NVIC Mux input 22 + DCD NvicMux23_IRQHandler ; CM0+ NVIC Mux input 23 + DCD NvicMux24_IRQHandler ; CM0+ NVIC Mux input 24 + DCD NvicMux25_IRQHandler ; CM0+ NVIC Mux input 25 + DCD NvicMux26_IRQHandler ; CM0+ NVIC Mux input 26 + DCD NvicMux27_IRQHandler ; CM0+ NVIC Mux input 27 + DCD NvicMux28_IRQHandler ; CM0+ NVIC Mux input 28 + DCD NvicMux29_IRQHandler ; CM0+ NVIC Mux input 29 + DCD NvicMux30_IRQHandler ; CM0+ NVIC Mux input 30 + DCD NvicMux31_IRQHandler ; CM0+ NVIC Mux input 31 + +__Vectors_End + +__Vectors EQU __vector_table +__Vectors_Size EQU __Vectors_End - __Vectors + + SECTION .intvec_ram:DATA:REORDER:NOROOT(2) +__ramVectors + DS32 __Vectors_Size + + + THUMB + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default handlers +;; + PUBWEAK Default_Handler + SECTION .text:CODE:REORDER:NOROOT(2) +Default_Handler + B Default_Handler + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Weak function for startup customization +;; +;; Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) +;; because this function is executed as the first instruction in the ResetHandler. +;; The PDL is also not initialized to use the proper register offsets. +;; The user of this function is responsible for initializing the PDL and resources before using them. +;; + PUBWEAK Cy_OnResetUser + SECTION .text:CODE:REORDER:NOROOT(2) +Cy_OnResetUser + BX LR + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Define strong version to return zero for +;; __iar_program_start to skip data sections +;; initialization. +;; + PUBLIC __low_level_init + SECTION .text:CODE:REORDER:NOROOT(2) +__low_level_init + MOVS R0, #0 + BX LR + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER:NOROOT(2) +Reset_Handler + + ; Define strong function for startup customization + LDR R0, =Cy_OnResetUser + BLX R0 + + ; Disable global interrupts + CPSID I + + ; Copy vectors from ROM to RAM + LDR r1, =__vector_table + LDR r0, =__ramVectors + LDR r2, =__Vectors_Size +intvec_copy + LDR r3, [r1] + STR r3, [r0] + ADDS r0, r0, #4 + ADDS r1, r1, #4 + SUBS r2, r2, #1 + CMP r2, #0 + BNE intvec_copy + + ; Update Vector Table Offset Register + LDR r0, =__ramVectors + LDR r1, =0xE000ED08 + STR r0, [r1] + dsb + + ; Initialize data sections + LDR R0, =__iar_data_init3 + BLX R0 + + LDR R0, =SystemInit + BLX R0 + + LDR R0, =__iar_program_start + BLX R0 + +; Should never get here +Cy_Main_Exited + B Cy_Main_Exited + + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +NMI_Handler + B NMI_Handler + + + PUBWEAK Cy_SysLib_FaultHandler + SECTION .text:CODE:REORDER:NOROOT(1) +Cy_SysLib_FaultHandler + B Cy_SysLib_FaultHandler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +HardFault_Handler + IMPORT Cy_SysLib_FaultHandler + movs r0, #4 + mov r1, LR + tst r0, r1 + beq L_MSP + mrs r0, PSP + b L_API_call +L_MSP + mrs r0, MSP +L_API_call + ; Storing LR content for Creator call stack trace + push {LR} + bl Cy_SysLib_FaultHandler + + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SVC_Handler + B SVC_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SysTick_Handler + B SysTick_Handler + + + ; External interrupts + PUBWEAK NvicMux0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux0_IRQHandler + B NvicMux0_IRQHandler + + PUBWEAK NvicMux1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux1_IRQHandler + B NvicMux1_IRQHandler + + PUBWEAK NvicMux2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux2_IRQHandler + B NvicMux2_IRQHandler + + PUBWEAK NvicMux3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux3_IRQHandler + B NvicMux3_IRQHandler + + PUBWEAK NvicMux4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux4_IRQHandler + B NvicMux4_IRQHandler + + PUBWEAK NvicMux5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux5_IRQHandler + B NvicMux5_IRQHandler + + PUBWEAK NvicMux6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux6_IRQHandler + B NvicMux6_IRQHandler + + PUBWEAK NvicMux7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux7_IRQHandler + B NvicMux7_IRQHandler + + PUBWEAK NvicMux8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux8_IRQHandler + B NvicMux8_IRQHandler + + PUBWEAK NvicMux9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux9_IRQHandler + B NvicMux9_IRQHandler + + PUBWEAK NvicMux10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux10_IRQHandler + B NvicMux10_IRQHandler + + PUBWEAK NvicMux11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux11_IRQHandler + B NvicMux11_IRQHandler + + PUBWEAK NvicMux12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux12_IRQHandler + B NvicMux12_IRQHandler + + PUBWEAK NvicMux13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux13_IRQHandler + B NvicMux13_IRQHandler + + PUBWEAK NvicMux14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux14_IRQHandler + B NvicMux14_IRQHandler + + PUBWEAK NvicMux15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux15_IRQHandler + B NvicMux15_IRQHandler + + PUBWEAK NvicMux16_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux16_IRQHandler + B NvicMux16_IRQHandler + + PUBWEAK NvicMux17_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux17_IRQHandler + B NvicMux17_IRQHandler + + PUBWEAK NvicMux18_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux18_IRQHandler + B NvicMux18_IRQHandler + + PUBWEAK NvicMux19_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux19_IRQHandler + B NvicMux19_IRQHandler + + PUBWEAK NvicMux20_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux20_IRQHandler + B NvicMux20_IRQHandler + + PUBWEAK NvicMux21_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux21_IRQHandler + B NvicMux21_IRQHandler + + PUBWEAK NvicMux22_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux22_IRQHandler + B NvicMux22_IRQHandler + + PUBWEAK NvicMux23_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux23_IRQHandler + B NvicMux23_IRQHandler + + PUBWEAK NvicMux24_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux24_IRQHandler + B NvicMux24_IRQHandler + + PUBWEAK NvicMux25_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux25_IRQHandler + B NvicMux25_IRQHandler + + PUBWEAK NvicMux26_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux26_IRQHandler + B NvicMux26_IRQHandler + + PUBWEAK NvicMux27_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux27_IRQHandler + B NvicMux27_IRQHandler + + PUBWEAK NvicMux28_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux28_IRQHandler + B NvicMux28_IRQHandler + + PUBWEAK NvicMux29_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux29_IRQHandler + B NvicMux29_IRQHandler + + PUBWEAK NvicMux30_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux30_IRQHandler + B NvicMux30_IRQHandler + + PUBWEAK NvicMux31_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux31_IRQHandler + B NvicMux31_IRQHandler + + + END + + +; [] END OF FILE diff --git a/2020TPCApp0.cydsn/iar/startup_psoc6_01_cm4.s b/2020TPCApp0.cydsn/iar/startup_psoc6_01_cm4.s new file mode 100644 index 0000000..6f1e869 --- /dev/null +++ b/2020TPCApp0.cydsn/iar/startup_psoc6_01_cm4.s @@ -0,0 +1,1142 @@ +;/**************************************************************************//** +; * @file startup_psoc6_01_cm4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device Series +; * @version V5.00 +; * @date 08. March 2016 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2016 ARM Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * Licensed under the Apache License, Version 2.0 (the License); you may +; * not use this file except in compliance with the License. +; * You may obtain a copy of the License at +; * +; * www.apache.org/licenses/LICENSE-2.0 +; * +; * 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. +; */ + +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + SECTION .intvec_ram:DATA:NOROOT(2) + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + EXTERN Cy_SystemInitFpuEnable + EXTERN __iar_data_init3 + PUBLIC __vector_table + PUBLIC __vector_table_0x1c + PUBLIC __Vectors + PUBLIC __Vectors_End + PUBLIC __Vectors_Size + PUBLIC __ramVectors + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler + + DCD 0x0000000D ; NMI_Handler is defined in ROM code + DCD HardFault_Handler + DCD MemManage_Handler + DCD BusFault_Handler + DCD UsageFault_Handler +__vector_table_0x1c + DCD 0 + DCD 0 + DCD 0 + DCD 0 + DCD SVC_Handler + DCD DebugMon_Handler + DCD 0 + DCD PendSV_Handler + DCD SysTick_Handler + + + ; External interrupts Description + DCD ioss_interrupts_gpio_0_IRQHandler ; GPIO Port Interrupt #0 + DCD ioss_interrupts_gpio_1_IRQHandler ; GPIO Port Interrupt #1 + DCD ioss_interrupts_gpio_2_IRQHandler ; GPIO Port Interrupt #2 + DCD ioss_interrupts_gpio_3_IRQHandler ; GPIO Port Interrupt #3 + DCD ioss_interrupts_gpio_4_IRQHandler ; GPIO Port Interrupt #4 + DCD ioss_interrupts_gpio_5_IRQHandler ; GPIO Port Interrupt #5 + DCD ioss_interrupts_gpio_6_IRQHandler ; GPIO Port Interrupt #6 + DCD ioss_interrupts_gpio_7_IRQHandler ; GPIO Port Interrupt #7 + DCD ioss_interrupts_gpio_8_IRQHandler ; GPIO Port Interrupt #8 + DCD ioss_interrupts_gpio_9_IRQHandler ; GPIO Port Interrupt #9 + DCD ioss_interrupts_gpio_10_IRQHandler ; GPIO Port Interrupt #10 + DCD ioss_interrupts_gpio_11_IRQHandler ; GPIO Port Interrupt #11 + DCD ioss_interrupts_gpio_12_IRQHandler ; GPIO Port Interrupt #12 + DCD ioss_interrupts_gpio_13_IRQHandler ; GPIO Port Interrupt #13 + DCD ioss_interrupts_gpio_14_IRQHandler ; GPIO Port Interrupt #14 + DCD ioss_interrupt_gpio_IRQHandler ; GPIO All Ports + DCD ioss_interrupt_vdd_IRQHandler ; GPIO Supply Detect Interrupt + DCD lpcomp_interrupt_IRQHandler ; Low Power Comparator Interrupt + DCD scb_8_interrupt_IRQHandler ; Serial Communication Block #8 (DeepSleep capable) + DCD srss_interrupt_mcwdt_0_IRQHandler ; Multi Counter Watchdog Timer interrupt + DCD srss_interrupt_mcwdt_1_IRQHandler ; Multi Counter Watchdog Timer interrupt + DCD srss_interrupt_backup_IRQHandler ; Backup domain interrupt + DCD srss_interrupt_IRQHandler ; Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) + DCD pass_interrupt_ctbs_IRQHandler ; CTBm Interrupt (all CTBms) + DCD bless_interrupt_IRQHandler ; Bluetooth Radio interrupt + DCD cpuss_interrupts_ipc_0_IRQHandler ; CPUSS Inter Process Communication Interrupt #0 + DCD cpuss_interrupts_ipc_1_IRQHandler ; CPUSS Inter Process Communication Interrupt #1 + DCD cpuss_interrupts_ipc_2_IRQHandler ; CPUSS Inter Process Communication Interrupt #2 + DCD cpuss_interrupts_ipc_3_IRQHandler ; CPUSS Inter Process Communication Interrupt #3 + DCD cpuss_interrupts_ipc_4_IRQHandler ; CPUSS Inter Process Communication Interrupt #4 + DCD cpuss_interrupts_ipc_5_IRQHandler ; CPUSS Inter Process Communication Interrupt #5 + DCD cpuss_interrupts_ipc_6_IRQHandler ; CPUSS Inter Process Communication Interrupt #6 + DCD cpuss_interrupts_ipc_7_IRQHandler ; CPUSS Inter Process Communication Interrupt #7 + DCD cpuss_interrupts_ipc_8_IRQHandler ; CPUSS Inter Process Communication Interrupt #8 + DCD cpuss_interrupts_ipc_9_IRQHandler ; CPUSS Inter Process Communication Interrupt #9 + DCD cpuss_interrupts_ipc_10_IRQHandler ; CPUSS Inter Process Communication Interrupt #10 + DCD cpuss_interrupts_ipc_11_IRQHandler ; CPUSS Inter Process Communication Interrupt #11 + DCD cpuss_interrupts_ipc_12_IRQHandler ; CPUSS Inter Process Communication Interrupt #12 + DCD cpuss_interrupts_ipc_13_IRQHandler ; CPUSS Inter Process Communication Interrupt #13 + DCD cpuss_interrupts_ipc_14_IRQHandler ; CPUSS Inter Process Communication Interrupt #14 + DCD cpuss_interrupts_ipc_15_IRQHandler ; CPUSS Inter Process Communication Interrupt #15 + DCD scb_0_interrupt_IRQHandler ; Serial Communication Block #0 + DCD scb_1_interrupt_IRQHandler ; Serial Communication Block #1 + DCD scb_2_interrupt_IRQHandler ; Serial Communication Block #2 + DCD scb_3_interrupt_IRQHandler ; Serial Communication Block #3 + DCD scb_4_interrupt_IRQHandler ; Serial Communication Block #4 + DCD scb_5_interrupt_IRQHandler ; Serial Communication Block #5 + DCD scb_6_interrupt_IRQHandler ; Serial Communication Block #6 + DCD scb_7_interrupt_IRQHandler ; Serial Communication Block #7 + DCD csd_interrupt_IRQHandler ; CSD (Capsense) interrupt + DCD cpuss_interrupts_dw0_0_IRQHandler ; CPUSS DataWire #0, Channel #0 + DCD cpuss_interrupts_dw0_1_IRQHandler ; CPUSS DataWire #0, Channel #1 + DCD cpuss_interrupts_dw0_2_IRQHandler ; CPUSS DataWire #0, Channel #2 + DCD cpuss_interrupts_dw0_3_IRQHandler ; CPUSS DataWire #0, Channel #3 + DCD cpuss_interrupts_dw0_4_IRQHandler ; CPUSS DataWire #0, Channel #4 + DCD cpuss_interrupts_dw0_5_IRQHandler ; CPUSS DataWire #0, Channel #5 + DCD cpuss_interrupts_dw0_6_IRQHandler ; CPUSS DataWire #0, Channel #6 + DCD cpuss_interrupts_dw0_7_IRQHandler ; CPUSS DataWire #0, Channel #7 + DCD cpuss_interrupts_dw0_8_IRQHandler ; CPUSS DataWire #0, Channel #8 + DCD cpuss_interrupts_dw0_9_IRQHandler ; CPUSS DataWire #0, Channel #9 + DCD cpuss_interrupts_dw0_10_IRQHandler ; CPUSS DataWire #0, Channel #10 + DCD cpuss_interrupts_dw0_11_IRQHandler ; CPUSS DataWire #0, Channel #11 + DCD cpuss_interrupts_dw0_12_IRQHandler ; CPUSS DataWire #0, Channel #12 + DCD cpuss_interrupts_dw0_13_IRQHandler ; CPUSS DataWire #0, Channel #13 + DCD cpuss_interrupts_dw0_14_IRQHandler ; CPUSS DataWire #0, Channel #14 + DCD cpuss_interrupts_dw0_15_IRQHandler ; CPUSS DataWire #0, Channel #15 + DCD cpuss_interrupts_dw1_0_IRQHandler ; CPUSS DataWire #1, Channel #0 + DCD cpuss_interrupts_dw1_1_IRQHandler ; CPUSS DataWire #1, Channel #1 + DCD cpuss_interrupts_dw1_2_IRQHandler ; CPUSS DataWire #1, Channel #2 + DCD cpuss_interrupts_dw1_3_IRQHandler ; CPUSS DataWire #1, Channel #3 + DCD cpuss_interrupts_dw1_4_IRQHandler ; CPUSS DataWire #1, Channel #4 + DCD cpuss_interrupts_dw1_5_IRQHandler ; CPUSS DataWire #1, Channel #5 + DCD cpuss_interrupts_dw1_6_IRQHandler ; CPUSS DataWire #1, Channel #6 + DCD cpuss_interrupts_dw1_7_IRQHandler ; CPUSS DataWire #1, Channel #7 + DCD cpuss_interrupts_dw1_8_IRQHandler ; CPUSS DataWire #1, Channel #8 + DCD cpuss_interrupts_dw1_9_IRQHandler ; CPUSS DataWire #1, Channel #9 + DCD cpuss_interrupts_dw1_10_IRQHandler ; CPUSS DataWire #1, Channel #10 + DCD cpuss_interrupts_dw1_11_IRQHandler ; CPUSS DataWire #1, Channel #11 + DCD cpuss_interrupts_dw1_12_IRQHandler ; CPUSS DataWire #1, Channel #12 + DCD cpuss_interrupts_dw1_13_IRQHandler ; CPUSS DataWire #1, Channel #13 + DCD cpuss_interrupts_dw1_14_IRQHandler ; CPUSS DataWire #1, Channel #14 + DCD cpuss_interrupts_dw1_15_IRQHandler ; CPUSS DataWire #1, Channel #15 + DCD cpuss_interrupts_fault_0_IRQHandler ; CPUSS Fault Structure Interrupt #0 + DCD cpuss_interrupts_fault_1_IRQHandler ; CPUSS Fault Structure Interrupt #1 + DCD cpuss_interrupt_crypto_IRQHandler ; CRYPTO Accelerator Interrupt + DCD cpuss_interrupt_fm_IRQHandler ; FLASH Macro Interrupt + DCD cpuss_interrupts_cm0_cti_0_IRQHandler ; CM0+ CTI #0 + DCD cpuss_interrupts_cm0_cti_1_IRQHandler ; CM0+ CTI #1 + DCD cpuss_interrupts_cm4_cti_0_IRQHandler ; CM4 CTI #0 + DCD cpuss_interrupts_cm4_cti_1_IRQHandler ; CM4 CTI #1 + DCD tcpwm_0_interrupts_0_IRQHandler ; TCPWM #0, Counter #0 + DCD tcpwm_0_interrupts_1_IRQHandler ; TCPWM #0, Counter #1 + DCD tcpwm_0_interrupts_2_IRQHandler ; TCPWM #0, Counter #2 + DCD tcpwm_0_interrupts_3_IRQHandler ; TCPWM #0, Counter #3 + DCD tcpwm_0_interrupts_4_IRQHandler ; TCPWM #0, Counter #4 + DCD tcpwm_0_interrupts_5_IRQHandler ; TCPWM #0, Counter #5 + DCD tcpwm_0_interrupts_6_IRQHandler ; TCPWM #0, Counter #6 + DCD tcpwm_0_interrupts_7_IRQHandler ; TCPWM #0, Counter #7 + DCD tcpwm_1_interrupts_0_IRQHandler ; TCPWM #1, Counter #0 + DCD tcpwm_1_interrupts_1_IRQHandler ; TCPWM #1, Counter #1 + DCD tcpwm_1_interrupts_2_IRQHandler ; TCPWM #1, Counter #2 + DCD tcpwm_1_interrupts_3_IRQHandler ; TCPWM #1, Counter #3 + DCD tcpwm_1_interrupts_4_IRQHandler ; TCPWM #1, Counter #4 + DCD tcpwm_1_interrupts_5_IRQHandler ; TCPWM #1, Counter #5 + DCD tcpwm_1_interrupts_6_IRQHandler ; TCPWM #1, Counter #6 + DCD tcpwm_1_interrupts_7_IRQHandler ; TCPWM #1, Counter #7 + DCD tcpwm_1_interrupts_8_IRQHandler ; TCPWM #1, Counter #8 + DCD tcpwm_1_interrupts_9_IRQHandler ; TCPWM #1, Counter #9 + DCD tcpwm_1_interrupts_10_IRQHandler ; TCPWM #1, Counter #10 + DCD tcpwm_1_interrupts_11_IRQHandler ; TCPWM #1, Counter #11 + DCD tcpwm_1_interrupts_12_IRQHandler ; TCPWM #1, Counter #12 + DCD tcpwm_1_interrupts_13_IRQHandler ; TCPWM #1, Counter #13 + DCD tcpwm_1_interrupts_14_IRQHandler ; TCPWM #1, Counter #14 + DCD tcpwm_1_interrupts_15_IRQHandler ; TCPWM #1, Counter #15 + DCD tcpwm_1_interrupts_16_IRQHandler ; TCPWM #1, Counter #16 + DCD tcpwm_1_interrupts_17_IRQHandler ; TCPWM #1, Counter #17 + DCD tcpwm_1_interrupts_18_IRQHandler ; TCPWM #1, Counter #18 + DCD tcpwm_1_interrupts_19_IRQHandler ; TCPWM #1, Counter #19 + DCD tcpwm_1_interrupts_20_IRQHandler ; TCPWM #1, Counter #20 + DCD tcpwm_1_interrupts_21_IRQHandler ; TCPWM #1, Counter #21 + DCD tcpwm_1_interrupts_22_IRQHandler ; TCPWM #1, Counter #22 + DCD tcpwm_1_interrupts_23_IRQHandler ; TCPWM #1, Counter #23 + DCD udb_interrupts_0_IRQHandler ; UDB Interrupt #0 + DCD udb_interrupts_1_IRQHandler ; UDB Interrupt #1 + DCD udb_interrupts_2_IRQHandler ; UDB Interrupt #2 + DCD udb_interrupts_3_IRQHandler ; UDB Interrupt #3 + DCD udb_interrupts_4_IRQHandler ; UDB Interrupt #4 + DCD udb_interrupts_5_IRQHandler ; UDB Interrupt #5 + DCD udb_interrupts_6_IRQHandler ; UDB Interrupt #6 + DCD udb_interrupts_7_IRQHandler ; UDB Interrupt #7 + DCD udb_interrupts_8_IRQHandler ; UDB Interrupt #8 + DCD udb_interrupts_9_IRQHandler ; UDB Interrupt #9 + DCD udb_interrupts_10_IRQHandler ; UDB Interrupt #10 + DCD udb_interrupts_11_IRQHandler ; UDB Interrupt #11 + DCD udb_interrupts_12_IRQHandler ; UDB Interrupt #12 + DCD udb_interrupts_13_IRQHandler ; UDB Interrupt #13 + DCD udb_interrupts_14_IRQHandler ; UDB Interrupt #14 + DCD udb_interrupts_15_IRQHandler ; UDB Interrupt #15 + DCD pass_interrupt_sar_IRQHandler ; SAR ADC interrupt + DCD audioss_interrupt_i2s_IRQHandler ; I2S Audio interrupt + DCD audioss_interrupt_pdm_IRQHandler ; PDM/PCM Audio interrupt + DCD profile_interrupt_IRQHandler ; Energy Profiler interrupt + DCD smif_interrupt_IRQHandler ; Serial Memory Interface interrupt + DCD usb_interrupt_hi_IRQHandler ; USB Interrupt + DCD usb_interrupt_med_IRQHandler ; USB Interrupt + DCD usb_interrupt_lo_IRQHandler ; USB Interrupt + DCD pass_interrupt_dacs_IRQHandler ; Consolidated interrrupt for all DACs + +__Vectors_End + +__Vectors EQU __vector_table +__Vectors_Size EQU __Vectors_End - __Vectors + + SECTION .intvec_ram:DATA:REORDER:NOROOT(2) +__ramVectors + DS32 __Vectors_Size + + + THUMB + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default handlers +;; + PUBWEAK Default_Handler + SECTION .text:CODE:REORDER:NOROOT(2) +Default_Handler + B Default_Handler + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Weak function for startup customization +;; +;; Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) +;; because this function is executed as the first instruction in the ResetHandler. +;; The PDL is also not initialized to use the proper register offsets. +;; The user of this function is responsible for initializing the PDL and resources before using them. +;; + PUBWEAK Cy_OnResetUser + SECTION .text:CODE:REORDER:NOROOT(2) +Cy_OnResetUser + BX LR + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Define strong version to return zero for +;; __iar_program_start to skip data sections +;; initialization. +;; + PUBLIC __low_level_init + SECTION .text:CODE:REORDER:NOROOT(2) +__low_level_init + MOVS R0, #0 + BX LR + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER:NOROOT(2) +Reset_Handler + + ; Define strong function for startup customization + LDR R0, =Cy_OnResetUser + BLX R0 + + ; Disable global interrupts + CPSID I + + ; Copy vectors from ROM to RAM + LDR r1, =__vector_table + LDR r0, =__ramVectors + LDR r2, =__Vectors_Size +intvec_copy + LDR r3, [r1] + STR r3, [r0] + ADDS r0, r0, #4 + ADDS r1, r1, #4 + SUBS r2, r2, #1 + CMP r2, #0 + BNE intvec_copy + + ; Update Vector Table Offset Register + LDR r0, =__ramVectors + LDR r1, =0xE000ED08 + STR r0, [r1] + dsb + + ; Enable the FPU if used + LDR R0, =Cy_SystemInitFpuEnable + BLX R0 + + ; Initialize data sections + LDR R0, =__iar_data_init3 + BLX R0 + + LDR R0, =SystemInit + BLX R0 + + LDR R0, =__iar_program_start + BLX R0 + +; Should never get here +Cy_Main_Exited + B Cy_Main_Exited + + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +NMI_Handler + B NMI_Handler + + + PUBWEAK Cy_SysLib_FaultHandler + SECTION .text:CODE:REORDER:NOROOT(1) +Cy_SysLib_FaultHandler + B Cy_SysLib_FaultHandler + + PUBWEAK HardFault_Wrapper + SECTION .text:CODE:REORDER:NOROOT(1) +HardFault_Wrapper + IMPORT Cy_SysLib_FaultHandler + movs r0, #4 + mov r1, LR + tst r0, r1 + beq L_MSP + mrs r0, PSP + b L_API_call +L_MSP + mrs r0, MSP +L_API_call + ; Storing LR content for Creator call stack trace + push {LR} + bl Cy_SysLib_FaultHandler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +HardFault_Handler + B HardFault_Wrapper + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +MemManage_Handler + B HardFault_Wrapper + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +BusFault_Handler + B HardFault_Wrapper + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +UsageFault_Handler + B HardFault_Wrapper + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SysTick_Handler + B SysTick_Handler + + + ; External interrupts + PUBWEAK ioss_interrupts_gpio_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_0_IRQHandler + B ioss_interrupts_gpio_0_IRQHandler + + PUBWEAK ioss_interrupts_gpio_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_1_IRQHandler + B ioss_interrupts_gpio_1_IRQHandler + + PUBWEAK ioss_interrupts_gpio_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_2_IRQHandler + B ioss_interrupts_gpio_2_IRQHandler + + PUBWEAK ioss_interrupts_gpio_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_3_IRQHandler + B ioss_interrupts_gpio_3_IRQHandler + + PUBWEAK ioss_interrupts_gpio_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_4_IRQHandler + B ioss_interrupts_gpio_4_IRQHandler + + PUBWEAK ioss_interrupts_gpio_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_5_IRQHandler + B ioss_interrupts_gpio_5_IRQHandler + + PUBWEAK ioss_interrupts_gpio_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_6_IRQHandler + B ioss_interrupts_gpio_6_IRQHandler + + PUBWEAK ioss_interrupts_gpio_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_7_IRQHandler + B ioss_interrupts_gpio_7_IRQHandler + + PUBWEAK ioss_interrupts_gpio_8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_8_IRQHandler + B ioss_interrupts_gpio_8_IRQHandler + + PUBWEAK ioss_interrupts_gpio_9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_9_IRQHandler + B ioss_interrupts_gpio_9_IRQHandler + + PUBWEAK ioss_interrupts_gpio_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_10_IRQHandler + B ioss_interrupts_gpio_10_IRQHandler + + PUBWEAK ioss_interrupts_gpio_11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_11_IRQHandler + B ioss_interrupts_gpio_11_IRQHandler + + PUBWEAK ioss_interrupts_gpio_12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_12_IRQHandler + B ioss_interrupts_gpio_12_IRQHandler + + PUBWEAK ioss_interrupts_gpio_13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_13_IRQHandler + B ioss_interrupts_gpio_13_IRQHandler + + PUBWEAK ioss_interrupts_gpio_14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_14_IRQHandler + B ioss_interrupts_gpio_14_IRQHandler + + PUBWEAK ioss_interrupt_gpio_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupt_gpio_IRQHandler + B ioss_interrupt_gpio_IRQHandler + + PUBWEAK ioss_interrupt_vdd_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupt_vdd_IRQHandler + B ioss_interrupt_vdd_IRQHandler + + PUBWEAK lpcomp_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +lpcomp_interrupt_IRQHandler + B lpcomp_interrupt_IRQHandler + + PUBWEAK scb_8_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_8_interrupt_IRQHandler + B scb_8_interrupt_IRQHandler + + PUBWEAK srss_interrupt_mcwdt_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +srss_interrupt_mcwdt_0_IRQHandler + B srss_interrupt_mcwdt_0_IRQHandler + + PUBWEAK srss_interrupt_mcwdt_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +srss_interrupt_mcwdt_1_IRQHandler + B srss_interrupt_mcwdt_1_IRQHandler + + PUBWEAK srss_interrupt_backup_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +srss_interrupt_backup_IRQHandler + B srss_interrupt_backup_IRQHandler + + PUBWEAK srss_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +srss_interrupt_IRQHandler + B srss_interrupt_IRQHandler + + PUBWEAK pass_interrupt_ctbs_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +pass_interrupt_ctbs_IRQHandler + B pass_interrupt_ctbs_IRQHandler + + PUBWEAK bless_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +bless_interrupt_IRQHandler + B bless_interrupt_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_0_IRQHandler + B cpuss_interrupts_ipc_0_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_1_IRQHandler + B cpuss_interrupts_ipc_1_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_2_IRQHandler + B cpuss_interrupts_ipc_2_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_3_IRQHandler + B cpuss_interrupts_ipc_3_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_4_IRQHandler + B cpuss_interrupts_ipc_4_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_5_IRQHandler + B cpuss_interrupts_ipc_5_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_6_IRQHandler + B cpuss_interrupts_ipc_6_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_7_IRQHandler + B cpuss_interrupts_ipc_7_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_8_IRQHandler + B cpuss_interrupts_ipc_8_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_9_IRQHandler + B cpuss_interrupts_ipc_9_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_10_IRQHandler + B cpuss_interrupts_ipc_10_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_11_IRQHandler + B cpuss_interrupts_ipc_11_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_12_IRQHandler + B cpuss_interrupts_ipc_12_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_13_IRQHandler + B cpuss_interrupts_ipc_13_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_14_IRQHandler + B cpuss_interrupts_ipc_14_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_15_IRQHandler + B cpuss_interrupts_ipc_15_IRQHandler + + PUBWEAK scb_0_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_0_interrupt_IRQHandler + B scb_0_interrupt_IRQHandler + + PUBWEAK scb_1_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_1_interrupt_IRQHandler + B scb_1_interrupt_IRQHandler + + PUBWEAK scb_2_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_2_interrupt_IRQHandler + B scb_2_interrupt_IRQHandler + + PUBWEAK scb_3_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_3_interrupt_IRQHandler + B scb_3_interrupt_IRQHandler + + PUBWEAK scb_4_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_4_interrupt_IRQHandler + B scb_4_interrupt_IRQHandler + + PUBWEAK scb_5_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_5_interrupt_IRQHandler + B scb_5_interrupt_IRQHandler + + PUBWEAK scb_6_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_6_interrupt_IRQHandler + B scb_6_interrupt_IRQHandler + + PUBWEAK scb_7_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_7_interrupt_IRQHandler + B scb_7_interrupt_IRQHandler + + PUBWEAK csd_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +csd_interrupt_IRQHandler + B csd_interrupt_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_0_IRQHandler + B cpuss_interrupts_dw0_0_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_1_IRQHandler + B cpuss_interrupts_dw0_1_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_2_IRQHandler + B cpuss_interrupts_dw0_2_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_3_IRQHandler + B cpuss_interrupts_dw0_3_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_4_IRQHandler + B cpuss_interrupts_dw0_4_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_5_IRQHandler + B cpuss_interrupts_dw0_5_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_6_IRQHandler + B cpuss_interrupts_dw0_6_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_7_IRQHandler + B cpuss_interrupts_dw0_7_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_8_IRQHandler + B cpuss_interrupts_dw0_8_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_9_IRQHandler + B cpuss_interrupts_dw0_9_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_10_IRQHandler + B cpuss_interrupts_dw0_10_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_11_IRQHandler + B cpuss_interrupts_dw0_11_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_12_IRQHandler + B cpuss_interrupts_dw0_12_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_13_IRQHandler + B cpuss_interrupts_dw0_13_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_14_IRQHandler + B cpuss_interrupts_dw0_14_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_15_IRQHandler + B cpuss_interrupts_dw0_15_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_0_IRQHandler + B cpuss_interrupts_dw1_0_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_1_IRQHandler + B cpuss_interrupts_dw1_1_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_2_IRQHandler + B cpuss_interrupts_dw1_2_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_3_IRQHandler + B cpuss_interrupts_dw1_3_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_4_IRQHandler + B cpuss_interrupts_dw1_4_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_5_IRQHandler + B cpuss_interrupts_dw1_5_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_6_IRQHandler + B cpuss_interrupts_dw1_6_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_7_IRQHandler + B cpuss_interrupts_dw1_7_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_8_IRQHandler + B cpuss_interrupts_dw1_8_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_9_IRQHandler + B cpuss_interrupts_dw1_9_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_10_IRQHandler + B cpuss_interrupts_dw1_10_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_11_IRQHandler + B cpuss_interrupts_dw1_11_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_12_IRQHandler + B cpuss_interrupts_dw1_12_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_13_IRQHandler + B cpuss_interrupts_dw1_13_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_14_IRQHandler + B cpuss_interrupts_dw1_14_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_15_IRQHandler + B cpuss_interrupts_dw1_15_IRQHandler + + PUBWEAK cpuss_interrupts_fault_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_fault_0_IRQHandler + B cpuss_interrupts_fault_0_IRQHandler + + PUBWEAK cpuss_interrupts_fault_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_fault_1_IRQHandler + B cpuss_interrupts_fault_1_IRQHandler + + PUBWEAK cpuss_interrupt_crypto_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupt_crypto_IRQHandler + B cpuss_interrupt_crypto_IRQHandler + + PUBWEAK cpuss_interrupt_fm_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupt_fm_IRQHandler + B cpuss_interrupt_fm_IRQHandler + + PUBWEAK cpuss_interrupts_cm0_cti_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_cm0_cti_0_IRQHandler + B cpuss_interrupts_cm0_cti_0_IRQHandler + + PUBWEAK cpuss_interrupts_cm0_cti_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_cm0_cti_1_IRQHandler + B cpuss_interrupts_cm0_cti_1_IRQHandler + + PUBWEAK cpuss_interrupts_cm4_cti_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_cm4_cti_0_IRQHandler + B cpuss_interrupts_cm4_cti_0_IRQHandler + + PUBWEAK cpuss_interrupts_cm4_cti_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_cm4_cti_1_IRQHandler + B cpuss_interrupts_cm4_cti_1_IRQHandler + + PUBWEAK tcpwm_0_interrupts_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_0_IRQHandler + B tcpwm_0_interrupts_0_IRQHandler + + PUBWEAK tcpwm_0_interrupts_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_1_IRQHandler + B tcpwm_0_interrupts_1_IRQHandler + + PUBWEAK tcpwm_0_interrupts_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_2_IRQHandler + B tcpwm_0_interrupts_2_IRQHandler + + PUBWEAK tcpwm_0_interrupts_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_3_IRQHandler + B tcpwm_0_interrupts_3_IRQHandler + + PUBWEAK tcpwm_0_interrupts_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_4_IRQHandler + B tcpwm_0_interrupts_4_IRQHandler + + PUBWEAK tcpwm_0_interrupts_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_5_IRQHandler + B tcpwm_0_interrupts_5_IRQHandler + + PUBWEAK tcpwm_0_interrupts_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_6_IRQHandler + B tcpwm_0_interrupts_6_IRQHandler + + PUBWEAK tcpwm_0_interrupts_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_7_IRQHandler + B tcpwm_0_interrupts_7_IRQHandler + + PUBWEAK tcpwm_1_interrupts_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_0_IRQHandler + B tcpwm_1_interrupts_0_IRQHandler + + PUBWEAK tcpwm_1_interrupts_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_1_IRQHandler + B tcpwm_1_interrupts_1_IRQHandler + + PUBWEAK tcpwm_1_interrupts_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_2_IRQHandler + B tcpwm_1_interrupts_2_IRQHandler + + PUBWEAK tcpwm_1_interrupts_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_3_IRQHandler + B tcpwm_1_interrupts_3_IRQHandler + + PUBWEAK tcpwm_1_interrupts_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_4_IRQHandler + B tcpwm_1_interrupts_4_IRQHandler + + PUBWEAK tcpwm_1_interrupts_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_5_IRQHandler + B tcpwm_1_interrupts_5_IRQHandler + + PUBWEAK tcpwm_1_interrupts_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_6_IRQHandler + B tcpwm_1_interrupts_6_IRQHandler + + PUBWEAK tcpwm_1_interrupts_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_7_IRQHandler + B tcpwm_1_interrupts_7_IRQHandler + + PUBWEAK tcpwm_1_interrupts_8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_8_IRQHandler + B tcpwm_1_interrupts_8_IRQHandler + + PUBWEAK tcpwm_1_interrupts_9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_9_IRQHandler + B tcpwm_1_interrupts_9_IRQHandler + + PUBWEAK tcpwm_1_interrupts_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_10_IRQHandler + B tcpwm_1_interrupts_10_IRQHandler + + PUBWEAK tcpwm_1_interrupts_11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_11_IRQHandler + B tcpwm_1_interrupts_11_IRQHandler + + PUBWEAK tcpwm_1_interrupts_12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_12_IRQHandler + B tcpwm_1_interrupts_12_IRQHandler + + PUBWEAK tcpwm_1_interrupts_13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_13_IRQHandler + B tcpwm_1_interrupts_13_IRQHandler + + PUBWEAK tcpwm_1_interrupts_14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_14_IRQHandler + B tcpwm_1_interrupts_14_IRQHandler + + PUBWEAK tcpwm_1_interrupts_15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_15_IRQHandler + B tcpwm_1_interrupts_15_IRQHandler + + PUBWEAK tcpwm_1_interrupts_16_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_16_IRQHandler + B tcpwm_1_interrupts_16_IRQHandler + + PUBWEAK tcpwm_1_interrupts_17_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_17_IRQHandler + B tcpwm_1_interrupts_17_IRQHandler + + PUBWEAK tcpwm_1_interrupts_18_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_18_IRQHandler + B tcpwm_1_interrupts_18_IRQHandler + + PUBWEAK tcpwm_1_interrupts_19_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_19_IRQHandler + B tcpwm_1_interrupts_19_IRQHandler + + PUBWEAK tcpwm_1_interrupts_20_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_20_IRQHandler + B tcpwm_1_interrupts_20_IRQHandler + + PUBWEAK tcpwm_1_interrupts_21_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_21_IRQHandler + B tcpwm_1_interrupts_21_IRQHandler + + PUBWEAK tcpwm_1_interrupts_22_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_22_IRQHandler + B tcpwm_1_interrupts_22_IRQHandler + + PUBWEAK tcpwm_1_interrupts_23_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_23_IRQHandler + B tcpwm_1_interrupts_23_IRQHandler + + PUBWEAK udb_interrupts_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_0_IRQHandler + B udb_interrupts_0_IRQHandler + + PUBWEAK udb_interrupts_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_1_IRQHandler + B udb_interrupts_1_IRQHandler + + PUBWEAK udb_interrupts_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_2_IRQHandler + B udb_interrupts_2_IRQHandler + + PUBWEAK udb_interrupts_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_3_IRQHandler + B udb_interrupts_3_IRQHandler + + PUBWEAK udb_interrupts_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_4_IRQHandler + B udb_interrupts_4_IRQHandler + + PUBWEAK udb_interrupts_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_5_IRQHandler + B udb_interrupts_5_IRQHandler + + PUBWEAK udb_interrupts_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_6_IRQHandler + B udb_interrupts_6_IRQHandler + + PUBWEAK udb_interrupts_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_7_IRQHandler + B udb_interrupts_7_IRQHandler + + PUBWEAK udb_interrupts_8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_8_IRQHandler + B udb_interrupts_8_IRQHandler + + PUBWEAK udb_interrupts_9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_9_IRQHandler + B udb_interrupts_9_IRQHandler + + PUBWEAK udb_interrupts_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_10_IRQHandler + B udb_interrupts_10_IRQHandler + + PUBWEAK udb_interrupts_11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_11_IRQHandler + B udb_interrupts_11_IRQHandler + + PUBWEAK udb_interrupts_12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_12_IRQHandler + B udb_interrupts_12_IRQHandler + + PUBWEAK udb_interrupts_13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_13_IRQHandler + B udb_interrupts_13_IRQHandler + + PUBWEAK udb_interrupts_14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_14_IRQHandler + B udb_interrupts_14_IRQHandler + + PUBWEAK udb_interrupts_15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_15_IRQHandler + B udb_interrupts_15_IRQHandler + + PUBWEAK pass_interrupt_sar_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +pass_interrupt_sar_IRQHandler + B pass_interrupt_sar_IRQHandler + + PUBWEAK audioss_interrupt_i2s_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +audioss_interrupt_i2s_IRQHandler + B audioss_interrupt_i2s_IRQHandler + + PUBWEAK audioss_interrupt_pdm_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +audioss_interrupt_pdm_IRQHandler + B audioss_interrupt_pdm_IRQHandler + + PUBWEAK profile_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +profile_interrupt_IRQHandler + B profile_interrupt_IRQHandler + + PUBWEAK smif_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +smif_interrupt_IRQHandler + B smif_interrupt_IRQHandler + + PUBWEAK usb_interrupt_hi_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +usb_interrupt_hi_IRQHandler + B usb_interrupt_hi_IRQHandler + + PUBWEAK usb_interrupt_med_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +usb_interrupt_med_IRQHandler + B usb_interrupt_med_IRQHandler + + PUBWEAK usb_interrupt_lo_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +usb_interrupt_lo_IRQHandler + B usb_interrupt_lo_IRQHandler + + PUBWEAK pass_interrupt_dacs_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +pass_interrupt_dacs_IRQHandler + B pass_interrupt_dacs_IRQHandler + + + END + + +; [] END OF FILE diff --git a/2020TPCApp0.cydsn/ias.c b/2020TPCApp0.cydsn/ias.c new file mode 100644 index 0000000..4973565 --- /dev/null +++ b/2020TPCApp0.cydsn/ias.c @@ -0,0 +1,62 @@ +/******************************************************************************* +* File Name: ias.c +* +* Description: +* This file contains Immediate Alert Service callback handler function. +* +******************************************************************************** +* Copyright 2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "ias.h" + + +/* IAS alert level value */ +volatile uint8_t alertLevel = 0; + +/****************************************************************************** +* Function Name: IasInit +******************************************************************************* +* +* Summary: +* Registers the IAS CallBack. +* +******************************************************************************/ +void IasInit(void) +{ + Cy_BLE_IAS_RegisterAttrCallback(IasEventHandler); +} + + +/******************************************************************************* +* Function Name: IasEventHandler +******************************************************************************** +* +* Summary: +* This is an event callback function to receive events from the BLE Component, +* which are specific to Immediate Alert Service. +* +* Parameters: +* event: Write Command event from the BLE component. +* eventParams: A structure instance of CY_BLE_GATT_HANDLE_VALUE_PAIR_T type. +* +*******************************************************************************/ +void IasEventHandler(uint32 event, void *eventParam) +{ + (void) eventParam; + uint8_t alert; + + /* Alert Level Characteristic write event */ + if(event == CY_BLE_EVT_IASS_WRITE_CHAR_CMD) + { + /* Read the updated Alert Level value from the GATT database */ + Cy_BLE_IASS_GetCharacteristicValue(CY_BLE_IAS_ALERT_LEVEL, sizeof(alert), &alert); + alertLevel = alert; + } +} + + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/ias.h b/2020TPCApp0.cydsn/ias.h new file mode 100644 index 0000000..233ce70 --- /dev/null +++ b/2020TPCApp0.cydsn/ias.h @@ -0,0 +1,31 @@ +/******************************************************************************* +* File Name: ias.h +* +* Description: +* Contains the function prototypes and references for the Immediate Alert +* Service of the Bluetooth Component. +* +******************************************************************************** +* Copyright 2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "project.h" + + +/*************************************** +* Function Prototypes +***************************************/ +void IasInit(void); +void IasEventHandler(uint32_t event, void *eventParam); + + +/*************************************** +* External data references +***************************************/ +extern volatile uint8_t alertLevel; + + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/key_copy.bat b/2020TPCApp0.cydsn/key_copy.bat new file mode 100644 index 0000000..7eea6c0 --- /dev/null +++ b/2020TPCApp0.cydsn/key_copy.bat @@ -0,0 +1,78 @@ +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: +:: File Name: key_copy.bat +:: +:: Version: 1.01 +:: +:: Description: +:: Simple script to copy generated key files to a persistent location +:: +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Copyright 2017-2018, Cypress Semiconductor Corporation. All rights reserved. +:: This software is owned by Cypress Semiconductor Corporation and is protected +:: by and subject to worldwide patent and copyright laws and treaties. +:: Therefore, you may use this software only as provided in the license agreement +:: accompanying the software package from which you obtained this software. +:: CYPRESS AND ITS SUPPLIERS MAKE NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +:: WITH REGARD TO THIS SOFTWARE, INCLUDING, BUT NOT LIMITED TO, NONINFRINGEMENT, +:: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +@echo off +set OUT_DIR="..\Keys" +set LOCAL_DIR=keys_generated + +set SRC_PRIV_NAME=rsa_private_generated.txt +set SRC_PUB_NAME=rsa_public_generated.txt +set SRC_AES_NAME=aes_private_generated.txt +set SRC_EIV_NAME=aes_eiv_generated.txt + +set PRIV_NAME=rsa_private.txt +set PUB_NAME=rsa_public.txt +set AES_NAME=aes_private.txt +set EIV_NAME=aes_eiv.txt + + +:: File Check +set ALLOK=1 +IF NOT EXIST %LOCAL_DIR%\%SRC_PRIV_NAME% ( + echo File %SRC_PRIV_NAME% does not exist. + set ALLOK=0 +) +IF NOT EXIST %LOCAL_DIR%\%SRC_PUB_NAME% ( + echo File %SRC_PUB_NAME% does not exist. + set ALLOK=0 +) +IF NOT EXIST %LOCAL_DIR%\%SRC_AES_NAME% ( + echo File %SRC_AES_NAME% does not exist. + set ALLOK=0 +) +IF NOT EXIST %LOCAL_DIR%\%SRC_EIV_NAME% ( + echo File %SRC_EIV_NAME% does not exist. + set ALLOK=0 +) +IF %ALLOK% == 0 ( + echo Please run the keygen batch file to generate the keys. + echo. + goto :end +) + +IF NOT EXIST %OUT_DIR% mkdir %OUT_DIR% + +:choice +cls +echo Warning: The keys used in the application will be overwritten. +set /P c=Are you sure you want to continue [Y/N]? +if /I "%c%" EQU "Y" goto :cont +if /I "%c%" EQU "N" goto :end +goto :choice + +:: Copy files to persistent location, renaming them in the process +:cont +COPY /y %LOCAL_DIR%\%SRC_PRIV_NAME% %OUT_DIR%\%PRIV_NAME% +COPY /y %LOCAL_DIR%\%SRC_PUB_NAME% %OUT_DIR%\%PUB_NAME% +COPY /y %LOCAL_DIR%\%SRC_AES_NAME% %OUT_DIR%\%AES_NAME% +COPY /y %LOCAL_DIR%\%SRC_EIV_NAME% %OUT_DIR%\%EIV_NAME% + +:end +pause \ No newline at end of file diff --git a/2020TPCApp0.cydsn/keygen.bat b/2020TPCApp0.cydsn/keygen.bat new file mode 100644 index 0000000..4a48ed3 --- /dev/null +++ b/2020TPCApp0.cydsn/keygen.bat @@ -0,0 +1,143 @@ +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: +:: File Name: keygen.bat +:: +:: Version: 1.0 +:: +:: Description: +:: Simple script to generate the RSA-2048 public and private keys using OpenSSL. +:: Once created, the script calls a python script to print out the public key +:: modulus that is ready to be inserted into cy_publicKey struct in +:: cy_si_keyStorage.c. +:: The script also generates a 128 bit random number to be used for the AES +:: private key and EIV. +:: +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Copyright 2017-2018, Cypress Semiconductor Corporation. All rights reserved. +:: This software is owned by Cypress Semiconductor Corporation and is protected +:: by and subject to worldwide patent and copyright laws and treaties. +:: Therefore, you may use this software only as provided in the license agreement +:: accompanying the software package from which you obtained this software. +:: CYPRESS AND ITS SUPPLIERS MAKE NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +:: WITH REGARD TO THIS SOFTWARE, INCLUDING, BUT NOT LIMITED TO, NONINFRINGEMENT, +:: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +@echo off +set OUT_DIR="%~dp0\keys_generated" +set LOCAL_DIR=keys_generated +set PRIV_NAME=rsa_private_generated.txt +set PUB_NAME=rsa_public_generated.txt +set MOD_NAME=rsa_to_c_generated.txt + +set AES_TEMP=aes_private_generated_temp.txt +set EIV_TEMP=aes_eiv_generated_temp.txt +set AES_NAME=aes_private_generated.txt +set EIV_NAME=aes_eiv_generated.txt +set AES_ARRAY=aes_private_array_generated.txt + +:: Check if OpenSSL and Python are correctly installed +set ALLOK=1 +CALL :testOpenSSL +CALL :testPython +IF %ALLOK% == 0 ( + echo. + pause + goto :end +) +IF NOT EXIST %OUT_DIR% mkdir %OUT_DIR% + +:: Delete temp files +IF EXIST %OUT_DIR%\%AES_TEMP% DEL /F %OUT_DIR%\%AES_TEMP% +IF EXIST %OUT_DIR%\%EIV_TEMP% DEL /F %OUT_DIR%\%EIV_TEMP% + +:: Generate the RSA-2048 public and private keys +openssl genrsa -out %OUT_DIR%\%PRIV_NAME% 2048 +openssl rsa -in %OUT_DIR%\%PRIV_NAME% -outform PEM -pubout -out %OUT_DIR%\%PUB_NAME% + +:: Generate a 128bit random number +openssl rand -hex -out %OUT_DIR%\%AES_TEMP% 16 +openssl rand -hex -out %OUT_DIR%\%EIV_TEMP% 16 + +:: Check if files exist before processing +IF NOT EXIST %LOCAL_DIR%\%AES_TEMP% ( + echo Could not find OpenSSL generated files. If the error persists, check OpenSSL installation and permissions. + echo. + pause + goto :end +) +IF NOT EXIST %LOCAL_DIR%\%AES_TEMP% ( + echo Could not find OpenSSL generated files. If the error persists, check OpenSSL installation and permissions. + echo. + pause + goto :end +) + +IF EXIST %OUT_DIR%\%AES_NAME% DEL /F %OUT_DIR%\%AES_NAME% +IF EXIST %OUT_DIR%\%EIV_NAME% DEL /F %OUT_DIR%\%EIV_NAME% +IF EXIST %OUT_DIR%\%AES_ARRAY% DEL /F %OUT_DIR%\%AES_ARRAY% + +:: Remove new line characters from AES and EIV files +FOR /F "Usebackq Tokens=*" %%@ IN ("%LOCAL_DIR%\%AES_TEMP%") DO ( +> %LOCAL_DIR%\%AES_NAME% + +FOR /F "Usebackq Tokens=*" %%@ IN ("%LOCAL_DIR%\%EIV_TEMP%") DO ( +> %LOCAL_DIR%\%EIV_NAME% + +:: Delete temp files +IF EXIST %OUT_DIR%\%AES_TEMP% DEL /F %OUT_DIR%\%AES_TEMP% +IF EXIST %OUT_DIR%\%EIV_TEMP% DEL /F %OUT_DIR%\%EIV_TEMP% + +:: Generate a C array with the AES private key +setlocal enableDelayedExpansion +set /p str=<%LOCAL_DIR%\%AES_NAME% +set counter=1 +set "out=" +for /f delims^=^ eol^= %%A in ('cmd /u /v:on /c echo(^^!str^^!^|more') do ( + IF "!counter!" == "1" ( + set "out=!out!, 0x^%%A" + set "counter=0" + ) ELSE ( + set "out=!out!%%A" + set "counter=1" + ) + ) +set "out=!out:~2!" + +echo static const uint8_t AES128_Key[16] = {!out!}; >> %OUT_DIR%\%AES_ARRAY% + +:: Create C-code ready public key +%~dp0\rsa_to_c.py %OUT_DIR%\%PUB_NAME% > %OUT_DIR%\%MOD_NAME% + +goto :end + +:testOpenSSL +openssl version >nul 2>nul +IF ERRORLEVEL 1 CALL :errOpenSSL +EXIT /B + +:testPython +python --version >nul 2>nul +IF ERRORLEVEL 1 CALL :errPython +EXIT /B + +:errOpenSSL +echo. +echo OpenSSL could not be found. +echo If OpenSSL is installed, add the OpenSSL binaries directory to the system Path variable. +echo A restart may be required. +set ALLOK=0 +EXIT /B + +:errPython +echo. +echo Python could not be found. +echo Python is required to generate the RSA public key C array. +echo Please install Python or check that it is included in the system Path variable. +set ALLOK=0 +EXIT /B + +:end +pause diff --git a/2020TPCApp0.cydsn/main_cm0p.c b/2020TPCApp0.cydsn/main_cm0p.c new file mode 100644 index 0000000..ff3bc37 --- /dev/null +++ b/2020TPCApp0.cydsn/main_cm0p.c @@ -0,0 +1,237 @@ +/******************************************************************************* +* File Name: main_cm0p.c +* +* Version: 1.30 +* +* Description: This file provides the source code for the DFU (App0) +* running on the core CM0+ (core0). +* App0 core0 firmware does the following: +* - Switches to the App1 on reset if it was scheduled. +* - Else starts App0 core1 firmware. +* +* Related Document: Code example CE216767.pdf +* +* Hardware Dependency: CY8CKIT-062-BLE PSoC 6 BLE Pioneer Kit +* CY5677 CySmart USB Dongle +* +****************************************************************************** +* Copyright (2019), Cypress Semiconductor Corporation. +****************************************************************************** +* This software is owned by Cypress Semiconductor Corporation (Cypress) and is +* protected by and subject to worldwide patent protection (United States and +* foreign), United States copyright laws and international treaty provisions. +* Cypress hereby grants to licensee a personal, non-exclusive, non-transferable +* license to copy, use, modify, create derivative works of, and compile the +* Cypress Source Code and derivative works for the sole purpose of creating +* custom software in support of licensee product to be used only in conjunction +* with a Cypress integrated circuit as specified in the applicable agreement. +* Any reproduction, modification, translation, compilation, or representation of +* this software except as specified above is prohibited without the express +* written permission of Cypress. +* +* Disclaimer: CYPRESS MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH +* REGARD TO THIS MATERIAL, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +* Cypress reserves the right to make changes without further notice to the +* materials described herein. Cypress does not assume any liability arising out +* of the application or use of any product or circuit described herein. Cypress +* does not authorize its products for use as critical components in life-support +* systems where a malfunction or failure may reasonably be expected to result in +* significant injury to the user. The inclusion of Cypress' product in a life- +* support systems application implies that the manufacturer assumes all risk of +* such use and in doing so indemnifies Cypress against all charges. Use may be +* limited by and subject to the applicable Cypress software license agreement. +*******************************************************************************/ + +#include "dfu/cy_dfu.h" +#include "project.h" +#include "cy_si_config.h" + +/* +* Set this define to any value different than 0, to use a standard TOC2, +* erase the public key, and enable the device to run code generated by other projects. +*/ +#define UNLOCK_SYSTEM (1u) + +#if CY_DFU_OPT_CRYPTO_HW != 0 + #define MY_CHAN_CRYPTO (uint32_t)(3u) /* IPC data channel for the Crypto */ + #define MY_INTR_CRYPTO_SRV (uint32_t)(1u) /* IPC interrupt structure for the Crypto server */ + #define MY_INTR_CRYPTO_CLI (uint32_t)(2u) /* IPC interrupt structure for the Crypto client */ + #define MY_INTR_CRYPTO_SRV_MUX (IRQn_Type)(2u) /* CM0+ IPC interrupt mux number the Crypto server */ + #define MY_INTR_CRYPTO_CLI_MUX (IRQn_Type)(3u) /* CM0+ IPC interrupt mux number the Crypto client */ + #define MY_INTR_CRYPTO_ERR_MUX (IRQn_Type)(4u) /* CM0+ ERROR interrupt mux number the Crypto server */ + + const cy_stc_crypto_config_t cryptoConfig = + { + /* .ipcChannel */ MY_CHAN_CRYPTO, + /* .acquireNotifierChannel */ MY_INTR_CRYPTO_SRV, + /* .releaseNotifierChannel */ MY_INTR_CRYPTO_CLI, + /* .releaseNotifierConfig */ { + #if (CY_CPU_CORTEX_M0P) + /* .intrSrc */ MY_INTR_CRYPTO_CLI_MUX, + /* .cm0pSrc */ cpuss_interrupts_ipc_2_IRQn, /* depends on selected releaseNotifierChannel value */ + #else + /* .intrSrc */ cpuss_interrupts_ipc_2_IRQn, /* depends on selected releaseNotifierChannel value */ + #endif + /* .intrPriority */ 2u, + }, + /* .userCompleteCallback */ NULL, + /* .userGetDataHandler */ NULL, + /* .userErrorHandler */ NULL, + /* .acquireNotifierConfig */ { + #if (CY_CPU_CORTEX_M0P) + /* .intrSrc */ MY_INTR_CRYPTO_SRV_MUX, /* to use with DeepSleep mode should be in DeepSleep capable muxer's range */ + /* .cm0pSrc */ cpuss_interrupts_ipc_1_IRQn, /* depends on selected acquireNotifierChannel value */ + #else + /* .intrSrc */ cpuss_interrupts_ipc_1_IRQn, /* depends on selected acquireNotifierChannel value */ + #endif + /* .intrPriority */ 2u, + }, + /* .cryptoErrorIntrConfig */ { + #if (CY_CPU_CORTEX_M0P) + /* .intrSrc */ MY_INTR_CRYPTO_ERR_MUX, + /* .cm0pSrc */ cpuss_interrupt_crypto_IRQn, + #else + /* .intrSrc */ cpuss_interrupt_crypto_IRQn, + #endif + /* .intrPriority */ 2u, + } + }; + + cy_stc_crypto_server_context_t cryptoServerContext; + cy_en_crypto_status_t cryptoStatus; +#endif + +#if UNLOCK_SYSTEM == (0u) +/* Flashboot parameters */ +#define CY_SI_FLASHBOOT_FLAGS ((CY_SI_FLASHBOOT_VALIDATE_YES << CY_SI_TOC_FLAGS_APP_VERIFY_POS) \ + | (CY_SI_FLASHBOOT_WAIT_20MS << CY_SI_TOC_FLAGS_DELAY_POS) \ + | (CY_SI_FLASHBOOT_CLK_25MHZ << CY_SI_TOC_FLAGS_CLOCKS_POS)) + +/* TOC Part 2 Definition */ +CY_SECTION(".cy_toc_part2") __USED +const cy_stc_si_toc_t cy_toc2 = +{ + .objSize = sizeof(cy_stc_si_toc_t) - sizeof(uint32_t), /**< Object Size (Bytes) excluding CRC */ + .magicNum = CY_SI_TOC2_MAGICNUMBER, /**< TOC2 ID (magic number) */ + .userKeyAddr = (uint32_t) &CySecureKeyStorage, /**< User key storage address */ + .smifCfgAddr = 0UL, /**< SMIF config list pointer */ + .appAddr1 = CY_DFU_APP0_VERIFY_START, /**< App0 start address */ + .appFormat1 = CY_DFU_CYPRESS_APP, /**< App0 Format */ + .shashObj = 1UL, /**< Include public key in the SECURE HASH */ + .sigKeyAddr = (uint32_t)&SFLASH->PUBLIC_KEY, /**< Address of signature verification key */ + .tocFlags = CY_SI_FLASHBOOT_FLAGS, /**< Flashboot flags stored in TOC2 */ + .crc = 0UL, /**< CRC populated by cymcuelftool */ +}; + +/* Assuming App0 is located at start of flash, change define if different */ +#define APP0_START_ADDRESS CY_FLASH_BASE + +/* Cypress Standard Application Format Header */ +CY_SECTION(".cy_app_header") __USED +const cy_stc_user_appheader_t applicationHeader = +{ + .objSize = CY_DFU_APP0_VERIFY_LENGTH, /* Application Size (Bytes) excluding hash */ + .appId = CY_SI_APP_VERSION, /* App ID */ + .appAttributes = 0UL, /* Reserved */ + .numCores = 2UL, /* CM0+ and CM4 */ + .core0Vt = (uint32_t)(&__Vectors[0]) - APP0_START_ADDRESS - offsetof(cy_stc_user_appheader_t, core0Vt), /* Offset to CM0+ Vector Table in flash */ + .core1Vt = (uint32_t)(&__cy_app_core1_start_addr) - APP0_START_ADDRESS - offsetof(cy_stc_user_appheader_t, core1Vt), /* Offset to CM4 Vector Table in flash */ + .core0Id = CY_ARM_CM0P_CPUID, /* ARM CM0+ CPU ID */ + .core1Id = CY_ARM_CM4_CPUID, /* ARM CM4 CPU ID */ +}; +#endif /* UNLOCK_SYSTEM == (0u) */ + +#if UNLOCK_SYSTEM != (0u) +/* Flashboot parameters */ +#define CY_SI_FLASHBOOT_FLAGS ((CY_SI_FLASHBOOT_VALIDATE_NO << CY_SI_TOC_FLAGS_APP_VERIFY_POS) \ + | (CY_SI_FLASHBOOT_WAIT_20MS << CY_SI_TOC_FLAGS_DELAY_POS) \ + | (CY_SI_FLASHBOOT_CLK_25MHZ << CY_SI_TOC_FLAGS_CLOCKS_POS)) + +/* Standard TOC Part 2 Definition */ +CY_SECTION(".cy_toc_part2") __USED +const cy_stc_si_toc_t cy_toc2 = +{ + .objSize = sizeof(cy_stc_si_toc_t) - sizeof(uint32_t), /**< Object Size (Bytes) excluding CRC */ + .magicNum = CY_SI_TOC2_MAGICNUMBER, /**< TOC2 ID (magic number) */ + .userKeyAddr = 0UL, /**< User key storage address */ + .smifCfgAddr = 0UL, /**< SMIF config list pointer */ + .appAddr1 = CY_FLASH_BASE, /**< Main Flash base address */ + .appFormat1 = CY_DFU_BASIC_APP, /**< Basic format */ + .shashObj = 0UL, + .sigKeyAddr = 0UL, /**< Address of signature verification key */ + .tocFlags = CY_SI_FLASHBOOT_FLAGS, /**< Flashboot flags stored in TOC2 */ + .crc = 0UL, /**< CRC populated by cymcuelftool */ +}; +#endif /* UNLOCK_SYSTEM != 0UL */ + +/******************************************************************************* +* Function Name: main +******************************************************************************** +* +* Summary: +* Main function of App0 core0. Unfreezes IO and sets up the user button (SW2) +* as the hibernate wakeup source. Afterwards initializes core1 (CM4) and goes +* into deep sleep. +* +* Parameters: +* None +* +* Return: +* None +* +*******************************************************************************/ +int main(void) +{ + /* Unfreeze IO after Hibernate */ + if(Cy_SysPm_GetIoFreezeStatus()) + { + Cy_SysPm_IoUnfreeze(); + } + /* Set SW2 as hibernate wakeup pin */ + Cy_SysPm_SetHibWakeupSource(CY_SYSPM_HIBPIN1_LOW); + + /* enable global interrupts */ + __enable_irq(); + +#if CY_DFU_OPT_CRYPTO_HW != 0 + /* Start the Crypto Server */ + Cy_Crypto_Server_Start(&cryptoConfig, &cryptoServerContext); +#endif + + /* Enable CM4 with the CM4 start address defined in the + DFU SDK linker script */ + Cy_SysEnableCM4( (uint32_t)(&__cy_app_core1_start_addr) ); + + for (;;) + { + /* Process crypto server requests */ + Cy_Crypto_Server_Process(); + //Go into Deep Sleep + Cy_SysPm_DeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT); + } +} + +/******************************************************************************* +* Function Name: Cy_OnResetUser +******************************************************************************** +* +* Summary: +* This function is called at the start of Reset_Handler(). It is a weak function +* that may be redefined by user code. +* DFU SDK requires it to call Cy_DFU_OnResetApp0(). +* Checks if an App switch has been scheduled and transfers control to it. +* +* Parameters: +* None +* +* Return: +* None +* +*******************************************************************************/ +void Cy_OnResetUser(void) +{ + Cy_DFU_OnResetApp0(); +} + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/main_cm4.c b/2020TPCApp0.cydsn/main_cm4.c new file mode 100644 index 0000000..b925e08 --- /dev/null +++ b/2020TPCApp0.cydsn/main_cm4.c @@ -0,0 +1,812 @@ +/******************************************************************************* +* File Name: main_cm4.c +* +* Version: 1.30 +* +* Description: This file provides the source code for the DFU (App0) +* running on the core CM4 (core1). +* App0 core1 firmware does the following: +* - Downloads App1 firmware image +* - Switches to App1 if App1 image has successfully downloaded +* and is valid +* - Switches to existing App1 if button is pressed +* - Turn on an LED depending on status +* - Hibernates on timeout +******************************************************************************* +* Related Document: CE216767.pdf +* +* Hardware Dependency: CY8CKIT-062-BLE PSoC 6 BLE Pioneer Kit +* CY5677 CySmart USB Dongle +* +****************************************************************************** +* Copyright (2019), Cypress Semiconductor Corporation. +****************************************************************************** +* This software is owned by Cypress Semiconductor Corporation (Cypress) and is +* protected by and subject to worldwide patent protection (United States and +* foreign), United States copyright laws and international treaty provisions. +* Cypress hereby grants to licensee a personal, non-exclusive, non-transferable +* license to copy, use, modify, create derivative works of, and compile the +* Cypress Source Code and derivative works for the sole purpose of creating +* custom software in support of licensee product to be used only in conjunction +* with a Cypress integrated circuit as specified in the applicable agreement. +* Any reproduction, modification, translation, compilation, or representation of +* this software except as specified above is prohibited without the express +* written permission of Cypress. +* +* Disclaimer: CYPRESS MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH +* REGARD TO THIS MATERIAL, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +* Cypress reserves the right to make changes without further notice to the +* materials described herein. Cypress does not assume any liability arising out +* of the application or use of any product or circuit described herein. Cypress +* does not authorize its products for use as critical components in life-support +* systems where a malfunction or failure may reasonably be expected to result in +* significant injury to the user. The inclusion of Cypress' product in a life- +* support systems application implies that the manufacturer assumes all risk of +* such use and in doing so indemnifies Cypress against all charges. Use may be +* limited by and subject to the applicable Cypress software license agreement. +*******************************************************************************/ + +#include +#include "project.h" +#include "debug.h" +#include "ias.h" +#include "transport_ble.h" + +#if CY_DFU_OPT_CRYPTO_HW != 0 + #define MY_CHAN_CRYPTO (uint32_t)(3u) /* IPC data channel for the Crypto */ + #define MY_INTR_CRYPTO_SRV (uint32_t)(1u) /* IPC interrupt structure for the Crypto server */ + #define MY_INTR_CRYPTO_CLI (uint32_t)(2u) /* IPC interrupt structure for the Crypto client */ + #define MY_INTR_CRYPTO_SRV_MUX (IRQn_Type)(2u) /* CM0+ IPC interrupt mux number the Crypto server */ + #define MY_INTR_CRYPTO_CLI_MUX (IRQn_Type)(3u) /* CM0+ IPC interrupt mux number the Crypto client */ + #define MY_INTR_CRYPTO_ERR_MUX (IRQn_Type)(4u) /* CM0+ ERROR interrupt mux number the Crypto server */ + + const cy_stc_crypto_config_t cryptoConfig = + { + /* .ipcChannel */ MY_CHAN_CRYPTO, + /* .acquireNotifierChannel */ MY_INTR_CRYPTO_SRV, + /* .releaseNotifierChannel */ MY_INTR_CRYPTO_CLI, + /* .releaseNotifierConfig */ { + #if (CY_CPU_CORTEX_M0P) + /* .intrSrc */ MY_INTR_CRYPTO_CLI_MUX, + /* .cm0pSrc */ cpuss_interrupts_ipc_2_IRQn, /* depends on selected releaseNotifierChannel value */ + #else + /* .intrSrc */ cpuss_interrupts_ipc_2_IRQn, /* depends on selected releaseNotifierChannel value */ + #endif + /* .intrPriority */ 2u, + }, + /* .userCompleteCallback */ NULL, + /* .userGetDataHandler */ NULL, + /* .userErrorHandler */ NULL, + /* .acquireNotifierConfig */ { + #if (CY_CPU_CORTEX_M0P) + /* .intrSrc */ MY_INTR_CRYPTO_SRV_MUX, /* to use with DeepSleep mode should be in DeepSleep capable muxer's range */ + /* .cm0pSrc */ cpuss_interrupts_ipc_1_IRQn, /* depends on selected acquireNotifierChannel value */ + #else + /* .intrSrc */ cpuss_interrupts_ipc_1_IRQn, /* depends on selected acquireNotifierChannel value */ + #endif + /* .intrPriority */ 2u, + }, + /* .cryptoErrorIntrConfig */ { + #if (CY_CPU_CORTEX_M0P) + /* .intrSrc */ MY_INTR_CRYPTO_ERR_MUX, + /* .cm0pSrc */ cpuss_interrupt_crypto_IRQn, + #else + /* .intrSrc */ cpuss_interrupt_crypto_IRQn, + #endif + /* .intrPriority */ 2u, + } + }; + cy_stc_crypto_context_t cryptoContext; + cy_en_crypto_status_t cryptoStatus; +#endif + +/* BLE GAPP Connection Settings */ +#define CYBLE_GAPP_CONNECTION_INTERVAL_MIN (0x000Cu) /* 15 ms - (N * 1,25)*/ +#define CYBLE_GAPP_CONNECTION_INTERVAL_MAX (0x000Cu) /* 15 ms */ +#define CYBLE_GAPP_CONNECTION_SLAVE_LATENCY (0x0000u) +#define CYBLE_GAPP_CONNECTION_TIME_OUT (0x00C8u) /* 2000 ms */ + +/* BLE Callback function, defined in this file */ +void AppCallBack(uint32 event, void* eventParam); + +/* Local functions */ +static cy_en_dfu_status_t CopyRow(uint32_t dest, uint32_t src, uint32_t rowSize, cy_stc_dfu_params_t * params); +static cy_en_dfu_status_t HandleMetadata(cy_stc_dfu_params_t *params); +static bool IsButtonPressed(uint16_t timeoutInMilis); +static uint32_t counterTimeoutSeconds(uint32_t seconds, uint32_t timeout); + +/* This section is used to verify an application signature + For sha256 verification, set the number of elements in the array to 64, and + in bootload_common.ld set __cy_boot_signature_size = 256. +*/ +CY_SECTION(".cy_app_signature") __USED static const uint32_t cy_bootload_appSignature[64]; + +/******************************************************************************* +* Function Name: main +******************************************************************************** +* +* Summary: +* Main function of the DFU application (App0). +* 1. If application started from non-software reset it validates App1 +* 1.1. If App1 is valid it switches to App1, else goto #2. +* 2. Start DFU communication. +* 3. If updated application has been received it validates this app. +* 4. If App1 is valid it switches to it, else wait for new application. +* 5. If 300 seconds have passed and no new application has been received +* then validate App1, if it is valid then switch to it, else hibernate +* (Happens in the BLE AppCallBack). +* +*******************************************************************************/ +int main(void) +{ + /* timeout for Cy_DFU_Continue(), in milliseconds */ + const uint32_t paramsTimeout = 20u; + + /* used to configure DFU */ + static cy_stc_dfu_params_t dfuParams; + + /* Status codes from DFU SDK API */ + cy_en_dfu_status_t status; + + /* SW2 released after deciding to stay in App0 */ + bool buttonReleased = false; + + /* + * DFU state, one of + * - CY_DFU_STATE_NONE + * - CY_DFU_STATE_UPDATING + * - CY_DFU_STATE_FINISHED + * - CY_DFU_STATE_FAILED + */ + uint32_t state = CY_DFU_STATE_NONE; + + cy_en_ble_api_result_t apiResult; + cy_stc_ble_stack_lib_version_t stackVersion; + + /* + * Used to count seconds, to convert counts to seconds use + * counterTimeoutSeconds(SECONDS, paramsTimeout) + */ + uint32_t count = 0; + + uint32_t ledTimer = 0; + +#if CY_DFU_OPT_CRYPTO_HW != 0 + cy_en_crypto_status_t cryptoStatus; +#endif + + /* Buffer to store DFU commands */ + CY_ALIGN(4) static uint8_t buffer[CY_DFU_SIZEOF_DATA_BUFFER]; + + /* Buffer for DFU packets for Transport API */ + CY_ALIGN(4) static uint8_t packet[CY_DFU_SIZEOF_CMD_BUFFER]; + + /* Enable global interrupts */ + __enable_irq(); + + /* Start UART Services */ + UART_START(); + + /* Initializes LEDs */ + InitLED(); + +#if CY_DFU_OPT_CRYPTO_HW != 0 + /* Initialize the Crypto Client code */ + cryptoStatus = Cy_Crypto_Init(&cryptoConfig, &cryptoContext); + if (cryptoStatus != CY_CRYPTO_SUCCESS) + { + /* Crypto not initialized; debug what is the problem */ + Cy_SysLib_Halt(0x00u); + } + cryptoStatus = Cy_Crypto_Enable(); + if (cryptoStatus != CY_CRYPTO_SUCCESS) + { + /* Crypto not enabled; debug what is the problem */ + Cy_SysLib_Halt(0x00u); + } +#endif /* CY_DFU_OPT_CRYPTO_HW != 0 */ + + /* Initialize dfuParams structure and DFU SDK state */ + dfuParams.timeout = paramsTimeout; + dfuParams.dataBuffer = &buffer[0]; + dfuParams.packetBuffer = &packet[0]; + + status = Cy_DFU_Init(&state, &dfuParams); + + /* Ensure DFU Metadata is valid */ + status = HandleMetadata(&dfuParams); + if (status != CY_DFU_SUCCESS) + { + Cy_SysLib_Halt(0x00u); + } + + /* + * In the case of non-software reset and user does not + * want to stay in App0, check if there is a valid app image. + * If there is - switch to it. + */ + if ((Cy_SysLib_GetResetReason() != CY_SYSLIB_RESET_SOFT) && (IsButtonPressed(2000u) == false)) + { + status = Cy_DFU_ValidateApp(1u, &dfuParams); + if (status == CY_DFU_SUCCESS) + { + /* + * Clear reset reason because Cy_DFU_ExecuteApp() performs + * a software reset. + * Without clearing two reset reasons would be present. + */ + do + { + Cy_SysLib_ClearResetReason(); + }while(Cy_SysLib_GetResetReason() != 0); + /* Never returns */ + Cy_DFU_ExecuteApp(1u); + } + } + + /* Initialize DFU communication */ + Cy_DFU_TransportStart(); + /* Initializes the Immediate Alert Service */ + IasInit(); + + /* Output current stack version to UART */ + apiResult = Cy_BLE_GetStackLibraryVersion(&stackVersion); + if(apiResult != CY_BLE_SUCCESS) + { + DBG_PRINTF("CyBle_GetStackLibraryVersion API Error: 0x%2.2x \r\n", apiResult); + } + else + { + DBG_PRINTF("Stack Version: %d.%d.%d.%d \r\n", stackVersion.majorVersion, + stackVersion.minorVersion, stackVersion.patch, stackVersion.buildNumber); + } + + for(;;) + { + /* CyBle_ProcessEvents() allows BLE stack to process pending events */ + Cy_BLE_ProcessEvents(); + + /* Process DFU commands */ + status = Cy_DFU_Continue(&state, &dfuParams); + ++count; + + switch(state) + { + case CY_DFU_STATE_FINISHED: + /* Finished downloading the application image */ + + /* Validate downloaded application, if it is valid then switch to it */ + status = Cy_DFU_ValidateApp(1u, &dfuParams); + if (status == CY_DFU_SUCCESS) + { + Cy_DFU_TransportStop(); + /* + * Clear reset reason because Cy_DFU_ExecuteApp() performs + * a software reset. + * Without clearing two reset reasons would be present. + */ + do + { + Cy_SysLib_ClearResetReason(); + }while(Cy_SysLib_GetResetReason() != 0); + /* Never returns */ + Cy_DFU_ExecuteApp(1u); + } + else if (status == CY_DFU_ERROR_VERIFY) + { + /* + * Restarts DFU, alternatives are to Halt MCU here + * or switch to the other app if it is valid. + * Error code may be handled here, i.e. print to debug UART. + */ + status = Cy_DFU_Init(&state, &dfuParams); + /* Reset LED */ + ConnectedLED(); + ledTimer = 0; + Cy_DFU_TransportReset(); + } + break; + case CY_DFU_STATE_FAILED: + /* Handle error here */ + DBG_PRINTF("Downloading has failed with error code 0x%x, try again\r\n", status); + + /* In this Code Example just restart DFU process */ + status = Cy_DFU_Init(&state, &dfuParams); + /* Reset LED */ + ConnectedLED(); + ledTimer = 0; + Cy_DFU_TransportReset(); + break; + case CY_DFU_STATE_UPDATING: + /* Reset timeout counter, if a command was correctly received */ + if (status == CY_DFU_SUCCESS) + { + count = 0u; + } + else if (status == CY_DFU_ERROR_TIMEOUT) + { + /* + * if no command has been received during 5 seconds when DFU + * has started then restart DFU. + */ + if (count >= counterTimeoutSeconds(5u, paramsTimeout)) + { + count = 0u; + Cy_DFU_Init(&state, &dfuParams); + /* Reset LED */ + ConnectedLED(); + ledTimer = 0; + Cy_DFU_TransportReset(); + } + } + else + { + count = 0u; + /* Delay because Transport still may be sending error response to a host */ + Cy_SysLib_Delay(paramsTimeout); + Cy_DFU_Init(&state, &dfuParams); + Cy_DFU_TransportReset(); + } + break; + } + + /* LED logic, constant values are optimized out. */ + /* Reset timer after 2 seconds */ + if(ledTimer == (2000u / paramsTimeout)) ledTimer = 0; + /* Every 100 miliseconds */ + if(!(ledTimer % (100u / paramsTimeout))) + { + /* Generates two 100 miliseconds pulses, every 2 seconds */ + if((state == CY_DFU_STATE_UPDATING) && (ledTimer < (400u / paramsTimeout))) + { + BlinkLED(); + } + /* Generates one 100 miliseconds pulse, every 2 seconds */ + else if ((Cy_BLE_GetAdvertisementState() == CY_BLE_ADV_STATE_ADVERTISING) + && (ledTimer < (200u / paramsTimeout))) + { + BlinkLED(); + } + else + { + /* Remain OFF */ + ConnectedLED(); + } + } + ++ledTimer; + + /* Check if a switch to the other app is requested and perform the switch if it is */ + if((buttonReleased == true) && (state == CY_DFU_STATE_NONE)) + { + bool switchRequested = false; + if (alertLevel != 0) + { + switchRequested = true; + } + else if(IsButtonPressed(500u) == true) + { + switchRequested = true; + buttonReleased = false; + } + if (switchRequested) + { + /* Validate and switch to App1 */ + cy_en_dfu_status_t status = Cy_DFU_ValidateApp(1u, &dfuParams); + + if (status == CY_DFU_SUCCESS) + { + Cy_DFU_TransportStop(); + /* + * Clear reset reason because Cy_DFU_ExecuteApp() performs + * a software reset. + * Without clearing two reset reasons would be present. + */ + do + { + Cy_SysLib_ClearResetReason(); + }while(Cy_SysLib_GetResetReason() != 0); + /* Never returns */ + Cy_DFU_ExecuteApp(1u); + } + } + } + else + { + buttonReleased = Cy_GPIO_Read(PIN_SW2_PORT, PIN_SW2_NUM); + } + } +} + + +/******************************************************************************* +* Function Name: IsButtonPressed +******************************************************************************** +* Checks if button is pressed for a 'timeoutInMilis' time. +* +* Params: +* timeout: Amount of time to check if button was pressed. Broken into +* 20 miliseconds steps. +* Returns: +* true if button is pressed for specified amount. +* false otherwise. +*******************************************************************************/ +static bool IsButtonPressed(uint16_t timeoutInMilis) +{ + uint16_t buttonTime = 0; + bool buttonPressed = false; + timeoutInMilis /= 20; + while(Cy_GPIO_Read(PIN_SW2_PORT, PIN_SW2_NUM) == 0u) + { + Cy_SysLib_Delay(20u); + if(++buttonTime == timeoutInMilis) + { + /* time has passed */ + buttonPressed = true; + break; + } + } + return buttonPressed; +} + +/******************************************************************************* +* Function Name: counterTimeoutSeconds +******************************************************************************** +* Returns number of counts that correspond to number of seconds passed as +* a parameter. +* E.g. comparing counter with 300 seconds is like this. +* --- +* uint32_t counter = 0u; +* for (;;) +* { +* Cy_SysLib_Delay(UART_TIMEOUT); +* ++count; +* if (count >= counterTimeoutSeconds(seconds: 300u, timeout: UART_TIMEOUT)) +* { +* count = 0u; +* DoSomething(); +* } +* } +* --- +* +* Both parameters are required to be compile time constants, +* so this function gets optimized out to single constant value. +* +* Parameters: +* seconds Number of seconds to pass. Must be less that 4_294_967 seconds. +* timeout Timeout for Cy_DFU_Continue() function, in milliseconds. +* Must be greater than zero. +* It is recommended to be a value that produces no reminder +* for this function to be precise. +* Return: +* See description. +*******************************************************************************/ +static uint32_t counterTimeoutSeconds(uint32_t seconds, uint32_t timeout) +{ + return (seconds * 1000ul) / timeout; +} + +/******************************************************************************* +* Function Name: CopyRow +******************************************************************************** +* Copies data from a "src" address to a flash row with the address "dest". +* If "src" data is the same as "dest" data then no copy is needed. +* +* Parameters: +* dest Destination address. Has to be an address of the start of flash row. +* src Source address. Has to be properly aligned. +* rowSize Size of flash row. +* +* Returns: +* CY_DFU_SUCCESS if operation is successful. +* Error code in a case of failure. +*******************************************************************************/ +static cy_en_dfu_status_t CopyRow(uint32_t dest, uint32_t src, uint32_t rowSize, cy_stc_dfu_params_t * params) +{ + cy_en_dfu_status_t status; + + /* Save params->dataBuffer value */ + uint8_t *buffer = params->dataBuffer; + + /* Compare "dest" and "src" content */ + params->dataBuffer = (uint8_t *)src; + status = Cy_DFU_ReadData(dest, rowSize, CY_DFU_IOCTL_COMPARE, params); + + /* Restore params->dataBuffer */ + params->dataBuffer = buffer; + + /* If "dest" differs from "src" then copy "src" to "dest" */ + if (status != CY_DFU_SUCCESS) + { + (void) memcpy((void *) params->dataBuffer, (const void*)src, rowSize); + status = Cy_DFU_WriteData(dest, rowSize, CY_DFU_IOCTL_WRITE, params); + } + /* Restore params->dataBuffer */ + params->dataBuffer = buffer; + + return (status); +} + +/******************************************************************************* +* Function Name: HandleMetadata +******************************************************************************** +* The goal of this function is to make DFU SDK metadata (MD) valid. +* The following algorithm is used (in C-like pseudocode): +* --- +* if (isValid(MD) == true) +* { if (MDC != MD) +* MDC = MD; +* } else +* { if(isValid(MDC) ) +* MD = MDC; +* #if MD Writeable +* else +* MD = INITIAL_VALUE; +* #endif +* } +* --- +* Here MD is metadata flash row, MDC is flash row with metadata copy, +* INITIAL_VALUE is known initial value. +* +* In this code example MDC is placed in the next flash row after the MD, and +* INITIAL_VALUE is MD with only CRC, App0 start and size initialized, +* all the other fields are not touched. This is only done if metadata is +* writeable when downloading. +* +* Parameters: +* params A pointer to a DFU SDK parameters structure. +* +* Returns: +* - CY_DFU_SUCCESS when finished normally. +* - Any other status code on error. +*******************************************************************************/ +static cy_en_dfu_status_t HandleMetadata(cy_stc_dfu_params_t *params) +{ + const uint32_t MD = (uint32_t)(&__cy_boot_metadata_addr ); /* MD address */ + const uint32_t mdSize = (uint32_t)(&__cy_boot_metadata_length ); /* MD size, assumed to be one flash row */ + const uint32_t MDC = MD + mdSize; /* MDC address */ + + cy_en_dfu_status_t status = CY_DFU_SUCCESS; + + status = Cy_DFU_ValidateMetadata(MD, params); + if (status == CY_DFU_SUCCESS) + { + /* Checks if MDC equals to DC, if no then copies MD to MDC */ + status = CopyRow(MDC, MD, mdSize, params); + } + else + { + status = Cy_DFU_ValidateMetadata(MDC, params); + if (status == CY_DFU_SUCCESS) + { + /* Copy MDC to MD */ + status = CopyRow(MD, MDC, mdSize, params); + } + #if CY_DFU_METADATA_WRITABLE != 0 + if (status != CY_DFU_SUCCESS) + { + const uint32_t elfStartAddress = 0x10000000; + const uint32_t elfAppSize = 0x40000; + /* Set MD to INITIAL_VALUE */ + status = Cy_DFU_SetAppMetadata(0u, elfStartAddress, elfAppSize, params); + } + #endif /* CY_DFU_METADATA_WRITABLE != 0 */ + } + return (status); +} + + +/******************************************************************************* +* Function Name: AppCallBack() +******************************************************************************** +* +* Summary: +* This is an event callback function to receive events from the BLE Component. +* Used in Cy_DFU_TransportStart() +* +* event - the event code +* *eventParam - the event parameters +* +*******************************************************************************/ +void AppCallBack(uint32 event, void* eventParam) +{ + cy_en_ble_api_result_t apiResult; + + static cy_stc_ble_gap_sec_key_info_t keyInfo = + { + .localKeysFlag = CY_BLE_GAP_SMP_INIT_ENC_KEY_DIST | + CY_BLE_GAP_SMP_INIT_IRK_KEY_DIST | + CY_BLE_GAP_SMP_INIT_CSRK_KEY_DIST, + .exchangeKeysFlag = CY_BLE_GAP_SMP_INIT_ENC_KEY_DIST | + CY_BLE_GAP_SMP_INIT_IRK_KEY_DIST | + CY_BLE_GAP_SMP_INIT_CSRK_KEY_DIST | + CY_BLE_GAP_SMP_RESP_ENC_KEY_DIST | + CY_BLE_GAP_SMP_RESP_IRK_KEY_DIST | + CY_BLE_GAP_SMP_RESP_CSRK_KEY_DIST, + }; + + switch (event) + { + /********************************************************** + * General Events + ***********************************************************/ + + /* This event received when BLE communication starts */ + case CY_BLE_EVT_STACK_ON: + /* Enter into discoverable mode so that remote can search it. */ + apiResult = Cy_BLE_GAPP_StartAdvertisement(CY_BLE_ADVERTISING_FAST, 0u); + if(apiResult != CY_BLE_SUCCESS) + { + } + + apiResult = Cy_BLE_GAP_GenerateKeys(&keyInfo); + if(apiResult != CY_BLE_SUCCESS) + { + DBG_PRINTF("CyBle_GapGenerateKeys API Error: %d \r\n", apiResult); + } + break; + + /* This event indicates that some internal HW error has occurred. */ + case CY_BLE_EVT_HARDWARE_ERROR: + DBG_PRINTF("CYBLE_EVT_HARDWARE_ERROR\r\n"); + break; + /********************************************************** + * GAP Events + ***********************************************************/ + case CY_BLE_EVT_GAP_AUTH_REQ: + DBG_PRINTF("CYBLE_EVT_AUTH_REQ: security=%x, bonding=%x, ekeySize=%x, err=%x \r\n", + (*(cy_stc_ble_gap_auth_info_t *)eventParam).security, + (*(cy_stc_ble_gap_auth_info_t *)eventParam).bonding, + (*(cy_stc_ble_gap_auth_info_t*)eventParam).ekeySize, + (*(cy_stc_ble_gap_auth_info_t *)eventParam).authErr ); + if ( cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX].security + == (CY_BLE_GAP_SEC_MODE_1 | CY_BLE_GAP_SEC_LEVEL_1) ) + { + cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX].authErr = + CY_BLE_GAP_AUTH_ERROR_PAIRING_NOT_SUPPORTED; + } + + cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX].bdHandle = + ((cy_stc_ble_gap_auth_info_t *)eventParam)->bdHandle; + + apiResult = Cy_BLE_GAPP_AuthReqReply(&cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX]); + if(apiResult != CY_BLE_SUCCESS) + { + Cy_BLE_GAP_RemoveOldestDeviceFromBondedList(); + apiResult = Cy_BLE_GAPP_AuthReqReply(&cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX]); + if(apiResult != CY_BLE_SUCCESS) + { + DBG_PRINTF("CyBle_GappAuthReqReply API Error: %d \r\n", apiResult); + } + } + break; + + case CY_BLE_EVT_GAP_PASSKEY_ENTRY_REQUEST: + DBG_PRINTF("CYBLE_EVT_PASSKEY_ENTRY_REQUEST press 'p' to enter passkey \r\n"); + break; + + case CY_BLE_EVT_GAP_PASSKEY_DISPLAY_REQUEST: + DBG_PRINTF("CYBLE_EVT_PASSKEY_DISPLAY_REQUEST %6.6d \r\n", *(int *)eventParam); + break; + + case CY_BLE_EVT_GAP_KEYINFO_EXCHNGE_CMPLT: + DBG_PRINTF("CYBLE_EVT_GAP_KEYINFO_EXCHNGE_CMPLT \r\n"); + break; + + case CY_BLE_EVT_GAP_AUTH_COMPLETE: + DBG_PRINTF("AUTH_COMPLETE \r\n"); + break; + + case CY_BLE_EVT_GAP_AUTH_FAILED: + DBG_PRINTF("CYBLE_EVT_AUTH_FAILED: %x \r\n", *(uint8 *)eventParam); + break; + + case CY_BLE_EVT_GAP_DEVICE_CONNECTED: + DBG_PRINTF("CYBLE_EVT_GAP_DEVICE_CONNECTED: %d \r\n", appConnHandle.bdHandle); + + if ( ((*(cy_stc_ble_gap_connected_param_t *)eventParam).connIntv + < CYBLE_GAPP_CONNECTION_INTERVAL_MIN ) || ( + (*(cy_stc_ble_gap_connected_param_t *)eventParam).connIntv + > CYBLE_GAPP_CONNECTION_INTERVAL_MAX ) ) + { + cy_stc_ble_gap_conn_update_param_info_t connUpdateParam; + /* If connection settings do not match expected ones - request parameter update */ + connUpdateParam.connIntvMin = CYBLE_GAPP_CONNECTION_INTERVAL_MIN; + connUpdateParam.connIntvMax = CYBLE_GAPP_CONNECTION_INTERVAL_MAX; + connUpdateParam.connLatency = CYBLE_GAPP_CONNECTION_SLAVE_LATENCY; + connUpdateParam.supervisionTO = CYBLE_GAPP_CONNECTION_TIME_OUT; + connUpdateParam.bdHandle = appConnHandle.bdHandle; + apiResult = Cy_BLE_L2CAP_LeConnectionParamUpdateRequest(&connUpdateParam); + DBG_PRINTF("Cy_BLE_L2CAP_LeConnectionParamUpdateRequest API: 0x%2.2x \r\n", apiResult); + } + keyInfo.SecKeyParam.bdHandle = (*(cy_stc_ble_gap_connected_param_t *)eventParam).bdHandle; + apiResult = Cy_BLE_GAP_SetSecurityKeys(&keyInfo); + if(apiResult != CY_BLE_SUCCESS) + { + DBG_PRINTF("CyBle_GapSetSecurityKeys API Error: %d \r\n", apiResult); + } + break; + + case CY_BLE_EVT_L2CAP_CONN_PARAM_UPDATE_RSP: + DBG_PRINTF("CY_BLE_EVT_L2CAP_CONN_PARAM_UPDATE_RSP, result = %d\r\n", + (*(cy_stc_ble_l2cap_conn_update_rsp_param_t *)eventParam).result); + break; + + case CY_BLE_EVT_GAP_KEYS_GEN_COMPLETE: + DBG_PRINTF("CYBLE_EVT_GAP_KEYS_GEN_COMPLETE \r\n"); + keyInfo.SecKeyParam = (*(cy_stc_ble_gap_sec_key_param_t *)eventParam); + Cy_BLE_GAP_SetIdAddress(&cy_ble_deviceAddress); + break; + + case CY_BLE_EVT_GAP_DEVICE_DISCONNECTED: + DBG_PRINTF("CYBLE_EVT_GAP_DEVICE_DISCONNECTED\r\n"); + /* Put the device into discoverable mode so that a remote can search it. */ + apiResult = Cy_BLE_GAPP_StartAdvertisement(CY_BLE_ADVERTISING_FAST, CY_BLE_PERIPHERAL_CONFIGURATION_0_INDEX); + if(apiResult != CY_BLE_SUCCESS) + { + DBG_PRINTF("StartAdvertisement API Error: %d \r\n", apiResult); + } + break; + + case CY_BLE_EVT_GAP_ENCRYPT_CHANGE: + DBG_PRINTF("CYBLE_EVT_GAP_ENCRYPT_CHANGE: %x \r\n", *(uint8 *)eventParam); + break; + + case CY_BLE_EVT_GAP_CONNECTION_UPDATE_COMPLETE: + DBG_PRINTF("CYBLE_EVT_CONNECTION_UPDATE_COMPLETE: %x \r\n", *(uint8 *)eventParam); + break; + + case CY_BLE_EVT_GAPP_ADVERTISEMENT_START_STOP: + if(Cy_BLE_GetAdvertisementState() == CY_BLE_ADV_STATE_STOPPED) + { + /* Fast and slow advertising period complete, go to low power + * mode (Hibernate mode) and wait for an external + * user event to wake up the device again */ + + /* Stop DFU communication */ + Cy_DFU_TransportStop(); + /* Check if app is valid, if it is then switch to it */ + uint32_t status = Cy_DFU_ValidateApp(1u, NULL); + if (status == CY_DFU_SUCCESS) + { + /* + * Clear reset reason because Cy_DFU_ExecuteApp() performs + * a software reset. + * Without clearing two reset reasons would be present. + */ + do + { + Cy_SysLib_ClearResetReason(); + }while(Cy_SysLib_GetResetReason() != 0); + /* Never returns */ + Cy_DFU_ExecuteApp(1u); + } + /* 300 seconds has passed and App is invalid. Hibernate */ + HibernateLED(); + Cy_SysPm_Hibernate(); + } + break; + + /********************************************************** + * GATT Events + ***********************************************************/ + case CY_BLE_EVT_GATT_CONNECT_IND: + appConnHandle = *(cy_stc_ble_conn_handle_t *)eventParam; + DBG_PRINTF("CYBLE_EVT_GATT_CONNECT_IND: %d \r\n", appConnHandle.bdHandle); + break; + + case CY_BLE_EVT_GATT_DISCONNECT_IND: + DBG_PRINTF("CYBLE_EVT_GATT_DISCONNECT_IND: %d \r\n", ((cy_stc_ble_conn_handle_t *)eventParam)->bdHandle); + break; + + case CY_BLE_EVT_GATTS_WRITE_CMD_REQ: + DBG_PRINTF("CYBLE_EVT_GATTS_WRITE_CMD_REQ\r\n"); + break; + + default: + break; + } +} + + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/mdk/startup_psoc6_01_cm0plus.s b/2020TPCApp0.cydsn/mdk/startup_psoc6_01_cm0plus.s new file mode 100644 index 0000000..9358665 --- /dev/null +++ b/2020TPCApp0.cydsn/mdk/startup_psoc6_01_cm0plus.s @@ -0,0 +1,321 @@ +;/**************************************************************************//** +; * @file startup_psoc6_01_cm0plus.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0plus Device Series +; * @version V5.00 +; * @date 02. March 2016 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2016 ARM Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * Licensed under the Apache License, Version 2.0 (the License); you may +; * not use this file except in compliance with the License. +; * You may obtain a copy of the License at +; * +; * www.apache.org/licenses/LICENSE-2.0 +; * +; * 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. +; */ + +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + IF :DEF:__STACK_SIZE +Stack_Size EQU __STACK_SIZE + ELSE +Stack_Size EQU 0x00001000 + ENDIF + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + IF :DEF:__HEAP_SIZE +Heap_Size EQU __HEAP_SIZE + ELSE +Heap_Size EQU 0x00000400 + ENDIF + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + + DCD 0x0000000D ; NMI Handler located at ROM code + DCD HardFault_Handler ; Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + + ; External interrupts Description + DCD NvicMux0_IRQHandler ; CM0+ NVIC Mux input 0 + DCD NvicMux1_IRQHandler ; CM0+ NVIC Mux input 1 + DCD NvicMux2_IRQHandler ; CM0+ NVIC Mux input 2 + DCD NvicMux3_IRQHandler ; CM0+ NVIC Mux input 3 + DCD NvicMux4_IRQHandler ; CM0+ NVIC Mux input 4 + DCD NvicMux5_IRQHandler ; CM0+ NVIC Mux input 5 + DCD NvicMux6_IRQHandler ; CM0+ NVIC Mux input 6 + DCD NvicMux7_IRQHandler ; CM0+ NVIC Mux input 7 + DCD NvicMux8_IRQHandler ; CM0+ NVIC Mux input 8 + DCD NvicMux9_IRQHandler ; CM0+ NVIC Mux input 9 + DCD NvicMux10_IRQHandler ; CM0+ NVIC Mux input 10 + DCD NvicMux11_IRQHandler ; CM0+ NVIC Mux input 11 + DCD NvicMux12_IRQHandler ; CM0+ NVIC Mux input 12 + DCD NvicMux13_IRQHandler ; CM0+ NVIC Mux input 13 + DCD NvicMux14_IRQHandler ; CM0+ NVIC Mux input 14 + DCD NvicMux15_IRQHandler ; CM0+ NVIC Mux input 15 + DCD NvicMux16_IRQHandler ; CM0+ NVIC Mux input 16 + DCD NvicMux17_IRQHandler ; CM0+ NVIC Mux input 17 + DCD NvicMux18_IRQHandler ; CM0+ NVIC Mux input 18 + DCD NvicMux19_IRQHandler ; CM0+ NVIC Mux input 19 + DCD NvicMux20_IRQHandler ; CM0+ NVIC Mux input 20 + DCD NvicMux21_IRQHandler ; CM0+ NVIC Mux input 21 + DCD NvicMux22_IRQHandler ; CM0+ NVIC Mux input 22 + DCD NvicMux23_IRQHandler ; CM0+ NVIC Mux input 23 + DCD NvicMux24_IRQHandler ; CM0+ NVIC Mux input 24 + DCD NvicMux25_IRQHandler ; CM0+ NVIC Mux input 25 + DCD NvicMux26_IRQHandler ; CM0+ NVIC Mux input 26 + DCD NvicMux27_IRQHandler ; CM0+ NVIC Mux input 27 + DCD NvicMux28_IRQHandler ; CM0+ NVIC Mux input 28 + DCD NvicMux29_IRQHandler ; CM0+ NVIC Mux input 29 + DCD NvicMux30_IRQHandler ; CM0+ NVIC Mux input 30 + DCD NvicMux31_IRQHandler ; CM0+ NVIC Mux input 31 + +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + EXPORT __ramVectors + AREA RESET_RAM, READWRITE, NOINIT +__ramVectors SPACE __Vectors_Size + + + AREA |.text|, CODE, READONLY + + +; Weak function for startup customization +; +; Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) +; because this function is executed as the first instruction in the ResetHandler. +; The PDL is also not initialized to use the proper register offsets. +; The user of this function is responsible for initializing the PDL and resources before using them. +; +Cy_OnResetUser PROC + EXPORT Cy_OnResetUser [WEAK] + BX LR + ENDP + +; Reset Handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + + ; Define strong function for startup customization + BL Cy_OnResetUser + + ; Disable global interrupts + CPSID I + + ; Copy vectors from ROM to RAM + LDR r1, =__Vectors + LDR r0, =__ramVectors + LDR r2, =__Vectors_Size +Vectors_Copy + LDR r3, [r1] + STR r3, [r0] + ADDS r0, r0, #4 + ADDS r1, r1, #4 + SUBS r2, r2, #1 + CMP r2, #0 + BNE Vectors_Copy + + ; Update Vector Table Offset Register. */ + LDR r0, =__ramVectors + LDR r1, =0xE000ED08 + STR r0, [r1] + dsb 0xF + + LDR R0, =__main + BLX R0 + + ; Should never get here + B . + + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +Cy_SysLib_FaultHandler PROC + EXPORT Cy_SysLib_FaultHandler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + movs r0, #4 + mov r1, LR + tst r0, r1 + beq L_MSP + mrs r0, PSP + bl L_API_call +L_MSP + mrs r0, MSP +L_API_call + bl Cy_SysLib_FaultHandler + ENDP + +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + EXPORT Default_Handler [WEAK] + EXPORT NvicMux0_IRQHandler [WEAK] + EXPORT NvicMux1_IRQHandler [WEAK] + EXPORT NvicMux2_IRQHandler [WEAK] + EXPORT NvicMux3_IRQHandler [WEAK] + EXPORT NvicMux4_IRQHandler [WEAK] + EXPORT NvicMux5_IRQHandler [WEAK] + EXPORT NvicMux6_IRQHandler [WEAK] + EXPORT NvicMux7_IRQHandler [WEAK] + EXPORT NvicMux8_IRQHandler [WEAK] + EXPORT NvicMux9_IRQHandler [WEAK] + EXPORT NvicMux10_IRQHandler [WEAK] + EXPORT NvicMux11_IRQHandler [WEAK] + EXPORT NvicMux12_IRQHandler [WEAK] + EXPORT NvicMux13_IRQHandler [WEAK] + EXPORT NvicMux14_IRQHandler [WEAK] + EXPORT NvicMux15_IRQHandler [WEAK] + EXPORT NvicMux16_IRQHandler [WEAK] + EXPORT NvicMux17_IRQHandler [WEAK] + EXPORT NvicMux18_IRQHandler [WEAK] + EXPORT NvicMux19_IRQHandler [WEAK] + EXPORT NvicMux20_IRQHandler [WEAK] + EXPORT NvicMux21_IRQHandler [WEAK] + EXPORT NvicMux22_IRQHandler [WEAK] + EXPORT NvicMux23_IRQHandler [WEAK] + EXPORT NvicMux24_IRQHandler [WEAK] + EXPORT NvicMux25_IRQHandler [WEAK] + EXPORT NvicMux26_IRQHandler [WEAK] + EXPORT NvicMux27_IRQHandler [WEAK] + EXPORT NvicMux28_IRQHandler [WEAK] + EXPORT NvicMux29_IRQHandler [WEAK] + EXPORT NvicMux30_IRQHandler [WEAK] + EXPORT NvicMux31_IRQHandler [WEAK] + +NvicMux0_IRQHandler +NvicMux1_IRQHandler +NvicMux2_IRQHandler +NvicMux3_IRQHandler +NvicMux4_IRQHandler +NvicMux5_IRQHandler +NvicMux6_IRQHandler +NvicMux7_IRQHandler +NvicMux8_IRQHandler +NvicMux9_IRQHandler +NvicMux10_IRQHandler +NvicMux11_IRQHandler +NvicMux12_IRQHandler +NvicMux13_IRQHandler +NvicMux14_IRQHandler +NvicMux15_IRQHandler +NvicMux16_IRQHandler +NvicMux17_IRQHandler +NvicMux18_IRQHandler +NvicMux19_IRQHandler +NvicMux20_IRQHandler +NvicMux21_IRQHandler +NvicMux22_IRQHandler +NvicMux23_IRQHandler +NvicMux24_IRQHandler +NvicMux25_IRQHandler +NvicMux26_IRQHandler +NvicMux27_IRQHandler +NvicMux28_IRQHandler +NvicMux29_IRQHandler +NvicMux30_IRQHandler +NvicMux31_IRQHandler + + B . + ENDP + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, =Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, =(Heap_Mem + Heap_Size) + LDR R3, =Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + END + + +; [] END OF FILE diff --git a/2020TPCApp0.cydsn/mdk/startup_psoc6_01_cm4.s b/2020TPCApp0.cydsn/mdk/startup_psoc6_01_cm4.s new file mode 100644 index 0000000..c41752b --- /dev/null +++ b/2020TPCApp0.cydsn/mdk/startup_psoc6_01_cm4.s @@ -0,0 +1,696 @@ +;/**************************************************************************//** +; * @file startup_psoc6_01_cm4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device Series +; * @version V5.00 +; * @date 02. March 2016 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2016 ARM Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * Licensed under the Apache License, Version 2.0 (the License); you may +; * not use this file except in compliance with the License. +; * You may obtain a copy of the License at +; * +; * www.apache.org/licenses/LICENSE-2.0 +; * +; * 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. +; */ + +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + IF :DEF:__STACK_SIZE +Stack_Size EQU __STACK_SIZE + ELSE +Stack_Size EQU 0x00001000 + ENDIF + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + IF :DEF:__HEAP_SIZE +Heap_Size EQU __HEAP_SIZE + ELSE +Heap_Size EQU 0x00000400 + ENDIF + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + + DCD 0x0000000D ; NMI Handler located at ROM code + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External interrupts Power Mode Description + DCD ioss_interrupts_gpio_0_IRQHandler ; GPIO Port Interrupt #0 + DCD ioss_interrupts_gpio_1_IRQHandler ; GPIO Port Interrupt #1 + DCD ioss_interrupts_gpio_2_IRQHandler ; GPIO Port Interrupt #2 + DCD ioss_interrupts_gpio_3_IRQHandler ; GPIO Port Interrupt #3 + DCD ioss_interrupts_gpio_4_IRQHandler ; GPIO Port Interrupt #4 + DCD ioss_interrupts_gpio_5_IRQHandler ; GPIO Port Interrupt #5 + DCD ioss_interrupts_gpio_6_IRQHandler ; GPIO Port Interrupt #6 + DCD ioss_interrupts_gpio_7_IRQHandler ; GPIO Port Interrupt #7 + DCD ioss_interrupts_gpio_8_IRQHandler ; GPIO Port Interrupt #8 + DCD ioss_interrupts_gpio_9_IRQHandler ; GPIO Port Interrupt #9 + DCD ioss_interrupts_gpio_10_IRQHandler ; GPIO Port Interrupt #10 + DCD ioss_interrupts_gpio_11_IRQHandler ; GPIO Port Interrupt #11 + DCD ioss_interrupts_gpio_12_IRQHandler ; GPIO Port Interrupt #12 + DCD ioss_interrupts_gpio_13_IRQHandler ; GPIO Port Interrupt #13 + DCD ioss_interrupts_gpio_14_IRQHandler ; GPIO Port Interrupt #14 + DCD ioss_interrupt_gpio_IRQHandler ; GPIO All Ports + DCD ioss_interrupt_vdd_IRQHandler ; GPIO Supply Detect Interrupt + DCD lpcomp_interrupt_IRQHandler ; Low Power Comparator Interrupt + DCD scb_8_interrupt_IRQHandler ; Serial Communication Block #8 (DeepSleep capable) + DCD srss_interrupt_mcwdt_0_IRQHandler ; Multi Counter Watchdog Timer interrupt + DCD srss_interrupt_mcwdt_1_IRQHandler ; Multi Counter Watchdog Timer interrupt + DCD srss_interrupt_backup_IRQHandler ; Backup domain interrupt + DCD srss_interrupt_IRQHandler ; Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) + DCD pass_interrupt_ctbs_IRQHandler ; CTBm Interrupt (all CTBms) + DCD bless_interrupt_IRQHandler ; Bluetooth Radio interrupt + DCD cpuss_interrupts_ipc_0_IRQHandler ; CPUSS Inter Process Communication Interrupt #0 + DCD cpuss_interrupts_ipc_1_IRQHandler ; CPUSS Inter Process Communication Interrupt #1 + DCD cpuss_interrupts_ipc_2_IRQHandler ; CPUSS Inter Process Communication Interrupt #2 + DCD cpuss_interrupts_ipc_3_IRQHandler ; CPUSS Inter Process Communication Interrupt #3 + DCD cpuss_interrupts_ipc_4_IRQHandler ; CPUSS Inter Process Communication Interrupt #4 + DCD cpuss_interrupts_ipc_5_IRQHandler ; CPUSS Inter Process Communication Interrupt #5 + DCD cpuss_interrupts_ipc_6_IRQHandler ; CPUSS Inter Process Communication Interrupt #6 + DCD cpuss_interrupts_ipc_7_IRQHandler ; CPUSS Inter Process Communication Interrupt #7 + DCD cpuss_interrupts_ipc_8_IRQHandler ; CPUSS Inter Process Communication Interrupt #8 + DCD cpuss_interrupts_ipc_9_IRQHandler ; CPUSS Inter Process Communication Interrupt #9 + DCD cpuss_interrupts_ipc_10_IRQHandler ; CPUSS Inter Process Communication Interrupt #10 + DCD cpuss_interrupts_ipc_11_IRQHandler ; CPUSS Inter Process Communication Interrupt #11 + DCD cpuss_interrupts_ipc_12_IRQHandler ; CPUSS Inter Process Communication Interrupt #12 + DCD cpuss_interrupts_ipc_13_IRQHandler ; CPUSS Inter Process Communication Interrupt #13 + DCD cpuss_interrupts_ipc_14_IRQHandler ; CPUSS Inter Process Communication Interrupt #14 + DCD cpuss_interrupts_ipc_15_IRQHandler ; CPUSS Inter Process Communication Interrupt #15 + DCD scb_0_interrupt_IRQHandler ; Serial Communication Block #0 + DCD scb_1_interrupt_IRQHandler ; Serial Communication Block #1 + DCD scb_2_interrupt_IRQHandler ; Serial Communication Block #2 + DCD scb_3_interrupt_IRQHandler ; Serial Communication Block #3 + DCD scb_4_interrupt_IRQHandler ; Serial Communication Block #4 + DCD scb_5_interrupt_IRQHandler ; Serial Communication Block #5 + DCD scb_6_interrupt_IRQHandler ; Serial Communication Block #6 + DCD scb_7_interrupt_IRQHandler ; Serial Communication Block #7 + DCD csd_interrupt_IRQHandler ; CSD (Capsense) interrupt + DCD cpuss_interrupts_dw0_0_IRQHandler ; CPUSS DataWire #0, Channel #0 + DCD cpuss_interrupts_dw0_1_IRQHandler ; CPUSS DataWire #0, Channel #1 + DCD cpuss_interrupts_dw0_2_IRQHandler ; CPUSS DataWire #0, Channel #2 + DCD cpuss_interrupts_dw0_3_IRQHandler ; CPUSS DataWire #0, Channel #3 + DCD cpuss_interrupts_dw0_4_IRQHandler ; CPUSS DataWire #0, Channel #4 + DCD cpuss_interrupts_dw0_5_IRQHandler ; CPUSS DataWire #0, Channel #5 + DCD cpuss_interrupts_dw0_6_IRQHandler ; CPUSS DataWire #0, Channel #6 + DCD cpuss_interrupts_dw0_7_IRQHandler ; CPUSS DataWire #0, Channel #7 + DCD cpuss_interrupts_dw0_8_IRQHandler ; CPUSS DataWire #0, Channel #8 + DCD cpuss_interrupts_dw0_9_IRQHandler ; CPUSS DataWire #0, Channel #9 + DCD cpuss_interrupts_dw0_10_IRQHandler ; CPUSS DataWire #0, Channel #10 + DCD cpuss_interrupts_dw0_11_IRQHandler ; CPUSS DataWire #0, Channel #11 + DCD cpuss_interrupts_dw0_12_IRQHandler ; CPUSS DataWire #0, Channel #12 + DCD cpuss_interrupts_dw0_13_IRQHandler ; CPUSS DataWire #0, Channel #13 + DCD cpuss_interrupts_dw0_14_IRQHandler ; CPUSS DataWire #0, Channel #14 + DCD cpuss_interrupts_dw0_15_IRQHandler ; CPUSS DataWire #0, Channel #15 + DCD cpuss_interrupts_dw1_0_IRQHandler ; CPUSS DataWire #1, Channel #0 + DCD cpuss_interrupts_dw1_1_IRQHandler ; CPUSS DataWire #1, Channel #1 + DCD cpuss_interrupts_dw1_2_IRQHandler ; CPUSS DataWire #1, Channel #2 + DCD cpuss_interrupts_dw1_3_IRQHandler ; CPUSS DataWire #1, Channel #3 + DCD cpuss_interrupts_dw1_4_IRQHandler ; CPUSS DataWire #1, Channel #4 + DCD cpuss_interrupts_dw1_5_IRQHandler ; CPUSS DataWire #1, Channel #5 + DCD cpuss_interrupts_dw1_6_IRQHandler ; CPUSS DataWire #1, Channel #6 + DCD cpuss_interrupts_dw1_7_IRQHandler ; CPUSS DataWire #1, Channel #7 + DCD cpuss_interrupts_dw1_8_IRQHandler ; CPUSS DataWire #1, Channel #8 + DCD cpuss_interrupts_dw1_9_IRQHandler ; CPUSS DataWire #1, Channel #9 + DCD cpuss_interrupts_dw1_10_IRQHandler ; CPUSS DataWire #1, Channel #10 + DCD cpuss_interrupts_dw1_11_IRQHandler ; CPUSS DataWire #1, Channel #11 + DCD cpuss_interrupts_dw1_12_IRQHandler ; CPUSS DataWire #1, Channel #12 + DCD cpuss_interrupts_dw1_13_IRQHandler ; CPUSS DataWire #1, Channel #13 + DCD cpuss_interrupts_dw1_14_IRQHandler ; CPUSS DataWire #1, Channel #14 + DCD cpuss_interrupts_dw1_15_IRQHandler ; CPUSS DataWire #1, Channel #15 + DCD cpuss_interrupts_fault_0_IRQHandler ; CPUSS Fault Structure Interrupt #0 + DCD cpuss_interrupts_fault_1_IRQHandler ; CPUSS Fault Structure Interrupt #1 + DCD cpuss_interrupt_crypto_IRQHandler ; CRYPTO Accelerator Interrupt + DCD cpuss_interrupt_fm_IRQHandler ; FLASH Macro Interrupt + DCD cpuss_interrupts_cm0_cti_0_IRQHandler ; CM0+ CTI #0 + DCD cpuss_interrupts_cm0_cti_1_IRQHandler ; CM0+ CTI #1 + DCD cpuss_interrupts_cm4_cti_0_IRQHandler ; CM4 CTI #0 + DCD cpuss_interrupts_cm4_cti_1_IRQHandler ; CM4 CTI #1 + DCD tcpwm_0_interrupts_0_IRQHandler ; TCPWM #0, Counter #0 + DCD tcpwm_0_interrupts_1_IRQHandler ; TCPWM #0, Counter #1 + DCD tcpwm_0_interrupts_2_IRQHandler ; TCPWM #0, Counter #2 + DCD tcpwm_0_interrupts_3_IRQHandler ; TCPWM #0, Counter #3 + DCD tcpwm_0_interrupts_4_IRQHandler ; TCPWM #0, Counter #4 + DCD tcpwm_0_interrupts_5_IRQHandler ; TCPWM #0, Counter #5 + DCD tcpwm_0_interrupts_6_IRQHandler ; TCPWM #0, Counter #6 + DCD tcpwm_0_interrupts_7_IRQHandler ; TCPWM #0, Counter #7 + DCD tcpwm_1_interrupts_0_IRQHandler ; TCPWM #1, Counter #0 + DCD tcpwm_1_interrupts_1_IRQHandler ; TCPWM #1, Counter #1 + DCD tcpwm_1_interrupts_2_IRQHandler ; TCPWM #1, Counter #2 + DCD tcpwm_1_interrupts_3_IRQHandler ; TCPWM #1, Counter #3 + DCD tcpwm_1_interrupts_4_IRQHandler ; TCPWM #1, Counter #4 + DCD tcpwm_1_interrupts_5_IRQHandler ; TCPWM #1, Counter #5 + DCD tcpwm_1_interrupts_6_IRQHandler ; TCPWM #1, Counter #6 + DCD tcpwm_1_interrupts_7_IRQHandler ; TCPWM #1, Counter #7 + DCD tcpwm_1_interrupts_8_IRQHandler ; TCPWM #1, Counter #8 + DCD tcpwm_1_interrupts_9_IRQHandler ; TCPWM #1, Counter #9 + DCD tcpwm_1_interrupts_10_IRQHandler ; TCPWM #1, Counter #10 + DCD tcpwm_1_interrupts_11_IRQHandler ; TCPWM #1, Counter #11 + DCD tcpwm_1_interrupts_12_IRQHandler ; TCPWM #1, Counter #12 + DCD tcpwm_1_interrupts_13_IRQHandler ; TCPWM #1, Counter #13 + DCD tcpwm_1_interrupts_14_IRQHandler ; TCPWM #1, Counter #14 + DCD tcpwm_1_interrupts_15_IRQHandler ; TCPWM #1, Counter #15 + DCD tcpwm_1_interrupts_16_IRQHandler ; TCPWM #1, Counter #16 + DCD tcpwm_1_interrupts_17_IRQHandler ; TCPWM #1, Counter #17 + DCD tcpwm_1_interrupts_18_IRQHandler ; TCPWM #1, Counter #18 + DCD tcpwm_1_interrupts_19_IRQHandler ; TCPWM #1, Counter #19 + DCD tcpwm_1_interrupts_20_IRQHandler ; TCPWM #1, Counter #20 + DCD tcpwm_1_interrupts_21_IRQHandler ; TCPWM #1, Counter #21 + DCD tcpwm_1_interrupts_22_IRQHandler ; TCPWM #1, Counter #22 + DCD tcpwm_1_interrupts_23_IRQHandler ; TCPWM #1, Counter #23 + DCD udb_interrupts_0_IRQHandler ; UDB Interrupt #0 + DCD udb_interrupts_1_IRQHandler ; UDB Interrupt #1 + DCD udb_interrupts_2_IRQHandler ; UDB Interrupt #2 + DCD udb_interrupts_3_IRQHandler ; UDB Interrupt #3 + DCD udb_interrupts_4_IRQHandler ; UDB Interrupt #4 + DCD udb_interrupts_5_IRQHandler ; UDB Interrupt #5 + DCD udb_interrupts_6_IRQHandler ; UDB Interrupt #6 + DCD udb_interrupts_7_IRQHandler ; UDB Interrupt #7 + DCD udb_interrupts_8_IRQHandler ; UDB Interrupt #8 + DCD udb_interrupts_9_IRQHandler ; UDB Interrupt #9 + DCD udb_interrupts_10_IRQHandler ; UDB Interrupt #10 + DCD udb_interrupts_11_IRQHandler ; UDB Interrupt #11 + DCD udb_interrupts_12_IRQHandler ; UDB Interrupt #12 + DCD udb_interrupts_13_IRQHandler ; UDB Interrupt #13 + DCD udb_interrupts_14_IRQHandler ; UDB Interrupt #14 + DCD udb_interrupts_15_IRQHandler ; UDB Interrupt #15 + DCD pass_interrupt_sar_IRQHandler ; SAR ADC interrupt + DCD audioss_interrupt_i2s_IRQHandler ; I2S Audio interrupt + DCD audioss_interrupt_pdm_IRQHandler ; PDM/PCM Audio interrupt + DCD profile_interrupt_IRQHandler ; Energy Profiler interrupt + DCD smif_interrupt_IRQHandler ; Serial Memory Interface interrupt + DCD usb_interrupt_hi_IRQHandler ; USB Interrupt + DCD usb_interrupt_med_IRQHandler ; USB Interrupt + DCD usb_interrupt_lo_IRQHandler ; USB Interrupt + DCD pass_interrupt_dacs_IRQHandler ; Consolidated interrrupt for all DACs + +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + EXPORT __ramVectors + AREA RESET_RAM, READWRITE, NOINIT +__ramVectors SPACE __Vectors_Size + + + AREA |.text|, CODE, READONLY + + +; Weak function for startup customization +; +; Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) +; because this function is executed as the first instruction in the ResetHandler. +; The PDL is also not initialized to use the proper register offsets. +; The user of this function is responsible for initializing the PDL and resources before using them. +; +Cy_OnResetUser PROC + EXPORT Cy_OnResetUser [WEAK] + BX LR + ENDP + + +; Reset Handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT Cy_SystemInitFpuEnable + IMPORT __main + + ; Define strong function for startup customization + BL Cy_OnResetUser + + ; Disable global interrupts + CPSID I + + ; Copy vectors from ROM to RAM + LDR r1, =__Vectors + LDR r0, =__ramVectors + LDR r2, =__Vectors_Size +Vectors_Copy + LDR r3, [r1] + STR r3, [r0] + ADDS r0, r0, #4 + ADDS r1, r1, #4 + SUBS r2, r2, #1 + CMP r2, #0 + BNE Vectors_Copy + + ; Update Vector Table Offset Register. */ + LDR r0, =__ramVectors + LDR r1, =0xE000ED08 + STR r0, [r1] + dsb 0xF + + ; Enable the FPU if used + LDR R0, =Cy_SystemInitFpuEnable + BLX R0 + + LDR R0, =__main + BLX R0 + + ; Should never get here + B . + + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +Cy_SysLib_FaultHandler PROC + EXPORT Cy_SysLib_FaultHandler [WEAK] + B . + ENDP +HardFault_Wrapper\ + PROC + EXPORT HardFault_Wrapper [WEAK] + movs r0, #4 + mov r1, LR + tst r0, r1 + beq L_MSP + mrs r0, PSP + bl L_API_call +L_MSP + mrs r0, MSP +L_API_call + bl Cy_SysLib_FaultHandler + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B HardFault_Wrapper + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B HardFault_Wrapper + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B HardFault_Wrapper + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B HardFault_Wrapper + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + EXPORT Default_Handler [WEAK] + EXPORT ioss_interrupts_gpio_0_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_1_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_2_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_3_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_4_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_5_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_6_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_7_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_8_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_9_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_10_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_11_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_12_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_13_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_14_IRQHandler [WEAK] + EXPORT ioss_interrupt_gpio_IRQHandler [WEAK] + EXPORT ioss_interrupt_vdd_IRQHandler [WEAK] + EXPORT lpcomp_interrupt_IRQHandler [WEAK] + EXPORT scb_8_interrupt_IRQHandler [WEAK] + EXPORT srss_interrupt_mcwdt_0_IRQHandler [WEAK] + EXPORT srss_interrupt_mcwdt_1_IRQHandler [WEAK] + EXPORT srss_interrupt_backup_IRQHandler [WEAK] + EXPORT srss_interrupt_IRQHandler [WEAK] + EXPORT pass_interrupt_ctbs_IRQHandler [WEAK] + EXPORT bless_interrupt_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_0_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_1_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_2_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_3_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_4_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_5_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_6_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_7_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_8_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_9_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_10_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_11_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_12_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_13_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_14_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_15_IRQHandler [WEAK] + EXPORT scb_0_interrupt_IRQHandler [WEAK] + EXPORT scb_1_interrupt_IRQHandler [WEAK] + EXPORT scb_2_interrupt_IRQHandler [WEAK] + EXPORT scb_3_interrupt_IRQHandler [WEAK] + EXPORT scb_4_interrupt_IRQHandler [WEAK] + EXPORT scb_5_interrupt_IRQHandler [WEAK] + EXPORT scb_6_interrupt_IRQHandler [WEAK] + EXPORT scb_7_interrupt_IRQHandler [WEAK] + EXPORT csd_interrupt_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_0_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_1_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_2_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_3_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_4_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_5_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_6_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_7_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_8_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_9_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_10_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_11_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_12_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_13_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_14_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_15_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_0_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_1_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_2_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_3_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_4_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_5_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_6_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_7_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_8_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_9_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_10_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_11_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_12_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_13_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_14_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_15_IRQHandler [WEAK] + EXPORT cpuss_interrupts_fault_0_IRQHandler [WEAK] + EXPORT cpuss_interrupts_fault_1_IRQHandler [WEAK] + EXPORT cpuss_interrupt_crypto_IRQHandler [WEAK] + EXPORT cpuss_interrupt_fm_IRQHandler [WEAK] + EXPORT cpuss_interrupts_cm0_cti_0_IRQHandler [WEAK] + EXPORT cpuss_interrupts_cm0_cti_1_IRQHandler [WEAK] + EXPORT cpuss_interrupts_cm4_cti_0_IRQHandler [WEAK] + EXPORT cpuss_interrupts_cm4_cti_1_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_0_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_1_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_2_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_3_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_4_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_5_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_6_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_7_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_0_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_1_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_2_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_3_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_4_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_5_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_6_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_7_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_8_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_9_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_10_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_11_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_12_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_13_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_14_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_15_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_16_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_17_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_18_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_19_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_20_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_21_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_22_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_23_IRQHandler [WEAK] + EXPORT udb_interrupts_0_IRQHandler [WEAK] + EXPORT udb_interrupts_1_IRQHandler [WEAK] + EXPORT udb_interrupts_2_IRQHandler [WEAK] + EXPORT udb_interrupts_3_IRQHandler [WEAK] + EXPORT udb_interrupts_4_IRQHandler [WEAK] + EXPORT udb_interrupts_5_IRQHandler [WEAK] + EXPORT udb_interrupts_6_IRQHandler [WEAK] + EXPORT udb_interrupts_7_IRQHandler [WEAK] + EXPORT udb_interrupts_8_IRQHandler [WEAK] + EXPORT udb_interrupts_9_IRQHandler [WEAK] + EXPORT udb_interrupts_10_IRQHandler [WEAK] + EXPORT udb_interrupts_11_IRQHandler [WEAK] + EXPORT udb_interrupts_12_IRQHandler [WEAK] + EXPORT udb_interrupts_13_IRQHandler [WEAK] + EXPORT udb_interrupts_14_IRQHandler [WEAK] + EXPORT udb_interrupts_15_IRQHandler [WEAK] + EXPORT pass_interrupt_sar_IRQHandler [WEAK] + EXPORT audioss_interrupt_i2s_IRQHandler [WEAK] + EXPORT audioss_interrupt_pdm_IRQHandler [WEAK] + EXPORT profile_interrupt_IRQHandler [WEAK] + EXPORT smif_interrupt_IRQHandler [WEAK] + EXPORT usb_interrupt_hi_IRQHandler [WEAK] + EXPORT usb_interrupt_med_IRQHandler [WEAK] + EXPORT usb_interrupt_lo_IRQHandler [WEAK] + EXPORT pass_interrupt_dacs_IRQHandler [WEAK] + +ioss_interrupts_gpio_0_IRQHandler +ioss_interrupts_gpio_1_IRQHandler +ioss_interrupts_gpio_2_IRQHandler +ioss_interrupts_gpio_3_IRQHandler +ioss_interrupts_gpio_4_IRQHandler +ioss_interrupts_gpio_5_IRQHandler +ioss_interrupts_gpio_6_IRQHandler +ioss_interrupts_gpio_7_IRQHandler +ioss_interrupts_gpio_8_IRQHandler +ioss_interrupts_gpio_9_IRQHandler +ioss_interrupts_gpio_10_IRQHandler +ioss_interrupts_gpio_11_IRQHandler +ioss_interrupts_gpio_12_IRQHandler +ioss_interrupts_gpio_13_IRQHandler +ioss_interrupts_gpio_14_IRQHandler +ioss_interrupt_gpio_IRQHandler +ioss_interrupt_vdd_IRQHandler +lpcomp_interrupt_IRQHandler +scb_8_interrupt_IRQHandler +srss_interrupt_mcwdt_0_IRQHandler +srss_interrupt_mcwdt_1_IRQHandler +srss_interrupt_backup_IRQHandler +srss_interrupt_IRQHandler +pass_interrupt_ctbs_IRQHandler +bless_interrupt_IRQHandler +cpuss_interrupts_ipc_0_IRQHandler +cpuss_interrupts_ipc_1_IRQHandler +cpuss_interrupts_ipc_2_IRQHandler +cpuss_interrupts_ipc_3_IRQHandler +cpuss_interrupts_ipc_4_IRQHandler +cpuss_interrupts_ipc_5_IRQHandler +cpuss_interrupts_ipc_6_IRQHandler +cpuss_interrupts_ipc_7_IRQHandler +cpuss_interrupts_ipc_8_IRQHandler +cpuss_interrupts_ipc_9_IRQHandler +cpuss_interrupts_ipc_10_IRQHandler +cpuss_interrupts_ipc_11_IRQHandler +cpuss_interrupts_ipc_12_IRQHandler +cpuss_interrupts_ipc_13_IRQHandler +cpuss_interrupts_ipc_14_IRQHandler +cpuss_interrupts_ipc_15_IRQHandler +scb_0_interrupt_IRQHandler +scb_1_interrupt_IRQHandler +scb_2_interrupt_IRQHandler +scb_3_interrupt_IRQHandler +scb_4_interrupt_IRQHandler +scb_5_interrupt_IRQHandler +scb_6_interrupt_IRQHandler +scb_7_interrupt_IRQHandler +csd_interrupt_IRQHandler +cpuss_interrupts_dw0_0_IRQHandler +cpuss_interrupts_dw0_1_IRQHandler +cpuss_interrupts_dw0_2_IRQHandler +cpuss_interrupts_dw0_3_IRQHandler +cpuss_interrupts_dw0_4_IRQHandler +cpuss_interrupts_dw0_5_IRQHandler +cpuss_interrupts_dw0_6_IRQHandler +cpuss_interrupts_dw0_7_IRQHandler +cpuss_interrupts_dw0_8_IRQHandler +cpuss_interrupts_dw0_9_IRQHandler +cpuss_interrupts_dw0_10_IRQHandler +cpuss_interrupts_dw0_11_IRQHandler +cpuss_interrupts_dw0_12_IRQHandler +cpuss_interrupts_dw0_13_IRQHandler +cpuss_interrupts_dw0_14_IRQHandler +cpuss_interrupts_dw0_15_IRQHandler +cpuss_interrupts_dw1_0_IRQHandler +cpuss_interrupts_dw1_1_IRQHandler +cpuss_interrupts_dw1_2_IRQHandler +cpuss_interrupts_dw1_3_IRQHandler +cpuss_interrupts_dw1_4_IRQHandler +cpuss_interrupts_dw1_5_IRQHandler +cpuss_interrupts_dw1_6_IRQHandler +cpuss_interrupts_dw1_7_IRQHandler +cpuss_interrupts_dw1_8_IRQHandler +cpuss_interrupts_dw1_9_IRQHandler +cpuss_interrupts_dw1_10_IRQHandler +cpuss_interrupts_dw1_11_IRQHandler +cpuss_interrupts_dw1_12_IRQHandler +cpuss_interrupts_dw1_13_IRQHandler +cpuss_interrupts_dw1_14_IRQHandler +cpuss_interrupts_dw1_15_IRQHandler +cpuss_interrupts_fault_0_IRQHandler +cpuss_interrupts_fault_1_IRQHandler +cpuss_interrupt_crypto_IRQHandler +cpuss_interrupt_fm_IRQHandler +cpuss_interrupts_cm0_cti_0_IRQHandler +cpuss_interrupts_cm0_cti_1_IRQHandler +cpuss_interrupts_cm4_cti_0_IRQHandler +cpuss_interrupts_cm4_cti_1_IRQHandler +tcpwm_0_interrupts_0_IRQHandler +tcpwm_0_interrupts_1_IRQHandler +tcpwm_0_interrupts_2_IRQHandler +tcpwm_0_interrupts_3_IRQHandler +tcpwm_0_interrupts_4_IRQHandler +tcpwm_0_interrupts_5_IRQHandler +tcpwm_0_interrupts_6_IRQHandler +tcpwm_0_interrupts_7_IRQHandler +tcpwm_1_interrupts_0_IRQHandler +tcpwm_1_interrupts_1_IRQHandler +tcpwm_1_interrupts_2_IRQHandler +tcpwm_1_interrupts_3_IRQHandler +tcpwm_1_interrupts_4_IRQHandler +tcpwm_1_interrupts_5_IRQHandler +tcpwm_1_interrupts_6_IRQHandler +tcpwm_1_interrupts_7_IRQHandler +tcpwm_1_interrupts_8_IRQHandler +tcpwm_1_interrupts_9_IRQHandler +tcpwm_1_interrupts_10_IRQHandler +tcpwm_1_interrupts_11_IRQHandler +tcpwm_1_interrupts_12_IRQHandler +tcpwm_1_interrupts_13_IRQHandler +tcpwm_1_interrupts_14_IRQHandler +tcpwm_1_interrupts_15_IRQHandler +tcpwm_1_interrupts_16_IRQHandler +tcpwm_1_interrupts_17_IRQHandler +tcpwm_1_interrupts_18_IRQHandler +tcpwm_1_interrupts_19_IRQHandler +tcpwm_1_interrupts_20_IRQHandler +tcpwm_1_interrupts_21_IRQHandler +tcpwm_1_interrupts_22_IRQHandler +tcpwm_1_interrupts_23_IRQHandler +udb_interrupts_0_IRQHandler +udb_interrupts_1_IRQHandler +udb_interrupts_2_IRQHandler +udb_interrupts_3_IRQHandler +udb_interrupts_4_IRQHandler +udb_interrupts_5_IRQHandler +udb_interrupts_6_IRQHandler +udb_interrupts_7_IRQHandler +udb_interrupts_8_IRQHandler +udb_interrupts_9_IRQHandler +udb_interrupts_10_IRQHandler +udb_interrupts_11_IRQHandler +udb_interrupts_12_IRQHandler +udb_interrupts_13_IRQHandler +udb_interrupts_14_IRQHandler +udb_interrupts_15_IRQHandler +pass_interrupt_sar_IRQHandler +audioss_interrupt_i2s_IRQHandler +audioss_interrupt_pdm_IRQHandler +profile_interrupt_IRQHandler +smif_interrupt_IRQHandler +usb_interrupt_hi_IRQHandler +usb_interrupt_med_IRQHandler +usb_interrupt_lo_IRQHandler +pass_interrupt_dacs_IRQHandler + + B . + ENDP + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + END + + +; [] END OF FILE diff --git a/2020TPCApp0.cydsn/post_build_core1.bat b/2020TPCApp0.cydsn/post_build_core1.bat new file mode 100644 index 0000000..2be69b0 --- /dev/null +++ b/2020TPCApp0.cydsn/post_build_core1.bat @@ -0,0 +1,42 @@ +@rem Usage: +@rem Call post_build_core1.bat +@rem E.g. in PSoC Creator 4.2: +@rem post_build_core1.bat creator ${OutputDir} ${ProjectShortName} + +@echo ------------------------------------------ +@echo Post-build commands for Cortex-M4 core +@echo ------------------------------------------ + +@rem Set proper path to your PDL 3.x and above installation +@set PDL_PATH="C:\Program Files (x86)\Cypress\PDL\3.1.7" + +@set CY_MCU_ELF_TOOL=%PDL_PATH%"\tools\win\elf\cymcuelftool.exe" + +@set IDE=%1 + +@if "%IDE%" == "creator" ( + @set OUTPUT_DIR=%2 + @set PRJ_NAME=%3 + @set ELF_EXT=.elf +) + +@if "%IDE%" == "uvision" ( + @set OUTPUT_DIR=%2 + @set PRJ_NAME=%3 + @set ELF_EXT=.axf +) + +@if "%IDE%" == "iar" ( + @set OUTPUT_DIR=%2 + @set PRJ_NAME=%3 + @set ELF_EXT=.out +) + +@if "%IDE%" == "eclipse" ( + @set OUTPUT_DIR=%2 + @set PRJ_NAME=%3 + @set ELF_EXT= +) + +@rem Sign the application with the RSA private key +%CY_MCU_ELF_TOOL% -S %OUTPUT_DIR%\%PRJ_NAME%%ELF_EXT% SHA256 --encrypt RSASSA-PKCS --key ..\Keys\rsa_private.txt --output %OUTPUT_DIR%\%PRJ_NAME%_RSA%ELF_EXT% --hex %OUTPUT_DIR%\%PRJ_NAME%.hex diff --git a/2020TPCApp0.cydsn/rsa_to_c.py b/2020TPCApp0.cydsn/rsa_to_c.py new file mode 100644 index 0000000..455666d --- /dev/null +++ b/2020TPCApp0.cydsn/rsa_to_c.py @@ -0,0 +1,254 @@ +#!/usr/bin/env python3 +""" This script may be used to generate RSA public key modulus, exponent, and + additional coefficients. Additional coefficients are optional and are used + only to increase RSA calculation performance up to 4 times. + + The format of output may be defined by command line arguments and is either + the raw HEX data, or the array. + + Copyright (C) 2017-2018, Cypress Semiconductor Corporation. All rights reserved. + + You may use this file only in accordance with the license, terms, conditions, + disclaimers, and limitations in the end user license agreement accompanying + the software package with which this file was provided. +""" + +import sys, subprocess, os + +if sys.version_info < (3,): + integer_types = (int, long,) + ## Used in convert_hexstr_to_list +else: + integer_types = (int,) + +def main(): + """ Main function + + Build the strings to print out the public key modulus and exponent. + """ + if len(sys.argv) < 2: + print("Usage: %s [-norev] [-out ]" % sys.argv[0]) + return 1 + isReverse = True + out_file_name = '' + for idx in range(len(sys.argv)): + if "-norev" == sys.argv[idx]: + isReverse = False + if "-out" == sys.argv[idx]: + out_file_name = sys.argv[idx+1] + + modulus_list = [] # list to collect bytes of modulus + rsaExp = "" # string that will contain the parsed RSA exponent + key_len = 0 # containt the length in bits of an RSA modulus + + try: + # build openssl command line + cmd_line = ['openssl', 'rsa', '-text', '-pubin', '-in', + sys.argv[1], + '-noout'] + output, error = subprocess.Popen( + cmd_line, universal_newlines=True, + stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() + + # check for errors (warnings ignored) + lines = error.split("\n") + error_lines = [] + for line in lines: + if (len(line) != 0) and (("WARNING:" in line) == False): + error_lines.append(line) + if len(error_lines) != 0: + print ("OpenSSL call failed" + "\n" + " ".join(cmd_line) + "\n" + str(error_lines) ) + return 1 + + modulus_found = False + for line in output.split("\n"): + if "Public-Key" in line: + # get length of RSA modulus + key_len = int(line.split(" ")[1].replace("(", '')) + if "Modulus" in line: + # modulus record is found + modulus_found = True; continue + if "Exponent" in line: + modulus_found = False + # Exponent record is found + rsaExp = line.split(" ")[2][1:-1] + if modulus_found: + # Collect bytes of modulus to list + modulus_list = modulus_list + line.strip().split(":") + except subprocess.CalledProcessError as err: + print ("OpenSSL call failed with errorcode=" + str(err.returncode) \ + + "\n" + str(err.cmd) + "\n" + str(err.output)) + return 1 + + #normalize data + # remove empty strings from modulus_list + modulus_list = [i for i in modulus_list if i] + if (len(modulus_list) == key_len // 8 + 1) and (int(modulus_list[0]) == 0): + # remove first zero byte + modulus_list.pop(0) + + # Check parsed data + if not key_len: + print ("Key length was not gotten by parsing." ) + return 1 + if len(modulus_list) != (key_len // 8): + print ("Length of parsed Modulus (%s) is not equal to Key length (%s)." % (key_len, len(modulus_list) * 8)) + return 1 + + modulus_hex_str = "".join(modulus_list) + (barret, inv_modulo, r_bar) = calculate_additional_rsa_key_coefs(modulus_hex_str) + + barret_list = convert_hexstr_to_list(barret, isReverse) + # add three zero bytes + barret_list = ([0]*3 + barret_list) if not isReverse else (barret_list + [0]*3) + + barret_str = build_returned_string(barret_list) + barret_str = ".barrettData =\n{\n%s\n}," % barret_str + + inv_modulo_list = convert_hexstr_to_list(inv_modulo, isReverse) + inv_modulo_str = build_returned_string(inv_modulo_list) + inv_modulo_str = ".inverseModuloData =\n{\n%s\n}," % inv_modulo_str + + r_bar_list = convert_hexstr_to_list(r_bar, isReverse) + r_bar_str = build_returned_string(r_bar_list) + r_bar_str = ".rBarData =\n{\n%s\n}," % r_bar_str + + rsaExp_list = convert_hexstr_to_list(rsaExp, isReverse) + rsaExp_list_len = len(rsaExp_list) + if rsaExp_list_len % 4 != 0: + rsaExp_list = ([0]*(4-(rsaExp_list_len % 4)) + rsaExp_list) if not isReverse \ + else (rsaExp_list + [0]*(4-(rsaExp_list_len % 4))) + + rsaExp_str = build_returned_string(rsaExp_list) + rsaExp_str = ".expData =\n{\n%s\n}," % rsaExp_str + + # Check and apply isReverse flag + if isReverse: + modulus_list.reverse() + modulus_str = build_returned_string(modulus_list) + modulus_str = ".moduloData =\n{\n%s\n}," % modulus_str + + if not out_file_name: + print(modulus_str) + print(rsaExp_str) + print(barret_str) + print(inv_modulo_str) + print(r_bar_str) + else: + with open(out_file_name, 'w') as outfile: + outfile.write(modulus_str + "\n") + outfile.write(rsaExp_str + "\n") + outfile.write(barret_str + "\n") + outfile.write(inv_modulo_str + "\n") + outfile.write(r_bar_str + "\n") + return 0 + + +def extended_euclid(modulo): + ''' Calculate greatest common divisor (GCD) of two values. + Link: https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm + formula to calculate: ax + by - gcd(a,b) + parameters: + a, b - two values witch is calculated GCD for. + return: + absolute values of x and y coefficients + + NOTE: pseudo-code of operation: + x, lastX = 0, 1 + y, lastY = 1, 0 + while (b != 0): + q = a // b + a, b = b, a % b + x, lastX = lastX - q * x, x + y, lastY = lastY - q * y, y + return (abs(lastX), abs(lastY)) + ''' + + rInv = 1; + nInv = 0; + modulo_bit_size = modulo.bit_length() + + for i in range(modulo_bit_size): + if not (rInv % 2): + rInv = rInv // 2 + nInv = nInv // 2 + else: + rInv = rInv + modulo; + rInv = rInv // 2; + nInv = nInv // 2; + nInv = nInv + (1 << (modulo_bit_size - 1)); + return rInv, nInv + + +def calculate_additional_rsa_key_coefs(modulo): + ''' Calculate three additional coefficients for modulo value of RSA key + 1. barret_coef - Barrett coefficient. Equation is: barretCoef = floor((2 << (2 * k)) / n); + Main article is here: https://en.wikipedia.org/wiki/Barrett_reduction + 2. r_bar - pre-calculated value. Equation is: r_bar = (1 << k) mod n; + 3. inverse_modulo - coefficient. It satisfying rr' - nn' = 1, where r = 1 << k; + Main article is here: https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm + parameter: + modulo - part of RSA key + return: + tuple( barret_coef, r_bar, inverse_modulo ) as reversed byte arrays; + ''' + if isinstance(modulo, str): + modulo = int(modulo, 16) + if modulo <= 0: + raise ValueError("Modulus must be positive") + if modulo & (modulo - 1) == 0: + raise ValueError("Modulus must not be a power of 2") + + modulo_len = modulo.bit_length() + barret_coef = (1 << (modulo_len * 2)) // modulo + r_bar = (1 << modulo_len) % modulo + inverse_modulo = extended_euclid(modulo) + ret_arrays = ( + barret_coef, + inverse_modulo[1], + r_bar + ) + + return ret_arrays + + +def convert_hexstr_to_list(s, reversed=False): + ''' Converts a string likes '0001aaff...' to list [0, 1, 170, 255]. + Also an input parameter can be an integer, in this case it will be + converted to a hex string. + parameter: + s - string to convert + reversed - a returned list have to be reversed + return: + a list of an integer values + ''' + if isinstance(s, integer_types): + s = hex(s) + s = s[2 if s.lower().startswith("0x") else 0 : -1 if s.upper().endswith("L") else len(s)] + if len(s) % 2 != 0: + s = '0' + s + l = [int("0x%s" % s[i:i+2], 16) for i in range(0, len(s), 2)] + if reversed: + l.reverse() + return l + +def build_returned_string(inp_list): + ''' Converts a list to a C-style array of hexadecimal numbers string + ''' + if isinstance(inp_list[0], int): + inp_list = ['%02X' % x for x in inp_list] + + tmp_str = " " + for idx in range(0, len(inp_list)): + if (idx % 8 == 0) and (idx != 0): + tmp_str = tmp_str + "\n " + tmp_str = tmp_str + ( "0x%02Xu," % int(inp_list[idx], base=16) ) + if (idx % 8 != 7) and (idx != len(inp_list) - 1): + tmp_str = tmp_str + " " + + return tmp_str + + +if __name__ == "__main__": + main() + diff --git a/2020TPCApp0.cydsn/system_psoc6.h b/2020TPCApp0.cydsn/system_psoc6.h new file mode 100644 index 0000000..73d1263 --- /dev/null +++ b/2020TPCApp0.cydsn/system_psoc6.h @@ -0,0 +1,648 @@ +/***************************************************************************//** +* \file system_psoc6.h +* \version 2.20 +* +* \brief Device system header file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + + +#ifndef _SYSTEM_PSOC6_H_ +#define _SYSTEM_PSOC6_H_ + +/** +* \addtogroup group_system_config +* \{ +* Provides device startup, system configuration, and linker script files. +* The system startup provides the followings features: +* - See \ref group_system_config_device_initialization for the: +* * \ref group_system_config_dual_core_device_initialization +* * \ref group_system_config_single_core_device_initialization +* - \ref group_system_config_device_memory_definition +* - \ref group_system_config_heap_stack_config +* - \ref group_system_config_merge_apps +* - \ref group_system_config_default_handlers +* - \ref group_system_config_device_vector_table +* - \ref group_system_config_cm4_functions +* +* \section group_system_config_configuration Configuration Considerations +* +* \subsection group_system_config_device_memory_definition Device Memory Definition +* The flash and RAM allocation for each CPU is defined by the linker scripts. +* For dual-core devices, the physical flash and RAM memory is shared between the CPU cores. +* 2 KB of RAM (allocated at the end of RAM) are reserved for system use. +* For Single-Core devices the system reserves additional 80 bytes of RAM. +* Using the reserved memory area for other purposes will lead to unexpected behavior. +* +* \note The linker files provided with the PDL are generic and handle all common +* use cases. Your project may not use every section defined in the linker files. +* In that case you may see warnings during the build process. To eliminate build +* warnings in your project, you can simply comment out or remove the relevant +* code in the linker file. +* +* ARM GCC\n +* The flash and RAM sections for the CPU are defined in the linker files: +* 'xx_yy.ld', where 'xx' is the device group, and 'yy' is the target CPU; for example, +* 'cy8c6xx7_cm0plus.ld' and 'cy8c6xx7_cm4_dual.ld'. +* \note If the start of the Cortex-M4 application image is changed, the value +* of the of the \ref CY_CORTEX_M4_APPL_ADDR should also be changed. The +* \ref CY_CORTEX_M4_APPL_ADDR macro should be used as the parameter for the +* Cy_SysEnableCM4() function call. +* +* Change the flash and RAM sizes by editing the macros value in the +* linker files for both CPUs: +* - 'xx_cm0plus.ld', where 'xx' is the device group: +* \code +* flash (rx) : ORIGIN = 0x10000000, LENGTH = 0x00080000 +* ram (rwx) : ORIGIN = 0x08000000, LENGTH = 0x00024000 +* \endcode +* - 'xx_cm4_dual.ld', where 'xx' is the device group: +* \code +* flash (rx) : ORIGIN = 0x10080000, LENGTH = 0x00080000 +* ram (rwx) : ORIGIN = 0x08024000, LENGTH = 0x00023800 +* \endcode +* +* Change the value of the \ref CY_CORTEX_M4_APPL_ADDR macro to the rom ORIGIN's +* value in the 'xx_cm4_dual.ld' file, where 'xx' is the device group. Do this +* by either: +* - Passing the following commands to the compiler:\n +* \code -D CY_CORTEX_M4_APPL_ADDR=0x10080000 \endcode +* - Editing the \ref CY_CORTEX_M4_APPL_ADDR value in the 'system_xx.h', where 'xx' is device family:\n +* \code #define CY_CORTEX_M4_APPL_ADDR (0x10080000u) \endcode +* +* ARM MDK\n +* The flash and RAM sections for the CPU are defined in the linker files: +* 'xx_yy.scat', where 'xx' is the device group, and 'yy' is the target CPU; for example, +* 'cy8c6xx7_cm0plus.scat' and 'cy8c6xx7_cm4_dual.scat'. +* \note If the start of the Cortex-M4 application image is changed, the value +* of the of the \ref CY_CORTEX_M4_APPL_ADDR should also be changed. The +* \ref CY_CORTEX_M4_APPL_ADDR macro should be used as the parameter for the \ref +* Cy_SysEnableCM4() function call. +* +* \note The linker files provided with the PDL are generic and handle all common +* use cases. Your project may not use every section defined in the linker files. +* In that case you may see the warnings during the build process: +* L6314W (no section matches pattern) and/or L6329W +* (pattern only matches removed unused sections). In your project, you can +* suppress the warning by passing the "--diag_suppress=L6314W,L6329W" option to +* the linker. You can also comment out or remove the relevant code in the linker +* file. +* +* Change the flash and RAM sizes by editing the macros value in the +* linker files for both CPUs: +* - 'xx_cm0plus.scat', where 'xx' is the device group: +* \code +* #define FLASH_START 0x10000000 +* #define FLASH_SIZE 0x00080000 +* #define RAM_START 0x08000000 +* #define RAM_SIZE 0x00024000 +* \endcode +* - 'xx_cm4_dual.scat', where 'xx' is the device group: +* \code +* #define FLASH_START 0x10080000 +* #define FLASH_SIZE 0x00080000 +* #define RAM_START 0x08024000 +* #define RAM_SIZE 0x00023800 +* \endcode +* +* Change the value of the \ref CY_CORTEX_M4_APPL_ADDR macro to the FLASH_START +* value in the 'xx_cm4_dual.scat' file, +* where 'xx' is the device group. Do this by either: +* - Passing the following commands to the compiler:\n +* \code -D CY_CORTEX_M4_APPL_ADDR=0x10080000 \endcode +* - Editing the \ref CY_CORTEX_M4_APPL_ADDR value in the 'system_xx.h', where +* 'xx' is device family:\n +* \code #define CY_CORTEX_M4_APPL_ADDR (0x10080000u) \endcode +* +* IAR\n +* The flash and RAM sections for the CPU are defined in the linker files: +* 'xx_yy.icf', where 'xx' is the device group, and 'yy' is the target CPU; for example, +* 'cy8c6xx7_cm0plus.icf' and 'cy8c6xx7_cm4_dual.icf'. +* \note If the start of the Cortex-M4 application image is changed, the value +* of the of the \ref CY_CORTEX_M4_APPL_ADDR should also be changed. The +* \ref CY_CORTEX_M4_APPL_ADDR macro should be used as the parameter for the \ref +* Cy_SysEnableCM4() function call. +* +* Change the flash and RAM sizes by editing the macros value in the +* linker files for both CPUs: +* - 'xx_cm0plus.icf', where 'xx' is the device group: +* \code +* define symbol __ICFEDIT_region_IROM1_start__ = 0x10000000; +* define symbol __ICFEDIT_region_IROM1_end__ = 0x10080000; +* define symbol __ICFEDIT_region_IRAM1_start__ = 0x08000000; +* define symbol __ICFEDIT_region_IRAM1_end__ = 0x08024000; +* \endcode +* - 'xx_cm4_dual.icf', where 'xx' is the device group: +* \code +* define symbol __ICFEDIT_region_IROM1_start__ = 0x10080000; +* define symbol __ICFEDIT_region_IROM1_end__ = 0x10100000; +* define symbol __ICFEDIT_region_IRAM1_start__ = 0x08024000; +* define symbol __ICFEDIT_region_IRAM1_end__ = 0x08047800; +* \endcode +* +* Change the value of the \ref CY_CORTEX_M4_APPL_ADDR macro to the +* __ICFEDIT_region_IROM1_start__ value in the 'xx_cm4_dual.icf' file, where 'xx' +* is the device group. Do this by either: +* - Passing the following commands to the compiler:\n +* \code -D CY_CORTEX_M4_APPL_ADDR=0x10080000 \endcode +* - Editing the \ref CY_CORTEX_M4_APPL_ADDR value in the 'system_xx.h', where +* 'xx' is device family:\n +* \code #define CY_CORTEX_M4_APPL_ADDR (0x10080000u) \endcode +* +* \subsection group_system_config_device_initialization Device Initialization +* After a power-on-reset (POR), the boot process is handled by the boot code +* from the on-chip ROM that is always executed by the Cortex-M0+ core. The boot +* code passes the control to the Cortex-M0+ startup code located in flash. +* +* \subsubsection group_system_config_dual_core_device_initialization Dual-Core Devices +* The Cortex-M0+ startup code performs the device initialization by a call to +* SystemInit() and then calls the main() function. The Cortex-M4 core is disabled +* by default. Enable the core using the \ref Cy_SysEnableCM4() function. +* See \ref group_system_config_cm4_functions for more details. +* \note Startup code executes SystemInit() function for the both Cortex-M0+ and Cortex-M4 cores. +* The function has a separate implementation on each core. +* Both function implementations unlock and disable the WDT. +* Therefore enable the WDT after both cores have been initialized. +* +* \subsubsection group_system_config_single_core_device_initialization Single-Core Devices +* The Cortex-M0+ core is not user-accessible on these devices. In this case the +* Flash Boot handles setup of the CM0+ core and starts the Cortex-M4 core. +* +* \subsection group_system_config_heap_stack_config Heap and Stack Configuration +* There are two ways to adjust heap and stack configurations: +* -# Editing source code files +* -# Specifying via command line +* +* By default, the stack size is set to 0x00001000 and the heap size is set to 0x00000400. +* +* \subsubsection group_system_config_heap_stack_config_gcc ARM GCC +* - Editing source code files\n +* The heap and stack sizes are defined in the assembler startup files +* (e.g. startup_psoc6_01_cm0plus.S and startup_psoc6_01_cm4.S). +* Change the heap and stack sizes by modifying the following lines:\n +* \code .equ Stack_Size, 0x00001000 \endcode +* \code .equ Heap_Size, 0x00000400 \endcode +* +* - Specifying via command line\n +* Change the heap and stack sizes passing the following commands to the compiler:\n +* \code -D __STACK_SIZE=0x000000400 \endcode +* \code -D __HEAP_SIZE=0x000000100 \endcode +* +* \subsubsection group_system_config_heap_stack_config_mdk ARM MDK +* - Editing source code files\n +* The heap and stack sizes are defined in the assembler startup files +* (e.g. startup_psoc6_01_cm0plus.s and startup_psoc6_01_cm4.s). +* Change the heap and stack sizes by modifying the following lines:\n +* \code Stack_Size EQU 0x00001000 \endcode +* \code Heap_Size EQU 0x00000400 \endcode +* +* - Specifying via command line\n +* Change the heap and stack sizes passing the following commands to the assembler:\n +* \code "--predefine=___STACK_SIZE SETA 0x000000400" \endcode +* \code "--predefine=__HEAP_SIZE SETA 0x000000100" \endcode +* +* \subsubsection group_system_config_heap_stack_config_iar IAR +* - Editing source code files\n +* The heap and stack sizes are defined in the linker scatter files: 'xx_yy.icf', +* where 'xx' is the device family, and 'yy' is the target CPU; for example, +* cy8c6xx7_cm0plus.icf and cy8c6xx7_cm4_dual.icf. +* Change the heap and stack sizes by modifying the following lines:\n +* \code Stack_Size EQU 0x00001000 \endcode +* \code Heap_Size EQU 0x00000400 \endcode +* +* - Specifying via command line\n +* Change the heap and stack sizes passing the following commands to the +* linker (including quotation marks):\n +* \code --define_symbol __STACK_SIZE=0x000000400 \endcode +* \code --define_symbol __HEAP_SIZE=0x000000100 \endcode +* +* \subsection group_system_config_merge_apps Merging CM0+ and CM4 Executables +* The CM0+ project and linker script build the CM0+ application image. Similarly, +* the CM4 linker script builds the CM4 application image. Each specifies +* locations, sizes, and contents of sections in memory. See +* \ref group_system_config_device_memory_definition for the symbols and default +* values. +* +* The cymcuelftool is invoked by a post-build command. The precise project +* setting is IDE-specific. +* +* The cymcuelftool combines the two executables. The tool examines the +* executables to ensure that memory regions either do not overlap, or contain +* identical bytes (shared). If there are no problems, it creates a new ELF file +* with the merged image, without changing any of the addresses or data. +* +* \subsection group_system_config_default_handlers Default Interrupt Handlers Definition +* The default interrupt handler functions are defined as weak functions to a dummy +* handler in the startup file. The naming convention for the interrupt handler names +* is _IRQHandler. A default interrupt handler can be overwritten in +* user code by defining the handler function using the same name. For example: +* \code +* void scb_0_interrupt_IRQHandler(void) +*{ +* ... +*} +* \endcode +* +* \subsection group_system_config_device_vector_table Vectors Table Copy from Flash to RAM +* This process uses memory sections defined in the linker script. The startup +* code actually defines the contents of the vector table and performs the copy. +* \subsubsection group_system_config_device_vector_table_gcc ARM GCC +* The linker script file is 'xx_yy.ld', where 'xx' is the device family, and +* 'yy' is the target CPU; for example, cy8c6xx7_cm0plus.ld and cy8c6xx7_cm4_dual.ld. +* It defines sections and locations in memory.\n +* Copy interrupt vectors from flash to RAM: \n +* From: \code LONG (__Vectors) \endcode +* To: \code LONG (__ram_vectors_start__) \endcode +* Size: \code LONG (__Vectors_End - __Vectors) \endcode +* The vector table address (and the vector table itself) are defined in the +* assembler startup files (e.g. startup_psoc6_01_cm0plus.S and startup_psoc6_01_cm4.S). +* The code in these files copies the vector table from Flash to RAM. +* \subsubsection group_system_config_device_vector_table_mdk ARM MDK +* The linker script file is 'xx_yy.scat', where 'xx' is the device family, +* and 'yy' is the target CPU; for example, cy8c6xx7_cm0plus.scat and +* cy8c6xx7_cm4_dual.scat. The linker script specifies that the vector table +* (RESET_RAM) shall be first in the RAM section.\n +* RESET_RAM represents the vector table. It is defined in the assembler startup +* files (e.g. startup_psoc6_01_cm0plus.s and startup_psoc6_01_cm4.s). +* The code in these files copies the vector table from Flash to RAM. +* +* \subsubsection group_system_config_device_vector_table_iar IAR +* The linker script file is 'xx_yy.icf', where 'xx' is the device family, and +* 'yy' is the target CPU; for example, cy8c6xx7_cm0plus.icf and cy8c6xx7_cm4_dual.icf. +* This file defines the .intvec_ram section and its location. +* \code place at start of IRAM1_region { readwrite section .intvec_ram}; \endcode +* The vector table address (and the vector table itself) are defined in the +* assembler startup files (e.g. startup_psoc6_01_cm0plus.s and startup_psoc6_01_cm4.s). +* The code in these files copies the vector table from Flash to RAM. +* +* \section group_system_config_more_information More Information +* Refer to the PDL User Guide for the +* more details. +* +* \section group_system_config_MISRA MISRA Compliance +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
2.3RThe character sequence // shall not be used within a comment.The comments provide a useful WEB link to the documentation.
+* +* \section group_system_config_changelog Changelog +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
VersionChangesReason for Change
2.20Moved the Cy_IPC_SystemSemaInit(), Cy_IPC_SystemPipeInit() functions implementation from IPC to Startup.Changed the IPC driver configuration method from compile time to run time.
2.10Added constructor attribute to SystemInit() function declaration for ARM MDK compiler. \n +* Removed $Sub$$main symbol for ARM MDK compiler. +* uVision Debugger support.
Updated description of the Startup behavior for Single-Core Devices. \n +* Added note about WDT disabling by SystemInit() function. +* Documentation improvement.
2.0Added restoring of FLL registers to the default state in SystemInit() API for single core devices. +* Single core device support. +*
Added Normal Access Restrictions, Public Key, TOC part2 and TOC part2 copy to Supervisory flash linker memory regions. \n +* Renamed 'wflash' memory region to 'em_eeprom'. +* Linker scripts usability improvement.
Added Cy_IPC_SystemSemaInit(), Cy_IPC_SystemPipeInit(), Cy_Flash_Init() functions call to SystemInit() API.Reserved system resources for internal operations.
Added clearing and releasing of IPC structure #7 (reserved for the Deep-Sleep operations) to SystemInit() API.To avoid deadlocks in case of SW or WDT reset during Deep-Sleep entering.
1.0Initial version
+* +* +* \defgroup group_system_config_macro Macro +* \{ +* \defgroup group_system_config_system_macro System +* \defgroup group_system_config_cm4_status_macro Cortex-M4 Status +* \defgroup group_system_config_user_settings_macro User Settings +* \} +* \defgroup group_system_config_functions Functions +* \{ +* \defgroup group_system_config_system_functions System +* \defgroup group_system_config_cm4_functions Cortex-M4 Control +* \} +* \defgroup group_system_config_globals Global Variables +* +* \} +*/ + +/** +* \addtogroup group_system_config_system_functions +* \{ +* \details +* The following system functions implement CMSIS Core functions. +* Refer to the [CMSIS documentation] +* (http://www.keil.com/pack/doc/CMSIS/Core/html/group__system__init__gr.html "System and Clock Configuration") +* for more details. +* \} +*/ + +#ifdef __cplusplus +extern "C" { +#endif + + +/******************************************************************************* +* Include files +*******************************************************************************/ +#include + + +/******************************************************************************* +* Global preprocessor symbols/macros ('define') +*******************************************************************************/ +#if ((defined(__GNUC__) && (__ARM_ARCH == 6) && (__ARM_ARCH_6M__ == 1)) || \ + (defined (__ICCARM__) && (__CORE__ == __ARM6M__)) || \ + (defined(__ARMCC_VERSION) && (__TARGET_ARCH_THUMB == 3))) + #define CY_SYSTEM_CPU_CM0P 1UL +#else + #define CY_SYSTEM_CPU_CM0P 0UL +#endif + +#if defined (CY_PSOC_CREATOR_USED) && (CY_PSOC_CREATOR_USED == 1U) + #include "cyfitter.h" +#endif /* (CY_PSOC_CREATOR_USED) && (CY_PSOC_CREATOR_USED == 1U) */ + + + + +/******************************************************************************* +* +* START OF USER SETTINGS HERE +* =========================== +* +* All lines with '<<<' can be set by user. +* +*******************************************************************************/ + +/** +* \addtogroup group_system_config_user_settings_macro +* \{ +*/ + +#if defined (CYDEV_CLK_EXTCLK__HZ) + #define CY_CLK_EXT_FREQ_HZ (CYDEV_CLK_EXTCLK__HZ) +#else + /***************************************************************************//** + * External Clock Frequency (in Hz, [value]UL). If compiled within + * PSoC Creator and the clock is enabled in the DWR, the value from DWR used. + * Otherwise, edit the value below. + * (USER SETTING) + *******************************************************************************/ + #define CY_CLK_EXT_FREQ_HZ (24000000UL) /* <<< 24 MHz */ +#endif /* (CYDEV_CLK_EXTCLK__HZ) */ + + +#if defined (CYDEV_CLK_ECO__HZ) + #define CY_CLK_ECO_FREQ_HZ (CYDEV_CLK_ECO__HZ) +#else + /***************************************************************************//** + * \brief External crystal oscillator frequency (in Hz, [value]UL). If compiled + * within PSoC Creator and the clock is enabled in the DWR, the value from DWR + * used. + * (USER SETTING) + *******************************************************************************/ + #define CY_CLK_ECO_FREQ_HZ (24000000UL) /* <<< 24 MHz */ +#endif /* (CYDEV_CLK_ECO__HZ) */ + + +#if defined (CYDEV_CLK_ALTHF__HZ) + #define CY_CLK_ALTHF_FREQ_HZ (CYDEV_CLK_ALTHF__HZ) +#else + /***************************************************************************//** + * \brief Alternate high frequency (in Hz, [value]UL). If compiled within + * PSoC Creator and the clock is enabled in the DWR, the value from DWR used. + * Otherwise, edit the value below. + * (USER SETTING) + *******************************************************************************/ + #define CY_CLK_ALTHF_FREQ_HZ (32000000UL) /* <<< 32 MHz */ +#endif /* (CYDEV_CLK_ALTHF__HZ) */ + + +/***************************************************************************//** +* \brief Start address of the Cortex-M4 application ([address]UL) +* (USER SETTING) +*******************************************************************************/ +#define CY_CORTEX_M4_APPL_ADDR ( CY_FLASH_BASE + CY_FLASH_SIZE / 2U) /* <<< Half of flash is reserved for the Cortex-M0+ application */ + + +/***************************************************************************//** +* \brief IPC Semaphores allocation ([value]UL). +* (USER SETTING) +*******************************************************************************/ +#define CY_IPC_SEMA_COUNT (128UL) /* <<< This will allow 128 (4*32) semaphores */ + + +/***************************************************************************//** +* \brief IPC Pipe definitions ([value]UL). +* (USER SETTING) +*******************************************************************************/ +#define CY_IPC_MAX_ENDPOINTS (8UL) /* <<< 8 endpoints */ + + +/******************************************************************************* +* +* END OF USER SETTINGS HERE +* ========================= +* +*******************************************************************************/ + +/** \} group_system_config_user_settings_macro */ + + +/** +* \addtogroup group_system_config_system_macro +* \{ +*/ + +#if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) + /** The Cortex-M0+ startup driver identifier */ + #define CY_STARTUP_M0P_ID ((uint32_t)((uint32_t)((0x0EU) & 0x3FFFU) << 18U)) +#endif /* (CY_SYSTEM_CPU_CM0P == 1UL) */ + +#if (CY_SYSTEM_CPU_CM0P != 1UL) || defined(CY_DOXYGEN) + /** The Cortex-M4 startup driver identifier */ + #define CY_STARTUP_M4_ID ((uint32_t)((uint32_t)((0x0FU) & 0x3FFFU) << 18U)) +#endif /* (CY_SYSTEM_CPU_CM0P != 1UL) */ + +/** \} group_system_config_system_macro */ + + +/** +* \addtogroup group_system_config_system_functions +* \{ +*/ +#if defined(__ARMCC_VERSION) + extern void SystemInit(void) __attribute__((constructor)); +#else + extern void SystemInit(void); +#endif /* (__ARMCC_VERSION) */ + +extern void SystemCoreClockUpdate(void); +/** \} group_system_config_system_functions */ + + +/** +* \addtogroup group_system_config_cm4_functions +* \{ +*/ +extern uint32_t Cy_SysGetCM4Status(void); +extern void Cy_SysEnableCM4(uint32_t vectorTableOffset); +extern void Cy_SysDisableCM4(void); +extern void Cy_SysRetainCM4(void); +extern void Cy_SysResetCM4(void); +/** \} group_system_config_cm4_functions */ + + +/** \cond */ +extern void Default_Handler (void); + +void Cy_SysIpcPipeIsrCm0(void); +void Cy_SysIpcPipeIsrCm4(void); + +extern void Cy_SystemInit(void); +extern void Cy_SystemInitFpuEnable(void); + +extern uint32_t cy_delayFreqHz; +extern uint32_t cy_delayFreqKhz; +extern uint8_t cy_delayFreqMhz; +extern uint32_t cy_delay32kMs; +/** \endcond */ + + +#if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) +/** +* \addtogroup group_system_config_cm4_status_macro +* \{ +*/ +#define CY_SYS_CM4_STATUS_ENABLED (3U) /**< The Cortex-M4 core is enabled: power on, clock on, no isolate, no reset and no retain. */ +#define CY_SYS_CM4_STATUS_DISABLED (0U) /**< The Cortex-M4 core is disabled: power off, clock off, isolate, reset and no retain. */ +#define CY_SYS_CM4_STATUS_RETAINED (2U) /**< The Cortex-M4 core is retained. power off, clock off, isolate, no reset and retain. */ +#define CY_SYS_CM4_STATUS_RESET (1U) /**< The Cortex-M4 core is in the Reset mode: clock off, no isolated, no retain and reset. */ +/** \} group_system_config_cm4_status_macro */ + +#endif /* (CY_SYSTEM_CPU_CM0P == 1UL) */ + + +/******************************************************************************* +* IPC Configuration +* ========================= +*******************************************************************************/ +/* IPC CY_PIPE default configuration */ +#define CY_SYS_CYPIPE_CLIENT_CNT (8UL) + +#define CY_SYS_INTR_CYPIPE_MUX_EP0 (1UL) /* IPC CYPRESS PIPE */ +#define CY_SYS_INTR_CYPIPE_PRIOR_EP0 (1UL) /* Notifier Priority */ +#define CY_SYS_INTR_CYPIPE_PRIOR_EP1 (1UL) /* Notifier Priority */ + +#define CY_SYS_CYPIPE_CHAN_MASK_EP0 (0x0001UL << CY_IPC_CHAN_CYPIPE_EP0) +#define CY_SYS_CYPIPE_CHAN_MASK_EP1 (0x0001UL << CY_IPC_CHAN_CYPIPE_EP1) + + +/******************************************************************************/ +/* + * The System pipe configuration defines the IPC channel number, interrupt + * number, and the pipe interrupt mask for the endpoint. + * + * The format of the endPoint configuration + * Bits[31:16] Interrupt Mask + * Bits[15:8 ] IPC interrupt + * Bits[ 7:0 ] IPC channel + */ + +/* System Pipe addresses */ +/* CyPipe defines */ + +#define CY_SYS_CYPIPE_INTR_MASK ( CY_SYS_CYPIPE_CHAN_MASK_EP0 | CY_SYS_CYPIPE_CHAN_MASK_EP1 ) + +#define CY_SYS_CYPIPE_CONFIG_EP0 ( (CY_SYS_CYPIPE_INTR_MASK << CY_IPC_PIPE_CFG_IMASK_Pos) \ + | (CY_IPC_INTR_CYPIPE_EP0 << CY_IPC_PIPE_CFG_INTR_Pos) \ + | CY_IPC_CHAN_CYPIPE_EP0) +#define CY_SYS_CYPIPE_CONFIG_EP1 ( (CY_SYS_CYPIPE_INTR_MASK << CY_IPC_PIPE_CFG_IMASK_Pos) \ + | (CY_IPC_INTR_CYPIPE_EP1 << CY_IPC_PIPE_CFG_INTR_Pos) \ + | CY_IPC_CHAN_CYPIPE_EP1) + +/******************************************************************************/ + + +/** \addtogroup group_system_config_globals +* \{ +*/ + +extern uint32_t SystemCoreClock; +extern uint32_t cy_BleEcoClockFreqHz; +extern uint32_t cy_Hfclk0FreqHz; +extern uint32_t cy_PeriClkFreqHz; + +/** \} group_system_config_globals */ + + + +/** \cond INTERNAL */ +/******************************************************************************* +* Backward compatibility macro. The following code is DEPRECATED and must +* not be used in new projects +*******************************************************************************/ + +/* BWC defines for functions related to enter/exit critical section */ +#define Cy_SaveIRQ Cy_SysLib_EnterCriticalSection +#define Cy_RestoreIRQ Cy_SysLib_ExitCriticalSection +#define CY_SYS_INTR_CYPIPE_EP0 (CY_IPC_INTR_CYPIPE_EP0) +#define CY_SYS_INTR_CYPIPE_EP1 (CY_IPC_INTR_CYPIPE_EP1) + +/** \endcond */ + +#ifdef __cplusplus +} +#endif + +#endif /* _SYSTEM_PSOC6_H_ */ + + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/system_psoc6_cm0plus.c b/2020TPCApp0.cydsn/system_psoc6_cm0plus.c new file mode 100644 index 0000000..038e7b4 --- /dev/null +++ b/2020TPCApp0.cydsn/system_psoc6_cm0plus.c @@ -0,0 +1,699 @@ +/***************************************************************************//** +* \file system_psoc6_cm0plus.c +* \version 2.20 +* +* The device system-source file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include +#include "system_psoc6.h" +#include "cy_device.h" +#include "cy_device_headers.h" +#include "cy_syslib.h" +#include "cy_wdt.h" + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) + #include "cy_ipc_sema.h" + #include "cy_ipc_pipe.h" + #include "cy_ipc_drv.h" + + #if defined(CY_DEVICE_PSOC6ABLE2) + #include "cy_flash.h" + #endif /* defined(CY_DEVICE_PSOC6ABLE2) */ + +#endif /* !defined(CY_IPC_DEFAULT_CFG_DISABLE) */ + + +/******************************************************************************* +* SystemCoreClockUpdate() +*******************************************************************************/ + +/** Default HFClk frequency in Hz */ +#define CY_CLK_HFCLK0_FREQ_HZ_DEFAULT (150000000UL) + +/** Default PeriClk frequency in Hz */ +#define CY_CLK_PERICLK_FREQ_HZ_DEFAULT (75000000UL) + +/** Default SlowClk system core frequency in Hz */ +#define CY_CLK_SYSTEM_FREQ_HZ_DEFAULT (75000000UL) + +/** IMO frequency in Hz */ +#define CY_CLK_IMO_FREQ_HZ (8000000UL) + +/** HVILO frequency in Hz */ +#define CY_CLK_HVILO_FREQ_HZ (32000UL) + +/** PILO frequency in Hz */ +#define CY_CLK_PILO_FREQ_HZ (32768UL) + +/** WCO frequency in Hz */ +#define CY_CLK_WCO_FREQ_HZ (32768UL) + +/** ALTLF frequency in Hz */ +#define CY_CLK_ALTLF_FREQ_HZ (32768UL) + + +/** +* Holds the SlowClk (Cortex-M0+) or FastClk (Cortex-M4) system core clock, +* which is the system clock frequency supplied to the SysTick timer and the +* processor core clock. +* This variable implements CMSIS Core global variable. +* Refer to the [CMSIS documentation] +* (http://www.keil.com/pack/doc/CMSIS/Core/html/group__system__init__gr.html "System and Clock Configuration") +* for more details. +* This variable can be used by debuggers to query the frequency +* of the debug timer or to configure the trace clock speed. +* +* \attention Compilers must be configured to avoid removing this variable in case +* the application program is not using it. Debugging systems require the variable +* to be physically present in memory so that it can be examined to configure the debugger. */ +uint32_t SystemCoreClock = CY_CLK_SYSTEM_FREQ_HZ_DEFAULT; + +/** Holds the HFClk0 clock frequency. Updated by \ref SystemCoreClockUpdate(). */ +uint32_t cy_Hfclk0FreqHz = CY_CLK_HFCLK0_FREQ_HZ_DEFAULT; + +/** Holds the PeriClk clock frequency. Updated by \ref SystemCoreClockUpdate(). */ +uint32_t cy_PeriClkFreqHz = CY_CLK_PERICLK_FREQ_HZ_DEFAULT; + +/** Holds the Alternate high frequency clock in Hz. Updated by \ref SystemCoreClockUpdate(). */ +#if (defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL)) || defined (CY_DOXYGEN) + uint32_t cy_BleEcoClockFreqHz = CY_CLK_ALTHF_FREQ_HZ; +#endif /* (defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL)) || defined (CY_DOXYGEN) */ + + +/******************************************************************************* +* SystemInit() +*******************************************************************************/ + +/* CLK_FLL_CONFIG default values */ +#define CY_FB_CLK_FLL_CONFIG_VALUE (0x01000000u) +#define CY_FB_CLK_FLL_CONFIG2_VALUE (0x00020001u) +#define CY_FB_CLK_FLL_CONFIG3_VALUE (0x00002800u) +#define CY_FB_CLK_FLL_CONFIG4_VALUE (0x000000FFu) + + +/******************************************************************************* +* SystemCoreClockUpdate (void) +*******************************************************************************/ + +/* Do not use these definitions directly in your application */ +#define CY_DELAY_MS_OVERFLOW_THRESHOLD (0x8000u) +#define CY_DELAY_1K_THRESHOLD (1000u) +#define CY_DELAY_1K_MINUS_1_THRESHOLD (CY_DELAY_1K_THRESHOLD - 1u) +#define CY_DELAY_1M_THRESHOLD (1000000u) +#define CY_DELAY_1M_MINUS_1_THRESHOLD (CY_DELAY_1M_THRESHOLD - 1u) +uint32_t cy_delayFreqHz = CY_CLK_SYSTEM_FREQ_HZ_DEFAULT; + +uint32_t cy_delayFreqKhz = (CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / + CY_DELAY_1K_THRESHOLD; + +uint8_t cy_delayFreqMhz = (uint8_t)((CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1M_MINUS_1_THRESHOLD) / + CY_DELAY_1M_THRESHOLD); + +uint32_t cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * + ((CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / CY_DELAY_1K_THRESHOLD); + +#define CY_ROOT_PATH_SRC_IMO (0UL) +#define CY_ROOT_PATH_SRC_EXT (1UL) +#if (SRSS_ECO_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_ECO (2UL) +#endif /* (SRSS_ECO_PRESENT == 1U) */ +#if (SRSS_ALTHF_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_ALTHF (3UL) +#endif /* (SRSS_ALTHF_PRESENT == 1U) */ +#define CY_ROOT_PATH_SRC_DSI_MUX (4UL) +#define CY_ROOT_PATH_SRC_DSI_MUX_HVILO (16UL) +#define CY_ROOT_PATH_SRC_DSI_MUX_WCO (17UL) +#if (SRSS_ALTLF_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_DSI_MUX_ALTLF (18UL) +#endif /* (SRSS_ALTLF_PRESENT == 1U) */ +#if (SRSS_PILO_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_DSI_MUX_PILO (19UL) +#endif /* (SRSS_PILO_PRESENT == 1U) */ + + +/******************************************************************************* +* Cy_SysEnableCM4(), Cy_SysRetainCM4(), and Cy_SysResetCM4() +*******************************************************************************/ +#define CY_SYS_CM4_PWR_CTL_KEY_OPEN (0x05FAUL) +#define CY_SYS_CM4_PWR_CTL_KEY_CLOSE (0xFA05UL) +#define CY_SYS_CM4_VECTOR_TABLE_VALID_ADDR (0x000003FFUL) + + +/******************************************************************************* +* Function Name: SystemInit +****************************************************************************//** +* +* Initializes the system: +* - Restores FLL registers to the default state. +* - Unlocks and disables WDT. +* - Calls Cy_PDL_Init() function to define the driver library. +* - Calls the Cy_SystemInit() function, if compiled from PSoC Creator. +* - Calls \ref SystemCoreClockUpdate(). +* +*******************************************************************************/ +void SystemInit(void) +{ + Cy_PDL_Init(CY_DEVICE_CFG); + + /* Restore FLL registers to the default state as they are not restored by the ROM code */ + uint32_t copy = SRSS->CLK_FLL_CONFIG; + copy &= ~SRSS_CLK_FLL_CONFIG_FLL_ENABLE_Msk; + SRSS->CLK_FLL_CONFIG = copy; + + copy = SRSS->CLK_ROOT_SELECT[0u]; + copy &= ~SRSS_CLK_ROOT_SELECT_ROOT_DIV_Msk; /* Set ROOT_DIV = 0*/ + SRSS->CLK_ROOT_SELECT[0u] = copy; + + SRSS->CLK_FLL_CONFIG = CY_FB_CLK_FLL_CONFIG_VALUE; + SRSS->CLK_FLL_CONFIG2 = CY_FB_CLK_FLL_CONFIG2_VALUE; + SRSS->CLK_FLL_CONFIG3 = CY_FB_CLK_FLL_CONFIG3_VALUE; + SRSS->CLK_FLL_CONFIG4 = CY_FB_CLK_FLL_CONFIG4_VALUE; + + /* Unlock and disable WDT */ + Cy_WDT_Unlock(); + Cy_WDT_Disable(); + + Cy_SystemInit(); + SystemCoreClockUpdate(); + +#if defined(CY_DEVICE_PSOC6ABLE2) && !defined(CY_PSOC6ABLE2_REV_0A_SUPPORT_DISABLE) + if (CY_SYSLIB_DEVICE_REV_0A == Cy_SysLib_GetDeviceRevision()) + { + /* Clear data register of IPC structure #7, reserved for the Deep-Sleep operations. */ + IPC_STRUCT7->DATA = 0UL; + /* Release IPC structure #7 to avoid deadlocks in case of SW or WDT reset during Deep-Sleep entering. */ + IPC_STRUCT7->RELEASE = 0UL; + } +#endif /* defined(CY_DEVICE_PSOC6ABLE2) && !defined(CY_PSOC6ABLE2_REV_0A_SUPPORT_DISABLE) */ + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) + /* Allocate and initialize semaphores for the system operations. */ + static uint32_t ipcSemaArray[CY_IPC_SEMA_COUNT / CY_IPC_SEMA_PER_WORD]; + + (void) Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, CY_IPC_SEMA_COUNT, ipcSemaArray); + + + /******************************************************************************** + * + * Initializes the system pipes. The system pipes are used by BLE and Flash. + * + * If the default startup file is not used, or SystemInit() is not called in your + * project, call the following three functions prior to executing any flash or + * EmEEPROM write or erase operation: + * -# Cy_IPC_Sema_Init() + * -# Cy_IPC_Pipe_Config() + * -# Cy_IPC_Pipe_Init() + * -# Cy_Flash_Init() + * + *******************************************************************************/ + + /* Create an array of endpoint structures */ + static cy_stc_ipc_pipe_ep_t systemIpcPipeEpArray[CY_IPC_MAX_ENDPOINTS]; + + Cy_IPC_Pipe_Config(systemIpcPipeEpArray); + + static cy_ipc_pipe_callback_ptr_t systemIpcPipeSysCbArray[CY_SYS_CYPIPE_CLIENT_CNT]; + + static const cy_stc_ipc_pipe_config_t systemIpcPipeConfigCm0 = + { + /* .ep0ConfigData */ + { + /* .ipcNotifierNumber */ CY_IPC_INTR_CYPIPE_EP0, + /* .ipcNotifierPriority */ CY_SYS_INTR_CYPIPE_PRIOR_EP0, + /* .ipcNotifierMuxNumber */ CY_SYS_INTR_CYPIPE_MUX_EP0, + /* .epAddress */ CY_IPC_EP_CYPIPE_CM0_ADDR, + /* .epConfig */ CY_SYS_CYPIPE_CONFIG_EP0 + }, + /* .ep1ConfigData */ + { + /* .ipcNotifierNumber */ CY_IPC_INTR_CYPIPE_EP1, + /* .ipcNotifierPriority */ CY_SYS_INTR_CYPIPE_PRIOR_EP1, + /* .ipcNotifierMuxNumber */ 0u, + /* .epAddress */ CY_IPC_EP_CYPIPE_CM4_ADDR, + /* .epConfig */ CY_SYS_CYPIPE_CONFIG_EP1 + }, + /* .endpointClientsCount */ CY_SYS_CYPIPE_CLIENT_CNT, + /* .endpointsCallbacksArray */ systemIpcPipeSysCbArray, + /* .userPipeIsrHandler */ &Cy_SysIpcPipeIsrCm0 + }; + + if (cy_device->flashPipeRequired != 0u) + { + Cy_IPC_Pipe_Init(&systemIpcPipeConfigCm0); + } + +#if defined(CY_DEVICE_PSOC6ABLE2) + Cy_Flash_Init(); +#endif /* defined(CY_DEVICE_PSOC6ABLE2) */ + +#endif /* !defined(CY_IPC_DEFAULT_CFG_DISABLE) */ +} + + +/******************************************************************************* +* Function Name: Cy_SystemInit +****************************************************************************//** +* +* The function is called during device startup. Once project compiled as part of +* the PSoC Creator project, the Cy_SystemInit() function is generated by the +* PSoC Creator. +* +* The function generated by PSoC Creator performs all of the necessary device +* configuration based on the design settings. This includes settings from the +* Design Wide Resources (DWR) such as Clocks and Pins as well as any component +* configuration that is necessary. +* +*******************************************************************************/ +__WEAK void Cy_SystemInit(void) +{ + /* Empty weak function. The actual implementation to be in the PSoC Creator + * generated strong function. + */ +} + + +/******************************************************************************* +* Function Name: SystemCoreClockUpdate +****************************************************************************//** +* +* Gets core clock frequency and updates \ref SystemCoreClock, \ref +* cy_Hfclk0FreqHz, and \ref cy_PeriClkFreqHz. +* +* Updates global variables used by the \ref Cy_SysLib_Delay(), \ref +* Cy_SysLib_DelayUs(), and \ref Cy_SysLib_DelayCycles(). +* +*******************************************************************************/ +void SystemCoreClockUpdate (void) +{ + uint32_t srcFreqHz; + uint32_t pathFreqHz; + uint32_t slowClkDiv; + uint32_t periClkDiv; + uint32_t rootPath; + uint32_t srcClk; + + /* Get root path clock for the high-frequency clock # 0 */ + rootPath = _FLD2VAL(SRSS_CLK_ROOT_SELECT_ROOT_MUX, SRSS->CLK_ROOT_SELECT[0u]); + + /* Get source of the root path clock */ + srcClk = _FLD2VAL(SRSS_CLK_PATH_SELECT_PATH_MUX, SRSS->CLK_PATH_SELECT[rootPath]); + + /* Get frequency of the source */ + switch (srcClk) + { + case CY_ROOT_PATH_SRC_IMO: + srcFreqHz = CY_CLK_IMO_FREQ_HZ; + break; + + case CY_ROOT_PATH_SRC_EXT: + srcFreqHz = CY_CLK_EXT_FREQ_HZ; + break; + + #if (SRSS_ECO_PRESENT == 1U) + case CY_ROOT_PATH_SRC_ECO: + srcFreqHz = CY_CLK_ECO_FREQ_HZ; + break; + #endif /* (SRSS_ECO_PRESENT == 1U) */ + +#if defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) && (SRSS_ALTHF_PRESENT == 1U) + case CY_ROOT_PATH_SRC_ALTHF: + srcFreqHz = cy_BleEcoClockFreqHz; + break; +#endif /* defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) && (SRSS_ALTHF_PRESENT == 1U) */ + + case CY_ROOT_PATH_SRC_DSI_MUX: + { + uint32_t dsi_src; + dsi_src = _FLD2VAL(SRSS_CLK_DSI_SELECT_DSI_MUX, SRSS->CLK_DSI_SELECT[rootPath]); + switch (dsi_src) + { + case CY_ROOT_PATH_SRC_DSI_MUX_HVILO: + srcFreqHz = CY_CLK_HVILO_FREQ_HZ; + break; + + case CY_ROOT_PATH_SRC_DSI_MUX_WCO: + srcFreqHz = CY_CLK_WCO_FREQ_HZ; + break; + + #if (SRSS_ALTLF_PRESENT == 1U) + case CY_ROOT_PATH_SRC_DSI_MUX_ALTLF: + srcFreqHz = CY_CLK_ALTLF_FREQ_HZ; + break; + #endif /* (SRSS_ALTLF_PRESENT == 1U) */ + + #if (SRSS_PILO_PRESENT == 1U) + case CY_ROOT_PATH_SRC_DSI_MUX_PILO: + srcFreqHz = CY_CLK_PILO_FREQ_HZ; + break; + #endif /* (SRSS_PILO_PRESENT == 1U) */ + + default: + srcFreqHz = CY_CLK_HVILO_FREQ_HZ; + break; + } + } + break; + + default: + srcFreqHz = CY_CLK_EXT_FREQ_HZ; + break; + } + + if (rootPath == 0UL) + { + /* FLL */ + bool fllLocked = ( 0UL != _FLD2VAL(SRSS_CLK_FLL_STATUS_LOCKED, SRSS->CLK_FLL_STATUS)); + bool fllOutputOutput = ( 3UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3)); + bool fllOutputAuto = ((0UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3)) || + (1UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3))); + if ((fllOutputAuto && fllLocked) || fllOutputOutput) + { + uint32_t fllMult; + uint32_t refDiv; + uint32_t outputDiv; + + fllMult = _FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_MULT, SRSS->CLK_FLL_CONFIG); + refDiv = _FLD2VAL(SRSS_CLK_FLL_CONFIG2_FLL_REF_DIV, SRSS->CLK_FLL_CONFIG2); + outputDiv = _FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_OUTPUT_DIV, SRSS->CLK_FLL_CONFIG) + 1UL; + + pathFreqHz = ((srcFreqHz / refDiv) * fllMult) / outputDiv; + } + else + { + pathFreqHz = srcFreqHz; + } + } + else if (rootPath == 1UL) + { + /* PLL */ + bool pllLocked = ( 0UL != _FLD2VAL(SRSS_CLK_PLL_STATUS_LOCKED, SRSS->CLK_PLL_STATUS[0UL])); + bool pllOutputOutput = ( 3UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL])); + bool pllOutputAuto = ((0UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL])) || + (1UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL]))); + if ((pllOutputAuto && pllLocked) || pllOutputOutput) + { + uint32_t feedbackDiv; + uint32_t referenceDiv; + uint32_t outputDiv; + + feedbackDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_FEEDBACK_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + referenceDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_REFERENCE_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + outputDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_OUTPUT_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + + pathFreqHz = ((srcFreqHz * feedbackDiv) / referenceDiv) / outputDiv; + + } + else + { + pathFreqHz = srcFreqHz; + } + } + else + { + /* Direct */ + pathFreqHz = srcFreqHz; + } + + /* Get frequency after hf_clk pre-divider */ + pathFreqHz = pathFreqHz >> _FLD2VAL(SRSS_CLK_ROOT_SELECT_ROOT_DIV, SRSS->CLK_ROOT_SELECT[0u]); + cy_Hfclk0FreqHz = pathFreqHz; + + /* Slow Clock Divider */ + slowClkDiv = 1u + _FLD2VAL(CPUSS_CM0_CLOCK_CTL_SLOW_INT_DIV, CPUSS->CM0_CLOCK_CTL); + + /* Peripheral Clock Divider */ + periClkDiv = 1u + _FLD2VAL(CPUSS_CM0_CLOCK_CTL_PERI_INT_DIV, CPUSS->CM0_CLOCK_CTL); + + pathFreqHz = pathFreqHz / periClkDiv; + cy_PeriClkFreqHz = pathFreqHz; + pathFreqHz = pathFreqHz / slowClkDiv; + SystemCoreClock = pathFreqHz; + + /* Sets clock frequency for Delay API */ + cy_delayFreqHz = SystemCoreClock; + cy_delayFreqMhz = (uint8_t)((cy_delayFreqHz + CY_DELAY_1M_MINUS_1_THRESHOLD) / CY_DELAY_1M_THRESHOLD); + cy_delayFreqKhz = (cy_delayFreqHz + CY_DELAY_1K_MINUS_1_THRESHOLD) / CY_DELAY_1K_THRESHOLD; + cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * cy_delayFreqKhz; +} + + +#if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) +/******************************************************************************* +* Function Name: Cy_SysGetCM4Status +****************************************************************************//** +* +* Returns the Cortex-M4 core power mode. +* +* \return \ref group_system_config_cm4_status_macro +* +*******************************************************************************/ +uint32_t Cy_SysGetCM4Status(void) +{ + uint32_t regValue; + + /* Get current power mode */ + regValue = CPUSS->CM4_PWR_CTL & CPUSS_CM4_PWR_CTL_PWR_MODE_Msk; + + return (regValue); +} + + +/******************************************************************************* +* Function Name: Cy_SysEnableCM4 +****************************************************************************//** +* +* Sets vector table base address and enables the Cortex-M4 core. +* +* \note If the CPU is already enabled, it is reset and then enabled. +* +* \param vectorTableOffset The offset of the vector table base address from +* memory address 0x00000000. The offset should be multiple to 1024 bytes. +* +*******************************************************************************/ +void Cy_SysEnableCM4(uint32_t vectorTableOffset) +{ + uint32_t regValue; + uint32_t interruptState; + uint32_t cpuState; + + CY_ASSERT_L2((vectorTableOffset & CY_SYS_CM4_VECTOR_TABLE_VALID_ADDR) == 0UL); + + interruptState = Cy_SysLib_EnterCriticalSection(); + + cpuState = Cy_SysGetCM4Status(); + if (CY_SYS_CM4_STATUS_ENABLED == cpuState) + { + Cy_SysResetCM4(); + } + + CPUSS->CM4_VECTOR_TABLE_BASE = vectorTableOffset; + + regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); + regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); + regValue |= CY_SYS_CM4_STATUS_ENABLED; + CPUSS->CM4_PWR_CTL = regValue; + + while((CPUSS->CM4_STATUS & CPUSS_CM4_STATUS_PWR_DONE_Msk) == 0UL) + { + /* Wait for the power mode to take effect */ + } + + Cy_SysLib_ExitCriticalSection(interruptState); +} + + +/******************************************************************************* +* Function Name: Cy_SysDisableCM4 +****************************************************************************//** +* +* Disables the Cortex-M4 core and waits for the mode to take the effect. +* +* \warning Do not call the function while the Cortex-M4 is executing because +* such a call may corrupt/abort a pending bus-transaction by the CPU and cause +* unexpected behavior in the system including a deadlock. Call the function +* while the Cortex-M4 core is in the Sleep or Deep Sleep low-power mode. Use +* the \ref group_syspm Power Management (syspm) API to put the CPU into the +* low-power modes. Use the \ref Cy_SysPm_ReadStatus() to get a status of the +* CPU. +* +*******************************************************************************/ +void Cy_SysDisableCM4(void) +{ + uint32_t interruptState; + uint32_t regValue; + + interruptState = Cy_SysLib_EnterCriticalSection(); + + regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); + regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); + regValue |= CY_SYS_CM4_STATUS_DISABLED; + CPUSS->CM4_PWR_CTL = regValue; + + while((CPUSS->CM4_STATUS & CPUSS_CM4_STATUS_PWR_DONE_Msk) == 0UL) + { + /* Wait for the power mode to take effect */ + } + + Cy_SysLib_ExitCriticalSection(interruptState); +} + + +/******************************************************************************* +* Function Name: Cy_SysRetainCM4 +****************************************************************************//** +* +* Retains the Cortex-M4 core and exists without waiting for the mode to take +* effect. +* +* \note The retained mode can be entered only from the enabled mode. +* +* \warning Do not call the function while the Cortex-M4 is executing because +* such a call may corrupt/abort a pending bus-transaction by the CPU and cause +* unexpected behavior in the system including a deadlock. Call the function +* while the Cortex-M4 core is in the Sleep or Deep Sleep low-power mode. Use +* the \ref group_syspm Power Management (syspm) API to put the CPU into the +* low-power modes. Use the \ref Cy_SysPm_ReadStatus() to get a status of the CPU. +* +*******************************************************************************/ +void Cy_SysRetainCM4(void) +{ + uint32_t interruptState; + uint32_t regValue; + + interruptState = Cy_SysLib_EnterCriticalSection(); + + regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); + regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); + regValue |= CY_SYS_CM4_STATUS_RETAINED; + CPUSS->CM4_PWR_CTL = regValue; + + Cy_SysLib_ExitCriticalSection(interruptState); +} + + +/******************************************************************************* +* Function Name: Cy_SysResetCM4 +****************************************************************************//** +* +* Resets the Cortex-M4 core and waits for the mode to take the effect. +* +* \note The reset mode can not be entered from the retained mode. +* +* \warning Do not call the function while the Cortex-M4 is executing because +* such a call may corrupt/abort a pending bus-transaction by the CPU and cause +* unexpected behavior in the system including a deadlock. Call the function +* while the Cortex-M4 core is in the Sleep or Deep Sleep low-power mode. Use +* the \ref group_syspm Power Management (syspm) API to put the CPU into the +* low-power modes. Use the \ref Cy_SysPm_ReadStatus() to get a status of the CPU. +* +*******************************************************************************/ +void Cy_SysResetCM4(void) +{ + uint32_t interruptState; + uint32_t regValue; + + interruptState = Cy_SysLib_EnterCriticalSection(); + + regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); + regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); + regValue |= CY_SYS_CM4_STATUS_RESET; + CPUSS->CM4_PWR_CTL = regValue; + + while((CPUSS->CM4_STATUS & CPUSS_CM4_STATUS_PWR_DONE_Msk) == 0UL) + { + /* Wait for the power mode to take effect */ + } + + Cy_SysLib_ExitCriticalSection(interruptState); +} +#endif /* #if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) */ + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) +/******************************************************************************* +* Function Name: Cy_SysIpcPipeIsrCm0 +****************************************************************************//** +* +* This is the interrupt service routine for the system pipe. +* +*******************************************************************************/ +void Cy_SysIpcPipeIsrCm0(void) +{ + Cy_IPC_Pipe_ExecuteCallback(CY_IPC_EP_CYPIPE_CM0_ADDR); +} +#endif + +/******************************************************************************* +* Function Name: Cy_MemorySymbols +****************************************************************************//** +* +* The intention of the function is to declare boundaries of the memories for the +* MDK compilers. For the rest of the supported compilers, this is done using +* linker configuration files. The following symbols used by the cymcuelftool. +* +*******************************************************************************/ +#if defined (__ARMCC_VERSION) +__asm void Cy_MemorySymbols(void) +{ + /* Flash */ + EXPORT __cy_memory_0_start + EXPORT __cy_memory_0_length + EXPORT __cy_memory_0_row_size + + /* Working Flash */ + EXPORT __cy_memory_1_start + EXPORT __cy_memory_1_length + EXPORT __cy_memory_1_row_size + + /* Supervisory Flash */ + EXPORT __cy_memory_2_start + EXPORT __cy_memory_2_length + EXPORT __cy_memory_2_row_size + + /* XIP */ + EXPORT __cy_memory_3_start + EXPORT __cy_memory_3_length + EXPORT __cy_memory_3_row_size + + /* eFuse */ + EXPORT __cy_memory_4_start + EXPORT __cy_memory_4_length + EXPORT __cy_memory_4_row_size + + + /* Flash */ +__cy_memory_0_start EQU __cpp(CY_FLASH_BASE) +__cy_memory_0_length EQU __cpp(CY_FLASH_SIZE) +__cy_memory_0_row_size EQU 0x200 + + /* Flash region for EEPROM emulation */ +__cy_memory_1_start EQU __cpp(CY_EM_EEPROM_BASE) +__cy_memory_1_length EQU __cpp(CY_EM_EEPROM_SIZE) +__cy_memory_1_row_size EQU 0x200 + + /* Supervisory Flash */ +__cy_memory_2_start EQU __cpp(CY_SFLASH_BASE) +__cy_memory_2_length EQU __cpp(CY_SFLASH_SIZE) +__cy_memory_2_row_size EQU 0x200 + + /* XIP */ +__cy_memory_3_start EQU __cpp(CY_XIP_BASE) +__cy_memory_3_length EQU __cpp(CY_XIP_SIZE) +__cy_memory_3_row_size EQU 0x200 + + /* eFuse */ +__cy_memory_4_start EQU __cpp(0x90700000) +__cy_memory_4_length EQU __cpp(0x100000) +__cy_memory_4_row_size EQU __cpp(1) +} +#endif /* defined (__ARMCC_VERSION) */ + + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/system_psoc6_cm4.c b/2020TPCApp0.cydsn/system_psoc6_cm4.c new file mode 100644 index 0000000..c4d8c11 --- /dev/null +++ b/2020TPCApp0.cydsn/system_psoc6_cm4.c @@ -0,0 +1,542 @@ +/***************************************************************************//** +* \file system_psoc6_cm4.c +* \version 2.20 +* +* The device system-source file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include +#include "system_psoc6.h" +#include "cy_device.h" +#include "cy_device_headers.h" +#include "cy_syslib.h" +#include "cy_wdt.h" + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) + #include "cy_ipc_sema.h" + #include "cy_ipc_pipe.h" + #include "cy_ipc_drv.h" + + #if defined(CY_DEVICE_PSOC6ABLE2) + #include "cy_flash.h" + #endif /* defined(CY_DEVICE_PSOC6ABLE2) */ +#endif /* !defined(CY_IPC_DEFAULT_CFG_DISABLE) */ + + +/******************************************************************************* +* SystemCoreClockUpdate() +*******************************************************************************/ + +/** Default HFClk frequency in Hz */ +#define CY_CLK_HFCLK0_FREQ_HZ_DEFAULT (150000000UL) + +/** Default PeriClk frequency in Hz */ +#define CY_CLK_PERICLK_FREQ_HZ_DEFAULT (75000000UL) + +/** Default SlowClk system core frequency in Hz */ +#define CY_CLK_SYSTEM_FREQ_HZ_DEFAULT (75000000UL) + +/** IMO frequency in Hz */ +#define CY_CLK_IMO_FREQ_HZ (8000000UL) + +/** HVILO frequency in Hz */ +#define CY_CLK_HVILO_FREQ_HZ (32000UL) + +/** PILO frequency in Hz */ +#define CY_CLK_PILO_FREQ_HZ (32768UL) + +/** WCO frequency in Hz */ +#define CY_CLK_WCO_FREQ_HZ (32768UL) + +/** ALTLF frequency in Hz */ +#define CY_CLK_ALTLF_FREQ_HZ (32768UL) + + +/** +* Holds the SlowClk (Cortex-M0+) or FastClk (Cortex-M4) system core clock, +* which is the system clock frequency supplied to the SysTick timer and the +* processor core clock. +* This variable implements CMSIS Core global variable. +* Refer to the [CMSIS documentation] +* (http://www.keil.com/pack/doc/CMSIS/Core/html/group__system__init__gr.html "System and Clock Configuration") +* for more details. +* This variable can be used by debuggers to query the frequency +* of the debug timer or to configure the trace clock speed. +* +* \attention Compilers must be configured to avoid removing this variable in case +* the application program is not using it. Debugging systems require the variable +* to be physically present in memory so that it can be examined to configure the debugger. */ +uint32_t SystemCoreClock = CY_CLK_SYSTEM_FREQ_HZ_DEFAULT; + +/** Holds the HFClk0 clock frequency. Updated by \ref SystemCoreClockUpdate(). */ +uint32_t cy_Hfclk0FreqHz = CY_CLK_HFCLK0_FREQ_HZ_DEFAULT; + +/** Holds the PeriClk clock frequency. Updated by \ref SystemCoreClockUpdate(). */ +uint32_t cy_PeriClkFreqHz = CY_CLK_PERICLK_FREQ_HZ_DEFAULT; + +/** Holds the Alternate high frequency clock in Hz. Updated by \ref SystemCoreClockUpdate(). */ +#if (defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL)) || defined (CY_DOXYGEN) + uint32_t cy_BleEcoClockFreqHz = CY_CLK_ALTHF_FREQ_HZ; +#endif /* (defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL)) || defined (CY_DOXYGEN) */ + +/* SCB->CPACR */ +#define SCB_CPACR_CP10_CP11_ENABLE (0xFUL << 20u) + + +/******************************************************************************* +* SystemInit() +*******************************************************************************/ + +/* CLK_FLL_CONFIG default values */ +#define CY_FB_CLK_FLL_CONFIG_VALUE (0x01000000u) +#define CY_FB_CLK_FLL_CONFIG2_VALUE (0x00020001u) +#define CY_FB_CLK_FLL_CONFIG3_VALUE (0x00002800u) +#define CY_FB_CLK_FLL_CONFIG4_VALUE (0x000000FFu) + + +/******************************************************************************* +* SystemCoreClockUpdate (void) +*******************************************************************************/ + +/* Do not use these definitions directly in your application */ +#define CY_DELAY_MS_OVERFLOW_THRESHOLD (0x8000u) +#define CY_DELAY_1K_THRESHOLD (1000u) +#define CY_DELAY_1K_MINUS_1_THRESHOLD (CY_DELAY_1K_THRESHOLD - 1u) +#define CY_DELAY_1M_THRESHOLD (1000000u) +#define CY_DELAY_1M_MINUS_1_THRESHOLD (CY_DELAY_1M_THRESHOLD - 1u) +uint32_t cy_delayFreqHz = CY_CLK_SYSTEM_FREQ_HZ_DEFAULT; + +uint32_t cy_delayFreqKhz = (CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / + CY_DELAY_1K_THRESHOLD; + +uint8_t cy_delayFreqMhz = (uint8_t)((CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1M_MINUS_1_THRESHOLD) / + CY_DELAY_1M_THRESHOLD); + +uint32_t cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * + ((CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / CY_DELAY_1K_THRESHOLD); + +#define CY_ROOT_PATH_SRC_IMO (0UL) +#define CY_ROOT_PATH_SRC_EXT (1UL) +#if (SRSS_ECO_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_ECO (2UL) +#endif /* (SRSS_ECO_PRESENT == 1U) */ +#if (SRSS_ALTHF_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_ALTHF (3UL) +#endif /* (SRSS_ALTHF_PRESENT == 1U) */ +#define CY_ROOT_PATH_SRC_DSI_MUX (4UL) +#define CY_ROOT_PATH_SRC_DSI_MUX_HVILO (16UL) +#define CY_ROOT_PATH_SRC_DSI_MUX_WCO (17UL) +#if (SRSS_ALTLF_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_DSI_MUX_ALTLF (18UL) +#endif /* (SRSS_ALTLF_PRESENT == 1U) */ +#if (SRSS_PILO_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_DSI_MUX_PILO (19UL) +#endif /* (SRSS_PILO_PRESENT == 1U) */ + + +/******************************************************************************* +* Function Name: SystemInit +****************************************************************************//** +* \cond +* Initializes the system: +* - Restores FLL registers to the default state for single core devices. +* - Unlocks and disables WDT. +* - Calls Cy_PDL_Init() function to define the driver library. +* - Calls the Cy_SystemInit() function, if compiled from PSoC Creator. +* - Calls \ref SystemCoreClockUpdate(). +* \endcond +*******************************************************************************/ +void SystemInit(void) +{ + Cy_PDL_Init(CY_DEVICE_CFG); + +#ifdef __CM0P_PRESENT + #if (__CM0P_PRESENT == 0) + /* Restore FLL registers to the default state as they are not restored by the ROM code */ + uint32_t copy = SRSS->CLK_FLL_CONFIG; + copy &= ~SRSS_CLK_FLL_CONFIG_FLL_ENABLE_Msk; + SRSS->CLK_FLL_CONFIG = copy; + + copy = SRSS->CLK_ROOT_SELECT[0u]; + copy &= ~SRSS_CLK_ROOT_SELECT_ROOT_DIV_Msk; /* Set ROOT_DIV = 0*/ + SRSS->CLK_ROOT_SELECT[0u] = copy; + + SRSS->CLK_FLL_CONFIG = CY_FB_CLK_FLL_CONFIG_VALUE; + SRSS->CLK_FLL_CONFIG2 = CY_FB_CLK_FLL_CONFIG2_VALUE; + SRSS->CLK_FLL_CONFIG3 = CY_FB_CLK_FLL_CONFIG3_VALUE; + SRSS->CLK_FLL_CONFIG4 = CY_FB_CLK_FLL_CONFIG4_VALUE; + + /* Unlock and disable WDT */ + Cy_WDT_Unlock(); + Cy_WDT_Disable(); + #endif /* (__CM0P_PRESENT == 0) */ +#endif /* __CM0P_PRESENT */ + + Cy_SystemInit(); + SystemCoreClockUpdate(); + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) + +#ifdef __CM0P_PRESENT + #if (__CM0P_PRESENT == 0) + /* Allocate and initialize semaphores for the system operations. */ + static uint32_t ipcSemaArray[CY_IPC_SEMA_COUNT / CY_IPC_SEMA_PER_WORD]; + (void) Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, CY_IPC_SEMA_COUNT, ipcSemaArray); + #else + (void) Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, 0ul, NULL); + #endif /* (__CM0P_PRESENT) */ +#else + (void) Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, 0ul, NULL); +#endif /* __CM0P_PRESENT */ + + + /******************************************************************************** + * + * Initializes the system pipes. The system pipes are used by BLE and Flash. + * + * If the default startup file is not used, or SystemInit() is not called in your + * project, call the following three functions prior to executing any flash or + * EmEEPROM write or erase operation: + * -# Cy_IPC_Sema_Init() + * -# Cy_IPC_Pipe_Config() + * -# Cy_IPC_Pipe_Init() + * -# Cy_Flash_Init() + * + *******************************************************************************/ + /* Create an array of endpoint structures */ + static cy_stc_ipc_pipe_ep_t systemIpcPipeEpArray[CY_IPC_MAX_ENDPOINTS]; + + Cy_IPC_Pipe_Config(systemIpcPipeEpArray); + + static cy_ipc_pipe_callback_ptr_t systemIpcPipeSysCbArray[CY_SYS_CYPIPE_CLIENT_CNT]; + + static const cy_stc_ipc_pipe_config_t systemIpcPipeConfigCm4 = + { + /* .ep0ConfigData */ + { + /* .ipcNotifierNumber */ CY_IPC_INTR_CYPIPE_EP0, + /* .ipcNotifierPriority */ CY_SYS_INTR_CYPIPE_PRIOR_EP0, + /* .ipcNotifierMuxNumber */ CY_SYS_INTR_CYPIPE_MUX_EP0, + /* .epAddress */ CY_IPC_EP_CYPIPE_CM0_ADDR, + /* .epConfig */ CY_SYS_CYPIPE_CONFIG_EP0 + }, + /* .ep1ConfigData */ + { + /* .ipcNotifierNumber */ CY_IPC_INTR_CYPIPE_EP1, + /* .ipcNotifierPriority */ CY_SYS_INTR_CYPIPE_PRIOR_EP1, + /* .ipcNotifierMuxNumber */ 0u, + /* .epAddress */ CY_IPC_EP_CYPIPE_CM4_ADDR, + /* .epConfig */ CY_SYS_CYPIPE_CONFIG_EP1 + }, + /* .endpointClientsCount */ CY_SYS_CYPIPE_CLIENT_CNT, + /* .endpointsCallbacksArray */ systemIpcPipeSysCbArray, + /* .userPipeIsrHandler */ &Cy_SysIpcPipeIsrCm4 + }; + + if (cy_device->flashPipeRequired != 0u) + { + Cy_IPC_Pipe_Init(&systemIpcPipeConfigCm4); + } + +#if defined(CY_DEVICE_PSOC6ABLE2) + Cy_Flash_Init(); +#endif /* defined(CY_DEVICE_PSOC6ABLE2) */ + +#endif /* !defined(CY_IPC_DEFAULT_CFG_DISABLE) */ +} + + +/******************************************************************************* +* Function Name: Cy_SystemInit +****************************************************************************//** +* +* The function is called during device startup. Once project compiled as part of +* the PSoC Creator project, the Cy_SystemInit() function is generated by the +* PSoC Creator. +* +* The function generated by PSoC Creator performs all of the necessary device +* configuration based on the design settings. This includes settings from the +* Design Wide Resources (DWR) such as Clocks and Pins as well as any component +* configuration that is necessary. +* +*******************************************************************************/ +__WEAK void Cy_SystemInit(void) +{ + /* Empty weak function. The actual implementation to be in the PSoC Creator + * generated strong function. + */ +} + + +/******************************************************************************* +* Function Name: SystemCoreClockUpdate +****************************************************************************//** +* +* Gets core clock frequency and updates \ref SystemCoreClock, \ref +* cy_Hfclk0FreqHz, and \ref cy_PeriClkFreqHz. +* +* Updates global variables used by the \ref Cy_SysLib_Delay(), \ref +* Cy_SysLib_DelayUs(), and \ref Cy_SysLib_DelayCycles(). +* +*******************************************************************************/ +void SystemCoreClockUpdate (void) +{ + uint32_t srcFreqHz; + uint32_t pathFreqHz; + uint32_t fastClkDiv; + uint32_t periClkDiv; + uint32_t rootPath; + uint32_t srcClk; + + /* Get root path clock for the high-frequency clock # 0 */ + rootPath = _FLD2VAL(SRSS_CLK_ROOT_SELECT_ROOT_MUX, SRSS->CLK_ROOT_SELECT[0u]); + + /* Get source of the root path clock */ + srcClk = _FLD2VAL(SRSS_CLK_PATH_SELECT_PATH_MUX, SRSS->CLK_PATH_SELECT[rootPath]); + + /* Get frequency of the source */ + switch (srcClk) + { + case CY_ROOT_PATH_SRC_IMO: + srcFreqHz = CY_CLK_IMO_FREQ_HZ; + break; + + case CY_ROOT_PATH_SRC_EXT: + srcFreqHz = CY_CLK_EXT_FREQ_HZ; + break; + + #if (SRSS_ECO_PRESENT == 1U) + case CY_ROOT_PATH_SRC_ECO: + srcFreqHz = CY_CLK_ECO_FREQ_HZ; + break; + #endif /* (SRSS_ECO_PRESENT == 1U) */ + +#if defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) && (SRSS_ALTHF_PRESENT == 1U) + case CY_ROOT_PATH_SRC_ALTHF: + srcFreqHz = cy_BleEcoClockFreqHz; + break; +#endif /* defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) && (SRSS_ALTHF_PRESENT == 1U) */ + + case CY_ROOT_PATH_SRC_DSI_MUX: + { + uint32_t dsi_src; + dsi_src = _FLD2VAL(SRSS_CLK_DSI_SELECT_DSI_MUX, SRSS->CLK_DSI_SELECT[rootPath]); + switch (dsi_src) + { + case CY_ROOT_PATH_SRC_DSI_MUX_HVILO: + srcFreqHz = CY_CLK_HVILO_FREQ_HZ; + break; + + case CY_ROOT_PATH_SRC_DSI_MUX_WCO: + srcFreqHz = CY_CLK_WCO_FREQ_HZ; + break; + + #if (SRSS_ALTLF_PRESENT == 1U) + case CY_ROOT_PATH_SRC_DSI_MUX_ALTLF: + srcFreqHz = CY_CLK_ALTLF_FREQ_HZ; + break; + #endif /* (SRSS_ALTLF_PRESENT == 1U) */ + + #if (SRSS_PILO_PRESENT == 1U) + case CY_ROOT_PATH_SRC_DSI_MUX_PILO: + srcFreqHz = CY_CLK_PILO_FREQ_HZ; + break; + #endif /* (SRSS_PILO_PRESENT == 1U) */ + + default: + srcFreqHz = CY_CLK_HVILO_FREQ_HZ; + break; + } + } + break; + + default: + srcFreqHz = CY_CLK_EXT_FREQ_HZ; + break; + } + + if (rootPath == 0UL) + { + /* FLL */ + bool fllLocked = ( 0UL != _FLD2VAL(SRSS_CLK_FLL_STATUS_LOCKED, SRSS->CLK_FLL_STATUS)); + bool fllOutputOutput = ( 3UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3)); + bool fllOutputAuto = ((0UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3)) || + (1UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3))); + if ((fllOutputAuto && fllLocked) || fllOutputOutput) + { + uint32_t fllMult; + uint32_t refDiv; + uint32_t outputDiv; + + fllMult = _FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_MULT, SRSS->CLK_FLL_CONFIG); + refDiv = _FLD2VAL(SRSS_CLK_FLL_CONFIG2_FLL_REF_DIV, SRSS->CLK_FLL_CONFIG2); + outputDiv = _FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_OUTPUT_DIV, SRSS->CLK_FLL_CONFIG) + 1UL; + + pathFreqHz = ((srcFreqHz / refDiv) * fllMult) / outputDiv; + } + else + { + pathFreqHz = srcFreqHz; + } + } + else if (rootPath == 1UL) + { + /* PLL */ + bool pllLocked = ( 0UL != _FLD2VAL(SRSS_CLK_PLL_STATUS_LOCKED, SRSS->CLK_PLL_STATUS[0UL])); + bool pllOutputOutput = ( 3UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL])); + bool pllOutputAuto = ((0UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL])) || + (1UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL]))); + if ((pllOutputAuto && pllLocked) || pllOutputOutput) + { + uint32_t feedbackDiv; + uint32_t referenceDiv; + uint32_t outputDiv; + + feedbackDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_FEEDBACK_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + referenceDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_REFERENCE_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + outputDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_OUTPUT_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + + pathFreqHz = ((srcFreqHz * feedbackDiv) / referenceDiv) / outputDiv; + + } + else + { + pathFreqHz = srcFreqHz; + } + } + else + { + /* Direct */ + pathFreqHz = srcFreqHz; + } + + /* Get frequency after hf_clk pre-divider */ + pathFreqHz = pathFreqHz >> _FLD2VAL(SRSS_CLK_ROOT_SELECT_ROOT_DIV, SRSS->CLK_ROOT_SELECT[0u]); + cy_Hfclk0FreqHz = pathFreqHz; + + /* Fast Clock Divider */ + fastClkDiv = 1u + _FLD2VAL(CPUSS_CM4_CLOCK_CTL_FAST_INT_DIV, CPUSS->CM4_CLOCK_CTL); + + /* Peripheral Clock Divider */ + periClkDiv = 1u + _FLD2VAL(CPUSS_CM0_CLOCK_CTL_PERI_INT_DIV, CPUSS->CM0_CLOCK_CTL); + cy_PeriClkFreqHz = pathFreqHz / periClkDiv; + + pathFreqHz = pathFreqHz / fastClkDiv; + SystemCoreClock = pathFreqHz; + + /* Sets clock frequency for Delay API */ + cy_delayFreqHz = SystemCoreClock; + cy_delayFreqMhz = (uint8_t)((cy_delayFreqHz + CY_DELAY_1M_MINUS_1_THRESHOLD) / CY_DELAY_1M_THRESHOLD); + cy_delayFreqKhz = (cy_delayFreqHz + CY_DELAY_1K_MINUS_1_THRESHOLD) / CY_DELAY_1K_THRESHOLD; + cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * cy_delayFreqKhz; +} + + +/******************************************************************************* +* Function Name: Cy_SystemInitFpuEnable +****************************************************************************//** +* +* Enables the FPU if it is used. The function is called from the startup file. +* +*******************************************************************************/ +void Cy_SystemInitFpuEnable(void) +{ + #if defined (__FPU_USED) && (__FPU_USED == 1U) + uint32_t interruptState; + interruptState = Cy_SysLib_EnterCriticalSection(); + SCB->CPACR |= SCB_CPACR_CP10_CP11_ENABLE; + __DSB(); + __ISB(); + Cy_SysLib_ExitCriticalSection(interruptState); + #endif /* (__FPU_USED) && (__FPU_USED == 1U) */ +} + + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) +/******************************************************************************* +* Function Name: Cy_SysIpcPipeIsrCm4 +****************************************************************************//** +* +* This is the interrupt service routine for the system pipe. +* +*******************************************************************************/ +void Cy_SysIpcPipeIsrCm4(void) +{ + Cy_IPC_Pipe_ExecuteCallback(CY_IPC_EP_CYPIPE_CM4_ADDR); +} +#endif + +/******************************************************************************* +* Function Name: Cy_MemorySymbols +****************************************************************************//** +* +* The intention of the function is to declare boundaries of the memories for the +* MDK compilers. For the rest of the supported compilers, this is done using +* linker configuration files. The following symbols used by the cymcuelftool. +* +*******************************************************************************/ +#if defined (__ARMCC_VERSION) +__asm void Cy_MemorySymbols(void) +{ + /* Flash */ + EXPORT __cy_memory_0_start + EXPORT __cy_memory_0_length + EXPORT __cy_memory_0_row_size + + /* Working Flash */ + EXPORT __cy_memory_1_start + EXPORT __cy_memory_1_length + EXPORT __cy_memory_1_row_size + + /* Supervisory Flash */ + EXPORT __cy_memory_2_start + EXPORT __cy_memory_2_length + EXPORT __cy_memory_2_row_size + + /* XIP */ + EXPORT __cy_memory_3_start + EXPORT __cy_memory_3_length + EXPORT __cy_memory_3_row_size + + /* eFuse */ + EXPORT __cy_memory_4_start + EXPORT __cy_memory_4_length + EXPORT __cy_memory_4_row_size + + /* Flash */ +__cy_memory_0_start EQU __cpp(CY_FLASH_BASE) +__cy_memory_0_length EQU __cpp(CY_FLASH_SIZE) +__cy_memory_0_row_size EQU 0x200 + + /* Flash region for EEPROM emulation */ +__cy_memory_1_start EQU __cpp(CY_EM_EEPROM_BASE) +__cy_memory_1_length EQU __cpp(CY_EM_EEPROM_SIZE) +__cy_memory_1_row_size EQU 0x200 + + /* Supervisory Flash */ +__cy_memory_2_start EQU __cpp(CY_SFLASH_BASE) +__cy_memory_2_length EQU __cpp(CY_SFLASH_SIZE) +__cy_memory_2_row_size EQU 0x200 + + /* XIP */ +__cy_memory_3_start EQU __cpp(CY_XIP_BASE) +__cy_memory_3_length EQU __cpp(CY_XIP_SIZE) +__cy_memory_3_row_size EQU 0x200 + + /* eFuse */ +__cy_memory_4_start EQU __cpp(0x90700000) +__cy_memory_4_length EQU __cpp(0x100000) +__cy_memory_4_row_size EQU __cpp(1) +} + +#endif /* defined (__ARMCC_VERSION) */ + + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/transport_ble.c b/2020TPCApp0.cydsn/transport_ble.c new file mode 100644 index 0000000..37e76b7 --- /dev/null +++ b/2020TPCApp0.cydsn/transport_ble.c @@ -0,0 +1,328 @@ +/***************************************************************************//** +* \file transport_ble.c +* \version 3.0 +* +* This file provides the source code of the DFU communication APIs +* for the BLE Component. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "transport_ble.h" + +#if defined(CY_PSOC_CREATOR_USED) +#include "BLE.h" +#else +#include "cy_flash.h" +#include "ble/cy_ble_gap.h" +#include "ble/cy_ble_stack.h" +#endif /* defined(CY_PSOC_CREATOR_USED) */ + +#include "ble/cy_ble_stack_host_error.h" +#include "ble/cy_ble_event_handler.h" +#include "ble/cy_ble_bts.h" + +#if CY_BLE_HOST_CORE + +static uint16_t cyBle_btsDataPacketIndex = 0u; +static uint8_t cyBle_cmdReceivedFlag = 0u; +static uint16_t cyBle_cmdLength = 0u; +static uint8_t *cyBle_btsBuffPtr; + +static uint16_t cyBle_btsDataPacketSize = 0u; +static uint8_t cyBle_btsDataBuffer[CY_FLASH_SIZEOF_ROW + CYBLE_BTS_COMMAND_CONTROL_BYTES_NUM]; + +/* Connection Handle */ +cy_stc_ble_conn_handle_t appConnHandle; + +/******************************************************************************* +* Function Name: CyBLE_CyBtldrCommStart +****************************************************************************//** +* +* Initializes DFU state for BLE communication. +* +*******************************************************************************/ +void CyBLE_CyBtldrCommStart(void) +{ +#if defined(CY_PSOC_CREATOR_USED) + /* Start BLE and register the callback function */ + (void)Cy_BLE_Start(&AppCallBack); + /* Registers a callback function for DFU */ + (void)Cy_BLE_BTS_RegisterAttrCallback(&DFUCallBack); +#endif /* defined(CY_PSOC_CREATOR_USED) */ + cyBle_btsDataPacketIndex = 0u; +} + + +/******************************************************************************* +* Function Name: CyBLE_CyBtldrCommStop +****************************************************************************//** +* +* Disconnects from the peer device and stops BLE component. +* +******************************************************************************/ +void CyBLE_CyBtldrCommStop(void) +{ + cy_stc_ble_gap_disconnect_info_t disconnectInfoParam = + { + .bdHandle = appConnHandle.bdHandle, + .reason = CY_BLE_HCI_ERROR_OTHER_END_TERMINATED_USER + }; + + /* Initiate disconnection from the peer device*/ + if(Cy_BLE_GAP_Disconnect(&disconnectInfoParam) == CY_BLE_SUCCESS) + { + /* Wait for disconnection event */ + while(Cy_BLE_GetConnectionState(appConnHandle) == CY_BLE_CONN_STATE_CONNECTED) + { + /* Process BLE events */ + Cy_BLE_ProcessEvents(); + } + } + /* Stop BLE component. Ignores an error code because current function returns nothing */ + (void) Cy_BLE_Disable(); +} + + +/******************************************************************************* +* Function Name: CyBtldrCommReset +****************************************************************************//** +* +* Resets DFU state for BLE communication. +* +*******************************************************************************/ +void CyBLE_CyBtldrCommReset(void) +{ + cyBle_btsDataPacketIndex = 0u; +} + +/******************************************************************************* +* Function Name: CyBLE_CyBtldrCommWrite +****************************************************************************//** +* +* Requests that the provided size (number of bytes) should be written from the +* input data buffer to the host device. This function in turn invokes the +* CyBle_GattsNotification() API to sent the data. If a notification is +* accepted, the function returns CYRET_SUCCESS. The timeOut parameter is ignored +* in this case. +* +* \param data The pointer to the buffer containing data to be written. +* \param size The number of bytes from the data buffer to write. +* \param count The pointer to where the BLE component will write the number +* of written bytes, generally the same as the size. +* \param timeOut Ignored. Used for consistency. +* +* \return +* The return value is of type \ref cy_en_dfu_status_t: +* - CY_DFU_SUCCESS - Indicates if a notification is successful. +* - CY_DFU_ERROR_UNKNOWN - Failed to send notification to the host. +* +*******************************************************************************/ +cy_en_dfu_status_t CyBLE_CyBtldrCommWrite(const uint8_t pData[], uint32_t size, uint32_t *count, uint32_t timeout) +{ + cy_en_dfu_status_t status = CY_DFU_ERROR_UNKNOWN; + + if (timeout == 0u) + { + /* empty */ + } + + if(Cy_BLE_BTSS_SendNotification(appConnHandle, CY_BLE_BTS_BT_SERVICE, size, (const uint8 *)pData) == CY_BLE_SUCCESS) + { + *count = size; + status = CY_DFU_SUCCESS; + } + else + { + *count = 0u; + } + return (status); +} + +/******************************************************************************* +* Function Name: CyBLE_CyBtldrCommRead +****************************************************************************//** +* +* Requests that the provided size (number of bytes) is read from the host device +* and stored in the provided data buffer. Once the read is done, the "count" is +* endorsed with the number of bytes written. The timeOut parameter is used to +* provide an upper bound on the time that the function is allowed to operate. If +* the read completes early, it should return success code as soon as possible. +* If the read was not successful before the allocated time has expired, it +* should return an error. +* +* \param data The pointer to the buffer to store data from the host controller. +* \param size The number of bytes to read into the data buffer. +* \param count The pointer to where the BLE component will write the number of +* read bytes. +* \param timeout The amount of time (in milliseconds) for which the +* BLE component should wait before indicating communication +* time out. +* +* \return +* The return value is of type \ref cy_en_dfu_status_t: +* - CY_DFU_SUCCESS - A command was successfully read. +* - CY_DFU_ERROR_DATA - The size of the command exceeds the buffer. +* - CY_DFU_ERROR_TIMEOUT - The host controller did not respond during + specified time out. +* \sideeffect +* \ref CyBle_ProcessEvents() is called as a part of this function. +* +*******************************************************************************/ +cy_en_dfu_status_t CyBLE_CyBtldrCommRead(uint8_t pData[], uint32_t size, uint32_t *count, uint32_t timeout) +{ + cy_en_dfu_status_t status = CY_DFU_ERROR_UNKNOWN; + + if ((pData != NULL) && (size > 0u)) + { + status = CY_DFU_ERROR_TIMEOUT; + + while(timeout != 0u) + { + /* Process BLE events */ + Cy_BLE_ProcessEvents(); + + if(cyBle_cmdReceivedFlag == 1u) + { + /* Clear command receive flag */ + cyBle_cmdReceivedFlag = 0u; + + if(cyBle_cmdLength < size) + { + (void) memcpy((void *) pData, (const void *) cyBle_btsBuffPtr, (uint32_t)cyBle_cmdLength); + + /* Return actual received command length */ + *count = cyBle_cmdLength; + + status = CY_DFU_SUCCESS; + } + else + { + pData = NULL; + *count = 0u; + status = CY_DFU_ERROR_DATA; + } + break; + } + /* Wait 1 ms and update timeout counter */ + Cy_SysLib_Delay(1u); + --timeout; + } + + /* Process BLE events */ + Cy_BLE_ProcessEvents(); + } + return (status); +} + +/******************************************************************************* +* Function Name: DFUCallBack +****************************************************************************//** +* +* Handles the events from the BLE stack for the DFU Service. +* +* \param eventCode Event code +* \param eventParam Event parameters +* +*******************************************************************************/ +void DFUCallBack(uint32 event, void* eventParam) +{ + /* To remove incorrect compiler warning */ + (void)eventParam; + + switch ((cy_en_ble_evt_t)event) + { + case CY_BLE_EVT_BTSS_NOTIFICATION_ENABLED: + break; + + case CY_BLE_EVT_BTSS_NOTIFICATION_DISABLED: + break; + + case CY_BLE_EVT_BTSS_EXEC_WRITE_REQ: + /* Check the execWriteFlag before execute or cancel write long operation */ + if(((cy_stc_ble_gatts_exec_write_req_t *)eventParam)->execWriteFlag == CY_BLE_GATT_EXECUTE_WRITE_EXEC_FLAG) + { + cyBle_btsBuffPtr = ((cy_stc_ble_gatts_exec_write_req_t *)eventParam)->baseAddr[0u].handleValuePair.value.val; + + /* Extract length of command data and add control bytes to data + * length to get command length. + */ + cyBle_cmdLength = (((uint16)(((uint16) cyBle_btsBuffPtr[CYBLE_BTS_COMMAND_DATA_LEN_OFFSET + 1u]) << 8u)) | + (uint16) cyBle_btsBuffPtr[CYBLE_BTS_COMMAND_DATA_LEN_OFFSET]) + + CYBLE_BTS_COMMAND_CONTROL_BYTES_NUM; + + if(cyBle_cmdLength > CYBLE_BTS_COMMAND_MAX_LENGTH) + { + cyBle_cmdLength = CYBLE_BTS_COMMAND_MAX_LENGTH; + } + + /* Set flag for DFU to know that command is received from host */ + cyBle_cmdReceivedFlag = 1u; + } + break; + + case CY_BLE_EVT_BTSS_PREP_WRITE_REQ: + if(((cy_stc_ble_gatts_prep_write_req_param_t *)eventParam)->currentPrepWriteReqCount == 1u) + { + /* Send Prepare Write Response which identifies acknowledgement for + * long characteristic value write. + */ + cyBle_cmdLength = 0u; + } + break; + + case CY_BLE_EVT_BTSS_WRITE_CMD_REQ: + { + uint8 *localDataBuffer = ((cy_stc_ble_bts_char_value_t *)eventParam)->value->val; + + /* This is the beginning of the packet, let's read the size now */ + if(cyBle_btsDataPacketIndex == 0u) + { + cyBle_btsDataPacketSize = (((uint16)(((uint16) localDataBuffer[CYBLE_BTS_COMMAND_DATA_LEN_OFFSET + 1u]) << 8u)) | + (uint16) localDataBuffer[CYBLE_BTS_COMMAND_DATA_LEN_OFFSET]) + + CYBLE_BTS_COMMAND_CONTROL_BYTES_NUM; + + } + + (void) memcpy(&cyBle_btsDataBuffer[cyBle_btsDataPacketIndex], localDataBuffer, (uint32_t) ((cy_stc_ble_bts_char_value_t *)eventParam)->value->len); + + cyBle_btsDataPacketIndex += ((cy_stc_ble_bts_char_value_t *)eventParam)->value->len; + + if(cyBle_btsDataPacketIndex == cyBle_btsDataPacketSize) + { + cyBle_btsBuffPtr = &cyBle_btsDataBuffer[0]; + cyBle_cmdLength = cyBle_btsDataPacketSize; + cyBle_cmdReceivedFlag = 1u; + cyBle_btsDataPacketIndex = 0u; + } + break; + } + + case CY_BLE_EVT_BTSS_WRITE_REQ: + cyBle_btsBuffPtr = + CY_BLE_GATT_DB_ATTR_GET_ATTR_GEN_PTR(cy_ble_btsConfigPtr->btss->btServiceInfo[0u].btServiceCharHandle); + + /* Extract length of command data and add control bytes to data + * length to get command length. + */ + cyBle_cmdLength = (((uint16)(((uint16) cyBle_btsBuffPtr[CYBLE_BTS_COMMAND_DATA_LEN_OFFSET + 1u]) << 8u)) | + (uint16) cyBle_btsBuffPtr[CYBLE_BTS_COMMAND_DATA_LEN_OFFSET]) + + CYBLE_BTS_COMMAND_CONTROL_BYTES_NUM; + + /* Set flag for DFU to know that command is received from host */ + cyBle_cmdReceivedFlag = 1u; + break; + + default: + break; + } +} + +#endif /* CY_BLE_HOST_CORE */ + +/* [] END OF FILE */ diff --git a/2020TPCApp0.cydsn/transport_ble.h b/2020TPCApp0.cydsn/transport_ble.h new file mode 100644 index 0000000..d90095c --- /dev/null +++ b/2020TPCApp0.cydsn/transport_ble.h @@ -0,0 +1,55 @@ +/***************************************************************************//** +* \file transport_ble.h +* \version 3.0 +* +* This file provides constants and parameter values of the DFU +* communication APIs for the BLE Component. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#if !defined(TRANSPORT_BLE_H) +#define TRANSPORT_BLE_H + +#include +#include "cy_dfu.h" +#include "ble/cy_ble.h" + +/*************************************** +* Function Prototypes +***************************************/ + +/* BLE DFU physical layer functions */ +void CyBLE_CyBtldrCommStart(void); +void CyBLE_CyBtldrCommStop (void); +void CyBLE_CyBtldrCommReset(void); +cy_en_dfu_status_t CyBLE_CyBtldrCommRead (uint8_t pData[], uint32_t size, uint32_t *count, uint32_t timeout); +cy_en_dfu_status_t CyBLE_CyBtldrCommWrite(const uint8_t pData[], uint32_t size, uint32_t *count, uint32_t timeout); +void DFUCallBack(uint32 event, void* eventParam); + +/* BLE Callback */ +extern void AppCallBack(uint32 event, void* eventParam); + +/*************************************** +* API Constants +***************************************/ +#define CYBLE_BTS_COMMAND_DATA_LEN_OFFSET (2u) +#define CYBLE_BTS_COMMAND_CONTROL_BYTES_NUM (7u) +#define CYBLE_BTS_COMMAND_MAX_LENGTH (265u) + + +/*************************************** +* Global variables declaration +***************************************/ +extern cy_stc_ble_conn_handle_t appConnHandle; + + +#endif /* !defined(TRANSPORT_BLE_H) */ + + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/2020TPCApp1.cydwr b/2020TPCApp1.cydsn/2020TPCApp1.cydwr new file mode 100644 index 0000000..55984a6 --- /dev/null +++ b/2020TPCApp1.cydsn/2020TPCApp1.cydwr @@ -0,0 +1,1242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/2020TPCApp1.cydsn/2020TPCApp1.cyprj b/2020TPCApp1.cydsn/2020TPCApp1.cyprj new file mode 100644 index 0000000..ad3dfe6 --- /dev/null +++ b/2020TPCApp1.cydsn/2020TPCApp1.cyprj @@ -0,0 +1,6435 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/2020TPCApp1.cydsn/2020TPCApp1_datasheet.pdf b/2020TPCApp1.cydsn/2020TPCApp1_datasheet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..20a8d2a0412bdd096c37000e74ab3af04c2abe23 GIT binary patch literal 1481175 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

>%Z4IOOg5rj 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

vowVG8-@%-?Ao|yG^CQ2_Wrg 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

n|D=8PO2CwXjVwZ8asYDh-6R@DADv|Y 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
iS}cQ7AqMJl&L8keQ@UdA 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

Ax%ZjB3= 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 z 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%0AH8vcc5%dR#y68B2Uw#wc7nOPUkWnS$dSKulhr6X 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%0Dnch6Y$^j=`#mYSYkj~d}Ng9 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≫_ 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

ck|nl}3Pf9==^OFz1wDQ^{H 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�!iZ*3HDt6L1BC@3Icr;7pt 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

26X<)?+cK1Wu*JVk*8GcFk?WI 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

=qzFE0rOtno5d(X`|T2z;{~%H10jTO=S_| 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�)sWIR; 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 z

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%0AMVb8Nh?!(m;R4*R=Pa(Zkx@DAGpx*r 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 euX_Lep!x&u$Nzo%%ft!ju1NtoIUNICf&T&sqg literal 0 HcmV?d00001 diff --git a/2020TPCApp1.cydsn/Audio.c b/2020TPCApp1.cydsn/Audio.c new file mode 100644 index 0000000..d8db7ef --- /dev/null +++ b/2020TPCApp1.cydsn/Audio.c @@ -0,0 +1,288 @@ +/* Include Files */ +#include "KTag.h" + +QueueHandle_t xQueueAudio; +TaskHandle_t Audio_Task_Handle; + +static const uint8_t START_BYTE = 0x7E; +static const uint8_t VERSION_BYTE = 0xFF; +static const uint8_t END_BYTE = 0xEF; + +// Valid volumes are 0 - 30. +static const uint8_t COMMAND_SPECIFY_VOLUME = 0x06; +static const uint8_t COMMAND_PAUSE = 0x0E; +static const uint8_t COMMAND_PLAY_TRACK_IN_FOLDER = 0x0F; + +__attribute__((always_inline)) inline uint16_t CalculateChecksum(uint8_t * buffer, uint8_t length) +{ + uint16_t checksum = 0; + + for (uint_fast8_t i = 0; i < length; i++) + { + checksum += buffer[i]; + } + + return (0 - checksum); +} + +static void Send_Command(uint8_t command, bool requireFeedback, uint16_t parameter) +{ + uint8_t buffer[10]; + uint16_t checksum; + + buffer[0] = START_BYTE; + buffer[1] = VERSION_BYTE; + buffer[2] = 6; // count + buffer[3] = command; + buffer[4] = requireFeedback; + buffer[5] = (uint8_t)(parameter >> 8); + buffer[6] = (uint8_t)(parameter); + + checksum = CalculateChecksum(&buffer[1], 6); + + buffer[7] = (uint8_t)(checksum >> 8); + buffer[8] = (uint8_t)(checksum); + buffer[9] = END_BYTE; + + for (uint_fast8_t i = 0; i < 10; i++) + { + UART_Audio_Put(buffer[i]); + } +} + +SystemKResult_T Perform_Audio_Action(AudioAction_T * action) +{ + if (xQueueSend(xQueueAudio, action, 0) == pdTRUE) + { + return SYSTEMK_RESULT_SUCCESS; + } + else + { + return SYSTEMK_RESULT_QUEUE_IS_FULL; + } +} + +void Init_Audio(void) +{ + UART_Audio_Start(); + + xQueueAudio = xQueueCreate(5, sizeof(AudioAction_T)); +} + +void Audio_Task(void * pvParameters) +{ + portBASE_TYPE xStatus; + + while (IsNVMInitialized() == false) + { + vTaskDelay(100 / portTICK_PERIOD_MS); + } + Send_Command(COMMAND_SPECIFY_VOLUME, false, NVM_VOLUME); + + while (true) + { + AudioAction_T action; + + xStatus = xQueueReceive(xQueueAudio, &action, 0); + + if (xStatus == pdPASS) + { + switch (action.ID) + { + case AUDIO_SET_VOLUME: + { + uint8_t volume = *((uint8_t *)action.Data); + if (volume <= 30) + { + Send_Command(COMMAND_SPECIFY_VOLUME, false, volume); + } + } + break; + + case AUDIO_SILENCE: + Send_Command(COMMAND_PAUSE, false, 0x0000); + break; + + case AUDIO_PLAY_STARTUP_SOUND: + // Play track "001" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0101); + break; + + case AUDIO_PLAY_SHOT_FIRED: + // Play track "002" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0102); + break; + + case AUDIO_PLAY_TAG_RECEIVED: + // Play track "003" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0103); + break; + + case AUDIO_PLAY_TAGGED_OUT: + // Play track "004" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0104); + break; + + case AUDIO_PLAY_MISFIRE: + // Play track "005" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0105); + break; + + case AUDIO_PRONOUNCE_NUMBER_0_TO_100: + { + uint8_t file_index = *((uint8_t *)action.Data); + if (file_index > 100) + { + file_index = 100; + } + else if (file_index == 0) + { + file_index = 101; + } + // The numbers are stored in folder "10". + // 001.mp3 is "one", 100.mp3 is "one hundred", and 101.mp3 is "zero". + uint16_t filenumber = 0x0A00 + file_index; + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, filenumber); + } + break; + + case AUDIO_PLAY_MENU_PROMPT: + // Play track "006" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0106); + break; + + case AUDIO_PLAY_SELECTION_INDICATOR: + // Play track "007" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0107); + break; + + case AUDIO_PLAY_HEALTH_REMAINING: + // Play track "008" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0108); + break; + + case AUDIO_PLAY_ELECTRONIC_DANCE_MUSIC: + // Play track "009" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0109); + break; + + default: + case AUDIO_PLAY_GENERIC_ERROR: + // Play track "010" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x010A); + break; + + case AUDIO_PLAY_VOLUME_PROMPT: + // Play track "011" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x010B); + break; + + case AUDIO_PLAY_RIGHT_HANDED: + // Play track "012" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x010C); + break; + + case AUDIO_PLAY_LEFT_HANDED: + // Play track "013" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x010D); + break; + + case AUDIO_PLAY_GAME_ON: + // Play track "014" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x010E); + break; + + case AUDIO_PLAY_HARDWARE_SETTINGS_PROMPT: + // Play track "015" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x010F); + break; + + case AUDIO_PLAY_GAME_SETTINGS_PROMPT: + // Play track "016" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0110); + break; + + case AUDIO_PLAY_BONK: + // Play track "017" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0111); + break; + + case AUDIO_PLAY_NEAR_MISS: + // Play track "018" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0112); + break; + + case AUDIO_PLAY_PLAYER_ID_PROMPT: + // Play track "019" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0113); + break; + + case AUDIO_PLAY_TEAM_ID_PROMPT: + // Play track "020" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0114); + break; + + case AUDIO_PLAY_FRIENDLY_FIRE: + // Play track "021" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0115); + break; + + case AUDIO_PLAY_STARTING_THEME: + // Play track "022" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0116); + break; + + case AUDIO_PLAY_BOOP: + // Play track "023" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0117); + break; + + case AUDIO_PLAY_BEEP: + // Play track "024" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0118); + break; + + case AUDIO_PLAY_REPROGRAMMING: + // Play track "025" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0119); + break; + + case AUDIO_PLAY_BOMB: + // Play track "026" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x011A); + break; + + case AUDIO_PLAY_GAME_OVER: + // Play track "027" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x011B); + break; + } + + if (action.Play_To_Completion == true) + { + do + { + vTaskDelay(100 / portTICK_PERIOD_MS); + } while (Is_Audio_Playing() == true); + + KEvent_T command_received_event = {.ID = KEVENT_AUDIO_COMPLETED, .Data = (void *)action.ID}; + Post_KEvent(&command_received_event); + } + } + + vTaskDelay(100 / portTICK_PERIOD_MS); + } +} + +bool Is_Audio_Playing() +{ + bool result = false; + + // The signal is active low. + if (Cy_GPIO_Read(Pin_Audio_Busy_PORT, Pin_Audio_Busy_NUM) == 0) + { + result = true; + } + + return result; +} diff --git a/2020TPCApp1.cydsn/Audio.h b/2020TPCApp1.cydsn/Audio.h new file mode 100644 index 0000000..d2dda0c --- /dev/null +++ b/2020TPCApp1.cydsn/Audio.h @@ -0,0 +1,7 @@ + +extern QueueHandle_t xQueueAudio; +extern TaskHandle_t Audio_Task_Handle; + +void Init_Audio(void); +void Audio_Task(void * pvParameters); +bool Is_Audio_Playing(); diff --git a/2020TPCApp1.cydsn/COMM/BLE/COMM_BLE.c b/2020TPCApp1.cydsn/COMM/BLE/COMM_BLE.c new file mode 100644 index 0000000..0636c1d --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/BLE/COMM_BLE.c @@ -0,0 +1,1013 @@ +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +#define BLE_TASK_PERIOD_IN_ms 10 + +#ifdef TRACE_BLE + #define TRACE_BLE_STATE_ENTRY(state_name) do {if (State_Changed == true) { COMM_Console_Print_String("[BLE] Entering the ");COMM_Console_Print_String(state_name);COMM_Console_Print_String(" state.\n");}} while (false) +#else // TRACE_BLE + #define TRACE_BLE_STATE_ENTRY(state_name) +#endif // TRACE_BLE + +/* Public Variables */ + +/* Variable used to maintain connection information */ +cy_stc_ble_conn_handle_t appConnHandle[CY_BLE_CONN_COUNT]; + +QueueHandle_t COMM_BLE_CommandQueue; + +TaskHandle_t COMM_BLE_Task_Handle; + +/* Private Variables */ + +static const TickType_t BLE_Task_Delay = BLE_TASK_PERIOD_IN_ms / portTICK_PERIOD_MS; +static COMM_BLE_StateID_T Current_State = COMM_BLE_DEFAULT; +static COMM_BLE_StateID_T Next_State = COMM_BLE_INITIALIZING; +static bool State_Changed = false; +static TickType_t Time_At_State_Entry_In_Ticks; + +//! Immediate Alert Service alert level value. +volatile uint8_t COMM_BLE_IASAlertLevel = 0; + +static cy_stc_ble_gapp_disc_data_t Advertising_Data; +static cy_stc_ble_gapp_scan_rsp_data_t Scan_Response_Data; +static cy_stc_ble_gapp_disc_mode_info_t Advertising_Info = {.advData = &Advertising_Data, .scanRspData = &Scan_Response_Data}; + +/* Private Function Prototypes */ +static void BLE_EventHandler(uint32_t event, void * eventParam); +static void IASEventHandler(uint32 event, void * eventParam); +static cy_en_ble_api_result_t StartNextAdvertisement(); + +/* Inline Functions */ +static inline uint32_t COMM_BLE_GetTimeInState_in_ms() +{ + uint32_t result = (xTaskGetTickCount() - Time_At_State_Entry_In_Ticks) * portTICK_PERIOD_MS; + return result; +} + +/* Public Functions */ + +//! Initializes the Bluetooth Low Energy communications. +void COMM_BLE_Init(void) +{ + COMM_BLE_CommandQueue = xQueueCreate(10, sizeof(COMM_BLE_Command_T)); + + BLE_InitPacketBuffers(); + + COMM_BLE_UART_Init(); + + if (Cy_BLE_Start(BLE_EventHandler) == CY_BLE_SUCCESS) + { + Cy_BLE_IAS_RegisterAttrCallback(IASEventHandler); + } +#ifdef TRACE_BLE + else + { + COMM_Console_Print_String("[BLE] Cy_BLE_Start API Error!\n"); + } +#endif // TRACE_BLE +} + +//! Bluetooth Low Energy communications task: Manages BLE communications, using the PSoC API functions. +/*! + * + */ +void COMM_BLE_Task(void * pvParameters) +{ + COMM_BLE_Command_T command; + + while(true) + { + Cy_BLE_ProcessEvents(); + + if (xQueueReceive(COMM_BLE_CommandQueue, &command, BLE_Task_Delay) == pdPASS) + { + if (Next_State != Current_State) + { + Current_State = Next_State; + Time_At_State_Entry_In_Ticks = xTaskGetTickCount(); + State_Changed = true; + } + else + { + State_Changed = false; + } + + switch (Current_State) + { + default: + case COMM_BLE_DEFAULT: + { + TRACE_BLE_STATE_ENTRY("COMM_BLE_DEFAULT"); + COMM_BLE_RequestState(COMM_BLE_INITIALIZING); + } + break; + + case COMM_BLE_INITIALIZING: + { + TRACE_BLE_STATE_ENTRY("COMM_BLE_INITIALIZING"); + // Wait for the CY_BLE_EVT_STACK_ON event in BLE_EventHandler() to transition to COMM_BLE_IDLE. + } + break; + + case COMM_BLE_IDLE: + { + TRACE_BLE_STATE_ENTRY("COMM_BLE_IDLE"); + + switch (command.ID) + { + case COMM_BLE_SCAN_FOR_KTAG_PACKETS: + COMM_BLE_RequestState(COMM_BLE_SCANNING_FOR_KTAG_PACKETS); + break; + + case COMM_BLE_SCAN_AND_ADVERTISE: + COMM_BLE_RequestState(COMM_BLE_SCANNING_AND_ADVERTISING); + break; + + default: + // All other commands are ignored in this state. + break; + } + } + break; + + case COMM_BLE_SCANNING_FOR_KTAG_PACKETS: + { + TRACE_BLE_STATE_ENTRY("COMM_BLE_SCANNING_FOR_KTAG_PACKETS"); + + if (State_Changed == true) + { + // Handle state entry events. + cy_en_ble_api_result_t apiResult = + Cy_BLE_GAPC_StartScan(CY_BLE_SCANNING_FAST, CY_BLE_OBSERVER_CONFIGURATION_0_INDEX); + + if(apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPC_StartScan API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + } + + switch (command.ID) + { + case COMM_BLE_ADVERTISE_AS_BROADCASTER: + COMM_BLE_RequestState(COMM_BLE_ADVERTISING_AS_BROADCASTER); + break; + + case COMM_BLE_SCAN_AND_ADVERTISE: + COMM_BLE_RequestState(COMM_BLE_SCANNING_AND_ADVERTISING); + break; + + default: + // All other commands are ignored in this state. + break; + } + } + break; + + case COMM_BLE_ADVERTISING_AS_BROADCASTER: + { + TRACE_BLE_STATE_ENTRY("COMM_BLE_ADVERTISING_AS_BROADCASTER"); + + if (State_Changed == true) + { + // Handle state entry events. + cy_en_ble_api_result_t apiResult = + Cy_BLE_GAPP_StartAdvertisement(CY_BLE_ADVERTISING_FAST, CY_BLE_BROADCASTER_CONFIGURATION_0_INDEX); + + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPP_StartAdvertisement API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + } + + switch (command.ID) + { + case COMM_BLE_STOP_ADVERTISING: + { + cy_en_ble_api_result_t apiResult = Cy_BLE_GAPP_StopAdvertisement(); + + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPP_StopAdvertisement API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + COMM_BLE_RequestState(COMM_BLE_SCANNING_FOR_KTAG_PACKETS); + } + break; + + case COMM_BLE_SCAN_AND_ADVERTISE: + COMM_BLE_RequestState(COMM_BLE_SCANNING_AND_ADVERTISING); + break; + + default: + // All other commands are ignored in this state. + break; + } + } + break; + + case COMM_BLE_ADVERTISING_AS_PERIPHERAL: + { + TRACE_BLE_STATE_ENTRY("COMM_BLE_ADVERTISING_AS_PERIPHERAL"); + + if (State_Changed == true) + { + // Handle state entry events. + cy_en_ble_api_result_t apiResult = + Cy_BLE_GAPP_StartAdvertisement(CY_BLE_ADVERTISING_FAST, CY_BLE_PERIPHERAL_CONFIGURATION_0_INDEX); + + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPP_StartAdvertisement API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + } + } + break; + + case COMM_BLE_SCANNING_AND_ADVERTISING: + { + TRACE_BLE_STATE_ENTRY("COMM_BLE_SCANNING_AND_ADVERTISING"); + + if (State_Changed == true) + { + // Handle state entry events. + cy_en_ble_api_result_t apiResult = + Cy_BLE_GAPP_StartAdvertisement(CY_BLE_ADVERTISING_FAST, CY_BLE_BROADCASTER_CONFIGURATION_0_INDEX); + + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPP_StartAdvertisement API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + + apiResult = + Cy_BLE_GAPC_StartScan(CY_BLE_SCANNING_FAST, CY_BLE_OBSERVER_CONFIGURATION_0_INDEX); + + if(apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPC_StartScan API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + } + } + break; + } + COMM_BLE_UART_MaybeSendData(); + +#ifdef CY_DFU_SDK_VERSION_MAJOR + if (COMM_BLE_IASAlertLevel != 0u) + { + // Disconnect from all the connected devices. + for (uint_fast8_t i = 0; i < CY_BLE_CONN_COUNT; i++) + { + if (Cy_BLE_GetConnectionState(appConnHandle[i]) == CY_BLE_CONN_STATE_CONNECTED) + { + cy_stc_ble_gap_disconnect_info_t disconnectInfoParam = + { + .bdHandle = appConnHandle[i].bdHandle, + .reason = CY_BLE_HCI_ERROR_OTHER_END_TERMINATED_USER + }; + + /* Initiate disconnection from the peer device*/ + if (Cy_BLE_GAP_Disconnect(&disconnectInfoParam) == CY_BLE_SUCCESS) + { + /* Wait for disconnection event */ + while (Cy_BLE_GetConnectionState(appConnHandle[i]) == CY_BLE_CONN_STATE_CONNECTED) + { + /* Process BLE events */ + Cy_BLE_ProcessEvents(); + } + } + } + } + + /* Stop BLE component. */ + Cy_BLE_Disable(); + Cy_DFU_ExecuteApp(0u); + } +#endif // CY_DFU_SDK_VERSION_MAJOR + } + } +} + +SystemKResult_T BLE_GetMyAddress(uint8_t * BD_ADDR) +{ + BD_ADDR[0] = cy_ble_deviceAddress.bdAddr[0]; + BD_ADDR[1] = cy_ble_deviceAddress.bdAddr[1]; + BD_ADDR[2] = cy_ble_deviceAddress.bdAddr[2]; + BD_ADDR[3] = cy_ble_deviceAddress.bdAddr[3]; + BD_ADDR[4] = cy_ble_deviceAddress.bdAddr[4]; + BD_ADDR[5] = cy_ble_deviceAddress.bdAddr[5]; + return SYSTEMK_RESULT_SUCCESS; +} + +SystemKResult_T BLE_ScanAndAdvertise(void) +{ + COMM_BLE_Command_T command = { .ID = COMM_BLE_SCAN_AND_ADVERTISE, .Data = (void *)0x00 }; + xQueueSend(COMM_BLE_CommandQueue, &command, 0); + + return SYSTEMK_RESULT_SUCCESS; +} + +void COMM_BLE_RequestState(COMM_BLE_StateID_T state) +{ + Next_State = state; + COMM_BLE_Command_T command = {.ID = COMM_BLE_REQUEST_STATE_CHANGE, .Data = (void *)0x00}; + xQueueSend(COMM_BLE_CommandQueue, &command, 0); +} + +SystemKResult_T BLE_SetAdvertisingData(BLE_AdvertisingData_T * data) +{ + SystemKResult_T result = SYSTEMK_RESULT_SUCCESS; + + if (data->length > BLE_MAX_ADVERTISING_BYTES) + { + result = SYSTEMK_RESULT_TOO_MANY_DATA; + } + else if (data->length < BLE_KTAG_PACKET_TOTAL_SIZE) + { + result = SYSTEMK_RESULT_TOO_FEW_DATA; + } + else + { + Advertising_Data.advDataLen = BLE_KTAG_PACKET_TOTAL_SIZE; + memcpy(Advertising_Data.advData, data, BLE_KTAG_PACKET_TOTAL_SIZE); + + cy_en_ble_api_result_t result = Cy_BLE_GAPP_UpdateAdvScanData(&Advertising_Info); + + if (result != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPP_UpdateAdvScanData Error: 0x"); + COMM_Console_Print_UInt32AsHex(result); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + } + + return result; +} + +/* Private Functions */ + +static void BLE_EventHandler(uint32_t event, void * eventParam) +{ + cy_en_ble_api_result_t apiResult; + + static cy_stc_ble_gap_sec_key_info_t keyInfo = + { + .localKeysFlag = CY_BLE_GAP_SMP_INIT_ENC_KEY_DIST | + CY_BLE_GAP_SMP_INIT_IRK_KEY_DIST | + CY_BLE_GAP_SMP_INIT_CSRK_KEY_DIST, + .exchangeKeysFlag = CY_BLE_GAP_SMP_INIT_ENC_KEY_DIST | + CY_BLE_GAP_SMP_INIT_IRK_KEY_DIST | + CY_BLE_GAP_SMP_INIT_CSRK_KEY_DIST | + CY_BLE_GAP_SMP_RESP_ENC_KEY_DIST | + CY_BLE_GAP_SMP_RESP_IRK_KEY_DIST | + CY_BLE_GAP_SMP_RESP_CSRK_KEY_DIST, + }; + + if (COMM_BLE_UART_HandleEvent(event, eventParam) == false) + { + // For more information, refer to the comments in cy_ble_stack.h, where all + // these events are described in more detail. + switch (event) + { + case CY_BLE_EVT_INVALID: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_INVALID\n"); +#endif // TRACE_BLE + break; + + + // G E N E R I C E V E N T S (0x1000 to 0x1FFF) + case CY_BLE_EVT_STACK_ON: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_STACK_ON\n"); +#endif // TRACE_BLE + COMM_BLE_RequestState(COMM_BLE_IDLE); + break; + + case CY_BLE_EVT_TIMEOUT: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_TIMEOUT: 0x"); + COMM_Console_Print_UInt8AsHex(*(uint8_t *)eventParam); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_STACK_BUSY_STATUS: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_STACK_BUSY_STATUS: 0x"); + COMM_Console_Print_UInt8AsHex(*(uint8_t *)eventParam); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_MEMORY_REQUEST: + case CY_BLE_EVT_PENDING_FLASH_WRITE: + case CY_BLE_EVT_FLASH_CORRUPT: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); + break; +#endif // TRACE_BLE + break; + + + // H O S T C O N T R O L I N T E R F A C E E V E N T S (0x2000 to 0x2FFF) + case CY_BLE_EVT_HARDWARE_ERROR: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_HARDWARE_ERROR: 0x"); + COMM_Console_Print_UInt8AsHex(*(uint8_t *)eventParam); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_WRITE_AUTH_PAYLOAD_TO_COMPLETE: + case CY_BLE_EVT_READ_AUTH_PAYLOAD_TO_COMPLETE: + case CY_BLE_EVT_GET_CHANNEL_MAP_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_LE_SET_EVENT_MASK_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_SET_DEVICE_ADDR_COMPLETE\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_LE_PING_AUTH_TIMEOUT: + case CY_BLE_EVT_SET_DATA_LENGTH_COMPLETE: + case CY_BLE_EVT_SET_SUGGESTED_DATA_LENGTH_COMPLETE: + case CY_BLE_EVT_GET_DATA_LENGTH_COMPLETE: + case CY_BLE_EVT_DATA_LENGTH_CHANGE: + case CY_BLE_EVT_GET_PEER_RPA_COMPLETE: + case CY_BLE_EVT_GET_LOCAL_RPA_COMPLETE: + case CY_BLE_EVT_SET_RPA_TO_COMPLETE: + case CY_BLE_EVT_SET_RPA_ENABLE_COMPLETE: + case CY_BLE_EVT_SET_HOST_CHANNEL_COMPLETE: + case CY_BLE_EVT_ADD_DEVICE_TO_RPA_LIST_COMPLETE: + case CY_BLE_EVT_REMOVE_DEVICE_FROM_RPA_LIST_COMPLETE: + case CY_BLE_EVT_ADD_DEVICE_TO_WHITE_LIST_COMPLETE: + case CY_BLE_EVT_REMOVE_DEVICE_FROM_WHITE_LIST_COMPLETE: + case CY_BLE_EVT_GET_PHY_COMPLETE: + case CY_BLE_EVT_SET_DEFAULT_PHY_COMPLETE: + case CY_BLE_EVT_SET_PHY_COMPLETE: + case CY_BLE_EVT_PHY_UPDATE_COMPLETE: + case CY_BLE_EVT_SET_PRIVACY_MODE_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + + // V E N D O R E V E N T S (0x3000 to 0x3FFF) + case CY_BLE_EVT_LL_CNTRL_PROC_PENDING_COMPLETE: + case CY_BLE_EVT_SOFT_RESET_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_SET_DEVICE_ADDR_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_SET_DEVICE_ADDR_COMPLETE\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GET_DEVICE_ADDR_COMPLETE: + case CY_BLE_EVT_GET_RSSI_COMPLETE: + case CY_BLE_EVT_GET_TX_PWR_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_SET_TX_PWR_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_SET_TX_PWR_COMPLETE\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GET_CLK_CONFIG_COMPLETE: + case CY_BLE_EVT_SET_CLK_CONFIG_COMPLETE: + case CY_BLE_EVT_RANDOM_NUM_GEN_COMPLETE: + case CY_BLE_EVT_AES_ENCRYPT_COMPLETE: + case CY_BLE_EVT_AES_CCM_ENCRYPT_COMPLETE: + case CY_BLE_EVT_AES_CCM_DECRYPT_COMPLETE: + case CY_BLE_EVT_SET_SLAVE_LATENCY_MODE_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_STACK_SHUTDOWN_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_STACK_SHUTDOWN_COMPLETE\n"); +#endif // TRACE_BLE + // If desired, wait until console transmit is complete, then call Cy_SysPm_Hibernate(); + break; + + case CY_BLE_EVT_RADIO_TEMPERATURE: + case CY_BLE_EVT_RADIO_VOLTAGE_LEVEL: + case CY_BLE_EVT_AES_CMAC_GEN_COMPLETE: + case CY_BLE_EVT_SET_EVENT_MASK_COMPLETE: + case CY_BLE_EVT_SET_CE_LENGTH_COMPLETE: + case CY_BLE_EVT_SET_CONN_PRIORITY_COMPLETE: + case CY_BLE_EVT_HCI_PKT_RCVD: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + + // G E N E R I C A C C E S S P R O F I L E E V E N T S (0x4000 to 0x4FFF) + case CY_BLE_EVT_GAPC_SCAN_PROGRESS_RESULT: + { +#if (defined TRACE_BLE) && (defined VERBOSE_BLE_TRACE) + COMM_Console_Print_String("[BLE] ..SCAN_PROGRESS_RESULT "); +#endif // (defined TRACE_BLE) && (defined VERBOSE_BLE_TRACE) + + BLE_Packet_T * packet = BLE_DecodeKTagPacket((*(cy_stc_ble_gapc_adv_report_param_t *)eventParam).data, + (*(cy_stc_ble_gapc_adv_report_param_t *)eventParam).dataLen, + (*(cy_stc_ble_gapc_adv_report_param_t *)eventParam).peerBdAddr, + (*(cy_stc_ble_gapc_adv_report_param_t *)eventParam).rssi); + + if (packet != NULL) + { +#ifdef TRACE_BLE + switch (packet->Generic.type) + { + case BLE_PACKET_TYPE_INSTIGATE_GAME: + COMM_Console_Print_String(" KTag 'Instigate Game' packet found!"); + break; + + case BLE_PACKET_TYPE_JOIN_NOW: + COMM_Console_Print_String(" KTag 'Join Now' packet found!"); + break; + + case BLE_PACKET_TYPE_TAG: + COMM_Console_Print_String(" KTag 'Tag' packet found!"); + break; + + case BLE_PACKET_TYPE_CONSOLE: + COMM_Console_Print_String(" KTag 'Console' packet found!"); + break; + + case BLE_PACKET_TYPE_STATUS: + COMM_Console_Print_String(" KTag 'Status' packet found!"); + break; + + default: + COMM_Console_Print_String(" Unknown KTag packet found!"); + break; + } + + COMM_Console_Print_String(" RSSI: "); + COMM_Console_Print_Int8(packet->Generic.RSSI); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + if (packet->Generic.type == BLE_PACKET_TYPE_CONSOLE) + { + packet->Console.console_data[BLE_KTAG_PACKET_DATA_SIZE - 1] = COMM_CONSOLE_STRING_TERMINATOR; + COMM_Console_Execute_Internal_Command(packet->Console.console_data); + } + else + { + KEvent_T packet_received_event = {.ID = KEVENT_BLE_PACKET_RECEIVED, .Data = packet}; + Post_KEvent(&packet_received_event); + } + } +#if (defined TRACE_BLE) && (defined VERBOSE_BLE_TRACE) + else + { + COMM_Console_Print_String(" Not a KTag packet!\n"); + } +#endif // (defined TRACE_BLE) && (defined VERBOSE_BLE_TRACE) + } + break; + + case CY_BLE_EVT_GAP_AUTH_REQ: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_AUTH_REQ: bdHandle=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).bdHandle); + COMM_Console_Print_String(" security=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).security); + COMM_Console_Print_String(" bonding=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).bonding); + COMM_Console_Print_String(" ekeySize=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).ekeySize); + COMM_Console_Print_String(" authErr=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).authErr); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + + if(cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX].security == + (CY_BLE_GAP_SEC_MODE_1 | CY_BLE_GAP_SEC_LEVEL_1)) + { + cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX].authErr = + CY_BLE_GAP_AUTH_ERROR_PAIRING_NOT_SUPPORTED; + } + + cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX].bdHandle = + ((cy_stc_ble_gap_auth_info_t *)eventParam)->bdHandle; + + /* Pass security information for authentication in reply to an authentication request + * from the master device */ + apiResult = Cy_BLE_GAPP_AuthReqReply(&cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX]); + if(apiResult != CY_BLE_SUCCESS) + { + Cy_BLE_GAP_RemoveOldestDeviceFromBondedList(); + apiResult = Cy_BLE_GAPP_AuthReqReply(&cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX]); + if(apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPP_AuthReqReply API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + } + break; + + case CY_BLE_EVT_GAP_PASSKEY_ENTRY_REQUEST: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_PASSKEY_ENTRY_REQUEST:\n"); + COMM_Console_Print_String(" Please enter the passkey displayed on the peer device.\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAP_PASSKEY_DISPLAY_REQUEST: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_PASSKEY_DISPLAY_REQUEST: "); + COMM_Console_Print_UInt32(*(uint32_t *)eventParam); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAP_AUTH_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_AUTH_COMPLETE: bdHandle=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).bdHandle); + COMM_Console_Print_String(" security=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).security); + COMM_Console_Print_String(" bonding=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).bonding); + COMM_Console_Print_String(" ekeySize=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).ekeySize); + COMM_Console_Print_String(" authErr=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).authErr); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAP_AUTH_FAILED: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_AUTH_FAILED: bdHandle=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).bdHandle); + COMM_Console_Print_String(" authErr=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).authErr); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAPP_ADVERTISEMENT_START_STOP: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAPP_ADVERTISEMENT_START_STOP: state="); + COMM_Console_Print_UInt8(Cy_BLE_GetAdvertisementState()); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + +#if 0 + if (Cy_BLE_GetAdvertisementState() == CY_BLE_ADV_STATE_STOPPED) + { + apiResult = StartNextAdvertisement(); + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPP_StartAdvertisement API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + } +#endif // 0 + break; + + case CY_BLE_EVT_GAP_DEVICE_CONNECTED: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_DEVICE_CONNECTED: connIntv="); + COMM_Console_Print_UInt16(((cy_stc_ble_gap_connected_param_t *)eventParam)->connIntv * 5u /4u); + COMM_Console_Print_String(" ms\n"); +#endif // TRACE_BLE + + /* Set security keys for new device which is not already bonded */ + if(App_IsDeviceInBondList((*(cy_stc_ble_gap_connected_param_t *)eventParam).bdHandle) == 0u) + { + keyInfo.SecKeyParam.bdHandle = (*(cy_stc_ble_gap_connected_param_t *)eventParam).bdHandle; + apiResult = Cy_BLE_GAP_SetSecurityKeys(&keyInfo); + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAP_SetSecurityKeys API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + } + break; + + case CY_BLE_EVT_GAP_DEVICE_DISCONNECTED: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_DEVICE_DISCONNECTED: bdHandle=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_disconnect_param_t *)eventParam).bdHandle); + COMM_Console_Print_String(" reason=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_disconnect_param_t *)eventParam).reason); + COMM_Console_Print_String(" status=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_disconnect_param_t *)eventParam).status); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + + apiResult = StartNextAdvertisement(); + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPP_StartAdvertisement API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + break; + + case CY_BLE_EVT_GAP_ENCRYPT_CHANGE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_ENCRYPT_CHANGE: 0x"); + COMM_Console_Print_UInt8AsHex(*(uint8_t *)eventParam); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAP_CONNECTION_UPDATE_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAPC_SCAN_START_STOP: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAPC_SCAN_START_STOP\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAP_KEYINFO_EXCHNGE_CMPLT: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAP_NUMERIC_COMPARISON_REQUEST: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_NUMERIC_COMPARISON_REQUEST:\n"); + COMM_Console_Print_String(" Compare this passkey with the one displayed in your peer device and press 'y' or 'n':\n"); + COMM_Console_Print_String(" "); + COMM_Console_Print_UInt32(*(uint32_t *)eventParam); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAP_KEYPRESS_NOTIFICATION: + case CY_BLE_EVT_GAP_OOB_GENERATED_NOTIFICATION: + case CY_BLE_EVT_GAP_ENHANCE_CONN_COMPLETE: + case CY_BLE_EVT_GAPC_DIRECT_ADV_REPORT: + case CY_BLE_EVT_GAP_SMP_NEGOTIATED_AUTH_INFO: + case CY_BLE_EVT_GAP_DEVICE_ADDR_GEN_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAP_KEYS_GEN_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_KEYS_GEN_COMPLETE\n"); +#endif // TRACE_BLE + keyInfo.SecKeyParam = (*(cy_stc_ble_gap_sec_key_param_t *)eventParam); + Cy_BLE_GAP_SetIdAddress(&cy_ble_deviceAddress); + break; + + case CY_BLE_EVT_GAP_RESOLVE_DEVICE_COMPLETE: + case CY_BLE_EVT_GAP_GEN_SET_LOCAL_P256_KEYS_COMPLETE: + case CY_BLE_EVT_GAP_CREATE_CONN_CANCEL_COMPLETE: + case CY_BLE_EVT_GAP_CONN_ESTB: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAPP_UPDATE_ADV_SCAN_DATA_COMPLETE: +#if (defined TRACE_BLE) && (defined VERBOSE_BLE_TRACE) + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAPP_UPDATE_ADV_SCAN_DATA_COMPLETE: "); + COMM_Console_Print_UInt8(*(uint8_t *)eventParam); + COMM_Console_Print_String("\n"); +#endif // (defined TRACE_BLE) && (defined VERBOSE_BLE_TRACE) + break; + + case CY_BLE_EVT_GAP_ADV_TX: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_ADV_TX\n"); +#endif // TRACE_BLE + break; + + // G E N E R I C A T T R I B U T E P R O F I L E E V E N T S (0x5000 to 0x5FFF) + case CY_BLE_EVT_GATTC_ERROR_RSP: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GATTC_ERROR_RSP: opCode=0x"); + COMM_Console_Print_UInt8AsHex(((cy_stc_ble_gatt_err_param_t*)eventParam)->errInfo.opCode); + COMM_Console_Print_String(" errorCode=0x"); + COMM_Console_Print_UInt8AsHex(((cy_stc_ble_gatt_err_param_t*)eventParam)->errInfo.errorCode); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GATT_CONNECT_IND: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GATT_CONNECT_IND: bdHandle=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_conn_handle_t *)eventParam).bdHandle); + COMM_Console_Print_String(" attId=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_conn_handle_t *)eventParam).attId); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + { + cy_stc_ble_conn_handle_t connHandle = *(cy_stc_ble_conn_handle_t*)eventParam; + appConnHandle[connHandle.attId] = *(cy_stc_ble_conn_handle_t *)eventParam; + } + break; + + case CY_BLE_EVT_GATT_DISCONNECT_IND: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GATT_DISCONNECT_IND: bdHandle=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_conn_handle_t *)eventParam).bdHandle); + COMM_Console_Print_String(" attId=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_conn_handle_t *)eventParam).attId); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + { + cy_stc_ble_conn_handle_t connHandle = *(cy_stc_ble_conn_handle_t*)eventParam; + appConnHandle[connHandle.attId].attId = connHandle.attId; + appConnHandle[connHandle.attId].bdHandle = CY_BLE_INVALID_CONN_HANDLE_VALUE; + } + break; + + case CY_BLE_EVT_GATTS_XCNHG_MTU_REQ: + { + cy_stc_ble_gatt_xchg_mtu_param_t mtu = + { + .connHandle = ((cy_stc_ble_gatt_xchg_mtu_param_t *)eventParam)->connHandle + }; + Cy_BLE_GATT_GetMtuSize(&mtu); +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GATTS_XCNHG_MTU_REQ: bdHandle=0x"); + COMM_Console_Print_UInt8AsHex(mtu.connHandle.bdHandle); + COMM_Console_Print_String(" attId=0x"); + COMM_Console_Print_UInt8AsHex(mtu.connHandle.bdHandle); + COMM_Console_Print_String(" mtu="); + COMM_Console_Print_UInt16(mtu.mtu); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + break; + + case CY_BLE_EVT_GATTC_XCHNG_MTU_RSP: + case CY_BLE_EVT_GATTC_READ_BY_GROUP_TYPE_RSP: + case CY_BLE_EVT_GATTC_READ_BY_TYPE_RSP: + case CY_BLE_EVT_GATTC_FIND_INFO_RSP: + case CY_BLE_EVT_GATTC_FIND_BY_TYPE_VALUE_RSP: + case CY_BLE_EVT_GATTC_READ_RSP: + case CY_BLE_EVT_GATTC_READ_BLOB_RSP: + case CY_BLE_EVT_GATTC_READ_MULTI_RSP: + case CY_BLE_EVT_GATTS_WRITE_REQ: + case CY_BLE_EVT_GATTC_WRITE_RSP: + case CY_BLE_EVT_GATTS_WRITE_CMD_REQ: + case CY_BLE_EVT_GATTS_PREP_WRITE_REQ: + case CY_BLE_EVT_GATTS_EXEC_WRITE_REQ: + case CY_BLE_EVT_GATTC_EXEC_WRITE_RSP: + case CY_BLE_EVT_GATTC_HANDLE_VALUE_NTF: + case CY_BLE_EVT_GATTC_HANDLE_VALUE_IND: + case CY_BLE_EVT_GATTS_HANDLE_VALUE_CNF: + case CY_BLE_EVT_GATTS_DATA_SIGNED_CMD_REQ: + case CY_BLE_EVT_GATTC_STOP_CMD_COMPLETE: + case CY_BLE_EVT_GATTS_READ_CHAR_VAL_ACCESS_REQ: + case CY_BLE_EVT_GATTC_LONG_PROCEDURE_END: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + default: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt32AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + } + } +} + +/******************************************************************************* +* Function Name: IasEventHandler +******************************************************************************** +* +* Summary: +* This is an event callback function to receive events from the BLE Component, +* which are specific to Immediate Alert Service. +* +* Parameters: +* event: Write Command event from the BLE component. +* eventParams: A structure instance of CY_BLE_GATT_HANDLE_VALUE_PAIR_T type. +* +*******************************************************************************/ +static void IASEventHandler(uint32 event, void * eventParam) +{ + (void) eventParam; + uint8_t alert; + + /* Alert Level Characteristic write event */ + if (event == CY_BLE_EVT_IASS_WRITE_CHAR_CMD) + { + /* Read the updated Alert Level value from the GATT database */ + Cy_BLE_IASS_GetCharacteristicValue(CY_BLE_IAS_ALERT_LEVEL, sizeof(alert), &alert); + COMM_BLE_IASAlertLevel = alert; + } +} + +static cy_en_ble_api_result_t StartNextAdvertisement() +{ + static uint8_t Current_Advertising_Index = CY_BLE_PERIPHERAL_CONFIGURATION_0_INDEX; + cy_en_ble_api_result_t apiResult; + + apiResult = Cy_BLE_GAPP_StartAdvertisement(CY_BLE_ADVERTISING_FAST, Current_Advertising_Index); + + if(apiResult == CY_BLE_SUCCESS) + { + if (Current_Advertising_Index == CY_BLE_PERIPHERAL_CONFIGURATION_0_INDEX) + { + Current_Advertising_Index = CY_BLE_BROADCASTER_CONFIGURATION_0_INDEX; + COMM_Console_Print_String("CY_BLE_BROADCASTER_CONFIGURATION_0_INDEX\n"); + } + else + { + Current_Advertising_Index = CY_BLE_PERIPHERAL_CONFIGURATION_0_INDEX; + COMM_Console_Print_String("CY_BLE_PERIPHERAL_CONFIGURATION_0_INDEX\n"); + } + } + + return apiResult; +} diff --git a/2020TPCApp1.cydsn/COMM/BLE/COMM_BLE.h b/2020TPCApp1.cydsn/COMM/BLE/COMM_BLE.h new file mode 100644 index 0000000..83701e6 --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/BLE/COMM_BLE.h @@ -0,0 +1,79 @@ +/** \dir "BLE" + * + * \brief This directory contains source code for managing Bluetooth Low Energy communications. + * + */ + +/** \file + * \brief This file defines the interface to the Bluetooth Low Energy communications used by this software. + * + */ + +#ifndef COMM_BLE_H +#define COMM_BLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +// Define this to print out BLE trace statements to the console. +//#define TRACE_BLE +//#define VERBOSE_BLE_TRACE + +#define COMM_BLE_TASK_STACK_SIZE_in_bytes 4096 + +typedef enum +{ + COMM_BLE_DEFAULT, + COMM_BLE_INITIALIZING, + COMM_BLE_IDLE, + COMM_BLE_SCANNING_FOR_KTAG_PACKETS, + COMM_BLE_ADVERTISING_AS_PERIPHERAL, + COMM_BLE_ADVERTISING_AS_BROADCASTER, + COMM_BLE_SCANNING_AND_ADVERTISING +} COMM_BLE_StateID_T; + +typedef enum +{ + COMM_BLE_COMMAND_NO_OP, + COMM_BLE_REQUEST_STATE_CHANGE, + COMM_BLE_PROCESS_BLE_EVENTS, + COMM_BLE_SCAN_FOR_KTAG_PACKETS, + COMM_BLE_ADVERTISE_AS_BROADCASTER, + COMM_BLE_ADVERTISE_AS_PERIPHERAL, + COMM_BLE_STOP_ADVERTISING, + COMM_BLE_SCAN_AND_ADVERTISE, + // COMM_BLE_COMMAND_IS_OUT_OF_RANGE is one more than the last valid command. + COMM_BLE_COMMAND_IS_OUT_OF_RANGE +} COMM_BLE_Command_ID_T; + +typedef struct +{ + COMM_BLE_Command_ID_T ID; + void * Data; +} COMM_BLE_Command_T; + +/* Include Files */ + +/* Public Variables */ + +extern cy_stc_ble_conn_handle_t appConnHandle[CY_BLE_CONN_COUNT]; +extern volatile uint8_t COMM_BLE_IASAlertLevel; + +extern QueueHandle_t COMM_BLE_CommandQueue; + +//! Handle of the COMM_BLE_Task() given when the task was created. +extern TaskHandle_t COMM_BLE_Task_Handle; + +/* Public Functions */ +void COMM_BLE_Init(void); +void COMM_BLE_Task(void * pvParameters); +void COMM_BLE_RequestState(COMM_BLE_StateID_T state); + +#ifdef __cplusplus +} +#endif + +#endif // COMM_BLE_H diff --git a/2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_Bond.c b/2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_Bond.c new file mode 100644 index 0000000..ece43a5 --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_Bond.c @@ -0,0 +1,252 @@ +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +/* Public Variables */ + +/* Private Variables */ + +static bool removeBondListFlag = false; + +/* Private Function Prototypes */ + +/* Public Functions */ + +/******************************************************************************* +* Function Name: App_DisplayBondList() +******************************************************************************** +* +* Summary: +* This function displays the bond list. +* +*******************************************************************************/ +void App_DisplayBondList(void) +{ +#ifdef TRACE_BLE + cy_en_ble_api_result_t apiResult; + cy_stc_ble_gap_peer_addr_info_t bondedDeviceInfo[CY_BLE_MAX_BONDED_DEVICES]; + cy_stc_ble_gap_bonded_device_list_info_t bondedDeviceList = + { + .bdHandleAddrList = bondedDeviceInfo + }; + uint8_t deviceCount; + + /* Find out whether the device has bonded information stored already or not */ + apiResult = Cy_BLE_GAP_GetBondList(&bondedDeviceList); + if (apiResult != CY_BLE_SUCCESS) + { + COMM_Console_Print_String("[BLE] Cy_BLE_GAP_GetBondList API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); + } + else + { + deviceCount = bondedDeviceList.noOfDevices; + + if(deviceCount != 0u) + { + uint8_t counter; + + COMM_Console_Print_String("[BLE] Bond list:\n"); + + do + { + COMM_Console_Print_String(" "); + COMM_Console_Print_UInt8(deviceCount); + COMM_Console_Print_String(". "); + + deviceCount--; + + if(bondedDeviceList.bdHandleAddrList[deviceCount].bdAddr.type == CY_BLE_GAP_ADDR_TYPE_RANDOM) + { + COMM_Console_Print_String("Peer Random Address:"); + } + else + { + COMM_Console_Print_String("Peer Public Address:"); + } + + for (counter = CY_BLE_GAP_BD_ADDR_SIZE; counter > 0u; counter--) + { + COMM_Console_Print_String(" "); + COMM_Console_Print_UInt8AsHex(bondedDeviceList.bdHandleAddrList[deviceCount].bdAddr.bdAddr[counter - 1u]); + } + COMM_Console_Print_String(", bdHandle: 0x"); + COMM_Console_Print_UInt8AsHex(bondedDeviceList.bdHandleAddrList[deviceCount].bdHandle); + COMM_Console_Print_String("\n"); + } while (deviceCount != 0u); + COMM_Console_Print_String("\n"); + } + } +#endif // TRACE_BLE +} + + +/******************************************************************************* +* Function Name: App_RemoveDevidesFromBondList +******************************************************************************** +* +* Summary: +* Remove devices from the bond list. +* +*******************************************************************************/ +void App_RemoveDevicesFromBondList(void) +{ +#if(CY_BLE_BONDING_REQUIREMENT == CY_BLE_BONDING_YES) + cy_en_ble_api_result_t apiResult; + cy_stc_ble_gap_bd_addr_t peerBdAddr = { .type = 0u }; +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cleaning Bond List...\n\n"); +#endif // TRACE_BLE + + /* Remove all bonded devices in the list */ + apiResult = Cy_BLE_GAP_RemoveBondedDevice(&peerBdAddr); + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAP_RemoveBondedDevice API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + else + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAP_RemoveBondedDevice complete.\n\n"); +#endif // TRACE_BLE + } +#else +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Bonding is disabled...no need to remove bonded devices.\n\n"); +#endif // TRACE_BLE +#endif /* (CY_BLE_BONDING_REQUIREMENT == CY_BLE_BONDING_YES) */ + + /* Clean flag */ + removeBondListFlag = false; +} + + +/******************************************************************************* +* Function Name: App_GetCountOfBondedDevices() +******************************************************************************** +* +* Summary: +* This function returns the count of bonded devices +* +* Return: +* uint32_t The count of bonded devices +* +*******************************************************************************/ +uint32_t App_GetCountOfBondedDevices(void) +{ + cy_en_ble_api_result_t apiResult; + cy_stc_ble_gap_peer_addr_info_t bondedDeviceInfo[CY_BLE_MAX_BONDED_DEVICES]; + cy_stc_ble_gap_bonded_device_list_info_t bondedDeviceList = + { + .bdHandleAddrList = bondedDeviceInfo + }; + uint32_t deviceCount = 0u; + + /* Find out whether the device has bonded information stored already or not */ + apiResult = Cy_BLE_GAP_GetBondList(&bondedDeviceList); + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAP_GetBondList API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + else + { + deviceCount = bondedDeviceList.noOfDevices; + } + + return (deviceCount); +} + + +/******************************************************************************* +* Function Name: App_IsDeviceInBondList() +******************************************************************************** +* +* Summary: +* This function check if device with bdHandle is in the bond list +* +* Parameters: +* bdHandle - bond device handler +* +* Return: +* bool - true value when bdHandle exists in bond list +* +*******************************************************************************/ +bool App_IsDeviceInBondList(uint32_t bdHandle) +{ + cy_en_ble_api_result_t apiResult; + cy_stc_ble_gap_peer_addr_info_t bondedDeviceInfo[CY_BLE_MAX_BONDED_DEVICES]; + cy_stc_ble_gap_bonded_device_list_info_t bondedDeviceList = + { + .bdHandleAddrList = bondedDeviceInfo + }; + bool deviceIsDetected = false; + uint32_t deviceCount; + + /* Find out whether the device has bonding information stored already or not */ + apiResult = Cy_BLE_GAP_GetBondList(&bondedDeviceList); + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAP_GetBondList API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + else + { + deviceCount = bondedDeviceList.noOfDevices; + + if(deviceCount != 0u) + { + do + { + deviceCount--; + if(bdHandle == bondedDeviceList.bdHandleAddrList[deviceCount].bdHandle) + { + deviceIsDetected = 1u; + } + } while(deviceCount != 0u); + } + } + return(deviceIsDetected); +} + +/******************************************************************************* +* Function Name: App_SetRemoveBondListFlag() +******************************************************************************** +* Summary: +* Set flag for removing bond list +* +*******************************************************************************/ +void App_SetRemoveBondListFlag(void) +{ + removeBondListFlag = true; +} + +/******************************************************************************* +* Function Name: App_IsRemoveBondListFlag() +******************************************************************************** +* Summary: +* Get value of remove bond list flag +* +* Return: +* true - remove bond list flag is set +* false - remove bond list flag is clear +* +*******************************************************************************/ +bool App_IsRemoveBondListFlag(void) +{ + return ((removeBondListFlag == true) ? true : false); +} + +/* Private Functions */ diff --git a/2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_Bond.h b/2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_Bond.h new file mode 100644 index 0000000..ef5f43b --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_Bond.h @@ -0,0 +1,32 @@ +/** \file + * \brief This file declares Bluetooth Low Energy bond list helper functions. + * + */ + +#ifndef COMM_BLE_BOND_H +#define COMM_BLE_BOND_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +/* Include Files */ + +/* Public Variables */ + +/* Public Functions */ +void App_DisplayBondList(void); +void App_RemoveDevicesFromBondListBySW2Press(uint32_t seconds); +void App_RemoveDevicesFromBondList(void); +void App_SetRemoveBondListFlag(void); +bool App_IsRemoveBondListFlag(void); +bool App_IsDeviceInBondList(uint32_t bdHandle); +uint32_t App_GetCountOfBondedDevices(void); + +#ifdef __cplusplus +} +#endif + +#endif // COMM_BLE_BOND_H diff --git a/2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_UART.c b/2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_UART.c new file mode 100644 index 0000000..a50ed0f --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_UART.c @@ -0,0 +1,177 @@ +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +#define UART_CIRCULAR_BUFFER_SIZE 1024 +#define BLE_UART_BUFFER_CHARACTERISTIC_SIZE 20 + +/* Public Variables */ + +/* Private Variables */ + +static uint_fast16_t UART_Tx_Notifications_Enabled = 0; + +static uint8_t UART_Tx_Buffer_Storage[UART_CIRCULAR_BUFFER_SIZE]; +static UTIL_CircularBuffer_T UART_Tx_Buffer; +static uint8_t BLE_UART_Tx_Buffer[BLE_UART_BUFFER_CHARACTERISTIC_SIZE]; +static uint8_t Rx_Buffer[BLE_UART_BUFFER_CHARACTERISTIC_SIZE + 1]; + +/* Private Function Prototypes */ + +/* Public Functions */ + +void COMM_BLE_UART_Init(void) +{ + UTIL_InitCircularBuffer(&UART_Tx_Buffer, UART_Tx_Buffer_Storage, UART_CIRCULAR_BUFFER_SIZE); +} + +//! Sends a message over the BLE UART. +void COMM_BLE_UART_PutString(const char8 * string, uint16_t length) +{ + for (uint8_t i = 0; i < length; i++) + { + (void) UTIL_PushToCircularBuffer(&UART_Tx_Buffer, *string++); + } +} + +//! Sends a single character over the BLE UART. +void COMM_BLE_UART_PutChar(char8 character) +{ + (void) UTIL_PushToCircularBuffer(&UART_Tx_Buffer, character); +} + +void COMM_BLE_UART_MaybeSendData(void) +{ + int8_t length = 0; + + if (UTIL_IsCircularBufferEmpty(&UART_Tx_Buffer) == false) + { + while ((length < BLE_UART_BUFFER_CHARACTERISTIC_SIZE) && (UTIL_IsCircularBufferEmpty(&UART_Tx_Buffer) == false)) + { + uint8_t value; + if (UTIL_PopFromCircularBuffer(&UART_Tx_Buffer, &value) == UTIL_CIRCULARBUFFERRESULT_SUCCESS) + { + BLE_UART_Tx_Buffer[length] = value; + length++; + } + } + } + + if (length > 0) + { + for (uint_fast8_t i = 0; i < CY_BLE_CONN_COUNT; i++) + { + if (Cy_BLE_GetConnectionState(appConnHandle[i]) >= CY_BLE_CONN_STATE_CONNECTED) + { + cy_stc_ble_gatt_handle_value_pair_t tempHandle; + + tempHandle.attrHandle = CY_BLE_NORDIC_UART_SERVICE_TX_CHAR_HANDLE; + tempHandle.value.val = (uint8 *) BLE_UART_Tx_Buffer; + tempHandle.value.actualLen = length; + tempHandle.value.len = length; + + Cy_BLE_GATTS_WriteAttributeValueLocal(&tempHandle); + } + } + + // Send notification to each client that has TX notifications enabled. + for (uint_fast8_t i = 0; i < CY_BLE_CONN_COUNT; i++) + { + if ((Cy_BLE_GetConnectionState(appConnHandle[i]) >= CY_BLE_CONN_STATE_CONNECTED) && + Cy_BLE_GATTS_IsNotificationEnabled(&appConnHandle[i], + CY_BLE_NORDIC_UART_SERVICE_TX_TXCCCD_DESC_HANDLE)) + { + cy_stc_ble_gatt_handle_value_pair_t tempHandle; + + tempHandle.attrHandle = CY_BLE_NORDIC_UART_SERVICE_TX_CHAR_HANDLE; + tempHandle.value.val = (uint8 *) BLE_UART_Tx_Buffer; + tempHandle.value.actualLen = length; + tempHandle.value.len = length; + + Cy_BLE_GATTS_SendNotification(&appConnHandle[i], &tempHandle); + } + } + } +} + +//! BLE event handler for the BLE UART feature. +/*! + * This function should be called *before* events are handled in the event handler passed to + * Cy_BLE_Start(). If it returns `false`, then the rest of the event handler should proceed. + * + * \param event BLE stack event code received from the BLE middleware (one of cy_en_ble_event_t). + * \param eventParam pointer to an event-specific data structure containing the relevant event information. + * \return true if this handler has completely handled the event, and no further + * handling is necessary; false otherwise. + */ +bool COMM_BLE_UART_HandleEvent(uint32 event, void * eventParam) +{ + static cy_stc_ble_gatts_write_cmd_req_param_t * writeReqParameter; + bool handled = false; + + /* Take an action based on the current event */ + switch ((cy_en_ble_event_t)event) + { + // Handle a write request. + case CY_BLE_EVT_GATTS_WRITE_REQ: + + writeReqParameter = (cy_stc_ble_gatts_write_cmd_req_param_t*)eventParam; + + // Request to write the UART. + // https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v15.2.0%2Fble_sdk_app_nus_eval.html&cp=5_5_0_4_1_2_24 + if (writeReqParameter->handleValPair.attrHandle == CY_BLE_NORDIC_UART_SERVICE_RX_CHAR_HANDLE) + { + // Only update the value and write the response if the requested write is allowed. + if (CY_BLE_GATT_ERR_NONE == Cy_BLE_GATTS_WriteAttributeValuePeer(&writeReqParameter->connHandle, &writeReqParameter->handleValPair)) + { + uint16_t i; + + for (i = 0; (i < BLE_UART_BUFFER_CHARACTERISTIC_SIZE) && (i < writeReqParameter->handleValPair.value.len); i++) + { + Rx_Buffer[i] = writeReqParameter->handleValPair.value.val[i]; + } + + // NULL-terminate the buffer. + Rx_Buffer[i] = 0x00; + + Cy_BLE_GATTS_WriteRsp(writeReqParameter->connHandle); + + COMM_Console_Execute_Internal_Command(Rx_Buffer); + } + + handled = true; + } + + // Request for UART Tx notifications. + if (writeReqParameter->handleValPair.attrHandle == CY_BLE_NORDIC_UART_SERVICE_TX_TXCCCD_DESC_HANDLE) + { + if (CY_BLE_GATT_ERR_NONE == Cy_BLE_GATTS_WriteAttributeValuePeer(&writeReqParameter->connHandle, &writeReqParameter->handleValPair)) + { + UART_Tx_Notifications_Enabled = writeReqParameter->handleValPair.value.val[0] & 0x01; + + if (UART_Tx_Notifications_Enabled) + { + COMM_Console_Print_String("[BLE] UART Tx notifications enabled.\n"); + } + else + { + COMM_Console_Print_String("[BLE] UART Tx notifications disabled.\n"); + } + + Cy_BLE_GATTS_WriteRsp(writeReqParameter->connHandle); + } + + handled = true; + } + break; + + default: + // (`handled` is already set to false.) + break; + } + + return handled; +} + +/* Private Functions */ diff --git a/2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_UART.h b/2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_UART.h new file mode 100644 index 0000000..b0f924e --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/BLE/COMM_BLE_UART.h @@ -0,0 +1,30 @@ +/** \file + * \brief This file declares interface functions to a BLE UART implementation. + * + */ + +#ifndef COMM_BLE_UART_H +#define COMM_BLE_UART_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +/* Include Files */ + +/* Public Variables */ + +/* Public Functions */ +void COMM_BLE_UART_Init(void); +void COMM_BLE_UART_PutString(const char8 * string, uint16_t length); +void COMM_BLE_UART_PutChar(char8 character); +void COMM_BLE_UART_MaybeSendData(void); +bool COMM_BLE_UART_HandleEvent(uint32 event, void * eventParam); + +#ifdef __cplusplus +} +#endif + +#endif // COMM_BLE_UART_H \ No newline at end of file diff --git a/2020TPCApp1.cydsn/COMM/COMM.h b/2020TPCApp1.cydsn/COMM/COMM.h new file mode 100644 index 0000000..269a3bf --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/COMM.h @@ -0,0 +1,50 @@ +/** \dir "COMM" + * + * \brief This directory contains source code for the communication interfaces used by this software. + * + */ + +/** \file + * \brief This file defines the interface to the communications used by this software. + * + * This file should be included by any file outside the COMM package wishing to make use + * of any of the configuration information provided by the COMM package. + * + */ + +#ifndef COMM_H +#define COMM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Include Files */ +#include "COMM_IPC_Messages.h" +#include "BLE/COMM_BLE.h" +#include "BLE/COMM_BLE_Bond.h" +#include "BLE/COMM_BLE_UART.h" +#include "COMM_Console.h" +#include "COMM_Console_Util.h" +#include "COMM_I2C_Bus.h" +#include "COMM_Util.h" +#include "ConsoleCommands/COMM_ConsoleCommands.h" +#include "ConsoleCommands/COMM_BLE_ConsoleCommands.h" +#include "ConsoleCommands/COMM_NVM_ConsoleCommands.h" +#include "ConsoleCommands/COMM_RTOS_ConsoleCommands.h" +#include "ConsoleCommands/COMM_STATE_ConsoleCommands.h" + +/* Preprocessor and Type Definitions */ + +#define DebugPrintf(...) +#define Task_DebugPrintf(...) + +/* Public Variables */ + +/* Public Functions */ + +#ifdef __cplusplus +} +#endif + +#endif // COMM_H diff --git a/2020TPCApp1.cydsn/COMM/COMM_Console.c b/2020TPCApp1.cydsn/COMM/COMM_Console.c new file mode 100644 index 0000000..1d612b3 --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/COMM_Console.c @@ -0,0 +1,639 @@ +/** \file + * \brief This file implements a simple serial debug console and command interpreter. + */ + +/** \defgroup CONSOLE Console + * + * \brief Serial debug console command interpreter. + * + * \todo Describe the command interpreter. + * + * @{ + * @} + */ + +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +//! Text representations of numeric digits, used by COMM_Console_Print_UInt32(). +static const char8 DIGITS[] = "0123456789ABCDEF"; + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +//! Maximum number of characters (save one) able to be printed by COMM_Console_Print_String(). +#define MAX_CONSOLE_STRING_LENGTH 81 + +//! States in the COMM_Console_Task() state machine. +typedef enum +{ + COMM_STATE_INITIALIZING = 0, + COMM_STATE_DISPLAY_POWERUP_INFO, + COMM_STATE_IDLE, + COMM_STATE_COMMAND_TOO_LONG, + COMM_STATE_IDENTIFY_COMMAND, + COMM_STATE_EXECUTE_COMMAND, + COMM_STATE_UNKNOWN_COMMAND +} COMM_Console_State_T; + +/* Public Variables */ +char8 Command_Buffer[COMM_CONSOLE_COMMAND_MAX_LENGTH]; +uint_fast16_t Command_Buffer_Index = 0; +TaskHandle_t COMM_Console_Task_Handle; + +/* Private Variables */ + +//! Current state of the COMM_Console_Task() state machine. +static COMM_Console_State_T Current_State = COMM_STATE_INITIALIZING; + +//! Next state of the COMM_Console_Task() state machine. +static COMM_Console_State_T Next_State = COMM_STATE_INITIALIZING; + +//! Index into the #COMM_Console_Command_Table for the command currently being handled. +/*! + * If #Current_Command is set to UINT_FAST16_MAX, the command being handled is unknown, or no command is being handled. + */ +static uint_fast16_t Current_Command = 0; + +/* Private Function Prototypes */ + +static void ConsoleISR(void); +static bool ConsoleCommandMatches(const char8 * const command_name); +static void ReverseString(char8 * value, uint32_t length); + +/* Inline Functions */ + +//! Swaps the characters in x and y. +static inline void Swap_Char8(char8 * x, char8 * y) +{ + uint8_t temp = *x; + *x = *y; + *y = temp; + } + +static inline void Reset_Command_Buffer() +{ + taskENTER_CRITICAL(); + for (uint_fast16_t i = 0; i < COMM_CONSOLE_COMMAND_MAX_LENGTH; i++) + { + Command_Buffer[i] = COMM_CONSOLE_STRING_TERMINATOR; + } + Command_Buffer_Index = 0; + taskEXIT_CRITICAL(); +} + +/* Public Functions */ + +//! Initializes the console. +/*! + * \ingroup CONSOLE + */ +void COMM_Console_Init(void) +{ + // Enable the pullup on the Rx pin to keep the noise down. + Cy_GPIO_SetDrivemode(UART_Console_rx_PORT, UART_Console_rx_NUM, CY_GPIO_DM_PULLUP); + UART_Console_Start(); + + /// Unmask only the RX FIFO not empty interrupt bit. + UART_Console_HW->INTR_RX_MASK = SCB_INTR_RX_MASK_NOT_EMPTY_Msk; + Cy_SysInt_Init(&Int_UART_Console_cfg, ConsoleISR); + NVIC_ClearPendingIRQ(Int_UART_Console_cfg.intrSrc); + NVIC_EnableIRQ(Int_UART_Console_cfg.intrSrc); +} + +//! Parses and handle console commands in the background. +/*! + * \ingroup CONSOLE + * + * The [UML State Machine Diagram](http://www.uml-diagrams.org/state-machine-diagrams.html) below + * shows how the console messages processed by this code. Note that all of the *Character Rx'd* + * transitions occur in the #UART_Console_SPI_UART_ISR_EntryCallback() itself on the PSoC4, in + * #ConsoleRxISR() on the PSoC5, and in #ConsoleISR() on the PSoC6, to improve overall performance. + * + * \startuml{COMM_Console_Task.png} "Console Task" + * + * skinparam headerFontSize 18 + * skinparam state { + * BackgroundColor #eeeeee + * BackgroundColor<> #ffaaaa + * FontName Impact + * FontSize 18 + * } + * skinparam note { + * FontName "Comic Sans MS" + * FontStyle italic + * } + * + * state "Initializing" as STATE_INITIALIZING + * [*] --> STATE_INITIALIZING + * note left of STATE_INITIALIZING : Wait for the rest of the system to come online. + * state "Display Powerup Info" as STATE_DISPLAY_POWERUP_INFO + * STATE_DISPLAY_POWERUP_INFO : do/ print OS version + * STATE_DISPLAY_POWERUP_INFO : do/ print configuration (debug or release) + * STATE_INITIALIZING --> STATE_DISPLAY_POWERUP_INFO : after(100ms) + * state "Idle" as STATE_IDLE + * STATE_IDLE : do/ RTOS_Sleep() + * STATE_DISPLAY_POWERUP_INFO --> STATE_IDLE + * state STATE_IS_EOM <> + * note top of STATE_IS_EOM : This happens in\nUART_Console_SPI_UART_ISR_ExitCallback() on PSoC4,\nConsoleRxISR() on PSoC5,\nand ConsoleISR() on PSoC6. + * STATE_IDLE --> STATE_IS_EOM : character rx'd + * state STATE_IS_COMMAND_BUFFER_FULL <> + * note top of STATE_IS_COMMAND_BUFFER_FULL : This happens in\nUART_Console_SPI_UART_ISR_ExitCallback() on PSoC4,\nConsoleRxISR() on PSoC5,\nand ConsoleISR() on PSoC6. + * STATE_IS_EOM --> STATE_IS_COMMAND_BUFFER_FULL : [else] + * state "Identify Command" as STATE_IDENTIFY_COMMAND + * STATE_IDENTIFY_COMMAND : do/ look for command in the COMM_Console_Command_Table[] + * STATE_IS_EOM --> STATE_IDENTIFY_COMMAND : [rx'd character is EOM] + * STATE_IDLE --> STATE_IDENTIFY_COMMAND : COMM_Console_Execute_Internal_Command() + * state "Command Too Long" as STATE_COMMAND_TOO_LONG + * STATE_COMMAND_TOO_LONG : do/ print error message + * STATE_COMMAND_TOO_LONG : do/ reset command buffer + * STATE_IS_COMMAND_BUFFER_FULL --> STATE_COMMAND_TOO_LONG : [command buffer is full] + * STATE_IS_COMMAND_BUFFER_FULL --> STATE_IDLE : [else]/\nAppend received character to command buffer + * STATE_COMMAND_TOO_LONG --> STATE_IDLE + * state "Execute Command" as STATE_EXECUTE_COMMAND + * STATE_EXECUTE_COMMAND : do/ execute console command + * STATE_EXECUTE_COMMAND : exit/ reset command buffer + * STATE_EXECUTE_COMMAND --> STATE_IDLE + * STATE_IDENTIFY_COMMAND --> STATE_EXECUTE_COMMAND : [command matched] + * state "Unknown Command" as STATE_UNKNOWN_COMMAND + * STATE_UNKNOWN_COMMAND : do/ print error message + * STATE_UNKNOWN_COMMAND : do/ reset command buffer + * STATE_IDENTIFY_COMMAND --> STATE_UNKNOWN_COMMAND : [else] + * STATE_UNKNOWN_COMMAND --> STATE_IDLE + * + * left footer Key: UML 2.5\nLast modified 2020-12-14 + * \enduml + * + * \return None (infinite loop) + */ +void COMM_Console_Task(void * pvParameters) +{ + static TickType_t xTicksToWait = pdMS_TO_TICKS(10); + static uint32_t * NotificationValue; + + while(true) + { + (void) xTaskNotifyWait(0, 0, (uint32_t *)&NotificationValue, xTicksToWait); + + // Change to the next state atomically. + taskENTER_CRITICAL(); + Current_State = Next_State; + taskEXIT_CRITICAL(); + + switch (Current_State) + { + default: + case COMM_STATE_INITIALIZING: + Next_State = COMM_STATE_DISPLAY_POWERUP_INFO; + vTaskDelay(pdMS_TO_TICKS(10)); + xTicksToWait = 1; + break; + + case COMM_STATE_DISPLAY_POWERUP_INFO: + COMM_Console_Print_String("[COMM] "); + COMM_RTOS_HandleConsoleVersion(NULL, 0); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String("[COMM] Console ready (awaiting commands).\n"); + Next_State = COMM_STATE_IDLE; + xTicksToWait = 1; + break; + + case COMM_STATE_IDLE: + xTicksToWait = pdMS_TO_TICKS(100); + break; + + case COMM_STATE_COMMAND_TOO_LONG: + COMM_Console_Print_String("[COMM] ERROR: Command \""); + COMM_Console_Print_String(Command_Buffer); + COMM_Console_Print_String("\" too long!\n"); + Reset_Command_Buffer(); + Next_State = COMM_STATE_IDLE; + xTicksToWait = 1; + break; + + case COMM_STATE_IDENTIFY_COMMAND: + Current_Command = UINT_FAST16_MAX; + + for (uint_fast16_t i = 0; i < COMM_N_CONSOLE_COMMANDS; i++) + { + if (ConsoleCommandMatches(COMM_Console_Command_Table[i].Command_Name) == true) + { + Current_Command = i; + Next_State = COMM_STATE_EXECUTE_COMMAND; + xTicksToWait = 1; + break; + } + } + + if (Current_Command == UINT_FAST16_MAX) + { + // No matching command was found. + Next_State = COMM_STATE_UNKNOWN_COMMAND; + xTicksToWait = 1; + } + break; + + case COMM_STATE_EXECUTE_COMMAND: + if (COMM_Console_Command_Table[Current_Command].Execute_Command != NULL) + { + COMM_Console_Command_Result_T result = COMM_Console_Command_Table[Current_Command].Execute_Command(Command_Buffer, Command_Buffer_Index); + + if (result == COMM_CONSOLE_CMD_RESULT_PARAMETER_ERROR) + { + COMM_Console_Print_String("ERROR: Parameter error!\n"); + } + } + Reset_Command_Buffer(); + Next_State = COMM_STATE_IDLE; + xTicksToWait = 1; + break; + + case COMM_STATE_UNKNOWN_COMMAND: + COMM_Console_Print_String("ERROR: Command \""); + COMM_Console_Print_String(Command_Buffer); + COMM_Console_Print_String("\" not recognized! Try '?' for help.\n"); + Reset_Command_Buffer(); + Next_State = COMM_STATE_IDLE; + xTicksToWait = 1; + break; + } + } +} + +SystemKResult_T HW_Execute_Console_Command(const uint8_t * const command) +{ + COMM_Console_Execute_Internal_Command(command); + + return SYSTEMK_RESULT_SUCCESS; +} + +//! Executes a (potentially cross-task) console command. +/*! + * This function is used to initiate a console command from a software source internal to this + * CPU. This provides a way to use preexisting console commands on TX-only consoles. + * + * \note If two calls to this function are made back-to-back (before the COMM_Console_Task() has an + * opportunity to run), only the second command will be executed, as it will have overwritten the + * first. Allow time for the console commands to execute between calls to this function. + * + * \param command String containing the command to be executed. + */ +void COMM_Console_Execute_Internal_Command(const uint8_t * const command) +{ + bool finished = false; + uint_fast16_t i = 0; + + taskENTER_CRITICAL(); + while ( (finished == false) && + (i < COMM_CONSOLE_COMMAND_MAX_LENGTH) && + (command[i] != COMM_CONSOLE_END_OF_MESSAGE ) && + (command[i] != COMM_CONSOLE_STRING_TERMINATOR ) + ) + { + Command_Buffer[i] = command[i]; + i++; + } + Command_Buffer_Index = i; + + // If there is still room, terminate the command. + if (i < COMM_CONSOLE_COMMAND_MAX_LENGTH) + { + Command_Buffer[i] = COMM_CONSOLE_END_OF_MESSAGE; + } + taskEXIT_CRITICAL(); + + Next_State = COMM_STATE_IDENTIFY_COMMAND; + xTaskNotifyGive(COMM_Console_Task_Handle); +} + +//! Prints a NULL-terminated string to the serial console. +void COMM_Console_Print_String(const char8 * const text) +{ + for (size_t i = 0; i < MAX_CONSOLE_STRING_LENGTH; i++) + { + // Check for the end of the string. If there is no NULL terminator, up to + // MAX_CONSOLE_STRING_LENGTH characters of randomness will be printed. + if (text[i] == COMM_CONSOLE_STRING_TERMINATOR) + { + break; + } + + // Send out the string, one character at a time. + COMM_Console_PutChar(text[i]); + } +} + +//! Prints a 32-bit unsigned integer to the serial console. +void COMM_Console_Print_UInt32(uint32_t value) +{ + // The largest string for a unit32_t is 10 characters (4294967296). + char8 buffer[10+1]; + uint_fast8_t buffer_index = 0; + + while (value > 9) + { + uint8_t digit_index = value % 10; + buffer[buffer_index] = DIGITS[digit_index]; + value = value / 10; + buffer_index++; + } + buffer[buffer_index] = DIGITS[value]; + buffer_index++; + ReverseString(buffer, buffer_index); + + // NULL-terminate the string. + buffer[buffer_index] = 0; + + COMM_Console_Print_String(buffer); +} + +//! Prints a 32-bit signed integer to the serial console. +void COMM_Console_Print_SInt32(int32_t value) +{ + if (value < 0) + { + value *= -1; + COMM_Console_PutChar('-'); + } + + COMM_Console_Print_UInt32(value); +} + +//! Prints a 32-bit unsigned integer to the serial console using a hexadecimal representation. +void COMM_Console_Print_UInt32AsHex(uint32_t value) +{ + // The largest hexadecimal string for a unit32_t is 8 characters (FFFFFFFF). + char8 buffer[8+1]; + uint_fast8_t buffer_index = 0; + + while (value > 15) + { + uint8_t digit_index = value % 16; + buffer[buffer_index] = DIGITS[digit_index]; + value = value / 16; + buffer_index++; + } + buffer[buffer_index] = DIGITS[value]; + buffer_index++; + ReverseString(buffer, buffer_index); + + // NULL-terminate the string. + buffer[buffer_index] = 0; + + COMM_Console_PutChar('0'); + COMM_Console_PutChar('x'); + COMM_Console_Print_String(buffer); +} + +//! Prints a 64-bit unsigned integer to the serial console. +void COMM_Console_Print_UInt64(uint64_t value) +{ + // The largest string for a unit64_t is 20 characters (18446744073709551615). + char8 buffer[20+1]; + uint_fast8_t buffer_index = 0; + + while (value > 9) + { + uint8_t digit_index = value % 10; + buffer[buffer_index] = DIGITS[digit_index]; + value = value / 10; + buffer_index++; + } + buffer[buffer_index] = DIGITS[value]; + buffer_index++; + ReverseString(buffer, buffer_index); + + // NULL-terminate the string. + buffer[buffer_index] = 0; + + COMM_Console_Print_String(buffer); +} + +//! Prints a 64-bit unsigned integer to the serial console using a hexadecimal representation. +void COMM_Console_Print_UInt64AsHex(uint64_t value) +{ + // The largest hexadecimal string for a unit64_t is 16 characters (FFFFFFFFFFFFFFFF). + char8 buffer[16+1]; + uint_fast8_t buffer_index = 0; + + while (value > 15) + { + uint8_t digit_index = value % 16; + buffer[buffer_index] = DIGITS[digit_index]; + value = value / 16; + buffer_index++; + } + buffer[buffer_index] = DIGITS[value]; + buffer_index++; + ReverseString(buffer, buffer_index); + + // NULL-terminate the string. + buffer[buffer_index] = 0; + + COMM_Console_PutChar('0'); + COMM_Console_PutChar('x'); + COMM_Console_Print_String(buffer); +} + +//! Prints a floating-point number to the serial console. +/*! + * With thanks to Rick Regan and his [Quick and Dirty Floating-Point to Decimal Conversion](https://www.exploringbinary.com/quick-and-dirty-floating-point-to-decimal-conversion/). + */ +void COMM_Console_Print_Float(float value) +{ + #define MAX_INTEGRAL_DIGITS 12 + #define MAX_FRACTIONAL_DIGITS 6 + #define BUFFER_SIZE (MAX_INTEGRAL_DIGITS + MAX_FRACTIONAL_DIGITS + 2) + + char8 buffer[BUFFER_SIZE]; + char8 integral_buffer_reversed[MAX_INTEGRAL_DIGITS]; + uint16_t buffer_index = 0; + double integral_value; + double fractional_value; + bool overflow = false; + + if (value < 0.0) + { + COMM_Console_Print_String("-"); + value *= -1.0; + } + + // Break the given value into fractional and integral parts. + fractional_value = modf(value, &integral_value); + + if (integral_value > 0) + { + // Convert the integral part. + while ((integral_value > 0) && (buffer_index < MAX_INTEGRAL_DIGITS)) + { + integral_buffer_reversed[buffer_index++] = '0' + (int)fmod(integral_value, 10); + integral_value = floor(integral_value / 10); + } + + // If there is still an integral part remaining, and overflow has occurred. + if (integral_value > 0) + { + overflow = true; + } + + // Reverse and append the integral part. + for (uint16_t i = 0; i < buffer_index; i++) + { + buffer[i] = integral_buffer_reversed[buffer_index-i-1]; + } + } + else + { + // Append a leading zero. + buffer[buffer_index++] = '0'; + } + + // Append the decimal point. + buffer[buffer_index++] = '.'; + + // Convert the fractional part, even if it is zero, and leave room for the NULL terminator. + while (buffer_index < (BUFFER_SIZE - 1)) + { + fractional_value *= 10; + buffer[buffer_index++] = '0' + (int)fractional_value; + fractional_value = modf(fractional_value, &integral_value); + } + + // Append the NULL terminator. + buffer[buffer_index] = 0; + + if (overflow == true) + { + COMM_Console_Print_String("OVERFLOW"); + } + else + { + COMM_Console_Print_String(buffer); + } +} + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +//! Converts a byte to a two-character hexadecimal representation. +/*! + * \param buffer Buffer into which to place the resulting sting. It needs to be at least three + * characters wide. + * \param byte The byte to be converted. + */ +void COMM_Console_ByteToHex(char8 * buffer, uint8_t byte) +{ + if (byte < 16) + { + buffer[0] = '0'; + buffer[1] = DIGITS[byte]; + buffer[2] = 0; + } + else + { + buffer[0] = DIGITS[byte / 16]; + buffer[1] = DIGITS[byte % 16]; + buffer[2] = 0; + } +} + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Private Functions */ + +static void ConsoleISR(void) +{ + portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + // Check for the "Rx FIFO not empty" interrput. + if ((UART_Console_HW->INTR_RX_MASKED & SCB_INTR_RX_MASKED_NOT_EMPTY_Msk ) != 0) + { + // Clear the "Rx FIFO not empty" interrput. + UART_Console_HW->INTR_RX = UART_Console_HW->INTR_RX & SCB_INTR_RX_NOT_EMPTY_Msk; + + // Get the character. + uint32_t value = UART_Console_Get(); + + // Check if there is actually data. Sometimes the flag is set when there is no data (why?). + if (value != CY_SCB_UART_RX_NO_DATA) + { + char8 rx_data = (char8) value; + + // Determine what to do with it. + if (Command_Buffer_Index < COMM_CONSOLE_COMMAND_MAX_LENGTH) + { + if (rx_data == COMM_CONSOLE_END_OF_MESSAGE) + { + Command_Buffer[Command_Buffer_Index] = COMM_CONSOLE_STRING_TERMINATOR; + Next_State = COMM_STATE_IDENTIFY_COMMAND; + vTaskNotifyGiveFromISR(COMM_Console_Task_Handle, &xHigherPriorityTaskWoken); + } + else + { + Command_Buffer[Command_Buffer_Index] = rx_data; + Command_Buffer_Index++; + } + } + else + { + Next_State = COMM_STATE_COMMAND_TOO_LONG; + vTaskNotifyGiveFromISR(COMM_Console_Task_Handle, &xHigherPriorityTaskWoken); + } + } + } + + NVIC_ClearPendingIRQ(Int_UART_Console_cfg.intrSrc); + + // If the state needs to change, a context switch might be required. + portEND_SWITCHING_ISR(xHigherPriorityTaskWoken); +} + +static bool ConsoleCommandMatches(const char8 * const command_name) +{ + uint32_t i = 0; + bool is_match = false; + + if (Command_Buffer[i] == command_name[i]) + { + is_match = true; + i++; + } + + while ( (is_match == true) && + (i < COMM_CONSOLE_COMMAND_MAX_LENGTH) && + (Command_Buffer[i] != COMM_CONSOLE_PARAMETER_DELIMITER) && + (Command_Buffer[i] != COMM_CONSOLE_END_OF_MESSAGE ) && + (Command_Buffer[i] != COMM_CONSOLE_STRING_TERMINATOR ) + ) + { + if ( Command_Buffer[i] != command_name[i] ) + { + is_match = false; + } + i++; + } + + return is_match; +} + +//! Reverses a string in place. +/*! + * \param value Pointer to the string to be reversed. + * \param length Length of the string, including the NULL terminator. + */ +static void ReverseString(char8 * value, uint32_t length) +{ + if (length > 1) + { + uint_fast32_t start = 0; + uint_fast32_t end = length - 1; + while (start < end) + { + Swap_Char8(value + start, value + end); + start++; + end--; + } + } +} + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) diff --git a/2020TPCApp1.cydsn/COMM/COMM_Console.h b/2020TPCApp1.cydsn/COMM/COMM_Console.h new file mode 100644 index 0000000..916cb6c --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/COMM_Console.h @@ -0,0 +1,144 @@ +/** \file + * \brief This file defines the interface to a simple serial debug console and command interpreter. + * + * \note As always, and should be included before this file. + */ + +#ifndef COMM_CONSOLE_H +#define COMM_CONSOLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +#define COMM_CONSOLE_TASK_STACK_SIZE_in_bytes 512 + +#define COMM_Console_PutChar UART_and_BLE_PutChar +#define COMM_Console_PutString UART_and_BLE_PutString + +#define COMM_CONSOLE_COMMAND_MAX_LENGTH 50 + +//! Character signifying the end of a console message. +#define COMM_CONSOLE_END_OF_MESSAGE ('\n') + +//! Character used between parameters in a console message. +#define COMM_CONSOLE_PARAMETER_DELIMITER (' ') + +//! Character signifying the end of a string. +#define COMM_CONSOLE_STRING_TERMINATOR ('\0') + +//! Result of executing a console command callback. +typedef enum +{ + COMM_CONSOLE_CMD_RESULT_UNKNOWN = 0, + COMM_CONSOLE_CMD_RESULT_SUCCESS = 1, + COMM_CONSOLE_CMD_RESULT_PARAMETER_ERROR = 2 +} COMM_Console_Command_Result_T; + +//! Result of parsing a console command parameter. +typedef enum +{ + COMM_CONSOLE_PARAMETER_RESULT_UNKNOWN = 0, + COMM_CONSOLE_PARAMETER_RESULT_SUCCESS = 1, + COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR = 2, + COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END = 3 +} COMM_Console_Parameter_Result_T; + +//! Prototype of a console command callback. +/*! + * \ingroup CONSOLE + * All console commands must use this signature. + * + * \param[in] data Pointer to the string containg the console command (and any arguments). + * \param[in] size Size (in char8) of the data string. + * \return #COMM_CONSOLE_CMD_RESULT_SUCCESS on success + * \return #COMM_Console_Command_Result_T otherwise + */ +typedef COMM_Console_Command_Result_T (* const COMM_Console_Command_Handler_T)(char8 * data, uint32_t size); + +typedef struct +{ + const char8 * const Command_Name; + const char8 * const Help; + COMM_Console_Command_Handler_T Execute_Command; +} COMM_Console_Command_Table_Entry_T; + +/* Public Variables */ + +//! Handle of the COMM_Console_Task() given when the task was created. +extern TaskHandle_t COMM_Console_Task_Handle; + +/* Public Functions */ + +void COMM_Console_Init(void); +void COMM_Console_Task(void * pvParameters); +void COMM_Console_Execute_Internal_Command(const uint8_t * const command); +void COMM_Console_Print_String(const char8 * const text); +void COMM_Console_Print_UInt32(uint32_t value); +void COMM_Console_Print_SInt32(int32_t value); +void COMM_Console_Print_UInt32AsHex(uint32_t value); +void COMM_Console_Print_UInt64(uint64_t value); +void COMM_Console_Print_UInt64AsHex(uint64_t value); +void COMM_Console_Print_Float(float value); + +void COMM_Console_ByteToHex(char8 * buffer, uint8_t byte); + +/* Inline Functions */ + +//! Prints an 8-bit unsigned integer to the serial console. +inline void COMM_Console_Print_UInt8(uint8_t value) +{ + COMM_Console_Print_UInt32((uint32_t) value); +} + +//! Prints an 8-bit unsigned integer to the serial console using a hexadecimal representation. +inline void COMM_Console_Print_UInt8AsHex(uint8_t value) +{ + COMM_Console_Print_UInt32AsHex((uint32_t) value); +} + +//! Prints an 8-bit signed integer to the serial console. +inline void COMM_Console_Print_Int8(int8_t value) +{ + COMM_Console_Print_SInt32((int32_t) value); +} + +//! Prints a 16-bit unsigned integer to the serial console. +inline void COMM_Console_Print_UInt16(uint16_t value) +{ + COMM_Console_Print_UInt32((uint32_t) value); +} + +//! Prints a 16-bit unsigned integer to the serial console using a hexadecimal representation. +inline void COMM_Console_Print_UInt16AsHex(uint16_t value) +{ + COMM_Console_Print_UInt32AsHex((uint32_t) value); +} + +//! Prints a 16-bit signed integer to the serial console. +inline void COMM_Console_Print_Int16(int16_t value) +{ + COMM_Console_Print_SInt32((int32_t) value); +} + +static inline void UART_and_BLE_PutChar(uint8 txDataByte) +{ + UART_Console_Put(txDataByte); + COMM_BLE_UART_PutChar(txDataByte); +} + +static inline void UART_and_BLE_PutString(const char8 string[]) +{ + UART_Console_PutString(string); + COMM_BLE_UART_PutString(string, strlen(string)); +} + +#ifdef __cplusplus +} +#endif + +#endif // COMM_CONSOLE_H diff --git a/2020TPCApp1.cydsn/COMM/COMM_Console_Util.c b/2020TPCApp1.cydsn/COMM/COMM_Console_Util.c new file mode 100644 index 0000000..0a68b17 --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/COMM_Console_Util.c @@ -0,0 +1,254 @@ +/** \file + * \brief This file implements utility functions used by the command interpreter. + */ + +/** + * \ingroup CONSOLE + */ + +/* Include Files */ +#include "KTag.h" + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Local Definitions and Constants */ + +/* Public Variables */ + +/* Private Variables */ + +/* Private Function Prototypes */ + +/* Public Functions */ + +//! Find the start location of the nth parameter in the buffer. +/*! + * \note The command itself is parameter 0. + */ +COMM_Console_Parameter_Result_T COMM_Console_FindNthParameter(const char * const buffer, const uint8_t parameterNumber, const char ** parameterLocation) +{ + uint32_t buffer_index = 0; + uint32_t parameter_index = 0; + COMM_Console_Parameter_Result_T result = COMM_CONSOLE_PARAMETER_RESULT_SUCCESS; + + while (parameterNumber != parameter_index) + { + if (buffer[buffer_index] == COMM_CONSOLE_PARAMETER_DELIMITER) + { + parameter_index++; + } + else if (buffer[buffer_index] == COMM_CONSOLE_END_OF_MESSAGE) + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + break; + } + else if (buffer[buffer_index] == COMM_CONSOLE_STRING_TERMINATOR) + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + break; + } + buffer_index++; + } + + if (result == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + *parameterLocation = &buffer[buffer_index]; + } + + return result; +} + + +COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterUInt8(const char * const buffer, uint8_t * const parameterUInt8) +{ + uint8_t value = 0; + COMM_Console_Parameter_Result_T result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + + // Strings containing uint8s range from "0" to "255". The large number has three characters. + uint_fast16_t MAX_CHARACTERS = 3; + uint_fast16_t index = 0; + + while (index < (MAX_CHARACTERS + 1)) + { + if ((buffer[index] >= '0') && (buffer[index] <= '9')) + { + value *= 10; + value += buffer[index] - '0'; + index++; + } + else if ( (buffer[index] == COMM_CONSOLE_PARAMETER_DELIMITER) || + (buffer[index] == COMM_CONSOLE_STRING_TERMINATOR) || + (buffer[index] == COMM_CONSOLE_END_OF_MESSAGE) ) + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END; + break; + } + else + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + break; + } + } + + if (result == COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END) + { + result = COMM_CONSOLE_PARAMETER_RESULT_SUCCESS; + *parameterUInt8 = value; + } + + return result; +} + + +COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterUInt16(const char * const buffer, uint16_t * const parameterUInt16) +{ + uint16_t value = 0; + COMM_Console_Parameter_Result_T result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + + // Strings containing uint16s range from "0" to "65535". The large number has five characters. + uint_fast16_t MAX_CHARACTERS = 5; + uint_fast16_t index = 0; + + while (index < (MAX_CHARACTERS + 1)) + { + if ((buffer[index] >= '0') && (buffer[index] <= '9')) + { + value *= 10; + value += buffer[index] - '0'; + index++; + } + else if ( (buffer[index] == COMM_CONSOLE_PARAMETER_DELIMITER) || + (buffer[index] == COMM_CONSOLE_STRING_TERMINATOR) || + (buffer[index] == COMM_CONSOLE_END_OF_MESSAGE) ) + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END; + break; + } + else + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + break; + } + } + + if (result == COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END) + { + result = COMM_CONSOLE_PARAMETER_RESULT_SUCCESS; + *parameterUInt16 = value; + } + + return result; +} + +COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterInt32(const char * const buffer, int32_t * const parameterInt32) +{ + int32_t value = 0; + COMM_Console_Parameter_Result_T result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + bool is_negative = false; + + // Strings containing int32s range from "-2147483648" to "2147483647". The negative number has eleven characters. + uint_fast16_t MAX_CHARACTERS = 11; + uint_fast16_t index = 0; + + if (buffer[index] == '-') + { + is_negative = true; + index++; + } + + while (index < (MAX_CHARACTERS + 1)) + { + if ((buffer[index] >= '0') && (buffer[index] <= '9')) + { + value *= 10; + value += buffer[index] - '0'; + index++; + } + else if ( (buffer[index] == COMM_CONSOLE_PARAMETER_DELIMITER) || + (buffer[index] == COMM_CONSOLE_STRING_TERMINATOR) || + (buffer[index] == COMM_CONSOLE_END_OF_MESSAGE) ) + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END; + break; + } + else + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + break; + } + } + + if (is_negative == true) + { + value *= -1; + } + + if (result == COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END) + { + result = COMM_CONSOLE_PARAMETER_RESULT_SUCCESS; + *parameterInt32 = value; + } + + return result; +} + +COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterUInt32(const char * const buffer, uint32_t * const parameterUInt32) +{ + uint32_t value = 0; + COMM_Console_Parameter_Result_T result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + + // Strings containing uint32s range from "0" to "4294967296". The large number has ten characters. + uint_fast16_t MAX_CHARACTERS = 10; + uint_fast16_t index = 0; + + while (index < (MAX_CHARACTERS + 1)) + { + if ((buffer[index] >= '0') && (buffer[index] <= '9')) + { + value *= 10; + value += buffer[index] - '0'; + index++; + } + else if ( (buffer[index] == COMM_CONSOLE_PARAMETER_DELIMITER) || + (buffer[index] == COMM_CONSOLE_STRING_TERMINATOR) || + (buffer[index] == COMM_CONSOLE_END_OF_MESSAGE) ) + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END; + break; + } + else + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + break; + } + } + + if (result == COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END) + { + result = COMM_CONSOLE_PARAMETER_RESULT_SUCCESS; + *parameterUInt32 = value; + } + + return result; +} + +COMM_Console_Parameter_Result_T COMM_Console_DecodeHexParameterUInt64(const char * const buffer, uint64_t * const parameterUInt64) +{ + COMM_Console_Parameter_Result_T result = COMM_CONSOLE_PARAMETER_RESULT_SUCCESS; + struct _reent context; + + context._errno = 0; + + *parameterUInt64 = _strtoull_r(&context, buffer, NULL, 16); + + if (context._errno != 0) + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + } + + return result; +} + +/* Private Functions */ + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) diff --git a/2020TPCApp1.cydsn/COMM/COMM_Console_Util.h b/2020TPCApp1.cydsn/COMM/COMM_Console_Util.h new file mode 100644 index 0000000..7fccbaf --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/COMM_Console_Util.h @@ -0,0 +1,50 @@ +/** \file + * \brief Utility functions used by the command interpreter. + * + * \note As always, and should be included before this file. + */ + +#ifndef COMM_CONSOLE_UTIL_H +#define COMM_CONSOLE_UTIL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +/* Public Variables */ + +/* Public Functions */ +COMM_Console_Parameter_Result_T COMM_Console_FindNthParameter(const char * const buffer, const uint8_t parameterNumber, const char ** parameterLocation); +COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterUInt8(const char * const buffer, uint8_t * const parameterUInt8); +COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterUInt16(const char * const buffer, uint16_t * const parameterUInt16); +COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterInt32(const char * const buffer, int32_t * const parameterInt32); +COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterUInt32(const char * const buffer, uint32_t * const parameterUInt32); +COMM_Console_Parameter_Result_T COMM_Console_DecodeHexParameterUInt64(const char * const buffer, uint64_t * const parameterUInt64); + +//! Returns `true` if this character marks the end of a console message; `false` otherwise. +inline bool COMM_Console_IsEndOfMessage(char8 character) +{ + bool result = false; + + if ( (character == COMM_CONSOLE_END_OF_MESSAGE) || + (character == COMM_CONSOLE_STRING_TERMINATOR) ) + { + result = true; + } + + return result; +} + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +#ifdef __cplusplus +} +#endif + +#endif // COMM_CONSOLE_UTIL_H diff --git a/2020TPCApp1.cydsn/COMM/COMM_I2C_Bus.c b/2020TPCApp1.cydsn/COMM/COMM_I2C_Bus.c new file mode 100644 index 0000000..7fe82f6 --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/COMM_I2C_Bus.c @@ -0,0 +1,33 @@ +/** \file + * \brief This file implements the I²C bus. + * + * See COMM_I2C_Bus.h for a detailed description of the functionality implemented by this code. + */ + +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +/* Public Variables */ + +SemaphoreHandle_t COMM_I2C_Bus_Mutex = NULL; + +/* Private Variables */ + +/* Private Function Prototypes */ + +/* Public Functions */ + +//! Initializes the I²C bus. +/*! + * + */ +void COMM_I2C_Init(void) +{ + COMM_I2C_Bus_Mutex = xSemaphoreCreateMutex(); + I2C_Start(); +} + + +/* Private Functions */ diff --git a/2020TPCApp1.cydsn/COMM/COMM_I2C_Bus.h b/2020TPCApp1.cydsn/COMM/COMM_I2C_Bus.h new file mode 100644 index 0000000..414e7f2 --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/COMM_I2C_Bus.h @@ -0,0 +1,29 @@ +/** \file + * \brief This file defines the interface to the I²C bus. + * + */ + +#ifndef COMM_I2C_BUS_H +#define COMM_I2C_BUS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + + +/* Include Files */ + + +/* Public Variables */ +extern SemaphoreHandle_t COMM_I2C_Bus_Mutex; + +/* Public Functions */ +void COMM_I2C_Init(void); + +#ifdef __cplusplus +} +#endif + +#endif // COMM_I2C_BUS_H diff --git a/2020TPCApp1.cydsn/COMM/COMM_IPC_Messages.c b/2020TPCApp1.cydsn/COMM/COMM_IPC_Messages.c new file mode 100644 index 0000000..605d8df --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/COMM_IPC_Messages.c @@ -0,0 +1,285 @@ +/** \file + * \brief This file implements messaging using inter-processor communication (IPC). + * +* \see https://community.cypress.com/thread/36182. + */ + +/** + * \ingroup CONSOLE + */ + +/* Include Files */ +#include +#include +#include +#include +#include +#include + +#include "COMM_IPC_Messages.h" + +/* Private Function Prototypes */ + +#if (__CORTEX_M == 0) +static void Message_Received_for_CM0(uint32_t * msg); +static void Message_Received_by_CM4(void); +#endif // (__CORTEX_M == 0) + +#if (__CORTEX_M == 4) +static void Message_Received_for_CM4(uint32_t * msg); +static void Message_Received_by_CM0(void); +#endif // (__CORTEX_M == 4) + +static void IPC_UserPipeInit(void); +static void IPC_UserPipeISR(void); + + +/* Local Definitions and Constants */ + +//! Number of clients supported on the user pipe. +#define CY_IPC_USRPIPE_CLIENT_CNT (uint32_t)(8u) + +#define CY_IPC_CHAN_USRPIPE_CM0 (uint32_t)(8u) +#define CY_IPC_CHAN_USRPIPE_CM4 (uint32_t)(9u) + +#define CY_IPC_INTR_USRPIPE_CM0 (uint32_t)(8u) +#define CY_IPC_INTR_USRPIPE_CM4 (uint32_t)(9u) + +#define CY_IPC_EP_USRPIPE_ADDR_CM0_EP (uint32_t)(2u) +#define CY_IPC_EP_USRPIPE_ADDR_CM4_EP (uint32_t)(3u) + +#if (CY_CPU_CORTEX_M0P) + #define IPC_EP_USRPIPE_ADDR CY_IPC_EP_USRPIPE_ADDR_CM0_EP +#else + #define IPC_EP_USRPIPE_ADDR CY_IPC_EP_USRPIPE_ADDR_CM4_EP +#endif /* (CY_CPU_CORTEX_M0P) */ + +/* User Pipe Configuration */ + +#define IPC_USRPIPE_CHAN_MASK_CM0 (uint32_t)(0x0001ul << CY_IPC_CHAN_USRPIPE_CM0) +#define IPC_USRPIPE_CHAN_MASK_CM4 (uint32_t)(0x0001ul << CY_IPC_CHAN_USRPIPE_CM4) +#define IPC_USRPIPE_INTR_MASK (uint32_t)( IPC_USRPIPE_CHAN_MASK_CM0 | IPC_USRPIPE_CHAN_MASK_CM4 ) +#define IPC_INTR_USRPIPE_PRIOR_CM0 (uint32_t)(1u) /* Notifier Priority */ +#define IPC_INTR_USRPIPE_PRIOR_CM4 (uint32_t)(1u) /* Notifier Priority */ +#define IPC_INTR_USRPIPE_MUX_CM0 (uint32_t)(7u) /* IPC CYPRESS PIPE */ +#define IPC_USRPIPE_CONFIG_CM0 (uint32_t)(IPC_USRPIPE_INTR_MASK << CY_IPC_PIPE_CFG_IMASK_Pos)\ + |(CY_IPC_INTR_USRPIPE_CM0 << CY_IPC_PIPE_CFG_INTR_Pos )\ + |(CY_IPC_CHAN_USRPIPE_CM0) +#define IPC_USRPIPE_CONFIG_CM4 (uint32_t)(IPC_USRPIPE_INTR_MASK << CY_IPC_PIPE_CFG_IMASK_Pos)\ + |(CY_IPC_INTR_USRPIPE_CM4 << CY_IPC_PIPE_CFG_INTR_Pos )\ + |(CY_IPC_CHAN_USRPIPE_CM4) + +#define USRPIPE_CONFIG \ +{\ + /* .ep0ConfigData */ {\ + /* .ipcNotifierNumber */ CY_IPC_INTR_USRPIPE_CM0,\ + /* .ipcNotifierPriority */ IPC_INTR_USRPIPE_PRIOR_CM0,\ + /* .ipcNotifierMuxNumber */ IPC_INTR_USRPIPE_MUX_CM0,\ + /* .epAddress */ CY_IPC_EP_USRPIPE_ADDR_CM0_EP,\ + /* .epConfig */ IPC_USRPIPE_CONFIG_CM0\ + },\ + /* .ep1ConfigData */ {\ + /* .ipcNotifierNumber */ CY_IPC_INTR_USRPIPE_CM4,\ + /* .ipcNotifierPriority */ IPC_INTR_USRPIPE_PRIOR_CM4,\ + /* .ipcNotifierMuxNumber */ 0u,\ + /* .epAddress */ CY_IPC_EP_USRPIPE_ADDR_CM4_EP,\ + /* .epConfig */ IPC_USRPIPE_CONFIG_CM4\ + },\ + /* .endpointClientsCount */ CY_IPC_USRPIPE_CLIENT_CNT,\ + /* .endpointsCallbacksArray */ ipc_pipe_CbArray,\ + /* .userPipeIsrHandler */ &IPC_UserPipeISR\ +} + +//! Client ID for messages from the CM0 to the CM4 +#define COMM_IPC_CM0_TO_CM4_CLIENT_ID 0 +//! Client ID for messages from the CM4 to the CM0 +#define COMM_IPC_CM4_TO_CM0_CLIENT_ID 1 + + +/* Public Variables */ + +/* Private Variables */ + +#if (__CORTEX_M == 0) +static COMM_IPCMessage_T MessageBuffer = +{ + .ClientID = _VAL2FLD(CY_IPC_PIPE_MSG_CLIENT, COMM_IPC_CM0_TO_CM4_CLIENT_ID) | _VAL2FLD(CY_IPC_PIPE_MSG_USR, 0) | _VAL2FLD(CY_IPC_PIPE_MSG_RELEASE, IPC_USRPIPE_INTR_MASK), + .MessageID = COMM_SMM_DefaultNoMessage, + .Data = NULL +}; + +static volatile bool OK_to_send_from_CM0_to_CM4 = true; +#endif // (__CORTEX_M == 0) + +#if (__CORTEX_M == 4) +static COMM_IPCMessage_T MessageBuffer = +{ + .ClientID = _VAL2FLD(CY_IPC_PIPE_MSG_CLIENT, COMM_IPC_CM4_TO_CM0_CLIENT_ID) | _VAL2FLD(CY_IPC_PIPE_MSG_USR, 0) | _VAL2FLD(CY_IPC_PIPE_MSG_RELEASE, IPC_USRPIPE_INTR_MASK), + .MessageID = COMM_SMM_DefaultNoMessage, + .Data = NULL +}; + +static volatile bool OK_to_send_from_CM4_to_CM0 = true; +#endif // (__CORTEX_M == 4) + + +/* Public Functions */ + +#if (__CORTEX_M == 0) +//! Initializes the inter-processor communications on the Cortex-M0 core. +/*! + * This should be called *before* calling Cy_SysEnableCM4(). + */ +void COMM_InitIPCMessages(void) +{ + IPC_UserPipeInit(); + + // Register a callback to handle messages from CM4. + Cy_IPC_Pipe_RegisterCallback(IPC_EP_USRPIPE_ADDR, + Message_Received_for_CM0, + CY_IPC_EP_CYPIPE_CM4_ADDR); +} +#endif // (__CORTEX_M == 0) + +#if (__CORTEX_M == 4) +//! Initializes the inter-processor communications on the Cortex-M4 core. +void COMM_InitIPCMessages(void) +{ + IPC_UserPipeInit(); + + // Register a callback to handle messages from CM0. + Cy_IPC_Pipe_RegisterCallback(IPC_EP_USRPIPE_ADDR, + Message_Received_for_CM4, + CY_IPC_EP_CYPIPE_CM0_ADDR); +} +#endif // (__CORTEX_M == 4) + + +//! Sends an inter-processor communication message to the other core. +bool COMM_SendMessageToOtherCore(COMM_IPCMessageID_T message_ID, void * message_data) +{ + bool message_sent = false; + + MessageBuffer.MessageID = message_ID; + MessageBuffer.Data = message_data; + +#if (__CORTEX_M == 0) + if (OK_to_send_from_CM0_to_CM4 == true) + { + OK_to_send_from_CM0_to_CM4 = false; + uint32_t timeout_in_us = 2000; + cy_en_ipc_pipe_status_t ipcStatus; + + do + { + ipcStatus = Cy_IPC_Pipe_SendMessage(CY_IPC_EP_USRPIPE_ADDR_CM4_EP, + CY_IPC_EP_USRPIPE_ADDR_CM0_EP, + (uint32_t *) &MessageBuffer, + Message_Received_by_CM4); + Cy_SysLib_DelayUs(1u); + timeout_in_us--; + } while((ipcStatus != CY_IPC_PIPE_SUCCESS) && (timeout_in_us != 0)); + + message_sent = true; + } +#endif // (__CORTEX_M == 0) + +#if (__CORTEX_M == 4) + if (OK_to_send_from_CM4_to_CM0 == true) + { + OK_to_send_from_CM4_to_CM0 = false; + uint32_t timeout_in_us = 2000; + cy_en_ipc_pipe_status_t ipcStatus; + + do + { + ipcStatus = Cy_IPC_Pipe_SendMessage(CY_IPC_EP_USRPIPE_ADDR_CM0_EP, + CY_IPC_EP_USRPIPE_ADDR_CM4_EP, + (uint32_t *) &MessageBuffer, + Message_Received_by_CM0); + Cy_SysLib_DelayUs(1u); + timeout_in_us--; + } while((ipcStatus != CY_IPC_PIPE_SUCCESS) && (timeout_in_us != 0)); + + message_sent = true; + } +#endif // (__CORTEX_M == 4) + + return message_sent; +} + + +/* Private Functions */ + +#if (__CORTEX_M == 0) +//! Callback for messages received by the CM0 core from the CM4 core. +/*! + * \note This code is executed inside an interrupt handler. + */ +static void Message_Received_for_CM0(uint32_t * msg) +{ + switch (((COMM_IPCMessage_T *)msg)->MessageID) + { + default: + case COMM_SMM_DefaultNoMessage: + case COMM_SMM_NoMessage: + break; + + case COMM_SMM_RebootImmediately: + // Perform a software reset of both cores. + NVIC_SystemReset(); + break; + } +} + +static void Message_Received_by_CM4(void) +{ + OK_to_send_from_CM0_to_CM4 = true; +} +#endif // (__CORTEX_M == 0) + +#if (__CORTEX_M == 4) +//! Callback for messages received by the CM4 core from the CM0 core. +/*! + * \note This code is executed inside an interrupt handler. + */ +static void Message_Received_for_CM4(uint32_t * msg) +{ + switch (((COMM_IPCMessage_T *)msg)->MessageID) + { + default: + case COMM_SMM_DefaultNoMessage: + case COMM_SMM_NoMessage: + break; + + case COMM_SMM_RebootImmediately: + // This message does nothing on CM4 + break; + } +} + +static void Message_Received_by_CM0(void) +{ + OK_to_send_from_CM4_to_CM0 = true; +} +#endif // (__CORTEX_M == 4) + +//! Initializes the IPC user pipe. +static void IPC_UserPipeInit(void) +{ + static cy_ipc_pipe_callback_ptr_t ipc_pipe_CbArray[CY_IPC_USRPIPE_CLIENT_CNT]; + static const cy_stc_ipc_pipe_config_t userPipeConfig = USRPIPE_CONFIG; + + uint32_t savedIntrStatus = Cy_SysLib_EnterCriticalSection(); + + Cy_IPC_Pipe_Init(&userPipeConfig); + + Cy_SysLib_ExitCriticalSection(savedIntrStatus); +} + +//! Interrupt service routine for the user pipe. +void IPC_UserPipeISR(void) +{ + Cy_IPC_Pipe_ExecuteCallback(IPC_EP_USRPIPE_ADDR); +} + diff --git a/2020TPCApp1.cydsn/COMM/COMM_IPC_Messages.h b/2020TPCApp1.cydsn/COMM/COMM_IPC_Messages.h new file mode 100644 index 0000000..c6efdc3 --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/COMM_IPC_Messages.h @@ -0,0 +1,49 @@ + +/** \file + * \brief This file contains definitions and prototypes for messaging using inter-processor + * communication (IPC). + */ + +#ifndef COMM_IPC_MESSAGES_H +#define COMM_IPC_MESSAGES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +typedef enum +{ + //! This is not an actual message. Upon receipt, do nothing. + COMM_SMM_DefaultNoMessage = 0, + //! Reboot the system immediately upon receipt of this message (Data is "don't care"). + COMM_SMM_RebootImmediately, + //! This is not an actual message. Upon receipt, do nothing. + COMM_SMM_NoMessage = 0xFFFFFFFF, +} COMM_IPCMessageID_T; + +typedef struct +{ + //! The client ID number is the index into the callback array. + uint32_t ClientID; + //! The message ID represents the meaning of the message being sent. + COMM_IPCMessageID_T MessageID; + //! The contents of Data are different for each message ID. See #COMM_IPCMessageID_T for more details. + void * Data; +} COMM_IPCMessage_T; + +/* Public Variables */ + +/* Public Functions */ + +void COMM_InitIPCMessages(void); +bool COMM_SendMessageToOtherCore(COMM_IPCMessageID_T message_ID, void * message_data); + +#ifdef __cplusplus +} +#endif + +#endif // COMM_IPC_MESSAGES_H diff --git a/2020TPCApp1.cydsn/COMM/COMM_Util.c b/2020TPCApp1.cydsn/COMM/COMM_Util.c new file mode 100644 index 0000000..311d8a5 --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/COMM_Util.c @@ -0,0 +1,48 @@ +/** \file + * \brief This file implements utility functions used by the communications package. + */ + +/** + * \ingroup CONSOLE + */ + +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +/* Public Variables */ + +/* Private Variables */ +static char8 uint64_buffer[20+1]; + +/* Private Function Prototypes */ + +/* Public Functions */ + +//! Converts a UInt64 to a NULL-terminated string. +/*! + * This function is necessary because newlib-nano does not support "%llu" / #PRIu64. + * \see https://answers.launchpad.net/gcc-arm-embedded/+question/257014 + * + * \note This function is not reentrant! + * + * \param value pointer to the digital input object. + * \return pointer to a NULL-terminated string containing the base-10 textual representation of #value. + */ +char8 * COMM_UInt64ToDecimal(uint64_t value) +{ + char8 * p = uint64_buffer + sizeof(uint64_buffer); + *(--p) = 0x00; + + for (bool first_time = true; value || first_time; first_time = false) + { + const uint32_t digit = value % 10; + const char c = '0' + digit; + *(--p) = c; + value = value / 10; + } + return p; +} + +/* Private Functions */ diff --git a/2020TPCApp1.cydsn/COMM/COMM_Util.h b/2020TPCApp1.cydsn/COMM/COMM_Util.h new file mode 100644 index 0000000..0dc199a --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/COMM_Util.h @@ -0,0 +1,27 @@ +/** \file + * \brief Utility functions used by the communications package. + * + * \note As always, and should be included before this file. + */ + +#ifndef COMM_UTIL_H +#define COMM_UTIL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +/* Public Variables */ + +/* Public Functions */ +char8 * COMM_UInt64ToDecimal(uint64_t value); + +#ifdef __cplusplus +} +#endif + +#endif // COMM_UTIL_H diff --git a/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_BLE_ConsoleCommands.c b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_BLE_ConsoleCommands.c new file mode 100644 index 0000000..183e994 --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_BLE_ConsoleCommands.c @@ -0,0 +1,78 @@ +/** \file + * \brief This file defines the serial console commands for the Bluetooth Low Energy subsystem. + */ + +/* Include Files */ +#include "KTag.h" + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) && (CONFIG__FEATURE_BLE == CONFIG__FEATURE_ENABLED) + +/* Local Definitions and Constants */ + +/* Private Function Prototypes */ + +/* Public Variables */ + +/* Private Variables */ + +/* Public Functions */ + +/* Private Functions */ + +//! Console command handler for subcommands of the 'ble' command. +COMM_Console_Command_Result_T COMM_HandleBLECommand(char8 * data, uint32_t size) +{ + // data[0] through data[3] is 'ble '. + + if (data[4] == '?') + { + COMM_Console_Print_String("ble ? Display this help.\n"); + COMM_Console_Print_String("ble cmd Inject the BLE command with ID .\n"); + } + else if ( (data[4] == 'c') && + (data[5] == 'm') && + (data[6] == 'd') ) + + { + if (COMM_Console_IsEndOfMessage(data[7])) + { + COMM_Console_Print_String("ERROR: missing BLE command ID!\n"); + } + else if (data[7] == ' ') + { + uint16_t id = 0; + + if (COMM_Console_DecodeParameterUInt16(&(data[8]), &id) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + if ((id > COMM_BLE_COMMAND_NO_OP) && (id < COMM_BLE_COMMAND_IS_OUT_OF_RANGE)) + { + COMM_BLE_Command_T command = {.ID = id, .Data = (void *)0x00}; + xQueueSend(COMM_BLE_CommandQueue, &command, 0); + } + else + { + COMM_Console_Print_String("ERROR: specified BLE command ID ("); + COMM_Console_Print_UInt16(id); + COMM_Console_Print_String(") is invalid!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: could not comprehend BLE command ID!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: unrecognized or mangled command!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: Unknown BLE command!\n"); + } + + + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) && (CONFIG__FEATURE_BLE == CONFIG__FEATURE_ENABLED) diff --git a/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_BLE_ConsoleCommands.h b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_BLE_ConsoleCommands.h new file mode 100644 index 0000000..014c11e --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_BLE_ConsoleCommands.h @@ -0,0 +1,29 @@ +/** \file + * \brief This file declares the serial console commands for the Bluetooth Low Energy subsystem. + */ + +#ifndef COMM_BLE_CONSOLECOMMANDS_H +#define COMM_BLE_CONSOLECOMMANDS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +/* Public Variables */ + +/* Public Functions */ +COMM_Console_Command_Result_T COMM_HandleBLECommand(char8 * data, uint32_t size); + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +#ifdef __cplusplus +} +#endif + +#endif // COMM_BLE_CONSOLECOMMANDS_H diff --git a/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_ConsoleCommands.c b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_ConsoleCommands.c new file mode 100644 index 0000000..bee533d --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_ConsoleCommands.c @@ -0,0 +1,73 @@ +/** \file + * \brief This file defines the serial console commands for this CPU. + */ + +/* Include Files */ +#include "KTag.h" + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Local Definitions and Constants */ + +/* Private Function Prototypes */ +static COMM_Console_Command_Result_T HandleConsoleHelp(char8 * data, uint32_t size); +static COMM_Console_Command_Result_T HandleConsoleComment(char8 * data, uint32_t size); +static COMM_Console_Command_Result_T HandleConsoleUptime(char8 * data, uint32_t size); + +/* Public Variables */ + +const COMM_Console_Command_Table_Entry_T COMM_Console_Command_Table[] = +{ + {"?", " Show this help.", HandleConsoleHelp}, + {"#", " Comment (Do not omit the space after the #.)", HandleConsoleComment}, + {"event", " Generate an event in the high-level state machine (\'event ?\' for help).", COMM_HandleEventCommand}, + {"ble", " Interact with the Bluetooth Low Energy subsystem (try \'ble ?\').", COMM_HandleBLECommand}, + {"up", " Display uptime.", HandleConsoleUptime}, + {"cpu (r)", " Display CPU usage ('r' to reset maximum).", COMM_RTOS_HandleConsoleCPU}, + {"stack", " Display stack usage.", COMM_RTOS_HandleConsoleStack}, + {"version", " Display RTOS version.", COMM_RTOS_HandleConsoleVersion}, + {"reboot", " Performs a software reset on both cores.", COMM_RTOS_HandleConsoleReboot}, + {"nvm", " Interact with the Nonvolatile Memory (try \'nvm ?\').", COMM_NVM_HandleConsoleNVMCommand}, + {"reprogram", " Loads the KTag bootloader for OTA reprogramming.", COMM_RTOS_HandleConsoleReprogram}, +}; + +//! Size of the #COMM_Console_Command_Table array (i.e. the number of console commands). +const uint_fast16_t COMM_N_CONSOLE_COMMANDS = (uint_fast16_t) (sizeof(COMM_Console_Command_Table) / sizeof(COMM_Console_Command_Table_Entry_T)); + +/* Private Variables */ + +/* Public Functions */ + +/* Private Functions */ + +static COMM_Console_Command_Result_T HandleConsoleHelp(char8 * data, uint32_t size) +{ + for (uint_fast16_t i = 0; i < COMM_N_CONSOLE_COMMANDS; i++) + { + COMM_Console_Print_String(COMM_Console_Command_Table[i].Command_Name); + COMM_Console_Print_String(" "); + COMM_Console_Print_String(COMM_Console_Command_Table[i].Help); + COMM_Console_Print_String("\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + } + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +static COMM_Console_Command_Result_T HandleConsoleComment(char8 * data, uint32_t size) +{ + COMM_Console_Print_String("Comment.\n"); + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +static COMM_Console_Command_Result_T HandleConsoleUptime(char8 * data, uint32_t size) +{ +#if (configTICK_RATE_HZ != 1000) +#error This code assumes configTICK_RATE_HZ is set to 1000 (== 1ms ticks)! +#endif // (configTICK_RATE_HZ != 1000) + COMM_Console_Print_String("Up "); + COMM_Console_Print_UInt32(xTaskGetTickCount()); + COMM_Console_Print_String(" milliseconds.\n"); + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) diff --git a/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_ConsoleCommands.h b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_ConsoleCommands.h new file mode 100644 index 0000000..c332d4d --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_ConsoleCommands.h @@ -0,0 +1,30 @@ +/** \file + * \brief This file configures the serial console commands on this CPU. + */ + +#ifndef COMM_CONSOLECOMMANDS_H +#define COMM_CONSOLECOMMANDS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +/* Public Variables */ +extern const COMM_Console_Command_Table_Entry_T COMM_Console_Command_Table[]; +extern const uint_fast16_t COMM_N_CONSOLE_COMMANDS; + +/* Public Functions */ + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +#ifdef __cplusplus +} +#endif + +#endif // COMM_CONSOLECOMMANDS_H \ No newline at end of file diff --git a/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_NVM_ConsoleCommands.c b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_NVM_ConsoleCommands.c new file mode 100644 index 0000000..ced911a --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_NVM_ConsoleCommands.c @@ -0,0 +1,207 @@ +/** \file + * \brief This file defines the serial console commands for the Nonvolatile Memory. + */ + +/* Include Files */ +#include "KTag.h" + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Local Definitions and Constants */ + +/* Private Function Prototypes */ + +/* Public Variables */ + +/* Private Variables */ + +/* Public Functions */ + +/* Private Functions */ + +//! Console command handler for subcommands of the 'nvm' command. +COMM_Console_Command_Result_T COMM_NVM_HandleConsoleNVMCommand(char8 * data, uint32_t size) +{ + // data[0] through data[3] is 'nvm '. + if (data[4] == '?') + { + COMM_Console_Print_String("nvm ? Display this help.\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String("nvm dump Display the entire Nonvolatile Memory.\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String("nvm names Display the NVM parameter names.\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String("nvm get Display an individual parameter from NVM.\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String("nvm set Assign a value to an individual parameter in NVM (be careful!).\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + } + else if ((data[4] == 'd') && (data[5] == 'u') && (data[6] == 'm') && (data[7] == 'p')) + { + for (uint8_t i = 0; i < NVM_N_ONCHIP_EEPROM_ENTRIES; i++) + { + COMM_Console_Print_String("NVM["); + COMM_Console_Print_UInt16(i); + COMM_Console_Print_String("]: "); + + for (uint8_t j = 0; j < NVM_OnChipEEPROMEntries[i]->Size; j++) + { + char8 buffer[3]; + + COMM_Console_ByteToHex(buffer, *(NVM_OnChipEEPROMEntries[i]->Value + j)); + COMM_Console_Print_String("0x"); + COMM_Console_Print_String(buffer); + COMM_Console_Print_String(" "); + } + COMM_Console_Print_String("\n"); + } + } + else if ((data[4] == 'n') && (data[5] == 'a') && (data[6] == 'm') && (data[7] == 'e') && (data[8] == 's')) + { + COMM_Console_Print_String("Valid NVM parameters:\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String(" test_1\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String(" test_2\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String(" volume\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + } + else if ((data[4] == 'g') && (data[5] == 'e') && (data[6] == 't') && (data[7] == ' ')) + { + if (strncmp(&data[8], "volume", 6) == 0) + { + COMM_Console_Print_String("Volume: "); + COMM_Console_Print_UInt8(NVM_VOLUME); + COMM_Console_Print_String("\n"); + } + else if (strncmp(&data[8], "test_1", 6) == 0) + { + COMM_Console_Print_String("Test 1: "); + COMM_Console_Print_UInt16(NVM_ONCHIP_TEST_1); + COMM_Console_Print_String("\n"); + } + else if (strncmp(&data[8], "test_2", 6) == 0) + { + COMM_Console_Print_String("Test 2: "); + COMM_Console_Print_UInt32(NVM_ONCHIP_TEST_2); + COMM_Console_Print_String("\n"); + } + else if (strncmp(&data[8], "test_3", 6) == 0) + { + COMM_Console_Print_String("Test 3: "); + COMM_Console_Print_UInt16(NVM_EXTERNAL_TEST_3); + COMM_Console_Print_String("\n"); + } + else if (strncmp(&data[8], "test_4", 6) == 0) + { + COMM_Console_Print_String("Test 4: "); + COMM_Console_Print_UInt32(NVM_EXTERNAL_TEST_4); + COMM_Console_Print_String("\n"); + } + else + { + COMM_Console_Print_String("ERROR: Unknown NVM parameter!\n"); + } + } + else if ((data[4] == 's') && (data[5] == 'e') && (data[6] == 't') && (data[7] == ' ')) + { + if (strncmp(&data[8], "volume", 6) == 0) + { + uint8_t volume = 0; + if (COMM_Console_DecodeParameterUInt8(&(data[15]), &volume) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + NVM_VOLUME = volume; + NVM_SaveExternalEEPROMEntry(NVM_VOLUME_ENTRY_PTR); + + COMM_Console_Print_String("Volume changed to "); + COMM_Console_Print_UInt8(NVM_VOLUME); + COMM_Console_Print_String("\n"); + } + else + { + COMM_Console_Print_String("ERROR: Parameter value unrecognized or missing!\n"); + } + } + else if (strncmp(&data[8], "test_1", 6) == 0) + { + uint16_t test_value = 0; + if (COMM_Console_DecodeParameterUInt16(&(data[15]), &test_value) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + NVM_ONCHIP_TEST_1 = test_value; + NVM_SaveOnChipEEPROMEntry(NVM_ONCHIP_TEST_1_ENTRY_PTR); + + COMM_Console_Print_String("Test 1 value changed to "); + COMM_Console_Print_UInt16(NVM_ONCHIP_TEST_1); + COMM_Console_Print_String("\n"); + } + else + { + COMM_Console_Print_String("ERROR: Parameter value unrecognized or missing!\n"); + } + } + else if (strncmp(&data[8], "test_2", 6) == 0) + { + uint32_t test_value = 0; + if (COMM_Console_DecodeParameterUInt32(&(data[15]), &test_value) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + NVM_ONCHIP_TEST_2 = test_value; + NVM_SaveOnChipEEPROMEntry(NVM_ONCHIP_TEST_2_ENTRY_PTR); + + COMM_Console_Print_String("Test 2 value changed to "); + COMM_Console_Print_UInt32(NVM_ONCHIP_TEST_2); + COMM_Console_Print_String("\n"); + } + else + { + COMM_Console_Print_String("ERROR: Parameter value unrecognized or missing!\n"); + } + } + else if (strncmp(&data[8], "test_3", 6) == 0) + { + uint16_t test_value = 0; + if (COMM_Console_DecodeParameterUInt16(&(data[15]), &test_value) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + NVM_EXTERNAL_TEST_3 = test_value; + NVM_SaveExternalEEPROMEntry(NVM_EXTERNAL_TEST_3_ENTRY_PTR); + + COMM_Console_Print_String("Test 3 value changed to "); + COMM_Console_Print_UInt16(NVM_EXTERNAL_TEST_3); + COMM_Console_Print_String("\n"); + } + else + { + COMM_Console_Print_String("ERROR: Parameter value unrecognized or missing!\n"); + } + } + else if (strncmp(&data[8], "test_4", 6) == 0) + { + uint32_t test_value = 0; + if (COMM_Console_DecodeParameterUInt32(&(data[15]), &test_value) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + NVM_EXTERNAL_TEST_4 = test_value; + NVM_SaveExternalEEPROMEntry(NVM_EXTERNAL_TEST_4_ENTRY_PTR); + + COMM_Console_Print_String("Test 4 value changed to "); + COMM_Console_Print_UInt32(NVM_EXTERNAL_TEST_4); + COMM_Console_Print_String("\n"); + } + else + { + COMM_Console_Print_String("ERROR: Parameter value unrecognized or missing!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: Unknown NVM parameter!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: Unknown NVM command!\n"); + } + + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) diff --git a/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_NVM_ConsoleCommands.h b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_NVM_ConsoleCommands.h new file mode 100644 index 0000000..d71ee1a --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_NVM_ConsoleCommands.h @@ -0,0 +1,29 @@ +/** \file + * \brief This file declares the serial console commands for the Nonvolatile Memory. + */ + +#ifndef COMM_NVM_CONSOLECOMMANDS_H +#define COMM_NVM_CONSOLECOMMANDS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +/* Public Variables */ + +/* Public Functions */ +COMM_Console_Command_Result_T COMM_NVM_HandleConsoleNVMCommand(char8 * data, uint32_t size); + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +#ifdef __cplusplus +} +#endif + +#endif // COMM_NVM_CONSOLECOMMANDS_H diff --git a/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_RTOS_ConsoleCommands.c b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_RTOS_ConsoleCommands.c new file mode 100644 index 0000000..21d457e --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_RTOS_ConsoleCommands.c @@ -0,0 +1,120 @@ +/** \file + * \brief This file defines the serial console commands for the RTOS package. + */ + +/* Include Files */ +#include "KTag.h" + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Local Definitions and Constants */ + +/* Private Function Prototypes */ + +/* Public Variables */ + +/* Private Variables */ + +/* Public Functions */ + +/* Private Functions */ + +COMM_Console_Command_Result_T COMM_RTOS_HandleConsoleVersion(char8 * data, uint32_t size) +{ + COMM_Console_Print_String("PSoC 6 running FreeRTOS "); + + COMM_Console_Print_String(tskKERNEL_VERSION_NUMBER); + +#ifdef NDEBUG + COMM_Console_Print_String(" (Release, compiled "); +#else + COMM_Console_Print_String(" (Debug, compiled "); +#endif // NDEBUG + + COMM_Console_Print_String(__DATE__); + COMM_Console_Print_String(" "); + COMM_Console_Print_String(__TIME__); + COMM_Console_Print_String(").\n"); + + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +COMM_Console_Command_Result_T COMM_RTOS_HandleConsoleStack(char8 * data, uint32_t size) +{ + for (uint_fast8_t i = 0; i < CONFIG_N_TASK_HANDLES; i++) + { + TaskStatus_t status; + vTaskGetInfo(*CONFIG_TaskHandles[i], &status, pdTRUE, eInvalid); + COMM_Console_Print_String(status.pcTaskName); + COMM_Console_Print_String(": "); + COMM_Console_Print_UInt16(status.usStackHighWaterMark); + COMM_Console_Print_String("\n"); + } + + // Repeat for the Idle Task. + { + TaskStatus_t status; + vTaskGetInfo(xTaskGetIdleTaskHandle(), &status, pdTRUE, eInvalid); + COMM_Console_Print_String(status.pcTaskName); + COMM_Console_Print_String(": "); + COMM_Console_Print_UInt16(status.usStackHighWaterMark); + COMM_Console_Print_String("\n"); + } + + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +COMM_Console_Command_Result_T COMM_RTOS_HandleConsoleCPU(char8 * data, uint32_t size) +{ + // data[0] through data[3] is 'cpu '. + if (data[4] == 'r') + { + //COMM_Console_Print_String("Max CPU reset.\n"); + COMM_Console_Print_String("(Not yet implemented.)\n"); + } + else + { + for (uint_fast8_t i = 0; i < CONFIG_N_TASK_HANDLES; i++) + { + TaskStatus_t status; + vTaskGetInfo(*CONFIG_TaskHandles[i], &status, pdTRUE, eInvalid); + COMM_Console_Print_String(status.pcTaskName); + COMM_Console_Print_String(": "); + COMM_Console_Print_UInt32(status.ulRunTimeCounter); + COMM_Console_Print_String("\n"); + } + + // Repeat for the Idle Task. + { + TaskStatus_t status; + vTaskGetInfo(xTaskGetIdleTaskHandle(), &status, pdTRUE, eInvalid); + COMM_Console_Print_String(status.pcTaskName); + COMM_Console_Print_String(": "); + COMM_Console_Print_UInt16(status.ulRunTimeCounter); + COMM_Console_Print_String("\n"); + } + } + + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +COMM_Console_Command_Result_T COMM_RTOS_HandleConsoleReboot(char8 * data, uint32_t size) +{ + (void) COMM_SendMessageToOtherCore(COMM_SMM_RebootImmediately, NULL); + + // Not that it matters... + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +COMM_Console_Command_Result_T COMM_RTOS_HandleConsoleReprogram(char8 * data, uint32_t size) +{ + COMM_Console_Print_String("Entering bootloader for BLE reprogramming.\n"); + vTaskDelay(pdMS_TO_TICKS(100)); + + Cy_DFU_ExecuteApp(0u); + + // Not that it matters... + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) diff --git a/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_RTOS_ConsoleCommands.h b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_RTOS_ConsoleCommands.h new file mode 100644 index 0000000..ac65346 --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_RTOS_ConsoleCommands.h @@ -0,0 +1,33 @@ +/** \file + * \brief This file declares the serial console commands for the RTOS package. + */ + +#ifndef COMM_RTOS_CONSOLECOMMANDS_H +#define COMM_RTOS_CONSOLECOMMANDS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +/* Public Variables */ + +/* Public Functions */ +COMM_Console_Command_Result_T COMM_RTOS_HandleConsoleVersion(char8 * data, uint32_t size); +COMM_Console_Command_Result_T COMM_RTOS_HandleConsoleStack(char8 * data, uint32_t size); +COMM_Console_Command_Result_T COMM_RTOS_HandleConsoleCPU(char8 * data, uint32_t size); +COMM_Console_Command_Result_T COMM_RTOS_HandleConsoleReboot(char8 * data, uint32_t size); +COMM_Console_Command_Result_T COMM_RTOS_HandleConsoleReprogram(char8 * data, uint32_t size); + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +#ifdef __cplusplus +} +#endif + +#endif // COMM_RTOS_CONSOLECOMMANDS_H \ No newline at end of file diff --git a/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_STATE_ConsoleCommands.c b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_STATE_ConsoleCommands.c new file mode 100644 index 0000000..83d8bcf --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_STATE_ConsoleCommands.c @@ -0,0 +1,189 @@ +/** \file + * \brief This file defines the serial console commands for the high-level state machine. + */ + +/* Include Files */ +#include "KTag.h" + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Local Definitions and Constants */ + +/* Private Function Prototypes */ +static void Simulate_Hit(uint8_t team_ID, uint16_t damage); + +/* Public Variables */ + +/* Private Variables */ + +/* Public Functions */ + +//! Console command handler for the 'event' command. +COMM_Console_Command_Result_T COMM_HandleEventCommand(char8 * data, uint32_t size) +{ + // data[0] through data[5] is 'event '. + + if (data[6] == '?') + { + COMM_Console_Print_String("event ? Display this help.\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String("event raw Inject the event with ID .\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String("event tag Send tag(s).\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String("event hit Simulate a hit from team for damage.\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + } + else if ( (data[6] == 'r') && + (data[7] == 'a') && + (data[8] == 'w') ) + + { + if (COMM_Console_IsEndOfMessage(data[9])) + { + COMM_Console_Print_String("ERROR: missing event ID!\n"); + } + else if (data[9] == ' ') + { + uint16_t id = 0; + + if (COMM_Console_DecodeParameterUInt16(&(data[10]), &id) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + if ((id > KEVENT_NO_EVENT) && (id < KEVENT_IS_OUT_OF_RANGE)) + { + KEvent_T raw_event = { .ID = id, .Data = (void *)0x00 }; + Post_KEvent(&raw_event); + } + else + { + COMM_Console_Print_String("ERROR: specified event ID ("); + COMM_Console_Print_UInt16(id); + COMM_Console_Print_String(") is invalid!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: could not comprehend event ID!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: unrecognized or mangled command!\n"); + } + } + else if ( (data[6] == 't') && + (data[7] == 'a') && + (data[8] == 'g') ) + + { + if (COMM_Console_IsEndOfMessage(data[9])) + { + if (Send_Tag() == SYSTEMK_RESULT_SUCCESS) + { + COMM_Console_Print_String("Tag sent.\n"); + } + else + { + COMM_Console_Print_String("Error: Couldn't send tag!\n"); + } + } + else if (data[9] == ' ') + { + uint16_t times = 0; + + if (COMM_Console_DecodeParameterUInt16(&(data[10]), ×) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + while (times > 0) + { + if (Send_Tag() == SYSTEMK_RESULT_SUCCESS) + { + COMM_Console_Print_String("Tag sent.\n"); + } + else + { + COMM_Console_Print_String("Error: Couldn't send tag!\n"); + } + //! \todo Why can't the console command 'event tag ' send tags faster than once per second? + vTaskDelay(1000 / portTICK_PERIOD_MS); + times--; + } + } + else + { + COMM_Console_Print_String("ERROR: could not comprehend tag repetitions!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: unrecognized or mangled command!\n"); + } + } + else if ( (data[6] == 'h') && + (data[7] == 'i') && + (data[8] == 't') ) + + { + if (COMM_Console_IsEndOfMessage(data[9])) + { + Simulate_Hit(1, 10); + COMM_Console_Print_String("Hit!\n"); + } + else if (data[9] == ' ') + { + uint8_t team_ID = 0; + uint16_t damage = 10; + + if (COMM_Console_DecodeParameterUInt8(&(data[10]), &team_ID) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + const char * damage_location; + + // Damage is the first parameter after team ID. + if (COMM_Console_FindNthParameter(&(data[10]), 1, &damage_location) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + if (COMM_Console_DecodeParameterUInt16(damage_location, &damage) != COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + COMM_Console_Print_String("ERROR: could not comprehend damage--using default.\n"); + damage = 10; + } + } + Simulate_Hit(team_ID, damage); + COMM_Console_Print_String("Hit!\n"); + } + else + { + COMM_Console_Print_String("ERROR: could not comprehend team ID!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: unrecognized or mangled command!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: Unknown event command!\n"); + } + + + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +/* Private Functions */ + +static void Simulate_Hit(uint8_t team_ID, uint16_t damage) +{ + static DecodedPacket_T Simulated_Tag_Rx_Buffer; + static KEvent_T tag_received_event; + + Simulated_Tag_Rx_Buffer.Tag.type = DECODED_PACKET_TYPE_TAG_RECEIVED; + Simulated_Tag_Rx_Buffer.Tag.protocol = LASER_X_PROTOCOL; + Simulated_Tag_Rx_Buffer.Tag.player_ID = 0x00; + Simulated_Tag_Rx_Buffer.Tag.team_ID = team_ID; + Simulated_Tag_Rx_Buffer.Tag.damage = damage; + Simulated_Tag_Rx_Buffer.Tag.color = GetColorFromTeamID(team_ID); + tag_received_event.ID = KEVENT_TAG_RECEIVED; + tag_received_event.Data = &Simulated_Tag_Rx_Buffer; + Post_KEvent(&tag_received_event); +} + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) diff --git a/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_STATE_ConsoleCommands.h b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_STATE_ConsoleCommands.h new file mode 100644 index 0000000..0c29268 --- /dev/null +++ b/2020TPCApp1.cydsn/COMM/ConsoleCommands/COMM_STATE_ConsoleCommands.h @@ -0,0 +1,29 @@ +/** \file + * \brief This file declares the serial console commands for the high-level state machine. + */ + +#ifndef COMM_STATE_CONSOLECOMMANDS_H +#define COMM_STATE_CONSOLECOMMANDS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +/* Public Variables */ + +/* Public Functions */ +COMM_Console_Command_Result_T COMM_HandleEventCommand(char8 * data, uint32_t size); + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +#ifdef __cplusplus +} +#endif + +#endif // COMM_STATE_CONSOLECOMMANDS_H diff --git a/2020TPCApp1.cydsn/CONFIG/CONFIG.h b/2020TPCApp1.cydsn/CONFIG/CONFIG.h new file mode 100644 index 0000000..5ec88f7 --- /dev/null +++ b/2020TPCApp1.cydsn/CONFIG/CONFIG.h @@ -0,0 +1,83 @@ +/** \dir "CONFIG" + * + * \brief This directory contains configuration files for this software. + * + */ + +/** \file + * \brief This file includes project-wide for this software. + * + * This file should be included by every file outside the CONFIG package! + * + * \note As always, should be included before this file. + */ + +#ifndef CONFIG_H +#define CONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "CONFIG_RTOS.h" + +//! Value of audio volume represeting the maximum volume possible for this device. +#define CONFIG_KTAG_MAX_AUDIO_VOLUME 30 + +//! Value of audio volume represeting the minimum volume possible for this device. +#define CONFIG_KTAG_MIN_AUDIO_VOLUME 5 + +//! Time (in milliseconds) after starting a game before the countdown begins. +#define CONFIG_KTAG_T_DEFAULT_START_GAME_in_ms (30 * 1000) + +//! true if the hardware includes internal (on-chip) NVM. +#define CONFIG__HAS_INTERNAL_NVM true + +//! true if the hardware includes an external (I2C) NVM chip. +#define CONFIG__HAS_EXTERNAL_NVM true + +// '||' || '|| '||''|. TM +// || ... || || || ... .. ... ... .... ... +// || || || ||'''|. ||' '' || || '|. | +// || || || || || || || || '|.| +// .||.....| .||. .||. .||...|' .||. '|..'|. '| + +#if (defined LIL_BRUV) || (defined LITTLE_BOY_BLUE) + +//! Number of NeoPixel channels supported. +#define CONFIG_KTAG_N_NEOPIXEL_CHANNELS 1 + +//! Maximum number of NeoPixels on a single channel. +#define CONFIG_KTAG_MAX_NEOPIXELS_PER_CHANNEL 5 + + + +// /\ /\\ /\ /\\ TM +// ( ) || || ( ) || || |''||''| '||''|. ..|'''.| +// // || || // || || || || || .|' ' +// // || || // || || || ||...|' || +// /( || || /( || || || || '|. . +// {___ \\/ {___ \\/ .||. .||. ''|....' + +#elif (defined TWENTY20TPC) + +//! Number of NeoPixel channels supported. +#define CONFIG_KTAG_N_NEOPIXEL_CHANNELS 4 + +//! Maximum number of NeoPixels on a single channel. +#define CONFIG_KTAG_MAX_NEOPIXELS_PER_CHANNEL 8 + + + +#else + #error "No recognized KTag models defined. Supported models are: LIL_BRUV, LITTLE_BOY_BLUE, and TWENTY20TPC." +#endif + +//! Time between NeoPixel animation frames, in milliseconds. +#define CONFIG_KTAG_ANIMATION_STEP_TIME_IN_ms 10 + +#ifdef __cplusplus +} +#endif + +#endif // CONFIG_H diff --git a/2020TPCApp1.cydsn/CONFIG/CONFIG_RTOS.c b/2020TPCApp1.cydsn/CONFIG/CONFIG_RTOS.c new file mode 100644 index 0000000..9c97c6c --- /dev/null +++ b/2020TPCApp1.cydsn/CONFIG/CONFIG_RTOS.c @@ -0,0 +1,113 @@ +/** \file + * \brief This file defines and registers the tasks used by the Real-Time Operating System. + * + * See CONFIG_RTOS.h for a detailed description of the functionality implemented by this code. + */ + +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +/*---------------------------------------------------------------------------*/ +/* Task priorities: Low priority numbers denote low priority tasks. + * + * Low == 0 == tskIDLE_PRIORITY + * ... + * High == (configMAX_PRIORITIES - 1) + * + * See http://www.freertos.org/RTOS-task-priority.html for more information. + */ +#define CAPSENSE_TASK_PRIORITY (tskIDLE_PRIORITY + 3) +#define SAMPLE_TASK_PRIORITY (tskIDLE_PRIORITY + 2) +#define FIRE_CONTROL_TASK_PRIORITY (tskIDLE_PRIORITY + 1) +#define AUDIO_TASK_PRIORITY (tskIDLE_PRIORITY + 2) +#define NEOPIXELS_TASK_PRIORITY (tskIDLE_PRIORITY + 2) +#define TAG_SENSORS_TASK_PRIORITY (tskIDLE_PRIORITY + 5) +#define SWITCHES_TASK_PRIORITY (tskIDLE_PRIORITY + 2) +#define NVM_EXTERNAL_TASK_PRIORITY (tskIDLE_PRIORITY + 2) +#define NVM_ON_CHIP_EEPROM_TASK_PRIORITY (tskIDLE_PRIORITY + 1) +#define COMM_CONSOLE_TASK_PRIORITY (tskIDLE_PRIORITY + 2) +#define COMM_BLE_TASK_PRIORITY (tskIDLE_PRIORITY + 4) + + +/* External Variables [Only if necessary!] */ + +/* External Function Prototypes [Only if necessary!] */ + +/* Public Variables */ + +//! Array of all the handles for the configured RTOS tasks. +TaskHandle_t * const CONFIG_TaskHandles[] = {&HW_CapSense_Task_Handle, + &Fire_Control_Task_Handle, + &Sample_Task_Handle, + &Audio_Task_Handle, + &NeoPixels_Task_Handle, + &Tag_Sensors_Task_Handle, + &Switches_Task_Handle, + &State_Machine_Task_Handle, + &NVM_ExternalEEPROM_Task_Handle, + &NVM_OnChipEEPROM_Task_Handle, + &COMM_Console_Task_Handle, + &COMM_BLE_Task_Handle}; + +//! Size of the #CONFIG_TaskHandles array (i.e. the number of configured tasks). +const uint8_t CONFIG_N_TASK_HANDLES = (uint8_t) (sizeof(CONFIG_TaskHandles) / sizeof(TaskHandle_t *)); + +/* Private Variables */ + +/* Private Function Prototypes */ + +/* Public Functions */ + +void CONFIG_InitTasks(void) +{ + HW_CapSense_Init(); + COMM_I2C_Init(); + NVM_InitExternalEEPROM(); + NVM_InitOnChipEEPROM(); + Sample_Task_Init(); + Init_Fire_Control(); + Tag_Sensors_Init(); + Init_Audio(); + Switches_Init(); + COMM_Console_Init(); + COMM_BLE_Init(); +} + +//! Registers tasks with the kernel, and then runs them. +/*! + * This function should not return. +*/ +void CONFIG_RunTasks(void) +{ + (void) xTaskCreate(HW_CapSense_Task, "CapSense Task", HW_CAPSENSE_TASK_STACK_SIZE_in_bytes, NULL, CAPSENSE_TASK_PRIORITY, &HW_CapSense_Task_Handle); + (void) xTaskCreate(Fire_Control_Task, "Fire Control Task", configMINIMAL_STACK_SIZE, NULL, FIRE_CONTROL_TASK_PRIORITY, &Fire_Control_Task_Handle); + (void) xTaskCreate(Sample_Task, "Sample Task", configMINIMAL_STACK_SIZE, NULL, SAMPLE_TASK_PRIORITY, &Sample_Task_Handle); + (void) xTaskCreate(Audio_Task, "Audio Task", configMINIMAL_STACK_SIZE, NULL, AUDIO_TASK_PRIORITY, &Audio_Task_Handle); + (void) xTaskCreate(NeoPixels_Task, "NeoPixels Task", configMINIMAL_STACK_SIZE, NULL, NEOPIXELS_TASK_PRIORITY, &NeoPixels_Task_Handle); + (void) xTaskCreate(Tag_Sensors_Task, "Tag Sensors Task", configMINIMAL_STACK_SIZE, NULL, TAG_SENSORS_TASK_PRIORITY, &Tag_Sensors_Task_Handle); + (void) xTaskCreate(Switches_Task, "Switches Task", configMINIMAL_STACK_SIZE, NULL, SWITCHES_TASK_PRIORITY, &Switches_Task_Handle); + (void) xTaskCreate(NVM_OnChipEEPROMTask, "NVMOn", NVM_ON_CHIP_EEPROM_TASK_STACK_SIZE_in_bytes, NULL, NVM_ON_CHIP_EEPROM_TASK_PRIORITY, &NVM_OnChipEEPROM_Task_Handle); + (void) xTaskCreate(NVM_ExternalEEPROMTask, "NVMEx", NVM_EXTERNAL_EEPROM_TASK_STACK_SIZE_in_bytes, NULL, NVM_EXTERNAL_TASK_PRIORITY, &NVM_ExternalEEPROM_Task_Handle); + (void) xTaskCreate(COMM_Console_Task, "Console Task", COMM_CONSOLE_TASK_STACK_SIZE_in_bytes, NULL, COMM_CONSOLE_TASK_PRIORITY, &COMM_Console_Task_Handle); + (void) xTaskCreate(COMM_BLE_Task, "BLE Task", COMM_BLE_TASK_STACK_SIZE_in_bytes, NULL, COMM_BLE_TASK_PRIORITY, &COMM_BLE_Task_Handle); + + if (Initialize_SystemK() != SYSTEMK_RESULT_SUCCESS) + { + KLOG_ERROR("CONFIG", "Failed to initilaize SystemK!"); + } + + /* This should not return. */ + vTaskStartScheduler(); + + // Something went wrong. +#ifdef DEBUG + // Break into the debugger. + __BKPT(0); +#else // DEBUG + __NVIC_SystemReset(); +#endif // DEBUG +} + +/* Private Functions */ diff --git a/2020TPCApp1.cydsn/CONFIG/CONFIG_RTOS.h b/2020TPCApp1.cydsn/CONFIG/CONFIG_RTOS.h new file mode 100644 index 0000000..26709c3 --- /dev/null +++ b/2020TPCApp1.cydsn/CONFIG/CONFIG_RTOS.h @@ -0,0 +1,29 @@ +/** \file + * \brief This file configures the Real-Time Operating System (RTOS). + */ + +#ifndef CONFIG_RTOS_H +#define CONFIG_RTOS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +/* Public Variables */ + +extern TaskHandle_t * const CONFIG_TaskHandles[]; +extern const uint8_t CONFIG_N_TASK_HANDLES; + +/* Public Functions */ +void CONFIG_InitTasks(void); +void CONFIG_RunTasks(void); + +#ifdef __cplusplus +} +#endif + +#endif // CONFIG_RTOS_H diff --git a/2020TPCApp1.cydsn/Fire_Control.c b/2020TPCApp1.cydsn/Fire_Control.c new file mode 100644 index 0000000..6033112 --- /dev/null +++ b/2020TPCApp1.cydsn/Fire_Control.c @@ -0,0 +1,223 @@ +/* Include Files */ +#include "KTag.h" + +#define FIRE_CONTROL_REGISTER__IR_OFF 0b00000 +#define FIRE_CONTROL_REGISTER__IR_ON_MODULATED_LOW_POWER 0b00011 +#define FIRE_CONTROL_REGISTER__IR_ON_MODULATED_HIGH_POWER 0b00101 +#define FIRE_CONTROL_REGISTER__IR_ON_MODULATED_MAX_POWER 0b11111 +#define FIRE_CONTROL_REGISTER__IR_ON_UNMODULATED_LOW_POWER 0b00010 +#define FIRE_CONTROL_REGISTER__IR_ON_UNMODULATED_HIGH_POWER 0b00100 +#define FIRE_CONTROL_REGISTER__IR_ON_UNMODULATED_MAX_POWER 0b00110 + +#define TRIGGER_STATUS_REGISTER__NO_ACTION 0x00 +#define TRIGGER_STATUS_REGISTER__TRIGGER_PULLED 0x01 +#define TRIGGER_STATUS_REGISTER__TRIGGER_RELEASED 0x02 + + +void Trigger_Interrupt_ISR(); +void Bit_Stream_Timer_ISR(); + +TimedPulseTrain_T * Shot_Buffer; +TagPacket_T Shot_Packet; + +TaskHandle_t Fire_Control_Task_Handle; + +static TimedPulseTrain_T * Active_Pulse_Train = NULL; +static uint8_t Active_Bitstream_Index = 0; + +static TickType_t TicksAtTriggerPress; + +static inline void Initiate_Pulse_Train(TimedPulseTrain_T * pulsetrain) +{ + Bit_Stream_Timer_Disable(); + Active_Pulse_Train = pulsetrain; + Active_Bitstream_Index = 0; + + if (Active_Pulse_Train->bitstream[Active_Bitstream_Index].symbol == MARK) + { + Fire_Control_Register_Write(FIRE_CONTROL_REGISTER__IR_ON_MODULATED_MAX_POWER); + } + else + { + Fire_Control_Register_Write(FIRE_CONTROL_REGISTER__IR_OFF); + } + Bit_Stream_Timer_SetPeriod(Active_Pulse_Train->bitstream[0].duration); + Bit_Stream_Timer_SetCounter(0); + Active_Bitstream_Index++; + Bit_Stream_Timer_Enable(); + Bit_Stream_Timer_TriggerStart(); +} + +static inline void Next_Bit(void) +{ + static BaseType_t xHigherPriorityTaskWoken = pdFALSE; + + Bit_Stream_Timer_Disable(); + + if (Active_Pulse_Train->bitstream[Active_Bitstream_Index].duration != LAST_PULSE) + { + if (Active_Pulse_Train->bitstream[Active_Bitstream_Index].symbol == MARK) + { + Fire_Control_Register_Write(FIRE_CONTROL_REGISTER__IR_ON_MODULATED_MAX_POWER); + } + else + { + Fire_Control_Register_Write(FIRE_CONTROL_REGISTER__IR_OFF); + } + + if (Active_Bitstream_Index < ((2*MAX_PULSES) - 2)) + { + Bit_Stream_Timer_SetPeriod(Active_Pulse_Train->bitstream[Active_Bitstream_Index].duration); + Bit_Stream_Timer_SetCounter(0); + Active_Bitstream_Index++; + Bit_Stream_Timer_Enable(); + Bit_Stream_Timer_TriggerStart(); + } + else + { + // The bitstream is too long! + + // Turn the IR Emitter off, and wait a long time. + Fire_Control_Register_Write(FIRE_CONTROL_REGISTER__IR_OFF); + xSemaphoreGiveFromISR(NeoPixels_Semaphore, &xHigherPriorityTaskWoken); + Bit_Stream_Timer_SetPeriod(UINT16_MAX); + Bit_Stream_Timer_SetCounter(0); + Active_Pulse_Train = NULL; + Bit_Stream_Timer_Enable(); + Bit_Stream_Timer_TriggerStart(); + } + } + else + { + // Turn the IR Emitter off, and wait a long time. + Fire_Control_Register_Write(FIRE_CONTROL_REGISTER__IR_OFF); + xSemaphoreGiveFromISR(NeoPixels_Semaphore, &xHigherPriorityTaskWoken); + Bit_Stream_Timer_SetPeriod(UINT16_MAX); + Bit_Stream_Timer_SetCounter(0); + Active_Pulse_Train = NULL; + Bit_Stream_Timer_Enable(); + Bit_Stream_Timer_TriggerStart(); + } + + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); +} + +void Init_Fire_Control(void) +{ + // Register and enable the ISRs. + Cy_SysInt_Init(&Trigger_Interrupt_cfg, Trigger_Interrupt_ISR); + Cy_SysInt_Init(&Bit_Stream_Timer_Interrupt_cfg, Bit_Stream_Timer_ISR); + NVIC_EnableIRQ(Trigger_Interrupt_cfg.intrSrc); + NVIC_EnableIRQ(Bit_Stream_Timer_Interrupt_cfg.intrSrc); + + // Initialize the hardware. + Bit_Stream_Timer_Clock_Enable(); + Bit_Stream_Timer_Init(&Bit_Stream_Timer_config); + Bit_Stream_Timer_SetPeriod(2); + Bit_Stream_Timer_Start(); + SW_CLK_Enable(); + PWM_IR_Modulation_Start(); + + + Fire_Control_Register_Write(FIRE_CONTROL_REGISTER__IR_OFF); +} + +void Fire_Control_Task(void * pvParameters) +{ + while (true) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + } +} + +SystemKResult_T Prepare_Tag() +{ + Shot_Packet.player_ID = NVM_PLAYER_ID; + Shot_Packet.team_ID = NVM_TEAM_ID; + Weapon_t weapon = GetWeaponFromID(NVM_WEAPON_ID); + Shot_Packet.color = (uint32_t)PROTOCOLS_GetColor(weapon.Protocol, Shot_Packet.team_ID, Shot_Packet.player_ID); + Shot_Packet.protocol = weapon.Protocol; + Shot_Packet.damage = weapon.Damage_Per_Shot; + Shot_Buffer = PROTOCOLS_EncodePacket(&Shot_Packet); + Fire_Control_Set_Modulation_Frequency(PROTOCOLS_GetModulationFrequency(weapon.Protocol)); + return SYSTEMK_RESULT_SUCCESS; +} + +SystemKResult_T Send_Tag() +{ + xSemaphoreTake(NeoPixels_Semaphore, portMAX_DELAY); + Initiate_Pulse_Train(Shot_Buffer); + + KEvent_T tag_sent_event = { .ID = KEVENT_TAG_SENT, .Data = (void *)0x00 }; + Post_KEvent(&tag_sent_event); + + return SYSTEMK_RESULT_SUCCESS; +} + +void Fire_Control_Set_Modulation_Frequency(ModulationFrequency_T freq) +{ + PWM_IR_Modulation_TriggerKill(); + if (freq == FREQUENCY_38kHz) + { + PWM_IR_Modulation_SetPeriod0(314); + //PWM_IR_Modulation_SetCompare0(314/2); // 50% Duty Cycle + PWM_IR_Modulation_SetCompare0((314 * 3)/10); // 30% Duty Cycle + } + else // (freq == FREQUENCY_56kHz) + { + PWM_IR_Modulation_SetPeriod0(213); + //PWM_IR_Modulation_SetCompare0(213/2); // 50% Duty Cycle + PWM_IR_Modulation_SetCompare0((213 * 3)/10); // 30% Duty Cycle + } + PWM_IR_Modulation_TriggerStart(); +} + +//! ISR for the trigger input. +void Trigger_Interrupt_ISR() +{ + portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + // Clear the interrupt. + NVIC_ClearPendingIRQ(Trigger_Interrupt_cfg.intrSrc); + + // Read the trigger register to know if this was a pull or a release. + uint8_t trigger_status = Trigger_Status_Reg_Read(); + + if ((trigger_status & TRIGGER_STATUS_REGISTER__TRIGGER_PULLED) == TRIGGER_STATUS_REGISTER__TRIGGER_PULLED) + { + TicksAtTriggerPress = xTaskGetTickCountFromISR(); + KEvent_T switch_event = {.ID = KEVENT_CENTER_SWITCH_PRESSED, .Data = NULL}; + Post_KEvent_From_ISR(&switch_event, &xHigherPriorityTaskWoken); + } + else if ((trigger_status & TRIGGER_STATUS_REGISTER__TRIGGER_RELEASED) == TRIGGER_STATUS_REGISTER__TRIGGER_RELEASED) + { + uint32_t triggerPressDurationInms = pdTICKS_TO_MS(xTaskGetTickCountFromISR() - TicksAtTriggerPress); + KEvent_T switch_event = {.ID = KEVENT_CENTER_SWITCH_RELEASED, .Data = (void *) triggerPressDurationInms}; + Post_KEvent_From_ISR(&switch_event, &xHigherPriorityTaskWoken); + } + else + { + // What happened!!? + } + + // If an event was enqueued above, a context switch might be required. + // xHigherPriorityTaskWoken was initialized to pdFALSE on interrupt entry. If calling + // xSemaphoreGiveFromISR() caused a task to unblock, and the unblocked task has a + // priority equal to or higher than the currently running task (the task that was + // interrupted by this ISR), then xHigherPriorityTaskWoken will have been set to pdTRUE + // and portEND_SWITCHING_ISR() will request a context switch to the newly unblocked task. + portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); +} + +void Bit_Stream_Timer_ISR() +{ + // Get all the enabled pending interrupts... + uint32_t source = Bit_Stream_Timer_GetInterruptStatusMasked(); + // ...and clear them. + Bit_Stream_Timer_ClearInterrupt(source); + + if (Active_Pulse_Train != NULL) + { + Next_Bit(); + } +} diff --git a/2020TPCApp1.cydsn/Fire_Control.h b/2020TPCApp1.cydsn/Fire_Control.h new file mode 100644 index 0000000..bcf8e72 --- /dev/null +++ b/2020TPCApp1.cydsn/Fire_Control.h @@ -0,0 +1,13 @@ +#ifndef FIRE_CONTROL_H +#define FIRE_CONTROL_H + +#include +#include + +extern TaskHandle_t Fire_Control_Task_Handle; + +void Init_Fire_Control(void); +void Fire_Control_Task(void * pvParameters); +void Fire_Control_Set_Modulation_Frequency(ModulationFrequency_T freq); + +#endif // FIRE_CONTROL_H diff --git a/2020TPCApp1.cydsn/FreeRTOSConfig.h b/2020TPCApp1.cydsn/FreeRTOSConfig.h new file mode 100644 index 0000000..ff41915 --- /dev/null +++ b/2020TPCApp1.cydsn/FreeRTOSConfig.h @@ -0,0 +1,228 @@ +/* + * FreeRTOS Kernel V10.0.1 + * Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#include "syslib/cy_syslib.h" + +#define configUSE_PREEMPTION 1 +#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +#define configUSE_TICKLESS_IDLE 0 +#define configCPU_CLOCK_HZ SystemCoreClock +#define configTICK_RATE_HZ 1000u +#define configMAX_PRIORITIES 15 +#define configMINIMAL_STACK_SIZE 512 +#define configMAX_TASK_NAME_LEN 16 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 1 +#define configUSE_TASK_NOTIFICATIONS 1 +#define configUSE_MUTEXES 1 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configUSE_COUNTING_SEMAPHORES 1 +#define configQUEUE_REGISTRY_SIZE 10 +#define configUSE_QUEUE_SETS 0 +#define configUSE_TIME_SLICING 0 +#define configUSE_NEWLIB_REENTRANT 0 +#define configENABLE_BACKWARD_COMPATIBILITY 0 +#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 5 + +/* Memory allocation related definitions. */ +#define configSUPPORT_STATIC_ALLOCATION 1 +#define configSUPPORT_DYNAMIC_ALLOCATION 1 +#define configTOTAL_HEAP_SIZE (64*1024) +#define configAPPLICATION_ALLOCATED_HEAP 0 + +/* Hook function related definitions. */ +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 0 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_MALLOC_FAILED_HOOK 1 +#define configUSE_DAEMON_TASK_STARTUP_HOOK 0 + +/* Run time and task stats gathering related definitions. */ +#define configGENERATE_RUN_TIME_STATS 1 +#define configUSE_TRACE_FACILITY 1 +#define configUSE_STATS_FORMATTING_FUNCTIONS 1 + + +//! Debug Exception and Monitor Control register +#define CORE_DBG_EXC_MON_CTL (*(uint32_t *)0xE000EDFC) + +//! DWT Control Register +#define DWT_CTRL (*(uint32_t *)0xE0001000) + +//! DWT Current PC Sampler Cycle Count Register +/*! + * Use the DWT Current PC Sampler Cycle Count Register to count the number of core cycles. This + * count can measure elapsed execution time. + */ +#define DWT_CYCCNT (*(uint32_t *)0xE0001004) + +//! Initializes the Data Watchpoint and Trace Unit and starts the CYCCNT counter. +static inline void vCONFIGURE_TIMER_FOR_RUN_TIME_STATS(void) +{ + // If the Data Watchpoint and Trace Unit is present, #DWT_CTRL will be non-zero. + if (DWT_CTRL != 0) + { + // Set bit 24 (TRCENA) on the CORE_DBG_EXC_MON_CTL register to enable use of the DWT. + CORE_DBG_EXC_MON_CTL |= (1 << 24); + // Initialize the count register. + DWT_CYCCNT = 0; + // Set bit 0 (CYCCNTENA) on the DWT_CTRL register to enable the CYCCNT counter. + DWT_CTRL |= (1 << 0); + } +} + +#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS vCONFIGURE_TIMER_FOR_RUN_TIME_STATS + +//! Returns the current value of the DWT Current PC Sampler Cycle Count Register +/*! + * Use the DWT Current PC Sampler Cycle Count Register to count the number of core cycles. This + * count can measure elapsed execution time. + */ +static inline uint32_t ulGET_RUN_TIME_COUNTER_VALUE(void) +{ + return DWT_CYCCNT; +} + +#define portGET_RUN_TIME_COUNTER_VALUE ulGET_RUN_TIME_COUNTER_VALUE + +/* Co-routine related definitions. */ +#define configUSE_CO_ROUTINES 1 +#define configMAX_CO_ROUTINE_PRIORITIES 2 + +/* Software timer related definitions. */ +#define configUSE_TIMERS 1 +#define configTIMER_TASK_PRIORITY 3 +#define configTIMER_QUEUE_LENGTH 10 +#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE + +/* FreeRTOS MPU specific definitions. */ +#define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0 + +/* +Interrupt nesting behavior configuration. +This is explained here: http://www.freertos.org/a00110.html + +Priorities are controlled by two macros: +- configKERNEL_INTERRUPT_PRIORITY determines the priority of the RTOS daemon task +- configMAX_API_CALL_INTERRUPT_PRIORITY dictates the priority of ISRs that make API calls + +Notes: +1. Interrupts that do not call API functions should be >= configKERNEL_INTERRUPT_PRIORITY + and will nest. +2. Interrupts that call API functions must have priority between KERNEL_INTERRUPT_PRIORITY + and MAX_API_CALL_INTERRUPT_PRIORITY (inclusive). +3. Interrupts running above MAX_API_CALL_INTERRUPT_PRIORITY are never delayed by the OS. +*/ +/* +PSoC 6 __NVIC_PRIO_BITS = 3 + +0 (high) +1 MAX_API_CALL_INTERRUPT_PRIORITY 001xxxxx (0x3F) +2 +3 +4 +5 +6 +7 (low) KERNEL_INTERRUPT_PRIORITY 111xxxxx (0xFF) + +!!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + +If you call a FreeRTOS API function from an interrupt with priority higher than +MAX_API_CALL_INTERRUPT_PRIORITY FreeRTOS will generate an exception. If you need +to call a FreeRTOS API function from your system’s highest priority interrupt +you must reduce all interrupt priorities to MAX_API_CALL_INTERRUPT_PRIORITY or +lower. + +If your system pipe (IPC) interrupt priority is less than or equal to +MAX_API_CALL_INTERRUPT_PRIORITY then care must be taken with code that writes to +flash (including the Flash/BLE/Emulated EEPROM/Bootloader drivers from Cypress +PDL). The duration of critical sections must be kept short - see the +Configuration Considerations section of the flash driver in the PDL API +Reference. + +*/ + +/* Put KERNEL_INTERRUPT_PRIORITY in top __NVIC_PRIO_BITS bits of CM4 register */ +#define configKERNEL_INTERRUPT_PRIORITY 0xFF +/* +Put MAX_SYSCALL_INTERRUPT_PRIORITY in top __NVIC_PRIO_BITS bits of CM4 register +NOTE For IAR compiler make sure that changes of this macro is reflected in +file portable\IAR\CM4F\portasm.s in PendSV_Handler: routine +*/ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 0x3F +/* configMAX_API_CALL_INTERRUPT_PRIORITY is a new name for configMAX_SYSCALL_INTERRUPT_PRIORITY + that is used by newer ports only. The two are equivalent. */ +#define configMAX_API_CALL_INTERRUPT_PRIORITY configMAX_SYSCALL_INTERRUPT_PRIORITY + + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_xResumeFromISR 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_xTaskGetSchedulerState 1 +#define INCLUDE_xTaskGetCurrentTaskHandle 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 +#define INCLUDE_xTaskGetIdleTaskHandle 1 +#define INCLUDE_eTaskGetState 1 +#define INCLUDE_xEventGroupSetBitFromISR 1 +#define INCLUDE_xTimerPendFunctionCall 0 +#define INCLUDE_xTaskAbortDelay 0 +#define INCLUDE_xTaskGetHandle 0 +#define INCLUDE_xTaskResumeFromISR 1 + +/* Normal assert() semantics without relying on the provision of an assert.h +header file. */ +#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); } + +/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS +standard names - or at least those used in the unmodified vector table. */ +#define vPortSVCHandler SVC_Handler +#define xPortPendSVHandler PendSV_Handler +#define xPortSysTickHandler SysTick_Handler + +#endif /* FREERTOS_CONFIG_H */ diff --git a/2020TPCApp1.cydsn/HW/HW.h b/2020TPCApp1.cydsn/HW/HW.h new file mode 100644 index 0000000..0a27ecd --- /dev/null +++ b/2020TPCApp1.cydsn/HW/HW.h @@ -0,0 +1,50 @@ +/** \dir "HW" + * + * \brief This directory contains source code interfacing to the lowest level of the hardware on this CPU. + * + */ + +/** \file + * \brief This file defines the interface to the low-level hardware used by this software. + * + * This file should be included by any file outside the HW package wishing to make use + * of any of the HW functionality. + * + * \note As always, and should be included before this file. + */ + +#ifndef HW_H +#define HW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +//! Represents the states of a Digital Input or Digital Output. +typedef enum +{ + //! Represents low voltage (logic '0') on a digital input or output. + HW_DIGITAL_STATE_LOW = 0, + + //! Represents high voltage (logic '1') on a digital input or output. + HW_DIGITAL_STATE_HIGH = 1, + + //! Used when the state of a digital input or output cannot be determined. + HW_DIGITAL_STATE_UNKNOWN = 2 +} HW_DigitalState_T; + +/* Include Files */ + +#include "HW_CapSense.h" + +/* Public Variables */ + +/* Public Functions */ + +#ifdef __cplusplus +} +#endif + +#endif // HW_H diff --git a/2020TPCApp1.cydsn/HW/HW_CapSense.c b/2020TPCApp1.cydsn/HW/HW_CapSense.c new file mode 100644 index 0000000..14db4b5 --- /dev/null +++ b/2020TPCApp1.cydsn/HW/HW_CapSense.c @@ -0,0 +1,125 @@ +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +#define CAPSENSE_TASK_PERIOD_IN_ms 50 + +/* Public Variables */ + +TaskHandle_t HW_CapSense_Task_Handle; + +/* Private Variables */ + +static const TickType_t CapSense_Task_Delay = CAPSENSE_TASK_PERIOD_IN_ms / portTICK_PERIOD_MS; + +static bool CapSense_One_Pressed = false; +static bool CapSense_Two_Pressed = false; + +/* Private Function Prototypes */ + + +/* Public Functions */ + +//! Initializes the capacitive touch sensing. +void HW_CapSense_Init(void) +{ +} + +//! Capacitive touch sensing task: Manages the capsense, using the PSoC API functions. +/*! + * + */ +void HW_CapSense_Task(void * pvParameters) +{ + TickType_t xLastWakeTime; + + // Initialize the xLastWakeTime variable with the current time. + xLastWakeTime = xTaskGetTickCount(); + + // Start up the capsense component, and initiate the first scan. + // Note that this can't be done in HW_CapSense_Init(), since it requires interrupts to be enabled. + CapSense_Start(); + CapSense_ScanAllWidgets(); + + vTaskDelayUntil(&xLastWakeTime, CapSense_Task_Delay); + + while (true) + { + // Check to see if the CapSense hardware is still busy with a previous scan. + if (CapSense_IsBusy() == CapSense_NOT_BUSY) + { + // Process all the widgets and read the touch information. + CapSense_ProcessAllWidgets(); + + // Perform the on-change logic for "Button One". + if (CapSense_IsSensorActive(CapSense_BUTTON0_WDGT_ID, CapSense_BUTTON0_SNS0_ID)) + { + if (CapSense_One_Pressed == false) + { + KEvent_T switch_event = {.ID = KEVENT_CAPSENSE_ONE_PRESSED, .Data = NULL}; + Post_KEvent(&switch_event); + } + CapSense_One_Pressed = true; + } + else + { + if (CapSense_One_Pressed == true) + { + KEvent_T switch_event = {.ID = KEVENT_CAPSENSE_ONE_RELEASED, .Data = NULL}; + Post_KEvent(&switch_event); + } + CapSense_One_Pressed = false; + } + + // Perform the on-change logic for "Button Two". + if (CapSense_IsSensorActive(CapSense_BUTTON0_WDGT_ID, CapSense_BUTTON0_SNS1_ID)) + { + if (CapSense_Two_Pressed == false) + { + KEvent_T switch_event = {.ID = KEVENT_CAPSENSE_TWO_PRESSED, .Data = NULL}; + Post_KEvent(&switch_event); + } + CapSense_Two_Pressed = true; + } + else + { + if (CapSense_Two_Pressed == true) + { + KEvent_T switch_event = {.ID = KEVENT_CAPSENSE_TWO_RELEASED, .Data = NULL}; + Post_KEvent(&switch_event); + } + CapSense_Two_Pressed = false; + } + + // Initiate the next scan. + CapSense_ScanAllWidgets(); + } + + vTaskDelayUntil(&xLastWakeTime, CapSense_Task_Delay); + } +} + +//! Gets the state of the given CapSense button. +/*! + * \param button the button in question + * \return true if the button was pressed last time it was checked; false otherwise + */ +bool HW_IsCapsenseButtonPressed(HW_CapSenseButton_T button) +{ + bool pressed = false; + + if ((button == HW_CAPSENSE_BUTTON_ONE) && (CapSense_One_Pressed == true)) + { + pressed = true; + } + else if ((button == HW_CAPSENSE_BUTTON_TWO) && (CapSense_Two_Pressed == true)) + { + pressed = true; + } + + return pressed; +} + +/* Private Functions */ + diff --git a/2020TPCApp1.cydsn/HW/HW_CapSense.h b/2020TPCApp1.cydsn/HW/HW_CapSense.h new file mode 100644 index 0000000..f357e19 --- /dev/null +++ b/2020TPCApp1.cydsn/HW/HW_CapSense.h @@ -0,0 +1,40 @@ +/** \file + * \brief This file defines the interface to the capacitive touch sensing used by this software. + * + */ + +#ifndef HW_CAPSENSE_H +#define HW_CAPSENSE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +#define HW_CAPSENSE_TASK_STACK_SIZE_in_bytes 128 + +typedef enum +{ + HW_CAPSENSE_BUTTON_ONE, + HW_CAPSENSE_BUTTON_TWO +} HW_CapSenseButton_T; + +/* Include Files */ + +/* Public Variables */ + +//! Handle of the HW_CapSense_Task() given when the task was created. +extern TaskHandle_t HW_CapSense_Task_Handle; + +/* Public Functions */ +void HW_CapSense_Init(void); +void HW_CapSense_Task(void * pvParameters); +bool HW_IsCapsenseButtonPressed(HW_CapSenseButton_T button); + +#ifdef __cplusplus +} +#endif + +#endif // HW_CAPSENSE_H + diff --git a/2020TPCApp1.cydsn/HW/HW_NeoPixels.c b/2020TPCApp1.cydsn/HW/HW_NeoPixels.c new file mode 100644 index 0000000..d732a10 --- /dev/null +++ b/2020TPCApp1.cydsn/HW/HW_NeoPixels.c @@ -0,0 +1,392 @@ +// NeoPixel Driver using Direct Memory Access +// +// This implementation is based on the one by Alan Hawse of Elkhorn Creek, +// documented at https://iotexpert.com/2019/01/08/psoc-6-dma-ws2812-leds/. +// We are grateful to Mr. Hawse for sharing this. + +#include "KTag.h" + +#define NEOPIXEL_ZOFFSET (1) +#define NEOPIXEL_ONE3 (0b110<<24) +#define NEOPIXEL_ZERO3 (0b100<<24) +#define NEOPIXEL_SPI_BIT_PER_BIT (3) +#define NEOPIXEL_COLOR_PER_PIXEL (3) +#define NEOPIXEL_BYTES_PER_PIXEL (NEOPIXEL_SPI_BIT_PER_BIT * NEOPIXEL_COLOR_PER_PIXEL) +#define FRAME_BUFFER_SIZE (NEOPIXEL_ZOFFSET + (CONFIG_KTAG_MAX_NEOPIXELS_PER_CHANNEL * NEOPIXEL_BYTES_PER_PIXEL)) + +#if (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 1) + static uint8_t NeoPixel_Barrel_Channel_Frame_Buffer[FRAME_BUFFER_SIZE]; +#elif (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 4) + static uint8_t NeoPixel_Barrel_Channel_Frame_Buffer[FRAME_BUFFER_SIZE]; + static uint8_t NeoPixel_Receiver_Channel_Frame_Buffer[FRAME_BUFFER_SIZE]; + static uint8_t NeoPixel_Display_Channel_Frame_Buffer[FRAME_BUFFER_SIZE]; + static uint8_t NeoPixel_Effects_Channel_Frame_Buffer[FRAME_BUFFER_SIZE]; +#else + #error "Unsupported number of NeoPixel channels defined. Supported configurations are 1 and 4." +#endif + +static uint8_t* NeoPixel_Frame_Buffers[CONFIG_KTAG_N_NEOPIXEL_CHANNELS] = +{ +#if (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 1) + NeoPixel_Barrel_Channel_Frame_Buffer +#elif (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 4) + NeoPixel_Barrel_Channel_Frame_Buffer, + NeoPixel_Receiver_Channel_Frame_Buffer, + NeoPixel_Display_Channel_Frame_Buffer, + NeoPixel_Effects_Channel_Frame_Buffer +#else + #error "Unsupported number of NeoPixel channels defined. Supported configurations are 1 and 4." +#endif +}; + +ColorOrder_T ColorOrderByChannel[CONFIG_KTAG_N_NEOPIXEL_CHANNELS]; + +// Since the descriptors are (or should be) set to "trigger on descriptor completion" (`.interruptType = CY_DMA_DESCR`), +// this ISR is called after each channel has been written. +static void NeoPixel_DMA_Complete(void) +{ + static BaseType_t xHigherPriorityTaskWoken = pdFALSE; + + Cy_DMA_Channel_ClearInterrupt(DMA_NeoPixel_HW, DMA_NeoPixel_DW_CHANNEL); + + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); +} + +#define NEOPIXEL_N_DESCRIPTORS CONFIG_KTAG_N_NEOPIXEL_CHANNELS +static cy_stc_dma_descriptor_t NeoPixel_Descriptors[NEOPIXEL_N_DESCRIPTORS]; +static void NeoPixel_Configure_DMA(void) +{ + // I [AH] copied this structure from the PSoC Creator Component configuration + // in the generated source. + const cy_stc_dma_descriptor_config_t NeoPixel_DMA_Descriptor_Config = + { + .retrigger = CY_DMA_RETRIG_IM, + .interruptType = CY_DMA_DESCR, + .triggerOutType = CY_DMA_1ELEMENT, + .channelState = CY_DMA_CHANNEL_ENABLED, + .triggerInType = CY_DMA_1ELEMENT, + .dataSize = CY_DMA_BYTE, + .srcTransferSize = CY_DMA_TRANSFER_SIZE_DATA, + .dstTransferSize = CY_DMA_TRANSFER_SIZE_WORD, + .descriptorType = CY_DMA_1D_TRANSFER, + .srcAddress = NULL, + .dstAddress = NULL, + .srcXincrement = 1L, + .dstXincrement = 0L, + .xCount = 256UL, + .srcYincrement = 0L, + .dstYincrement = 0L, + .yCount = 1UL, + .nextDescriptor = NULL + }; + + for (uint_fast8_t i=0; i < NEOPIXEL_N_DESCRIPTORS; i++) + { + Cy_DMA_Descriptor_Init(&NeoPixel_Descriptors[i], &NeoPixel_DMA_Descriptor_Config); + Cy_DMA_Descriptor_SetSrcAddress(&NeoPixel_Descriptors[i], (uint8_t *)&NeoPixel_Frame_Buffers[i][0]); + Cy_DMA_Descriptor_SetDstAddress(&NeoPixel_Descriptors[i], (void *)&SPI_NeoPixel_HW->TX_FIFO_WR); + Cy_DMA_Descriptor_SetXloopDataCount(&NeoPixel_Descriptors[i], FRAME_BUFFER_SIZE); + } + + // Initialize and enable the interrupt from DMA_NeoPixel_HW. + Cy_SysInt_Init(&DMA_NeoPixel_Int_cfg, &NeoPixel_DMA_Complete); + NVIC_EnableIRQ(DMA_NeoPixel_Int_cfg.intrSrc); + Cy_DMA_Channel_SetInterruptMask(DMA_NeoPixel_HW, DMA_NeoPixel_DW_CHANNEL, DMA_NeoPixel_INTR_MASK); + + Cy_DMA_Enable(DMA_NeoPixel_HW); +} + +// Function: NeoPixel_Trigger_DMA +// This function sets up the channel... then enables it to dump the frameBuffer to pixels. +void NeoPixel_Trigger_DMA(uint_fast8_t channel) +{ + cy_stc_dma_channel_config_t channel_config; + channel_config.descriptor = &NeoPixel_Descriptors[channel]; + channel_config.preemptable = DMA_NeoPixel_PREEMPTABLE; + channel_config.priority = DMA_NeoPixel_PRIORITY; + channel_config.enable = false; + Cy_DMA_Channel_Init(DMA_NeoPixel_HW, DMA_NeoPixel_DW_CHANNEL, &channel_config); + Cy_DMA_Channel_Enable(DMA_NeoPixel_HW, DMA_NeoPixel_DW_CHANNEL); +} + +//! Takes an 8-bit value representing a color level and turns it into a WS2812 bit code... +/*! + * ...where 1=110 and 0=011 + * One input byte turns into three output bytes of a uint32_t. + */ +uint32_t NeoPixel_ConvertTo3Code(uint8_t input) +{ + uint32_t rval=0; + for (uint_fast8_t i=0; i < 8; i++) + { + if (input % 2) + { + rval |= NEOPIXEL_ONE3; + } + else + { + rval |= NEOPIXEL_ZERO3; + } + rval = rval >> 3; + + input = input >> 1; + } + return rval; +} + +//! Takes a position and a three byte RGB value and updates the corresponding NeoPixel_Frame_Buffer with the correct nine bytes. +SystemKResult_T HW_NeoPixels_Set_RGB(NeoPixelsChannel_T channel, uint8_t position, uint8_t red, uint8_t green, uint8_t blue) +{ + typedef union { + uint8_t bytes[4]; + uint32_t word; + } NeoPixel_ColorByNumber; + + NeoPixel_ColorByNumber color; + ColorOrder_T order = ColorOrderByChannel[channel]; + + if (order == COLOR_ORDER_RGB) + { + color.word = NeoPixel_ConvertTo3Code(red); + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+0+NEOPIXEL_ZOFFSET] = color.bytes[2]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+1+NEOPIXEL_ZOFFSET] = color.bytes[1]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+2+NEOPIXEL_ZOFFSET] = color.bytes[0]; + + color.word = NeoPixel_ConvertTo3Code(green); + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+3+NEOPIXEL_ZOFFSET] = color.bytes[2]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+4+NEOPIXEL_ZOFFSET] = color.bytes[1]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+5+NEOPIXEL_ZOFFSET] = color.bytes[0]; + + color.word = NeoPixel_ConvertTo3Code(blue); + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+6+NEOPIXEL_ZOFFSET] = color.bytes[2]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+7+NEOPIXEL_ZOFFSET] = color.bytes[1]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+8+NEOPIXEL_ZOFFSET] = color.bytes[0]; + } + else if (order == COLOR_ORDER_GRB) + { + color.word = NeoPixel_ConvertTo3Code(green); + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+0+NEOPIXEL_ZOFFSET] = color.bytes[2]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+1+NEOPIXEL_ZOFFSET] = color.bytes[1]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+2+NEOPIXEL_ZOFFSET] = color.bytes[0]; + + color.word = NeoPixel_ConvertTo3Code(red); + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+3+NEOPIXEL_ZOFFSET] = color.bytes[2]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+4+NEOPIXEL_ZOFFSET] = color.bytes[1]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+5+NEOPIXEL_ZOFFSET] = color.bytes[0]; + + color.word = NeoPixel_ConvertTo3Code(blue); + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+6+NEOPIXEL_ZOFFSET] = color.bytes[2]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+7+NEOPIXEL_ZOFFSET] = color.bytes[1]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+8+NEOPIXEL_ZOFFSET] = color.bytes[0]; + } + else + { + // Color order is not handled--log this and use RGB. + { + static bool error_logged = false; + if (error_logged == false) + { + COMM_Console_Print_String("Color order "); + COMM_Console_Print_UInt8(order); + COMM_Console_Print_String(" not yet supported!"); + error_logged = true; + } + } + + color.word = NeoPixel_ConvertTo3Code(red); + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+0+NEOPIXEL_ZOFFSET] = color.bytes[2]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+1+NEOPIXEL_ZOFFSET] = color.bytes[1]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+2+NEOPIXEL_ZOFFSET] = color.bytes[0]; + + color.word = NeoPixel_ConvertTo3Code(green); + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+3+NEOPIXEL_ZOFFSET] = color.bytes[2]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+4+NEOPIXEL_ZOFFSET] = color.bytes[1]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+5+NEOPIXEL_ZOFFSET] = color.bytes[0]; + + color.word = NeoPixel_ConvertTo3Code(blue); + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+6+NEOPIXEL_ZOFFSET] = color.bytes[2]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+7+NEOPIXEL_ZOFFSET] = color.bytes[1]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+8+NEOPIXEL_ZOFFSET] = color.bytes[0]; + } + + return SYSTEMK_RESULT_SUCCESS; +} + + +//! Initializes the hardware. +SystemKResult_T HW_NeoPixels_Init(void) +{ + Cy_SCB_SPI_Init(SPI_NeoPixel_HW, &SPI_NeoPixel_config, &SPI_NeoPixel_context); + Cy_SCB_SPI_Enable(SPI_NeoPixel_HW); + NeoPixel_Configure_DMA(); + +#if (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 1) + ColorOrderByChannel[NEOPIXEL_CHANNEL_BARREL] = NVM_BARREL_COLOR_ORDER; +#elif (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 4) + ColorOrderByChannel[NEOPIXEL_CHANNEL_BARREL] = NVM_BARREL_COLOR_ORDER; + ColorOrderByChannel[NEOPIXEL_CHANNEL_RECEIVER] = NVM_RECEIVER_COLOR_ORDER; + ColorOrderByChannel[NEOPIXEL_CHANNEL_DISPLAY] = NVM_DISPLAY_COLOR_ORDER; + ColorOrderByChannel[NEOPIXEL_CHANNEL_EFFECTS] = NVM_EFFECTS_COLOR_ORDER; +#else + #error "Unsupported number of NeoPixel channels defined. Supported configurations are 1 and 4." +#endif + + return SYSTEMK_RESULT_SUCCESS; +} + + +#if (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 1) +static inline __attribute__((always_inline)) void NeoPixels_Set_Color_On_All_Channels(uint8_t position, color_t color) +{ + HW_NeoPixels_Set_RGB(NEOPIXEL_CHANNEL_BARREL, position, Gamma8[Red(color)], Gamma8[Green(color)], Gamma8[Blue(color)]); +} + +static inline __attribute__((always_inline)) void NeoPixel_Disable_All_Channels() +{ + // Nothing to do. +} + +static inline __attribute__((always_inline)) void NeoPixel_Enable_Channel(uint_fast8_t __attribute__ ((unused)) channel) +{ + // Nothing to do. +} + +static inline __attribute__((always_inline)) void NeoPixel_Disable_Channel(uint_fast8_t __attribute__ ((unused)) channel) +{ + // Nothing to do. +} +#elif (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 4) + +static inline __attribute__((always_inline)) void NeoPixel_Enable_Barrel_Channel() +{ + Cy_GPIO_Write(Pin_NeoPixel_Select_0_PORT, Pin_NeoPixel_Select_0_NUM, 1); +} + +static inline __attribute__((always_inline)) void NeoPixel_Disable_Barrel_Channel() +{ + Cy_GPIO_Write(Pin_NeoPixel_Select_0_PORT, Pin_NeoPixel_Select_0_NUM, 0); +} + +static inline __attribute__((always_inline)) void NeoPixel_Enable_Receiver_Channel() +{ + Cy_GPIO_Write(Pin_NeoPixel_Select_1_PORT, Pin_NeoPixel_Select_1_NUM, 1); +} + +static inline __attribute__((always_inline)) void NeoPixel_Disable_Receiver_Channel() +{ + Cy_GPIO_Write(Pin_NeoPixel_Select_1_PORT, Pin_NeoPixel_Select_1_NUM, 0); +} + +static inline __attribute__((always_inline)) void NeoPixel_Enable_Display_Channel() +{ + Cy_GPIO_Write(Pin_NeoPixel_Select_2_PORT, Pin_NeoPixel_Select_2_NUM, 1); +} + +static inline __attribute__((always_inline)) void NeoPixel_Disable_Display_Channel() +{ + Cy_GPIO_Write(Pin_NeoPixel_Select_2_PORT, Pin_NeoPixel_Select_2_NUM, 0); +} + +static inline __attribute__((always_inline)) void NeoPixel_Enable_Effects_Channel() +{ + Cy_GPIO_Write(Pin_NeoPixel_Select_3_PORT, Pin_NeoPixel_Select_3_NUM, 1); +} + +static inline __attribute__((always_inline)) void NeoPixel_Disable_Effects_Channel() +{ + Cy_GPIO_Write(Pin_NeoPixel_Select_3_PORT, Pin_NeoPixel_Select_3_NUM, 0); +} + +static inline __attribute__((always_inline)) void NeoPixel_Enable_All_Channels() +{ + NeoPixel_Enable_Barrel_Channel(); + NeoPixel_Enable_Receiver_Channel(); + NeoPixel_Enable_Display_Channel(); + NeoPixel_Enable_Effects_Channel(); +} + +static inline __attribute__((always_inline)) void NeoPixel_Disable_All_Channels() +{ + NeoPixel_Disable_Barrel_Channel(); + NeoPixel_Disable_Receiver_Channel(); + NeoPixel_Disable_Display_Channel(); + NeoPixel_Disable_Effects_Channel(); +} + +static inline __attribute__((always_inline)) void NeoPixel_Enable_Channel(uint_fast8_t channel) +{ + switch (channel) + { + case NEOPIXEL_CHANNEL_BARREL: + NeoPixel_Enable_Barrel_Channel(); + break; + + case NEOPIXEL_CHANNEL_RECEIVER: + NeoPixel_Enable_Receiver_Channel(); + break; + + case NEOPIXEL_CHANNEL_DISPLAY: + NeoPixel_Enable_Display_Channel(); + break; + + case NEOPIXEL_CHANNEL_EFFECTS: + NeoPixel_Enable_Effects_Channel(); + break; + + default: + // Do nothing. + break; + } +} + +static inline __attribute__((always_inline)) void NeoPixel_Disable_Channel(uint_fast8_t channel) +{ + switch (channel) + { + case NEOPIXEL_CHANNEL_BARREL: + NeoPixel_Disable_Barrel_Channel(); + break; + + case NEOPIXEL_CHANNEL_RECEIVER: + NeoPixel_Disable_Receiver_Channel(); + break; + + case NEOPIXEL_CHANNEL_DISPLAY: + NeoPixel_Disable_Display_Channel(); + break; + + case NEOPIXEL_CHANNEL_EFFECTS: + NeoPixel_Disable_Effects_Channel(); + break; + + default: + // Do nothing. + break; + } +} +#else + #error "Unsupported number of NeoPixel channels defined. Supported configurations are 1 and 4." +#endif + +SystemKResult_T HW_NeoPixels_Publish(void) +{ + // Update the NeoPixels using DMA. + for (uint_fast8_t Current_NeoPixel_Channel = 0; Current_NeoPixel_Channel < CONFIG_KTAG_N_NEOPIXEL_CHANNELS; Current_NeoPixel_Channel++) + { + xSemaphoreTake(NeoPixels_Semaphore, portMAX_DELAY); + NeoPixel_Enable_Channel(Current_NeoPixel_Channel); + NeoPixel_Trigger_DMA(Current_NeoPixel_Channel); + // Allow time for the DMA transfer to go out on the wire. + vTaskDelay(portTICK_PERIOD_MS); + NeoPixel_Disable_Channel(Current_NeoPixel_Channel); + xSemaphoreGive(NeoPixels_Semaphore); + } + + return SYSTEMK_RESULT_SUCCESS; +} + +//! \todo Refactor this somehow...it doesn't belong here. +color_t HW_NeoPixels_Get_My_Color(void) +{ + return PROTOCOLS_GetColor(GetWeaponFromID(NVM_WEAPON_ID).Protocol, NVM_TEAM_ID, NVM_PLAYER_ID); +} diff --git a/2020TPCApp1.cydsn/KTag.h b/2020TPCApp1.cydsn/KTag.h new file mode 100644 index 0000000..8bbe992 --- /dev/null +++ b/2020TPCApp1.cydsn/KTag.h @@ -0,0 +1,81 @@ +/** \file + * \brief This is the top-level include file for the entire project. + * + * By including this file (and only this file), include dependency order is maintained. + * + */ + +// KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKKKKKKKKKKKky+.`/ykKKKKKKKKKKKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKKKKKKKds/. -+o:` ./sdNKKKKKKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKNds+-` `-+hNKKKKNho:` `-+shNKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKNkhyo+:. `-/sdNKKKKKKKKKKKKKky+:` .-/oyhdNKKKKKKKKKK +// KKys++:-.````.-:+oykNKKKKKKKKKKKKKKKKKKKKKKNkhs+/-.````.-:/+syKK +// KK -/+osydkNNNKKKkkkkkkkNKKKKKKKKKKKkkkkkkkkNKKKKNNkdhyso/: KK +// KK sKKKKKKKKKKKKK```````/KKKKKKKKKd-```````:kKKKKKKKKKKKKKd `KK +// KK- oKKKKKKKKKKKKK :KKKKKKKKo` `oNKKKKKKKKKKKKKKh :KK +// KK/ +KKKKKKKKKKKKK :KKKKKKd- -dKKKKKKKKKKKKKKKKy /KK +// KK+ /KKKKKKKKKKKKK :KKKKKs` +NKKKKKKKKKKKKKKKKKs +KK +// KKo :KKKKKKKKKKKKK :KKKk: .hKKKKKKKKKKKKKKKKKKKo oKK +// KKy -KKKKKKKKKKKKK :KKy` +NKKKKKKKKKKKKKKKKKKKK/ yKK +// KKd `KKKKKKKKKKKKK :k/ .hKKKKKKKKKKKKKKKKKKKKKK: dKK +// KKN NKKKKKKKKKKKK .. /kKKKKKKKKKKKKKKKKKKKKKKK. NKK +// KKK. dKKKKKKKKKKKK .yKKKKKKKKKKKKKKKKKKKKKKKKN .KKK +// KKK+ oKKKKKKKKKKKK -kKKKKKKKKKKKKKKKKKKKKKKKKKh +KKK +// KKKd .KKKKKKKKKKKK `sNKKKKKKKKKKKKKKKKKKKKKKKK/ dKKK +// KKKK: hKKKKKKKKKKK :kKKKKKKKKKKKKKKKKKKKKKKk :KKKK +// KKKKh -KKKKKKKKKKK `` .yKKKKKKKKKKKKKKKKKKKKK+ hKKKK +// KKKKK/ yKKKKKKKKKK T :d: /kKKKKKKKKKKKKKKKKKKk`:KKKKK +// KKKKKk`.NKKKKKKKKK :KNo` .hKKKKKKKKKKKKKKKKK:`kKKKKK +// KKKKKKy /KKKKKKKKK A :KKKd- +NKKKKKKKKKKKKKKo yKKKKKK +// KKKKKKK+ oKKKKKKKK :KKKKN+` -hKKKKKKKKKKKKy`+KKKKKKK +// KKKKKKKN/ sKKKKKKK G :KKKKKKh. `oNKKKKKKKKKh`/KKKKKKKK +// KKKKKKKKN/`sKKKKKK :KKKKKKKN/ -dKKKKKKKh`/NKKKKKKKK +// KKKKKKKKKK+ +NKKKK :KKKKKKKKKy. `sNKKKKs`+KKKKKKKKKK +// KKKKKKKKKKKs`:kKKK-------+KKKKKKKKKKk/--------oKKN+`sKKKKKKKKKKK +// KKKKKKKKKKKKh..yKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKd--dKKKKKKKKKKKK +// KKKKKKKKKKKKKN+`/kKKKKKKKKKKKKKKKKKKKKKKKKKKKKNo`+NKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKh-`sNKKKKKKKKKKKKKKKKKKKKKKKKNy.-hKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKs..sNKKKKKKKKKKKKKKKKKKKKNy-.yKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKNs..okKKKKKKKKKKKKKKKKNs-.sNKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKKKKy-`/hKKKKKKKKKKKKd+`-yKKKKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKKKKKKd/`.odKKKKKKks-`/dKKKKKKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKKKKKKKKNs: .+yy+-`:sNKKKKKKKKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKKKKKKKKKKKNy/..+yNKKKKKKKKKKKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK + + +#ifndef KTAG_H +#define KTAG_H + +/* Include FreeRTOS APIs and defines */ +#include "FreeRTOS.h" +#include "task.h" +#include "croutine.h" +#include "semphr.h" +#include "portmacro.h" +#include "timers.h" + +/* Include PSoC system and component APIs and defines */ +#include + +#include +#include +#include +#include + +#include "CONFIG.h" +#include "SystemK.h" +#include "HW.h" +#include "Audio.h" +#include "NVM.h" +#include "COMM.h" +#include "Fire_Control.h" +#include "Sample_Tasks.h" +#include "Tag_Sensors.h" +#include "Switches.h" +#include "Util.h" + +#endif // KTAG_H diff --git a/2020TPCApp1.cydsn/Menu/GameSettings/GameMenuItem.c b/2020TPCApp1.cydsn/Menu/GameSettings/GameMenuItem.c new file mode 100644 index 0000000..1478413 --- /dev/null +++ b/2020TPCApp1.cydsn/Menu/GameSettings/GameMenuItem.c @@ -0,0 +1,79 @@ +/* Include Files */ +#include "KTag.h" + +static uint8_t SubmenuIndex = 0; +static MenuItem_T const * const Submenus[] = +{ + &TeamIDMenuItem, + &PlayerIDMenuItem +}; +static const uint8_t N_SUBMENUS = (sizeof(Submenus) / sizeof(MenuItem_T *)); + +static void OnFocus(bool IncludeDetails); +static MenuItem_T const * OnSelect(); +static void OnIncrement(); +static void OnDecrement(); + +const MenuItem_T GameMenuItem = +{ + .OnFocus = OnFocus, + .OnSelect = OnSelect, + .OnIncrement = OnIncrement, + .OnDecrement = OnDecrement + +}; + +static void OnFocus(bool IncludeDetails) +{ + AudioAction_T audio_action = {.ID = AUDIO_PLAY_GAME_SETTINGS_PROMPT, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + + if (IncludeDetails == true) + { + if (Submenus[SubmenuIndex]->OnFocus != NULL) + { + Submenus[SubmenuIndex]->OnFocus(false); + } + } +} + +static MenuItem_T const * OnSelect() +{ + return Submenus[SubmenuIndex]; +} + +static void OnIncrement() +{ + if (SubmenuIndex < (N_SUBMENUS -1)) + { + SubmenuIndex++; + } + else + { + // Wrap around. + SubmenuIndex = 0; + } + + if (Submenus[SubmenuIndex]->OnFocus != NULL) + { + Submenus[SubmenuIndex]->OnFocus(false); + } +} + +static void OnDecrement() +{ + if (SubmenuIndex > 0) + { + SubmenuIndex--; + } + else + { + // Wrap around. + SubmenuIndex = (N_SUBMENUS -1); + } + + if (Submenus[SubmenuIndex]->OnFocus != NULL) + { + Submenus[SubmenuIndex]->OnFocus(false); + } +} diff --git a/2020TPCApp1.cydsn/Menu/GameSettings/GameMenuItem.h b/2020TPCApp1.cydsn/Menu/GameSettings/GameMenuItem.h new file mode 100644 index 0000000..675ea18 --- /dev/null +++ b/2020TPCApp1.cydsn/Menu/GameSettings/GameMenuItem.h @@ -0,0 +1,6 @@ +#ifndef GAMEMENUITEM_H +#define GAMEMENUITEM_H + +const MenuItem_T GameMenuItem; + +#endif // GAMEMENUITEM_H diff --git a/2020TPCApp1.cydsn/Menu/GameSettings/PlayerIDMenuItem.c b/2020TPCApp1.cydsn/Menu/GameSettings/PlayerIDMenuItem.c new file mode 100644 index 0000000..dc79ccd --- /dev/null +++ b/2020TPCApp1.cydsn/Menu/GameSettings/PlayerIDMenuItem.c @@ -0,0 +1,66 @@ +/* Include Files */ +#include "KTag.h" + +#define MIN_PLAYER_ID 0b0000000 +#define MAX_PLAYER_ID 0b1111111 + +static void OnFocus(bool IncludeDetails); +static MenuItem_T const * OnSelect(); +static void OnIncrement(); +static void OnDecrement(); + +const MenuItem_T PlayerIDMenuItem = +{ + .OnFocus = OnFocus, + .OnSelect = OnSelect, + .OnIncrement = OnIncrement, + .OnDecrement = OnDecrement + +}; + +static void OnFocus(bool IncludeDetails) +{ + AudioAction_T audio_action = {.ID = AUDIO_PLAY_PLAYER_ID_PROMPT, .Play_To_Completion = true, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + + if (IncludeDetails == true) + { + AudioAction_T volume_action = {.ID = AUDIO_PRONOUNCE_NUMBER_0_TO_100, .Play_To_Completion = true, .Data = (void *)&NVM_PLAYER_ID}; + xQueueSend(xQueueAudio, &volume_action, 0); + } +} + +static MenuItem_T const * OnSelect() +{ + AudioAction_T audio_action = {.ID = AUDIO_PLAY_SELECTION_INDICATOR, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + return NULL; +} + +static void OnIncrement() +{ + if (NVM_PLAYER_ID < MAX_PLAYER_ID) + { + NVM_PLAYER_ID++; + } + + AudioAction_T audio_action = {.ID = AUDIO_PLAY_PLAYER_ID_PROMPT, .Play_To_Completion = true, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + + AudioAction_T volume_action = {.ID = AUDIO_PRONOUNCE_NUMBER_0_TO_100, .Play_To_Completion = true, .Data = (void *)&NVM_PLAYER_ID}; + xQueueSend(xQueueAudio, &volume_action, 0); +} + +static void OnDecrement() +{ + if (NVM_PLAYER_ID > MIN_PLAYER_ID) + { + NVM_PLAYER_ID--; + } + + AudioAction_T audio_action = {.ID = AUDIO_PLAY_PLAYER_ID_PROMPT, .Play_To_Completion = true, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + + AudioAction_T volume_action = {.ID = AUDIO_PRONOUNCE_NUMBER_0_TO_100, .Play_To_Completion = true, .Data = (void *)&NVM_PLAYER_ID}; + xQueueSend(xQueueAudio, &volume_action, 0); +} \ No newline at end of file diff --git a/2020TPCApp1.cydsn/Menu/GameSettings/PlayerIDMenuItem.h b/2020TPCApp1.cydsn/Menu/GameSettings/PlayerIDMenuItem.h new file mode 100644 index 0000000..b18453c --- /dev/null +++ b/2020TPCApp1.cydsn/Menu/GameSettings/PlayerIDMenuItem.h @@ -0,0 +1,6 @@ +#ifndef PLAYERIDMENUITEM_H +#define PLAYERIDMENUITEM_H + +const MenuItem_T PlayerIDMenuItem; + +#endif // PLAYERIDMENUITEM_H diff --git a/2020TPCApp1.cydsn/Menu/GameSettings/TeamIDMenuItem.c b/2020TPCApp1.cydsn/Menu/GameSettings/TeamIDMenuItem.c new file mode 100644 index 0000000..a16f807 --- /dev/null +++ b/2020TPCApp1.cydsn/Menu/GameSettings/TeamIDMenuItem.c @@ -0,0 +1,66 @@ +/* Include Files */ +#include "KTag.h" + +#define MIN_TEAM_ID 0 +#define MAX_TEAM_ID 3 + +static void OnFocus(bool IncludeDetails); +static MenuItem_T const * OnSelect(); +static void OnIncrement(); +static void OnDecrement(); + +const MenuItem_T TeamIDMenuItem = +{ + .OnFocus = OnFocus, + .OnSelect = OnSelect, + .OnIncrement = OnIncrement, + .OnDecrement = OnDecrement + +}; + +static void OnFocus(bool IncludeDetails) +{ + AudioAction_T audio_action = {.ID = AUDIO_PLAY_TEAM_ID_PROMPT, .Play_To_Completion = true, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + + if (IncludeDetails == true) + { + AudioAction_T volume_action = {.ID = AUDIO_PRONOUNCE_NUMBER_0_TO_100, .Play_To_Completion = true, .Data = (void *)&NVM_TEAM_ID}; + xQueueSend(xQueueAudio, &volume_action, 0); + } +} + +static MenuItem_T const * OnSelect() +{ + AudioAction_T audio_action = {.ID = AUDIO_PLAY_SELECTION_INDICATOR, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + return NULL; +} + +static void OnIncrement() +{ + if (NVM_TEAM_ID < MAX_TEAM_ID) + { + NVM_TEAM_ID++; + } + + AudioAction_T audio_action = {.ID = AUDIO_PLAY_TEAM_ID_PROMPT, .Play_To_Completion = true, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + + AudioAction_T volume_action = {.ID = AUDIO_PRONOUNCE_NUMBER_0_TO_100, .Play_To_Completion = true, .Data = (void *)&NVM_TEAM_ID}; + xQueueSend(xQueueAudio, &volume_action, 0); +} + +static void OnDecrement() +{ + if (NVM_TEAM_ID > MIN_TEAM_ID) + { + NVM_TEAM_ID--; + } + + AudioAction_T audio_action = {.ID = AUDIO_PLAY_TEAM_ID_PROMPT, .Play_To_Completion = true, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + + AudioAction_T volume_action = {.ID = AUDIO_PRONOUNCE_NUMBER_0_TO_100, .Play_To_Completion = true, .Data = (void *)&NVM_TEAM_ID}; + xQueueSend(xQueueAudio, &volume_action, 0); +} \ No newline at end of file diff --git a/2020TPCApp1.cydsn/Menu/GameSettings/TeamIDMenuItem.h b/2020TPCApp1.cydsn/Menu/GameSettings/TeamIDMenuItem.h new file mode 100644 index 0000000..f5df1a2 --- /dev/null +++ b/2020TPCApp1.cydsn/Menu/GameSettings/TeamIDMenuItem.h @@ -0,0 +1,6 @@ +#ifndef TEAMIDMENUITEM_H +#define TEAMIDMENUITEM_H + +const MenuItem_T TeamIDMenuItem; + +#endif // TEAMIDMENUITEM_H diff --git a/2020TPCApp1.cydsn/Menu/HardwareSettings/HandedMenuItem.c b/2020TPCApp1.cydsn/Menu/HardwareSettings/HandedMenuItem.c new file mode 100644 index 0000000..aeab8ac --- /dev/null +++ b/2020TPCApp1.cydsn/Menu/HardwareSettings/HandedMenuItem.c @@ -0,0 +1,64 @@ +/* Include Files */ +#include "KTag.h" + +static void OnFocus(bool IncludeDetails); +static MenuItem_T const * OnSelect(); +static void OnIncrement(); +static void OnDecrement(); +static void ToggleHanded(); + +const MenuItem_T HandedMenuItem = +{ + .OnFocus = OnFocus, + .OnSelect = OnSelect, + .OnIncrement = OnIncrement, + .OnDecrement = OnDecrement + +}; + +static void OnFocus(bool IncludeDetails) +{ + if (NVM_IS_RIGHT_HANDED == true) + { + AudioAction_T audio_action = {.ID = AUDIO_PLAY_RIGHT_HANDED, .Play_To_Completion = true, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + } + else + { + AudioAction_T audio_action = {.ID = AUDIO_PLAY_LEFT_HANDED, .Play_To_Completion = true, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + } +} + +static MenuItem_T const * OnSelect() +{ + AudioAction_T audio_action = {.ID = AUDIO_PLAY_SELECTION_INDICATOR, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + return NULL; +} + +static void OnIncrement() +{ + ToggleHanded(); +} + +static void OnDecrement() +{ + ToggleHanded(); +} + +static void ToggleHanded() +{ + if (NVM_IS_RIGHT_HANDED == true) + { + NVM_IS_RIGHT_HANDED = false; + AudioAction_T audio_action = {.ID = AUDIO_PLAY_LEFT_HANDED, .Play_To_Completion = true, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + } + else + { + NVM_IS_RIGHT_HANDED = true; + AudioAction_T audio_action = {.ID = AUDIO_PLAY_RIGHT_HANDED, .Play_To_Completion = true, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + } +} diff --git a/2020TPCApp1.cydsn/Menu/HardwareSettings/HandedMenuItem.h b/2020TPCApp1.cydsn/Menu/HardwareSettings/HandedMenuItem.h new file mode 100644 index 0000000..e68953a --- /dev/null +++ b/2020TPCApp1.cydsn/Menu/HardwareSettings/HandedMenuItem.h @@ -0,0 +1,6 @@ +#ifndef HANDEDMENUITEM_H +#define HANDEDMENUITEM_H + +const MenuItem_T HandedMenuItem; + +#endif // VOLUMEMENUITEM_H diff --git a/2020TPCApp1.cydsn/Menu/HardwareSettings/HardwareMenuItem.c b/2020TPCApp1.cydsn/Menu/HardwareSettings/HardwareMenuItem.c new file mode 100644 index 0000000..389f887 --- /dev/null +++ b/2020TPCApp1.cydsn/Menu/HardwareSettings/HardwareMenuItem.c @@ -0,0 +1,79 @@ +/* Include Files */ +#include "KTag.h" + +static uint8_t SubmenuIndex = 0; +static MenuItem_T const * const Submenus[] = +{ + &VolumeMenuItem, + &HandedMenuItem +}; +static const uint8_t N_SUBMENUS = (sizeof(Submenus) / sizeof(MenuItem_T *)); + +static void OnFocus(bool IncludeDetails); +static MenuItem_T const * OnSelect(); +static void OnIncrement(); +static void OnDecrement(); + +const MenuItem_T HardwareMenuItem = +{ + .OnFocus = OnFocus, + .OnSelect = OnSelect, + .OnIncrement = OnIncrement, + .OnDecrement = OnDecrement + +}; + +static void OnFocus(bool IncludeDetails) +{ + AudioAction_T audio_action = {.ID = AUDIO_PLAY_HARDWARE_SETTINGS_PROMPT, .Play_To_Completion = true, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + + if (IncludeDetails == true) + { + if (Submenus[SubmenuIndex]->OnFocus != NULL) + { + Submenus[SubmenuIndex]->OnFocus(false); + } + } +} + +static MenuItem_T const * OnSelect() +{ + return Submenus[SubmenuIndex]; +} + +static void OnIncrement() +{ + if (SubmenuIndex < (N_SUBMENUS -1)) + { + SubmenuIndex++; + } + else + { + // Wrap around. + SubmenuIndex = 0; + } + + if (Submenus[SubmenuIndex]->OnFocus != NULL) + { + Submenus[SubmenuIndex]->OnFocus(false); + } +} + +static void OnDecrement() +{ + if (SubmenuIndex > 0) + { + SubmenuIndex--; + } + else + { + // Wrap around. + SubmenuIndex = (N_SUBMENUS -1); + } + + if (Submenus[SubmenuIndex]->OnFocus != NULL) + { + Submenus[SubmenuIndex]->OnFocus(false); + } +} \ No newline at end of file diff --git a/2020TPCApp1.cydsn/Menu/HardwareSettings/HardwareMenuItem.h b/2020TPCApp1.cydsn/Menu/HardwareSettings/HardwareMenuItem.h new file mode 100644 index 0000000..eef5484 --- /dev/null +++ b/2020TPCApp1.cydsn/Menu/HardwareSettings/HardwareMenuItem.h @@ -0,0 +1,6 @@ +#ifndef HARDWAREMENUITEM_H +#define HARDWAREMENUITEM_H + +const MenuItem_T HardwareMenuItem; + +#endif // HARDWAREMENUITEM_H diff --git a/2020TPCApp1.cydsn/Menu/HardwareSettings/VolumeMenuItem.c b/2020TPCApp1.cydsn/Menu/HardwareSettings/VolumeMenuItem.c new file mode 100644 index 0000000..88650c2 --- /dev/null +++ b/2020TPCApp1.cydsn/Menu/HardwareSettings/VolumeMenuItem.c @@ -0,0 +1,72 @@ +/* Include Files */ +#include "KTag.h" + +#define MAX_VOLUME 30 +#define MIN_VOLUME 5 + +static void OnFocus(bool IncludeDetails); +static MenuItem_T const * OnSelect(); +static void OnIncrement(); +static void OnDecrement(); + +const MenuItem_T VolumeMenuItem = +{ + .OnFocus = OnFocus, + .OnSelect = OnSelect, + .OnIncrement = OnIncrement, + .OnDecrement = OnDecrement + +}; + +static void OnFocus(bool IncludeDetails) +{ + AudioAction_T audio_action = {.ID = AUDIO_PLAY_VOLUME_PROMPT, .Play_To_Completion = true, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + + if (IncludeDetails == true) + { + AudioAction_T volume_action = {.ID = AUDIO_PRONOUNCE_NUMBER_0_TO_100, .Play_To_Completion = true, .Data = (void *)&NVM_VOLUME}; + xQueueSend(xQueueAudio, &volume_action, 0); + } +} + +static MenuItem_T const * OnSelect() +{ + AudioAction_T audio_action = {.ID = AUDIO_PLAY_SELECTION_INDICATOR, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + return NULL; +} + +static void OnIncrement() +{ + if (NVM_VOLUME < MAX_VOLUME) + { + NVM_VOLUME++; + } + + AudioAction_T set_volume_action = {.ID = AUDIO_SET_VOLUME, .Data = (void *)&NVM_VOLUME}; + xQueueSend(xQueueAudio, &set_volume_action, 0); + + AudioAction_T audio_action = {.ID = AUDIO_PLAY_VOLUME_PROMPT, .Play_To_Completion = true, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + + AudioAction_T volume_action = {.ID = AUDIO_PRONOUNCE_NUMBER_0_TO_100, .Play_To_Completion = true, .Data = (void *)&NVM_VOLUME}; + xQueueSend(xQueueAudio, &volume_action, 0); +} + +static void OnDecrement() +{ + if (NVM_VOLUME > MIN_VOLUME) + { + NVM_VOLUME--; + } + + AudioAction_T set_volume_action = {.ID = AUDIO_SET_VOLUME, .Data = (void *)&NVM_VOLUME}; + xQueueSend(xQueueAudio, &set_volume_action, 0); + + AudioAction_T audio_action = {.ID = AUDIO_PLAY_VOLUME_PROMPT, .Play_To_Completion = true, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + + AudioAction_T volume_action = {.ID = AUDIO_PRONOUNCE_NUMBER_0_TO_100, .Play_To_Completion = true, .Data = (void *)&NVM_VOLUME}; + xQueueSend(xQueueAudio, &volume_action, 0); +} \ No newline at end of file diff --git a/2020TPCApp1.cydsn/Menu/HardwareSettings/VolumeMenuItem.h b/2020TPCApp1.cydsn/Menu/HardwareSettings/VolumeMenuItem.h new file mode 100644 index 0000000..8766f65 --- /dev/null +++ b/2020TPCApp1.cydsn/Menu/HardwareSettings/VolumeMenuItem.h @@ -0,0 +1,6 @@ +#ifndef VOLUMEMENUITEM_H +#define VOLUMEMENUITEM_H + +const MenuItem_T VolumeMenuItem; + +#endif // VOLUMEMENUITEM_H diff --git a/2020TPCApp1.cydsn/Menu/Menu.c b/2020TPCApp1.cydsn/Menu/Menu.c new file mode 100644 index 0000000..e4c263d --- /dev/null +++ b/2020TPCApp1.cydsn/Menu/Menu.c @@ -0,0 +1,86 @@ +/* Include Files */ +#include "KTag.h" + +static uint8_t SubmenuIndex = 0; +static MenuItem_T const * const Submenus[] = +{ + &GameMenuItem, + &HardwareMenuItem +}; +static const uint8_t N_SUBMENUS = (sizeof(Submenus) / sizeof(MenuItem_T *)); + +static void RootMenuOnFocus(bool IncludeDetails); +static MenuItem_T const * RootMenuOnSelect(); +static void RootMenuOnIncrement(); +static void RootMenuOnDecrement(); + +static const MenuItem_T Root_Menu_Item = +{ + .OnFocus = RootMenuOnFocus, + .OnSelect = RootMenuOnSelect, + .OnIncrement = RootMenuOnIncrement, + .OnDecrement = RootMenuOnDecrement + +}; + +MenuItem_T const * const RootMenu = &Root_Menu_Item; + +static void RootMenuOnFocus(bool IncludeDetails) +{ + AudioAction_T audio_action = {.ID = AUDIO_PLAY_MENU_PROMPT, .Play_To_Completion = true, .Data = (void *)0x00}; + xQueueSend(xQueueAudio, &audio_action, 0); + + if (IncludeDetails == true) + { + if (Submenus[SubmenuIndex]->OnFocus != NULL) + { + Submenus[SubmenuIndex]->OnFocus(false); + } + } +} + +static MenuItem_T const * RootMenuOnSelect() +{ + if (Submenus[SubmenuIndex]->OnSelect != NULL) + { + Submenus[SubmenuIndex]->OnSelect(); + } + + return Submenus[SubmenuIndex]; +} + +static void RootMenuOnIncrement() +{ + if (SubmenuIndex < (N_SUBMENUS -1)) + { + SubmenuIndex++; + } + else + { + // Wrap around. + SubmenuIndex = 0; + } + + if (Submenus[SubmenuIndex]->OnFocus != NULL) + { + Submenus[SubmenuIndex]->OnFocus(false); + } +} + +static void RootMenuOnDecrement() +{ + if (SubmenuIndex > 0) + { + SubmenuIndex--; + } + else + { + // Wrap around. + SubmenuIndex = (N_SUBMENUS -1); + } + + if (Submenus[SubmenuIndex]->OnFocus != NULL) + { + Submenus[SubmenuIndex]->OnFocus(false); + } +} \ No newline at end of file diff --git a/2020TPCApp1.cydsn/Menu/Menu.h b/2020TPCApp1.cydsn/Menu/Menu.h new file mode 100644 index 0000000..ee64501 --- /dev/null +++ b/2020TPCApp1.cydsn/Menu/Menu.h @@ -0,0 +1,28 @@ +#ifndef MENU_H +#define MENU_H + +#include +#include + + +typedef struct MenuItem_S +{ + // Performs the actions required when this MenuItem receives focus. + void (*OnFocus)(bool IncludeDetails); + // Performs the actions required when this MenuItem receives focus. + struct MenuItem_S const * (*OnSelect)(void); + void (*OnIncrement)(void); + void (*OnDecrement)(void); + +} MenuItem_T; + +MenuItem_T const * const RootMenu; + +#include "GameSettings/GameMenuItem.h" +#include "GameSettings/PlayerIDMenuItem.h" +#include "GameSettings/TeamIDMenuItem.h" +#include "HardwareSettings/HardwareMenuItem.h" +#include "HardwareSettings/VolumeMenuItem.h" +#include "HardwareSettings/HandedMenuItem.h" + +#endif // MENU_H diff --git a/2020TPCApp1.cydsn/NVM/NVM.h b/2020TPCApp1.cydsn/NVM/NVM.h new file mode 100644 index 0000000..ffd8cad --- /dev/null +++ b/2020TPCApp1.cydsn/NVM/NVM.h @@ -0,0 +1,105 @@ +/** \dir NVM + * + * \brief Non-Volatile Memory + * + * This directory/namespace contains all the software used to manage non-volatile memory for this CPU. + * + */ + +/** \file + * \brief This file defines the interface to the NVM package. + * + * This file should be included by any file outside the NVM package wishing to make use + * of any of the NVM functionality. + */ + +#ifndef NVM_H +#define NVM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +//! Enumeration of the various states of a nonvolatile memory entry. +typedef enum +{ + //! This entry has not yet been initialized. + NVM_STATE_UNINITIALIZED = 0, + + //! This entry has been read from nonvolatile memory, and the cyclic redundancy check failed. + NVM_STATE_CRC_FAILED, + + //! No changes are pending for this entry. + NVM_STATE_IDLE, + + //! A request has been made to save this entry to NVM. + NVM_STATE_SAVE_REQUESTED +} NVM_Entry_State_T; + + +typedef struct +{ + // Size of the NVM data. + const size_t Size; + + // Address of the NVM data in the EEPROM memory. + const uint16_t EE_Address; + + // Address of the calculated CRC value in the EEPROM memory. + const uint16_t EE_CRC_Address; + + // Address of the NVM data in RAM. + uint8_t * const Value; + + // Address of the default data in ROM. + uint8_t const * const Default; + + // Current state of this NVM entry + NVM_Entry_State_T State; + +} NVM_EEPROMEntry_T; + + +/* Include Files */ +#include "NVM_CRC.h" + +#if (CONFIG__HAS_EXTERNAL_NVM) +#include "NVM_ExternalEEPROM.h" +#include "NVM_ExternalEEPROMEntries.h" +#endif // CONFIG__HAS_EXTERNAL_NVM + +#if (CONFIG__HAS_INTERNAL_NVM) +#include "NVM_OnChipEEPROM.h" +#include "NVM_OnChipEEPROMEntries.h" +#endif // CONFIG__HAS_INTERNAL_NVM + +/* Public Variables */ + +/* Public Functions */ + +inline bool IsNVMInitialized() +{ + taskENTER_CRITICAL(); + bool is_initialized = + +#if (CONFIG__HAS_EXTERNAL_NVM) + NVM_IsExternalEEPROMInitialized && +#endif // CONFIG__HAS_EXTERNAL_NVM + +#if (CONFIG__HAS_INTERNAL_NVM) + NVM_IsOnChipEEPROMInitialized && +#endif // CONFIG__HAS_INTERNAL_NVM + + true; + taskEXIT_CRITICAL(); + + return is_initialized; +} + +#ifdef __cplusplus +} +#endif + +#endif // NVM_H \ No newline at end of file diff --git a/2020TPCApp1.cydsn/NVM/NVM_CRC.c b/2020TPCApp1.cydsn/NVM/NVM_CRC.c new file mode 100644 index 0000000..09a9026 --- /dev/null +++ b/2020TPCApp1.cydsn/NVM/NVM_CRC.c @@ -0,0 +1,72 @@ +/** + * \file + * Functions and types for CRC checks. + * + * Generated on Sat Jun 15 14:34:15 2019 + * by pycrc v0.9.2, https://pycrc.org + * using the configuration: + * - Width = 16 + * - Poly = 0xed2f + * - XorIn = 0xbeef + * - ReflectIn = False + * - XorOut = 0x0000 + * - ReflectOut = False + * - Algorithm = table-driven + */ +#include "NVM_CRC.h" /* include the header file generated with pycrc */ +#include +#include + + + +/** + * Static table used for the table_driven implementation. + */ +static const NVM_CRC_t crc_table[256] = { + 0x0000, 0xed2f, 0x3771, 0xda5e, 0x6ee2, 0x83cd, 0x5993, 0xb4bc, + 0xddc4, 0x30eb, 0xeab5, 0x079a, 0xb326, 0x5e09, 0x8457, 0x6978, + 0x56a7, 0xbb88, 0x61d6, 0x8cf9, 0x3845, 0xd56a, 0x0f34, 0xe21b, + 0x8b63, 0x664c, 0xbc12, 0x513d, 0xe581, 0x08ae, 0xd2f0, 0x3fdf, + 0xad4e, 0x4061, 0x9a3f, 0x7710, 0xc3ac, 0x2e83, 0xf4dd, 0x19f2, + 0x708a, 0x9da5, 0x47fb, 0xaad4, 0x1e68, 0xf347, 0x2919, 0xc436, + 0xfbe9, 0x16c6, 0xcc98, 0x21b7, 0x950b, 0x7824, 0xa27a, 0x4f55, + 0x262d, 0xcb02, 0x115c, 0xfc73, 0x48cf, 0xa5e0, 0x7fbe, 0x9291, + 0xb7b3, 0x5a9c, 0x80c2, 0x6ded, 0xd951, 0x347e, 0xee20, 0x030f, + 0x6a77, 0x8758, 0x5d06, 0xb029, 0x0495, 0xe9ba, 0x33e4, 0xdecb, + 0xe114, 0x0c3b, 0xd665, 0x3b4a, 0x8ff6, 0x62d9, 0xb887, 0x55a8, + 0x3cd0, 0xd1ff, 0x0ba1, 0xe68e, 0x5232, 0xbf1d, 0x6543, 0x886c, + 0x1afd, 0xf7d2, 0x2d8c, 0xc0a3, 0x741f, 0x9930, 0x436e, 0xae41, + 0xc739, 0x2a16, 0xf048, 0x1d67, 0xa9db, 0x44f4, 0x9eaa, 0x7385, + 0x4c5a, 0xa175, 0x7b2b, 0x9604, 0x22b8, 0xcf97, 0x15c9, 0xf8e6, + 0x919e, 0x7cb1, 0xa6ef, 0x4bc0, 0xff7c, 0x1253, 0xc80d, 0x2522, + 0x8249, 0x6f66, 0xb538, 0x5817, 0xecab, 0x0184, 0xdbda, 0x36f5, + 0x5f8d, 0xb2a2, 0x68fc, 0x85d3, 0x316f, 0xdc40, 0x061e, 0xeb31, + 0xd4ee, 0x39c1, 0xe39f, 0x0eb0, 0xba0c, 0x5723, 0x8d7d, 0x6052, + 0x092a, 0xe405, 0x3e5b, 0xd374, 0x67c8, 0x8ae7, 0x50b9, 0xbd96, + 0x2f07, 0xc228, 0x1876, 0xf559, 0x41e5, 0xacca, 0x7694, 0x9bbb, + 0xf2c3, 0x1fec, 0xc5b2, 0x289d, 0x9c21, 0x710e, 0xab50, 0x467f, + 0x79a0, 0x948f, 0x4ed1, 0xa3fe, 0x1742, 0xfa6d, 0x2033, 0xcd1c, + 0xa464, 0x494b, 0x9315, 0x7e3a, 0xca86, 0x27a9, 0xfdf7, 0x10d8, + 0x35fa, 0xd8d5, 0x028b, 0xefa4, 0x5b18, 0xb637, 0x6c69, 0x8146, + 0xe83e, 0x0511, 0xdf4f, 0x3260, 0x86dc, 0x6bf3, 0xb1ad, 0x5c82, + 0x635d, 0x8e72, 0x542c, 0xb903, 0x0dbf, 0xe090, 0x3ace, 0xd7e1, + 0xbe99, 0x53b6, 0x89e8, 0x64c7, 0xd07b, 0x3d54, 0xe70a, 0x0a25, + 0x98b4, 0x759b, 0xafc5, 0x42ea, 0xf656, 0x1b79, 0xc127, 0x2c08, + 0x4570, 0xa85f, 0x7201, 0x9f2e, 0x2b92, 0xc6bd, 0x1ce3, 0xf1cc, + 0xce13, 0x233c, 0xf962, 0x144d, 0xa0f1, 0x4dde, 0x9780, 0x7aaf, + 0x13d7, 0xfef8, 0x24a6, 0xc989, 0x7d35, 0x901a, 0x4a44, 0xa76b +}; + + +NVM_CRC_t NVM_CRC_update(NVM_CRC_t crc, const void *data, size_t data_len) +{ + const unsigned char *d = (const unsigned char *)data; + unsigned int tbl_idx; + + while (data_len--) { + tbl_idx = ((crc >> 8) ^ *d) & 0xff; + crc = (crc_table[tbl_idx] ^ (crc << 8)) & 0xffff; + d++; + } + return crc & 0xffff; +} \ No newline at end of file diff --git a/2020TPCApp1.cydsn/NVM/NVM_CRC.h b/2020TPCApp1.cydsn/NVM/NVM_CRC.h new file mode 100644 index 0000000..bbb2807 --- /dev/null +++ b/2020TPCApp1.cydsn/NVM/NVM_CRC.h @@ -0,0 +1,115 @@ +/** + * \file + * Functions and types for CRC checks. + * + * Generated on Sat Jun 15 14:34:05 2019 + * by pycrc v0.9.2, https://pycrc.org + * using the configuration: + * - Width = 16 + * - Poly = 0xed2f + * - XorIn = 0xbeef + * - ReflectIn = False + * - XorOut = 0x0000 + * - ReflectOut = False + * - Algorithm = table-driven + * + * This file defines the functions NVM_CRC_init(), NVM_CRC_update() and NVM_CRC_finalize(). + * + * The NVM_CRC_init() function returns the inital \c crc value and must be called + * before the first call to NVM_CRC_update(). + * Similarly, the NVM_CRC_finalize() function must be called after the last call + * to NVM_CRC_update(), before the \c crc is being used. + * is being used. + * + * The NVM_CRC_update() function can be called any number of times (including zero + * times) in between the NVM_CRC_init() and NVM_CRC_finalize() calls. + * + * This pseudo-code shows an example usage of the API: + * \code{.c} + * NVM_CRC_t crc; + * unsigned char data[MAX_DATA_LEN]; + * size_t data_len; + * + * crc = NVM_CRC_init(); + * while ((data_len = read_data(data, MAX_DATA_LEN)) > 0) { + * crc = NVM_CRC_update(crc, data, data_len); + * } + * crc = NVM_CRC_finalize(crc); + * \endcode + * + * ## Additional Notes + * + * The CRC polynomial (0xED2F) was chosen based on the research published by Philip Koopman of Carnegie Mellon + * University [here](http://users.ece.cmu.edu/~koopman/crc/). Dr. Koopman claims this polynomial has a + * Hamming Distance of 10. + * + * The initial value, 0xBEEF, was chosen simply to avoid the most common EE values of 0xFFFF and 0x0000. + * + */ +#ifndef NVM_CRC_H +#define NVM_CRC_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * The definition of the used algorithm. + * + * This is not used anywhere in the generated code, but it may be used by the + * application code to call algorithm-specific code, if desired. + */ +#define CRC_ALGO_TABLE_DRIVEN 1 + + +/** + * The type of the CRC values. + * + * CRCs are sixteen bits wide. + */ +typedef uint16_t NVM_CRC_t; + + +/** + * Calculate the initial crc value. + * + * \return The initial crc value. + */ +static inline NVM_CRC_t NVM_CRC_init(void) +{ + return 0xbeef; +} + + +/** + * Update the crc value with new data. + * + * \param[in] crc The current crc value. + * \param[in] data Pointer to a buffer of \a data_len bytes. + * \param[in] data_len Number of bytes in the \a data buffer. + * \return The updated crc value. + */ +NVM_CRC_t NVM_CRC_update(NVM_CRC_t crc, const void *data, size_t data_len); + + +/** + * Calculate the final crc value. + * + * \param[in] crc The current crc value. + * \return The final crc value. + */ +static inline NVM_CRC_t NVM_CRC_finalize(NVM_CRC_t crc) +{ + return crc; +} + + +#ifdef __cplusplus +} /* closing brace for extern "C" */ +#endif + +#endif /* NVM_CRC_H */ \ No newline at end of file diff --git a/2020TPCApp1.cydsn/NVM/NVM_ExternalEEPROM.c b/2020TPCApp1.cydsn/NVM/NVM_ExternalEEPROM.c new file mode 100644 index 0000000..84cf845 --- /dev/null +++ b/2020TPCApp1.cydsn/NVM/NVM_ExternalEEPROM.c @@ -0,0 +1,302 @@ +/** \file + * \brief This file contains functions that manage the external EEPROM. + * + */ + +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +//! This is the same for both the MCP98243 and the CAT24C256. +#define EXTERNAL_EEPROM_I2C_ADDRESS 0x50 +#define EXTERNAL_EEPROM_TEMP_SENSOR_I2C_ADDRESS 0x18 + +//! Read-only register used to identify the temperature sensor capability. +#define MCP98243_REGISTER_CAPABILITY 0x00 +//! Sensor configuration register. +#define MCP98243_REGISTER_CONFIG 0x01 +//! Upper temperature limit register. +#define MCP98243_REGISTER_T_UPPER 0x02 +//! Lower temperature limit register. +#define MCP98243_REGISTER_T_LOWER 0x03 +//! Critical temperature limit register. +#define MCP98243_REGISTER_T_CRIT 0x04 +//! Ambient temperature register. +#define MCP98243_REGISTER_T_A 0x05 +//! Read-only register used to identify the manufacturer of the device. +#define MCP98243_REGISTER_MANUFACTURER_ID 0x06 +//! Read-only register indicating the device identification and device revision. +#define MCP98243_REGISTER_DEVICE_ID 0x07 +//! Temperature sensor resolution register. +#define MCP98243_REGISTER_RESOLUTION 0x08 + + +/* External Variables [Only if necessary!] */ + +/* External Function Prototypes [Only if necessary!] */ + +/* Public Variables */ + +//! Mutex controlling access to the EEPROM to ensure data/CRC integrity. +SemaphoreHandle_t xSemaphoreExternalEEPROMLock; + +TaskHandle_t NVM_ExternalEEPROM_Task_Handle; + +volatile bool NVM_IsExternalEEPROMInitialized = false; + +/* Private Variables */ + +static QueueHandle_t xQueueExternalEEPROM; + +//! Shared master transfer configuration variable. +static cy_stc_scb_i2c_master_xfer_config_t Master_Transfer_Config = +{ + .slaveAddress = EXTERNAL_EEPROM_I2C_ADDRESS, + .buffer = NULL, + .bufferSize = 0U, + .xferPending = false +}; + + +/* Private Function Prototypes */ + +/* Inline Functions */ + +//! Waits a given time for an I²C transfer to complete. +/*! + * \param timeout_in_ms The time (in milliseconds) to wait for the transfer to complete. + * \return #true if the transfer completed, or #false if the time ran out without + * a successful transfer. + */ +static inline bool Wait_For_Transfer_To_Complete(uint16_t timeout_in_ms) +{ + bool success = false; + + // Time to wait for an in-process transfer before looking again. This wait grows longer as time + // passes, until timeout_in_ms runs out. + uint16_t HOLDOFF_TIME_IN_ms = 1; + + while ((success == false) && (timeout_in_ms > 0)) + { + vTaskDelay(pdMS_TO_TICKS(HOLDOFF_TIME_IN_ms)); + + if (timeout_in_ms > HOLDOFF_TIME_IN_ms) + { + timeout_in_ms -= HOLDOFF_TIME_IN_ms; + + // Wait a little longer next time. + HOLDOFF_TIME_IN_ms++; + } + else + { + timeout_in_ms = 0; + } + + if ((I2C_MasterGetStatus() & CY_SCB_I2C_MASTER_BUSY) != CY_SCB_I2C_MASTER_BUSY) + { + success = true; + } + } + + return success; +} + +//! Reads a block of \a n bytes from EEPROM address \a source to SRAM \a destination. +static inline void EEPROM_read_block(uint8_t * destination, uint16_t source, size_t n) +{ + uint8_t xfer_buffer[5]; + + if (xSemaphoreTake(COMM_I2C_Bus_Mutex, portMAX_DELAY) == pdTRUE) + { + // Write the initial address to the EEPROM. + xfer_buffer[0] = (source >> 8); + xfer_buffer[1] = source & 0xFF; + + Master_Transfer_Config.buffer = (uint8_t *)xfer_buffer; + Master_Transfer_Config.bufferSize = 2; + + cy_en_scb_i2c_status_t errStatus = I2C_MasterWrite(&Master_Transfer_Config); + + if (errStatus == CY_SCB_I2C_SUCCESS) + { + (void) Wait_For_Transfer_To_Complete(100); + } + else + { + // What? + } + + // Read n bytes at EEPROM[source]. + Master_Transfer_Config.buffer = (uint8_t *)destination; + Master_Transfer_Config.bufferSize = n; + + errStatus = I2C_MasterRead(&Master_Transfer_Config); + + if (errStatus == CY_SCB_I2C_SUCCESS) + { + (void) Wait_For_Transfer_To_Complete(100); + } + else + { + // What? + } + + xSemaphoreGive(COMM_I2C_Bus_Mutex); + } +} + +//! Writes a block of \a n bytes from SRAM \a source to EEPROM address \a destination. +static inline void EEPROM_write_block(uint8_t * source, uint16_t destination, size_t n) +{ + uint8_t xfer_buffer[4]; + + if (xSemaphoreTake(COMM_I2C_Bus_Mutex, portMAX_DELAY) == pdTRUE) + { + // Write the data one byte at a time. + for (uint8_t i = 0; i < n; i++) + { + uint16_t destination_address = destination + i; + xfer_buffer[0] = (destination_address >> 8); + xfer_buffer[1] = destination_address & 0xFF; + xfer_buffer[2] = *(source + i); + + Master_Transfer_Config.buffer = (uint8_t *)xfer_buffer; + Master_Transfer_Config.bufferSize = 3; + + cy_en_scb_i2c_status_t errStatus = I2C_MasterWrite(&Master_Transfer_Config); + + if (errStatus == CY_SCB_I2C_SUCCESS) + { + (void) Wait_For_Transfer_To_Complete(100); + } + else + { + // What? + } + + // The CAT24C256 has a nominal Write Cycle time (t_WR) of 5ms (no maximum specified). + // Wait 6ms between writes to have some margin (and avoid being NAKed). + vTaskDelay(pdMS_TO_TICKS(6)); + } + + xSemaphoreGive(COMM_I2C_Bus_Mutex); + } +} + + +/* Public Functions */ + +//! Sets up the external EEPROM, but does not read from it (yet). +void NVM_InitExternalEEPROM(void) +{ + /// Create a mutex-type semaphore. + xSemaphoreExternalEEPROMLock = xSemaphoreCreateMutex(); + + if (xSemaphoreExternalEEPROMLock == NULL) + { + CY_ASSERT(0); + } + + xQueueExternalEEPROM = xQueueCreate(5, sizeof(uint8_t)); +} + +//! Handles the ongoing external EEPROM tasks. +/*! + * First, it loops through all the external EEPROM entries, and reads them in to RAM. + * Then, it priodically loops through all the external EEPROM entries, and saves the ones that have been flagged. + */ +void NVM_ExternalEEPROMTask(void * pvParameters) +{ + portBASE_TYPE xStatus; + static TickType_t xTicksToWait = pdMS_TO_TICKS(NVM_EXTERNAL_EEPROM_TASK_RATE_IN_ms); + + for (uint8_t i = 0; i < NVM_N_EXTERNAL_EEPROM_ENTRIES; i++) + { + NVM_CRC_t calculated_crc; + NVM_CRC_t stored_crc = 0; + + EEPROM_read_block(NVM_ExternalEEPROMEntries[i]->Value, NVM_ExternalEEPROMEntries[i]->EE_Address, NVM_ExternalEEPROMEntries[i]->Size); + EEPROM_read_block((uint8_t *)&stored_crc, NVM_ExternalEEPROMEntries[i]->EE_CRC_Address, sizeof(NVM_CRC_t)); + + calculated_crc = NVM_CRC_init(); + calculated_crc = NVM_CRC_update(calculated_crc, NVM_ExternalEEPROMEntries[i]->Value, NVM_ExternalEEPROMEntries[i]->Size); + calculated_crc = NVM_CRC_finalize(calculated_crc); + + if (calculated_crc == stored_crc) + { + NVM_ExternalEEPROMEntries[i]->State = NVM_STATE_IDLE; + } + else + { + NVM_ExternalEEPROMEntries[i]->State = NVM_STATE_CRC_FAILED; + + COMM_Console_Print_String("[NVMEx "); + COMM_Console_Print_UInt16((uint16_t) i); + COMM_Console_Print_String("] Calculated/Stored CRCs: "); + COMM_Console_Print_UInt16((uint16_t) calculated_crc); + COMM_Console_Print_String("/"); + COMM_Console_Print_UInt16((uint16_t) stored_crc); + COMM_Console_Print_String("\n"); + + COMM_Console_Print_String("[NVMEx "); + COMM_Console_Print_UInt16((uint16_t) i); + COMM_Console_Print_String("] Applying defaults.\n"); + + memcpy(NVM_ExternalEEPROMEntries[i]->Value, NVM_ExternalEEPROMEntries[i]->Default, NVM_ExternalEEPROMEntries[i]->Size); + + // Auto-fix the CRC. + NVM_SaveExternalEEPROMEntry(NVM_ExternalEEPROMEntries[i]); + } + } + + taskENTER_CRITICAL(); + NVM_IsExternalEEPROMInitialized = true; + taskEXIT_CRITICAL(); + + while(true) + { + uint8_t dummy; + + // Wait for a call to NVM_SaveExternalEEPROMEntry(). + xStatus = xQueueReceive(xQueueExternalEEPROM, &dummy, xTicksToWait); + + if (xStatus == pdPASS) + { + for (uint8_t i = 0; i < NVM_N_EXTERNAL_EEPROM_ENTRIES; i++) + { + NVM_CRC_t crc; + + if (NVM_ExternalEEPROMEntries[i]->State == NVM_STATE_SAVE_REQUESTED) + { + if (xSemaphoreTake(xSemaphoreExternalEEPROMLock, portMAX_DELAY) == pdTRUE) + { + EEPROM_write_block(NVM_ExternalEEPROMEntries[i]->Value, NVM_ExternalEEPROMEntries[i]->EE_Address, NVM_ExternalEEPROMEntries[i]->Size); + + // Calculate the CRC. + crc = NVM_CRC_init(); + crc = NVM_CRC_update(crc, NVM_ExternalEEPROMEntries[i]->Value, NVM_ExternalEEPROMEntries[i]->Size); + crc = NVM_CRC_finalize(crc); + EEPROM_write_block((uint8_t *)&crc, NVM_ExternalEEPROMEntries[i]->EE_CRC_Address, sizeof(uint16_t)); + NVM_ExternalEEPROMEntries[i]->State = NVM_STATE_IDLE; + xSemaphoreGive(xSemaphoreExternalEEPROMLock); + } + } + } + } + } +} + +//! Flags the given external EEPROM entry to be saved next time the NVM_ExternalEEPROMTask() is run. +void NVM_SaveExternalEEPROMEntry(NVM_EEPROMEntry_T * const this) +{ + if (xSemaphoreTake(xSemaphoreExternalEEPROMLock, portMAX_DELAY) == pdTRUE) + { + this->State = NVM_STATE_SAVE_REQUESTED; + xSemaphoreGive(xSemaphoreExternalEEPROMLock); + uint8_t dummy = 0; + xQueueSend(xQueueExternalEEPROM, &dummy, 0); + } +} + +/* Private Functions */ diff --git a/2020TPCApp1.cydsn/NVM/NVM_ExternalEEPROM.h b/2020TPCApp1.cydsn/NVM/NVM_ExternalEEPROM.h new file mode 100644 index 0000000..afa7440 --- /dev/null +++ b/2020TPCApp1.cydsn/NVM/NVM_ExternalEEPROM.h @@ -0,0 +1,44 @@ +/** \file + * \brief This file contains the public interface to the external EEPROM. + * + * On the 2020TPC, the external EEPROM is the Onsemi [CAT24C256](https://www.onsemi.com/pdf/datasheet/cat24c256-d.pdf). + * + */ + +#ifndef NVM_EXTERNALEEPROM_H +#define NVM_EXTERNALEEPROM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +#define NVM_EXTERNAL_EEPROM_TASK_STACK_SIZE_in_bytes 256 + +//! The time between calls to NVM_ExternalEEPROMTask(). +#define NVM_EXTERNAL_EEPROM_TASK_RATE_IN_ms 2000 + +/* Include Files */ + +/* Public Variables */ + +extern SemaphoreHandle_t xSemaphoreExternalEEPROMLock; + +//! Handle of the NVM_ExternalEEPROMTask() given when the task was created. +extern TaskHandle_t NVM_ExternalEEPROM_Task_Handle; + +extern volatile bool NVM_IsExternalEEPROMInitialized; + +/* Public Functions */ +void NVM_InitExternalEEPROM(void); +void NVM_ExternalEEPROMTask(void * pvParameters); +void NVM_SaveExternalEEPROMEntry(NVM_EEPROMEntry_T * const this); + +/* Inline Functions */ + +#ifdef __cplusplus +} +#endif + +#endif // NVM_EXTERNALEEPROM_H diff --git a/2020TPCApp1.cydsn/NVM/NVM_ExternalEEPROMEntries.c b/2020TPCApp1.cydsn/NVM/NVM_ExternalEEPROMEntries.c new file mode 100644 index 0000000..832da53 --- /dev/null +++ b/2020TPCApp1.cydsn/NVM/NVM_ExternalEEPROMEntries.c @@ -0,0 +1,153 @@ +/* + * __ ________ _____ ______ __ + * / //_/_ __/___ _____ _ / ___/____ __ _______________ / ____/___ ____/ /__ + * / ,< / / / __ `/ __ `/ \__ \/ __ \/ / / / ___/ ___/ _ \ / / / __ \/ __ / _ \ + * / /| | / / / /_/ / /_/ / ___/ / /_/ / /_/ / / / /__/ __/ / /___/ /_/ / /_/ / __/ + * /_/ |_|/_/ \__,_/\__, / /____/\____/\__,_/_/ \___/\___/ \____/\____/\__,_/\___/ + * /____/ + * + * 🃞 THIS FILE IS PART OF THE KTAG SOURCE CODE. Visit https://ktag.clubk.club/ for more. 🃞 + * + */ + +/** \file + * \brief [Autogenerated] This file defines the External EEPROM entries. + * + * \note AUTOGENERATED: This file was generated automatically on Friday, April 28, 2023 at 11:31:31 AM. + * DO NOT MODIFY THIS FILE MANUALLY! + */ + +/* Include Files */ +#include "KTag.h" + +/* EEPROM Entries */ + +/** \defgroup NVM_EXTERNAL_EEPROM NVM External EEPROM + * + * The External EEPROM is divided into logical "entries", represented by instances of the #NVM_EEPROMEntry_T type. + * At startup, these entries are loaded into their respective RAM copies by NVM_InitExternalEEPROM(). The application + * then updates the RAM copies directly, and requests that the NVM_ExternalEEPROMTask() save these back to the EEPROM + * when necessary. + * @{ */ + +static NVM_External_Test_T RAM_External_Test; + +static const NVM_External_Test_T DEFAULT_External_Test = +{ + //! Test Code 3 + .External_Test_3 = UINT16_MAX, + //! Test Code 4 + .External_Test_4 = UINT32_MAX, +}; + +NVM_EEPROMEntry_T NVM_External_Test = +{ + //! Size == sizeof(NVM_External_Test_T) + .Size = 6, + .EE_Address = 0, + .EE_CRC_Address = 6, + .Value = (uint8_t *)&RAM_External_Test, + .Default = (uint8_t *)&DEFAULT_External_Test, + .State = NVM_STATE_UNINITIALIZED +}; +static NVM_Info_T RAM_Info; + +static const NVM_Info_T DEFAULT_Info = +{ + //! Date this unit was first programmed. + .Date_Code_as_YYYYMMDD = 20200101, +}; + +NVM_EEPROMEntry_T NVM_Info = +{ + //! Size == sizeof(NVM_Info_T) + .Size = 4, + .EE_Address = 8, + .EE_CRC_Address = 12, + .Value = (uint8_t *)&RAM_Info, + .Default = (uint8_t *)&DEFAULT_Info, + .State = NVM_STATE_UNINITIALIZED +}; +static NVM_Hardware_Settings_T RAM_Hardware_Settings; + +static const NVM_Hardware_Settings_T DEFAULT_Hardware_Settings = +{ + //! Color order for the barrel Neopixels. + .Barrel_Color_Order = 2, + //! Color order for the receiver NeoPixels. + .Receiver_Color_Order = 0, + //! Color order for the display NeoPixels. + .Display_Color_Order = 2, + //! Color order for the effects NeoPixels. + .Effects_Color_Order = 2, + //! true if this unit is configured for a right-handed person; false if for a left-handed person. + .Is_Right_Handed = true, + //! Audio volume. + .Volume = 20, +}; + +NVM_EEPROMEntry_T NVM_Hardware_Settings = +{ + //! Size == sizeof(NVM_Hardware_Settings_T) + .Size = 6, + .EE_Address = 14, + .EE_CRC_Address = 20, + .Value = (uint8_t *)&RAM_Hardware_Settings, + .Default = (uint8_t *)&DEFAULT_Hardware_Settings, + .State = NVM_STATE_UNINITIALIZED +}; +static NVM_Game_Settings_T RAM_Game_Settings; + +static const NVM_Game_Settings_T DEFAULT_Game_Settings = +{ + //! Selected weapon. + .Weapon_ID = LASER_X_ID, + //! Player identification (is this used?) + .Player_ID = 0, + //! Selected team. + .Team_ID = 1, +}; + +NVM_EEPROMEntry_T NVM_Game_Settings = +{ + //! Size == sizeof(NVM_Game_Settings_T) + .Size = 3, + .EE_Address = 22, + .EE_CRC_Address = 25, + .Value = (uint8_t *)&RAM_Game_Settings, + .Default = (uint8_t *)&DEFAULT_Game_Settings, + .State = NVM_STATE_UNINITIALIZED +}; +static NVM_Hourmeter_T RAM_Hourmeter; + +static const NVM_Hourmeter_T DEFAULT_Hourmeter = +{ + //! Total number of startups for this unit. + .Hourmeter_Startups = 0, +}; + +NVM_EEPROMEntry_T NVM_Hourmeter = +{ + //! Size == sizeof(NVM_Hourmeter_T) + .Size = 2, + .EE_Address = 27, + .EE_CRC_Address = 29, + .Value = (uint8_t *)&RAM_Hourmeter, + .Default = (uint8_t *)&DEFAULT_Hourmeter, + .State = NVM_STATE_UNINITIALIZED +}; + +/** @} */ + +NVM_EEPROMEntry_T * const NVM_ExternalEEPROMEntries[] = +{ + &NVM_External_Test, + &NVM_Info, + &NVM_Hardware_Settings, + &NVM_Game_Settings, + &NVM_Hourmeter, +}; + +//! Size of the #NVM_ExternalEEPROMEntries array (i.e. the number of External EEPROM entries). +const uint8_t NVM_N_EXTERNAL_EEPROM_ENTRIES = (uint8_t) (sizeof(NVM_ExternalEEPROMEntries) / sizeof(NVM_EEPROMEntry_T *)); + diff --git a/2020TPCApp1.cydsn/NVM/NVM_ExternalEEPROMEntries.h b/2020TPCApp1.cydsn/NVM/NVM_ExternalEEPROMEntries.h new file mode 100644 index 0000000..61d7103 --- /dev/null +++ b/2020TPCApp1.cydsn/NVM/NVM_ExternalEEPROMEntries.h @@ -0,0 +1,135 @@ +/* + * __ ________ _____ ______ __ + * / //_/_ __/___ _____ _ / ___/____ __ _______________ / ____/___ ____/ /__ + * / ,< / / / __ `/ __ `/ \__ \/ __ \/ / / / ___/ ___/ _ \ / / / __ \/ __ / _ \ + * / /| | / / / /_/ / /_/ / ___/ / /_/ / /_/ / / / /__/ __/ / /___/ /_/ / /_/ / __/ + * /_/ |_|/_/ \__,_/\__, / /____/\____/\__,_/_/ \___/\___/ \____/\____/\__,_/\___/ + * /____/ + * + * 🃞 THIS FILE IS PART OF THE KTAG SOURCE CODE. Visit https://ktag.clubk.club/ for more. 🃞 + * + */ + +/** \file + * \brief [Autogenerated] This file declares the External EEPROM entries. + * + * \note AUTOGENERATED: This file was generated automatically on Friday, April 28, 2023 at 11:31:31 AM. + * DO NOT MODIFY THIS FILE MANUALLY! + */ + +#ifndef NVM_EXTERNALEEPROMENTRIES_H +#define NVM_EXTERNALEEPROMENTRIES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +typedef struct __attribute__((packed)) +{ + //! Test Code 3 + uint16_t External_Test_3; + //! Test Code 4 + uint32_t External_Test_4; +} NVM_External_Test_T; + +typedef struct __attribute__((packed)) +{ + //! Date this unit was first programmed. + uint32_t Date_Code_as_YYYYMMDD; +} NVM_Info_T; + +typedef struct __attribute__((packed)) +{ + //! Color order for the barrel Neopixels. + uint8_t Barrel_Color_Order; + //! Color order for the receiver NeoPixels. + uint8_t Receiver_Color_Order; + //! Color order for the display NeoPixels. + uint8_t Display_Color_Order; + //! Color order for the effects NeoPixels. + uint8_t Effects_Color_Order; + //! true if this unit is configured for a right-handed person; false if for a left-handed person. + bool Is_Right_Handed; + //! Audio volume. + uint8_t Volume; +} NVM_Hardware_Settings_T; + +typedef struct __attribute__((packed)) +{ + //! Selected weapon. + uint8_t Weapon_ID; + //! Player identification (is this used?) + uint8_t Player_ID; + //! Selected team. + uint8_t Team_ID; +} NVM_Game_Settings_T; + +typedef struct __attribute__((packed)) +{ + //! Total number of startups for this unit. + uint16_t Hourmeter_Startups; +} NVM_Hourmeter_T; + + +/* Include Files */ + +/* Public Variables */ + +extern NVM_EEPROMEntry_T NVM_External_Test; +extern NVM_EEPROMEntry_T NVM_Info; +extern NVM_EEPROMEntry_T NVM_Hardware_Settings; +extern NVM_EEPROMEntry_T NVM_Game_Settings; +extern NVM_EEPROMEntry_T NVM_Hourmeter; + +extern NVM_EEPROMEntry_T * const NVM_ExternalEEPROMEntries[]; +extern const uint8_t NVM_N_EXTERNAL_EEPROM_ENTRIES; + +// Shorthand macros, to save you time. +#define NVM_EXTERNAL_TEST_3 (((NVM_External_Test_T*)NVM_External_Test.Value)->External_Test_3) +#define NVM_EXTERNAL_TEST_3_ENTRY_PTR (&NVM_External_Test) + +#define NVM_EXTERNAL_TEST_4 (((NVM_External_Test_T*)NVM_External_Test.Value)->External_Test_4) +#define NVM_EXTERNAL_TEST_4_ENTRY_PTR (&NVM_External_Test) + +#define NVM_DATE_CODE_AS_YYYYMMDD (((NVM_Info_T*)NVM_Info.Value)->Date_Code_as_YYYYMMDD) +#define NVM_DATE_CODE_AS_YYYYMMDD_ENTRY_PTR (&NVM_Info) + +#define NVM_BARREL_COLOR_ORDER (((NVM_Hardware_Settings_T*)NVM_Hardware_Settings.Value)->Barrel_Color_Order) +#define NVM_BARREL_COLOR_ORDER_ENTRY_PTR (&NVM_Hardware_Settings) + +#define NVM_RECEIVER_COLOR_ORDER (((NVM_Hardware_Settings_T*)NVM_Hardware_Settings.Value)->Receiver_Color_Order) +#define NVM_RECEIVER_COLOR_ORDER_ENTRY_PTR (&NVM_Hardware_Settings) + +#define NVM_DISPLAY_COLOR_ORDER (((NVM_Hardware_Settings_T*)NVM_Hardware_Settings.Value)->Display_Color_Order) +#define NVM_DISPLAY_COLOR_ORDER_ENTRY_PTR (&NVM_Hardware_Settings) + +#define NVM_EFFECTS_COLOR_ORDER (((NVM_Hardware_Settings_T*)NVM_Hardware_Settings.Value)->Effects_Color_Order) +#define NVM_EFFECTS_COLOR_ORDER_ENTRY_PTR (&NVM_Hardware_Settings) + +#define NVM_IS_RIGHT_HANDED (((NVM_Hardware_Settings_T*)NVM_Hardware_Settings.Value)->Is_Right_Handed) +#define NVM_IS_RIGHT_HANDED_ENTRY_PTR (&NVM_Hardware_Settings) + +#define NVM_VOLUME (((NVM_Hardware_Settings_T*)NVM_Hardware_Settings.Value)->Volume) +#define NVM_VOLUME_ENTRY_PTR (&NVM_Hardware_Settings) + +#define NVM_WEAPON_ID (((NVM_Game_Settings_T*)NVM_Game_Settings.Value)->Weapon_ID) +#define NVM_WEAPON_ID_ENTRY_PTR (&NVM_Game_Settings) + +#define NVM_PLAYER_ID (((NVM_Game_Settings_T*)NVM_Game_Settings.Value)->Player_ID) +#define NVM_PLAYER_ID_ENTRY_PTR (&NVM_Game_Settings) + +#define NVM_TEAM_ID (((NVM_Game_Settings_T*)NVM_Game_Settings.Value)->Team_ID) +#define NVM_TEAM_ID_ENTRY_PTR (&NVM_Game_Settings) + +#define NVM_HOURMETER_STARTUPS (((NVM_Hourmeter_T*)NVM_Hourmeter.Value)->Hourmeter_Startups) +#define NVM_HOURMETER_STARTUPS_ENTRY_PTR (&NVM_Hourmeter) + + +#ifdef __cplusplus +} +#endif + +#endif // NVM_EXTERNALEEPROMENTRIES_H + diff --git a/2020TPCApp1.cydsn/NVM/NVM_OnChipEEPROM.c b/2020TPCApp1.cydsn/NVM/NVM_OnChipEEPROM.c new file mode 100644 index 0000000..5fd56b0 --- /dev/null +++ b/2020TPCApp1.cydsn/NVM/NVM_OnChipEEPROM.c @@ -0,0 +1,260 @@ +/** \file + * \brief This file contains functions that manage the on-chip EEPROM. + * + */ + +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +/* External Variables [Only if necessary!] */ + +/* External Function Prototypes [Only if necessary!] */ + +/* Public Variables */ + +//! Mutex controlling access to the EEPROM to ensure data/CRC integrity. +SemaphoreHandle_t xSemaphoreOnChipEEPROMLock; + +TaskHandle_t NVM_OnChipEEPROM_Task_Handle; + +volatile bool NVM_IsOnChipEEPROMInitialized = false; + +/* Private Variables */ + +static QueueHandle_t xQueueOnChipEEPROM; + +#if CY_PSOC4 +const uint8_t Emulated_EEPROM_Storage[On_Chip_Emulated_EEPROM_PHYSICAL_SIZE] +__ALIGNED(CY_FLASH_SIZEOF_ROW) = {0u}; +#endif // CY_PSOC4 + +/* Private Function Prototypes */ + +/* Inline Functions */ + +#if CY_PSOC4 +//! Reads a block of \a n bytes from EEPROM address \a source to SRAM \a destination. +static inline void EEPROM_read_block(uint8_t * destination, uint16_t source, size_t n) +{ + On_Chip_Emulated_EEPROM_Read(source, destination, n); +} + +//! Writes a block of \a n bytes from SRAM \a source to EEPROM address \a destination. +static inline void EEPROM_write_block(uint8_t * source, uint16_t destination, size_t n) +{ + On_Chip_Emulated_EEPROM_Write(destination, source, n); +} +#endif // CY_PSOC4 + +#if CY_PSOC5 +//! Reads a block of \a n bytes from EEPROM address \a source to SRAM \a destination. +static inline void EEPROM_read_block(uint8_t * destination, uint16_t source, size_t n) +{ + for (uint_fast16_t i = 0; i < n; i++) + { + uint8_t temp = On_Chip_EEPROM_ReadByte(source + i); + *(destination + i) = temp; + } +} + +//! Writes a block of \a n bytes from SRAM \a source to EEPROM address \a destination. +static inline void EEPROM_write_block(uint8_t * source, uint16_t destination, size_t n) +{ + for (uint_fast16_t i = 0; i < n; i++) + { + On_Chip_EEPROM_WriteByte(*(source + i), destination + i); + } +} +#endif // CY_PSOC5 + +#if CY_PSOC6 +//! Reads a block of \a n bytes from EEPROM address \a source to SRAM \a destination. +static inline void EEPROM_read_block(uint8_t * destination, uint16_t source, size_t n) +{ + cy_en_em_eeprom_status_t result = On_Chip_EEPROM_Read(source, destination, n); + + if (result != CY_EM_EEPROM_SUCCESS) + { + CY_ASSERT(0); + } +} + +//! Writes a block of \a n bytes from SRAM \a source to EEPROM address \a destination. +static inline void EEPROM_write_block(uint8_t * source, uint16_t destination, size_t n) +{ + cy_en_em_eeprom_status_t result = On_Chip_EEPROM_Write(destination, source, n); + + if (result != CY_EM_EEPROM_SUCCESS) + { + CY_ASSERT(0); + } +} +#endif // CY_PSOC6 + +/* Public Functions */ + +//! Sets up the on-chip EEPROM, but does not read from it (yet). +void NVM_InitOnChipEEPROM(void) +{ + /// Create a mutex-type semaphore. + xSemaphoreOnChipEEPROMLock = xSemaphoreCreateMutex(); + + if (xSemaphoreOnChipEEPROMLock == NULL) + { + CY_ASSERT(0); + } + + xQueueOnChipEEPROM = xQueueCreate(5, sizeof(uint8_t)); + +#if CY_PSOC4 + On_Chip_Emulated_EEPROM_Init((uint32_t)Emulated_EEPROM_Storage); +#endif // CY_PSOC4 + +#if CY_PSOC5 + On_Chip_EEPROM_Start(); +#endif // CY_PSOC5 + +#if CY_PSOC6 + // From the docs: "For PSoC 6, if Emulated EEPROM is selected for EEPROM storage, the start address will be + // overwritten to some address from Emulated EEPROM flash area." + On_Chip_EEPROM_Init(0); +#endif // CY_PSOC6 +} + +//! Handles the ongoing on-chip EEPROM tasks. +/*! + * First, it loops through all the on-chip EEPROM entries, and reads them in to RAM. + * Then, it priodically loops through all the on-chip EEPROM entries, and saves the ones that have been flagged. + */ +void NVM_OnChipEEPROMTask(void * pvParameters) +{ + portBASE_TYPE xStatus; + static TickType_t xTicksToWait = pdMS_TO_TICKS(NVM_ON_CHIP_EEPROM_TASK_RATE_IN_ms); + + for (uint8_t i = 0; i < NVM_N_ONCHIP_EEPROM_ENTRIES; i++) + { + NVM_CRC_t calculated_crc; + NVM_CRC_t stored_crc = 0; + + EEPROM_read_block(NVM_OnChipEEPROMEntries[i]->Value, NVM_OnChipEEPROMEntries[i]->EE_Address, NVM_OnChipEEPROMEntries[i]->Size); + EEPROM_read_block((uint8_t *)&stored_crc, NVM_OnChipEEPROMEntries[i]->EE_CRC_Address, sizeof(NVM_CRC_t)); + + calculated_crc = NVM_CRC_init(); + calculated_crc = NVM_CRC_update(calculated_crc, NVM_OnChipEEPROMEntries[i]->Value, NVM_OnChipEEPROMEntries[i]->Size); + calculated_crc = NVM_CRC_finalize(calculated_crc); + + if (calculated_crc == stored_crc) + { + NVM_OnChipEEPROMEntries[i]->State = NVM_STATE_IDLE; + } + else + { + NVM_OnChipEEPROMEntries[i]->State = NVM_STATE_CRC_FAILED; + + COMM_Console_Print_String("[NVMOn "); + COMM_Console_Print_UInt16((uint16_t) i); + COMM_Console_Print_String("] Calculated/Stored CRCs: "); + COMM_Console_Print_UInt16((uint16_t) calculated_crc); + COMM_Console_Print_String("/"); + COMM_Console_Print_UInt16((uint16_t) stored_crc); + COMM_Console_Print_String("\n"); + + COMM_Console_Print_String("[NVMOn "); + COMM_Console_Print_UInt16((uint16_t) i); + COMM_Console_Print_String("] Applying defaults.\n"); + + memcpy(NVM_OnChipEEPROMEntries[i]->Value, NVM_OnChipEEPROMEntries[i]->Default, NVM_OnChipEEPROMEntries[i]->Size); + + // Auto-fix the CRC. + NVM_SaveOnChipEEPROMEntry(NVM_OnChipEEPROMEntries[i]); + } + } + + taskENTER_CRITICAL(); + NVM_IsOnChipEEPROMInitialized = true; + taskEXIT_CRITICAL(); + + while(true) + { + uint8_t dummy; + + // Wait for a call to NVM_SaveOnChipEEPROMEntry(). + xStatus = xQueueReceive(xQueueOnChipEEPROM, &dummy, xTicksToWait); + + if (xStatus == pdPASS) + { + for (uint8_t i = 0; i < NVM_N_ONCHIP_EEPROM_ENTRIES; i++) + { + NVM_CRC_t crc; + +#if (defined CY_PSOC4) || (defined CY_PSOC6) + if (NVM_OnChipEEPROMEntries[i]->State == NVM_STATE_SAVE_REQUESTED) + { + if (xSemaphoreTake(xSemaphoreOnChipEEPROMLock, ( TickType_t ) 1000) == pdTRUE) + { + EEPROM_write_block(NVM_OnChipEEPROMEntries[i]->Value, NVM_OnChipEEPROMEntries[i]->EE_Address, NVM_OnChipEEPROMEntries[i]->Size); + + // Calculate the CRC. + crc = NVM_CRC_init(); + crc = NVM_CRC_update(crc, NVM_OnChipEEPROMEntries[i]->Value, NVM_OnChipEEPROMEntries[i]->Size); + crc = NVM_CRC_finalize(crc); + + EEPROM_write_block((uint8_t *)&crc, NVM_OnChipEEPROMEntries[i]->EE_CRC_Address, sizeof(uint16_t)); + NVM_OnChipEEPROMEntries[i]->State = NVM_STATE_IDLE; + xSemaphoreGive(xSemaphoreOnChipEEPROMLock); + } + } +#endif // (defined CY_PSOC4) || (defined CY_PSOC6) + +#if CY_PSOC5 + // From the component datasheet: + // "[On_Chip_EEPROM_UpdateTemperature()] updates the store temperature value. This should + // be called anytime the EEPROM is active and temperature may have changed by more than + // 10°C." + if (On_Chip_EEPROM_UpdateTemperature() == CYRET_SUCCESS) + { + if (NVM_OnChipEEPROMEntries[i]->State == NVM_STATE_SAVE_REQUESTED) + { + if (On_Chip_EEPROM_Query() == CYRET_SUCCESS) + { + if (xSemaphoreTake(xSemaphoreOnChipEEPROMLock, ( TickType_t ) 1000) == pdTRUE) + { + EEPROM_write_block(NVM_OnChipEEPROMEntries[i]->Value, NVM_OnChipEEPROMEntries[i]->EE_Address, NVM_OnChipEEPROMEntries[i]->Size); + + // Calculate the CRC. + crc = NVM_CRC_init(); + crc = NVM_CRC_update(crc, NVM_OnChipEEPROMEntries[i]->Value, NVM_OnChipEEPROMEntries[i]->Size); + crc = NVM_CRC_finalize(crc); + + EEPROM_write_block((uint8_t *)&crc, NVM_OnChipEEPROMEntries[i]->EE_CRC_Address, sizeof(uint16_t)); + NVM_OnChipEEPROMEntries[i]->State = NVM_STATE_IDLE; + xSemaphoreGive(xSemaphoreOnChipEEPROMLock); + } + } + } + } + else + { + vSerialPutString("ERROR: Couldn't update EEPROM temperature!", 80); + } +#endif // CY_PSOC5 + } + } + } +} + +//! Flags the given on-chip EEPROM entry to be saved next time the NVM_OnChipEEPROMTask() is run. +void NVM_SaveOnChipEEPROMEntry(NVM_EEPROMEntry_T * const this) +{ + if (xSemaphoreTake(xSemaphoreOnChipEEPROMLock, ( TickType_t ) 1000) == pdTRUE) + { + this->State = NVM_STATE_SAVE_REQUESTED; + xSemaphoreGive(xSemaphoreOnChipEEPROMLock); + uint8_t dummy = 0; + xQueueSend(xQueueOnChipEEPROM, &dummy, 0); + } +} + +/* Private Functions */ \ No newline at end of file diff --git a/2020TPCApp1.cydsn/NVM/NVM_OnChipEEPROM.h b/2020TPCApp1.cydsn/NVM/NVM_OnChipEEPROM.h new file mode 100644 index 0000000..325ef39 --- /dev/null +++ b/2020TPCApp1.cydsn/NVM/NVM_OnChipEEPROM.h @@ -0,0 +1,42 @@ +/** \file + * \brief This file contains the public interface to the on-chip EEPROM driver. + * + */ + +#ifndef NVM_ONCHIPEEPROM_H +#define NVM_ONCHIPEEPROM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +#define NVM_ON_CHIP_EEPROM_TASK_STACK_SIZE_in_bytes 256 + +//! The time between calls to NVM_OnChipEEPROMTask(). +#define NVM_ON_CHIP_EEPROM_TASK_RATE_IN_ms 2000 + +/* Include Files */ + +/* Public Variables */ + +extern SemaphoreHandle_t xSemaphoreOnChipEEPROMLock; + +//! Handle of the NVM_OnChipEEPROMTask() given when the task was created. +extern TaskHandle_t NVM_OnChipEEPROM_Task_Handle; + +extern volatile bool NVM_IsOnChipEEPROMInitialized; + +/* Public Functions */ +void NVM_InitOnChipEEPROM(void); +void NVM_OnChipEEPROMTask(void * pvParameters); +void NVM_SaveOnChipEEPROMEntry(NVM_EEPROMEntry_T * const this); + +/* Inline Functions */ + +#ifdef __cplusplus +} +#endif + +#endif // NVM_ONCHIPEEPROM_H \ No newline at end of file diff --git a/2020TPCApp1.cydsn/NVM/NVM_OnChipEEPROMEntries.c b/2020TPCApp1.cydsn/NVM/NVM_OnChipEEPROMEntries.c new file mode 100644 index 0000000..08b72a4 --- /dev/null +++ b/2020TPCApp1.cydsn/NVM/NVM_OnChipEEPROMEntries.c @@ -0,0 +1,63 @@ +/* + * __ ________ _____ ______ __ + * / //_/_ __/___ _____ _ / ___/____ __ _______________ / ____/___ ____/ /__ + * / ,< / / / __ `/ __ `/ \__ \/ __ \/ / / / ___/ ___/ _ \ / / / __ \/ __ / _ \ + * / /| | / / / /_/ / /_/ / ___/ / /_/ / /_/ / / / /__/ __/ / /___/ /_/ / /_/ / __/ + * /_/ |_|/_/ \__,_/\__, / /____/\____/\__,_/_/ \___/\___/ \____/\____/\__,_/\___/ + * /____/ + * + * 🃞 THIS FILE IS PART OF THE KTAG SOURCE CODE. Visit https://ktag.clubk.club/ for more. 🃞 + * + */ + +/** \file + * \brief [Autogenerated] This file defines the OnChip EEPROM entries. + * + * \note AUTOGENERATED: This file was generated automatically on Friday, April 28, 2023 at 11:31:31 AM. + * DO NOT MODIFY THIS FILE MANUALLY! + */ + +/* Include Files */ +#include "KTag.h" + +/* EEPROM Entries */ + +/** \defgroup NVM_ONCHIP_EEPROM NVM OnChip EEPROM + * + * The OnChip EEPROM is divided into logical "entries", represented by instances of the #NVM_EEPROMEntry_T type. + * At startup, these entries are loaded into their respective RAM copies by NVM_InitOnChipEEPROM(). The application + * then updates the RAM copies directly, and requests that the NVM_OnChipEEPROMTask() save these back to the EEPROM + * when necessary. + * @{ */ + +static NVM_OnChip_Test_T RAM_OnChip_Test; + +static const NVM_OnChip_Test_T DEFAULT_OnChip_Test = +{ + //! Test Code 1 + .OnChip_Test_1 = UINT16_MAX, + //! Test Code 2 + .OnChip_Test_2 = UINT32_MAX, +}; + +NVM_EEPROMEntry_T NVM_OnChip_Test = +{ + //! Size == sizeof(NVM_OnChip_Test_T) + .Size = 6, + .EE_Address = 0, + .EE_CRC_Address = 6, + .Value = (uint8_t *)&RAM_OnChip_Test, + .Default = (uint8_t *)&DEFAULT_OnChip_Test, + .State = NVM_STATE_UNINITIALIZED +}; + +/** @} */ + +NVM_EEPROMEntry_T * const NVM_OnChipEEPROMEntries[] = +{ + &NVM_OnChip_Test, +}; + +//! Size of the #NVM_OnChipEEPROMEntries array (i.e. the number of OnChip EEPROM entries). +const uint8_t NVM_N_ONCHIP_EEPROM_ENTRIES = (uint8_t) (sizeof(NVM_OnChipEEPROMEntries) / sizeof(NVM_EEPROMEntry_T *)); + diff --git a/2020TPCApp1.cydsn/NVM/NVM_OnChipEEPROMEntries.h b/2020TPCApp1.cydsn/NVM/NVM_OnChipEEPROMEntries.h new file mode 100644 index 0000000..507737a --- /dev/null +++ b/2020TPCApp1.cydsn/NVM/NVM_OnChipEEPROMEntries.h @@ -0,0 +1,60 @@ +/* + * __ ________ _____ ______ __ + * / //_/_ __/___ _____ _ / ___/____ __ _______________ / ____/___ ____/ /__ + * / ,< / / / __ `/ __ `/ \__ \/ __ \/ / / / ___/ ___/ _ \ / / / __ \/ __ / _ \ + * / /| | / / / /_/ / /_/ / ___/ / /_/ / /_/ / / / /__/ __/ / /___/ /_/ / /_/ / __/ + * /_/ |_|/_/ \__,_/\__, / /____/\____/\__,_/_/ \___/\___/ \____/\____/\__,_/\___/ + * /____/ + * + * 🃞 THIS FILE IS PART OF THE KTAG SOURCE CODE. Visit https://ktag.clubk.club/ for more. 🃞 + * + */ + +/** \file + * \brief [Autogenerated] This file declares the OnChip EEPROM entries. + * + * \note AUTOGENERATED: This file was generated automatically on Friday, April 28, 2023 at 11:31:31 AM. + * DO NOT MODIFY THIS FILE MANUALLY! + */ + +#ifndef NVM_ONCHIPEEPROMENTRIES_H +#define NVM_ONCHIPEEPROMENTRIES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +typedef struct __attribute__((packed)) +{ + //! Test Code 1 + uint16_t OnChip_Test_1; + //! Test Code 2 + uint32_t OnChip_Test_2; +} NVM_OnChip_Test_T; + + +/* Include Files */ + +/* Public Variables */ + +extern NVM_EEPROMEntry_T NVM_OnChip_Test; + +extern NVM_EEPROMEntry_T * const NVM_OnChipEEPROMEntries[]; +extern const uint8_t NVM_N_ONCHIP_EEPROM_ENTRIES; + +// Shorthand macros, to save you time. +#define NVM_ONCHIP_TEST_1 (((NVM_OnChip_Test_T*)NVM_OnChip_Test.Value)->OnChip_Test_1) +#define NVM_ONCHIP_TEST_1_ENTRY_PTR (&NVM_OnChip_Test) + +#define NVM_ONCHIP_TEST_2 (((NVM_OnChip_Test_T*)NVM_OnChip_Test.Value)->OnChip_Test_2) +#define NVM_ONCHIP_TEST_2_ENTRY_PTR (&NVM_OnChip_Test) + + +#ifdef __cplusplus +} +#endif + +#endif // NVM_ONCHIPEEPROMENTRIES_H + diff --git a/2020TPCApp1.cydsn/NVM/NVM_Settings.c b/2020TPCApp1.cydsn/NVM/NVM_Settings.c new file mode 100644 index 0000000..4585506 --- /dev/null +++ b/2020TPCApp1.cydsn/NVM/NVM_Settings.c @@ -0,0 +1,125 @@ +/** \file + * \brief This file contains functions that implement the settings interface for SystemK. + * + */ + +/* Include Files */ +#include "KTag.h" + + +SystemKResult_T SETTINGS_get_uint8_t(SystemKSettingID_T id, uint8_t * value) +{ + SystemKResult_T result = SYSTEMK_RESULT_SUCCESS; + + switch (id) + { + case SYSTEMK_SETTING_IS_RIGHT_HANDED: + *value = NVM_IS_RIGHT_HANDED; + break; + + case SYSTEMK_SETTING_AUDIO_VOLUME: + *value = NVM_VOLUME; + break; + + case SYSTEMK_SETTING_TEAMID: + *value = NVM_TEAM_ID; + break; + + case SYSTEMK_SETTING_PLAYERID: + *value = NVM_PLAYER_ID; + break; + + case SYSTEMK_SETTING_WEAPONID: + *value = NVM_WEAPON_ID; + break; + + default: + result = SYSTEMK_RESULT_WRONG_DATATYPE; + break; + } + + return result; +} + +SystemKResult_T SETTINGS_set_uint8_t(SystemKSettingID_T id, uint8_t value) +{ + SystemKResult_T result = SYSTEMK_RESULT_SUCCESS; + + switch (id) + { + case SYSTEMK_SETTING_IS_RIGHT_HANDED: + NVM_IS_RIGHT_HANDED = value; + break; + + case SYSTEMK_SETTING_AUDIO_VOLUME: + NVM_VOLUME = value; + break; + + case SYSTEMK_SETTING_TEAMID: + NVM_TEAM_ID = value; + break; + + case SYSTEMK_SETTING_PLAYERID: + NVM_PLAYER_ID = value; + break; + + case SYSTEMK_SETTING_WEAPONID: + NVM_WEAPON_ID = value; + break; + + default: + result = SYSTEMK_RESULT_WRONG_DATATYPE; + break; + } + + return result; +} + +SystemKResult_T SETTINGS_get_uint32_t(SystemKSettingID_T id, uint32_t * value) +{ + SystemKResult_T result = SYSTEMK_RESULT_SUCCESS; + + switch (id) + { + case SYSTEMK_SETTING_T_START_GAME_in_ms: + *value = CONFIG_KTAG_T_DEFAULT_START_GAME_in_ms; + break; + + default: + result = SYSTEMK_RESULT_WRONG_DATATYPE; + break; + } + + return result; +} + +SystemKResult_T SETTINGS_set_uint32_t(SystemKSettingID_T id, uint32_t value) +{ + SystemKResult_T result = SYSTEMK_RESULT_SUCCESS; + + switch (id) + { + case SYSTEMK_SETTING_T_START_GAME_in_ms: + result = SYSTEMK_RESULT_NOT_IMPLEMENTED; + break; + + default: + result = SYSTEMK_RESULT_WRONG_DATATYPE; + break; + } + + return result; +} + +SystemKResult_T SETTINGS_Save(void) +{ +#if (CONFIG__HAS_EXTERNAL_NVM) + NVM_SaveExternalEEPROMEntry(&NVM_Hardware_Settings); + NVM_SaveExternalEEPROMEntry(&NVM_Game_Settings); +#else // CONFIG__HAS_EXTERNAL_NVM + NVM_SaveOnChipEEPROMEntry(&NVM_Hardware_Settings); + NVM_SaveOnChipEEPROMEntry(&NVM_Game_Settings); +#endif // CONFIG__HAS_EXTERNAL_NVM + + return SYSTEMK_RESULT_SUCCESS; +} diff --git a/2020TPCApp1.cydsn/Sample_Tasks.c b/2020TPCApp1.cydsn/Sample_Tasks.c new file mode 100644 index 0000000..46bf192 --- /dev/null +++ b/2020TPCApp1.cydsn/Sample_Tasks.c @@ -0,0 +1,93 @@ +/* Include Files */ +#include "KTag.h" + +TaskHandle_t Sample_Task_Handle; + +// LED Functionality +static void LED_CoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ); +#define LED_COROUTINE_PRIORITY 0 +static const TickType_t Delay_50ms = 50 / portTICK_PERIOD_MS; +static const TickType_t Delay_100ms = 100 / portTICK_PERIOD_MS; +static const TickType_t Delay_600ms = 600 / portTICK_PERIOD_MS; + +// Serial Debug Functionality +static void Serial_Debug_CoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ); +#define SERIAL_DEBUG_COROUTINE_PRIORITY 0 +static const TickType_t Delay_1s = 1000 / portTICK_PERIOD_MS; + +void Sample_Task_Init(void) +{ +} + +//! Sample task: blinks the LED and sends text out on the UART. +/*! + * \param pvParameters (not used) + * \return None (infinite loop) + */ +void Sample_Task(void * pvParameters) +{ + xCoRoutineCreate(LED_CoRoutine, LED_COROUTINE_PRIORITY, 0 ); + xCoRoutineCreate(Serial_Debug_CoRoutine, SERIAL_DEBUG_COROUTINE_PRIORITY, 0 ); + + while (true) + { + vCoRoutineSchedule(); + + // Delay a bit here so as to not starve the idle task. + vTaskDelay(10 / portTICK_PERIOD_MS); + } +} + +//! Blinks the LED. +static void LED_CoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) +{ + crSTART( xHandle ); + + static bool is_startup = false; + + while (true) + { + if (is_startup == false) + { + Cy_GPIO_Write(Red_LED_PORT, Red_LED_NUM, 1); + crDELAY(xHandle, Delay_100ms); + + Cy_GPIO_Write(Red_LED_PORT, Red_LED_NUM, 0); + crDELAY(xHandle, Delay_50ms); + + Cy_GPIO_Write(Red_LED_PORT, Red_LED_NUM, 1); + crDELAY(xHandle, Delay_100ms); + + Cy_GPIO_Write(Red_LED_PORT, Red_LED_NUM, 0); + crDELAY(xHandle, Delay_50ms); + + Cy_GPIO_Write(Red_LED_PORT, Red_LED_NUM, 1); + crDELAY(xHandle, Delay_100ms); + + Cy_GPIO_Write(Red_LED_PORT, Red_LED_NUM, 0); + + is_startup = true; + } + crDELAY(xHandle, Delay_600ms); + } + + crEND(); +} + +static void Serial_Debug_CoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) +{ + crSTART( xHandle ); + + //static uint32_t i = 0; + + while (true) + { + //Debug_printf("%lu\n", i++); + //vSerialPutString(" * ", 50); + crDELAY(xHandle, Delay_1s); + } + + crEND(); +} + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/Sample_Tasks.h b/2020TPCApp1.cydsn/Sample_Tasks.h new file mode 100644 index 0000000..4d0780a --- /dev/null +++ b/2020TPCApp1.cydsn/Sample_Tasks.h @@ -0,0 +1,9 @@ +#ifndef SAMPLE_TASKS_H +#define SAMPLE_TASKS_H + +extern TaskHandle_t Sample_Task_Handle; + +void Sample_Task_Init(void); +void Sample_Task(void * pvParameters); + +#endif // SAMPLE_TASKS_H diff --git a/2020TPCApp1.cydsn/Switches.c b/2020TPCApp1.cydsn/Switches.c new file mode 100644 index 0000000..8fbdbeb --- /dev/null +++ b/2020TPCApp1.cydsn/Switches.c @@ -0,0 +1,196 @@ +/* Include Files */ +#include "KTag.h" + +TaskHandle_t Switches_Task_Handle; + +#define SWITCHES_TASK_PERIOD_IN_TICKS (100 / portTICK_PERIOD_MS) + +//! Continuously pressing a switch for this length of time will be interpreted as a long press. +/*! + * #Duration_Of_Long_Press_in_Ticks must be an integer multiple of #SWITCHES_TASK_PERIOD_IN_TICKS! + */ +static const TickType_t Duration_Of_Long_Press_in_Ticks = (10 * SWITCHES_TASK_PERIOD_IN_TICKS); + +#if (defined LIL_BRUV) || (defined LITTLE_BOY_BLUE) +static TickType_t Up_Switch_Time_Pressed_in_Ticks = 0; +static TickType_t Up_Switch_Time_Released_in_Ticks = 0; +static TickType_t Down_Switch_Time_Pressed_in_Ticks = 0; +static TickType_t Down_Switch_Time_Released_in_Ticks = 0; +static TickType_t Forward_Switch_Time_Pressed_in_Ticks = 0; +static TickType_t Forward_Switch_Time_Released_in_Ticks = 0; +static TickType_t Backward_Switch_Time_Pressed_in_Ticks = 0; +static TickType_t Backward_Switch_Time_Released_in_Ticks = 0; +#elif (defined TWENTY20TPC) +static TickType_t Accessory_Switch_Time_Pressed_in_Ticks = 0; +static TickType_t Accessory_Switch_Total_Time_Pressed_in_Ticks = 0; +static TickType_t Accessory_Switch_Time_Released_in_Ticks = 0; +static TickType_t Accessory_Switch_Time_Since_Last_Release_in_Ticks = 0; +#endif // Model + +void Switches_Init(void) +{ + +} + + +//! Reads the hardware switches and creates press and release events. +/*! + * This is a periodic task--see https://www.freertos.org/vtaskdelayuntil.html. + */ +void Switches_Task(void * pvParameters) +{ + TickType_t xLastWakeTime; + + // Initialize the xLastWakeTime variable with the current time. + xLastWakeTime = xTaskGetTickCount(); + + while (true) + { +#if (defined LIL_BRUV) || (defined LITTLE_BOY_BLUE) + if (Cy_GPIO_Read(Pin_Up_PORT, Pin_Up_NUM) == 0) + { + if (Up_Switch_Time_Pressed_in_Ticks == 0) + { + Up_Switch_Time_Released_in_Ticks = 0; + KEvent_T switch_event = {.ID = KEVENT_UP_SWITCH_PRESSED, .Data = &Up_Switch_Time_Released_in_Ticks}; + Post_KEvent(&switch_event); + } + else if (Up_Switch_Time_Pressed_in_Ticks == Duration_Of_Long_Press_in_Ticks) + { + KEvent_T switch_event = {.ID = KEVENT_UP_SWITCH_LONG_PRESSED, .Data = &Up_Switch_Time_Pressed_in_Ticks}; + Post_KEvent(&switch_event); + } + + Up_Switch_Time_Pressed_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } + else + { + if (Up_Switch_Time_Released_in_Ticks == 0) + { + Up_Switch_Time_Pressed_in_Ticks = 0; + KEvent_T switch_event = {.ID = KEVENT_UP_SWITCH_RELEASED, .Data = &Up_Switch_Time_Pressed_in_Ticks}; + Post_KEvent(&switch_event); + } + + Up_Switch_Time_Released_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } + + if (Cy_GPIO_Read(Pin_Down_PORT, Pin_Down_NUM) == 0) + { + if (Down_Switch_Time_Pressed_in_Ticks == 0) + { + Down_Switch_Time_Released_in_Ticks = 0; + KEvent_T switch_event = {.ID = KEVENT_DOWN_SWITCH_PRESSED, .Data = &Down_Switch_Time_Released_in_Ticks}; + Post_KEvent(&switch_event); + } + else if (Down_Switch_Time_Pressed_in_Ticks == Duration_Of_Long_Press_in_Ticks) + { + KEvent_T switch_event = {.ID = KEVENT_DOWN_SWITCH_LONG_PRESSED, .Data = &Down_Switch_Time_Pressed_in_Ticks}; + Post_KEvent(&switch_event); + } + + Down_Switch_Time_Pressed_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } + else + { + if (Down_Switch_Time_Released_in_Ticks == 0) + { + Down_Switch_Time_Pressed_in_Ticks = 0; + KEvent_T switch_event = {.ID = KEVENT_DOWN_SWITCH_RELEASED, .Data = &Down_Switch_Time_Pressed_in_Ticks}; + Post_KEvent(&switch_event); + } + + Down_Switch_Time_Released_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } + + if (Cy_GPIO_Read(Pin_Forward_PORT, Pin_Forward_NUM) == 0) + { + if (Forward_Switch_Time_Pressed_in_Ticks == 0) + { + Forward_Switch_Time_Released_in_Ticks = 0; + KEvent_T switch_event = {.ID = KEVENT_FORWARD_SWITCH_PRESSED, .Data = &Forward_Switch_Time_Released_in_Ticks}; + Post_KEvent(&switch_event); + } + else if (Forward_Switch_Time_Pressed_in_Ticks == Duration_Of_Long_Press_in_Ticks) + { + KEvent_T switch_event = {.ID = KEVENT_FORWARD_SWITCH_LONG_PRESSED, .Data = &Forward_Switch_Time_Pressed_in_Ticks}; + Post_KEvent(&switch_event); + } + + Forward_Switch_Time_Pressed_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } + else + { + if (Forward_Switch_Time_Released_in_Ticks == 0) + { + Forward_Switch_Time_Pressed_in_Ticks = 0; + KEvent_T switch_event = {.ID = KEVENT_FORWARD_SWITCH_RELEASED, .Data = &Forward_Switch_Time_Pressed_in_Ticks}; + Post_KEvent(&switch_event); + } + + Forward_Switch_Time_Released_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } + + if (Cy_GPIO_Read(Pin_Backward_PORT, Pin_Backward_NUM) == 0) + { + if (Backward_Switch_Time_Pressed_in_Ticks == 0) + { + Backward_Switch_Time_Released_in_Ticks = 0; + KEvent_T switch_event = {.ID = KEVENT_BACKWARD_SWITCH_PRESSED, .Data = &Backward_Switch_Time_Released_in_Ticks}; + Post_KEvent(&switch_event); + } + else if (Backward_Switch_Time_Pressed_in_Ticks == Duration_Of_Long_Press_in_Ticks) + { + KEvent_T switch_event = {.ID = KEVENT_BACKWARD_SWITCH_LONG_PRESSED, .Data = &Backward_Switch_Time_Pressed_in_Ticks}; + Post_KEvent(&switch_event); + } + + Backward_Switch_Time_Pressed_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } + else + { + if (Backward_Switch_Time_Released_in_Ticks == 0) + { + Backward_Switch_Time_Pressed_in_Ticks = 0; + KEvent_T switch_event = {.ID = KEVENT_BACKWARD_SWITCH_RELEASED, .Data = &Backward_Switch_Time_Pressed_in_Ticks}; + Post_KEvent(&switch_event); + } + + Backward_Switch_Time_Released_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } +#elif (defined TWENTY20TPC) + // Use the Remote Trigger pin as the Accessory input, since we never got around to using remote triggers. + if (Cy_GPIO_Read(Pin_Remote_Trigger_PORT, Pin_Remote_Trigger_NUM) == 0) + { + if (Accessory_Switch_Time_Pressed_in_Ticks == 0) + { + Accessory_Switch_Time_Since_Last_Release_in_Ticks = Accessory_Switch_Time_Released_in_Ticks; + KEvent_T switch_event = {.ID = KEVENT_ACCESSORY_SWITCH_PRESSED, .Data = (void *) pdTICKS_TO_MS(Accessory_Switch_Time_Since_Last_Release_in_Ticks)}; + Post_KEvent(&switch_event); + Accessory_Switch_Time_Released_in_Ticks = 0; + } + if ((UINT32_MAX - Accessory_Switch_Time_Pressed_in_Ticks) > SWITCHES_TASK_PERIOD_IN_TICKS) + { + Accessory_Switch_Time_Pressed_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } + } + else + { + if (Accessory_Switch_Time_Released_in_Ticks == 0) + { + Accessory_Switch_Total_Time_Pressed_in_Ticks = Accessory_Switch_Time_Pressed_in_Ticks; + KEvent_T switch_event = {.ID = KEVENT_ACCESSORY_SWITCH_RELEASED, .Data = (void *) pdTICKS_TO_MS(Accessory_Switch_Total_Time_Pressed_in_Ticks)}; + Post_KEvent(&switch_event); + Accessory_Switch_Time_Pressed_in_Ticks = 0; + } + if ((UINT32_MAX - Accessory_Switch_Time_Released_in_Ticks) > SWITCHES_TASK_PERIOD_IN_TICKS) + { + Accessory_Switch_Time_Released_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } + } +#endif // Model + + // Wait for the next cycle. + vTaskDelayUntil(&xLastWakeTime, SWITCHES_TASK_PERIOD_IN_TICKS); + } +} diff --git a/2020TPCApp1.cydsn/Switches.h b/2020TPCApp1.cydsn/Switches.h new file mode 100644 index 0000000..5472fdf --- /dev/null +++ b/2020TPCApp1.cydsn/Switches.h @@ -0,0 +1,9 @@ +#ifndef SWITCHES_H +#define SWITCHES_H + +extern TaskHandle_t Switches_Task_Handle; + +void Switches_Init(void); +void Switches_Task(void * pvParameters); + +#endif // SWITCHES_H diff --git a/2020TPCApp1.cydsn/SystemK b/2020TPCApp1.cydsn/SystemK new file mode 160000 index 0000000..4fe072f --- /dev/null +++ b/2020TPCApp1.cydsn/SystemK @@ -0,0 +1 @@ +Subproject commit 4fe072f2d3280b19aa53e197bd22ec44b174ff88 diff --git a/2020TPCApp1.cydsn/Tag_Sensors.c b/2020TPCApp1.cydsn/Tag_Sensors.c new file mode 100644 index 0000000..2b535e1 --- /dev/null +++ b/2020TPCApp1.cydsn/Tag_Sensors.c @@ -0,0 +1,582 @@ +/* Include Files */ +#include "KTag.h" + +TaskHandle_t Tag_Sensors_Task_Handle; + +//#define DEBUG_TAG_SENSORS + +#define MAX_RX_PULSES (2 * MAX_PULSES) + +typedef enum +{ + FALLING_EDGE, + RISING_EDGE +} EdgeDirection_T; + +static volatile uint32_t LocalIncomingPulseDurations[MAX_RX_PULSES]; +static volatile uint32_t RemoteIncomingPulseDurations[MAX_RX_PULSES]; +static volatile uint16_t LocalPulseIndex = 0; +static volatile uint16_t RemotePulseIndex = 0; +static volatile uint16_t NumberOfLocalIncomingPulses = 0; +static volatile uint16_t NumberOfRemoteIncomingPulses = 0; +static volatile TagSensorLocation_T LocalActiveSensor = TAG_SENSOR_NONE; +static uint32_t LocalProcessingPulseDurations[MAX_RX_PULSES]; +static uint32_t RemoteProcessingPulseDurations[MAX_RX_PULSES]; +static uint16_t NumberOfLocalProcessingPulses = 0; +static uint16_t NumberOfRemoteProcessingPulses = 0; +static TimedPulseTrain_T LocalProcessingPulses; +static TimedPulseTrain_T RemoteProcessingPulses; +static TagSensorLocation_T LocalProcessingSensor = TAG_SENSOR_NONE; +static volatile EdgeDirection_T LocalExpectedEdgeDirection = FALLING_EDGE; +static volatile EdgeDirection_T RemoteExpectedEdgeDirection = FALLING_EDGE; + + +void On_Forward_Tag_Sensor_Rising_Edge(); +void On_Forward_Tag_Sensor_Falling_Edge(); +void On_Left_Tag_Sensor_Rising_Edge(); +void On_Left_Tag_Sensor_Falling_Edge(); +void On_Right_Tag_Sensor_Rising_Edge(); +void On_Right_Tag_Sensor_Falling_Edge(); +void On_Remote_Tag_Sensor_Rising_Edge(); +void On_Remote_Tag_Sensor_Falling_Edge(); +void On_Local_Tag_Sensor_Bit_Stream_Timer(); +void On_Remote_Tag_Sensor_Bit_Stream_Timer(); + +QueueHandle_t xQueueTagSensors; + +#ifdef DEBUG_TAG_SENSORS +static char8 buffer[30]; +#endif // DEBUG_TAG_SENSORS + +inline static void AppendLocalPulse(uint32_t duration) +{ + LocalIncomingPulseDurations[LocalPulseIndex] = duration; + + if (LocalPulseIndex < (MAX_RX_PULSES - 1)) + { + LocalPulseIndex++; + } +} + +inline static void AppendRemotePulse(uint32_t duration) +{ + RemoteIncomingPulseDurations[RemotePulseIndex] = duration; + + if (RemotePulseIndex < (MAX_RX_PULSES - 1)) + { + RemotePulseIndex++; + } +} + +inline static void EnableAllLocalEdgeISRs(void) +{ + NVIC_EnableIRQ(Forward_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_EnableIRQ(Forward_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + NVIC_EnableIRQ(Left_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_EnableIRQ(Left_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + NVIC_EnableIRQ(Right_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_EnableIRQ(Right_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); +} + +inline static void EnableAllRemoteEdgeISRs(void) +{ + NVIC_EnableIRQ(Remote_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_EnableIRQ(Remote_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); +} + +inline static void DisableAllLocalRisingEdgeISRs(void) +{ + NVIC_DisableIRQ(Forward_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_DisableIRQ(Left_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_DisableIRQ(Right_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); +} + +inline static void DisableAllRemoteRisingEdgeISRs(void) +{ + NVIC_DisableIRQ(Remote_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); +} + +inline static void DisableAllLocalFallingEdgeISRs(void) +{ + NVIC_DisableIRQ(Forward_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + NVIC_DisableIRQ(Left_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + NVIC_DisableIRQ(Right_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); +} + +inline static void DisableAllRemoteFallingEdgeISRs(void) +{ + NVIC_DisableIRQ(Remote_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); +} + +inline static void DisableAllLocalEdgeISRs(void) +{ + DisableAllLocalRisingEdgeISRs(); + DisableAllLocalFallingEdgeISRs(); +} + +inline static void DisableAllRemoteEdgeISRs(void) +{ + DisableAllRemoteRisingEdgeISRs(); + DisableAllRemoteFallingEdgeISRs(); +} + +inline static void ClearAllPendingLocalEdgeISRs(void) +{ + NVIC_ClearPendingIRQ(Forward_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_ClearPendingIRQ(Forward_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + NVIC_ClearPendingIRQ(Left_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_ClearPendingIRQ(Left_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + NVIC_ClearPendingIRQ(Right_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_ClearPendingIRQ(Right_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); +} + +inline static void ClearAllPendingRemoteEdgeISRs(void) +{ + NVIC_ClearPendingIRQ(Remote_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_ClearPendingIRQ(Remote_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); +} + +void Tag_Sensors_Init(void) +{ + // Register the Local ISRs. + Cy_SysInt_Init(&Forward_Tag_Sensor_Rising_Edge_ISR_cfg, On_Forward_Tag_Sensor_Rising_Edge); + Cy_SysInt_Init(&Forward_Tag_Sensor_Falling_Edge_ISR_cfg, On_Forward_Tag_Sensor_Falling_Edge); + Cy_SysInt_Init(&Left_Tag_Sensor_Rising_Edge_ISR_cfg, On_Left_Tag_Sensor_Rising_Edge); + Cy_SysInt_Init(&Left_Tag_Sensor_Falling_Edge_ISR_cfg, On_Left_Tag_Sensor_Falling_Edge); + Cy_SysInt_Init(&Right_Tag_Sensor_Rising_Edge_ISR_cfg, On_Right_Tag_Sensor_Rising_Edge); + Cy_SysInt_Init(&Right_Tag_Sensor_Falling_Edge_ISR_cfg, On_Right_Tag_Sensor_Falling_Edge); + Cy_SysInt_Init(&Local_Tag_Sensor_Bit_Stream_Timer_Interrupt_cfg, On_Local_Tag_Sensor_Bit_Stream_Timer); + + // Register the Remote ISRs. + Cy_SysInt_Init(&Remote_Tag_Sensor_Rising_Edge_ISR_cfg, On_Remote_Tag_Sensor_Rising_Edge); + Cy_SysInt_Init(&Remote_Tag_Sensor_Falling_Edge_ISR_cfg, On_Remote_Tag_Sensor_Falling_Edge); + Cy_SysInt_Init(&Remote_Tag_Sensor_Bit_Stream_Timer_Interrupt_cfg, On_Remote_Tag_Sensor_Bit_Stream_Timer); + + // Enable the forward, left, right, and remote sensors. + Tag_Sensor_Register_Write(0xFF - 0x0F); + + xQueueTagSensors = xQueueCreate(5, sizeof(TagSensorsAction_T)); + + // Enable the timers. + NVIC_EnableIRQ(Local_Tag_Sensor_Bit_Stream_Timer_Interrupt_cfg.intrSrc); + NVIC_EnableIRQ(Remote_Tag_Sensor_Bit_Stream_Timer_Interrupt_cfg.intrSrc); + + // Enable the sensors. + EnableAllLocalEdgeISRs(); + EnableAllRemoteEdgeISRs(); + +} + +void Tag_Sensors_Task(void * pvParameters) +{ + portBASE_TYPE xStatus; + + while (true) + { + TagSensorsAction_T action; + + xStatus = xQueueReceive(xQueueTagSensors, &action, 0); + + if (xStatus == pdPASS) + { + switch (action) + { + case TAG_SENSOR_PROCESS_LOCAL_BUFFER: + { + for (uint8_t i = 0; i < NumberOfLocalIncomingPulses; i++) + { + LocalProcessingPulseDurations[i] = LocalIncomingPulseDurations[i]; + } + NumberOfLocalProcessingPulses = NumberOfLocalIncomingPulses; + NumberOfLocalIncomingPulses = 0; + LocalProcessingSensor = LocalActiveSensor; + LocalActiveSensor = TAG_SENSOR_NONE; + EnableAllLocalEdgeISRs(); + +#ifdef DEBUG_TAG_SENSORS + COMM_Console_Print_String("\n"); + + switch (LocalProcessingSensor) + { + case TAG_SENSOR_FORWARD: + COMM_Console_Print_String("Tag Rx'd FORWARD\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + break; + + case TAG_SENSOR_LEFT: + COMM_Console_Print_String("Tag Rx'd LEFT\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + break; + + case TAG_SENSOR_RIGHT: + COMM_Console_Print_String("Tag Rx'd RIGHT\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + break; + + default: + case TAG_SENSOR_REMOTE: + case TAG_SENSOR_NONE: + break; + } + + for (uint_fast16_t i = 0; i < NumberOfLocalProcessingPulses; i++) + { + // Even pulses are marks; odd pulses are spaces. + if ((i % 2) == 0) + { + COMM_Console_Print_String("{.symbol = MARK, .time = "); + sprintf(buffer, "%lu}, // %d\n", LocalProcessingPulseDurations[i], i); + COMM_Console_Print_String(buffer); + vTaskDelay(pdMS_TO_TICKS(10)); + } + // A falling edge is the end of space. + else + { + COMM_Console_Print_String("{.symbol = SPACE, .time = "); + sprintf(buffer, "%lu}, // %d\n", LocalProcessingPulseDurations[i], i); + COMM_Console_Print_String(buffer); + vTaskDelay(pdMS_TO_TICKS(10)); + } + } +#endif // DEBUG_TAG_SENSORS + + LocalProcessingPulses.count = NumberOfLocalProcessingPulses; + for (uint_fast16_t i = 0; (i < NumberOfLocalProcessingPulses) && (i < MAX_RX_PULSES); i++) + { + if ((i % 2) == 0) + { + LocalProcessingPulses.bitstream[i].symbol = MARK; + } + else + { + LocalProcessingPulses.bitstream[i].symbol = SPACE; + } + LocalProcessingPulses.bitstream[i].duration = LocalProcessingPulseDurations[i]; + } + LocalProcessingPulses.bitstream[NumberOfLocalProcessingPulses].duration = LAST_PULSE; + LocalProcessingPulses.receiver = LocalProcessingSensor; + + DecodedPacket_T * result = PROTOCOLS_MaybeDecodePacket(&LocalProcessingPulses); + + if (result != NULL) + { + if (result->Generic.type == DECODED_PACKET_TYPE_TAG_RECEIVED) + { + KEvent_T tag_received_event = {.ID = KEVENT_TAG_RECEIVED, .Data = result}; + Post_KEvent(&tag_received_event); + } + else if (result->Generic.type == DECODED_PACKET_TYPE_COMMAND_RECEIVED) + { + KEvent_T command_received_event = {.ID = KEVENT_COMMAND_RECEIVED, .Data = result}; + Post_KEvent(&command_received_event); + } + } + else + { + KEvent_T near_miss_event = {.ID = KEVENT_NEAR_MISS, .Data = NULL}; + Post_KEvent(&near_miss_event); + } + } + break; + + case TAG_SENSOR_PROCESS_REMOTE_BUFFER: + { + for (uint8_t i = 0; i < NumberOfRemoteIncomingPulses; i++) + { + RemoteProcessingPulseDurations[i] = RemoteIncomingPulseDurations[i]; + } + NumberOfRemoteProcessingPulses = NumberOfRemoteIncomingPulses; + NumberOfRemoteIncomingPulses = 0; + EnableAllRemoteEdgeISRs(); + +#ifdef DEBUG_TAG_SENSORS + COMM_Console_Print_String("\n"); + + COMM_Console_Print_String("Tag Rx'd REMOTE\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + + for (uint_fast16_t i = 0; i < NumberOfRemoteProcessingPulses; i++) + { + // Even pulses are marks; odd pulses are spaces. + if ((i % 2) == 0) + { + COMM_Console_Print_String("{.symbol = MARK, .time = "); + sprintf(buffer, "%lu}, // %d\n", RemoteProcessingPulseDurations[i], i); + COMM_Console_Print_String(buffer); + vTaskDelay(pdMS_TO_TICKS(10)); + } + // A falling edge is the end of space. + else + { + COMM_Console_Print_String("{.symbol = SPACE, .time = "); + sprintf(buffer, "%lu}, // %d\n", RemoteProcessingPulseDurations[i], i); + COMM_Console_Print_String(buffer); + vTaskDelay(pdMS_TO_TICKS(10)); + } + } +#endif // DEBUG_TAG_SENSORS + RemoteProcessingPulses.count = NumberOfRemoteProcessingPulses; + for (uint_fast16_t i = 0; (i < NumberOfRemoteProcessingPulses) && (i < MAX_RX_PULSES); i++) + { + if ((i % 2) == 0) + { + RemoteProcessingPulses.bitstream[i].symbol = MARK; + } + else + { + RemoteProcessingPulses.bitstream[i].symbol = SPACE; + } + RemoteProcessingPulses.bitstream[i].duration = RemoteProcessingPulseDurations[i]; + } + RemoteProcessingPulses.bitstream[NumberOfRemoteProcessingPulses].duration = LAST_PULSE; + RemoteProcessingPulses.receiver = TAG_SENSOR_REMOTE; + + DecodedPacket_T * result = PROTOCOLS_MaybeDecodePacket(&RemoteProcessingPulses); + + if (result != NULL) + { + if (result->Generic.type == DECODED_PACKET_TYPE_TAG_RECEIVED) + { + KEvent_T tag_received_event = {.ID = KEVENT_TAG_RECEIVED, .Data = result}; + Post_KEvent(&tag_received_event); + } + else if (result->Generic.type == DECODED_PACKET_TYPE_COMMAND_RECEIVED) + { + KEvent_T command_received_event = {.ID = KEVENT_COMMAND_RECEIVED, .Data = result}; + Post_KEvent(&command_received_event); + } + } + else + { + KEvent_T near_miss_event = {.ID = KEVENT_NEAR_MISS, .Data = NULL}; + Post_KEvent(&near_miss_event); + } + } + break; + + default: + break; + } + } + + vTaskDelay(100 / portTICK_PERIOD_MS); + } +} + +// A rising edge means the IR carrier frequency is no longer detected. +void On_Forward_Tag_Sensor_Rising_Edge() +{ + uint32_t counter = Local_Tag_Sensor_Bit_Stream_Timer_GetCounter(); + + if (LocalActiveSensor == TAG_SENSOR_FORWARD) + { + if (LocalExpectedEdgeDirection == RISING_EDGE) + { + Local_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NVIC_ClearPendingIRQ(Forward_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + + AppendLocalPulse(counter); + LocalExpectedEdgeDirection = FALLING_EDGE; + } + } +} + +// A falling edge means the IR carrier frequency has been detected. +void On_Forward_Tag_Sensor_Falling_Edge() +{ + uint32_t counter = Local_Tag_Sensor_Bit_Stream_Timer_GetCounter(); + + if ((LocalActiveSensor == TAG_SENSOR_FORWARD) || (LocalActiveSensor == TAG_SENSOR_NONE)) + { + if (LocalExpectedEdgeDirection == FALLING_EDGE) + { + Local_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NVIC_ClearPendingIRQ(Forward_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + + if (LocalPulseIndex == 0) + { + Local_Tag_Sensor_Bit_Stream_Timer_Start(); + LocalActiveSensor = TAG_SENSOR_FORWARD; + } + else + { + AppendLocalPulse(counter); + } + LocalExpectedEdgeDirection = RISING_EDGE; + } + } +} + +// A rising edge means the IR carrier frequency is no longer detected. +void On_Left_Tag_Sensor_Rising_Edge() +{ + uint32_t counter = Local_Tag_Sensor_Bit_Stream_Timer_GetCounter(); + + if (LocalActiveSensor == TAG_SENSOR_LEFT) + { + if (LocalExpectedEdgeDirection == RISING_EDGE) + { + Local_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NVIC_ClearPendingIRQ(Left_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + + AppendLocalPulse(counter); + LocalExpectedEdgeDirection = FALLING_EDGE; + } + } +} + +// A falling edge means the IR carrier frequency has been detected. +void On_Left_Tag_Sensor_Falling_Edge() +{ + uint32_t counter = Local_Tag_Sensor_Bit_Stream_Timer_GetCounter(); + + if ((LocalActiveSensor == TAG_SENSOR_LEFT) || (LocalActiveSensor == TAG_SENSOR_NONE)) + { + if (LocalExpectedEdgeDirection == FALLING_EDGE) + { + Local_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NVIC_ClearPendingIRQ(Left_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + + if (LocalPulseIndex == 0) + { + Local_Tag_Sensor_Bit_Stream_Timer_Start(); + LocalActiveSensor = TAG_SENSOR_LEFT; + } + else + { + AppendLocalPulse(counter); + } + LocalExpectedEdgeDirection = RISING_EDGE; + } + } +} + +// A rising edge means the IR carrier frequency is no longer detected. +void On_Right_Tag_Sensor_Rising_Edge() +{ + uint32_t counter = Local_Tag_Sensor_Bit_Stream_Timer_GetCounter(); + + if (LocalActiveSensor == TAG_SENSOR_RIGHT) + { + if (LocalExpectedEdgeDirection == RISING_EDGE) + { + Local_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NVIC_ClearPendingIRQ(Right_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + + AppendLocalPulse(counter); + LocalExpectedEdgeDirection = FALLING_EDGE; + } + } +} + +// A falling edge means the IR carrier frequency has been detected. +void On_Right_Tag_Sensor_Falling_Edge() +{ + uint32_t counter = Local_Tag_Sensor_Bit_Stream_Timer_GetCounter(); + + if ((LocalActiveSensor == TAG_SENSOR_RIGHT) || (LocalActiveSensor == TAG_SENSOR_NONE)) + { + if (LocalExpectedEdgeDirection == FALLING_EDGE) + { + Local_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NVIC_ClearPendingIRQ(Left_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + + if (LocalPulseIndex == 0) + { + Local_Tag_Sensor_Bit_Stream_Timer_Start(); + LocalActiveSensor = TAG_SENSOR_RIGHT; + } + else + { + AppendLocalPulse(counter); + } + LocalExpectedEdgeDirection = RISING_EDGE; + } + } +} + +// A rising edge means the IR carrier frequency is no longer detected. +void On_Remote_Tag_Sensor_Rising_Edge() +{ + uint32_t counter = Remote_Tag_Sensor_Bit_Stream_Timer_GetCounter(); + + if (RemoteExpectedEdgeDirection == RISING_EDGE) + { + Remote_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NVIC_ClearPendingIRQ(Remote_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + + AppendRemotePulse(counter); + RemoteExpectedEdgeDirection = FALLING_EDGE; + } +} + +// A falling edge means the IR carrier frequency has been detected. +void On_Remote_Tag_Sensor_Falling_Edge() +{ + uint32_t counter = Remote_Tag_Sensor_Bit_Stream_Timer_GetCounter(); + + if (RemoteExpectedEdgeDirection == FALLING_EDGE) + { + Remote_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NVIC_ClearPendingIRQ(Remote_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + + if (RemotePulseIndex == 0) + { + Remote_Tag_Sensor_Bit_Stream_Timer_Start(); + } + else + { + AppendRemotePulse(counter); + } + RemoteExpectedEdgeDirection = RISING_EDGE; + } +} + +void On_Local_Tag_Sensor_Bit_Stream_Timer() +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + + // Read and clear the interrupt status. + uint32_t status = Local_Tag_Sensor_Bit_Stream_Timer_GetInterruptStatus(); + Local_Tag_Sensor_Bit_Stream_Timer_ClearInterrupt(CY_TCPWM_INT_ON_TC); + + if (status & CY_TCPWM_INT_ON_TC) + { + // The timer expired. + Local_Tag_Sensor_Bit_Stream_Timer_TriggerStop(); + Local_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NumberOfLocalIncomingPulses = LocalPulseIndex; + LocalPulseIndex = 0; + DisableAllLocalEdgeISRs(); + LocalExpectedEdgeDirection = FALLING_EDGE; + const TagSensorsAction_T action = TAG_SENSOR_PROCESS_LOCAL_BUFFER; + xQueueSendFromISR(xQueueTagSensors, &action, &xHigherPriorityTaskWoken); + } + + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); +} + +void On_Remote_Tag_Sensor_Bit_Stream_Timer() +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + + // Read and clear the interrupt status. + uint32_t status = Remote_Tag_Sensor_Bit_Stream_Timer_GetInterruptStatus(); + Remote_Tag_Sensor_Bit_Stream_Timer_ClearInterrupt(CY_TCPWM_INT_ON_TC); + + if (status & CY_TCPWM_INT_ON_TC) + { + // The timer expired. + Remote_Tag_Sensor_Bit_Stream_Timer_TriggerStop(); + Remote_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NumberOfRemoteIncomingPulses = RemotePulseIndex; + RemotePulseIndex = 0; + DisableAllRemoteEdgeISRs(); + RemoteExpectedEdgeDirection = FALLING_EDGE; + const TagSensorsAction_T action = TAG_SENSOR_PROCESS_REMOTE_BUFFER; + xQueueSendFromISR(xQueueTagSensors, &action, &xHigherPriorityTaskWoken); + } + + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); +} + diff --git a/2020TPCApp1.cydsn/Tag_Sensors.h b/2020TPCApp1.cydsn/Tag_Sensors.h new file mode 100644 index 0000000..d32d049 --- /dev/null +++ b/2020TPCApp1.cydsn/Tag_Sensors.h @@ -0,0 +1,16 @@ +#ifndef TAG_SENSORS_H +#define TAG_SENSORS_H + + +extern TaskHandle_t Tag_Sensors_Task_Handle; + +void Tag_Sensors_Init(void); +void Tag_Sensors_Task(void * pvParameters); + +typedef enum +{ + TAG_SENSOR_PROCESS_LOCAL_BUFFER, + TAG_SENSOR_PROCESS_REMOTE_BUFFER +} TagSensorsAction_T; + +#endif // TAG_SENSORS_H \ No newline at end of file diff --git a/2020TPCApp1.cydsn/TopDesign/TopDesign.cysch b/2020TPCApp1.cydsn/TopDesign/TopDesign.cysch new file mode 100644 index 0000000000000000000000000000000000000000..1c3e630cefd6aa3b001f25cfc397d88620cf4f49 GIT binary patch literal 648476 zcmeFY2{_bi{|7vpjD2W9_9;#jB4o=lg(z#OsBB}GWY4}#)@18MT5J(2LZy=Igpjo& z`x>&#zP|T8)3lxE{NM9`&U0PwdEV>KHNW{S_wQc5_vgER$De&O;>W*rGSbz~F7jn~ zv3Ug^$(P~%ACA6sGh`azmIA^Jp@=X;I3lbN7Kn@B%mJ|v+_gp6fPY(XXCLA)0tcR( z5$?Mo4uKXX2uslZ61aDo@CJMvw&m_XkgX$l+Q~uBU;q{HC58||h$4g$`#~or;7kx9 z4$h3hT|w~d0C*w=&Wyp`1B82Kpp7WPoN&Z}Z&PsB3>;}@!Svx$K)+kTmkq*@FaZa` z)ZyS{>*VCiUo(*{IC@#L4S5Xp@;$Whw1)TVB7?r`~XAZ zIoyY1;K5(nho8ZC3M|7E46gz{j$lDY!P4RM{{;{s3~>bT!3`24P*)02RGe^T0`8cB zGb!*d0se_F6$jLo1i&;0PmRG_BH)_<#ILmH{7N@SwWDAvr0E<2lYrB31Jt6Snf+lG zU`rxgtU#}jzNX*WFn#R}a-l0&j3yZKJm?p;0MPypW)y*lL@>jd5DEIfAmWek{c|vr zh{yAkU$X15XMpj*g_IQFbjef2f)7+xDo-xHzRPn7`RIy zA}z6B(z1;K!EC|%)_;I7gcA|sBnU$oaueqVX2t+W@xR9o6kR5O%(ejDMqpLv!2e(A z<IVxYaihw489@T!*>(_TV4P&at1w_A!Grd z%)q%5q2CLH7FysM(#Z<+uL_>JAt3WvgR_f-_VE1+2z~JXb;C>m@r42D#lTS&zW)NGTN0QisA`Ma#?le(l z{fwQqe+xT`gdKoALd^pOq#MAH2mwRdgq?>tumO9kP1rvx(8_|agEjyaP*gh*cJa@# z0dYb6{3noMOb}`~KqnLMfk2P~RD>cA@~;%Yi@@JRKcvXdbp8i%0Yp4BIiOg=fqy{) zWcGiB7L@9y;2wn5egd>i3GF2SY0SY}BH+FVcmjnfYKAPDVzwLDx5I1iv+=aGjJdBgBh5jB>2ERHUm#32z(;?l^_1sDjv*& zWLiKCYl6@M`wJEQ&-|nHH^qSBPkn2HnLCkWml#+8B!UD0sW@S;;4b38K0yMAfP2uK z#1R$>g@h!ymIVLM*fa&_2f#Pf??i#H>#Gv61kWyfQ!(FdA!zCRytKmq6Aj-)!_Ptu z+B!~v!Xp1@k){tk5q_}iKX5JiGJrMDS0p$BF9rtyZT2T5p6MO#6qD) zl>ShYLRkW33Xvs9{0#|V2L7FZX=?Gyg4F&43;MC|uM3d^(}zM0%2z1D;8e}Qf}og# zybUc7B1c2}1ulu``y2rG;T>p1LUBl32+1KNd9gUa;Xm{8yZ__mZ@m2X@JWmlKnnj8 z6#O4J{F`2e?#h2^rC&iS4gd$ORA_VJ2(W}8gysX0`=H7pf>wfX4|+(@^ngYMR7+5u zLEsZXivbgaUX3HL>7mmNZFo}fkc z{j(pf4CY`3`ue(1s70Zd3~eUJjYKU=JcG*@CftK=o-k+y7Y}0^aG6jWLr(&lmQrw` z-@R5UFf*d{M7~TZo=h362PTGN`H0#sfqpW1z&Inp^xDR-h!SPl(57-v;~tP zP6+x4KZqlqb}sNDPdf%2fAOn$+M#mdY5$Gz2oi@BV)%6osDfd{k$P6f@2q^q_!~JOh|wuQ8fH)tbYdGSKJe1!z` ztc3|O14h8$_Cq-WMI$_eUO0pajEck9I5CoD3hu%WG5{%#g zo>&1e{L$>;`-cGHR{{O&tpCXXG5DL3;*aX-*VTUo42(<=jfDL`-9Vcdy7a_ADs=dv z!h)8t2!Ijvfr&bLKL8LkJWN0f2r5zl?9UX34uA>_)chHoz#i5WnW?*C`N^p_9^(E;LVcLh-3X?FuhA~Z-*3|nBNngY|u z^q1T%+4|owI0T%(raS>$o<^&%E zMiBm($NcWR0L}r<%lBj(A?4;vwB$(?|EpI0AM)5Rx$XcGsL)%$0dH>i?vHSt)nLrO zW1@afNSz}D`2W96N&ysdcR&K}{zxL&PreSMFiiBp4|m6|P9l|vsZHKiKov-mzi+G& z)17L7&Ta&%gHECS4kJ!xK-fY(3Ugsl3`66K3m@k95H7Jt5 z>fTLjKNcQPg3ig8HxrKFK+M(pejWAi?Ji6^!Sv<#x{HrsfUjLcV*th;pwmut++i*j z8VS()gz-V>14DNme&EtzxEv-vV89(-L2U#Re_+bcbqD>z{em_qF$4s2SY{wn;R<3G zM1z7<20|)5ATcVjoB(2+Y@L_4749_bjwBbpKmN6LffS&$1Cxa6jN}P{fX8obKlES+ z!X-|GPzot}`fCd)&3=yck|s%-#rGB`K}(BY?4xxs<-f99KZjNRm1F&LB>lf7JqTmz z7(jz>@d`q132B4B>xv&kQGYi>to_Z~{fcSGez5!nT0SuO0G(`TKfyCGfJGSFfoVL* zibVSfW`<#!2xi9MoA4PSECqTb1&v`T49sv5%Pk1N`Bm=2dL|+l5LuZRrumm*j3}_U zJK!srZr)b#g&=4wMKD1a)h4F+!T6APKi}kOhgD18MIU4o&;wEQ>4J;DfQG=V}AN_av7737V;v_Zf7z!wyOkSwrN z1*S`g)l{a03Lv751D}z~4M-J0Bv}Rngpl^%Wf`$T=-20@y&;NBNI@_>39~R(OzPl! z0THPSSP$ZcZ~+r@0E7MP=oN#W{tAqK7G(eb^a1{RMe#2-|4)T}(3*sCXb3?PMo1te z>KlFO%5*5@C%{ro$IWn@TE=bN|ZlL__PR zia{to$d@SyM<~gN!Wit#32^aO#KE5l;KKx223KzfN}Wg=h9ry?z_?$xAL<2YD#L9h zmf*lGCmPf6F4W`1?Uy77Xc!fR0WPTBp&*C48)mo(_9%2CK)MZo$_VvHK9OlWCA zdy5#a76DhJavGA^Osr0X(I)e+jPTU&L0cM{ zpv3APD0JX2CBUS)JK!c^x-s26?e2ulAzpvqN*LH8Uxq6qIwPd5bopT`;W>yAf+GPc z;2T`N2FD*s@OPC1kp%oeG5i?c`nHcS@Bl*+&>DdI2zM41IKeaMvcWSbNr`7fyPQ~w z4}%s&t|p|%xI5rtzxz#)0KCv|A_HT60vA6UdWt}x;DC8dRQCIT6ZYe^2)Ks#V8p=^ zAOLDM80h_<`hd@&um8O?gIM7GpDyBsZZ8buz~~c{fRHlqCp1t^5-cO=c73MnR zKT=}q-=YLjz#RhCI58w@17rZKjQy{o$alp7wE+1t4dDn5-)w+D@PK3kz;mAVAaEoo z4(Lqqv|j|5-xLQ=yFHTAv;7xeeDq}Bc^ zr=cxN%47U9e?&pFC`i7VDOlKd4ML3KK*a>;u>*WTql45$69{v2&=^+WlC4uxE`T;9 zN0Zb>3v}lM{-KhAzjcK4;%R^Ojm9KYy_pp4-0^0C&Vd1nLxZEEr677BwAK~FF41w-sW7&`$ju8bAk!cw6D#lEI-Az?7g^gxKY2?*`NPmC(eP1ZetA=D>X;(dDN- zB<2N4#_CUOz}*4+!F0oZh{iGT2-p9^kVN|!0^!HK?|u1vg|oV~{@ zYn4}{KOr)3F59SVKhHkh>}$Cr>bBBr6}GDtPD_I^nlW*U4@a7O+?Sl*3>k=ft+aQ? zqvaNRM(SJ&zX*3;CT9zQyB1a&X6xBM@;Jh4%&9kkSwkmwreb8qChN{VLG(aheZFbl zR4%hd_wt7qseWi_%jKnnjitM>63VomtGRg2tnNRzhKUyTHSK1F++4jyovGHLQ zjnq+#@nk{|q%rp3$0`HVTH+IoMv(~PI!%$59|{7yKWfIh3l%Qxz&m9i7| z%~C_LqWbPl>8UlE-ujN1c46dx3gcN-P1hx-{pOg;BGbGoa}4uM z%CASoUK6n9p%LE>C-jQv;-#l|)Qi?fi{#>b)|Z-Ji$5*qe^{e&A3Y$H%CB*N!a>9w zlQpZO8;f7$&-jFmmx^1MPSY6jyiha}8zFZkd>~?DF(U0%*IZ_qC$m7S5`ng=WQM1D zt@mcw>n)Bjw}tkleA^_+f>{a{01P|_J zuR6Y>ZgB@GHOd{4P`5gjJfdQ-J`0eTO%{ zH7|)f=1ytX-`OWUq4X9XYd7We@~zmu^sHo01t})*Sc0+pOdVLs6@WIHZ5l$2ipMp5mDI5Z&BAd}3RZgEh7GgEL7QE72 z3P$ytkz9+#I4MBYJ}4Yof6oOHMy_DYOz2MGbeL^xt&w4&ajEfwTLRdv0KMkiSx2E{ zzhX5LIb?~B?rLZYduUPVL(#~gW!lZ?0h5(GNH^pB(h!!amACl($&%&=K@!|sG3mX~&!0T$Idm|V$_QJTp5iF~oXdh5 zEW6e0-`3Vc>}W+GCGhdme|W`LGFE3XHejdD0HkW{wQYRlRM$CC;a zGhMQ&+NJndwXuq+GZt~L--f)%9~2C7K9g-kLlAqaJuyB@F=-3=L$cyV@}|;jQw3?F za#MEb0oRmr7D{%N{L<2NUQeZftOtwK{N@-t%o=U^0$%UD=(fUA5xJ@U_skZUPgo4S zL;YIo^$~2{deyev;LHOIQjyx-UPZC^*qMmjiHU{D!WO5&XdR7u*9y_p_U`rhvOGcE zY;s{J8J-v0b4#Xuewwf*kTA7h%j9jZn8%EKKXSzm<3cgRBhBCw@ZKEb8W526F#CB4 zOVyPLY$h$mWqxxWJ;ewxM@sRnrDTA8pPFouHODB+SxK{5V{S~|`cz!!x?#`@iBdFT z>d2H>pf8E+43XkZbFG{-R(!XJdUulUd*C zI9q79qYwJsj_m2rl%kPO|miXz648@RI8VOEBG{9^89f#f@53$)~wIa{aGE zkqMIys3&h*u-GCV3ydz3isCX$@S8H)a{2x_9bJo$wL@xxNz4>a=+I@cj(vUEJl^~W- z_F$o;N{f6u%rxVNk;!fk={4a;cuQ201BH`qmCm_`*L&|Lhu`L0p9*rUT)nRjH0d^o zOV94btTXe7wLXQ#ZBKOioi+4|#O45W%)# zcjUc&CC8B8dD=oo_Fxl+`2&%%BiN~d2o?l$V?X1KEWC`fw5BM7Bjz@~=lymL%KFmf z=8pLi&wV(`l)(n~t1vAWD2x3CQvpJ;>p&ez zp)}Y|j_RnkAKI4$CL_C4gSVse&&oDNIpk#Fr}#5;k-cYhJ1F|l5FlaxF*f{cRBsy> z&&>DDo6dPknvlqj8ZH^bJ( zyVu8O8-nDV+zOrq5J^8@^_tDpj z)dGNl$q+YQ6W6DwD1_dem9$T)u&~tqH_h&V{@gyNam9#cS3yqe-|lBPx5(wrH-tk4Xu7`gr9_-9cOT&)Nxj z?0brOR<1y$I!Y_~c>aaY%8Rs`eXnXMROu4UFoV|Ya?$Nx=;FYO*#XEA3(R8Zyc%28 z2sYev7lmu>_Uvi;gl>l|90wcU;w`suh|)TVV?GPR3=QzeO$ondfVwOhPHxjeVT0-b;VqDF8Y+hqo)B^ zuRo|$$|@dEX)D}X^m~h4-xXemn1ga|oO5ND$y-DqiZU5{B5uSl)mmsU8+uNEPT$dy z#{JmC5i|aV%`Xkr(5Vw&d>}Etnx!hf*(wMyG&C0k#_Ee%DaBXcMu?PzmU2|_ci@fa z{8zAj8`#>rdfu1cVtcT;!Qo}w+t29QsYuhLuY@wA%d5$P0v(oi{Y?&T*otUcgO0&+|x?%t-f9ry&kWSjl1&b#yV77bIdXIar=VHw$HH$ z861Cu?-}J!z}Idx&0`YqS(1b8-h{dU?>XPUzEHF= z+s9nwy1Y6h&xJ-H)9N{=%HOsKIBd!{W(YmB-*x*Z*-UnUE%Q!^OGYdXj#~;c@I8zl zwumF&WM#*T#QCU=Dauc{J=M{5z_h9CxH=4GbfOlR7yRq=o3pY%TjWdA)X4YSh(^9Y zz)<|z$oZrPk06Iyj&ga)o2o-W+NE<8Woesz3&Y|Qr+Q;j1 z^x8T2bIP}dg4WXNRKIYTwDo8HVjC zjOvHVdbY)9t))3@tu0Gke&wnB!LfFL&`l7h&uKEOdnR%6izW0o@C_&tI<2MI_QaA< z4gYDmrz-L6GLO-h@r_HPSZRtrN#tWZt8!3}n871_PxMwp-1G+a(+bugij7LBjJ4|M zI*Sl{)sS1%8#XV%-wf=jmY&PhHHNroFU%KcU%5=`Dn``1p5Ya;MSrsIX1~{W1X1*Y zrhSXeTk*ZqJ1Z^Rk~}z__ZJ>s@>&};9MaLF_h>CkJ=f94R3>MbZFCR#pbLR#>NdmZF0;vz7&0$W;In;`6f^w<@OvITmZHy|dckSof=199rUBgZuE>cp9gd#jF%%9&7_ga4I4Bs~Sy3PoZ zX_l%H8JZe;?RP-a?ePD6`O?#=kmg|5ERTCN;!5ZC(r$m*NKg6nk!Yqg>zf?@0fmd# z!uZ!qrWvzb$s^uWZd64$;Yu!FhH`Txej%TCLv!_d!m6nR)~e?=y|=4$UBHCv=Q*)M z+!2dx>Nv@p@5xT(i0CrKIt+VBA>YIe??+DS=xWyb@XVHNPZ&kt^9&fgIxG%VS_G6_ zS*gep{){}R`_>t6BviEf1Pof>29F$$t+@K+5>g(+tK0q_QON#|CTz~uraH&c#K3;C z?sb2X&1*lqq>igXWzRHMH;zqBhSR$@_}!2%I-4yEOa^g=MR#hN-qwK^Htpi*Bb_}= zei0}+Wi}@+U^#tYph2RDv3qK zBOu_(L-c7O>CNe?dMx7i^^aQ=B+b~}>pyj~Q{l$5TVLD_ZteThNXwwXBI9`L{3J_8 zmK{^eo$l37BgZ4$-#Min?6kTsPb0n+_-k}zg%u?mPDS(2vIbkUZ4iw{?;;o2BddE9 zED}AqvOi8OuOqe684h1&|eDpV=9iZX0aTNjPwy9PLy z@S322k#rMZjF0v8!bn#SM2=98A$yOMy5CGHD!q&>u_*Rt%`(S$GcmE>Sl6OvW3^|s zU7@yiHhMK6)&uQN0+q@P!m(ElBAy9teMn-mz?a(LWj4Y=r zj4tCXjgOdJ^CB_>DINX*_bFoN|Oeuy(_{9zUSeefenFCCXnkmSU znpl+}yq#gu=j}7mQFq^Sjhpa=C(fx#VxH+YaX4X6F*NtN>=*@SE{6`&ydf*_#swjT zH&*L6Jl$9Ox#T;?FS@XO?!2te1olUNv*hDBgM~ciFgC+BJ@=6m8#`gU&P{$~s4F7D z?+;P*dKMVVtofQ+^$0WEa3sqbNa3C)Q$|+}?v!t^C(kmi+$KVSEq~A7^MsH7>aa82 z=Ab>^lx$QhPqTATr5lPqWE_+mO&`pe>=+iQX|gg_B^O@UDN6$$FWW8!?f#e77_zcw z6NXpRhuC|qfi-lGGu8E`ImW>IL+9r>^Z}H)Ew{gF!2q@-{nCCpTdtCR26K-m1;yKD zxHX)rY;EX2287F0(GTsC9^k*=8+$e|RN-uqNWD#aYWG@acieoJ$D~=&o6HEn`%L78 zu`egRCToOJyXK$2P&ZsGWiD;lFPTFY;-@5ml~}~IG?%x~8L=YLFI2t5-ax9|yF-t? zRoG}Z{v|$|USto_$|k#v)*mn!e@1~PYNmHS=tRdAG{p>+XT{Y63>&KL%L&7B$SVhc zoh*5>k%Mx5+nSM~VkK=kyNayZwXAG4?{hGg(CcJsL&p;?LYB0S7`;zch!x#eGRk7# ze%D2;Dq$}Ah1FZtwfB}ihumi#(jNan+s}$U^F$`2^1NG>$&>Ywg!L=RbN#1A92}$T^kHqSd&6seJU!mXtV84ydhdt~b)JXJwag}0eHJZGhRdE@+2+VM z7kX~dd)8W1D6j-nJW;+iwCaSJzn3K+bv|fM#V&WxfRtplRYs7hhu;5SqjRiBEj9<$SNSqV$;t6T8^s9A##c|>=nP^Hh>jVW z>}}RKXd^vUj7(FOo4K~?C%~Q~)ih3iZWBQ2fz5I$`3nV;va+A{NAzCXS;^@!HoLLj zypeQ%D;*xBg3!_+%gq%KRauQ#F`%ZOu}I!#fDxKJYRrB(}z<*1NvNFCHoNdKKnB)Gr|5h#03&L5ol{0`Efj^-bVy@D!E0 zk2vi#z`dp|m)IJJloAOSS&9@>EQNMl~Jbe_GCV;mk`UyXnV3`}*{@-L5a1mAhOD zWR&k&w4d?3H4>KH_99ZhImhmis*X_fHLsTHsAY?pl{~i{Xf&6tk&euVLC(cu3XK=9 zI>!T-i;M(8P-;=G-@^NoMeZeh{cd{69^a9Et_?{ST8SWr$lg1>nR0ZuAD7+?qwvc@ z#eNd&vyzzPmMIEqtVcz8PZeXeW->=8RJz!6Fb4;C)o0EZ9!|zxJ8Otr+O^DGiZ|j4 zHo)}?+4M7hczhPwXpwKjE6rXxq`5}J`LK#5xN%E&xQLYnZizo*QFE5N7GG|W?{?F; z4m(kKsL4X3i&?*2$*Yn6nQckG=lLLao4FW)l+KAzqhZC^7?EO~Wvvlu-^HEv(=u?RIGszVA)2QPqlV@>9Z)q#Q?(|i%;C=&P;i|j?C@x*sRt) zZ2(LmZ{Y}vB|rH^zY!Czl^qfN7mw^grlXjToY(O=dm*1aV~0gH9+9(DylGuJclZ>= z#5r#i+sUS$on;g4J%RWmZp=%yTuwqJ*INwgYbgX?ue@)56sXg0&zf~G(lx*gDYiLnWRz zpJ|oNs2AFBCFH%!mZ;`I!xY{9Et(Z1#yk+(9oudtS&xynt7NNS*8Kv3J z*hNOB4_LY857(7JhigG}7a1wcC11VLzp>@o;bzf4^@a7~A$=0VFp`7Ebs6I5nrJIr7F(kKe1|7WG1!8Yg`iO*may?}9H@(+de7u$mKp0`f zYtn-&B0wdjve>sI3uH$Ef9rQpph-UN8F**ELLhr&Xvb0%la9g^LoJuvQqQ|+?&{PM z-jO{*T6AvWJ04-(k}qD9n7GEdLZv$i!gj~?&c(5*D102RR+?4t+7gG}EE;JC0%@=7 zU2Rf}v$FfRsDPzyjVZjwkT5zUkl}E1*9XNZ#?y`%abzzm2>po!MWOvg8N33XX|BNN zpZ?3C@f|l8o-Lm=GVHDPu(jp#y_T8sXxhZpBWu>pe^d=6bHSu5qIz6IhFuiPX(w-? z1oAQtkrh7yVxV7QG5PMLp?x4U>$|~>it-e{Un-o~Gk5f1#ljT6fMv3-7pcrLyR&;n zE%|gI*%19^`ld@uXE;9jxyID_F1vE>lcz|uJIuP{jW#MU%4Bx$^>OXR)4n2R1{J&% zzguJMV?FAyz|@pvU|akmkO4r#PA=d7x~+2L@wEo_;CgJIeB*xPV<({LgZ6L=Qe0MY zdW+4bAGq6bCA_Fjc2G+oDOsaHE_=06d~=x%hH-iRiRA2qzK3daPxW6t-^QV`ekod@ z`(U5jirW3E-JcfF=(gIjn$$zFX4o?<7FMUwvo?b`_m*>w9Oo%UoDzK6wv;wdrE8E*CzsBOP^_ok74x`=Vb{xtAlt(Up@GA;MlUfP6XaG*S?I@q!IzQ^(C{ z+oBsN>ONSN7)-Z&s0|n>?5OJ@s0Gnz$}DB z4Qty)Q7zzWHTw@xZ1v#_Amd6KcGx0ofLqehT{}|B4+4@5(vhl~o(Eb~_N|TKfj^d_ z;4YBl$eSkxe0Q#qtHa(=RP0q_$xv4?az=M<2d{cT@JvigATZP48zFw-Ejyt%GW5Xay{nxxPX9Ql8cYk)#v9%4*Ipd%e;4;V!W|M-c143 z(8klYbJ!~u*?X}^{G%5a)m=?0)oo^%HS!Ds*`tq3vtn6NiWncsC^SmhuGDpt*QsU?&m+6f2EjpD4A=`a-yC!Oq9)c zr+o}cd;oVX?ARvqd&VkfJpAl#>sxrPJNd1+Zrc24$8~-qKG9N{UsZ36PcO^WmG5-cZ;BylgL^6wIbw z-w%RdAuu2T)tE&iBbMa1E^pv-yf70W*fm=CNKh-`gsrV#lX+)>esaOJ!g=me^;EKD z5zBhD>-JrS=}yS@+&PcuZY)mMcu_MST-{=N)l`4&5+tWk(+GRNH9X_Ok7HqE&r zBfW_u^}dd-q}nxWOfNQ5@=XiYlXv-$9bKsjlNk5buEWRKUCopnJPha!S zzLheysgoQO#yu_+JiHb?1+SG>sRg>+w%F$HEu+17T~KpwC@}uZ0iKDbMC5*QyMRX_ z4cn~;N05BSx?ImKZ{Dss@?d~<(TQF$@1)|Zx|yhJZf#l8J}I$tH&Aado3PQThY( zwzP?p7ioINt4n2Ag=YPqG^g$|Y`{?@Uh8tb$%#vLp7|J&Tj5m_7~cywbxKF~6qVW@ z^J52e7HM5VOsvK@1F__HUQb&cap325guwFI3^)w)N(72dqN>0{o<)kXEv*+h{N-#E7bF^^h@XqrM%E@qB*wr z6xPI;O^i00?-KNqX6vMIXG2~}xafGNowofVb7f?%ssh@dTFK9M21^z4MC*{+wbR>` zLM*G9My_*W+36nKdvv5cUqB`N5W?98RzDNw zKbWl8kwI~fnS0Ay0he(lSb+4h>q^$k-U&UA3zY7xgVKB+9kudc= zZ4)TdYh=om7#)=1WOT%K38AD>e!YUGmJElCF{!l&nUhkL*74jHVobmXbQ zDn8vKuaaV+&;ki9p{&n=(ytDk^Rn^1fh_5pyY&g{8bxJ+S(#zHv2pj^)5XtMt`6%W z_XqWWh&zm?Jzg8=J5@9_D^h7@8@~rUHfJyH`a={ zJ~-;*)t_1VWGQ4kC12FKC!D1|WJ&+dvAKR&{xhyozjVTiH#g98Fr~y@=@N4n+07W& zWSLD?RrNEJtY4IFXAhok$=-kCxLDCbZf7beQes<`XgJO`L0Er}<)*QHDZk$nIWTB< zmhW`K?`aLoC9fKk6eNcu1%)%KGb>W9`JQCiV7i4jzvj0&-0US$Dt7GN_#*ok9Rysw zC92dtIxjKIzCJ5Emww<-;l^b)s&@N{n;>HhO>4upPh7_uVZv-R^o10|7)|3Y_XUuL z0O|b|9bIQ$=@yv&K@SK!VwOW&szbso&W#UGAM6~_7?ihsSf?a8o8Wc4?@MpWu=mx` z$uCzpM;^2%u^A3$w;yhxsy%(yI|{!zaLwe4gR5k$(jLcDOxQ>jnd_W3D>o2E9jl+YYvBj8H6~b>tGYwLaa=%{?~qx|xM?A|+8)#_*oa zw3t}(+vu*z1LqvPL5&#g(Ljmw$<7G&;1(eU=i@7ms3sd8&&?K?n_GG!6*fYdtud_> zCxE<`i+pm8L6l*YSsGMWq-W?U%J=q+H0de&9REmh`2fQj_gw>=Y=|hPp!Bjy|MA_Y z>$+FpcC&x5)wlO!>o972ZgcLr%QHIcxZ%ofiqj*fQ>TMi1CG+i{pK@_>3eX;)9$=@ zl$%QYz`3@8ou8IA2~M64tkRy{ddc;r-tLLcOV1-ZQ-wTxY3{h2e*k80e}`lJU~%3< z8Q(oxO@exiPxu_=$noMXlqJojCDxY5x-Bzv1ozQd>K1aw{jPi_D&9!SNK9n21o}h5 z!Z{qONkNp)bN5wk+xO;&|$MlJH4FyhU{NmA@p(P^WMr_U+c zZd~EKI$U|4`!1JRllayO4JSv8+s(ea3vufUAb?nw_eivB=EjTKHnx^q;mS9q71vIC zHd|}9EUQXW<~h~Ri8d*qXC3Y>^rX|DZnFM-sey9HYH+WW3jfR=1xrtPv_9_M{$R*2e~ zF#TE51*8N(vRZK=S#22WKv!;#;T>W8aA!mX2(7Eb)70q~c?MWPi0`9X8n8_Xayw{z zf1G^q_XLU|19M8Gbm z?~mWtxVP;X^AW2Z&l;sM7MPE9lrOwNY_6cRZ^!{e`E zCV5R`cE$(u80A1_fvHdGcuqe+waTwA&5((g@vrpjmz+9Y@PV3OFnbuaV)L4ECzkxK1sqEAmgqFO9ohfHc{1lx0DH8X{>5j~E zVny0K+cFK@1@bwvia9Z-XEpR@T0ZU3Zn}BDGrPSKv!^?Ub-ON~DQKuL^=$dARTt+Y z8OPgi4h}})?p#C!mg{p$?#M(}h%hw?w{o*1nW9Zovvcctx4a6ePte=tHRZ;dc8zm7 z8r}8q9kolK@se14kKXlP6RrvvHBO?0`Lj+P783=YIU>|XP2pP-ARJ9EkT4x$tt_GwMufb9)a z!z6YpB|q`N`dM_zVD5T`bW&i$i@nJFNNdZyVafHy{vew?0I3!R3t*pWlyqc|a5;h#Yz%1BF zZCG_iUH-)#>ekM1l!xEzyS3S5860_nvm#asg9fek`j-&ze*668T7;)*YbL>uuH0BQ z+^|k%5V<+;v@^ib#wH zu5hU1e%J@H+xQ&!Bf4|$3u}(3KHv%&wl(2<1Twf6>UDIzZ}!nR@a7ekHl5L(z^?CN z5B903ftHuAkJ*;B`^!Nm3Q;rTwmx?@E=WDB$=k%%GsW_7)>|1tPjTK?tog+-Tivev zqnUo`Sed?#qf(D%`7>{D+J{V5pLDu0n>2bV;kxE*c9D6qiUhyOyR;giVQTJzv5@>* zLl-?U9M8s4Mk*bH(`i1-X=AQ?j_f_EcV}0?rbA~=;CydwVvVXW!|3-nCh1ip?F`K> zRZCwttd`Uq8s+}o@c5U>N&d(dxVp2*5xQ47*WY44ZKwP`9$XGZ% z+{M_!_>gPB-{5h8#$)wsom4%AwdNss%4!8oyw%NP+SRw+cGP!7`Yt<(L)(F)%2P`_ z4*wa8?rt~4;ZQTzK%wf!H7y^$l&9I%M@m6u1GE8U)Q)ec+z<1AOz)3YT)|GUfLsc_ zXAiQOezlmMcJy(k>&F^{(`~18h8=U9Kv&*8SF2XFlB@-B?Z7aBM9k zLiMV_?5@37ZQ4EPOs()-&EKN?#7xif$whxiSmUB`S$3$64@Erfo*X{W>YdA za)TcSqMn@5OQ|32&uaMKMW^U@nEtt-OHvt#u7V6MS5*+O7C`2i!wfyJgCli#LxnO3 zQCTb>1roe1xB4wNu7o$cxiOv2#78Bog_jt%^@$p=rv|fB70P_3SH$oY||!%y;eKx9olQBs{z2j0f2c%_BA-E(+9XEk!C*c-mI~ySfkT3QA{DMxI)h zQ};GWZ|L3Smnr&eG=SL@oWRB?oV-W9(@qEP@a8z8DvKqq8A_Z6eu3x5?JLe$NQ2^m zF`zA_!(xE^46Zv6Y4Hg7t+a}UxVY^gehLcCA635O8nea>GJ<86^9#_H?g&*LG}I~n zI4#N5ygw%eYhf(*Ou|{v(zyW@=5D%-EJ&w6rq5Lpc;EW2j|#Ju8<(AzqBm;rZtlke zH5lP>^aL60D!ZjRd$iUO_L8EoadLYJf_yY;TXo5b zxEZq{-HH(t>i1v|?GCZJ+=bawXOR3MT+=(ttRmS&nj~qk=?hx!Q_aQJu{DirkU1x? z`5b52BqbR@OkzXfL34M}i-Qb;Ng#O(-1LKuk0~`MfUz(Q3fNgCWkBk^T7K(!P!bjW zJXp>Jv!Y4C>DrS$HcFjuUN$O@PW&Q%z-gR)nJ3PS-MMb~2B+U%t5cH?>5c|%E75T( zn$$^FP1{*H@ZnJ5jQE}M;)^YavK+dByPn6E&fgR%=KdJ`MI<-u$|uiAeG37D1rK#i zpXKHtn*zc%%79STc&IY!M08OFui*CX{_1TkQQ;xK?Fg$LLw!2Z6SDVATrVvx!}RUF z-0}g}(wfBkLp+);3r)zP2b;a#@J|r-llI_*BRrEpEQy73UF$O- zf_#{cXyo&4oglw^eD_(!AXrs$ql04Rs82wEj)^jd^LFMWWivw^qq{y`sp>BJ%GxgX zuO5lfxJ-{5xjC#tp+A6NvpO6&`mp=zhmnIuGp5{2QCZf*Ub~u)oT0r{(IbtnZ6bSb zVE(*c>vk1#?uulQyQj29f0^IM^_5Ba3!?;!*Q97|-egGUwZZXt1mkZ}H$t}ISdzIUI+=PI5_vpXxN_T}9P@6^Z>4utv;_7< zM>S=t1?8SRpC-{?)_gRYibY9EVRzK;)aOUE->9Rb54ar;pP`e}8NR{wMW-!vi_;?37qS55@`1 zjwgT8cIwD<;!#SI-KRC?`Wn4;=Q)StocGQ>P@cl0WosNT>{g-SB8Ui&j{ZQKLLx?c zsWer7vk!OB}Pi5c84 z7Z`0pb(MGEQSI-#ObYk7fZ?79?6yl=^7T9MGd1k#Zt*t>yPU|V-l_0?-x+dx3 zh+yW3NLFjJ0M%Rp2N?46@^%%KHtos_7jfIe5h1>{aQS@}=M9%QeE+Ev^4jvN&Wv;W zoh90s_{18&7)UE}yiZRvsIQ91ziC*@BcM5TLg)>%DA}}*{%`V`$3b#CcG@&oDA^=+ zvN$9E$)Ov2O4qSwGtymW3aI*V1$LcY%g+o~p5gA;5-ivVw^|cDs>3_=tPY>KzvC`n zs>+G%lexKj<;nt2DQy$n&bsQ~DQd&7K;ATv^kT4Ep5^eHXgLNm7tV4wPdULRgtdXX z_~H>DYAog$6nygEu8=AQ_qL#Z^TPf+#SEszl+?#Gh940`TZf zyxz<4$eXZAmVagg8;Q;;wwq|2%ko*nxwSCDpLn#kTsSx@)lNT7C2QAtKkrU>S>`*b z;VqVGZ1zXetsZ*s3>*6mXBCH%t9eoVyIdVvJfCWtpOd~>hVbptV^?*g@-_TcExDC$ zbb7E}FUt)qETlVUBknF}49%ioWtm;u({Pzn>eFM?DaR=M(s;{NsqTn`ZUbw9tA zPG`^gsw)mshFMcRsxNnEy_q3PWV!Xl&8-}n^W?*mP{^tv2Q)X8*UPoxxn*sq_f2C- z2G0tQI%SXzw>S+Pl^T8l$;}(o{B@;ISb~@umtgK&a)LvY(I>ze5h118KIeFcZqDh01LUR7UwQsbgfe06uGcM6i8VG^VGlb9s5nCH*Y2I zyqJ|h1-DXdnnbE&S(LHpqt{nmDz#YD4EStC8G@?&s%;Wi`L0%XMl0*^`%U*g;LL}9 znG?Faq3vzE0vnaRr!;e;{0{Uz;9G-aqeZ^t?eYjm+pEK?p$j<@jtX~uDn_j_Js@^c zSzzZrX2Nw)U?{Jz(tE5jwOLcXvz^*qYj%5L7b?zAJQGKsXl>pFelKO%!Zk{BkB+sk z3AIZ`v%A!H^ilOr_h+KRc0(uk9y92(T2j)hIxnK{vp2u%BJ-DA0p|W<3wp!fx@G5E zO)UWbsC-M1hrVg>!}B+Iz!CpUtrD(X&mNjQ7|? zIxT(aay2$JICnC8h03IJ4rScJC0j^O)yK6Up72-itJ_;m<#xd@=W5s8x9w>~^b{;} zEMGdT^T2P_L@#U*gDBn$ue#M9xZi8)WtCxV=yV(2Q~UqWbQXS1zVF)yCk$znZbT&o zq(Qod(jW|_NXI}nn$i8-`29Wq!LHYR@4U|YJdfjj zR4XKPimS1=7b;&OkmLuSY7(iJ1&B)`qzbJhGXLUe4Mt4yRa&Y@4wBWrRsY}kq#hbp zWR|Zvqv}1gd`-6t%s^{y3vX8l<5l7g=Yt*4H#)rbs*M}6Rg!O!rc-hPAfIV>>;Q+B zSaT;yxRo*VG$nk&aa;m|ly`zSsYynS|Hi=|DL#qKmZTCMdh>B7q&y$FFE@tDym}P3 zYKyPCVs11$06AjMK~(zE#@1rnP2_ho)%Ju-85>AjwQj9q5dk&-N^fqr$v|#o-b7x% zn?(i#Db+7ZB6se+s4r{_R=?|YHKE$j%U1>nf+D5#ZCaJTNj@s+I&{QoG=s}l_f34d zRd4H0X>|>}?P*1$eAX{O*wv5uMs}Chb+wauki=Q^%viBGHxp`^%Y^s80N)jDMMg&vpUBW!r2dPxJFW_XbWxnYW;l0 zqvhaxU9I4RVE+3reeH3=t1j!mcU;2SxEEC*?c9px)!L^dL!YLv2&+TRBU~j}ylaMq zHzNK$ND$Kw;WA-Qh$$f(9^vDn@d({>WX)-2iR3-bEaE5-^Xb#=viKv6t_~`_xA2rg zTL$YlJtwFAq$pwej`e9SFp3BsF!TZ|gnn+{YpHkM0hSO1fJDvA+=boTC#id!WA{f}dRw|CJBQx80VFMgNQ{O9Dd zh)1ILna`B6^(TMJ`QzsYJ%R(?3E3hELjCV>BMdIYG zh|C&&iotjPal~|@0l6PV^!%;2a>>)G(K*drqg?j)H9TngUyrBkB2Ny9d8%_mIF6nV z=DB-XWoh%F+ah>my9=xHB@5L-ujePprATx{lS&eaeCGd(HqjmT{A-9@01Mkp(lcTN z_?6z5d|LWasTiJYNphgI3o45eu=H@HWN{&k_)-EQs^@A>DWQ`>7-1E^ce42Bx8gSV zNsz4d39Am)w!&}Qp;fszO!=l`JH|@YzzX$&i4ZXM391e1^^0+O^gbGWO-R)Dy<6v$ zUiC~CmT>JZdGJf9gkfPXyxX;shxx1@QhPJ2sE7_ds@weBlp)6?ml5t*SoOvi5f9>Y zCo5-BNO>rO6zWjW3-Z7sy2%etYL`r1%Sc+J)J6o2#1RDPRl{KBbtqlrDARyJR#veq zTSqd799^l`>g;5vW#Ibr#WY8kXd~ha3y{F09qf-q??Av8;q^GzRgP}OUYK--z9LF@ z|Las2?W*1xZgIj2o|At4&tU2(_19@7tZDeGOlxkDP|e~Wi6&<@^rN(&OO!|RhySlA z)z0W2Sw4RqAbz_OFL7b%XUFpLX5R|-|07X?q&eev6{rIrobMkA0|R;(k27^Lu%*cO z=cwgHwyY!rKGa)JFPHn+n7cL<>>ewr=cASidJGOIjIRIvmv&Tds?>td#;S(Tx$SfL zz{`wJe*6}4wd`}2)Xxd(#rbm<{b;BBn-$w0s%MWDy!mX+9{YD&&ssz7soCiDk=cz$ z%k+?==vKo2{=hd8&Vc*0<-Y1z)WhQVS79Np`wM5ANF6euq;s)&i@1HlU8IztdQfVY zul|};4l&eOH&(u^*1iY{ASd&A61|_sEKC*$bPh{G1GbFY0zKkHo2Mz7DdQpVhnlD>y&XAV78s!pn4CMLc}H4SA_CD7#TIeW zjSV{T$Zy9>I9aSMr-T^QUU4s^4)W(Xx)(5zTv!3m+VSo%pi|Yp3rcF@*5s7h zF{eC|u~ionA{bIPprSt6o`e>aJo~upu@4Fb1tIPgxN+d7%d&Y2Lc1zWn?HC>$ZQ5T z;(rjlc;IYWDdU0fihmtX9*sVQC=AQF)AM`g&l0a1{sL5U34*uQlJ@w$gOWBMU*NKn z<{gwot?>u>Y%Y#hAH94P@Yaa_=ZN^|WwtM=?_85`?u%Uo6&f>J#K@_ERfuVKaSTg%Y4V8KXtG!PC<#0WCIS3YGuwAFS* zUQaf|OI-cD3oT_vhbYsg(zb+&*OPd~tbd9H7U$4?UqlU%`wN!ALYosGOx^h{v;x_# zBTcOi5r*6|d=89HE+GmzA(?cffT83%?&CLnz^73GtO%EcOyU2G7;wNQ4@fsLve$h# z;=F?`E4MD`Hfe>3NI`K=2M%e@^G&Hdo5+;mua)J-dny+t3+1xBOos~&AUg$)ay?qs zHEou4vez%8#aqJ@T+VbHC%JxHzIwuXFhy10Y+$6|Z7`*j60!P|2cDqCd_4H?bc_Lq zW9H&{!mnEN@$x_DxooyAy;OSh6B+3&3r3looxW1C`0693&8(BiT;q;0mgF4Kz1B4? z91vs+;3682nXv&R5I+%g;qx;+g8_siU4-DSEcCZX=I3LxW;6d$m;j&GHt;#HE})$b z5^S9Lypl1u`UFV@HSUyAp0&l_@||bqj7(b)(5!F%eXI;0w6CWk9%oxLmNoZDCsnjg z{v>JZUthWO%qPl=L0;VY==JZ(*O1}M?F}K)5+O3RDa4YG#~MK}Sn#J>cA`kc!H=rX z&v%;57vB?v|BU@{ODrfR&?V*~2A>cdEU-SVCd4mF_>aL?nMQg%Z0nV}Vo4#KJMIoG zvDNFehp{WP__0XV&d|)N9+De*niDo$5a^v&)VPbu!EP zbtdMaI1J@aQh3Dz>_Axnw{*84Fl*ie2RTcwM6y?CSO>g6kx9*WQZpXYb5a|XGW8vG zXM`=_mF8%c@I5j6#xkB%VmUNO6WYf5y*WG^Wr}rs#_0a@pnV{b*Eqv?`Z3~dq`NEW zmrpzgFIsKU2!de9wgonE5iGM8Vt(_#LmDk$sk!kIRkc{EetAdTQwGHn^t|{e82+$0 z-&0DJ-{PJH@%J6!#3$n+Dn(GnL`mXW&WaKUe2mM6%8|G?VSi}JQlJGg_rIe$9$p12 z8!`blvMr@PV9%=sEdBs#3%m;pD3x!}=W!orJ_W*VI9i6}WDfJl_B*;DR)$dcX%GLg zXRxE3Q)wTC0mBQ~JpQqDljnbf4L!Irqw|JfMZ2SI4-5W^d>qtjD}twi*xtHz_PKhu zyWS~`!*bWx_vQLX6wH-D?7)pwws_m-R#beDlZD>|H$%WqwI)dPt|DN&BZ_mw%g2V@ zQSh8FGt%SpA_bo57rpG~_fw3#Kjr7Xe1N9R=>6=MlH*Y$Ogs`Jw=Zl; zPqh>OI~M1p;P^Ed&>GWU!lf$#6UQ^qr*2BXiy%G>*gk<>%IR&h7yXV^Tz&s-pt2ia z*7Z)kX;}f>oU$h@xnvonc>(JDdS3Z$!I~p?##2K>KFhdNB$crI17QGc zcIbc{%*R#2f> z+d9Cq0`@r`!PH}Qb1iSO?B;~PfS(S~U-W$kG#h~Ea9Hkhbb-3eNi7EOXfGCnrP1=; z@F}XBGufMUOnx*ULgp@s13O0*5a7Tc3U zaN!#9*1WZ)y-_$RPV~`tb0RLJw_v8{f6$p&P<@{CFP%-g+BfrWrdf&PGFbfgI=cgB z$caBOgxE-LzOEwI{-G_{k={kg9`dk~bg5WQ*YVDN8}{H6F-G0G1pcer+lu_fyWH`p zWS2_fHhJzv-Ee`j;5T+O9M^WnjjjPX+4U^iF3nV#gt? z#2*3Cn3?(27|Yd|z@kTQUIg~^SVHdhr)0$rV z`P3&O`JQW2`#t(3aQ7tqs-BJZzSy0PBcl!~1Vxl`5hvmmrJeFOIu=Z+p$1!dUg5Yr z^{E;?gp)fa%N_C;x0ErNTI$0=DLk2sL>}9@3ym0C564$(QvvRXemVk}!xS(d=;Nu_ zxsh81_S294U3d=w*Qh)2x$l&^+wyQ0bY+bOAD0<1^Us@ShGm$(aFUwCFa*0Nw_{-Y z2j=}q53*N;5rN0GM1O){W46C&e3WFGQv#oxO?)l4!NZpMhSV&o8T7uEfNp$}Os+v| zW(=*+#bF^=D=m|vS*C-x2RiNe_=@xgB_l{CNd` zlH{+797roUpAyGkx^?UP*)_kso}jX$HSq5T#hKh*d1yw0w?`^|n|9bl#i0;J>Kj#C zA@abmo&eS(*|95r2a#LvCx766G;-wf*9h@}G4yhU|9a&R*wP5i$~)vm(Cn@^uP`q+ z+xSs2m7j0<=0)VHMhhTCn}zO4(8k#8S7o$#U0FyX46t;aaw!eeXBL5sWji zsnFxZ+HHID>6opiYL==mCYapL!0!F80k8;@a;D#cY{P4zSgy`Vyw`iJjw`qaYoppwGCN0`(!&Otazk@w-}! z*aNA@Q(gT$2jDk!I-Xq+DL(wYTOOeiD`+lwTW{6H!W^=VVL2?`V)?xPs9`K4iT}$&5 zsFf>tlzAhwI=J=?(_C+3Xg`tQyE7eAufVXWrADf?ZfVQ%?6D`qC4TD{v5Tj%<~a`k zu5?qsZDr+;3e79wx~W}-uKIY}i6X?pu|IaXh)xnYzURf{hLRC-brUF01fyN=juw_` zm`gKZ)5i!#KjukiUYL6aZT)#Luf26d%d|p)UP7#oC#VD!DjJ`9jccUa$7^nhA&*El<4|s5l56aUO z?v9)BN1y(+qH!kk!(!PhGxcVus*?FP>3o*CZGLyJm25A+l<9x((|}cChS8k3)fhjH ziLDe@2%2#E-!%{nmI{tqA~cVBq)b$_;VIos5Y5(-FVgc4AM_KcferP_*80RFMJKB4 z^_Y2&;;GZyH7@OwB4W3KJ&tD|y%-utB;`o&1}r<6&i3F3XND}16)gddLqG*^s`&NK zr@&uAK3m5QPJXlIGMiDiMyX3R6PB8`MFI3=8YljUWa%eOR*k{}%_5nPf!YxnJHL>6 zj+1JN?`~i=I5~)=mYw~byP28{1K021b`V}89yNrJfW|}tzlGbA*uOsCOjwPMpo|BR z{(@Qakm>Pd0yZM^pFBYlwGlwK(A_?Jdnw>%`rTa%zOO1@K2A7fnBl6oudr;X{=srJ zVLV1tLYSIJ@!4}cGIs88i0aqwrB>HBzTD!$-gK6C>V0=hLq~7>ly>~uH=flcCJy)? zZj@w2I=Z+?9|3FghvyHn_dc34Z$>f9E#V^@9cB$j%4`-+mbGp6IIc}u9*pB+n3r1= zUQ?KL!y^KfY2O0wf0H_%qY(_fvtO#FmycNUCG4AS;9Tpl-+a#$%&N-cN0L7`idcjX z8|Gi=!Lj0!U5!|>8a%E!UT_%` z12#Rod5UT2s;r&mnQ@UTzz*(kv-~yKCw=RS80&hdZ*{TT{O%d#$n&DRZI*3=!bRB; zs@2G0d8QA*g~kdThuP^`HU7b{{_j*?EyyedHsU;0;YfRdSINavg0#>#`waq#WgmpO zzIMj8uO_(b&$X6pwNi8Kgxpv*^OzATSXT*=3eFUuVTgy z`bedUl2FB8`_UXK`mPKF*vMNRHx#N>|Q zba7IM;=RY$#|5d-@A=Y?u0& z49IJ4`{i{TxYp_-HA>$6k)Mf6#_XK+IX0zZ&fUT)Sg+%3X*0C^qzNA>(IWo_RJwCO zFJy$&SgU-8wEAcgp=@zYY_uTJKP!E}wZ@i{L~+OqVr5qAI}{lXc4rEbgGZ`Om#Oj4 zY>dhZbCI=vVLrAt#|o03z}DdQ;I7pVeQUd-^Vi2sEXSySpLK89r<>Z3Dzyp32tO9l z>fYzdCoYcQ;iVEF*1Bxg0^>;JrhTzC{aH3P}rZyf<+bhA~2i5awd@V+=MWmJ<1jp_|jVSgXX_JmLT}l(~W-T z;FCNX5A90d_^WpTMjnm(r&KP(Mmt4%cip=^l3Wv6s=itTI*{>{4};+ZBTS6lc`5Th zSOgP#{f*jm`A{FkR`V};gbYyoo&=IBYO~+`%bLcrnjjnrl4$eHqVSu1mZPl<3;Tk3WBt)5gAFKGyNWsn3(>--#ck$ zZ6*6*@in}f)kh3KOBpN#dk?CQn8H0NWgqTB$R>{SREWoV@i5n2Z9qF(CX=SnYG}(j zuh7L|SZK-42tGYc5T&i%OuXhdYwfa=gxiCS zr5OY0+;?|T1DK4xT*qc#^3!s&})JE_dEF)knuGiz!br3P8IgEuQ6X z!5FMIy`8g)Hdh2STuco<$3Jb9WFXgKmQY$X7s##}W&;O>NNo&~bOER8zftCoT0>0l zWUxuLaqDuIbYhgh7A>)rV--5{eq~|tvs}Ay5^2Cg+W!@Et!-M1s_bI9a9CFC&zLql z$do{x@U0TSqh`$-ff8N_@HU+QdbGGaxJM7bme6t&jgdU6c6^gHeL`Tf_zo5t_(xX_}HG}<){8%M^!u(jYMro$Yd|WCr~RyilS=!ht#(J(fN&jx?bHPcQA8Keh|Hl*z{0DZA4lYqfYi{$O* z{Vp=b5@-P*?&(07){g2VU95X*j>s;iF6KOXE-JDV$WOMWd~*7(KD!gkG3W71q;e#( zoLXx}STV335S5sDd{aZFK;KF~C7H#k|6+Qkw;QW<@*?h?4UvzTd&k2yl%y*o^DaYl zsMyB-SX`j{pAv?TY%UhJEeu(md^0$yn)a<8pI)K;`!DjQ(Q0YBGV?U&oQwU@m%3X^ zAdS$U#@WQSRBY_k;jn07KASdKl>Ya152fh?mRr}xCA3#{SQ7OEME3qDs@*X(+oVWu zg+k>#VXw1Yf?jcq!%L-wKh%M)Li&bQ_ys@6HnCC$XTQPl<0n`{z=dF7VG6PF0K=M& zQKA$hr&cS}-{wJuUO!jq(Xp!!-5f4h>&GC=k-p?4p54|tz;v?s|Gz$53?34NYhKd?e%Xj@EKnq+mTuOvU-$rfwaDNt*_!Z~Y*KxSKc&_3Kh+TVP_?>S%(VfI6&1uf9(eknl6eSKqeB>E#I;VB&9}u)) zg)+PBnq#n~d`mj78O%8PB#WKu7#=@5fq`@&&O^_-AIW&DRlC2#_p8Et=) zd&NzDv=O%9?Yy6LW-CB|icyP&m+n= zjC4ZAAi%|n;nC1rsd3qQjSakAWv>a`39!;f_PF;b{DC!*)A-@RT&#li-m~HEM0sB> zeoM=i-pzpNzHir2V5j~se31*|sH3Wg7ty|=%}*a@YO?A06li#I4u;e-TswUP#M{sI zIvPlND6OOJG-Ja)FvJ}|dtB*;IePRm6Q{hl(tFuZYKpcmHKqj&u??rpd}QVWM^fxT z35%Kc$=5i3Ac3!q3=g^Xt}=(LZTq8Q(6oi`ezcjCdPmi12+L^*=4v;n<0$Ru1+ndG zjxc~z`6HCHL4Fh^&2*9FoHY>G@GhDs*tp)jksU$4oa-Z_VUXi=k7LM^byqhfGik3q zslmkM~+nN#o2!$AjO#VLc=*}CB5*`3F; zRkxCY@T=B;wcu1J^%Xt$C$qdrjl6UUxli&reVv@=9KHIg82YD)LX>}Yv-qj9+=H+d z>AHO5WpH8j6n1YPle4M?*@eX6|b_ z=O$~6_dx7jI87d#Bv0E$$*+v=W7xuLZTM(7FTg__ND-l z|JNIe9ZcfbJVQ*1E6i&{RS{|B^=8y*gJ_V(A4Xx$pOE?Kt)O-<)tNqx)jQHr!y6dH zSEKqejSOMwQcn?aD#s$p`*+*DDK2=voR7q9mgf*wS$i`B5YB3H!~p(4FAhjsj~s+= z$SGT$`+|)mE1p2x^yiUEB0h~Ur^HTP>Z?5?ZK$)c19QS)|nKhJV?*~~`HBPb8 zjk=ZOUB18hBI*;XBGLS$tx+d2#mDFLmJ|?v1^?fl#T62DM|I5jMcMs~uGIh77D&dZ z=m;V7XD0in6VxaAq_JdC40Z-FH6Ns&-jt0>OI5D4`NuBEt0bI>p50b#cTy#-WP@w1 zKx_h%>}r&Z1X;mzOW89zD;UyA8I5Q@4z3VDaCN~WVx=I6uu`w!cP zaDdsuCzE8fTf1=W2S#t&_5GLYYpELRoz=ql$E>bLV?=PAD*iQJb><+mHSOac#H4XPfsyjPCn=oX%BB3c`P*JnJiXC zpP5A_tOa_Fb3hS<_CdZFV^}4Zd}I9l`3!DZ=$`NImXDdd3Av&=X90f=&PJb@ye584 zgEe|HH-d;fs?Z7gcOKkftQUKj>qkX_p5QNX%Me0of5bDoT)i=saKV=k@b4`R3?A5n za0c(!8UoOURp=Ui9NW(GmJmS-G70LGP@+M0pG`oT1jgYxG4R{Hw2(cvK-!gL^-2l{ zU<0jXOZh8;#G4;${jAf33lwmXYq@U z{sOc|Xa8=`CEgpSpo>|JZ@OnT2+$8_>)twx3T}}^N16WW+~mixFER4b<*d{Cj(c({ zq@;;cQ)7b-RHS-`oGjEMOcuviq$HlyC$D?LN}Ni(J3GfpB(k?N<1*Rnk6iLQ(~+IB zT3=Js1>F*uK2pEb*uK@&dT%Lvzg6QOoG76E-`_$E;5nD@RKvd@aIEt3!$Pz}@;KpM zp`c1Vsc0jeVPR6v>=FCZLK;{30$xzeCwNpjmX|4}X~66I(;zLPGhtWmBVzf3DLZA+ zA5vMjWmwLGHRob(y_n@Jo`nuu$&(Eb(0$HC`s;QpwF)|>oi;Aym`>X|q?zotHmP&! z?iJ}prT-|=M8d1|VI^4?DhkgdTpKOEj$gVn1;WU-8s zAeYWrBp#2&&kGUq?PP3x$0<%ycUMEl{oZKsNaZp2(QP@_5l6)c8FNK_LEm#&!@Mhw zOo|AXfeOp@;u^jQ%S+UF#%8pPFM$trU&q8SW1^qAt2~-sieOxYSZr+uU+A>nf_p0} z%+3(d;+u1`n@yOFNl1xaB7?)+q3RTcRFxYoo-e_kOryYsHdN6#LUMFoQIt6~5xgo{ zIdJ#sIAykJV-aSRK@0uRQjx{P$-^VfmI(2!-d$XtV=LRGOb?7w^iPa!6e?$NU>*Nm zTgG^I#RhX<=LtepW`bv>ZfK_mb<#A$T(}AN15|L$4h!$lNwVWc)#@wX%}GpEc^kET zqAS=ME;#5-u*VUHzCH{WILKA+;II|WE~aPn>B@!AX>@*yJn$CU;M|pRoZ#EU8IsEe zc#ov0DXLViE2Qid(tV?KKgsNnY__#Q0#};zYV=4VL(MeAW84qXOs=BGxa^99u5V=`e_71&7=xEZyRSg054(ctrV&;a6|Z=EV&#^ z#7-pL!G!$q&N*9Y-%zOnSB$DhsD!ePF~2O06R8??Ir1Pxhs}=+;>khNo}8+gh?7IS z@i^J#(li{4o5~S?ELE5Zj524nS(>6AwvN(?e*f}V5(N|6oJX?p%sz!#@i>G+%L>{T z1%N?e*sU+Am{mDm;q~cHRSy(!y~`C0Bi^pUqSI zoG5V&xq?7!O(i>mvbC4=8XqI zZK!|`GQgA_MzhZhW8)1p2Z>c;@d=Vh> zr(p!*vMrNkl-Cf!!*f!>>lj@MEi{)V8JHSGG+MQr5BBI-(z^Gu#m$%8`aQa@|92n| zsW@xWV{nip9+?<>Rj}@h0pBq9&`)W>xP&i?K1y-dTJwAuqll}Iw}u!pMXIY5YISGj ziOo^}&3$VJ*{)sM0GS<`=OFBM{RnQjD1=}WEQcD~EJt)zqhgplK6CM>xzf&$a@n); zFfk_%S!qkm`)#HYEVgd*y>0Jvwbq5hj3fb?*2K^nD=(8*dWy!;SHZ9|WKg-2!ZtO= z&Me>Soau1;A!4#2FAu?URwteRKJsR;<8m;M^!>j#YWH$@S6e5&HtoK`*RqFtX_p%a z{p?Ii8(Xap+RbSpe^_zT1Rm1s7AvMZ8}`%K#fxD%wG{fNNXYl|r(7Y^`Ipj_Vfv1y zp-vNgL{-c+Ld=_XHt?G~q#Zy8y-CdM5`q0bo*>&uGMPRGW);Xup7Z{0boo}Frq`X( za@T6-4Nlu+mC&b$gDB&;+V_Y!D`Gl=zP3Xx%($H#)W@OL@c5U|>47~=eV(1v*P-@H z@|tpHL>)18iYqOCTR(rP=j+*~wQbn^>$jy~1^^sZPy_JSO9U0o z=WO$Yl`*ACfo4g=vEx*ZRWTn298}h8kd=agH{sx5M%feoYi4^o}AKWF=qIG z)@j^PObvq{%E6gK9=%|e;f~)$Ag*_;_Pd%TchC@$_Cl&FXHF7)t5#i=(J05qEr(A# zHVDe9iWWXl+hq**QXPJQmTa=o*cs9gwGLA;4}29!tBI%x!dvr!+ww@2F<@(X4ixEL zGT6{3SuI@izWYw*eFc9%be7BOJz7_@c2Hj;?eKr+*h}q`vVP0h)`et^F(3h(b8{j^ z6?6B)*q&I|t7o7OjKbFAY7nC({KBh30)!($lg-ZmemW^5!sl-Ui*(jmNIf{Jh7La~XV{q9ooszLGp@8nc^~ zBY|$PYD{X!Sixm~c~ZgKWSX7VRcCT!5-_on$%|aOA5LU?;e0GVA<}wJcDf}>Wn!XT zbET-ES;*>}^J+2=^KL*(L>YLN5+sqB&jsOTVSB9SFZ7mPX;}jlA~@3^q#1%RrW8Z3 zHZ}7(VH;g5b2;5*k>B3M>*cI|p;o~?14@_kWN;hKso58RosY&4yRl}5!1);o%*^w) zuLhb)uNA~fljSQn;=Ehxm!4kb2&0M4_0P$rsz5v1KW7J-&;)j>yJT9!yZ%+Ob;9gM zsiAAkqpUR0gaK*(3dNsbEhK8G5>qK9VN~PyS1Wyk#{Y?sT_T;!y%EJ>sPJSTrd8_} z0vvu`V-C!b2v2}0iBj8bJH8n9F1ts%*1cQ{s5dio)!G1k5NaP6F{e+bZ3tcJPjTr4 z=c@CDjw$T7a?~sxNU<}G3pl#4PEnq6C|$Czyk_wMXxhvoSpaeYSQ7A5Ow$w0d}pc1 z*BS%oSehvUA5ZUOFNiYe^Tqd<0&R7ftt54d$Cp^4ZO(ncAR*{=TB|z7G%IP-V zlmh+unz_SCH1gfYcg%H{Z)W6;<+nk+n=9R==jXtT%WLP{0s-?6`XSbo}85Z zUQx(HU6=GO?E%+Z{%{t;sc{D9*iJYX$BO%|ma?wu{$U+iijkE7Gjy(89TtL{OYfbi zhWS{*GWgp9_``dCzUA>Dr&$8NNWl8EYy#0bNIDk(k3(|D*_u5-dWBMTO~sH1$Tnaz zATsa>x8-e{hRLX_i;{z&N(?>yksn!rnyER7e~?q93}xeVd116@{k&GNPdAR$!G+tQ0D84hTM-yp9U2NyiIR zn#wV{Da--3C#u~g7Cm(SOTV{zbUcbaTrz14_jZ58a;?3qHCdFT>*ToNkUbh+6Fy^J z#FCp3NaR8?Gj$ViKQf}szmqrp=U1t&I*Zt~+FcXzo=y@yy>oNybR#+sq|q>M^!)E} zp;g4v`C7MXiz{?ha1naD53Vg$OgZVti_L$wLe+Sb-RY=VUJhK?QzkR3d=NnHGutVA z+AecFbnhpSc;V(d|1rr!LE<%jl1EyIvB_o0&0$V45kK5na^2#>1>aTF%)Ik9CMCNoDWkA!6|Dnt4W&YrS)l{vgG6HbJ187p5r1 zb&eL(dwVqTTQ%NS#w=V_pTbBbov!@;rLcG(`mqa4M>e^ez`dgIt_Sf>4|kiMxbKWhZ-LZR-Hl09-TBQOx-RGOp&hcL?27jGu4x!MjO`-lPkOzvn5D!kj4`Rp~tp zSyuQzAm_#gL5q_dH6cf(uXAh*eu|=^_K(zcwnkzMuLkg=vy_`lW;#rJKDTN9qkSpqt;6u63%{TzMQsc>nFwUYyWiJjd~6>?ASd`m`Dz-d(mJhmhx)6?X+kRZqtlOD;bj>{~${L*& zVyH4@Gt#j(Nq#vNp0(X+knh-52U^bEfGn4fN=4SXn@pe)>S*`9Za1$g6_#o)^%C3VA+?`|W3zR~s96(4;50Gh7m&6l;8EC66a+u9WX zGwOc8f7@-6xyoiRnca6|8aOnh!K&Gt_e1JtB#S+ne02c>q`2f8r>S{$t5IZxB_X|J~74ku0p|)Z@3o<5nvia1CZY za~BT#1e4|^%Y~~kJ!aonm?4ttl^v;zK5a+)-<>>$D|LwJC;+WrusmNsk$KH!PQffigRwuOpJN4#sn@MK$(-XQFOW&&aPQs znsVUX9;3$efOQ0c+hRgt$^~9ouV;Ii_Hs6N+t|83Z%rg6!kZQI`j~pexzek%`g)_9 z^vLpGh1lzOpiRszmRLw@2_B37cIwVdNF0{MW!#T0zTlclT0r@R9=;Qbidq=^qwj-* zh*;a7G8y8!V`>_9)glgKS_U>LsKbWpfFZ_yTnUf_OLdLRPBi*9&vZWSw8XtuNCW!Vk3F zWv6eWqq&d*KX;YTT7w#nJ~2~p5FAvrvd27)-7mfl?U+$%^m%7teC8bCHxYVhMdJ%> zI$dr9YUGtMlwavX<-&NP?q%mU$MRQ2=}Go8?+xzPcQV_kh5WK(8$4A3@s6GnCxXxL3vB2IrW*RyvJ}K^ zNpsk^NUk#eB)R&8B2RW}Wa1M_%?$#cD*+Slt%CrH zt5h58t$d=_1`Z^a{FZCJ#S`)6m$y}RjIL*q=E}lH$`|hCf8Pmd+I5pi^*{aQyEoe=&Hzf_q)pbpI`}RgWha$9-l5_Y$lj9NGqaE&b9b+ z_^!9)kv%!jz*swR7!5#^uCDnN;>>P-K^Ps4W)T4E%Ak(uBAbLR{=mp^He^3eM^K1* z=g^rQdu>9n@}w(&O3+%yJq3aIl;D7SZ_r$b<#Q=5WEbDak(w2*hE*Q%02#dxQKjF! z($d16-Q~C-6rR$ ztc3CVn{x+p6DJLWZRkI98HW#m>9aSah!<3xq^M%2$a`xx63HXp3CT!);u|I@!NzkC zE34E-{Wr>Xd&(HVu$hz9e!0fq3fSfPl>rYOzN|mH5`Y>W?>&cNrXjQl*7^9QWxNGjqFdxbX_Z(Tt*HzS&^Le1S-q67%&kF>W`tE@ zf4psRzgoh5BgxnLkSv)WA#NY1(Q|9O#UOL858W{@sx$edm)C%Z4^n{t_E+w6;B64n zt-%a%>4+l$7+h^+c0m3ynRk%)O%Z#)H^$)bt2>eJeb-vqSTF`>?`)}B9E5Di^d!qt zY{nR96imOsGF0!p?$tf^ba*SVwXx@|6&LaNV_wi>li!cM*|nNT;ttO99m~`T$y)a% z@5n=BVBP2EZ6$83B%Ak_4MxTdA~TADR@qr3CNlmV_Xnm-mmXSCyksY(f3L{Ub8=~Z z46iUxDC)uoo;Sdcug&`S_Y!O1xOdWlym+?pgC|1cCud4;h~j1}^g{IR@yVWfAgwss zql92;vKO@&AOmuOso&+V++QKsX-pGy-<%E*pS1NOB3*|UWPzS^5QA} z+kV|3y`A74+s{QPv#}Jy6n!R*BKEB3cR=nHt0rfy7o%;6UH62(W`*)?98Qv>>8i1+ zdbI|Zel!zQu@U#Qi!V}D_ODl8*!jZ6!U^-nP&m+?sLlcIvVDtrjTfc<+I(CW>U3v` z_YwRkRD!+;E0-mwo!^&l^{ZK9_q6yY#QWcCL0lg#(G0=XJes?a!X2zT$}A0iPwv#k zMf0`Twp>1vfB`_rRlq(((;31DfLV9sE_rx!LI9;ap!s=iCuD&q3Z;3L2{ zn)90*g`mHn(@U;Db{qWB0Pa-Sp-+#?>jf31mzV#!cKv zG9RIZ-7CUrzK)G5Mf0R*)f;> z2$-Cn_BEdXAJNpajSgzc1^*R~O;bfZvf5_N4*!l-yvG%XuqAvs9R)eJu5rWLp_0a? zrzrNy`!d{x8CbcX zJTSZZu;h+QQuZ*etDeC}J4NOkyC2X&aw`W90(#`ij5mBiB~DaXeA8^^I|5sSATW|Y zr_QOl)K=l=INfgl-PaotKm1+*Xk>ccnI5ETKjPHkWKa4-#c9XBmXHq(Q!8>JtmLr@ z5sRtf_D86`HpS=i>>I2#^zSbVCt1@9B|zyi$)SGycT&*!$MSNS<=PzJIG+NYfB!-8 zf$S%w_Z4r&+$TVD*MOS4A}eZ~3}8ibfX=H(m!?a8(`+R)kGK=0ggiqjgp(~K$-;b; zW+ongWRT5bSZk7!yaMd*?{?+jF;Pygk?H)SlXyaT_o18ASi|Jk^rjXyCp8W1Ypjl= z%ufbqjj=XX{m!6^I~aE-?9JB5_4`tOh8RGAatne8cMV&)@2M5$sO3^+sI9VIaHoqi z)-*{+N{PObr`mE7*Tkhwht8P=6Q7ep0vEDTNFQX?rb)V|Vhs)Hr4)oXd>d#6Y&>EC zKoAQ+S00v=DZd5kJc<+aaczoR$hrl~@6OI-NTMV|{H9{j91GFl!|7ZD_s18{&oyhu zI;!**ZmykK-}JLQM8r!%2g5k_+B22<4~3P%E>13!nt~d+s93-1P{j6OJuX6t5ut9@dqI$HWj z-~r4r6*Z&k`$rW(c!Uf<%HIb-LfTQ$=)4E$Xf)YT9=`DIgToBjc)y^^jYuSY)-ZwK zOEX=whb$Po^8IB_f9e^SN;5;H^1eweaSRQL z+DGHvIQjznc}LP!*1+CqW%o>g;_v|g#L_ucgq#9d8mDyCEbHy-?)H})Ei)Y?x(iOz zvJ*L}9=0$d<`N%SyCv#U&{zbIX5mAyx;VoK(TPlH3le)t`MWzBDaB_QIc52wB#CW> z;`4beA2-x^eOSfH!OAe!jdjE)^FYt~YmnkZ$-AcQedb<2i1!CQ+5}4NH7)K@Y709mHXm>r{3rKh>PbWDo zI*vUdX6K)qr8+`mqkZF_FdWnqbYs37_uCE&I8eZo4Wv?xT?e#fMHzwa1O@Ch;!5SJ z`Zd0PRn7X4>_=;C5edX3e8Z87P+Y!pT4!kUSNA)=0J;61ZbNI(cu2>H`_M=D}BA zT0w8aMwt<+8o0joo?dv0%>*eCec;Y|pyN3p=A5YxLGx6w=b(YKBy|c>AbB$Vxr7&;C+qr65Pd|v79VY!K%W6=6*#<_Cn*sAe5IWPXSgb zP(4)Y)j}kcX=?_tVmHG&X9-=cfYi!c7!T1%RpmUDnTdlI3bor#;n&9vQdFn7JyBe< z2A<40C;F%3OZX*bhiG6ZwA9Rnko_?ULEASvRT#i~Sy0_*DUS1Yf zpw&f`;iJ~#i6!nKo?1Q1!gSk)bqU!=;7Mm+u5xJ6_;29JfWF?Qja)^#rvA4D8tA4} z3;G%dzfx|JsTII~%6h?hE`9XWU2fmR%#+}{tOOAqTAY%X9CjWicsHl27DQUwQr!|M zsVw6!VEzXjsD(rb0PI_JU&P%v^drEF&Psy(RI)eb`S881=%&M)!4;2_QV~T$z_RAHda|uz3Bn4eRdeXg_G@Ud-WvcZOwyoKP;YtY4m7>_O zYLJ(c>UpM9+&4&fB=krk(Tb&CAMg72ZVmkCI~Kve>f@ovBziKsQ2#WuR>=3fj<2DSb?~Gr z3AThGUj~-Jzdk;```&@urfV)48%K>H?vpegwE_ogR4%dAzik}BaBhcjrrdyojKx*l z4EC%)&OlL*EBGwQ9aGJvqhCfSW(c+XXrhzBHXvT~N7%Jc&p!maDuPXv+J9A`*nZ%j z3SRT3@8!|7k~4I9VljbFWZ=@xumHOOyIhZnBLGy9HY5#5L-M|*eJ3lsAAa4`VS+PO zYQ4)j5+x7?Ff3Dd03i&(6hCV z6IB$ToaQ9LR@yOk#(A$wl#barE_T|m2Qw!Qlz9q0qGP3X^^Gcg{7X^`+45? zqd)vG*R?Zq%^c@>9RH;~U?pTr2!F@=1X?F}8uwDO{^Or{p%6FuV5h6h-4(}6k8KnW zY!l`p15XCi12V6?*R@hl7{r*|{VwVWawda_Ue3>PJKeq3(%yq7Jk}wuMqq%-YYPuX zX4k+R9g?vYAshNcIPyj>>+rDn_>H}p(IcZ8Q~>U#bkbXao_oIb^?x1Su*&!G2g%cKQOyaOl^HQBX8I-MjsLn)B{8cBD^W-+NjpxM(jHRMx_NTPn-`__iB5uS(fjtC2f$rBOzcR}uiZHhAs8v5A~*WYco ze&RtCYYMxu@^V6hk!Moc59{uq1QPk^m3>28ai`eze`rT_owTo6zS-?fU7ys3F4r4= z?WB*>`2MU4XIIPPN4`IK8(L*7z8w6yOpngz>5`!4s;ff)`R}Xd3u7udv)qzPduNaj zuuNiaA99SbIHXT>U6l@T;Am1HKmA)|qf<4sS-!T^J2FpA7KS<$Smg*dPy%9uidZcj&-zGyh*<(B1^Mi5xSZ9YsW^} zqJp8i4M^57zj;_e2SNrci#o(@CgNxp{s_zwHO-V^{YOI4Qz>Zs*cZA-j1T#r82rl# zk(gN@(awnV2?Y;UZ=~pF2TCf@I7v}b!CbC*QF&UPt1}^8w3_qdGH7ZM~ z_y_AX?<~L8?<_V{{?pC=J=s)%w@%AT=?UEB6EIs+w+g0lTS~aEmp*ekZ)awN;L5(| zrTuExilHrDJW7VzdtAVIH+wj_Z(dtEA@opnheAHPBv$nEWgzpCqGdfXQGU z9}uSO^Gfw>uGm>{`0GAcUh>q=G?|cBjQ{j-c~GSSmr?&DP()SO-A%JdOz z+OBqOF@m4v-{lnmtugD4^Ne^=82CITh%fg>tNaSLFaarxIfFWvf7~D{qzoOrCKz?l za8plmpCr$xAT2=!t6xSV14f^*ghu$V#Wc6sfP~~3)k7r2#<$N;ll7G;Evm|s6`JR= zSY3?sySkjR*SP_49*k3F=J6syd9ep?RuQ^C>?5ms$_^uzPAV2Y=gE;<>ClGf)jaDR zH8bB6Wu$nOx*h=aOhoQ7tj!)4h*F&T5dwsnfFuaKENt(mxZd;Uo`c+Ue29J+Mm2X| zFoQ9Ln{(USqQIq1#Df0ab#^vb=<_Irg>QuP$5$Dg8*o>5iY~~?7#y7mLCgz?dArWc zNCGmYHU^nmEqz7TufuRnN4|^%-sjf!)O)cv&qjsqpziaA=K zCSQRx*ElJBxI$W&L`C=1W`cDbSY+*5^9DCazkzk zv&U|VJ49gxdZfXNE)HeI<*=qopZru)wOYV?)^l(baW#mdU0#_ro0~5JUc{}kfZ&+7puXYYM8n@Ty76lFrs^IiEx4TITE8Aj9&5(9zs%Zh?lT&115~`f`RWY+h*9yO#J4mCEBiND2w^J9Uf2N>4 zZ!R{Xd=JEUV}#$mh>L-~^H{yfy2F??>c~uIK*ziM-0hy|zU@k|iyOKq+`&kLJD}AUB_7fU2v_?{r>ly}-wp(6}?OdkjE7xm|NZO5M zsH-^kWLMr+Y$%Urn9v5`V$Dv1-)QAsUuZII_+1l{fY^~Y^%3B+5JZ)~duLLbNEXX3 zOCK0ojJkf*vp>)~yBaqj?_6IM{a4tid1w<}fm4Q3F1R-zWOOu}#Nx;7SaB=i1N3^2 z3XwhZHal8yHBMD~9e$I2CEQZCA<0>^`EFdmQwmP;3Qm&=od*n$nQy%QrZ3&XI_}#x z-j#KEl9h(n)y%hqO_26A)wr*6zBzturI@625{&fxn)w}6WL4*!ndg@|W^uh+&oCBS zm*3NM4l2adG;KN!M`KNK1-8Z9t7WCsw(B|2yPu&p~e*b}rH`Z+b;dufQJItfeeLLZ#-WKC;c@__p;4$YE09ptNbd zel}02LrxaUBt*H_-%Av^-aNm)1O@3>_>`R7S{=G%Xr zW7zhr_ud_Aqzt|IJ$}@4e5Y_!g`mHdAx{FRsZjon-Jc`^SUHmPT=5d6phd!Ksj2AjYOE?rHGmNdij+*7l8$2;!q za$Zs=0(MR_VhgT0v-ar z&ld^!GvyT@XMQ6v^1-<+_05Hu$Jy)Hy87+gh@Df%bvoBOY@k@)U7U1JI+%ARoaRiq ztMWr(yT?t@eGT8%ovOb#FnW5TElE84ZdL6*YhI-9d3ad%YB;0|3#?BQF$3l;(J|cUN!mN&8>>T%rIBq3)m#q< zi9+sA2>+mqr#TU}h$)VQ$)=(Yc7^52ov8F{oCq zZGa1oyqZ;)vNA8Gvo{6g=!|oSb0zkUxC-6OMQ=OFrQNj8{y5q3Z^+KPlhLNB)YA3= zd2V#5oy>3$Y^B<{X?TVgY|UHvFao#vI9vTF?-ej+#`l+* zhrg+!dVnJ3V`--dAXQrm_x`B+qDO$`=ZfZM<7wX|qW(2)#o!1h%;V(7_$^nuaql+w zu*+T6iw@MR=c+=BhxdfE?ZSx6V~CNcY#iTM9qLIqzt6FcR5o8MM5 zJN%4?0Ju<~1GF0}=DUQ1ycoDqMki4I+-x@N79;P{h@RyRihifOHu=H9W>h`}%d>&k zOt0qGDk&ap6Eraqz-S{F$32+?F6ZcmYf0Vae6eeQ0a$~DO|c-exu;kU32=W-yG~8c z^C}?c(#zjn&k!DJ#_b~3Q2(Zvs&|jBVoaCV$WM6UFpHw~ES8^*0)*q#e)q8+ zax!9EW~m?feP(aJgQ(7!ORB&7ajV^_C@NNW&V+DZA+?Bg{a-@4k461Szk~GV=zkML zhzaDxXz_5>-59>{=G9e(cq*ua=;XAo$ka>)Er3!#0B7L&e=e zPKsR{LV3gTWNa`E*UD1cc?MKs&W!i0#;??v8SnEStWKSpy=k)I&uXTgN`643aLG{Z z>Cf@~+3$VuRaj&$6~5w!ukCO45^;mwx^I`eWuH68`njU6<2~k#Cv;CWt(T~tVd>#F zR$xf0>*hU*lVy&oDE0BStNuc>${nYKPk;TfR&s5wKOP53himx4%J`M&e%7DYG7r*M zcSR^oU{Q;;R~!#d!(`4D?7XYRFX1}Ay?$dz<QA9Gb(Z`+z?qG=S9j{}s9t){+-70GT2mR1 z`%jp8dF@OXkCFe9sNc)UBr+W^`I8AR!z6K8huR^o3Y!Vy`9Q2cRTeP4of1 zLbE8AJF~5Yof@9E(iN4H$@ivQwX6su+E`B~yO3vp9WMTo&H=3GV&BH+#UXiw@q0}| z*cIt`^BXPNj&W&!UezzYz(Wvtz*xJ5S9s^*vdcWx2$>hD5HZGPGYcGF}lw8~X6VK3IurZ0EzlT^i}?O4oz zqo38en^xINBZ?mKuNvwf(#$Wnt`Dx$_gP*z(VYz(vya(XIq@yE zk{?%z|5{C9k^Cn;;l}AFIQv02G6{Lx9zH1Q8MOm4XBhs?1%lc=5oG>T+LNb5@E?!# zdfwK3EK+}}tNNq1qUGJ|z44;IP@NqcCiCNu@~Xb=B^K$uFAT_E+?21<@I_x9_+O}H z%?2#>Dm6}wp&K_X_!)aZ1Np~{3UNf*p`wo=(SQG?*oBd)n592M`qbf9?MDkFfn;5w zA2re=Xxob|GXRsJ$t}FgwR5Xs)aKzD6)VKKzc713Dc|<1Q#qM+DN7^5Gb5ARcow_& zs9Qz)2grlaYeGmL&zsNj(t)q406~lhNq%_`>_`4^UqUS%IxH=xor;_~88iBAv9_vi zwN=(@cYz@~*T2$kjessWbLfWRZ>6KA|8(pHGE>Y5q_%0xKI{xUfgLDqa3Y4t^Y$0( zVySj?TK}u8)h$JDtmnzaoHLm3=KR^nE3h*|GVYUjDbr#A*0&u@Zz%s`Nc)BKz68|a)luKPiAM7 zevfM2mzS}Wb4>H-FX0mwC}-k9gkUOD?w9nX49vE`kBwu%niX9pD*FPt{|8)Yn0taD z8mHmz#h3C-zee$e&{{vv^Ae<2-JhhkXy0C87B%K2-|jC07C|P^PQJz~gZ!fl3_(Ke zj*{J?I}~M08ll&32R=2s*& zE{cRMjGc=Iom;y8dm4V_aE#E}Y_t*)=7U`1H z;bV|P&kTu%+$>v6846%5+@0C0ylf}0Ji+@2U z;)wCz*Crp(V#w$c`Gxzby`SL_IQO;{vR_b6wO{i{*+j)~f1T;4TfhS;940sHyxOec zzvuAYX{xAg?ap0H`!nueVTbMGjXT^vleG6&y#acrp&j)2SM3*{yRAOF z07&#=^VHJ7%cGVH-7&IrD&H5bwn0S%QtuowvgNwcla=<1v%|**jK5Iub?x=UAGE)# zw-h*dUAxeNxsg5my|iv@;wGX$9ZuBUzJyV;M5r`;@$NrE|1#lY@3mXG>2D)3MlD?X zDfXFk5*FXCJgG}o69ItDZjS#&CH$&wUg=?YQnV&${rtNknF8X+s#$BXHI>?(T7j~k zWb{-q#lyu^cVZ$}Md@o{9#`&V?w(UJfUYP>K#+n&$= zae_mWg04XgP@;J*Ro&v>aL+6GA1W1Us!1iB>uw~ewF5e}no8xY_N_k<=hnOD+v*ZQ- zJ>0qwOZq;|&YWTC05*>NqEWK2O zSn|BB;CZ<{K1L3 zL18wvq?vn>R`Jr$jhUYnl1d%@fGJS~P%9Tc*x!hRAxScCk!24&GEpuJqortH&Mm9; z(Pg4AbGE%8o$v_JEX!F6GFldLpsgaY4#iQ9kB8WJ37DJ_eb@sT96pmWWNzSw-v)OC zj;yH8q|W}0KgpZY?ft}Ce%X_c9)~G7b?5M`m=|>_@(9I{y^?ISB z?im2=x-xY8Cd~LU>%zM~x=ria^0TvOx=LxkA5LpYrhX@=|I*_8isy}Yypkrkaa8Bp zuwR?}4ez3h!!l}T7~jo$Ad}XRi^7=4>skv*X6)POzn#l!IvxfkPDFA_DT=O=nCu{(k#xs) z68YKUAOIB=D{=l#2D|lg2X++#y^)4a$IVI=;C~NEm)Eyna?k%4MrrJ^5aN4&h3RWg<#{zi2xGMb-faFoYe1L$0|} z_paN86%*JpPTX`5>IrzmX;L*rHk6?Dx2y3Ti-LC?4N}X3ja;h>^6epfoxqcaxm;r+ zlI&!$c>k8sQA$xI+4DE?6CF(~Z?Sk0s6vfq6SNKilz3tHlM`aj+W0D2NE3O{+}9kB zKVgFGJh^X$1%po#%$LTS7@_2Oq5=#i@sN|_0H(uv=5eZ3V{P$vnacwiHPF4s9A@Jd ze2D{&I26c{E$i<1TY7nxb$K8V)zU85Y)vL-A+sWdb%!}m${)M_Y1$Sk>(y!7xxCmh zY$_>RKV5wE+9MpJEBDpB{}E#oChW(zzU+{)SJF3ydex6;eIjeC8WZc_LSEf{#Xlyz z^8MDON2kXZ^XB^D2ENO$3}&{Zm+!~)U6=iqf#7%?gL~Pg3VxY~xtUrw0=RA9 zqy1?8-fmBVEZkUOs7(Nhje8gQl45yG9y?FI9Ep`dA+dj4Y7d8ZtOwa+Bn4q(50t%H z?##4@cSv=ts|^=PWH+dm97=fhjC*8@&OlVrOd_59`4KeNe?D`Wx27#gm>(Y- zJpVK3bpI3&xA8E7xh1uLCgK!Tne#()g9VKkuQ34!0(fwc#@N^D{H1vJG>9jF0D-rV zeu55D^FOWimx!;{cKn()V~0Cil^Mi+&XguzYTjv~ek4h`L| zzU`Ip5%av^lr!PTSVYjh73Ej@Q?hJYxs2n_>dv|Pg*>!F+|3RqM$GyQL0t|~6 z`F1#u-G03rjPtZd7r3R?lAcUn&`#TU_P`X;0cAVT9O83)0R|uvLC_fQfGFQ)b4;?O)_luSK zfaqI7vd4JukFvQp??%on`30-I-!q;EO2q?&0n>_h8@=)v^;$iW&(D z$^`Kfi0XJftVfJ-lTg&;o)>GE_dS`&hKPegk$cUcK|B!Rl=~#M3ZMDZ4s>#dKtEUVFQ5>Y+KY&NZmJ8v0NC?F{uN% z?xn)7GPu08!OOG3Fy~s*-IXcb=KX{s|HHH+iviT{@?mL(uGEgV^pD=ED6uIk4lnRE zU%}m|)QA2QP4P*vtgH)tj=Sf2zsEF((B%A^uZJ|3?m(-$TX(rjCF$BMN-sRQZl;D;+yIh^0*z98!NVY!<$#D@jhUwwbA@N#3?H?;5&H#Ov`# zy`8fGm7P?m&Lw%DlCyb+!t;v<`-%5}QcoeIJV+!bPzO~-B&-gs7^iP7Wd2PO<9rL4u z#=Rf2MNPCuy!cfE{Ws%2xBoqiTR^DjoxlSwoSkf}W`HDpV4+iL66$=LsoQTfsrfK}4WF*AexcKbr&{Ry%F|xOKyZS%BwU;KuAFX3)5ESJ z{%lR9+b~^(JnM6{Y}-h8kEyz(O!>R7&`E-19;`lumzB1{MKIPC?-b8+A6ZS4gqG|< z*1enqz%?`7XM2NP`#tFQucGw-J>o9H(xY%LezaVD@$(;_z@_S8rZvQ;CimoRg;IO~i% za)JpD;p;(NaAb;~h5)6RV=fKpvbf$T~^MqTe4vXE%xyU;PM2v4w%I#nY!&ev>Wj?EsJydl2mgb8h3v z5&~hy2!_93wF4&j)h_8!6F5?5-i%Duvsw=Fm5s&@j5qrlcZ{+;)Y z6B*0S`*(JvD(vJhQ7_-$6w6rnhzalz;)7iscI1TyiS2#ZKKaHp zi!`QfwY|Nm-Zl4ak6uXtf&To5`@jjYl(D8&E-aEC>iVclLVm$e#5hDd!p%Bn z==XL=`=4Pvq2wFbv&%b$1s171N!Cl10?~~oem|Xk30u&6*;@lr55+{x$7;yR9)Nv( zfjJ=EZa_zhi5Lc{Q3u+EZfu}^I8q4}|(ppk@hV%q|0)xk0MxxRpG%({y`p}+7^ zD@@waYcy^4h7xM5Qp^n_%T*4Qf=mNziH!>^5Ra%#4-$#ZwS(^OfuhT|UCqHX5KxY= zTg#nu>R$OlYsz#Urhj+pyBq^lpQ0*3@A z`&dCV%}KD|a{!Imk3TIK<;nt~{8!$WNxeF*{#Co^TJAklVN7epj^E`7D;(3`89?hF ziO|r!pP4A^6sBVc>T*?Q8X@v8APL&BqHAiql9FX?i_`FJW}H`-^?4aH=vH30_^!|2 zd-6Tx69gSLJ)ifr!kJZ>$-?=UQl=UFJK+4C?iJ#=OI~IQ89V*~1}7Qc)jXj-u5@P=Fqh z_18>R@Tn2~1S7mdoPaJS5-ux7&Tlh6+)CN_=4ockXjuk5apwBo9U6FHNAX9U(2SQ> z@LmAc0 zn<|w<_lBfQakU*Ire~sZVNWs12eL|egMB+dclvo-pLA>%{K{^2b>MZIm5)nx66}2R|t)1h)H${}kCW zZCeQV*>{S?HC_4M758Gc_80|7>E!-eNyS&hqP*u$XC-S%%C%oh>%t^l*u(`C7%Si& zBV#s=VIZpaGBQai!h14IF7HNyL@P>RVM|=4C zP!Tk*7QRq;yDWF{d^ zot$3sZlMB0!bmqUWQ{JicE8G2w0o#^@#m<(=PssW+D_fZMd~v|Y`hCaz$L70gSMM- zMf1HaTZ!#lfgQ}JGos_hm+Lc3phfmX@!=)uh9rPY1EQH8q>X&}&gh*i-`}X8Brvth z^Oj4j`K%#PjK_EOM&qGEjDsz06+OyQa`KAy9FGwyckN^5{!LnY2b4(^&B-B>_yP&p zt!pON=&aj8T??-~^^MC=ZJXbtp*>kLu`!rEVu^lTyH*Ocg^F_;A6+mPeP~;`GpO%` zR*quKZb0cC(jh1UP(qaZA@3E_4>|%KX#(s7R@PN3;SJl2H9fzbKgBZMBz}lj3P(XB zmz0W2|Cd~u*wi5SBYT=HDE$S>R@a5CaK)z49=Zs>{SV!Wo+MxP8IV1r{`I4)1yv8| z;z{Yd&KK-6Ix@KP!Hdno#%DvFIfj!9&x~copayHf&?)3R7kTqPWMAvQu*lAhg?Tv{ zy-Xt^l9?w>TV z_6rC_v8E%Pf&(2~h)>f?3?@a@t~?_^A#lS;Nl|MkJ=&Nz9TFNzwRhK63znYDEv`!| zHnjp$=)(QA1R@&h;dzXlmPcC`?*%T@-xcotHGlUP^qDQ|j}mnq->PTo{*fi&SU<+p z4g4?8$hEvUkK4UPjJ*Wmd(=@YA7&#+Ww!dfjEL?yiEE zD>L>eA+h81mvv{CkL6xoP?u~9m1X+ggBkVuRB1~N&W;-U4mZPHW3a|{jjsgd-JpMx z4snNxR%*YrErL$G3ci1f2lClQXj3x9pTQ841&xya3~4S(J=h`k_~1X$F#Dt9&gG~- zPAwko`ayhd+?DNVnDgfWBC#l1p;*lmY8{ClK*6lLe*RM$B0j}L{143pXaRtC)hEj* zv6e8p!qM^uxg0AWYB9;x%Icqk7%F5EE;aSEIQ5(^-8=)i|At-T{j4A^I?LOCRBGal}4NX(v7NSuWCu8Wu=olzt-uyDNjsm8rkAH08u* z9igM-&wPE0?h=3D^9Z4aKLV&H2soN%Nf|pb0S@-OQ0yR!Ffh{fqm7(;7|V2i|DrnG zs?DmUn(8`y7}T)AW?5k^I>GDj_|}aVnb&4)-*=czBy;rMe06j_(}%g0Lo4;bt-QxA zTu1sLGJW7p!2Aj5mhOo$RNShbZvc*fd4twV?B%(CL92vdYg6tK?=nznJhppSWK%ecg+^V$+?Xrj9`ew&P}c^vJvg zsWxC&BqKK{U0J*cSgDXs(}SNW$4pfScd?AouiVT!-z7@NZmvhf7$|O4%^Tp4&<3r5 zC%|8@pq#=?M|s}k%}_<()*4`DW>Z3sSi0U%p%SW0A4z6Xkn*!sk*-o{W$rzsjpM!8 z@FD2#nMF-c&$=bE)I9(JuCE9vUX_T_3~!JFAVXG@AmpvCp1~soterkwJhr#y{8PUy zJf%!>i+A*X7t`1L7{4x#;mIXI1}*PY=nKeE!32qH`P)haX^g}tF7`5_v6;^sL{GDj z%#wg)yk-A|R*mG2GFwQSOr!jhoKik|n1MCwDYW;T<^06ZgfrgXh z`QmiBgOMSMlk^6%olK5FHMZnsZ~i2f<&De6hBBT+_xM%+lC7~{(l^5bvn`T-;vGb; zsie{G2>IE!rfK!!3!dPox~i-91^@Dar`eHx!KIMQ4!Q_9OOaSMQ^;HTZtB8DCtRa= zEVrsJdy6Dvf>rT+CbrS)EUXFZKgutE2yFOt=?c1OACv&%*!o!v!=tnx8r$iX*dhHM zn+@7{e&c8#q0*ixk6_-?o~1RBh`qxSj!`jIlX4Jq-c}t7J~-9ErY8xeHlfcW1+x+@ z74OYbFF~9scg4hr>E4bI3k!6Yo)A$q@->jt(6A(&uk(E*qcuiR$#DM|UMu(AvejKI ze+$u=vZMVqxSlH#TZvfa5szgD2B%|x-~{%s>6fht_XE+@6;MGJHeIkaQwx=p`dMDH z3`5o1iB7cmP;)i~MUTO#8YT#44*REP*4~!|jXp=n@5I*PR0U6qSBjkph?P9MPOe&d z@utvQW@h@G3?6I%&qbguRbhr3=yQ+MQZzRgGN8-POdcVA#nf0YcNBE~PY!aog>Wt6 zW+8bmt>@lj6Hj`@mCm_ei^W`Lyrsuw6h`MFlzEzlV#0dWzHEp^t44bc+|t3NY*qMn z;T}*xjv;kW=lc(?C5ljr!2y>5_+hJRaKk%dmVZG2s(+1sjqx~)u__0#%@#=$B<4EO zeq_rzVQ7@!<>E1gx-C2W1=`Ic$ms&jQ}Nn$^U>g2a~ZPHlry~$UiSu!nYQY14(YwO zWf-5SYk9l<^GJ?BLY4(#vnJd_qx;QVgCnwu2PduS8IO87$m_c46AbGXC>*+xOkS8A ziL=Xt;&(v^X%8IYazTdtAQb}t-WyTH$v-vRP5|X@Z2t(^11A|)4-n_lj&|h0U0jE2 z0;VmK#RqU&)3~b#`4$fvBLS4H|9xvt>lZVE*&d~q4#ELMOk*P-h5>^a6K>8L@g*o)mq`k&?q|Jml=lQ9nKmTdCrAv1+WPrYiZeusZ3;2R5| zU5~EW-p0?e26i<*okE#yDFdARtyXM0ezw`z}F8B$6q7Q1(n_II9(J6=cD) zl)>7$InX|Wzl^4%nLgOEB{_ggkVhjaLxO!VLHV^${0ikhHB?)4j=sTf9wxoWo-mVM zqRuOB;=|$!{0@A0c`__aNDWhmY=(_xI_|w<7>q;OPmGxpI=M+*o*fk8MWl{@dXA-_ z(ZG=x0$F)i=?=Z27^h}>u3gT&YjZd9eiZegz-@*^Ofcfgo3r{*r@_oKMT=Sb3Vp}R zb8MFMaT~&U)ic4}70(^?N>)lkKl+A#9-|3A>bP-4t-}XcYLBw^+R;^`9@Dq#E!iAz z=sH68JJ$fF^r@0_%1kf1^|!f(msWG>l|CHq!K2B;aQn5bwV;M6m**?QAu+^&TafYbN< zN&eH?$M%G&Oi(pgVYQfmo)JbAd`>O5BRoYQr@tIgJgjKZjBIULmRh-|wy<|+4jffE zPuIPKAcM8tjgzqC!K2mK3vZM3Jq@W5U^1e;fwm7 zHQCAy339qeF2Eca4$osiIe1)!y)a^=IEm@;eulK-cQ078A;Bm6L%n=@VOJ;nYwHKQU6MqhUdr+gMg%~XUDg_wK_`! z4QJMM{&22&p$VDotry0KCX#+N4}=N8jMyNWtBR-Jy-)9bTg3xQ7p%vuMgrd{+hh$UDzkT`L zMBdX{Ri~6HAh53iRgdH&$Yn~vPPIOB@ETpK1+|M_R@SI5?68L{zns+ndBs28e&kTN zw=XoC3z%AfFAiT;*p`)M#GCq$6(0hTzyPQndkJTKw19zk*HO~LLX>M&r!AND9Ahnk zX)ocW5bq9CJqkin;-E8v9!xlkY6phb>8l&%FO0DU>FUS1Oo2&iHn&Vi?Zpt^%@bpU z+7w+)9W%_pLSaVld>rL$Pxgp${3BFG(87{YjCkw13qv-G4 zCA|mKIv|!nh%)U{>%#m7FS$Bk!7_(h%y4<&g%NxG=`j>hkieAqQAdZJ)!t1$k7OO) z^*3vULn22>qo=?5VdvkXxr~Mr+FH-Z%0rGSTw4iY_HA!ju8x)Z~GxBJiW`I~XXspeY0Hm)5DZn^to-3#&4s?R?R z9=yT>p&(#bFUr82(C>6C@!JD+HXb0PpK4_7;S}5b0A||!1ngSZ#BTV^dasedMu*LY znWJHF;;sURmE1W8#~{YtWrB4xOaQ7VtoqxU3ghyTLOkmJ;gkA13}p#jWo2o6g)4@q zRU!I`s+KGAnXxv)+(}HZfb%DYGv6HK@TV4eJPJ;=gGji0qVS8)RBDIEp9MB1;`##* zNlO|OTb}qI$B6rar7}%XJ#WiPc6oh&fF1{t}N-pR9pLnGjx+!K%LK2)?_O}uP7aYP+cdz+0sCX znKjkXiIxjj{~>{Mml+|c?^08V^~1H*8yOP8ZZZh=XS>Rxke3|PjpmR8;b;CCYH<09 z)E&^iKVlA)r9%9s71pXb0&efrx;{czML!7SU7>r+s7!xIk=GWmcyEwmG^>+Rx8*q@ zTNWh5TDg~yeR=AroNM?Ef@`z8_rI zy3JEShXg2_dPzL@e`+-}U}xxHMKRFq7$s6)plhFFWW)4qF!fFKvHm4>9(%x_{aE&y zzf$dYV}zG}3Pby(1sYh#UD{mn-%Qs?E9rxjegWbvlB%{AdRs)^CnuMeLXH*o@Z14A zpeyWon6QX)ErB4JzO0~Mc5EFC-R4d-zfQ6H8JHDTlEJ8s8|SPf{b-DU!hkF=jskF= z5#;yZ@(NJXQM(}Rosb3D$My4Zj%o2ulmyWuUY+=V{AzbSNUlLY3sX2}&8s`>d5LjA&tt7H?F8Tw~B-rsm8AQNb5U zHGVX|t^-Vq%+oKvAtI)a{1r~*?|~Qnk^^bQ=E!zTN+uMWv>Q_t%OWwg_hj==Zf5-o zko$jTo&8ir_|{kjG=J$gY=Bswu4|=7d+*`02U7xnl!|2x8MYo7*la!VykOHFotL(G zI=6uhp*5*nVLqY3-=Mq+O702gT6cDGl%-G+_M;CKXAauyydc+K9n;aJnzNT5xv^C@ zkCR+ERx#Xqgq4Y(;+T*f5WjVyzHXf!LLGrwkllUqL@8xVBo-`(d^xrhFB4Ij=s?8E1 ze&)6+c@^WdK&#gC&?}gt0ya5VBu&#^5A&-=$eHXdnqTUt&kS0LqaM<%o^PILvtZuz@>@eOnEyX?1l~BF z3B9@0meBbX(iPiz!|`QD_BymjfWkm1+K;kZ7b3@+U~A8$OfOK$qS$d=02pB7AD^ln zzF}3?hoB(~48#b{F$QHRvJHS+_v=QTJhrFE%R)=W2vLH|HlW9fpLY9xvyQp`u6BQT zNA%mzX9e74buScl1U$Z$#)YCyaM$UO^h4y@CWm*}Jnio;IZ9Y#RllAgr?yA&*%Rhc zG(Kvez2lhWN){_lE@GUM3JxJRKvK{@XW;diX-)51>C1>5L_J}k6S6Qq5}{<$!X9_Y zTo`o4Tpq_DdgtM{*F_nv2{Jp2b@iOtJn?>HG(@~}LKbMwWIn9QNJ^fMX^{J2!-KLH z@hCBnTEw~&fpKJOhVJtW*zG3J?zipjS*0ws|LxY0sv+G)q)K-;z@1{cOZp9E#ME3# zNiZJ|;{_j@>_0MSpAecN|4nGJpCqWkzC4M_>tYPpGSx7kEKZT(<*om`Bql(^=rixh)qh!Vk9}CcMzj|bDJk? z?*-KPP_yvh8)EsJQO7(t4+t}(rU7g*eZ6rshKFaVBb5Xsol)e8Q8N7sf4TIYm5Dam zFYA*3Os4~E6)qr+czKFn*Of(iN-VIdq!WHNL#CysGh= z)@Sg)7Y_I;hjZm*g;z}m~Zc3%(n zlwdKRC7RovVS&DE-lvM~XOW_yYNXy{$(Ag>%gy7$=Etyu-j?mtFoU-H-6 z?lrykW$n|3#n6?f94zZ4SfRs|^EXb)VJ+d!c*r%+Y2c1H{*}Wvo3OLyVgm6VQ>3j! zsc8Ll`W(j3j8*<089R+fdeq<25l_jIrxwyDSY=qUJrv!YXOI~7Wd(D&7mH5!UcO+$ z3|@X0N`;7*HMhTJBw3S%X6>z0)BKVhL7P#{ECXZsfNUR{ZB9t00uhsNiDwO(`__;S zv6^1&C%q(a*qXz!nTV&bxb79GWf%HU<;2YYkXJo4j&bC2Ru8}>PZW%L^grM_2;3pV zkC&tIbY@3Yo)AO#N>*5v?ph={b^yX~{3kXoXP7f()@FQYMowf_L;u$gkXBJ_c2*>6 zw$%<26|*o89A6S(FCXm;wzmhAD}bx*q7bEc>;+E=3Vc3#7r%r@U#d@N++Afo-K;@; zU+&QO354MsCcU`d4lU=Qu2Wq2P=i>ckbelVSt}Msdl>SgD_{rSxlLttu5}{Gx41MV z!KgG)a8uKh?gC_by6OEQniB=5s%EuGP_C)_L>8*jk-JcLvnN|PsI{>10`(w_ysT-R zkh6FxY}5%q=D*ZBpSpZ1hGnkRD4^_aAA(p1AK{DZGf*$`$;2p%%i*t6A8_Rf^ua`BVHM2}=bU8h8uI`083I!bjcZ8FC^kjm0Yre0-6GgdJj5 z&@7*Lved4ap8L*hb1k6K=D61L(sjb7@qrnDrMc52QfyvOgCs2H$maG+`tV<}J?8Ib z7>F<54>1w9v?GBQ_kxPKtNo=Z2{SRxFlaO&>7x~5V_Fa2Hw$7n`2w=T&VN_DF(d+| z2;&ph2W2ipqB}6L`0a5Wl8CMhx$>a-xY0K1B6yh7*v!0Wy8EnWucz+DTl~oBTX4lK zNN;0E5D&y!C+}KqV(7 z15&L`<5?tD@0?XxA}R^K{9ShxyzE~#4%@$EE7XEP+@2V)o=?bDTxTw?Se9Mn=3)92 z=&$_!UK=MXZe_x6Ya;Y$n#%)3jg2445uFk)3^nC-X=6~=1pJKJCOo{mmTcTsVRv(# zd5@dHnXUqQoYr!ZCVZE^h*2L+&$Fl#shNHApW|6$l@=2r%4~7jggI05gs5Pr zbP1Dt3)D1LAY=^1-~iHPfD8+Lb9))+Osgg>?XOQ|eK@>MWn%x)mzSekHO#5b$p=8o zjSt0Dp;&tz>3A1iF`O~0N4Cru$5gMz@FG|L$)S3DG!*+Vzp!jay6GTehbhsj%>Y~| zE1-2?pI|A6x6^r!pRS}(?a$h3vU*b;UFJ5;fOEn!U5i zPjpz$9am>Il6X@{RKlFhk}ItJYehwPv@hGAx6KYI=&C`F4RFmOi^$po`!P6tI{f=u z0a6CT?yV#87x8;?kG|fjkDb3e+Zk!GZzmZn@P}_-Y-3AfAHVnSUNBs)y36yOLBzd! z>6@wBC$t7bO1YY=sd2LDi=T3bleB9$il^sJGUn(LU$#x*-}2o$yfZGt^KXjyqlsHME5sAnbN7#@R*il%iEbZ3YE+*rd}frHxOa2q$MBB#_P5oF zGD9MM&z~xd(intvy0BDW*{8DV*)oSRmrpTJv4|c7<|0yPV4j2`SCB`K5$wUgh!LLM z^6mQHOW3V$+%HdMywe<5=BZMG#$IZ5`Zj^xC-L)l8;Hj>&NNq zU69)H`{_jL>NSUN!x62c*gHu^g7!zbb27l+a1`WUXtkhq=op6(v4BZpXVQ27l7 zu?YA1w;2G#WQFDN0ca$)45vF>d+JDGz;KUJHAGR$kSwR;y_4um=9RbZg9qmfz!<%H6fW_tNa+&?G))s81@PK5G?r{&{xYwYwN%-kf;hMmv8VT$lusjTnF{E@_nC)h z8}bSMec1_opjdv5{=W!FB8 zkHpw1g|badX|Zo1%h;llw9;lt$b;Nufj=S+d0c zx@JtMp6Bg(-{<@Pp5OPqP0rkN?sK2zI@h`ObM7w%!by?~b1gnf@vKkg8<%wVF)8N} zEANDtNMZ|j2&drAS(n}O>R$2<94O{3pOzdvEkowUh7_(X!5?Jh6-&Lv)2^~_sI29u zO#`!xl$Ks&I#rBSOSmeEi?~5$_d3>7;JgUa3@cmmslxxIhJP$4a6Pdwza*QfaOh7& z&r@MIu-bzZ_tKX4^cE6-#1zx*p?9h2ol`zxfV;?(trr{Y__xPBF6@l#o7`uaK-IrC z>9WiH)`~BWXhomTCKJao6Be~OVB5FM8A#gn4%C9d~qH{?7mY>xRZT5tAsd}%P3 z@1=kN{XM5N@~R7-Y4=q{NxV+Cl>?E|YWYB+-axSEEb-te(mZNBOM_h`JS;cqbZV6l z9V+K#&{7qvHh3L-IsJGXFp-_A+3_+)Al!b-|E;k%f`+bC^=OnDh*E1)Md?&^n|#A zXSc)nz#nItLOo6(?wV3EF!P{gKkzUv7j@Rvt6BFJPRbO_(G+;M+-~(!qGqIs>N88f zfZ}=eN-3Z?zlV3jzMW&!yHNYlcrW&4o7mlh=bsx4m7u@%qNDY_`+NS>Wr2M!OpFs2R1uv9>lU@4|rE~I=&jT7; zGz9Kb(u!h=GbNSRdunx4vpuuM4ec#A_IW`Zx2Mq9N5Y}Q_44nwj=|T`I=Mh7*51|J zAf*L-yAcu|W4~*4GzYq_STg>r;>pkWoOkM zK>Dva2oZitiFIF$=6Z8noXNi4zu9X3))dw(wdk31+LBmiZb@pJc@T_DVa12k1QLPo zH|=WdoRSJoj>)TJlicTR?9-0)elykd+1|}Sx{59akiamJLZ#exgkeQZ;fPY!$ReTr8s>+iQw{ox!V&KzwGq?sThI;j^^;idg3;HT(`#iZ~8)eHDr`nkNY%WnC zmmF<`eM{U!O63ui;c5wc4I}kyUQ<*B+UiqtI~V0%Kb*H9!@7LtyyKGWQiR}@NH=dJ z7G13HZ=d|+VDE){Hg*ss*UfejtW4~$`YB+tnOC)+HQ&rQvAsiMi&nHBEcz|u`^^Vt z3LY<7Yi-9X#$jhyev<1woN*S{{nS3nZk{V!!^ITvGzZFcJ=ZzDpw7_b{p|-@9=Y>! z>x=gww3O`yWr?5aY16dv-rmCEEVPqCFu)Q>d)%5B(+e5{!uxMLA#eL}v(!2PA8; zx>|-*S$@b{E1Irl8DzdEcyQ$lc*#=tKK>s43iZjQ7tIQ@bA1&zbf><0mMG!4t&(?r z;!NJM36jnt9+w;zJ@Yiy7OODL6?WwWPL{y|r%Vr)@+z~7@JCg$i|+RR^r`2uX_<@2 zt&MM2hOpl}yysq}E$Nv9rI12gEuu)^TQ$`*JeSXUedayO4{x^mG%IPwQN>z^h`V@q z90vAM7vsBdas2bw05Rj)#UOd;+K0 zpzTiU9i^w@s7CRZ7JF67`KFjZp(UkD*M>W%toQNFDyAlypSd1TWFq=fB4B@K=Agl( zJxK3!`jw@5h)s9e4 z?A~}jC|u+6;OQyBQS4JxHq|*D74bis?0MavmDn$0OHyFx$S<38mG^#GwFUb_DeGpp z<{1lbf0k)J&DtIE5wuiZcq@F0bgkaRJ`^GD!&vibR(Nn|bI;Lh{QB^%R}T1SA-qoE zAjAsG9;5p3k*)0>4}rM`qMqy~B&b9`QD3)izFt$_8by~}3D%v-zF((36Tg&Kt3>S4 zx1J(%^0~`V%B>zrI+F(0r2_H{`+*MBpErsRY%CFw)Z#}TK z<1=+>>W$;O2eK@!_Vmw58Cc>2N1wWo`ndL|rhyKnIsTnu1*pf=M-~35Vb{|9CirKsi}@xI{jY5S4%qcTC-Yw8IP7qO>G zB;t|6kzYlu4t`2a8<6CLBfld;itqA}pHMzcaSsR$O*Xq+x9SPZ7??pG`rGqD$Y941 zrPe9CH?ifg-jfYG*ss314)S_Z9f7#&;@mbtU&>l#UG|L{m8-Y2{06%S({1kDo$Sf= zh9DWBIPSCcJvekjRYP!3*&Vf41{p_Y^(l+rdw08JN9*!Ltw)V)Yxy8HK#pCkf9I>c zGH0oMq*uF-+3}gF6DB8bk*Q=)I<1mI%_C0blg-*C;T5u(R6u!nxAf%dsvc-5!CFxJsK$1+ceMiuk6X66^vLmqIv0!P2FI8cqpyetyvk%a$EGe5+&1f zo*X-e26sDm?DCJ&iz{h)f|jg_6hono%9EDFTrI^X+nX!$t2fO`3{zDCO$d%z1X>U> zuPU+Rp?^CUx9CtSPm|PrIJL08%rkcH1IjAhMxD2ZUQ*Ix6dg%m2})==N-k#bhtvzZ^-oKl=hZaTs3l$B zx0AqX=Gf8y@WSUq`MfiiTz=K%Qt@W%_T%i=rYdv>uR6%0wIxY1gBZn^pBDgvbJ?5} zKqv8%YxWaz1|&Id7rYvx#zus|xpBrm-lQw+VDr-bDrLi3r7Lg{LgrphJ{$;fsT}5P zy6-;`tFH7qXIsBs!|!fFNZtMJ1Z!@48gF>{cHXCFoIN#nePLU+roYu_&6kj7%eV-%^b(%Lj`#xbwifk!HG zZax%E-IvB6Qk+=~p);{NCamW>eLS?w8D9V;Rx*WMxN1qkRM?EOOS*l?sCbU-@z7?I z_%G(2a7KA?X1|n{ZsUU?)++;DQ&K-dnC^`!wN<5&Sr^=%%CDY#{o3;y^#+Qb=y}#> zTds9mSiK!sG~4#cja}8n!TO~$`MI)`%UgOac6Im$aEb(;T2Sw#*T4Gm!-!7b{KMb| zvfbYZ@-Y99yHv!{O~GoZVkg^U=ZW4dndhx&dMudhi@oi&{DR)vfY-tUvw$^xu9+#Z z*>VrRh5t6U=IPHZhzt0_JxF_AO=sC%e zkDm!uNe2a=ci$R3j6G^0F-c88546)4t~TzsQjXLry;`AX zlWeek7T@*rfv37=rp75&CI`rdtB&6|+pYV|jbs~XbK7{A-jLOq9--OqKjAAh6a8pz z12^t*XJ`Y7xJAI@NZ%0Bl{LmwoYqavop)$LDyyg4ZvEJN4lfO>scTN?24(EnptyWT zW$i&Z_A}9(x@Wsw&T?K4B!?UOfMtCM-X#Q~-E-9^*7EFfAz2xngH@ju80xFpL;Ygz zQ&)J!R(jf(9qiTaxdbN^(2~omcdXBMP>mNl z*S%r;W`(G&l6wZSZ}?p6?jBr`8>`W&*P*;|TWiRXmveVE&fVRYX?p}-UTG`Lvcyy_ z*i`(^!%xzY!G=>rc6jV#u`d_4;}y}(+pg;-z-hfs>HK7qM(q-XQb%oFja{#`SAQ@) z!Z*Ly&=I)CXP;cO6`0D z4S~SWGXdZV)iApPhiWIZ)Dg!KcY#?`vP2!7e9;H@vEFN}3y>`7E$%b-c|iG;spzQf z^huIavRow-ylOph8FyhW8>0M{9ZR1>Tkf{;`YOHP+Puqd(cQY$F7nlfE|+-LYeoxK z-_1!sb$V~KE9+{X~R8mj4% zI3e{$VorTea8`j^nuoQ1@PT5LC=t`+9|WEgFH!ai2a2wvT8YlQs=c#EyA;eQVAK=~ z1C@n!>#AeaIO!Hgl1$ElJu-ds4enFwHP#oUrtN?bA&Bjg&qK-0c4@s6sadbep7-=- za;K%0lBp;h?XOvTQRev#kM70Q!ES&CQFuT$$$xVilX4u5jK}em{()1m4=Cn0rf~S(xy2fv5E{DecR8Qw4}!A7qT+5mixhb8 ztXy^DQljhbRi9Y`&bT@C#` z@m{Sm=;4`&If-F~Oa1GGidNc{cKH(vcIGOt-NpK9YS>_mhx=vyPm0FgB&#}e*xc0l z3@oDMVC)9ZVDInl$8{4SjxpJ+j@mLrv5rO`=5w3cBFTl#cKblRd){;7YSQ3R8O;Tc z*nB^0iPwQGOKy5W+m?` zALp!dfBid$lN&S@6_@(O-aDB;$7w;5cq^Ec^kT2d05`tPKG7t;lB#`1+yTVL1_5}p zjJ}V+ZT^ir<6gCW*{UF3;>3Sc{vHfdM$3_8;>_E$_x?wa5cc;|ym*^#uPUz=S~Zui zoWmrijq?6h-`X6}_1AUz+!|6ZdAM7aT;1tK6u26Gwp;X`ZG3A0rTM_;O%55I3+*l2 zZMHTaD$}$)wg;yt95*oZb>GMp4-V$%&?WTRQqw+o=gG6);FpbC98^J+)?Mn9&3@f4 zRX==S+Qox9iyl^fc|MCJMrISJoU8bjhafdQPQ9Mc5~q|$^?(pL7V8Dz$W-Hl*Hc5x zL??LOmNdGFa(3-m7F`H03J5FLi`5#(Hy)zso$NC4ot#P{+r8?KPY%{OnbOGb<>3oh-*zeS~9tdAr>5<#Au2d?dz@ zhU@DGdy4|Q_{^e16y!0TTKVn*HJY{5)#4sCjcn2zGN}{Mk^^ET?@l-e zA91p4o|Do&c@=m+(W77Tc|gV5o8$c)*}%|rEsQR&GX=)JbGEhJOFTIGOhm{4I%U>q z`d{Y~4+|{Xul&ZWu-3Tzpxfhg8*Z80Q<9Hjo)D%St|$5*Ir4sO^@WewJPn^M9rjrs z&7Lb!^6s;%#ZbnV=jTkcUrjL7S({ddJ{K1M-ZC5W#+tl_Yn(i0H{Dfs9iP>d!!MyZ zvna^GN`pw|4Hs(~xX^zzwUYhn#JS$)`=k|`o(k@iPs$Bc*g}%*PH6E@k1fump&Rse zLBUk;XLVHgdkP&MtUiqRGTsSSydwz)V-g>SUJsBRcYwd~>*v(8?E9Jx7sOwm@4Q^^ zB@n9Kb}&KzYp93I8zIY&;>J5WkBFIUPk8O$_b^fSQ7W4#72wU@fQJZo0@^$$juRCd z`2CR>F?H~?USMrgL*bW`o+q#6v%kHUOf9}F()2}j?b~T8O$!fK`vk|g`}8Pn>NA5# zWtOQXyKl0B1<{TdPP0Bv{Q~y&DId9K91p##Cg9C;BtEzVP+!{aHpEg?IcH~rlg@PD z%%$>z-&{zy!y>&JW(vO88)@tloBQ|$?Z)H9T}!pM-s)dXJFLFkrdQ_`t%0w%KCsF} zJe9>Q%q6Dgq?(+e-2N{8#n+Cf-D*b-gk!VcwPTC-Nbb}ivhwg~((+Em1PAiWpKyYI z^Hj6egU-j&ALW&AnbF`q0Fspp@+ zjx3~^zJK)UY68_Yd0fWb@S==aZKexV7Tv1894pAr{oD2~ao@bgXA0Aoq}*$`_9?ON z_r$5Kk9S2NX9x~zoT1zG`w~yvPb_D7T$Knh3Poj#?qUc z_LN@CNY`Jl!nb8r(y@W+xw~pboL9_{d*baU+#aBHActrPJOcPp;OxXmylG zA5pn1!~sGb?;UzbD7^52lgKF<@+zH;yEeV)I4{`1G> z&vqJoT6ylB>OmJb?ySn%s)s&q{JmR0TE4lFR=VM3W0c+rqEBR}Q~rF^Q%|7}^@Av{ z+owv~=3qhg1L`+7QSQ|!P5m-ay~UQWk7c<}VnS^Gtls>!>;>glH2U-f6i*nsv3s2d z@xQjer@N4+eX>wDwSoUkC( z*@Au$KqVKdp^L(8LQYOWhw=^eOes2^VJod%iy=JH_5I|u)Je=;$$+9 zJOrf0%-!hqgwx1otJV?T)i;TXhB<}e9~2)QV-v*#%GevNd$MXe;T+GqL;)#w5$-nx z{yPM8luzkzEH+Zw(|bxLE2Ku$qvg?}?;1Mi)= z6I(&L3;O`#9LLvFlb-0d>PDA=-3{K-GgC0TpjtQj9H>EMdyq-P5bPvNW;sZj8uHv{ zxqe72nZHS2;eFay^{DRsgZKOr(@$A6SGHf|omE_*mJs^&vCu2OWAZl}cD;p-qMt2n zgj`iYGZW<#V;PEY-yzL@Ksil7H|$2ghkWmyx@1WLH~+>|o-m2>d=J8sMmX7A-J(V> zw!n-6P6^n>t;XscIMa9O4v3fwOALJ+P~_qxdlj5}pSZaD&8n#lD)mqIeo%?lIk$YP z(BVTj_?~QHy;V$DFK%q;vPYMvSUKwA`)AgxH6OexSP-n^!pZ6loe)_vhd6^zSuCyep}f-e$-#4~@0^^KQb(Mh&Skc1tS=?HkeqKSo2U+by-|4tfAXU{b&5hudKi z^QtoWVJD^+zVsup{Ym$1R@F9YpT=VC3tP@o3-{_;%&W<`7%8fH#{12qCu>7)e~d2b z5bgM&9su0&1fCRoYNxD~Ef8;6Qg{7!_rWQX*(XW*D^@z^vGCd%z7cz^603aPF0bj} zX313j$-(i}QoKZyrn@&qW;Sx3(AFqL=iX|o*A&H*_V9jL43&TveM)lZHOhfom{&fj zcuval7mDli)daSX8g8{*8wAgQ1zN*IOZ18zNk9+hsJ=6*vD!iiSuup*ZGFB64un$Z$4qJJvm_Y?Y_sU=G)(0DYj4$lH~v`N{B4cb>3t# zz90Arue?MNsfjhP+Jl$4)TUx)c)kj;GB!Ak-%r(PmiovHQ)N4mOkM^DvGkS889(8m<-`& zJtbd1PZlz7Y}Sni?~JHeCi_I+B~BK#)7#e6CTYfbsJn_@XYo%63_VAQ3{_6ndAs6K z(V-)JwGK}PgFfe-Iwl=pm39)t0!|j%OMDjDB6W?bZ4=nk@Q__IiDzL%>fJWAMI8dy zri8OwJf{U6v6=LYu$Wk2>;u6n$BSH8=MBbKKrn?L3o$7EPB&O{j62=bS+B(Jg>aiN zJ_wPAx3%dBc$=*Q?IT5t_1PSVXK>C=*<%xs7p0XpD0f>c*wrcB&aG_nNy+T@kNu)o zem-x0p+G#McFT>oE;jwOok2uxcwIcV(0$-4R%zn~7XMyhq}tHf`f^9kq!MbXXttth z*N&SNRAu%nTHY+m*1_@xH;_aW1;DI9#uA;PTIv?TX>`V_$H2urJVtooVt0eV{OnygzwE`6XK zn;cCH)~b#vrd`T;!fmzvT7u!uWKmLX<<<3u^0`@8)BGE>B|1+MdHVz4RTnt*wzvG@ z#eMPIZC;af8|-Yu^Owf)x<01}zw|M99>jSkNO)k!bV0i}H?psU!LIpFO%>PDTuH^@ zwp}XqZ_I>2y6!lV@tUH+s#Hu(Xt8Wiyz2&P+2h+`;8ri?8Q)K7wX_2D8eRbu4_j^Y zs=#&NbyzEHK;-7?idO>FRCQf<(a^7J62{R|Ts}Wm6l1GSb93nzw%&2|YXecw|LF^E zp?3se&usJV==Q%W3{-1c?#i=JM4*lEj6Fj{#QU{?wwPjBkTB~yEwUls>C+Gba60*# z@>J^yFIDQ}s6H;FE_xt>{`F)tz9ydWfnp#j+@9t{Iug&y0&i>pnNCxzoU%cZ17aIs z;)g)lZ-~*;ZM-|*U}q8dKA*DJ^I3O`Jo2pY^VpU#C4n1WMD*J+Hvc8t^yb{_wxsPo z&Yu4JIqLDD+#K(K^sI%AUj_u1`kdK5X|nN|2?oaYV#H<9an$)`A@Omu?#SQvpeRr8 zGB#LY)ViN^-ujN>{Ih%^yTcMR@7um?-0pnTX!F$hE2aLe#7hi z``ckBXZx4;m<|#9w!KKb>V9&7|N1uW0Ev_gsdM@_O-mFubiaExah_$Pk zJ$GB;sqeO58rSH^ULN6KKeJe*-qkfd{Ki{WeU7rCOcxH9rL!81hjw>UH}aFYcY*u+ z_Lh_&(&^Av*%i)*1cb()CRfn}Iep`jPMAKGAq55pZ49orHp!Gw>-Jh4q0uQauv==P z{7f&sgL=2PIG(H{$IdS4{iqh`@O_;d0?GH>wdhOs>-FRJI03`bw*QIb!uk>IzQ}=|uPUYqTw= zwPm~xe{LxK@zCxZpC!fGFBIgTmJOT;Ci0(MyE$|E0KET=D`bDj@rfdAdfM8qyDzBi z)RjoCxw+EtLWMKik^QE*`FFOz|2o6G+5IMQ!vY`82^I!cwZvB|txUH`cZTTlX$tCa zbA;$$NHe1RHc{Lusm8q1S4#B&>jZwIi)jt06G+SqjgDVom(P0dh5g2|fG4J5&e;!k zs`hN}IhoX^cf*Dh$am)y$A!x;ef!n~)ay+8$`kOup}{t5u&=FfNP5~iQ<&9R-ghTk zo_3>U{7#%UKV_O|`G%);H}7RVpK7Wu9DK~Zcz4#-39=P6(r!!D=ZrhR>;F;JIw6!T zibaMK;+S*wr$x+U>66YWt^F-XOlW-|Aj3D0o0hwY%q2F6GPpAsP4Ey)*cOrJN4HS{T|7 z;iIISfsV4@?gWVzyEg6fykBJg@z%8KYu6q*tyE8Jl&NTQdmz0cn3E+&*;>z{)QdE+ zK$-tESJ*bvn$UCuFVXW?FErM<@ZHf7(5n_&xprBonw5?~xbiH`X#T52slrJ);g{G)LPoUy0_@|^(#(_(UI6FhJBJg zY0&niz0t9;o4%E7Bs!-dB!+cT?xl^WC;rTqIt|NTLv5C=_x%#7E4lRm4j308ntaF*Y=8C9cU zCHYx%-#g*@M4LC(_hY0@s>Qd|O&GM{&@{xQsASQuqN@5xL|f!u(Nn6ctcw-*hQ`$Q z#u3RnQ9Vwqa>RxDl=>Q#s-@;_0f0&ebOmDD^&=T3*y*cPVVIHj%Zq$-HA*uH~+pevK_5Y4h)} zZl&~7Qn=bG_q?W(Lefq8DU}t}3$rH(_>)Sg?_46UKe$nE8ulh;&Mb)%5Y`vT?)~79 z{ls+BG}#^e_o&%5E9~z1vK3fq@7qZ|A9ck^-oRmT_d>lTJ!d{VUhAGSy z_G*d+e)&nAnmchH@v6Bu=^3m3a}BR>QhYfn5*tX3%)_{1%-b8AjiK;BMy>uilWcY~rB zpf{duhxE@2EGs-eztT`iFKYksNk{-7OM`3G8N!<2*pW=>*ruGj&2u$CQrax<$HtJUk)&W+fVe0D}*8JNw_i{q(Z%nMj|4`^lbk(dQrE z_$noRnQk2zYRP{(mFuF|%+S?V+oYzAAAcg4!?c^S@%XJhX@Dq8`zV7h2`#>{dso^0 z9@Ny++_Px%;RNC?F>c4rFF!8eSTw$AZb!iNm`ZQbN=k!UNx-cc3KAACD{E|XLM|z< zRDG}3U1w<%aLDm~+=LGb)10UPl4}L&HP*-c-q)@)N)oXU<_y~{vM6kCsL#~=7(vd( zlv>s^l~d#cNTx}1i3<-cov~UVa?m@SBczFPhgF|%qha5+FNb`@#sS`ZqC~SQ@!t{U zj9H%lCS#hcKS{%a>qYYJw938p>x84*s3Nt#4NBJbH7Ofn5*4;bJAZWgH1(b6oJ%F+ z0W4lmZhm>S|6yBdu61}y(ZFYg_pYjU<6f@~G}jT-c8`)H?vi$Mh}|2SHuyE){chTg z1)W#MB}tTQ>Q*I*yxO{hi{*4b-$%u{b8Gn*5`C;mW4RYuf6GMpVf3=QNdSolk7z7$Lb8%_$g(x1$4&e7C0Qg z)kJZmY4mJWKDbbnlSb}qG^PxGj>@&-xY$K;joTn35c~PWrtzo!Ndf{PX@1Fq>rLVt zKDTe_E6yyGHjoV4o%YE4x7_WS?Br6<_3{T+llP^?IW5zk+!*h4g0m+onv=ASywM@(1%5^0Ryr zSoPk>MAB5n%=5*?RYkPprX2j^S6T%mn`wtkzm{fEv|m@?_kwDH!~Ue+?HQb&l{B+> z&g?n4o7cTLWw=MUEt7RCXh&SSr%GDYJhNlq;7^9?3M56+h520T|yXgOe%yVk(9xf&$a?wozVsAhhFa>QJ2 zE_1SW)|P~BYE#X2KBF@Kbl?f)cXJkWO0cx6RIOAk?J4q&+w#)jrS;x@CHFhwjfbb% zxP?Oc^-IW7(C#wNk2yVOtE#GsN@nXMw45)fz5LLB`ri6T@3|~h=01y(lDW9Yb+mIk zcOKL#Jq;Y5!zE%H$(Yg_lW~GI2Kiv$%!BVZGl{!AKTo~AEG9bo(EhOf3x)2gzoEV^ zo%bhvw@Z@lRO8AY*0*jN{sLQm>CL}bS;c83d zu!|3hgT)7gvSjadhirLL?^h|(EzcR-#LtF_g>5Ibn8duzd#19C|4#NQruPl_3ku1pYgH6f!Ysflv7AR80YKhh3f! zT{Ek(ZV?B(4{sW&6#zWYrYZhLenF?hQKJe84qeMK{|N;bR$3A7v+8@mz$1LGz5y%cJR8&+Dipag%{Je!wuy=H5C zczF2f)z=(DYZjD{We`KWdz+7(TX}KSy;P8&4NMXpSTq|}0?#d3*%Fhn=r`$?7H;HN z&ku=KlMl;OUE<=NCeIPU9Tt+N7;$4(;~~~FSA%Rr_K7(IE6}(ou6cB7!LBzi>x<1a z6?Wb`FkQKHdX}!iSprPd^4+&SWX*YBm-+AlL|niMSRl%IO@KrWoh?hgN1H7h+x{EJ zA~qvKtMnKP?dWc8feF!UZ&kSM0=MhzHon+xfg^WF2ZRRW#i<;E4YfgJ!Bu39dO(nMJsLSOA6?#M2A?c?DbxJ`5 zTYoWaUy#4FoltbuOG}^*389ZaQai<+Zxt42y6_q8p0!3s>p+VDf2Xf@Z_~lI@CqHS z+_}@1#{z4c#rxXX?ZxdJ5TsW7b1a(5d5tuQWtPmuzWA1$l~&V<2SSPCl2%#;nkO!j zo_3(+DC-24XX*+OU#QDgQxr>^61LPYxKY2&<%3%(x|XeA4H1$s~?r*~Heg zNwlDKK~nC_dtFKrB@GXkg`UxjZl#_STz{^;bt_3AI@u)ZY^L{{-7oe>I~%~*uCttz zxZPR3Xf@@q`U0Q(1qKsy4!8HIT62_m!pxdYkl-lwuQJsD{ccSWO@TB$B;9Ru-`jJE z)z>O?k6q60DE-tgpd0~uNxa|vcoiA(d44Gzrq1L6{~V6p{-kB0UHh6S^LuWSR<2nV zdWdcOS7`wOe`NsypPMcmWjfKl&YL!w7C2SCkl8pD*qpLleq3~O*^zS}bBC<8x%urT z!_sP6sUx@^6jW1=eCj61^Z726dOE|Z!w2F(nwW&(#wPs1CITmG$-2Xhy&ah8w zI|vjD542ngI?3hYk=dm2x+1Y+C!YcK$os$)701(u=2$L#o7zczw_bYX%46zo2UsGj zwsUCiLEYqBCV>879=v#{<H zNo?t+*gZmEj{H=s#aAi;MfxOM|ge&}-PnbhkPJhw}a`6sSZVHue zAZQSjps+Ih&4oWX$k{+}gg-fgDcQ8_51K~N)T((kH4IS06>4k>;s5>yBqaSYOR zIN~q0^4gc{vz{B6JLw{YR(g55wz$&JtIUP($rgE<@B2b3_p2v*Qpk9*XE@)supHOI=T~YOP4$1y1CS-#(}e+)vHqCN zGg-X`VC~<*=r;p4;;LQ`pYOyL0Ol~P@e8K~k$Ndh zhY~FEYB^Y^40eaBm%;RquOquea)~4rc|2pSE5RM)^TVPGBIkEYi%i=_CtqRo^c1Af zFp7)@1T%s$lx85iVm^VOm~Z-0>xcCw3}we6ya!amM0mU=(>x)ivs3uS`bX#=t~XPF zFG~KK0Mbkf$%H*)DH0SqIavUd#-6?cysyl6#x>wJ(M{ZT%3u_qQ%uMP{P8+{;JC}g_-O?6^#ji5enx=w+j=ifC6xV~4= zR~+dZB#?RhUG+=-LH#6X)fs3tLr-K*HwC7flD{s>;16ejOiTJj^gg;m#Qm8|yLJ1UX@fj>b zCv6A?0?Tqp$TXxk(sitGO(%A2cnAKN|3(0axomwXwvFW)s6sF~A6}Dbb0DQ#L=fgE z*D|21K)9pTXSm)OLMEzpcCaS5 zf=H+QgY^tWyg#fzqHFOc_dqc7XB>G-nt| z7*-xMRxvD`8X))01=LrAQcCdAfP5q+SOU#k{|Y6cIi`%}2M@Rc-EkO;kkWOC{-hV* zFA7n}9lIz{$ztL?UXyA4kp8P4eACTlLWQ^}HUr<=Ot%xG(95v%F~kWE_>D70*ZQZ| zLf@HM65hetL?vk0{J09*{_D#I#Ye0Nm&$*a#y@LmjFyt^0aZ}rLBR``Eo!dcn~eWY z>5_DIg6NMH3;cY)G*AF$E)9m^aW3RAmj+&wX&R7@X1F7mj3TTD9g~MGTY%?J|5hIG z|0ZHD7$yg3@U#GAK`8$dDE=SF4lwIxfFr*`!hU9R_}OToN(OI1cL!Qw(DlLKBWRUD zK7wMEGJMd|faY3;&kT*V46C6%ltXoCF7O)qIzU|i9{5Butp=>vh@;?xcTK?9B@x5#DzYFD`wNU;*o*08PWEugmhK?@Mb%=>S z(r5IQjKxoNc!Y_cc>RZ>%b2DZq6?YEM{iJidM%kIK))OoL00@%1o@Z#{$HhC{{%|? zj}kx-iAgU|e??6bNc;VNixmD>;Qbk={3l@BFt!aW9$ zX7~+I6I7>be;Xi0uWr7QQWmPNBtS z3FvsPV3YVS{{2(&kI4_$081OjMGTQacRYHT(WZ|+D)btoUm0UhPTwyd9I#89NEZU9HiAtYbq;MFkhE7iaKGXBaa85aZ*AP7y7?#7pFs8E} zQ5j>@FmlZUjN!~cneR)D_OFZyjUdw;my^gb+~|2_Z9zh>7we=D1;57V!t3 zXE<|k-hBb-(D_7Ja@$jB|+o%%Q`wVwl-UjD90HM;6TJ<~G1nz;WO{nYM3a z?wOF?;)4G{Lf+*h2f?-#Zd)cxJU7GwGMHTOSW*uP>6_}&Y^ z2-RVF%b0S_|D^d0Lot}-H=a&@w=u~tKyCOIpqK&t_|HcS6`{=oL5~h*5D+qLC-j=WG|9A}k;`2pm)}-B znFgngFcvtOwugTCEokio`~>$Kq+sy)9q(XnbL5{)W6@ip6!Z7CobkqToNP@5Q$$Pt^%HB{`)3fU?!7T zVz4O2P%|RIoB^E9bY%RVY%*vVojT*=OloH~{P<#k2nH1}AO9KM`;}&q0*;=-zt}7t zf@E4A9YQ4NC!iUIaxh2BoJOV;HJUMuY6>4=j&MGV3TK}A$oJG7TVYl|mIWgJ-3Y8t z2}U#xN->afR5SP}vzf7MPXF7Z@YEPahtK?ZbISjIbIRDszt|jxwEUZ+Q~9B}(QF*! z>v5U6d;|R-G&Fia8GL()DJgtEUt>jU4Dm;PjdBiC6!?Q?#tJ2)A6z*sLofxXh4eiE z=uO0(11NsrtN|*HZW~w2NXQHmyBKXlQM7!I1aD$Q%Gl_^QD`)}W9W7ssg(%>Y#T#= zjOmJm4|M5Av*mQSKbFquKn|16;Pnq?b+$f6%)y`9(92nVjir1qTKvBdU@%sf!cZI^ zx-@`-)IT*a0wZ0&vy`*-jWLTOCjE$CGk(CY&QW{}uYXeSzp{aAf$H-s^2%7``oG62 z^uH5<{!x~0#7l;w9WH*5k!60sT4TszQboKb)8<1;mp_5hA*E&N*cd&JO8wZ_d69pM z9{!(*oo8&+Lned0WGZjoK!MPEi@*Q>jC=TL3_Ykd2vKtY?5`~IKT=C@jAKU&m7?N? z5q}ug?noapnio;MV5n=jtJofhjW%RoIpF#sVBoS&%-xHZO z1{Ao)nE#~fFuIKNf=p`xKJb(Ha%MqBf$!&L7Tg{?H%lRhIRSY6gT%wUxsrZ!6{Pgp z0pEBxPD9rsg$`bc&|M9|R?Db~u%e4p5_J0a<83gP*(defLGe%lMEc{Vg z!m!`5xT!OWZs7F~($Y_x`d0#!#sA|1)PF`m|5?a4ntcCHnqcW991-}B#VU+vAB*1W zA%}^gK-XmHDI{>s2(oOZ zvltXe$TYkr(_TYL@8IwjRFot!#2BrUj4)#)-$kZEhb z{l;AyWSSfE_unWSjonH=3|rhJjaF>*$>OGXw8*01!|=zV+YIwGAyok}2;q%e=+SD6 zjxmf1z|#aUN*rektrQ3yl!_TUet!xT={f{Glt-(MIg~^P5}Nf$zy#2?;R07mbf*7? zt}~A8I~2tu`ek@&wO))Go%uQ#E?Ph38gR!9P1)U^5bW0+0yA2^9vhiM+hz=(WTpnq6JXfVb!?D>A`uJxBGYh3FL(uDlq1lA zCjlbz^puyLVl7bFuZr0w^gfzEFa2Rac&-NHhz7J#`NJSb#BJt^j(`q811NIi-T@S- zaUUxBK+vXdPyfxpFGkELZrgW+5^{84;E5FYK@SV=KiB{%eb$CMj_}2)!gCeypcCB6 zjEe`FWP0+^ddA$-&fFc!+?(Jwybk~ky?D3)o_hd?E->Zokw9r%sPk7i#;*eiH~2BO zuDXH_hS$Sj!hl)EaWm*^MnItN8MovjnCtIwW9YcMhz?lmI46D;ESFfz13;!!$V=@3CHz@I(yM^=Kr`#>G^o1&)= zXBf|$!9zdrkQO^Sy2Ct=J)#8w3#h9|Pa*ln0FDAwnfQj+WZE%EzcBy+61skHI*|gq z!IWX}1k;SpoKz-Faik-H8+1cT92KOf+MM-O<@?Q(wx$A8p{9DxIF_5TZSVA4@}I_>ot-ph)C1SlLi z0~7mSiVsNRzrms5FX6)qIuF6a>=^X=e-#8qgbN03R)V3A)c{LJ(Pq3R)5@5%8D(0a zLQHuLRjRSXfkCp6-as+b92g{ggmjLqA4XAJmQWPEtXLFPlAj?NqcGww6lQ8LOd;_{ z8a1XH%m_fnsdOXL#wdh%AYF%0ka>#zrgL_4x;)|qS=c}NhI>W$f$b09NB)e5K@0$B zWS(LrEGU2&!U)jcj6@%0JgfoOy~c1BJT1kC?xfHnD8Oe6 z{lm~VJfJv6CwhZuzzA(n05&oVoz%qYyv>~2*0Du|(ht~pz1Ok^4OAsMw2=pmHLWYV55JZ@dXgM~(RFM%& z*J1wmhx&mU0U8%W3H!NvMue*WTq+zImI^uPo%lXwK?EYx(g7zx_tOV?64^GHRtXsl z9Ah91nf4WO$h1LviYP>;4bf8q)CPIpB|Kh6#vEaFeU+N`9XUY zgv=kO=SSgubPfySXomlMN~EAe48rdOIF0y=hLG>^{?~zaAAok>a2RO9e+D#$3ianW z%>d2MfF}O$01d|ax8Sh{)bl-ILySfO;17fZ!RRxJs43IsVND=UC>LX@0qF?&K^c1^ zT?m&00^|+&jC*BJ?Pi?Oh=lFer(gi4poxjM)BbD;r*)sTfj&t(4$FBtgxM|kmwju(vC{~2B=)A0hugV9C^ zIBbgr@rjXcA9am6@E?gFDvQ!}{E*Ig21W(=o)*jaV;S6QVQ#|9HI*(|Eig4&Mj(vK zga_AipplMf@0$Z(k|l9qPPd_uxp$irmMXP1inK2V<~n&zmY&VSh&DQe}%vG z`<#za>+i;Yqy+}O_~eyKF=*Z2Bz)LnV>8>T59hz`dJ>+(y(v;Q#OcwvIhF#RQKlM4 z9e1cXYRj1KIPlFn-& z?;rl$N3Z918yCyR7t$|ue|WCf{o$j`n*5yZHR%^lY-|1fMLenaNAfiF?qCc3I#}b1g9GsyXxiRLJ;=?5S z2+yfgrY23xjHvccUhvSHyDzM{LF>VFa|`<&D{LOF>lvT!c)88KFY56X2mUy>YJWGC zh`9HHGrOm0$Ms#7PbEH8EfW& z8#W?PY$KM+dA%uL7I1o@|N7*&MSfGSntXnJ_HC?)vs%YHSvac)TPls%?((3$X|H{kQjKEq39exVi2!UtG~D$)=T>O#EH#vFj45$TQ=3 z-@1bPtF<;Rj+%M4&?t4Xt(x1c@!g#ZE=0LiH(#hK@ee*KeyD8S#Rb>AYIl_%eA=PC z|LyenEeVAm9!=c(!SA>0Gkl+^SCzl(xlTH#YqebCH~STO4oB#xUXc>GVlGOW@LwS< zNbq(Jsk^*fRa#AG|A}i$u6()r#*?dkjr}y0g^kZ*Cn<5OoZDonPiTG1cl>~{SS9c-EAJc z^v#us;%=+C!daI;znyyg&F_ZmR>=iDhBXBL?yU%0r_vGMr;*jBbPTB$^>j;?Jhs+g;j6vMhoYvbO`OFqaI;2joUCxnIGLfnHM7(9W$?UyApCsc zyBa@7pQ@}AZu~XscYAMg3#-&lnRrIIqJHaO#D1Z+&CfTjm7yU?C!AayTC)B^i7mAj z-e^{(wSR^5oqexNmu9>;`S3tg^<8NXm3^~!dWG6V${de1{cN(VtL5?p%f92g!qmvt z7fYsIJrj2z+QDaq`Q*xOkC06qdW&sBEW`YZ9Uc5C-<%7t1@8-xAc4u5%>@tkgj!`R zdhq+CsFWzj*xn5nR`6_1j+%Uaf}v1WhiA5sjiZEr%DE>E4j zVY1u*N7`EkwHbC@qZKMZaV-=tZp9%$Xwl;C5~RVUxI-!KP~3~tph1EYin~LAAT90` zf(7fL&-0%1>&!Rr%=a_NJxOL|UwiMh*V=b%N?t|W#?J1tlqP}4A>MV@OMh^_#CleK zEvsh9bFlC>8H{L5Px3vWjg4j{I=2#u=k`WL{pX-g=});mV-yY*Zh>H!Ixq{A*k`O` zR!t>}8NQW~rO)w0@1_xun$50_jRXmN1)Lku=?te{uUdp#L*BJ_MQAasluK7xN&MaV z?)GrIU{Qd1gAu#H(6+oQ#jXWvPUIv&leF_W2V zY`h`~$sqJP+}Da$)%_eAKg-Q4f^e6!H~y{9bmrFV29QUvnQ7bqh(GBq9a2P6|8!X> ztjfKM>i4Cerv+^wlgH0-OqlhASiAn+Jm%5&Y=y*OEa~burrg_aQwuc|KR3v|jAemJ zXWykS5fph&cU+q+R<54u7J6h=&ORb%z3wqYue+7a-s4Mm6s5L*`(P@Afi7F6z{H7S z2c?tfDC2u;vXg8);rMN^SrNwBU^*rz-FwbUK|{dKtH%H_nAqB!LhyOJ99m&dl)Jef zu^rn~|1#C_9zfYwrqhnIFTL6!;W{A0R=$&S{71VVJsOILFbeY8-Hm9t_>qg;t$2vY zt;8ths$HMV(74x_v-EOtY5@fpdBS4^{-o$P%5(#6nWu_oL8{k){lROy&QvA71cr#C zLe#CD?UoO{lfELhf%0a9dBs;w&YfBzJ}8Hz*fWf?}_&$?948QBDp?fJB0K9 zy0Ayzzoig02kk!ou4twdiVMNx{Cb&ycGkj z%eD=Z@0YN!Fg6$gq;V?(uLzoNMlsB_1pv849kIA9K&N5%?kCn)BDe@BHzQ<<{)DU6_8R zBX$1uJkzqJS9z?uxS?%(7{1`(k{!+!w>N!0t7)bGEL0_<_(z`#WN^Mcqc1D%{Jvp?x2F?aRvwbLgaxfXlBt4?S_hZ- zl784K)27MK{|#u+(P$iPECY&3cb}7n4;I(F5wzi3g-q8p4;s|bUlLVyJ1ETLW^PfC z)a-~0{9J>}K2$Cr5cjXFs5y+-R}KZxK0|=xr_@MCF5EW2|iEh6G(JO1kBCy7Wo`bK#D z41lm%fa3M4;yQx>F8(!-jo>Wx55oABI-mP1gZqG;ihxh$PZbXxDUkUzM1utH|DKdL z_5Cg~b3U`_oqHs^SZcix-P`~LfKQ#j zk#cMqWo$76#x3fd@>tW-B=qsJto!GeuRZAsN-BN$Hn-Z|)Sn90M%V5xnClmr*2+FT zzh9ik$RX@cQ#VgKJsnC?*pt5B`A(rNdiVSKbqnnn2~az*NRKP>bagR~XOYfdZIx5^ zy13w%BEz~H%k}&*uRy<0TKuQ+yEubXoax(!f}_~+84nE$HeQ~$I+llW7Uy@2hayKr z%L_`TvMuM{V=P{SZZVQ?e$;Am-~@qyX3g_DGVu`W>Fwt$)~Cxpm!i-yo^}!q$7S>NuIHOsAxxn z=|1~d9KShxvMpEurJ!WW8}BfBeDKAkgNaNDSSx^|@plyW^m?DnW-jp7c1xj`x}8f& z-J-rP#XF*8!+B|b45FarD&_0f{?%bI{s;3ImK8rjXcN3OrjbMW(cypr@eRmHf*juZ|jsP$j~e93Ib|> zGmE_hBU6R6m^X7ueJ`z%vIuXwJb=Wt4>q6E9l!M>km4|i6TtQM|(x<@6 zGT+3J-WZR)_l!?|Pacp99OB9o+C?iJ$uZ6Ex+?j`p`{xI*Imj9j+E>9Zp61ovP-v0 zIREu6j(N>^8O?UiqP^4BNGOc2FdDlL*uvHJ%aFV`;@Z0tuhe9xHrD;UONWxx=w|B4 zgpb>zdwZr2PhlaG!{pBn`r)>BC@kd&-Yh-J7%-av8LG%U*+YQ)6yy-7gN9XUlOl2e z=O~JjDY=5f44%#5o0rw&O7a%JFOv^9TxO^X4hlB+U8s3zoYK1E<#Nsv!TvIv=iBQZ z+=XP`Nr8CV@a=mN5*18;PYz&7&pdD26`@mODrdo6$!cHhcx3HCeo0JPF4bLt(b^Gv z&wKc*C%zz;n}}I$tFupU5gBskRvMmBM`B5K{LAx40v~T2#l;9q06(~xKG}7*m{;o} zQ1(Qe$8ESH7w4}v(X|D`(pAWOVKnw^a8jdMvwO$T*L)SeMPclDgaDPgwzrfwJ2QvN zq3bAcT7UO;{v4U)!a>6>p+o>~troqj(>MSz3 zh3jYXf?cq-FnX_3MbMF=L_GN_p9(>az|$O}{?lEB)MGQ=8b0~SIAfR3$<(v>1uqN} z;hi;OhX!gfx-b9Qd=Hl+e=6 zY2U?)R$0d5D4F=_s)04$)qMU0tlyV4yDJ)7q>G5wYU%NqAI@cXebA}K=sd5f-cRc_O=~RjV+@gTlxco)PkA{kLM1E(M_CqY zzrWFJ891B(J%hgQ^gOS$7~hlgP{8OJ9@&*!bZt;gAL~;!bkY`_?$CA6RcA6|SfSWT zEEv=+$YGnF=-4YY`!nTo_pWzb%DEmXn5xi-uD#^UH@Wj+B{G5uN1$P`ujz=<_(E=S zd;m-8?UEk%Z39N&2L1_wytc39*G<&^cL2_&FIZ3k>RrmyzpU$hmvRKp@i%`f@aq^8 zNOIh&|1oR|dcoK`&zoKEyX^FQv8gTB*yL{}vP$(LNi*;qK1#?v5TJcvrQ z-0+C>qN~aTvt?_e{sZY7$u2OaCy$HKlzQHuW({#q7`8YiY19;pjrekM@ax(vDv#{$ zU1_19<>_GmZslzl1nIYMlR8D(=EEAzGX*n_FdBT4b<9|$>Z+-$IW4h8wASKU`Pl^N zLF#_@p&?!x$w$PI2R;trPd-jrU@=Ekna8zOpI);s2a4YKaJncj=0q%U$(BD;S!_QN zdg@?gGR{>UII3s#a-PFH?+Ez-l1`!>V8JCEPdk|u(->p+d(y60+3n?p&oiVnjV=ec z<*RQTo1M(M>nSN)V`Fv2(^@q|jL3KYWfkhyB7PmX8Dld023#G^k3M2D&1n9T-(Tj~ zvU_i!e)%D9dH^sBml+=ES#ubBD`TKwVVlx=WCG{V%X(+;c3hdN=9B3g4e2U?>|r#5o2d4LP~RjmOLat$`^9JR zjL2Wbo(!^YcSK#>zva47;c|&Asw25wl+-O(n3B=QC+Ao&9-{HI)3uB-3+lH@xy>g# zn8?1cz0DWEw>#t>E0UWRmp|5(pK5dK*$;v6&DLAEKPIm&y!C$KuV4ZGq^~R`&z-gp z=YelfS<(jpA#+v3pFcO++ zdV#4I3xj6(i&MKPf6i{d5mPmfXogB58_qf^I}GLkykhKs6J=@~tQxxvH2sTw4Ap~yS!qd1 zxg&~3lj)sT+yR>mp9+jzO+>Vex4O#9fm6tb6I#x`6zF^766m@9-VY)zxk`1aYz2~x z;p|owU38qj)h4iBKlRb3M=Vu%1sMDRvp*lYX7Bs8bivv|^$%{##Nis}Y_Q125?|dX zC4Cuau*mSp%kG6?t7Nk`(?*J~qG@#Ep+(jktG+(%UmR{vvGSAJLekO3FH~&$QGoHn zvw#9 z(~1tu^)iE!eyZ8B8clv2Z~SPGFPaW_z|uQQ(x~oE4XyL9!+Pg9ZZhHBvF0FLX(Hu- zX#-vO;T1H%HI4RSHWLBfNKs*Cg9On1ml&Tb4_%%V{V2HqRl_Re}EM zxb1G4@}>As+kMC`k`&uBTzdD?6iFWdmd9^4b>HpD_-Pu{qWaY1iGLTb+uEZqF0?KP zv7Jr?ci9cUDf0yL1AnS1c)wBQJrPt5QoFS2RQay@Fnu$X3Ho1+;35WaD&QGyN1F;7 zekY&IN@SP|_D_QZgKtk&1`V3oW#g;3=S;<*-yEtDK)N|~dyht@Jq?1qvDy8#Og$aF z)@i>+z+@9UgHG z?BrQy79jb?!nbm(A!PObhHjj-f*Eea)_x@Fn`4rVl}L%UO+sT07`**W)L<$OJ;fO= zCPQ#@&9&d2>1>qvJ$KO`fKz|sY{}!cbn2k(*`QBr>?Dhtv108#_Q+N4Kjyk#A#K;W zR{Ht;8!)n5@vYIthx}>5s`z++OgrrpWT3=Gv+HvtciNEcWsYL0^oGl?)VwX%r}bTa zU+cp2at{RXn>)=KC~di`@Dh~J+D%{$A%I=rw)~_PVw%d=kUuM`E_U#w&xqT=1 zj_5=2FQjhOHH41!tTOiyVjCqPHokCBclQGG4Yd1ps7q8J$8ntL4 zRj%NS^w)M)qg_FNO1qJJ*f9WZ z@H!ZBEx!sg$2O{);pc##bRR9Y;|a8%$l^Fo@d>FY7+K=@LNnCEYqGPrh6hZDSe8kKcMR0gLs z%TGK8{T|dnHKC3YWkq_SZt7=2Y5mWLM3uzT_xEo%;En!*=gz#=|UCI!vo%;sFR-u1wwqR9Vop{0&dKY8x}myvb2vf=5S7#)}H z*3bP3EO0ywJncBM`X5F%ImSPiS|zvkeb(`lAvnhPlmHzFdE%K7$b|6)}Qzl$%9GH0<31cdeM2z+4>n0DIqZ zz&k3xkH5SGqYJ23$cV-m>G7(KnMa0z6K(N#1biEFvIq6 zXM4qA6w`BJ5>;J2@0homPrj@5163%XVp=KUj3uFq$}xI|QN2GyJcwd>Sm$B8f*t)6 z2o@sR$%|egfjCa0+vzL07w)8SB01>dtUirf-k7X_PVO8JvpDX^Sn&uu`?uU4nY@Mp z$2;FmuG}Rl)a{XSw{>zMGF4SI5C3B7RpHJt%rYFO!9df6c!9=vMW^r6Az7fOcW z1yX7+j^WydyseXzxLJF*|A~d@s7HW9OmHOc3)n9a;1-u`cDJX(xfQFZ9Au*u9U1-mbI$LIMxJ^izf8$&5s992c@`;kPris2F|trob55MPWdSnt1ky_ z5(7dxhg7C4Tc+Jlv(=bQI4Td+&Y=o3JrjtkdZ|*Lc-9$t?FSf}4w0O`ZJesy7;93= zYRzpA>1X1~>&WV&CCV^_4@H%*(2d-jG z>1;2mePdO<>WU}&Ay&2zkFC^NMPs<5oJA|5Q*h;BeoolsmE1=u zClYHhlMN_*mHCU``&rgLnuJ1GVy33cCiAw*&5KN@cZpwMA?$%Hk%%NqWF-VhzJ7b4 zH_Z*j$(=>nj;!Mx&#UDu+=)}DJ4qG($M|cvQzRHvfm1;J#7CY{6?LJ9PrRNVRT zg90^qu?d>yEUXPCWN{%v!*ym=YiF%gCb^so`FT}v@=0p{L(@>|q^|rPMiC`YVz|4po+?Qks>Z+44wcCovB5pyk`w zX9)TQ;SBJA*!pRkSu^+i{HIPQA<|89Fx3~tyEZHwKuS_TnVI*^h_OZ-Ll-<_r`MssRSMB?u(N3aZk}xhqCRjlGz4`pE={Vb~Mj@`wGdh zBK3J&;_%7Q>o)GaNg!WrjJ<8z^mtvi;%j~5pDp=V*l$0Smb0hBNP$4{t>*1=)J%sL z#jN*B&)bp%Ob3y9y1tJ#ia?JgtWojH1i`YXhcp0IgvxNFGMjJnEq2`6G0lX_OU$d< zii*Mnz?T*(8K8h~3I9?7V?3Q`(~VYu;+noeTc&K4x9hELkeRF!$H+U?&g zYor~poi>VA$<_Z7O@P}!~3YTp(Z$JXRMS&MM zdXavHlwk+Rr#gMAJ!{pom=-vid|kH3JU-c9>o{^QEHRyt`((X8n-|W1ZkX~st=zkC5p`&9chalU6A+P%l~ZTZK|u=2(*5FI{63oyltr0!`J^W_MfmE9DOxd${9VRxIO6&ObO4$2afSGIqWkg1;SH95jqhr3)#< z$2{~&q}~^)Q&D}J5V0#Nxb9zbU9cf;PdKr;!w+6utf)hH7P+P})P5HBvay#uRCxPb zU&e6$a2RfB>#uc|r>A=beqfVomjSPpB|e3Bc4)MBX)THeNxqr# zU?*w*`Z199^C`*ceh5rG(yp{D@Zw9vz##!6)l+hQ$#|dV#J{Hp={-ANiqAdqm-Q^b z{IdBh0MiFsnrnwJFf*#jl{DUcXp0$_&^E-$i`5l!O^W(xN3}HYiXWfIl=BH3qx~5@ zncJv>n5|yc%lyk4K7@-gEs_UOC!R-e#`^zW0|x((2=|En<^M{KOO9BYk;zMw&C-W0oZdxz2UC3d19`cKH2+nG_CXJFvymqE6k?Ux`t_T@tx{zw``7v&C*1t>-1i1HHe-5^m3&LadrcwJW z!NT}QLh^Uu5=MO_`b^_ys)1;m&IL>x$6*gb>#JSXe3ivr_CIgjT(MS4>0Sg40eH`mznSB7LrnTk*3w=SzTYTGn!-Cz z=Gt@Be|Pd#=8zTDE5V>+HS-a^TJ?mzTP;00LzR#u1JZ7Xv_cae<2UC-8Oiz=G=AC`So+N9N$8+n z(P1b-`!;f^xCgrVguYRzB6+}A-mvmnqTQN|^&i=216NejJDFJZIGKwVUT?BO_Xb|B zHh4X4S=72YYawo)U7aO`hf_n5t4}Yf8DqpG-7|7$MI!nMGQ=4>|2Dmsq)2I^*VQg+ zCUwex4nkvUo}^UEZ)Yt!-h0=5PoiaaADls<7)(#m^$6(Wx0~1iiD5< zU1{R$!mn%oE=7}quxbUKM!2g$sh3U74pF7_A%0El4@1lh++6DPtd0pBvpC({h<0Oo z7=B>iRCFKtsuTM1n&H5e?r}lr*N1OB)R*YgV+UI0@n{^gDkHi;=FZ=?`3Qr_9AHl*eoVKj5 zULO8F>xQvhNcpmguB{5Ag)}iY*{*6MkL!Z2Z+jF$*(TZ&015Ne5Buqf#>tGT<

1 z4$8NgH&hLfsVFpA8eC(;_OHwJ8?N!54APuIWT?|L#KWfJ$zCs<4ToSzs%*79Mt?2g zBb+!IhZO8@qx7_8N09FnKXx0oN53jgtGuxlKap2ZS3p-csr`9|>U;C>5Dm1BA=_U; zC#nU->uFzdx(IKiO!=FhG@b$I>Hi!$AVg|-8R%q$cq|rZP5&PdRCBVdH zd~kztsHSRLSIRP%#mb`?HGC4TCj*l)wU*zfxs~kRxwgcx@E~|EcrW-6wh}7~vu!MY zJy7Ox+ies-9k!@bBgv7eEoSi#d^3A7+mLi(qq%EPIbr5L;YHbn1?PDKr{>>23Bo-# zEyNh`uV!yw2>?$$%ky_($r9Q^cp9eE+zw+oxo{W#W>>-wMTIcVJ9w8Lj67 zCGQ?^!P}-XG^|MOeF^f@JCubvs}}=sEVh>ry{ic8t@Fn0PHr_J8Xe^DU4eZ^iT7F& zQZ+yf)IUFb;yz9~xqg=j5AoX0J|=P+cNTRgbRAwZePQ#l_3cbG8T09?qQg&N*r~t5 zLowdmT=O#?u`b;S22%=lI9`8(1Mki(&Mo4$;ju4gHdO*@Uq>5iZ$O9Z&+!4&$;$mh zcZ!V}evaa4@)w4Wvvgp?@ossxjg!Rr4x2yc+t<^zXSsLzA?Cqy`P`$`>IILn$^Y`h zY;WSBV6oM9x(^$vS{geiL9zG7#rZj-&H?S?{E%PEahUJB zHzKfFV|-{t)%NGrZS_2r4_iMwD=Fmc*ezVR?DfnSjO0tY_sMICufQBw|2hctkY9VX z-p@9;`KbTZi$G|XRpt2SU-J~ri~St;f3hiP1Nr6DC==Yst-b;CAG9wB#%iCi9x`Am zliYDhb!QRrSSdfCqPL9x=%Y@Pi8lj<%IL@Z>HQ$tiaG23M8)?HW{UFBx{u&Rt-rWi z8xak8sY8+2%EelaYlobq@6niw33ZHWa^FvUMw@|ki*vh>I7()=eU)GHLzk>UaBdwg z&F9=Eo6^#b^#OYI1M7!p{;e`Q3LBYzQCG7alPpsmuUXr7xvq3+|6+Q(?al4tVVDID zVqP^RnbcED@_k0$TW|_$4~EVPC5OnviMsW9uR#d1V5eMHRM)H1-DVz z(MWGXO`{0=r;`BnqDYRUD-C|2U2s1rk(S;qFW})b+%M?fU37E-+Y^nm^-fCu^$NEI3@u*4^c$DzVFa$cJmjpnb(S5 z^12&g+~E0oWHGh=O>s6FY)g!!aK=&p!<`e@dL(&nyuhU_k?$`|N+tz#JdEzIXtsvC z(J=~oHJ#@{9y@4VJ1#HY6O4PZfR<}863gQWo@FDP08w(xv4uwH{xT7F*~qtvvhUtC z;Yey*_712^QaF#C=!Et^vFVZD{>SNDfTTj#ThwT4i%+-TZ6A%w+YUzYqp?MFY+u() z4f@m^Zw$Sa*)hoX=Xg~DTDt|7Z@+fF?=8$ka~+jQ!m_hUn2?f@ZXPSO{fdcw)VM8u z9_@t9|8dV0a)5YMlynP*m6)f9H`}PpQzA9gza~K)i zZNZ3;67>U>Gw<5-nWssBxY{8{EZP)wRu^yh7oki=1ij=7kUt4YBI#(3e7Wxc)q(;b zkPJWc`cf>Au5<#Na08)e_uxkxMwPu3akkEjbr{E61S`6CMQ~~dbE3tk=8-|&9Sff+ zy_$FoF{<*%SjSy~1>zSBnNf>v*fc5Lr$fctY(E|ml<`q{q5S^~p`2LFbv*{%au|CUZbv2<$ zTjMqgo?hTmskWsEmiY;HyH}KPv~8UMYW$nc+OzGB3((OtUJkmH_Ebc9Wp*qy%q=G$Ry7c z1Do@ruP2gji0&DKTY51&-C_L zOi}_v>FMZR@|DEK^O>};+qmV^pdqsHp(&ztz&rE?|K<+yjmfTeiNDsBe2sVpnL)*_ z%+Gaq5fmM~EKSXW~(8kICaZNH{r=Q><@plP;?xm`QdezVV5!$KulOK6dezk$;h@;3|g_ zdG+BgeMLALR^DC_Hr@2B;CI_hKpV(~GYG`YTj>{>=7rC(Xt=RJgc#Eh`R%tM4CBZ( zY!>@i59JF8$T^K#9j$+T&pGeaE*6Q}JQX^$BerMrTQImNTHN}IA<>u!{v?s6_-dCQ zCFDSIBp{PDF+92f-mn{zt6ID4bboM|CB`XiAynBn?7&U^eFuj`bu#?z)-fm3zfg*4 z_(UNGn>QVvu?f{T8#xhUrCwr?Qc&{Bh%lJQp*e}MXRUvmUj8_`uT@XP;!xzL${-Ko zM0xdvs4{~FJSNL>Bs~57@;uCjo5b>#!-PvE)rF-gZ4m$8rVB6+#G3a&z!QXJAB_q4m=x{VtM!YQ76Us(-Q_gtQ^(H z6!;;g(NRkuijqnVO+|tRjMe|S?(H50MrDvIC&lmjw#sf^cLx@YYE{aKPp}xis&36< z;xjg*TA8W%K>0+$Kr30_$i&J{o2+|yCn4c578P3-WT z4_kRF^m3xkb5P?*NTrW|H)Bnd0|p248e@ZHZ?xuI_}jT&%FP@Y;@O=#;qv|5yzSHS zY53WZ&$zu z4&DEKz@b!uLqPMFfkP51fV2(m1U8Vn)KzLja>FB(G$+47h1ST?*V%|b@fY-s2p|ksx{6oNp`ZLPAzp99xP`oHOhJOEjF$x{QYz8F8u#O2 zOW}c0I0I=iCf!y}bo}WjIVukQDO9;XIm+Vptf!9Lzp8?-SO9&%RW#_LoOoOebmKrd zi&*WsgeCS~%tR*q)uEm*nuQ&mZZ^|lw z%so&ets8?2C9mYK^gF3Bv8B3JW}@SopHlr|ew(uwh>kS%k4YQPPJw7v$2LWb`>Pn( zyg1k?TIE{r@Q20gA&$Y6n7stsNeTDc3cc=?leSDpWWZeRsOx%Qqw$^ma1CC>aa*2^ z!18$O7I=bZ?(YGZPDjfhI9Fr_M6<>1&NxA))pBy?O9er%(C{q5WXtMS8~gAv-QQv5 zlv%v;4zqB_(i4qF-Pe@e=n*7*btU$5*$8tXvNI0a+JNUubG7z+>;?g8GA4YO>pu!Asp}mYZF#B- zqrp^M$x7XB9a~N+n%vphfhc5={!WGX?<|RL0y*UwG?vu;nFO3U%vIU9$mt*SX;fS0 z7YQEEfBTJVq_z`Vf4*lhnUo+bay}QV$Imdd9F>i)b6i6*eIVAgUH0~7-DGTMnp)K!xs`%aT1y(%||kS1f&XeEC#+SjvXS zaw-Q}t;cVaBu_HUks0jvEWW};qE%Hl1xiJ(Tzczd_@GJa)KHX`aR&sN7#p!4YdNsB5} zMrlKKKl!d8Vf@P~vf_P?$6FVvw=>!&*X`B}ZH@SHBMokUrs3OPJL%|{c8o$eiQ`NSH)}Mw+bC}P4-vtm~cc}Oe zZ8TJHA9Pwy0Z-Ov;r=xC)82p8*HFdobw7ujXSR z6(0Z}I{Cs-Sv>YEs%_5q+!*ZaY8|))@lx>_jdSjD#c%qDr8=B9K^v{b={Wvu!3jSX z(==46&BD1%oP^#whf@`~Y(pY>bYQQ^x){C?2W@}3Po&DtVY9C$jQdNu$tNU)MGQnagYjk7IRl~|OlgDpV0EwjQ#cf|rVJWRWZy<(u`P)d^?p zAUVBZoPrMEtPWZO974cjwA0Y+4|sO*f@71+9<=YMGMjI3@T)2y&!;g<%*xIVMT==! z1z~LMC!w$&Tj)2&W2=&* z9y>mG^JG*R-UF8?-`+}>bAomjKR82|nHO3|UI>^W)BP$c1`Y?DAWzu%R(+zV-?{b_ zxNB?V7JZp9qa+BK!Z{=wE`)MZ3!sK%FVtKu1s}3^3()9>atPpKEWys{k~2S#4Ua7P z87LzvR_fT&kfypVcnGQVn1;Q%2|3+8R)m)3jGII*J)Gdz(HeVGoLThss+y!uq9=Ck zrOFk!4`Pfl?)~)31x;?KY6QVjyw(B5id?D6VoP^_ouv5Q6!v<>MbsZvr?x=@%JwAEI5jh{fiwO4iHSMu-HmdMQo{QSGWswA}+VmP>&` z$pVNJyT?5r{TD#8{{hhcKLDca-;6RJE89N327vGE6#gd+QbYEq#dZ9m<4}herkQ1K=|*hL;1;VZlcB(s;jFGHm75iTW!jh>p79Y zeEvKCj#vxyCwhnX`PD>}(vTP=n^Q5A#UL$U0VCf(%;c&;Rgy}2nC@NIx5FfCEq`Mo z>45^JIIL*}ffVt#WB_ezx*ordee&~9)@MR%LZ60q1WQ_b@M=4VUfIba^? zQY%j8DQ5=aE1O!2kkrKqPrUqAqCgvbk>oNMlavqqWJh%gwSb zcZ{)yo~<-y^X?~pZ3mxwpl931Jop#9ECzcGc@ZJO*F4M;d`Bx zRn^p?55`I}B`Q*T#wmf}?6(+POa_T!&F(613{gA zDdG@4636$k} z`S95UBlcUMLwX=Y+c96@dAs`~Y`d5!HUUWHuj)Z6F7P1u{+S z@uN3i++jX?_pyR5aX*j(kKU7!g`=dyd?&7tz|kk~pl2lfxwKqWFJzW=6V%QNivEV3 znN=+l`Sh&x1&VuVr?;|Dl1Ch`m|mA7?(n5&5NDql+p}1c7{B3{NXS~bX3E(_mB?)t z`inGVU=;qD==w?4-DW;vB9gB)44&mk>gE(E=tmM6wPZ5)1O0W9Yv@zE)@-YsZO)ea zfZ@Hs55YrjgGKPxsS=er4H4KL`x3U(;9tU#ni21J)xj{-#`sJ1(U%WT=sk1lZ0U6a zbUxRKLKs9xew+3e0&MxPHvG4Z3qljA^L27c47nP(>4}q2oyk!~&}OR72zuS9b2AEY zuMk|U$(7hg`}xL<20gFh4-13W>;&ZLbpwa^`F$*bJiCDkbr10XM$`K$q!Ff3)NHz1Ls(bMvqq6#mD{QLYS#A~<#N^wh_4A?@EH7Jlsnf?ZpFDd0 zjWCgNXCCY3cHDH40qg5N|MXBrfA783p8aiqIK7&G7gRUG2=zng&JeixokeWu6nMNq ztvvz1iT~Y0961s&vlTGL=M(VQj$bBseX;mzXA~Aqdf^xAe>1`()2dxc7hg6Y)k@9n z6@M9{_7NRp@gGVkIGtk??xFE@`pAvc8rB>=&VA!Ye`C1sN#fCXH(j(DNwP3$K;Q5_ z+?$1xHnQmtf;dqWS>$~4 z{O5@CXU@$U6dbD{AZt=>;*qs zZxDmv9x0}f6hDyO+*n5U)oZ5;q#^i?T{?9~4gDr5472T21ti8c4R`&VXL~SH@IK}u zz5las8SAs}=w%EQaSAo0d@Sqa@A~0P?GW9~1Y%7s9%c*sEe-?k1grpF96IVmx zGzBgSo{L|&Ym>}xT| zn2DBz?3Afg0@~=WaTUeN3A8()=>XeVUCGz(9Q^K}3>qS#oYNgUJ@3blUXdC{84)$z z$%TjgVfhlceYo~Qz!k@kWnpd8=SpQ2(-JTa?g9uCn#FImY5E5|_IC_@$@Lv&2u9ep z^89o9HM#G5ykab5rpp4jQ$k%I3*kj^i8^xf=TJWFSFPyLQQC-tpW`HZx=tjLvtLyz;J zu8)$j4D+tw!dAUf(VUnqp<^v=JU5%NSKlyv}K11LG4{6Kq2#GGvDaF?7^B;EtbPls~K6EY_j0@Uo zYum1x$%8h4L~kU}d}x|ylGNKSofUJd1uD!WZ9>ak>`lgDm9vK~M^9I}03e#BxH4i3 z1&%94zh;FvR5FIm6GM-zl$Ld)jJ9RlV*#Z}7Z{Irm{Z>|>vpbLUNhnzjqjm92~aG! zM_F!lKQ5+_DC-5h;B-ma8XuiO z(`p7MsNSw@B!=p?&_?=nB4uE9`ym-hL2|Sxs@_Fn3XdUsglGBcdW;BsF_cq=>w*rf z&j-qm+-7lN=R*0&{g!Sw< zI)8r1XQAgb&)(lZZ~qtP+=pzeC|B97=?)zMOPS}*N-1r-evu^xFF1XB*Yt$wJ)8IH z?b(81X`6vlz?_*Mn&E)Ig)epwSWiIW2K&h(0aB$y6LG64^o?(;AL{Wd!CiWUo5=@f zh8mim{@-Qq0X{+9$6n?+!QLZ?-LhzEFzMz5m4Tf35)gE3YhjO%n;D>%x+7M0ri5NX z&3fB{#A5fv9#pVzalNmf{UB^6P4Qrp?;cSe*)}u~b|=ZhC8|$4kY>35mi+em|9-0Q1bhPnBX%h82lRTf3RqysS7Q@MJ7CdM4mXT4V8J;*Qn!hH{sKeGPNf-lU#8bBazFh2rj z58`s^E@uzffBsOClOv3XzMnCa--59iibfbX*=YgXAN3hH%|GeBNhnok>Tv5E4A!Y| z{pHX5GD@8o)s^IpspzTU!(So(cSKA_C?|cF1<62$R-`F-gMy->o4EZW&(1!^e>}FB z4cZbMq=~<#Pa8*Yr)J!4D9Y`sG>OH2q`pnm16|o(cW;kP!5fry9_f&$VdQX)OTpmc{wry^ZSN(>_s(nv^mcZak=Hw-z%NaxVZ zFu*Y9#b12;+k2mL_I0jvuIupM%fLHNtYl>TSS??|RzcoeomX;nhlaqIhk#uXX{vjjB=aCe&VlP*ntY9c=mB8=D|UtSedf zcjRjxM#~M^H0mtJA+)d!ni%DVUAMRbn*f>%tSSQ4=RmzGgAx;g^9V`h>@yHGb4XMK2| z=J$=`Yb3HNZ>WN369^9UAch25(l4M4TND{5_+}$O6hNz#J(`omC3{a!zJ{e^@Ru*O zKXC#9-@2Qkt>4lD0!9UsEej1>1DYjZrX$1YE7}^tLHXM}8bU&k!H(96UDZS#_yv45 z6&hWDy*4M!Jmf1j2+%)_f4kG;dLnpsYnkA_hLD!d%)b~QEdR*>(dSd5_FG%1tk|QG z$~%EpHz)ewmS6#=v$#k67PBCAdBZd{-!x?zAvIM}=49%;^_l-f6`I{=XI|iyWXY^G zRa07og+LCP>%Os()h@SfxWg-pQe^hp&a3UV>0L@o1J`W9-*oX(+NrRV@Hd1O$o}u0 zADSj|CkNcH9-k;U6HF60SG((POjWZ3~n4#)&v4b!C&1y0spa;IKYbMH%+ zjSRgOO-iPg=T1eaW-B*PAajq{VOedDyfs7rGjOs%C3^+t5*|_x7gFh#HlW!~xdoNw z!G5odFO+2s3zmV*KjTJ>5X2`tf^5F6#jin0$ng9|`4eZ{x&mqSV+{%RHG@E&(t6;s%GeCX7! z>ws$W=p7Aem`-0lr}8T<6T#@_1%(JIzPD{n3&<9-xQW&4Ur^y)fsuU#vK6q-9me7b zfDj=x@Gr1MotJfmNEW_E z4SsOpx-KqWA9XL%MHaujW>@1MG$I03QY8`TREjLLfX{5at-5mcP2Kag+&kFZ-x7gn08uuhK6H|knpie<#U7LF3}bop|4BW|T6R$xM*sY=jEjh4{T z=4>2@=bBlskQNhZno^2{^CkjUU~BgS=RO5XI$aw?@w}?Jn5&6$z+z}H4-eMf<>71x zZHQJIpHj0LT^@wvy7bx1vk0MlF7G>9EmGv3Y4%t3Wz%i>L$8|)k&kj{$JPYh+A2+T zoTh${Jc*zOZHw=glq;u|H*&;w2iJcab?u}*EQWhGz0CQRlLZP27nfOXl;Cde88xfm zPB7}vB7vg%ND0Lj;${sJU_0xoXNp;uJ1&XVhV`IuBC9ze$~wrWkrS4#{QR^qyN|wO zZ^AhkhOOEw_H^AT)<1|Riomk@$?N9_1*PA1BGx-Ok}efJ+YaBdv=6+ zn24)bf02F5_j-2jG+`OqA`08SY2vl8N5pTnsbS)g4c>}l?Y>4HCOYW9tb=F`d)};; zqg(*JY{us?(fl#+j;OUZ=+l)S-o%96FmoNEOMIm%$4-r+voPFEX zEE!EI)x+=MHU<|JyD3tyJ5My4Pu?GHkd42UU}AC>m5#7lC2ZGj8w|XsFPG9TN?3@GUq%KtK7O6bo#tIXR zOqn)-D8s&y8XGxtRF-mZkGZF4Uy{j>zNR)Ykw|Iq4=s|1@w}$x8fcNN81~6U7SJCB zdqumXm*J6=DaV!ZXovYI;jxrsv8=1ZCCrUli7w+=Jv{G$ZQgvRPiv$aS&PYG8tbE%#q zS(PcFp>^IAS0BVNlA{uBJVgsed=lb4Jm?hf#wPM%`sfRin}nr)byS7A>-~t!dm02k zcy+$sLuaex_s*w(<)^snb8I2TxFKy$7)XI!x@fsu^x;QnrySm}`DU@n2G&FMo)?D+(DXyQ!MtO^<9XcH zod*}V$bC2XN2v?+l0lWz9Zkw9QS2{Q{HR8bzJNbNkom4ty*>F4_#dMCBl;ip>>fK5 zXm?Q#<#8$qI39eCzsuBB6uvn7Q`yZu|3k2Z3A36Ujj7Qv;&iuVw019CaLh(Uy7ql) zr~EAIh^GgO^J@F-OQsNwwip;!Be|Rh$M z&WzNbINo>a-Uvag6Z1-FZkSQUu3KxLkId{FZ>N;FN4B%NxLLaKDn5rv#o@0@DSl^e zOP{Jr(t>m)HN}i3y1g+y2j(yJ^gs^6a31M^zPDrAZ6hCiZs#X`#YIBeQZ8rCXB`Vh zz0^0aP7Rb2du9_FR+R;|T%vIEx6j$u`BsBw2{z(+4_@k%6ZL?TH|GCodo~d?L~L^@ zMB(tT?YkT02y>dPA6WsJ$k0;G(c|xG@=OUOuR=UEbrv5FzjEg~MAhKOEeHc!2OP>8jb>n^pq^+D3| zU0dJw<=a}?TeeIbL2#5qlvk*0=kjLG3=y(>0VL7jd)LBYfKsyREMgW!7uAu8x1KY= z<_lJ(A0M7yC=qcQAuLIax8Z>-#;-W2T6(!>QCq=M80^YcnuUVoB7NA+2(CiJv*i;$9D;J zyv=QiPI*&=7};LISebG}y#0=5Tnr$RGz;t1hp2l0WUv(n)0E=*XW>IlmW8DJY51_e zXQ(z{F!^&i>u(6L7qNC$gW2HmtpffIH8-TDVp&cVox>F)4E^et;)WXv#2G5p#hD-> z$n(;4nqJf-?8%bvK#$M2DIg?HVIbc$pbx9e%whmJIBvnHv_Cvr41#gA48 zmc;oHWrlsJxdBh*xkU<96{X*1`_(-+9*VikMsbf)#MGFdbkhG!ajy!Ia#uHe)tDc*Z%VUg)_0~F4*Qw0Aa&hht;WiV`}MvO z)ij|ZSJiR5sRiaS5L$CdPkxh=CozPWVydEOj6zkNF8b$m_H4Z9-{p+;sr)=P9s7q} zBFfP3(N-Mqczms-=(+uz2nE_)Zmqw>TS8rPjTwGVI=5paIAiwG>XJ5Gb@6oR%(T>3 zx*mm+MVj@kuQGQ>;S*-F0Vg}rXBP9!MU&ffg9UsO8GCiO!FfFR@X3FK*mPfmrotz@ zl@JfIxysL7x|1|$L7*3V+;LTCAm~AbWC+yc=GQmg@en$4{`BLf*GWq0T=m1@o$k)+ z!;hv#E<~@yOjRqd3*Zyf5sH+sQR|htPNYRiNOp?f;v#wwZj;JN-kD>Q4C<3N*0Trk z?k0ZvVI#te3O=i(X^cW-4zL_fhgoUcJdHPYO%ncCmJo1<<<4CShL#qu*z?&a{Rn8_ z=jg^H`vzJx{+$KVvcKzDjEZ+J-*R=mJWAkDNh`%5>L9yx{0adZ5B-QFtmtrVSHiLva z6T`tR-j_%t{w!np^L!GD14M^nJ67*#@SEw~W|y;)TD_7{-ev+~!(4vY@V7%vt7}SBJ-VToDO=k@?a+9Yv zlnTc;z><~>N&O5yK(d1dz1Fy@w2Tu7U-JC0g&X4U6|2dwwhPsNLCv7zK2Ndk-B#)h z4m7umZXY3gt6k4?R%5u%H0Xae+P0Z^Wn08X39EOlfRBKxH{uXk8x`gK*u1W?Uv)S5 z#+}U5aSaJlW2h&!_urV?5wh3px15#@AS~Lx8~0kox`O2Psmb7PqV?{&Ar1Gr7hyw( zMhj$b7xq^B)d=67(1dpSK{UnQBX+qM*Cyq8yf`m<28Clsc#K`!8o80PR>uJ%!^T3& zU+L(jP^2=4h=^hS3AZ9XX85H-waZ|D``~M|Dr2#0JSi^K$wh1NJR;a-=sBVQv_sY`&~Ndr(nNj&JiP)2aA`vuA=8w6sF6fVx&Zd2 zb$b$4Ozc9TA;03AOAxK>{tLjFIk>KXyr8UOJy z_rXV4?l=bq4DH+3GEF@Q79=#ag}%~q^gE$x4Oy+LA_T3Ls&7>|=vDJ%_+yc0b?xIl zzf{81UdI<`d5!bvL@YH$l}DVl`ta#g`Z(uBG|y8ocNi>T3Jf{nsn*R&-l=*~^`o_u ziCkQ53v%2;rm(OH^nNE84{w7%UUMb+o*+s)+QLjwW;fJ~(ugt}m20vBCo91m(t8a~ zUWD;^eQ<4-7RZ40w^zQ6Ec#9r?T(B+!Pk;p8X>*Gc0Hj}?gy9Ficc07?$=khnk4A$ zZWHhz*N1mdiXk78Pl0wkI;vcil%@&IC%P=iyiZCtg$gbo@ncus_*vH!De7;3PUvOG)hNyHODdQy%u za%`iSmA*8trs52=Q1HV0vI>YsZjcwt?)FFvI6_f_m^p^-^(0D*pX!H{lG{a}>v5vu zIKJj4$E(23NCr+jdl2fQI}qm2+jSwh*s;EPC!=OCRURE^Cz3%=Y1ikOLFHOr)E^Cv z97{EazWrK}1f5E4xNr%u5XQH>wq6~50I*GB%P*pHVM0+T{Zu&pmpOc9nT|Z!P0J@%#(@bDq>_sh=x~tAZ>Vtq|6zkl74w z;=IL0NIsmZF)WXFJ9swWs7Q0Krf5|Bd7kIS54oQe*KM*awkl!nNl^;P%Sd*z>+Q5& zcEZ%><7h*^4ir%rXY+B%g;tC^HV`|6t1UU-RMryK7WPuo0Qs6=0$C4OEUO)Ea62D4 z^>sgEYDD1)M(%2>dr~`5EPZP7GY%}U#lx!%1(02FGwPR?_*)kTDTG~?ZTVEP`+>nH zg^(qR8PYXc1@Nyo7-#pDEmFuI~ zt??uE_>oWRjL%GGZ0PA7$-{e_L+*Eh8%a*EQtP5<7lf}n#;1Mxcu-td%aXUN4&N!T zXF^?bM`(Oziezx3bRSwT3skIBCzR6oG1;!@Jsw{AZeLr!bPMPNbL*RJ^mcgD<~^Oz z(ilzIb-qSknd@n6%V4JaM#3U@-h#ZD!Q%FOlY^M>K3!RAXL=7Vx&45v^c;tjSJ&Pg zt`H5UI?9w6-I#x~l@f;X-7}yKnN#!mA=btCKHQu$kn@2Q290v#a+W@Idj)AZOi~L7 zNNB6AU?-#X4tftO9Fk@iI^3Q*Z(eq{C^r@o7GMNhpHEM@!i##L)&`$CcuarnJvKDC zf7amLil;`S>3Z4g#Fvc)vhM5x^lwl9>d&EeG5_sgq-uDZ^vDgM3m1PXTh8gebI)1L z;}#Nc$6k&7)nt}!>QMEgVC@33??H2}aIlU%`L5aZ>#E{j67ibx2k{;}+BP3O-9QZ* zU)~~#;J;Ria#iwg>{_w_g@2;5%^ihtk2eptx<;aVxXI`1^*9}!tUSBRXfs4`*P1=rB+opzt~^M@V}nmkeY@@h2<^Yszyz0-zT#Uuz-61}j_6GJy9XXAH} z6m6sI0~{+BRDrf5cb_YhH&QTX9o*Aq77I-5LB4N%TCz+;^g33U z)j0z1feQ`IEAbW?tulX1@F1L|@!Ff+A8FGa--V~9yJ!!zEDpfH7dH7|2@t6*L@nUzLPYGl?Dl6Ey z1||G)Js&%3)2t<9IanL`M?na*j^kr^wYC+LuE&z4X=u+xcMs&J&9$aB5zt%=Xv&Nrs4gk0Xxjx46J>c$CVL4@Fz#VYO?De$|!?RnQgRO;o| z)A1AbehGR<9_-=+-$(8E!cBojLAsr-%u`#M!VODCQ zJCJzp6=fky8M$!KOj>!An+d=jr}eN?O*=xz@cPVcwxcDpLr|j*L3(>4xi>&kpps=C zSJo$6Uc_%MsZ~&qeNF8^YS|&9PrHREONh^}F}B}+o9x(XaLNmzN>O^_%$VL*%Zo#< z^F2%;^ei3tooZ!=kn=mFitd?ukMB@`94no-hclYz^Y$!9IBiE8f6FXq=H8LIKDJQM zpMIWWO*7Q*;Es62(E$A3ZBafpS6Jm;wp|_6CRF?nZ990~+=7bM>l@P$w@b z6U2hAr?i&)5x`sSub9_U7J@7a&&$P6f zn|h1l_uKi8hdmC9e24L)raNl!v4#A5(`f?Vnbq{92Drbp4^vt$B}Zu(!^i4%Z!_Aa zOd6?F;qQ<>b!m%>d68@0(E{!=4eeuRcpei^Qo^Mr%#?7@H)T>jnEM;`Eeh4SXPc3t z`-Z>u!ME~Q)a=ochh{gyNy6&Wbb-@TWj%eNho94M4X4%nS$_Rvvzb z5&i(Nuq^#ZmI~<%<&aQ0FefRA2<1L~bQ9046~L&Uo<^k&7TWgu7*>Km^%zT^!V(jG zS~o}L3}^(unb{nD^A1jxG_KzQXt(e3kTjOaoS17@@&HjELzx2I*9--B=UQ(C0DL*(T|ebr-N zs^`gsp^I14+c#@mwAAzy_0uxuC$Rz&Q~K~XSBfcM%RB|{UJmeY+l{L5#&~>J<1ZU% zodf`G;be)Y{mwNnTwuJTqi2sM4llx*dI|+yjOlCS5__%f|3-|q_O8M%dXb>3W%;BE z*!RZQXx6D!h3jD>@ubv64*3Ub7Oj#)zXmu381erEb2>ltRi7DBeN7`Kqs4XW8%g=! zFjWGJ0XRzsl0sHjkgsSQExT7lNL?~vo$IT!w~fz5Vn{B)B=csOJFT1~g8kbDEf7aa zrfkx=JfaEr?ZrKwItp%69B;m2M6cw!Ti#=wnBBGUEP_s4ia=f~u#htTHh1w?By)qU-#shTO@R5H;Vw93b3^Hfdc-rFGcc!Ratct+TA3wOf zN~!D>#?Oi1;2AWy`L|t%9!ETb^Nnt?a6lDpp3ML&Tw#hLse>pMtO3Q#h0(`K@D(FM&EbZB%K7HAN z-7&ehGH#L)QRDFLcUlIY446wn?N`o-wsv~-2T+F_Wx0V?g@s$MFh?0ef2rY}ft<-L zq*IqVQ9D0A&Av`g4wc(f`z-Sz#x>BTZPHzgi4u0=Ofs@MNPUKM<34hAMQY@8%T&AA4?PX=|+`b?Pn=!&=t{sJ-~rG8j& zsRh}*n=0B}*Bkm5>AE5F=f`Q~t1#Bw7ohXF2Vy`ZQJLFZoskVdw56U50&MS$f4E4? zcCv21awt`kuQ4C54Ji0kGW>NuFG3^@AQk96IuVr%7!tBEdhE2bye=Er2Veb51CL4? zDXh<|iPjK2bX4u{fsBQB(Lk5Y*-RG2>-!6RWYs;Z9B&^Mabd)r0Op>n=+wH43e~Zo zb2R7L${A*TJE`d5;hD~vC0y3g`~WSO>wptZx}utJwpo+q1jDdEHa>iJW=bV(WU6KnmAg1PNGLu8wF*;{RHq0mn%%f{+CXRV28L}bQ`;KnjM8h zq2p~CYWbq*iqb6TlrYEQ#q&rB@n}PLe{+OcfW5t3hb*`wqIWbr@|zlv@rH*t$qr$1 zp4aSAI=*u|(yUsDPwJ!W+60`QO!bvfhYZhhc&@wjySSvlk&YW~eF4GxS4_rI?|`lV z%TL0}uL!!xAN8JWakIopDSXJ2nL2sU{AG+dwA#kDT45mJf_g@JFlnYI*d};-@J?7y z$brv{V9i-zqV()nrjx(*&CW>|oie-H5OU@T7Eq$&^>U7(USr^%6@g+yg5$z{b;j+jtp3wflD@+jz2NsuJ#pP{tNzD}@pnuDBn4 zl)&fbRy7i+j*RY7kCN_hR2bOt+W@XMCYdGx^yMN+wjqk5ol;NO-I{ijP*{hu#1>mHcN znI%5-gY&9tht6GCupMO+hv6MLtG(0<2#EMe5w3ZMDS_iQ7f_d2bi^EiRGRD+WOg;k ztT$ar&K?j4djO1cSp%i3CH500Qe_V6P>O4qSMiT6D4bC2(-KV16GV>4gkm^23%|kl zKqX=))Q&pi3F#u)wnf<=P$L_+7Gjdf;86BuTRN{Z5!fa_!(s;7>iNy0Z=_!BiTf|ES3sVzPLJ>2q3_l)O(XV&w(}f8;VYm_L zozK6Je6F(@jG{0U!J%T@o#DSU>mDZ_UPC%vrEFIPy5um%jAU!&XXSGj+B`%J#xydH zPE|QEh|{cUJyCLqGh3Ew4fdJo@3?C6k}0!-3TBn;BS?#OcDW9Zn|uBDw|kpuJty>e zVWZp_>xas;Wk6r2w10GMy8Be(ac_iV@~wVi8Aq#s^zQKQJ5Vi|sFvr~qm}F^YH`jy2Lez$zXx4v>D8vZ1X5f!jRFs%||I*HGO^Lfb zAWM0~6E>T2>LqO`qTbrF@Vt7dew)-KA;eOo-Q~#Z3#$*~RfDb4TXXo=Mx-r6+?`%8 zS?*D_s@I(IjUEkGe@tOH3+NmX56kY_MJcRWQo5gzPaa>VtRQeFi#R|n>8m-Z5Vn@x zuio(1C43RW>P&yGXlNaxIVx-@!@a;`c&=9cwZ)|d@F!7hDHiEp$#Qq9Ktl)Z^= zK&I;QM2)`xtem<#MW@l;Px_8eLW-WeRV{d;l9pUm`Nvf1Krr1LwMdY#RnzB7F?A=J z(V-iutP9Y~bt5^j+O+-00Nnf^h&^Y>xApbND&*+peLaS?%k%6?68`E_SIwd6-qT|OTD?H$tACnX{<-w-RD5Cz6Ks84_abIBlXLl2lwt z9^~Arq%j(5K20R%8gGLH$ji0Z;T?N$RMXFcMJ`g z(SQVeBKBba07%tSUHwN6WK4mbO0lxaRBv-#4h2S!Cd1xX>7CxzrE%yfn2+4Rj1d;4 zJoH4BE1NOGzcY~LORnI_gBR;7e?Ja$$4&%a+F%5e7 zsvgJg)w~~L4wTwRPqfMKfVpSmerEG8BMICDo4zlaWP1em)CA}xnUQmuFr67s6O_VK8sM3htriuJ!iPe)dRm zV02RZ_cV(+ki)laK((UA#Q&yAbs2Zzsa9%$i^OWS73Ph74Y1{J!1y#8$TgF+*5 z;3M*EzJuqadqjkSjFBktZzj|%%an=R%`(BM@s{z|>w^Qs6#XBt$$^O^nr;U%6nix0 z(deyyE<88z5$VfqpvA+~5bnN6+N7ON_|We(T;N7Y)plIvSiQ1RKUq#jd(=kKx=5?{ zIKtySrrZG4>(I6SxKS55+m(&+?iR&X6t;Kv+Y#uE)0z1_&6f+dYw!CdILz;aa*cRu zi0Jg(Nf7*cr82qZR6DM8FcTdw?rY$hC1de4q=PMf@yu6wIA;Y%Zr7fS$@tABlYuSw zI@n^Pd`3^mYE4+z{)Ue=K8_5xu#>vzfP)=nbxer=A6wwA`K{QdjV z>p;FN35S~S6F&oJgu(`JDov7Eypm<#WAR4qShH(XR^rpdeouiIP)8_ndUG}Y^9pZ#y>cN0Ky!Kn+L6i(``VUqxo4m#Jv1Fg;$2BXNVF@``^5*ORh}unpfKh!lN;NTmiOEc^ zf4^E+-{TNTKJTU%v45unfv#i_g3?GaHSEka63MiuvU#CZvthg>5mh~9N0^}lC<`3I z|IaspujXf%I@GRw{6{Xk0usAH$?eR4xu=&ONl~kJ6Y3~AYIWu$tpH5ZJ4E(a!Y9q) z;(WI|q~0!i`|J}Ek8uCH)Wuu|8@m6E4vZhe2XJki!zbDeT=d( z%ta>RJXpwy84i}J{U*B+&ian{IW1#k8M3~e(F^o`H!lH$XgCD7b?ICpCGFYZ5P0ik zz2xGt&_8TUGh}S83D9_q?JXTLkY}otIF0irG6lvJd4dpf*&{W+hyAq>V_mF0o<;MbDJ{z^-uc2ntn-vzT;G-MFBi@YJ6Bn6l9*;H5DW7Y(d!K1m%v2SaU z{7vGRTNX3CWk_AuvkO7D!tP&z(ENg}ZvElu*%ARN4(SJs-ygp`Bgk$wHCr4XgYv)S z2(GYa1?}fAX#TR&l7V`Ojs6C9NoQ0!g$N`n6lx>JUg-Nr8`WJBD3}9_w1I`}xpO%; zhu%nAr3V(Z`wbSM1QgW$Sn57LM1U1(_AnX80|!%^?@(IQ2o!Ns4wyS(y@?O&(qy;n zQFJ+1vC(+uv57i2&1!Jkx8ZNk=5;uuMEb62pZV3bhd+o;NoNaN?9CWUqiK^fpRu?+ zzh!LQmgsSYc#IR8Z(7_dx->XNHee<{P?tl#Y{_$LUR<<~VC5#cC|mp+nW9) zHBOB^CL3^x2DX?5Hvw;9f~V$MXg1IS_fR0#e64fNCFIc>3Wn9 zyioDz5ariXmY*QBm+woK1V!WW&TR=c-*+xYqWGq~mYO%28fHZ@J?vif0S%ZxEmvMT zu>u2@z1<&z+OVMts}aB~>u&Co506ZWr57ad4jy=_8(go^WfG2GvpOE_Wj+q%ZI{~{ zHhp^8cIxE1^s{?&ftkK~4h!V$d7ESrW%H-wbc^q+YqYwl5(W|@G9928T51~dS;pdw zOMfMEj@Ng1;&%s)Wjtsp4a8}K=WM+!k9fA({V++2UiRC|uDED)k;-Lb_i>j8OxCgC z!;7eRehv!&1;|u*1=KbvTlkfy`oud@JB-y*gSCwyUm|zT@$0~AX<->-?9h=rQsBr3 zzYedf?m}b04Y(FB6%PE(n-RkO%{>pIX;hDDj%sl(rg?+2mwsYsCs@xuVsyX9<511_ zAZKdhXUcs|R9jC4}S<}1j-j~OW|>Dj<~UOi$5?l7SJF^_^mlEb1Z;(C ztZozLia;WAx+-vb&qa*f2b98$Mi-hwZqyK7t>>S=>fPJ#QHZGOec#Ix0f7sV2>Z*Y z4v#R`XhjP^Wt~w4g}&>;)<^XPHs?LduIp0^ESSUNi!ZJh{pus@4Um+2hjJJs!lQIG zD6~VChg^vt+M9>9e!Zw}rEzq}Y37`!YKsF#z%+&X`m&9d)nLonl3^fp=7JoA*@wQN zN0>X977(ZzRhi74HN=?nlzs0(^4#+=GLZw;F7HKaIf)}d-EmnsPz|v-g!<*}QY-B<1YJUGaqSauK$bEzH3ffpku_q~3X3NdPp(xyjjOBhb@BjK?vpP&$6e_a z)O{N!Gbe47|i|6x`K9v24^-$ul<{?ID;1}_Z%`K02*cp3r}>| zoaqPw%t@oZ)ybJ_G4mh?&Vow3#29wZWI5b4e~PnqLw5KGT@5oU1FjU8`FIB}yP zf~!B=tZ^aOAhOJ0b$)0S2}=mjYdi6UBQ9vC&;_nGhx%uS>rQX8n*FI^x-QWv=bcFp zH-6kO6e-(R9d^b@STQQhT>4%E_G)AgFmy(*l@UyS=`qfgO!tj+T&PS4a>9sF-i?Am z)Gx_tadN!{z82lMn@9;}I$qwsAzXd4X?}x$$qR^_uG%Gglg$Pjyc!pQdNN&ibR3q^ zrUXk+mUCXM|3)VU3F(X=ZREyId#1bX-8f7{f!DT5YCXuqGP$E(L8dbH_n=BAI``Z1 zZ#A*h?Fx@@|85uw%0hCzmdpa^jg4{jJrr)24D?z#V)t4sAT!&bR_}KObCU4H?Cp47 zs&+kbXyPuJ&Af{Yq?5}EbCJ&bFxMX1jt96V8y=Hiyj0&og6DvKQ$FA5oG!wAa>a0? zDaX@DTaIj$!FLq=yYL3`HzG^5d3clyS0M_{l3b@*dYUHo{$YXOz`DuExlt&SN8;sD z3L-AYoo4sc=@{Nx+R7k>mKhkSkeBS1{XYy}z3<5&T#W|JAl{qIkAhx+W-jpO~+-|;;Z88vi^wT?Mo)P0`}3$EleG^@L`K9qF?V}B-{G3bHY z*ST(T%p!QNjNY@f+-F=jyS&UG!A2RPpw@HABR=nq`WSUAPuuyOdGDk9o1KXCJOZc7 zJ=dk2>Vy_>-q9D_XV{j?N~A@57J{}d!;!ivaM$Pb3qZm=|=h);ehV@jvJ$VbFKF~fCxJhs0jLWz+ zW{|5s>=WVm#`L?z9@Uw-!itHg;(a31C%^y~{)GMaZr~^CS_MEc0yg^?f8!ZtZF*K|&+>-6r|^5<7LLzH(@UD`$kysz@46 zTVbX8YvYGVYL9s)$RKSUcj#QFN7P8`VIV)0Cf_?Mm6yumR==|CeAtORC8GP4wFZ8xjIb?bFC$ zaej^uAjvP7) zLsPlsJxl#VG|c@2kI4%|iI^>uarCU$P+8%2d*<(T+yr^!K%MaBkF=$HD`p2893^dU zmb@j>WC! zmk9-k1Mv227$8Vv7XzHGfBbl@Nps}3cZ=F{*QDY@jXrEqfR5@kJ=KbOS}$)Q5zbm4 zY^A_~*LX9_0H%_PE$=r#h1e3B_i?66hVhe7qohe(HWuwrH3on2+ru})_X5R*v(1-G zM2y!j9+~E{t6i3`zJ_@1p?zll_Z42RqI;pS$IA7J2N!Qph8SBNNzOC-v}rM)QoHb# zQ{dCL8wVtSetNNDz)*Mt@6+}FA3T-bKS{p*8H9)TgyjA;JnTI=XKs>lAnDid<846U zF#PAINhJ-_f5IAT$M@uR&L>Hk>~tR_4Qa_dq&&U?DFoVO1!ff4@bDmnfGeMg@aw75 z<9rGEH?+}gjig~t)`YS#4pXt&4sO#b2f~V6y!6?VfW%h7S_Vu6z^Hkv8Zt+$lsRe2 zOa_{I*qFc;l5RCdlAY=o`2Lm99{knU>*cOT5?nKzYWkCk}S&1Rwn(E#Et7-rg zGfa@xSwHpi&+XAJF}>iSCMNV#q7gB$`tb^3c7}v>tsD7hZ`63B5F-#4-QBUtRy7Qv z#wi>}5igiBgMOZO9^|BcvGSEWo->ybuHppV`t0-{TI?jtgk0Z_slhD*f7Ra>{_EQm zoT))n&2{RH;4e-RDB}0$=?jP3A#>F(>pUb_=j4rf;Sja<7Xn>O4MXc<-MDCL^dK{b@qlP^#I6wLOEU?dC}!osqYs7mZk%jLml9zvE=397XTD z)gSCN)3d|NWy@W}3;acacisQTyJX5c4IVUp_RxQ~(5L+@S9Z7YhD-__j5lwd0rZ|= z^rIHt7ReQ!lm79ObuHsVjjzAX+EU_r($*krr=94K-E}N5u)6^C^3P2u3pL`?{j;JA zXY%+ES@?l|bj?9#RVh#slZE4oO(^_!mknH<3&_hKq8l1hZcUQOz zgD_=GZp?xbm|?H~d*p(JyuK+r$Rpr1PWI3-n;Et>-02a#yXc~3stLVO z8F>Y29gC4PQuaR_f4FJ;zp#o2NB`GY1(^A4N5b~PCT-XAwE37_g0xY1<6;q-2|tyL z^?3%xiX#z++@SZ7_!-?xI|37XzMtj5Xg6+WZpw<0-U^kGG=hbEvQGohOqj- zNo@a;Bi=&Og3Yc5o8LDoMp;|g2LwU5L*9)Lf{a|TOB8n#%kfNv`bNW^QJyTLk2jNZ zMU|Y-XE~a^-usdy#`*R;G}lPa2|(Cs*s&RE_}Kr~o5dl*7DC*``*awc|%#%t}t zsLqE-(muRWr@yC3?FAVHkUsZRN>8m;UcFy0HLsVxUFl24$DsO!1Mya$-ZKp+b=lq6 zcx&R2x#5kRSosYiQ{RY%jP}8w(Kfn!vn+-PaPWP-ou81|hFuvFj z^x9vOj%($8o+GvYJ8>6ua--HZX`p&kf;2*oytq->ZK^}h$YY#?+ zH$zD*rxxNX>upDfXL}G(x42w zS|)n}c<2r%!q#WikEm9UQY3TX#=J03pd2x|r&VrzTCElxe%Ty)KZLGLmFfww+i4$7 zarb_l0d0~18{#I5X0#t=BaX%?`=cezx`V!6W}|6FK7k}oo0{4;RZa-{O(^{0Q)KFS z&g1t+7av2nJbe9yoV=6kqr}xbe37cjRkB9IGCce^Mq1n<`7y=;k?)YQ?P|JAn@ql$ zk}&`HV)L%8?*X?rlzEcPOy?zF!T)8+e$h_;RYvxf!AfZM%xrat(Qo1=aY(uWtj5nz z;b2zGtD{ydMy5PK79EI=cP(rCiTfz?7oJFN#k>3D@6E#g1nL9)|0R7($kGAZ=d-G; z_5>XAL`a~vASVJ>ku!J+>)z>y3gZ-JjzhAZ6T@%eS^EoJ15|fyXpv>6Y`Gp9r|x-< zAYd;1Qf&LRjFEb;nZ zaKrWKf5QzKRzy__M+w8D!%@(Td*Z&I?$JZP4Q<~S+K{I?f2y4p?)$vX>pYL+IFIXIm1W7qQkT1nhYD@Kt!sHYj$Mnh|9UHC zhcmZ$B5r%7{k6$+Ced}ulGum!qch4AjoL|*8B@4qRfQ9)z( zAY$p7q|}!3!n=EioVRD?-c~od{-=-<4;slhJrw)Yw(`q7uRy+P>*RO21KZe{;iqhq z9bu;&?6)v7Ti+j?k=r>^xxC0Wsoh$8nLa6H#e^2$|D5ja9KYQ2h}z?KqBdyPP1otH z-}zqPner3#nH_sT-z8)qAhj^+x>l@Wo+O)AO8a=RaLZ3YoNnOU%3%+lZ8~a19({bf zd^JUs%^O)95wkV7=;XX`zw(UtXF^B&{f5aZo}J)uzY$dJ<*8z;*R>hB_1Q$*FrOB*&{l;z$r{{Gp{(KZ=SZe#SLCqw!&Ty25 zj6cR|V8b6Z{wEH!)Km z#V6nNeJ!x~O)vY6%fCdyo@;xb?RTGW%Qe52xjkhojSr5ez0?8TST6DUy6j5e;P_SM z(vOR5gv}E^lihT0e}wOx&)XVP{)Ev99$7BB4to8P%fk`!cG~~Ip}KX3QduWw&lSHh z^W}Eijkd?0E~=zD*z}3^?JAMqd8S3~1)HDOGtP>&>aO63Cga)lC#_uDv})O+QPR)0 z?)$pwKCB%)=O(+!y%oDHbK;H-P%S=VtQS$(XQSh{^Hh7w+jrZlf{ci1=70CkkvnoP zov4yhzef{N_|4iEP#JY*$x4z5HOAM@$I4oD^ zoRFMCGGW>Fdr_&{%Gtr^rJJ92$Xk+HZ;rJ4W)*+1;T!FbdG&E+u&JjajM%#&<4G)? z=@|5~8>zN`=|z8~tC~vrPF;o&?dT_-$#A+!j5yaPna&iR`Z|?d&(h0PHM`}Gxkv0b9Ihj+%d%tgKinKS*2XY zmzC5X7)k)|E8{zj_ZU&b`z0K-gnvk3JI6-Oh6wX6o|`x~M2>VzOev1iJi|C2aUetP z)?d9RxC_`Fy{;Tar#-AasD={R%Qrxce!YBheie8_n4Z%H&?4;4QjBHj_m?%>3N};- zA-yt(?SHNMA9b*qztNa*y==O)K~B|LdzQmTrc@r1(vy>CT!cVdUC z7WcvE-SvPF^g=Hvso`?ZnFb#1XMn#Q?Po+k>7T2J$P40*bRdfL)xC;G`{8gYa-x@d z1&tr-l16_~uP~(ZLbm_)kzRR3u1J{r!=<-D=ji6i_QPkdAvclhhy!AQm>{Q-Gw|Qh ze)RJvdf^5C^JVBC$NIWqJb0|{G#q(2+K--l;3gdFBZHS5>mw)qE=&3sn8_gs*|9zg z_#7EG0shaE^sj&Y?)A6-M?ZspJ$$=;q~Gb`_Y=Kj+vw+H{K-kb$hL#k)s*RI4${CU z=`N_?t|ACCT;HxA)adOAWw@5XAG@p+E-N6&n+V#?>*%HJaZu57LXdqQ(O+Z@_8B)2 zWT)T)PC?V%czS>;^2yRx!<;SyZ3u5L`yo^6RR6Qq583IssqcQkDZGF5{^qVzxaJ|G zNQ8zjHIRXcX^%F!*~4$V^%>NBA-mL%Xfxz19n0YMYoGB;;>mu4RVlx_F;HnNntb5r zvTJEyrH^Yw---_pT*p5@{BKb2A=#S$&wr3VcW)PZ)BpJ3K5{PbAD=@18p&`3?)6_E zD)>n5e|-{G2d9GO%s)T&V~&wl>K~uq!?+){EC1ue|K6X={zpjuMEf5BLH;DkKO=(t zNs@nt% z5&2U|{uPlwN%F6d{HY}W49TA)`DaA_RFZ#1UlI9} zB>xJ@pGxx2ko-xKe@5g_CHYrG{v^r2Lh}EslK2aGFZWu#@m`x>ok)u?n;Wj18}yo~ z`w&EHPV6t8YvRwVRTZja7PV}~k0*HvCVBqKj5%}bDt3J$O~iL|)qN;{>f-o+2Ey_l z`~NKT|9VD@xi{Z?A$WG^`$8`8L#DsU038} zq+EV6+kSr=d^B7FvrO>Yx!IngFkP|Gs*!d+?Az_amSJhaTC1l(`Skp0`@stLA3<#M z{y*;RVH$o<#q}_liKl)fLM~}Xk5$6(?M;ozFaL?h)9AlXmE|elI8SzBpNYdy!cx1B zC%V-Sy}vs$94Zt}94J?A2OEGN_S{0c2w zLP7=0c=e0zINsUx2v$_2+Lr$=>d4SYyV+Y{k>Jv;=lJ_wPd#CKxfpw{1mfCR`q#sn z5afmG-v`+#HAf?```L`$ufM(7f$>}+a;QE#b+XdpxA*#Fy2oLMrY9#wESqDndt(v_ zpLmiJsOI-cO{8QP6x)4)A0`|U{oR$|v(l+tMTFBgr4yYmRe!8S*A=vR6x$69KQpik zJ|JrOM34nZnQlpx7Ef{?4laQeoNwUN8(O`8$PO>Jv)1M~Q@K)~79ks_{KCZR_dEBU zt(Ap_@V_EwbMEg~JEWTAyFQ6Mv$C{m*!AkNYWiyODZ$lFRiV1tU?%fgJfmYBi_U03 znd|TGb=w;=To9Y>`ZdjF`?>4vd{9#y=6D1 z+Mg?O9>}?tuJ)tP_V+W&&4R|(2;apt2}tZT_-s&mU;F1&Ik~k@SBBv(!_t#Hvz$L8 z$ZB$g+_nU$mtusE*j25KP4pGpLq5I~{%)q_RX$yy>iqlr+4ErsSe$=+AjGNJ_NrSEG_*tNMG$M#(@bGWC{I^@m!n5#e*G~5qjs#F~;@{t;YA78~I%L~d z6qXh)#kaovJAP+vxGq#RUGUIM#e$ll@7hntW|4*`+q+VxD|fax&>Av9sP;>6_^=1v zL*G27Uek{7Sz1(n+$Vi1w_?62M#TL5B!Mh*R9(UR-$mfvsEIru$T@+|DMuh#BruvTWrd=b`#) zsJ1bZPL`ydQMuGzvi>W3Aw%KwGl4YYO3xra0$r(XQSXU}qeia179x(rwIwrE8>v1U z%R%WzJzsN;q{AhK@tY%@QqDIy_Zy%cKvYvq%8j^L_wzR_`C3E4^Ud|1>g}e64O?lr z&k?9nLX|w4b~`J6JJEze=uG|CS^dSc*Pjg+aL>Tsu9dx{Kn@wOu5+Bep>o)J_I*$T zF)N=73enoiVKA?0efB+|-7zwmYLO0(t#9prD>S^~dNIGDb%l<##4AJ6Rl6T)A(qc1 zHFU5F8tO{@{2qVW;-ar{1BaX8Lrxhfs0tdMpMP19y?=E%-gj>LieF zzI83+)M4>{2gSu1f*iX1@V!F!aY)rZf4~{%7oMe)XY9VVOgMY{n{b))(6>6%6Y z(Oo*JZ{*}Q;G)C1@08Sz$<{BOH#a^#>OA@R3aiSgvQ2vf*2?B{Y&K2?515;iWTdN2 zZub@0`kELxZ-{4~+8A7^VuMnnw!I25ndS5tjoOslvW&OYcF)NT$u_C>HFRn@`{s6U zL8lc|=qBxDd+XkjS?1zCyK)xUa6x_7@2LwJ)Sq)9p;GSr4Njz7ve2kB*`AN~;7y-U zI%6_ewLv@toru43{QIq*+yR|d8>mtb0Rza=FSW#r=Q(HP=|}sgXl?qeloP_Br2Q1S z_p2-Y3TNNv;YWJk<{&9P9}O2DbT?1%p8up#?)v+~!sw1b^*i`)Jq?s>hLOs&p=wq|Sr)~g9Y^Zx z7TV;v7RK8metwRQwhNdd*0GsD36e;go$q#qp23&Muj%bH*8J&ca&OO9R)gCb?(t&T zO`pvg^;TICUg_S2l2D;4iC^%}#_pT%hAjwvu~IJ9lZ9Zgzu3*Qn|ImDrqE>%QwTj= z^xEG_nQ5hfUcs?_lB1Cy*dFDySbxo8k?~w4Rle3z-L@ndS^^=bLI;3T2CV*J=XQmT z0*lWR-`@>E%xOSjg8EIQ;m4b`DNgfwHZ*Uh!gp0Jv)3Ei-_vFY}IpIr?%ERx(19 znZw4mC0eGNe-eCN`aTTVQPrkT%uGDMfl<{&jQ z#hHzn?qgV9F)%g$%{2K0%{IS|t;NYMRlfquGPfDy)#300!;R(N=EJqYYd^y{Wy)sH zSQf2Ab+lZg%|jPr0>I7UM90zGlHrgNxE1s69KE$IBqy|(;47V5_ABcfWD>2tmt_%A zdKiCnc)8DB$mbmyVp0Tnm0iNY^b9nCSqW>4!tU1w4UiD3$?)bBvc<0)Yi^SVSX#)v z0sH3PQXu1PeFRss@=8_9<14ZU#*_Vg(JpIJF@&KFd7XJg@xJ%Zx`RI}_1{_736@V^ zT@@4Mj|Y%!>`_tZHZv&Vy*e8sW~)ER&slY=zr?Yl)M@-f-=o;4zkl`QarGEFUG`q= zP=1*wk7SfVyJU_w_PjL>ohPW_GJo>Y458W?Y{Qy#*|d})6mhWK4Q{L7U_ktvJ5wi=}Ng&8+PH+kBxY}pM8L_4?y#CPjDOba0L8X2SiD;j3Y7C%R}kilabyxw2_?(@@6gDd}mLsvAPy(kc8mZ%t(?=jso6 ze4CjrYzwE@Cy_E6L@`y^rWn{8T0lj2keTk_8D4B+tR7!BH1oH&x=wg5Pago(7rKY( zL~V9n)xpovLTxiM-%3bzX>;}?ZJxBKsySMp0XIfhWsz}nKuZYDH7aN2B;*VW(l%a6 z!j?JEEaqVZcGBlrgdsmCvW0zhG#hX}%-w@-N)EX!IY zx@h;i_Svpk04b2SE?6Z1wquBpS=Q}`9GWX9Yzg|cdPB0DA8$=ev-te%4X~tfIc!0f znsnVh>1hVQNw&93e?EHye86`^(y0h!lUg8O?7zRi3q=VSkTKP0I9Z_nPQbWAf)jA- zCgCJB9!_auiTRHOK2gy=VW$244rp`uW}W?-CXY%q+i(ilv8AdVad~IXPOwS^m=RCCl+_+)_#&Eu+TTJ3mH9<;M5unBG0pJO9I-I{zQJM8^7`eKBypPQ6{ckk&3*xUhi?t^)RR+2>?JoA+=J@saaX-cf#ni`sn zTIk_|rrHn|ev+o;xj0cW`bc$nbtEDJ*1KUW-rjhXE<3F96km)IU18%9xYQ@&l9~8zEp;lx%Oi_`Th(!G&pz0snq29# zul_K8&eBqQ?!+-&-$CDv-xJ^8+58wEXwK^PUH!;auWewfwOXVlK|b3;=DZ@eNQ0E(jWm|0`wkq$_3lmTxprptu^4-_RarBjAqeP{1-)h2H* zrlXQx^5;~P+u8##Bk?yj9p5h|GM^qxmjh8g#r5zS86xTCAC z39-0?a`LLkEpEb-lh=mJrgB38q)A5XX7O3bC=l8xDV*p8Jbp3x0Fn`74EhY#+W|nz z*z=lGAqKGLKa3dYMY3p5<~5!j3yM%y0X`pXB*hFx zS!UDU-iVmi_+yz-akw5(lAgOaf9N~A0V!jTpHDkqQmA*2wIy?*LLD%BrG>E;b6~5d zD&)i&$yOQO_BZbXQu@-6?H&~CvK9*EG`RL?@sU4F(sfdqjlCAjxxo>MrAL2cedOJJC#s_-rf0mk>HU>Mg5Du zsdL9~HbUXuYwExZ0%n>O^(^NyCzSPuQ7t4SDj>fRx`k{5ZGplnfcNgUzd>cz>@3BnVbc zl%NHn(t>X0qZkJV=Uz_rIYC0>-R<7amGcWA(S(c(GBWmR!RmjpO7?l>Ix}di=KM`wE>}C(P|r{llPdp| zR|E4E7T;xa)zRr78B$>eH9E_xEvbs|RW*VUSJuGgXSlW4b;Ys=loI)JF9&W#ieNnc zIrLG4_>mhb5!MpKcI*0w2dYeFZ#2hfY#wJAh~;EO6W?Wi^nw!$8A6={V*n!o{kJME z#C|;%A!9>tZyJ|MuN5&9h!OD(=kDc{jU1e?pwZp7RAF0^_6+(&bkXZAITQnstD|4F`22&uuV`aM7pLD%)gTW4KPCJgx6sqPhQWUprAG1 z14T~bYECX>$SnQVSXQj4RThYNndFo-_y|QY(7vU#3N0_AiqO*LLR&U8fDP-uqSyLm z&Y2*$$F1!nL-MSmKxmRp58Fz@*aA!>$<9&}inw?I?>tZ5DMHAR8qsf?HF+~zS1 zW*puWz{{!WquBZk=TaM{vy723h;Pe{x*>u~oQDOe`Lsyb1ANYi<>XZyb|E;`AoJ== z_b_OJzBNPg7|guRUKTi-=ODNnP~_0Lb;|e2-t)n5uW_rN4~KZ2wf>?Gwcwh#UB9pn z2jU;oA(S!Qk@f&4PU*D`2a7eKUN8N4z?C&qy))=N4v)9*hERQ3og4A7e-Xwel(f34 z=YkrkIP2M=_hYr>h{Px8@mkS>Mw;P=C2K{K zc#9@iq#?UwuA{3>d6cx;611e%4u%xWAfwow@#wf}NcG$2HBTT<&<*p>Z^yTA|C=;95AabmV{>p!DSnzhIf z?%92ZC5F7r<2bvI%AD6Q1$jJeCg>=r#Ao>#y+DiBf;pQ8q*~z`4}uf}mI(Xx?M<2$ z;a&`EkR_O8WCDoFf_@*HO^z&g$=SEWhBTfTmJrhBluK<0v z&ILAwz}62&ke0;L*^nA-P@uFpq?~7`Z3cMVC#$(2;Wa`fu#xWra5&~^c0MSIrgEe; zHU*BPIZ*DVvo`;e$xl-8{c9*eRoBBkjZ&u|jje$l@fj4|-r1PB0A(;v+&*bd96{8U zR|tL^#+$i2sW|%Nu+0#jaxv3}bXrDiaMiQp_Dq+j7$f-y*Ngd%hQqCBHa z^W4TvwKzYsOtSBKCZAT;7mghxPX;-pX3cJ}B9m3fIA_p(gzhPnczDr`pdLB@jf< zawCNs^2LbM1U?>?aF9nwAbZc{V`cWj4B)=?Xk(N$41=nE1hNSlssjPI2CRN=YoU11 zlfOy4QOthO(5TG$Qw|oXxv)sf7cXX;wg33VV@Y$&rJ(O-LlfvXR6r23@!20At%qs? zvQ(ll!y|OP9WZH3HFp0&dDeMCoxr^X05KEF+J>*C?441(eu=|#&yC;3X`8Wnay^|C z83@u^==xiq5dR*s_XPUgVX?A7T!`nVMgrWHerYWMhC=Jun(?L)2nciD7!0O!uIzrh zK2+PL$Rl@4#BeyZTd?e7niR;r56=V)G=ZjTLbb1RisRLFne42azK9?dCx>U{ccbC? z9YoK3BLfW&2Pr%h6XIR;2TtRl(VW{1qAe|kTAc}cOl%@Nqdb<=@Jq41$x{%%=PspB zptYZnu5aI8(qX8FAgO45Cgd*zstJh@7#%FIY{>#0%gU7;sj=iyOHhYV$MdFWp=9@0 z*A_duOw;62&im=oA*-L^7QX_v|3by(J+zS@0p&c@ih+@_qtYzWbYd?jR@aaTgGtxQ zyn5WJfD8%z2};+pPrgq8Ic05OEUzYLQG{tY-CYsz1Gd8G{SOalPOC%P=XNID(#zIF z>2!!d8lQF!@3vV`#Wh{s7#Ju;_QLooeiM@Z7mUHRpwP3lIfNL%;AV;LK2%COHX&n8 zCLXm>kr;0}cHx@oy@j#??Lc_Ti1DMSx>10#aBOT z(>>av0#_2vevJJfDEr|hoUkmmz!b;sQ6RgTfPQ}gKKun3GJjGXuBg^#HyL8rFbl={ zj?G?X$X{v>bR(O_0ujvwMJ%Kmcf>yZ!Nnw~S<}pjJg@Cwg&yFBt1nfe&S48bRa<;| z6vReFj(7u7$OI0T3d27hS<6VbF2&;j{q0<75bh_g)8C#$Mx}SYxNtP7ca(7YMq`b< z0+I@qA{#`745-^#G%S1>%A6iJtTG;tA3k_@*IiY5zf5%VvBE9n0t6m=L4mCHZLTe7 z!8EvTA-b`9k>CT5R6enn9(t7!i>!Ji32nS5p^Z}xvqK7B)0F86k%uRvPvCyMR7=zc z2+c$Z!_!x8|K>pq108+7NF zAd??W>R?`F=cRU!=R7C@g@f=QnHeC;@e7Y|Sbn%_az?mnE7-++U{@HHVqh#ivK0X7 zvGc9iKG}0+z)cH)NUdmeKdCh|VN7Q53nFPLPKJ;Jq_~xJvm2A^C@%^2UlD29x z023#xt@5tE3~_JWFZnJ%U%2oizz(jDD5x8SAOPCc-3vs6yHU*c`>2n>++G%`FDFc6zN{Hi^jibgH&%%>c7q=v3)XWI)M;*nt7G*5^f z;4#fZ;&x}GX%PnMH020wAOMVQ*J*q_Q-)yb(riuUkOujk0mM4Q3Snf_5H^oA9hyw8 zeqnP3H(I~GIBBjXhsZl~K$Ug*{r&5T*Y(NU$L}ZtR2P@#M34<(Y$P7fyDmc7pu(g8 zM>fZbDr-R}+^nP0xUHHX@#di9ofo~J)c8q2>HjrYS$^>;-&6PHM?Qe6uW(4aHs^37 zHNh~`%K#X|m$ZO$yai>~GMWt8`~f}zbr?@-K|yC~Gb+dfK%WhIVLZ#OAy$~~GtPKm zFsbUb-0y3C4U`wV4+P`;`_q$st<@A>f=|L`TO8;D;I*j@j(q25`%7O#rpG7JBmOcU zsHjhqE`DsX;mUnfkz1ulK?ijTObAu!piEh`B^hlhQAJgE`pr3y)YBC%z>_8BKupL4 z5Ewjus+WM~Gn688Z6;)B7bu>^2Sv>8HNn)(y@+Wo8>WzPMpOu1V5{6t##v4waM!S& zswe!z12tI!Cj_XBE{+0xD8x^{q+ zQf{P_LY9dG+24z7vmYJ1fZ4utmzM!d2bU5ho$9C0!4ex)dTK2Z2jUxSqhAo@XCYx@ z0q}l9hag#ii1;9L;BCH`@gZzNxxU+LR)w@=NQcY9*ku&pKE)`}%y}QTTIzRd%jELg z?8p&Bc=XF%U(ZmSec_b=DZ-921T5dchZzHM#hp{ydB!r1urn(3p$L8fFx7lv4>DK? z?DlJkqxsy!WAl(BTBqHhc)n+om5(ItVSHGLs> z-5KN)OJ#C|Xa$xhKCo;I$6jm|fUsMGwrB}NuSmDj^PTm#{O9hjOq6NBguQs>>6Mrs6j84{wS zg8icdZG+X%QGt1SF}@KTO4nU^5czqqC}qI@2_5GxO^0HW^_b^MoE8;wuL-)S)~83u z>k8v|nMJUBkW?{``5S1(giAW;VBeN+EiuZ8o1>z|vpg{4IEU6GA z@D>nhKELhF;k8T5zZPj_$Pl+UQLAuI;BR$KkNbNS>1AG!`T=zA#ov88E)(qvbcZF{ zSFRuEl(_^rxEW$#$@!9j*K2uN1E%%&+_!@9ymw%Wi1P3vB@NI_zkpWGm*jjcauwEZ2aTpDkxYDpcvSGc+?Fp)dZ``7*SZ z4!ND;_v#T5h;OR;3b zP;rb1bcFcf0o7@FsHBapizA{R(PzLABNQOlaa|}mgE3<|Cm2iSq8V{T&mjIJ`tz8q z#%s`T$7jy_*vw0lA*fsrfm~#RqLKmfWvG>K)a&C{k_=z#71mGRKxUJmlImi)K6!o3 zGchr$_8kBK^!zk5+&RwUke`;Yzcmu2-L%ovP?&%7DUpHbQqc9n1jPXq&K6 zfZNGae}1m2;UwaK*-9vf5%TcbdE5$c0_QP7a)f*NKee@SdvWBQZ@*;<1iz+I1Wloh z)yec^&8hC!Un%IZ+}q@Vje7v~d{`m(LuMZVCpCV0^4fVU+oy8qZ_mUT5q~ZYIbTEA z%omPde4>JN3r^^SX+cZwZp8jup;bhdVQGQ;iAQc-_PR0-L;k(Tkw6sG4Od=(?0I!`ak~o_yFZ3wI*T=l5b!H8b3gX5Ldtg6KZuNN)U3?x+mAj zvKY9-2rNMs5QJe#)zMm@WOlCNNC_eGh+=JFq)IfHvEF$sSQZ)}yFLRssP%dT6|$X$ zPgA8ORA*%W8$}F-1SV>#}hbJYRnQCOJmAu z(flT*ymV*8&vlVRQk8TwLsQ;O(rY>ASNrq3tF*f@>8z}*uUZo%&0Qstk{$?(R_tjD zxFBA$%xme|K$1kHsSpMulr@1-PHS$YfvrsklU`)i###88tfmreAW%q7CEdj_c743` zOvuE}b)Uby0aR6YA!s_31^uN?DE5p|KDw(9@-5>L&lSO3I=F=@P-|lz!!67~)y{Au z_~^*24&5E@Rl>dD2f8;VNP%!$lPcvMtMxaD*U>s(j3x}C=+|k!LL5LfxjGX*2FX&` z^Kps$5aJRTR`FKc9hIGm`La8kPK9@YL9YRs(1a1v7bq>qk}`2>YV@hQkz$x+;XOe| zt#yi=Fc#6>Ofw%75s<;Tg+{ zFg6kcwA60}nqn3(u;Ddj=0tXQUlon6yAMDj=Sg~wv%C4@Ly%=Lh5yF%K)DW(BPHw( zKD7&YMYA3GkUf0m$P5qEzKNyDt_JM>Bbs0=J3MORa;mLTyyJ{t0Nq9s|5fL;-> z)|2QJt))Za$1<@Yfiuv`vY^ilui z0R+M9cR_x%8{B8tiI4*iK(E4&b41Cl&wiwDQKLX+*1#~K6-2{QyAaj*dhQiDVkZh_ zG0~OgQh_H61lr^5w(dcOwi16fbRP}vfq9HJ zcmmk`PRfr4!4Nndg)T&D#NibLd9_t^GU4dF6_7yD@_k6f4;1!+$#FPVWi;rtWpf6A zSxeH30eojeR}L9J93?lR^i010iI9nLMKQ|MzJd|CC5_>n1q==OV6}(W85pB>ni3=n zB|VOIaaA#H&m32Ylm{}U0vbfiW;((k3PRvj6vzU$DIYnENo{u-ZDe$M0JjlHx(#Nn zy-WZCjcWn(`DZ7}`5C{nCm3%kAyI7RuomfPl-Up zY*1Z8*8%>taF8Rd&k58m>NGT#aJy&9>E$nd$_X%J?*{7{qPbKl-nAaC=E|DR`bSkn+aK!Fq1W=lKvq4w^xc+gp zFqE|B=oM-L8n5MA51wcRGFoG~&Xn-7FqAh2ctPK^3gk9m)+}IG`q%~hMC<%m%V$7W z-3Mj8OG3Ehs@#1UDYGG1@f>@&`RuFKUb)jVLQ}{BAQY#3V+_+4ZEPO?oW{=fRts?#GXDLI`GYLI!dLFC zj2d4iuNxtzp%hg6GSJ|TvuN-F`Oof6M2>+R%P_+Magj#_`vu;6>c2oaM{|LB6`;g* zHFK6pxoq7xsZy@fF>6=Ih6bxvhiSFoXRC};GxqjD_iN$Ui#RaJERKUO%N!5Ag|Y7B zmNz+6-`^-XcBr6b6U+b^EmW?bNn_D^u%fgy4dH%^7Nxla42_GYJ-I&PBdHn=q0w0F7Yjx zf^ev=v-v&=pK9_xkg~;y5_vucmca~CWYh4sZvic|Y#{d+y_AI2vw*P^whL4M888Ho z<&yiiO8^whGOjFhKhM~E6J>WZZtDddv-v3FIg6i7Plvxl<~n4nKmWk7 zQ_ML}gJ|@YyXASp=#(fSjc?QgZ1AbS13}We6n+19EsioVM;n@hG+Kra-)f0Fn+5Lw zVR*l8=5hd`H;BRrbuJ7aRIt(b+YiOr5r;q&y~1Ex4cma{b%h*h?Z1vN7#=%+ac8wN0W6P0G0728s{*(q}lmb?+w4>*Gv_&lk-K@_S(Q@8yIOmW_!bEc~l@;AVm z^#GkAx!-4qTKHb&Q(jt5hN!)Kupx|Mc|17_sr<&1$}caF2Q73{tWsbZ>jY#{n1CJu zT8xsVOlsT%K7qbzGbH~rY%om_q-zU9@x$GKW$cJ&5bE%|RPtLsNFM(3pd)l8fl6+ zh><#)hA;^hIPjCAXpWK{y@DIV^h6x<%3^3L!mSI&eBLA_P@ussWGPPJ&mp@u%0wE~ zHDgjs;Nqp7ipk`M!VXJbMe8~?0-w+h)3au~-4zx<0f%LPDlj*~iI-aoD)-bq!GBBI z|LrIY6|?KVsb+(eSU?xzb0hW-mnz^|b3ySKQ=>v8f;mSQU~DadL*p3u%oj)!G9-rX zd)*nd>yo&$E)Ql$tK8MrsRu4%8iYSBFo0tp;1e_fD}Dtq)Y7`!zrDjs1GJ;M!Vu`9 z&(8%lgCY~K0P032fF%4lLsS7rWM>@5KIFX%NKRj$D^kH& zAhl)}5^(0usLE4r1@gJgBX`U|FWPQpc=g1^_LF<57 zX-lnW0KQ)f)S_k(%pAxeX*|SzW~!lkbl1h=MqiUKZ~uL_Dl#Nz5m?>&{kRKq2}~M8 zoz<(5t=rLdN$+b*Vl+5%#^(tGM^Kzch!e_qUaeBa@umFauRawSXCsbU-L>n@(FB z3ir^>;@c1hfJ3?~&w_I3()!0Wu<>Pr#hh$z`vk@fWid|h@Yvh+3D!E&YiIgEX`Z<~BBrxK@fhnG1lg z!YMLtht?#SLz8qLam;0az;6-N5PTwNNf~gUF2rhYltB}mLWziVc#TfrSx)Jy_iwo& zKZ0Y9b0zlQBB~?!SjgvW5(uGZl>NADKGzz*~7YbUS1U})pU&|K!%$vxx7i_|uQ zI-~^(WnE!VW0(v~2}$UEAB=rL_95|@Bpz4`D>$ho5+Pd*K8L1Fd+Hz%3p1e#giI;H z4Ad6d$5<5N-%@nDH60WJSH5oWO%zhbWyyM+k~15FqM81loY#t)fZ zg6UB9?37KCS z$VHi)GM;!jccv%~IO_Ph|25*^2W9*!Xci1@Oc~DqvJO?4gKrT?7~( zSI&YE?SXxGr|k1617R+voXkO1hW*<2akQ>yK!%JlQj3B6Q@j?v=9PvSF~kdI7m3&R z;1;W4qHPVu(qDibqrzNFJS!aeT&E=d%Q$f^&N{LkpWM-5fR<_XNysFxx4Yam!jT{B#;8_rFxFz8-6p#Ms7w$@^MlYv5#s z$WKE&Rk7yy#wrk3EdUQj+V&RIi92gbDdH=-LHn~N?yV^WgR_jIA1c(A9lP)-gCy1- zyY~U?33cy|!0h=69El=bCk)5fW^^#AU=hy*K%aqHL_i42fX~N2ra%~OqnBJ(PDOQE znBn~~I`+}#6GG`La^u1PH>A);83;#U&VrXBX}@3N35+y4-YC6G#(f%sIdA~ze{B%w z8BLgb&v_rgc$Isv6_kdO4XHtLGPluT^6I%2BnH5GT~~P-ZH+M9NvqnNS6#SyPrZXH z=frCO%pU1*Xf93}5El%pu_T4p__!AhE$uZ_r$XtHas;Oq)RW2?t9aDqf&v}zL@2+! zl5D)WbDRbTs75%Q8u~Zng|ijOJe5yVRO(g2JucxPP&os=GyxT~{8J{nU&pWBJ;MZaD~8=rQg9XecS)yBFaiYC1^p-P5p(JBfw z9MmO%2jd!UFw?9qWGsqIKEr!+u7MA9g9_zONg(9CI&mq+R9j#SO2{i{KA%i!XjGuD ziAmET3^yUOgxDM%Qo?@(I2_td`>3zWE3OdCvHx@VX*;J)*00Cm6TSlVZZV>(`3y$J z)B>wE!6YV}vlV!HMBSkF_W6@h)QaB2Cuo5mw;6pIDizW&^Kz431{~|O+dk83=(zZe z7*IKqQP~t|{}t2|hb4c{>d8>_7CbqluStp52!mM2vm9`S@DIk{&;cvFI`}+8^-4?P z0S=%hgjFlXx>s-rB6ffhp*|y{dr>MhxL>~(1{=wNJ-EZC8r2oCC zq(lR3A#)FIV(u8*S1vsRSnS?`TB~4oCXhsrI|f-SwFKQRzML8%E~3N&?MUNPjFNe% zx>tV4pKSo9v?$ZZa^Y13A;Eru>I>rX^gFQU6MUa8i$EsHHN}diqr*jy(EwXGJYeKF z0C#L~{8CIi_B29WgsK25$9uJ4%KR0ORZG@d59oG2c_z=c4O3&Z;ap{5A%Xlc z5>mnNks_dxolnJ1WyYu#4(bfuK-=i57I>fPxKe@}OJQKp)c*siK+h8Mf!}|)S01Oa zf=aN`dl0)rD2B6Sh;rhG<7=fK$=q82-+14Zdr=sGPtAoz8dD>mehUYWo`QPoxP#8< z-lZyqW|8Dlj&BoSCuQsbMXW*x;N%y$+plnD7emP{yf`zsF#74};Nu%QLY0e;q(IQs zE3MIcV-|$6zSXk~O2y}bXks~Fbzt!Gh>eDeyD{=4xAhN2N)JQs^p`6F2u`Q=NEu>E zix#lWVK_6E1$}Usz701zy~uN)eD)bSIDotfR1Kgiww%VlXKQ^bFAJLBupU5j zK|m4!&4*Y3_FscmzrSr4Xy_w9;SH3uNa*n?aJ=XSr=uyqOv!nDIiS;c z7GCul>>Xs5ZOii=92Hco7;nraZ5I$&v;`#uO{$tVn0eK}_E0x{0+Hv2eco>fqf8Ep zT>&xIQ@ABhR$h@DC&Tp&$Wf5_3rIx45Ks)fvrBM9pnpzLl(94$P)DpZr+*)Mj)Bi- zeQ{V%9w)*NLyccx${Qn+4{53DIo`=V(czLi}Q+ zT(U?y&PLcYT6NHbwfq^F2PfNxdz7537pLGTXTW;~g*!GsD0Us-qpanip!~FFQicXu zams5rgXB~4>_@oO7HLy4vK_|(uv)epbn2mS$cAE+r2}s#f~COoE`u)6+i!tXWPn)> zO+cbGC}(52R72W++iU5lpy0lnL1P+K3QIpD(kQy=&jvIhB7klpu=rmEtC&c{>HGoM z3R;lKbxUv?W#vLus~@m|2%dK9x)C~5bx)2m0$XJ!n9$>%(!Pe8j5j&ju|wekulz^@Nfhb9UrgAk!X%fq(s4iRx3nw{P180#tltHzhp zQNLz0@z&^1L+>IJ8n-oAqfx)c7~^g=4e)e2UWRt_BG(X=H}{Lo!7(Z zERc?^L4UCPIocJNZqqU2^-HNU3Cn$HZMsVFQSf8fy_v(l+ zSUGf$7AYFSkt4O}L2Hyu*71}9ARqJ?=WrrN93F$|YhkxuD)*PSx2^&CoDD?VFx*_| zI2mK9DCZQJ+d2#ZwE$GtZ6pEh1k%`IM0HOMYIxliI+#ja46TDhrWc%sgNQ14vq|k(R=I|%6t1Fcwkg4uZon!`+A3bsxkPVeWAZN^ceN>Ua<>q z+?o_uqi}ct4#iI^sg{$*JgGHWY3J#j*vK8yQ2h_OGnzl8)yyZa#&jY6U0@EqdiG|! zd__+%uLBGi>-&S`9m3c}&hW%K;Wv?0P(59 z_}~&cN)=xu(KJ*8_zvc|7mIQP5EoH@u=frTjznamZS}0z@@;}&G-p02ed6emsHOSO zLfN3XZ`{9d1I&%6xoLB~-w;F+pPrF;`zn!$V-8Z4July#C^+de28*l*Bb3YF?^F5; zBDKug=;PsPRoweq-}0}IMeUMzMlDV&*SkAql$O7Oo4D`}cu;#}H)lT%uPA`<|51Sq z*?!;7bLZM##$D&G&|5zuUP+a2Fo!pgx$Qehh8Q?tKnk`25pVdhK4xAUCVs-{y=QFuUOf+VgFQ15C0 z1--UX1;^Y3BfnfwhO=R#r^1Pj=Wxz<=+NF00B5MO?*i^6r;y$skUUj+HZTURBKS>> ze*rVPHi{JN+pkAql)NeO6IR`>q4r^W(=^Uh34m!NgXzpcyEia5WnpDKkt-J^fa*Qy z)CArSa1tI7Q1xDN-NP2P`&a(Fid3+^y@2z2M*u0=xMUakkuJjjP!PBbMlCJ2m z?PtOWSoWBzxiBa1?;-d16P^w3e=^vHoC_s;#~i|rp&qhZztrAFXTA`#>#u^)-vy#{ zrm^Sb@wq($j2=Q;=RA?tw;(JK;#*&M#p472+Uk31=oSwZ$Dg%1F*t)8t%TiR0X$7@ z0WKBworkW70p$fXvbF!I{E+Rp{DAigIOc*y+VIa$PNo5?%aUCkq97m{;ILFMs&MZ} zxJq;$Yd!$3X0atGnAxbn06J#|fU>pRI(VSQb2y)-Fy~2G1}JBv>OQ2Q0V>M*EVPJM z<*^W5;ZzWz>hbcfC;^x0ZynR$Vx)aH(I-RXd5`}-WMA<-gjFC5oi=Yv;+Pi@TpMaM zMa?D~_-WN0Z`bWjk3!E@nB#HGZD1aus$nh1-CdsqL~u0uR1pH;Rz60{ZD_cg`aacP zal$W#?(yh2#i(=}yvbwtkfCF!b~1Ad#064+YAvkHa7wQBn3M2%-xd?_9R*q zet3@VFi4oeaT1QH2Zc@je*wL*?s^qwznZ#TgECvxptH8yTm~F5=t+bBMb?`KLZP?) z!(%Bbg%D*;iqfJ~vJ>q^8&bA5PLZ{cJrzTzP^XiuDMb;L3Rw#$m8Hm$vd&SKG>96R z@P4l8+|TcRp7-zjHmCW{ce$?5b}fQ=qnP&U)LDzuv0pm(5gVHU^yv=JKU)aiET#iU zqmrUnRFK4LKQ48w!UZPXZ?7B=mCM?6%83NQE#~hbf6w^PE|D1izNbpYQyoPvP7*Uq zo-{u4V=}|#X@nqynd;V7%(}Ga;yJJ@WN|^5(WUrGHXFB<3thXq#^`5{^O$#Twh@i9D*Iv8v2qyT1*!!Y8T{2t{mD^*oA8Z6z9Y z)px+$$wA<2D6ylPBrW+{PL;kEC>(yh@W=!R-3-8n@w!+4A{7vl5#BFTE56$`vl~I8oD43L64G-D-jXViDpR#XY zTqyDgn6i*}F*UoD)6f@}Du~QXb*KG|Fs4q$&f(ZA*|Niq3CZE$+uCu ze)O-88&9nu$rUkDc;WuyuwGz~jTj`3<0k*q`vOM06u5PkwW;c4+vL}AB7TsTH@kTB z4z%)_n<4BP>5^!Y2{z_m^BiDZIhv)l_7HVeCr&LrLK0(M_u2Y=FU0>A_-%QpDe(n3 z1{Syl@<&k}H$cdc_PxI?n_MBpJY*$pov6y3NW?n)7!Up?E9L*K_a>d_q`>dimtoKx ztW|w*ALVir1gej@coqp?E%(35TpO=o$tOruXnD~F)6VQ+=V^?08E|W}inbi`Pmy_& z75u#9K*iK=Z#F3Y2;y8-HCGsPp7(Vxio?}DQ$h+rf9@)DtE|DJ`(-k*CTT$sk8A)3eg-t8z1kEl#Sb8?uyr?f=pc()Q;8}MC4+f9D&&-H0hzWp<` zZ{n!^Fc?|=$FLAP%f6(Q!)G$;k!^H}pVhdz^Aq~$1E8)u0D<1d37XfcdB}cLV4$ly z-pR5y5H#X~pf=N;qeYsGkaurNq@!yrmD6qtRccgCxhH_z?RS?ooNsoG_Tl5ndXxE{ zN~H6JcKq9f+@T`;l4UMcthWJ*W~_E9ZoGky(^g)c2U`DSBGSJwXDmp_UI_q<)1Ui<5YBblZ$N&RRT6 zD#Gu+pir?SOw@N`W{fRxmWJm1kO{*4o85TmvP>D^7-uti#$#*rH?%@a#^M+s;CnIz zUv=y#)C9$%ZyHXg4u^9$+Z)Ej`+d6lOJ??WmaQ{;a%ucX;<+4h#Q7xVzv{hR}|C{}g!|br0sPeOehdH#9D&`TiGY{^q4JQJUyA%~Tiz_s&T# zyMt^te5Dfbo7yZ#p0MrcDwvIJUc{}sNh1Uh)VWwyE^0hD9l>{ZX+>ld)2fy zxz`YYJo5W?bSUx3bLh1Q6bk)%CBSqiu#3L8IZoz-N%NHp;b=1{1E8be@^P;KOit&UNr9mii_EA`|d%d zbHK7zb~t125g1X4F=6u=GMDi z3ldmps)1#mH{= zI1?IktczPTc}m#xf5gT7M_Z?SXFMJFcMmMb#*$3FrgIm`4=*`upP{Ra@2~QQBMDnP zW9EXbYIgIKgQ0aURghinvYnzje6wf9Xp#^-{|4W?RJwfhKR=`bW|Y&PO``0f#FO=a zmm5r=extu`M28C5`kD7YBzIG@?|+$@umcjnYWeBqtpvxhmtF7v``&(&!DNZEX~|x# zc^+j6It&*QKnyA@@Z3u!Lc#l@ppg!tRer<2@ywcJ64eoF+KZj^7L`G@>*Qu9lo$ac z`DOI5k^{}!xL@0M;F_;3^I5&32IcMKp!@LfDA~Wp)GV@No00n&&({(s)n#kHb?f=m z+2@XPe7Evne;)Q+>Q}?(TaKoBHz2oi)ikq(Fy~TjL3PHbf>5ewTSe9x_kf#NUNFN* zjeNI-8zL%C_Lw^hIfRo(vxj2} z$o4p#j{a>0b%C2rYj}>;n#l)TfgrGoq2@uLS;Ah_lx~W)#R1koeGcqHCG%FZR__KC z2yN5$fcfa<7WAXY{}H5`(pI>5Y$B!zBIp;nR*ZMsCTey+36DtF4&?^e_0)c!W)y3y z3f}8NrIt=c#bsr+in58)y>&#akq$ZfQ26#MF!zbKQQgj$8Ftj-JkG!LomrPhrLtYpvBc($M>N8B38-a07~U6@%rE z^v6OgQF~Y~v3>G3Kr2sr>=vHJ2h7HpN<|*TzM7Fz2Xp1%xQepVtnpii7%4Z~h7(Ee zZE#{OFk~yLdw#gOFGD=uPQ(k%%AOlzcwodp%y0Dk$2uSzH7;N;D}d-m8AT{ z3K~2sfP}k1a%mQH|CuK;Gk{nmH_OK0T#^BuXfNd(YMb+j=(CAHl!vtp_b_OjA~?%q zwvj}X>U4tBijB)q2s)0`+JbS-AbJ2bVJe{*b{np5UrmOJeS94B$EOzof6eQ9(F)Y} z2IPMSEZ=+p;GvG=Fs8c(6x?#j$YztJr{zjLE@3sgsQ=NL9@7@s#G2EZNZZl)N>fHqS z#rDEtCfRTPq5iZeFoJ_8&^yuJjgN8c2?!XBn_2M)WqN$#WTkiG<6O4}I(w}u%3a@4 zPsSI>F=w~7o4wg2I_li=$5b4Oc7OsU@bvg|_})-&x{b>oxRA1@W}~PE zf4dy+Y{~w^*Ny0~ldPC$xDV&6PSD;(t;J50#$fff1DcZIl~a}%PGQPU z7T&2=$F2U`OLuAQRhRMN5Qlp|mQVUsLoWRex#KzW^~cO$B8Iv8#|*K3qY|-Y&z_Y# zZn|tN%^{D&%M$BA?96do($BSdkX(D zy?7mm>^jwvfc$7YQ$^wW| zs5;Wxv!AMliFvLvb?v_=1$^BEcrN&=g+RL`u=bh#N3I)vM@bbY&ortRps=51SpqvW z>Q2Ap%N>D5Goa+krSCdTEfCIDFH*jaJ~E>5T;T`Qd(~{XhT?<1NSa))tnL}RE7Yj5 zTP&|+z}Wop41Z-GC+LmMKF6m8>#^<&+sz!$J1}%`>MwN8rW+r~qtPXH?DOxr zdFAK#1=E_Z8|KH^Ka4TNn<^IIrvV@kNajUmLK}2)RV_1=VsUx@BU`E3a^>-N>NZJg z+s_!k2Tc->EA*47xCM)Le9I)IJ;UxT2>FTNsEBKq05ga!kY_6B>zTgaVhSn9;Fl-_ z8^pKF)b|mc`L^tw?up)1XjoIwIPD)_GO_8((iZt(g{CIb!B~ofT*|aBu`5iA;BSDf z)4^LYbW`v~LatsoFIH2bxCXQ;+m_fD+k9!td9D>O3Opu;-{tY47c(zI?d}nEsR&CQ zDLN4K43S&Pc3NK@!HKTa1?8&dS1QzhaNe?VF;%4p19QzEi~1@1q;ZnIIOP;?NX^#2 zHMmD`nQ*X+$FqO_vvTW8WR#$TVqMxU>ks92;4+qpLwCwWQUzt}@7O8}Q&f{RBQym} zDGQ(!dy}D+fS65Nz|eW>pnc8X?*Zca7I`{VR-(c1RKB{bu4?ChJ$5yWy`Y2y%ZOz2 zk6|{~^pgs4@mtv2cuBAhe^xk?2G z)Fj(oP`W#5%$Rf&GU#~Q@a=DE`4BhN>AzISskgrbg{I8;Bd=GdG+4)s$`4Z>*Y7HX0ODJpOLh z_@45EV$CW)2P-y3K|D(3w|fjx!vSB9934;UNg7}WLoum{! z{-aBg_uw0-D03tYg91Q12>%J>Kaz9fJhTJb?%EZ-5BMnjkP7b4Mv|9^=Jb{fF>-$Y z@V2kw%$R~Yfx?h(QvBsbRqi`n8Es5uth}D@>pqdLN)X8-`Z4-oct2#$Vx)0#KLloH zlP8}-33i7HP64*4_BaqZg^syTCzIb2XIQE+Qtcgl%g_3@mMRF%klRiTPoC2Y_HdiW z=f>HraZ;1mnS8YzJzd1dczQ!9SYvx+;hqr<)yXCYt{$Sv_jH*E~bQ9o_N+*%6-7fH(#b89*vCE6CcLpMa>XZ5g4Z4VIB(8S@ znot_JprC&TxcJi6)25wSR1kV~2?+CWwnFJ+P%o|}%hRWf^%~@8q`z7X$TBA$=3sc* zU&a?P^)4!W;x}ys=edkM@2eTe(C^ck9*gwo-`|}oy>zib&%@iO5z@(ll07HI{o_liuw6S6Jio@@18juXmUo~g#ACQ%kmK{Y ze1dgkl7V2bg8TZ`ux#D8_^IN1N&nRtuBJnUN1qDg6z{g8x?+5uGKV+@FOI;D`Y6#l z1!c|^AR7%xCE$6SWD`C|s3wV(Y;neR!s?wra;E-ICp9Wds2u$;>^3s$4uCZ!G_*}l;|k< zC`X|+Z6rVGzueb@Y-G)hNu^srOQ?&WA`(j~FQE$1|t~RGSjzqe$ zLF>R80a??4K9Bl?Gk!gpa)ey4B(}v<&_dwp&kk4M`MVA6Z-n!D7zNfb_zx1Np})bD zZ7$kk0FYZ7fdrR=mft(x*0dWxcmpoADl3tF32Qt;rJruk9EEqQdMSUqIo3v^Ut9U> zdYHJDr}2q3AxWY<(1cBdTraqE~^XMZT z%3UEA1J#2SK|env++_89?~P1sNii4Y`(ym14IL2clV?K5-RJ7>S-)3SIXF#GAY}VL ztB%&(MJ+QSt8@O{ZHUW#kG+r|3_=?euORvC^C0uORr!ANj^)Es#%FrC@A6Hk?R-1j zdZPD7dcS^;|J3yzQJQ*>l_Z}jhBuGC6ZloT3e_b?F3^ARaQ@hfX0%M2_DftI9&K3U z@r8N)D7;jTLVN>P$ivK$U6+lBo($@_DQJBcU;t4%$ z(nVx^2o~L;mH}K#TO45z_|wI$ZjX0E@X=O#=w2iGnes>TBJU6iCNEfOj~-`XtD9sI z`q^&(r`w>w4RBi#faqPs4Ylk}HVE8}R)I&@ppL$UVzXD)CK|EMgC*f=e*hhLksw@} zNQ$7DDjSv9vYtVHz77CM-{MJaz)`KbQ(z870I zA2Bl5rHY402OBifV|HW!_~e~;9T zzNw0%Dium<%}W9{UXtw6$X{5Lmbf|iOC3kD>Y3s`UpeDz>jG>%x&Mg$yQx2+#+;Sx z@cuPM2;4ygtXuKUcV-ie1$XDYDbn%!^m~&&s)C`7Kw->nKL|bhYSwiV0rY<`F z;_@Mg(0&AcN?LI^(rr&LU1iy))MBSA8Z`H9Z+}cg7x!$!KD3y-5kHPRm{$Q&8(e)5 zbw$B~%*N2Z-=NNPe8ljL8Ncd`pj|rLlw@@jA9WOXLb0flH7w-h&BZ?=`M_9CV-W?{ zv#y$^^do%M@v>`EzE>JqKu7x5YlR8FfBs$6XMs~%aNFcF&rqxI+$@2czH6a2%elx@ zAM;sQw`xIGn&I(LJ4*gQXWh%yI6C&zHrO`?w`I~0G&D=c6jq1r5&xkTCgQiNJY}oT zbL}m58~eRflRZZ5E*EESmmFX7?BL{|OMc#exg~1LzoixvuA{wUw_?%SWk5P|HG7ts zJ1$3qZC4LSGA2fVG+F?5s^I=UUdwqm3<-N|hLjvw{hh!bhxC&d0@E2e0RttO(gEqm z!9w#G4X#S-!PTjTlI?Jod{RHV>+RirRyO9!x1rFDO%zaCI^6#hL8i32mC?yRp{Tc}YUbw?Ccia`RS3z$t1bxs;T9Y9(5liJa{W@yEnEG}V>mpHCyL5G ziHfF941L)K)f9yeAx7f&;fZ<({@Vs73hHYQBiXe^%=jF&m?R92 z`TGyGEQmE~`&KCV4u>~y;>PqXLxEmA_wNDXZz3Dx5)#KX`nfUV6UP+;22N2x(bGfq z?Q+Vw(hbp12V~?9C#Q!AhCRP$^wrZ$Q8~SbyJxg@t#$cx5d~SXed3B`g(G_={d>8s z2^hJzXlE*OqD+?wY*}zNL$hj5VV}LD9 zJH`=NjFiUoF%YI?PC&J&sGD*>A z`Uy`B$KcesRg?zd2u_64IaWd4;1Toh{K+4{cHPQ9dJg5!uyS z^`g{!@7L;Pe-gMZ@6( zU!N{I6+^U3+$GIdkjPm#r56p==*El(BPwjuP%>1k+eD@JGiJr;ualFLvJkl(8P7a@ znJw+4@}{Vs6E0gbFED#cTk?{#hO6Db&wKJrv8!-gX7aD)e+9z&>3h{$gkP<)pPztB zGKe)gb6qBiV8`bS=3P|4n#=`}P=*}I`a>T849owZGfJ_F?5mZ@cwp-L^cc%igqo1j zWKx*DwgqyXDyu1~^|g~yzs--_gX^N|0-xAE3}s2|x4Xz*jyvz1i^~l|VFw6t?x3HA z4yLnq^OdE?ycG(wAp2q|q_q2R+&_@B3X+gbV_5ZxEx~(|6vm@;Nmg2T>(B<&39Hm6 zF`jzh`We)_{<`t{x@kF^-;hK!ZeqIY0IH`*|I=!>dfJlto?bW91Ec$sWv9ZeKTWw> zhBY@Hq#PgMd?pV>rwzOmG^tdgaUpfrM6=hE*KmpFvOD!fjn-p5F!6}E; zaO9HvD;Bti11r2uX%NoaB<(;)(89=)G_`-p6AL_@RhJ)7DC}rc^L$oo3=~@KHcY5 zG(Tv}bX*MuBO0++lqTa5y#2Q){?SU;3E*XYQ_&^P-g+TJIEiMa=v~4NowKqsb7o;5 z-Uu=;h;xK@97oL&-?YQXArQ0?OF@PE3Xv#rdM6)PZxWnp657(X%Uu5^QeRUZyS2Gm zj{OOh%tU|N5jd%Sq%lIa*PY%Vvu17QUF8|6o_iClOjEYB1-r@~NUN3V@qd)hbXsFF zsR$*bQq=hv0iKj4V|0v>DX@#bvqW`QKGA{#~`d0e#j1oo0DG|n@_lK%9YnhFg`ZkJAe%d zSo)A)HBRExnJC{pp;|YntEuD-8IMxyuH))y)5U-P4G%TaGLEx2>m)xAGmul(z77qn zBxh1Z5jNKy@aGvs%p;Gt!Nx-{bUg9F!^wv>007mbLrBW9K|N(I5@D09SNS$kU>JpG zVO6*lwR?qC^!vz9G>fCqBr70j@(-}NS&gR)8$b_NT|l7~!dnFusXKE+M{7lflQY8a zZ)(etIGBFTzvtT_cZVweU)$m^Tpx=KPKg{QB@x-Yuo{-Yu4gtTZ_GX3vomKGl(DEy zD!37@A3NuUb_|~@YNHB>J1=tE=nt8Y^hf9w3xn74f=aLtoQl`xHQ;@$_@-KiSm<{M z?|MUVgo8m?(UVMvJmNda-PxwN!-b`toBOdk-l|zzGH2(lt+!#=Pa$E?BS`0|aq>DV z{u@$R2FDT$9xgq!;is)yhyzln|L~m^Q$!)1l+2TgrnlFW>*?8XtDTVG~489#{ZI>P%Hzk%6>Muc?GCvy)FZdQUY2+HZ)RUQJuNpG zN^8)D%um{I$Y*rACgek_GK90qhDYH@Se;bjV{-f%6X5JF=XF)G(bql~(mk^Wlmtv5 zZsq+Uj8Z!h38-C_ZPmhQY2N-?nu7QP>DM$(=J0OyE=OBWccu`F)Vy*LE5>xQ>K zGOC*xtK;cO$XJyK1VB>B6!W&lD%Q- zF)&G*x`I$WMc)9ixw$Z^+tSWA=ndUF{;H8?FbS>Honn-SvwVk=hYFq6Ht|XT;p~oO zTYK2J6I{K8Lediq0{2n@`|Iy_4FYvm3hFm~L*2fk>eDSFw)?6!!z)J?0O|lp3YH%! z{0L($HrXtDkVb531Aj;<#U+$`F%zudGbJg11JbGXTT0svQ4R?L+#LYmvjVR~*`o>+lh-pmkU)3C?7gDJ}V!??GSq z#*73~f?@t%w$_n4mBBe;Ezm4^UbPi8s&~sgNx3E5`MZ0x9D&4@2b>+aj^^&1|LMXH z#7M9i?#mGE@O}EKi|n~iE~A2ogknyPQtCxma{X}oO$ga?r6*O=ZD!8wK zvD;t+4G2!w0$xo)$d6FR5?ST-(LrJ?CA4nuMSb`cUjwie+<=;_e2AH_53`K|6q~2= z0xc@^jV13xm;I(sM#+_$eD?AOB~%m0>-)XUR9Sl$6&Fhs zvPomBS+M-5bKQhy^s@=MCl=)?p&iR@G`y8(OvlyK@O0Y0J8T8)u7eQ=)YL8RNG`Js z*^5Uz&#*GSN9$V>?Av`a7#DHec2XhD(l^Z|qkjJ0*87k`@Z{r-r@QTXp4&2V$)H|n zzP1Ur(!0p7amFER!11gYGj9EYk%f*vjA&?d%pl~jEDY|pL2_69)H9BW5DMbp0JvX8^H1irWko5s!z0u*_!mnoai)RFpqj z;7<*T^%8iuRg-+z>P1yHQG1lBQRqkrRuZWN239IP=II+?VfJu~8H0^JrfbTdvvrQA z=UH~1A8FstaGw!21xAs4!?8VX^`&d{k8caM9Sxqmb0pb>!)AAcip=_>MSo3nS8d9F z&ZP#@tp+z8Q1gd_zRF5St?isuYT(+|3`n9Ktr*dmG_|kLr`sEF;3}(E{$Mvg$-Z4| zD}CMn1gm@s5_J0Ok{L@|6jS=nO4~X7Hf3BDco@rIZodVPt{ip7Ml>IHNSe@Ucszp& zql}OG2$zqi69}%K-M}Lf#hTf;4Oj~9o}&UP==*PxDa0;#>_h_;)2jkUkGBa05D^*B z<$h`T!M~XPr}{RFA{)w~sqkbDp1+}kM$x%Fjiwv9p=yQXZE4{z$2d3V-8jP)kdt3o zWU=TQTI%?QGfQBKU6v(%@&?$XScICohYmbd6ETJ7&(r?#bn&Xodip6Dov?T-@?RKGWATt%i2W9c-xcNx}!#5Jv>eyBK1!F6hu=(QsAxyF;4*0PfJ!FG! zf8h;;CZ$re5iZN65QBq(eyWa+>N=!is%)tT8Q|dKEZ`r{pfs{sF@fh54Gmrnm$tvT zu^|IU=cs`k>7pGkcUX)%@f}$vewIeY6Z+B0|)g&8cQzpQmj(CeLxo2wl z3e#|wSb^d%hZ_Z(=>=g0&F$yyNOguOM(C*xCZ&7;AyZ+qgz6oN2rD!*_2D&fUhUpK z*@1vKETG;D>~cbV_ZFa}Tu9YYC4jtN&jc0c%HX^yyd8hD$yhBLoigv3YL^V8xILckTfjXTHa~72XKVZ9 zN_EMPG8iO$qO>S=>(!mjnw^QrYd+*H5W<8UXj!Y~@d8Lj?f|4~v045b1Q@$0ojqIn zO$&tNfA`7dHR1YBnW3PU4hrnZ_@+ZdpK><3yn+ah+M}Z&_xcB20F?D&(&0Z<>wl-t znx!yL_n-_))pn=DU8%vVCmq-_A)oy)oB0emaG_00Lbgum-8L*YdT-d7fV5~AOUcJ| ziVv3FmCrBGJNY$M9;>zJ*J^2v$+&)CJazZ;-B+G%G0}GFI45~S%91AnLjTOEJ=mi7 zt1%93#{f3TWXbohp$4e7n$mn5Vh~o++F*NQ(eCr; zXv0j-+@{%1$m{=1iKOGvi9|kS%87X)lYKi9*Jg5N#kgYQBPcEg!5{nPnAQ=^viBdkL|Ftqo{3qp)p!Mv06-S^u7V>6_qHdS|oT^e~dNS>NVG zz5_`CETy>zU!J%P)_Cr1T$%CNGI^H_(r)UTw02|Dt<>cU`Kx`bo5)D73Nb1D5p{}i zU8OSB4QImfdFf};mk*WjrSOc#q@?Pa)nttr>#AP9kYK=!TPg8D&%d&U^*qYWQj}Rh z`Jmk2n-dj&TQ)W{F#Hd{doCUma|$lTZp`$xJ(Z*3TNzKFUmrrz47)`;rq9=p-dNHV z@tgtxbnBzutQHk}%U+cbYaD7S8UKr86k}|-Am>pvZLP`JEB|+&VR*y=aZ452#J{~4 zcP_c$Sb=MONSG6!5!M~M%K1-U`G{xxkXVib%l%0{PwLoObMNBpT+N=7Ct;}RUqD$4 ziHwk^+&5cFW=p=Ij(JdL=GnBi1X0H0H_KLBsagCW7hccU1_1!0AS(J@Uf>|54u$na zB`*fx><@3D2AOrd4uFjQYBxo zH3!C8uha1XbxG{pCqq8hdc{|IS*`^WyAh+F^YYRw189A?v;JU8N zZ33aZE8@_G(ZM~UFT9?K8K1|#=&b#hd)|Om`#Qb-ViM#1920Rds44F-xna#rP=elJ|nH~j#?os%^-bOG^q<`z*!?mWRMUIqvPVvh`-CX(eXkmb#m`19BmQ5QF9?)3zoJ?jSHSS$HS-c{Hb!rmtTT>2<(wvj%QDGa}mV1 zoA|Q8bu}5#0y!S;*ge|smilOZ*G0jqi+Z^E^EXKEMHGGM_YX&HW9EbaObMePQ1Cf+|i(gq642J#IwnAiZM*jiZA z*#gkh!CR=^1)>{iPTnrOGl@UULMn$}^Brl6_LoI+pLJlVKOvx(5il~?daaU5YAs*! z@i&Ms8PvJt$r6-fJZA1dk3{ z7}n?ve%tqE_L{2yx)7NHW1sf-yhyr4n%Ez%A(bG)=i@GPLVT1ZD&iFxqQ0;2Lh$tB zt+FawPBn5~-`YiC^07iyDxSUSWDbT)U2Wl8(}V0YtE`O1o^H)bdcWDUF!BdoLM)sMDj`N4)J@NP_ z%nv%?a<8z2CIH4&z5L_5?(AOZQ4*7L2d{(m4kbqr;mgy zNS-eSlcnr&iPi9rZCP4sNnyt@9!U02yGVMre7}J-^jndQ@rBm7KC5aN2}eLmvs%6P zqTO2ECN9}jh@5xuuSatoubDd0j0phFHMt`K9(1p+2S~KZ4M1W2AA9!c67Y5-`;Z*t(u}qo?P73tzF}io(&iC^?3LpPn0*y>qk3 zv?dd81-8RvaM2c!8y zM^tJf29MlkzC@){fq%UVnoP%!eEpc#8RKgR9|?Ysw@@27W-0yr0s)9bw(iMno>OgV z=}CliFJwEbS|VL;$d)e#$*GpKfWDf`3pe(2Y1S1-@I{a4q7m3rtEJAA@QmLlRQoGr zefZAI5!j#b0YwQN|2~q4>K&{+NzXe;MKc$-2ZxI)0_)e#r9d7alDDyv8RYtdd@=*C z@@=$e=@d#>^y5=J1(_EI(;O2=)zU36du5^ORXoxk?d1zx;is&CA3#bf_zs`7T2Cg<7tf3<{QMN1dQyB|-o$Ug7i0K98p z_Lj#bqHz=EI$2P{J7tdDF>3FGDX;l-=XkrmpSuMyt7AqrTPGC0LTb1|T_o2Rl8}mT z3w#>#y_|AbC=@Q$*rtidM7|IMDx#d7rl|StwQicI_}c?33K25?|Efpv$nR~ z;;8g)^EZEdpPrwMG}~DG+xO#kWEC0humafcHA#FUa%N^`8=lOdP*i!oHP1sQO)DSk z>xAk1K(VgU1HjtnP-s|T@=^62fmRLR(t~!_(urrt4;4;DWf{?!Tu2>z^#w*qyEC+) zzN=$e4%Z}DBjU9+Q<+h2hr@^ap>LC+3LZb9g8FS9p9O z9%m_D;D3;k(=DN=h{yapQ=>T*?>8&%QUNk6E*xj~^6MXej@Sg1u}3SmBUW%@%{BqS zN3ksz?EL*WYcYg>Im;iOXOb zWgv|-Z*phiaQp*4B}wd4m830)g8kBkkXsC-t6VdzuNQN~HPmmt#q7vbToJeMOlK$r z4)16SZpAMP7XRse6!sgre>B?y(XHw&Q-`5z344;KD?HFUDBuK}0bIp}Ja%Uig~eLR zVhBiGQ%1djU&2avwOb}uVgUAGz(vn}Hfrrb_=*Mytk5oEQpg)uJO4oeUcGn= z!H~QTkJ8!ecV_;ImI&~U~|g~`GR zXKUl{xxp`F4MXW(>X4S6>I{juWdXdB(azj(R_}9DEdYcEG#~!=A#kVJ@6ySy^Kasl z z#a}Pq_<9ULdqd{xc2}Onknc$_{-=C0? zjPdJjYvw1ysJdhNOu@DD(ciIx=5r8Ep_0?vB=qU7CoLWte}1 zV8P3{@*jUz*Y=F0$M9_ zn0;*UhQG=am`yR^r!AsOq^XHKS9n{UEJg2?;b^F_tvs!8?lskCg(YOm2N@iKG6z@KdxLmlH-~<>l|oE2qP5 z@jtCYa~bf}3RO?n&!nf*ovd6h@QH4M7k5kg1eAG5@0j_U4A20dHY-cMD`|D5h#6JJ zcWVUUli4@Vr{ygPO?^a6$uEdX$)Du2*2hYVcyE1hq#bU+RaP@oG%$D3!?seEGVS^V zF)xG=0w+WXlN1m$>KrV^7_9Z8w=UJpc~C$}QBs0yF(5XGWia0dQ4Y&)zi zch@N>Iq}flm+rdyE@tlqI)4reUFT=;o9mqJuX%Agg17Nq%?}>Xb2+JvGVVD%t||F?8^K@=rs*Wxv61x*=GoW~SWEg7(qadG zzJ=$`sraDLcQ9*A+pYvytPw2ki<5=Ywk38qcWJ=tPkzHa< ziQ{4-hzbo0)-J$b#a$L$>kPLdOJP1|B}TO7ym!wbPuOSk8lt{|XHUW%Bf;U*F2H|2 zP6}H+?)Z!?ll+9uuT`87M(A?PvHZXghrGNQz5nZnrNm*n&jV(5J*Kw5*xBeYVjw;G zqjm3KD3kS((nMGlm$CyRgHQslwvtF$x&N7%@-&<(%2bY;K`Ax*3eVYl_m?ob%aM zT9ya`8A=p*06_K}erNHrh;~P?eNr6#ip66oruR(Xg{WAi?9+%uj2z5$a32o;ve8Mb z=>xo6zY!LYg`1AB0CgC7j}n%4_*6UWM}OpLy^sgeU6#4BxtBo5#-s$rl7quZR89Dw zO0b2Zr+TUYBh*;uTt6fUQ;zc5AJtDc`9k9i!-RWfR5qI4pYn@8{EM=9DAUB?q?dCc zQ-PxiW(+^{5W(z}K!_jP7CGK(Z2w4W!1}ALBv(_JoM+a_rpcz>47eIE6+knt&bG+? z`;oKNP>a9=GSmR7{RtrJS#6d3T~r#8+@u4R5Jy!@ot=*FGA~OazW|=gdH{IBzr$g} z>=JF-M~y@;pHXul@&f6bo0a^@5WY-s1NUNrd~kBNE6Um(6rhRkY>&6QYIE5Z8TRKI zKngCFG7K@1I%_!#*Vzlwms9PM5ZyRg_~`hY|9x-$3?`p2Ugdiu<<-@2J6GE98Qn5W zF@KMLF_a~TEN8o40l*jGpLC#=>T!#+OHe_~&yvc|#myVvAhgyQGyyL?&ESL=f-Y8p zGAzQ_Wo(l!9@+9Tq=3dXvy#$cp?X{CWwHMpg`_#JV{a>okY(_HM3=vaoLN6iye%EaF8s0ZNstmzxhICT2QWU zTyqz_sw1YkK2=V9&Uv-1OmJ2348*iz{;8duQu+_B$JPI;UG>PrzX+lV)}__Cxxo`b zUQ!HeXwA!uOlqRIimq?bj(e2ss(OXQy!<=&UQpu4H)W0`hN0$+8g=)z7JbNB=1X?V z{HY0?=G>YX$F+J^+EtfW)!P7YYcmxX<+kKi9tvyT zfk_Wln+2X;p0{C!hxx@E8gySZwQL*k%T)5=W@&4e&@hzCVbXyl^(t2C`Wx+D&J*;r zF*W~mcmB0MbhQ5x@48N@$q>NzMy>u|*L6r*&naO7Et2o$7lG!t+Zv??n65h4JavqA z*44@Gkn4=*qDzfapZ1~i<>f6lnx0P7ysC?y`3n!zZX)!@dd@Dj$#cjORN8`j0To&k z9028+8tn=q;=^v}npRrPdQ7_HJjc!&1^>R~IbRv=_9UvSm4Bc)b}IxOS{xz2^}*(g z5>Xyvq}MS^IpHJ}OOf1|gf{H%>P2PKiNCyz(eNI3U;IFoP@TE5Fj92Br#;#KGNv(v zXZ7e^aCMdacW1A?d__q3=qZ{1y|Zg|V2mTB$H<}TX(+LpZKfDKMm!#!=XgLm)`v^w zWt6+yhNBO^qdC{CCo#HPuCBOgeNt&;sa+vu`>3$DElU;3<=^oGQC+kxe!V1oJ`T)l zumB!{;Nn2mQkODWMiFM34pzMs2$|>>-8=L(e9;=h1$i@Xc|bSN?EaItj(>_SpsU{c zgpx0@nI480by+qZ;nb(v*n4h3Vi8Y?Xno8V7T>b+G2=@cie2A4mbdPlICjan+#Gt2Vf+Qr7^Ne50 z&*6`tdi}mXQImR%RVHGLTSKOvm<_J9S)5d>qjjkf`7=XY%9-NW(oR?KL*zUQ(bX`0 zT|(M4geJ7u*uIO@`slAdma?DGZcg(peOsdw$%C6I$0)A`S3-98f4HTqdJ0h!v?cJ8 zJ1+}`X8eXRiNz|M-FVdTL|+F|6!Cd8I~}J#d`EF4{D#m|Z+@+Uz^EfxfU13d+%1b818sGS8&U1vZen5o3^+^VFK&G2@oH2_l1VgF9sc`KQ(ayk8 zLnar54H4jyP z43|ro54@NCX-?tdfop5BA!F-BzoV&+2x*lbxeG^J75_a5Kcxf&-KGuypG{%L^�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

RI^@xh!v(n$4L@L2V8W7 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 and should be included before this file. + */ + +#ifndef UTIL_H +#define UTIL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ +#define STR_HELPER(x) #x +#define STR(x) STR_HELPER(x) + +/* Include Files */ +#include "UTIL_CircularBuffer.h" + +/* Public Variables */ + +/* Public Functions */ + + +#ifdef __cplusplus +} +#endif + +#endif // UTIL_H diff --git a/2020TPCApp1.cydsn/UTIL/UTIL_CircularBuffer.c b/2020TPCApp1.cydsn/UTIL/UTIL_CircularBuffer.c new file mode 100644 index 0000000..fb1423f --- /dev/null +++ b/2020TPCApp1.cydsn/UTIL/UTIL_CircularBuffer.c @@ -0,0 +1,160 @@ +/** \file + * \brief This file implements a circular buffer. + * + */ + +/* Include Files */ +#include +#include +#include + +#include "FreeRTOS.h" +#include "task.h" + +#include "UTIL_CircularBuffer.h" + +/* Local Definitions */ + +/* Public Functions */ + +/* Public Data */ + +/* ******************* Module Level Information ********************* */ + +/* Private Function Prototypes */ + +/* Private Data */ + +/* Module Level Code */ + +//! Increments a value using modular arithmetic. +/*! + * \param value the value to be incremented + * \param modulus the modulus to use + * \return (value + 1) modulo modulus + */ +inline uint16_t ModuloIncrement(const uint16_t value, const uint16_t modulus) +{ + uint16_t nextValue = value + 1; + if (nextValue >= modulus) + { + nextValue = 0; + } + return (nextValue); +} + +//! Initializes the circular buffer, and clears the flags. +/*! + * \param this pointer to the circular buffer in question + * \param buffer pointer to the memory allocated to store this circular buffer + * \param size size (in bytes) of this circular buffer + */ +void UTIL_InitCircularBuffer(UTIL_CircularBuffer_T * const this, uint8_t * buffer, uint16_t size) +{ + this->buffer = buffer; + this->size = size; + this->head = 0; + this->tail = 0; + this->count = 0; + // Note that there is no need to zero out the actual buffer, + // since it will be overwritten when values are added. +} + +//! Adds a value to the end of the circular buffer. +/*! + * If the buffer is full, the value is dropped and the overflow flag is set. + * + * \param this pointer to the circular buffer in question + * \param value the value to be added to the buffer + */ +UTIL_CircularBufferResult_T UTIL_PushToCircularBuffer(UTIL_CircularBuffer_T * const this, uint8_t value) +{ + UTIL_CircularBufferResult_T result = UTIL_CIRCULARBUFFERRESULT_UNKNOWN; + + //UBaseType_t uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); + portDISABLE_INTERRUPTS(); + + if (this->count < this->size) + { + this->buffer[this->head] = value; + this->head = ModuloIncrement(this->head, this->size); + this->count++; + result = UTIL_CIRCULARBUFFERRESULT_SUCCESS; + } + else + { + result = UTIL_CIRCULARBUFFERRESULT_ERROR_OVERFLOW; + } + + portENABLE_INTERRUPTS(); + //taskEXIT_CRITICAL_FROM_ISR(uxSavedInterruptStatus); + + return result; +} + +//! Retrieves a value from the beginning of the circular buffer (FIFO). +/*! + * If the buffer is empty, zero is returned and the underflow flag is set. + * + * \param this pointer to the circular buffer in question + * \return the oldest value in the buffer + */ +UTIL_CircularBufferResult_T UTIL_PopFromCircularBuffer(UTIL_CircularBuffer_T * const this, uint8_t * const value) +{ + UTIL_CircularBufferResult_T result = UTIL_CIRCULARBUFFERRESULT_UNKNOWN; + + //UBaseType_t uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); + portDISABLE_INTERRUPTS(); + + if (this->count > 0) + { + *value = this->buffer[this->tail]; + this->tail = ModuloIncrement(this->tail, this->size); + this->count--; + result = UTIL_CIRCULARBUFFERRESULT_SUCCESS; + } + else + { + *value = 0; + result = UTIL_CIRCULARBUFFERRESULT_ERROR_UNDERFLOW; + } + + portENABLE_INTERRUPTS(); + //taskEXIT_CRITICAL_FROM_ISR(uxSavedInterruptStatus); + + return result; +} + +//! Determines whether or not the circular buffer is empty. +/*! + * \param this pointer to the circular buffer in question + * \return true if the buffer is empty; false otherwise + */ +bool UTIL_IsCircularBufferEmpty(UTIL_CircularBuffer_T * const this) +{ + bool result = false; + + if (this->count == 0) + { + result = true; + } + + return result; +} + +//! Determines whether or not the circular buffer is full. +/*! + * \param this pointer to the circular buffer in question + * \return true if the buffer is full; false otherwise + */ +bool UTIL_IsCircularBufferFull(UTIL_CircularBuffer_T * const this) +{ + bool result = false; + + if (this->count >= this->size) + { + result = true; + } + + return result; +} diff --git a/2020TPCApp1.cydsn/UTIL/UTIL_CircularBuffer.h b/2020TPCApp1.cydsn/UTIL/UTIL_CircularBuffer.h new file mode 100644 index 0000000..1e5fa9b --- /dev/null +++ b/2020TPCApp1.cydsn/UTIL/UTIL_CircularBuffer.h @@ -0,0 +1,41 @@ +/** \file + * \brief This file contains definitions for a circular buffer. + * + */ + +#ifndef UTIL_CIRCULARBUFFER_H +#define UTIL_CIRCULARBUFFER_H + +/* Definitions */ + +typedef enum +{ + //! The result could not be determined. + UTIL_CIRCULARBUFFERRESULT_UNKNOWN = 0, + //! The requested action completed successfully. + UTIL_CIRCULARBUFFERRESULT_SUCCESS, + //! There is no more room in the buffer. + UTIL_CIRCULARBUFFERRESULT_ERROR_OVERFLOW, + //! There is no data left in the buffer. + UTIL_CIRCULARBUFFERRESULT_ERROR_UNDERFLOW +} UTIL_CircularBufferResult_T; + +//! Circular buffer data structure. +typedef struct +{ + uint8_t * buffer; + uint16_t size; + volatile uint16_t head; + volatile uint16_t tail; + volatile uint16_t count; +} UTIL_CircularBuffer_T; + +/* Function Declarations */ + +void UTIL_InitCircularBuffer(UTIL_CircularBuffer_T * const this, uint8_t * buffer, uint16_t size); +UTIL_CircularBufferResult_T UTIL_PushToCircularBuffer(UTIL_CircularBuffer_T * const this, uint8_t value); +UTIL_CircularBufferResult_T UTIL_PopFromCircularBuffer(UTIL_CircularBuffer_T * const this, uint8_t * const value); +bool UTIL_IsCircularBufferEmpty(UTIL_CircularBuffer_T * const this); +bool UTIL_IsCircularBufferFull(UTIL_CircularBuffer_T * const this); + +#endif // UTIL_CIRCULARBUFFER_H diff --git a/2020TPCApp1.cydsn/common.h b/2020TPCApp1.cydsn/common.h new file mode 100644 index 0000000..be6c623 --- /dev/null +++ b/2020TPCApp1.cydsn/common.h @@ -0,0 +1,94 @@ +/******************************************************************************* +* File Name: common.h +* +* Version 1.0 +* +* Description: +* Contains the function prototypes and constants available to the example +* project. +* +******************************************************************************** +* Copyright 2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ +#ifndef COMMON_H +#define COMMON_H + +#include +#include + +/*************************************** +* Conditional Compilation Parameters +***************************************/ +#define ENABLED (1u) +#define DISABLED (0u) +#define DEBUG_UART_ENABLED ENABLED + + +/*************************************** +* API Constants +***************************************/ +#define ADV_TIMER_TIMEOUT (1u) /* Сounts in seconds */ +#define SW2_PRESS_TIME_DEL_BOND_LIST (0x04u) + +/* BAS service defines */ +#define BATTERY_TIMEOUT (30u) /* Battery simulation timeout */ + +/*************************************** +* External Function Prototypes +***************************************/ +int HostMain(void); + +/* Function prototypes from debug.c */ +void ShowValue(cy_stc_ble_gatt_value_t *value); +char HexToAscii(uint8_t value, uint8_t nibble); +void Set32ByPtr(uint8_t ptr[], uint32_t value); +void PrintStackVersion(void); +void PrintApiResult(cy_en_ble_api_result_t apiResult); +void ShowError(void); + +/* Function prototypes from bond.c */ +void App_DisplayBondList(void); +void App_RemoveDevicesFromBondListBySW2Press(uint32_t seconds); +void App_RemoveDevicesFromBondList(void); +void App_SetRemoveBondListFlag(void); +bool App_IsRemoveBondListFlag(void); +bool App_IsDeviceInBondList(uint32_t bdHandle); +uint32_t App_GetCountOfBondedDevices(void); + + +/*************************************** +* UART_DEB Macros / prototypes +***************************************/ +#if (DEBUG_UART_ENABLED == ENABLED) + #define DBG_PRINTF(...) (printf(__VA_ARGS__)) + #define UART_DEB_PUT_CHAR(...) while(1UL != UART_DEB_Put(__VA_ARGS__)) + #define UART_DEB_GET_CHAR(...) (UART_DEB_Get()) + #define UART_DEB_IS_TX_COMPLETE(...) (UART_DEB_IsTxComplete()) + #define UART_DEB_WAIT_TX_COMPLETE(...) while(UART_DEB_IS_TX_COMPLETE() == 0) ; + #define UART_DEB_SCB_CLEAR_RX_FIFO(...) (Cy_SCB_ClearRxFifo(UART_DEB_SCB__HW)) + #define UART_START(...) (UART_DEB_Start(__VA_ARGS__)) +#else + #define DBG_PRINTF(...) + #define UART_DEB_PUT_CHAR(...) + #define UART_DEB_GET_CHAR(...) (0u) + #define UART_DEB_IS_TX_COMPLETE(...) (1u) + #define UART_DEB_WAIT_TX_COMPLETE(...) (0u) + #define UART_DEB_SCB_CLEAR_RX_FIFO(...) (0u) + #define UART_START(...) +#endif /* (DEBUG_UART_ENABLED == ENABLED) */ + +#define UART_DEB_NO_DATA (char8) CY_SCB_UART_RX_NO_DATA + + +/*************************************** +* External data references +***************************************/ +extern cy_stc_ble_conn_handle_t appConnHandle; + + +#endif /* COMMON_H */ + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/cy8c6xx7_cm0plus.icf b/2020TPCApp1.cydsn/cy8c6xx7_cm0plus.icf new file mode 100644 index 0000000..71ba887 --- /dev/null +++ b/2020TPCApp1.cydsn/cy8c6xx7_cm0plus.icf @@ -0,0 +1,218 @@ +/***************************************************************************//** +* \file cy8c6xx7_cm0plus.icf +* \version 2.20 +* +* Linker file for the IAR compiler. +* +* The main purpose of the linker script is to describe how the sections in the +* input files should be mapped into the output file, and to control the memory +* layout of the output file. +* +* \note The entry point is fixed and starts at 0x10000000. The valid application +* image should be placed there. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case you may see warnings during the +* build process. In your project, you can simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x00000000; + +/* The symbols below define the location and size of blocks of memory in the target. + * Use these symbols to specify the memory regions available for allocation. + */ + +/* The following symbols control RAM and flash memory allocation for the CM0+ core. + * You can change the memory allocation by editing RAM and Flash symbols. + * Your changes must be aligned with the corresponding symbols for CM4 core in 'xx_cm4_dual.icf', + * where 'xx' is the device group; for example, 'cy8c6xx7_cm4_dual.icf'. + */ +/* RAM */ +define symbol __ICFEDIT_region_IRAM1_start__ = 0x08000000; +define symbol __ICFEDIT_region_IRAM1_end__ = 0x08024000; +/* Flash */ +define symbol __ICFEDIT_region_IROM1_start__ = 0x10000000; +define symbol __ICFEDIT_region_IROM1_end__ = 0x10080000; + +/* The following symbols define a 32K flash region used for EEPROM emulation. + * This region can also be used as the general purpose flash. + * You can assign sections to this memory region for only one of the cores. + * Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. + * Therefore, repurposing this memory region will prevent such middleware from operation. + */ +define symbol __ICFEDIT_region_IROM2_start__ = 0x14000000; +define symbol __ICFEDIT_region_IROM2_end__ = 0x14007FFF; + +/* The following symbols define device specific memory regions and must not be changed. */ +/* Supervisory FLASH - User Data */ +define symbol __ICFEDIT_region_IROM3_start__ = 0x16000800; +define symbol __ICFEDIT_region_IROM3_end__ = 0x160007FF; + +/* Supervisory FLASH - Normal Access Restrictions (NAR) */ +define symbol __ICFEDIT_region_IROM4_start__ = 0x16001A00; +define symbol __ICFEDIT_region_IROM4_end__ = 0x16001BFF; + +/* Supervisory FLASH - Public Key */ +define symbol __ICFEDIT_region_IROM5_start__ = 0x16005A00; +define symbol __ICFEDIT_region_IROM5_end__ = 0x160065FF; + +/* Supervisory FLASH - Table of Content # 2 */ +define symbol __ICFEDIT_region_IROM6_start__ = 0x16007C00; +define symbol __ICFEDIT_region_IROM6_end__ = 0x16007DFF; + +/* Supervisory FLASH - Table of Content # 2 Copy */ +define symbol __ICFEDIT_region_IROM7_start__ = 0x16007E00; +define symbol __ICFEDIT_region_IROM7_end__ = 0x16007FFF; + +/* eFuse */ +define symbol __ICFEDIT_region_IROM8_start__ = 0x90700000; +define symbol __ICFEDIT_region_IROM8_end__ = 0x907FFFFF; + +/* XIP */ +define symbol __ICFEDIT_region_EROM1_start__ = 0x18000000; +define symbol __ICFEDIT_region_EROM1_end__ = 0x1FFFFFFF; + +define symbol __ICFEDIT_region_EROM2_start__ = 0x0; +define symbol __ICFEDIT_region_EROM2_end__ = 0x0; +define symbol __ICFEDIT_region_EROM3_start__ = 0x0; +define symbol __ICFEDIT_region_EROM3_end__ = 0x0; + + +define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; +define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM1_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM1_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM2_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM2_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; +/*-Sizes-*/ +if (!isdefinedsymbol(__STACK_SIZE)) { + define symbol __ICFEDIT_size_cstack__ = 0x1000; +} else { + define symbol __ICFEDIT_size_cstack__ = __STACK_SIZE; +} +define symbol __ICFEDIT_size_proc_stack__ = 0x0; +if (!isdefinedsymbol(__HEAP_SIZE)) { + define symbol __ICFEDIT_size_heap__ = 0x0400; +} else { + define symbol __ICFEDIT_size_heap__ = __HEAP_SIZE; +} +/**** End of ICF editor section. ###ICF###*/ + + +define memory mem with size = 4G; +define region IROM1_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__]; +define region IROM2_region = mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__]; +define region IROM3_region = mem:[from __ICFEDIT_region_IROM3_start__ to __ICFEDIT_region_IROM3_end__]; +define region IROM4_region = mem:[from __ICFEDIT_region_IROM4_start__ to __ICFEDIT_region_IROM4_end__]; +define region IROM5_region = mem:[from __ICFEDIT_region_IROM5_start__ to __ICFEDIT_region_IROM5_end__]; +define region IROM6_region = mem:[from __ICFEDIT_region_IROM6_start__ to __ICFEDIT_region_IROM6_end__]; +define region IROM7_region = mem:[from __ICFEDIT_region_IROM7_start__ to __ICFEDIT_region_IROM7_end__]; +define region IROM8_region = mem:[from __ICFEDIT_region_IROM8_start__ to __ICFEDIT_region_IROM8_end__]; +define region EROM1_region = mem:[from __ICFEDIT_region_EROM1_start__ to __ICFEDIT_region_EROM1_end__]; +define region IRAM1_region = mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; +define block HSTACK {block HEAP, block PROC_STACK, last block CSTACK}; +define block RO {first section .intvec, readonly}; + +/*-Initializations-*/ +initialize by copy { readwrite }; +do not initialize { section .noinit, section .intvec_ram }; + + +/*-Placement-*/ + +/* Flash */ +".cy_app_header" : place at start of IROM1_region { section .cy_app_header }; +place in IROM1_region { block RO }; + +/* Emulated EEPROM Flash area */ +".cy_em_eeprom" : place at start of IROM2_region { section .cy_em_eeprom }; + +/* Supervisory Flash - User Data */ +".cy_sflash_user_data" : place at start of IROM3_region { section .cy_sflash_user_data }; + +/* Supervisory Flash - NAR */ +".cy_sflash_nar" : place at start of IROM4_region { section .cy_sflash_nar }; + +/* Supervisory Flash - Public Key */ +".cy_sflash_public_key" : place at start of IROM5_region { section .cy_sflash_public_key }; + +/* Supervisory Flash - TOC2 */ +".cy_toc_part2" : place at start of IROM6_region { section .cy_toc_part2 }; + +/* Supervisory Flash - RTOC2 */ +".cy_rtoc_part2" : place at start of IROM7_region { section .cy_rtoc_part2 }; + +/* eFuse */ +".cy_efuse" : place at start of IROM8_region { section .cy_efuse }; + +/* Execute in Place (XIP). See the smif driver documentation for details. */ +".cy_xip" : place at start of EROM1_region { section .cy_xip }; + +/* RAM */ +place at start of IRAM1_region { readwrite section .intvec_ram}; +place in IRAM1_region { readwrite }; +place at end of IRAM1_region { block HSTACK }; + +/* These sections are used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. */ +".cymeta" : place at address mem : 0x90500000 { readonly section .cymeta }; + + +keep { section .cy_app_header, + section .cy_em_eeprom, + section .cy_sflash_user_data, + section .cy_sflash_nar, + section .cy_sflash_public_key, + section .cy_toc_part2, + section .cy_rtoc_part2, + section .cy_efuse, + section .cy_xip, + section .cymeta, + }; + + +/* The following symbols used by the cymcuelftool. */ +/* Flash */ +define exported symbol __cy_memory_0_start = 0x10000000; +define exported symbol __cy_memory_0_length = 0x00100000; +define exported symbol __cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +define exported symbol __cy_memory_1_start = 0x14000000; +define exported symbol __cy_memory_1_length = 0x8000; +define exported symbol __cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +define exported symbol __cy_memory_2_start = 0x16000000; +define exported symbol __cy_memory_2_length = 0x8000; +define exported symbol __cy_memory_2_row_size = 0x200; + +/* XIP */ +define exported symbol __cy_memory_3_start = 0x18000000; +define exported symbol __cy_memory_3_length = 0x08000000; +define exported symbol __cy_memory_3_row_size = 0x200; + +/* eFuse */ +define exported symbol __cy_memory_4_start = 0x90700000; +define exported symbol __cy_memory_4_length = 0x100000; +define exported symbol __cy_memory_4_row_size = 1; + +/* EOF */ diff --git a/2020TPCApp1.cydsn/cy8c6xx7_cm0plus.ld b/2020TPCApp1.cydsn/cy8c6xx7_cm0plus.ld new file mode 100644 index 0000000..90fb447 --- /dev/null +++ b/2020TPCApp1.cydsn/cy8c6xx7_cm0plus.ld @@ -0,0 +1,402 @@ +/***************************************************************************//** +* \file cy8c6xx7_cm0plus.ld +* \version 2.20 +* +* Linker file for the GNU C compiler. +* +* The main purpose of the linker script is to describe how the sections in the +* input files should be mapped into the output file, and to control the memory +* layout of the output file. +* +* \note The entry point location is fixed and starts at 0x10000000. The valid +* application image should be placed there. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case you may see warnings during the +* build process. In your project, you can simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +SEARCH_DIR(.) +GROUP(-lgcc -lc -lnosys) +ENTRY(Reset_Handler) + + +/* Force symbol to be entered in the output file as an undefined symbol. Doing +* this may, for example, trigger linking of additional modules from standard +* libraries. You may list several symbols for each EXTERN, and you may use +* EXTERN multiple times. This command has the same effect as the -u command-line +* option. +*/ +EXTERN(Reset_Handler) + +/* The MEMORY section below describes the location and size of blocks of memory in the target. +* Use this section to specify the memory regions available for allocation. +*/ +MEMORY +{ + /* The ram and flash regions control RAM and flash memory allocation for the CM0+ core. + * You can change the memory allocation by editing the 'ram' and 'flash' regions. + * Your changes must be aligned with the corresponding memory regions for the CM4 core in 'xx_cm4_dual.ld', + * where 'xx' is the device group; for example, 'cy8c6xx7_cm4_dual.ld'. + */ + ram (rwx) : ORIGIN = 0x08000000, LENGTH = 0x24000 + flash (rx) : ORIGIN = 0x10000000, LENGTH = 0x80000 + + /* This is a 32K flash region used for EEPROM emulation. This region can also be used as the general purpose flash. + * You can assign sections to this memory region for only one of the cores. + * Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. + * Therefore, repurposing this memory region will prevent such middleware from operation. + */ + em_eeprom (rx) : ORIGIN = 0x14000000, LENGTH = 0x4000 /* 16 KB */ + + /* The following regions define device specific memory regions and must not be changed. */ + sflash_user_data (rx) : ORIGIN = 0x16000800, LENGTH = 0x800 /* Supervisory flash: User data */ + sflash_nar (rx) : ORIGIN = 0x16001A00, LENGTH = 0x200 /* Supervisory flash: Normal Access Restrictions (NAR) */ + sflash_public_key (rx) : ORIGIN = 0x16005A00, LENGTH = 0xC00 /* Supervisory flash: Public Key */ + sflash_toc_2 (rx) : ORIGIN = 0x16007C00, LENGTH = 0x200 /* Supervisory flash: Table of Content # 2 */ + sflash_rtoc_2 (rx) : ORIGIN = 0x16007E00, LENGTH = 0x200 /* Supervisory flash: Table of Content # 2 Copy */ + xip (rx) : ORIGIN = 0x18000000, LENGTH = 0x8000000 /* 128 MB */ + efuse (r) : ORIGIN = 0x90700000, LENGTH = 0x100000 /* 1 MB */ +} + +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a libnosys.a) + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __Vectors_End + * __Vectors_Size + */ + + +SECTIONS +{ + .cy_app_header : + { + KEEP(*(.cy_app_header)) + } > flash + + .text : + { + . = ALIGN(4); + __Vectors = . ; + KEEP(*(.vectors)) + . = ALIGN(4); + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + __end__ = .; + + . = ALIGN(4); + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + /* Read-only code (constants). */ + *(.rodata .rodata.* .constdata .constdata.* .conststring .conststring.*) + + KEEP(*(.eh_frame*)) + } > flash + + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > flash + + __exidx_start = .; + + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > flash + __exidx_end = .; + + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_psoc6_01_cm0plus.S */ + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + + /* Copy interrupt vectors from flash to RAM */ + LONG (__Vectors) /* From */ + LONG (__ram_vectors_start__) /* To */ + LONG (__Vectors_End - __Vectors) /* Size */ + + /* Copy data section to RAM */ + LONG (__etext) /* From */ + LONG (__data_start__) /* To */ + LONG (__data_end__ - __data_start__) /* Size */ + + __copy_table_end__ = .; + } > flash + + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_psoc6_01_cm0plus.S */ + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + __zero_table_end__ = .; + } > flash + + __etext = . ; + + + .ramVectors (NOLOAD) : ALIGN(8) + { + __ram_vectors_start__ = .; + KEEP(*(.ram_vectors)) + __ram_vectors_end__ = .; + } > ram + + + .data __ram_vectors_end__ : AT (__etext) + { + __data_start__ = .; + + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + + KEEP(*(.cy_ramfunc*)) + . = ALIGN(4); + + __data_end__ = .; + + } > ram + + + /* Place variables in the section that should not be initialized during the + * device startup. + */ + .noinit (NOLOAD) : ALIGN(8) + { + KEEP(*(.noinit)) + } > ram + + + /* The uninitialized global or static variables are placed in this section. + * + * The NOLOAD attribute tells linker that .bss section does not consume + * any space in the image. The NOLOAD attribute changes the .bss type to + * NOBITS, and that makes linker to A) not allocate section in memory, and + * A) put information to clear the section with all zeros during application + * loading. + * + * Without the NOLOAD attribute, the .bss section might get PROGBITS type. + * This makes linker to A) allocate zeroed section in memory, and B) copy + * this section to RAM during application loading. + */ + .bss (NOLOAD): + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > ram + + + .heap (NOLOAD): + { + __HeapBase = .; + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + __HeapLimit = .; + } > ram + + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (NOLOAD): + { + KEEP(*(.stack*)) + } > ram + + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(ram) + LENGTH(ram); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") + + + /* Emulated EEPROM Flash area */ + .cy_em_eeprom : + { + KEEP(*(.cy_em_eeprom)) + } > em_eeprom + + + /* Supervisory Flash: User data */ + .cy_sflash_user_data : + { + KEEP(*(.cy_sflash_user_data)) + } > sflash_user_data + + + /* Supervisory Flash: Normal Access Restrictions (NAR) */ + .cy_sflash_nar : + { + KEEP(*(.cy_sflash_nar)) + } > sflash_nar + + + /* Supervisory Flash: Public Key */ + .cy_sflash_public_key : + { + KEEP(*(.cy_sflash_public_key)) + } > sflash_public_key + + + /* Supervisory Flash: Table of Content # 2 */ + .cy_toc_part2 : + { + KEEP(*(.cy_toc_part2)) + } > sflash_toc_2 + + + /* Supervisory Flash: Table of Content # 2 Copy */ + .cy_rtoc_part2 : + { + KEEP(*(.cy_rtoc_part2)) + } > sflash_rtoc_2 + + + /* Places the code in the Execute in Place (XIP) section. See the smif driver + * documentation for details. + */ + .cy_xip : + { + KEEP(*(.cy_xip)) + } > xip + + + /* eFuse */ + .cy_efuse : + { + KEEP(*(.cy_efuse)) + } > efuse + + + /* These sections are used for additional metadata (silicon revision, + * Silicon/JTAG ID, etc.) storage. + */ + .cymeta 0x90500000 : { KEEP(*(.cymeta)) } :NONE +} + + +/* The following symbols used by the cymcuelftool. */ +/* Flash */ +__cy_memory_0_start = 0x10000000; +__cy_memory_0_length = 0x00100000; +__cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +__cy_memory_1_start = 0x14000000; +__cy_memory_1_length = 0x8000; +__cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +__cy_memory_2_start = 0x16000000; +__cy_memory_2_length = 0x8000; +__cy_memory_2_row_size = 0x200; + +/* XIP */ +__cy_memory_3_start = 0x18000000; +__cy_memory_3_length = 0x08000000; +__cy_memory_3_row_size = 0x200; + +/* eFuse */ +__cy_memory_4_start = 0x90700000; +__cy_memory_4_length = 0x100000; +__cy_memory_4_row_size = 1; + +/* EOF */ diff --git a/2020TPCApp1.cydsn/cy8c6xx7_cm0plus.scat b/2020TPCApp1.cydsn/cy8c6xx7_cm0plus.scat new file mode 100644 index 0000000..6c49340 --- /dev/null +++ b/2020TPCApp1.cydsn/cy8c6xx7_cm0plus.scat @@ -0,0 +1,207 @@ +#! armcc -E +; The first line specifies a preprocessor command that the linker invokes +; to pass a scatter file through a C preprocessor. + +;******************************************************************************* +;* \file cy8c6xx7_cm0plus.scat +;* \version 2.20 +;* +;* Linker file for the ARMCC. +;* +;* The main purpose of the linker script is to describe how the sections in the +;* input files should be mapped into the output file, and to control the memory +;* layout of the output file. +;* +;* \note The entry point location is fixed and starts at 0x10000000. The valid +;* application image should be placed there. +;* +;* \note The linker files included with the PDL template projects must be +;* generic and handle all common use cases. Your project may not use every +;* section defined in the linker files. In that case you may see the warnings +;* during the build process: L6314W (no section matches pattern) and/or L6329W +;* (pattern only matches removed unused sections). In your project, you can +;* suppress the warning by passing the "--diag_suppress=L6314W,L6329W" option to +;* the linker, simply comment out or remove the relevant code in the linker +;* file. +;* +;******************************************************************************* +;* \copyright +;* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +;* You may use this file only in accordance with the license, terms, conditions, +;* disclaimers, and limitations in the end user license agreement accompanying +;* the software package with which this file was provided. +;******************************************************************************/ + +; The defines below describe the location and size of blocks of memory in the target. +; Use these defines to specify the memory regions available for allocation. + +; The following defines control RAM and flash memory allocation for the CM0+ core. +; You can change the memory allocation by editing the RAM and Flash defines. +; Your changes must be aligned with the corresponding defines for the CM4 core in 'xx_cm4_dual.scat', +; where 'xx' is the device group; for example, 'cy8c6xx7_cm4_dual.scat'. +; RAM +#define RAM_START 0x08000000 +#define RAM_SIZE 0x00024000 +; Flash +#define FLASH_START 0x10000000 +#define FLASH_SIZE 0x00080000 + +; The following defines describe a 32K flash region used for EEPROM emulation. +; This region can also be used as the general purpose flash. +; You can assign sections to this memory region for only one of the cores. +; Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. +; Therefore, repurposing this memory region will prevent such middleware from operation. +#define EM_EEPROM_START 0x14000000 +#define EM_EEPROM_SIZE 0x8000 + +; The following defines describe device specific memory regions and must not be changed. +; Supervisory flash: User data +#define SFLASH_USER_DATA_START 0x16000800 +#define SFLASH_USER_DATA_SIZE 0x00000800 + +; Supervisory flash: Normal Access Restrictions (NAR) +#define SFLASH_NAR_START 0x16001A00 +#define SFLASH_NAR_SIZE 0x00000200 + +; Supervisory flash: Public Key +#define SFLASH_PUBLIC_KEY_START 0x16005A00 +#define SFLASH_PUBLIC_KEY_SIZE 0x00000C00 + +; Supervisory flash: Table of Content # 2 +#define SFLASH_TOC_2_START 0x16007C00 +#define SFLASH_TOC_2_SIZE 0x00000200 + +; Supervisory flash: Table of Content # 2 Copy +#define SFLASH_RTOC_2_START 0x16007E00 +#define SFLASH_RTOC_2_SIZE 0x00000200 + +; External memory +#define XIP_START 0x18000000 +#define XIP_SIZE 0x08000000 + +; eFuse +#define EFUSE_START 0x90700000 +#define EFUSE_SIZE 0x100000 + + +LR_FLASH FLASH_START FLASH_SIZE +{ + .cy_app_header +0 + { + * (.cy_app_header) + } + + ER_FLASH_VECTORS +0 + { + * (RESET, +FIRST) + } + + ER_FLASH_CODE +0 FIXED + { + * (InRoot$$Sections) + * (+RO) + } + + ER_RAM_VECTORS RAM_START UNINIT + { + * (RESET_RAM, +FIRST) + } + + ER_RAM_DATA +0 + { + * (.cy_ramfunc) + .ANY (+RW, +ZI) + } + + ; Place variables in the section that should not be initialized during the + ; device startup. + ER_RAM_NOINIT_DATA +0 UNINIT + { + * (.noinit) + } +} + + +; Emulated EEPROM Flash area +LR_EM_EEPROM EM_EEPROM_START EM_EEPROM_SIZE +{ + .cy_em_eeprom +0 + { + * (.cy_em_eeprom) + } +} + +; Supervisory flash: User data +LR_SFLASH_USER_DATA SFLASH_USER_DATA_START SFLASH_USER_DATA_SIZE +{ + .cy_sflash_user_data +0 + { + * (.cy_sflash_user_data) + } +} + +; Supervisory flash: Normal Access Restrictions (NAR) +LR_SFLASH_NAR SFLASH_NAR_START SFLASH_NAR_SIZE +{ + .cy_sflash_nar +0 + { + * (.cy_sflash_nar) + } +} + +; Supervisory flash: Public Key +LR_SFLASH_PUBLIC_KEY SFLASH_PUBLIC_KEY_START SFLASH_PUBLIC_KEY_SIZE +{ + .cy_sflash_public_key +0 + { + * (.cy_sflash_public_key) + } +} + +; Supervisory flash: Table of Content # 2 +LR_SFLASH_TOC_2 SFLASH_TOC_2_START SFLASH_TOC_2_SIZE +{ + .cy_toc_part2 +0 + { + * (.cy_toc_part2) + } +} + +; Supervisory flash: Table of Content # 2 Copy +LR_SFLASH_RTOC_2 SFLASH_RTOC_2_START SFLASH_RTOC_2_SIZE +{ + .cy_rtoc_part2 +0 + { + * (.cy_rtoc_part2) + } +} + + +; Places the code in the Execute in Place (XIP) section. See the smif driver documentation for details. +LR_EROM XIP_START XIP_SIZE +{ + .cy_xip +0 + { + * (.cy_xip) + } +} + + +; eFuse +LR_EFUSE EFUSE_START EFUSE_SIZE +{ + .cy_efuse +0 + { + * (.cy_efuse) + } +} + + +; The section is used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. +CYMETA 0x90500000 +{ + .cymeta +0 { * (.cymeta) } +} + + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/cy8c6xx7_cm4_dual.icf b/2020TPCApp1.cydsn/cy8c6xx7_cm4_dual.icf new file mode 100644 index 0000000..0f831e7 --- /dev/null +++ b/2020TPCApp1.cydsn/cy8c6xx7_cm4_dual.icf @@ -0,0 +1,219 @@ +/***************************************************************************//** +* \file cy8c6xx7_cm4_dual.icf +* \version 2.20 +* +* Linker file for the IAR compiler. +* +* The main purpose of the linker script is to describe how the sections in the +* input files should be mapped into the output file, and to control the memory +* layout of the output file. +* +* \note The entry point is fixed and starts at 0x10000000. The valid application +* image should be placed there. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case you may see warnings during the +* build process. In your project, you can simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x00000000; + +/* The symbols below define the location and size of blocks of memory in the target. + * Use these symbols to specify the memory regions available for allocation. + */ + +/* The following symbols control RAM and flash memory allocation for the CM4 core. + * You can change the memory allocation by editing RAM and Flash symbols. + * Note that 2 KB of RAM (at the end of the RAM section) are reserved for system use. + * Using this memory region for other purposes will lead to unexpected behavior. + * Your changes must be aligned with the corresponding symbols for CM0+ core in 'xx_cm0plus.icf', + * where 'xx' is the device group; for example, 'cy8c6xx7_cm0plus.icf'. + */ +/* RAM */ +define symbol __ICFEDIT_region_IRAM1_start__ = 0x08024000; +define symbol __ICFEDIT_region_IRAM1_end__ = 0x08047800; +/* Flash */ +define symbol __ICFEDIT_region_IROM1_start__ = 0x10080000; +define symbol __ICFEDIT_region_IROM1_end__ = 0x10100000; + +/* The following symbols define a 32K flash region used for EEPROM emulation. + * This region can also be used as the general purpose flash. + * You can assign sections to this memory region for only one of the cores. + * Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. + * Therefore, repurposing this memory region will prevent such middleware from operation. + */ +define symbol __ICFEDIT_region_IROM2_start__ = 0x14000000; +define symbol __ICFEDIT_region_IROM2_end__ = 0x14007FFF; + +/* The following symbols define device specific memory regions and must not be changed. */ +/* Supervisory FLASH - User Data */ +define symbol __ICFEDIT_region_IROM3_start__ = 0x16000800; +define symbol __ICFEDIT_region_IROM3_end__ = 0x160007FF; + +/* Supervisory FLASH - Normal Access Restrictions (NAR) */ +define symbol __ICFEDIT_region_IROM4_start__ = 0x16001A00; +define symbol __ICFEDIT_region_IROM4_end__ = 0x16001BFF; + +/* Supervisory FLASH - Public Key */ +define symbol __ICFEDIT_region_IROM5_start__ = 0x16005A00; +define symbol __ICFEDIT_region_IROM5_end__ = 0x160065FF; + +/* Supervisory FLASH - Table of Content # 2 */ +define symbol __ICFEDIT_region_IROM6_start__ = 0x16007C00; +define symbol __ICFEDIT_region_IROM6_end__ = 0x16007DFF; + +/* Supervisory FLASH - Table of Content # 2 Copy */ +define symbol __ICFEDIT_region_IROM7_start__ = 0x16007E00; +define symbol __ICFEDIT_region_IROM7_end__ = 0x16007FFF; + +/* eFuse */ +define symbol __ICFEDIT_region_IROM8_start__ = 0x90700000; +define symbol __ICFEDIT_region_IROM8_end__ = 0x907FFFFF; + +/* XIP */ +define symbol __ICFEDIT_region_EROM1_start__ = 0x18000000; +define symbol __ICFEDIT_region_EROM1_end__ = 0x1FFFFFFF; + +define symbol __ICFEDIT_region_EROM2_start__ = 0x0; +define symbol __ICFEDIT_region_EROM2_end__ = 0x0; +define symbol __ICFEDIT_region_EROM3_start__ = 0x0; +define symbol __ICFEDIT_region_EROM3_end__ = 0x0; + + +define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; +define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM1_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM1_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM2_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM2_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; +/*-Sizes-*/ +if (!isdefinedsymbol(__STACK_SIZE)) { + define symbol __ICFEDIT_size_cstack__ = 0x1000; +} else { + define symbol __ICFEDIT_size_cstack__ = __STACK_SIZE; +} +define symbol __ICFEDIT_size_proc_stack__ = 0x0; +if (!isdefinedsymbol(__HEAP_SIZE)) { + define symbol __ICFEDIT_size_heap__ = 0x0400; +} else { + define symbol __ICFEDIT_size_heap__ = __HEAP_SIZE; +} +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region IROM1_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__]; +define region IROM2_region = mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__]; +define region IROM3_region = mem:[from __ICFEDIT_region_IROM3_start__ to __ICFEDIT_region_IROM3_end__]; +define region IROM4_region = mem:[from __ICFEDIT_region_IROM4_start__ to __ICFEDIT_region_IROM4_end__]; +define region IROM5_region = mem:[from __ICFEDIT_region_IROM5_start__ to __ICFEDIT_region_IROM5_end__]; +define region IROM6_region = mem:[from __ICFEDIT_region_IROM6_start__ to __ICFEDIT_region_IROM6_end__]; +define region IROM7_region = mem:[from __ICFEDIT_region_IROM7_start__ to __ICFEDIT_region_IROM7_end__]; +define region IROM8_region = mem:[from __ICFEDIT_region_IROM8_start__ to __ICFEDIT_region_IROM8_end__]; +define region EROM1_region = mem:[from __ICFEDIT_region_EROM1_start__ to __ICFEDIT_region_EROM1_end__]; +define region IRAM1_region = mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; +define block HSTACK {block HEAP, block PROC_STACK, last block CSTACK}; +define block RO {first section .intvec, readonly}; + +/*-Initializations-*/ +initialize by copy { readwrite }; +do not initialize { section .noinit, section .intvec_ram }; + + +/*-Placement-*/ + +/* Flash */ +place at start of IROM1_region { block RO }; +".cy_app_signature" : place at address (__ICFEDIT_region_IROM1_end__ - 0x200) { section .cy_app_signature }; + +/* Emulated EEPROM Flash area */ +".cy_em_eeprom" : place at start of IROM2_region { section .cy_em_eeprom }; + +/* Supervisory Flash - User Data */ +".cy_sflash_user_data" : place at start of IROM3_region { section .cy_sflash_user_data }; + +/* Supervisory Flash - NAR */ +".cy_sflash_nar" : place at start of IROM4_region { section .cy_sflash_nar }; + +/* Supervisory Flash - Public Key */ +".cy_sflash_public_key" : place at start of IROM5_region { section .cy_sflash_public_key }; + +/* Supervisory Flash - TOC2 */ +".cy_toc_part2" : place at start of IROM6_region { section .cy_toc_part2 }; + +/* Supervisory Flash - RTOC2 */ +".cy_rtoc_part2" : place at start of IROM7_region { section .cy_rtoc_part2 }; + +/* eFuse */ +".cy_efuse" : place at start of IROM8_region { section .cy_efuse }; + +/* Execute in Place (XIP). See the smif driver documentation for details. */ +".cy_xip" : place at start of EROM1_region { section .cy_xip }; + +/* RAM */ +place at start of IRAM1_region { readwrite section .intvec_ram}; +place in IRAM1_region { readwrite }; +place at end of IRAM1_region { block HSTACK }; + +/* These sections are used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. */ +".cymeta" : place at address mem : 0x90500000 { readonly section .cymeta }; + + +keep { section .cy_app_signature, + section .cy_em_eeprom, + section .cy_sflash_user_data, + section .cy_sflash_nar, + section .cy_sflash_public_key, + section .cy_toc_part2, + section .cy_rtoc_part2, + section .cy_efuse, + section .cy_xip, + section .cymeta, + }; + + +/* The following symbols used by the cymcuelftool. */ +/* Flash */ +define exported symbol __cy_memory_0_start = 0x10000000; +define exported symbol __cy_memory_0_length = 0x00100000; +define exported symbol __cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +define exported symbol __cy_memory_1_start = 0x14000000; +define exported symbol __cy_memory_1_length = 0x8000; +define exported symbol __cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +define exported symbol __cy_memory_2_start = 0x16000000; +define exported symbol __cy_memory_2_length = 0x8000; +define exported symbol __cy_memory_2_row_size = 0x200; + +/* XIP */ +define exported symbol __cy_memory_3_start = 0x18000000; +define exported symbol __cy_memory_3_length = 0x08000000; +define exported symbol __cy_memory_3_row_size = 0x200; + +/* eFuse */ +define exported symbol __cy_memory_4_start = 0x90700000; +define exported symbol __cy_memory_4_length = 0x100000; +define exported symbol __cy_memory_4_row_size = 1; + +/* EOF */ diff --git a/2020TPCApp1.cydsn/cy8c6xx7_cm4_dual.ld b/2020TPCApp1.cydsn/cy8c6xx7_cm4_dual.ld new file mode 100644 index 0000000..54e5e5e --- /dev/null +++ b/2020TPCApp1.cydsn/cy8c6xx7_cm4_dual.ld @@ -0,0 +1,408 @@ +/***************************************************************************//** +* \file cy8c6xx7_cm4_dual.ld +* \version 2.20 +* +* Linker file for the GNU C compiler. +* +* The main purpose of the linker script is to describe how the sections in the +* input files should be mapped into the output file, and to control the memory +* layout of the output file. +* +* \note The entry point location is fixed and starts at 0x10000000. The valid +* application image should be placed there. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case you may see warnings during the +* build process. In your project, you can simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +SEARCH_DIR(.) +GROUP(-lgcc -lc -lnosys) +ENTRY(Reset_Handler) + + +/* Force symbol to be entered in the output file as an undefined symbol. Doing +* this may, for example, trigger linking of additional modules from standard +* libraries. You may list several symbols for each EXTERN, and you may use +* EXTERN multiple times. This command has the same effect as the -u command-line +* option. +*/ +EXTERN(Reset_Handler) + +/* The MEMORY section below describes the location and size of blocks of memory in the target. +* Use this section to specify the memory regions available for allocation. +*/ +MEMORY +{ + /* The ram and flash regions control RAM and flash memory allocation for the CM4 core. + * You can change the memory allocation by editing the 'ram' and 'flash' regions. + * Note that 2 KB of RAM (at the end of the RAM section) are reserved for system use. + * Using this memory region for other purposes will lead to unexpected behavior. + * Your changes must be aligned with the corresponding memory regions for CM0+ core in 'xx_cm0plus.ld', + * where 'xx' is the device group; for example, 'cy8c6xx7_cm0plus.ld'. + */ + ram (rwx) : ORIGIN = 0x08024000, LENGTH = 0x23800 + flash (rx) : ORIGIN = 0x10080000, LENGTH = 0x80000 + + /* This is a 32K flash region used for EEPROM emulation. This region can also be used as the general purpose flash. + * You can assign sections to this memory region for only one of the cores. + * Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. + * Therefore, repurposing this memory region will prevent such middleware from operation. + */ + em_eeprom (rx) : ORIGIN = 0x14004000, LENGTH = 0x4000 /* 16 KB */ + + /* The following regions define device specific memory regions and must not be changed. */ + sflash_user_data (rx) : ORIGIN = 0x16000800, LENGTH = 0x800 /* Supervisory flash: User data */ + sflash_nar (rx) : ORIGIN = 0x16001A00, LENGTH = 0x200 /* Supervisory flash: Normal Access Restrictions (NAR) */ + sflash_public_key (rx) : ORIGIN = 0x16005A00, LENGTH = 0xC00 /* Supervisory flash: Public Key */ + sflash_toc_2 (rx) : ORIGIN = 0x16007C00, LENGTH = 0x200 /* Supervisory flash: Table of Content # 2 */ + sflash_rtoc_2 (rx) : ORIGIN = 0x16007E00, LENGTH = 0x200 /* Supervisory flash: Table of Content # 2 Copy */ + xip (rx) : ORIGIN = 0x18000000, LENGTH = 0x8000000 /* 128 MB */ + efuse (r) : ORIGIN = 0x90700000, LENGTH = 0x100000 /* 1 MB */ +} + +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a libnosys.a) + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __Vectors_End + * __Vectors_Size + */ + + +SECTIONS +{ + .text : + { + . = ALIGN(4); + __Vectors = . ; + KEEP(*(.vectors)) + . = ALIGN(4); + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + __end__ = .; + + . = ALIGN(4); + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + /* Read-only code (constants). */ + *(.rodata .rodata.* .constdata .constdata.* .conststring .conststring.*) + + KEEP(*(.eh_frame*)) + } > flash + + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > flash + + __exidx_start = .; + + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > flash + __exidx_end = .; + + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_psoc6_01_cm4.S */ + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + + /* Copy interrupt vectors from flash to RAM */ + LONG (__Vectors) /* From */ + LONG (__ram_vectors_start__) /* To */ + LONG (__Vectors_End - __Vectors) /* Size */ + + /* Copy data section to RAM */ + LONG (__etext) /* From */ + LONG (__data_start__) /* To */ + LONG (__data_end__ - __data_start__) /* Size */ + + __copy_table_end__ = .; + } > flash + + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_psoc6_01_cm4.S */ + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + __zero_table_end__ = .; + } > flash + + __etext = . ; + + + .ramVectors (NOLOAD) : ALIGN(8) + { + __ram_vectors_start__ = .; + KEEP(*(.ram_vectors)) + __ram_vectors_end__ = .; + } > ram + + + .data __ram_vectors_end__ : AT (__etext) + { + __data_start__ = .; + + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + + KEEP(*(.cy_ramfunc*)) + . = ALIGN(4); + + __data_end__ = .; + + } > ram + + + /* Place variables in the section that should not be initialized during the + * device startup. + */ + .noinit (NOLOAD) : ALIGN(8) + { + KEEP(*(.noinit)) + } > ram + + + /* The uninitialized global or static variables are placed in this section. + * + * The NOLOAD attribute tells linker that .bss section does not consume + * any space in the image. The NOLOAD attribute changes the .bss type to + * NOBITS, and that makes linker to A) not allocate section in memory, and + * A) put information to clear the section with all zeros during application + * loading. + * + * Without the NOLOAD attribute, the .bss section might get PROGBITS type. + * This makes linker to A) allocate zeroed section in memory, and B) copy + * this section to RAM during application loading. + */ + .bss (NOLOAD): + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > ram + + + .heap (NOLOAD): + { + __HeapBase = .; + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + __HeapLimit = .; + } > ram + + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (NOLOAD): + { + KEEP(*(.stack*)) + } > ram + + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(ram) + LENGTH(ram); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") + + + /* Used for the digital signature of the secure application and the Bootloader SDK application. + * The size of the section depends on the required data size. */ + .cy_app_signature ORIGIN(flash) + LENGTH(flash) - 256 : + { + KEEP(*(.cy_app_signature)) + } > flash + + + /* Emulated EEPROM Flash area */ + .cy_em_eeprom : + { + KEEP(*(.cy_em_eeprom)) + } > em_eeprom + + + /* Supervisory Flash: User data */ + .cy_sflash_user_data : + { + KEEP(*(.cy_sflash_user_data)) + } > sflash_user_data + + + /* Supervisory Flash: Normal Access Restrictions (NAR) */ + .cy_sflash_nar : + { + KEEP(*(.cy_sflash_nar)) + } > sflash_nar + + + /* Supervisory Flash: Public Key */ + .cy_sflash_public_key : + { + KEEP(*(.cy_sflash_public_key)) + } > sflash_public_key + + + /* Supervisory Flash: Table of Content # 2 */ + .cy_toc_part2 : + { + KEEP(*(.cy_toc_part2)) + } > sflash_toc_2 + + + /* Supervisory Flash: Table of Content # 2 Copy */ + .cy_rtoc_part2 : + { + KEEP(*(.cy_rtoc_part2)) + } > sflash_rtoc_2 + + + /* Places the code in the Execute in Place (XIP) section. See the smif driver + * documentation for details. + */ + .cy_xip : + { + KEEP(*(.cy_xip)) + } > xip + + + /* eFuse */ + .cy_efuse : + { + KEEP(*(.cy_efuse)) + } > efuse + + + /* These sections are used for additional metadata (silicon revision, + * Silicon/JTAG ID, etc.) storage. + */ + .cymeta 0x90500000 : { KEEP(*(.cymeta)) } :NONE +} + + +/* The following symbols used by the cymcuelftool. */ +/* Flash */ +__cy_memory_0_start = 0x10000000; +__cy_memory_0_length = 0x00100000; +__cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +__cy_memory_1_start = 0x14000000; +__cy_memory_1_length = 0x8000; +__cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +__cy_memory_2_start = 0x16000000; +__cy_memory_2_length = 0x8000; +__cy_memory_2_row_size = 0x200; + +/* XIP */ +__cy_memory_3_start = 0x18000000; +__cy_memory_3_length = 0x08000000; +__cy_memory_3_row_size = 0x200; + +/* eFuse */ +__cy_memory_4_start = 0x90700000; +__cy_memory_4_length = 0x100000; +__cy_memory_4_row_size = 1; + +/* EOF */ diff --git a/2020TPCApp1.cydsn/cy8c6xx7_cm4_dual.scat b/2020TPCApp1.cydsn/cy8c6xx7_cm4_dual.scat new file mode 100644 index 0000000..d45ccea --- /dev/null +++ b/2020TPCApp1.cydsn/cy8c6xx7_cm4_dual.scat @@ -0,0 +1,213 @@ +#! armcc -E +; The first line specifies a preprocessor command that the linker invokes +; to pass a scatter file through a C preprocessor. + +;******************************************************************************* +;* \file cy8c6xx7_cm4_dual.scat +;* \version 2.20 +;* +;* Linker file for the ARMCC. +;* +;* The main purpose of the linker script is to describe how the sections in the +;* input files should be mapped into the output file, and to control the memory +;* layout of the output file. +;* +;* \note The entry point location is fixed and starts at 0x10000000. The valid +;* application image should be placed there. +;* +;* \note The linker files included with the PDL template projects must be +;* generic and handle all common use cases. Your project may not use every +;* section defined in the linker files. In that case you may see the warnings +;* during the build process: L6314W (no section matches pattern) and/or L6329W +;* (pattern only matches removed unused sections). In your project, you can +;* suppress the warning by passing the "--diag_suppress=L6314W,L6329W" option to +;* the linker, simply comment out or remove the relevant code in the linker +;* file. +;* +;******************************************************************************* +;* \copyright +;* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +;* You may use this file only in accordance with the license, terms, conditions, +;* disclaimers, and limitations in the end user license agreement accompanying +;* the software package with which this file was provided. +;******************************************************************************/ + +; The defines below describe the location and size of blocks of memory in the target. +; Use these defines to specify the memory regions available for allocation. + +; The following defines control RAM and flash memory allocation for the CM4 core. +; You can change the memory allocation by editing RAM and Flash defines. +; Note that 2 KB of RAM (at the end of the RAM section) are reserved for system use. +; Using this memory region for other purposes will lead to unexpected behavior. +; Your changes must be aligned with the corresponding defines for CM0+ core in 'xx_cm0plus.scat', +; where 'xx' is the device group; for example, 'cy8c6xx7_cm0plus.scat'. +; RAM +#define RAM_START 0x08024000 +#define RAM_SIZE 0x00023800 +; Flash +#define FLASH_START 0x10080000 +#define FLASH_SIZE 0x00080000 + +; The following defines describe a 32K flash region used for EEPROM emulation. +; This region can also be used as the general purpose flash. +; You can assign sections to this memory region for only one of the cores. +; Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. +; Therefore, repurposing this memory region will prevent such middleware from operation. +#define EM_EEPROM_START 0x14000000 +#define EM_EEPROM_SIZE 0x8000 + +; The following defines describe device specific memory regions and must not be changed. +; Supervisory flash: User data +#define SFLASH_USER_DATA_START 0x16000800 +#define SFLASH_USER_DATA_SIZE 0x00000800 + +; Supervisory flash: Normal Access Restrictions (NAR) +#define SFLASH_NAR_START 0x16001A00 +#define SFLASH_NAR_SIZE 0x00000200 + +; Supervisory flash: Public Key +#define SFLASH_PUBLIC_KEY_START 0x16005A00 +#define SFLASH_PUBLIC_KEY_SIZE 0x00000C00 + +; Supervisory flash: Table of Content # 2 +#define SFLASH_TOC_2_START 0x16007C00 +#define SFLASH_TOC_2_SIZE 0x00000200 + +; Supervisory flash: Table of Content # 2 Copy +#define SFLASH_RTOC_2_START 0x16007E00 +#define SFLASH_RTOC_2_SIZE 0x00000200 + +; External memory +#define XIP_START 0x18000000 +#define XIP_SIZE 0x08000000 + +; eFuse +#define EFUSE_START 0x90700000 +#define EFUSE_SIZE 0x100000 + + +LR_FLASH FLASH_START FLASH_SIZE +{ + ER_FLASH_VECTORS +0 + { + * (RESET, +FIRST) + } + + ER_FLASH_CODE +0 FIXED + { + * (InRoot$$Sections) + * (+RO) + } + + ER_RAM_VECTORS RAM_START UNINIT + { + * (RESET_RAM, +FIRST) + } + + ER_RAM_DATA +0 + { + * (.cy_ramfunc) + .ANY (+RW, +ZI) + } + + ; Place variables in the section that should not be initialized during the + ; device startup. + ER_RAM_NOINIT_DATA +0 UNINIT + { + * (.noinit) + } + + + ; Used for the digital signature of the secure application and the + ; Bootloader SDK application. The size of the section depends on the required + ; data size. + .cy_app_signature (FLASH_START + FLASH_SIZE - 256) 256 + { + * (.cy_app_signature) + } +} + + +; Emulated EEPROM Flash area +LR_EM_EEPROM EM_EEPROM_START EM_EEPROM_SIZE +{ + .cy_em_eeprom +0 + { + * (.cy_em_eeprom) + } +} + +; Supervisory flash: User data +LR_SFLASH_USER_DATA SFLASH_USER_DATA_START SFLASH_USER_DATA_SIZE +{ + .cy_sflash_user_data +0 + { + * (.cy_sflash_user_data) + } +} + +; Supervisory flash: Normal Access Restrictions (NAR) +LR_SFLASH_NAR SFLASH_NAR_START SFLASH_NAR_SIZE +{ + .cy_sflash_nar +0 + { + * (.cy_sflash_nar) + } +} + +; Supervisory flash: Public Key +LR_SFLASH_PUBLIC_KEY SFLASH_PUBLIC_KEY_START SFLASH_PUBLIC_KEY_SIZE +{ + .cy_sflash_public_key +0 + { + * (.cy_sflash_public_key) + } +} + +; Supervisory flash: Table of Content # 2 +LR_SFLASH_TOC_2 SFLASH_TOC_2_START SFLASH_TOC_2_SIZE +{ + .cy_toc_part2 +0 + { + * (.cy_toc_part2) + } +} + +; Supervisory flash: Table of Content # 2 Copy +LR_SFLASH_RTOC_2 SFLASH_RTOC_2_START SFLASH_RTOC_2_SIZE +{ + .cy_rtoc_part2 +0 + { + * (.cy_rtoc_part2) + } +} + + +; Places the code in the Execute in Place (XIP) section. See the smif driver documentation for details. +LR_EROM XIP_START XIP_SIZE +{ + .cy_xip +0 + { + * (.cy_xip) + } +} + + +; eFuse +LR_EFUSE EFUSE_START EFUSE_SIZE +{ + .cy_efuse +0 + { + * (.cy_efuse) + } +} + + +; The section is used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. +CYMETA 0x90500000 +{ + .cymeta +0 { * (.cymeta) } +} + + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/cy_ble_config.h b/2020TPCApp1.cydsn/cy_ble_config.h new file mode 100644 index 0000000..2f382ef --- /dev/null +++ b/2020TPCApp1.cydsn/cy_ble_config.h @@ -0,0 +1,66 @@ +/***************************************************************************//** +* \file cy_ble_config.h +* \version 2.80 +* +* \brief +* The user BLE configuration file. Allows redefining the configuration #define(s) +* generated by the BLE customizer. +* +******************************************************************************** +* \copyright +* Copyright 2017-2023, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef CY_BLE_CONF_H +#define CY_BLE_CONF_H + +#include "ble/cy_ble_defines.h" + +/** + * The BLE_config.h file is generated by the BLE customizer and includes all common + * configuration defines (CY_BLE_CONFIG_***). + */ +#include "BLE_config.h" + +#include +#ifndef CY_IP_MXBLESS + #error "The BLE middleware is not supported on this device" +#endif + +/** + * The BLE Interrupt Notification Feature - Exposes BLE interrupt notifications + * to an application that indicates a different link layer and radio state + * transition to the user from the BLESS interrupt context. + * This callback is triggered at the beginning of a received BLESS interrupt + * (based on the registered interrupt mask). After this feature is enabled, + * the following APIs are available: + * Cy_BLE_RegisterInterruptCallback() and Cy_BLE_UnRegisterInterruptCallback(). + * + * The valid value: 1u - enable / 0u - disable. + * + * BLE Dual mode requires an additional define IPC channel and IPC Interrupt + * structure to send notification from the controller core to host core. + * Use the following defines: + * #define CY_BLE_INTR_NOTIFY_IPC_CHAN (9..15) + * #define CY_BLE_INTR_NOTIFY_IPC_INTR (9..15) + * #define CY_BLE_INTR_NOTIFY_IPC_INTR_PRIOR (0..7) + */ +#define CY_BLE_INTR_NOTIFY_FEATURE_ENABLE (0u) + + +/** + * To redefine the config #define(s) generated by the BLE customizer, + * use the construction #undef... #define. + * + * #undef CY_BLE_CONFIG_ENABLE_LL_PRIVACY + * #define CY_BLE_CONFIG_ENABLE_LL_PRIVACY (1u) + * + */ + + +#endif /* !defined(CY_BLE_CONF_H)*/ + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/cy_si_config.h b/2020TPCApp1.cydsn/cy_si_config.h new file mode 100644 index 0000000..47c088d --- /dev/null +++ b/2020TPCApp1.cydsn/cy_si_config.h @@ -0,0 +1,129 @@ +/***************************************************************************//** +* \file cy_si_config.h +* \version 1.0.1 +* +* \brief +* Definitions and function prototypes for Secure Image. +* +******************************************************************************** +* \copyright +* Copyright 2017-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef _CY_SI_CONFIG_H_ +#define _CY_SI_CONFIG_H_ + +#if defined(__cplusplus) +extern "C" { +#endif + +/*************************************** +* Macros +***************************************/ +/* +* Macros to define the secure image version and ID. +*/ +#define CY_SI_VERSION_MAJOR 1UL /**< Major version */ +#define CY_SI_VERSION_MINOR 0UL /**< Minor version */ +#define CY_SI_APP_VERSION ((CY_SI_VERSION_MAJOR << 24u) | (CY_SI_VERSION_MINOR << 16u)) /**< App Version */ +#define CY_SI_ID CY_PDL_DRV_ID(0x38u) /**< Secure Image ID */ +#define CY_SI_ID_INFO (uint32_t)( CY_SI_ID | CY_PDL_STATUS_INFO ) /**< Secure Image INFO ID */ +#define CY_SI_ID_WARNING (uint32_t)( CY_SI_ID | CY_PDL_STATUS_WARNING) /**< Secure Image WARNING ID */ +#define CY_SI_ID_ERROR (uint32_t)( CY_SI_ID | CY_PDL_STATUS_ERROR) /**< Secure Image ERROR ID */ +#define CY_SI_CHECKID(val) ((uint32_t)(val) & (CY_PDL_MODULE_ID_Msk << CY_PDL_MODULE_ID_Pos)) /**< Check ID macro */ + +/* +* Clock selection for Flash boot execution. +*/ +#define CY_SI_FLASHBOOT_CLK_25MHZ (0x00UL) /**< 25MHz clock selection for Flashboot */ +#define CY_SI_FLASHBOOT_CLK_8MHZ (0x01UL) /**< 8MHz clock selection for Flashboot */ +#define CY_SI_FLASHBOOT_CLK_50MHZ (0x02UL) /**< 50MHz clock selection for Flashboot */ + +/* +* Debugger wait window selection for Flash boot execution. +*/ +#define CY_SI_FLASHBOOT_WAIT_20MS (0x00UL) /**< 20ms debugger wait window for Flashboot */ +#define CY_SI_FLASHBOOT_WAIT_10MS (0x01UL) /**< 10ms debugger wait window for Flashboot */ +#define CY_SI_FLASHBOOT_WAIT_1MS (0x02UL) /**< 1ms debugger wait window for Flashboot */ +#define CY_SI_FLASHBOOT_WAIT_0MS (0x03UL) /**< 0ms debugger wait window for Flashboot */ +#define CY_SI_FLASHBOOT_WAIT_100MS (0x04UL) /**< 100ms debugger wait window for Flashboot */ + +/* +* Flash boot validation selection in chip NORMAL mode. +*/ +#define CY_SI_FLASHBOOT_VALIDATE_NO (0x00UL) /**< Do not validate app1 in NORMAL mode */ +#define CY_SI_FLASHBOOT_VALIDATE_YES (0x01UL) /**< Validate app1 in NORMAL mode */ + +/* +* Application format selection for secure boot. +*/ +#define CY_SI_APP_FORMAT_BASIC (0UL) /**< Basic application format (no header) */ +#define CY_SI_APP_FORMAT_CYPRESS (1UL) /**< Cypress application format (Cypress header) */ + + +/* +* Application type selection for secure boot. +*/ +#define CY_SI_APP_ID_FLASHBOOT (0x8001UL) /**< Flash boot ID Type */ +#define CY_SI_APP_ID_SECUREIMG (0x8002UL) /**< Secure image ID Type */ +#define CY_SI_APP_ID_BOOTLOADER (0x8003UL) /**< Bootloader ID Type */ + + +/*************************************** +* Constants +***************************************/ +#define CY_ARM_CM0P_CPUID (0xC6000000u) /** CM0+ partNo value from ARM CPUID[15:4] register shifted to [31:20] bits */ +#define CY_ARM_CM4_CPUID (0xC2400000u) /** CM4 partNo value from ARM CPUID[15:4] register shifted to [31:20] bits */ + +#define CY_SI_TOC_FLAGS_CLOCKS_MASK (0x00000003UL) /**< Mask for Flashboot clock selection */ +#define CY_SI_TOC_FLAGS_CLOCKS_POS (0UL) /**< Bit position of Flashboot clock selection */ +#define CY_SI_TOC_FLAGS_DELAY_MASK (0x0000001CUL) /**< Mask for Flashboot wait window selection */ +#define CY_SI_TOC_FLAGS_DELAY_POS (2UL) /**< Bit position of Flashboot wait window selection */ +#define CY_SI_TOC_FLAGS_APP_VERIFY_MASK (0x80000000UL) /**< Mask for Flashboot NORMAL mode app1 validation */ +#define CY_SI_TOC_FLAGS_APP_VERIFY_POS (31UL) /**< Bit position of Flashboot NORMAL mode app1 validation */ + +#define CY_SI_TOC2_MAGICNUMBER (0x01211220UL) /**< TOC2 identifier */ + +/*************************************** +* Structs +***************************************/ +/** Table of Content structure */ +typedef struct{ + volatile uint32_t objSize; /**< Object size (Bytes) */ + volatile uint32_t magicNum; /**< TOC ID (magic number) */ + volatile uint32_t userKeyAddr; /**< Secure key address in user Flash */ + volatile uint32_t smifCfgAddr; /**< SMIF configuration structure */ + volatile uint32_t appAddr1; /**< First user application object address */ + volatile uint32_t appFormat1; /**< First user application format */ + volatile uint32_t appAddr2; /**< Second user application object address */ + volatile uint32_t appFormat2; /**< Second user application format */ + volatile uint32_t shashObj; /**< Number of additional objects to be verified (S-HASH) */ + volatile uint32_t sigKeyAddr; /**< Signature verification key address */ + volatile uint32_t addObj[116]; /**< Additional objects to include in S-HASH */ + volatile uint32_t tocFlags; /**< Flags in TOC to control Flash boot options */ + volatile uint32_t crc; /**< CRC16-CCITT */ +}cy_stc_si_toc_t; + +/** User application header in Cypress format */ +typedef struct{ + volatile uint32_t objSize; /**< Object size (Bytes) */ + volatile uint32_t appId; /**< Application ID/version */ + volatile uint32_t appAttributes; /**< Attributes (reserved for future use) */ + volatile uint32_t numCores; /**< Number of cores */ + volatile uint32_t core0Vt; /**< (CM0+)VT offset - offset to the vector table from that entry */ + volatile uint32_t core1Vt; /**< (CM4)VT offset - offset to the vector table from that entry */ + volatile uint32_t core0Id; /**< CM0+ core ID */ + volatile uint32_t core1Id; /**< CM4 core ID */ +}cy_stc_user_appheader_t; + + +#if defined(__cplusplus) +} +#endif + +#endif /* _CY_SI_CONFIG_H_ */ + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/debug.c b/2020TPCApp1.cydsn/debug.c new file mode 100644 index 0000000..0652b22 --- /dev/null +++ b/2020TPCApp1.cydsn/debug.c @@ -0,0 +1,297 @@ +/******************************************************************************* +* File Name: debug.c +* +* Version: 1.0 +* +* Description: +* This file contains functions for printf functionality. +* +* Hardware Dependency: +* CY8CKIT-062 PSoC6 BLE Pioneer Kit +* +******************************************************************************** +* Copyright 2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + + +#include "common.h" +#include "user_interface.h" + +#if (DEBUG_UART_ENABLED == ENABLED) + +#if defined(__ARMCC_VERSION) + +/* For MDK/RVDS compiler revise fputc function for printf functionality */ +struct __FILE +{ + int handle; +}; + +enum +{ + STDIN_HANDLE, + STDOUT_HANDLE, + STDERR_HANDLE +}; + +FILE __stdin = {STDIN_HANDLE}; +FILE __stdout = {STDOUT_HANDLE}; +FILE __stderr = {STDERR_HANDLE}; + +int fputc(int ch, FILE *file) +{ + int ret = EOF; + + switch( file->handle ) + { + case STDOUT_HANDLE: + UART_DEB_PUT_CHAR(ch); + ret = ch ; + break ; + + case STDERR_HANDLE: + ret = ch ; + break ; + + default: + file = file; + break ; + } + return ret ; +} + +#elif defined (__ICCARM__) /* IAR */ + +/* For IAR compiler revise __write() function for printf functionality */ +size_t __write(int handle, const unsigned char * buffer, size_t size) +{ + size_t nChars = 0; + + if (buffer == 0) + { + /* + * This means that we should flush internal buffers. Since we + * don't we just return. (Remember, "handle" == -1 means that all + * handles should be flushed.) + */ + return (0); + } + + for (/* Empty */; size != 0; --size) + { + UART_DEB_PUT_CHAR(*buffer); + ++buffer; + ++nChars; + } + + return (nChars); +} + +#else /* (__GNUC__) GCC */ + +/* For GCC compiler revise _write() function for printf functionality */ +int _write(int file, char *ptr, int len) +{ + int i; + file = file; + for (i = 0; i < len; i++) + { + UART_DEB_PUT_CHAR(*ptr); + ++ptr; + } + return len; +} + + +#endif /* (__ARMCC_VERSION) */ + +#endif /* DEBUG_UART_ENABLED == ENABLED */ + +void ShowValue(cy_stc_ble_gatt_value_t *value) +{ + int16_t i; + + for(i = 0; i < value->len; i++) + { + DBG_PRINTF("%2.2x ", value->val[i]); + } + DBG_PRINTF("\r\n"); +} + + +void Set32ByPtr(uint8_t ptr[], uint32_t value) +{ + ptr[0u] = (uint8_t) value; + ptr[1u] = (uint8_t) (value >> 8u); + ptr[2u] = (uint8_t) (value >> 16u); + ptr[3u] = (uint8_t) (value >> 24u); +} + + +/******************************************************************************* +* Function Name: ShowError +******************************************************************************** +* +* Summary: +* Shows error condition: Turn On all LEDs - white color will indicate error. +* +*******************************************************************************/ +void ShowError(void) +{ + EnableAllLeds(); + + /* Halt CPU in Debug mode */ + CY_ASSERT(0u != 0u); +} + + +/******************************************************************************* +* Function Name: HexToAscii +******************************************************************************** +* +* Summary: +* Hexadecimal to ASCII converter +* +* Parameters: +* value: Hexadecimal value +* digit: Which nibble to be obtained +* +* Return: +* char: the ASCII equivalent of that nibble +* +* Theory: +* Converts hexadecimal to ASCII +* +*******************************************************************************/ +char HexToAscii(uint8_t value, uint8_t nibble) +{ + if(nibble == 1) + { + value = value & 0xf0; + value = value >> 4; + + /* bit-shift the result to the right by four bits (i.e. quickly divides by 16) */ + if (value > 9) + { + value = value - 10 + 'A'; + } + else + { + value = value + '0'; + } + } + else if (nibble == 0) + { + /* means use a bitwise AND to take the bottom four bits from the byte, + 0x0F is 00001111 in binary */ + value = value & 0x0F; + if (value > 9) + { + value = value - 10 + 'A'; + } + else + { + value = value + '0'; + } + } + else + { + value = ' '; + } + + return value; +} + +/******************************************************************************* +* Function Name: PrintStackVersion +******************************************************************************** +* +* Summary: +* Prints the BLE Stack version if the PRINT_STACK_VERSION is defined. +* +*******************************************************************************/ +void PrintStackVersion(void) +{ + cy_stc_ble_stack_lib_version_t stackVersion; + cy_en_ble_api_result_t apiResult; + + apiResult = Cy_BLE_GetStackLibraryVersion(&stackVersion); + if(apiResult != CY_BLE_SUCCESS) + { + DBG_PRINTF("Cy_BLE_GetStackLibraryVersion API Error: "); + PrintApiResult(apiResult); + } + else + { + DBG_PRINTF("BLE Stack Version: %d.%d.%d.%d\r\n", stackVersion.majorVersion, + stackVersion.minorVersion, + stackVersion.patch, + stackVersion.buildNumber); + } +} + +/******************************************************************************* +* Function Name: PrintApiResult +******************************************************************************** +* +* Summary: +* Decodes and prints the apiResult global variable value. +* +*******************************************************************************/ +void PrintApiResult(cy_en_ble_api_result_t apiResult) +{ + DBG_PRINTF("0x%2.2x ", apiResult); + + switch(apiResult) + { + case CY_BLE_SUCCESS: + DBG_PRINTF("ok\r\n"); + break; + + case CY_BLE_ERROR_INVALID_PARAMETER: + DBG_PRINTF("invalid parameter\r\n"); + break; + + case CY_BLE_ERROR_INVALID_OPERATION: + DBG_PRINTF("invalid operation\r\n"); + break; + + case CY_BLE_ERROR_NO_DEVICE_ENTITY: + DBG_PRINTF("no device entity\r\n"); + break; + + case CY_BLE_ERROR_NTF_DISABLED: + DBG_PRINTF("notification is disabled\r\n"); + break; + + case CY_BLE_ERROR_IND_DISABLED: + DBG_PRINTF("indication is disabled\r\n"); + break; + + case CY_BLE_ERROR_CHAR_IS_NOT_DISCOVERED: + DBG_PRINTF("characteristic is not discovered\r\n"); + break; + + case CY_BLE_ERROR_INVALID_STATE: + DBG_PRINTF("invalid state"); + break; + + case CY_BLE_ERROR_GATT_DB_INVALID_ATTR_HANDLE: + DBG_PRINTF("invalid attribute handle\r\n"); + break; + + case CY_BLE_ERROR_FLASH_WRITE_NOT_PERMITED: + DBG_PRINTF("flash write not permitted\r\n"); + break; + + default: + DBG_PRINTF("other api result\r\n"); + break; + } +} + + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/dfu_cm0p.icf b/2020TPCApp1.cydsn/dfu_cm0p.icf new file mode 100644 index 0000000..2495c11 --- /dev/null +++ b/2020TPCApp1.cydsn/dfu_cm0p.icf @@ -0,0 +1,251 @@ +/***************************************************************************//** +* \file dfu_cm0p.icf +* \version 3.0 +* +* The linker file for the the IAR compiler. +* +* \note The entry point is fixed and starts at 0x10000000. The valid application +* image should be placed there. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case, you may see warnings during the +* build process. In your project, you can simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ + + +/******************************************************************************* +* Start of CM4 and CM0+ linker script common region +*******************************************************************************/ + +/*-Memory Regions-*/ +/* Flash */ +define exported symbol __cy_memory_0_start = 0x10000000; +define exported symbol __cy_memory_0_length = 0x00100000; +define exported symbol __cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +define exported symbol __cy_memory_1_start = 0x14000000; +define exported symbol __cy_memory_1_length = 0x8000; +define exported symbol __cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +define exported symbol __cy_memory_2_start = 0x16000000; +define exported symbol __cy_memory_2_length = 0x8000; +define exported symbol __cy_memory_2_row_size = 0x200; + +/* XIP */ +define exported symbol __cy_memory_3_start = 0x18000000; +define exported symbol __cy_memory_3_length = 0x08000000; +define exported symbol __cy_memory_3_row_size = 0x200; + +/* eFuse */ +define exported symbol __cy_memory_4_start = 0x90700000; +define exported symbol __cy_memory_4_length = 0x100000; +define exported symbol __cy_memory_4_row_size = 1; + + +define memory mem with size = 4G; + +/* Memory regions for all applications are defined here */ +define region FLASH_app0_core0 = mem:[from 0x10000000 size 0x10000]; +define region FLASH_app0_core1 = mem:[from 0x10010000 size 0x10000]; +define region FLASH_app1_core0 = mem:[from 0x10040000 size 0x10000]; +define region FLASH_app1_core1 = mem:[from 0x10050000 size 0x10000]; + +/* +* The region for DFU SDK metadata +* when it is outside of any application +*/ +define region FLASH_boot_meta = mem:[from 0x100FFA00 size 0x200]; + + +/* eFuse */ +define region ROM_EFUSE = mem:[from 0x90700000 size 0x100000]; + +/* SFlash NAR */ +define region SFLASH_NAR = mem:[from 0x16001A00 size 0x200]; + +/* SFlash User Data */ +define region SFLASH_USER_DATA = mem:[from 0x16000800 size 0x800]; + +/* SFlash Public Key, 6 SFlash rows */ +define region SFLASH_PUBLIC_KEY = mem:[from 0x16005A00 size 0xC00]; + +/* Table of Content part 2, two SFlash rows */ +define region SFLASH_TOC = mem:[from 0x16007C00 size 0x400]; + + +/* Emulated EEPROM app regions */ +define region EM_EEPROM_app0_core0 = mem:[from 0x14000000 size 0x8000]; +define region EM_EEPROM_app0_core1 = mem:[from 0x14000000 size 0x8000]; +define region EM_EEPROM_app1_core0 = mem:[from 0x14000000 size 0x8000]; +define region EM_EEPROM_app1_core1 = mem:[from 0x14000000 size 0x8000]; + +/* XIP/SMIF app regions */ +define region EROM_app0_core0 = mem:[from 0x18000000 size 0x1000]; +define region EROM_app0_core1 = mem:[from 0x18000000 size 0x1000]; +define region EROM_app1_core0 = mem:[from 0x18000000 size 0x1000]; +define region EROM_app1_core1 = mem:[from 0x18000000 size 0x1000]; + +/* used for RAM sharing across applications */ +define region IRAM_common = mem:[from 0x08000000 size 0x0100]; + +/* note: all the IRAM_appX_core0 regions has to be 0x100 aligned */ +/* and the IRAM_appX_core1 regions has to be 0x400 aligned */ +/* as they contain Interrupt Vector Table Remapped at the start */ +define region IRAM_app0_core0 = mem:[from 0x08000100 size 0x1F00]; +define region IRAM_app0_core1 = mem:[from 0x08002000 size 0x8000]; +define region IRAM_app1_core0 = mem:[from 0x08000100 size 0x1F00]; +define region IRAM_app1_core1 = mem:[from 0x08002000 size 0x8000]; + + +/* Used by all DFU SDK and CyMCUElfTool */ +define exported symbol __cy_boot_metadata_addr = 0x100FFA00; +define exported symbol __cy_boot_metadata_length = __cy_memory_0_row_size; + +/* Used by CyMCUElfTool to generate ProductID for DFU SDK apps */ +define exported symbol __cy_product_id = 0x01020304; + +/* Used by CyMCUElfTool to generate ChecksumType for DFU SDK apps */ +define exported symbol __cy_checksum_type = 0; + +/* +* The size of the application signature. +* E.g. 4 for CRC-32, +* 32 for SHA256, +* 256 for RSA 2048. +*/ +define exported symbol __cy_boot_signature_size = 4; + +/* Used by DFU SDK projects, in dfu_user.c to fill in the metadata table */ +define exported symbol __cy_app0_verify_start = start(FLASH_app0_core0); +define exported symbol __cy_app0_verify_length = size (FLASH_app0_core0) + size (FLASH_app0_core1) + - __cy_boot_signature_size; + +define exported symbol __cy_app1_verify_start = start(FLASH_app1_core0); +define exported symbol __cy_app1_verify_length = size (FLASH_app1_core0) + size (FLASH_app1_core1) + - __cy_boot_signature_size; + +/******************************************************************************* +* End of CM4 and CM0+ linker script common region +*******************************************************************************/ + + +/* +* Used by CM0+ to start the CM4 core in DFU SDK applications. +* Make sure the correct app no. is entered here. +*/ +define exported symbol __cy_app_core1_start_addr = start(FLASH_app0_core1); + +/* CyMCUElfTool uses this symbol to set a proper app number */ +define exported symbol __cy_app_id = 0; + +/* CyMCUElfTool uses these to generate an application signature */ +/* The size of the default signature (CRC-32C) is 4 bytes */ +define exported symbol __cy_app_verify_start = start(FLASH_app0_core0); +define exported symbol __cy_app_verify_length = size(FLASH_app0_core0) + size(FLASH_app0_core1) + - __cy_boot_signature_size; + + +/*-Sizes-*/ +if (!isdefinedsymbol(__STACK_SIZE)) { + define symbol __ICFEDIT_size_cstack__ = 0x1000; +} else { + define symbol __ICFEDIT_size_cstack__ = __STACK_SIZE; +} +define symbol __ICFEDIT_size_proc_stack__ = 0x0; +if (!isdefinedsymbol(__HEAP_SIZE)) { + define symbol __ICFEDIT_size_heap__ = 0x0400; +} else { + define symbol __ICFEDIT_size_heap__ = __HEAP_SIZE; +} + + +define region IROM1_region = FLASH_app0_core0; /* Flash, user app */ +define region IROM2_region = EM_EEPROM_app0_core0; /* Emulated EEPROM */ +define region IROM3_region = SFLASH_USER_DATA; /* SFlash User Data */ +define region IROM4_region = SFLASH_NAR; /* SFlash NAR */ +define region IROM5_region = SFLASH_PUBLIC_KEY; /* SFlash Public Key */ +define region IROM6_region = SFLASH_TOC; /* SFlash TOC part 2 */ +define region IROM7_region = ROM_EFUSE; /* eFuse */ +define region EROM1_region = EROM_app0_core0; /* XIP / SMIF */ +define region IRAM1_region = IRAM_app0_core0; /* RAM */ + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; +define block HSTACK {block HEAP, block PROC_STACK, last block CSTACK}; +define block RO {first section .intvec, readonly}; + +/*-Initializations-*/ +initialize by copy { readwrite }; +do not initialize { section .noinit, section .intvec_ram, + section .cy_boot_noinit.appId, section .cy_boot_noinit }; + + +/*-Placement-*/ + +/* Flash */ +".cy_app_header" : place at start of IROM1_region { section .cy_app_header }; +place in IROM1_region { block RO }; + +/* Emulated EEPROM Flash area */ +".cy_em_eeprom" : place at start of IROM2_region { section .cy_em_eeprom }; + +/* Supervisory Flash - User Data */ +".cy_sflash_user_data" : place at start of IROM3_region { section .cy_sflash_user_data }; + +/* Supervisory Flash - NAR */ +".cy_sflash_nar" : place at start of IROM4_region { section .cy_sflash_nar }; + +/* Supervisory Flash - Public Key */ +".cy_sflash_public_key" : place at start of IROM5_region { section .cy_sflash_public_key }; + +/* Supervisory Flash - TOC2 */ +".cy_toc_part2" : place at start of IROM6_region { section .cy_toc_part2 }; + +/* eFuse */ +".cy_efuse" : place at start of IROM7_region { section .cy_efuse }; + +/* Execute in Place (XIP). See the smif driver documentation for details. */ +".cy_xip" : place at start of EROM1_region { section .cy_xip }; + +/* RAM */ +place at start of IRAM_common { readwrite section .cy_boot_noinit.appId }; +place in IRAM_common { readwrite section .cy_boot_noinit }; +place at start of IRAM1_region { readwrite section .intvec_ram}; +place in IRAM1_region { readwrite }; +place at end of IRAM1_region { block HSTACK }; + +/* These sections are used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. */ +".cymeta" : place at address mem : 0x90500000 { readonly section .cymeta }; + + +keep { section .cy_app_header, + section .cy_em_eeprom, + section .cy_sflash_user_data, + section .cy_sflash_nar, + section .cy_sflash_public_key, + section .cy_sflash_toc_2, + section .cy_efuse, + section .cy_xip, + section .cymeta, + section .cy_boot_noinit, + section .cy_boot_noinit.appId, + }; + + + +/* EOF */ diff --git a/2020TPCApp1.cydsn/dfu_cm0p.ld b/2020TPCApp1.cydsn/dfu_cm0p.ld new file mode 100644 index 0000000..a081163 --- /dev/null +++ b/2020TPCApp1.cydsn/dfu_cm0p.ld @@ -0,0 +1,485 @@ +/***************************************************************************//** +* \file dfu_cm0p.ld +* \version 3.0 +* +* The linker file for the GNU C compiler. +* Used for DFU SDK core0 firmware projects. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case, you may see warnings during the +* build process. In your project, simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +SEARCH_DIR(.) +GROUP(-lgcc -lc -lnosys) +ENTRY(Reset_Handler) + + +/* +* Forces symbol to be added to the output file. +* Otherwise linker may remove it if founds that it is not used in the project. +* This command has the same effect as the -u command-line option. +*/ +EXTERN(Reset_Handler) + + +/******************************************************************************* +* Start of CM4 and CM0+ linker script common region +*******************************************************************************/ + +/* +* Memory regions, for each application and MCU core. +*/ +MEMORY +{ + flash_app0_core0 (rx) : ORIGIN = 0x10000000, LENGTH = 0x10000 + flash_app0_core1 (rx) : ORIGIN = 0x10010000, LENGTH = 0x30000 + flash_app1_core0 (rx) : ORIGIN = 0x10040000, LENGTH = 0x30000 + flash_app1_core1 (rx) : ORIGIN = 0x10070000, LENGTH = 0x50000 + + flash_storage (rw) : ORIGIN = 0x100D0000, LENGTH = 0x1000 + flash_boot_meta (rw) : ORIGIN = 0x100FFA00, LENGTH = 0x400 + + sflash_user_data (rx) : ORIGIN = 0x16000800, LENGTH = 0x800 + sflash_nar (rx) : ORIGIN = 0x16001A00, LENGTH = 0x200 + sflash_public_key (rx) : ORIGIN = 0x16005A00, LENGTH = 0xC00 + sflash_toc_2 (rx) : ORIGIN = 0x16007C00, LENGTH = 0x400 + + efuse (r) : ORIGIN = 0x90700000, LENGTH = 0x100000 + + ram_common (rwx) : ORIGIN = 0x08000000, LENGTH = 0x0100 + + /* note: all the ram_appX_core0 regions has to be 0x100 aligned */ + /* and the ram_appX_core1 regions has to be 0x400 aligned */ + /* as they contain Interrupt Vector Table Remapped at the start */ + ram_app0_core0 (rwx) : ORIGIN = 0x08000100, LENGTH = 0x7F00 + ram_app0_core1 (rwx) : ORIGIN = 0x08008000, LENGTH = 0x8000 + + ram_app1_core0 (rwx) : ORIGIN = 0x08000100, LENGTH = 0x7F00 + ram_app1_core1 (rwx) : ORIGIN = 0x08008000, LENGTH = 0x30000 + + /* This is a 32K flash region used for EEPROM emulation. This region can also be used as the general purpose flash. + * You can assign sections to this memory region for only one of the cores. + * Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. + * Therefore, repurposing this memory region will prevent such middleware from operation. + */ + em_eeprom (rx) : ORIGIN = 0x14000000, LENGTH = 0x4000 /* 16 KB */ + + xip (rx) : ORIGIN = 0x18000000, LENGTH = 0x08000000 +} + +/* Regions parameters */ +/* Flash */ +__cy_memory_0_start = 0x10000000; +__cy_memory_0_length = 0x00100000; +__cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +__cy_memory_1_start = 0x14000000; +__cy_memory_1_length = 0x8000; +__cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +__cy_memory_2_start = 0x16000000; +__cy_memory_2_length = 0x8000; +__cy_memory_2_row_size = 0x200; + +/* XIP */ +__cy_memory_3_start = 0x18000000; +__cy_memory_3_length = 0x08000000; +__cy_memory_3_row_size = 0x200; + +/* eFuse */ +__cy_memory_4_start = 0x90700000; +__cy_memory_4_length = 0x100000; +__cy_memory_4_row_size = 1; + +/* The DFU SDK metadata limits */ +__cy_boot_metadata_addr = ORIGIN(flash_boot_meta); +__cy_boot_metadata_length = __cy_memory_0_row_size; + +/* The Product ID, used by CyMCUElfTool to generate a updating file */ +__cy_product_id = 0x01020304; + +/* The checksum type used by CyMCUElfTool to generate a updating file */ +__cy_checksum_type = 0x00; + +/* Used by the DFU SDK application to set the metadata */ +__cy_app0_verify_start = ORIGIN(flash_app0_core0); +__cy_app0_verify_length = LENGTH(flash_app0_core0) + LENGTH(flash_app0_core1) - __cy_boot_signature_size; +__cy_app1_verify_start = ORIGIN(flash_app1_core0); +__cy_app1_verify_length = LENGTH(flash_app1_core0) + LENGTH(flash_app1_core1) - __cy_boot_signature_size; + +/* +* The size of the application signature. +* E.g. 4 for CRC-32, +* 32 for SHA256, +* 256 for RSA 2048. +*/ +__cy_boot_signature_size = 256; + +/******************************************************************************* +* End of CM4 and CM0+ linker script common region +*******************************************************************************/ + + +/* +* DFU SDK specific: aliases regions, so the rest of code does not use +* application specific memory region names +*/ +REGION_ALIAS("flash", flash_app1_core0); +REGION_ALIAS("flash_core1", flash_app1_core1); +REGION_ALIAS("ram", ram_app1_core0); + +/* DFU SDK specific: sets an app Id */ +__cy_app_id = 1; + +/* +* DFU SDK specific: sets a start address of the Core1 application image, +* more specifically an address of the Core1 interrupt vector table. +* CM0+ uses this information to launch Core1. +*/ +__cy_app_core1_start_addr = ORIGIN(flash_core1); /* used to start Core1 from Core0 */ + +/* DFU SDK specific */ +/* CyMCUElfTool uses these ELF symbols to generate an application signature */ +__cy_app_verify_start = ORIGIN(flash); +__cy_app_verify_length = LENGTH(flash) + LENGTH(flash_core1) - __cy_boot_signature_size; + + +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a libnosys.a) + +/* The linker script defines how to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * This linker script defines the symbols, which can be used by code without a definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __Vectors_End + * __Vectors_Size + * + * For the DFU SDK, these additional symbols are defined: + * __cy_app_id + * __cy_product_id + * __cy_checksum_type + * __cy_app_core1_start_addr + * __cy_boot_metadata_addr + * __cy_boot_metadata_length + */ + + +SECTIONS +{ + /* DFU SDK specific */ + /* The noinit section, used across all the applications */ + .cy_boot_noinit (NOLOAD) : + { + KEEP(*(.cy_boot_noinit)); + } > ram_common + + /* The last byte of the section is used for AppId to be shared between all the applications */ + .cy_boot_noinit.appId ORIGIN(ram_common) + LENGTH(ram_common) - 1 (NOLOAD) : + { + KEEP(*(.cy_boot_noinit.appId)); + } > ram_common + + /* App0 uses it to initialize DFU SDK metadata, in the dfu_user.c file */ + .cy_boot_metadata : + { + KEEP(*(.cy_boot_metadata)) + } > flash_boot_meta + + .cy_app_header : + { + KEEP(*(.cy_app_header)) + } > flash + + .text : + { + . = ALIGN(4); + __Vectors = . ; + KEEP(*(.vectors)) + . = ALIGN(4); + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + __end__ = .; + + . = ALIGN(4); + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + /* Read-only code (constants). */ + *(.rodata .rodata.* .constdata .constdata.* .conststring .conststring.*) + + KEEP(*(.eh_frame*)) + } > flash + + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > flash + + __exidx_start = .; + + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > flash + __exidx_end = .; + + + /* To copy multiple ROM to the RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_{device}_cm0plus.S */ + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + + /* Copy interrupt vectors from Flash to RAM */ + LONG (__Vectors) /* From */ + LONG (__ram_vectors_start__) /* To */ + LONG (__Vectors_End - __Vectors) /* Size */ + + /* Copy data section to RAM */ + LONG (__etext) /* From */ + LONG (__data_start__) /* To */ + LONG (__data_end__ - __data_start__) /* Size */ + + __copy_table_end__ = .; + } > flash + + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_{device}_cm0plus.S */ + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + __zero_table_end__ = .; + } > flash + + __etext = . ; + + + .ramVectors (NOLOAD) : ALIGN(8) + { + __ram_vectors_start__ = .; + KEEP(*(.ram_vectors)) + __ram_vectors_end__ = .; + } > ram + + + .data __ram_vectors_end__ : AT (__etext) + { + __data_start__ = .; + + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + + KEEP(*(.cy_ramfunc*)) + . = ALIGN(4); + + __data_end__ = .; + + } > ram + + + /* Place variables in the section that should not be initialized during the + * device startup. + */ + .noinit (NOLOAD) : ALIGN(8) + { + KEEP(*(.noinit)) + } > ram + + + /* The uninitialized global or static variables are placed in this section. + * + * The NOLOAD attribute tells the linker that the .bss section does not consume + * any space in the image. The NOLOAD attribute changes the .bss type to + * NOBITS, and that makes the linker: A) not allocate the section in memory; + * B) put information to clear the section with all zeros during application + * loading. + * + * Without the NOLOAD attribute, the .bss section might get the PROGBITS type. + * This makes the linker: A) allocate the zeroed section in memory; B) copy + * this section to RAM during application loading. + */ + .bss (NOLOAD): + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > ram + + + .heap (NOLOAD): + { + __HeapBase = .; + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + __HeapLimit = .; + } > ram + + + /* The .stack_dummy section doesn't contain any symbols. It is only + * used for the linker to calculate the size of the stack sections, and assign + * values to the stack symbols later */ + .stack_dummy (NOLOAD): + { + KEEP(*(.stack*)) + } > ram + + + /* Set the stack top to the end of RAM, and the stack limit move down by + * the size of the stack_dummy section */ + __StackTop = ORIGIN(ram) + LENGTH(ram); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") + + + /* Emulated EEPROM Flash area */ + .cy_em_eeprom : + { + KEEP(*(.cy_em_eeprom)) + } > em_eeprom + + + /* Supervisory Flash: User data */ + .cy_sflash_user_data : + { + KEEP(*(.cy_sflash_user_data)) + } > sflash_user_data + + + /* Supervisory Flash: Normal Access Restrictions (NAR) */ + .cy_sflash_nar : + { + KEEP(*(.cy_sflash_nar)) + } > sflash_nar + + + /* Supervisory Flash: Public Key */ + .cy_sflash_public_key : + { + KEEP(*(.cy_sflash_public_key)) + } > sflash_public_key + + + /* Supervisory Flash: Table of Content # 2 */ + .cy_toc_part2 : + { + KEEP(*(.cy_toc_part2)) + } > sflash_toc_2 + + + /* Places the code in the Execute in the Place (XIP) section. See the smif driver + * documentation for details. + */ + .cy_xip : + { + KEEP(*(.cy_xip)) + } > xip + + + /* eFuse */ + .cy_efuse : + { + KEEP(*(.cy_efuse)) + } > efuse + + + /* These sections are used for additional metadata (silicon revision, + * Silicon/JTAG ID, etc.) storage. + */ + .cymeta 0x90500000 : { KEEP(*(.cymeta)) } :NONE +} + + +/* EOF */ diff --git a/2020TPCApp1.cydsn/dfu_cm0p.scat b/2020TPCApp1.cydsn/dfu_cm0p.scat new file mode 100644 index 0000000..a774dc4 --- /dev/null +++ b/2020TPCApp1.cydsn/dfu_cm0p.scat @@ -0,0 +1,189 @@ +#! armcc -E +; The first line specifies a preprocessor command that the linker invokes +; to pass a scatter file through a C preprocessor. + +;******************************************************************************* +;* \file dfu_cm0p.scat +;* \version 3.0 +;* +;* The linker file for the ARMCC. +;* +;* \note The entry point location is fixed and starts at 0x10000000. The valid +;* application image should be placed there. +;* +;* \note The linker files included with the PDL template projects must be +;* generic and handle all common use cases. Your project may not use every +;* section defined in the linker files. In that case, you may see the warnings +;* during the build process: L6314W (no section matches pattern) and/or L6329W +;* (pattern only matches removed unused sections). In your project, you can +;* suppress the warning by passing the "--diag_suppress=L6314W,L6329W" option to +;* the linker, simply comment out or remove the relevant code in the linker +;* file. +;* +;******************************************************************************* +;* \copyright +;* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +;* You may use this file only in accordance with the license, terms, conditions, +;* disclaimers, and limitations in the end user license agreement accompanying +;* the software package with which this file was provided. +;******************************************************************************/ + +;* DFU SDK specific: includes defines common across all the applications +#include "dfu_mdk_common.h" + +;* DFU SDK specific: defines the memory regions +;* Make sure the correct app no. is entered here. + +; Flash +#define FLASH_START CY_APP0_CORE0_FLASH_ADDR +#define FLASH_SIZE CY_APP0_CORE0_FLASH_LENGTH + +; Emulated EEPROM Flash area +#define EM_EEPROM_START CY_APP0_CORE0_EM_EEPROM_ADDR +#define EM_EEPROM_SIZE CY_APP0_CORE0_EM_EEPROM_LENGTH + +; Supervisory flash: User data +#define SFLASH_USER_DATA_START 0x16000800 +#define SFLASH_USER_DATA_SIZE 0x00000800 + +; Supervisory flash: Normal Access Restrictions (NAR) +#define SFLASH_NAR_START 0x16001A00 +#define SFLASH_NAR_SIZE 0x00000200 + +; Supervisory flash: Public Key +#define SFLASH_PUBLIC_KEY_START 0x16005A00 +#define SFLASH_PUBLIC_KEY_SIZE 0x00000C00 + +; Supervisory flash: Table of Content # 2 +#define SFLASH_TOC_2_START 0x16007C00 +#define SFLASH_TOC_2_SIZE 0x00000400 + +; External memory +#define XIP_START CY_APP0_CORE0_SMIF_ADDR +#define XIP_SIZE CY_APP0_CORE0_SMIF_LENGTH + +; eFuse +#define EFUSE_START 0x90700000 +#define EFUSE_SIZE 0x100000 + +; RAM +#define RAM_START CY_APP0_CORE0_RAM_ADDR +#define RAM_SIZE CY_APP0_CORE0_RAM_LENGTH + + +LR_FLASH FLASH_START FLASH_SIZE +{ + .cy_app_header +0 + { + * (.cy_app_header) + } + + ER_FLASH_VECTORS +0 + { + * (RESET, +FIRST) + } + + ER_FLASH_CODE +0 FIXED + { + * (InRoot$$Sections) + * (+RO) + } + + ER_RAM_COMMON CY_APP_RAM_COMMON_ADDR UNINIT + { + * (.cy_boot_noinit.appId) + } + + ER_RAM_VECTORS RAM_START UNINIT + { + * (RESET_RAM, +FIRST) + } + + ER_RAM_DATA +0 + { + * (.cy_ramfunc) + .ANY (+RW, +ZI) + } + + ; Place variables in the section that should not be initialized during the + ; device startup. + ER_RAM_NOINIT_DATA +0 UNINIT + { + * (.noinit) + } +} + + +; Emulated EEPROM Flash area +LR_EM_EEPROM EM_EEPROM_START EM_EEPROM_SIZE +{ + .cy_em_eeprom +0 + { + * (.cy_em_eeprom) + } +} + +; Supervisory flash: User data +LR_SFLASH_USER_DATA SFLASH_USER_DATA_START SFLASH_USER_DATA_SIZE +{ + .cy_sflash_user_data +0 + { + * (.cy_sflash_user_data) + } +} + +; Supervisory flash: Normal Access Restrictions (NAR) +LR_SFLASH_NAR SFLASH_NAR_START SFLASH_NAR_SIZE +{ + .cy_sflash_nar +0 + { + * (.cy_sflash_nar) + } +} + +; Supervisory flash: Public Key +LR_SFLASH_PUBLIC_KEY SFLASH_PUBLIC_KEY_START SFLASH_PUBLIC_KEY_SIZE +{ + .cy_sflash_public_key +0 + { + * (.cy_sflash_public_key) + } +} + +; Supervisory flash: Table of Content # 2 +LR_SFLASH_TOC_2 SFLASH_TOC_2_START SFLASH_TOC_2_SIZE +{ + .cy_toc_part2 +0 + { + * (.cy_toc_part2) + } +} + +; Places the code in the Execute in the Place (XIP) section. See the smif driver documentation for details. +LR_EROM XIP_START XIP_SIZE +{ + .cy_xip +0 + { + * (.cy_xip) + } +} + + +; eFuse +LR_EFUSE EFUSE_START EFUSE_SIZE +{ + .cy_efuse +0 + { + * (.cy_efuse) + } +} + + +; The section is used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. +CYMETA 0x90500000 +{ + .cymeta +0 { * (.cymeta) } +} + + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/dfu_cm4.icf b/2020TPCApp1.cydsn/dfu_cm4.icf new file mode 100644 index 0000000..ca971bc --- /dev/null +++ b/2020TPCApp1.cydsn/dfu_cm4.icf @@ -0,0 +1,248 @@ +/***************************************************************************//** +* \file dfu_cm4.icf +* \version 3.0 +* +* The linker file for the the IAR compiler. +* +* \note The entry point is fixed and starts at 0x10000000. The valid application +* image should be placed there. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case, you may see warnings during the +* build process. In your project, you can simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ + + +/******************************************************************************* +* Start of CM4 and CM0+ linker script common region +*******************************************************************************/ + +/*-Memory Regions-*/ +/* Flash */ +define exported symbol __cy_memory_0_start = 0x10000000; +define exported symbol __cy_memory_0_length = 0x00100000; +define exported symbol __cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +define exported symbol __cy_memory_1_start = 0x14000000; +define exported symbol __cy_memory_1_length = 0x8000; +define exported symbol __cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +define exported symbol __cy_memory_2_start = 0x16000000; +define exported symbol __cy_memory_2_length = 0x8000; +define exported symbol __cy_memory_2_row_size = 0x200; + +/* XIP */ +define exported symbol __cy_memory_3_start = 0x18000000; +define exported symbol __cy_memory_3_length = 0x08000000; +define exported symbol __cy_memory_3_row_size = 0x200; + +/* eFuse */ +define exported symbol __cy_memory_4_start = 0x90700000; +define exported symbol __cy_memory_4_length = 0x100000; +define exported symbol __cy_memory_4_row_size = 1; + + +define memory mem with size = 4G; + +/* Memory regions for all applications are defined here */ +define region FLASH_app0_core0 = mem:[from 0x10000000 size 0x10000]; +define region FLASH_app0_core1 = mem:[from 0x10010000 size 0x10000]; +define region FLASH_app1_core0 = mem:[from 0x10040000 size 0x10000]; +define region FLASH_app1_core1 = mem:[from 0x10050000 size 0x10000]; + +/* +* The region for DFU SDK metadata +* when it is outside of any application +*/ +define region FLASH_boot_meta = mem:[from 0x100FFA00 size 0x200]; + + +/* eFuse */ +define region ROM_EFUSE = mem:[from 0x90700000 size 0x100000]; + +/* SFlash NAR */ +define region SFLASH_NAR = mem:[from 0x16001A00 size 0x200]; + +/* SFlash User Data */ +define region SFLASH_USER_DATA = mem:[from 0x16000800 size 0x800]; + +/* SFlash Public Key, 6 SFlash rows */ +define region SFLASH_PUBLIC_KEY = mem:[from 0x16005A00 size 0xC00]; + +/* Table of Content part 2, two SFlash rows */ +define region SFLASH_TOC = mem:[from 0x16007C00 size 0x400]; + + +/* Emulated EEPROM app regions */ +define region EM_EEPROM_app0_core0 = mem:[from 0x14000000 size 0x8000]; +define region EM_EEPROM_app0_core1 = mem:[from 0x14000000 size 0x8000]; +define region EM_EEPROM_app1_core0 = mem:[from 0x14000000 size 0x8000]; +define region EM_EEPROM_app1_core1 = mem:[from 0x14000000 size 0x8000]; + +/* XIP/SMIF app regions */ +define region EROM_app0_core0 = mem:[from 0x18000000 size 0x1000]; +define region EROM_app0_core1 = mem:[from 0x18000000 size 0x1000]; +define region EROM_app1_core0 = mem:[from 0x18000000 size 0x1000]; +define region EROM_app1_core1 = mem:[from 0x18000000 size 0x1000]; + +/* used for RAM sharing across applications */ +define region IRAM_common = mem:[from 0x08000000 size 0x0100]; + +/* note: all the IRAM_appX_core0 regions has to be 0x100 aligned */ +/* and the IRAM_appX_core1 regions has to be 0x400 aligned */ +/* as they contain Interrupt Vector Table Remapped at the start */ +define region IRAM_app0_core0 = mem:[from 0x08000100 size 0x1F00]; +define region IRAM_app0_core1 = mem:[from 0x08002000 size 0x8000]; +define region IRAM_app1_core0 = mem:[from 0x08000100 size 0x1F00]; +define region IRAM_app1_core1 = mem:[from 0x08002000 size 0x8000]; + + +/* Used by all DFU SDK and CyMCUElfTool */ +define exported symbol __cy_boot_metadata_addr = 0x100FFA00; +define exported symbol __cy_boot_metadata_length = __cy_memory_0_row_size; + +/* Used by CyMCUElfTool to generate ProductID for DFU SDK apps */ +define exported symbol __cy_product_id = 0x01020304; + +/* Used by CyMCUElfTool to generate ChecksumType for DFU SDK apps */ +define exported symbol __cy_checksum_type = 0; + +/* +* The size of the application signature. +* E.g. 4 for CRC-32, +* 32 for SHA256, +* 256 for RSA 2048. +*/ +define exported symbol __cy_boot_signature_size = 4; + +/* Used by DFU SDK projects, in dfu_user.c to fill in the metadata table */ +define exported symbol __cy_app0_verify_start = start(FLASH_app0_core0); +define exported symbol __cy_app0_verify_length = size (FLASH_app0_core0) + size (FLASH_app0_core1) + - __cy_boot_signature_size; + +define exported symbol __cy_app1_verify_start = start(FLASH_app1_core0); +define exported symbol __cy_app1_verify_length = size (FLASH_app1_core0) + size (FLASH_app1_core1) + - __cy_boot_signature_size; + +/******************************************************************************* +* End of CM4 and CM0+ linker script common region +*******************************************************************************/ + + +/* CyMCUElfTool uses this symbol to set a proper app number */ +define exported symbol __cy_app_id = 0; + +/* CyMCUElfTool uses these to generate an application signature */ +/* The size of the default signature (CRC-32C) is 4 bytes */ +define exported symbol __cy_app_verify_start = start(FLASH_app0_core0); +define exported symbol __cy_app_verify_length = size(FLASH_app0_core0) + size(FLASH_app0_core1) + - __cy_boot_signature_size; + + +/*-Sizes-*/ +if (!isdefinedsymbol(__STACK_SIZE)) { + define symbol __ICFEDIT_size_cstack__ = 0x1000; +} else { + define symbol __ICFEDIT_size_cstack__ = __STACK_SIZE; +} +define symbol __ICFEDIT_size_proc_stack__ = 0x0; +if (!isdefinedsymbol(__HEAP_SIZE)) { + define symbol __ICFEDIT_size_heap__ = 0x0400; +} else { + define symbol __ICFEDIT_size_heap__ = __HEAP_SIZE; +} + + +define region IROM1_region = FLASH_app0_core1; /* Flash, user app */ +define region IROM2_region = EM_EEPROM_app0_core1; /* Emulated EEPROM */ +define region IROM3_region = SFLASH_USER_DATA; /* SFlash User Data */ +define region IROM4_region = SFLASH_NAR; /* SFlash NAR */ +define region IROM5_region = SFLASH_PUBLIC_KEY; /* SFlash Public Key */ +define region IROM6_region = SFLASH_TOC; /* SFlash TOC part 2 */ +define region IROM7_region = ROM_EFUSE; /* eFuse */ +define region EROM1_region = EROM_app0_core1; /* XIP / SMIF */ +define region IRAM1_region = IRAM_app0_core1; /* RAM */ + + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; +define block HSTACK {block HEAP, block PROC_STACK, last block CSTACK}; +define block RO {first section .intvec, readonly}; + +/*-Initializations-*/ +initialize by copy { readwrite }; +do not initialize { section .noinit, section .intvec_ram, + section .cy_boot_noinit.appId, section .cy_boot_noinit }; + + +/*-Placement-*/ + +/* Flash */ +place at start of IROM1_region { block RO }; +".cy_app_signature": place at end of IROM1_region { section .cy_app_signature }; + +/* Emulated EEPROM Flash area */ +".cy_em_eeprom" : place at start of IROM2_region { section .cy_em_eeprom }; + +/* Supervisory Flash - User Data */ +".cy_sflash_user_data" : place at start of IROM3_region { section .cy_sflash_user_data }; + +/* Supervisory Flash - NAR */ +".cy_sflash_nar" : place at start of IROM4_region { section .cy_sflash_nar }; + +/* Supervisory Flash - Public Key */ +".cy_sflash_public_key" : place at start of IROM5_region { section .cy_sflash_public_key }; + +/* Supervisory Flash - TOC2 */ +".cy_toc_part2" : place at start of IROM6_region { section .cy_toc_part2 }; + +/* eFuse */ +".cy_efuse" : place at start of IROM7_region { section .cy_efuse }; + +/* Execute in Place (XIP). See the smif driver documentation for details. */ +".cy_xip" : place at start of EROM1_region { section .cy_xip }; + +/* RAM */ +place at start of IRAM_common { readwrite section .cy_boot_noinit.appId }; +place in IRAM_common { readwrite section .cy_boot_noinit }; +place at start of IRAM1_region { readwrite section .intvec_ram}; +place in IRAM1_region { readwrite }; +place at end of IRAM1_region { block HSTACK }; + +/* These sections are used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. */ +".cymeta" : place at address mem : 0x90500000 { readonly section .cymeta }; + +/* App0 uses it to initialize DFU SDK metadata, in the dfu_user.c file */ +".cy_boot_metadata" : place at start of FLASH_boot_meta { section .cy_boot_metadata }; + +keep { section .cy_app_signature, + section .cy_em_eeprom, + section .cy_sflash_user_data, + section .cy_sflash_nar, + section .cy_sflash_public_key, + section .cy_sflash_toc_2, + section .cy_efuse, + section .cy_xip, + section .cymeta, + section .cy_boot_metadata, + section .cy_boot_noinit, + section .cy_boot_noinit.appId, + }; + + +/* EOF */ diff --git a/2020TPCApp1.cydsn/dfu_cm4.ld b/2020TPCApp1.cydsn/dfu_cm4.ld new file mode 100644 index 0000000..37ac117 --- /dev/null +++ b/2020TPCApp1.cydsn/dfu_cm4.ld @@ -0,0 +1,484 @@ +/***************************************************************************//** +* \file dfu_cm4.ld +* \version 3.0 +* +* The linker file for the GNU C compiler. +* Used for DFU SDK core1 firmware projects. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case, you may see warnings during the +* build process. In your project, simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +SEARCH_DIR(.) +GROUP(-lgcc -lc -lnosys) +ENTRY(Reset_Handler) + + +/* +* Forces symbol to be added to the output file. +* Otherwise linker may remove it if founds that it is not used in the project. +* This command has the same effect as the -u command-line option. +*/ +EXTERN(Reset_Handler) + + +/******************************************************************************* +* Start of CM4 and CM0+ linker script common region +*******************************************************************************/ + +/* +* Memory regions, for each application and MCU core. +*/ +MEMORY +{ + flash_app0_core0 (rx) : ORIGIN = 0x10000000, LENGTH = 0x10000 + flash_app0_core1 (rx) : ORIGIN = 0x10010000, LENGTH = 0x30000 + flash_app1_core0 (rx) : ORIGIN = 0x10040000, LENGTH = 0x30000 + flash_app1_core1 (rx) : ORIGIN = 0x10070000, LENGTH = 0x50000 + + flash_storage (rw) : ORIGIN = 0x100D0000, LENGTH = 0x1000 + flash_boot_meta (rw) : ORIGIN = 0x100FFA00, LENGTH = 0x400 + + sflash_user_data (rx) : ORIGIN = 0x16000800, LENGTH = 0x800 + sflash_nar (rx) : ORIGIN = 0x16001A00, LENGTH = 0x200 + sflash_public_key (rx) : ORIGIN = 0x16005A00, LENGTH = 0xC00 + sflash_toc_2 (rx) : ORIGIN = 0x16007C00, LENGTH = 0x400 + + efuse (r) : ORIGIN = 0x90700000, LENGTH = 0x100000 + + ram_common (rwx) : ORIGIN = 0x08000000, LENGTH = 0x0100 + + /* note: all the ram_appX_core0 regions has to be 0x100 aligned */ + /* and the ram_appX_core1 regions has to be 0x400 aligned */ + /* as they contain Interrupt Vector Table Remapped at the start */ + ram_app0_core0 (rwx) : ORIGIN = 0x08000100, LENGTH = 0x7F00 + ram_app0_core1 (rwx) : ORIGIN = 0x08008000, LENGTH = 0x8000 + + ram_app1_core0 (rwx) : ORIGIN = 0x08000100, LENGTH = 0x7F00 + ram_app1_core1 (rwx) : ORIGIN = 0x08008000, LENGTH = 0x30000 + + /* This is a 32K flash region used for EEPROM emulation. This region can also be used as the general purpose flash. + * You can assign sections to this memory region for only one of the cores. + * Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. + * Therefore, repurposing this memory region will prevent such middleware from operation. + */ + em_eeprom (rx) : ORIGIN = 0x14004000, LENGTH = 0x4000 /* 16 KB */ + + xip (rx) : ORIGIN = 0x18000000, LENGTH = 0x08000000 +} + +/* Regions parameters */ +/* Flash */ +__cy_memory_0_start = 0x10000000; +__cy_memory_0_length = 0x00100000; +__cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +__cy_memory_1_start = 0x14000000; +__cy_memory_1_length = 0x8000; +__cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +__cy_memory_2_start = 0x16000000; +__cy_memory_2_length = 0x8000; +__cy_memory_2_row_size = 0x200; + +/* XIP */ +__cy_memory_3_start = 0x18000000; +__cy_memory_3_length = 0x08000000; +__cy_memory_3_row_size = 0x200; + +/* eFuse */ +__cy_memory_4_start = 0x90700000; +__cy_memory_4_length = 0x100000; +__cy_memory_4_row_size = 1; + +/* The DFU SDK metadata limits */ +__cy_boot_metadata_addr = ORIGIN(flash_boot_meta); +__cy_boot_metadata_length = __cy_memory_0_row_size; + +/* The Product ID, used by CyMCUElfTool to generate a updating file */ +__cy_product_id = 0x01020304; + +/* The checksum type used by CyMCUElfTool to generate a updating file */ +__cy_checksum_type = 0x00; + +/* Used by the DFU SDK application to set the metadata */ +__cy_app0_verify_start = ORIGIN(flash_app0_core0); +__cy_app0_verify_length = LENGTH(flash_app0_core0) + LENGTH(flash_app0_core1) - __cy_boot_signature_size; +__cy_app1_verify_start = ORIGIN(flash_app1_core0); +__cy_app1_verify_length = LENGTH(flash_app1_core0) + LENGTH(flash_app1_core1) - __cy_boot_signature_size; + +/* +* The size of the application signature. +* E.g. 4 for CRC-32, +* 32 for SHA256, +* 256 for RSA 2048. +*/ +__cy_boot_signature_size = 256; + +/******************************************************************************* +* End of CM4 and CM0+ linker script common region +*******************************************************************************/ + + +/* +* DFU SDK specific: aliases regions, so the rest of code does not use +* application specific memory region names +*/ +REGION_ALIAS("flash_core0", flash_app1_core0); +REGION_ALIAS("flash", flash_app1_core1); +REGION_ALIAS("ram", ram_app1_core1); + +/* DFU SDK specific: sets an app Id */ +__cy_app_id = 1; + + +/* DFU SDK specific */ +/* CyMCUElfTool uses these ELF symbols to generate an application signature */ +__cy_app_verify_start = ORIGIN(flash_core0); +__cy_app_verify_length = LENGTH(flash_core0) + LENGTH(flash) - __cy_boot_signature_size; + + +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a libnosys.a) + +/* The linker script defines how to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * This linker script defines the symbols, which can be used by code without a definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __Vectors_End + * __Vectors_Size + * + * For the DFU SDK, these additional symbols are defined: + * __cy_app_id + * __cy_product_id + * __cy_checksum_type + * __cy_app_core1_start_addr + * __cy_boot_metadata_addr + * __cy_boot_metadata_length + */ + + +SECTIONS +{ + /* DFU SDK specific */ + /* The noinit section, used across all the applications */ + .cy_boot_noinit (NOLOAD) : + { + KEEP(*(.cy_boot_noinit)); + } > ram_common + + /* The last byte of the section is used for AppId to be shared between all the applications */ + .cy_boot_noinit.appId ORIGIN(ram_common) + LENGTH(ram_common) - 1 (NOLOAD) : + { + KEEP(*(.cy_boot_noinit.appId)); + } > ram_common + + /* App0 uses it to initialize DFU SDK metadata, in the dfu_user.c file */ + .cy_boot_metadata : + { + KEEP(*(.cy_boot_metadata)) + } > flash_boot_meta + + + .text : + { + . = ALIGN(4); + __Vectors = . ; + KEEP(*(.vectors)) + . = ALIGN(4); + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + __end__ = .; + + . = ALIGN(4); + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + /* Read-only code (constants). */ + *(.rodata .rodata.* .constdata .constdata.* .conststring .conststring.*) + + KEEP(*(.eh_frame*)) + } > flash + + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > flash + + __exidx_start = .; + + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > flash + __exidx_end = .; + + + /* To copy multiple ROM to the RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_{device}_cm4.S */ + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + + /* Copy interrupt vectors from flash to RAM */ + LONG (__Vectors) /* From */ + LONG (__ram_vectors_start__) /* To */ + LONG (__Vectors_End - __Vectors) /* Size */ + + /* Copy data section to RAM */ + LONG (__etext) /* From */ + LONG (__data_start__) /* To */ + LONG (__data_end__ - __data_start__) /* Size */ + + __copy_table_end__ = .; + } > flash + + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_{device}_cm4.S */ + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + __zero_table_end__ = .; + } > flash + + __etext = . ; + + /* + * The DFU SDK section for an app verification signature. + * Must be placed at the end of the application. + * In this case, last N bytes of the last Flash row inside the application. + */ + .cy_app_signature ABSOLUTE(ORIGIN(flash) + LENGTH(flash) - __cy_boot_signature_size) : + { + KEEP(*(.cy_app_signature)) + } > flash = 0 + + .ramVectors (NOLOAD) : ALIGN(8) + { + __ram_vectors_start__ = .; + KEEP(*(.ram_vectors)) + __ram_vectors_end__ = .; + } > ram + + + .data __ram_vectors_end__ : AT (__etext) + { + __data_start__ = .; + + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + + KEEP(*(.cy_ramfunc*)) + . = ALIGN(4); + + __data_end__ = .; + + } > ram + + + /* Place variables in the section that should not be initialized during the + * device startup. + */ + .noinit (NOLOAD) : ALIGN(8) + { + KEEP(*(.noinit)) + } > ram + + + /* The uninitialized global or static variables are placed in this section. + * + * The NOLOAD attribute tells the linker that the .bss section does not consume + * any space in the image. The NOLOAD attribute changes the .bss type to + * NOBITS, and that makes the linker: A) not allocate the section in memory; + * B) put information to clear the section with all zeros during application + * loading. + * + * Without the NOLOAD attribute, the .bss section might get the PROGBITS type. + * This makes the linker: A) allocate the zeroed section in memory; B) copy + * this section to RAM during application loading. + */ + .bss (NOLOAD): + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > ram + + + .heap (NOLOAD): + { + __HeapBase = .; + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + __HeapLimit = .; + } > ram + + + /* The .stack_dummy section doesn't contain any symbols. It is only + * used for the linker to calculate the size of the stack sections, and assign + * values to the stack symbols later */ + .stack_dummy (NOLOAD): + { + KEEP(*(.stack*)) + } > ram + + + /* Set the stack top to the end of RAM, and the stack limit move down by + * the size of the stack_dummy section */ + __StackTop = ORIGIN(ram) + LENGTH(ram); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") + + + /* Emulated EEPROM Flash area */ + .cy_em_eeprom : + { + KEEP(*(.cy_em_eeprom)) + } > em_eeprom + + + /* Supervisory Flash: User data */ + .cy_sflash_user_data : + { + KEEP(*(.cy_sflash_user_data)) + } > sflash_user_data + + + /* Supervisory Flash: Normal Access Restrictions (NAR) */ + .cy_sflash_nar : + { + KEEP(*(.cy_sflash_nar)) + } > sflash_nar + + + /* Supervisory Flash: Public Key */ + .cy_sflash_public_key : + { + KEEP(*(.cy_sflash_public_key)) + } > sflash_public_key + + + /* Supervisory Flash: Table of Content # 2 */ + .cy_toc_part2 : + { + KEEP(*(.cy_toc_part2)) + } > sflash_toc_2 + + + /* Places the code in the Execute in the Place (XIP) section. See the smif driver + * documentation for details. + */ + .cy_xip : + { + KEEP(*(.cy_xip)) + } > xip + + + /* eFuse */ + .cy_efuse : + { + KEEP(*(.cy_efuse)) + } > efuse + + + /* These sections are used for additional metadata (silicon revision, + * Silicon/JTAG ID, etc.) storage. + */ + .cymeta 0x90500000 : { KEEP(*(.cymeta)) } :NONE +} + + +/* EOF */ diff --git a/2020TPCApp1.cydsn/dfu_cm4.scat b/2020TPCApp1.cydsn/dfu_cm4.scat new file mode 100644 index 0000000..8aab5d9 --- /dev/null +++ b/2020TPCApp1.cydsn/dfu_cm4.scat @@ -0,0 +1,206 @@ +#! armcc -E +; The first line specifies a preprocessor command that the linker invokes +; to pass a scatter file through a C preprocessor. + +;******************************************************************************* +;* \file dfu_cm4.scat +;* \version 3.0 +;* +;* The linker file for the ARMCC. +;* +;* \note The entry point location is fixed and starts at 0x10000000. The valid +;* application image should be placed there. +;* +;* \note The linker files included with the PDL template projects must be +;* generic and handle all common use cases. Your project may not use every +;* section defined in the linker files. In that case, you may see the warnings +;* during the build process: L6314W (no section matches pattern) and/or L6329W +;* (pattern only matches removed unused sections). In your project, you can +;* suppress the warning by passing the "--diag_suppress=L6314W,L6329W" option to +;* the linker, simply comment out or remove the relevant code in the linker +;* file. +;* +;******************************************************************************* +;* \copyright +;* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +;* You may use this file only in accordance with the license, terms, conditions, +;* disclaimers, and limitations in the end user license agreement accompanying +;* the software package with which this file was provided. +;******************************************************************************/ + +;* DFU SDK specific: includes defines common across all the applications +#include "dfu_mdk_common.h" + +;* DFU SDK specific: defines the memory regions +;* Make sure the correct app no. is entered here + +; Flash +#define FLASH_START CY_APP0_CORE1_FLASH_ADDR +#define FLASH_SIZE CY_APP0_CORE1_FLASH_LENGTH + +; Flash Toc +#define FLASH_TOC_START CY_TOC_START +#define FLASH_TOC_SIZE CY_TOC_SIZE + +; Emulated EEPROM Flash area +#define EM_EEPROM_START CY_APP0_CORE1_EM_EEPROM_ADDR +#define EM_EEPROM_SIZE CY_APP0_CORE1_EM_EEPROM_LENGTH + +; Supervisory flash: User data +#define SFLASH_USER_DATA_START 0x16000800 +#define SFLASH_USER_DATA_SIZE 0x00000800 + +; Supervisory flash: Normal Access Restrictions (NAR) +#define SFLASH_NAR_START 0x16001A00 +#define SFLASH_NAR_SIZE 0x00000200 + +; Supervisory flash: Public Key +#define SFLASH_PUBLIC_KEY_START 0x16005A00 +#define SFLASH_PUBLIC_KEY_SIZE 0x00000C00 + +; Supervisory flash: Table of Content # 2 +#define SFLASH_TOC_2_START 0x16007C00 +#define SFLASH_TOC_2_SIZE 0x00000400 + +; External memory +#define XIP_START CY_APP0_CORE1_SMIF_ADDR +#define XIP_SIZE CY_APP0_CORE1_SMIF_LENGTH + +; eFuse +#define EFUSE_START 0x90700000 +#define EFUSE_SIZE 0x100000 + +; RAM +#define RAM_START CY_APP0_CORE1_RAM_ADDR +#define RAM_SIZE CY_APP0_CORE1_RAM_LENGTH + + +LR_FLASH FLASH_START FLASH_SIZE +{ + ER_FLASH_VECTORS +0 + { + * (RESET, +FIRST) + } + + ER_FLASH_CODE +0 FIXED + { + * (InRoot$$Sections) + * (+RO) + } + + ER_RAM_COMMON CY_APP_RAM_COMMON_ADDR UNINIT + { + * (.cy_boot_noinit.appId) + } + + ER_RAM_VECTORS RAM_START UNINIT + { + * (RESET_RAM, +FIRST) + } + + ER_RAM_DATA +0 + { + * (.cy_ramfunc) + .ANY (+RW, +ZI) + } + + ; Place variables in the section that should not be initialized during + ; a device startup. + ER_RAM_NOINIT_DATA +0 UNINIT + { + * (.noinit) + } + + + ; Used for the digital signature of the secure application and the + ; DFU SDK application. The size of the section depends on the required + ; data size. + .cy_app_signature (FLASH_START + FLASH_SIZE - CY_BOOT_SIGNATURE_SIZE) FIXED + { + * (.cy_app_signature) + } +} + +; App0 uses it to initialize DFU SDK metadata, in dfu_user.c file +LR_CY_BOOT_METADATA CY_BOOT_META_FLASH_ADDR CY_BOOT_META_FLASH_LENGTH +{ + .cy_boot_metadata + 0 + { + * (.cy_boot_metadata) + } +} + +; Emulated EEPROM Flash area +LR_EM_EEPROM EM_EEPROM_START EM_EEPROM_SIZE +{ + .cy_em_eeprom +0 + { + * (.cy_em_eeprom) + } +} + +; Supervisory Flash: User data +LR_SFLASH_USER_DATA SFLASH_USER_DATA_START SFLASH_USER_DATA_SIZE +{ + .cy_sflash_user_data +0 + { + * (.cy_sflash_user_data) + } +} + +; Supervisory Flash: Normal Access Restrictions (NAR) +LR_SFLASH_NAR SFLASH_NAR_START SFLASH_NAR_SIZE +{ + .cy_sflash_nar +0 + { + * (.cy_sflash_nar) + } +} + +; Supervisory Flash: Public Key +LR_SFLASH_PUBLIC_KEY SFLASH_PUBLIC_KEY_START SFLASH_PUBLIC_KEY_SIZE +{ + .cy_sflash_public_key +0 + { + * (.cy_sflash_public_key) + } +} + +; Supervisory Flash: Table of Content # 2 +LR_SFLASH_TOC_2 SFLASH_TOC_2_START SFLASH_TOC_2_SIZE +{ + .cy_toc_part2 +0 + { + * (.cy_toc_part2) + } +} + + +; Places the code in the Execute in Place (XIP) section. See the smif driver documentation for details. +LR_EROM XIP_START XIP_SIZE +{ + .cy_xip +0 + { + * (.cy_xip) + } +} + + +; eFuse +LR_EFUSE EFUSE_START EFUSE_SIZE +{ + .cy_efuse +0 + { + * (.cy_efuse) + } +} + + +; The section is used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. +CYMETA 0x90500000 +{ + .cymeta +0 { * (.cymeta) } +} + + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/dfu_mdk_common.h b/2020TPCApp1.cydsn/dfu_mdk_common.h new file mode 100644 index 0000000..e50b562 --- /dev/null +++ b/2020TPCApp1.cydsn/dfu_mdk_common.h @@ -0,0 +1,114 @@ +/******************************************************************************* +* \file dfu_mdk_common.h +* \version 3.0 +* +* This file provides only macro definitions to use for +* project configuration. +* They may be used in both scatter files and source code files. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef DFU_MDK_COMMON_H_ +#define DFU_MDK_COMMON_H_ + +/* DFU SDK parameters */ +/* The user application may either update them or leave the defaults if they fit */ +#define CY_BOOT_METADATA_ADDR 0x100FFA00 +#define CY_BOOT_METADATA_LENGTH 0x200 +#define CY_PRODUCT_ID 0x01020304 +#define CY_CHECKSUM_TYPE 0x00 + +/* +* The size of the section .cy_app_signature. +* 1,2, or 4 for a checksum +* 4 for CRC-32 +* 20 for SHA1 +* 32 for SHA256 +* 256 for RSASSA-PKCS1-v1.5 with the 2048 bit RSA key. +* +* SHA1 must be used. +*/ +#define CY_BOOT_SIGNATURE_SIZE 4 + +/* For the MDK linker script, defines TOC parameters */ +/* Update per device series to be in the last Flash row */ +#define CY_TOC_START 0x16007C00 +#define CY_TOC_SIZE 0x400 + + +/* Memory region ranges per core and app */ +#define CY_APP0_CORE0_FLASH_ADDR 0x10000000 +#define CY_APP0_CORE0_FLASH_LENGTH 0x10000 + +#define CY_APP0_CORE1_FLASH_ADDR 0x10010000 +#define CY_APP0_CORE1_FLASH_LENGTH 0x10000 + +#define CY_APP1_CORE0_FLASH_ADDR 0x10040000 +#define CY_APP1_CORE0_FLASH_LENGTH 0x10000 + +#define CY_APP1_CORE1_FLASH_ADDR 0x10050000 +#define CY_APP1_CORE1_FLASH_LENGTH 0x10000 + +/* DFU SDK metadata address range in Flash */ +#define CY_BOOT_META_FLASH_ADDR 0x100FFA00 +#define CY_BOOT_META_FLASH_LENGTH 0x200 + +/* Application ranges in emulated EEPROM */ +#define CY_APP0_CORE0_EM_EEPROM_ADDR 0x14000000 +#define CY_APP0_CORE0_EM_EEPROM_LENGTH 0x00000000 + +#define CY_APP0_CORE1_EM_EEPROM_ADDR (CY_APP0_CORE0_EM_EEPROM_ADDR + CY_APP0_CORE0_EM_EEPROM_LENGTH) +#define CY_APP0_CORE1_EM_EEPROM_LENGTH 0x0000 + +#define CY_APP1_CORE0_EM_EEPROM_ADDR 0x14000000 +#define CY_APP1_CORE0_EM_EEPROM_LENGTH 0x00000000 + +#define CY_APP1_CORE1_EM_EEPROM_ADDR (CY_APP1_CORE0_EM_EEPROM_ADDR + CY_APP1_CORE0_EM_EEPROM_LENGTH) +#define CY_APP1_CORE1_EM_EEPROM_LENGTH 0x00000000 + +/* Application ranges in SMIF XIP */ +#define CY_APP0_CORE0_SMIF_ADDR 0x18000000 +#define CY_APP0_CORE0_SMIF_LENGTH 0x00000000 + +#define CY_APP0_CORE1_SMIF_ADDR (CY_APP0_CORE0_SMIF_ADDR + CY_APP0_CORE0_SMIF_LENGTH) +#define CY_APP0_CORE1_SMIF_LENGTH 0x00000000 + +#define CY_APP1_CORE0_SMIF_ADDR 0x14000200 +#define CY_APP1_CORE0_SMIF_LENGTH 0x00000000 + +#define CY_APP1_CORE1_SMIF_ADDR (CY_APP1_CORE0_SMIF_ADDR + CY_APP1_CORE0_SMIF_LENGTH) +#define CY_APP1_CORE1_SMIF_LENGTH 0x00000000 + +/* Application ranges in RAM */ +#define CY_APP_RAM_COMMON_ADDR 0x08000000 +#define CY_APP_RAM_COMMON_LENGTH 0x00000100 + +/* note: all the CY_APPX_CORE0_RAM regions has to be 0x100 aligned */ +/* and the CY_APPX_CORE1_RAM regions has to be 0x400 aligned */ +/* as they contain Interrupt Vector Table Remapped at the start */ + +#define CY_APP0_CORE0_RAM_ADDR 0x08000100 +#define CY_APP0_CORE0_RAM_LENGTH 0x00001F00 + +#define CY_APP0_CORE1_RAM_ADDR (CY_APP0_CORE0_RAM_ADDR + CY_APP0_CORE0_RAM_LENGTH) +#define CY_APP0_CORE1_RAM_LENGTH 0x00008000 + +#define CY_APP1_CORE0_RAM_ADDR CY_APP0_CORE0_RAM_ADDR +#define CY_APP1_CORE0_RAM_LENGTH 0x00001F00 + +#define CY_APP1_CORE1_RAM_ADDR (CY_APP1_CORE0_RAM_ADDR + CY_APP1_CORE0_RAM_LENGTH) +#define CY_APP1_CORE1_RAM_LENGTH 0x00008000 + + +__asm void cy_DFU_mdkAsmDummy(void); + +#endif /* DFU_MDK_COMMON_H_ */ + + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/dfu_mdk_symbols.c b/2020TPCApp1.cydsn/dfu_mdk_symbols.c new file mode 100644 index 0000000..fd3a950 --- /dev/null +++ b/2020TPCApp1.cydsn/dfu_mdk_symbols.c @@ -0,0 +1,66 @@ +/******************************************************************************* +* \file dfu_mdk_symbols.c +* \version 3.0 +* +* This file provides symbols to add to an ELF file required by +* CyMCUElfTool to generate correct HEX and CYACD2 files. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "dfu_mdk_common.h" + +/******************************************************************************* +* Function Name: cy_DFU_mdkAsmDummy +******************************************************************************** +* This function provides ELF file symbols through +* the inline assembly. +* The inline assembly in the *.c file is chosen, because it allows using +* #include where the user configuration is updated. +* +* Note that this function does not have code, so no additional memory +* is allocated for it. +*******************************************************************************/ +__asm void cy_DFU_mdkAsmDummy(void) +{ + EXPORT __cy_boot_metadata_addr + EXPORT __cy_boot_metadata_length + + EXPORT __cy_app_core1_start_addr + + EXPORT __cy_product_id + EXPORT __cy_checksum_type + EXPORT __cy_app_id + + EXPORT __cy_app_verify_start + EXPORT __cy_app_verify_length + +/* Used by all DFU SDK applications to switch to another app */ +__cy_boot_metadata_addr EQU __cpp(CY_BOOT_METADATA_ADDR) +/* Used by CyMCUElfTool to update DFU SDK metadata with CRC-32C */ +__cy_boot_metadata_length EQU __cpp(CY_BOOT_METADATA_LENGTH) + +/* Used by CM0+ to start CM4 core in the DFU SDK applications. */ +/* Make sure the correct app no. is entered here */ +__cy_app_core1_start_addr EQU __cpp(CY_APP0_CORE1_FLASH_ADDR) + +/* Used by CyMCUElfTool to generate ProductID */ +__cy_product_id EQU __cpp(CY_PRODUCT_ID) +/* Used by CyMCUElfTool to generate ChecksumType */ +__cy_checksum_type EQU __cpp(CY_CHECKSUM_TYPE) +/* Application number (ID) */ +__cy_app_id EQU 0 + +/* CyMCUElfTool uses these to generate an application signature */ +/* The size of the default signature (CRC-32C) is 4 bytes */ +__cy_app_verify_start EQU __cpp(CY_APP0_CORE0_FLASH_ADDR) +__cy_app_verify_length EQU __cpp(CY_APP0_CORE0_FLASH_LENGTH + CY_APP0_CORE1_FLASH_LENGTH - CY_BOOT_SIGNATURE_SIZE) +} + + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/dfu_user.h b/2020TPCApp1.cydsn/dfu_user.h new file mode 100644 index 0000000..e832d20 --- /dev/null +++ b/2020TPCApp1.cydsn/dfu_user.h @@ -0,0 +1,151 @@ +/***************************************************************************//** +* \file dfu_user.h +* \version 3.0 +* +* This file provides declarations that can be modified by the user but +* are used by the DFU SDK. +* +******************************************************************************** +* \copyright +* Copyright 2016-2019, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#if !defined(DFU_USER_H) +#define DFU_USER_H + +#include +#include "cy_flash.h" + + +/** +* \addtogroup group_dfu_macro_config +* \{ +*/ + +/** The size of a buffer to hold DFU commands */ +/* 16 bytes is a maximum overhead of a DFU packet and additional data for the Program Data command */ +#define CY_DFU_SIZEOF_CMD_BUFFER (CY_FLASH_SIZEOF_ROW + 16u) + +/** The size of a buffer to hold an NVM row of data to write or verify */ +#define CY_DFU_SIZEOF_DATA_BUFFER (CY_FLASH_SIZEOF_ROW + 16u) + +/** +* Set to non-zero for the DFU SDK Program Data command to check +* if the Golden image is going to be overwritten while updating. +*/ +#define CY_DFU_OPT_GOLDEN_IMAGE (0) + +/** +* List of Golden Image Application IDs. +* Here "Golden Image Application" means an application that cannot be changed with +* CommandProgramData() +* +* Usage. Define the list of Golden Image Application IDs without enclosing +* parenthesis, e.g. +* \code #define CY_DFU_GOLDEN_IMAGE_IDS() 0u, 1u, 3u \endcode +* later it is used in cy_dfu.c file: +* \code uint8_t goldenImages[] = { CY_DFU_GOLDEN_IMAGE_IDS() }; \endcode +*/ +#define CY_DFU_GOLDEN_IMAGE_IDS() 0u + +/** +* The number of applications in the metadata, +* for 512 bytes in a Flash row - 63 is the maximum possible value, +* because 4 bytes are reserved for the entire metadata CRC. +* +* The smallest metadata size if CY_DFU_MAX_APPS * 8 (bytes per one app) + 4 (bytes for CRC-32C) +*/ +#define CY_DFU_MAX_APPS (2u) + + +/** A non-zero value enables the Verify Data DFU command */ +#define CY_DFU_OPT_VERIFY_DATA (1) + +/** A non-zero value enables the Erase Data DFU command */ +#define CY_DFU_OPT_ERASE_DATA (1) + +/** A non-zero value enables the Verify App DFU command */ +#define CY_DFU_OPT_VERIFY_APP (1) + +/** +* A non-zero value enables the Send Data DFU command. +* If the "Send Data" DFU command is enabled, \c packetBuffer and \c dataBuffer +* must be non-overlapping. +* +* Else, \c dataBuffer must be inside \c packetBuffer with an offset of +* \c CY_DFU_PACKET_DATA_IDX, typically 4 bytes. \n +* params->dataBuffer = &packetBuffer[4]; \n +* \note that \c packetBuffer in this case must be 4 bytes aligned, as +* \c dataBuffer is required to be 4 bytes aligned. +*/ +#define CY_DFU_OPT_SEND_DATA (1) + +/** A non-zero value enables the Get Metadata DFU command */ +#define CY_DFU_OPT_GET_METADATA (1) + +/** A non-zero value enables the Set EI Vector DFU command */ +#define CY_DFU_OPT_SET_EIVECTOR (0) + +/** +* A non-zero value allows writing metadata +* with the Set App Metadata DFU command. +*/ +#define CY_DFU_METADATA_WRITABLE (1) + +/** Non-zero value enables the usage of hardware Crypto API */ +#define CY_DFU_OPT_CRYPTO_HW (0) + +/** A non-zero value enables the usage of CRC-16 for DFU packet verification */ +#define CY_DFU_OPT_PACKET_CRC (0) + +/** Set the default application-format-possible values defined in \ref group_dfu_macro_app_type */ +#define CY_DFU_APP_FORMAT (CY_DFU_BASIC_APP) + +/** Set the default secure application-verification-type possible values + * defined in \ref group_dfu_macro_ver_type */ +#define CY_DFU_SEC_APP_VERIFY_TYPE (CY_DFU_VERIFY_FAST) + +/** \} group_dfu_macro_config */ + +#if !defined(CY_DOXYGEN) + #if defined(__GNUC__) || defined(__ICCARM__) + /* + * These variables are defined in the linker scripts, the values of their addresses define + * corresponding applications start address and length. + */ + extern uint8_t __cy_app0_verify_start; + extern uint8_t __cy_app0_verify_length; + extern uint8_t __cy_app1_verify_start; + extern uint8_t __cy_app1_verify_length; + extern uint8_t __cy_boot_signature_size; + + #define CY_DFU_APP0_VERIFY_START ( (uint32_t)&__cy_app0_verify_start ) + #define CY_DFU_APP0_VERIFY_LENGTH ( (uint32_t)&__cy_app0_verify_length ) + #define CY_DFU_APP1_VERIFY_START ( (uint32_t)&__cy_app1_verify_start ) + #define CY_DFU_APP1_VERIFY_LENGTH ( (uint32_t)&__cy_app1_verify_length ) + #define CY_DFU_SIGNATURE_SIZE ( (uint32_t)&__cy_boot_signature_size ) + + #elif defined(__ARMCC_VERSION) + #include "dfu_mdk_common.h" + + #define CY_DFU_APP0_VERIFY_START ( CY_APP0_CORE0_FLASH_ADDR ) + #define CY_DFU_APP0_VERIFY_LENGTH ( CY_APP0_CORE0_FLASH_LENGTH + CY_APP0_CORE1_FLASH_LENGTH \ + - CY_BOOT_SIGNATURE_SIZE) + #define CY_DFU_APP1_VERIFY_START ( CY_APP1_CORE0_FLASH_ADDR ) + #define CY_DFU_APP1_VERIFY_LENGTH ( CY_APP1_CORE0_FLASH_LENGTH + CY_APP1_CORE1_FLASH_LENGTH \ + - CY_BOOT_SIGNATURE_SIZE) + #define CY_DFU_SIGNATURE_SIZE CY_BOOT_SIGNATURE_SIZE + + #else + #error "Not implemented for this compiler" + #endif /* defined(__GNUC__) || defined(__ICCARM__) */ +#endif /* !defined(CY_DOXYGEN) */ + + +#endif /* !defined(DFU_USER_H) */ + + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/gcc/startup_psoc6_01_cm0plus.S b/2020TPCApp1.cydsn/gcc/startup_psoc6_01_cm0plus.S new file mode 100644 index 0000000..e26df0a --- /dev/null +++ b/2020TPCApp1.cydsn/gcc/startup_psoc6_01_cm0plus.S @@ -0,0 +1,404 @@ +/**************************************************************************//** + * @file startup_psoc6_01_cm0plus.S + * @brief CMSIS Core Device Startup File for + * ARMCM0plus Device Series + * @version V5.00 + * @date 02. March 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + /* Address of the NMI handler */ + #define CY_NMI_HANLDER_ADDR 0x0000000D + + /* The CPU VTOR register */ + #define CY_CPU_VTOR_ADDR 0xE000ED08 + + /* Copy flash vectors and data section to RAM */ + #define __STARTUP_COPY_MULTIPLE + + /* Clear single BSS section */ + #define __STARTUP_CLEAR_BSS + + .syntax unified + .arch armv6-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00001000 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000400 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long CY_NMI_HANLDER_ADDR /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts Description */ + .long NvicMux0_IRQHandler /* CM0+ NVIC Mux input 0 */ + .long NvicMux1_IRQHandler /* CM0+ NVIC Mux input 1 */ + .long NvicMux2_IRQHandler /* CM0+ NVIC Mux input 2 */ + .long NvicMux3_IRQHandler /* CM0+ NVIC Mux input 3 */ + .long NvicMux4_IRQHandler /* CM0+ NVIC Mux input 4 */ + .long NvicMux5_IRQHandler /* CM0+ NVIC Mux input 5 */ + .long NvicMux6_IRQHandler /* CM0+ NVIC Mux input 6 */ + .long NvicMux7_IRQHandler /* CM0+ NVIC Mux input 7 */ + .long NvicMux8_IRQHandler /* CM0+ NVIC Mux input 8 */ + .long NvicMux9_IRQHandler /* CM0+ NVIC Mux input 9 */ + .long NvicMux10_IRQHandler /* CM0+ NVIC Mux input 10 */ + .long NvicMux11_IRQHandler /* CM0+ NVIC Mux input 11 */ + .long NvicMux12_IRQHandler /* CM0+ NVIC Mux input 12 */ + .long NvicMux13_IRQHandler /* CM0+ NVIC Mux input 13 */ + .long NvicMux14_IRQHandler /* CM0+ NVIC Mux input 14 */ + .long NvicMux15_IRQHandler /* CM0+ NVIC Mux input 15 */ + .long NvicMux16_IRQHandler /* CM0+ NVIC Mux input 16 */ + .long NvicMux17_IRQHandler /* CM0+ NVIC Mux input 17 */ + .long NvicMux18_IRQHandler /* CM0+ NVIC Mux input 18 */ + .long NvicMux19_IRQHandler /* CM0+ NVIC Mux input 19 */ + .long NvicMux20_IRQHandler /* CM0+ NVIC Mux input 20 */ + .long NvicMux21_IRQHandler /* CM0+ NVIC Mux input 21 */ + .long NvicMux22_IRQHandler /* CM0+ NVIC Mux input 22 */ + .long NvicMux23_IRQHandler /* CM0+ NVIC Mux input 23 */ + .long NvicMux24_IRQHandler /* CM0+ NVIC Mux input 24 */ + .long NvicMux25_IRQHandler /* CM0+ NVIC Mux input 25 */ + .long NvicMux26_IRQHandler /* CM0+ NVIC Mux input 26 */ + .long NvicMux27_IRQHandler /* CM0+ NVIC Mux input 27 */ + .long NvicMux28_IRQHandler /* CM0+ NVIC Mux input 28 */ + .long NvicMux29_IRQHandler /* CM0+ NVIC Mux input 29 */ + .long NvicMux30_IRQHandler /* CM0+ NVIC Mux input 30 */ + .long NvicMux31_IRQHandler /* CM0+ NVIC Mux input 31 */ + + .size __Vectors, . - __Vectors + .equ __VectorsSize, . - __Vectors + + .section .ram_vectors + .align 2 + .globl __ramVectors +__ramVectors: + .space __VectorsSize + .size __ramVectors, . - __ramVectors + + + .text + .thumb + .thumb_func + .align 2 + + /* + * Device startup customization + * + * Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) + * because this function is executed as the first instruction in the ResetHandler. + * The PDL is also not initialized to use the proper register offsets. + * The user of this function is responsible for initializing the PDL and resources before using them. + */ + .weak Cy_OnResetUser + .func Cy_OnResetUser, Cy_OnResetUser + .type Cy_OnResetUser, %function + +Cy_OnResetUser: + bx lr + .size Cy_OnResetUser, . - Cy_OnResetUser + .endfunc + + /* Reset handler */ + .weak Reset_Handler + .type Reset_Handler, %function + +Reset_Handler: + bl Cy_OnResetUser + cpsid i + +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + blt .L_loop0_0_done + ldr r0, [r1, r3] + str r0, [r2, r3] + b .L_loop0_0 + +.L_loop0_0_done: + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + + subs r3, r2 + ble .L_loop1_done + +.L_loop1: + subs r3, #4 + ldr r0, [r1,r3] + str r0, [r2,r3] + bgt .L_loop1 + +.L_loop1_done: +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise define macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + blt .L_loop2_0_done + str r0, [r1, r2] + b .L_loop2_0 +.L_loop2_0_done: + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 + + subs r2, r1 + ble .L_loop3_done + +.L_loop3: + subs r2, #4 + str r0, [r1, r2] + bgt .L_loop3 +.L_loop3_done: +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + + /* Update Vector Table Offset Register. */ + ldr r0, =__ramVectors + ldr r1, =CY_CPU_VTOR_ADDR + str r0, [r1] + dsb 0xF + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + + bl main + + /* Should never get here */ + b . + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + .weak Cy_SysLib_FaultHandler + .type Cy_SysLib_FaultHandler, %function + +Cy_SysLib_FaultHandler: + b . + .size Cy_SysLib_FaultHandler, . - Cy_SysLib_FaultHandler + .type Fault_Handler, %function + +Fault_Handler: + /* Storing LR content for Creator call stack trace */ + push {LR} + movs r0, #4 + mov r1, LR + tst r0, r1 + beq .L_MSP + mrs r0, PSP + b .L_API_call +.L_MSP: + mrs r0, MSP +.L_API_call: + /* Compensation of stack pointer address due to pushing 4 bytes of LR */ + adds r0, r0, #4 + bl Cy_SysLib_FaultHandler + b . + .size Fault_Handler, . - Fault_Handler + +.macro def_fault_Handler fault_handler_name + .weak \fault_handler_name + .set \fault_handler_name, Fault_Handler + .endm + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + + def_fault_Handler HardFault_Handler + + def_irq_handler SVC_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler NvicMux0_IRQHandler /* CM0+ NVIC Mux input 0 */ + def_irq_handler NvicMux1_IRQHandler /* CM0+ NVIC Mux input 1 */ + def_irq_handler NvicMux2_IRQHandler /* CM0+ NVIC Mux input 2 */ + def_irq_handler NvicMux3_IRQHandler /* CM0+ NVIC Mux input 3 */ + def_irq_handler NvicMux4_IRQHandler /* CM0+ NVIC Mux input 4 */ + def_irq_handler NvicMux5_IRQHandler /* CM0+ NVIC Mux input 5 */ + def_irq_handler NvicMux6_IRQHandler /* CM0+ NVIC Mux input 6 */ + def_irq_handler NvicMux7_IRQHandler /* CM0+ NVIC Mux input 7 */ + def_irq_handler NvicMux8_IRQHandler /* CM0+ NVIC Mux input 8 */ + def_irq_handler NvicMux9_IRQHandler /* CM0+ NVIC Mux input 9 */ + def_irq_handler NvicMux10_IRQHandler /* CM0+ NVIC Mux input 10 */ + def_irq_handler NvicMux11_IRQHandler /* CM0+ NVIC Mux input 11 */ + def_irq_handler NvicMux12_IRQHandler /* CM0+ NVIC Mux input 12 */ + def_irq_handler NvicMux13_IRQHandler /* CM0+ NVIC Mux input 13 */ + def_irq_handler NvicMux14_IRQHandler /* CM0+ NVIC Mux input 14 */ + def_irq_handler NvicMux15_IRQHandler /* CM0+ NVIC Mux input 15 */ + def_irq_handler NvicMux16_IRQHandler /* CM0+ NVIC Mux input 16 */ + def_irq_handler NvicMux17_IRQHandler /* CM0+ NVIC Mux input 17 */ + def_irq_handler NvicMux18_IRQHandler /* CM0+ NVIC Mux input 18 */ + def_irq_handler NvicMux19_IRQHandler /* CM0+ NVIC Mux input 19 */ + def_irq_handler NvicMux20_IRQHandler /* CM0+ NVIC Mux input 20 */ + def_irq_handler NvicMux21_IRQHandler /* CM0+ NVIC Mux input 21 */ + def_irq_handler NvicMux22_IRQHandler /* CM0+ NVIC Mux input 22 */ + def_irq_handler NvicMux23_IRQHandler /* CM0+ NVIC Mux input 23 */ + def_irq_handler NvicMux24_IRQHandler /* CM0+ NVIC Mux input 24 */ + def_irq_handler NvicMux25_IRQHandler /* CM0+ NVIC Mux input 25 */ + def_irq_handler NvicMux26_IRQHandler /* CM0+ NVIC Mux input 26 */ + def_irq_handler NvicMux27_IRQHandler /* CM0+ NVIC Mux input 27 */ + def_irq_handler NvicMux28_IRQHandler /* CM0+ NVIC Mux input 28 */ + def_irq_handler NvicMux29_IRQHandler /* CM0+ NVIC Mux input 29 */ + def_irq_handler NvicMux30_IRQHandler /* CM0+ NVIC Mux input 30 */ + def_irq_handler NvicMux31_IRQHandler /* CM0+ NVIC Mux input 31 */ + + .end + + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/gcc/startup_psoc6_01_cm4.S b/2020TPCApp1.cydsn/gcc/startup_psoc6_01_cm4.S new file mode 100644 index 0000000..b904621 --- /dev/null +++ b/2020TPCApp1.cydsn/gcc/startup_psoc6_01_cm4.S @@ -0,0 +1,635 @@ +/**************************************************************************//** + * @file startup_psoc6_01_cm4.S + * @brief CMSIS Core Device Startup File for + * ARMCM4 Device Series + * @version V5.00 + * @date 02. March 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + /* Address of the NMI handler */ + #define CY_NMI_HANLDER_ADDR 0x0000000D + + /* The CPU VTOR register */ + #define CY_CPU_VTOR_ADDR 0xE000ED08 + + /* Copy flash vectors and data section to RAM */ + #define __STARTUP_COPY_MULTIPLE + + /* Clear single BSS section */ + #define __STARTUP_CLEAR_BSS + + .syntax unified + .arch armv7-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00001000 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000400 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long CY_NMI_HANLDER_ADDR /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long MemManage_Handler /* MPU Fault Handler */ + .long BusFault_Handler /* Bus Fault Handler */ + .long UsageFault_Handler /* Usage Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long DebugMon_Handler /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts Description */ + .long ioss_interrupts_gpio_0_IRQHandler /* GPIO Port Interrupt #0 */ + .long ioss_interrupts_gpio_1_IRQHandler /* GPIO Port Interrupt #1 */ + .long ioss_interrupts_gpio_2_IRQHandler /* GPIO Port Interrupt #2 */ + .long ioss_interrupts_gpio_3_IRQHandler /* GPIO Port Interrupt #3 */ + .long ioss_interrupts_gpio_4_IRQHandler /* GPIO Port Interrupt #4 */ + .long ioss_interrupts_gpio_5_IRQHandler /* GPIO Port Interrupt #5 */ + .long ioss_interrupts_gpio_6_IRQHandler /* GPIO Port Interrupt #6 */ + .long ioss_interrupts_gpio_7_IRQHandler /* GPIO Port Interrupt #7 */ + .long ioss_interrupts_gpio_8_IRQHandler /* GPIO Port Interrupt #8 */ + .long ioss_interrupts_gpio_9_IRQHandler /* GPIO Port Interrupt #9 */ + .long ioss_interrupts_gpio_10_IRQHandler /* GPIO Port Interrupt #10 */ + .long ioss_interrupts_gpio_11_IRQHandler /* GPIO Port Interrupt #11 */ + .long ioss_interrupts_gpio_12_IRQHandler /* GPIO Port Interrupt #12 */ + .long ioss_interrupts_gpio_13_IRQHandler /* GPIO Port Interrupt #13 */ + .long ioss_interrupts_gpio_14_IRQHandler /* GPIO Port Interrupt #14 */ + .long ioss_interrupt_gpio_IRQHandler /* GPIO All Ports */ + .long ioss_interrupt_vdd_IRQHandler /* GPIO Supply Detect Interrupt */ + .long lpcomp_interrupt_IRQHandler /* Low Power Comparator Interrupt */ + .long scb_8_interrupt_IRQHandler /* Serial Communication Block #8 (DeepSleep capable) */ + .long srss_interrupt_mcwdt_0_IRQHandler /* Multi Counter Watchdog Timer interrupt */ + .long srss_interrupt_mcwdt_1_IRQHandler /* Multi Counter Watchdog Timer interrupt */ + .long srss_interrupt_backup_IRQHandler /* Backup domain interrupt */ + .long srss_interrupt_IRQHandler /* Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) */ + .long pass_interrupt_ctbs_IRQHandler /* CTBm Interrupt (all CTBms) */ + .long bless_interrupt_IRQHandler /* Bluetooth Radio interrupt */ + .long cpuss_interrupts_ipc_0_IRQHandler /* CPUSS Inter Process Communication Interrupt #0 */ + .long cpuss_interrupts_ipc_1_IRQHandler /* CPUSS Inter Process Communication Interrupt #1 */ + .long cpuss_interrupts_ipc_2_IRQHandler /* CPUSS Inter Process Communication Interrupt #2 */ + .long cpuss_interrupts_ipc_3_IRQHandler /* CPUSS Inter Process Communication Interrupt #3 */ + .long cpuss_interrupts_ipc_4_IRQHandler /* CPUSS Inter Process Communication Interrupt #4 */ + .long cpuss_interrupts_ipc_5_IRQHandler /* CPUSS Inter Process Communication Interrupt #5 */ + .long cpuss_interrupts_ipc_6_IRQHandler /* CPUSS Inter Process Communication Interrupt #6 */ + .long cpuss_interrupts_ipc_7_IRQHandler /* CPUSS Inter Process Communication Interrupt #7 */ + .long cpuss_interrupts_ipc_8_IRQHandler /* CPUSS Inter Process Communication Interrupt #8 */ + .long cpuss_interrupts_ipc_9_IRQHandler /* CPUSS Inter Process Communication Interrupt #9 */ + .long cpuss_interrupts_ipc_10_IRQHandler /* CPUSS Inter Process Communication Interrupt #10 */ + .long cpuss_interrupts_ipc_11_IRQHandler /* CPUSS Inter Process Communication Interrupt #11 */ + .long cpuss_interrupts_ipc_12_IRQHandler /* CPUSS Inter Process Communication Interrupt #12 */ + .long cpuss_interrupts_ipc_13_IRQHandler /* CPUSS Inter Process Communication Interrupt #13 */ + .long cpuss_interrupts_ipc_14_IRQHandler /* CPUSS Inter Process Communication Interrupt #14 */ + .long cpuss_interrupts_ipc_15_IRQHandler /* CPUSS Inter Process Communication Interrupt #15 */ + .long scb_0_interrupt_IRQHandler /* Serial Communication Block #0 */ + .long scb_1_interrupt_IRQHandler /* Serial Communication Block #1 */ + .long scb_2_interrupt_IRQHandler /* Serial Communication Block #2 */ + .long scb_3_interrupt_IRQHandler /* Serial Communication Block #3 */ + .long scb_4_interrupt_IRQHandler /* Serial Communication Block #4 */ + .long scb_5_interrupt_IRQHandler /* Serial Communication Block #5 */ + .long scb_6_interrupt_IRQHandler /* Serial Communication Block #6 */ + .long scb_7_interrupt_IRQHandler /* Serial Communication Block #7 */ + .long csd_interrupt_IRQHandler /* CSD (Capsense) interrupt */ + .long cpuss_interrupts_dw0_0_IRQHandler /* CPUSS DataWire #0, Channel #0 */ + .long cpuss_interrupts_dw0_1_IRQHandler /* CPUSS DataWire #0, Channel #1 */ + .long cpuss_interrupts_dw0_2_IRQHandler /* CPUSS DataWire #0, Channel #2 */ + .long cpuss_interrupts_dw0_3_IRQHandler /* CPUSS DataWire #0, Channel #3 */ + .long cpuss_interrupts_dw0_4_IRQHandler /* CPUSS DataWire #0, Channel #4 */ + .long cpuss_interrupts_dw0_5_IRQHandler /* CPUSS DataWire #0, Channel #5 */ + .long cpuss_interrupts_dw0_6_IRQHandler /* CPUSS DataWire #0, Channel #6 */ + .long cpuss_interrupts_dw0_7_IRQHandler /* CPUSS DataWire #0, Channel #7 */ + .long cpuss_interrupts_dw0_8_IRQHandler /* CPUSS DataWire #0, Channel #8 */ + .long cpuss_interrupts_dw0_9_IRQHandler /* CPUSS DataWire #0, Channel #9 */ + .long cpuss_interrupts_dw0_10_IRQHandler /* CPUSS DataWire #0, Channel #10 */ + .long cpuss_interrupts_dw0_11_IRQHandler /* CPUSS DataWire #0, Channel #11 */ + .long cpuss_interrupts_dw0_12_IRQHandler /* CPUSS DataWire #0, Channel #12 */ + .long cpuss_interrupts_dw0_13_IRQHandler /* CPUSS DataWire #0, Channel #13 */ + .long cpuss_interrupts_dw0_14_IRQHandler /* CPUSS DataWire #0, Channel #14 */ + .long cpuss_interrupts_dw0_15_IRQHandler /* CPUSS DataWire #0, Channel #15 */ + .long cpuss_interrupts_dw1_0_IRQHandler /* CPUSS DataWire #1, Channel #0 */ + .long cpuss_interrupts_dw1_1_IRQHandler /* CPUSS DataWire #1, Channel #1 */ + .long cpuss_interrupts_dw1_2_IRQHandler /* CPUSS DataWire #1, Channel #2 */ + .long cpuss_interrupts_dw1_3_IRQHandler /* CPUSS DataWire #1, Channel #3 */ + .long cpuss_interrupts_dw1_4_IRQHandler /* CPUSS DataWire #1, Channel #4 */ + .long cpuss_interrupts_dw1_5_IRQHandler /* CPUSS DataWire #1, Channel #5 */ + .long cpuss_interrupts_dw1_6_IRQHandler /* CPUSS DataWire #1, Channel #6 */ + .long cpuss_interrupts_dw1_7_IRQHandler /* CPUSS DataWire #1, Channel #7 */ + .long cpuss_interrupts_dw1_8_IRQHandler /* CPUSS DataWire #1, Channel #8 */ + .long cpuss_interrupts_dw1_9_IRQHandler /* CPUSS DataWire #1, Channel #9 */ + .long cpuss_interrupts_dw1_10_IRQHandler /* CPUSS DataWire #1, Channel #10 */ + .long cpuss_interrupts_dw1_11_IRQHandler /* CPUSS DataWire #1, Channel #11 */ + .long cpuss_interrupts_dw1_12_IRQHandler /* CPUSS DataWire #1, Channel #12 */ + .long cpuss_interrupts_dw1_13_IRQHandler /* CPUSS DataWire #1, Channel #13 */ + .long cpuss_interrupts_dw1_14_IRQHandler /* CPUSS DataWire #1, Channel #14 */ + .long cpuss_interrupts_dw1_15_IRQHandler /* CPUSS DataWire #1, Channel #15 */ + .long cpuss_interrupts_fault_0_IRQHandler /* CPUSS Fault Structure Interrupt #0 */ + .long cpuss_interrupts_fault_1_IRQHandler /* CPUSS Fault Structure Interrupt #1 */ + .long cpuss_interrupt_crypto_IRQHandler /* CRYPTO Accelerator Interrupt */ + .long cpuss_interrupt_fm_IRQHandler /* FLASH Macro Interrupt */ + .long cpuss_interrupts_cm0_cti_0_IRQHandler /* CM0+ CTI #0 */ + .long cpuss_interrupts_cm0_cti_1_IRQHandler /* CM0+ CTI #1 */ + .long cpuss_interrupts_cm4_cti_0_IRQHandler /* CM4 CTI #0 */ + .long cpuss_interrupts_cm4_cti_1_IRQHandler /* CM4 CTI #1 */ + .long tcpwm_0_interrupts_0_IRQHandler /* TCPWM #0, Counter #0 */ + .long tcpwm_0_interrupts_1_IRQHandler /* TCPWM #0, Counter #1 */ + .long tcpwm_0_interrupts_2_IRQHandler /* TCPWM #0, Counter #2 */ + .long tcpwm_0_interrupts_3_IRQHandler /* TCPWM #0, Counter #3 */ + .long tcpwm_0_interrupts_4_IRQHandler /* TCPWM #0, Counter #4 */ + .long tcpwm_0_interrupts_5_IRQHandler /* TCPWM #0, Counter #5 */ + .long tcpwm_0_interrupts_6_IRQHandler /* TCPWM #0, Counter #6 */ + .long tcpwm_0_interrupts_7_IRQHandler /* TCPWM #0, Counter #7 */ + .long tcpwm_1_interrupts_0_IRQHandler /* TCPWM #1, Counter #0 */ + .long tcpwm_1_interrupts_1_IRQHandler /* TCPWM #1, Counter #1 */ + .long tcpwm_1_interrupts_2_IRQHandler /* TCPWM #1, Counter #2 */ + .long tcpwm_1_interrupts_3_IRQHandler /* TCPWM #1, Counter #3 */ + .long tcpwm_1_interrupts_4_IRQHandler /* TCPWM #1, Counter #4 */ + .long tcpwm_1_interrupts_5_IRQHandler /* TCPWM #1, Counter #5 */ + .long tcpwm_1_interrupts_6_IRQHandler /* TCPWM #1, Counter #6 */ + .long tcpwm_1_interrupts_7_IRQHandler /* TCPWM #1, Counter #7 */ + .long tcpwm_1_interrupts_8_IRQHandler /* TCPWM #1, Counter #8 */ + .long tcpwm_1_interrupts_9_IRQHandler /* TCPWM #1, Counter #9 */ + .long tcpwm_1_interrupts_10_IRQHandler /* TCPWM #1, Counter #10 */ + .long tcpwm_1_interrupts_11_IRQHandler /* TCPWM #1, Counter #11 */ + .long tcpwm_1_interrupts_12_IRQHandler /* TCPWM #1, Counter #12 */ + .long tcpwm_1_interrupts_13_IRQHandler /* TCPWM #1, Counter #13 */ + .long tcpwm_1_interrupts_14_IRQHandler /* TCPWM #1, Counter #14 */ + .long tcpwm_1_interrupts_15_IRQHandler /* TCPWM #1, Counter #15 */ + .long tcpwm_1_interrupts_16_IRQHandler /* TCPWM #1, Counter #16 */ + .long tcpwm_1_interrupts_17_IRQHandler /* TCPWM #1, Counter #17 */ + .long tcpwm_1_interrupts_18_IRQHandler /* TCPWM #1, Counter #18 */ + .long tcpwm_1_interrupts_19_IRQHandler /* TCPWM #1, Counter #19 */ + .long tcpwm_1_interrupts_20_IRQHandler /* TCPWM #1, Counter #20 */ + .long tcpwm_1_interrupts_21_IRQHandler /* TCPWM #1, Counter #21 */ + .long tcpwm_1_interrupts_22_IRQHandler /* TCPWM #1, Counter #22 */ + .long tcpwm_1_interrupts_23_IRQHandler /* TCPWM #1, Counter #23 */ + .long udb_interrupts_0_IRQHandler /* UDB Interrupt #0 */ + .long udb_interrupts_1_IRQHandler /* UDB Interrupt #1 */ + .long udb_interrupts_2_IRQHandler /* UDB Interrupt #2 */ + .long udb_interrupts_3_IRQHandler /* UDB Interrupt #3 */ + .long udb_interrupts_4_IRQHandler /* UDB Interrupt #4 */ + .long udb_interrupts_5_IRQHandler /* UDB Interrupt #5 */ + .long udb_interrupts_6_IRQHandler /* UDB Interrupt #6 */ + .long udb_interrupts_7_IRQHandler /* UDB Interrupt #7 */ + .long udb_interrupts_8_IRQHandler /* UDB Interrupt #8 */ + .long udb_interrupts_9_IRQHandler /* UDB Interrupt #9 */ + .long udb_interrupts_10_IRQHandler /* UDB Interrupt #10 */ + .long udb_interrupts_11_IRQHandler /* UDB Interrupt #11 */ + .long udb_interrupts_12_IRQHandler /* UDB Interrupt #12 */ + .long udb_interrupts_13_IRQHandler /* UDB Interrupt #13 */ + .long udb_interrupts_14_IRQHandler /* UDB Interrupt #14 */ + .long udb_interrupts_15_IRQHandler /* UDB Interrupt #15 */ + .long pass_interrupt_sar_IRQHandler /* SAR ADC interrupt */ + .long audioss_interrupt_i2s_IRQHandler /* I2S Audio interrupt */ + .long audioss_interrupt_pdm_IRQHandler /* PDM/PCM Audio interrupt */ + .long profile_interrupt_IRQHandler /* Energy Profiler interrupt */ + .long smif_interrupt_IRQHandler /* Serial Memory Interface interrupt */ + .long usb_interrupt_hi_IRQHandler /* USB Interrupt */ + .long usb_interrupt_med_IRQHandler /* USB Interrupt */ + .long usb_interrupt_lo_IRQHandler /* USB Interrupt */ + .long pass_interrupt_dacs_IRQHandler /* Consolidated interrrupt for all DACs */ + + + .size __Vectors, . - __Vectors + .equ __VectorsSize, . - __Vectors + + .section .ram_vectors + .align 2 + .globl __ramVectors +__ramVectors: + .space __VectorsSize + .size __ramVectors, . - __ramVectors + + + .text + .thumb + .thumb_func + .align 2 + + /* + * Device startup customization + * + * Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) + * because this function is executed as the first instruction in the ResetHandler. + * The PDL is also not initialized to use the proper register offsets. + * The user of this function is responsible for initializing the PDL and resources before using them. + */ + .weak Cy_OnResetUser + .func Cy_OnResetUser, Cy_OnResetUser + .type Cy_OnResetUser, %function + +Cy_OnResetUser: + bx lr + .size Cy_OnResetUser, . - Cy_OnResetUser + .endfunc + + /* Reset handler */ + .weak Reset_Handler + .type Reset_Handler, %function + +Reset_Handler: + bl Cy_OnResetUser + cpsid i + +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + ittt ge + ldrge r0, [r1, r3] + strge r0, [r2, r3] + bge .L_loop0_0 + + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + +.L_loop1: + cmp r2, r3 + ittt lt + ldrlt r0, [r1], #4 + strlt r0, [r2], #4 + blt .L_loop1 +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise define macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + itt ge + strge r0, [r1, r2] + bge .L_loop2_0 + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 +.L_loop3: + cmp r1, r2 + itt lt + strlt r0, [r1], #4 + blt .L_loop3 +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + + /* Update Vector Table Offset Register. */ + ldr r0, =__ramVectors + ldr r1, =CY_CPU_VTOR_ADDR + str r0, [r1] + dsb 0xF + + /* Enable the FPU if used */ + bl Cy_SystemInitFpuEnable + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + + bl main + + /* Should never get here */ + b . + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function + +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + + + .weak Cy_SysLib_FaultHandler + .type Cy_SysLib_FaultHandler, %function + +Cy_SysLib_FaultHandler: + b . + .size Cy_SysLib_FaultHandler, . - Cy_SysLib_FaultHandler + .type Fault_Handler, %function + +Fault_Handler: + /* Storing LR content for Creator call stack trace */ + push {LR} + movs r0, #4 + mov r1, LR + tst r0, r1 + beq .L_MSP + mrs r0, PSP + b .L_API_call +.L_MSP: + mrs r0, MSP +.L_API_call: + /* Compensation of stack pointer address due to pushing 4 bytes of LR */ + adds r0, r0, #4 + bl Cy_SysLib_FaultHandler + b . + .size Fault_Handler, . - Fault_Handler + +.macro def_fault_Handler fault_handler_name + .weak \fault_handler_name + .set \fault_handler_name, Fault_Handler + .endm + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + + def_fault_Handler HardFault_Handler + def_fault_Handler MemManage_Handler + def_fault_Handler BusFault_Handler + def_fault_Handler UsageFault_Handler + + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler ioss_interrupts_gpio_0_IRQHandler /* GPIO Port Interrupt #0 */ + def_irq_handler ioss_interrupts_gpio_1_IRQHandler /* GPIO Port Interrupt #1 */ + def_irq_handler ioss_interrupts_gpio_2_IRQHandler /* GPIO Port Interrupt #2 */ + def_irq_handler ioss_interrupts_gpio_3_IRQHandler /* GPIO Port Interrupt #3 */ + def_irq_handler ioss_interrupts_gpio_4_IRQHandler /* GPIO Port Interrupt #4 */ + def_irq_handler ioss_interrupts_gpio_5_IRQHandler /* GPIO Port Interrupt #5 */ + def_irq_handler ioss_interrupts_gpio_6_IRQHandler /* GPIO Port Interrupt #6 */ + def_irq_handler ioss_interrupts_gpio_7_IRQHandler /* GPIO Port Interrupt #7 */ + def_irq_handler ioss_interrupts_gpio_8_IRQHandler /* GPIO Port Interrupt #8 */ + def_irq_handler ioss_interrupts_gpio_9_IRQHandler /* GPIO Port Interrupt #9 */ + def_irq_handler ioss_interrupts_gpio_10_IRQHandler /* GPIO Port Interrupt #10 */ + def_irq_handler ioss_interrupts_gpio_11_IRQHandler /* GPIO Port Interrupt #11 */ + def_irq_handler ioss_interrupts_gpio_12_IRQHandler /* GPIO Port Interrupt #12 */ + def_irq_handler ioss_interrupts_gpio_13_IRQHandler /* GPIO Port Interrupt #13 */ + def_irq_handler ioss_interrupts_gpio_14_IRQHandler /* GPIO Port Interrupt #14 */ + def_irq_handler ioss_interrupt_gpio_IRQHandler /* GPIO All Ports */ + def_irq_handler ioss_interrupt_vdd_IRQHandler /* GPIO Supply Detect Interrupt */ + def_irq_handler lpcomp_interrupt_IRQHandler /* Low Power Comparator Interrupt */ + def_irq_handler scb_8_interrupt_IRQHandler /* Serial Communication Block #8 (DeepSleep capable) */ + def_irq_handler srss_interrupt_mcwdt_0_IRQHandler /* Multi Counter Watchdog Timer interrupt */ + def_irq_handler srss_interrupt_mcwdt_1_IRQHandler /* Multi Counter Watchdog Timer interrupt */ + def_irq_handler srss_interrupt_backup_IRQHandler /* Backup domain interrupt */ + def_irq_handler srss_interrupt_IRQHandler /* Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) */ + def_irq_handler pass_interrupt_ctbs_IRQHandler /* CTBm Interrupt (all CTBms) */ + def_irq_handler bless_interrupt_IRQHandler /* Bluetooth Radio interrupt */ + def_irq_handler cpuss_interrupts_ipc_0_IRQHandler /* CPUSS Inter Process Communication Interrupt #0 */ + def_irq_handler cpuss_interrupts_ipc_1_IRQHandler /* CPUSS Inter Process Communication Interrupt #1 */ + def_irq_handler cpuss_interrupts_ipc_2_IRQHandler /* CPUSS Inter Process Communication Interrupt #2 */ + def_irq_handler cpuss_interrupts_ipc_3_IRQHandler /* CPUSS Inter Process Communication Interrupt #3 */ + def_irq_handler cpuss_interrupts_ipc_4_IRQHandler /* CPUSS Inter Process Communication Interrupt #4 */ + def_irq_handler cpuss_interrupts_ipc_5_IRQHandler /* CPUSS Inter Process Communication Interrupt #5 */ + def_irq_handler cpuss_interrupts_ipc_6_IRQHandler /* CPUSS Inter Process Communication Interrupt #6 */ + def_irq_handler cpuss_interrupts_ipc_7_IRQHandler /* CPUSS Inter Process Communication Interrupt #7 */ + def_irq_handler cpuss_interrupts_ipc_8_IRQHandler /* CPUSS Inter Process Communication Interrupt #8 */ + def_irq_handler cpuss_interrupts_ipc_9_IRQHandler /* CPUSS Inter Process Communication Interrupt #9 */ + def_irq_handler cpuss_interrupts_ipc_10_IRQHandler /* CPUSS Inter Process Communication Interrupt #10 */ + def_irq_handler cpuss_interrupts_ipc_11_IRQHandler /* CPUSS Inter Process Communication Interrupt #11 */ + def_irq_handler cpuss_interrupts_ipc_12_IRQHandler /* CPUSS Inter Process Communication Interrupt #12 */ + def_irq_handler cpuss_interrupts_ipc_13_IRQHandler /* CPUSS Inter Process Communication Interrupt #13 */ + def_irq_handler cpuss_interrupts_ipc_14_IRQHandler /* CPUSS Inter Process Communication Interrupt #14 */ + def_irq_handler cpuss_interrupts_ipc_15_IRQHandler /* CPUSS Inter Process Communication Interrupt #15 */ + def_irq_handler scb_0_interrupt_IRQHandler /* Serial Communication Block #0 */ + def_irq_handler scb_1_interrupt_IRQHandler /* Serial Communication Block #1 */ + def_irq_handler scb_2_interrupt_IRQHandler /* Serial Communication Block #2 */ + def_irq_handler scb_3_interrupt_IRQHandler /* Serial Communication Block #3 */ + def_irq_handler scb_4_interrupt_IRQHandler /* Serial Communication Block #4 */ + def_irq_handler scb_5_interrupt_IRQHandler /* Serial Communication Block #5 */ + def_irq_handler scb_6_interrupt_IRQHandler /* Serial Communication Block #6 */ + def_irq_handler scb_7_interrupt_IRQHandler /* Serial Communication Block #7 */ + def_irq_handler csd_interrupt_IRQHandler /* CSD (Capsense) interrupt */ + def_irq_handler cpuss_interrupts_dw0_0_IRQHandler /* CPUSS DataWire #0, Channel #0 */ + def_irq_handler cpuss_interrupts_dw0_1_IRQHandler /* CPUSS DataWire #0, Channel #1 */ + def_irq_handler cpuss_interrupts_dw0_2_IRQHandler /* CPUSS DataWire #0, Channel #2 */ + def_irq_handler cpuss_interrupts_dw0_3_IRQHandler /* CPUSS DataWire #0, Channel #3 */ + def_irq_handler cpuss_interrupts_dw0_4_IRQHandler /* CPUSS DataWire #0, Channel #4 */ + def_irq_handler cpuss_interrupts_dw0_5_IRQHandler /* CPUSS DataWire #0, Channel #5 */ + def_irq_handler cpuss_interrupts_dw0_6_IRQHandler /* CPUSS DataWire #0, Channel #6 */ + def_irq_handler cpuss_interrupts_dw0_7_IRQHandler /* CPUSS DataWire #0, Channel #7 */ + def_irq_handler cpuss_interrupts_dw0_8_IRQHandler /* CPUSS DataWire #0, Channel #8 */ + def_irq_handler cpuss_interrupts_dw0_9_IRQHandler /* CPUSS DataWire #0, Channel #9 */ + def_irq_handler cpuss_interrupts_dw0_10_IRQHandler /* CPUSS DataWire #0, Channel #10 */ + def_irq_handler cpuss_interrupts_dw0_11_IRQHandler /* CPUSS DataWire #0, Channel #11 */ + def_irq_handler cpuss_interrupts_dw0_12_IRQHandler /* CPUSS DataWire #0, Channel #12 */ + def_irq_handler cpuss_interrupts_dw0_13_IRQHandler /* CPUSS DataWire #0, Channel #13 */ + def_irq_handler cpuss_interrupts_dw0_14_IRQHandler /* CPUSS DataWire #0, Channel #14 */ + def_irq_handler cpuss_interrupts_dw0_15_IRQHandler /* CPUSS DataWire #0, Channel #15 */ + def_irq_handler cpuss_interrupts_dw1_0_IRQHandler /* CPUSS DataWire #1, Channel #0 */ + def_irq_handler cpuss_interrupts_dw1_1_IRQHandler /* CPUSS DataWire #1, Channel #1 */ + def_irq_handler cpuss_interrupts_dw1_2_IRQHandler /* CPUSS DataWire #1, Channel #2 */ + def_irq_handler cpuss_interrupts_dw1_3_IRQHandler /* CPUSS DataWire #1, Channel #3 */ + def_irq_handler cpuss_interrupts_dw1_4_IRQHandler /* CPUSS DataWire #1, Channel #4 */ + def_irq_handler cpuss_interrupts_dw1_5_IRQHandler /* CPUSS DataWire #1, Channel #5 */ + def_irq_handler cpuss_interrupts_dw1_6_IRQHandler /* CPUSS DataWire #1, Channel #6 */ + def_irq_handler cpuss_interrupts_dw1_7_IRQHandler /* CPUSS DataWire #1, Channel #7 */ + def_irq_handler cpuss_interrupts_dw1_8_IRQHandler /* CPUSS DataWire #1, Channel #8 */ + def_irq_handler cpuss_interrupts_dw1_9_IRQHandler /* CPUSS DataWire #1, Channel #9 */ + def_irq_handler cpuss_interrupts_dw1_10_IRQHandler /* CPUSS DataWire #1, Channel #10 */ + def_irq_handler cpuss_interrupts_dw1_11_IRQHandler /* CPUSS DataWire #1, Channel #11 */ + def_irq_handler cpuss_interrupts_dw1_12_IRQHandler /* CPUSS DataWire #1, Channel #12 */ + def_irq_handler cpuss_interrupts_dw1_13_IRQHandler /* CPUSS DataWire #1, Channel #13 */ + def_irq_handler cpuss_interrupts_dw1_14_IRQHandler /* CPUSS DataWire #1, Channel #14 */ + def_irq_handler cpuss_interrupts_dw1_15_IRQHandler /* CPUSS DataWire #1, Channel #15 */ + def_irq_handler cpuss_interrupts_fault_0_IRQHandler /* CPUSS Fault Structure Interrupt #0 */ + def_irq_handler cpuss_interrupts_fault_1_IRQHandler /* CPUSS Fault Structure Interrupt #1 */ + def_irq_handler cpuss_interrupt_crypto_IRQHandler /* CRYPTO Accelerator Interrupt */ + def_irq_handler cpuss_interrupt_fm_IRQHandler /* FLASH Macro Interrupt */ + def_irq_handler cpuss_interrupts_cm0_cti_0_IRQHandler /* CM0+ CTI #0 */ + def_irq_handler cpuss_interrupts_cm0_cti_1_IRQHandler /* CM0+ CTI #1 */ + def_irq_handler cpuss_interrupts_cm4_cti_0_IRQHandler /* CM4 CTI #0 */ + def_irq_handler cpuss_interrupts_cm4_cti_1_IRQHandler /* CM4 CTI #1 */ + def_irq_handler tcpwm_0_interrupts_0_IRQHandler /* TCPWM #0, Counter #0 */ + def_irq_handler tcpwm_0_interrupts_1_IRQHandler /* TCPWM #0, Counter #1 */ + def_irq_handler tcpwm_0_interrupts_2_IRQHandler /* TCPWM #0, Counter #2 */ + def_irq_handler tcpwm_0_interrupts_3_IRQHandler /* TCPWM #0, Counter #3 */ + def_irq_handler tcpwm_0_interrupts_4_IRQHandler /* TCPWM #0, Counter #4 */ + def_irq_handler tcpwm_0_interrupts_5_IRQHandler /* TCPWM #0, Counter #5 */ + def_irq_handler tcpwm_0_interrupts_6_IRQHandler /* TCPWM #0, Counter #6 */ + def_irq_handler tcpwm_0_interrupts_7_IRQHandler /* TCPWM #0, Counter #7 */ + def_irq_handler tcpwm_1_interrupts_0_IRQHandler /* TCPWM #1, Counter #0 */ + def_irq_handler tcpwm_1_interrupts_1_IRQHandler /* TCPWM #1, Counter #1 */ + def_irq_handler tcpwm_1_interrupts_2_IRQHandler /* TCPWM #1, Counter #2 */ + def_irq_handler tcpwm_1_interrupts_3_IRQHandler /* TCPWM #1, Counter #3 */ + def_irq_handler tcpwm_1_interrupts_4_IRQHandler /* TCPWM #1, Counter #4 */ + def_irq_handler tcpwm_1_interrupts_5_IRQHandler /* TCPWM #1, Counter #5 */ + def_irq_handler tcpwm_1_interrupts_6_IRQHandler /* TCPWM #1, Counter #6 */ + def_irq_handler tcpwm_1_interrupts_7_IRQHandler /* TCPWM #1, Counter #7 */ + def_irq_handler tcpwm_1_interrupts_8_IRQHandler /* TCPWM #1, Counter #8 */ + def_irq_handler tcpwm_1_interrupts_9_IRQHandler /* TCPWM #1, Counter #9 */ + def_irq_handler tcpwm_1_interrupts_10_IRQHandler /* TCPWM #1, Counter #10 */ + def_irq_handler tcpwm_1_interrupts_11_IRQHandler /* TCPWM #1, Counter #11 */ + def_irq_handler tcpwm_1_interrupts_12_IRQHandler /* TCPWM #1, Counter #12 */ + def_irq_handler tcpwm_1_interrupts_13_IRQHandler /* TCPWM #1, Counter #13 */ + def_irq_handler tcpwm_1_interrupts_14_IRQHandler /* TCPWM #1, Counter #14 */ + def_irq_handler tcpwm_1_interrupts_15_IRQHandler /* TCPWM #1, Counter #15 */ + def_irq_handler tcpwm_1_interrupts_16_IRQHandler /* TCPWM #1, Counter #16 */ + def_irq_handler tcpwm_1_interrupts_17_IRQHandler /* TCPWM #1, Counter #17 */ + def_irq_handler tcpwm_1_interrupts_18_IRQHandler /* TCPWM #1, Counter #18 */ + def_irq_handler tcpwm_1_interrupts_19_IRQHandler /* TCPWM #1, Counter #19 */ + def_irq_handler tcpwm_1_interrupts_20_IRQHandler /* TCPWM #1, Counter #20 */ + def_irq_handler tcpwm_1_interrupts_21_IRQHandler /* TCPWM #1, Counter #21 */ + def_irq_handler tcpwm_1_interrupts_22_IRQHandler /* TCPWM #1, Counter #22 */ + def_irq_handler tcpwm_1_interrupts_23_IRQHandler /* TCPWM #1, Counter #23 */ + def_irq_handler udb_interrupts_0_IRQHandler /* UDB Interrupt #0 */ + def_irq_handler udb_interrupts_1_IRQHandler /* UDB Interrupt #1 */ + def_irq_handler udb_interrupts_2_IRQHandler /* UDB Interrupt #2 */ + def_irq_handler udb_interrupts_3_IRQHandler /* UDB Interrupt #3 */ + def_irq_handler udb_interrupts_4_IRQHandler /* UDB Interrupt #4 */ + def_irq_handler udb_interrupts_5_IRQHandler /* UDB Interrupt #5 */ + def_irq_handler udb_interrupts_6_IRQHandler /* UDB Interrupt #6 */ + def_irq_handler udb_interrupts_7_IRQHandler /* UDB Interrupt #7 */ + def_irq_handler udb_interrupts_8_IRQHandler /* UDB Interrupt #8 */ + def_irq_handler udb_interrupts_9_IRQHandler /* UDB Interrupt #9 */ + def_irq_handler udb_interrupts_10_IRQHandler /* UDB Interrupt #10 */ + def_irq_handler udb_interrupts_11_IRQHandler /* UDB Interrupt #11 */ + def_irq_handler udb_interrupts_12_IRQHandler /* UDB Interrupt #12 */ + def_irq_handler udb_interrupts_13_IRQHandler /* UDB Interrupt #13 */ + def_irq_handler udb_interrupts_14_IRQHandler /* UDB Interrupt #14 */ + def_irq_handler udb_interrupts_15_IRQHandler /* UDB Interrupt #15 */ + def_irq_handler pass_interrupt_sar_IRQHandler /* SAR ADC interrupt */ + def_irq_handler audioss_interrupt_i2s_IRQHandler /* I2S Audio interrupt */ + def_irq_handler audioss_interrupt_pdm_IRQHandler /* PDM/PCM Audio interrupt */ + def_irq_handler profile_interrupt_IRQHandler /* Energy Profiler interrupt */ + def_irq_handler smif_interrupt_IRQHandler /* Serial Memory Interface interrupt */ + def_irq_handler usb_interrupt_hi_IRQHandler /* USB Interrupt */ + def_irq_handler usb_interrupt_med_IRQHandler /* USB Interrupt */ + def_irq_handler usb_interrupt_lo_IRQHandler /* USB Interrupt */ + def_irq_handler pass_interrupt_dacs_IRQHandler /* Consolidated interrrupt for all DACs */ + + .end + + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/host_main.c b/2020TPCApp1.cydsn/host_main.c new file mode 100644 index 0000000..183ae11 --- /dev/null +++ b/2020TPCApp1.cydsn/host_main.c @@ -0,0 +1,505 @@ +/******************************************************************************* +* File Name: host_main.c +* +* Version: 1.0 +* +* Description: +* BLE HID keyboard example project that supports both input and output reports +* in boot and protocol mode. The example also demonstrates handling suspend +* event from the central device and enters low power mode when suspended. +* +* References: +* BLUETOOTH SPECIFICATION Version 5.0 +* HID Usage Tables spec ver 1.12 +* +* Hardware Dependency: +* CY8CKIT-062 PSoC6 BLE Pioneer Kit +* +****************************************************************************** +* Copyright (2019), Cypress Semiconductor Corporation. +****************************************************************************** +* This software is owned by Cypress Semiconductor Corporation (Cypress) and is +* protected by and subject to worldwide patent protection (United States and +* foreign), United States copyright laws and international treaty provisions. +* Cypress hereby grants to licensee a personal, non-exclusive, non-transferable +* license to copy, use, modify, create derivative works of, and compile the +* Cypress Source Code and derivative works for the sole purpose of creating +* custom software in support of licensee product to be used only in conjunction +* with a Cypress integrated circuit as specified in the applicable agreement. +* Any reproduction, modification, translation, compilation, or representation of +* this software except as specified above is prohibited without the express +* written permission of Cypress. +* +* Disclaimer: CYPRESS MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH +* REGARD TO THIS MATERIAL, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +* Cypress reserves the right to make changes without further notice to the +* materials described herein. Cypress does not assume any liability arising out +* of the application or use of any product or circuit described herein. Cypress +* does not authorize its products for use as critical components in life-support +* systems where a malfunction or failure may reasonably be expected to result in +* significant injury to the user. The inclusion of Cypress' product in a life- +* support systems application implies that the manufacturer assumes all risk of +* such use and in doing so indemnifies Cypress against all charges. Use may be +* limited by and subject to the applicable Cypress software license agreement. +*****************************************************************************/ + +#include "dfu/cy_dfu.h" +#include "common.h" +#include "user_interface.h" +#include "ias.h" +#include "scps.h" + +/* Global Variables */ +cy_stc_ble_conn_handle_t appConnHandle; + +static volatile uint32_t mainTimer = 1u; +static cy_stc_ble_timer_info_t timerParam = { .timeout = ADV_TIMER_TIMEOUT }; + +/* Private Function Prototypes */ +static void LowPowerImplementation(void); + + +/******************************************************************************* +* Function Name: AppCallBack() +******************************************************************************** +* +* Summary: +* This is an event callback function to receive events from the BLE Component. +* +* event - the event code +* *eventParam - the event parameters +* +*******************************************************************************/ +void AppCallBack(uint32_t event, void* eventParam) +{ + cy_en_ble_api_result_t apiResult; + uint8_t i; + + static cy_stc_ble_gap_sec_key_info_t keyInfo = + { + .localKeysFlag = CY_BLE_GAP_SMP_INIT_ENC_KEY_DIST | + CY_BLE_GAP_SMP_INIT_IRK_KEY_DIST | + CY_BLE_GAP_SMP_INIT_CSRK_KEY_DIST, + .exchangeKeysFlag = CY_BLE_GAP_SMP_INIT_ENC_KEY_DIST | + CY_BLE_GAP_SMP_INIT_IRK_KEY_DIST | + CY_BLE_GAP_SMP_INIT_CSRK_KEY_DIST | + CY_BLE_GAP_SMP_RESP_ENC_KEY_DIST | + CY_BLE_GAP_SMP_RESP_IRK_KEY_DIST | + CY_BLE_GAP_SMP_RESP_CSRK_KEY_DIST, + }; + + switch (event) + { + /********************************************************** + * General Events + ***********************************************************/ + case CY_BLE_EVT_STACK_ON: /* This event is received when the component is Started */ + DBG_PRINTF("CY_BLE_EVT_STACK_ON, StartAdvertisement \r\n"); + + /* Enter into discoverable mode so that remote can find it. */ + apiResult = Cy_BLE_GAPP_StartAdvertisement(CY_BLE_ADVERTISING_FAST, CY_BLE_PERIPHERAL_CONFIGURATION_0_INDEX); + if(apiResult != CY_BLE_SUCCESS) + { + DBG_PRINTF("Cy_BLE_GAPP_StartAdvertisement API Error: 0x%x \r\n", apiResult); + } + + /* Generates the security keys */ + apiResult = Cy_BLE_GAP_GenerateKeys(&keyInfo); + if(apiResult != CY_BLE_SUCCESS) + { + DBG_PRINTF("Cy_BLE_GAP_GenerateKeys API Error: 0x%x \r\n", apiResult); + } + + /* Display Bond list */ + App_DisplayBondList(); + break; + + case CY_BLE_EVT_TIMEOUT: + if((((cy_stc_ble_timeout_param_t *)eventParam)->reasonCode == CY_BLE_GENERIC_APP_TO) && + (((cy_stc_ble_timeout_param_t *)eventParam)->timerHandle == timerParam.timerHandle)) + { + /* Update LED State */ + UpdateLedState(); + + /* Indicate that timer is raised to the main loop */ + mainTimer++; + + /* Press and hold the mechanical button (SW2) during 4 seconds to clear the bond list. */ + App_RemoveDevicesFromBondListBySW2Press(SW2_PRESS_TIME_DEL_BOND_LIST); + } + break; + + case CY_BLE_EVT_HARDWARE_ERROR: /* This event indicates that some internal HW error has occurred. */ + DBG_PRINTF("CY_BLE_EVT_HARDWARE_ERROR \r\n"); + ShowError(); + break; + + /* This event will be triggered by host stack if BLE stack is busy or not busy. + * Parameter corresponding to this event will be the state of BLE stack. + * BLE stack busy = CY_BLE_STACK_STATE_BUSY, + * BLE stack not busy = CY_BLE_STACK_STATE_FREE + */ + case CY_BLE_EVT_STACK_BUSY_STATUS: + DBG_PRINTF("CY_BLE_EVT_STACK_BUSY_STATUS: %x\r\n", *(uint8_t *)eventParam); + break; + + case CY_BLE_EVT_SET_TX_PWR_COMPLETE: + DBG_PRINTF("CY_BLE_EVT_SET_TX_PWR_COMPLETE \r\n"); + break; + + case CY_BLE_EVT_LE_SET_EVENT_MASK_COMPLETE: + DBG_PRINTF("CY_BLE_EVT_LE_SET_EVENT_MASK_COMPLETE \r\n"); + break; + + case CY_BLE_EVT_SET_DEVICE_ADDR_COMPLETE: + DBG_PRINTF("CY_BLE_EVT_SET_DEVICE_ADDR_COMPLETE \r\n"); + + /* Reads the BD device address from BLE Controller's memory */ + apiResult = Cy_BLE_GAP_GetBdAddress(); + if(apiResult != CY_BLE_SUCCESS) + { + DBG_PRINTF("Cy_BLE_GAP_GetBdAddress API Error: 0x%x \r\n", apiResult); + } + break; + + case CY_BLE_EVT_GET_DEVICE_ADDR_COMPLETE: + DBG_PRINTF("CY_BLE_EVT_GET_DEVICE_ADDR_COMPLETE: "); + for(i = CY_BLE_GAP_BD_ADDR_SIZE; i > 0u; i--) + { + DBG_PRINTF("%2.2x", ((cy_stc_ble_bd_addrs_t *) + ((cy_stc_ble_events_param_generic_t *)eventParam)->eventParams)->publicBdAddr[i-1]); + } + DBG_PRINTF("\r\n"); + break; + + case CY_BLE_EVT_STACK_SHUTDOWN_COMPLETE: + DBG_PRINTF("CY_BLE_EVT_STACK_SHUTDOWN_COMPLETE \r\n"); + DBG_PRINTF("Hibernate \r\n"); + UART_DEB_WAIT_TX_COMPLETE(); + /* Hibernate */ + Cy_SysPm_Hibernate(); + break; + + /********************************************************** + * GAP Events + ***********************************************************/ + case CY_BLE_EVT_GAP_AUTH_REQ: + /* This event is received by Peripheral and Central devices. When it is received by a peripheral, + * that peripheral must Call Cy_BLE_GAPP_AuthReqReply() to reply to the authentication request + * from Central. */ + DBG_PRINTF("CY_BLE_EVT_GAP_AUTH_REQ: bdHandle=%x, security=%x, bonding=%x, ekeySize=%x, err=%x \r\n", + (*(cy_stc_ble_gap_auth_info_t *)eventParam).bdHandle, (*(cy_stc_ble_gap_auth_info_t *)eventParam).security, + (*(cy_stc_ble_gap_auth_info_t *)eventParam).bonding, (*(cy_stc_ble_gap_auth_info_t *)eventParam).ekeySize, + (*(cy_stc_ble_gap_auth_info_t *)eventParam).authErr); + + if(cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX].security == + (CY_BLE_GAP_SEC_MODE_1 | CY_BLE_GAP_SEC_LEVEL_1)) + { + cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX].authErr = + CY_BLE_GAP_AUTH_ERROR_PAIRING_NOT_SUPPORTED; + } + + cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX].bdHandle = + ((cy_stc_ble_gap_auth_info_t *)eventParam)->bdHandle; + + /* Pass security information for authentication in reply to an authentication request + * from the master device */ + apiResult = Cy_BLE_GAPP_AuthReqReply(&cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX]); + if(apiResult != CY_BLE_SUCCESS) + { + Cy_BLE_GAP_RemoveOldestDeviceFromBondedList(); + apiResult = Cy_BLE_GAPP_AuthReqReply(&cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX]); + if(apiResult != CY_BLE_SUCCESS) + { + DBG_PRINTF("Cy_BLE_GAPP_AuthReqReply API Error: 0x%x \r\n", apiResult); + } + } + break; + + case CY_BLE_EVT_GAP_PASSKEY_ENTRY_REQUEST: + DBG_PRINTF("CY_BLE_EVT_GAP_PASSKEY_ENTRY_REQUEST\r\n"); + DBG_PRINTF("Please enter the passkey displayed on the peer device:\r\n"); + break; + + case CY_BLE_EVT_GAP_PASSKEY_DISPLAY_REQUEST: + DBG_PRINTF("CY_BLE_EVT_GAP_PASSKEY_DISPLAY_REQUEST: %6.6ld\r\n", *(uint32_t *)eventParam); + break; + + case CY_BLE_EVT_GAP_NUMERIC_COMPARISON_REQUEST: + DBG_PRINTF("Compare this passkey with the one displayed in your peer device and press 'y' or 'n':" + " %6.6lu \r\n", *(uint32_t *)eventParam); + break; + + case CY_BLE_EVT_GAP_KEYINFO_EXCHNGE_CMPLT: + DBG_PRINTF("CY_BLE_EVT_GAP_KEYINFO_EXCHNGE_CMPLT \r\n"); + break; + + case CY_BLE_EVT_GAP_SMP_NEGOTIATED_AUTH_INFO: + DBG_PRINTF("CY_BLE_EVT_GAP_SMP_NEGOTIATED_AUTH_INFO:" + " bdHandle=%x, security=%x, bonding=%x, ekeySize=%x, err=%x \r\n", + (*(cy_stc_ble_gap_auth_info_t *)eventParam).bdHandle, + (*(cy_stc_ble_gap_auth_info_t *)eventParam).security, + (*(cy_stc_ble_gap_auth_info_t *)eventParam).bonding, + (*(cy_stc_ble_gap_auth_info_t *)eventParam).ekeySize, + (*(cy_stc_ble_gap_auth_info_t *)eventParam).authErr); + break; + + case CY_BLE_EVT_GAP_AUTH_COMPLETE: + DBG_PRINTF("CY_BLE_EVT_GAP_AUTH_COMPLETE: bdHandle=%x, security=%x, bonding=%x, ekeySize=%x, err=%x \r\n", + (*(cy_stc_ble_gap_auth_info_t *)eventParam).bdHandle, + (*(cy_stc_ble_gap_auth_info_t *)eventParam).security, + (*(cy_stc_ble_gap_auth_info_t *)eventParam).bonding, + (*(cy_stc_ble_gap_auth_info_t *)eventParam).ekeySize, + (*(cy_stc_ble_gap_auth_info_t *)eventParam).authErr); + break; + + case CY_BLE_EVT_GAP_AUTH_FAILED: + DBG_PRINTF("CY_BLE_EVT_GAP_AUTH_FAILED: bdHandle=%x, authErr=%x\r\n", + (*(cy_stc_ble_gap_auth_info_t *)eventParam).bdHandle, + (*(cy_stc_ble_gap_auth_info_t *)eventParam).authErr); + break; + + case CY_BLE_EVT_GAPP_ADVERTISEMENT_START_STOP: + DBG_PRINTF("CY_BLE_EVT_GAPP_ADVERTISEMENT_START_STOP, state: %d \r\n", Cy_BLE_GetAdvertisementState()); + if((Cy_BLE_GetAdvertisementState() == CY_BLE_ADV_STATE_STOPPED) && (Cy_BLE_GetNumOfActiveConn() == 0u)) + { + /* Fast and slow advertising period complete, go to low power + * mode (Hibernate) and wait for an external + * user event to wake up the device again */ + UpdateLedState(); + Cy_BLE_Stop(); + } + break; + + case CY_BLE_EVT_GAP_DEVICE_CONNECTED: + DBG_PRINTF("CY_BLE_EVT_GAP_DEVICE_CONNECTED: connIntv = %d ms \r\n", + ((cy_stc_ble_gap_connected_param_t *)eventParam)->connIntv * 5u /4u); /* in milliseconds / 1.25ms */ + + + + /* Set security keys for new device which is not already bonded */ + if(App_IsDeviceInBondList((*(cy_stc_ble_gap_connected_param_t *)eventParam).bdHandle) == 0u) + { + keyInfo.SecKeyParam.bdHandle = (*(cy_stc_ble_gap_connected_param_t *)eventParam).bdHandle; + apiResult = Cy_BLE_GAP_SetSecurityKeys(&keyInfo); + if(apiResult != CY_BLE_SUCCESS) + { + DBG_PRINTF("Cy_BLE_GAP_SetSecurityKeys API Error: 0x%x \r\n", apiResult); + } + } + break; + + case CY_BLE_EVT_L2CAP_CONN_PARAM_UPDATE_RSP: + DBG_PRINTF("CY_BLE_EVT_L2CAP_CONN_PARAM_UPDATE_RSP, result = %d\r\n", + (*(cy_stc_ble_l2cap_conn_update_rsp_param_t *)eventParam).result); + break; + + case CY_BLE_EVT_GAP_KEYS_GEN_COMPLETE: + DBG_PRINTF("CY_BLE_EVT_GAP_KEYS_GEN_COMPLETE \r\n"); + keyInfo.SecKeyParam = (*(cy_stc_ble_gap_sec_key_param_t *)eventParam); + Cy_BLE_GAP_SetIdAddress(&cy_ble_deviceAddress); + break; + + case CY_BLE_EVT_GAP_CONNECTION_UPDATE_COMPLETE: + DBG_PRINTF("CY_BLE_EVT_GAP_CONNECTION_UPDATE_COMPLETE: connIntv = %d ms \r\n", /* in milliseconds / 1.25ms */ + ((cy_stc_ble_gap_conn_param_updated_in_controller_t *)eventParam)->connIntv * 5u /4u); + break; + + case CY_BLE_EVT_GAP_DEVICE_DISCONNECTED: + DBG_PRINTF("CY_BLE_EVT_GAP_DEVICE_DISCONNECTED: bdHandle=%x, reason=%x, status=%x\r\n", + (*(cy_stc_ble_gap_disconnect_param_t *)eventParam).bdHandle, + (*(cy_stc_ble_gap_disconnect_param_t *)eventParam).reason, + (*(cy_stc_ble_gap_disconnect_param_t *)eventParam).status); + + /* Put the device into discoverable mode so that a remote can search it. */ + apiResult = Cy_BLE_GAPP_StartAdvertisement(CY_BLE_ADVERTISING_FAST, CY_BLE_PERIPHERAL_CONFIGURATION_0_INDEX); + if(apiResult != CY_BLE_SUCCESS) + { + DBG_PRINTF("StartAdvertisement API Error: 0x%x \r\n", apiResult); + } + break; + + case CY_BLE_EVT_GAP_ENCRYPT_CHANGE: + DBG_PRINTF("CY_BLE_EVT_GAP_ENCRYPT_CHANGE: %x \r\n", *(uint8_t *)eventParam); + break; + + /********************************************************** + * GATT Events + ***********************************************************/ + case CY_BLE_EVT_GATT_CONNECT_IND: + appConnHandle = *(cy_stc_ble_conn_handle_t *)eventParam; + DBG_PRINTF("CY_BLE_EVT_GATT_CONNECT_IND: %x, %x \r\n", + (*(cy_stc_ble_conn_handle_t *)eventParam).attId, (*(cy_stc_ble_conn_handle_t *)eventParam).bdHandle); + + break; + + case CY_BLE_EVT_GATT_DISCONNECT_IND: + DBG_PRINTF("CY_BLE_EVT_GATT_DISCONNECT_IND: %x, %x \r\n", + (*(cy_stc_ble_conn_handle_t *)eventParam).attId, (*(cy_stc_ble_conn_handle_t *)eventParam).bdHandle); + break; + + case CY_BLE_EVT_GATTS_XCNHG_MTU_REQ: + { + cy_stc_ble_gatt_xchg_mtu_param_t mtu = + { + .connHandle = ((cy_stc_ble_gatt_xchg_mtu_param_t *)eventParam)->connHandle + }; + Cy_BLE_GATT_GetMtuSize(&mtu); + DBG_PRINTF("CY_BLE_EVT_GATTS_XCNHG_MTU_REQ %x, %x, final mtu= %d \r\n", + mtu.connHandle.attId, mtu.connHandle.bdHandle, mtu.mtu); + } + break; + + case CY_BLE_EVT_GATTS_READ_CHAR_VAL_ACCESS_REQ: + DBG_PRINTF("CY_BLE_EVT_GATTS_READ_CHAR_VAL_ACCESS_REQ %x %x: handle: %x \r\n", + ((cy_stc_ble_gatts_char_val_read_req_t *)eventParam)->connHandle.attId, + ((cy_stc_ble_gatts_char_val_read_req_t *)eventParam)->connHandle.bdHandle, + ((cy_stc_ble_gatts_char_val_read_req_t *)eventParam)->attrHandle); + break; + + case CY_BLE_EVT_GATTS_WRITE_REQ: + DBG_PRINTF("CY_BLE_EVT_GATTS_WRITE_REQ attr handle: %4.4x , value: ", + ((cy_stc_ble_gatts_write_cmd_req_param_t *)eventParam)->handleValPair.attrHandle); + for(i = 0; i < ((cy_stc_ble_gatts_write_cmd_req_param_t *)eventParam)->handleValPair.value.len; i++) + { + DBG_PRINTF("%2.2x ", ((cy_stc_ble_gatts_write_cmd_req_param_t *)eventParam)->handleValPair.value.val[i]); + } + DBG_PRINTF("\r\n"); + break; + + case CY_BLE_EVT_GATTS_INDICATION_DISABLED: + DBG_PRINTF("CY_BLE_EVT_GATTS_INDICATION_DISABLED \r\n"); + break; + + case CY_BLE_EVT_GATTS_INDICATION_ENABLED: + DBG_PRINTF("CY_BLE_EVT_GATTS_INDICATION_ENABLED \r\n"); + break; + + /********************************************************** + * Other Events + ***********************************************************/ + case CY_BLE_EVT_PENDING_FLASH_WRITE: + /* Inform application that flash write is pending. Stack internal data + * structures are modified and require to be stored in Flash using + * Cy_BLE_StoreBondingData() */ + DBG_PRINTF("CY_BLE_EVT_PENDING_FLASH_WRITE\r\n"); + break; + + default: + DBG_PRINTF("Other event: 0x%lx \r\n", event); + break; + } +} + + +/******************************************************************************* +* Function Name: LowPowerImplementation() +******************************************************************************** +* Summary: +* Implements low power in the project. +* +* Theory: +* The function tries to enter deep sleep as much as possible - whenever the +* BLE is idle and the UART transmission/reception is not happening. +* +*******************************************************************************/ +static void LowPowerImplementation(void) +{ + if(UART_DEB_IS_TX_COMPLETE() != 0u) + { + /* Entering into the Deep Sleep */ + Cy_SysPm_DeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT); + } +} + + +/******************************************************************************* +* Function Name: HostMain() +******************************************************************************** +* Summary: +* Main function for the project. +* +*******************************************************************************/ +int HostMain(void) +{ + cy_en_ble_api_result_t apiResult; + + /* Initialization the user interface: LEDs, SW2, ect. */ + InitUserInterface(); + + /* Initialize Debug UART */ + UART_START(); + DBG_PRINTF("BLE HID Keyboard Example\r\n"); + + /* Start BLE component and register generic event handler */ + apiResult = Cy_BLE_Start(AppCallBack); + if(apiResult != CY_BLE_SUCCESS) + { + DBG_PRINTF("Cy_BLE_Start API Error: 0x%x \r\n", apiResult); + } + + /* Initialize BLE Services */ + ScpsInit(); + IasInit(); + + + /*************************************************************************** + * Main polling loop + ***************************************************************************/ + while(1) + { + /* Cy_BLE_ProcessEvents() allows BLE stack to process pending events */ + Cy_BLE_ProcessEvents(); + + /* To achieve low power in the device */ + LowPowerImplementation(); + + /* Restart 1s timer */ + if(mainTimer != 0u) + { + mainTimer = 0u; + Cy_BLE_StartTimer(&timerParam); + } + + /* Remove devices from the bond list. Should be done when no active connections */ + if((Cy_BLE_GetNumOfActiveConn() == 0u) && (App_IsRemoveBondListFlag() == true)) + { + App_RemoveDevicesFromBondList(); + } + + #if(CY_BLE_BONDING_REQUIREMENT == CY_BLE_BONDING_YES) + /* Store bonding data to flash only when all debug information has been sent */ + if(cy_ble_pendingFlashWrite != 0u) + { + apiResult = Cy_BLE_StoreBondingData(); + DBG_PRINTF("Store bonding data, status: %x, pending: %x \r\n", apiResult, cy_ble_pendingFlashWrite); + } + #endif /* CY_BLE_BONDING_REQUIREMENT == CY_BLE_BONDING_YES */ + + if (alertLevel != 0u) + { + cy_stc_ble_gap_disconnect_info_t disconnectInfoParam = + { + .bdHandle = appConnHandle.bdHandle, + .reason = CY_BLE_HCI_ERROR_OTHER_END_TERMINATED_USER + }; + + /* Initiate disconnection from the peer device*/ + if(Cy_BLE_GAP_Disconnect(&disconnectInfoParam) == CY_BLE_SUCCESS) + { + /* Wait for disconnection event */ + while(Cy_BLE_GetConnectionState(appConnHandle) == CY_BLE_CONN_STATE_CONNECTED) + { + /* Process BLE events */ + Cy_BLE_ProcessEvents(); + } + } + /* Stop BLE component. */ + Cy_BLE_Disable(); + Cy_DFU_ExecuteApp(0u); + } + } +} + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/iar/startup_psoc6_01_cm0plus.s b/2020TPCApp1.cydsn/iar/startup_psoc6_01_cm0plus.s new file mode 100644 index 0000000..a867384 --- /dev/null +++ b/2020TPCApp1.cydsn/iar/startup_psoc6_01_cm0plus.s @@ -0,0 +1,423 @@ +;/**************************************************************************//** +; * @file startup_psoc6_01_cm0plus.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0plus Device Series +; * @version V5.00 +; * @date 08. March 2016 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2016 ARM Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * Licensed under the Apache License, Version 2.0 (the License); you may +; * not use this file except in compliance with the License. +; * You may obtain a copy of the License at +; * +; * www.apache.org/licenses/LICENSE-2.0 +; * +; * 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. +; */ + +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + SECTION .intvec_ram:DATA:NOROOT(2) + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + EXTERN __iar_data_init3 + PUBLIC __vector_table + PUBLIC __vector_table_0x1c + PUBLIC __Vectors + PUBLIC __Vectors_End + PUBLIC __Vectors_Size + PUBLIC __ramVectors + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler + + DCD 0x0000000D ; NMI_Handler is defined in ROM code + DCD HardFault_Handler + DCD 0 + DCD 0 + DCD 0 +__vector_table_0x1c + DCD 0 + DCD 0 + DCD 0 + DCD 0 + DCD SVC_Handler + DCD 0 + DCD 0 + DCD PendSV_Handler + DCD SysTick_Handler + + ; External interrupts Power Mode Description + DCD NvicMux0_IRQHandler ; CM0+ NVIC Mux input 0 + DCD NvicMux1_IRQHandler ; CM0+ NVIC Mux input 1 + DCD NvicMux2_IRQHandler ; CM0+ NVIC Mux input 2 + DCD NvicMux3_IRQHandler ; CM0+ NVIC Mux input 3 + DCD NvicMux4_IRQHandler ; CM0+ NVIC Mux input 4 + DCD NvicMux5_IRQHandler ; CM0+ NVIC Mux input 5 + DCD NvicMux6_IRQHandler ; CM0+ NVIC Mux input 6 + DCD NvicMux7_IRQHandler ; CM0+ NVIC Mux input 7 + DCD NvicMux8_IRQHandler ; CM0+ NVIC Mux input 8 + DCD NvicMux9_IRQHandler ; CM0+ NVIC Mux input 9 + DCD NvicMux10_IRQHandler ; CM0+ NVIC Mux input 10 + DCD NvicMux11_IRQHandler ; CM0+ NVIC Mux input 11 + DCD NvicMux12_IRQHandler ; CM0+ NVIC Mux input 12 + DCD NvicMux13_IRQHandler ; CM0+ NVIC Mux input 13 + DCD NvicMux14_IRQHandler ; CM0+ NVIC Mux input 14 + DCD NvicMux15_IRQHandler ; CM0+ NVIC Mux input 15 + DCD NvicMux16_IRQHandler ; CM0+ NVIC Mux input 16 + DCD NvicMux17_IRQHandler ; CM0+ NVIC Mux input 17 + DCD NvicMux18_IRQHandler ; CM0+ NVIC Mux input 18 + DCD NvicMux19_IRQHandler ; CM0+ NVIC Mux input 19 + DCD NvicMux20_IRQHandler ; CM0+ NVIC Mux input 20 + DCD NvicMux21_IRQHandler ; CM0+ NVIC Mux input 21 + DCD NvicMux22_IRQHandler ; CM0+ NVIC Mux input 22 + DCD NvicMux23_IRQHandler ; CM0+ NVIC Mux input 23 + DCD NvicMux24_IRQHandler ; CM0+ NVIC Mux input 24 + DCD NvicMux25_IRQHandler ; CM0+ NVIC Mux input 25 + DCD NvicMux26_IRQHandler ; CM0+ NVIC Mux input 26 + DCD NvicMux27_IRQHandler ; CM0+ NVIC Mux input 27 + DCD NvicMux28_IRQHandler ; CM0+ NVIC Mux input 28 + DCD NvicMux29_IRQHandler ; CM0+ NVIC Mux input 29 + DCD NvicMux30_IRQHandler ; CM0+ NVIC Mux input 30 + DCD NvicMux31_IRQHandler ; CM0+ NVIC Mux input 31 + +__Vectors_End + +__Vectors EQU __vector_table +__Vectors_Size EQU __Vectors_End - __Vectors + + SECTION .intvec_ram:DATA:REORDER:NOROOT(2) +__ramVectors + DS32 __Vectors_Size + + + THUMB + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default handlers +;; + PUBWEAK Default_Handler + SECTION .text:CODE:REORDER:NOROOT(2) +Default_Handler + B Default_Handler + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Weak function for startup customization +;; +;; Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) +;; because this function is executed as the first instruction in the ResetHandler. +;; The PDL is also not initialized to use the proper register offsets. +;; The user of this function is responsible for initializing the PDL and resources before using them. +;; + PUBWEAK Cy_OnResetUser + SECTION .text:CODE:REORDER:NOROOT(2) +Cy_OnResetUser + BX LR + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Define strong version to return zero for +;; __iar_program_start to skip data sections +;; initialization. +;; + PUBLIC __low_level_init + SECTION .text:CODE:REORDER:NOROOT(2) +__low_level_init + MOVS R0, #0 + BX LR + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER:NOROOT(2) +Reset_Handler + + ; Define strong function for startup customization + LDR R0, =Cy_OnResetUser + BLX R0 + + ; Disable global interrupts + CPSID I + + ; Copy vectors from ROM to RAM + LDR r1, =__vector_table + LDR r0, =__ramVectors + LDR r2, =__Vectors_Size +intvec_copy + LDR r3, [r1] + STR r3, [r0] + ADDS r0, r0, #4 + ADDS r1, r1, #4 + SUBS r2, r2, #1 + CMP r2, #0 + BNE intvec_copy + + ; Update Vector Table Offset Register + LDR r0, =__ramVectors + LDR r1, =0xE000ED08 + STR r0, [r1] + dsb + + ; Initialize data sections + LDR R0, =__iar_data_init3 + BLX R0 + + LDR R0, =SystemInit + BLX R0 + + LDR R0, =__iar_program_start + BLX R0 + +; Should never get here +Cy_Main_Exited + B Cy_Main_Exited + + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +NMI_Handler + B NMI_Handler + + + PUBWEAK Cy_SysLib_FaultHandler + SECTION .text:CODE:REORDER:NOROOT(1) +Cy_SysLib_FaultHandler + B Cy_SysLib_FaultHandler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +HardFault_Handler + IMPORT Cy_SysLib_FaultHandler + movs r0, #4 + mov r1, LR + tst r0, r1 + beq L_MSP + mrs r0, PSP + b L_API_call +L_MSP + mrs r0, MSP +L_API_call + ; Storing LR content for Creator call stack trace + push {LR} + bl Cy_SysLib_FaultHandler + + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SVC_Handler + B SVC_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SysTick_Handler + B SysTick_Handler + + + ; External interrupts + PUBWEAK NvicMux0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux0_IRQHandler + B NvicMux0_IRQHandler + + PUBWEAK NvicMux1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux1_IRQHandler + B NvicMux1_IRQHandler + + PUBWEAK NvicMux2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux2_IRQHandler + B NvicMux2_IRQHandler + + PUBWEAK NvicMux3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux3_IRQHandler + B NvicMux3_IRQHandler + + PUBWEAK NvicMux4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux4_IRQHandler + B NvicMux4_IRQHandler + + PUBWEAK NvicMux5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux5_IRQHandler + B NvicMux5_IRQHandler + + PUBWEAK NvicMux6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux6_IRQHandler + B NvicMux6_IRQHandler + + PUBWEAK NvicMux7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux7_IRQHandler + B NvicMux7_IRQHandler + + PUBWEAK NvicMux8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux8_IRQHandler + B NvicMux8_IRQHandler + + PUBWEAK NvicMux9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux9_IRQHandler + B NvicMux9_IRQHandler + + PUBWEAK NvicMux10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux10_IRQHandler + B NvicMux10_IRQHandler + + PUBWEAK NvicMux11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux11_IRQHandler + B NvicMux11_IRQHandler + + PUBWEAK NvicMux12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux12_IRQHandler + B NvicMux12_IRQHandler + + PUBWEAK NvicMux13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux13_IRQHandler + B NvicMux13_IRQHandler + + PUBWEAK NvicMux14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux14_IRQHandler + B NvicMux14_IRQHandler + + PUBWEAK NvicMux15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux15_IRQHandler + B NvicMux15_IRQHandler + + PUBWEAK NvicMux16_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux16_IRQHandler + B NvicMux16_IRQHandler + + PUBWEAK NvicMux17_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux17_IRQHandler + B NvicMux17_IRQHandler + + PUBWEAK NvicMux18_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux18_IRQHandler + B NvicMux18_IRQHandler + + PUBWEAK NvicMux19_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux19_IRQHandler + B NvicMux19_IRQHandler + + PUBWEAK NvicMux20_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux20_IRQHandler + B NvicMux20_IRQHandler + + PUBWEAK NvicMux21_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux21_IRQHandler + B NvicMux21_IRQHandler + + PUBWEAK NvicMux22_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux22_IRQHandler + B NvicMux22_IRQHandler + + PUBWEAK NvicMux23_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux23_IRQHandler + B NvicMux23_IRQHandler + + PUBWEAK NvicMux24_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux24_IRQHandler + B NvicMux24_IRQHandler + + PUBWEAK NvicMux25_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux25_IRQHandler + B NvicMux25_IRQHandler + + PUBWEAK NvicMux26_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux26_IRQHandler + B NvicMux26_IRQHandler + + PUBWEAK NvicMux27_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux27_IRQHandler + B NvicMux27_IRQHandler + + PUBWEAK NvicMux28_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux28_IRQHandler + B NvicMux28_IRQHandler + + PUBWEAK NvicMux29_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux29_IRQHandler + B NvicMux29_IRQHandler + + PUBWEAK NvicMux30_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux30_IRQHandler + B NvicMux30_IRQHandler + + PUBWEAK NvicMux31_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux31_IRQHandler + B NvicMux31_IRQHandler + + + END + + +; [] END OF FILE diff --git a/2020TPCApp1.cydsn/iar/startup_psoc6_01_cm4.s b/2020TPCApp1.cydsn/iar/startup_psoc6_01_cm4.s new file mode 100644 index 0000000..6f1e869 --- /dev/null +++ b/2020TPCApp1.cydsn/iar/startup_psoc6_01_cm4.s @@ -0,0 +1,1142 @@ +;/**************************************************************************//** +; * @file startup_psoc6_01_cm4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device Series +; * @version V5.00 +; * @date 08. March 2016 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2016 ARM Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * Licensed under the Apache License, Version 2.0 (the License); you may +; * not use this file except in compliance with the License. +; * You may obtain a copy of the License at +; * +; * www.apache.org/licenses/LICENSE-2.0 +; * +; * 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. +; */ + +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + SECTION .intvec_ram:DATA:NOROOT(2) + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + EXTERN Cy_SystemInitFpuEnable + EXTERN __iar_data_init3 + PUBLIC __vector_table + PUBLIC __vector_table_0x1c + PUBLIC __Vectors + PUBLIC __Vectors_End + PUBLIC __Vectors_Size + PUBLIC __ramVectors + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler + + DCD 0x0000000D ; NMI_Handler is defined in ROM code + DCD HardFault_Handler + DCD MemManage_Handler + DCD BusFault_Handler + DCD UsageFault_Handler +__vector_table_0x1c + DCD 0 + DCD 0 + DCD 0 + DCD 0 + DCD SVC_Handler + DCD DebugMon_Handler + DCD 0 + DCD PendSV_Handler + DCD SysTick_Handler + + + ; External interrupts Description + DCD ioss_interrupts_gpio_0_IRQHandler ; GPIO Port Interrupt #0 + DCD ioss_interrupts_gpio_1_IRQHandler ; GPIO Port Interrupt #1 + DCD ioss_interrupts_gpio_2_IRQHandler ; GPIO Port Interrupt #2 + DCD ioss_interrupts_gpio_3_IRQHandler ; GPIO Port Interrupt #3 + DCD ioss_interrupts_gpio_4_IRQHandler ; GPIO Port Interrupt #4 + DCD ioss_interrupts_gpio_5_IRQHandler ; GPIO Port Interrupt #5 + DCD ioss_interrupts_gpio_6_IRQHandler ; GPIO Port Interrupt #6 + DCD ioss_interrupts_gpio_7_IRQHandler ; GPIO Port Interrupt #7 + DCD ioss_interrupts_gpio_8_IRQHandler ; GPIO Port Interrupt #8 + DCD ioss_interrupts_gpio_9_IRQHandler ; GPIO Port Interrupt #9 + DCD ioss_interrupts_gpio_10_IRQHandler ; GPIO Port Interrupt #10 + DCD ioss_interrupts_gpio_11_IRQHandler ; GPIO Port Interrupt #11 + DCD ioss_interrupts_gpio_12_IRQHandler ; GPIO Port Interrupt #12 + DCD ioss_interrupts_gpio_13_IRQHandler ; GPIO Port Interrupt #13 + DCD ioss_interrupts_gpio_14_IRQHandler ; GPIO Port Interrupt #14 + DCD ioss_interrupt_gpio_IRQHandler ; GPIO All Ports + DCD ioss_interrupt_vdd_IRQHandler ; GPIO Supply Detect Interrupt + DCD lpcomp_interrupt_IRQHandler ; Low Power Comparator Interrupt + DCD scb_8_interrupt_IRQHandler ; Serial Communication Block #8 (DeepSleep capable) + DCD srss_interrupt_mcwdt_0_IRQHandler ; Multi Counter Watchdog Timer interrupt + DCD srss_interrupt_mcwdt_1_IRQHandler ; Multi Counter Watchdog Timer interrupt + DCD srss_interrupt_backup_IRQHandler ; Backup domain interrupt + DCD srss_interrupt_IRQHandler ; Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) + DCD pass_interrupt_ctbs_IRQHandler ; CTBm Interrupt (all CTBms) + DCD bless_interrupt_IRQHandler ; Bluetooth Radio interrupt + DCD cpuss_interrupts_ipc_0_IRQHandler ; CPUSS Inter Process Communication Interrupt #0 + DCD cpuss_interrupts_ipc_1_IRQHandler ; CPUSS Inter Process Communication Interrupt #1 + DCD cpuss_interrupts_ipc_2_IRQHandler ; CPUSS Inter Process Communication Interrupt #2 + DCD cpuss_interrupts_ipc_3_IRQHandler ; CPUSS Inter Process Communication Interrupt #3 + DCD cpuss_interrupts_ipc_4_IRQHandler ; CPUSS Inter Process Communication Interrupt #4 + DCD cpuss_interrupts_ipc_5_IRQHandler ; CPUSS Inter Process Communication Interrupt #5 + DCD cpuss_interrupts_ipc_6_IRQHandler ; CPUSS Inter Process Communication Interrupt #6 + DCD cpuss_interrupts_ipc_7_IRQHandler ; CPUSS Inter Process Communication Interrupt #7 + DCD cpuss_interrupts_ipc_8_IRQHandler ; CPUSS Inter Process Communication Interrupt #8 + DCD cpuss_interrupts_ipc_9_IRQHandler ; CPUSS Inter Process Communication Interrupt #9 + DCD cpuss_interrupts_ipc_10_IRQHandler ; CPUSS Inter Process Communication Interrupt #10 + DCD cpuss_interrupts_ipc_11_IRQHandler ; CPUSS Inter Process Communication Interrupt #11 + DCD cpuss_interrupts_ipc_12_IRQHandler ; CPUSS Inter Process Communication Interrupt #12 + DCD cpuss_interrupts_ipc_13_IRQHandler ; CPUSS Inter Process Communication Interrupt #13 + DCD cpuss_interrupts_ipc_14_IRQHandler ; CPUSS Inter Process Communication Interrupt #14 + DCD cpuss_interrupts_ipc_15_IRQHandler ; CPUSS Inter Process Communication Interrupt #15 + DCD scb_0_interrupt_IRQHandler ; Serial Communication Block #0 + DCD scb_1_interrupt_IRQHandler ; Serial Communication Block #1 + DCD scb_2_interrupt_IRQHandler ; Serial Communication Block #2 + DCD scb_3_interrupt_IRQHandler ; Serial Communication Block #3 + DCD scb_4_interrupt_IRQHandler ; Serial Communication Block #4 + DCD scb_5_interrupt_IRQHandler ; Serial Communication Block #5 + DCD scb_6_interrupt_IRQHandler ; Serial Communication Block #6 + DCD scb_7_interrupt_IRQHandler ; Serial Communication Block #7 + DCD csd_interrupt_IRQHandler ; CSD (Capsense) interrupt + DCD cpuss_interrupts_dw0_0_IRQHandler ; CPUSS DataWire #0, Channel #0 + DCD cpuss_interrupts_dw0_1_IRQHandler ; CPUSS DataWire #0, Channel #1 + DCD cpuss_interrupts_dw0_2_IRQHandler ; CPUSS DataWire #0, Channel #2 + DCD cpuss_interrupts_dw0_3_IRQHandler ; CPUSS DataWire #0, Channel #3 + DCD cpuss_interrupts_dw0_4_IRQHandler ; CPUSS DataWire #0, Channel #4 + DCD cpuss_interrupts_dw0_5_IRQHandler ; CPUSS DataWire #0, Channel #5 + DCD cpuss_interrupts_dw0_6_IRQHandler ; CPUSS DataWire #0, Channel #6 + DCD cpuss_interrupts_dw0_7_IRQHandler ; CPUSS DataWire #0, Channel #7 + DCD cpuss_interrupts_dw0_8_IRQHandler ; CPUSS DataWire #0, Channel #8 + DCD cpuss_interrupts_dw0_9_IRQHandler ; CPUSS DataWire #0, Channel #9 + DCD cpuss_interrupts_dw0_10_IRQHandler ; CPUSS DataWire #0, Channel #10 + DCD cpuss_interrupts_dw0_11_IRQHandler ; CPUSS DataWire #0, Channel #11 + DCD cpuss_interrupts_dw0_12_IRQHandler ; CPUSS DataWire #0, Channel #12 + DCD cpuss_interrupts_dw0_13_IRQHandler ; CPUSS DataWire #0, Channel #13 + DCD cpuss_interrupts_dw0_14_IRQHandler ; CPUSS DataWire #0, Channel #14 + DCD cpuss_interrupts_dw0_15_IRQHandler ; CPUSS DataWire #0, Channel #15 + DCD cpuss_interrupts_dw1_0_IRQHandler ; CPUSS DataWire #1, Channel #0 + DCD cpuss_interrupts_dw1_1_IRQHandler ; CPUSS DataWire #1, Channel #1 + DCD cpuss_interrupts_dw1_2_IRQHandler ; CPUSS DataWire #1, Channel #2 + DCD cpuss_interrupts_dw1_3_IRQHandler ; CPUSS DataWire #1, Channel #3 + DCD cpuss_interrupts_dw1_4_IRQHandler ; CPUSS DataWire #1, Channel #4 + DCD cpuss_interrupts_dw1_5_IRQHandler ; CPUSS DataWire #1, Channel #5 + DCD cpuss_interrupts_dw1_6_IRQHandler ; CPUSS DataWire #1, Channel #6 + DCD cpuss_interrupts_dw1_7_IRQHandler ; CPUSS DataWire #1, Channel #7 + DCD cpuss_interrupts_dw1_8_IRQHandler ; CPUSS DataWire #1, Channel #8 + DCD cpuss_interrupts_dw1_9_IRQHandler ; CPUSS DataWire #1, Channel #9 + DCD cpuss_interrupts_dw1_10_IRQHandler ; CPUSS DataWire #1, Channel #10 + DCD cpuss_interrupts_dw1_11_IRQHandler ; CPUSS DataWire #1, Channel #11 + DCD cpuss_interrupts_dw1_12_IRQHandler ; CPUSS DataWire #1, Channel #12 + DCD cpuss_interrupts_dw1_13_IRQHandler ; CPUSS DataWire #1, Channel #13 + DCD cpuss_interrupts_dw1_14_IRQHandler ; CPUSS DataWire #1, Channel #14 + DCD cpuss_interrupts_dw1_15_IRQHandler ; CPUSS DataWire #1, Channel #15 + DCD cpuss_interrupts_fault_0_IRQHandler ; CPUSS Fault Structure Interrupt #0 + DCD cpuss_interrupts_fault_1_IRQHandler ; CPUSS Fault Structure Interrupt #1 + DCD cpuss_interrupt_crypto_IRQHandler ; CRYPTO Accelerator Interrupt + DCD cpuss_interrupt_fm_IRQHandler ; FLASH Macro Interrupt + DCD cpuss_interrupts_cm0_cti_0_IRQHandler ; CM0+ CTI #0 + DCD cpuss_interrupts_cm0_cti_1_IRQHandler ; CM0+ CTI #1 + DCD cpuss_interrupts_cm4_cti_0_IRQHandler ; CM4 CTI #0 + DCD cpuss_interrupts_cm4_cti_1_IRQHandler ; CM4 CTI #1 + DCD tcpwm_0_interrupts_0_IRQHandler ; TCPWM #0, Counter #0 + DCD tcpwm_0_interrupts_1_IRQHandler ; TCPWM #0, Counter #1 + DCD tcpwm_0_interrupts_2_IRQHandler ; TCPWM #0, Counter #2 + DCD tcpwm_0_interrupts_3_IRQHandler ; TCPWM #0, Counter #3 + DCD tcpwm_0_interrupts_4_IRQHandler ; TCPWM #0, Counter #4 + DCD tcpwm_0_interrupts_5_IRQHandler ; TCPWM #0, Counter #5 + DCD tcpwm_0_interrupts_6_IRQHandler ; TCPWM #0, Counter #6 + DCD tcpwm_0_interrupts_7_IRQHandler ; TCPWM #0, Counter #7 + DCD tcpwm_1_interrupts_0_IRQHandler ; TCPWM #1, Counter #0 + DCD tcpwm_1_interrupts_1_IRQHandler ; TCPWM #1, Counter #1 + DCD tcpwm_1_interrupts_2_IRQHandler ; TCPWM #1, Counter #2 + DCD tcpwm_1_interrupts_3_IRQHandler ; TCPWM #1, Counter #3 + DCD tcpwm_1_interrupts_4_IRQHandler ; TCPWM #1, Counter #4 + DCD tcpwm_1_interrupts_5_IRQHandler ; TCPWM #1, Counter #5 + DCD tcpwm_1_interrupts_6_IRQHandler ; TCPWM #1, Counter #6 + DCD tcpwm_1_interrupts_7_IRQHandler ; TCPWM #1, Counter #7 + DCD tcpwm_1_interrupts_8_IRQHandler ; TCPWM #1, Counter #8 + DCD tcpwm_1_interrupts_9_IRQHandler ; TCPWM #1, Counter #9 + DCD tcpwm_1_interrupts_10_IRQHandler ; TCPWM #1, Counter #10 + DCD tcpwm_1_interrupts_11_IRQHandler ; TCPWM #1, Counter #11 + DCD tcpwm_1_interrupts_12_IRQHandler ; TCPWM #1, Counter #12 + DCD tcpwm_1_interrupts_13_IRQHandler ; TCPWM #1, Counter #13 + DCD tcpwm_1_interrupts_14_IRQHandler ; TCPWM #1, Counter #14 + DCD tcpwm_1_interrupts_15_IRQHandler ; TCPWM #1, Counter #15 + DCD tcpwm_1_interrupts_16_IRQHandler ; TCPWM #1, Counter #16 + DCD tcpwm_1_interrupts_17_IRQHandler ; TCPWM #1, Counter #17 + DCD tcpwm_1_interrupts_18_IRQHandler ; TCPWM #1, Counter #18 + DCD tcpwm_1_interrupts_19_IRQHandler ; TCPWM #1, Counter #19 + DCD tcpwm_1_interrupts_20_IRQHandler ; TCPWM #1, Counter #20 + DCD tcpwm_1_interrupts_21_IRQHandler ; TCPWM #1, Counter #21 + DCD tcpwm_1_interrupts_22_IRQHandler ; TCPWM #1, Counter #22 + DCD tcpwm_1_interrupts_23_IRQHandler ; TCPWM #1, Counter #23 + DCD udb_interrupts_0_IRQHandler ; UDB Interrupt #0 + DCD udb_interrupts_1_IRQHandler ; UDB Interrupt #1 + DCD udb_interrupts_2_IRQHandler ; UDB Interrupt #2 + DCD udb_interrupts_3_IRQHandler ; UDB Interrupt #3 + DCD udb_interrupts_4_IRQHandler ; UDB Interrupt #4 + DCD udb_interrupts_5_IRQHandler ; UDB Interrupt #5 + DCD udb_interrupts_6_IRQHandler ; UDB Interrupt #6 + DCD udb_interrupts_7_IRQHandler ; UDB Interrupt #7 + DCD udb_interrupts_8_IRQHandler ; UDB Interrupt #8 + DCD udb_interrupts_9_IRQHandler ; UDB Interrupt #9 + DCD udb_interrupts_10_IRQHandler ; UDB Interrupt #10 + DCD udb_interrupts_11_IRQHandler ; UDB Interrupt #11 + DCD udb_interrupts_12_IRQHandler ; UDB Interrupt #12 + DCD udb_interrupts_13_IRQHandler ; UDB Interrupt #13 + DCD udb_interrupts_14_IRQHandler ; UDB Interrupt #14 + DCD udb_interrupts_15_IRQHandler ; UDB Interrupt #15 + DCD pass_interrupt_sar_IRQHandler ; SAR ADC interrupt + DCD audioss_interrupt_i2s_IRQHandler ; I2S Audio interrupt + DCD audioss_interrupt_pdm_IRQHandler ; PDM/PCM Audio interrupt + DCD profile_interrupt_IRQHandler ; Energy Profiler interrupt + DCD smif_interrupt_IRQHandler ; Serial Memory Interface interrupt + DCD usb_interrupt_hi_IRQHandler ; USB Interrupt + DCD usb_interrupt_med_IRQHandler ; USB Interrupt + DCD usb_interrupt_lo_IRQHandler ; USB Interrupt + DCD pass_interrupt_dacs_IRQHandler ; Consolidated interrrupt for all DACs + +__Vectors_End + +__Vectors EQU __vector_table +__Vectors_Size EQU __Vectors_End - __Vectors + + SECTION .intvec_ram:DATA:REORDER:NOROOT(2) +__ramVectors + DS32 __Vectors_Size + + + THUMB + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default handlers +;; + PUBWEAK Default_Handler + SECTION .text:CODE:REORDER:NOROOT(2) +Default_Handler + B Default_Handler + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Weak function for startup customization +;; +;; Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) +;; because this function is executed as the first instruction in the ResetHandler. +;; The PDL is also not initialized to use the proper register offsets. +;; The user of this function is responsible for initializing the PDL and resources before using them. +;; + PUBWEAK Cy_OnResetUser + SECTION .text:CODE:REORDER:NOROOT(2) +Cy_OnResetUser + BX LR + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Define strong version to return zero for +;; __iar_program_start to skip data sections +;; initialization. +;; + PUBLIC __low_level_init + SECTION .text:CODE:REORDER:NOROOT(2) +__low_level_init + MOVS R0, #0 + BX LR + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER:NOROOT(2) +Reset_Handler + + ; Define strong function for startup customization + LDR R0, =Cy_OnResetUser + BLX R0 + + ; Disable global interrupts + CPSID I + + ; Copy vectors from ROM to RAM + LDR r1, =__vector_table + LDR r0, =__ramVectors + LDR r2, =__Vectors_Size +intvec_copy + LDR r3, [r1] + STR r3, [r0] + ADDS r0, r0, #4 + ADDS r1, r1, #4 + SUBS r2, r2, #1 + CMP r2, #0 + BNE intvec_copy + + ; Update Vector Table Offset Register + LDR r0, =__ramVectors + LDR r1, =0xE000ED08 + STR r0, [r1] + dsb + + ; Enable the FPU if used + LDR R0, =Cy_SystemInitFpuEnable + BLX R0 + + ; Initialize data sections + LDR R0, =__iar_data_init3 + BLX R0 + + LDR R0, =SystemInit + BLX R0 + + LDR R0, =__iar_program_start + BLX R0 + +; Should never get here +Cy_Main_Exited + B Cy_Main_Exited + + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +NMI_Handler + B NMI_Handler + + + PUBWEAK Cy_SysLib_FaultHandler + SECTION .text:CODE:REORDER:NOROOT(1) +Cy_SysLib_FaultHandler + B Cy_SysLib_FaultHandler + + PUBWEAK HardFault_Wrapper + SECTION .text:CODE:REORDER:NOROOT(1) +HardFault_Wrapper + IMPORT Cy_SysLib_FaultHandler + movs r0, #4 + mov r1, LR + tst r0, r1 + beq L_MSP + mrs r0, PSP + b L_API_call +L_MSP + mrs r0, MSP +L_API_call + ; Storing LR content for Creator call stack trace + push {LR} + bl Cy_SysLib_FaultHandler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +HardFault_Handler + B HardFault_Wrapper + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +MemManage_Handler + B HardFault_Wrapper + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +BusFault_Handler + B HardFault_Wrapper + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +UsageFault_Handler + B HardFault_Wrapper + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SysTick_Handler + B SysTick_Handler + + + ; External interrupts + PUBWEAK ioss_interrupts_gpio_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_0_IRQHandler + B ioss_interrupts_gpio_0_IRQHandler + + PUBWEAK ioss_interrupts_gpio_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_1_IRQHandler + B ioss_interrupts_gpio_1_IRQHandler + + PUBWEAK ioss_interrupts_gpio_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_2_IRQHandler + B ioss_interrupts_gpio_2_IRQHandler + + PUBWEAK ioss_interrupts_gpio_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_3_IRQHandler + B ioss_interrupts_gpio_3_IRQHandler + + PUBWEAK ioss_interrupts_gpio_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_4_IRQHandler + B ioss_interrupts_gpio_4_IRQHandler + + PUBWEAK ioss_interrupts_gpio_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_5_IRQHandler + B ioss_interrupts_gpio_5_IRQHandler + + PUBWEAK ioss_interrupts_gpio_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_6_IRQHandler + B ioss_interrupts_gpio_6_IRQHandler + + PUBWEAK ioss_interrupts_gpio_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_7_IRQHandler + B ioss_interrupts_gpio_7_IRQHandler + + PUBWEAK ioss_interrupts_gpio_8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_8_IRQHandler + B ioss_interrupts_gpio_8_IRQHandler + + PUBWEAK ioss_interrupts_gpio_9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_9_IRQHandler + B ioss_interrupts_gpio_9_IRQHandler + + PUBWEAK ioss_interrupts_gpio_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_10_IRQHandler + B ioss_interrupts_gpio_10_IRQHandler + + PUBWEAK ioss_interrupts_gpio_11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_11_IRQHandler + B ioss_interrupts_gpio_11_IRQHandler + + PUBWEAK ioss_interrupts_gpio_12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_12_IRQHandler + B ioss_interrupts_gpio_12_IRQHandler + + PUBWEAK ioss_interrupts_gpio_13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_13_IRQHandler + B ioss_interrupts_gpio_13_IRQHandler + + PUBWEAK ioss_interrupts_gpio_14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_14_IRQHandler + B ioss_interrupts_gpio_14_IRQHandler + + PUBWEAK ioss_interrupt_gpio_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupt_gpio_IRQHandler + B ioss_interrupt_gpio_IRQHandler + + PUBWEAK ioss_interrupt_vdd_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupt_vdd_IRQHandler + B ioss_interrupt_vdd_IRQHandler + + PUBWEAK lpcomp_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +lpcomp_interrupt_IRQHandler + B lpcomp_interrupt_IRQHandler + + PUBWEAK scb_8_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_8_interrupt_IRQHandler + B scb_8_interrupt_IRQHandler + + PUBWEAK srss_interrupt_mcwdt_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +srss_interrupt_mcwdt_0_IRQHandler + B srss_interrupt_mcwdt_0_IRQHandler + + PUBWEAK srss_interrupt_mcwdt_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +srss_interrupt_mcwdt_1_IRQHandler + B srss_interrupt_mcwdt_1_IRQHandler + + PUBWEAK srss_interrupt_backup_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +srss_interrupt_backup_IRQHandler + B srss_interrupt_backup_IRQHandler + + PUBWEAK srss_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +srss_interrupt_IRQHandler + B srss_interrupt_IRQHandler + + PUBWEAK pass_interrupt_ctbs_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +pass_interrupt_ctbs_IRQHandler + B pass_interrupt_ctbs_IRQHandler + + PUBWEAK bless_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +bless_interrupt_IRQHandler + B bless_interrupt_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_0_IRQHandler + B cpuss_interrupts_ipc_0_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_1_IRQHandler + B cpuss_interrupts_ipc_1_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_2_IRQHandler + B cpuss_interrupts_ipc_2_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_3_IRQHandler + B cpuss_interrupts_ipc_3_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_4_IRQHandler + B cpuss_interrupts_ipc_4_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_5_IRQHandler + B cpuss_interrupts_ipc_5_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_6_IRQHandler + B cpuss_interrupts_ipc_6_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_7_IRQHandler + B cpuss_interrupts_ipc_7_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_8_IRQHandler + B cpuss_interrupts_ipc_8_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_9_IRQHandler + B cpuss_interrupts_ipc_9_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_10_IRQHandler + B cpuss_interrupts_ipc_10_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_11_IRQHandler + B cpuss_interrupts_ipc_11_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_12_IRQHandler + B cpuss_interrupts_ipc_12_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_13_IRQHandler + B cpuss_interrupts_ipc_13_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_14_IRQHandler + B cpuss_interrupts_ipc_14_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_15_IRQHandler + B cpuss_interrupts_ipc_15_IRQHandler + + PUBWEAK scb_0_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_0_interrupt_IRQHandler + B scb_0_interrupt_IRQHandler + + PUBWEAK scb_1_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_1_interrupt_IRQHandler + B scb_1_interrupt_IRQHandler + + PUBWEAK scb_2_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_2_interrupt_IRQHandler + B scb_2_interrupt_IRQHandler + + PUBWEAK scb_3_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_3_interrupt_IRQHandler + B scb_3_interrupt_IRQHandler + + PUBWEAK scb_4_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_4_interrupt_IRQHandler + B scb_4_interrupt_IRQHandler + + PUBWEAK scb_5_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_5_interrupt_IRQHandler + B scb_5_interrupt_IRQHandler + + PUBWEAK scb_6_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_6_interrupt_IRQHandler + B scb_6_interrupt_IRQHandler + + PUBWEAK scb_7_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_7_interrupt_IRQHandler + B scb_7_interrupt_IRQHandler + + PUBWEAK csd_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +csd_interrupt_IRQHandler + B csd_interrupt_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_0_IRQHandler + B cpuss_interrupts_dw0_0_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_1_IRQHandler + B cpuss_interrupts_dw0_1_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_2_IRQHandler + B cpuss_interrupts_dw0_2_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_3_IRQHandler + B cpuss_interrupts_dw0_3_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_4_IRQHandler + B cpuss_interrupts_dw0_4_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_5_IRQHandler + B cpuss_interrupts_dw0_5_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_6_IRQHandler + B cpuss_interrupts_dw0_6_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_7_IRQHandler + B cpuss_interrupts_dw0_7_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_8_IRQHandler + B cpuss_interrupts_dw0_8_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_9_IRQHandler + B cpuss_interrupts_dw0_9_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_10_IRQHandler + B cpuss_interrupts_dw0_10_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_11_IRQHandler + B cpuss_interrupts_dw0_11_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_12_IRQHandler + B cpuss_interrupts_dw0_12_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_13_IRQHandler + B cpuss_interrupts_dw0_13_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_14_IRQHandler + B cpuss_interrupts_dw0_14_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_15_IRQHandler + B cpuss_interrupts_dw0_15_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_0_IRQHandler + B cpuss_interrupts_dw1_0_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_1_IRQHandler + B cpuss_interrupts_dw1_1_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_2_IRQHandler + B cpuss_interrupts_dw1_2_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_3_IRQHandler + B cpuss_interrupts_dw1_3_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_4_IRQHandler + B cpuss_interrupts_dw1_4_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_5_IRQHandler + B cpuss_interrupts_dw1_5_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_6_IRQHandler + B cpuss_interrupts_dw1_6_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_7_IRQHandler + B cpuss_interrupts_dw1_7_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_8_IRQHandler + B cpuss_interrupts_dw1_8_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_9_IRQHandler + B cpuss_interrupts_dw1_9_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_10_IRQHandler + B cpuss_interrupts_dw1_10_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_11_IRQHandler + B cpuss_interrupts_dw1_11_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_12_IRQHandler + B cpuss_interrupts_dw1_12_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_13_IRQHandler + B cpuss_interrupts_dw1_13_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_14_IRQHandler + B cpuss_interrupts_dw1_14_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_15_IRQHandler + B cpuss_interrupts_dw1_15_IRQHandler + + PUBWEAK cpuss_interrupts_fault_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_fault_0_IRQHandler + B cpuss_interrupts_fault_0_IRQHandler + + PUBWEAK cpuss_interrupts_fault_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_fault_1_IRQHandler + B cpuss_interrupts_fault_1_IRQHandler + + PUBWEAK cpuss_interrupt_crypto_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupt_crypto_IRQHandler + B cpuss_interrupt_crypto_IRQHandler + + PUBWEAK cpuss_interrupt_fm_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupt_fm_IRQHandler + B cpuss_interrupt_fm_IRQHandler + + PUBWEAK cpuss_interrupts_cm0_cti_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_cm0_cti_0_IRQHandler + B cpuss_interrupts_cm0_cti_0_IRQHandler + + PUBWEAK cpuss_interrupts_cm0_cti_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_cm0_cti_1_IRQHandler + B cpuss_interrupts_cm0_cti_1_IRQHandler + + PUBWEAK cpuss_interrupts_cm4_cti_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_cm4_cti_0_IRQHandler + B cpuss_interrupts_cm4_cti_0_IRQHandler + + PUBWEAK cpuss_interrupts_cm4_cti_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_cm4_cti_1_IRQHandler + B cpuss_interrupts_cm4_cti_1_IRQHandler + + PUBWEAK tcpwm_0_interrupts_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_0_IRQHandler + B tcpwm_0_interrupts_0_IRQHandler + + PUBWEAK tcpwm_0_interrupts_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_1_IRQHandler + B tcpwm_0_interrupts_1_IRQHandler + + PUBWEAK tcpwm_0_interrupts_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_2_IRQHandler + B tcpwm_0_interrupts_2_IRQHandler + + PUBWEAK tcpwm_0_interrupts_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_3_IRQHandler + B tcpwm_0_interrupts_3_IRQHandler + + PUBWEAK tcpwm_0_interrupts_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_4_IRQHandler + B tcpwm_0_interrupts_4_IRQHandler + + PUBWEAK tcpwm_0_interrupts_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_5_IRQHandler + B tcpwm_0_interrupts_5_IRQHandler + + PUBWEAK tcpwm_0_interrupts_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_6_IRQHandler + B tcpwm_0_interrupts_6_IRQHandler + + PUBWEAK tcpwm_0_interrupts_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_7_IRQHandler + B tcpwm_0_interrupts_7_IRQHandler + + PUBWEAK tcpwm_1_interrupts_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_0_IRQHandler + B tcpwm_1_interrupts_0_IRQHandler + + PUBWEAK tcpwm_1_interrupts_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_1_IRQHandler + B tcpwm_1_interrupts_1_IRQHandler + + PUBWEAK tcpwm_1_interrupts_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_2_IRQHandler + B tcpwm_1_interrupts_2_IRQHandler + + PUBWEAK tcpwm_1_interrupts_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_3_IRQHandler + B tcpwm_1_interrupts_3_IRQHandler + + PUBWEAK tcpwm_1_interrupts_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_4_IRQHandler + B tcpwm_1_interrupts_4_IRQHandler + + PUBWEAK tcpwm_1_interrupts_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_5_IRQHandler + B tcpwm_1_interrupts_5_IRQHandler + + PUBWEAK tcpwm_1_interrupts_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_6_IRQHandler + B tcpwm_1_interrupts_6_IRQHandler + + PUBWEAK tcpwm_1_interrupts_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_7_IRQHandler + B tcpwm_1_interrupts_7_IRQHandler + + PUBWEAK tcpwm_1_interrupts_8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_8_IRQHandler + B tcpwm_1_interrupts_8_IRQHandler + + PUBWEAK tcpwm_1_interrupts_9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_9_IRQHandler + B tcpwm_1_interrupts_9_IRQHandler + + PUBWEAK tcpwm_1_interrupts_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_10_IRQHandler + B tcpwm_1_interrupts_10_IRQHandler + + PUBWEAK tcpwm_1_interrupts_11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_11_IRQHandler + B tcpwm_1_interrupts_11_IRQHandler + + PUBWEAK tcpwm_1_interrupts_12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_12_IRQHandler + B tcpwm_1_interrupts_12_IRQHandler + + PUBWEAK tcpwm_1_interrupts_13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_13_IRQHandler + B tcpwm_1_interrupts_13_IRQHandler + + PUBWEAK tcpwm_1_interrupts_14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_14_IRQHandler + B tcpwm_1_interrupts_14_IRQHandler + + PUBWEAK tcpwm_1_interrupts_15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_15_IRQHandler + B tcpwm_1_interrupts_15_IRQHandler + + PUBWEAK tcpwm_1_interrupts_16_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_16_IRQHandler + B tcpwm_1_interrupts_16_IRQHandler + + PUBWEAK tcpwm_1_interrupts_17_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_17_IRQHandler + B tcpwm_1_interrupts_17_IRQHandler + + PUBWEAK tcpwm_1_interrupts_18_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_18_IRQHandler + B tcpwm_1_interrupts_18_IRQHandler + + PUBWEAK tcpwm_1_interrupts_19_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_19_IRQHandler + B tcpwm_1_interrupts_19_IRQHandler + + PUBWEAK tcpwm_1_interrupts_20_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_20_IRQHandler + B tcpwm_1_interrupts_20_IRQHandler + + PUBWEAK tcpwm_1_interrupts_21_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_21_IRQHandler + B tcpwm_1_interrupts_21_IRQHandler + + PUBWEAK tcpwm_1_interrupts_22_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_22_IRQHandler + B tcpwm_1_interrupts_22_IRQHandler + + PUBWEAK tcpwm_1_interrupts_23_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_23_IRQHandler + B tcpwm_1_interrupts_23_IRQHandler + + PUBWEAK udb_interrupts_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_0_IRQHandler + B udb_interrupts_0_IRQHandler + + PUBWEAK udb_interrupts_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_1_IRQHandler + B udb_interrupts_1_IRQHandler + + PUBWEAK udb_interrupts_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_2_IRQHandler + B udb_interrupts_2_IRQHandler + + PUBWEAK udb_interrupts_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_3_IRQHandler + B udb_interrupts_3_IRQHandler + + PUBWEAK udb_interrupts_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_4_IRQHandler + B udb_interrupts_4_IRQHandler + + PUBWEAK udb_interrupts_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_5_IRQHandler + B udb_interrupts_5_IRQHandler + + PUBWEAK udb_interrupts_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_6_IRQHandler + B udb_interrupts_6_IRQHandler + + PUBWEAK udb_interrupts_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_7_IRQHandler + B udb_interrupts_7_IRQHandler + + PUBWEAK udb_interrupts_8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_8_IRQHandler + B udb_interrupts_8_IRQHandler + + PUBWEAK udb_interrupts_9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_9_IRQHandler + B udb_interrupts_9_IRQHandler + + PUBWEAK udb_interrupts_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_10_IRQHandler + B udb_interrupts_10_IRQHandler + + PUBWEAK udb_interrupts_11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_11_IRQHandler + B udb_interrupts_11_IRQHandler + + PUBWEAK udb_interrupts_12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_12_IRQHandler + B udb_interrupts_12_IRQHandler + + PUBWEAK udb_interrupts_13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_13_IRQHandler + B udb_interrupts_13_IRQHandler + + PUBWEAK udb_interrupts_14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_14_IRQHandler + B udb_interrupts_14_IRQHandler + + PUBWEAK udb_interrupts_15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_15_IRQHandler + B udb_interrupts_15_IRQHandler + + PUBWEAK pass_interrupt_sar_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +pass_interrupt_sar_IRQHandler + B pass_interrupt_sar_IRQHandler + + PUBWEAK audioss_interrupt_i2s_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +audioss_interrupt_i2s_IRQHandler + B audioss_interrupt_i2s_IRQHandler + + PUBWEAK audioss_interrupt_pdm_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +audioss_interrupt_pdm_IRQHandler + B audioss_interrupt_pdm_IRQHandler + + PUBWEAK profile_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +profile_interrupt_IRQHandler + B profile_interrupt_IRQHandler + + PUBWEAK smif_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +smif_interrupt_IRQHandler + B smif_interrupt_IRQHandler + + PUBWEAK usb_interrupt_hi_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +usb_interrupt_hi_IRQHandler + B usb_interrupt_hi_IRQHandler + + PUBWEAK usb_interrupt_med_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +usb_interrupt_med_IRQHandler + B usb_interrupt_med_IRQHandler + + PUBWEAK usb_interrupt_lo_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +usb_interrupt_lo_IRQHandler + B usb_interrupt_lo_IRQHandler + + PUBWEAK pass_interrupt_dacs_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +pass_interrupt_dacs_IRQHandler + B pass_interrupt_dacs_IRQHandler + + + END + + +; [] END OF FILE diff --git a/2020TPCApp1.cydsn/ias.c b/2020TPCApp1.cydsn/ias.c new file mode 100644 index 0000000..43c8e63 --- /dev/null +++ b/2020TPCApp1.cydsn/ias.c @@ -0,0 +1,62 @@ +/******************************************************************************* +* File Name: ias.c +* +* Description: +* This file contains Immediate Alert Service callback handler function. +* +******************************************************************************** +* Copyright 2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include +#include "ias.h" + + +/* IAS alert level value */ +volatile uint8_t alertLevel = 0; + +/****************************************************************************** +* Function Name: IasInit +******************************************************************************* +* +* Summary: +* Registers the IAS CallBack. +* +******************************************************************************/ +void IasInit(void) +{ + Cy_BLE_IAS_RegisterAttrCallback(IasEventHandler); +} + + +/******************************************************************************* +* Function Name: IasEventHandler +******************************************************************************** +* +* Summary: +* This is an event callback function to receive events from the BLE Component, +* which are specific to Immediate Alert Service. +* +* Parameters: +* event: Write Command event from the BLE component. +* eventParams: A structure instance of CY_BLE_GATT_HANDLE_VALUE_PAIR_T type. +* +*******************************************************************************/ +void IasEventHandler(uint32 event, void *eventParam) +{ + (void) eventParam; + uint8_t alert; + /* Alert Level Characteristic write event */ + if(event == CY_BLE_EVT_IASS_WRITE_CHAR_CMD) + { + /* Read the updated Alert Level value from the GATT database */ + Cy_BLE_IASS_GetCharacteristicValue(CY_BLE_IAS_ALERT_LEVEL, sizeof(alert), &alert); + alertLevel = alert; + } +} + + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/ias.h b/2020TPCApp1.cydsn/ias.h new file mode 100644 index 0000000..ae43d33 --- /dev/null +++ b/2020TPCApp1.cydsn/ias.h @@ -0,0 +1,41 @@ +/******************************************************************************* +* File Name: ias.h +* +* Description: +* Contains the function prototypes and constants available to the example +* project. +* +******************************************************************************** +* Copyright 2016, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include + + +/*************************************** +* API Constants +***************************************/ +#define NO_ALERT (0u) +#define MILD_ALERT (1u) +#define HIGH_ALERT (2u) + +#define LED_TOGGLE_TIMEOUT (100u) + + +/*************************************** +* Function Prototypes +***************************************/ +void IasInit(void); +void IasEventHandler(uint32_t event, void *eventParam); + + +/*************************************** +* External data references +***************************************/ +extern volatile uint8_t alertLevel; + + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/main_cm0p.c b/2020TPCApp1.cydsn/main_cm0p.c new file mode 100644 index 0000000..4ef1811 --- /dev/null +++ b/2020TPCApp1.cydsn/main_cm0p.c @@ -0,0 +1,81 @@ +#include "dfu/cy_dfu.h" +#include "project.h" +#include "common.h" +#include "cy_si_config.h" + +#include "COMM_IPC_Messages.h" + +/* App1 Start Address, change define if different */ +#define APP_1_START_ADDRESS 0x10040000 + +/* Cypress Standard Application Format Header */ +CY_SECTION(".cy_app_header") __USED +const cy_stc_user_appheader_t applicationHeader = +{ + .objSize = CY_DFU_APP1_VERIFY_LENGTH, /* App Size to authenticate */ + .appId = CY_SI_APP_VERSION, /* App ID */ + .appAttributes = 0UL, /* Reserved */ + .numCores = 2UL, /* Number of cores in the application */ + .core0Vt = (uint32_t)(&__Vectors[0]) - APP_1_START_ADDRESS - offsetof(cy_stc_user_appheader_t, core0Vt), /* Offset to CM0+ Vector Table in flash */ + .core1Vt = (uint32_t)(&__cy_app_core1_start_addr) - APP_1_START_ADDRESS - offsetof(cy_stc_user_appheader_t, core1Vt), /* Offset to CM4 Vector Table in flash */ + .core0Id = CY_ARM_CM0P_CPUID, /* ARM CM0+ CPU ID */ + .core1Id = CY_ARM_CM4_CPUID, /* ARM CM4 CPU ID */ +}; + + +/******************************************************************************* +* Function Name: main() +******************************************************************************** +* +* Summary: +* Main function for the project. +* +* +*******************************************************************************/ +int main(void) +{ + + /* Unfreeze IO after Hibernate */ + if(Cy_SysPm_GetIoFreezeStatus()) + { + Cy_SysPm_IoUnfreeze(); + } + + /* Enable global interrupts. */ + __enable_irq(); + +#if(CY_BLE_CONFIG_HOST_CORE == CY_BLE_CORE_CORTEX_M0P) + COMM_InitIPCMessages(); + + /* Enable CM4. CY_CORTEX_M4_APPL_ADDR must be updated if CM4 memory layout is changed. */ + Cy_SysEnableCM4( (uint32_t)(&__cy_app_core1_start_addr) ); + + /* Run Host main */ + HostMain(); + +#else + + #if(CY_BLE_STACK_MODE_IPC) + /* Start BLE Controller for dual core mode */ + Cy_BLE_Start(NULL); + #endif /* (CY_BLE_STACK_MODE_IPC)*/ + + COMM_InitIPCMessages(); + + /* Enable CM4. CY_CORTEX_M4_APPL_ADDR must be updated if CM4 memory layout is changed. */ + Cy_SysEnableCM4( (uint32_t)(&__cy_app_core1_start_addr) ); + + while(true) + { + #if(CY_BLE_STACK_MODE_IPC) + /* Process BLE events continuously for controller in dual core mode */ + Cy_BLE_ProcessEvents(); + #endif /* CY_BLE_STACK_MODE_IPC */ + + /* To achieve low power in the device */ + Cy_SysPm_DeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT); + } + +#endif /* (CY_BLE_HOST_CORE == CY_CPU_CORTEX_M0P) */ +} + diff --git a/2020TPCApp1.cydsn/main_cm4.c b/2020TPCApp1.cydsn/main_cm4.c new file mode 100644 index 0000000..b41075e --- /dev/null +++ b/2020TPCApp1.cydsn/main_cm4.c @@ -0,0 +1,114 @@ +/** \file + * \brief This file provides the entry point for the application running on the Cortex-M4 core. + * + * ## CapSense + * To tune the CapSense buttons, do the following: + * 1. Define `TUNE_CAPSENSE` below. + * 2. Rebuild the project, and load it on to your board. + * 3. Right-click on the `CapSense` component on the "CapSense" schematic page in `TopDesign.cysch`, and choose "Launch Tuner". + * 4. Follow the instructions in [AN85951 - PSoC 4 and PSoC 6 MCU CapSense Design Guide](https://www.cypress.com/documentation/application-notes/an85951-psoc-4-and-psoc-6-mcu-capsense-design-guide) to complete the tuning. + * + */ + + +/* Include Files */ +#include "KTag.h" + + +// See the instructions at the top of this file for how to tune CapSense--this is only part of what you need. +//#define TUNE_CAPSENSE + + +/* This section is used to verify an application signature + For sha256 verification, set the number of elements in the array to 64, and + in bootload_common.ld set __cy_boot_signature_size = 256. +*/ +CY_SECTION(".cy_app_signature") __USED static const uint32_t cy_bootload_appSignature[64]; + + +#ifndef TUNE_CAPSENSE +int main() +{ + CONFIG_InitTasks(); + + /* Enable global interrupts. */ + __enable_irq(); + + COMM_InitIPCMessages(); + + CONFIG_RunTasks(); +} +#endif // TUNE_CAPSENSE + + +void vApplicationIdleHook(void) +{ + CyDelay(500); +} + + +void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName ) +{ + /* Halt the CPU */ + CY_ASSERT(0); +} + + +void vApplicationMallocFailedHook( void ) +{ + /* Halt the CPU */ + CY_ASSERT(0); +} + + +#ifdef TUNE_CAPSENSE +int main() +{ + uint8 header[] = {0x0Du, 0x0Au}; + uint8 tail[] = {0x00u, 0xFFu, 0xFFu}; + + __enable_irq(); /* Enable global interrupts. */ + + UART_Console_Start(); /* Start UART SCB Component */ + CapSense_Start(); /* Initialize Component */ + CapSense_ScanAllWidgets(); /* Scan all widgets */ + + for(;;) + { + /* Do this only when a scan is done */ + if(CapSense_NOT_BUSY == CapSense_IsBusy()) + { + CapSense_ProcessAllWidgets(); /* Process all widgets */ + + /* Send packet header */ + UART_Console_PutArrayBlocking((uint8 *)(&header), sizeof(header)); + /* Send packet with CapSense data */ + UART_Console_PutArrayBlocking((uint8 *)(&CapSense_dsRam), sizeof(CapSense_dsRam)); + /* Send packet tail */ + UART_Console_PutArrayBlocking((uint8 *)(&tail), sizeof(tail)); + + CapSense_ScanAllWidgets(); /* Start next scan */ + } + } +} +#endif // TUNE_CAPSENSE + +void vApplicationGetIdleTaskMemory(StaticTask_t** ppxIdleTaskTCBBuffer, StackType_t** ppxIdleTaskStackBuffer, uint32_t* pulIdleTaskStackSize) +{ + static StaticTask_t xIdleTaskTCB; + static StackType_t uxIdleTaskStack[configMINIMAL_STACK_SIZE]; + + *ppxIdleTaskTCBBuffer = &xIdleTaskTCB; + *ppxIdleTaskStackBuffer = uxIdleTaskStack; + *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; +} + +void vApplicationGetTimerTaskMemory(StaticTask_t** ppxTimerTaskTCBBuffer, StackType_t** ppxTimerTaskStackBuffer, uint32_t* pulTimerTaskStackSize) +{ + static StaticTask_t xTimerTaskTCB; + static StackType_t uxTimerTaskStack[configTIMER_TASK_STACK_DEPTH]; + + *ppxTimerTaskTCBBuffer = &xTimerTaskTCB; + *ppxTimerTaskStackBuffer = uxTimerTaskStack; + *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; +} \ No newline at end of file diff --git a/2020TPCApp1.cydsn/mdk/startup_psoc6_01_cm0plus.s b/2020TPCApp1.cydsn/mdk/startup_psoc6_01_cm0plus.s new file mode 100644 index 0000000..9358665 --- /dev/null +++ b/2020TPCApp1.cydsn/mdk/startup_psoc6_01_cm0plus.s @@ -0,0 +1,321 @@ +;/**************************************************************************//** +; * @file startup_psoc6_01_cm0plus.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0plus Device Series +; * @version V5.00 +; * @date 02. March 2016 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2016 ARM Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * Licensed under the Apache License, Version 2.0 (the License); you may +; * not use this file except in compliance with the License. +; * You may obtain a copy of the License at +; * +; * www.apache.org/licenses/LICENSE-2.0 +; * +; * 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. +; */ + +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + IF :DEF:__STACK_SIZE +Stack_Size EQU __STACK_SIZE + ELSE +Stack_Size EQU 0x00001000 + ENDIF + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + IF :DEF:__HEAP_SIZE +Heap_Size EQU __HEAP_SIZE + ELSE +Heap_Size EQU 0x00000400 + ENDIF + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + + DCD 0x0000000D ; NMI Handler located at ROM code + DCD HardFault_Handler ; Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + + ; External interrupts Description + DCD NvicMux0_IRQHandler ; CM0+ NVIC Mux input 0 + DCD NvicMux1_IRQHandler ; CM0+ NVIC Mux input 1 + DCD NvicMux2_IRQHandler ; CM0+ NVIC Mux input 2 + DCD NvicMux3_IRQHandler ; CM0+ NVIC Mux input 3 + DCD NvicMux4_IRQHandler ; CM0+ NVIC Mux input 4 + DCD NvicMux5_IRQHandler ; CM0+ NVIC Mux input 5 + DCD NvicMux6_IRQHandler ; CM0+ NVIC Mux input 6 + DCD NvicMux7_IRQHandler ; CM0+ NVIC Mux input 7 + DCD NvicMux8_IRQHandler ; CM0+ NVIC Mux input 8 + DCD NvicMux9_IRQHandler ; CM0+ NVIC Mux input 9 + DCD NvicMux10_IRQHandler ; CM0+ NVIC Mux input 10 + DCD NvicMux11_IRQHandler ; CM0+ NVIC Mux input 11 + DCD NvicMux12_IRQHandler ; CM0+ NVIC Mux input 12 + DCD NvicMux13_IRQHandler ; CM0+ NVIC Mux input 13 + DCD NvicMux14_IRQHandler ; CM0+ NVIC Mux input 14 + DCD NvicMux15_IRQHandler ; CM0+ NVIC Mux input 15 + DCD NvicMux16_IRQHandler ; CM0+ NVIC Mux input 16 + DCD NvicMux17_IRQHandler ; CM0+ NVIC Mux input 17 + DCD NvicMux18_IRQHandler ; CM0+ NVIC Mux input 18 + DCD NvicMux19_IRQHandler ; CM0+ NVIC Mux input 19 + DCD NvicMux20_IRQHandler ; CM0+ NVIC Mux input 20 + DCD NvicMux21_IRQHandler ; CM0+ NVIC Mux input 21 + DCD NvicMux22_IRQHandler ; CM0+ NVIC Mux input 22 + DCD NvicMux23_IRQHandler ; CM0+ NVIC Mux input 23 + DCD NvicMux24_IRQHandler ; CM0+ NVIC Mux input 24 + DCD NvicMux25_IRQHandler ; CM0+ NVIC Mux input 25 + DCD NvicMux26_IRQHandler ; CM0+ NVIC Mux input 26 + DCD NvicMux27_IRQHandler ; CM0+ NVIC Mux input 27 + DCD NvicMux28_IRQHandler ; CM0+ NVIC Mux input 28 + DCD NvicMux29_IRQHandler ; CM0+ NVIC Mux input 29 + DCD NvicMux30_IRQHandler ; CM0+ NVIC Mux input 30 + DCD NvicMux31_IRQHandler ; CM0+ NVIC Mux input 31 + +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + EXPORT __ramVectors + AREA RESET_RAM, READWRITE, NOINIT +__ramVectors SPACE __Vectors_Size + + + AREA |.text|, CODE, READONLY + + +; Weak function for startup customization +; +; Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) +; because this function is executed as the first instruction in the ResetHandler. +; The PDL is also not initialized to use the proper register offsets. +; The user of this function is responsible for initializing the PDL and resources before using them. +; +Cy_OnResetUser PROC + EXPORT Cy_OnResetUser [WEAK] + BX LR + ENDP + +; Reset Handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + + ; Define strong function for startup customization + BL Cy_OnResetUser + + ; Disable global interrupts + CPSID I + + ; Copy vectors from ROM to RAM + LDR r1, =__Vectors + LDR r0, =__ramVectors + LDR r2, =__Vectors_Size +Vectors_Copy + LDR r3, [r1] + STR r3, [r0] + ADDS r0, r0, #4 + ADDS r1, r1, #4 + SUBS r2, r2, #1 + CMP r2, #0 + BNE Vectors_Copy + + ; Update Vector Table Offset Register. */ + LDR r0, =__ramVectors + LDR r1, =0xE000ED08 + STR r0, [r1] + dsb 0xF + + LDR R0, =__main + BLX R0 + + ; Should never get here + B . + + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +Cy_SysLib_FaultHandler PROC + EXPORT Cy_SysLib_FaultHandler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + movs r0, #4 + mov r1, LR + tst r0, r1 + beq L_MSP + mrs r0, PSP + bl L_API_call +L_MSP + mrs r0, MSP +L_API_call + bl Cy_SysLib_FaultHandler + ENDP + +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + EXPORT Default_Handler [WEAK] + EXPORT NvicMux0_IRQHandler [WEAK] + EXPORT NvicMux1_IRQHandler [WEAK] + EXPORT NvicMux2_IRQHandler [WEAK] + EXPORT NvicMux3_IRQHandler [WEAK] + EXPORT NvicMux4_IRQHandler [WEAK] + EXPORT NvicMux5_IRQHandler [WEAK] + EXPORT NvicMux6_IRQHandler [WEAK] + EXPORT NvicMux7_IRQHandler [WEAK] + EXPORT NvicMux8_IRQHandler [WEAK] + EXPORT NvicMux9_IRQHandler [WEAK] + EXPORT NvicMux10_IRQHandler [WEAK] + EXPORT NvicMux11_IRQHandler [WEAK] + EXPORT NvicMux12_IRQHandler [WEAK] + EXPORT NvicMux13_IRQHandler [WEAK] + EXPORT NvicMux14_IRQHandler [WEAK] + EXPORT NvicMux15_IRQHandler [WEAK] + EXPORT NvicMux16_IRQHandler [WEAK] + EXPORT NvicMux17_IRQHandler [WEAK] + EXPORT NvicMux18_IRQHandler [WEAK] + EXPORT NvicMux19_IRQHandler [WEAK] + EXPORT NvicMux20_IRQHandler [WEAK] + EXPORT NvicMux21_IRQHandler [WEAK] + EXPORT NvicMux22_IRQHandler [WEAK] + EXPORT NvicMux23_IRQHandler [WEAK] + EXPORT NvicMux24_IRQHandler [WEAK] + EXPORT NvicMux25_IRQHandler [WEAK] + EXPORT NvicMux26_IRQHandler [WEAK] + EXPORT NvicMux27_IRQHandler [WEAK] + EXPORT NvicMux28_IRQHandler [WEAK] + EXPORT NvicMux29_IRQHandler [WEAK] + EXPORT NvicMux30_IRQHandler [WEAK] + EXPORT NvicMux31_IRQHandler [WEAK] + +NvicMux0_IRQHandler +NvicMux1_IRQHandler +NvicMux2_IRQHandler +NvicMux3_IRQHandler +NvicMux4_IRQHandler +NvicMux5_IRQHandler +NvicMux6_IRQHandler +NvicMux7_IRQHandler +NvicMux8_IRQHandler +NvicMux9_IRQHandler +NvicMux10_IRQHandler +NvicMux11_IRQHandler +NvicMux12_IRQHandler +NvicMux13_IRQHandler +NvicMux14_IRQHandler +NvicMux15_IRQHandler +NvicMux16_IRQHandler +NvicMux17_IRQHandler +NvicMux18_IRQHandler +NvicMux19_IRQHandler +NvicMux20_IRQHandler +NvicMux21_IRQHandler +NvicMux22_IRQHandler +NvicMux23_IRQHandler +NvicMux24_IRQHandler +NvicMux25_IRQHandler +NvicMux26_IRQHandler +NvicMux27_IRQHandler +NvicMux28_IRQHandler +NvicMux29_IRQHandler +NvicMux30_IRQHandler +NvicMux31_IRQHandler + + B . + ENDP + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, =Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, =(Heap_Mem + Heap_Size) + LDR R3, =Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + END + + +; [] END OF FILE diff --git a/2020TPCApp1.cydsn/mdk/startup_psoc6_01_cm4.s b/2020TPCApp1.cydsn/mdk/startup_psoc6_01_cm4.s new file mode 100644 index 0000000..c41752b --- /dev/null +++ b/2020TPCApp1.cydsn/mdk/startup_psoc6_01_cm4.s @@ -0,0 +1,696 @@ +;/**************************************************************************//** +; * @file startup_psoc6_01_cm4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device Series +; * @version V5.00 +; * @date 02. March 2016 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2016 ARM Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * Licensed under the Apache License, Version 2.0 (the License); you may +; * not use this file except in compliance with the License. +; * You may obtain a copy of the License at +; * +; * www.apache.org/licenses/LICENSE-2.0 +; * +; * 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. +; */ + +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + IF :DEF:__STACK_SIZE +Stack_Size EQU __STACK_SIZE + ELSE +Stack_Size EQU 0x00001000 + ENDIF + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + IF :DEF:__HEAP_SIZE +Heap_Size EQU __HEAP_SIZE + ELSE +Heap_Size EQU 0x00000400 + ENDIF + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + + DCD 0x0000000D ; NMI Handler located at ROM code + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External interrupts Power Mode Description + DCD ioss_interrupts_gpio_0_IRQHandler ; GPIO Port Interrupt #0 + DCD ioss_interrupts_gpio_1_IRQHandler ; GPIO Port Interrupt #1 + DCD ioss_interrupts_gpio_2_IRQHandler ; GPIO Port Interrupt #2 + DCD ioss_interrupts_gpio_3_IRQHandler ; GPIO Port Interrupt #3 + DCD ioss_interrupts_gpio_4_IRQHandler ; GPIO Port Interrupt #4 + DCD ioss_interrupts_gpio_5_IRQHandler ; GPIO Port Interrupt #5 + DCD ioss_interrupts_gpio_6_IRQHandler ; GPIO Port Interrupt #6 + DCD ioss_interrupts_gpio_7_IRQHandler ; GPIO Port Interrupt #7 + DCD ioss_interrupts_gpio_8_IRQHandler ; GPIO Port Interrupt #8 + DCD ioss_interrupts_gpio_9_IRQHandler ; GPIO Port Interrupt #9 + DCD ioss_interrupts_gpio_10_IRQHandler ; GPIO Port Interrupt #10 + DCD ioss_interrupts_gpio_11_IRQHandler ; GPIO Port Interrupt #11 + DCD ioss_interrupts_gpio_12_IRQHandler ; GPIO Port Interrupt #12 + DCD ioss_interrupts_gpio_13_IRQHandler ; GPIO Port Interrupt #13 + DCD ioss_interrupts_gpio_14_IRQHandler ; GPIO Port Interrupt #14 + DCD ioss_interrupt_gpio_IRQHandler ; GPIO All Ports + DCD ioss_interrupt_vdd_IRQHandler ; GPIO Supply Detect Interrupt + DCD lpcomp_interrupt_IRQHandler ; Low Power Comparator Interrupt + DCD scb_8_interrupt_IRQHandler ; Serial Communication Block #8 (DeepSleep capable) + DCD srss_interrupt_mcwdt_0_IRQHandler ; Multi Counter Watchdog Timer interrupt + DCD srss_interrupt_mcwdt_1_IRQHandler ; Multi Counter Watchdog Timer interrupt + DCD srss_interrupt_backup_IRQHandler ; Backup domain interrupt + DCD srss_interrupt_IRQHandler ; Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) + DCD pass_interrupt_ctbs_IRQHandler ; CTBm Interrupt (all CTBms) + DCD bless_interrupt_IRQHandler ; Bluetooth Radio interrupt + DCD cpuss_interrupts_ipc_0_IRQHandler ; CPUSS Inter Process Communication Interrupt #0 + DCD cpuss_interrupts_ipc_1_IRQHandler ; CPUSS Inter Process Communication Interrupt #1 + DCD cpuss_interrupts_ipc_2_IRQHandler ; CPUSS Inter Process Communication Interrupt #2 + DCD cpuss_interrupts_ipc_3_IRQHandler ; CPUSS Inter Process Communication Interrupt #3 + DCD cpuss_interrupts_ipc_4_IRQHandler ; CPUSS Inter Process Communication Interrupt #4 + DCD cpuss_interrupts_ipc_5_IRQHandler ; CPUSS Inter Process Communication Interrupt #5 + DCD cpuss_interrupts_ipc_6_IRQHandler ; CPUSS Inter Process Communication Interrupt #6 + DCD cpuss_interrupts_ipc_7_IRQHandler ; CPUSS Inter Process Communication Interrupt #7 + DCD cpuss_interrupts_ipc_8_IRQHandler ; CPUSS Inter Process Communication Interrupt #8 + DCD cpuss_interrupts_ipc_9_IRQHandler ; CPUSS Inter Process Communication Interrupt #9 + DCD cpuss_interrupts_ipc_10_IRQHandler ; CPUSS Inter Process Communication Interrupt #10 + DCD cpuss_interrupts_ipc_11_IRQHandler ; CPUSS Inter Process Communication Interrupt #11 + DCD cpuss_interrupts_ipc_12_IRQHandler ; CPUSS Inter Process Communication Interrupt #12 + DCD cpuss_interrupts_ipc_13_IRQHandler ; CPUSS Inter Process Communication Interrupt #13 + DCD cpuss_interrupts_ipc_14_IRQHandler ; CPUSS Inter Process Communication Interrupt #14 + DCD cpuss_interrupts_ipc_15_IRQHandler ; CPUSS Inter Process Communication Interrupt #15 + DCD scb_0_interrupt_IRQHandler ; Serial Communication Block #0 + DCD scb_1_interrupt_IRQHandler ; Serial Communication Block #1 + DCD scb_2_interrupt_IRQHandler ; Serial Communication Block #2 + DCD scb_3_interrupt_IRQHandler ; Serial Communication Block #3 + DCD scb_4_interrupt_IRQHandler ; Serial Communication Block #4 + DCD scb_5_interrupt_IRQHandler ; Serial Communication Block #5 + DCD scb_6_interrupt_IRQHandler ; Serial Communication Block #6 + DCD scb_7_interrupt_IRQHandler ; Serial Communication Block #7 + DCD csd_interrupt_IRQHandler ; CSD (Capsense) interrupt + DCD cpuss_interrupts_dw0_0_IRQHandler ; CPUSS DataWire #0, Channel #0 + DCD cpuss_interrupts_dw0_1_IRQHandler ; CPUSS DataWire #0, Channel #1 + DCD cpuss_interrupts_dw0_2_IRQHandler ; CPUSS DataWire #0, Channel #2 + DCD cpuss_interrupts_dw0_3_IRQHandler ; CPUSS DataWire #0, Channel #3 + DCD cpuss_interrupts_dw0_4_IRQHandler ; CPUSS DataWire #0, Channel #4 + DCD cpuss_interrupts_dw0_5_IRQHandler ; CPUSS DataWire #0, Channel #5 + DCD cpuss_interrupts_dw0_6_IRQHandler ; CPUSS DataWire #0, Channel #6 + DCD cpuss_interrupts_dw0_7_IRQHandler ; CPUSS DataWire #0, Channel #7 + DCD cpuss_interrupts_dw0_8_IRQHandler ; CPUSS DataWire #0, Channel #8 + DCD cpuss_interrupts_dw0_9_IRQHandler ; CPUSS DataWire #0, Channel #9 + DCD cpuss_interrupts_dw0_10_IRQHandler ; CPUSS DataWire #0, Channel #10 + DCD cpuss_interrupts_dw0_11_IRQHandler ; CPUSS DataWire #0, Channel #11 + DCD cpuss_interrupts_dw0_12_IRQHandler ; CPUSS DataWire #0, Channel #12 + DCD cpuss_interrupts_dw0_13_IRQHandler ; CPUSS DataWire #0, Channel #13 + DCD cpuss_interrupts_dw0_14_IRQHandler ; CPUSS DataWire #0, Channel #14 + DCD cpuss_interrupts_dw0_15_IRQHandler ; CPUSS DataWire #0, Channel #15 + DCD cpuss_interrupts_dw1_0_IRQHandler ; CPUSS DataWire #1, Channel #0 + DCD cpuss_interrupts_dw1_1_IRQHandler ; CPUSS DataWire #1, Channel #1 + DCD cpuss_interrupts_dw1_2_IRQHandler ; CPUSS DataWire #1, Channel #2 + DCD cpuss_interrupts_dw1_3_IRQHandler ; CPUSS DataWire #1, Channel #3 + DCD cpuss_interrupts_dw1_4_IRQHandler ; CPUSS DataWire #1, Channel #4 + DCD cpuss_interrupts_dw1_5_IRQHandler ; CPUSS DataWire #1, Channel #5 + DCD cpuss_interrupts_dw1_6_IRQHandler ; CPUSS DataWire #1, Channel #6 + DCD cpuss_interrupts_dw1_7_IRQHandler ; CPUSS DataWire #1, Channel #7 + DCD cpuss_interrupts_dw1_8_IRQHandler ; CPUSS DataWire #1, Channel #8 + DCD cpuss_interrupts_dw1_9_IRQHandler ; CPUSS DataWire #1, Channel #9 + DCD cpuss_interrupts_dw1_10_IRQHandler ; CPUSS DataWire #1, Channel #10 + DCD cpuss_interrupts_dw1_11_IRQHandler ; CPUSS DataWire #1, Channel #11 + DCD cpuss_interrupts_dw1_12_IRQHandler ; CPUSS DataWire #1, Channel #12 + DCD cpuss_interrupts_dw1_13_IRQHandler ; CPUSS DataWire #1, Channel #13 + DCD cpuss_interrupts_dw1_14_IRQHandler ; CPUSS DataWire #1, Channel #14 + DCD cpuss_interrupts_dw1_15_IRQHandler ; CPUSS DataWire #1, Channel #15 + DCD cpuss_interrupts_fault_0_IRQHandler ; CPUSS Fault Structure Interrupt #0 + DCD cpuss_interrupts_fault_1_IRQHandler ; CPUSS Fault Structure Interrupt #1 + DCD cpuss_interrupt_crypto_IRQHandler ; CRYPTO Accelerator Interrupt + DCD cpuss_interrupt_fm_IRQHandler ; FLASH Macro Interrupt + DCD cpuss_interrupts_cm0_cti_0_IRQHandler ; CM0+ CTI #0 + DCD cpuss_interrupts_cm0_cti_1_IRQHandler ; CM0+ CTI #1 + DCD cpuss_interrupts_cm4_cti_0_IRQHandler ; CM4 CTI #0 + DCD cpuss_interrupts_cm4_cti_1_IRQHandler ; CM4 CTI #1 + DCD tcpwm_0_interrupts_0_IRQHandler ; TCPWM #0, Counter #0 + DCD tcpwm_0_interrupts_1_IRQHandler ; TCPWM #0, Counter #1 + DCD tcpwm_0_interrupts_2_IRQHandler ; TCPWM #0, Counter #2 + DCD tcpwm_0_interrupts_3_IRQHandler ; TCPWM #0, Counter #3 + DCD tcpwm_0_interrupts_4_IRQHandler ; TCPWM #0, Counter #4 + DCD tcpwm_0_interrupts_5_IRQHandler ; TCPWM #0, Counter #5 + DCD tcpwm_0_interrupts_6_IRQHandler ; TCPWM #0, Counter #6 + DCD tcpwm_0_interrupts_7_IRQHandler ; TCPWM #0, Counter #7 + DCD tcpwm_1_interrupts_0_IRQHandler ; TCPWM #1, Counter #0 + DCD tcpwm_1_interrupts_1_IRQHandler ; TCPWM #1, Counter #1 + DCD tcpwm_1_interrupts_2_IRQHandler ; TCPWM #1, Counter #2 + DCD tcpwm_1_interrupts_3_IRQHandler ; TCPWM #1, Counter #3 + DCD tcpwm_1_interrupts_4_IRQHandler ; TCPWM #1, Counter #4 + DCD tcpwm_1_interrupts_5_IRQHandler ; TCPWM #1, Counter #5 + DCD tcpwm_1_interrupts_6_IRQHandler ; TCPWM #1, Counter #6 + DCD tcpwm_1_interrupts_7_IRQHandler ; TCPWM #1, Counter #7 + DCD tcpwm_1_interrupts_8_IRQHandler ; TCPWM #1, Counter #8 + DCD tcpwm_1_interrupts_9_IRQHandler ; TCPWM #1, Counter #9 + DCD tcpwm_1_interrupts_10_IRQHandler ; TCPWM #1, Counter #10 + DCD tcpwm_1_interrupts_11_IRQHandler ; TCPWM #1, Counter #11 + DCD tcpwm_1_interrupts_12_IRQHandler ; TCPWM #1, Counter #12 + DCD tcpwm_1_interrupts_13_IRQHandler ; TCPWM #1, Counter #13 + DCD tcpwm_1_interrupts_14_IRQHandler ; TCPWM #1, Counter #14 + DCD tcpwm_1_interrupts_15_IRQHandler ; TCPWM #1, Counter #15 + DCD tcpwm_1_interrupts_16_IRQHandler ; TCPWM #1, Counter #16 + DCD tcpwm_1_interrupts_17_IRQHandler ; TCPWM #1, Counter #17 + DCD tcpwm_1_interrupts_18_IRQHandler ; TCPWM #1, Counter #18 + DCD tcpwm_1_interrupts_19_IRQHandler ; TCPWM #1, Counter #19 + DCD tcpwm_1_interrupts_20_IRQHandler ; TCPWM #1, Counter #20 + DCD tcpwm_1_interrupts_21_IRQHandler ; TCPWM #1, Counter #21 + DCD tcpwm_1_interrupts_22_IRQHandler ; TCPWM #1, Counter #22 + DCD tcpwm_1_interrupts_23_IRQHandler ; TCPWM #1, Counter #23 + DCD udb_interrupts_0_IRQHandler ; UDB Interrupt #0 + DCD udb_interrupts_1_IRQHandler ; UDB Interrupt #1 + DCD udb_interrupts_2_IRQHandler ; UDB Interrupt #2 + DCD udb_interrupts_3_IRQHandler ; UDB Interrupt #3 + DCD udb_interrupts_4_IRQHandler ; UDB Interrupt #4 + DCD udb_interrupts_5_IRQHandler ; UDB Interrupt #5 + DCD udb_interrupts_6_IRQHandler ; UDB Interrupt #6 + DCD udb_interrupts_7_IRQHandler ; UDB Interrupt #7 + DCD udb_interrupts_8_IRQHandler ; UDB Interrupt #8 + DCD udb_interrupts_9_IRQHandler ; UDB Interrupt #9 + DCD udb_interrupts_10_IRQHandler ; UDB Interrupt #10 + DCD udb_interrupts_11_IRQHandler ; UDB Interrupt #11 + DCD udb_interrupts_12_IRQHandler ; UDB Interrupt #12 + DCD udb_interrupts_13_IRQHandler ; UDB Interrupt #13 + DCD udb_interrupts_14_IRQHandler ; UDB Interrupt #14 + DCD udb_interrupts_15_IRQHandler ; UDB Interrupt #15 + DCD pass_interrupt_sar_IRQHandler ; SAR ADC interrupt + DCD audioss_interrupt_i2s_IRQHandler ; I2S Audio interrupt + DCD audioss_interrupt_pdm_IRQHandler ; PDM/PCM Audio interrupt + DCD profile_interrupt_IRQHandler ; Energy Profiler interrupt + DCD smif_interrupt_IRQHandler ; Serial Memory Interface interrupt + DCD usb_interrupt_hi_IRQHandler ; USB Interrupt + DCD usb_interrupt_med_IRQHandler ; USB Interrupt + DCD usb_interrupt_lo_IRQHandler ; USB Interrupt + DCD pass_interrupt_dacs_IRQHandler ; Consolidated interrrupt for all DACs + +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + EXPORT __ramVectors + AREA RESET_RAM, READWRITE, NOINIT +__ramVectors SPACE __Vectors_Size + + + AREA |.text|, CODE, READONLY + + +; Weak function for startup customization +; +; Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) +; because this function is executed as the first instruction in the ResetHandler. +; The PDL is also not initialized to use the proper register offsets. +; The user of this function is responsible for initializing the PDL and resources before using them. +; +Cy_OnResetUser PROC + EXPORT Cy_OnResetUser [WEAK] + BX LR + ENDP + + +; Reset Handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT Cy_SystemInitFpuEnable + IMPORT __main + + ; Define strong function for startup customization + BL Cy_OnResetUser + + ; Disable global interrupts + CPSID I + + ; Copy vectors from ROM to RAM + LDR r1, =__Vectors + LDR r0, =__ramVectors + LDR r2, =__Vectors_Size +Vectors_Copy + LDR r3, [r1] + STR r3, [r0] + ADDS r0, r0, #4 + ADDS r1, r1, #4 + SUBS r2, r2, #1 + CMP r2, #0 + BNE Vectors_Copy + + ; Update Vector Table Offset Register. */ + LDR r0, =__ramVectors + LDR r1, =0xE000ED08 + STR r0, [r1] + dsb 0xF + + ; Enable the FPU if used + LDR R0, =Cy_SystemInitFpuEnable + BLX R0 + + LDR R0, =__main + BLX R0 + + ; Should never get here + B . + + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +Cy_SysLib_FaultHandler PROC + EXPORT Cy_SysLib_FaultHandler [WEAK] + B . + ENDP +HardFault_Wrapper\ + PROC + EXPORT HardFault_Wrapper [WEAK] + movs r0, #4 + mov r1, LR + tst r0, r1 + beq L_MSP + mrs r0, PSP + bl L_API_call +L_MSP + mrs r0, MSP +L_API_call + bl Cy_SysLib_FaultHandler + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B HardFault_Wrapper + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B HardFault_Wrapper + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B HardFault_Wrapper + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B HardFault_Wrapper + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + EXPORT Default_Handler [WEAK] + EXPORT ioss_interrupts_gpio_0_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_1_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_2_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_3_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_4_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_5_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_6_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_7_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_8_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_9_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_10_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_11_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_12_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_13_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_14_IRQHandler [WEAK] + EXPORT ioss_interrupt_gpio_IRQHandler [WEAK] + EXPORT ioss_interrupt_vdd_IRQHandler [WEAK] + EXPORT lpcomp_interrupt_IRQHandler [WEAK] + EXPORT scb_8_interrupt_IRQHandler [WEAK] + EXPORT srss_interrupt_mcwdt_0_IRQHandler [WEAK] + EXPORT srss_interrupt_mcwdt_1_IRQHandler [WEAK] + EXPORT srss_interrupt_backup_IRQHandler [WEAK] + EXPORT srss_interrupt_IRQHandler [WEAK] + EXPORT pass_interrupt_ctbs_IRQHandler [WEAK] + EXPORT bless_interrupt_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_0_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_1_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_2_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_3_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_4_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_5_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_6_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_7_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_8_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_9_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_10_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_11_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_12_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_13_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_14_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_15_IRQHandler [WEAK] + EXPORT scb_0_interrupt_IRQHandler [WEAK] + EXPORT scb_1_interrupt_IRQHandler [WEAK] + EXPORT scb_2_interrupt_IRQHandler [WEAK] + EXPORT scb_3_interrupt_IRQHandler [WEAK] + EXPORT scb_4_interrupt_IRQHandler [WEAK] + EXPORT scb_5_interrupt_IRQHandler [WEAK] + EXPORT scb_6_interrupt_IRQHandler [WEAK] + EXPORT scb_7_interrupt_IRQHandler [WEAK] + EXPORT csd_interrupt_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_0_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_1_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_2_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_3_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_4_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_5_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_6_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_7_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_8_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_9_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_10_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_11_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_12_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_13_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_14_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_15_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_0_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_1_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_2_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_3_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_4_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_5_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_6_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_7_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_8_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_9_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_10_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_11_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_12_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_13_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_14_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_15_IRQHandler [WEAK] + EXPORT cpuss_interrupts_fault_0_IRQHandler [WEAK] + EXPORT cpuss_interrupts_fault_1_IRQHandler [WEAK] + EXPORT cpuss_interrupt_crypto_IRQHandler [WEAK] + EXPORT cpuss_interrupt_fm_IRQHandler [WEAK] + EXPORT cpuss_interrupts_cm0_cti_0_IRQHandler [WEAK] + EXPORT cpuss_interrupts_cm0_cti_1_IRQHandler [WEAK] + EXPORT cpuss_interrupts_cm4_cti_0_IRQHandler [WEAK] + EXPORT cpuss_interrupts_cm4_cti_1_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_0_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_1_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_2_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_3_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_4_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_5_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_6_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_7_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_0_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_1_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_2_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_3_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_4_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_5_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_6_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_7_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_8_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_9_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_10_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_11_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_12_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_13_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_14_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_15_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_16_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_17_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_18_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_19_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_20_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_21_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_22_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_23_IRQHandler [WEAK] + EXPORT udb_interrupts_0_IRQHandler [WEAK] + EXPORT udb_interrupts_1_IRQHandler [WEAK] + EXPORT udb_interrupts_2_IRQHandler [WEAK] + EXPORT udb_interrupts_3_IRQHandler [WEAK] + EXPORT udb_interrupts_4_IRQHandler [WEAK] + EXPORT udb_interrupts_5_IRQHandler [WEAK] + EXPORT udb_interrupts_6_IRQHandler [WEAK] + EXPORT udb_interrupts_7_IRQHandler [WEAK] + EXPORT udb_interrupts_8_IRQHandler [WEAK] + EXPORT udb_interrupts_9_IRQHandler [WEAK] + EXPORT udb_interrupts_10_IRQHandler [WEAK] + EXPORT udb_interrupts_11_IRQHandler [WEAK] + EXPORT udb_interrupts_12_IRQHandler [WEAK] + EXPORT udb_interrupts_13_IRQHandler [WEAK] + EXPORT udb_interrupts_14_IRQHandler [WEAK] + EXPORT udb_interrupts_15_IRQHandler [WEAK] + EXPORT pass_interrupt_sar_IRQHandler [WEAK] + EXPORT audioss_interrupt_i2s_IRQHandler [WEAK] + EXPORT audioss_interrupt_pdm_IRQHandler [WEAK] + EXPORT profile_interrupt_IRQHandler [WEAK] + EXPORT smif_interrupt_IRQHandler [WEAK] + EXPORT usb_interrupt_hi_IRQHandler [WEAK] + EXPORT usb_interrupt_med_IRQHandler [WEAK] + EXPORT usb_interrupt_lo_IRQHandler [WEAK] + EXPORT pass_interrupt_dacs_IRQHandler [WEAK] + +ioss_interrupts_gpio_0_IRQHandler +ioss_interrupts_gpio_1_IRQHandler +ioss_interrupts_gpio_2_IRQHandler +ioss_interrupts_gpio_3_IRQHandler +ioss_interrupts_gpio_4_IRQHandler +ioss_interrupts_gpio_5_IRQHandler +ioss_interrupts_gpio_6_IRQHandler +ioss_interrupts_gpio_7_IRQHandler +ioss_interrupts_gpio_8_IRQHandler +ioss_interrupts_gpio_9_IRQHandler +ioss_interrupts_gpio_10_IRQHandler +ioss_interrupts_gpio_11_IRQHandler +ioss_interrupts_gpio_12_IRQHandler +ioss_interrupts_gpio_13_IRQHandler +ioss_interrupts_gpio_14_IRQHandler +ioss_interrupt_gpio_IRQHandler +ioss_interrupt_vdd_IRQHandler +lpcomp_interrupt_IRQHandler +scb_8_interrupt_IRQHandler +srss_interrupt_mcwdt_0_IRQHandler +srss_interrupt_mcwdt_1_IRQHandler +srss_interrupt_backup_IRQHandler +srss_interrupt_IRQHandler +pass_interrupt_ctbs_IRQHandler +bless_interrupt_IRQHandler +cpuss_interrupts_ipc_0_IRQHandler +cpuss_interrupts_ipc_1_IRQHandler +cpuss_interrupts_ipc_2_IRQHandler +cpuss_interrupts_ipc_3_IRQHandler +cpuss_interrupts_ipc_4_IRQHandler +cpuss_interrupts_ipc_5_IRQHandler +cpuss_interrupts_ipc_6_IRQHandler +cpuss_interrupts_ipc_7_IRQHandler +cpuss_interrupts_ipc_8_IRQHandler +cpuss_interrupts_ipc_9_IRQHandler +cpuss_interrupts_ipc_10_IRQHandler +cpuss_interrupts_ipc_11_IRQHandler +cpuss_interrupts_ipc_12_IRQHandler +cpuss_interrupts_ipc_13_IRQHandler +cpuss_interrupts_ipc_14_IRQHandler +cpuss_interrupts_ipc_15_IRQHandler +scb_0_interrupt_IRQHandler +scb_1_interrupt_IRQHandler +scb_2_interrupt_IRQHandler +scb_3_interrupt_IRQHandler +scb_4_interrupt_IRQHandler +scb_5_interrupt_IRQHandler +scb_6_interrupt_IRQHandler +scb_7_interrupt_IRQHandler +csd_interrupt_IRQHandler +cpuss_interrupts_dw0_0_IRQHandler +cpuss_interrupts_dw0_1_IRQHandler +cpuss_interrupts_dw0_2_IRQHandler +cpuss_interrupts_dw0_3_IRQHandler +cpuss_interrupts_dw0_4_IRQHandler +cpuss_interrupts_dw0_5_IRQHandler +cpuss_interrupts_dw0_6_IRQHandler +cpuss_interrupts_dw0_7_IRQHandler +cpuss_interrupts_dw0_8_IRQHandler +cpuss_interrupts_dw0_9_IRQHandler +cpuss_interrupts_dw0_10_IRQHandler +cpuss_interrupts_dw0_11_IRQHandler +cpuss_interrupts_dw0_12_IRQHandler +cpuss_interrupts_dw0_13_IRQHandler +cpuss_interrupts_dw0_14_IRQHandler +cpuss_interrupts_dw0_15_IRQHandler +cpuss_interrupts_dw1_0_IRQHandler +cpuss_interrupts_dw1_1_IRQHandler +cpuss_interrupts_dw1_2_IRQHandler +cpuss_interrupts_dw1_3_IRQHandler +cpuss_interrupts_dw1_4_IRQHandler +cpuss_interrupts_dw1_5_IRQHandler +cpuss_interrupts_dw1_6_IRQHandler +cpuss_interrupts_dw1_7_IRQHandler +cpuss_interrupts_dw1_8_IRQHandler +cpuss_interrupts_dw1_9_IRQHandler +cpuss_interrupts_dw1_10_IRQHandler +cpuss_interrupts_dw1_11_IRQHandler +cpuss_interrupts_dw1_12_IRQHandler +cpuss_interrupts_dw1_13_IRQHandler +cpuss_interrupts_dw1_14_IRQHandler +cpuss_interrupts_dw1_15_IRQHandler +cpuss_interrupts_fault_0_IRQHandler +cpuss_interrupts_fault_1_IRQHandler +cpuss_interrupt_crypto_IRQHandler +cpuss_interrupt_fm_IRQHandler +cpuss_interrupts_cm0_cti_0_IRQHandler +cpuss_interrupts_cm0_cti_1_IRQHandler +cpuss_interrupts_cm4_cti_0_IRQHandler +cpuss_interrupts_cm4_cti_1_IRQHandler +tcpwm_0_interrupts_0_IRQHandler +tcpwm_0_interrupts_1_IRQHandler +tcpwm_0_interrupts_2_IRQHandler +tcpwm_0_interrupts_3_IRQHandler +tcpwm_0_interrupts_4_IRQHandler +tcpwm_0_interrupts_5_IRQHandler +tcpwm_0_interrupts_6_IRQHandler +tcpwm_0_interrupts_7_IRQHandler +tcpwm_1_interrupts_0_IRQHandler +tcpwm_1_interrupts_1_IRQHandler +tcpwm_1_interrupts_2_IRQHandler +tcpwm_1_interrupts_3_IRQHandler +tcpwm_1_interrupts_4_IRQHandler +tcpwm_1_interrupts_5_IRQHandler +tcpwm_1_interrupts_6_IRQHandler +tcpwm_1_interrupts_7_IRQHandler +tcpwm_1_interrupts_8_IRQHandler +tcpwm_1_interrupts_9_IRQHandler +tcpwm_1_interrupts_10_IRQHandler +tcpwm_1_interrupts_11_IRQHandler +tcpwm_1_interrupts_12_IRQHandler +tcpwm_1_interrupts_13_IRQHandler +tcpwm_1_interrupts_14_IRQHandler +tcpwm_1_interrupts_15_IRQHandler +tcpwm_1_interrupts_16_IRQHandler +tcpwm_1_interrupts_17_IRQHandler +tcpwm_1_interrupts_18_IRQHandler +tcpwm_1_interrupts_19_IRQHandler +tcpwm_1_interrupts_20_IRQHandler +tcpwm_1_interrupts_21_IRQHandler +tcpwm_1_interrupts_22_IRQHandler +tcpwm_1_interrupts_23_IRQHandler +udb_interrupts_0_IRQHandler +udb_interrupts_1_IRQHandler +udb_interrupts_2_IRQHandler +udb_interrupts_3_IRQHandler +udb_interrupts_4_IRQHandler +udb_interrupts_5_IRQHandler +udb_interrupts_6_IRQHandler +udb_interrupts_7_IRQHandler +udb_interrupts_8_IRQHandler +udb_interrupts_9_IRQHandler +udb_interrupts_10_IRQHandler +udb_interrupts_11_IRQHandler +udb_interrupts_12_IRQHandler +udb_interrupts_13_IRQHandler +udb_interrupts_14_IRQHandler +udb_interrupts_15_IRQHandler +pass_interrupt_sar_IRQHandler +audioss_interrupt_i2s_IRQHandler +audioss_interrupt_pdm_IRQHandler +profile_interrupt_IRQHandler +smif_interrupt_IRQHandler +usb_interrupt_hi_IRQHandler +usb_interrupt_med_IRQHandler +usb_interrupt_lo_IRQHandler +pass_interrupt_dacs_IRQHandler + + B . + ENDP + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + END + + +; [] END OF FILE diff --git a/2020TPCApp1.cydsn/post_build_core1.bat b/2020TPCApp1.cydsn/post_build_core1.bat new file mode 100644 index 0000000..569f28d --- /dev/null +++ b/2020TPCApp1.cydsn/post_build_core1.bat @@ -0,0 +1,44 @@ +@rem Usage: +@rem Call post_build_core1.bat +@rem E.g. in PSoC Creator 4.2: +@rem post_build_core1.bat creator ${OutputDir} ${ProjectShortName} + +@echo ------------------------------------------ +@echo Post-build commands for Cortex-M4 core +@echo ------------------------------------------ + +@rem Set proper path to your PDL 3.x and above installation +@set PDL_PATH="C:\Program Files (x86)\Cypress\PDL\3.1.7" + +@set CY_MCU_ELF_TOOL=%PDL_PATH%"\tools\win\elf\cymcuelftool.exe" + +@set IDE=%1 + +@if "%IDE%" == "creator" ( + @set OUTPUT_DIR=%2 + @set PRJ_NAME=%3 + @set ELF_EXT=.elf +) + +@if "%IDE%" == "uvision" ( + @set OUTPUT_DIR=%2 + @set PRJ_NAME=%3 + @set ELF_EXT=.axf +) + +@if "%IDE%" == "iar" ( + @set OUTPUT_DIR=%2 + @set PRJ_NAME=%3 + @set ELF_EXT=.out +) + +@if "%IDE%" == "eclipse" ( + @set OUTPUT_DIR=%2 + @set PRJ_NAME=%3 + @set ELF_EXT=.out +) + +@rem Sign the application with the RSA private key +%CY_MCU_ELF_TOOL% -S %OUTPUT_DIR%\%PRJ_NAME%%ELF_EXT% SHA256 --encrypt RSASSA-PKCS --key ..\Keys\rsa_private.txt --output %OUTPUT_DIR%\%PRJ_NAME%_RSA%ELF_EXT% --hex %OUTPUT_DIR%\%PRJ_NAME%.hex + +%CY_MCU_ELF_TOOL% -P %OUTPUT_DIR%\%PRJ_NAME%_RSA%ELF_EXT% --output %OUTPUT_DIR%\%PRJ_NAME%.cyacd2 \ No newline at end of file diff --git a/2020TPCApp1.cydsn/scps.c b/2020TPCApp1.cydsn/scps.c new file mode 100644 index 0000000..0ee35f2 --- /dev/null +++ b/2020TPCApp1.cydsn/scps.c @@ -0,0 +1,141 @@ +/******************************************************************************* +* File Name: scps.c +* +* Version: 1.0 +* +* Description: +* This file contains the code for the SCPS. +* +* Hardware Dependency: +* CY8CKIT-062 PSoC6 BLE Pioneer Kit +* +******************************************************************************** +* Copyright 2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "common.h" +#include "scps.h" + +/* Static global variables */ +static uint16_t scanInterval = 0u; +static uint16_t scanWindow = 0u; +static bool requestScanRefresh = true; + +/******************************************************************************* +* Function Name: ScpsInit() +******************************************************************************** +* +* Summary: +* Initializes the SCPS Service. +* +*******************************************************************************/ +void ScpsInit(void) +{ + /* Register service specific callback function */ + Cy_BLE_SCPS_RegisterAttrCallback(ScpsCallBack); + + requestScanRefresh = true; +} + + +/******************************************************************************* +* Function Name: ScpsCallBack() +******************************************************************************** +* +* Summary: +* This is an event callback function to receive service specific events from +* SCPS Service. +* +* Parameters: +* event - the event code +* eventParam - the event parameters +* +********************************************************************************/ +void ScpsCallBack (uint32_t event, void *eventParam) +{ + DBG_PRINTF("SCPS event: %lx, ", event); + switch(event) + { + case CY_BLE_EVT_SCPSS_NOTIFICATION_ENABLED: + DBG_PRINTF("CY_BLE_EVT_SCPSS_NOTIFICATION_ENABLED %x %x \r\n", + ((cy_stc_ble_scps_char_value_t *)eventParam)->connHandle.attId, + ((cy_stc_ble_scps_char_value_t *)eventParam)->connHandle.bdHandle); + break; + + case CY_BLE_EVT_SCPSS_NOTIFICATION_DISABLED: + DBG_PRINTF("CY_BLE_EVT_SCPSS_NOTIFICATION_DISABLED %x %x \r\n", + ((cy_stc_ble_scps_char_value_t *)eventParam)->connHandle.attId, + ((cy_stc_ble_scps_char_value_t *)eventParam)->connHandle.bdHandle); + break; + + case CY_BLE_EVT_SCPSS_SCAN_INT_WIN_WRITE_CHAR: + scanInterval = Cy_BLE_Get16ByPtr(((cy_stc_ble_scps_char_value_t *)eventParam)->value->val); + scanWindow = Cy_BLE_Get16ByPtr(((cy_stc_ble_scps_char_value_t *)eventParam)->value->val + + sizeof(scanInterval)); + DBG_PRINTF("CY_BLE_EVT_SCPSS_SCAN_INT_WIN_WRITE_CHAR scanInterval: %x, scanWindow: %x \r\n", + scanInterval, scanWindow); + break; + + case CY_BLE_EVT_SCPSC_NOTIFICATION: + break; + + case CY_BLE_EVT_SCPSC_READ_DESCR_RESPONSE: + break; + + case CY_BLE_EVT_SCPSC_WRITE_DESCR_RESPONSE: + break; + + default: + DBG_PRINTF("Not supported event\r\n"); + break; + } +} + + +/******************************************************************************* +* Function Name: ScpsSendReqUpdateConnParam() +******************************************************************************** +* +* Summary: +* Send notification to request update connection parameters +* +* Parameters: +* connHandle: The connection handle +* +********************************************************************************/ +void ScpsSendReqUpdateConnParam(cy_stc_ble_conn_handle_t connHandle) +{ + cy_en_ble_api_result_t apiResult; + uint8_t refresh = CY_BLE_SCAN_REFRESH_ENABLED; + uint16 cccd = CY_BLE_CCCD_DEFAULT; + + if(requestScanRefresh == true) + { + apiResult = Cy_BLE_SCPSS_GetCharacteristicDescriptor(connHandle, CY_BLE_SCPS_SCAN_REFRESH, + CY_BLE_SCPS_SCAN_REFRESH_CCCD, CY_BLE_CCCD_LEN, + (uint8_t *)&cccd); + + if((apiResult == CY_BLE_SUCCESS) && (cccd == CY_BLE_CCCD_NOTIFICATION)) + { + /* Send notification to request update connection parameters */ + apiResult = Cy_BLE_SCPSS_SendNotification(connHandle, CY_BLE_SCPS_SCAN_REFRESH, sizeof(refresh), &refresh); + if(apiResult != CY_BLE_SUCCESS) + { + DBG_PRINTF("Cy_BLE_SCPSS_SendNotification API Error: 0x%x \r\n", apiResult); + } + else + { + requestScanRefresh = false; + } + } + + /* Cy_BLE_ProcessEvents() allows BLE stack to process pending events */ + Cy_BLE_ProcessEvents(); + } +} + + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/scps.h b/2020TPCApp1.cydsn/scps.h new file mode 100644 index 0000000..b565dcd --- /dev/null +++ b/2020TPCApp1.cydsn/scps.h @@ -0,0 +1,26 @@ +/******************************************************************************* +* File Name: scps.h +* +* Version 1.0 +* +* Description: +* Contains the function prototypes and constants available for SCPS +* +******************************************************************************** +* Copyright 2017, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include + + +/*************************************** +* Function Prototypes +***************************************/ +void ScpsInit(void); +void ScpsCallBack (uint32_t event, void *eventParam); +void ScpsSendReqUpdateConnParam(cy_stc_ble_conn_handle_t connHandle); + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/stdio_user.c b/2020TPCApp1.cydsn/stdio_user.c new file mode 100644 index 0000000..077d110 --- /dev/null +++ b/2020TPCApp1.cydsn/stdio_user.c @@ -0,0 +1,65 @@ +/***************************************************************************//** +* \file stdio_user.c +* \version 1.20 +* +* \brief +* This file provides low level function implementation to retarget +* I/O functions of the standard C run-time library. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "stdio_user.h" + +#if defined (IO_STDOUT_ENABLE) && defined (IO_STDOUT_UART) +/******************************************************************************* +* Function Name: STDIO_PutChar +******************************************************************************** +* +* This function outputs a character through user defined target. +* Note: this is a template function which may be overwritten by the USER in order +* to change the target used in redirecting STDOUT stream. +* +* \param ch +* The character to send. +* +*******************************************************************************/ +void STDIO_PutChar(uint32_t ch) +{ + /* Place the call to your function here. */ + while(0U == Cy_SCB_UART_Put(IO_STDOUT_UART, ch)) + { + /* Wait until FIFO is full */ + } +} +#endif /* IO_STDOUT_ENABLE && IO_STDOUT_UART */ + +#if defined (IO_STDIN_ENABLE) && defined (IO_STDIN_UART) +/******************************************************************************* +* Function Name: STDIO_GetChar +******************************************************************************** +* +* This function retrieves STDIN from a user specified input source. +* Note: this is a template function which may be overwritten by the USER in order +* to change the target used in redirecting STDIN stream. +* +* \return +* The received character. +* +*******************************************************************************/ +uint32_t STDIO_GetChar(void) +{ + /* Place the call to your function here. */ + while(0UL == Cy_SCB_UART_GetNumInRxFifo(IO_STDIN_UART)) + { + } + return (Cy_SCB_UART_Get(IO_STDIN_UART)); +} +#endif /* IO_STDIN_ENABLE && IO_STDIN_UART */ + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/stdio_user.h b/2020TPCApp1.cydsn/stdio_user.h new file mode 100644 index 0000000..a4c3bc1 --- /dev/null +++ b/2020TPCApp1.cydsn/stdio_user.h @@ -0,0 +1,200 @@ +/***************************************************************************//** +* \file stdio_user.h +* \version 1.20 +* +* \brief +* This file provides configuration macros and function prototypes to retarget +* I/O functions of the standard C run-time library. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef STDIO_USER_H +#define STDIO_USER_H +/** +* \addtogroup group_retarget_io +* \{ +* Retarget the I/O functions of the standard C run-time library to the user-defined target. +* +* Application code frequently uses standard I/O library functions, such as +* scanf()/printf() to perform input/output operations. This utility allows you to retarget +* standard C run-time library I/O functions to the user-defined target. +* +*

Design

+* The file retarget.c defines functions that replace weakly linked I/O functions +* in the standard library (i.e. _write() and _read()). The functions in +* retarget.c in turn call the STDIO_PutChar() and STDIO_GetChar() +* implemented in stdio_user.c. +* +*

Use

+* The files for this utility are in this folder: +* \/utilities/retarget_io +* +* The first thing you need to do is add the source files to your project. +* +* For a 3rd Party IDE, add the retarget_io folder to your list of include +* paths and add the files retarget.c and stdio_user.c to your project. +* +* For PSoC Creator, create a PSoC Creator project. Then click +* Project > Build Setting > Peripheral Driver Library. To +* add Retarget I/O source files to your project, enable it as shown on the +* screenshot below. After selecting Retarget I/O in the PDL software package +* list, click OK and build the project. The Retarget I/O source files are +* added to your project and are available for modification. +* ![Figure 1. Build Settings dialog in PSoC Creator](retarget_io_build_settings.png) +* +* For ModusToolbox, create or open existing ModusToolbox project. Open +* Middleware Selector (Project > ModusToolbox Middleware Selector), +* select Retarget I/O item, and click OK (see the screenshot below). +* The Retarget I/O source files are added to your project and are available for +* modification. +* ![Figure 2. Middleware Selector dialog in ModusToolbox](retarget_io_middleware_selector.png) +* +* There are multiple serial communication blocks (SCB) available. By default +* the Retarget I/O files use SCB0. The stdio_user.h file defines these macros: +* \code #define IO_STDOUT_UART SCB0 +* #define IO_STDIN_UART SCB0 \endcode +* +* Modify these macros to use the SCB in your design. Standard library I/O +* calls are then retargeted to that SCB. +* +* If you use PSoC Creator, the code generator creates a symbol UART_HW +* to represent the SCB block used in your design. In this case you can +* include "project.h" to access that symbol, and modify the macros like this: +* \code #define IO_STDOUT_UART UART_HW +* #define IO_STDIN_UART UART_HW \endcode +* +* The functions implemented in retarget.c are weakly linked. If you wish +* to modify those functions, you can write your own implementation, and +* not use stdio_user.c at all. +* +* \note The standard library is not standard in how it treats an I/O stream. +* Some implement a data buffer by default. The buffer is not flushed until +* it is full. In that case it may appear that your I/O is not working. You +* should be aware of how the library buffers data, and you should identify +* a buffering strategy and buffer size for a specified stream. If you +* supply a buffer, it must exist until the stream is closed. The following +* line of code disables the buffer for the standard library that +* accompanies the GCC compiler: +* \code setvbuf( stdin, NULL, _IONBF, 0 ); \endcode +* +* +*

MISRA-C Compliance

+* The Retarget IO utility has the following specific deviations: +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
5.6ANo identifier in one name space should have the same spelling +* as an identifier in another name space, with the exception of +* structure member and union member names.Violated since the utility redefines the function declared in standard +* library.
6.3Atypedefs that indicate size and signedness should be used in +* place of the basic numerical type.Basic numerical types are used to match the definition of the +* function with the prototype defined in the standard library.
8.8RAn external object or function shall be declared in one and only one file.The _write is declared in the standard i/o library with +* weak attribute and is redefined in the utility.
14.2RAll non-null statements shall either:
(a) have at least one +* side-effect however executed, or
(b) cause control flow to change.
The unused function parameters are cast to void. This statement +* has no side-effect and is used to suppress a compiler warning.
20.9RThe input/output library shall not be used in +* production code.stdio.h file is included to connect the standard function +* definition with their declaration in the standard library.
+* +*

Changelog

+* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.20Changed include path for cy_scb_uart.h to reflect the PDL source code structure
1.10Added STDIN support
1.0Initial version
+* \} +*/ +#include +#include "cy_device_headers.h" + +/* Must remain uncommented to use this utility */ +#define IO_STDOUT_ENABLE +#define IO_STDIN_ENABLE +#define IO_STDOUT_UART UART_Console_HW +#define IO_STDIN_UART UART_Console_HW + +#if defined(IO_STDOUT_ENABLE) || defined(IO_STDIN_ENABLE) +#if defined(IO_STDOUT_UART) || defined(IO_STDIN_UART) +#include "cy_scb_uart.h" +#endif /* IO_STDOUT_UART || IO_STDIN_UART */ +#endif /* IO_STDOUT_ENABLE || IO_STDIN_ENABLE */ + +/* Controls whether CR is added for LF */ +#ifndef STDOUT_CR_LF +#define STDOUT_CR_LF 0 +#endif /* STDOUT_CR_LF */ + +#if defined(__cplusplus) +extern "C" { +#endif + +#if defined (IO_STDOUT_ENABLE) && defined (IO_STDOUT_UART) +void STDIO_PutChar(uint32_t ch); +#endif /* IO_STDOUT_ENABLE && IO_STDOUT_UART */ + +#if defined (IO_STDIN_ENABLE) && defined (IO_STDIN_UART) +uint32_t STDIO_GetChar(void); +#endif /* IO_STDIN_ENABLE && IO_STDIN_UART */ + +#if defined(__cplusplus) +} +#endif + +#endif /* STDIO_USER_H */ + + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/system_psoc6.h b/2020TPCApp1.cydsn/system_psoc6.h new file mode 100644 index 0000000..73d1263 --- /dev/null +++ b/2020TPCApp1.cydsn/system_psoc6.h @@ -0,0 +1,648 @@ +/***************************************************************************//** +* \file system_psoc6.h +* \version 2.20 +* +* \brief Device system header file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + + +#ifndef _SYSTEM_PSOC6_H_ +#define _SYSTEM_PSOC6_H_ + +/** +* \addtogroup group_system_config +* \{ +* Provides device startup, system configuration, and linker script files. +* The system startup provides the followings features: +* - See \ref group_system_config_device_initialization for the: +* * \ref group_system_config_dual_core_device_initialization +* * \ref group_system_config_single_core_device_initialization +* - \ref group_system_config_device_memory_definition +* - \ref group_system_config_heap_stack_config +* - \ref group_system_config_merge_apps +* - \ref group_system_config_default_handlers +* - \ref group_system_config_device_vector_table +* - \ref group_system_config_cm4_functions +* +* \section group_system_config_configuration Configuration Considerations +* +* \subsection group_system_config_device_memory_definition Device Memory Definition +* The flash and RAM allocation for each CPU is defined by the linker scripts. +* For dual-core devices, the physical flash and RAM memory is shared between the CPU cores. +* 2 KB of RAM (allocated at the end of RAM) are reserved for system use. +* For Single-Core devices the system reserves additional 80 bytes of RAM. +* Using the reserved memory area for other purposes will lead to unexpected behavior. +* +* \note The linker files provided with the PDL are generic and handle all common +* use cases. Your project may not use every section defined in the linker files. +* In that case you may see warnings during the build process. To eliminate build +* warnings in your project, you can simply comment out or remove the relevant +* code in the linker file. +* +* ARM GCC\n +* The flash and RAM sections for the CPU are defined in the linker files: +* 'xx_yy.ld', where 'xx' is the device group, and 'yy' is the target CPU; for example, +* 'cy8c6xx7_cm0plus.ld' and 'cy8c6xx7_cm4_dual.ld'. +* \note If the start of the Cortex-M4 application image is changed, the value +* of the of the \ref CY_CORTEX_M4_APPL_ADDR should also be changed. The +* \ref CY_CORTEX_M4_APPL_ADDR macro should be used as the parameter for the +* Cy_SysEnableCM4() function call. +* +* Change the flash and RAM sizes by editing the macros value in the +* linker files for both CPUs: +* - 'xx_cm0plus.ld', where 'xx' is the device group: +* \code +* flash (rx) : ORIGIN = 0x10000000, LENGTH = 0x00080000 +* ram (rwx) : ORIGIN = 0x08000000, LENGTH = 0x00024000 +* \endcode +* - 'xx_cm4_dual.ld', where 'xx' is the device group: +* \code +* flash (rx) : ORIGIN = 0x10080000, LENGTH = 0x00080000 +* ram (rwx) : ORIGIN = 0x08024000, LENGTH = 0x00023800 +* \endcode +* +* Change the value of the \ref CY_CORTEX_M4_APPL_ADDR macro to the rom ORIGIN's +* value in the 'xx_cm4_dual.ld' file, where 'xx' is the device group. Do this +* by either: +* - Passing the following commands to the compiler:\n +* \code -D CY_CORTEX_M4_APPL_ADDR=0x10080000 \endcode +* - Editing the \ref CY_CORTEX_M4_APPL_ADDR value in the 'system_xx.h', where 'xx' is device family:\n +* \code #define CY_CORTEX_M4_APPL_ADDR (0x10080000u) \endcode +* +* ARM MDK\n +* The flash and RAM sections for the CPU are defined in the linker files: +* 'xx_yy.scat', where 'xx' is the device group, and 'yy' is the target CPU; for example, +* 'cy8c6xx7_cm0plus.scat' and 'cy8c6xx7_cm4_dual.scat'. +* \note If the start of the Cortex-M4 application image is changed, the value +* of the of the \ref CY_CORTEX_M4_APPL_ADDR should also be changed. The +* \ref CY_CORTEX_M4_APPL_ADDR macro should be used as the parameter for the \ref +* Cy_SysEnableCM4() function call. +* +* \note The linker files provided with the PDL are generic and handle all common +* use cases. Your project may not use every section defined in the linker files. +* In that case you may see the warnings during the build process: +* L6314W (no section matches pattern) and/or L6329W +* (pattern only matches removed unused sections). In your project, you can +* suppress the warning by passing the "--diag_suppress=L6314W,L6329W" option to +* the linker. You can also comment out or remove the relevant code in the linker +* file. +* +* Change the flash and RAM sizes by editing the macros value in the +* linker files for both CPUs: +* - 'xx_cm0plus.scat', where 'xx' is the device group: +* \code +* #define FLASH_START 0x10000000 +* #define FLASH_SIZE 0x00080000 +* #define RAM_START 0x08000000 +* #define RAM_SIZE 0x00024000 +* \endcode +* - 'xx_cm4_dual.scat', where 'xx' is the device group: +* \code +* #define FLASH_START 0x10080000 +* #define FLASH_SIZE 0x00080000 +* #define RAM_START 0x08024000 +* #define RAM_SIZE 0x00023800 +* \endcode +* +* Change the value of the \ref CY_CORTEX_M4_APPL_ADDR macro to the FLASH_START +* value in the 'xx_cm4_dual.scat' file, +* where 'xx' is the device group. Do this by either: +* - Passing the following commands to the compiler:\n +* \code -D CY_CORTEX_M4_APPL_ADDR=0x10080000 \endcode +* - Editing the \ref CY_CORTEX_M4_APPL_ADDR value in the 'system_xx.h', where +* 'xx' is device family:\n +* \code #define CY_CORTEX_M4_APPL_ADDR (0x10080000u) \endcode +* +* IAR\n +* The flash and RAM sections for the CPU are defined in the linker files: +* 'xx_yy.icf', where 'xx' is the device group, and 'yy' is the target CPU; for example, +* 'cy8c6xx7_cm0plus.icf' and 'cy8c6xx7_cm4_dual.icf'. +* \note If the start of the Cortex-M4 application image is changed, the value +* of the of the \ref CY_CORTEX_M4_APPL_ADDR should also be changed. The +* \ref CY_CORTEX_M4_APPL_ADDR macro should be used as the parameter for the \ref +* Cy_SysEnableCM4() function call. +* +* Change the flash and RAM sizes by editing the macros value in the +* linker files for both CPUs: +* - 'xx_cm0plus.icf', where 'xx' is the device group: +* \code +* define symbol __ICFEDIT_region_IROM1_start__ = 0x10000000; +* define symbol __ICFEDIT_region_IROM1_end__ = 0x10080000; +* define symbol __ICFEDIT_region_IRAM1_start__ = 0x08000000; +* define symbol __ICFEDIT_region_IRAM1_end__ = 0x08024000; +* \endcode +* - 'xx_cm4_dual.icf', where 'xx' is the device group: +* \code +* define symbol __ICFEDIT_region_IROM1_start__ = 0x10080000; +* define symbol __ICFEDIT_region_IROM1_end__ = 0x10100000; +* define symbol __ICFEDIT_region_IRAM1_start__ = 0x08024000; +* define symbol __ICFEDIT_region_IRAM1_end__ = 0x08047800; +* \endcode +* +* Change the value of the \ref CY_CORTEX_M4_APPL_ADDR macro to the +* __ICFEDIT_region_IROM1_start__ value in the 'xx_cm4_dual.icf' file, where 'xx' +* is the device group. Do this by either: +* - Passing the following commands to the compiler:\n +* \code -D CY_CORTEX_M4_APPL_ADDR=0x10080000 \endcode +* - Editing the \ref CY_CORTEX_M4_APPL_ADDR value in the 'system_xx.h', where +* 'xx' is device family:\n +* \code #define CY_CORTEX_M4_APPL_ADDR (0x10080000u) \endcode +* +* \subsection group_system_config_device_initialization Device Initialization +* After a power-on-reset (POR), the boot process is handled by the boot code +* from the on-chip ROM that is always executed by the Cortex-M0+ core. The boot +* code passes the control to the Cortex-M0+ startup code located in flash. +* +* \subsubsection group_system_config_dual_core_device_initialization Dual-Core Devices +* The Cortex-M0+ startup code performs the device initialization by a call to +* SystemInit() and then calls the main() function. The Cortex-M4 core is disabled +* by default. Enable the core using the \ref Cy_SysEnableCM4() function. +* See \ref group_system_config_cm4_functions for more details. +* \note Startup code executes SystemInit() function for the both Cortex-M0+ and Cortex-M4 cores. +* The function has a separate implementation on each core. +* Both function implementations unlock and disable the WDT. +* Therefore enable the WDT after both cores have been initialized. +* +* \subsubsection group_system_config_single_core_device_initialization Single-Core Devices +* The Cortex-M0+ core is not user-accessible on these devices. In this case the +* Flash Boot handles setup of the CM0+ core and starts the Cortex-M4 core. +* +* \subsection group_system_config_heap_stack_config Heap and Stack Configuration +* There are two ways to adjust heap and stack configurations: +* -# Editing source code files +* -# Specifying via command line +* +* By default, the stack size is set to 0x00001000 and the heap size is set to 0x00000400. +* +* \subsubsection group_system_config_heap_stack_config_gcc ARM GCC +* - Editing source code files\n +* The heap and stack sizes are defined in the assembler startup files +* (e.g. startup_psoc6_01_cm0plus.S and startup_psoc6_01_cm4.S). +* Change the heap and stack sizes by modifying the following lines:\n +* \code .equ Stack_Size, 0x00001000 \endcode +* \code .equ Heap_Size, 0x00000400 \endcode +* +* - Specifying via command line\n +* Change the heap and stack sizes passing the following commands to the compiler:\n +* \code -D __STACK_SIZE=0x000000400 \endcode +* \code -D __HEAP_SIZE=0x000000100 \endcode +* +* \subsubsection group_system_config_heap_stack_config_mdk ARM MDK +* - Editing source code files\n +* The heap and stack sizes are defined in the assembler startup files +* (e.g. startup_psoc6_01_cm0plus.s and startup_psoc6_01_cm4.s). +* Change the heap and stack sizes by modifying the following lines:\n +* \code Stack_Size EQU 0x00001000 \endcode +* \code Heap_Size EQU 0x00000400 \endcode +* +* - Specifying via command line\n +* Change the heap and stack sizes passing the following commands to the assembler:\n +* \code "--predefine=___STACK_SIZE SETA 0x000000400" \endcode +* \code "--predefine=__HEAP_SIZE SETA 0x000000100" \endcode +* +* \subsubsection group_system_config_heap_stack_config_iar IAR +* - Editing source code files\n +* The heap and stack sizes are defined in the linker scatter files: 'xx_yy.icf', +* where 'xx' is the device family, and 'yy' is the target CPU; for example, +* cy8c6xx7_cm0plus.icf and cy8c6xx7_cm4_dual.icf. +* Change the heap and stack sizes by modifying the following lines:\n +* \code Stack_Size EQU 0x00001000 \endcode +* \code Heap_Size EQU 0x00000400 \endcode +* +* - Specifying via command line\n +* Change the heap and stack sizes passing the following commands to the +* linker (including quotation marks):\n +* \code --define_symbol __STACK_SIZE=0x000000400 \endcode +* \code --define_symbol __HEAP_SIZE=0x000000100 \endcode +* +* \subsection group_system_config_merge_apps Merging CM0+ and CM4 Executables +* The CM0+ project and linker script build the CM0+ application image. Similarly, +* the CM4 linker script builds the CM4 application image. Each specifies +* locations, sizes, and contents of sections in memory. See +* \ref group_system_config_device_memory_definition for the symbols and default +* values. +* +* The cymcuelftool is invoked by a post-build command. The precise project +* setting is IDE-specific. +* +* The cymcuelftool combines the two executables. The tool examines the +* executables to ensure that memory regions either do not overlap, or contain +* identical bytes (shared). If there are no problems, it creates a new ELF file +* with the merged image, without changing any of the addresses or data. +* +* \subsection group_system_config_default_handlers Default Interrupt Handlers Definition +* The default interrupt handler functions are defined as weak functions to a dummy +* handler in the startup file. The naming convention for the interrupt handler names +* is _IRQHandler. A default interrupt handler can be overwritten in +* user code by defining the handler function using the same name. For example: +* \code +* void scb_0_interrupt_IRQHandler(void) +*{ +* ... +*} +* \endcode +* +* \subsection group_system_config_device_vector_table Vectors Table Copy from Flash to RAM +* This process uses memory sections defined in the linker script. The startup +* code actually defines the contents of the vector table and performs the copy. +* \subsubsection group_system_config_device_vector_table_gcc ARM GCC +* The linker script file is 'xx_yy.ld', where 'xx' is the device family, and +* 'yy' is the target CPU; for example, cy8c6xx7_cm0plus.ld and cy8c6xx7_cm4_dual.ld. +* It defines sections and locations in memory.\n +* Copy interrupt vectors from flash to RAM: \n +* From: \code LONG (__Vectors) \endcode +* To: \code LONG (__ram_vectors_start__) \endcode +* Size: \code LONG (__Vectors_End - __Vectors) \endcode +* The vector table address (and the vector table itself) are defined in the +* assembler startup files (e.g. startup_psoc6_01_cm0plus.S and startup_psoc6_01_cm4.S). +* The code in these files copies the vector table from Flash to RAM. +* \subsubsection group_system_config_device_vector_table_mdk ARM MDK +* The linker script file is 'xx_yy.scat', where 'xx' is the device family, +* and 'yy' is the target CPU; for example, cy8c6xx7_cm0plus.scat and +* cy8c6xx7_cm4_dual.scat. The linker script specifies that the vector table +* (RESET_RAM) shall be first in the RAM section.\n +* RESET_RAM represents the vector table. It is defined in the assembler startup +* files (e.g. startup_psoc6_01_cm0plus.s and startup_psoc6_01_cm4.s). +* The code in these files copies the vector table from Flash to RAM. +* +* \subsubsection group_system_config_device_vector_table_iar IAR +* The linker script file is 'xx_yy.icf', where 'xx' is the device family, and +* 'yy' is the target CPU; for example, cy8c6xx7_cm0plus.icf and cy8c6xx7_cm4_dual.icf. +* This file defines the .intvec_ram section and its location. +* \code place at start of IRAM1_region { readwrite section .intvec_ram}; \endcode +* The vector table address (and the vector table itself) are defined in the +* assembler startup files (e.g. startup_psoc6_01_cm0plus.s and startup_psoc6_01_cm4.s). +* The code in these files copies the vector table from Flash to RAM. +* +* \section group_system_config_more_information More Information +* Refer to the
PDL User Guide for the +* more details. +* +* \section group_system_config_MISRA MISRA Compliance +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
2.3RThe character sequence // shall not be used within a comment.The comments provide a useful WEB link to the documentation.
+* +* \section group_system_config_changelog Changelog +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
VersionChangesReason for Change
2.20Moved the Cy_IPC_SystemSemaInit(), Cy_IPC_SystemPipeInit() functions implementation from IPC to Startup.Changed the IPC driver configuration method from compile time to run time.
2.10Added constructor attribute to SystemInit() function declaration for ARM MDK compiler. \n +* Removed $Sub$$main symbol for ARM MDK compiler. +* uVision Debugger support.
Updated description of the Startup behavior for Single-Core Devices. \n +* Added note about WDT disabling by SystemInit() function. +* Documentation improvement.
2.0Added restoring of FLL registers to the default state in SystemInit() API for single core devices. +* Single core device support. +*
Added Normal Access Restrictions, Public Key, TOC part2 and TOC part2 copy to Supervisory flash linker memory regions. \n +* Renamed 'wflash' memory region to 'em_eeprom'. +* Linker scripts usability improvement.
Added Cy_IPC_SystemSemaInit(), Cy_IPC_SystemPipeInit(), Cy_Flash_Init() functions call to SystemInit() API.Reserved system resources for internal operations.
Added clearing and releasing of IPC structure #7 (reserved for the Deep-Sleep operations) to SystemInit() API.To avoid deadlocks in case of SW or WDT reset during Deep-Sleep entering.
1.0Initial version
+* +* +* \defgroup group_system_config_macro Macro +* \{ +* \defgroup group_system_config_system_macro System +* \defgroup group_system_config_cm4_status_macro Cortex-M4 Status +* \defgroup group_system_config_user_settings_macro User Settings +* \} +* \defgroup group_system_config_functions Functions +* \{ +* \defgroup group_system_config_system_functions System +* \defgroup group_system_config_cm4_functions Cortex-M4 Control +* \} +* \defgroup group_system_config_globals Global Variables +* +* \} +*/ + +/** +* \addtogroup group_system_config_system_functions +* \{ +* \details +* The following system functions implement CMSIS Core functions. +* Refer to the [CMSIS documentation] +* (http://www.keil.com/pack/doc/CMSIS/Core/html/group__system__init__gr.html "System and Clock Configuration") +* for more details. +* \} +*/ + +#ifdef __cplusplus +extern "C" { +#endif + + +/******************************************************************************* +* Include files +*******************************************************************************/ +#include + + +/******************************************************************************* +* Global preprocessor symbols/macros ('define') +*******************************************************************************/ +#if ((defined(__GNUC__) && (__ARM_ARCH == 6) && (__ARM_ARCH_6M__ == 1)) || \ + (defined (__ICCARM__) && (__CORE__ == __ARM6M__)) || \ + (defined(__ARMCC_VERSION) && (__TARGET_ARCH_THUMB == 3))) + #define CY_SYSTEM_CPU_CM0P 1UL +#else + #define CY_SYSTEM_CPU_CM0P 0UL +#endif + +#if defined (CY_PSOC_CREATOR_USED) && (CY_PSOC_CREATOR_USED == 1U) + #include "cyfitter.h" +#endif /* (CY_PSOC_CREATOR_USED) && (CY_PSOC_CREATOR_USED == 1U) */ + + + + +/******************************************************************************* +* +* START OF USER SETTINGS HERE +* =========================== +* +* All lines with '<<<' can be set by user. +* +*******************************************************************************/ + +/** +* \addtogroup group_system_config_user_settings_macro +* \{ +*/ + +#if defined (CYDEV_CLK_EXTCLK__HZ) + #define CY_CLK_EXT_FREQ_HZ (CYDEV_CLK_EXTCLK__HZ) +#else + /***************************************************************************//** + * External Clock Frequency (in Hz, [value]UL). If compiled within + * PSoC Creator and the clock is enabled in the DWR, the value from DWR used. + * Otherwise, edit the value below. + * (USER SETTING) + *******************************************************************************/ + #define CY_CLK_EXT_FREQ_HZ (24000000UL) /* <<< 24 MHz */ +#endif /* (CYDEV_CLK_EXTCLK__HZ) */ + + +#if defined (CYDEV_CLK_ECO__HZ) + #define CY_CLK_ECO_FREQ_HZ (CYDEV_CLK_ECO__HZ) +#else + /***************************************************************************//** + * \brief External crystal oscillator frequency (in Hz, [value]UL). If compiled + * within PSoC Creator and the clock is enabled in the DWR, the value from DWR + * used. + * (USER SETTING) + *******************************************************************************/ + #define CY_CLK_ECO_FREQ_HZ (24000000UL) /* <<< 24 MHz */ +#endif /* (CYDEV_CLK_ECO__HZ) */ + + +#if defined (CYDEV_CLK_ALTHF__HZ) + #define CY_CLK_ALTHF_FREQ_HZ (CYDEV_CLK_ALTHF__HZ) +#else + /***************************************************************************//** + * \brief Alternate high frequency (in Hz, [value]UL). If compiled within + * PSoC Creator and the clock is enabled in the DWR, the value from DWR used. + * Otherwise, edit the value below. + * (USER SETTING) + *******************************************************************************/ + #define CY_CLK_ALTHF_FREQ_HZ (32000000UL) /* <<< 32 MHz */ +#endif /* (CYDEV_CLK_ALTHF__HZ) */ + + +/***************************************************************************//** +* \brief Start address of the Cortex-M4 application ([address]UL) +* (USER SETTING) +*******************************************************************************/ +#define CY_CORTEX_M4_APPL_ADDR ( CY_FLASH_BASE + CY_FLASH_SIZE / 2U) /* <<< Half of flash is reserved for the Cortex-M0+ application */ + + +/***************************************************************************//** +* \brief IPC Semaphores allocation ([value]UL). +* (USER SETTING) +*******************************************************************************/ +#define CY_IPC_SEMA_COUNT (128UL) /* <<< This will allow 128 (4*32) semaphores */ + + +/***************************************************************************//** +* \brief IPC Pipe definitions ([value]UL). +* (USER SETTING) +*******************************************************************************/ +#define CY_IPC_MAX_ENDPOINTS (8UL) /* <<< 8 endpoints */ + + +/******************************************************************************* +* +* END OF USER SETTINGS HERE +* ========================= +* +*******************************************************************************/ + +/** \} group_system_config_user_settings_macro */ + + +/** +* \addtogroup group_system_config_system_macro +* \{ +*/ + +#if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) + /** The Cortex-M0+ startup driver identifier */ + #define CY_STARTUP_M0P_ID ((uint32_t)((uint32_t)((0x0EU) & 0x3FFFU) << 18U)) +#endif /* (CY_SYSTEM_CPU_CM0P == 1UL) */ + +#if (CY_SYSTEM_CPU_CM0P != 1UL) || defined(CY_DOXYGEN) + /** The Cortex-M4 startup driver identifier */ + #define CY_STARTUP_M4_ID ((uint32_t)((uint32_t)((0x0FU) & 0x3FFFU) << 18U)) +#endif /* (CY_SYSTEM_CPU_CM0P != 1UL) */ + +/** \} group_system_config_system_macro */ + + +/** +* \addtogroup group_system_config_system_functions +* \{ +*/ +#if defined(__ARMCC_VERSION) + extern void SystemInit(void) __attribute__((constructor)); +#else + extern void SystemInit(void); +#endif /* (__ARMCC_VERSION) */ + +extern void SystemCoreClockUpdate(void); +/** \} group_system_config_system_functions */ + + +/** +* \addtogroup group_system_config_cm4_functions +* \{ +*/ +extern uint32_t Cy_SysGetCM4Status(void); +extern void Cy_SysEnableCM4(uint32_t vectorTableOffset); +extern void Cy_SysDisableCM4(void); +extern void Cy_SysRetainCM4(void); +extern void Cy_SysResetCM4(void); +/** \} group_system_config_cm4_functions */ + + +/** \cond */ +extern void Default_Handler (void); + +void Cy_SysIpcPipeIsrCm0(void); +void Cy_SysIpcPipeIsrCm4(void); + +extern void Cy_SystemInit(void); +extern void Cy_SystemInitFpuEnable(void); + +extern uint32_t cy_delayFreqHz; +extern uint32_t cy_delayFreqKhz; +extern uint8_t cy_delayFreqMhz; +extern uint32_t cy_delay32kMs; +/** \endcond */ + + +#if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) +/** +* \addtogroup group_system_config_cm4_status_macro +* \{ +*/ +#define CY_SYS_CM4_STATUS_ENABLED (3U) /**< The Cortex-M4 core is enabled: power on, clock on, no isolate, no reset and no retain. */ +#define CY_SYS_CM4_STATUS_DISABLED (0U) /**< The Cortex-M4 core is disabled: power off, clock off, isolate, reset and no retain. */ +#define CY_SYS_CM4_STATUS_RETAINED (2U) /**< The Cortex-M4 core is retained. power off, clock off, isolate, no reset and retain. */ +#define CY_SYS_CM4_STATUS_RESET (1U) /**< The Cortex-M4 core is in the Reset mode: clock off, no isolated, no retain and reset. */ +/** \} group_system_config_cm4_status_macro */ + +#endif /* (CY_SYSTEM_CPU_CM0P == 1UL) */ + + +/******************************************************************************* +* IPC Configuration +* ========================= +*******************************************************************************/ +/* IPC CY_PIPE default configuration */ +#define CY_SYS_CYPIPE_CLIENT_CNT (8UL) + +#define CY_SYS_INTR_CYPIPE_MUX_EP0 (1UL) /* IPC CYPRESS PIPE */ +#define CY_SYS_INTR_CYPIPE_PRIOR_EP0 (1UL) /* Notifier Priority */ +#define CY_SYS_INTR_CYPIPE_PRIOR_EP1 (1UL) /* Notifier Priority */ + +#define CY_SYS_CYPIPE_CHAN_MASK_EP0 (0x0001UL << CY_IPC_CHAN_CYPIPE_EP0) +#define CY_SYS_CYPIPE_CHAN_MASK_EP1 (0x0001UL << CY_IPC_CHAN_CYPIPE_EP1) + + +/******************************************************************************/ +/* + * The System pipe configuration defines the IPC channel number, interrupt + * number, and the pipe interrupt mask for the endpoint. + * + * The format of the endPoint configuration + * Bits[31:16] Interrupt Mask + * Bits[15:8 ] IPC interrupt + * Bits[ 7:0 ] IPC channel + */ + +/* System Pipe addresses */ +/* CyPipe defines */ + +#define CY_SYS_CYPIPE_INTR_MASK ( CY_SYS_CYPIPE_CHAN_MASK_EP0 | CY_SYS_CYPIPE_CHAN_MASK_EP1 ) + +#define CY_SYS_CYPIPE_CONFIG_EP0 ( (CY_SYS_CYPIPE_INTR_MASK << CY_IPC_PIPE_CFG_IMASK_Pos) \ + | (CY_IPC_INTR_CYPIPE_EP0 << CY_IPC_PIPE_CFG_INTR_Pos) \ + | CY_IPC_CHAN_CYPIPE_EP0) +#define CY_SYS_CYPIPE_CONFIG_EP1 ( (CY_SYS_CYPIPE_INTR_MASK << CY_IPC_PIPE_CFG_IMASK_Pos) \ + | (CY_IPC_INTR_CYPIPE_EP1 << CY_IPC_PIPE_CFG_INTR_Pos) \ + | CY_IPC_CHAN_CYPIPE_EP1) + +/******************************************************************************/ + + +/** \addtogroup group_system_config_globals +* \{ +*/ + +extern uint32_t SystemCoreClock; +extern uint32_t cy_BleEcoClockFreqHz; +extern uint32_t cy_Hfclk0FreqHz; +extern uint32_t cy_PeriClkFreqHz; + +/** \} group_system_config_globals */ + + + +/** \cond INTERNAL */ +/******************************************************************************* +* Backward compatibility macro. The following code is DEPRECATED and must +* not be used in new projects +*******************************************************************************/ + +/* BWC defines for functions related to enter/exit critical section */ +#define Cy_SaveIRQ Cy_SysLib_EnterCriticalSection +#define Cy_RestoreIRQ Cy_SysLib_ExitCriticalSection +#define CY_SYS_INTR_CYPIPE_EP0 (CY_IPC_INTR_CYPIPE_EP0) +#define CY_SYS_INTR_CYPIPE_EP1 (CY_IPC_INTR_CYPIPE_EP1) + +/** \endcond */ + +#ifdef __cplusplus +} +#endif + +#endif /* _SYSTEM_PSOC6_H_ */ + + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/system_psoc6_cm0plus.c b/2020TPCApp1.cydsn/system_psoc6_cm0plus.c new file mode 100644 index 0000000..038e7b4 --- /dev/null +++ b/2020TPCApp1.cydsn/system_psoc6_cm0plus.c @@ -0,0 +1,699 @@ +/***************************************************************************//** +* \file system_psoc6_cm0plus.c +* \version 2.20 +* +* The device system-source file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include +#include "system_psoc6.h" +#include "cy_device.h" +#include "cy_device_headers.h" +#include "cy_syslib.h" +#include "cy_wdt.h" + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) + #include "cy_ipc_sema.h" + #include "cy_ipc_pipe.h" + #include "cy_ipc_drv.h" + + #if defined(CY_DEVICE_PSOC6ABLE2) + #include "cy_flash.h" + #endif /* defined(CY_DEVICE_PSOC6ABLE2) */ + +#endif /* !defined(CY_IPC_DEFAULT_CFG_DISABLE) */ + + +/******************************************************************************* +* SystemCoreClockUpdate() +*******************************************************************************/ + +/** Default HFClk frequency in Hz */ +#define CY_CLK_HFCLK0_FREQ_HZ_DEFAULT (150000000UL) + +/** Default PeriClk frequency in Hz */ +#define CY_CLK_PERICLK_FREQ_HZ_DEFAULT (75000000UL) + +/** Default SlowClk system core frequency in Hz */ +#define CY_CLK_SYSTEM_FREQ_HZ_DEFAULT (75000000UL) + +/** IMO frequency in Hz */ +#define CY_CLK_IMO_FREQ_HZ (8000000UL) + +/** HVILO frequency in Hz */ +#define CY_CLK_HVILO_FREQ_HZ (32000UL) + +/** PILO frequency in Hz */ +#define CY_CLK_PILO_FREQ_HZ (32768UL) + +/** WCO frequency in Hz */ +#define CY_CLK_WCO_FREQ_HZ (32768UL) + +/** ALTLF frequency in Hz */ +#define CY_CLK_ALTLF_FREQ_HZ (32768UL) + + +/** +* Holds the SlowClk (Cortex-M0+) or FastClk (Cortex-M4) system core clock, +* which is the system clock frequency supplied to the SysTick timer and the +* processor core clock. +* This variable implements CMSIS Core global variable. +* Refer to the [CMSIS documentation] +* (http://www.keil.com/pack/doc/CMSIS/Core/html/group__system__init__gr.html "System and Clock Configuration") +* for more details. +* This variable can be used by debuggers to query the frequency +* of the debug timer or to configure the trace clock speed. +* +* \attention Compilers must be configured to avoid removing this variable in case +* the application program is not using it. Debugging systems require the variable +* to be physically present in memory so that it can be examined to configure the debugger. */ +uint32_t SystemCoreClock = CY_CLK_SYSTEM_FREQ_HZ_DEFAULT; + +/** Holds the HFClk0 clock frequency. Updated by \ref SystemCoreClockUpdate(). */ +uint32_t cy_Hfclk0FreqHz = CY_CLK_HFCLK0_FREQ_HZ_DEFAULT; + +/** Holds the PeriClk clock frequency. Updated by \ref SystemCoreClockUpdate(). */ +uint32_t cy_PeriClkFreqHz = CY_CLK_PERICLK_FREQ_HZ_DEFAULT; + +/** Holds the Alternate high frequency clock in Hz. Updated by \ref SystemCoreClockUpdate(). */ +#if (defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL)) || defined (CY_DOXYGEN) + uint32_t cy_BleEcoClockFreqHz = CY_CLK_ALTHF_FREQ_HZ; +#endif /* (defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL)) || defined (CY_DOXYGEN) */ + + +/******************************************************************************* +* SystemInit() +*******************************************************************************/ + +/* CLK_FLL_CONFIG default values */ +#define CY_FB_CLK_FLL_CONFIG_VALUE (0x01000000u) +#define CY_FB_CLK_FLL_CONFIG2_VALUE (0x00020001u) +#define CY_FB_CLK_FLL_CONFIG3_VALUE (0x00002800u) +#define CY_FB_CLK_FLL_CONFIG4_VALUE (0x000000FFu) + + +/******************************************************************************* +* SystemCoreClockUpdate (void) +*******************************************************************************/ + +/* Do not use these definitions directly in your application */ +#define CY_DELAY_MS_OVERFLOW_THRESHOLD (0x8000u) +#define CY_DELAY_1K_THRESHOLD (1000u) +#define CY_DELAY_1K_MINUS_1_THRESHOLD (CY_DELAY_1K_THRESHOLD - 1u) +#define CY_DELAY_1M_THRESHOLD (1000000u) +#define CY_DELAY_1M_MINUS_1_THRESHOLD (CY_DELAY_1M_THRESHOLD - 1u) +uint32_t cy_delayFreqHz = CY_CLK_SYSTEM_FREQ_HZ_DEFAULT; + +uint32_t cy_delayFreqKhz = (CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / + CY_DELAY_1K_THRESHOLD; + +uint8_t cy_delayFreqMhz = (uint8_t)((CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1M_MINUS_1_THRESHOLD) / + CY_DELAY_1M_THRESHOLD); + +uint32_t cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * + ((CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / CY_DELAY_1K_THRESHOLD); + +#define CY_ROOT_PATH_SRC_IMO (0UL) +#define CY_ROOT_PATH_SRC_EXT (1UL) +#if (SRSS_ECO_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_ECO (2UL) +#endif /* (SRSS_ECO_PRESENT == 1U) */ +#if (SRSS_ALTHF_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_ALTHF (3UL) +#endif /* (SRSS_ALTHF_PRESENT == 1U) */ +#define CY_ROOT_PATH_SRC_DSI_MUX (4UL) +#define CY_ROOT_PATH_SRC_DSI_MUX_HVILO (16UL) +#define CY_ROOT_PATH_SRC_DSI_MUX_WCO (17UL) +#if (SRSS_ALTLF_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_DSI_MUX_ALTLF (18UL) +#endif /* (SRSS_ALTLF_PRESENT == 1U) */ +#if (SRSS_PILO_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_DSI_MUX_PILO (19UL) +#endif /* (SRSS_PILO_PRESENT == 1U) */ + + +/******************************************************************************* +* Cy_SysEnableCM4(), Cy_SysRetainCM4(), and Cy_SysResetCM4() +*******************************************************************************/ +#define CY_SYS_CM4_PWR_CTL_KEY_OPEN (0x05FAUL) +#define CY_SYS_CM4_PWR_CTL_KEY_CLOSE (0xFA05UL) +#define CY_SYS_CM4_VECTOR_TABLE_VALID_ADDR (0x000003FFUL) + + +/******************************************************************************* +* Function Name: SystemInit +****************************************************************************//** +* +* Initializes the system: +* - Restores FLL registers to the default state. +* - Unlocks and disables WDT. +* - Calls Cy_PDL_Init() function to define the driver library. +* - Calls the Cy_SystemInit() function, if compiled from PSoC Creator. +* - Calls \ref SystemCoreClockUpdate(). +* +*******************************************************************************/ +void SystemInit(void) +{ + Cy_PDL_Init(CY_DEVICE_CFG); + + /* Restore FLL registers to the default state as they are not restored by the ROM code */ + uint32_t copy = SRSS->CLK_FLL_CONFIG; + copy &= ~SRSS_CLK_FLL_CONFIG_FLL_ENABLE_Msk; + SRSS->CLK_FLL_CONFIG = copy; + + copy = SRSS->CLK_ROOT_SELECT[0u]; + copy &= ~SRSS_CLK_ROOT_SELECT_ROOT_DIV_Msk; /* Set ROOT_DIV = 0*/ + SRSS->CLK_ROOT_SELECT[0u] = copy; + + SRSS->CLK_FLL_CONFIG = CY_FB_CLK_FLL_CONFIG_VALUE; + SRSS->CLK_FLL_CONFIG2 = CY_FB_CLK_FLL_CONFIG2_VALUE; + SRSS->CLK_FLL_CONFIG3 = CY_FB_CLK_FLL_CONFIG3_VALUE; + SRSS->CLK_FLL_CONFIG4 = CY_FB_CLK_FLL_CONFIG4_VALUE; + + /* Unlock and disable WDT */ + Cy_WDT_Unlock(); + Cy_WDT_Disable(); + + Cy_SystemInit(); + SystemCoreClockUpdate(); + +#if defined(CY_DEVICE_PSOC6ABLE2) && !defined(CY_PSOC6ABLE2_REV_0A_SUPPORT_DISABLE) + if (CY_SYSLIB_DEVICE_REV_0A == Cy_SysLib_GetDeviceRevision()) + { + /* Clear data register of IPC structure #7, reserved for the Deep-Sleep operations. */ + IPC_STRUCT7->DATA = 0UL; + /* Release IPC structure #7 to avoid deadlocks in case of SW or WDT reset during Deep-Sleep entering. */ + IPC_STRUCT7->RELEASE = 0UL; + } +#endif /* defined(CY_DEVICE_PSOC6ABLE2) && !defined(CY_PSOC6ABLE2_REV_0A_SUPPORT_DISABLE) */ + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) + /* Allocate and initialize semaphores for the system operations. */ + static uint32_t ipcSemaArray[CY_IPC_SEMA_COUNT / CY_IPC_SEMA_PER_WORD]; + + (void) Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, CY_IPC_SEMA_COUNT, ipcSemaArray); + + + /******************************************************************************** + * + * Initializes the system pipes. The system pipes are used by BLE and Flash. + * + * If the default startup file is not used, or SystemInit() is not called in your + * project, call the following three functions prior to executing any flash or + * EmEEPROM write or erase operation: + * -# Cy_IPC_Sema_Init() + * -# Cy_IPC_Pipe_Config() + * -# Cy_IPC_Pipe_Init() + * -# Cy_Flash_Init() + * + *******************************************************************************/ + + /* Create an array of endpoint structures */ + static cy_stc_ipc_pipe_ep_t systemIpcPipeEpArray[CY_IPC_MAX_ENDPOINTS]; + + Cy_IPC_Pipe_Config(systemIpcPipeEpArray); + + static cy_ipc_pipe_callback_ptr_t systemIpcPipeSysCbArray[CY_SYS_CYPIPE_CLIENT_CNT]; + + static const cy_stc_ipc_pipe_config_t systemIpcPipeConfigCm0 = + { + /* .ep0ConfigData */ + { + /* .ipcNotifierNumber */ CY_IPC_INTR_CYPIPE_EP0, + /* .ipcNotifierPriority */ CY_SYS_INTR_CYPIPE_PRIOR_EP0, + /* .ipcNotifierMuxNumber */ CY_SYS_INTR_CYPIPE_MUX_EP0, + /* .epAddress */ CY_IPC_EP_CYPIPE_CM0_ADDR, + /* .epConfig */ CY_SYS_CYPIPE_CONFIG_EP0 + }, + /* .ep1ConfigData */ + { + /* .ipcNotifierNumber */ CY_IPC_INTR_CYPIPE_EP1, + /* .ipcNotifierPriority */ CY_SYS_INTR_CYPIPE_PRIOR_EP1, + /* .ipcNotifierMuxNumber */ 0u, + /* .epAddress */ CY_IPC_EP_CYPIPE_CM4_ADDR, + /* .epConfig */ CY_SYS_CYPIPE_CONFIG_EP1 + }, + /* .endpointClientsCount */ CY_SYS_CYPIPE_CLIENT_CNT, + /* .endpointsCallbacksArray */ systemIpcPipeSysCbArray, + /* .userPipeIsrHandler */ &Cy_SysIpcPipeIsrCm0 + }; + + if (cy_device->flashPipeRequired != 0u) + { + Cy_IPC_Pipe_Init(&systemIpcPipeConfigCm0); + } + +#if defined(CY_DEVICE_PSOC6ABLE2) + Cy_Flash_Init(); +#endif /* defined(CY_DEVICE_PSOC6ABLE2) */ + +#endif /* !defined(CY_IPC_DEFAULT_CFG_DISABLE) */ +} + + +/******************************************************************************* +* Function Name: Cy_SystemInit +****************************************************************************//** +* +* The function is called during device startup. Once project compiled as part of +* the PSoC Creator project, the Cy_SystemInit() function is generated by the +* PSoC Creator. +* +* The function generated by PSoC Creator performs all of the necessary device +* configuration based on the design settings. This includes settings from the +* Design Wide Resources (DWR) such as Clocks and Pins as well as any component +* configuration that is necessary. +* +*******************************************************************************/ +__WEAK void Cy_SystemInit(void) +{ + /* Empty weak function. The actual implementation to be in the PSoC Creator + * generated strong function. + */ +} + + +/******************************************************************************* +* Function Name: SystemCoreClockUpdate +****************************************************************************//** +* +* Gets core clock frequency and updates \ref SystemCoreClock, \ref +* cy_Hfclk0FreqHz, and \ref cy_PeriClkFreqHz. +* +* Updates global variables used by the \ref Cy_SysLib_Delay(), \ref +* Cy_SysLib_DelayUs(), and \ref Cy_SysLib_DelayCycles(). +* +*******************************************************************************/ +void SystemCoreClockUpdate (void) +{ + uint32_t srcFreqHz; + uint32_t pathFreqHz; + uint32_t slowClkDiv; + uint32_t periClkDiv; + uint32_t rootPath; + uint32_t srcClk; + + /* Get root path clock for the high-frequency clock # 0 */ + rootPath = _FLD2VAL(SRSS_CLK_ROOT_SELECT_ROOT_MUX, SRSS->CLK_ROOT_SELECT[0u]); + + /* Get source of the root path clock */ + srcClk = _FLD2VAL(SRSS_CLK_PATH_SELECT_PATH_MUX, SRSS->CLK_PATH_SELECT[rootPath]); + + /* Get frequency of the source */ + switch (srcClk) + { + case CY_ROOT_PATH_SRC_IMO: + srcFreqHz = CY_CLK_IMO_FREQ_HZ; + break; + + case CY_ROOT_PATH_SRC_EXT: + srcFreqHz = CY_CLK_EXT_FREQ_HZ; + break; + + #if (SRSS_ECO_PRESENT == 1U) + case CY_ROOT_PATH_SRC_ECO: + srcFreqHz = CY_CLK_ECO_FREQ_HZ; + break; + #endif /* (SRSS_ECO_PRESENT == 1U) */ + +#if defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) && (SRSS_ALTHF_PRESENT == 1U) + case CY_ROOT_PATH_SRC_ALTHF: + srcFreqHz = cy_BleEcoClockFreqHz; + break; +#endif /* defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) && (SRSS_ALTHF_PRESENT == 1U) */ + + case CY_ROOT_PATH_SRC_DSI_MUX: + { + uint32_t dsi_src; + dsi_src = _FLD2VAL(SRSS_CLK_DSI_SELECT_DSI_MUX, SRSS->CLK_DSI_SELECT[rootPath]); + switch (dsi_src) + { + case CY_ROOT_PATH_SRC_DSI_MUX_HVILO: + srcFreqHz = CY_CLK_HVILO_FREQ_HZ; + break; + + case CY_ROOT_PATH_SRC_DSI_MUX_WCO: + srcFreqHz = CY_CLK_WCO_FREQ_HZ; + break; + + #if (SRSS_ALTLF_PRESENT == 1U) + case CY_ROOT_PATH_SRC_DSI_MUX_ALTLF: + srcFreqHz = CY_CLK_ALTLF_FREQ_HZ; + break; + #endif /* (SRSS_ALTLF_PRESENT == 1U) */ + + #if (SRSS_PILO_PRESENT == 1U) + case CY_ROOT_PATH_SRC_DSI_MUX_PILO: + srcFreqHz = CY_CLK_PILO_FREQ_HZ; + break; + #endif /* (SRSS_PILO_PRESENT == 1U) */ + + default: + srcFreqHz = CY_CLK_HVILO_FREQ_HZ; + break; + } + } + break; + + default: + srcFreqHz = CY_CLK_EXT_FREQ_HZ; + break; + } + + if (rootPath == 0UL) + { + /* FLL */ + bool fllLocked = ( 0UL != _FLD2VAL(SRSS_CLK_FLL_STATUS_LOCKED, SRSS->CLK_FLL_STATUS)); + bool fllOutputOutput = ( 3UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3)); + bool fllOutputAuto = ((0UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3)) || + (1UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3))); + if ((fllOutputAuto && fllLocked) || fllOutputOutput) + { + uint32_t fllMult; + uint32_t refDiv; + uint32_t outputDiv; + + fllMult = _FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_MULT, SRSS->CLK_FLL_CONFIG); + refDiv = _FLD2VAL(SRSS_CLK_FLL_CONFIG2_FLL_REF_DIV, SRSS->CLK_FLL_CONFIG2); + outputDiv = _FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_OUTPUT_DIV, SRSS->CLK_FLL_CONFIG) + 1UL; + + pathFreqHz = ((srcFreqHz / refDiv) * fllMult) / outputDiv; + } + else + { + pathFreqHz = srcFreqHz; + } + } + else if (rootPath == 1UL) + { + /* PLL */ + bool pllLocked = ( 0UL != _FLD2VAL(SRSS_CLK_PLL_STATUS_LOCKED, SRSS->CLK_PLL_STATUS[0UL])); + bool pllOutputOutput = ( 3UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL])); + bool pllOutputAuto = ((0UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL])) || + (1UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL]))); + if ((pllOutputAuto && pllLocked) || pllOutputOutput) + { + uint32_t feedbackDiv; + uint32_t referenceDiv; + uint32_t outputDiv; + + feedbackDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_FEEDBACK_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + referenceDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_REFERENCE_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + outputDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_OUTPUT_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + + pathFreqHz = ((srcFreqHz * feedbackDiv) / referenceDiv) / outputDiv; + + } + else + { + pathFreqHz = srcFreqHz; + } + } + else + { + /* Direct */ + pathFreqHz = srcFreqHz; + } + + /* Get frequency after hf_clk pre-divider */ + pathFreqHz = pathFreqHz >> _FLD2VAL(SRSS_CLK_ROOT_SELECT_ROOT_DIV, SRSS->CLK_ROOT_SELECT[0u]); + cy_Hfclk0FreqHz = pathFreqHz; + + /* Slow Clock Divider */ + slowClkDiv = 1u + _FLD2VAL(CPUSS_CM0_CLOCK_CTL_SLOW_INT_DIV, CPUSS->CM0_CLOCK_CTL); + + /* Peripheral Clock Divider */ + periClkDiv = 1u + _FLD2VAL(CPUSS_CM0_CLOCK_CTL_PERI_INT_DIV, CPUSS->CM0_CLOCK_CTL); + + pathFreqHz = pathFreqHz / periClkDiv; + cy_PeriClkFreqHz = pathFreqHz; + pathFreqHz = pathFreqHz / slowClkDiv; + SystemCoreClock = pathFreqHz; + + /* Sets clock frequency for Delay API */ + cy_delayFreqHz = SystemCoreClock; + cy_delayFreqMhz = (uint8_t)((cy_delayFreqHz + CY_DELAY_1M_MINUS_1_THRESHOLD) / CY_DELAY_1M_THRESHOLD); + cy_delayFreqKhz = (cy_delayFreqHz + CY_DELAY_1K_MINUS_1_THRESHOLD) / CY_DELAY_1K_THRESHOLD; + cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * cy_delayFreqKhz; +} + + +#if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) +/******************************************************************************* +* Function Name: Cy_SysGetCM4Status +****************************************************************************//** +* +* Returns the Cortex-M4 core power mode. +* +* \return \ref group_system_config_cm4_status_macro +* +*******************************************************************************/ +uint32_t Cy_SysGetCM4Status(void) +{ + uint32_t regValue; + + /* Get current power mode */ + regValue = CPUSS->CM4_PWR_CTL & CPUSS_CM4_PWR_CTL_PWR_MODE_Msk; + + return (regValue); +} + + +/******************************************************************************* +* Function Name: Cy_SysEnableCM4 +****************************************************************************//** +* +* Sets vector table base address and enables the Cortex-M4 core. +* +* \note If the CPU is already enabled, it is reset and then enabled. +* +* \param vectorTableOffset The offset of the vector table base address from +* memory address 0x00000000. The offset should be multiple to 1024 bytes. +* +*******************************************************************************/ +void Cy_SysEnableCM4(uint32_t vectorTableOffset) +{ + uint32_t regValue; + uint32_t interruptState; + uint32_t cpuState; + + CY_ASSERT_L2((vectorTableOffset & CY_SYS_CM4_VECTOR_TABLE_VALID_ADDR) == 0UL); + + interruptState = Cy_SysLib_EnterCriticalSection(); + + cpuState = Cy_SysGetCM4Status(); + if (CY_SYS_CM4_STATUS_ENABLED == cpuState) + { + Cy_SysResetCM4(); + } + + CPUSS->CM4_VECTOR_TABLE_BASE = vectorTableOffset; + + regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); + regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); + regValue |= CY_SYS_CM4_STATUS_ENABLED; + CPUSS->CM4_PWR_CTL = regValue; + + while((CPUSS->CM4_STATUS & CPUSS_CM4_STATUS_PWR_DONE_Msk) == 0UL) + { + /* Wait for the power mode to take effect */ + } + + Cy_SysLib_ExitCriticalSection(interruptState); +} + + +/******************************************************************************* +* Function Name: Cy_SysDisableCM4 +****************************************************************************//** +* +* Disables the Cortex-M4 core and waits for the mode to take the effect. +* +* \warning Do not call the function while the Cortex-M4 is executing because +* such a call may corrupt/abort a pending bus-transaction by the CPU and cause +* unexpected behavior in the system including a deadlock. Call the function +* while the Cortex-M4 core is in the Sleep or Deep Sleep low-power mode. Use +* the \ref group_syspm Power Management (syspm) API to put the CPU into the +* low-power modes. Use the \ref Cy_SysPm_ReadStatus() to get a status of the +* CPU. +* +*******************************************************************************/ +void Cy_SysDisableCM4(void) +{ + uint32_t interruptState; + uint32_t regValue; + + interruptState = Cy_SysLib_EnterCriticalSection(); + + regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); + regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); + regValue |= CY_SYS_CM4_STATUS_DISABLED; + CPUSS->CM4_PWR_CTL = regValue; + + while((CPUSS->CM4_STATUS & CPUSS_CM4_STATUS_PWR_DONE_Msk) == 0UL) + { + /* Wait for the power mode to take effect */ + } + + Cy_SysLib_ExitCriticalSection(interruptState); +} + + +/******************************************************************************* +* Function Name: Cy_SysRetainCM4 +****************************************************************************//** +* +* Retains the Cortex-M4 core and exists without waiting for the mode to take +* effect. +* +* \note The retained mode can be entered only from the enabled mode. +* +* \warning Do not call the function while the Cortex-M4 is executing because +* such a call may corrupt/abort a pending bus-transaction by the CPU and cause +* unexpected behavior in the system including a deadlock. Call the function +* while the Cortex-M4 core is in the Sleep or Deep Sleep low-power mode. Use +* the \ref group_syspm Power Management (syspm) API to put the CPU into the +* low-power modes. Use the \ref Cy_SysPm_ReadStatus() to get a status of the CPU. +* +*******************************************************************************/ +void Cy_SysRetainCM4(void) +{ + uint32_t interruptState; + uint32_t regValue; + + interruptState = Cy_SysLib_EnterCriticalSection(); + + regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); + regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); + regValue |= CY_SYS_CM4_STATUS_RETAINED; + CPUSS->CM4_PWR_CTL = regValue; + + Cy_SysLib_ExitCriticalSection(interruptState); +} + + +/******************************************************************************* +* Function Name: Cy_SysResetCM4 +****************************************************************************//** +* +* Resets the Cortex-M4 core and waits for the mode to take the effect. +* +* \note The reset mode can not be entered from the retained mode. +* +* \warning Do not call the function while the Cortex-M4 is executing because +* such a call may corrupt/abort a pending bus-transaction by the CPU and cause +* unexpected behavior in the system including a deadlock. Call the function +* while the Cortex-M4 core is in the Sleep or Deep Sleep low-power mode. Use +* the \ref group_syspm Power Management (syspm) API to put the CPU into the +* low-power modes. Use the \ref Cy_SysPm_ReadStatus() to get a status of the CPU. +* +*******************************************************************************/ +void Cy_SysResetCM4(void) +{ + uint32_t interruptState; + uint32_t regValue; + + interruptState = Cy_SysLib_EnterCriticalSection(); + + regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); + regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); + regValue |= CY_SYS_CM4_STATUS_RESET; + CPUSS->CM4_PWR_CTL = regValue; + + while((CPUSS->CM4_STATUS & CPUSS_CM4_STATUS_PWR_DONE_Msk) == 0UL) + { + /* Wait for the power mode to take effect */ + } + + Cy_SysLib_ExitCriticalSection(interruptState); +} +#endif /* #if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) */ + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) +/******************************************************************************* +* Function Name: Cy_SysIpcPipeIsrCm0 +****************************************************************************//** +* +* This is the interrupt service routine for the system pipe. +* +*******************************************************************************/ +void Cy_SysIpcPipeIsrCm0(void) +{ + Cy_IPC_Pipe_ExecuteCallback(CY_IPC_EP_CYPIPE_CM0_ADDR); +} +#endif + +/******************************************************************************* +* Function Name: Cy_MemorySymbols +****************************************************************************//** +* +* The intention of the function is to declare boundaries of the memories for the +* MDK compilers. For the rest of the supported compilers, this is done using +* linker configuration files. The following symbols used by the cymcuelftool. +* +*******************************************************************************/ +#if defined (__ARMCC_VERSION) +__asm void Cy_MemorySymbols(void) +{ + /* Flash */ + EXPORT __cy_memory_0_start + EXPORT __cy_memory_0_length + EXPORT __cy_memory_0_row_size + + /* Working Flash */ + EXPORT __cy_memory_1_start + EXPORT __cy_memory_1_length + EXPORT __cy_memory_1_row_size + + /* Supervisory Flash */ + EXPORT __cy_memory_2_start + EXPORT __cy_memory_2_length + EXPORT __cy_memory_2_row_size + + /* XIP */ + EXPORT __cy_memory_3_start + EXPORT __cy_memory_3_length + EXPORT __cy_memory_3_row_size + + /* eFuse */ + EXPORT __cy_memory_4_start + EXPORT __cy_memory_4_length + EXPORT __cy_memory_4_row_size + + + /* Flash */ +__cy_memory_0_start EQU __cpp(CY_FLASH_BASE) +__cy_memory_0_length EQU __cpp(CY_FLASH_SIZE) +__cy_memory_0_row_size EQU 0x200 + + /* Flash region for EEPROM emulation */ +__cy_memory_1_start EQU __cpp(CY_EM_EEPROM_BASE) +__cy_memory_1_length EQU __cpp(CY_EM_EEPROM_SIZE) +__cy_memory_1_row_size EQU 0x200 + + /* Supervisory Flash */ +__cy_memory_2_start EQU __cpp(CY_SFLASH_BASE) +__cy_memory_2_length EQU __cpp(CY_SFLASH_SIZE) +__cy_memory_2_row_size EQU 0x200 + + /* XIP */ +__cy_memory_3_start EQU __cpp(CY_XIP_BASE) +__cy_memory_3_length EQU __cpp(CY_XIP_SIZE) +__cy_memory_3_row_size EQU 0x200 + + /* eFuse */ +__cy_memory_4_start EQU __cpp(0x90700000) +__cy_memory_4_length EQU __cpp(0x100000) +__cy_memory_4_row_size EQU __cpp(1) +} +#endif /* defined (__ARMCC_VERSION) */ + + +/* [] END OF FILE */ diff --git a/2020TPCApp1.cydsn/system_psoc6_cm4.c b/2020TPCApp1.cydsn/system_psoc6_cm4.c new file mode 100644 index 0000000..c4d8c11 --- /dev/null +++ b/2020TPCApp1.cydsn/system_psoc6_cm4.c @@ -0,0 +1,542 @@ +/***************************************************************************//** +* \file system_psoc6_cm4.c +* \version 2.20 +* +* The device system-source file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include +#include "system_psoc6.h" +#include "cy_device.h" +#include "cy_device_headers.h" +#include "cy_syslib.h" +#include "cy_wdt.h" + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) + #include "cy_ipc_sema.h" + #include "cy_ipc_pipe.h" + #include "cy_ipc_drv.h" + + #if defined(CY_DEVICE_PSOC6ABLE2) + #include "cy_flash.h" + #endif /* defined(CY_DEVICE_PSOC6ABLE2) */ +#endif /* !defined(CY_IPC_DEFAULT_CFG_DISABLE) */ + + +/******************************************************************************* +* SystemCoreClockUpdate() +*******************************************************************************/ + +/** Default HFClk frequency in Hz */ +#define CY_CLK_HFCLK0_FREQ_HZ_DEFAULT (150000000UL) + +/** Default PeriClk frequency in Hz */ +#define CY_CLK_PERICLK_FREQ_HZ_DEFAULT (75000000UL) + +/** Default SlowClk system core frequency in Hz */ +#define CY_CLK_SYSTEM_FREQ_HZ_DEFAULT (75000000UL) + +/** IMO frequency in Hz */ +#define CY_CLK_IMO_FREQ_HZ (8000000UL) + +/** HVILO frequency in Hz */ +#define CY_CLK_HVILO_FREQ_HZ (32000UL) + +/** PILO frequency in Hz */ +#define CY_CLK_PILO_FREQ_HZ (32768UL) + +/** WCO frequency in Hz */ +#define CY_CLK_WCO_FREQ_HZ (32768UL) + +/** ALTLF frequency in Hz */ +#define CY_CLK_ALTLF_FREQ_HZ (32768UL) + + +/** +* Holds the SlowClk (Cortex-M0+) or FastClk (Cortex-M4) system core clock, +* which is the system clock frequency supplied to the SysTick timer and the +* processor core clock. +* This variable implements CMSIS Core global variable. +* Refer to the [CMSIS documentation] +* (http://www.keil.com/pack/doc/CMSIS/Core/html/group__system__init__gr.html "System and Clock Configuration") +* for more details. +* This variable can be used by debuggers to query the frequency +* of the debug timer or to configure the trace clock speed. +* +* \attention Compilers must be configured to avoid removing this variable in case +* the application program is not using it. Debugging systems require the variable +* to be physically present in memory so that it can be examined to configure the debugger. */ +uint32_t SystemCoreClock = CY_CLK_SYSTEM_FREQ_HZ_DEFAULT; + +/** Holds the HFClk0 clock frequency. Updated by \ref SystemCoreClockUpdate(). */ +uint32_t cy_Hfclk0FreqHz = CY_CLK_HFCLK0_FREQ_HZ_DEFAULT; + +/** Holds the PeriClk clock frequency. Updated by \ref SystemCoreClockUpdate(). */ +uint32_t cy_PeriClkFreqHz = CY_CLK_PERICLK_FREQ_HZ_DEFAULT; + +/** Holds the Alternate high frequency clock in Hz. Updated by \ref SystemCoreClockUpdate(). */ +#if (defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL)) || defined (CY_DOXYGEN) + uint32_t cy_BleEcoClockFreqHz = CY_CLK_ALTHF_FREQ_HZ; +#endif /* (defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL)) || defined (CY_DOXYGEN) */ + +/* SCB->CPACR */ +#define SCB_CPACR_CP10_CP11_ENABLE (0xFUL << 20u) + + +/******************************************************************************* +* SystemInit() +*******************************************************************************/ + +/* CLK_FLL_CONFIG default values */ +#define CY_FB_CLK_FLL_CONFIG_VALUE (0x01000000u) +#define CY_FB_CLK_FLL_CONFIG2_VALUE (0x00020001u) +#define CY_FB_CLK_FLL_CONFIG3_VALUE (0x00002800u) +#define CY_FB_CLK_FLL_CONFIG4_VALUE (0x000000FFu) + + +/******************************************************************************* +* SystemCoreClockUpdate (void) +*******************************************************************************/ + +/* Do not use these definitions directly in your application */ +#define CY_DELAY_MS_OVERFLOW_THRESHOLD (0x8000u) +#define CY_DELAY_1K_THRESHOLD (1000u) +#define CY_DELAY_1K_MINUS_1_THRESHOLD (CY_DELAY_1K_THRESHOLD - 1u) +#define CY_DELAY_1M_THRESHOLD (1000000u) +#define CY_DELAY_1M_MINUS_1_THRESHOLD (CY_DELAY_1M_THRESHOLD - 1u) +uint32_t cy_delayFreqHz = CY_CLK_SYSTEM_FREQ_HZ_DEFAULT; + +uint32_t cy_delayFreqKhz = (CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / + CY_DELAY_1K_THRESHOLD; + +uint8_t cy_delayFreqMhz = (uint8_t)((CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1M_MINUS_1_THRESHOLD) / + CY_DELAY_1M_THRESHOLD); + +uint32_t cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * + ((CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / CY_DELAY_1K_THRESHOLD); + +#define CY_ROOT_PATH_SRC_IMO (0UL) +#define CY_ROOT_PATH_SRC_EXT (1UL) +#if (SRSS_ECO_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_ECO (2UL) +#endif /* (SRSS_ECO_PRESENT == 1U) */ +#if (SRSS_ALTHF_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_ALTHF (3UL) +#endif /* (SRSS_ALTHF_PRESENT == 1U) */ +#define CY_ROOT_PATH_SRC_DSI_MUX (4UL) +#define CY_ROOT_PATH_SRC_DSI_MUX_HVILO (16UL) +#define CY_ROOT_PATH_SRC_DSI_MUX_WCO (17UL) +#if (SRSS_ALTLF_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_DSI_MUX_ALTLF (18UL) +#endif /* (SRSS_ALTLF_PRESENT == 1U) */ +#if (SRSS_PILO_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_DSI_MUX_PILO (19UL) +#endif /* (SRSS_PILO_PRESENT == 1U) */ + + +/******************************************************************************* +* Function Name: SystemInit +****************************************************************************//** +* \cond +* Initializes the system: +* - Restores FLL registers to the default state for single core devices. +* - Unlocks and disables WDT. +* - Calls Cy_PDL_Init() function to define the driver library. +* - Calls the Cy_SystemInit() function, if compiled from PSoC Creator. +* - Calls \ref SystemCoreClockUpdate(). +* \endcond +*******************************************************************************/ +void SystemInit(void) +{ + Cy_PDL_Init(CY_DEVICE_CFG); + +#ifdef __CM0P_PRESENT + #if (__CM0P_PRESENT == 0) + /* Restore FLL registers to the default state as they are not restored by the ROM code */ + uint32_t copy = SRSS->CLK_FLL_CONFIG; + copy &= ~SRSS_CLK_FLL_CONFIG_FLL_ENABLE_Msk; + SRSS->CLK_FLL_CONFIG = copy; + + copy = SRSS->CLK_ROOT_SELECT[0u]; + copy &= ~SRSS_CLK_ROOT_SELECT_ROOT_DIV_Msk; /* Set ROOT_DIV = 0*/ + SRSS->CLK_ROOT_SELECT[0u] = copy; + + SRSS->CLK_FLL_CONFIG = CY_FB_CLK_FLL_CONFIG_VALUE; + SRSS->CLK_FLL_CONFIG2 = CY_FB_CLK_FLL_CONFIG2_VALUE; + SRSS->CLK_FLL_CONFIG3 = CY_FB_CLK_FLL_CONFIG3_VALUE; + SRSS->CLK_FLL_CONFIG4 = CY_FB_CLK_FLL_CONFIG4_VALUE; + + /* Unlock and disable WDT */ + Cy_WDT_Unlock(); + Cy_WDT_Disable(); + #endif /* (__CM0P_PRESENT == 0) */ +#endif /* __CM0P_PRESENT */ + + Cy_SystemInit(); + SystemCoreClockUpdate(); + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) + +#ifdef __CM0P_PRESENT + #if (__CM0P_PRESENT == 0) + /* Allocate and initialize semaphores for the system operations. */ + static uint32_t ipcSemaArray[CY_IPC_SEMA_COUNT / CY_IPC_SEMA_PER_WORD]; + (void) Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, CY_IPC_SEMA_COUNT, ipcSemaArray); + #else + (void) Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, 0ul, NULL); + #endif /* (__CM0P_PRESENT) */ +#else + (void) Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, 0ul, NULL); +#endif /* __CM0P_PRESENT */ + + + /******************************************************************************** + * + * Initializes the system pipes. The system pipes are used by BLE and Flash. + * + * If the default startup file is not used, or SystemInit() is not called in your + * project, call the following three functions prior to executing any flash or + * EmEEPROM write or erase operation: + * -# Cy_IPC_Sema_Init() + * -# Cy_IPC_Pipe_Config() + * -# Cy_IPC_Pipe_Init() + * -# Cy_Flash_Init() + * + *******************************************************************************/ + /* Create an array of endpoint structures */ + static cy_stc_ipc_pipe_ep_t systemIpcPipeEpArray[CY_IPC_MAX_ENDPOINTS]; + + Cy_IPC_Pipe_Config(systemIpcPipeEpArray); + + static cy_ipc_pipe_callback_ptr_t systemIpcPipeSysCbArray[CY_SYS_CYPIPE_CLIENT_CNT]; + + static const cy_stc_ipc_pipe_config_t systemIpcPipeConfigCm4 = + { + /* .ep0ConfigData */ + { + /* .ipcNotifierNumber */ CY_IPC_INTR_CYPIPE_EP0, + /* .ipcNotifierPriority */ CY_SYS_INTR_CYPIPE_PRIOR_EP0, + /* .ipcNotifierMuxNumber */ CY_SYS_INTR_CYPIPE_MUX_EP0, + /* .epAddress */ CY_IPC_EP_CYPIPE_CM0_ADDR, + /* .epConfig */ CY_SYS_CYPIPE_CONFIG_EP0 + }, + /* .ep1ConfigData */ + { + /* .ipcNotifierNumber */ CY_IPC_INTR_CYPIPE_EP1, + /* .ipcNotifierPriority */ CY_SYS_INTR_CYPIPE_PRIOR_EP1, + /* .ipcNotifierMuxNumber */ 0u, + /* .epAddress */ CY_IPC_EP_CYPIPE_CM4_ADDR, + /* .epConfig */ CY_SYS_CYPIPE_CONFIG_EP1 + }, + /* .endpointClientsCount */ CY_SYS_CYPIPE_CLIENT_CNT, + /* .endpointsCallbacksArray */ systemIpcPipeSysCbArray, + /* .userPipeIsrHandler */ &Cy_SysIpcPipeIsrCm4 + }; + + if (cy_device->flashPipeRequired != 0u) + { + Cy_IPC_Pipe_Init(&systemIpcPipeConfigCm4); + } + +#if defined(CY_DEVICE_PSOC6ABLE2) + Cy_Flash_Init(); +#endif /* defined(CY_DEVICE_PSOC6ABLE2) */ + +#endif /* !defined(CY_IPC_DEFAULT_CFG_DISABLE) */ +} + + +/******************************************************************************* +* Function Name: Cy_SystemInit +****************************************************************************//** +* +* The function is called during device startup. Once project compiled as part of +* the PSoC Creator project, the Cy_SystemInit() function is generated by the +* PSoC Creator. +* +* The function generated by PSoC Creator performs all of the necessary device +* configuration based on the design settings. This includes settings from the +* Design Wide Resources (DWR) such as Clocks and Pins as well as any component +* configuration that is necessary. +* +*******************************************************************************/ +__WEAK void Cy_SystemInit(void) +{ + /* Empty weak function. The actual implementation to be in the PSoC Creator + * generated strong function. + */ +} + + +/******************************************************************************* +* Function Name: SystemCoreClockUpdate +****************************************************************************//** +* +* Gets core clock frequency and updates \ref SystemCoreClock, \ref +* cy_Hfclk0FreqHz, and \ref cy_PeriClkFreqHz. +* +* Updates global variables used by the \ref Cy_SysLib_Delay(), \ref +* Cy_SysLib_DelayUs(), and \ref Cy_SysLib_DelayCycles(). +* +*******************************************************************************/ +void SystemCoreClockUpdate (void) +{ + uint32_t srcFreqHz; + uint32_t pathFreqHz; + uint32_t fastClkDiv; + uint32_t periClkDiv; + uint32_t rootPath; + uint32_t srcClk; + + /* Get root path clock for the high-frequency clock # 0 */ + rootPath = _FLD2VAL(SRSS_CLK_ROOT_SELECT_ROOT_MUX, SRSS->CLK_ROOT_SELECT[0u]); + + /* Get source of the root path clock */ + srcClk = _FLD2VAL(SRSS_CLK_PATH_SELECT_PATH_MUX, SRSS->CLK_PATH_SELECT[rootPath]); + + /* Get frequency of the source */ + switch (srcClk) + { + case CY_ROOT_PATH_SRC_IMO: + srcFreqHz = CY_CLK_IMO_FREQ_HZ; + break; + + case CY_ROOT_PATH_SRC_EXT: + srcFreqHz = CY_CLK_EXT_FREQ_HZ; + break; + + #if (SRSS_ECO_PRESENT == 1U) + case CY_ROOT_PATH_SRC_ECO: + srcFreqHz = CY_CLK_ECO_FREQ_HZ; + break; + #endif /* (SRSS_ECO_PRESENT == 1U) */ + +#if defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) && (SRSS_ALTHF_PRESENT == 1U) + case CY_ROOT_PATH_SRC_ALTHF: + srcFreqHz = cy_BleEcoClockFreqHz; + break; +#endif /* defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) && (SRSS_ALTHF_PRESENT == 1U) */ + + case CY_ROOT_PATH_SRC_DSI_MUX: + { + uint32_t dsi_src; + dsi_src = _FLD2VAL(SRSS_CLK_DSI_SELECT_DSI_MUX, SRSS->CLK_DSI_SELECT[rootPath]); + switch (dsi_src) + { + case CY_ROOT_PATH_SRC_DSI_MUX_HVILO: + srcFreqHz = CY_CLK_HVILO_FREQ_HZ; + break; + + case CY_ROOT_PATH_SRC_DSI_MUX_WCO: + srcFreqHz = CY_CLK_WCO_FREQ_HZ; + break; + + #if (SRSS_ALTLF_PRESENT == 1U) + case CY_ROOT_PATH_SRC_DSI_MUX_ALTLF: + srcFreqHz = CY_CLK_ALTLF_FREQ_HZ; + break; + #endif /* (SRSS_ALTLF_PRESENT == 1U) */ + + #if (SRSS_PILO_PRESENT == 1U) + case CY_ROOT_PATH_SRC_DSI_MUX_PILO: + srcFreqHz = CY_CLK_PILO_FREQ_HZ; + break; + #endif /* (SRSS_PILO_PRESENT == 1U) */ + + default: + srcFreqHz = CY_CLK_HVILO_FREQ_HZ; + break; + } + } + break; + + default: + srcFreqHz = CY_CLK_EXT_FREQ_HZ; + break; + } + + if (rootPath == 0UL) + { + /* FLL */ + bool fllLocked = ( 0UL != _FLD2VAL(SRSS_CLK_FLL_STATUS_LOCKED, SRSS->CLK_FLL_STATUS)); + bool fllOutputOutput = ( 3UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3)); + bool fllOutputAuto = ((0UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3)) || + (1UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3))); + if ((fllOutputAuto && fllLocked) || fllOutputOutput) + { + uint32_t fllMult; + uint32_t refDiv; + uint32_t outputDiv; + + fllMult = _FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_MULT, SRSS->CLK_FLL_CONFIG); + refDiv = _FLD2VAL(SRSS_CLK_FLL_CONFIG2_FLL_REF_DIV, SRSS->CLK_FLL_CONFIG2); + outputDiv = _FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_OUTPUT_DIV, SRSS->CLK_FLL_CONFIG) + 1UL; + + pathFreqHz = ((srcFreqHz / refDiv) * fllMult) / outputDiv; + } + else + { + pathFreqHz = srcFreqHz; + } + } + else if (rootPath == 1UL) + { + /* PLL */ + bool pllLocked = ( 0UL != _FLD2VAL(SRSS_CLK_PLL_STATUS_LOCKED, SRSS->CLK_PLL_STATUS[0UL])); + bool pllOutputOutput = ( 3UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL])); + bool pllOutputAuto = ((0UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL])) || + (1UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL]))); + if ((pllOutputAuto && pllLocked) || pllOutputOutput) + { + uint32_t feedbackDiv; + uint32_t referenceDiv; + uint32_t outputDiv; + + feedbackDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_FEEDBACK_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + referenceDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_REFERENCE_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + outputDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_OUTPUT_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + + pathFreqHz = ((srcFreqHz * feedbackDiv) / referenceDiv) / outputDiv; + + } + else + { + pathFreqHz = srcFreqHz; + } + } + else + { + /* Direct */ + pathFreqHz = srcFreqHz; + } + + /* Get frequency after hf_clk pre-divider */ + pathFreqHz = pathFreqHz >> _FLD2VAL(SRSS_CLK_ROOT_SELECT_ROOT_DIV, SRSS->CLK_ROOT_SELECT[0u]); + cy_Hfclk0FreqHz = pathFreqHz; + + /* Fast Clock Divider */ + fastClkDiv = 1u + _FLD2VAL(CPUSS_CM4_CLOCK_CTL_FAST_INT_DIV, CPUSS->CM4_CLOCK_CTL); + + /* Peripheral Clock Divider */ + periClkDiv = 1u + _FLD2VAL(CPUSS_CM0_CLOCK_CTL_PERI_INT_DIV, CPUSS->CM0_CLOCK_CTL); + cy_PeriClkFreqHz = pathFreqHz / periClkDiv; + + pathFreqHz = pathFreqHz / fastClkDiv; + SystemCoreClock = pathFreqHz; + + /* Sets clock frequency for Delay API */ + cy_delayFreqHz = SystemCoreClock; + cy_delayFreqMhz = (uint8_t)((cy_delayFreqHz + CY_DELAY_1M_MINUS_1_THRESHOLD) / CY_DELAY_1M_THRESHOLD); + cy_delayFreqKhz = (cy_delayFreqHz + CY_DELAY_1K_MINUS_1_THRESHOLD) / CY_DELAY_1K_THRESHOLD; + cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * cy_delayFreqKhz; +} + + +/******************************************************************************* +* Function Name: Cy_SystemInitFpuEnable +****************************************************************************//** +* +* Enables the FPU if it is used. The function is called from the startup file. +* +*******************************************************************************/ +void Cy_SystemInitFpuEnable(void) +{ + #if defined (__FPU_USED) && (__FPU_USED == 1U) + uint32_t interruptState; + interruptState = Cy_SysLib_EnterCriticalSection(); + SCB->CPACR |= SCB_CPACR_CP10_CP11_ENABLE; + __DSB(); + __ISB(); + Cy_SysLib_ExitCriticalSection(interruptState); + #endif /* (__FPU_USED) && (__FPU_USED == 1U) */ +} + + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) +/******************************************************************************* +* Function Name: Cy_SysIpcPipeIsrCm4 +****************************************************************************//** +* +* This is the interrupt service routine for the system pipe. +* +*******************************************************************************/ +void Cy_SysIpcPipeIsrCm4(void) +{ + Cy_IPC_Pipe_ExecuteCallback(CY_IPC_EP_CYPIPE_CM4_ADDR); +} +#endif + +/******************************************************************************* +* Function Name: Cy_MemorySymbols +****************************************************************************//** +* +* The intention of the function is to declare boundaries of the memories for the +* MDK compilers. For the rest of the supported compilers, this is done using +* linker configuration files. The following symbols used by the cymcuelftool. +* +*******************************************************************************/ +#if defined (__ARMCC_VERSION) +__asm void Cy_MemorySymbols(void) +{ + /* Flash */ + EXPORT __cy_memory_0_start + EXPORT __cy_memory_0_length + EXPORT __cy_memory_0_row_size + + /* Working Flash */ + EXPORT __cy_memory_1_start + EXPORT __cy_memory_1_length + EXPORT __cy_memory_1_row_size + + /* Supervisory Flash */ + EXPORT __cy_memory_2_start + EXPORT __cy_memory_2_length + EXPORT __cy_memory_2_row_size + + /* XIP */ + EXPORT __cy_memory_3_start + EXPORT __cy_memory_3_length + EXPORT __cy_memory_3_row_size + + /* eFuse */ + EXPORT __cy_memory_4_start + EXPORT __cy_memory_4_length + EXPORT __cy_memory_4_row_size + + /* Flash */ +__cy_memory_0_start EQU __cpp(CY_FLASH_BASE) +__cy_memory_0_length EQU __cpp(CY_FLASH_SIZE) +__cy_memory_0_row_size EQU 0x200 + + /* Flash region for EEPROM emulation */ +__cy_memory_1_start EQU __cpp(CY_EM_EEPROM_BASE) +__cy_memory_1_length EQU __cpp(CY_EM_EEPROM_SIZE) +__cy_memory_1_row_size EQU 0x200 + + /* Supervisory Flash */ +__cy_memory_2_start EQU __cpp(CY_SFLASH_BASE) +__cy_memory_2_length EQU __cpp(CY_SFLASH_SIZE) +__cy_memory_2_row_size EQU 0x200 + + /* XIP */ +__cy_memory_3_start EQU __cpp(CY_XIP_BASE) +__cy_memory_3_length EQU __cpp(CY_XIP_SIZE) +__cy_memory_3_row_size EQU 0x200 + + /* eFuse */ +__cy_memory_4_start EQU __cpp(0x90700000) +__cy_memory_4_length EQU __cpp(0x100000) +__cy_memory_4_row_size EQU __cpp(1) +} + +#endif /* defined (__ARMCC_VERSION) */ + + +/* [] END OF FILE */ diff --git a/2020TPCAppNoDFU.cydsn/2020TPCAppNoDFU.cydwr b/2020TPCAppNoDFU.cydsn/2020TPCAppNoDFU.cydwr new file mode 100644 index 0000000..ddaa64c --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/2020TPCAppNoDFU.cydwr @@ -0,0 +1,1295 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/2020TPCAppNoDFU.cydsn/2020TPCAppNoDFU.cyprj b/2020TPCAppNoDFU.cydsn/2020TPCAppNoDFU.cyprj new file mode 100644 index 0000000..236c4e2 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/2020TPCAppNoDFU.cyprj @@ -0,0 +1,6297 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/2020TPCAppNoDFU.cydsn/Audio.c b/2020TPCAppNoDFU.cydsn/Audio.c new file mode 100644 index 0000000..d8db7ef --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/Audio.c @@ -0,0 +1,288 @@ +/* Include Files */ +#include "KTag.h" + +QueueHandle_t xQueueAudio; +TaskHandle_t Audio_Task_Handle; + +static const uint8_t START_BYTE = 0x7E; +static const uint8_t VERSION_BYTE = 0xFF; +static const uint8_t END_BYTE = 0xEF; + +// Valid volumes are 0 - 30. +static const uint8_t COMMAND_SPECIFY_VOLUME = 0x06; +static const uint8_t COMMAND_PAUSE = 0x0E; +static const uint8_t COMMAND_PLAY_TRACK_IN_FOLDER = 0x0F; + +__attribute__((always_inline)) inline uint16_t CalculateChecksum(uint8_t * buffer, uint8_t length) +{ + uint16_t checksum = 0; + + for (uint_fast8_t i = 0; i < length; i++) + { + checksum += buffer[i]; + } + + return (0 - checksum); +} + +static void Send_Command(uint8_t command, bool requireFeedback, uint16_t parameter) +{ + uint8_t buffer[10]; + uint16_t checksum; + + buffer[0] = START_BYTE; + buffer[1] = VERSION_BYTE; + buffer[2] = 6; // count + buffer[3] = command; + buffer[4] = requireFeedback; + buffer[5] = (uint8_t)(parameter >> 8); + buffer[6] = (uint8_t)(parameter); + + checksum = CalculateChecksum(&buffer[1], 6); + + buffer[7] = (uint8_t)(checksum >> 8); + buffer[8] = (uint8_t)(checksum); + buffer[9] = END_BYTE; + + for (uint_fast8_t i = 0; i < 10; i++) + { + UART_Audio_Put(buffer[i]); + } +} + +SystemKResult_T Perform_Audio_Action(AudioAction_T * action) +{ + if (xQueueSend(xQueueAudio, action, 0) == pdTRUE) + { + return SYSTEMK_RESULT_SUCCESS; + } + else + { + return SYSTEMK_RESULT_QUEUE_IS_FULL; + } +} + +void Init_Audio(void) +{ + UART_Audio_Start(); + + xQueueAudio = xQueueCreate(5, sizeof(AudioAction_T)); +} + +void Audio_Task(void * pvParameters) +{ + portBASE_TYPE xStatus; + + while (IsNVMInitialized() == false) + { + vTaskDelay(100 / portTICK_PERIOD_MS); + } + Send_Command(COMMAND_SPECIFY_VOLUME, false, NVM_VOLUME); + + while (true) + { + AudioAction_T action; + + xStatus = xQueueReceive(xQueueAudio, &action, 0); + + if (xStatus == pdPASS) + { + switch (action.ID) + { + case AUDIO_SET_VOLUME: + { + uint8_t volume = *((uint8_t *)action.Data); + if (volume <= 30) + { + Send_Command(COMMAND_SPECIFY_VOLUME, false, volume); + } + } + break; + + case AUDIO_SILENCE: + Send_Command(COMMAND_PAUSE, false, 0x0000); + break; + + case AUDIO_PLAY_STARTUP_SOUND: + // Play track "001" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0101); + break; + + case AUDIO_PLAY_SHOT_FIRED: + // Play track "002" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0102); + break; + + case AUDIO_PLAY_TAG_RECEIVED: + // Play track "003" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0103); + break; + + case AUDIO_PLAY_TAGGED_OUT: + // Play track "004" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0104); + break; + + case AUDIO_PLAY_MISFIRE: + // Play track "005" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0105); + break; + + case AUDIO_PRONOUNCE_NUMBER_0_TO_100: + { + uint8_t file_index = *((uint8_t *)action.Data); + if (file_index > 100) + { + file_index = 100; + } + else if (file_index == 0) + { + file_index = 101; + } + // The numbers are stored in folder "10". + // 001.mp3 is "one", 100.mp3 is "one hundred", and 101.mp3 is "zero". + uint16_t filenumber = 0x0A00 + file_index; + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, filenumber); + } + break; + + case AUDIO_PLAY_MENU_PROMPT: + // Play track "006" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0106); + break; + + case AUDIO_PLAY_SELECTION_INDICATOR: + // Play track "007" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0107); + break; + + case AUDIO_PLAY_HEALTH_REMAINING: + // Play track "008" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0108); + break; + + case AUDIO_PLAY_ELECTRONIC_DANCE_MUSIC: + // Play track "009" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0109); + break; + + default: + case AUDIO_PLAY_GENERIC_ERROR: + // Play track "010" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x010A); + break; + + case AUDIO_PLAY_VOLUME_PROMPT: + // Play track "011" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x010B); + break; + + case AUDIO_PLAY_RIGHT_HANDED: + // Play track "012" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x010C); + break; + + case AUDIO_PLAY_LEFT_HANDED: + // Play track "013" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x010D); + break; + + case AUDIO_PLAY_GAME_ON: + // Play track "014" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x010E); + break; + + case AUDIO_PLAY_HARDWARE_SETTINGS_PROMPT: + // Play track "015" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x010F); + break; + + case AUDIO_PLAY_GAME_SETTINGS_PROMPT: + // Play track "016" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0110); + break; + + case AUDIO_PLAY_BONK: + // Play track "017" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0111); + break; + + case AUDIO_PLAY_NEAR_MISS: + // Play track "018" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0112); + break; + + case AUDIO_PLAY_PLAYER_ID_PROMPT: + // Play track "019" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0113); + break; + + case AUDIO_PLAY_TEAM_ID_PROMPT: + // Play track "020" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0114); + break; + + case AUDIO_PLAY_FRIENDLY_FIRE: + // Play track "021" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0115); + break; + + case AUDIO_PLAY_STARTING_THEME: + // Play track "022" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0116); + break; + + case AUDIO_PLAY_BOOP: + // Play track "023" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0117); + break; + + case AUDIO_PLAY_BEEP: + // Play track "024" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0118); + break; + + case AUDIO_PLAY_REPROGRAMMING: + // Play track "025" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x0119); + break; + + case AUDIO_PLAY_BOMB: + // Play track "026" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x011A); + break; + + case AUDIO_PLAY_GAME_OVER: + // Play track "027" in folder "01". + Send_Command(COMMAND_PLAY_TRACK_IN_FOLDER, false, 0x011B); + break; + } + + if (action.Play_To_Completion == true) + { + do + { + vTaskDelay(100 / portTICK_PERIOD_MS); + } while (Is_Audio_Playing() == true); + + KEvent_T command_received_event = {.ID = KEVENT_AUDIO_COMPLETED, .Data = (void *)action.ID}; + Post_KEvent(&command_received_event); + } + } + + vTaskDelay(100 / portTICK_PERIOD_MS); + } +} + +bool Is_Audio_Playing() +{ + bool result = false; + + // The signal is active low. + if (Cy_GPIO_Read(Pin_Audio_Busy_PORT, Pin_Audio_Busy_NUM) == 0) + { + result = true; + } + + return result; +} diff --git a/2020TPCAppNoDFU.cydsn/Audio.h b/2020TPCAppNoDFU.cydsn/Audio.h new file mode 100644 index 0000000..d2dda0c --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/Audio.h @@ -0,0 +1,7 @@ + +extern QueueHandle_t xQueueAudio; +extern TaskHandle_t Audio_Task_Handle; + +void Init_Audio(void); +void Audio_Task(void * pvParameters); +bool Is_Audio_Playing(); diff --git a/2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE.c b/2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE.c new file mode 100644 index 0000000..0636c1d --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE.c @@ -0,0 +1,1013 @@ +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +#define BLE_TASK_PERIOD_IN_ms 10 + +#ifdef TRACE_BLE + #define TRACE_BLE_STATE_ENTRY(state_name) do {if (State_Changed == true) { COMM_Console_Print_String("[BLE] Entering the ");COMM_Console_Print_String(state_name);COMM_Console_Print_String(" state.\n");}} while (false) +#else // TRACE_BLE + #define TRACE_BLE_STATE_ENTRY(state_name) +#endif // TRACE_BLE + +/* Public Variables */ + +/* Variable used to maintain connection information */ +cy_stc_ble_conn_handle_t appConnHandle[CY_BLE_CONN_COUNT]; + +QueueHandle_t COMM_BLE_CommandQueue; + +TaskHandle_t COMM_BLE_Task_Handle; + +/* Private Variables */ + +static const TickType_t BLE_Task_Delay = BLE_TASK_PERIOD_IN_ms / portTICK_PERIOD_MS; +static COMM_BLE_StateID_T Current_State = COMM_BLE_DEFAULT; +static COMM_BLE_StateID_T Next_State = COMM_BLE_INITIALIZING; +static bool State_Changed = false; +static TickType_t Time_At_State_Entry_In_Ticks; + +//! Immediate Alert Service alert level value. +volatile uint8_t COMM_BLE_IASAlertLevel = 0; + +static cy_stc_ble_gapp_disc_data_t Advertising_Data; +static cy_stc_ble_gapp_scan_rsp_data_t Scan_Response_Data; +static cy_stc_ble_gapp_disc_mode_info_t Advertising_Info = {.advData = &Advertising_Data, .scanRspData = &Scan_Response_Data}; + +/* Private Function Prototypes */ +static void BLE_EventHandler(uint32_t event, void * eventParam); +static void IASEventHandler(uint32 event, void * eventParam); +static cy_en_ble_api_result_t StartNextAdvertisement(); + +/* Inline Functions */ +static inline uint32_t COMM_BLE_GetTimeInState_in_ms() +{ + uint32_t result = (xTaskGetTickCount() - Time_At_State_Entry_In_Ticks) * portTICK_PERIOD_MS; + return result; +} + +/* Public Functions */ + +//! Initializes the Bluetooth Low Energy communications. +void COMM_BLE_Init(void) +{ + COMM_BLE_CommandQueue = xQueueCreate(10, sizeof(COMM_BLE_Command_T)); + + BLE_InitPacketBuffers(); + + COMM_BLE_UART_Init(); + + if (Cy_BLE_Start(BLE_EventHandler) == CY_BLE_SUCCESS) + { + Cy_BLE_IAS_RegisterAttrCallback(IASEventHandler); + } +#ifdef TRACE_BLE + else + { + COMM_Console_Print_String("[BLE] Cy_BLE_Start API Error!\n"); + } +#endif // TRACE_BLE +} + +//! Bluetooth Low Energy communications task: Manages BLE communications, using the PSoC API functions. +/*! + * + */ +void COMM_BLE_Task(void * pvParameters) +{ + COMM_BLE_Command_T command; + + while(true) + { + Cy_BLE_ProcessEvents(); + + if (xQueueReceive(COMM_BLE_CommandQueue, &command, BLE_Task_Delay) == pdPASS) + { + if (Next_State != Current_State) + { + Current_State = Next_State; + Time_At_State_Entry_In_Ticks = xTaskGetTickCount(); + State_Changed = true; + } + else + { + State_Changed = false; + } + + switch (Current_State) + { + default: + case COMM_BLE_DEFAULT: + { + TRACE_BLE_STATE_ENTRY("COMM_BLE_DEFAULT"); + COMM_BLE_RequestState(COMM_BLE_INITIALIZING); + } + break; + + case COMM_BLE_INITIALIZING: + { + TRACE_BLE_STATE_ENTRY("COMM_BLE_INITIALIZING"); + // Wait for the CY_BLE_EVT_STACK_ON event in BLE_EventHandler() to transition to COMM_BLE_IDLE. + } + break; + + case COMM_BLE_IDLE: + { + TRACE_BLE_STATE_ENTRY("COMM_BLE_IDLE"); + + switch (command.ID) + { + case COMM_BLE_SCAN_FOR_KTAG_PACKETS: + COMM_BLE_RequestState(COMM_BLE_SCANNING_FOR_KTAG_PACKETS); + break; + + case COMM_BLE_SCAN_AND_ADVERTISE: + COMM_BLE_RequestState(COMM_BLE_SCANNING_AND_ADVERTISING); + break; + + default: + // All other commands are ignored in this state. + break; + } + } + break; + + case COMM_BLE_SCANNING_FOR_KTAG_PACKETS: + { + TRACE_BLE_STATE_ENTRY("COMM_BLE_SCANNING_FOR_KTAG_PACKETS"); + + if (State_Changed == true) + { + // Handle state entry events. + cy_en_ble_api_result_t apiResult = + Cy_BLE_GAPC_StartScan(CY_BLE_SCANNING_FAST, CY_BLE_OBSERVER_CONFIGURATION_0_INDEX); + + if(apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPC_StartScan API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + } + + switch (command.ID) + { + case COMM_BLE_ADVERTISE_AS_BROADCASTER: + COMM_BLE_RequestState(COMM_BLE_ADVERTISING_AS_BROADCASTER); + break; + + case COMM_BLE_SCAN_AND_ADVERTISE: + COMM_BLE_RequestState(COMM_BLE_SCANNING_AND_ADVERTISING); + break; + + default: + // All other commands are ignored in this state. + break; + } + } + break; + + case COMM_BLE_ADVERTISING_AS_BROADCASTER: + { + TRACE_BLE_STATE_ENTRY("COMM_BLE_ADVERTISING_AS_BROADCASTER"); + + if (State_Changed == true) + { + // Handle state entry events. + cy_en_ble_api_result_t apiResult = + Cy_BLE_GAPP_StartAdvertisement(CY_BLE_ADVERTISING_FAST, CY_BLE_BROADCASTER_CONFIGURATION_0_INDEX); + + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPP_StartAdvertisement API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + } + + switch (command.ID) + { + case COMM_BLE_STOP_ADVERTISING: + { + cy_en_ble_api_result_t apiResult = Cy_BLE_GAPP_StopAdvertisement(); + + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPP_StopAdvertisement API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + COMM_BLE_RequestState(COMM_BLE_SCANNING_FOR_KTAG_PACKETS); + } + break; + + case COMM_BLE_SCAN_AND_ADVERTISE: + COMM_BLE_RequestState(COMM_BLE_SCANNING_AND_ADVERTISING); + break; + + default: + // All other commands are ignored in this state. + break; + } + } + break; + + case COMM_BLE_ADVERTISING_AS_PERIPHERAL: + { + TRACE_BLE_STATE_ENTRY("COMM_BLE_ADVERTISING_AS_PERIPHERAL"); + + if (State_Changed == true) + { + // Handle state entry events. + cy_en_ble_api_result_t apiResult = + Cy_BLE_GAPP_StartAdvertisement(CY_BLE_ADVERTISING_FAST, CY_BLE_PERIPHERAL_CONFIGURATION_0_INDEX); + + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPP_StartAdvertisement API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + } + } + break; + + case COMM_BLE_SCANNING_AND_ADVERTISING: + { + TRACE_BLE_STATE_ENTRY("COMM_BLE_SCANNING_AND_ADVERTISING"); + + if (State_Changed == true) + { + // Handle state entry events. + cy_en_ble_api_result_t apiResult = + Cy_BLE_GAPP_StartAdvertisement(CY_BLE_ADVERTISING_FAST, CY_BLE_BROADCASTER_CONFIGURATION_0_INDEX); + + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPP_StartAdvertisement API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + + apiResult = + Cy_BLE_GAPC_StartScan(CY_BLE_SCANNING_FAST, CY_BLE_OBSERVER_CONFIGURATION_0_INDEX); + + if(apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPC_StartScan API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + } + } + break; + } + COMM_BLE_UART_MaybeSendData(); + +#ifdef CY_DFU_SDK_VERSION_MAJOR + if (COMM_BLE_IASAlertLevel != 0u) + { + // Disconnect from all the connected devices. + for (uint_fast8_t i = 0; i < CY_BLE_CONN_COUNT; i++) + { + if (Cy_BLE_GetConnectionState(appConnHandle[i]) == CY_BLE_CONN_STATE_CONNECTED) + { + cy_stc_ble_gap_disconnect_info_t disconnectInfoParam = + { + .bdHandle = appConnHandle[i].bdHandle, + .reason = CY_BLE_HCI_ERROR_OTHER_END_TERMINATED_USER + }; + + /* Initiate disconnection from the peer device*/ + if (Cy_BLE_GAP_Disconnect(&disconnectInfoParam) == CY_BLE_SUCCESS) + { + /* Wait for disconnection event */ + while (Cy_BLE_GetConnectionState(appConnHandle[i]) == CY_BLE_CONN_STATE_CONNECTED) + { + /* Process BLE events */ + Cy_BLE_ProcessEvents(); + } + } + } + } + + /* Stop BLE component. */ + Cy_BLE_Disable(); + Cy_DFU_ExecuteApp(0u); + } +#endif // CY_DFU_SDK_VERSION_MAJOR + } + } +} + +SystemKResult_T BLE_GetMyAddress(uint8_t * BD_ADDR) +{ + BD_ADDR[0] = cy_ble_deviceAddress.bdAddr[0]; + BD_ADDR[1] = cy_ble_deviceAddress.bdAddr[1]; + BD_ADDR[2] = cy_ble_deviceAddress.bdAddr[2]; + BD_ADDR[3] = cy_ble_deviceAddress.bdAddr[3]; + BD_ADDR[4] = cy_ble_deviceAddress.bdAddr[4]; + BD_ADDR[5] = cy_ble_deviceAddress.bdAddr[5]; + return SYSTEMK_RESULT_SUCCESS; +} + +SystemKResult_T BLE_ScanAndAdvertise(void) +{ + COMM_BLE_Command_T command = { .ID = COMM_BLE_SCAN_AND_ADVERTISE, .Data = (void *)0x00 }; + xQueueSend(COMM_BLE_CommandQueue, &command, 0); + + return SYSTEMK_RESULT_SUCCESS; +} + +void COMM_BLE_RequestState(COMM_BLE_StateID_T state) +{ + Next_State = state; + COMM_BLE_Command_T command = {.ID = COMM_BLE_REQUEST_STATE_CHANGE, .Data = (void *)0x00}; + xQueueSend(COMM_BLE_CommandQueue, &command, 0); +} + +SystemKResult_T BLE_SetAdvertisingData(BLE_AdvertisingData_T * data) +{ + SystemKResult_T result = SYSTEMK_RESULT_SUCCESS; + + if (data->length > BLE_MAX_ADVERTISING_BYTES) + { + result = SYSTEMK_RESULT_TOO_MANY_DATA; + } + else if (data->length < BLE_KTAG_PACKET_TOTAL_SIZE) + { + result = SYSTEMK_RESULT_TOO_FEW_DATA; + } + else + { + Advertising_Data.advDataLen = BLE_KTAG_PACKET_TOTAL_SIZE; + memcpy(Advertising_Data.advData, data, BLE_KTAG_PACKET_TOTAL_SIZE); + + cy_en_ble_api_result_t result = Cy_BLE_GAPP_UpdateAdvScanData(&Advertising_Info); + + if (result != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPP_UpdateAdvScanData Error: 0x"); + COMM_Console_Print_UInt32AsHex(result); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + } + + return result; +} + +/* Private Functions */ + +static void BLE_EventHandler(uint32_t event, void * eventParam) +{ + cy_en_ble_api_result_t apiResult; + + static cy_stc_ble_gap_sec_key_info_t keyInfo = + { + .localKeysFlag = CY_BLE_GAP_SMP_INIT_ENC_KEY_DIST | + CY_BLE_GAP_SMP_INIT_IRK_KEY_DIST | + CY_BLE_GAP_SMP_INIT_CSRK_KEY_DIST, + .exchangeKeysFlag = CY_BLE_GAP_SMP_INIT_ENC_KEY_DIST | + CY_BLE_GAP_SMP_INIT_IRK_KEY_DIST | + CY_BLE_GAP_SMP_INIT_CSRK_KEY_DIST | + CY_BLE_GAP_SMP_RESP_ENC_KEY_DIST | + CY_BLE_GAP_SMP_RESP_IRK_KEY_DIST | + CY_BLE_GAP_SMP_RESP_CSRK_KEY_DIST, + }; + + if (COMM_BLE_UART_HandleEvent(event, eventParam) == false) + { + // For more information, refer to the comments in cy_ble_stack.h, where all + // these events are described in more detail. + switch (event) + { + case CY_BLE_EVT_INVALID: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_INVALID\n"); +#endif // TRACE_BLE + break; + + + // G E N E R I C E V E N T S (0x1000 to 0x1FFF) + case CY_BLE_EVT_STACK_ON: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_STACK_ON\n"); +#endif // TRACE_BLE + COMM_BLE_RequestState(COMM_BLE_IDLE); + break; + + case CY_BLE_EVT_TIMEOUT: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_TIMEOUT: 0x"); + COMM_Console_Print_UInt8AsHex(*(uint8_t *)eventParam); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_STACK_BUSY_STATUS: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_STACK_BUSY_STATUS: 0x"); + COMM_Console_Print_UInt8AsHex(*(uint8_t *)eventParam); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_MEMORY_REQUEST: + case CY_BLE_EVT_PENDING_FLASH_WRITE: + case CY_BLE_EVT_FLASH_CORRUPT: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); + break; +#endif // TRACE_BLE + break; + + + // H O S T C O N T R O L I N T E R F A C E E V E N T S (0x2000 to 0x2FFF) + case CY_BLE_EVT_HARDWARE_ERROR: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_HARDWARE_ERROR: 0x"); + COMM_Console_Print_UInt8AsHex(*(uint8_t *)eventParam); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_WRITE_AUTH_PAYLOAD_TO_COMPLETE: + case CY_BLE_EVT_READ_AUTH_PAYLOAD_TO_COMPLETE: + case CY_BLE_EVT_GET_CHANNEL_MAP_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_LE_SET_EVENT_MASK_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_SET_DEVICE_ADDR_COMPLETE\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_LE_PING_AUTH_TIMEOUT: + case CY_BLE_EVT_SET_DATA_LENGTH_COMPLETE: + case CY_BLE_EVT_SET_SUGGESTED_DATA_LENGTH_COMPLETE: + case CY_BLE_EVT_GET_DATA_LENGTH_COMPLETE: + case CY_BLE_EVT_DATA_LENGTH_CHANGE: + case CY_BLE_EVT_GET_PEER_RPA_COMPLETE: + case CY_BLE_EVT_GET_LOCAL_RPA_COMPLETE: + case CY_BLE_EVT_SET_RPA_TO_COMPLETE: + case CY_BLE_EVT_SET_RPA_ENABLE_COMPLETE: + case CY_BLE_EVT_SET_HOST_CHANNEL_COMPLETE: + case CY_BLE_EVT_ADD_DEVICE_TO_RPA_LIST_COMPLETE: + case CY_BLE_EVT_REMOVE_DEVICE_FROM_RPA_LIST_COMPLETE: + case CY_BLE_EVT_ADD_DEVICE_TO_WHITE_LIST_COMPLETE: + case CY_BLE_EVT_REMOVE_DEVICE_FROM_WHITE_LIST_COMPLETE: + case CY_BLE_EVT_GET_PHY_COMPLETE: + case CY_BLE_EVT_SET_DEFAULT_PHY_COMPLETE: + case CY_BLE_EVT_SET_PHY_COMPLETE: + case CY_BLE_EVT_PHY_UPDATE_COMPLETE: + case CY_BLE_EVT_SET_PRIVACY_MODE_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + + // V E N D O R E V E N T S (0x3000 to 0x3FFF) + case CY_BLE_EVT_LL_CNTRL_PROC_PENDING_COMPLETE: + case CY_BLE_EVT_SOFT_RESET_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_SET_DEVICE_ADDR_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_SET_DEVICE_ADDR_COMPLETE\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GET_DEVICE_ADDR_COMPLETE: + case CY_BLE_EVT_GET_RSSI_COMPLETE: + case CY_BLE_EVT_GET_TX_PWR_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_SET_TX_PWR_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_SET_TX_PWR_COMPLETE\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GET_CLK_CONFIG_COMPLETE: + case CY_BLE_EVT_SET_CLK_CONFIG_COMPLETE: + case CY_BLE_EVT_RANDOM_NUM_GEN_COMPLETE: + case CY_BLE_EVT_AES_ENCRYPT_COMPLETE: + case CY_BLE_EVT_AES_CCM_ENCRYPT_COMPLETE: + case CY_BLE_EVT_AES_CCM_DECRYPT_COMPLETE: + case CY_BLE_EVT_SET_SLAVE_LATENCY_MODE_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_STACK_SHUTDOWN_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_STACK_SHUTDOWN_COMPLETE\n"); +#endif // TRACE_BLE + // If desired, wait until console transmit is complete, then call Cy_SysPm_Hibernate(); + break; + + case CY_BLE_EVT_RADIO_TEMPERATURE: + case CY_BLE_EVT_RADIO_VOLTAGE_LEVEL: + case CY_BLE_EVT_AES_CMAC_GEN_COMPLETE: + case CY_BLE_EVT_SET_EVENT_MASK_COMPLETE: + case CY_BLE_EVT_SET_CE_LENGTH_COMPLETE: + case CY_BLE_EVT_SET_CONN_PRIORITY_COMPLETE: + case CY_BLE_EVT_HCI_PKT_RCVD: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + + // G E N E R I C A C C E S S P R O F I L E E V E N T S (0x4000 to 0x4FFF) + case CY_BLE_EVT_GAPC_SCAN_PROGRESS_RESULT: + { +#if (defined TRACE_BLE) && (defined VERBOSE_BLE_TRACE) + COMM_Console_Print_String("[BLE] ..SCAN_PROGRESS_RESULT "); +#endif // (defined TRACE_BLE) && (defined VERBOSE_BLE_TRACE) + + BLE_Packet_T * packet = BLE_DecodeKTagPacket((*(cy_stc_ble_gapc_adv_report_param_t *)eventParam).data, + (*(cy_stc_ble_gapc_adv_report_param_t *)eventParam).dataLen, + (*(cy_stc_ble_gapc_adv_report_param_t *)eventParam).peerBdAddr, + (*(cy_stc_ble_gapc_adv_report_param_t *)eventParam).rssi); + + if (packet != NULL) + { +#ifdef TRACE_BLE + switch (packet->Generic.type) + { + case BLE_PACKET_TYPE_INSTIGATE_GAME: + COMM_Console_Print_String(" KTag 'Instigate Game' packet found!"); + break; + + case BLE_PACKET_TYPE_JOIN_NOW: + COMM_Console_Print_String(" KTag 'Join Now' packet found!"); + break; + + case BLE_PACKET_TYPE_TAG: + COMM_Console_Print_String(" KTag 'Tag' packet found!"); + break; + + case BLE_PACKET_TYPE_CONSOLE: + COMM_Console_Print_String(" KTag 'Console' packet found!"); + break; + + case BLE_PACKET_TYPE_STATUS: + COMM_Console_Print_String(" KTag 'Status' packet found!"); + break; + + default: + COMM_Console_Print_String(" Unknown KTag packet found!"); + break; + } + + COMM_Console_Print_String(" RSSI: "); + COMM_Console_Print_Int8(packet->Generic.RSSI); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + if (packet->Generic.type == BLE_PACKET_TYPE_CONSOLE) + { + packet->Console.console_data[BLE_KTAG_PACKET_DATA_SIZE - 1] = COMM_CONSOLE_STRING_TERMINATOR; + COMM_Console_Execute_Internal_Command(packet->Console.console_data); + } + else + { + KEvent_T packet_received_event = {.ID = KEVENT_BLE_PACKET_RECEIVED, .Data = packet}; + Post_KEvent(&packet_received_event); + } + } +#if (defined TRACE_BLE) && (defined VERBOSE_BLE_TRACE) + else + { + COMM_Console_Print_String(" Not a KTag packet!\n"); + } +#endif // (defined TRACE_BLE) && (defined VERBOSE_BLE_TRACE) + } + break; + + case CY_BLE_EVT_GAP_AUTH_REQ: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_AUTH_REQ: bdHandle=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).bdHandle); + COMM_Console_Print_String(" security=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).security); + COMM_Console_Print_String(" bonding=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).bonding); + COMM_Console_Print_String(" ekeySize=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).ekeySize); + COMM_Console_Print_String(" authErr=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).authErr); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + + if(cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX].security == + (CY_BLE_GAP_SEC_MODE_1 | CY_BLE_GAP_SEC_LEVEL_1)) + { + cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX].authErr = + CY_BLE_GAP_AUTH_ERROR_PAIRING_NOT_SUPPORTED; + } + + cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX].bdHandle = + ((cy_stc_ble_gap_auth_info_t *)eventParam)->bdHandle; + + /* Pass security information for authentication in reply to an authentication request + * from the master device */ + apiResult = Cy_BLE_GAPP_AuthReqReply(&cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX]); + if(apiResult != CY_BLE_SUCCESS) + { + Cy_BLE_GAP_RemoveOldestDeviceFromBondedList(); + apiResult = Cy_BLE_GAPP_AuthReqReply(&cy_ble_configPtr->authInfo[CY_BLE_SECURITY_CONFIGURATION_0_INDEX]); + if(apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPP_AuthReqReply API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + } + break; + + case CY_BLE_EVT_GAP_PASSKEY_ENTRY_REQUEST: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_PASSKEY_ENTRY_REQUEST:\n"); + COMM_Console_Print_String(" Please enter the passkey displayed on the peer device.\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAP_PASSKEY_DISPLAY_REQUEST: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_PASSKEY_DISPLAY_REQUEST: "); + COMM_Console_Print_UInt32(*(uint32_t *)eventParam); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAP_AUTH_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_AUTH_COMPLETE: bdHandle=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).bdHandle); + COMM_Console_Print_String(" security=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).security); + COMM_Console_Print_String(" bonding=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).bonding); + COMM_Console_Print_String(" ekeySize=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).ekeySize); + COMM_Console_Print_String(" authErr=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).authErr); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAP_AUTH_FAILED: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_AUTH_FAILED: bdHandle=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).bdHandle); + COMM_Console_Print_String(" authErr=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_auth_info_t *)eventParam).authErr); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAPP_ADVERTISEMENT_START_STOP: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAPP_ADVERTISEMENT_START_STOP: state="); + COMM_Console_Print_UInt8(Cy_BLE_GetAdvertisementState()); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + +#if 0 + if (Cy_BLE_GetAdvertisementState() == CY_BLE_ADV_STATE_STOPPED) + { + apiResult = StartNextAdvertisement(); + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPP_StartAdvertisement API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + } +#endif // 0 + break; + + case CY_BLE_EVT_GAP_DEVICE_CONNECTED: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_DEVICE_CONNECTED: connIntv="); + COMM_Console_Print_UInt16(((cy_stc_ble_gap_connected_param_t *)eventParam)->connIntv * 5u /4u); + COMM_Console_Print_String(" ms\n"); +#endif // TRACE_BLE + + /* Set security keys for new device which is not already bonded */ + if(App_IsDeviceInBondList((*(cy_stc_ble_gap_connected_param_t *)eventParam).bdHandle) == 0u) + { + keyInfo.SecKeyParam.bdHandle = (*(cy_stc_ble_gap_connected_param_t *)eventParam).bdHandle; + apiResult = Cy_BLE_GAP_SetSecurityKeys(&keyInfo); + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAP_SetSecurityKeys API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + } + break; + + case CY_BLE_EVT_GAP_DEVICE_DISCONNECTED: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_DEVICE_DISCONNECTED: bdHandle=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_disconnect_param_t *)eventParam).bdHandle); + COMM_Console_Print_String(" reason=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_disconnect_param_t *)eventParam).reason); + COMM_Console_Print_String(" status=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_gap_disconnect_param_t *)eventParam).status); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + + apiResult = StartNextAdvertisement(); + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAPP_StartAdvertisement API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + break; + + case CY_BLE_EVT_GAP_ENCRYPT_CHANGE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_ENCRYPT_CHANGE: 0x"); + COMM_Console_Print_UInt8AsHex(*(uint8_t *)eventParam); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAP_CONNECTION_UPDATE_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAPC_SCAN_START_STOP: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAPC_SCAN_START_STOP\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAP_KEYINFO_EXCHNGE_CMPLT: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAP_NUMERIC_COMPARISON_REQUEST: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_NUMERIC_COMPARISON_REQUEST:\n"); + COMM_Console_Print_String(" Compare this passkey with the one displayed in your peer device and press 'y' or 'n':\n"); + COMM_Console_Print_String(" "); + COMM_Console_Print_UInt32(*(uint32_t *)eventParam); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAP_KEYPRESS_NOTIFICATION: + case CY_BLE_EVT_GAP_OOB_GENERATED_NOTIFICATION: + case CY_BLE_EVT_GAP_ENHANCE_CONN_COMPLETE: + case CY_BLE_EVT_GAPC_DIRECT_ADV_REPORT: + case CY_BLE_EVT_GAP_SMP_NEGOTIATED_AUTH_INFO: + case CY_BLE_EVT_GAP_DEVICE_ADDR_GEN_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAP_KEYS_GEN_COMPLETE: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_KEYS_GEN_COMPLETE\n"); +#endif // TRACE_BLE + keyInfo.SecKeyParam = (*(cy_stc_ble_gap_sec_key_param_t *)eventParam); + Cy_BLE_GAP_SetIdAddress(&cy_ble_deviceAddress); + break; + + case CY_BLE_EVT_GAP_RESOLVE_DEVICE_COMPLETE: + case CY_BLE_EVT_GAP_GEN_SET_LOCAL_P256_KEYS_COMPLETE: + case CY_BLE_EVT_GAP_CREATE_CONN_CANCEL_COMPLETE: + case CY_BLE_EVT_GAP_CONN_ESTB: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GAPP_UPDATE_ADV_SCAN_DATA_COMPLETE: +#if (defined TRACE_BLE) && (defined VERBOSE_BLE_TRACE) + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAPP_UPDATE_ADV_SCAN_DATA_COMPLETE: "); + COMM_Console_Print_UInt8(*(uint8_t *)eventParam); + COMM_Console_Print_String("\n"); +#endif // (defined TRACE_BLE) && (defined VERBOSE_BLE_TRACE) + break; + + case CY_BLE_EVT_GAP_ADV_TX: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GAP_ADV_TX\n"); +#endif // TRACE_BLE + break; + + // G E N E R I C A T T R I B U T E P R O F I L E E V E N T S (0x5000 to 0x5FFF) + case CY_BLE_EVT_GATTC_ERROR_RSP: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GATTC_ERROR_RSP: opCode=0x"); + COMM_Console_Print_UInt8AsHex(((cy_stc_ble_gatt_err_param_t*)eventParam)->errInfo.opCode); + COMM_Console_Print_String(" errorCode=0x"); + COMM_Console_Print_UInt8AsHex(((cy_stc_ble_gatt_err_param_t*)eventParam)->errInfo.errorCode); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + case CY_BLE_EVT_GATT_CONNECT_IND: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GATT_CONNECT_IND: bdHandle=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_conn_handle_t *)eventParam).bdHandle); + COMM_Console_Print_String(" attId=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_conn_handle_t *)eventParam).attId); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + { + cy_stc_ble_conn_handle_t connHandle = *(cy_stc_ble_conn_handle_t*)eventParam; + appConnHandle[connHandle.attId] = *(cy_stc_ble_conn_handle_t *)eventParam; + } + break; + + case CY_BLE_EVT_GATT_DISCONNECT_IND: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GATT_DISCONNECT_IND: bdHandle=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_conn_handle_t *)eventParam).bdHandle); + COMM_Console_Print_String(" attId=0x"); + COMM_Console_Print_UInt8AsHex((*(cy_stc_ble_conn_handle_t *)eventParam).attId); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + { + cy_stc_ble_conn_handle_t connHandle = *(cy_stc_ble_conn_handle_t*)eventParam; + appConnHandle[connHandle.attId].attId = connHandle.attId; + appConnHandle[connHandle.attId].bdHandle = CY_BLE_INVALID_CONN_HANDLE_VALUE; + } + break; + + case CY_BLE_EVT_GATTS_XCNHG_MTU_REQ: + { + cy_stc_ble_gatt_xchg_mtu_param_t mtu = + { + .connHandle = ((cy_stc_ble_gatt_xchg_mtu_param_t *)eventParam)->connHandle + }; + Cy_BLE_GATT_GetMtuSize(&mtu); +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] CY_BLE_EVT_GATTS_XCNHG_MTU_REQ: bdHandle=0x"); + COMM_Console_Print_UInt8AsHex(mtu.connHandle.bdHandle); + COMM_Console_Print_String(" attId=0x"); + COMM_Console_Print_UInt8AsHex(mtu.connHandle.bdHandle); + COMM_Console_Print_String(" mtu="); + COMM_Console_Print_UInt16(mtu.mtu); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + break; + + case CY_BLE_EVT_GATTC_XCHNG_MTU_RSP: + case CY_BLE_EVT_GATTC_READ_BY_GROUP_TYPE_RSP: + case CY_BLE_EVT_GATTC_READ_BY_TYPE_RSP: + case CY_BLE_EVT_GATTC_FIND_INFO_RSP: + case CY_BLE_EVT_GATTC_FIND_BY_TYPE_VALUE_RSP: + case CY_BLE_EVT_GATTC_READ_RSP: + case CY_BLE_EVT_GATTC_READ_BLOB_RSP: + case CY_BLE_EVT_GATTC_READ_MULTI_RSP: + case CY_BLE_EVT_GATTS_WRITE_REQ: + case CY_BLE_EVT_GATTC_WRITE_RSP: + case CY_BLE_EVT_GATTS_WRITE_CMD_REQ: + case CY_BLE_EVT_GATTS_PREP_WRITE_REQ: + case CY_BLE_EVT_GATTS_EXEC_WRITE_REQ: + case CY_BLE_EVT_GATTC_EXEC_WRITE_RSP: + case CY_BLE_EVT_GATTC_HANDLE_VALUE_NTF: + case CY_BLE_EVT_GATTC_HANDLE_VALUE_IND: + case CY_BLE_EVT_GATTS_HANDLE_VALUE_CNF: + case CY_BLE_EVT_GATTS_DATA_SIGNED_CMD_REQ: + case CY_BLE_EVT_GATTC_STOP_CMD_COMPLETE: + case CY_BLE_EVT_GATTS_READ_CHAR_VAL_ACCESS_REQ: + case CY_BLE_EVT_GATTC_LONG_PROCEDURE_END: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt16AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + + default: +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Unhandled event: "); + COMM_Console_Print_UInt32AsHex(event); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + break; + } + } +} + +/******************************************************************************* +* Function Name: IasEventHandler +******************************************************************************** +* +* Summary: +* This is an event callback function to receive events from the BLE Component, +* which are specific to Immediate Alert Service. +* +* Parameters: +* event: Write Command event from the BLE component. +* eventParams: A structure instance of CY_BLE_GATT_HANDLE_VALUE_PAIR_T type. +* +*******************************************************************************/ +static void IASEventHandler(uint32 event, void * eventParam) +{ + (void) eventParam; + uint8_t alert; + + /* Alert Level Characteristic write event */ + if (event == CY_BLE_EVT_IASS_WRITE_CHAR_CMD) + { + /* Read the updated Alert Level value from the GATT database */ + Cy_BLE_IASS_GetCharacteristicValue(CY_BLE_IAS_ALERT_LEVEL, sizeof(alert), &alert); + COMM_BLE_IASAlertLevel = alert; + } +} + +static cy_en_ble_api_result_t StartNextAdvertisement() +{ + static uint8_t Current_Advertising_Index = CY_BLE_PERIPHERAL_CONFIGURATION_0_INDEX; + cy_en_ble_api_result_t apiResult; + + apiResult = Cy_BLE_GAPP_StartAdvertisement(CY_BLE_ADVERTISING_FAST, Current_Advertising_Index); + + if(apiResult == CY_BLE_SUCCESS) + { + if (Current_Advertising_Index == CY_BLE_PERIPHERAL_CONFIGURATION_0_INDEX) + { + Current_Advertising_Index = CY_BLE_BROADCASTER_CONFIGURATION_0_INDEX; + COMM_Console_Print_String("CY_BLE_BROADCASTER_CONFIGURATION_0_INDEX\n"); + } + else + { + Current_Advertising_Index = CY_BLE_PERIPHERAL_CONFIGURATION_0_INDEX; + COMM_Console_Print_String("CY_BLE_PERIPHERAL_CONFIGURATION_0_INDEX\n"); + } + } + + return apiResult; +} diff --git a/2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE.h b/2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE.h new file mode 100644 index 0000000..83701e6 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE.h @@ -0,0 +1,79 @@ +/** \dir "BLE" + * + * \brief This directory contains source code for managing Bluetooth Low Energy communications. + * + */ + +/** \file + * \brief This file defines the interface to the Bluetooth Low Energy communications used by this software. + * + */ + +#ifndef COMM_BLE_H +#define COMM_BLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +// Define this to print out BLE trace statements to the console. +//#define TRACE_BLE +//#define VERBOSE_BLE_TRACE + +#define COMM_BLE_TASK_STACK_SIZE_in_bytes 4096 + +typedef enum +{ + COMM_BLE_DEFAULT, + COMM_BLE_INITIALIZING, + COMM_BLE_IDLE, + COMM_BLE_SCANNING_FOR_KTAG_PACKETS, + COMM_BLE_ADVERTISING_AS_PERIPHERAL, + COMM_BLE_ADVERTISING_AS_BROADCASTER, + COMM_BLE_SCANNING_AND_ADVERTISING +} COMM_BLE_StateID_T; + +typedef enum +{ + COMM_BLE_COMMAND_NO_OP, + COMM_BLE_REQUEST_STATE_CHANGE, + COMM_BLE_PROCESS_BLE_EVENTS, + COMM_BLE_SCAN_FOR_KTAG_PACKETS, + COMM_BLE_ADVERTISE_AS_BROADCASTER, + COMM_BLE_ADVERTISE_AS_PERIPHERAL, + COMM_BLE_STOP_ADVERTISING, + COMM_BLE_SCAN_AND_ADVERTISE, + // COMM_BLE_COMMAND_IS_OUT_OF_RANGE is one more than the last valid command. + COMM_BLE_COMMAND_IS_OUT_OF_RANGE +} COMM_BLE_Command_ID_T; + +typedef struct +{ + COMM_BLE_Command_ID_T ID; + void * Data; +} COMM_BLE_Command_T; + +/* Include Files */ + +/* Public Variables */ + +extern cy_stc_ble_conn_handle_t appConnHandle[CY_BLE_CONN_COUNT]; +extern volatile uint8_t COMM_BLE_IASAlertLevel; + +extern QueueHandle_t COMM_BLE_CommandQueue; + +//! Handle of the COMM_BLE_Task() given when the task was created. +extern TaskHandle_t COMM_BLE_Task_Handle; + +/* Public Functions */ +void COMM_BLE_Init(void); +void COMM_BLE_Task(void * pvParameters); +void COMM_BLE_RequestState(COMM_BLE_StateID_T state); + +#ifdef __cplusplus +} +#endif + +#endif // COMM_BLE_H diff --git a/2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE_Bond.c b/2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE_Bond.c new file mode 100644 index 0000000..ece43a5 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE_Bond.c @@ -0,0 +1,252 @@ +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +/* Public Variables */ + +/* Private Variables */ + +static bool removeBondListFlag = false; + +/* Private Function Prototypes */ + +/* Public Functions */ + +/******************************************************************************* +* Function Name: App_DisplayBondList() +******************************************************************************** +* +* Summary: +* This function displays the bond list. +* +*******************************************************************************/ +void App_DisplayBondList(void) +{ +#ifdef TRACE_BLE + cy_en_ble_api_result_t apiResult; + cy_stc_ble_gap_peer_addr_info_t bondedDeviceInfo[CY_BLE_MAX_BONDED_DEVICES]; + cy_stc_ble_gap_bonded_device_list_info_t bondedDeviceList = + { + .bdHandleAddrList = bondedDeviceInfo + }; + uint8_t deviceCount; + + /* Find out whether the device has bonded information stored already or not */ + apiResult = Cy_BLE_GAP_GetBondList(&bondedDeviceList); + if (apiResult != CY_BLE_SUCCESS) + { + COMM_Console_Print_String("[BLE] Cy_BLE_GAP_GetBondList API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); + } + else + { + deviceCount = bondedDeviceList.noOfDevices; + + if(deviceCount != 0u) + { + uint8_t counter; + + COMM_Console_Print_String("[BLE] Bond list:\n"); + + do + { + COMM_Console_Print_String(" "); + COMM_Console_Print_UInt8(deviceCount); + COMM_Console_Print_String(". "); + + deviceCount--; + + if(bondedDeviceList.bdHandleAddrList[deviceCount].bdAddr.type == CY_BLE_GAP_ADDR_TYPE_RANDOM) + { + COMM_Console_Print_String("Peer Random Address:"); + } + else + { + COMM_Console_Print_String("Peer Public Address:"); + } + + for (counter = CY_BLE_GAP_BD_ADDR_SIZE; counter > 0u; counter--) + { + COMM_Console_Print_String(" "); + COMM_Console_Print_UInt8AsHex(bondedDeviceList.bdHandleAddrList[deviceCount].bdAddr.bdAddr[counter - 1u]); + } + COMM_Console_Print_String(", bdHandle: 0x"); + COMM_Console_Print_UInt8AsHex(bondedDeviceList.bdHandleAddrList[deviceCount].bdHandle); + COMM_Console_Print_String("\n"); + } while (deviceCount != 0u); + COMM_Console_Print_String("\n"); + } + } +#endif // TRACE_BLE +} + + +/******************************************************************************* +* Function Name: App_RemoveDevidesFromBondList +******************************************************************************** +* +* Summary: +* Remove devices from the bond list. +* +*******************************************************************************/ +void App_RemoveDevicesFromBondList(void) +{ +#if(CY_BLE_BONDING_REQUIREMENT == CY_BLE_BONDING_YES) + cy_en_ble_api_result_t apiResult; + cy_stc_ble_gap_bd_addr_t peerBdAddr = { .type = 0u }; +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cleaning Bond List...\n\n"); +#endif // TRACE_BLE + + /* Remove all bonded devices in the list */ + apiResult = Cy_BLE_GAP_RemoveBondedDevice(&peerBdAddr); + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAP_RemoveBondedDevice API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + else + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAP_RemoveBondedDevice complete.\n\n"); +#endif // TRACE_BLE + } +#else +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Bonding is disabled...no need to remove bonded devices.\n\n"); +#endif // TRACE_BLE +#endif /* (CY_BLE_BONDING_REQUIREMENT == CY_BLE_BONDING_YES) */ + + /* Clean flag */ + removeBondListFlag = false; +} + + +/******************************************************************************* +* Function Name: App_GetCountOfBondedDevices() +******************************************************************************** +* +* Summary: +* This function returns the count of bonded devices +* +* Return: +* uint32_t The count of bonded devices +* +*******************************************************************************/ +uint32_t App_GetCountOfBondedDevices(void) +{ + cy_en_ble_api_result_t apiResult; + cy_stc_ble_gap_peer_addr_info_t bondedDeviceInfo[CY_BLE_MAX_BONDED_DEVICES]; + cy_stc_ble_gap_bonded_device_list_info_t bondedDeviceList = + { + .bdHandleAddrList = bondedDeviceInfo + }; + uint32_t deviceCount = 0u; + + /* Find out whether the device has bonded information stored already or not */ + apiResult = Cy_BLE_GAP_GetBondList(&bondedDeviceList); + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAP_GetBondList API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + else + { + deviceCount = bondedDeviceList.noOfDevices; + } + + return (deviceCount); +} + + +/******************************************************************************* +* Function Name: App_IsDeviceInBondList() +******************************************************************************** +* +* Summary: +* This function check if device with bdHandle is in the bond list +* +* Parameters: +* bdHandle - bond device handler +* +* Return: +* bool - true value when bdHandle exists in bond list +* +*******************************************************************************/ +bool App_IsDeviceInBondList(uint32_t bdHandle) +{ + cy_en_ble_api_result_t apiResult; + cy_stc_ble_gap_peer_addr_info_t bondedDeviceInfo[CY_BLE_MAX_BONDED_DEVICES]; + cy_stc_ble_gap_bonded_device_list_info_t bondedDeviceList = + { + .bdHandleAddrList = bondedDeviceInfo + }; + bool deviceIsDetected = false; + uint32_t deviceCount; + + /* Find out whether the device has bonding information stored already or not */ + apiResult = Cy_BLE_GAP_GetBondList(&bondedDeviceList); + if (apiResult != CY_BLE_SUCCESS) + { +#ifdef TRACE_BLE + COMM_Console_Print_String("[BLE] Cy_BLE_GAP_GetBondList API Error: 0x"); + COMM_Console_Print_UInt32AsHex(apiResult); + COMM_Console_Print_String("\n"); +#endif // TRACE_BLE + } + else + { + deviceCount = bondedDeviceList.noOfDevices; + + if(deviceCount != 0u) + { + do + { + deviceCount--; + if(bdHandle == bondedDeviceList.bdHandleAddrList[deviceCount].bdHandle) + { + deviceIsDetected = 1u; + } + } while(deviceCount != 0u); + } + } + return(deviceIsDetected); +} + +/******************************************************************************* +* Function Name: App_SetRemoveBondListFlag() +******************************************************************************** +* Summary: +* Set flag for removing bond list +* +*******************************************************************************/ +void App_SetRemoveBondListFlag(void) +{ + removeBondListFlag = true; +} + +/******************************************************************************* +* Function Name: App_IsRemoveBondListFlag() +******************************************************************************** +* Summary: +* Get value of remove bond list flag +* +* Return: +* true - remove bond list flag is set +* false - remove bond list flag is clear +* +*******************************************************************************/ +bool App_IsRemoveBondListFlag(void) +{ + return ((removeBondListFlag == true) ? true : false); +} + +/* Private Functions */ diff --git a/2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE_Bond.h b/2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE_Bond.h new file mode 100644 index 0000000..ef5f43b --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE_Bond.h @@ -0,0 +1,32 @@ +/** \file + * \brief This file declares Bluetooth Low Energy bond list helper functions. + * + */ + +#ifndef COMM_BLE_BOND_H +#define COMM_BLE_BOND_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +/* Include Files */ + +/* Public Variables */ + +/* Public Functions */ +void App_DisplayBondList(void); +void App_RemoveDevicesFromBondListBySW2Press(uint32_t seconds); +void App_RemoveDevicesFromBondList(void); +void App_SetRemoveBondListFlag(void); +bool App_IsRemoveBondListFlag(void); +bool App_IsDeviceInBondList(uint32_t bdHandle); +uint32_t App_GetCountOfBondedDevices(void); + +#ifdef __cplusplus +} +#endif + +#endif // COMM_BLE_BOND_H diff --git a/2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE_UART.c b/2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE_UART.c new file mode 100644 index 0000000..a50ed0f --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE_UART.c @@ -0,0 +1,177 @@ +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +#define UART_CIRCULAR_BUFFER_SIZE 1024 +#define BLE_UART_BUFFER_CHARACTERISTIC_SIZE 20 + +/* Public Variables */ + +/* Private Variables */ + +static uint_fast16_t UART_Tx_Notifications_Enabled = 0; + +static uint8_t UART_Tx_Buffer_Storage[UART_CIRCULAR_BUFFER_SIZE]; +static UTIL_CircularBuffer_T UART_Tx_Buffer; +static uint8_t BLE_UART_Tx_Buffer[BLE_UART_BUFFER_CHARACTERISTIC_SIZE]; +static uint8_t Rx_Buffer[BLE_UART_BUFFER_CHARACTERISTIC_SIZE + 1]; + +/* Private Function Prototypes */ + +/* Public Functions */ + +void COMM_BLE_UART_Init(void) +{ + UTIL_InitCircularBuffer(&UART_Tx_Buffer, UART_Tx_Buffer_Storage, UART_CIRCULAR_BUFFER_SIZE); +} + +//! Sends a message over the BLE UART. +void COMM_BLE_UART_PutString(const char8 * string, uint16_t length) +{ + for (uint8_t i = 0; i < length; i++) + { + (void) UTIL_PushToCircularBuffer(&UART_Tx_Buffer, *string++); + } +} + +//! Sends a single character over the BLE UART. +void COMM_BLE_UART_PutChar(char8 character) +{ + (void) UTIL_PushToCircularBuffer(&UART_Tx_Buffer, character); +} + +void COMM_BLE_UART_MaybeSendData(void) +{ + int8_t length = 0; + + if (UTIL_IsCircularBufferEmpty(&UART_Tx_Buffer) == false) + { + while ((length < BLE_UART_BUFFER_CHARACTERISTIC_SIZE) && (UTIL_IsCircularBufferEmpty(&UART_Tx_Buffer) == false)) + { + uint8_t value; + if (UTIL_PopFromCircularBuffer(&UART_Tx_Buffer, &value) == UTIL_CIRCULARBUFFERRESULT_SUCCESS) + { + BLE_UART_Tx_Buffer[length] = value; + length++; + } + } + } + + if (length > 0) + { + for (uint_fast8_t i = 0; i < CY_BLE_CONN_COUNT; i++) + { + if (Cy_BLE_GetConnectionState(appConnHandle[i]) >= CY_BLE_CONN_STATE_CONNECTED) + { + cy_stc_ble_gatt_handle_value_pair_t tempHandle; + + tempHandle.attrHandle = CY_BLE_NORDIC_UART_SERVICE_TX_CHAR_HANDLE; + tempHandle.value.val = (uint8 *) BLE_UART_Tx_Buffer; + tempHandle.value.actualLen = length; + tempHandle.value.len = length; + + Cy_BLE_GATTS_WriteAttributeValueLocal(&tempHandle); + } + } + + // Send notification to each client that has TX notifications enabled. + for (uint_fast8_t i = 0; i < CY_BLE_CONN_COUNT; i++) + { + if ((Cy_BLE_GetConnectionState(appConnHandle[i]) >= CY_BLE_CONN_STATE_CONNECTED) && + Cy_BLE_GATTS_IsNotificationEnabled(&appConnHandle[i], + CY_BLE_NORDIC_UART_SERVICE_TX_TXCCCD_DESC_HANDLE)) + { + cy_stc_ble_gatt_handle_value_pair_t tempHandle; + + tempHandle.attrHandle = CY_BLE_NORDIC_UART_SERVICE_TX_CHAR_HANDLE; + tempHandle.value.val = (uint8 *) BLE_UART_Tx_Buffer; + tempHandle.value.actualLen = length; + tempHandle.value.len = length; + + Cy_BLE_GATTS_SendNotification(&appConnHandle[i], &tempHandle); + } + } + } +} + +//! BLE event handler for the BLE UART feature. +/*! + * This function should be called *before* events are handled in the event handler passed to + * Cy_BLE_Start(). If it returns `false`, then the rest of the event handler should proceed. + * + * \param event BLE stack event code received from the BLE middleware (one of cy_en_ble_event_t). + * \param eventParam pointer to an event-specific data structure containing the relevant event information. + * \return true if this handler has completely handled the event, and no further + * handling is necessary; false otherwise. + */ +bool COMM_BLE_UART_HandleEvent(uint32 event, void * eventParam) +{ + static cy_stc_ble_gatts_write_cmd_req_param_t * writeReqParameter; + bool handled = false; + + /* Take an action based on the current event */ + switch ((cy_en_ble_event_t)event) + { + // Handle a write request. + case CY_BLE_EVT_GATTS_WRITE_REQ: + + writeReqParameter = (cy_stc_ble_gatts_write_cmd_req_param_t*)eventParam; + + // Request to write the UART. + // https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk5.v15.2.0%2Fble_sdk_app_nus_eval.html&cp=5_5_0_4_1_2_24 + if (writeReqParameter->handleValPair.attrHandle == CY_BLE_NORDIC_UART_SERVICE_RX_CHAR_HANDLE) + { + // Only update the value and write the response if the requested write is allowed. + if (CY_BLE_GATT_ERR_NONE == Cy_BLE_GATTS_WriteAttributeValuePeer(&writeReqParameter->connHandle, &writeReqParameter->handleValPair)) + { + uint16_t i; + + for (i = 0; (i < BLE_UART_BUFFER_CHARACTERISTIC_SIZE) && (i < writeReqParameter->handleValPair.value.len); i++) + { + Rx_Buffer[i] = writeReqParameter->handleValPair.value.val[i]; + } + + // NULL-terminate the buffer. + Rx_Buffer[i] = 0x00; + + Cy_BLE_GATTS_WriteRsp(writeReqParameter->connHandle); + + COMM_Console_Execute_Internal_Command(Rx_Buffer); + } + + handled = true; + } + + // Request for UART Tx notifications. + if (writeReqParameter->handleValPair.attrHandle == CY_BLE_NORDIC_UART_SERVICE_TX_TXCCCD_DESC_HANDLE) + { + if (CY_BLE_GATT_ERR_NONE == Cy_BLE_GATTS_WriteAttributeValuePeer(&writeReqParameter->connHandle, &writeReqParameter->handleValPair)) + { + UART_Tx_Notifications_Enabled = writeReqParameter->handleValPair.value.val[0] & 0x01; + + if (UART_Tx_Notifications_Enabled) + { + COMM_Console_Print_String("[BLE] UART Tx notifications enabled.\n"); + } + else + { + COMM_Console_Print_String("[BLE] UART Tx notifications disabled.\n"); + } + + Cy_BLE_GATTS_WriteRsp(writeReqParameter->connHandle); + } + + handled = true; + } + break; + + default: + // (`handled` is already set to false.) + break; + } + + return handled; +} + +/* Private Functions */ diff --git a/2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE_UART.h b/2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE_UART.h new file mode 100644 index 0000000..b0f924e --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/BLE/COMM_BLE_UART.h @@ -0,0 +1,30 @@ +/** \file + * \brief This file declares interface functions to a BLE UART implementation. + * + */ + +#ifndef COMM_BLE_UART_H +#define COMM_BLE_UART_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +/* Include Files */ + +/* Public Variables */ + +/* Public Functions */ +void COMM_BLE_UART_Init(void); +void COMM_BLE_UART_PutString(const char8 * string, uint16_t length); +void COMM_BLE_UART_PutChar(char8 character); +void COMM_BLE_UART_MaybeSendData(void); +bool COMM_BLE_UART_HandleEvent(uint32 event, void * eventParam); + +#ifdef __cplusplus +} +#endif + +#endif // COMM_BLE_UART_H \ No newline at end of file diff --git a/2020TPCAppNoDFU.cydsn/COMM/COMM.h b/2020TPCAppNoDFU.cydsn/COMM/COMM.h new file mode 100644 index 0000000..269a3bf --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/COMM.h @@ -0,0 +1,50 @@ +/** \dir "COMM" + * + * \brief This directory contains source code for the communication interfaces used by this software. + * + */ + +/** \file + * \brief This file defines the interface to the communications used by this software. + * + * This file should be included by any file outside the COMM package wishing to make use + * of any of the configuration information provided by the COMM package. + * + */ + +#ifndef COMM_H +#define COMM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Include Files */ +#include "COMM_IPC_Messages.h" +#include "BLE/COMM_BLE.h" +#include "BLE/COMM_BLE_Bond.h" +#include "BLE/COMM_BLE_UART.h" +#include "COMM_Console.h" +#include "COMM_Console_Util.h" +#include "COMM_I2C_Bus.h" +#include "COMM_Util.h" +#include "ConsoleCommands/COMM_ConsoleCommands.h" +#include "ConsoleCommands/COMM_BLE_ConsoleCommands.h" +#include "ConsoleCommands/COMM_NVM_ConsoleCommands.h" +#include "ConsoleCommands/COMM_RTOS_ConsoleCommands.h" +#include "ConsoleCommands/COMM_STATE_ConsoleCommands.h" + +/* Preprocessor and Type Definitions */ + +#define DebugPrintf(...) +#define Task_DebugPrintf(...) + +/* Public Variables */ + +/* Public Functions */ + +#ifdef __cplusplus +} +#endif + +#endif // COMM_H diff --git a/2020TPCAppNoDFU.cydsn/COMM/COMM_Console.c b/2020TPCAppNoDFU.cydsn/COMM/COMM_Console.c new file mode 100644 index 0000000..1d612b3 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/COMM_Console.c @@ -0,0 +1,639 @@ +/** \file + * \brief This file implements a simple serial debug console and command interpreter. + */ + +/** \defgroup CONSOLE Console + * + * \brief Serial debug console command interpreter. + * + * \todo Describe the command interpreter. + * + * @{ + * @} + */ + +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +//! Text representations of numeric digits, used by COMM_Console_Print_UInt32(). +static const char8 DIGITS[] = "0123456789ABCDEF"; + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +//! Maximum number of characters (save one) able to be printed by COMM_Console_Print_String(). +#define MAX_CONSOLE_STRING_LENGTH 81 + +//! States in the COMM_Console_Task() state machine. +typedef enum +{ + COMM_STATE_INITIALIZING = 0, + COMM_STATE_DISPLAY_POWERUP_INFO, + COMM_STATE_IDLE, + COMM_STATE_COMMAND_TOO_LONG, + COMM_STATE_IDENTIFY_COMMAND, + COMM_STATE_EXECUTE_COMMAND, + COMM_STATE_UNKNOWN_COMMAND +} COMM_Console_State_T; + +/* Public Variables */ +char8 Command_Buffer[COMM_CONSOLE_COMMAND_MAX_LENGTH]; +uint_fast16_t Command_Buffer_Index = 0; +TaskHandle_t COMM_Console_Task_Handle; + +/* Private Variables */ + +//! Current state of the COMM_Console_Task() state machine. +static COMM_Console_State_T Current_State = COMM_STATE_INITIALIZING; + +//! Next state of the COMM_Console_Task() state machine. +static COMM_Console_State_T Next_State = COMM_STATE_INITIALIZING; + +//! Index into the #COMM_Console_Command_Table for the command currently being handled. +/*! + * If #Current_Command is set to UINT_FAST16_MAX, the command being handled is unknown, or no command is being handled. + */ +static uint_fast16_t Current_Command = 0; + +/* Private Function Prototypes */ + +static void ConsoleISR(void); +static bool ConsoleCommandMatches(const char8 * const command_name); +static void ReverseString(char8 * value, uint32_t length); + +/* Inline Functions */ + +//! Swaps the characters in x and y. +static inline void Swap_Char8(char8 * x, char8 * y) +{ + uint8_t temp = *x; + *x = *y; + *y = temp; + } + +static inline void Reset_Command_Buffer() +{ + taskENTER_CRITICAL(); + for (uint_fast16_t i = 0; i < COMM_CONSOLE_COMMAND_MAX_LENGTH; i++) + { + Command_Buffer[i] = COMM_CONSOLE_STRING_TERMINATOR; + } + Command_Buffer_Index = 0; + taskEXIT_CRITICAL(); +} + +/* Public Functions */ + +//! Initializes the console. +/*! + * \ingroup CONSOLE + */ +void COMM_Console_Init(void) +{ + // Enable the pullup on the Rx pin to keep the noise down. + Cy_GPIO_SetDrivemode(UART_Console_rx_PORT, UART_Console_rx_NUM, CY_GPIO_DM_PULLUP); + UART_Console_Start(); + + /// Unmask only the RX FIFO not empty interrupt bit. + UART_Console_HW->INTR_RX_MASK = SCB_INTR_RX_MASK_NOT_EMPTY_Msk; + Cy_SysInt_Init(&Int_UART_Console_cfg, ConsoleISR); + NVIC_ClearPendingIRQ(Int_UART_Console_cfg.intrSrc); + NVIC_EnableIRQ(Int_UART_Console_cfg.intrSrc); +} + +//! Parses and handle console commands in the background. +/*! + * \ingroup CONSOLE + * + * The [UML State Machine Diagram](http://www.uml-diagrams.org/state-machine-diagrams.html) below + * shows how the console messages processed by this code. Note that all of the *Character Rx'd* + * transitions occur in the #UART_Console_SPI_UART_ISR_EntryCallback() itself on the PSoC4, in + * #ConsoleRxISR() on the PSoC5, and in #ConsoleISR() on the PSoC6, to improve overall performance. + * + * \startuml{COMM_Console_Task.png} "Console Task" + * + * skinparam headerFontSize 18 + * skinparam state { + * BackgroundColor #eeeeee + * BackgroundColor<> #ffaaaa + * FontName Impact + * FontSize 18 + * } + * skinparam note { + * FontName "Comic Sans MS" + * FontStyle italic + * } + * + * state "Initializing" as STATE_INITIALIZING + * [*] --> STATE_INITIALIZING + * note left of STATE_INITIALIZING : Wait for the rest of the system to come online. + * state "Display Powerup Info" as STATE_DISPLAY_POWERUP_INFO + * STATE_DISPLAY_POWERUP_INFO : do/ print OS version + * STATE_DISPLAY_POWERUP_INFO : do/ print configuration (debug or release) + * STATE_INITIALIZING --> STATE_DISPLAY_POWERUP_INFO : after(100ms) + * state "Idle" as STATE_IDLE + * STATE_IDLE : do/ RTOS_Sleep() + * STATE_DISPLAY_POWERUP_INFO --> STATE_IDLE + * state STATE_IS_EOM <> + * note top of STATE_IS_EOM : This happens in\nUART_Console_SPI_UART_ISR_ExitCallback() on PSoC4,\nConsoleRxISR() on PSoC5,\nand ConsoleISR() on PSoC6. + * STATE_IDLE --> STATE_IS_EOM : character rx'd + * state STATE_IS_COMMAND_BUFFER_FULL <> + * note top of STATE_IS_COMMAND_BUFFER_FULL : This happens in\nUART_Console_SPI_UART_ISR_ExitCallback() on PSoC4,\nConsoleRxISR() on PSoC5,\nand ConsoleISR() on PSoC6. + * STATE_IS_EOM --> STATE_IS_COMMAND_BUFFER_FULL : [else] + * state "Identify Command" as STATE_IDENTIFY_COMMAND + * STATE_IDENTIFY_COMMAND : do/ look for command in the COMM_Console_Command_Table[] + * STATE_IS_EOM --> STATE_IDENTIFY_COMMAND : [rx'd character is EOM] + * STATE_IDLE --> STATE_IDENTIFY_COMMAND : COMM_Console_Execute_Internal_Command() + * state "Command Too Long" as STATE_COMMAND_TOO_LONG + * STATE_COMMAND_TOO_LONG : do/ print error message + * STATE_COMMAND_TOO_LONG : do/ reset command buffer + * STATE_IS_COMMAND_BUFFER_FULL --> STATE_COMMAND_TOO_LONG : [command buffer is full] + * STATE_IS_COMMAND_BUFFER_FULL --> STATE_IDLE : [else]/\nAppend received character to command buffer + * STATE_COMMAND_TOO_LONG --> STATE_IDLE + * state "Execute Command" as STATE_EXECUTE_COMMAND + * STATE_EXECUTE_COMMAND : do/ execute console command + * STATE_EXECUTE_COMMAND : exit/ reset command buffer + * STATE_EXECUTE_COMMAND --> STATE_IDLE + * STATE_IDENTIFY_COMMAND --> STATE_EXECUTE_COMMAND : [command matched] + * state "Unknown Command" as STATE_UNKNOWN_COMMAND + * STATE_UNKNOWN_COMMAND : do/ print error message + * STATE_UNKNOWN_COMMAND : do/ reset command buffer + * STATE_IDENTIFY_COMMAND --> STATE_UNKNOWN_COMMAND : [else] + * STATE_UNKNOWN_COMMAND --> STATE_IDLE + * + * left footer Key: UML 2.5\nLast modified 2020-12-14 + * \enduml + * + * \return None (infinite loop) + */ +void COMM_Console_Task(void * pvParameters) +{ + static TickType_t xTicksToWait = pdMS_TO_TICKS(10); + static uint32_t * NotificationValue; + + while(true) + { + (void) xTaskNotifyWait(0, 0, (uint32_t *)&NotificationValue, xTicksToWait); + + // Change to the next state atomically. + taskENTER_CRITICAL(); + Current_State = Next_State; + taskEXIT_CRITICAL(); + + switch (Current_State) + { + default: + case COMM_STATE_INITIALIZING: + Next_State = COMM_STATE_DISPLAY_POWERUP_INFO; + vTaskDelay(pdMS_TO_TICKS(10)); + xTicksToWait = 1; + break; + + case COMM_STATE_DISPLAY_POWERUP_INFO: + COMM_Console_Print_String("[COMM] "); + COMM_RTOS_HandleConsoleVersion(NULL, 0); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String("[COMM] Console ready (awaiting commands).\n"); + Next_State = COMM_STATE_IDLE; + xTicksToWait = 1; + break; + + case COMM_STATE_IDLE: + xTicksToWait = pdMS_TO_TICKS(100); + break; + + case COMM_STATE_COMMAND_TOO_LONG: + COMM_Console_Print_String("[COMM] ERROR: Command \""); + COMM_Console_Print_String(Command_Buffer); + COMM_Console_Print_String("\" too long!\n"); + Reset_Command_Buffer(); + Next_State = COMM_STATE_IDLE; + xTicksToWait = 1; + break; + + case COMM_STATE_IDENTIFY_COMMAND: + Current_Command = UINT_FAST16_MAX; + + for (uint_fast16_t i = 0; i < COMM_N_CONSOLE_COMMANDS; i++) + { + if (ConsoleCommandMatches(COMM_Console_Command_Table[i].Command_Name) == true) + { + Current_Command = i; + Next_State = COMM_STATE_EXECUTE_COMMAND; + xTicksToWait = 1; + break; + } + } + + if (Current_Command == UINT_FAST16_MAX) + { + // No matching command was found. + Next_State = COMM_STATE_UNKNOWN_COMMAND; + xTicksToWait = 1; + } + break; + + case COMM_STATE_EXECUTE_COMMAND: + if (COMM_Console_Command_Table[Current_Command].Execute_Command != NULL) + { + COMM_Console_Command_Result_T result = COMM_Console_Command_Table[Current_Command].Execute_Command(Command_Buffer, Command_Buffer_Index); + + if (result == COMM_CONSOLE_CMD_RESULT_PARAMETER_ERROR) + { + COMM_Console_Print_String("ERROR: Parameter error!\n"); + } + } + Reset_Command_Buffer(); + Next_State = COMM_STATE_IDLE; + xTicksToWait = 1; + break; + + case COMM_STATE_UNKNOWN_COMMAND: + COMM_Console_Print_String("ERROR: Command \""); + COMM_Console_Print_String(Command_Buffer); + COMM_Console_Print_String("\" not recognized! Try '?' for help.\n"); + Reset_Command_Buffer(); + Next_State = COMM_STATE_IDLE; + xTicksToWait = 1; + break; + } + } +} + +SystemKResult_T HW_Execute_Console_Command(const uint8_t * const command) +{ + COMM_Console_Execute_Internal_Command(command); + + return SYSTEMK_RESULT_SUCCESS; +} + +//! Executes a (potentially cross-task) console command. +/*! + * This function is used to initiate a console command from a software source internal to this + * CPU. This provides a way to use preexisting console commands on TX-only consoles. + * + * \note If two calls to this function are made back-to-back (before the COMM_Console_Task() has an + * opportunity to run), only the second command will be executed, as it will have overwritten the + * first. Allow time for the console commands to execute between calls to this function. + * + * \param command String containing the command to be executed. + */ +void COMM_Console_Execute_Internal_Command(const uint8_t * const command) +{ + bool finished = false; + uint_fast16_t i = 0; + + taskENTER_CRITICAL(); + while ( (finished == false) && + (i < COMM_CONSOLE_COMMAND_MAX_LENGTH) && + (command[i] != COMM_CONSOLE_END_OF_MESSAGE ) && + (command[i] != COMM_CONSOLE_STRING_TERMINATOR ) + ) + { + Command_Buffer[i] = command[i]; + i++; + } + Command_Buffer_Index = i; + + // If there is still room, terminate the command. + if (i < COMM_CONSOLE_COMMAND_MAX_LENGTH) + { + Command_Buffer[i] = COMM_CONSOLE_END_OF_MESSAGE; + } + taskEXIT_CRITICAL(); + + Next_State = COMM_STATE_IDENTIFY_COMMAND; + xTaskNotifyGive(COMM_Console_Task_Handle); +} + +//! Prints a NULL-terminated string to the serial console. +void COMM_Console_Print_String(const char8 * const text) +{ + for (size_t i = 0; i < MAX_CONSOLE_STRING_LENGTH; i++) + { + // Check for the end of the string. If there is no NULL terminator, up to + // MAX_CONSOLE_STRING_LENGTH characters of randomness will be printed. + if (text[i] == COMM_CONSOLE_STRING_TERMINATOR) + { + break; + } + + // Send out the string, one character at a time. + COMM_Console_PutChar(text[i]); + } +} + +//! Prints a 32-bit unsigned integer to the serial console. +void COMM_Console_Print_UInt32(uint32_t value) +{ + // The largest string for a unit32_t is 10 characters (4294967296). + char8 buffer[10+1]; + uint_fast8_t buffer_index = 0; + + while (value > 9) + { + uint8_t digit_index = value % 10; + buffer[buffer_index] = DIGITS[digit_index]; + value = value / 10; + buffer_index++; + } + buffer[buffer_index] = DIGITS[value]; + buffer_index++; + ReverseString(buffer, buffer_index); + + // NULL-terminate the string. + buffer[buffer_index] = 0; + + COMM_Console_Print_String(buffer); +} + +//! Prints a 32-bit signed integer to the serial console. +void COMM_Console_Print_SInt32(int32_t value) +{ + if (value < 0) + { + value *= -1; + COMM_Console_PutChar('-'); + } + + COMM_Console_Print_UInt32(value); +} + +//! Prints a 32-bit unsigned integer to the serial console using a hexadecimal representation. +void COMM_Console_Print_UInt32AsHex(uint32_t value) +{ + // The largest hexadecimal string for a unit32_t is 8 characters (FFFFFFFF). + char8 buffer[8+1]; + uint_fast8_t buffer_index = 0; + + while (value > 15) + { + uint8_t digit_index = value % 16; + buffer[buffer_index] = DIGITS[digit_index]; + value = value / 16; + buffer_index++; + } + buffer[buffer_index] = DIGITS[value]; + buffer_index++; + ReverseString(buffer, buffer_index); + + // NULL-terminate the string. + buffer[buffer_index] = 0; + + COMM_Console_PutChar('0'); + COMM_Console_PutChar('x'); + COMM_Console_Print_String(buffer); +} + +//! Prints a 64-bit unsigned integer to the serial console. +void COMM_Console_Print_UInt64(uint64_t value) +{ + // The largest string for a unit64_t is 20 characters (18446744073709551615). + char8 buffer[20+1]; + uint_fast8_t buffer_index = 0; + + while (value > 9) + { + uint8_t digit_index = value % 10; + buffer[buffer_index] = DIGITS[digit_index]; + value = value / 10; + buffer_index++; + } + buffer[buffer_index] = DIGITS[value]; + buffer_index++; + ReverseString(buffer, buffer_index); + + // NULL-terminate the string. + buffer[buffer_index] = 0; + + COMM_Console_Print_String(buffer); +} + +//! Prints a 64-bit unsigned integer to the serial console using a hexadecimal representation. +void COMM_Console_Print_UInt64AsHex(uint64_t value) +{ + // The largest hexadecimal string for a unit64_t is 16 characters (FFFFFFFFFFFFFFFF). + char8 buffer[16+1]; + uint_fast8_t buffer_index = 0; + + while (value > 15) + { + uint8_t digit_index = value % 16; + buffer[buffer_index] = DIGITS[digit_index]; + value = value / 16; + buffer_index++; + } + buffer[buffer_index] = DIGITS[value]; + buffer_index++; + ReverseString(buffer, buffer_index); + + // NULL-terminate the string. + buffer[buffer_index] = 0; + + COMM_Console_PutChar('0'); + COMM_Console_PutChar('x'); + COMM_Console_Print_String(buffer); +} + +//! Prints a floating-point number to the serial console. +/*! + * With thanks to Rick Regan and his [Quick and Dirty Floating-Point to Decimal Conversion](https://www.exploringbinary.com/quick-and-dirty-floating-point-to-decimal-conversion/). + */ +void COMM_Console_Print_Float(float value) +{ + #define MAX_INTEGRAL_DIGITS 12 + #define MAX_FRACTIONAL_DIGITS 6 + #define BUFFER_SIZE (MAX_INTEGRAL_DIGITS + MAX_FRACTIONAL_DIGITS + 2) + + char8 buffer[BUFFER_SIZE]; + char8 integral_buffer_reversed[MAX_INTEGRAL_DIGITS]; + uint16_t buffer_index = 0; + double integral_value; + double fractional_value; + bool overflow = false; + + if (value < 0.0) + { + COMM_Console_Print_String("-"); + value *= -1.0; + } + + // Break the given value into fractional and integral parts. + fractional_value = modf(value, &integral_value); + + if (integral_value > 0) + { + // Convert the integral part. + while ((integral_value > 0) && (buffer_index < MAX_INTEGRAL_DIGITS)) + { + integral_buffer_reversed[buffer_index++] = '0' + (int)fmod(integral_value, 10); + integral_value = floor(integral_value / 10); + } + + // If there is still an integral part remaining, and overflow has occurred. + if (integral_value > 0) + { + overflow = true; + } + + // Reverse and append the integral part. + for (uint16_t i = 0; i < buffer_index; i++) + { + buffer[i] = integral_buffer_reversed[buffer_index-i-1]; + } + } + else + { + // Append a leading zero. + buffer[buffer_index++] = '0'; + } + + // Append the decimal point. + buffer[buffer_index++] = '.'; + + // Convert the fractional part, even if it is zero, and leave room for the NULL terminator. + while (buffer_index < (BUFFER_SIZE - 1)) + { + fractional_value *= 10; + buffer[buffer_index++] = '0' + (int)fractional_value; + fractional_value = modf(fractional_value, &integral_value); + } + + // Append the NULL terminator. + buffer[buffer_index] = 0; + + if (overflow == true) + { + COMM_Console_Print_String("OVERFLOW"); + } + else + { + COMM_Console_Print_String(buffer); + } +} + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +//! Converts a byte to a two-character hexadecimal representation. +/*! + * \param buffer Buffer into which to place the resulting sting. It needs to be at least three + * characters wide. + * \param byte The byte to be converted. + */ +void COMM_Console_ByteToHex(char8 * buffer, uint8_t byte) +{ + if (byte < 16) + { + buffer[0] = '0'; + buffer[1] = DIGITS[byte]; + buffer[2] = 0; + } + else + { + buffer[0] = DIGITS[byte / 16]; + buffer[1] = DIGITS[byte % 16]; + buffer[2] = 0; + } +} + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Private Functions */ + +static void ConsoleISR(void) +{ + portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + // Check for the "Rx FIFO not empty" interrput. + if ((UART_Console_HW->INTR_RX_MASKED & SCB_INTR_RX_MASKED_NOT_EMPTY_Msk ) != 0) + { + // Clear the "Rx FIFO not empty" interrput. + UART_Console_HW->INTR_RX = UART_Console_HW->INTR_RX & SCB_INTR_RX_NOT_EMPTY_Msk; + + // Get the character. + uint32_t value = UART_Console_Get(); + + // Check if there is actually data. Sometimes the flag is set when there is no data (why?). + if (value != CY_SCB_UART_RX_NO_DATA) + { + char8 rx_data = (char8) value; + + // Determine what to do with it. + if (Command_Buffer_Index < COMM_CONSOLE_COMMAND_MAX_LENGTH) + { + if (rx_data == COMM_CONSOLE_END_OF_MESSAGE) + { + Command_Buffer[Command_Buffer_Index] = COMM_CONSOLE_STRING_TERMINATOR; + Next_State = COMM_STATE_IDENTIFY_COMMAND; + vTaskNotifyGiveFromISR(COMM_Console_Task_Handle, &xHigherPriorityTaskWoken); + } + else + { + Command_Buffer[Command_Buffer_Index] = rx_data; + Command_Buffer_Index++; + } + } + else + { + Next_State = COMM_STATE_COMMAND_TOO_LONG; + vTaskNotifyGiveFromISR(COMM_Console_Task_Handle, &xHigherPriorityTaskWoken); + } + } + } + + NVIC_ClearPendingIRQ(Int_UART_Console_cfg.intrSrc); + + // If the state needs to change, a context switch might be required. + portEND_SWITCHING_ISR(xHigherPriorityTaskWoken); +} + +static bool ConsoleCommandMatches(const char8 * const command_name) +{ + uint32_t i = 0; + bool is_match = false; + + if (Command_Buffer[i] == command_name[i]) + { + is_match = true; + i++; + } + + while ( (is_match == true) && + (i < COMM_CONSOLE_COMMAND_MAX_LENGTH) && + (Command_Buffer[i] != COMM_CONSOLE_PARAMETER_DELIMITER) && + (Command_Buffer[i] != COMM_CONSOLE_END_OF_MESSAGE ) && + (Command_Buffer[i] != COMM_CONSOLE_STRING_TERMINATOR ) + ) + { + if ( Command_Buffer[i] != command_name[i] ) + { + is_match = false; + } + i++; + } + + return is_match; +} + +//! Reverses a string in place. +/*! + * \param value Pointer to the string to be reversed. + * \param length Length of the string, including the NULL terminator. + */ +static void ReverseString(char8 * value, uint32_t length) +{ + if (length > 1) + { + uint_fast32_t start = 0; + uint_fast32_t end = length - 1; + while (start < end) + { + Swap_Char8(value + start, value + end); + start++; + end--; + } + } +} + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) diff --git a/2020TPCAppNoDFU.cydsn/COMM/COMM_Console.h b/2020TPCAppNoDFU.cydsn/COMM/COMM_Console.h new file mode 100644 index 0000000..916cb6c --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/COMM_Console.h @@ -0,0 +1,144 @@ +/** \file + * \brief This file defines the interface to a simple serial debug console and command interpreter. + * + * \note As always, and should be included before this file. + */ + +#ifndef COMM_CONSOLE_H +#define COMM_CONSOLE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +#define COMM_CONSOLE_TASK_STACK_SIZE_in_bytes 512 + +#define COMM_Console_PutChar UART_and_BLE_PutChar +#define COMM_Console_PutString UART_and_BLE_PutString + +#define COMM_CONSOLE_COMMAND_MAX_LENGTH 50 + +//! Character signifying the end of a console message. +#define COMM_CONSOLE_END_OF_MESSAGE ('\n') + +//! Character used between parameters in a console message. +#define COMM_CONSOLE_PARAMETER_DELIMITER (' ') + +//! Character signifying the end of a string. +#define COMM_CONSOLE_STRING_TERMINATOR ('\0') + +//! Result of executing a console command callback. +typedef enum +{ + COMM_CONSOLE_CMD_RESULT_UNKNOWN = 0, + COMM_CONSOLE_CMD_RESULT_SUCCESS = 1, + COMM_CONSOLE_CMD_RESULT_PARAMETER_ERROR = 2 +} COMM_Console_Command_Result_T; + +//! Result of parsing a console command parameter. +typedef enum +{ + COMM_CONSOLE_PARAMETER_RESULT_UNKNOWN = 0, + COMM_CONSOLE_PARAMETER_RESULT_SUCCESS = 1, + COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR = 2, + COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END = 3 +} COMM_Console_Parameter_Result_T; + +//! Prototype of a console command callback. +/*! + * \ingroup CONSOLE + * All console commands must use this signature. + * + * \param[in] data Pointer to the string containg the console command (and any arguments). + * \param[in] size Size (in char8) of the data string. + * \return #COMM_CONSOLE_CMD_RESULT_SUCCESS on success + * \return #COMM_Console_Command_Result_T otherwise + */ +typedef COMM_Console_Command_Result_T (* const COMM_Console_Command_Handler_T)(char8 * data, uint32_t size); + +typedef struct +{ + const char8 * const Command_Name; + const char8 * const Help; + COMM_Console_Command_Handler_T Execute_Command; +} COMM_Console_Command_Table_Entry_T; + +/* Public Variables */ + +//! Handle of the COMM_Console_Task() given when the task was created. +extern TaskHandle_t COMM_Console_Task_Handle; + +/* Public Functions */ + +void COMM_Console_Init(void); +void COMM_Console_Task(void * pvParameters); +void COMM_Console_Execute_Internal_Command(const uint8_t * const command); +void COMM_Console_Print_String(const char8 * const text); +void COMM_Console_Print_UInt32(uint32_t value); +void COMM_Console_Print_SInt32(int32_t value); +void COMM_Console_Print_UInt32AsHex(uint32_t value); +void COMM_Console_Print_UInt64(uint64_t value); +void COMM_Console_Print_UInt64AsHex(uint64_t value); +void COMM_Console_Print_Float(float value); + +void COMM_Console_ByteToHex(char8 * buffer, uint8_t byte); + +/* Inline Functions */ + +//! Prints an 8-bit unsigned integer to the serial console. +inline void COMM_Console_Print_UInt8(uint8_t value) +{ + COMM_Console_Print_UInt32((uint32_t) value); +} + +//! Prints an 8-bit unsigned integer to the serial console using a hexadecimal representation. +inline void COMM_Console_Print_UInt8AsHex(uint8_t value) +{ + COMM_Console_Print_UInt32AsHex((uint32_t) value); +} + +//! Prints an 8-bit signed integer to the serial console. +inline void COMM_Console_Print_Int8(int8_t value) +{ + COMM_Console_Print_SInt32((int32_t) value); +} + +//! Prints a 16-bit unsigned integer to the serial console. +inline void COMM_Console_Print_UInt16(uint16_t value) +{ + COMM_Console_Print_UInt32((uint32_t) value); +} + +//! Prints a 16-bit unsigned integer to the serial console using a hexadecimal representation. +inline void COMM_Console_Print_UInt16AsHex(uint16_t value) +{ + COMM_Console_Print_UInt32AsHex((uint32_t) value); +} + +//! Prints a 16-bit signed integer to the serial console. +inline void COMM_Console_Print_Int16(int16_t value) +{ + COMM_Console_Print_SInt32((int32_t) value); +} + +static inline void UART_and_BLE_PutChar(uint8 txDataByte) +{ + UART_Console_Put(txDataByte); + COMM_BLE_UART_PutChar(txDataByte); +} + +static inline void UART_and_BLE_PutString(const char8 string[]) +{ + UART_Console_PutString(string); + COMM_BLE_UART_PutString(string, strlen(string)); +} + +#ifdef __cplusplus +} +#endif + +#endif // COMM_CONSOLE_H diff --git a/2020TPCAppNoDFU.cydsn/COMM/COMM_Console_Util.c b/2020TPCAppNoDFU.cydsn/COMM/COMM_Console_Util.c new file mode 100644 index 0000000..0a68b17 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/COMM_Console_Util.c @@ -0,0 +1,254 @@ +/** \file + * \brief This file implements utility functions used by the command interpreter. + */ + +/** + * \ingroup CONSOLE + */ + +/* Include Files */ +#include "KTag.h" + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Local Definitions and Constants */ + +/* Public Variables */ + +/* Private Variables */ + +/* Private Function Prototypes */ + +/* Public Functions */ + +//! Find the start location of the nth parameter in the buffer. +/*! + * \note The command itself is parameter 0. + */ +COMM_Console_Parameter_Result_T COMM_Console_FindNthParameter(const char * const buffer, const uint8_t parameterNumber, const char ** parameterLocation) +{ + uint32_t buffer_index = 0; + uint32_t parameter_index = 0; + COMM_Console_Parameter_Result_T result = COMM_CONSOLE_PARAMETER_RESULT_SUCCESS; + + while (parameterNumber != parameter_index) + { + if (buffer[buffer_index] == COMM_CONSOLE_PARAMETER_DELIMITER) + { + parameter_index++; + } + else if (buffer[buffer_index] == COMM_CONSOLE_END_OF_MESSAGE) + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + break; + } + else if (buffer[buffer_index] == COMM_CONSOLE_STRING_TERMINATOR) + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + break; + } + buffer_index++; + } + + if (result == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + *parameterLocation = &buffer[buffer_index]; + } + + return result; +} + + +COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterUInt8(const char * const buffer, uint8_t * const parameterUInt8) +{ + uint8_t value = 0; + COMM_Console_Parameter_Result_T result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + + // Strings containing uint8s range from "0" to "255". The large number has three characters. + uint_fast16_t MAX_CHARACTERS = 3; + uint_fast16_t index = 0; + + while (index < (MAX_CHARACTERS + 1)) + { + if ((buffer[index] >= '0') && (buffer[index] <= '9')) + { + value *= 10; + value += buffer[index] - '0'; + index++; + } + else if ( (buffer[index] == COMM_CONSOLE_PARAMETER_DELIMITER) || + (buffer[index] == COMM_CONSOLE_STRING_TERMINATOR) || + (buffer[index] == COMM_CONSOLE_END_OF_MESSAGE) ) + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END; + break; + } + else + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + break; + } + } + + if (result == COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END) + { + result = COMM_CONSOLE_PARAMETER_RESULT_SUCCESS; + *parameterUInt8 = value; + } + + return result; +} + + +COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterUInt16(const char * const buffer, uint16_t * const parameterUInt16) +{ + uint16_t value = 0; + COMM_Console_Parameter_Result_T result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + + // Strings containing uint16s range from "0" to "65535". The large number has five characters. + uint_fast16_t MAX_CHARACTERS = 5; + uint_fast16_t index = 0; + + while (index < (MAX_CHARACTERS + 1)) + { + if ((buffer[index] >= '0') && (buffer[index] <= '9')) + { + value *= 10; + value += buffer[index] - '0'; + index++; + } + else if ( (buffer[index] == COMM_CONSOLE_PARAMETER_DELIMITER) || + (buffer[index] == COMM_CONSOLE_STRING_TERMINATOR) || + (buffer[index] == COMM_CONSOLE_END_OF_MESSAGE) ) + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END; + break; + } + else + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + break; + } + } + + if (result == COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END) + { + result = COMM_CONSOLE_PARAMETER_RESULT_SUCCESS; + *parameterUInt16 = value; + } + + return result; +} + +COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterInt32(const char * const buffer, int32_t * const parameterInt32) +{ + int32_t value = 0; + COMM_Console_Parameter_Result_T result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + bool is_negative = false; + + // Strings containing int32s range from "-2147483648" to "2147483647". The negative number has eleven characters. + uint_fast16_t MAX_CHARACTERS = 11; + uint_fast16_t index = 0; + + if (buffer[index] == '-') + { + is_negative = true; + index++; + } + + while (index < (MAX_CHARACTERS + 1)) + { + if ((buffer[index] >= '0') && (buffer[index] <= '9')) + { + value *= 10; + value += buffer[index] - '0'; + index++; + } + else if ( (buffer[index] == COMM_CONSOLE_PARAMETER_DELIMITER) || + (buffer[index] == COMM_CONSOLE_STRING_TERMINATOR) || + (buffer[index] == COMM_CONSOLE_END_OF_MESSAGE) ) + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END; + break; + } + else + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + break; + } + } + + if (is_negative == true) + { + value *= -1; + } + + if (result == COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END) + { + result = COMM_CONSOLE_PARAMETER_RESULT_SUCCESS; + *parameterInt32 = value; + } + + return result; +} + +COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterUInt32(const char * const buffer, uint32_t * const parameterUInt32) +{ + uint32_t value = 0; + COMM_Console_Parameter_Result_T result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + + // Strings containing uint32s range from "0" to "4294967296". The large number has ten characters. + uint_fast16_t MAX_CHARACTERS = 10; + uint_fast16_t index = 0; + + while (index < (MAX_CHARACTERS + 1)) + { + if ((buffer[index] >= '0') && (buffer[index] <= '9')) + { + value *= 10; + value += buffer[index] - '0'; + index++; + } + else if ( (buffer[index] == COMM_CONSOLE_PARAMETER_DELIMITER) || + (buffer[index] == COMM_CONSOLE_STRING_TERMINATOR) || + (buffer[index] == COMM_CONSOLE_END_OF_MESSAGE) ) + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END; + break; + } + else + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + break; + } + } + + if (result == COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_END) + { + result = COMM_CONSOLE_PARAMETER_RESULT_SUCCESS; + *parameterUInt32 = value; + } + + return result; +} + +COMM_Console_Parameter_Result_T COMM_Console_DecodeHexParameterUInt64(const char * const buffer, uint64_t * const parameterUInt64) +{ + COMM_Console_Parameter_Result_T result = COMM_CONSOLE_PARAMETER_RESULT_SUCCESS; + struct _reent context; + + context._errno = 0; + + *parameterUInt64 = _strtoull_r(&context, buffer, NULL, 16); + + if (context._errno != 0) + { + result = COMM_CONSOLE_PARAMETER_RESULT_PARAMETER_ERROR; + } + + return result; +} + +/* Private Functions */ + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) diff --git a/2020TPCAppNoDFU.cydsn/COMM/COMM_Console_Util.h b/2020TPCAppNoDFU.cydsn/COMM/COMM_Console_Util.h new file mode 100644 index 0000000..7fccbaf --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/COMM_Console_Util.h @@ -0,0 +1,50 @@ +/** \file + * \brief Utility functions used by the command interpreter. + * + * \note As always, and should be included before this file. + */ + +#ifndef COMM_CONSOLE_UTIL_H +#define COMM_CONSOLE_UTIL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +/* Public Variables */ + +/* Public Functions */ +COMM_Console_Parameter_Result_T COMM_Console_FindNthParameter(const char * const buffer, const uint8_t parameterNumber, const char ** parameterLocation); +COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterUInt8(const char * const buffer, uint8_t * const parameterUInt8); +COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterUInt16(const char * const buffer, uint16_t * const parameterUInt16); +COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterInt32(const char * const buffer, int32_t * const parameterInt32); +COMM_Console_Parameter_Result_T COMM_Console_DecodeParameterUInt32(const char * const buffer, uint32_t * const parameterUInt32); +COMM_Console_Parameter_Result_T COMM_Console_DecodeHexParameterUInt64(const char * const buffer, uint64_t * const parameterUInt64); + +//! Returns `true` if this character marks the end of a console message; `false` otherwise. +inline bool COMM_Console_IsEndOfMessage(char8 character) +{ + bool result = false; + + if ( (character == COMM_CONSOLE_END_OF_MESSAGE) || + (character == COMM_CONSOLE_STRING_TERMINATOR) ) + { + result = true; + } + + return result; +} + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +#ifdef __cplusplus +} +#endif + +#endif // COMM_CONSOLE_UTIL_H diff --git a/2020TPCAppNoDFU.cydsn/COMM/COMM_I2C_Bus.c b/2020TPCAppNoDFU.cydsn/COMM/COMM_I2C_Bus.c new file mode 100644 index 0000000..7fe82f6 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/COMM_I2C_Bus.c @@ -0,0 +1,33 @@ +/** \file + * \brief This file implements the I²C bus. + * + * See COMM_I2C_Bus.h for a detailed description of the functionality implemented by this code. + */ + +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +/* Public Variables */ + +SemaphoreHandle_t COMM_I2C_Bus_Mutex = NULL; + +/* Private Variables */ + +/* Private Function Prototypes */ + +/* Public Functions */ + +//! Initializes the I²C bus. +/*! + * + */ +void COMM_I2C_Init(void) +{ + COMM_I2C_Bus_Mutex = xSemaphoreCreateMutex(); + I2C_Start(); +} + + +/* Private Functions */ diff --git a/2020TPCAppNoDFU.cydsn/COMM/COMM_I2C_Bus.h b/2020TPCAppNoDFU.cydsn/COMM/COMM_I2C_Bus.h new file mode 100644 index 0000000..414e7f2 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/COMM_I2C_Bus.h @@ -0,0 +1,29 @@ +/** \file + * \brief This file defines the interface to the I²C bus. + * + */ + +#ifndef COMM_I2C_BUS_H +#define COMM_I2C_BUS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + + +/* Include Files */ + + +/* Public Variables */ +extern SemaphoreHandle_t COMM_I2C_Bus_Mutex; + +/* Public Functions */ +void COMM_I2C_Init(void); + +#ifdef __cplusplus +} +#endif + +#endif // COMM_I2C_BUS_H diff --git a/2020TPCAppNoDFU.cydsn/COMM/COMM_IPC_Messages.c b/2020TPCAppNoDFU.cydsn/COMM/COMM_IPC_Messages.c new file mode 100644 index 0000000..605d8df --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/COMM_IPC_Messages.c @@ -0,0 +1,285 @@ +/** \file + * \brief This file implements messaging using inter-processor communication (IPC). + * +* \see https://community.cypress.com/thread/36182. + */ + +/** + * \ingroup CONSOLE + */ + +/* Include Files */ +#include +#include +#include +#include +#include +#include + +#include "COMM_IPC_Messages.h" + +/* Private Function Prototypes */ + +#if (__CORTEX_M == 0) +static void Message_Received_for_CM0(uint32_t * msg); +static void Message_Received_by_CM4(void); +#endif // (__CORTEX_M == 0) + +#if (__CORTEX_M == 4) +static void Message_Received_for_CM4(uint32_t * msg); +static void Message_Received_by_CM0(void); +#endif // (__CORTEX_M == 4) + +static void IPC_UserPipeInit(void); +static void IPC_UserPipeISR(void); + + +/* Local Definitions and Constants */ + +//! Number of clients supported on the user pipe. +#define CY_IPC_USRPIPE_CLIENT_CNT (uint32_t)(8u) + +#define CY_IPC_CHAN_USRPIPE_CM0 (uint32_t)(8u) +#define CY_IPC_CHAN_USRPIPE_CM4 (uint32_t)(9u) + +#define CY_IPC_INTR_USRPIPE_CM0 (uint32_t)(8u) +#define CY_IPC_INTR_USRPIPE_CM4 (uint32_t)(9u) + +#define CY_IPC_EP_USRPIPE_ADDR_CM0_EP (uint32_t)(2u) +#define CY_IPC_EP_USRPIPE_ADDR_CM4_EP (uint32_t)(3u) + +#if (CY_CPU_CORTEX_M0P) + #define IPC_EP_USRPIPE_ADDR CY_IPC_EP_USRPIPE_ADDR_CM0_EP +#else + #define IPC_EP_USRPIPE_ADDR CY_IPC_EP_USRPIPE_ADDR_CM4_EP +#endif /* (CY_CPU_CORTEX_M0P) */ + +/* User Pipe Configuration */ + +#define IPC_USRPIPE_CHAN_MASK_CM0 (uint32_t)(0x0001ul << CY_IPC_CHAN_USRPIPE_CM0) +#define IPC_USRPIPE_CHAN_MASK_CM4 (uint32_t)(0x0001ul << CY_IPC_CHAN_USRPIPE_CM4) +#define IPC_USRPIPE_INTR_MASK (uint32_t)( IPC_USRPIPE_CHAN_MASK_CM0 | IPC_USRPIPE_CHAN_MASK_CM4 ) +#define IPC_INTR_USRPIPE_PRIOR_CM0 (uint32_t)(1u) /* Notifier Priority */ +#define IPC_INTR_USRPIPE_PRIOR_CM4 (uint32_t)(1u) /* Notifier Priority */ +#define IPC_INTR_USRPIPE_MUX_CM0 (uint32_t)(7u) /* IPC CYPRESS PIPE */ +#define IPC_USRPIPE_CONFIG_CM0 (uint32_t)(IPC_USRPIPE_INTR_MASK << CY_IPC_PIPE_CFG_IMASK_Pos)\ + |(CY_IPC_INTR_USRPIPE_CM0 << CY_IPC_PIPE_CFG_INTR_Pos )\ + |(CY_IPC_CHAN_USRPIPE_CM0) +#define IPC_USRPIPE_CONFIG_CM4 (uint32_t)(IPC_USRPIPE_INTR_MASK << CY_IPC_PIPE_CFG_IMASK_Pos)\ + |(CY_IPC_INTR_USRPIPE_CM4 << CY_IPC_PIPE_CFG_INTR_Pos )\ + |(CY_IPC_CHAN_USRPIPE_CM4) + +#define USRPIPE_CONFIG \ +{\ + /* .ep0ConfigData */ {\ + /* .ipcNotifierNumber */ CY_IPC_INTR_USRPIPE_CM0,\ + /* .ipcNotifierPriority */ IPC_INTR_USRPIPE_PRIOR_CM0,\ + /* .ipcNotifierMuxNumber */ IPC_INTR_USRPIPE_MUX_CM0,\ + /* .epAddress */ CY_IPC_EP_USRPIPE_ADDR_CM0_EP,\ + /* .epConfig */ IPC_USRPIPE_CONFIG_CM0\ + },\ + /* .ep1ConfigData */ {\ + /* .ipcNotifierNumber */ CY_IPC_INTR_USRPIPE_CM4,\ + /* .ipcNotifierPriority */ IPC_INTR_USRPIPE_PRIOR_CM4,\ + /* .ipcNotifierMuxNumber */ 0u,\ + /* .epAddress */ CY_IPC_EP_USRPIPE_ADDR_CM4_EP,\ + /* .epConfig */ IPC_USRPIPE_CONFIG_CM4\ + },\ + /* .endpointClientsCount */ CY_IPC_USRPIPE_CLIENT_CNT,\ + /* .endpointsCallbacksArray */ ipc_pipe_CbArray,\ + /* .userPipeIsrHandler */ &IPC_UserPipeISR\ +} + +//! Client ID for messages from the CM0 to the CM4 +#define COMM_IPC_CM0_TO_CM4_CLIENT_ID 0 +//! Client ID for messages from the CM4 to the CM0 +#define COMM_IPC_CM4_TO_CM0_CLIENT_ID 1 + + +/* Public Variables */ + +/* Private Variables */ + +#if (__CORTEX_M == 0) +static COMM_IPCMessage_T MessageBuffer = +{ + .ClientID = _VAL2FLD(CY_IPC_PIPE_MSG_CLIENT, COMM_IPC_CM0_TO_CM4_CLIENT_ID) | _VAL2FLD(CY_IPC_PIPE_MSG_USR, 0) | _VAL2FLD(CY_IPC_PIPE_MSG_RELEASE, IPC_USRPIPE_INTR_MASK), + .MessageID = COMM_SMM_DefaultNoMessage, + .Data = NULL +}; + +static volatile bool OK_to_send_from_CM0_to_CM4 = true; +#endif // (__CORTEX_M == 0) + +#if (__CORTEX_M == 4) +static COMM_IPCMessage_T MessageBuffer = +{ + .ClientID = _VAL2FLD(CY_IPC_PIPE_MSG_CLIENT, COMM_IPC_CM4_TO_CM0_CLIENT_ID) | _VAL2FLD(CY_IPC_PIPE_MSG_USR, 0) | _VAL2FLD(CY_IPC_PIPE_MSG_RELEASE, IPC_USRPIPE_INTR_MASK), + .MessageID = COMM_SMM_DefaultNoMessage, + .Data = NULL +}; + +static volatile bool OK_to_send_from_CM4_to_CM0 = true; +#endif // (__CORTEX_M == 4) + + +/* Public Functions */ + +#if (__CORTEX_M == 0) +//! Initializes the inter-processor communications on the Cortex-M0 core. +/*! + * This should be called *before* calling Cy_SysEnableCM4(). + */ +void COMM_InitIPCMessages(void) +{ + IPC_UserPipeInit(); + + // Register a callback to handle messages from CM4. + Cy_IPC_Pipe_RegisterCallback(IPC_EP_USRPIPE_ADDR, + Message_Received_for_CM0, + CY_IPC_EP_CYPIPE_CM4_ADDR); +} +#endif // (__CORTEX_M == 0) + +#if (__CORTEX_M == 4) +//! Initializes the inter-processor communications on the Cortex-M4 core. +void COMM_InitIPCMessages(void) +{ + IPC_UserPipeInit(); + + // Register a callback to handle messages from CM0. + Cy_IPC_Pipe_RegisterCallback(IPC_EP_USRPIPE_ADDR, + Message_Received_for_CM4, + CY_IPC_EP_CYPIPE_CM0_ADDR); +} +#endif // (__CORTEX_M == 4) + + +//! Sends an inter-processor communication message to the other core. +bool COMM_SendMessageToOtherCore(COMM_IPCMessageID_T message_ID, void * message_data) +{ + bool message_sent = false; + + MessageBuffer.MessageID = message_ID; + MessageBuffer.Data = message_data; + +#if (__CORTEX_M == 0) + if (OK_to_send_from_CM0_to_CM4 == true) + { + OK_to_send_from_CM0_to_CM4 = false; + uint32_t timeout_in_us = 2000; + cy_en_ipc_pipe_status_t ipcStatus; + + do + { + ipcStatus = Cy_IPC_Pipe_SendMessage(CY_IPC_EP_USRPIPE_ADDR_CM4_EP, + CY_IPC_EP_USRPIPE_ADDR_CM0_EP, + (uint32_t *) &MessageBuffer, + Message_Received_by_CM4); + Cy_SysLib_DelayUs(1u); + timeout_in_us--; + } while((ipcStatus != CY_IPC_PIPE_SUCCESS) && (timeout_in_us != 0)); + + message_sent = true; + } +#endif // (__CORTEX_M == 0) + +#if (__CORTEX_M == 4) + if (OK_to_send_from_CM4_to_CM0 == true) + { + OK_to_send_from_CM4_to_CM0 = false; + uint32_t timeout_in_us = 2000; + cy_en_ipc_pipe_status_t ipcStatus; + + do + { + ipcStatus = Cy_IPC_Pipe_SendMessage(CY_IPC_EP_USRPIPE_ADDR_CM0_EP, + CY_IPC_EP_USRPIPE_ADDR_CM4_EP, + (uint32_t *) &MessageBuffer, + Message_Received_by_CM0); + Cy_SysLib_DelayUs(1u); + timeout_in_us--; + } while((ipcStatus != CY_IPC_PIPE_SUCCESS) && (timeout_in_us != 0)); + + message_sent = true; + } +#endif // (__CORTEX_M == 4) + + return message_sent; +} + + +/* Private Functions */ + +#if (__CORTEX_M == 0) +//! Callback for messages received by the CM0 core from the CM4 core. +/*! + * \note This code is executed inside an interrupt handler. + */ +static void Message_Received_for_CM0(uint32_t * msg) +{ + switch (((COMM_IPCMessage_T *)msg)->MessageID) + { + default: + case COMM_SMM_DefaultNoMessage: + case COMM_SMM_NoMessage: + break; + + case COMM_SMM_RebootImmediately: + // Perform a software reset of both cores. + NVIC_SystemReset(); + break; + } +} + +static void Message_Received_by_CM4(void) +{ + OK_to_send_from_CM0_to_CM4 = true; +} +#endif // (__CORTEX_M == 0) + +#if (__CORTEX_M == 4) +//! Callback for messages received by the CM4 core from the CM0 core. +/*! + * \note This code is executed inside an interrupt handler. + */ +static void Message_Received_for_CM4(uint32_t * msg) +{ + switch (((COMM_IPCMessage_T *)msg)->MessageID) + { + default: + case COMM_SMM_DefaultNoMessage: + case COMM_SMM_NoMessage: + break; + + case COMM_SMM_RebootImmediately: + // This message does nothing on CM4 + break; + } +} + +static void Message_Received_by_CM0(void) +{ + OK_to_send_from_CM4_to_CM0 = true; +} +#endif // (__CORTEX_M == 4) + +//! Initializes the IPC user pipe. +static void IPC_UserPipeInit(void) +{ + static cy_ipc_pipe_callback_ptr_t ipc_pipe_CbArray[CY_IPC_USRPIPE_CLIENT_CNT]; + static const cy_stc_ipc_pipe_config_t userPipeConfig = USRPIPE_CONFIG; + + uint32_t savedIntrStatus = Cy_SysLib_EnterCriticalSection(); + + Cy_IPC_Pipe_Init(&userPipeConfig); + + Cy_SysLib_ExitCriticalSection(savedIntrStatus); +} + +//! Interrupt service routine for the user pipe. +void IPC_UserPipeISR(void) +{ + Cy_IPC_Pipe_ExecuteCallback(IPC_EP_USRPIPE_ADDR); +} + diff --git a/2020TPCAppNoDFU.cydsn/COMM/COMM_IPC_Messages.h b/2020TPCAppNoDFU.cydsn/COMM/COMM_IPC_Messages.h new file mode 100644 index 0000000..c6efdc3 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/COMM_IPC_Messages.h @@ -0,0 +1,49 @@ + +/** \file + * \brief This file contains definitions and prototypes for messaging using inter-processor + * communication (IPC). + */ + +#ifndef COMM_IPC_MESSAGES_H +#define COMM_IPC_MESSAGES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +typedef enum +{ + //! This is not an actual message. Upon receipt, do nothing. + COMM_SMM_DefaultNoMessage = 0, + //! Reboot the system immediately upon receipt of this message (Data is "don't care"). + COMM_SMM_RebootImmediately, + //! This is not an actual message. Upon receipt, do nothing. + COMM_SMM_NoMessage = 0xFFFFFFFF, +} COMM_IPCMessageID_T; + +typedef struct +{ + //! The client ID number is the index into the callback array. + uint32_t ClientID; + //! The message ID represents the meaning of the message being sent. + COMM_IPCMessageID_T MessageID; + //! The contents of Data are different for each message ID. See #COMM_IPCMessageID_T for more details. + void * Data; +} COMM_IPCMessage_T; + +/* Public Variables */ + +/* Public Functions */ + +void COMM_InitIPCMessages(void); +bool COMM_SendMessageToOtherCore(COMM_IPCMessageID_T message_ID, void * message_data); + +#ifdef __cplusplus +} +#endif + +#endif // COMM_IPC_MESSAGES_H diff --git a/2020TPCAppNoDFU.cydsn/COMM/COMM_Util.c b/2020TPCAppNoDFU.cydsn/COMM/COMM_Util.c new file mode 100644 index 0000000..311d8a5 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/COMM_Util.c @@ -0,0 +1,48 @@ +/** \file + * \brief This file implements utility functions used by the communications package. + */ + +/** + * \ingroup CONSOLE + */ + +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +/* Public Variables */ + +/* Private Variables */ +static char8 uint64_buffer[20+1]; + +/* Private Function Prototypes */ + +/* Public Functions */ + +//! Converts a UInt64 to a NULL-terminated string. +/*! + * This function is necessary because newlib-nano does not support "%llu" / #PRIu64. + * \see https://answers.launchpad.net/gcc-arm-embedded/+question/257014 + * + * \note This function is not reentrant! + * + * \param value pointer to the digital input object. + * \return pointer to a NULL-terminated string containing the base-10 textual representation of #value. + */ +char8 * COMM_UInt64ToDecimal(uint64_t value) +{ + char8 * p = uint64_buffer + sizeof(uint64_buffer); + *(--p) = 0x00; + + for (bool first_time = true; value || first_time; first_time = false) + { + const uint32_t digit = value % 10; + const char c = '0' + digit; + *(--p) = c; + value = value / 10; + } + return p; +} + +/* Private Functions */ diff --git a/2020TPCAppNoDFU.cydsn/COMM/COMM_Util.h b/2020TPCAppNoDFU.cydsn/COMM/COMM_Util.h new file mode 100644 index 0000000..0dc199a --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/COMM_Util.h @@ -0,0 +1,27 @@ +/** \file + * \brief Utility functions used by the communications package. + * + * \note As always, and should be included before this file. + */ + +#ifndef COMM_UTIL_H +#define COMM_UTIL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +/* Public Variables */ + +/* Public Functions */ +char8 * COMM_UInt64ToDecimal(uint64_t value); + +#ifdef __cplusplus +} +#endif + +#endif // COMM_UTIL_H diff --git a/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_BLE_ConsoleCommands.c b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_BLE_ConsoleCommands.c new file mode 100644 index 0000000..183e994 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_BLE_ConsoleCommands.c @@ -0,0 +1,78 @@ +/** \file + * \brief This file defines the serial console commands for the Bluetooth Low Energy subsystem. + */ + +/* Include Files */ +#include "KTag.h" + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) && (CONFIG__FEATURE_BLE == CONFIG__FEATURE_ENABLED) + +/* Local Definitions and Constants */ + +/* Private Function Prototypes */ + +/* Public Variables */ + +/* Private Variables */ + +/* Public Functions */ + +/* Private Functions */ + +//! Console command handler for subcommands of the 'ble' command. +COMM_Console_Command_Result_T COMM_HandleBLECommand(char8 * data, uint32_t size) +{ + // data[0] through data[3] is 'ble '. + + if (data[4] == '?') + { + COMM_Console_Print_String("ble ? Display this help.\n"); + COMM_Console_Print_String("ble cmd Inject the BLE command with ID .\n"); + } + else if ( (data[4] == 'c') && + (data[5] == 'm') && + (data[6] == 'd') ) + + { + if (COMM_Console_IsEndOfMessage(data[7])) + { + COMM_Console_Print_String("ERROR: missing BLE command ID!\n"); + } + else if (data[7] == ' ') + { + uint16_t id = 0; + + if (COMM_Console_DecodeParameterUInt16(&(data[8]), &id) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + if ((id > COMM_BLE_COMMAND_NO_OP) && (id < COMM_BLE_COMMAND_IS_OUT_OF_RANGE)) + { + COMM_BLE_Command_T command = {.ID = id, .Data = (void *)0x00}; + xQueueSend(COMM_BLE_CommandQueue, &command, 0); + } + else + { + COMM_Console_Print_String("ERROR: specified BLE command ID ("); + COMM_Console_Print_UInt16(id); + COMM_Console_Print_String(") is invalid!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: could not comprehend BLE command ID!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: unrecognized or mangled command!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: Unknown BLE command!\n"); + } + + + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) && (CONFIG__FEATURE_BLE == CONFIG__FEATURE_ENABLED) diff --git a/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_BLE_ConsoleCommands.h b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_BLE_ConsoleCommands.h new file mode 100644 index 0000000..014c11e --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_BLE_ConsoleCommands.h @@ -0,0 +1,29 @@ +/** \file + * \brief This file declares the serial console commands for the Bluetooth Low Energy subsystem. + */ + +#ifndef COMM_BLE_CONSOLECOMMANDS_H +#define COMM_BLE_CONSOLECOMMANDS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +/* Public Variables */ + +/* Public Functions */ +COMM_Console_Command_Result_T COMM_HandleBLECommand(char8 * data, uint32_t size); + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +#ifdef __cplusplus +} +#endif + +#endif // COMM_BLE_CONSOLECOMMANDS_H diff --git a/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_ConsoleCommands.c b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_ConsoleCommands.c new file mode 100644 index 0000000..95802c5 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_ConsoleCommands.c @@ -0,0 +1,72 @@ +/** \file + * \brief This file defines the serial console commands for this CPU. + */ + +/* Include Files */ +#include "KTag.h" + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Local Definitions and Constants */ + +/* Private Function Prototypes */ +static COMM_Console_Command_Result_T HandleConsoleHelp(char8 * data, uint32_t size); +static COMM_Console_Command_Result_T HandleConsoleComment(char8 * data, uint32_t size); +static COMM_Console_Command_Result_T HandleConsoleUptime(char8 * data, uint32_t size); + +/* Public Variables */ + +const COMM_Console_Command_Table_Entry_T COMM_Console_Command_Table[] = +{ + {"?", " Show this help.", HandleConsoleHelp}, + {"#", " Comment (Do not omit the space after the #.)", HandleConsoleComment}, + {"event", " Generate an event in the high-level state machine (\'event ?\' for help).", COMM_HandleEventCommand}, + {"ble", " Interact with the Bluetooth Low Energy subsystem (try \'ble ?\').", COMM_HandleBLECommand}, + {"up", " Display uptime.", HandleConsoleUptime}, + {"cpu (r)", " Display CPU usage ('r' to reset maximum).", COMM_RTOS_HandleConsoleCPU}, + {"stack", " Display stack usage.", COMM_RTOS_HandleConsoleStack}, + {"version", " Display RTOS version.", COMM_RTOS_HandleConsoleVersion}, + {"reboot", " Performs a software reset on both cores.", COMM_RTOS_HandleConsoleReboot}, + {"nvm", " Interact with the Nonvolatile Memory (try \'nvm ?\').", COMM_NVM_HandleConsoleNVMCommand}, +}; + +//! Size of the #COMM_Console_Command_Table array (i.e. the number of console commands). +const uint_fast16_t COMM_N_CONSOLE_COMMANDS = (uint_fast16_t) (sizeof(COMM_Console_Command_Table) / sizeof(COMM_Console_Command_Table_Entry_T)); + +/* Private Variables */ + +/* Public Functions */ + +/* Private Functions */ + +static COMM_Console_Command_Result_T HandleConsoleHelp(char8 * data, uint32_t size) +{ + for (uint_fast16_t i = 0; i < COMM_N_CONSOLE_COMMANDS; i++) + { + COMM_Console_Print_String(COMM_Console_Command_Table[i].Command_Name); + COMM_Console_Print_String(" "); + COMM_Console_Print_String(COMM_Console_Command_Table[i].Help); + COMM_Console_Print_String("\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + } + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +static COMM_Console_Command_Result_T HandleConsoleComment(char8 * data, uint32_t size) +{ + COMM_Console_Print_String("Comment.\n"); + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +static COMM_Console_Command_Result_T HandleConsoleUptime(char8 * data, uint32_t size) +{ +#if (configTICK_RATE_HZ != 1000) +#error This code assumes configTICK_RATE_HZ is set to 1000 (== 1ms ticks)! +#endif // (configTICK_RATE_HZ != 1000) + COMM_Console_Print_String("Up "); + COMM_Console_Print_UInt32(xTaskGetTickCount()); + COMM_Console_Print_String(" milliseconds.\n"); + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) diff --git a/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_ConsoleCommands.h b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_ConsoleCommands.h new file mode 100644 index 0000000..c332d4d --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_ConsoleCommands.h @@ -0,0 +1,30 @@ +/** \file + * \brief This file configures the serial console commands on this CPU. + */ + +#ifndef COMM_CONSOLECOMMANDS_H +#define COMM_CONSOLECOMMANDS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +/* Public Variables */ +extern const COMM_Console_Command_Table_Entry_T COMM_Console_Command_Table[]; +extern const uint_fast16_t COMM_N_CONSOLE_COMMANDS; + +/* Public Functions */ + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +#ifdef __cplusplus +} +#endif + +#endif // COMM_CONSOLECOMMANDS_H \ No newline at end of file diff --git a/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_NVM_ConsoleCommands.c b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_NVM_ConsoleCommands.c new file mode 100644 index 0000000..ced911a --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_NVM_ConsoleCommands.c @@ -0,0 +1,207 @@ +/** \file + * \brief This file defines the serial console commands for the Nonvolatile Memory. + */ + +/* Include Files */ +#include "KTag.h" + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Local Definitions and Constants */ + +/* Private Function Prototypes */ + +/* Public Variables */ + +/* Private Variables */ + +/* Public Functions */ + +/* Private Functions */ + +//! Console command handler for subcommands of the 'nvm' command. +COMM_Console_Command_Result_T COMM_NVM_HandleConsoleNVMCommand(char8 * data, uint32_t size) +{ + // data[0] through data[3] is 'nvm '. + if (data[4] == '?') + { + COMM_Console_Print_String("nvm ? Display this help.\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String("nvm dump Display the entire Nonvolatile Memory.\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String("nvm names Display the NVM parameter names.\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String("nvm get Display an individual parameter from NVM.\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String("nvm set Assign a value to an individual parameter in NVM (be careful!).\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + } + else if ((data[4] == 'd') && (data[5] == 'u') && (data[6] == 'm') && (data[7] == 'p')) + { + for (uint8_t i = 0; i < NVM_N_ONCHIP_EEPROM_ENTRIES; i++) + { + COMM_Console_Print_String("NVM["); + COMM_Console_Print_UInt16(i); + COMM_Console_Print_String("]: "); + + for (uint8_t j = 0; j < NVM_OnChipEEPROMEntries[i]->Size; j++) + { + char8 buffer[3]; + + COMM_Console_ByteToHex(buffer, *(NVM_OnChipEEPROMEntries[i]->Value + j)); + COMM_Console_Print_String("0x"); + COMM_Console_Print_String(buffer); + COMM_Console_Print_String(" "); + } + COMM_Console_Print_String("\n"); + } + } + else if ((data[4] == 'n') && (data[5] == 'a') && (data[6] == 'm') && (data[7] == 'e') && (data[8] == 's')) + { + COMM_Console_Print_String("Valid NVM parameters:\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String(" test_1\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String(" test_2\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String(" volume\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + } + else if ((data[4] == 'g') && (data[5] == 'e') && (data[6] == 't') && (data[7] == ' ')) + { + if (strncmp(&data[8], "volume", 6) == 0) + { + COMM_Console_Print_String("Volume: "); + COMM_Console_Print_UInt8(NVM_VOLUME); + COMM_Console_Print_String("\n"); + } + else if (strncmp(&data[8], "test_1", 6) == 0) + { + COMM_Console_Print_String("Test 1: "); + COMM_Console_Print_UInt16(NVM_ONCHIP_TEST_1); + COMM_Console_Print_String("\n"); + } + else if (strncmp(&data[8], "test_2", 6) == 0) + { + COMM_Console_Print_String("Test 2: "); + COMM_Console_Print_UInt32(NVM_ONCHIP_TEST_2); + COMM_Console_Print_String("\n"); + } + else if (strncmp(&data[8], "test_3", 6) == 0) + { + COMM_Console_Print_String("Test 3: "); + COMM_Console_Print_UInt16(NVM_EXTERNAL_TEST_3); + COMM_Console_Print_String("\n"); + } + else if (strncmp(&data[8], "test_4", 6) == 0) + { + COMM_Console_Print_String("Test 4: "); + COMM_Console_Print_UInt32(NVM_EXTERNAL_TEST_4); + COMM_Console_Print_String("\n"); + } + else + { + COMM_Console_Print_String("ERROR: Unknown NVM parameter!\n"); + } + } + else if ((data[4] == 's') && (data[5] == 'e') && (data[6] == 't') && (data[7] == ' ')) + { + if (strncmp(&data[8], "volume", 6) == 0) + { + uint8_t volume = 0; + if (COMM_Console_DecodeParameterUInt8(&(data[15]), &volume) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + NVM_VOLUME = volume; + NVM_SaveExternalEEPROMEntry(NVM_VOLUME_ENTRY_PTR); + + COMM_Console_Print_String("Volume changed to "); + COMM_Console_Print_UInt8(NVM_VOLUME); + COMM_Console_Print_String("\n"); + } + else + { + COMM_Console_Print_String("ERROR: Parameter value unrecognized or missing!\n"); + } + } + else if (strncmp(&data[8], "test_1", 6) == 0) + { + uint16_t test_value = 0; + if (COMM_Console_DecodeParameterUInt16(&(data[15]), &test_value) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + NVM_ONCHIP_TEST_1 = test_value; + NVM_SaveOnChipEEPROMEntry(NVM_ONCHIP_TEST_1_ENTRY_PTR); + + COMM_Console_Print_String("Test 1 value changed to "); + COMM_Console_Print_UInt16(NVM_ONCHIP_TEST_1); + COMM_Console_Print_String("\n"); + } + else + { + COMM_Console_Print_String("ERROR: Parameter value unrecognized or missing!\n"); + } + } + else if (strncmp(&data[8], "test_2", 6) == 0) + { + uint32_t test_value = 0; + if (COMM_Console_DecodeParameterUInt32(&(data[15]), &test_value) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + NVM_ONCHIP_TEST_2 = test_value; + NVM_SaveOnChipEEPROMEntry(NVM_ONCHIP_TEST_2_ENTRY_PTR); + + COMM_Console_Print_String("Test 2 value changed to "); + COMM_Console_Print_UInt32(NVM_ONCHIP_TEST_2); + COMM_Console_Print_String("\n"); + } + else + { + COMM_Console_Print_String("ERROR: Parameter value unrecognized or missing!\n"); + } + } + else if (strncmp(&data[8], "test_3", 6) == 0) + { + uint16_t test_value = 0; + if (COMM_Console_DecodeParameterUInt16(&(data[15]), &test_value) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + NVM_EXTERNAL_TEST_3 = test_value; + NVM_SaveExternalEEPROMEntry(NVM_EXTERNAL_TEST_3_ENTRY_PTR); + + COMM_Console_Print_String("Test 3 value changed to "); + COMM_Console_Print_UInt16(NVM_EXTERNAL_TEST_3); + COMM_Console_Print_String("\n"); + } + else + { + COMM_Console_Print_String("ERROR: Parameter value unrecognized or missing!\n"); + } + } + else if (strncmp(&data[8], "test_4", 6) == 0) + { + uint32_t test_value = 0; + if (COMM_Console_DecodeParameterUInt32(&(data[15]), &test_value) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + NVM_EXTERNAL_TEST_4 = test_value; + NVM_SaveExternalEEPROMEntry(NVM_EXTERNAL_TEST_4_ENTRY_PTR); + + COMM_Console_Print_String("Test 4 value changed to "); + COMM_Console_Print_UInt32(NVM_EXTERNAL_TEST_4); + COMM_Console_Print_String("\n"); + } + else + { + COMM_Console_Print_String("ERROR: Parameter value unrecognized or missing!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: Unknown NVM parameter!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: Unknown NVM command!\n"); + } + + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) diff --git a/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_NVM_ConsoleCommands.h b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_NVM_ConsoleCommands.h new file mode 100644 index 0000000..d71ee1a --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_NVM_ConsoleCommands.h @@ -0,0 +1,29 @@ +/** \file + * \brief This file declares the serial console commands for the Nonvolatile Memory. + */ + +#ifndef COMM_NVM_CONSOLECOMMANDS_H +#define COMM_NVM_CONSOLECOMMANDS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +/* Public Variables */ + +/* Public Functions */ +COMM_Console_Command_Result_T COMM_NVM_HandleConsoleNVMCommand(char8 * data, uint32_t size); + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +#ifdef __cplusplus +} +#endif + +#endif // COMM_NVM_CONSOLECOMMANDS_H diff --git a/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_RTOS_ConsoleCommands.c b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_RTOS_ConsoleCommands.c new file mode 100644 index 0000000..109755e --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_RTOS_ConsoleCommands.c @@ -0,0 +1,109 @@ +/** \file + * \brief This file defines the serial console commands for the RTOS package. + */ + +/* Include Files */ +#include "KTag.h" + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Local Definitions and Constants */ + +/* Private Function Prototypes */ + +/* Public Variables */ + +/* Private Variables */ + +/* Public Functions */ + +/* Private Functions */ + +COMM_Console_Command_Result_T COMM_RTOS_HandleConsoleVersion(char8 * data, uint32_t size) +{ + COMM_Console_Print_String("PSoC 6 running FreeRTOS "); + + COMM_Console_Print_String(tskKERNEL_VERSION_NUMBER); + +#ifdef NDEBUG + COMM_Console_Print_String(" (Release, compiled "); +#else + COMM_Console_Print_String(" (Debug, compiled "); +#endif // NDEBUG + + COMM_Console_Print_String(__DATE__); + COMM_Console_Print_String(" "); + COMM_Console_Print_String(__TIME__); + COMM_Console_Print_String(").\n"); + + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +COMM_Console_Command_Result_T COMM_RTOS_HandleConsoleStack(char8 * data, uint32_t size) +{ + for (uint_fast8_t i = 0; i < CONFIG_N_TASK_HANDLES; i++) + { + TaskStatus_t status; + vTaskGetInfo(*CONFIG_TaskHandles[i], &status, pdTRUE, eInvalid); + COMM_Console_Print_String(status.pcTaskName); + COMM_Console_Print_String(": "); + COMM_Console_Print_UInt16(status.usStackHighWaterMark); + COMM_Console_Print_String("\n"); + } + + // Repeat for the Idle Task. + { + TaskStatus_t status; + vTaskGetInfo(xTaskGetIdleTaskHandle(), &status, pdTRUE, eInvalid); + COMM_Console_Print_String(status.pcTaskName); + COMM_Console_Print_String(": "); + COMM_Console_Print_UInt16(status.usStackHighWaterMark); + COMM_Console_Print_String("\n"); + } + + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +COMM_Console_Command_Result_T COMM_RTOS_HandleConsoleCPU(char8 * data, uint32_t size) +{ + // data[0] through data[3] is 'cpu '. + if (data[4] == 'r') + { + //COMM_Console_Print_String("Max CPU reset.\n"); + COMM_Console_Print_String("(Not yet implemented.)\n"); + } + else + { + for (uint_fast8_t i = 0; i < CONFIG_N_TASK_HANDLES; i++) + { + TaskStatus_t status; + vTaskGetInfo(*CONFIG_TaskHandles[i], &status, pdTRUE, eInvalid); + COMM_Console_Print_String(status.pcTaskName); + COMM_Console_Print_String(": "); + COMM_Console_Print_UInt32(status.ulRunTimeCounter); + COMM_Console_Print_String("\n"); + } + + // Repeat for the Idle Task. + { + TaskStatus_t status; + vTaskGetInfo(xTaskGetIdleTaskHandle(), &status, pdTRUE, eInvalid); + COMM_Console_Print_String(status.pcTaskName); + COMM_Console_Print_String(": "); + COMM_Console_Print_UInt16(status.ulRunTimeCounter); + COMM_Console_Print_String("\n"); + } + } + + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +COMM_Console_Command_Result_T COMM_RTOS_HandleConsoleReboot(char8 * data, uint32_t size) +{ + (void) COMM_SendMessageToOtherCore(COMM_SMM_RebootImmediately, NULL); + + // Not that it matters... + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) diff --git a/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_RTOS_ConsoleCommands.h b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_RTOS_ConsoleCommands.h new file mode 100644 index 0000000..6478c06 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_RTOS_ConsoleCommands.h @@ -0,0 +1,32 @@ +/** \file + * \brief This file declares the serial console commands for the RTOS package. + */ + +#ifndef COMM_RTOS_CONSOLECOMMANDS_H +#define COMM_RTOS_CONSOLECOMMANDS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +/* Public Variables */ + +/* Public Functions */ +COMM_Console_Command_Result_T COMM_RTOS_HandleConsoleVersion(char8 * data, uint32_t size); +COMM_Console_Command_Result_T COMM_RTOS_HandleConsoleStack(char8 * data, uint32_t size); +COMM_Console_Command_Result_T COMM_RTOS_HandleConsoleCPU(char8 * data, uint32_t size); +COMM_Console_Command_Result_T COMM_RTOS_HandleConsoleReboot(char8 * data, uint32_t size); + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +#ifdef __cplusplus +} +#endif + +#endif // COMM_RTOS_CONSOLECOMMANDS_H \ No newline at end of file diff --git a/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_STATE_ConsoleCommands.c b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_STATE_ConsoleCommands.c new file mode 100644 index 0000000..83d8bcf --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_STATE_ConsoleCommands.c @@ -0,0 +1,189 @@ +/** \file + * \brief This file defines the serial console commands for the high-level state machine. + */ + +/* Include Files */ +#include "KTag.h" + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Local Definitions and Constants */ + +/* Private Function Prototypes */ +static void Simulate_Hit(uint8_t team_ID, uint16_t damage); + +/* Public Variables */ + +/* Private Variables */ + +/* Public Functions */ + +//! Console command handler for the 'event' command. +COMM_Console_Command_Result_T COMM_HandleEventCommand(char8 * data, uint32_t size) +{ + // data[0] through data[5] is 'event '. + + if (data[6] == '?') + { + COMM_Console_Print_String("event ? Display this help.\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String("event raw Inject the event with ID .\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String("event tag Send tag(s).\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + COMM_Console_Print_String("event hit Simulate a hit from team for damage.\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + } + else if ( (data[6] == 'r') && + (data[7] == 'a') && + (data[8] == 'w') ) + + { + if (COMM_Console_IsEndOfMessage(data[9])) + { + COMM_Console_Print_String("ERROR: missing event ID!\n"); + } + else if (data[9] == ' ') + { + uint16_t id = 0; + + if (COMM_Console_DecodeParameterUInt16(&(data[10]), &id) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + if ((id > KEVENT_NO_EVENT) && (id < KEVENT_IS_OUT_OF_RANGE)) + { + KEvent_T raw_event = { .ID = id, .Data = (void *)0x00 }; + Post_KEvent(&raw_event); + } + else + { + COMM_Console_Print_String("ERROR: specified event ID ("); + COMM_Console_Print_UInt16(id); + COMM_Console_Print_String(") is invalid!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: could not comprehend event ID!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: unrecognized or mangled command!\n"); + } + } + else if ( (data[6] == 't') && + (data[7] == 'a') && + (data[8] == 'g') ) + + { + if (COMM_Console_IsEndOfMessage(data[9])) + { + if (Send_Tag() == SYSTEMK_RESULT_SUCCESS) + { + COMM_Console_Print_String("Tag sent.\n"); + } + else + { + COMM_Console_Print_String("Error: Couldn't send tag!\n"); + } + } + else if (data[9] == ' ') + { + uint16_t times = 0; + + if (COMM_Console_DecodeParameterUInt16(&(data[10]), ×) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + while (times > 0) + { + if (Send_Tag() == SYSTEMK_RESULT_SUCCESS) + { + COMM_Console_Print_String("Tag sent.\n"); + } + else + { + COMM_Console_Print_String("Error: Couldn't send tag!\n"); + } + //! \todo Why can't the console command 'event tag ' send tags faster than once per second? + vTaskDelay(1000 / portTICK_PERIOD_MS); + times--; + } + } + else + { + COMM_Console_Print_String("ERROR: could not comprehend tag repetitions!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: unrecognized or mangled command!\n"); + } + } + else if ( (data[6] == 'h') && + (data[7] == 'i') && + (data[8] == 't') ) + + { + if (COMM_Console_IsEndOfMessage(data[9])) + { + Simulate_Hit(1, 10); + COMM_Console_Print_String("Hit!\n"); + } + else if (data[9] == ' ') + { + uint8_t team_ID = 0; + uint16_t damage = 10; + + if (COMM_Console_DecodeParameterUInt8(&(data[10]), &team_ID) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + const char * damage_location; + + // Damage is the first parameter after team ID. + if (COMM_Console_FindNthParameter(&(data[10]), 1, &damage_location) == COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + if (COMM_Console_DecodeParameterUInt16(damage_location, &damage) != COMM_CONSOLE_PARAMETER_RESULT_SUCCESS) + { + COMM_Console_Print_String("ERROR: could not comprehend damage--using default.\n"); + damage = 10; + } + } + Simulate_Hit(team_ID, damage); + COMM_Console_Print_String("Hit!\n"); + } + else + { + COMM_Console_Print_String("ERROR: could not comprehend team ID!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: unrecognized or mangled command!\n"); + } + } + else + { + COMM_Console_Print_String("ERROR: Unknown event command!\n"); + } + + + return COMM_CONSOLE_CMD_RESULT_SUCCESS; +} + +/* Private Functions */ + +static void Simulate_Hit(uint8_t team_ID, uint16_t damage) +{ + static DecodedPacket_T Simulated_Tag_Rx_Buffer; + static KEvent_T tag_received_event; + + Simulated_Tag_Rx_Buffer.Tag.type = DECODED_PACKET_TYPE_TAG_RECEIVED; + Simulated_Tag_Rx_Buffer.Tag.protocol = LASER_X_PROTOCOL; + Simulated_Tag_Rx_Buffer.Tag.player_ID = 0x00; + Simulated_Tag_Rx_Buffer.Tag.team_ID = team_ID; + Simulated_Tag_Rx_Buffer.Tag.damage = damage; + Simulated_Tag_Rx_Buffer.Tag.color = GetColorFromTeamID(team_ID); + tag_received_event.ID = KEVENT_TAG_RECEIVED; + tag_received_event.Data = &Simulated_Tag_Rx_Buffer; + Post_KEvent(&tag_received_event); +} + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) diff --git a/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_STATE_ConsoleCommands.h b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_STATE_ConsoleCommands.h new file mode 100644 index 0000000..0c29268 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/COMM/ConsoleCommands/COMM_STATE_ConsoleCommands.h @@ -0,0 +1,29 @@ +/** \file + * \brief This file declares the serial console commands for the high-level state machine. + */ + +#ifndef COMM_STATE_CONSOLECOMMANDS_H +#define COMM_STATE_CONSOLECOMMANDS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#if (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +/* Public Variables */ + +/* Public Functions */ +COMM_Console_Command_Result_T COMM_HandleEventCommand(char8 * data, uint32_t size); + +#endif // (CONFIG__FEATURE_COMM_CONSOLE == CONFIG__FEATURE_ENABLED) + +#ifdef __cplusplus +} +#endif + +#endif // COMM_STATE_CONSOLECOMMANDS_H diff --git a/2020TPCAppNoDFU.cydsn/CONFIG/CONFIG.h b/2020TPCAppNoDFU.cydsn/CONFIG/CONFIG.h new file mode 100644 index 0000000..0270516 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/CONFIG/CONFIG.h @@ -0,0 +1,84 @@ +/** \dir "CONFIG" + * + * \brief This directory contains configuration files for this software. + * + */ + +/** \file + * \brief This file includes project-wide for this software. + * + * This file should be included by every file outside the CONFIG package! + * + * \note As always, should be included before this file. + */ + +#ifndef CONFIG_H +#define CONFIG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "CONFIG_RTOS.h" + +//! Value of audio volume represeting the maximum volume possible for this device. +#define CONFIG_KTAG_MAX_AUDIO_VOLUME 30 + +//! Value of audio volume represeting the minimum volume possible for this device. +#define CONFIG_KTAG_MIN_AUDIO_VOLUME 5 + +//! Time (in milliseconds) after starting a game before the countdown begins. +//#define CONFIG_KTAG_T_DEFAULT_START_GAME_in_ms (30 * 1000) +#define CONFIG_KTAG_T_DEFAULT_START_GAME_in_ms (3 * 1000) + +//! true if the hardware includes internal (on-chip) NVM. +#define CONFIG__HAS_INTERNAL_NVM true + +//! true if the hardware includes an external (I2C) NVM chip. +#define CONFIG__HAS_EXTERNAL_NVM true + +// '||' || '|| '||''|. TM +// || ... || || || ... .. ... ... .... ... +// || || || ||'''|. ||' '' || || '|. | +// || || || || || || || || '|.| +// .||.....| .||. .||. .||...|' .||. '|..'|. '| + +#if (defined LIL_BRUV) || (defined LITTLE_BOY_BLUE) + +//! Number of NeoPixel channels supported. +#define CONFIG_KTAG_N_NEOPIXEL_CHANNELS 1 + +//! Maximum number of NeoPixels on a single channel. +#define CONFIG_KTAG_MAX_NEOPIXELS_PER_CHANNEL 5 + + + +// /\ /\\ /\ /\\ TM +// ( ) || || ( ) || || |''||''| '||''|. ..|'''.| +// // || || // || || || || || .|' ' +// // || || // || || || ||...|' || +// /( || || /( || || || || '|. . +// {___ \\/ {___ \\/ .||. .||. ''|....' + +#elif (defined TWENTY20TPC) + +//! Number of NeoPixel channels supported. +#define CONFIG_KTAG_N_NEOPIXEL_CHANNELS 4 + +//! Maximum number of NeoPixels on a single channel. +#define CONFIG_KTAG_MAX_NEOPIXELS_PER_CHANNEL 8 + + + +#else + #error "No recognized KTag models defined. Supported models are: LIL_BRUV, LITTLE_BOY_BLUE, and TWENTY20TPC." +#endif + +//! Time between NeoPixel animation frames, in milliseconds. +#define CONFIG_KTAG_ANIMATION_STEP_TIME_IN_ms 10 + +#ifdef __cplusplus +} +#endif + +#endif // CONFIG_H \ No newline at end of file diff --git a/2020TPCAppNoDFU.cydsn/CONFIG/CONFIG_RTOS.c b/2020TPCAppNoDFU.cydsn/CONFIG/CONFIG_RTOS.c new file mode 100644 index 0000000..9c97c6c --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/CONFIG/CONFIG_RTOS.c @@ -0,0 +1,113 @@ +/** \file + * \brief This file defines and registers the tasks used by the Real-Time Operating System. + * + * See CONFIG_RTOS.h for a detailed description of the functionality implemented by this code. + */ + +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +/*---------------------------------------------------------------------------*/ +/* Task priorities: Low priority numbers denote low priority tasks. + * + * Low == 0 == tskIDLE_PRIORITY + * ... + * High == (configMAX_PRIORITIES - 1) + * + * See http://www.freertos.org/RTOS-task-priority.html for more information. + */ +#define CAPSENSE_TASK_PRIORITY (tskIDLE_PRIORITY + 3) +#define SAMPLE_TASK_PRIORITY (tskIDLE_PRIORITY + 2) +#define FIRE_CONTROL_TASK_PRIORITY (tskIDLE_PRIORITY + 1) +#define AUDIO_TASK_PRIORITY (tskIDLE_PRIORITY + 2) +#define NEOPIXELS_TASK_PRIORITY (tskIDLE_PRIORITY + 2) +#define TAG_SENSORS_TASK_PRIORITY (tskIDLE_PRIORITY + 5) +#define SWITCHES_TASK_PRIORITY (tskIDLE_PRIORITY + 2) +#define NVM_EXTERNAL_TASK_PRIORITY (tskIDLE_PRIORITY + 2) +#define NVM_ON_CHIP_EEPROM_TASK_PRIORITY (tskIDLE_PRIORITY + 1) +#define COMM_CONSOLE_TASK_PRIORITY (tskIDLE_PRIORITY + 2) +#define COMM_BLE_TASK_PRIORITY (tskIDLE_PRIORITY + 4) + + +/* External Variables [Only if necessary!] */ + +/* External Function Prototypes [Only if necessary!] */ + +/* Public Variables */ + +//! Array of all the handles for the configured RTOS tasks. +TaskHandle_t * const CONFIG_TaskHandles[] = {&HW_CapSense_Task_Handle, + &Fire_Control_Task_Handle, + &Sample_Task_Handle, + &Audio_Task_Handle, + &NeoPixels_Task_Handle, + &Tag_Sensors_Task_Handle, + &Switches_Task_Handle, + &State_Machine_Task_Handle, + &NVM_ExternalEEPROM_Task_Handle, + &NVM_OnChipEEPROM_Task_Handle, + &COMM_Console_Task_Handle, + &COMM_BLE_Task_Handle}; + +//! Size of the #CONFIG_TaskHandles array (i.e. the number of configured tasks). +const uint8_t CONFIG_N_TASK_HANDLES = (uint8_t) (sizeof(CONFIG_TaskHandles) / sizeof(TaskHandle_t *)); + +/* Private Variables */ + +/* Private Function Prototypes */ + +/* Public Functions */ + +void CONFIG_InitTasks(void) +{ + HW_CapSense_Init(); + COMM_I2C_Init(); + NVM_InitExternalEEPROM(); + NVM_InitOnChipEEPROM(); + Sample_Task_Init(); + Init_Fire_Control(); + Tag_Sensors_Init(); + Init_Audio(); + Switches_Init(); + COMM_Console_Init(); + COMM_BLE_Init(); +} + +//! Registers tasks with the kernel, and then runs them. +/*! + * This function should not return. +*/ +void CONFIG_RunTasks(void) +{ + (void) xTaskCreate(HW_CapSense_Task, "CapSense Task", HW_CAPSENSE_TASK_STACK_SIZE_in_bytes, NULL, CAPSENSE_TASK_PRIORITY, &HW_CapSense_Task_Handle); + (void) xTaskCreate(Fire_Control_Task, "Fire Control Task", configMINIMAL_STACK_SIZE, NULL, FIRE_CONTROL_TASK_PRIORITY, &Fire_Control_Task_Handle); + (void) xTaskCreate(Sample_Task, "Sample Task", configMINIMAL_STACK_SIZE, NULL, SAMPLE_TASK_PRIORITY, &Sample_Task_Handle); + (void) xTaskCreate(Audio_Task, "Audio Task", configMINIMAL_STACK_SIZE, NULL, AUDIO_TASK_PRIORITY, &Audio_Task_Handle); + (void) xTaskCreate(NeoPixels_Task, "NeoPixels Task", configMINIMAL_STACK_SIZE, NULL, NEOPIXELS_TASK_PRIORITY, &NeoPixels_Task_Handle); + (void) xTaskCreate(Tag_Sensors_Task, "Tag Sensors Task", configMINIMAL_STACK_SIZE, NULL, TAG_SENSORS_TASK_PRIORITY, &Tag_Sensors_Task_Handle); + (void) xTaskCreate(Switches_Task, "Switches Task", configMINIMAL_STACK_SIZE, NULL, SWITCHES_TASK_PRIORITY, &Switches_Task_Handle); + (void) xTaskCreate(NVM_OnChipEEPROMTask, "NVMOn", NVM_ON_CHIP_EEPROM_TASK_STACK_SIZE_in_bytes, NULL, NVM_ON_CHIP_EEPROM_TASK_PRIORITY, &NVM_OnChipEEPROM_Task_Handle); + (void) xTaskCreate(NVM_ExternalEEPROMTask, "NVMEx", NVM_EXTERNAL_EEPROM_TASK_STACK_SIZE_in_bytes, NULL, NVM_EXTERNAL_TASK_PRIORITY, &NVM_ExternalEEPROM_Task_Handle); + (void) xTaskCreate(COMM_Console_Task, "Console Task", COMM_CONSOLE_TASK_STACK_SIZE_in_bytes, NULL, COMM_CONSOLE_TASK_PRIORITY, &COMM_Console_Task_Handle); + (void) xTaskCreate(COMM_BLE_Task, "BLE Task", COMM_BLE_TASK_STACK_SIZE_in_bytes, NULL, COMM_BLE_TASK_PRIORITY, &COMM_BLE_Task_Handle); + + if (Initialize_SystemK() != SYSTEMK_RESULT_SUCCESS) + { + KLOG_ERROR("CONFIG", "Failed to initilaize SystemK!"); + } + + /* This should not return. */ + vTaskStartScheduler(); + + // Something went wrong. +#ifdef DEBUG + // Break into the debugger. + __BKPT(0); +#else // DEBUG + __NVIC_SystemReset(); +#endif // DEBUG +} + +/* Private Functions */ diff --git a/2020TPCAppNoDFU.cydsn/CONFIG/CONFIG_RTOS.h b/2020TPCAppNoDFU.cydsn/CONFIG/CONFIG_RTOS.h new file mode 100644 index 0000000..26709c3 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/CONFIG/CONFIG_RTOS.h @@ -0,0 +1,29 @@ +/** \file + * \brief This file configures the Real-Time Operating System (RTOS). + */ + +#ifndef CONFIG_RTOS_H +#define CONFIG_RTOS_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Include Files */ + +/* Preprocessor and Type Definitions */ + +/* Public Variables */ + +extern TaskHandle_t * const CONFIG_TaskHandles[]; +extern const uint8_t CONFIG_N_TASK_HANDLES; + +/* Public Functions */ +void CONFIG_InitTasks(void); +void CONFIG_RunTasks(void); + +#ifdef __cplusplus +} +#endif + +#endif // CONFIG_RTOS_H diff --git a/2020TPCAppNoDFU.cydsn/Fire_Control.c b/2020TPCAppNoDFU.cydsn/Fire_Control.c new file mode 100644 index 0000000..6033112 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/Fire_Control.c @@ -0,0 +1,223 @@ +/* Include Files */ +#include "KTag.h" + +#define FIRE_CONTROL_REGISTER__IR_OFF 0b00000 +#define FIRE_CONTROL_REGISTER__IR_ON_MODULATED_LOW_POWER 0b00011 +#define FIRE_CONTROL_REGISTER__IR_ON_MODULATED_HIGH_POWER 0b00101 +#define FIRE_CONTROL_REGISTER__IR_ON_MODULATED_MAX_POWER 0b11111 +#define FIRE_CONTROL_REGISTER__IR_ON_UNMODULATED_LOW_POWER 0b00010 +#define FIRE_CONTROL_REGISTER__IR_ON_UNMODULATED_HIGH_POWER 0b00100 +#define FIRE_CONTROL_REGISTER__IR_ON_UNMODULATED_MAX_POWER 0b00110 + +#define TRIGGER_STATUS_REGISTER__NO_ACTION 0x00 +#define TRIGGER_STATUS_REGISTER__TRIGGER_PULLED 0x01 +#define TRIGGER_STATUS_REGISTER__TRIGGER_RELEASED 0x02 + + +void Trigger_Interrupt_ISR(); +void Bit_Stream_Timer_ISR(); + +TimedPulseTrain_T * Shot_Buffer; +TagPacket_T Shot_Packet; + +TaskHandle_t Fire_Control_Task_Handle; + +static TimedPulseTrain_T * Active_Pulse_Train = NULL; +static uint8_t Active_Bitstream_Index = 0; + +static TickType_t TicksAtTriggerPress; + +static inline void Initiate_Pulse_Train(TimedPulseTrain_T * pulsetrain) +{ + Bit_Stream_Timer_Disable(); + Active_Pulse_Train = pulsetrain; + Active_Bitstream_Index = 0; + + if (Active_Pulse_Train->bitstream[Active_Bitstream_Index].symbol == MARK) + { + Fire_Control_Register_Write(FIRE_CONTROL_REGISTER__IR_ON_MODULATED_MAX_POWER); + } + else + { + Fire_Control_Register_Write(FIRE_CONTROL_REGISTER__IR_OFF); + } + Bit_Stream_Timer_SetPeriod(Active_Pulse_Train->bitstream[0].duration); + Bit_Stream_Timer_SetCounter(0); + Active_Bitstream_Index++; + Bit_Stream_Timer_Enable(); + Bit_Stream_Timer_TriggerStart(); +} + +static inline void Next_Bit(void) +{ + static BaseType_t xHigherPriorityTaskWoken = pdFALSE; + + Bit_Stream_Timer_Disable(); + + if (Active_Pulse_Train->bitstream[Active_Bitstream_Index].duration != LAST_PULSE) + { + if (Active_Pulse_Train->bitstream[Active_Bitstream_Index].symbol == MARK) + { + Fire_Control_Register_Write(FIRE_CONTROL_REGISTER__IR_ON_MODULATED_MAX_POWER); + } + else + { + Fire_Control_Register_Write(FIRE_CONTROL_REGISTER__IR_OFF); + } + + if (Active_Bitstream_Index < ((2*MAX_PULSES) - 2)) + { + Bit_Stream_Timer_SetPeriod(Active_Pulse_Train->bitstream[Active_Bitstream_Index].duration); + Bit_Stream_Timer_SetCounter(0); + Active_Bitstream_Index++; + Bit_Stream_Timer_Enable(); + Bit_Stream_Timer_TriggerStart(); + } + else + { + // The bitstream is too long! + + // Turn the IR Emitter off, and wait a long time. + Fire_Control_Register_Write(FIRE_CONTROL_REGISTER__IR_OFF); + xSemaphoreGiveFromISR(NeoPixels_Semaphore, &xHigherPriorityTaskWoken); + Bit_Stream_Timer_SetPeriod(UINT16_MAX); + Bit_Stream_Timer_SetCounter(0); + Active_Pulse_Train = NULL; + Bit_Stream_Timer_Enable(); + Bit_Stream_Timer_TriggerStart(); + } + } + else + { + // Turn the IR Emitter off, and wait a long time. + Fire_Control_Register_Write(FIRE_CONTROL_REGISTER__IR_OFF); + xSemaphoreGiveFromISR(NeoPixels_Semaphore, &xHigherPriorityTaskWoken); + Bit_Stream_Timer_SetPeriod(UINT16_MAX); + Bit_Stream_Timer_SetCounter(0); + Active_Pulse_Train = NULL; + Bit_Stream_Timer_Enable(); + Bit_Stream_Timer_TriggerStart(); + } + + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); +} + +void Init_Fire_Control(void) +{ + // Register and enable the ISRs. + Cy_SysInt_Init(&Trigger_Interrupt_cfg, Trigger_Interrupt_ISR); + Cy_SysInt_Init(&Bit_Stream_Timer_Interrupt_cfg, Bit_Stream_Timer_ISR); + NVIC_EnableIRQ(Trigger_Interrupt_cfg.intrSrc); + NVIC_EnableIRQ(Bit_Stream_Timer_Interrupt_cfg.intrSrc); + + // Initialize the hardware. + Bit_Stream_Timer_Clock_Enable(); + Bit_Stream_Timer_Init(&Bit_Stream_Timer_config); + Bit_Stream_Timer_SetPeriod(2); + Bit_Stream_Timer_Start(); + SW_CLK_Enable(); + PWM_IR_Modulation_Start(); + + + Fire_Control_Register_Write(FIRE_CONTROL_REGISTER__IR_OFF); +} + +void Fire_Control_Task(void * pvParameters) +{ + while (true) + { + vTaskDelay(1000 / portTICK_PERIOD_MS); + } +} + +SystemKResult_T Prepare_Tag() +{ + Shot_Packet.player_ID = NVM_PLAYER_ID; + Shot_Packet.team_ID = NVM_TEAM_ID; + Weapon_t weapon = GetWeaponFromID(NVM_WEAPON_ID); + Shot_Packet.color = (uint32_t)PROTOCOLS_GetColor(weapon.Protocol, Shot_Packet.team_ID, Shot_Packet.player_ID); + Shot_Packet.protocol = weapon.Protocol; + Shot_Packet.damage = weapon.Damage_Per_Shot; + Shot_Buffer = PROTOCOLS_EncodePacket(&Shot_Packet); + Fire_Control_Set_Modulation_Frequency(PROTOCOLS_GetModulationFrequency(weapon.Protocol)); + return SYSTEMK_RESULT_SUCCESS; +} + +SystemKResult_T Send_Tag() +{ + xSemaphoreTake(NeoPixels_Semaphore, portMAX_DELAY); + Initiate_Pulse_Train(Shot_Buffer); + + KEvent_T tag_sent_event = { .ID = KEVENT_TAG_SENT, .Data = (void *)0x00 }; + Post_KEvent(&tag_sent_event); + + return SYSTEMK_RESULT_SUCCESS; +} + +void Fire_Control_Set_Modulation_Frequency(ModulationFrequency_T freq) +{ + PWM_IR_Modulation_TriggerKill(); + if (freq == FREQUENCY_38kHz) + { + PWM_IR_Modulation_SetPeriod0(314); + //PWM_IR_Modulation_SetCompare0(314/2); // 50% Duty Cycle + PWM_IR_Modulation_SetCompare0((314 * 3)/10); // 30% Duty Cycle + } + else // (freq == FREQUENCY_56kHz) + { + PWM_IR_Modulation_SetPeriod0(213); + //PWM_IR_Modulation_SetCompare0(213/2); // 50% Duty Cycle + PWM_IR_Modulation_SetCompare0((213 * 3)/10); // 30% Duty Cycle + } + PWM_IR_Modulation_TriggerStart(); +} + +//! ISR for the trigger input. +void Trigger_Interrupt_ISR() +{ + portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + // Clear the interrupt. + NVIC_ClearPendingIRQ(Trigger_Interrupt_cfg.intrSrc); + + // Read the trigger register to know if this was a pull or a release. + uint8_t trigger_status = Trigger_Status_Reg_Read(); + + if ((trigger_status & TRIGGER_STATUS_REGISTER__TRIGGER_PULLED) == TRIGGER_STATUS_REGISTER__TRIGGER_PULLED) + { + TicksAtTriggerPress = xTaskGetTickCountFromISR(); + KEvent_T switch_event = {.ID = KEVENT_CENTER_SWITCH_PRESSED, .Data = NULL}; + Post_KEvent_From_ISR(&switch_event, &xHigherPriorityTaskWoken); + } + else if ((trigger_status & TRIGGER_STATUS_REGISTER__TRIGGER_RELEASED) == TRIGGER_STATUS_REGISTER__TRIGGER_RELEASED) + { + uint32_t triggerPressDurationInms = pdTICKS_TO_MS(xTaskGetTickCountFromISR() - TicksAtTriggerPress); + KEvent_T switch_event = {.ID = KEVENT_CENTER_SWITCH_RELEASED, .Data = (void *) triggerPressDurationInms}; + Post_KEvent_From_ISR(&switch_event, &xHigherPriorityTaskWoken); + } + else + { + // What happened!!? + } + + // If an event was enqueued above, a context switch might be required. + // xHigherPriorityTaskWoken was initialized to pdFALSE on interrupt entry. If calling + // xSemaphoreGiveFromISR() caused a task to unblock, and the unblocked task has a + // priority equal to or higher than the currently running task (the task that was + // interrupted by this ISR), then xHigherPriorityTaskWoken will have been set to pdTRUE + // and portEND_SWITCHING_ISR() will request a context switch to the newly unblocked task. + portEND_SWITCHING_ISR( xHigherPriorityTaskWoken ); +} + +void Bit_Stream_Timer_ISR() +{ + // Get all the enabled pending interrupts... + uint32_t source = Bit_Stream_Timer_GetInterruptStatusMasked(); + // ...and clear them. + Bit_Stream_Timer_ClearInterrupt(source); + + if (Active_Pulse_Train != NULL) + { + Next_Bit(); + } +} diff --git a/2020TPCAppNoDFU.cydsn/Fire_Control.h b/2020TPCAppNoDFU.cydsn/Fire_Control.h new file mode 100644 index 0000000..bcf8e72 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/Fire_Control.h @@ -0,0 +1,13 @@ +#ifndef FIRE_CONTROL_H +#define FIRE_CONTROL_H + +#include +#include + +extern TaskHandle_t Fire_Control_Task_Handle; + +void Init_Fire_Control(void); +void Fire_Control_Task(void * pvParameters); +void Fire_Control_Set_Modulation_Frequency(ModulationFrequency_T freq); + +#endif // FIRE_CONTROL_H diff --git a/2020TPCAppNoDFU.cydsn/FreeRTOSConfig.h b/2020TPCAppNoDFU.cydsn/FreeRTOSConfig.h new file mode 100644 index 0000000..ff41915 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/FreeRTOSConfig.h @@ -0,0 +1,228 @@ +/* + * FreeRTOS Kernel V10.0.1 + * Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! +*/ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#include "syslib/cy_syslib.h" + +#define configUSE_PREEMPTION 1 +#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0 +#define configUSE_TICKLESS_IDLE 0 +#define configCPU_CLOCK_HZ SystemCoreClock +#define configTICK_RATE_HZ 1000u +#define configMAX_PRIORITIES 15 +#define configMINIMAL_STACK_SIZE 512 +#define configMAX_TASK_NAME_LEN 16 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 1 +#define configUSE_TASK_NOTIFICATIONS 1 +#define configUSE_MUTEXES 1 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configUSE_COUNTING_SEMAPHORES 1 +#define configQUEUE_REGISTRY_SIZE 10 +#define configUSE_QUEUE_SETS 0 +#define configUSE_TIME_SLICING 0 +#define configUSE_NEWLIB_REENTRANT 0 +#define configENABLE_BACKWARD_COMPATIBILITY 0 +#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 5 + +/* Memory allocation related definitions. */ +#define configSUPPORT_STATIC_ALLOCATION 1 +#define configSUPPORT_DYNAMIC_ALLOCATION 1 +#define configTOTAL_HEAP_SIZE (64*1024) +#define configAPPLICATION_ALLOCATED_HEAP 0 + +/* Hook function related definitions. */ +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 0 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_MALLOC_FAILED_HOOK 1 +#define configUSE_DAEMON_TASK_STARTUP_HOOK 0 + +/* Run time and task stats gathering related definitions. */ +#define configGENERATE_RUN_TIME_STATS 1 +#define configUSE_TRACE_FACILITY 1 +#define configUSE_STATS_FORMATTING_FUNCTIONS 1 + + +//! Debug Exception and Monitor Control register +#define CORE_DBG_EXC_MON_CTL (*(uint32_t *)0xE000EDFC) + +//! DWT Control Register +#define DWT_CTRL (*(uint32_t *)0xE0001000) + +//! DWT Current PC Sampler Cycle Count Register +/*! + * Use the DWT Current PC Sampler Cycle Count Register to count the number of core cycles. This + * count can measure elapsed execution time. + */ +#define DWT_CYCCNT (*(uint32_t *)0xE0001004) + +//! Initializes the Data Watchpoint and Trace Unit and starts the CYCCNT counter. +static inline void vCONFIGURE_TIMER_FOR_RUN_TIME_STATS(void) +{ + // If the Data Watchpoint and Trace Unit is present, #DWT_CTRL will be non-zero. + if (DWT_CTRL != 0) + { + // Set bit 24 (TRCENA) on the CORE_DBG_EXC_MON_CTL register to enable use of the DWT. + CORE_DBG_EXC_MON_CTL |= (1 << 24); + // Initialize the count register. + DWT_CYCCNT = 0; + // Set bit 0 (CYCCNTENA) on the DWT_CTRL register to enable the CYCCNT counter. + DWT_CTRL |= (1 << 0); + } +} + +#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS vCONFIGURE_TIMER_FOR_RUN_TIME_STATS + +//! Returns the current value of the DWT Current PC Sampler Cycle Count Register +/*! + * Use the DWT Current PC Sampler Cycle Count Register to count the number of core cycles. This + * count can measure elapsed execution time. + */ +static inline uint32_t ulGET_RUN_TIME_COUNTER_VALUE(void) +{ + return DWT_CYCCNT; +} + +#define portGET_RUN_TIME_COUNTER_VALUE ulGET_RUN_TIME_COUNTER_VALUE + +/* Co-routine related definitions. */ +#define configUSE_CO_ROUTINES 1 +#define configMAX_CO_ROUTINE_PRIORITIES 2 + +/* Software timer related definitions. */ +#define configUSE_TIMERS 1 +#define configTIMER_TASK_PRIORITY 3 +#define configTIMER_QUEUE_LENGTH 10 +#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE + +/* FreeRTOS MPU specific definitions. */ +#define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS 0 + +/* +Interrupt nesting behavior configuration. +This is explained here: http://www.freertos.org/a00110.html + +Priorities are controlled by two macros: +- configKERNEL_INTERRUPT_PRIORITY determines the priority of the RTOS daemon task +- configMAX_API_CALL_INTERRUPT_PRIORITY dictates the priority of ISRs that make API calls + +Notes: +1. Interrupts that do not call API functions should be >= configKERNEL_INTERRUPT_PRIORITY + and will nest. +2. Interrupts that call API functions must have priority between KERNEL_INTERRUPT_PRIORITY + and MAX_API_CALL_INTERRUPT_PRIORITY (inclusive). +3. Interrupts running above MAX_API_CALL_INTERRUPT_PRIORITY are never delayed by the OS. +*/ +/* +PSoC 6 __NVIC_PRIO_BITS = 3 + +0 (high) +1 MAX_API_CALL_INTERRUPT_PRIORITY 001xxxxx (0x3F) +2 +3 +4 +5 +6 +7 (low) KERNEL_INTERRUPT_PRIORITY 111xxxxx (0xFF) + +!!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!! +See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html + +If you call a FreeRTOS API function from an interrupt with priority higher than +MAX_API_CALL_INTERRUPT_PRIORITY FreeRTOS will generate an exception. If you need +to call a FreeRTOS API function from your system’s highest priority interrupt +you must reduce all interrupt priorities to MAX_API_CALL_INTERRUPT_PRIORITY or +lower. + +If your system pipe (IPC) interrupt priority is less than or equal to +MAX_API_CALL_INTERRUPT_PRIORITY then care must be taken with code that writes to +flash (including the Flash/BLE/Emulated EEPROM/Bootloader drivers from Cypress +PDL). The duration of critical sections must be kept short - see the +Configuration Considerations section of the flash driver in the PDL API +Reference. + +*/ + +/* Put KERNEL_INTERRUPT_PRIORITY in top __NVIC_PRIO_BITS bits of CM4 register */ +#define configKERNEL_INTERRUPT_PRIORITY 0xFF +/* +Put MAX_SYSCALL_INTERRUPT_PRIORITY in top __NVIC_PRIO_BITS bits of CM4 register +NOTE For IAR compiler make sure that changes of this macro is reflected in +file portable\IAR\CM4F\portasm.s in PendSV_Handler: routine +*/ +#define configMAX_SYSCALL_INTERRUPT_PRIORITY 0x3F +/* configMAX_API_CALL_INTERRUPT_PRIORITY is a new name for configMAX_SYSCALL_INTERRUPT_PRIORITY + that is used by newer ports only. The two are equivalent. */ +#define configMAX_API_CALL_INTERRUPT_PRIORITY configMAX_SYSCALL_INTERRUPT_PRIORITY + + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_xResumeFromISR 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_xTaskGetSchedulerState 1 +#define INCLUDE_xTaskGetCurrentTaskHandle 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 +#define INCLUDE_xTaskGetIdleTaskHandle 1 +#define INCLUDE_eTaskGetState 1 +#define INCLUDE_xEventGroupSetBitFromISR 1 +#define INCLUDE_xTimerPendFunctionCall 0 +#define INCLUDE_xTaskAbortDelay 0 +#define INCLUDE_xTaskGetHandle 0 +#define INCLUDE_xTaskResumeFromISR 1 + +/* Normal assert() semantics without relying on the provision of an assert.h +header file. */ +#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); } + +/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS +standard names - or at least those used in the unmodified vector table. */ +#define vPortSVCHandler SVC_Handler +#define xPortPendSVHandler PendSV_Handler +#define xPortSysTickHandler SysTick_Handler + +#endif /* FREERTOS_CONFIG_H */ diff --git a/2020TPCAppNoDFU.cydsn/HW/HW.h b/2020TPCAppNoDFU.cydsn/HW/HW.h new file mode 100644 index 0000000..0a27ecd --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/HW/HW.h @@ -0,0 +1,50 @@ +/** \dir "HW" + * + * \brief This directory contains source code interfacing to the lowest level of the hardware on this CPU. + * + */ + +/** \file + * \brief This file defines the interface to the low-level hardware used by this software. + * + * This file should be included by any file outside the HW package wishing to make use + * of any of the HW functionality. + * + * \note As always, and should be included before this file. + */ + +#ifndef HW_H +#define HW_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +//! Represents the states of a Digital Input or Digital Output. +typedef enum +{ + //! Represents low voltage (logic '0') on a digital input or output. + HW_DIGITAL_STATE_LOW = 0, + + //! Represents high voltage (logic '1') on a digital input or output. + HW_DIGITAL_STATE_HIGH = 1, + + //! Used when the state of a digital input or output cannot be determined. + HW_DIGITAL_STATE_UNKNOWN = 2 +} HW_DigitalState_T; + +/* Include Files */ + +#include "HW_CapSense.h" + +/* Public Variables */ + +/* Public Functions */ + +#ifdef __cplusplus +} +#endif + +#endif // HW_H diff --git a/2020TPCAppNoDFU.cydsn/HW/HW_CapSense.c b/2020TPCAppNoDFU.cydsn/HW/HW_CapSense.c new file mode 100644 index 0000000..14db4b5 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/HW/HW_CapSense.c @@ -0,0 +1,125 @@ +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +#define CAPSENSE_TASK_PERIOD_IN_ms 50 + +/* Public Variables */ + +TaskHandle_t HW_CapSense_Task_Handle; + +/* Private Variables */ + +static const TickType_t CapSense_Task_Delay = CAPSENSE_TASK_PERIOD_IN_ms / portTICK_PERIOD_MS; + +static bool CapSense_One_Pressed = false; +static bool CapSense_Two_Pressed = false; + +/* Private Function Prototypes */ + + +/* Public Functions */ + +//! Initializes the capacitive touch sensing. +void HW_CapSense_Init(void) +{ +} + +//! Capacitive touch sensing task: Manages the capsense, using the PSoC API functions. +/*! + * + */ +void HW_CapSense_Task(void * pvParameters) +{ + TickType_t xLastWakeTime; + + // Initialize the xLastWakeTime variable with the current time. + xLastWakeTime = xTaskGetTickCount(); + + // Start up the capsense component, and initiate the first scan. + // Note that this can't be done in HW_CapSense_Init(), since it requires interrupts to be enabled. + CapSense_Start(); + CapSense_ScanAllWidgets(); + + vTaskDelayUntil(&xLastWakeTime, CapSense_Task_Delay); + + while (true) + { + // Check to see if the CapSense hardware is still busy with a previous scan. + if (CapSense_IsBusy() == CapSense_NOT_BUSY) + { + // Process all the widgets and read the touch information. + CapSense_ProcessAllWidgets(); + + // Perform the on-change logic for "Button One". + if (CapSense_IsSensorActive(CapSense_BUTTON0_WDGT_ID, CapSense_BUTTON0_SNS0_ID)) + { + if (CapSense_One_Pressed == false) + { + KEvent_T switch_event = {.ID = KEVENT_CAPSENSE_ONE_PRESSED, .Data = NULL}; + Post_KEvent(&switch_event); + } + CapSense_One_Pressed = true; + } + else + { + if (CapSense_One_Pressed == true) + { + KEvent_T switch_event = {.ID = KEVENT_CAPSENSE_ONE_RELEASED, .Data = NULL}; + Post_KEvent(&switch_event); + } + CapSense_One_Pressed = false; + } + + // Perform the on-change logic for "Button Two". + if (CapSense_IsSensorActive(CapSense_BUTTON0_WDGT_ID, CapSense_BUTTON0_SNS1_ID)) + { + if (CapSense_Two_Pressed == false) + { + KEvent_T switch_event = {.ID = KEVENT_CAPSENSE_TWO_PRESSED, .Data = NULL}; + Post_KEvent(&switch_event); + } + CapSense_Two_Pressed = true; + } + else + { + if (CapSense_Two_Pressed == true) + { + KEvent_T switch_event = {.ID = KEVENT_CAPSENSE_TWO_RELEASED, .Data = NULL}; + Post_KEvent(&switch_event); + } + CapSense_Two_Pressed = false; + } + + // Initiate the next scan. + CapSense_ScanAllWidgets(); + } + + vTaskDelayUntil(&xLastWakeTime, CapSense_Task_Delay); + } +} + +//! Gets the state of the given CapSense button. +/*! + * \param button the button in question + * \return true if the button was pressed last time it was checked; false otherwise + */ +bool HW_IsCapsenseButtonPressed(HW_CapSenseButton_T button) +{ + bool pressed = false; + + if ((button == HW_CAPSENSE_BUTTON_ONE) && (CapSense_One_Pressed == true)) + { + pressed = true; + } + else if ((button == HW_CAPSENSE_BUTTON_TWO) && (CapSense_Two_Pressed == true)) + { + pressed = true; + } + + return pressed; +} + +/* Private Functions */ + diff --git a/2020TPCAppNoDFU.cydsn/HW/HW_CapSense.h b/2020TPCAppNoDFU.cydsn/HW/HW_CapSense.h new file mode 100644 index 0000000..f357e19 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/HW/HW_CapSense.h @@ -0,0 +1,40 @@ +/** \file + * \brief This file defines the interface to the capacitive touch sensing used by this software. + * + */ + +#ifndef HW_CAPSENSE_H +#define HW_CAPSENSE_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +#define HW_CAPSENSE_TASK_STACK_SIZE_in_bytes 128 + +typedef enum +{ + HW_CAPSENSE_BUTTON_ONE, + HW_CAPSENSE_BUTTON_TWO +} HW_CapSenseButton_T; + +/* Include Files */ + +/* Public Variables */ + +//! Handle of the HW_CapSense_Task() given when the task was created. +extern TaskHandle_t HW_CapSense_Task_Handle; + +/* Public Functions */ +void HW_CapSense_Init(void); +void HW_CapSense_Task(void * pvParameters); +bool HW_IsCapsenseButtonPressed(HW_CapSenseButton_T button); + +#ifdef __cplusplus +} +#endif + +#endif // HW_CAPSENSE_H + diff --git a/2020TPCAppNoDFU.cydsn/HW/HW_NeoPixels.c b/2020TPCAppNoDFU.cydsn/HW/HW_NeoPixels.c new file mode 100644 index 0000000..d732a10 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/HW/HW_NeoPixels.c @@ -0,0 +1,392 @@ +// NeoPixel Driver using Direct Memory Access +// +// This implementation is based on the one by Alan Hawse of Elkhorn Creek, +// documented at https://iotexpert.com/2019/01/08/psoc-6-dma-ws2812-leds/. +// We are grateful to Mr. Hawse for sharing this. + +#include "KTag.h" + +#define NEOPIXEL_ZOFFSET (1) +#define NEOPIXEL_ONE3 (0b110<<24) +#define NEOPIXEL_ZERO3 (0b100<<24) +#define NEOPIXEL_SPI_BIT_PER_BIT (3) +#define NEOPIXEL_COLOR_PER_PIXEL (3) +#define NEOPIXEL_BYTES_PER_PIXEL (NEOPIXEL_SPI_BIT_PER_BIT * NEOPIXEL_COLOR_PER_PIXEL) +#define FRAME_BUFFER_SIZE (NEOPIXEL_ZOFFSET + (CONFIG_KTAG_MAX_NEOPIXELS_PER_CHANNEL * NEOPIXEL_BYTES_PER_PIXEL)) + +#if (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 1) + static uint8_t NeoPixel_Barrel_Channel_Frame_Buffer[FRAME_BUFFER_SIZE]; +#elif (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 4) + static uint8_t NeoPixel_Barrel_Channel_Frame_Buffer[FRAME_BUFFER_SIZE]; + static uint8_t NeoPixel_Receiver_Channel_Frame_Buffer[FRAME_BUFFER_SIZE]; + static uint8_t NeoPixel_Display_Channel_Frame_Buffer[FRAME_BUFFER_SIZE]; + static uint8_t NeoPixel_Effects_Channel_Frame_Buffer[FRAME_BUFFER_SIZE]; +#else + #error "Unsupported number of NeoPixel channels defined. Supported configurations are 1 and 4." +#endif + +static uint8_t* NeoPixel_Frame_Buffers[CONFIG_KTAG_N_NEOPIXEL_CHANNELS] = +{ +#if (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 1) + NeoPixel_Barrel_Channel_Frame_Buffer +#elif (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 4) + NeoPixel_Barrel_Channel_Frame_Buffer, + NeoPixel_Receiver_Channel_Frame_Buffer, + NeoPixel_Display_Channel_Frame_Buffer, + NeoPixel_Effects_Channel_Frame_Buffer +#else + #error "Unsupported number of NeoPixel channels defined. Supported configurations are 1 and 4." +#endif +}; + +ColorOrder_T ColorOrderByChannel[CONFIG_KTAG_N_NEOPIXEL_CHANNELS]; + +// Since the descriptors are (or should be) set to "trigger on descriptor completion" (`.interruptType = CY_DMA_DESCR`), +// this ISR is called after each channel has been written. +static void NeoPixel_DMA_Complete(void) +{ + static BaseType_t xHigherPriorityTaskWoken = pdFALSE; + + Cy_DMA_Channel_ClearInterrupt(DMA_NeoPixel_HW, DMA_NeoPixel_DW_CHANNEL); + + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); +} + +#define NEOPIXEL_N_DESCRIPTORS CONFIG_KTAG_N_NEOPIXEL_CHANNELS +static cy_stc_dma_descriptor_t NeoPixel_Descriptors[NEOPIXEL_N_DESCRIPTORS]; +static void NeoPixel_Configure_DMA(void) +{ + // I [AH] copied this structure from the PSoC Creator Component configuration + // in the generated source. + const cy_stc_dma_descriptor_config_t NeoPixel_DMA_Descriptor_Config = + { + .retrigger = CY_DMA_RETRIG_IM, + .interruptType = CY_DMA_DESCR, + .triggerOutType = CY_DMA_1ELEMENT, + .channelState = CY_DMA_CHANNEL_ENABLED, + .triggerInType = CY_DMA_1ELEMENT, + .dataSize = CY_DMA_BYTE, + .srcTransferSize = CY_DMA_TRANSFER_SIZE_DATA, + .dstTransferSize = CY_DMA_TRANSFER_SIZE_WORD, + .descriptorType = CY_DMA_1D_TRANSFER, + .srcAddress = NULL, + .dstAddress = NULL, + .srcXincrement = 1L, + .dstXincrement = 0L, + .xCount = 256UL, + .srcYincrement = 0L, + .dstYincrement = 0L, + .yCount = 1UL, + .nextDescriptor = NULL + }; + + for (uint_fast8_t i=0; i < NEOPIXEL_N_DESCRIPTORS; i++) + { + Cy_DMA_Descriptor_Init(&NeoPixel_Descriptors[i], &NeoPixel_DMA_Descriptor_Config); + Cy_DMA_Descriptor_SetSrcAddress(&NeoPixel_Descriptors[i], (uint8_t *)&NeoPixel_Frame_Buffers[i][0]); + Cy_DMA_Descriptor_SetDstAddress(&NeoPixel_Descriptors[i], (void *)&SPI_NeoPixel_HW->TX_FIFO_WR); + Cy_DMA_Descriptor_SetXloopDataCount(&NeoPixel_Descriptors[i], FRAME_BUFFER_SIZE); + } + + // Initialize and enable the interrupt from DMA_NeoPixel_HW. + Cy_SysInt_Init(&DMA_NeoPixel_Int_cfg, &NeoPixel_DMA_Complete); + NVIC_EnableIRQ(DMA_NeoPixel_Int_cfg.intrSrc); + Cy_DMA_Channel_SetInterruptMask(DMA_NeoPixel_HW, DMA_NeoPixel_DW_CHANNEL, DMA_NeoPixel_INTR_MASK); + + Cy_DMA_Enable(DMA_NeoPixel_HW); +} + +// Function: NeoPixel_Trigger_DMA +// This function sets up the channel... then enables it to dump the frameBuffer to pixels. +void NeoPixel_Trigger_DMA(uint_fast8_t channel) +{ + cy_stc_dma_channel_config_t channel_config; + channel_config.descriptor = &NeoPixel_Descriptors[channel]; + channel_config.preemptable = DMA_NeoPixel_PREEMPTABLE; + channel_config.priority = DMA_NeoPixel_PRIORITY; + channel_config.enable = false; + Cy_DMA_Channel_Init(DMA_NeoPixel_HW, DMA_NeoPixel_DW_CHANNEL, &channel_config); + Cy_DMA_Channel_Enable(DMA_NeoPixel_HW, DMA_NeoPixel_DW_CHANNEL); +} + +//! Takes an 8-bit value representing a color level and turns it into a WS2812 bit code... +/*! + * ...where 1=110 and 0=011 + * One input byte turns into three output bytes of a uint32_t. + */ +uint32_t NeoPixel_ConvertTo3Code(uint8_t input) +{ + uint32_t rval=0; + for (uint_fast8_t i=0; i < 8; i++) + { + if (input % 2) + { + rval |= NEOPIXEL_ONE3; + } + else + { + rval |= NEOPIXEL_ZERO3; + } + rval = rval >> 3; + + input = input >> 1; + } + return rval; +} + +//! Takes a position and a three byte RGB value and updates the corresponding NeoPixel_Frame_Buffer with the correct nine bytes. +SystemKResult_T HW_NeoPixels_Set_RGB(NeoPixelsChannel_T channel, uint8_t position, uint8_t red, uint8_t green, uint8_t blue) +{ + typedef union { + uint8_t bytes[4]; + uint32_t word; + } NeoPixel_ColorByNumber; + + NeoPixel_ColorByNumber color; + ColorOrder_T order = ColorOrderByChannel[channel]; + + if (order == COLOR_ORDER_RGB) + { + color.word = NeoPixel_ConvertTo3Code(red); + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+0+NEOPIXEL_ZOFFSET] = color.bytes[2]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+1+NEOPIXEL_ZOFFSET] = color.bytes[1]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+2+NEOPIXEL_ZOFFSET] = color.bytes[0]; + + color.word = NeoPixel_ConvertTo3Code(green); + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+3+NEOPIXEL_ZOFFSET] = color.bytes[2]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+4+NEOPIXEL_ZOFFSET] = color.bytes[1]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+5+NEOPIXEL_ZOFFSET] = color.bytes[0]; + + color.word = NeoPixel_ConvertTo3Code(blue); + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+6+NEOPIXEL_ZOFFSET] = color.bytes[2]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+7+NEOPIXEL_ZOFFSET] = color.bytes[1]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+8+NEOPIXEL_ZOFFSET] = color.bytes[0]; + } + else if (order == COLOR_ORDER_GRB) + { + color.word = NeoPixel_ConvertTo3Code(green); + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+0+NEOPIXEL_ZOFFSET] = color.bytes[2]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+1+NEOPIXEL_ZOFFSET] = color.bytes[1]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+2+NEOPIXEL_ZOFFSET] = color.bytes[0]; + + color.word = NeoPixel_ConvertTo3Code(red); + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+3+NEOPIXEL_ZOFFSET] = color.bytes[2]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+4+NEOPIXEL_ZOFFSET] = color.bytes[1]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+5+NEOPIXEL_ZOFFSET] = color.bytes[0]; + + color.word = NeoPixel_ConvertTo3Code(blue); + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+6+NEOPIXEL_ZOFFSET] = color.bytes[2]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+7+NEOPIXEL_ZOFFSET] = color.bytes[1]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+8+NEOPIXEL_ZOFFSET] = color.bytes[0]; + } + else + { + // Color order is not handled--log this and use RGB. + { + static bool error_logged = false; + if (error_logged == false) + { + COMM_Console_Print_String("Color order "); + COMM_Console_Print_UInt8(order); + COMM_Console_Print_String(" not yet supported!"); + error_logged = true; + } + } + + color.word = NeoPixel_ConvertTo3Code(red); + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+0+NEOPIXEL_ZOFFSET] = color.bytes[2]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+1+NEOPIXEL_ZOFFSET] = color.bytes[1]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+2+NEOPIXEL_ZOFFSET] = color.bytes[0]; + + color.word = NeoPixel_ConvertTo3Code(green); + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+3+NEOPIXEL_ZOFFSET] = color.bytes[2]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+4+NEOPIXEL_ZOFFSET] = color.bytes[1]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+5+NEOPIXEL_ZOFFSET] = color.bytes[0]; + + color.word = NeoPixel_ConvertTo3Code(blue); + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+6+NEOPIXEL_ZOFFSET] = color.bytes[2]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+7+NEOPIXEL_ZOFFSET] = color.bytes[1]; + NeoPixel_Frame_Buffers[channel][position*NEOPIXEL_BYTES_PER_PIXEL+8+NEOPIXEL_ZOFFSET] = color.bytes[0]; + } + + return SYSTEMK_RESULT_SUCCESS; +} + + +//! Initializes the hardware. +SystemKResult_T HW_NeoPixels_Init(void) +{ + Cy_SCB_SPI_Init(SPI_NeoPixel_HW, &SPI_NeoPixel_config, &SPI_NeoPixel_context); + Cy_SCB_SPI_Enable(SPI_NeoPixel_HW); + NeoPixel_Configure_DMA(); + +#if (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 1) + ColorOrderByChannel[NEOPIXEL_CHANNEL_BARREL] = NVM_BARREL_COLOR_ORDER; +#elif (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 4) + ColorOrderByChannel[NEOPIXEL_CHANNEL_BARREL] = NVM_BARREL_COLOR_ORDER; + ColorOrderByChannel[NEOPIXEL_CHANNEL_RECEIVER] = NVM_RECEIVER_COLOR_ORDER; + ColorOrderByChannel[NEOPIXEL_CHANNEL_DISPLAY] = NVM_DISPLAY_COLOR_ORDER; + ColorOrderByChannel[NEOPIXEL_CHANNEL_EFFECTS] = NVM_EFFECTS_COLOR_ORDER; +#else + #error "Unsupported number of NeoPixel channels defined. Supported configurations are 1 and 4." +#endif + + return SYSTEMK_RESULT_SUCCESS; +} + + +#if (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 1) +static inline __attribute__((always_inline)) void NeoPixels_Set_Color_On_All_Channels(uint8_t position, color_t color) +{ + HW_NeoPixels_Set_RGB(NEOPIXEL_CHANNEL_BARREL, position, Gamma8[Red(color)], Gamma8[Green(color)], Gamma8[Blue(color)]); +} + +static inline __attribute__((always_inline)) void NeoPixel_Disable_All_Channels() +{ + // Nothing to do. +} + +static inline __attribute__((always_inline)) void NeoPixel_Enable_Channel(uint_fast8_t __attribute__ ((unused)) channel) +{ + // Nothing to do. +} + +static inline __attribute__((always_inline)) void NeoPixel_Disable_Channel(uint_fast8_t __attribute__ ((unused)) channel) +{ + // Nothing to do. +} +#elif (CONFIG_KTAG_N_NEOPIXEL_CHANNELS == 4) + +static inline __attribute__((always_inline)) void NeoPixel_Enable_Barrel_Channel() +{ + Cy_GPIO_Write(Pin_NeoPixel_Select_0_PORT, Pin_NeoPixel_Select_0_NUM, 1); +} + +static inline __attribute__((always_inline)) void NeoPixel_Disable_Barrel_Channel() +{ + Cy_GPIO_Write(Pin_NeoPixel_Select_0_PORT, Pin_NeoPixel_Select_0_NUM, 0); +} + +static inline __attribute__((always_inline)) void NeoPixel_Enable_Receiver_Channel() +{ + Cy_GPIO_Write(Pin_NeoPixel_Select_1_PORT, Pin_NeoPixel_Select_1_NUM, 1); +} + +static inline __attribute__((always_inline)) void NeoPixel_Disable_Receiver_Channel() +{ + Cy_GPIO_Write(Pin_NeoPixel_Select_1_PORT, Pin_NeoPixel_Select_1_NUM, 0); +} + +static inline __attribute__((always_inline)) void NeoPixel_Enable_Display_Channel() +{ + Cy_GPIO_Write(Pin_NeoPixel_Select_2_PORT, Pin_NeoPixel_Select_2_NUM, 1); +} + +static inline __attribute__((always_inline)) void NeoPixel_Disable_Display_Channel() +{ + Cy_GPIO_Write(Pin_NeoPixel_Select_2_PORT, Pin_NeoPixel_Select_2_NUM, 0); +} + +static inline __attribute__((always_inline)) void NeoPixel_Enable_Effects_Channel() +{ + Cy_GPIO_Write(Pin_NeoPixel_Select_3_PORT, Pin_NeoPixel_Select_3_NUM, 1); +} + +static inline __attribute__((always_inline)) void NeoPixel_Disable_Effects_Channel() +{ + Cy_GPIO_Write(Pin_NeoPixel_Select_3_PORT, Pin_NeoPixel_Select_3_NUM, 0); +} + +static inline __attribute__((always_inline)) void NeoPixel_Enable_All_Channels() +{ + NeoPixel_Enable_Barrel_Channel(); + NeoPixel_Enable_Receiver_Channel(); + NeoPixel_Enable_Display_Channel(); + NeoPixel_Enable_Effects_Channel(); +} + +static inline __attribute__((always_inline)) void NeoPixel_Disable_All_Channels() +{ + NeoPixel_Disable_Barrel_Channel(); + NeoPixel_Disable_Receiver_Channel(); + NeoPixel_Disable_Display_Channel(); + NeoPixel_Disable_Effects_Channel(); +} + +static inline __attribute__((always_inline)) void NeoPixel_Enable_Channel(uint_fast8_t channel) +{ + switch (channel) + { + case NEOPIXEL_CHANNEL_BARREL: + NeoPixel_Enable_Barrel_Channel(); + break; + + case NEOPIXEL_CHANNEL_RECEIVER: + NeoPixel_Enable_Receiver_Channel(); + break; + + case NEOPIXEL_CHANNEL_DISPLAY: + NeoPixel_Enable_Display_Channel(); + break; + + case NEOPIXEL_CHANNEL_EFFECTS: + NeoPixel_Enable_Effects_Channel(); + break; + + default: + // Do nothing. + break; + } +} + +static inline __attribute__((always_inline)) void NeoPixel_Disable_Channel(uint_fast8_t channel) +{ + switch (channel) + { + case NEOPIXEL_CHANNEL_BARREL: + NeoPixel_Disable_Barrel_Channel(); + break; + + case NEOPIXEL_CHANNEL_RECEIVER: + NeoPixel_Disable_Receiver_Channel(); + break; + + case NEOPIXEL_CHANNEL_DISPLAY: + NeoPixel_Disable_Display_Channel(); + break; + + case NEOPIXEL_CHANNEL_EFFECTS: + NeoPixel_Disable_Effects_Channel(); + break; + + default: + // Do nothing. + break; + } +} +#else + #error "Unsupported number of NeoPixel channels defined. Supported configurations are 1 and 4." +#endif + +SystemKResult_T HW_NeoPixels_Publish(void) +{ + // Update the NeoPixels using DMA. + for (uint_fast8_t Current_NeoPixel_Channel = 0; Current_NeoPixel_Channel < CONFIG_KTAG_N_NEOPIXEL_CHANNELS; Current_NeoPixel_Channel++) + { + xSemaphoreTake(NeoPixels_Semaphore, portMAX_DELAY); + NeoPixel_Enable_Channel(Current_NeoPixel_Channel); + NeoPixel_Trigger_DMA(Current_NeoPixel_Channel); + // Allow time for the DMA transfer to go out on the wire. + vTaskDelay(portTICK_PERIOD_MS); + NeoPixel_Disable_Channel(Current_NeoPixel_Channel); + xSemaphoreGive(NeoPixels_Semaphore); + } + + return SYSTEMK_RESULT_SUCCESS; +} + +//! \todo Refactor this somehow...it doesn't belong here. +color_t HW_NeoPixels_Get_My_Color(void) +{ + return PROTOCOLS_GetColor(GetWeaponFromID(NVM_WEAPON_ID).Protocol, NVM_TEAM_ID, NVM_PLAYER_ID); +} diff --git a/2020TPCAppNoDFU.cydsn/KTag.h b/2020TPCAppNoDFU.cydsn/KTag.h new file mode 100644 index 0000000..8bbe992 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/KTag.h @@ -0,0 +1,81 @@ +/** \file + * \brief This is the top-level include file for the entire project. + * + * By including this file (and only this file), include dependency order is maintained. + * + */ + +// KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKKKKKKKKKKKky+.`/ykKKKKKKKKKKKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKKKKKKKds/. -+o:` ./sdNKKKKKKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKNds+-` `-+hNKKKKNho:` `-+shNKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKNkhyo+:. `-/sdNKKKKKKKKKKKKKky+:` .-/oyhdNKKKKKKKKKK +// KKys++:-.````.-:+oykNKKKKKKKKKKKKKKKKKKKKKKNkhs+/-.````.-:/+syKK +// KK -/+osydkNNNKKKkkkkkkkNKKKKKKKKKKKkkkkkkkkNKKKKNNkdhyso/: KK +// KK sKKKKKKKKKKKKK```````/KKKKKKKKKd-```````:kKKKKKKKKKKKKKd `KK +// KK- oKKKKKKKKKKKKK :KKKKKKKKo` `oNKKKKKKKKKKKKKKh :KK +// KK/ +KKKKKKKKKKKKK :KKKKKKd- -dKKKKKKKKKKKKKKKKy /KK +// KK+ /KKKKKKKKKKKKK :KKKKKs` +NKKKKKKKKKKKKKKKKKs +KK +// KKo :KKKKKKKKKKKKK :KKKk: .hKKKKKKKKKKKKKKKKKKKo oKK +// KKy -KKKKKKKKKKKKK :KKy` +NKKKKKKKKKKKKKKKKKKKK/ yKK +// KKd `KKKKKKKKKKKKK :k/ .hKKKKKKKKKKKKKKKKKKKKKK: dKK +// KKN NKKKKKKKKKKKK .. /kKKKKKKKKKKKKKKKKKKKKKKK. NKK +// KKK. dKKKKKKKKKKKK .yKKKKKKKKKKKKKKKKKKKKKKKKN .KKK +// KKK+ oKKKKKKKKKKKK -kKKKKKKKKKKKKKKKKKKKKKKKKKh +KKK +// KKKd .KKKKKKKKKKKK `sNKKKKKKKKKKKKKKKKKKKKKKKK/ dKKK +// KKKK: hKKKKKKKKKKK :kKKKKKKKKKKKKKKKKKKKKKKk :KKKK +// KKKKh -KKKKKKKKKKK `` .yKKKKKKKKKKKKKKKKKKKKK+ hKKKK +// KKKKK/ yKKKKKKKKKK T :d: /kKKKKKKKKKKKKKKKKKKk`:KKKKK +// KKKKKk`.NKKKKKKKKK :KNo` .hKKKKKKKKKKKKKKKKK:`kKKKKK +// KKKKKKy /KKKKKKKKK A :KKKd- +NKKKKKKKKKKKKKKo yKKKKKK +// KKKKKKK+ oKKKKKKKK :KKKKN+` -hKKKKKKKKKKKKy`+KKKKKKK +// KKKKKKKN/ sKKKKKKK G :KKKKKKh. `oNKKKKKKKKKh`/KKKKKKKK +// KKKKKKKKN/`sKKKKKK :KKKKKKKN/ -dKKKKKKKh`/NKKKKKKKK +// KKKKKKKKKK+ +NKKKK :KKKKKKKKKy. `sNKKKKs`+KKKKKKKKKK +// KKKKKKKKKKKs`:kKKK-------+KKKKKKKKKKk/--------oKKN+`sKKKKKKKKKKK +// KKKKKKKKKKKKh..yKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKd--dKKKKKKKKKKKK +// KKKKKKKKKKKKKN+`/kKKKKKKKKKKKKKKKKKKKKKKKKKKKKNo`+NKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKh-`sNKKKKKKKKKKKKKKKKKKKKKKKKNy.-hKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKs..sNKKKKKKKKKKKKKKKKKKKKNy-.yKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKNs..okKKKKKKKKKKKKKKKKNs-.sNKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKKKKy-`/hKKKKKKKKKKKKd+`-yKKKKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKKKKKKd/`.odKKKKKKks-`/dKKKKKKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKKKKKKKKNs: .+yy+-`:sNKKKKKKKKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKKKKKKKKKKKNy/..+yNKKKKKKKKKKKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK +// KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK + + +#ifndef KTAG_H +#define KTAG_H + +/* Include FreeRTOS APIs and defines */ +#include "FreeRTOS.h" +#include "task.h" +#include "croutine.h" +#include "semphr.h" +#include "portmacro.h" +#include "timers.h" + +/* Include PSoC system and component APIs and defines */ +#include + +#include +#include +#include +#include + +#include "CONFIG.h" +#include "SystemK.h" +#include "HW.h" +#include "Audio.h" +#include "NVM.h" +#include "COMM.h" +#include "Fire_Control.h" +#include "Sample_Tasks.h" +#include "Tag_Sensors.h" +#include "Switches.h" +#include "Util.h" + +#endif // KTAG_H diff --git a/2020TPCAppNoDFU.cydsn/NVM/NVM.h b/2020TPCAppNoDFU.cydsn/NVM/NVM.h new file mode 100644 index 0000000..ffd8cad --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/NVM/NVM.h @@ -0,0 +1,105 @@ +/** \dir NVM + * + * \brief Non-Volatile Memory + * + * This directory/namespace contains all the software used to manage non-volatile memory for this CPU. + * + */ + +/** \file + * \brief This file defines the interface to the NVM package. + * + * This file should be included by any file outside the NVM package wishing to make use + * of any of the NVM functionality. + */ + +#ifndef NVM_H +#define NVM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +//! Enumeration of the various states of a nonvolatile memory entry. +typedef enum +{ + //! This entry has not yet been initialized. + NVM_STATE_UNINITIALIZED = 0, + + //! This entry has been read from nonvolatile memory, and the cyclic redundancy check failed. + NVM_STATE_CRC_FAILED, + + //! No changes are pending for this entry. + NVM_STATE_IDLE, + + //! A request has been made to save this entry to NVM. + NVM_STATE_SAVE_REQUESTED +} NVM_Entry_State_T; + + +typedef struct +{ + // Size of the NVM data. + const size_t Size; + + // Address of the NVM data in the EEPROM memory. + const uint16_t EE_Address; + + // Address of the calculated CRC value in the EEPROM memory. + const uint16_t EE_CRC_Address; + + // Address of the NVM data in RAM. + uint8_t * const Value; + + // Address of the default data in ROM. + uint8_t const * const Default; + + // Current state of this NVM entry + NVM_Entry_State_T State; + +} NVM_EEPROMEntry_T; + + +/* Include Files */ +#include "NVM_CRC.h" + +#if (CONFIG__HAS_EXTERNAL_NVM) +#include "NVM_ExternalEEPROM.h" +#include "NVM_ExternalEEPROMEntries.h" +#endif // CONFIG__HAS_EXTERNAL_NVM + +#if (CONFIG__HAS_INTERNAL_NVM) +#include "NVM_OnChipEEPROM.h" +#include "NVM_OnChipEEPROMEntries.h" +#endif // CONFIG__HAS_INTERNAL_NVM + +/* Public Variables */ + +/* Public Functions */ + +inline bool IsNVMInitialized() +{ + taskENTER_CRITICAL(); + bool is_initialized = + +#if (CONFIG__HAS_EXTERNAL_NVM) + NVM_IsExternalEEPROMInitialized && +#endif // CONFIG__HAS_EXTERNAL_NVM + +#if (CONFIG__HAS_INTERNAL_NVM) + NVM_IsOnChipEEPROMInitialized && +#endif // CONFIG__HAS_INTERNAL_NVM + + true; + taskEXIT_CRITICAL(); + + return is_initialized; +} + +#ifdef __cplusplus +} +#endif + +#endif // NVM_H \ No newline at end of file diff --git a/2020TPCAppNoDFU.cydsn/NVM/NVM_CRC.c b/2020TPCAppNoDFU.cydsn/NVM/NVM_CRC.c new file mode 100644 index 0000000..09a9026 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/NVM/NVM_CRC.c @@ -0,0 +1,72 @@ +/** + * \file + * Functions and types for CRC checks. + * + * Generated on Sat Jun 15 14:34:15 2019 + * by pycrc v0.9.2, https://pycrc.org + * using the configuration: + * - Width = 16 + * - Poly = 0xed2f + * - XorIn = 0xbeef + * - ReflectIn = False + * - XorOut = 0x0000 + * - ReflectOut = False + * - Algorithm = table-driven + */ +#include "NVM_CRC.h" /* include the header file generated with pycrc */ +#include +#include + + + +/** + * Static table used for the table_driven implementation. + */ +static const NVM_CRC_t crc_table[256] = { + 0x0000, 0xed2f, 0x3771, 0xda5e, 0x6ee2, 0x83cd, 0x5993, 0xb4bc, + 0xddc4, 0x30eb, 0xeab5, 0x079a, 0xb326, 0x5e09, 0x8457, 0x6978, + 0x56a7, 0xbb88, 0x61d6, 0x8cf9, 0x3845, 0xd56a, 0x0f34, 0xe21b, + 0x8b63, 0x664c, 0xbc12, 0x513d, 0xe581, 0x08ae, 0xd2f0, 0x3fdf, + 0xad4e, 0x4061, 0x9a3f, 0x7710, 0xc3ac, 0x2e83, 0xf4dd, 0x19f2, + 0x708a, 0x9da5, 0x47fb, 0xaad4, 0x1e68, 0xf347, 0x2919, 0xc436, + 0xfbe9, 0x16c6, 0xcc98, 0x21b7, 0x950b, 0x7824, 0xa27a, 0x4f55, + 0x262d, 0xcb02, 0x115c, 0xfc73, 0x48cf, 0xa5e0, 0x7fbe, 0x9291, + 0xb7b3, 0x5a9c, 0x80c2, 0x6ded, 0xd951, 0x347e, 0xee20, 0x030f, + 0x6a77, 0x8758, 0x5d06, 0xb029, 0x0495, 0xe9ba, 0x33e4, 0xdecb, + 0xe114, 0x0c3b, 0xd665, 0x3b4a, 0x8ff6, 0x62d9, 0xb887, 0x55a8, + 0x3cd0, 0xd1ff, 0x0ba1, 0xe68e, 0x5232, 0xbf1d, 0x6543, 0x886c, + 0x1afd, 0xf7d2, 0x2d8c, 0xc0a3, 0x741f, 0x9930, 0x436e, 0xae41, + 0xc739, 0x2a16, 0xf048, 0x1d67, 0xa9db, 0x44f4, 0x9eaa, 0x7385, + 0x4c5a, 0xa175, 0x7b2b, 0x9604, 0x22b8, 0xcf97, 0x15c9, 0xf8e6, + 0x919e, 0x7cb1, 0xa6ef, 0x4bc0, 0xff7c, 0x1253, 0xc80d, 0x2522, + 0x8249, 0x6f66, 0xb538, 0x5817, 0xecab, 0x0184, 0xdbda, 0x36f5, + 0x5f8d, 0xb2a2, 0x68fc, 0x85d3, 0x316f, 0xdc40, 0x061e, 0xeb31, + 0xd4ee, 0x39c1, 0xe39f, 0x0eb0, 0xba0c, 0x5723, 0x8d7d, 0x6052, + 0x092a, 0xe405, 0x3e5b, 0xd374, 0x67c8, 0x8ae7, 0x50b9, 0xbd96, + 0x2f07, 0xc228, 0x1876, 0xf559, 0x41e5, 0xacca, 0x7694, 0x9bbb, + 0xf2c3, 0x1fec, 0xc5b2, 0x289d, 0x9c21, 0x710e, 0xab50, 0x467f, + 0x79a0, 0x948f, 0x4ed1, 0xa3fe, 0x1742, 0xfa6d, 0x2033, 0xcd1c, + 0xa464, 0x494b, 0x9315, 0x7e3a, 0xca86, 0x27a9, 0xfdf7, 0x10d8, + 0x35fa, 0xd8d5, 0x028b, 0xefa4, 0x5b18, 0xb637, 0x6c69, 0x8146, + 0xe83e, 0x0511, 0xdf4f, 0x3260, 0x86dc, 0x6bf3, 0xb1ad, 0x5c82, + 0x635d, 0x8e72, 0x542c, 0xb903, 0x0dbf, 0xe090, 0x3ace, 0xd7e1, + 0xbe99, 0x53b6, 0x89e8, 0x64c7, 0xd07b, 0x3d54, 0xe70a, 0x0a25, + 0x98b4, 0x759b, 0xafc5, 0x42ea, 0xf656, 0x1b79, 0xc127, 0x2c08, + 0x4570, 0xa85f, 0x7201, 0x9f2e, 0x2b92, 0xc6bd, 0x1ce3, 0xf1cc, + 0xce13, 0x233c, 0xf962, 0x144d, 0xa0f1, 0x4dde, 0x9780, 0x7aaf, + 0x13d7, 0xfef8, 0x24a6, 0xc989, 0x7d35, 0x901a, 0x4a44, 0xa76b +}; + + +NVM_CRC_t NVM_CRC_update(NVM_CRC_t crc, const void *data, size_t data_len) +{ + const unsigned char *d = (const unsigned char *)data; + unsigned int tbl_idx; + + while (data_len--) { + tbl_idx = ((crc >> 8) ^ *d) & 0xff; + crc = (crc_table[tbl_idx] ^ (crc << 8)) & 0xffff; + d++; + } + return crc & 0xffff; +} \ No newline at end of file diff --git a/2020TPCAppNoDFU.cydsn/NVM/NVM_CRC.h b/2020TPCAppNoDFU.cydsn/NVM/NVM_CRC.h new file mode 100644 index 0000000..bbb2807 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/NVM/NVM_CRC.h @@ -0,0 +1,115 @@ +/** + * \file + * Functions and types for CRC checks. + * + * Generated on Sat Jun 15 14:34:05 2019 + * by pycrc v0.9.2, https://pycrc.org + * using the configuration: + * - Width = 16 + * - Poly = 0xed2f + * - XorIn = 0xbeef + * - ReflectIn = False + * - XorOut = 0x0000 + * - ReflectOut = False + * - Algorithm = table-driven + * + * This file defines the functions NVM_CRC_init(), NVM_CRC_update() and NVM_CRC_finalize(). + * + * The NVM_CRC_init() function returns the inital \c crc value and must be called + * before the first call to NVM_CRC_update(). + * Similarly, the NVM_CRC_finalize() function must be called after the last call + * to NVM_CRC_update(), before the \c crc is being used. + * is being used. + * + * The NVM_CRC_update() function can be called any number of times (including zero + * times) in between the NVM_CRC_init() and NVM_CRC_finalize() calls. + * + * This pseudo-code shows an example usage of the API: + * \code{.c} + * NVM_CRC_t crc; + * unsigned char data[MAX_DATA_LEN]; + * size_t data_len; + * + * crc = NVM_CRC_init(); + * while ((data_len = read_data(data, MAX_DATA_LEN)) > 0) { + * crc = NVM_CRC_update(crc, data, data_len); + * } + * crc = NVM_CRC_finalize(crc); + * \endcode + * + * ## Additional Notes + * + * The CRC polynomial (0xED2F) was chosen based on the research published by Philip Koopman of Carnegie Mellon + * University [here](http://users.ece.cmu.edu/~koopman/crc/). Dr. Koopman claims this polynomial has a + * Hamming Distance of 10. + * + * The initial value, 0xBEEF, was chosen simply to avoid the most common EE values of 0xFFFF and 0x0000. + * + */ +#ifndef NVM_CRC_H +#define NVM_CRC_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + + +/** + * The definition of the used algorithm. + * + * This is not used anywhere in the generated code, but it may be used by the + * application code to call algorithm-specific code, if desired. + */ +#define CRC_ALGO_TABLE_DRIVEN 1 + + +/** + * The type of the CRC values. + * + * CRCs are sixteen bits wide. + */ +typedef uint16_t NVM_CRC_t; + + +/** + * Calculate the initial crc value. + * + * \return The initial crc value. + */ +static inline NVM_CRC_t NVM_CRC_init(void) +{ + return 0xbeef; +} + + +/** + * Update the crc value with new data. + * + * \param[in] crc The current crc value. + * \param[in] data Pointer to a buffer of \a data_len bytes. + * \param[in] data_len Number of bytes in the \a data buffer. + * \return The updated crc value. + */ +NVM_CRC_t NVM_CRC_update(NVM_CRC_t crc, const void *data, size_t data_len); + + +/** + * Calculate the final crc value. + * + * \param[in] crc The current crc value. + * \return The final crc value. + */ +static inline NVM_CRC_t NVM_CRC_finalize(NVM_CRC_t crc) +{ + return crc; +} + + +#ifdef __cplusplus +} /* closing brace for extern "C" */ +#endif + +#endif /* NVM_CRC_H */ \ No newline at end of file diff --git a/2020TPCAppNoDFU.cydsn/NVM/NVM_ExternalEEPROM.c b/2020TPCAppNoDFU.cydsn/NVM/NVM_ExternalEEPROM.c new file mode 100644 index 0000000..84cf845 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/NVM/NVM_ExternalEEPROM.c @@ -0,0 +1,302 @@ +/** \file + * \brief This file contains functions that manage the external EEPROM. + * + */ + +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +//! This is the same for both the MCP98243 and the CAT24C256. +#define EXTERNAL_EEPROM_I2C_ADDRESS 0x50 +#define EXTERNAL_EEPROM_TEMP_SENSOR_I2C_ADDRESS 0x18 + +//! Read-only register used to identify the temperature sensor capability. +#define MCP98243_REGISTER_CAPABILITY 0x00 +//! Sensor configuration register. +#define MCP98243_REGISTER_CONFIG 0x01 +//! Upper temperature limit register. +#define MCP98243_REGISTER_T_UPPER 0x02 +//! Lower temperature limit register. +#define MCP98243_REGISTER_T_LOWER 0x03 +//! Critical temperature limit register. +#define MCP98243_REGISTER_T_CRIT 0x04 +//! Ambient temperature register. +#define MCP98243_REGISTER_T_A 0x05 +//! Read-only register used to identify the manufacturer of the device. +#define MCP98243_REGISTER_MANUFACTURER_ID 0x06 +//! Read-only register indicating the device identification and device revision. +#define MCP98243_REGISTER_DEVICE_ID 0x07 +//! Temperature sensor resolution register. +#define MCP98243_REGISTER_RESOLUTION 0x08 + + +/* External Variables [Only if necessary!] */ + +/* External Function Prototypes [Only if necessary!] */ + +/* Public Variables */ + +//! Mutex controlling access to the EEPROM to ensure data/CRC integrity. +SemaphoreHandle_t xSemaphoreExternalEEPROMLock; + +TaskHandle_t NVM_ExternalEEPROM_Task_Handle; + +volatile bool NVM_IsExternalEEPROMInitialized = false; + +/* Private Variables */ + +static QueueHandle_t xQueueExternalEEPROM; + +//! Shared master transfer configuration variable. +static cy_stc_scb_i2c_master_xfer_config_t Master_Transfer_Config = +{ + .slaveAddress = EXTERNAL_EEPROM_I2C_ADDRESS, + .buffer = NULL, + .bufferSize = 0U, + .xferPending = false +}; + + +/* Private Function Prototypes */ + +/* Inline Functions */ + +//! Waits a given time for an I²C transfer to complete. +/*! + * \param timeout_in_ms The time (in milliseconds) to wait for the transfer to complete. + * \return #true if the transfer completed, or #false if the time ran out without + * a successful transfer. + */ +static inline bool Wait_For_Transfer_To_Complete(uint16_t timeout_in_ms) +{ + bool success = false; + + // Time to wait for an in-process transfer before looking again. This wait grows longer as time + // passes, until timeout_in_ms runs out. + uint16_t HOLDOFF_TIME_IN_ms = 1; + + while ((success == false) && (timeout_in_ms > 0)) + { + vTaskDelay(pdMS_TO_TICKS(HOLDOFF_TIME_IN_ms)); + + if (timeout_in_ms > HOLDOFF_TIME_IN_ms) + { + timeout_in_ms -= HOLDOFF_TIME_IN_ms; + + // Wait a little longer next time. + HOLDOFF_TIME_IN_ms++; + } + else + { + timeout_in_ms = 0; + } + + if ((I2C_MasterGetStatus() & CY_SCB_I2C_MASTER_BUSY) != CY_SCB_I2C_MASTER_BUSY) + { + success = true; + } + } + + return success; +} + +//! Reads a block of \a n bytes from EEPROM address \a source to SRAM \a destination. +static inline void EEPROM_read_block(uint8_t * destination, uint16_t source, size_t n) +{ + uint8_t xfer_buffer[5]; + + if (xSemaphoreTake(COMM_I2C_Bus_Mutex, portMAX_DELAY) == pdTRUE) + { + // Write the initial address to the EEPROM. + xfer_buffer[0] = (source >> 8); + xfer_buffer[1] = source & 0xFF; + + Master_Transfer_Config.buffer = (uint8_t *)xfer_buffer; + Master_Transfer_Config.bufferSize = 2; + + cy_en_scb_i2c_status_t errStatus = I2C_MasterWrite(&Master_Transfer_Config); + + if (errStatus == CY_SCB_I2C_SUCCESS) + { + (void) Wait_For_Transfer_To_Complete(100); + } + else + { + // What? + } + + // Read n bytes at EEPROM[source]. + Master_Transfer_Config.buffer = (uint8_t *)destination; + Master_Transfer_Config.bufferSize = n; + + errStatus = I2C_MasterRead(&Master_Transfer_Config); + + if (errStatus == CY_SCB_I2C_SUCCESS) + { + (void) Wait_For_Transfer_To_Complete(100); + } + else + { + // What? + } + + xSemaphoreGive(COMM_I2C_Bus_Mutex); + } +} + +//! Writes a block of \a n bytes from SRAM \a source to EEPROM address \a destination. +static inline void EEPROM_write_block(uint8_t * source, uint16_t destination, size_t n) +{ + uint8_t xfer_buffer[4]; + + if (xSemaphoreTake(COMM_I2C_Bus_Mutex, portMAX_DELAY) == pdTRUE) + { + // Write the data one byte at a time. + for (uint8_t i = 0; i < n; i++) + { + uint16_t destination_address = destination + i; + xfer_buffer[0] = (destination_address >> 8); + xfer_buffer[1] = destination_address & 0xFF; + xfer_buffer[2] = *(source + i); + + Master_Transfer_Config.buffer = (uint8_t *)xfer_buffer; + Master_Transfer_Config.bufferSize = 3; + + cy_en_scb_i2c_status_t errStatus = I2C_MasterWrite(&Master_Transfer_Config); + + if (errStatus == CY_SCB_I2C_SUCCESS) + { + (void) Wait_For_Transfer_To_Complete(100); + } + else + { + // What? + } + + // The CAT24C256 has a nominal Write Cycle time (t_WR) of 5ms (no maximum specified). + // Wait 6ms between writes to have some margin (and avoid being NAKed). + vTaskDelay(pdMS_TO_TICKS(6)); + } + + xSemaphoreGive(COMM_I2C_Bus_Mutex); + } +} + + +/* Public Functions */ + +//! Sets up the external EEPROM, but does not read from it (yet). +void NVM_InitExternalEEPROM(void) +{ + /// Create a mutex-type semaphore. + xSemaphoreExternalEEPROMLock = xSemaphoreCreateMutex(); + + if (xSemaphoreExternalEEPROMLock == NULL) + { + CY_ASSERT(0); + } + + xQueueExternalEEPROM = xQueueCreate(5, sizeof(uint8_t)); +} + +//! Handles the ongoing external EEPROM tasks. +/*! + * First, it loops through all the external EEPROM entries, and reads them in to RAM. + * Then, it priodically loops through all the external EEPROM entries, and saves the ones that have been flagged. + */ +void NVM_ExternalEEPROMTask(void * pvParameters) +{ + portBASE_TYPE xStatus; + static TickType_t xTicksToWait = pdMS_TO_TICKS(NVM_EXTERNAL_EEPROM_TASK_RATE_IN_ms); + + for (uint8_t i = 0; i < NVM_N_EXTERNAL_EEPROM_ENTRIES; i++) + { + NVM_CRC_t calculated_crc; + NVM_CRC_t stored_crc = 0; + + EEPROM_read_block(NVM_ExternalEEPROMEntries[i]->Value, NVM_ExternalEEPROMEntries[i]->EE_Address, NVM_ExternalEEPROMEntries[i]->Size); + EEPROM_read_block((uint8_t *)&stored_crc, NVM_ExternalEEPROMEntries[i]->EE_CRC_Address, sizeof(NVM_CRC_t)); + + calculated_crc = NVM_CRC_init(); + calculated_crc = NVM_CRC_update(calculated_crc, NVM_ExternalEEPROMEntries[i]->Value, NVM_ExternalEEPROMEntries[i]->Size); + calculated_crc = NVM_CRC_finalize(calculated_crc); + + if (calculated_crc == stored_crc) + { + NVM_ExternalEEPROMEntries[i]->State = NVM_STATE_IDLE; + } + else + { + NVM_ExternalEEPROMEntries[i]->State = NVM_STATE_CRC_FAILED; + + COMM_Console_Print_String("[NVMEx "); + COMM_Console_Print_UInt16((uint16_t) i); + COMM_Console_Print_String("] Calculated/Stored CRCs: "); + COMM_Console_Print_UInt16((uint16_t) calculated_crc); + COMM_Console_Print_String("/"); + COMM_Console_Print_UInt16((uint16_t) stored_crc); + COMM_Console_Print_String("\n"); + + COMM_Console_Print_String("[NVMEx "); + COMM_Console_Print_UInt16((uint16_t) i); + COMM_Console_Print_String("] Applying defaults.\n"); + + memcpy(NVM_ExternalEEPROMEntries[i]->Value, NVM_ExternalEEPROMEntries[i]->Default, NVM_ExternalEEPROMEntries[i]->Size); + + // Auto-fix the CRC. + NVM_SaveExternalEEPROMEntry(NVM_ExternalEEPROMEntries[i]); + } + } + + taskENTER_CRITICAL(); + NVM_IsExternalEEPROMInitialized = true; + taskEXIT_CRITICAL(); + + while(true) + { + uint8_t dummy; + + // Wait for a call to NVM_SaveExternalEEPROMEntry(). + xStatus = xQueueReceive(xQueueExternalEEPROM, &dummy, xTicksToWait); + + if (xStatus == pdPASS) + { + for (uint8_t i = 0; i < NVM_N_EXTERNAL_EEPROM_ENTRIES; i++) + { + NVM_CRC_t crc; + + if (NVM_ExternalEEPROMEntries[i]->State == NVM_STATE_SAVE_REQUESTED) + { + if (xSemaphoreTake(xSemaphoreExternalEEPROMLock, portMAX_DELAY) == pdTRUE) + { + EEPROM_write_block(NVM_ExternalEEPROMEntries[i]->Value, NVM_ExternalEEPROMEntries[i]->EE_Address, NVM_ExternalEEPROMEntries[i]->Size); + + // Calculate the CRC. + crc = NVM_CRC_init(); + crc = NVM_CRC_update(crc, NVM_ExternalEEPROMEntries[i]->Value, NVM_ExternalEEPROMEntries[i]->Size); + crc = NVM_CRC_finalize(crc); + EEPROM_write_block((uint8_t *)&crc, NVM_ExternalEEPROMEntries[i]->EE_CRC_Address, sizeof(uint16_t)); + NVM_ExternalEEPROMEntries[i]->State = NVM_STATE_IDLE; + xSemaphoreGive(xSemaphoreExternalEEPROMLock); + } + } + } + } + } +} + +//! Flags the given external EEPROM entry to be saved next time the NVM_ExternalEEPROMTask() is run. +void NVM_SaveExternalEEPROMEntry(NVM_EEPROMEntry_T * const this) +{ + if (xSemaphoreTake(xSemaphoreExternalEEPROMLock, portMAX_DELAY) == pdTRUE) + { + this->State = NVM_STATE_SAVE_REQUESTED; + xSemaphoreGive(xSemaphoreExternalEEPROMLock); + uint8_t dummy = 0; + xQueueSend(xQueueExternalEEPROM, &dummy, 0); + } +} + +/* Private Functions */ diff --git a/2020TPCAppNoDFU.cydsn/NVM/NVM_ExternalEEPROM.h b/2020TPCAppNoDFU.cydsn/NVM/NVM_ExternalEEPROM.h new file mode 100644 index 0000000..afa7440 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/NVM/NVM_ExternalEEPROM.h @@ -0,0 +1,44 @@ +/** \file + * \brief This file contains the public interface to the external EEPROM. + * + * On the 2020TPC, the external EEPROM is the Onsemi [CAT24C256](https://www.onsemi.com/pdf/datasheet/cat24c256-d.pdf). + * + */ + +#ifndef NVM_EXTERNALEEPROM_H +#define NVM_EXTERNALEEPROM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +#define NVM_EXTERNAL_EEPROM_TASK_STACK_SIZE_in_bytes 256 + +//! The time between calls to NVM_ExternalEEPROMTask(). +#define NVM_EXTERNAL_EEPROM_TASK_RATE_IN_ms 2000 + +/* Include Files */ + +/* Public Variables */ + +extern SemaphoreHandle_t xSemaphoreExternalEEPROMLock; + +//! Handle of the NVM_ExternalEEPROMTask() given when the task was created. +extern TaskHandle_t NVM_ExternalEEPROM_Task_Handle; + +extern volatile bool NVM_IsExternalEEPROMInitialized; + +/* Public Functions */ +void NVM_InitExternalEEPROM(void); +void NVM_ExternalEEPROMTask(void * pvParameters); +void NVM_SaveExternalEEPROMEntry(NVM_EEPROMEntry_T * const this); + +/* Inline Functions */ + +#ifdef __cplusplus +} +#endif + +#endif // NVM_EXTERNALEEPROM_H diff --git a/2020TPCAppNoDFU.cydsn/NVM/NVM_ExternalEEPROMEntries.c b/2020TPCAppNoDFU.cydsn/NVM/NVM_ExternalEEPROMEntries.c new file mode 100644 index 0000000..832da53 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/NVM/NVM_ExternalEEPROMEntries.c @@ -0,0 +1,153 @@ +/* + * __ ________ _____ ______ __ + * / //_/_ __/___ _____ _ / ___/____ __ _______________ / ____/___ ____/ /__ + * / ,< / / / __ `/ __ `/ \__ \/ __ \/ / / / ___/ ___/ _ \ / / / __ \/ __ / _ \ + * / /| | / / / /_/ / /_/ / ___/ / /_/ / /_/ / / / /__/ __/ / /___/ /_/ / /_/ / __/ + * /_/ |_|/_/ \__,_/\__, / /____/\____/\__,_/_/ \___/\___/ \____/\____/\__,_/\___/ + * /____/ + * + * 🃞 THIS FILE IS PART OF THE KTAG SOURCE CODE. Visit https://ktag.clubk.club/ for more. 🃞 + * + */ + +/** \file + * \brief [Autogenerated] This file defines the External EEPROM entries. + * + * \note AUTOGENERATED: This file was generated automatically on Friday, April 28, 2023 at 11:31:31 AM. + * DO NOT MODIFY THIS FILE MANUALLY! + */ + +/* Include Files */ +#include "KTag.h" + +/* EEPROM Entries */ + +/** \defgroup NVM_EXTERNAL_EEPROM NVM External EEPROM + * + * The External EEPROM is divided into logical "entries", represented by instances of the #NVM_EEPROMEntry_T type. + * At startup, these entries are loaded into their respective RAM copies by NVM_InitExternalEEPROM(). The application + * then updates the RAM copies directly, and requests that the NVM_ExternalEEPROMTask() save these back to the EEPROM + * when necessary. + * @{ */ + +static NVM_External_Test_T RAM_External_Test; + +static const NVM_External_Test_T DEFAULT_External_Test = +{ + //! Test Code 3 + .External_Test_3 = UINT16_MAX, + //! Test Code 4 + .External_Test_4 = UINT32_MAX, +}; + +NVM_EEPROMEntry_T NVM_External_Test = +{ + //! Size == sizeof(NVM_External_Test_T) + .Size = 6, + .EE_Address = 0, + .EE_CRC_Address = 6, + .Value = (uint8_t *)&RAM_External_Test, + .Default = (uint8_t *)&DEFAULT_External_Test, + .State = NVM_STATE_UNINITIALIZED +}; +static NVM_Info_T RAM_Info; + +static const NVM_Info_T DEFAULT_Info = +{ + //! Date this unit was first programmed. + .Date_Code_as_YYYYMMDD = 20200101, +}; + +NVM_EEPROMEntry_T NVM_Info = +{ + //! Size == sizeof(NVM_Info_T) + .Size = 4, + .EE_Address = 8, + .EE_CRC_Address = 12, + .Value = (uint8_t *)&RAM_Info, + .Default = (uint8_t *)&DEFAULT_Info, + .State = NVM_STATE_UNINITIALIZED +}; +static NVM_Hardware_Settings_T RAM_Hardware_Settings; + +static const NVM_Hardware_Settings_T DEFAULT_Hardware_Settings = +{ + //! Color order for the barrel Neopixels. + .Barrel_Color_Order = 2, + //! Color order for the receiver NeoPixels. + .Receiver_Color_Order = 0, + //! Color order for the display NeoPixels. + .Display_Color_Order = 2, + //! Color order for the effects NeoPixels. + .Effects_Color_Order = 2, + //! true if this unit is configured for a right-handed person; false if for a left-handed person. + .Is_Right_Handed = true, + //! Audio volume. + .Volume = 20, +}; + +NVM_EEPROMEntry_T NVM_Hardware_Settings = +{ + //! Size == sizeof(NVM_Hardware_Settings_T) + .Size = 6, + .EE_Address = 14, + .EE_CRC_Address = 20, + .Value = (uint8_t *)&RAM_Hardware_Settings, + .Default = (uint8_t *)&DEFAULT_Hardware_Settings, + .State = NVM_STATE_UNINITIALIZED +}; +static NVM_Game_Settings_T RAM_Game_Settings; + +static const NVM_Game_Settings_T DEFAULT_Game_Settings = +{ + //! Selected weapon. + .Weapon_ID = LASER_X_ID, + //! Player identification (is this used?) + .Player_ID = 0, + //! Selected team. + .Team_ID = 1, +}; + +NVM_EEPROMEntry_T NVM_Game_Settings = +{ + //! Size == sizeof(NVM_Game_Settings_T) + .Size = 3, + .EE_Address = 22, + .EE_CRC_Address = 25, + .Value = (uint8_t *)&RAM_Game_Settings, + .Default = (uint8_t *)&DEFAULT_Game_Settings, + .State = NVM_STATE_UNINITIALIZED +}; +static NVM_Hourmeter_T RAM_Hourmeter; + +static const NVM_Hourmeter_T DEFAULT_Hourmeter = +{ + //! Total number of startups for this unit. + .Hourmeter_Startups = 0, +}; + +NVM_EEPROMEntry_T NVM_Hourmeter = +{ + //! Size == sizeof(NVM_Hourmeter_T) + .Size = 2, + .EE_Address = 27, + .EE_CRC_Address = 29, + .Value = (uint8_t *)&RAM_Hourmeter, + .Default = (uint8_t *)&DEFAULT_Hourmeter, + .State = NVM_STATE_UNINITIALIZED +}; + +/** @} */ + +NVM_EEPROMEntry_T * const NVM_ExternalEEPROMEntries[] = +{ + &NVM_External_Test, + &NVM_Info, + &NVM_Hardware_Settings, + &NVM_Game_Settings, + &NVM_Hourmeter, +}; + +//! Size of the #NVM_ExternalEEPROMEntries array (i.e. the number of External EEPROM entries). +const uint8_t NVM_N_EXTERNAL_EEPROM_ENTRIES = (uint8_t) (sizeof(NVM_ExternalEEPROMEntries) / sizeof(NVM_EEPROMEntry_T *)); + diff --git a/2020TPCAppNoDFU.cydsn/NVM/NVM_ExternalEEPROMEntries.h b/2020TPCAppNoDFU.cydsn/NVM/NVM_ExternalEEPROMEntries.h new file mode 100644 index 0000000..61d7103 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/NVM/NVM_ExternalEEPROMEntries.h @@ -0,0 +1,135 @@ +/* + * __ ________ _____ ______ __ + * / //_/_ __/___ _____ _ / ___/____ __ _______________ / ____/___ ____/ /__ + * / ,< / / / __ `/ __ `/ \__ \/ __ \/ / / / ___/ ___/ _ \ / / / __ \/ __ / _ \ + * / /| | / / / /_/ / /_/ / ___/ / /_/ / /_/ / / / /__/ __/ / /___/ /_/ / /_/ / __/ + * /_/ |_|/_/ \__,_/\__, / /____/\____/\__,_/_/ \___/\___/ \____/\____/\__,_/\___/ + * /____/ + * + * 🃞 THIS FILE IS PART OF THE KTAG SOURCE CODE. Visit https://ktag.clubk.club/ for more. 🃞 + * + */ + +/** \file + * \brief [Autogenerated] This file declares the External EEPROM entries. + * + * \note AUTOGENERATED: This file was generated automatically on Friday, April 28, 2023 at 11:31:31 AM. + * DO NOT MODIFY THIS FILE MANUALLY! + */ + +#ifndef NVM_EXTERNALEEPROMENTRIES_H +#define NVM_EXTERNALEEPROMENTRIES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +typedef struct __attribute__((packed)) +{ + //! Test Code 3 + uint16_t External_Test_3; + //! Test Code 4 + uint32_t External_Test_4; +} NVM_External_Test_T; + +typedef struct __attribute__((packed)) +{ + //! Date this unit was first programmed. + uint32_t Date_Code_as_YYYYMMDD; +} NVM_Info_T; + +typedef struct __attribute__((packed)) +{ + //! Color order for the barrel Neopixels. + uint8_t Barrel_Color_Order; + //! Color order for the receiver NeoPixels. + uint8_t Receiver_Color_Order; + //! Color order for the display NeoPixels. + uint8_t Display_Color_Order; + //! Color order for the effects NeoPixels. + uint8_t Effects_Color_Order; + //! true if this unit is configured for a right-handed person; false if for a left-handed person. + bool Is_Right_Handed; + //! Audio volume. + uint8_t Volume; +} NVM_Hardware_Settings_T; + +typedef struct __attribute__((packed)) +{ + //! Selected weapon. + uint8_t Weapon_ID; + //! Player identification (is this used?) + uint8_t Player_ID; + //! Selected team. + uint8_t Team_ID; +} NVM_Game_Settings_T; + +typedef struct __attribute__((packed)) +{ + //! Total number of startups for this unit. + uint16_t Hourmeter_Startups; +} NVM_Hourmeter_T; + + +/* Include Files */ + +/* Public Variables */ + +extern NVM_EEPROMEntry_T NVM_External_Test; +extern NVM_EEPROMEntry_T NVM_Info; +extern NVM_EEPROMEntry_T NVM_Hardware_Settings; +extern NVM_EEPROMEntry_T NVM_Game_Settings; +extern NVM_EEPROMEntry_T NVM_Hourmeter; + +extern NVM_EEPROMEntry_T * const NVM_ExternalEEPROMEntries[]; +extern const uint8_t NVM_N_EXTERNAL_EEPROM_ENTRIES; + +// Shorthand macros, to save you time. +#define NVM_EXTERNAL_TEST_3 (((NVM_External_Test_T*)NVM_External_Test.Value)->External_Test_3) +#define NVM_EXTERNAL_TEST_3_ENTRY_PTR (&NVM_External_Test) + +#define NVM_EXTERNAL_TEST_4 (((NVM_External_Test_T*)NVM_External_Test.Value)->External_Test_4) +#define NVM_EXTERNAL_TEST_4_ENTRY_PTR (&NVM_External_Test) + +#define NVM_DATE_CODE_AS_YYYYMMDD (((NVM_Info_T*)NVM_Info.Value)->Date_Code_as_YYYYMMDD) +#define NVM_DATE_CODE_AS_YYYYMMDD_ENTRY_PTR (&NVM_Info) + +#define NVM_BARREL_COLOR_ORDER (((NVM_Hardware_Settings_T*)NVM_Hardware_Settings.Value)->Barrel_Color_Order) +#define NVM_BARREL_COLOR_ORDER_ENTRY_PTR (&NVM_Hardware_Settings) + +#define NVM_RECEIVER_COLOR_ORDER (((NVM_Hardware_Settings_T*)NVM_Hardware_Settings.Value)->Receiver_Color_Order) +#define NVM_RECEIVER_COLOR_ORDER_ENTRY_PTR (&NVM_Hardware_Settings) + +#define NVM_DISPLAY_COLOR_ORDER (((NVM_Hardware_Settings_T*)NVM_Hardware_Settings.Value)->Display_Color_Order) +#define NVM_DISPLAY_COLOR_ORDER_ENTRY_PTR (&NVM_Hardware_Settings) + +#define NVM_EFFECTS_COLOR_ORDER (((NVM_Hardware_Settings_T*)NVM_Hardware_Settings.Value)->Effects_Color_Order) +#define NVM_EFFECTS_COLOR_ORDER_ENTRY_PTR (&NVM_Hardware_Settings) + +#define NVM_IS_RIGHT_HANDED (((NVM_Hardware_Settings_T*)NVM_Hardware_Settings.Value)->Is_Right_Handed) +#define NVM_IS_RIGHT_HANDED_ENTRY_PTR (&NVM_Hardware_Settings) + +#define NVM_VOLUME (((NVM_Hardware_Settings_T*)NVM_Hardware_Settings.Value)->Volume) +#define NVM_VOLUME_ENTRY_PTR (&NVM_Hardware_Settings) + +#define NVM_WEAPON_ID (((NVM_Game_Settings_T*)NVM_Game_Settings.Value)->Weapon_ID) +#define NVM_WEAPON_ID_ENTRY_PTR (&NVM_Game_Settings) + +#define NVM_PLAYER_ID (((NVM_Game_Settings_T*)NVM_Game_Settings.Value)->Player_ID) +#define NVM_PLAYER_ID_ENTRY_PTR (&NVM_Game_Settings) + +#define NVM_TEAM_ID (((NVM_Game_Settings_T*)NVM_Game_Settings.Value)->Team_ID) +#define NVM_TEAM_ID_ENTRY_PTR (&NVM_Game_Settings) + +#define NVM_HOURMETER_STARTUPS (((NVM_Hourmeter_T*)NVM_Hourmeter.Value)->Hourmeter_Startups) +#define NVM_HOURMETER_STARTUPS_ENTRY_PTR (&NVM_Hourmeter) + + +#ifdef __cplusplus +} +#endif + +#endif // NVM_EXTERNALEEPROMENTRIES_H + diff --git a/2020TPCAppNoDFU.cydsn/NVM/NVM_OnChipEEPROM.c b/2020TPCAppNoDFU.cydsn/NVM/NVM_OnChipEEPROM.c new file mode 100644 index 0000000..5fd56b0 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/NVM/NVM_OnChipEEPROM.c @@ -0,0 +1,260 @@ +/** \file + * \brief This file contains functions that manage the on-chip EEPROM. + * + */ + +/* Include Files */ +#include "KTag.h" + +/* Local Definitions and Constants */ + +/* External Variables [Only if necessary!] */ + +/* External Function Prototypes [Only if necessary!] */ + +/* Public Variables */ + +//! Mutex controlling access to the EEPROM to ensure data/CRC integrity. +SemaphoreHandle_t xSemaphoreOnChipEEPROMLock; + +TaskHandle_t NVM_OnChipEEPROM_Task_Handle; + +volatile bool NVM_IsOnChipEEPROMInitialized = false; + +/* Private Variables */ + +static QueueHandle_t xQueueOnChipEEPROM; + +#if CY_PSOC4 +const uint8_t Emulated_EEPROM_Storage[On_Chip_Emulated_EEPROM_PHYSICAL_SIZE] +__ALIGNED(CY_FLASH_SIZEOF_ROW) = {0u}; +#endif // CY_PSOC4 + +/* Private Function Prototypes */ + +/* Inline Functions */ + +#if CY_PSOC4 +//! Reads a block of \a n bytes from EEPROM address \a source to SRAM \a destination. +static inline void EEPROM_read_block(uint8_t * destination, uint16_t source, size_t n) +{ + On_Chip_Emulated_EEPROM_Read(source, destination, n); +} + +//! Writes a block of \a n bytes from SRAM \a source to EEPROM address \a destination. +static inline void EEPROM_write_block(uint8_t * source, uint16_t destination, size_t n) +{ + On_Chip_Emulated_EEPROM_Write(destination, source, n); +} +#endif // CY_PSOC4 + +#if CY_PSOC5 +//! Reads a block of \a n bytes from EEPROM address \a source to SRAM \a destination. +static inline void EEPROM_read_block(uint8_t * destination, uint16_t source, size_t n) +{ + for (uint_fast16_t i = 0; i < n; i++) + { + uint8_t temp = On_Chip_EEPROM_ReadByte(source + i); + *(destination + i) = temp; + } +} + +//! Writes a block of \a n bytes from SRAM \a source to EEPROM address \a destination. +static inline void EEPROM_write_block(uint8_t * source, uint16_t destination, size_t n) +{ + for (uint_fast16_t i = 0; i < n; i++) + { + On_Chip_EEPROM_WriteByte(*(source + i), destination + i); + } +} +#endif // CY_PSOC5 + +#if CY_PSOC6 +//! Reads a block of \a n bytes from EEPROM address \a source to SRAM \a destination. +static inline void EEPROM_read_block(uint8_t * destination, uint16_t source, size_t n) +{ + cy_en_em_eeprom_status_t result = On_Chip_EEPROM_Read(source, destination, n); + + if (result != CY_EM_EEPROM_SUCCESS) + { + CY_ASSERT(0); + } +} + +//! Writes a block of \a n bytes from SRAM \a source to EEPROM address \a destination. +static inline void EEPROM_write_block(uint8_t * source, uint16_t destination, size_t n) +{ + cy_en_em_eeprom_status_t result = On_Chip_EEPROM_Write(destination, source, n); + + if (result != CY_EM_EEPROM_SUCCESS) + { + CY_ASSERT(0); + } +} +#endif // CY_PSOC6 + +/* Public Functions */ + +//! Sets up the on-chip EEPROM, but does not read from it (yet). +void NVM_InitOnChipEEPROM(void) +{ + /// Create a mutex-type semaphore. + xSemaphoreOnChipEEPROMLock = xSemaphoreCreateMutex(); + + if (xSemaphoreOnChipEEPROMLock == NULL) + { + CY_ASSERT(0); + } + + xQueueOnChipEEPROM = xQueueCreate(5, sizeof(uint8_t)); + +#if CY_PSOC4 + On_Chip_Emulated_EEPROM_Init((uint32_t)Emulated_EEPROM_Storage); +#endif // CY_PSOC4 + +#if CY_PSOC5 + On_Chip_EEPROM_Start(); +#endif // CY_PSOC5 + +#if CY_PSOC6 + // From the docs: "For PSoC 6, if Emulated EEPROM is selected for EEPROM storage, the start address will be + // overwritten to some address from Emulated EEPROM flash area." + On_Chip_EEPROM_Init(0); +#endif // CY_PSOC6 +} + +//! Handles the ongoing on-chip EEPROM tasks. +/*! + * First, it loops through all the on-chip EEPROM entries, and reads them in to RAM. + * Then, it priodically loops through all the on-chip EEPROM entries, and saves the ones that have been flagged. + */ +void NVM_OnChipEEPROMTask(void * pvParameters) +{ + portBASE_TYPE xStatus; + static TickType_t xTicksToWait = pdMS_TO_TICKS(NVM_ON_CHIP_EEPROM_TASK_RATE_IN_ms); + + for (uint8_t i = 0; i < NVM_N_ONCHIP_EEPROM_ENTRIES; i++) + { + NVM_CRC_t calculated_crc; + NVM_CRC_t stored_crc = 0; + + EEPROM_read_block(NVM_OnChipEEPROMEntries[i]->Value, NVM_OnChipEEPROMEntries[i]->EE_Address, NVM_OnChipEEPROMEntries[i]->Size); + EEPROM_read_block((uint8_t *)&stored_crc, NVM_OnChipEEPROMEntries[i]->EE_CRC_Address, sizeof(NVM_CRC_t)); + + calculated_crc = NVM_CRC_init(); + calculated_crc = NVM_CRC_update(calculated_crc, NVM_OnChipEEPROMEntries[i]->Value, NVM_OnChipEEPROMEntries[i]->Size); + calculated_crc = NVM_CRC_finalize(calculated_crc); + + if (calculated_crc == stored_crc) + { + NVM_OnChipEEPROMEntries[i]->State = NVM_STATE_IDLE; + } + else + { + NVM_OnChipEEPROMEntries[i]->State = NVM_STATE_CRC_FAILED; + + COMM_Console_Print_String("[NVMOn "); + COMM_Console_Print_UInt16((uint16_t) i); + COMM_Console_Print_String("] Calculated/Stored CRCs: "); + COMM_Console_Print_UInt16((uint16_t) calculated_crc); + COMM_Console_Print_String("/"); + COMM_Console_Print_UInt16((uint16_t) stored_crc); + COMM_Console_Print_String("\n"); + + COMM_Console_Print_String("[NVMOn "); + COMM_Console_Print_UInt16((uint16_t) i); + COMM_Console_Print_String("] Applying defaults.\n"); + + memcpy(NVM_OnChipEEPROMEntries[i]->Value, NVM_OnChipEEPROMEntries[i]->Default, NVM_OnChipEEPROMEntries[i]->Size); + + // Auto-fix the CRC. + NVM_SaveOnChipEEPROMEntry(NVM_OnChipEEPROMEntries[i]); + } + } + + taskENTER_CRITICAL(); + NVM_IsOnChipEEPROMInitialized = true; + taskEXIT_CRITICAL(); + + while(true) + { + uint8_t dummy; + + // Wait for a call to NVM_SaveOnChipEEPROMEntry(). + xStatus = xQueueReceive(xQueueOnChipEEPROM, &dummy, xTicksToWait); + + if (xStatus == pdPASS) + { + for (uint8_t i = 0; i < NVM_N_ONCHIP_EEPROM_ENTRIES; i++) + { + NVM_CRC_t crc; + +#if (defined CY_PSOC4) || (defined CY_PSOC6) + if (NVM_OnChipEEPROMEntries[i]->State == NVM_STATE_SAVE_REQUESTED) + { + if (xSemaphoreTake(xSemaphoreOnChipEEPROMLock, ( TickType_t ) 1000) == pdTRUE) + { + EEPROM_write_block(NVM_OnChipEEPROMEntries[i]->Value, NVM_OnChipEEPROMEntries[i]->EE_Address, NVM_OnChipEEPROMEntries[i]->Size); + + // Calculate the CRC. + crc = NVM_CRC_init(); + crc = NVM_CRC_update(crc, NVM_OnChipEEPROMEntries[i]->Value, NVM_OnChipEEPROMEntries[i]->Size); + crc = NVM_CRC_finalize(crc); + + EEPROM_write_block((uint8_t *)&crc, NVM_OnChipEEPROMEntries[i]->EE_CRC_Address, sizeof(uint16_t)); + NVM_OnChipEEPROMEntries[i]->State = NVM_STATE_IDLE; + xSemaphoreGive(xSemaphoreOnChipEEPROMLock); + } + } +#endif // (defined CY_PSOC4) || (defined CY_PSOC6) + +#if CY_PSOC5 + // From the component datasheet: + // "[On_Chip_EEPROM_UpdateTemperature()] updates the store temperature value. This should + // be called anytime the EEPROM is active and temperature may have changed by more than + // 10°C." + if (On_Chip_EEPROM_UpdateTemperature() == CYRET_SUCCESS) + { + if (NVM_OnChipEEPROMEntries[i]->State == NVM_STATE_SAVE_REQUESTED) + { + if (On_Chip_EEPROM_Query() == CYRET_SUCCESS) + { + if (xSemaphoreTake(xSemaphoreOnChipEEPROMLock, ( TickType_t ) 1000) == pdTRUE) + { + EEPROM_write_block(NVM_OnChipEEPROMEntries[i]->Value, NVM_OnChipEEPROMEntries[i]->EE_Address, NVM_OnChipEEPROMEntries[i]->Size); + + // Calculate the CRC. + crc = NVM_CRC_init(); + crc = NVM_CRC_update(crc, NVM_OnChipEEPROMEntries[i]->Value, NVM_OnChipEEPROMEntries[i]->Size); + crc = NVM_CRC_finalize(crc); + + EEPROM_write_block((uint8_t *)&crc, NVM_OnChipEEPROMEntries[i]->EE_CRC_Address, sizeof(uint16_t)); + NVM_OnChipEEPROMEntries[i]->State = NVM_STATE_IDLE; + xSemaphoreGive(xSemaphoreOnChipEEPROMLock); + } + } + } + } + else + { + vSerialPutString("ERROR: Couldn't update EEPROM temperature!", 80); + } +#endif // CY_PSOC5 + } + } + } +} + +//! Flags the given on-chip EEPROM entry to be saved next time the NVM_OnChipEEPROMTask() is run. +void NVM_SaveOnChipEEPROMEntry(NVM_EEPROMEntry_T * const this) +{ + if (xSemaphoreTake(xSemaphoreOnChipEEPROMLock, ( TickType_t ) 1000) == pdTRUE) + { + this->State = NVM_STATE_SAVE_REQUESTED; + xSemaphoreGive(xSemaphoreOnChipEEPROMLock); + uint8_t dummy = 0; + xQueueSend(xQueueOnChipEEPROM, &dummy, 0); + } +} + +/* Private Functions */ \ No newline at end of file diff --git a/2020TPCAppNoDFU.cydsn/NVM/NVM_OnChipEEPROM.h b/2020TPCAppNoDFU.cydsn/NVM/NVM_OnChipEEPROM.h new file mode 100644 index 0000000..325ef39 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/NVM/NVM_OnChipEEPROM.h @@ -0,0 +1,42 @@ +/** \file + * \brief This file contains the public interface to the on-chip EEPROM driver. + * + */ + +#ifndef NVM_ONCHIPEEPROM_H +#define NVM_ONCHIPEEPROM_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +#define NVM_ON_CHIP_EEPROM_TASK_STACK_SIZE_in_bytes 256 + +//! The time between calls to NVM_OnChipEEPROMTask(). +#define NVM_ON_CHIP_EEPROM_TASK_RATE_IN_ms 2000 + +/* Include Files */ + +/* Public Variables */ + +extern SemaphoreHandle_t xSemaphoreOnChipEEPROMLock; + +//! Handle of the NVM_OnChipEEPROMTask() given when the task was created. +extern TaskHandle_t NVM_OnChipEEPROM_Task_Handle; + +extern volatile bool NVM_IsOnChipEEPROMInitialized; + +/* Public Functions */ +void NVM_InitOnChipEEPROM(void); +void NVM_OnChipEEPROMTask(void * pvParameters); +void NVM_SaveOnChipEEPROMEntry(NVM_EEPROMEntry_T * const this); + +/* Inline Functions */ + +#ifdef __cplusplus +} +#endif + +#endif // NVM_ONCHIPEEPROM_H \ No newline at end of file diff --git a/2020TPCAppNoDFU.cydsn/NVM/NVM_OnChipEEPROMEntries.c b/2020TPCAppNoDFU.cydsn/NVM/NVM_OnChipEEPROMEntries.c new file mode 100644 index 0000000..08b72a4 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/NVM/NVM_OnChipEEPROMEntries.c @@ -0,0 +1,63 @@ +/* + * __ ________ _____ ______ __ + * / //_/_ __/___ _____ _ / ___/____ __ _______________ / ____/___ ____/ /__ + * / ,< / / / __ `/ __ `/ \__ \/ __ \/ / / / ___/ ___/ _ \ / / / __ \/ __ / _ \ + * / /| | / / / /_/ / /_/ / ___/ / /_/ / /_/ / / / /__/ __/ / /___/ /_/ / /_/ / __/ + * /_/ |_|/_/ \__,_/\__, / /____/\____/\__,_/_/ \___/\___/ \____/\____/\__,_/\___/ + * /____/ + * + * 🃞 THIS FILE IS PART OF THE KTAG SOURCE CODE. Visit https://ktag.clubk.club/ for more. 🃞 + * + */ + +/** \file + * \brief [Autogenerated] This file defines the OnChip EEPROM entries. + * + * \note AUTOGENERATED: This file was generated automatically on Friday, April 28, 2023 at 11:31:31 AM. + * DO NOT MODIFY THIS FILE MANUALLY! + */ + +/* Include Files */ +#include "KTag.h" + +/* EEPROM Entries */ + +/** \defgroup NVM_ONCHIP_EEPROM NVM OnChip EEPROM + * + * The OnChip EEPROM is divided into logical "entries", represented by instances of the #NVM_EEPROMEntry_T type. + * At startup, these entries are loaded into their respective RAM copies by NVM_InitOnChipEEPROM(). The application + * then updates the RAM copies directly, and requests that the NVM_OnChipEEPROMTask() save these back to the EEPROM + * when necessary. + * @{ */ + +static NVM_OnChip_Test_T RAM_OnChip_Test; + +static const NVM_OnChip_Test_T DEFAULT_OnChip_Test = +{ + //! Test Code 1 + .OnChip_Test_1 = UINT16_MAX, + //! Test Code 2 + .OnChip_Test_2 = UINT32_MAX, +}; + +NVM_EEPROMEntry_T NVM_OnChip_Test = +{ + //! Size == sizeof(NVM_OnChip_Test_T) + .Size = 6, + .EE_Address = 0, + .EE_CRC_Address = 6, + .Value = (uint8_t *)&RAM_OnChip_Test, + .Default = (uint8_t *)&DEFAULT_OnChip_Test, + .State = NVM_STATE_UNINITIALIZED +}; + +/** @} */ + +NVM_EEPROMEntry_T * const NVM_OnChipEEPROMEntries[] = +{ + &NVM_OnChip_Test, +}; + +//! Size of the #NVM_OnChipEEPROMEntries array (i.e. the number of OnChip EEPROM entries). +const uint8_t NVM_N_ONCHIP_EEPROM_ENTRIES = (uint8_t) (sizeof(NVM_OnChipEEPROMEntries) / sizeof(NVM_EEPROMEntry_T *)); + diff --git a/2020TPCAppNoDFU.cydsn/NVM/NVM_OnChipEEPROMEntries.h b/2020TPCAppNoDFU.cydsn/NVM/NVM_OnChipEEPROMEntries.h new file mode 100644 index 0000000..507737a --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/NVM/NVM_OnChipEEPROMEntries.h @@ -0,0 +1,60 @@ +/* + * __ ________ _____ ______ __ + * / //_/_ __/___ _____ _ / ___/____ __ _______________ / ____/___ ____/ /__ + * / ,< / / / __ `/ __ `/ \__ \/ __ \/ / / / ___/ ___/ _ \ / / / __ \/ __ / _ \ + * / /| | / / / /_/ / /_/ / ___/ / /_/ / /_/ / / / /__/ __/ / /___/ /_/ / /_/ / __/ + * /_/ |_|/_/ \__,_/\__, / /____/\____/\__,_/_/ \___/\___/ \____/\____/\__,_/\___/ + * /____/ + * + * 🃞 THIS FILE IS PART OF THE KTAG SOURCE CODE. Visit https://ktag.clubk.club/ for more. 🃞 + * + */ + +/** \file + * \brief [Autogenerated] This file declares the OnChip EEPROM entries. + * + * \note AUTOGENERATED: This file was generated automatically on Friday, April 28, 2023 at 11:31:31 AM. + * DO NOT MODIFY THIS FILE MANUALLY! + */ + +#ifndef NVM_ONCHIPEEPROMENTRIES_H +#define NVM_ONCHIPEEPROMENTRIES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ + +typedef struct __attribute__((packed)) +{ + //! Test Code 1 + uint16_t OnChip_Test_1; + //! Test Code 2 + uint32_t OnChip_Test_2; +} NVM_OnChip_Test_T; + + +/* Include Files */ + +/* Public Variables */ + +extern NVM_EEPROMEntry_T NVM_OnChip_Test; + +extern NVM_EEPROMEntry_T * const NVM_OnChipEEPROMEntries[]; +extern const uint8_t NVM_N_ONCHIP_EEPROM_ENTRIES; + +// Shorthand macros, to save you time. +#define NVM_ONCHIP_TEST_1 (((NVM_OnChip_Test_T*)NVM_OnChip_Test.Value)->OnChip_Test_1) +#define NVM_ONCHIP_TEST_1_ENTRY_PTR (&NVM_OnChip_Test) + +#define NVM_ONCHIP_TEST_2 (((NVM_OnChip_Test_T*)NVM_OnChip_Test.Value)->OnChip_Test_2) +#define NVM_ONCHIP_TEST_2_ENTRY_PTR (&NVM_OnChip_Test) + + +#ifdef __cplusplus +} +#endif + +#endif // NVM_ONCHIPEEPROMENTRIES_H + diff --git a/2020TPCAppNoDFU.cydsn/NVM/NVM_Settings.c b/2020TPCAppNoDFU.cydsn/NVM/NVM_Settings.c new file mode 100644 index 0000000..4585506 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/NVM/NVM_Settings.c @@ -0,0 +1,125 @@ +/** \file + * \brief This file contains functions that implement the settings interface for SystemK. + * + */ + +/* Include Files */ +#include "KTag.h" + + +SystemKResult_T SETTINGS_get_uint8_t(SystemKSettingID_T id, uint8_t * value) +{ + SystemKResult_T result = SYSTEMK_RESULT_SUCCESS; + + switch (id) + { + case SYSTEMK_SETTING_IS_RIGHT_HANDED: + *value = NVM_IS_RIGHT_HANDED; + break; + + case SYSTEMK_SETTING_AUDIO_VOLUME: + *value = NVM_VOLUME; + break; + + case SYSTEMK_SETTING_TEAMID: + *value = NVM_TEAM_ID; + break; + + case SYSTEMK_SETTING_PLAYERID: + *value = NVM_PLAYER_ID; + break; + + case SYSTEMK_SETTING_WEAPONID: + *value = NVM_WEAPON_ID; + break; + + default: + result = SYSTEMK_RESULT_WRONG_DATATYPE; + break; + } + + return result; +} + +SystemKResult_T SETTINGS_set_uint8_t(SystemKSettingID_T id, uint8_t value) +{ + SystemKResult_T result = SYSTEMK_RESULT_SUCCESS; + + switch (id) + { + case SYSTEMK_SETTING_IS_RIGHT_HANDED: + NVM_IS_RIGHT_HANDED = value; + break; + + case SYSTEMK_SETTING_AUDIO_VOLUME: + NVM_VOLUME = value; + break; + + case SYSTEMK_SETTING_TEAMID: + NVM_TEAM_ID = value; + break; + + case SYSTEMK_SETTING_PLAYERID: + NVM_PLAYER_ID = value; + break; + + case SYSTEMK_SETTING_WEAPONID: + NVM_WEAPON_ID = value; + break; + + default: + result = SYSTEMK_RESULT_WRONG_DATATYPE; + break; + } + + return result; +} + +SystemKResult_T SETTINGS_get_uint32_t(SystemKSettingID_T id, uint32_t * value) +{ + SystemKResult_T result = SYSTEMK_RESULT_SUCCESS; + + switch (id) + { + case SYSTEMK_SETTING_T_START_GAME_in_ms: + *value = CONFIG_KTAG_T_DEFAULT_START_GAME_in_ms; + break; + + default: + result = SYSTEMK_RESULT_WRONG_DATATYPE; + break; + } + + return result; +} + +SystemKResult_T SETTINGS_set_uint32_t(SystemKSettingID_T id, uint32_t value) +{ + SystemKResult_T result = SYSTEMK_RESULT_SUCCESS; + + switch (id) + { + case SYSTEMK_SETTING_T_START_GAME_in_ms: + result = SYSTEMK_RESULT_NOT_IMPLEMENTED; + break; + + default: + result = SYSTEMK_RESULT_WRONG_DATATYPE; + break; + } + + return result; +} + +SystemKResult_T SETTINGS_Save(void) +{ +#if (CONFIG__HAS_EXTERNAL_NVM) + NVM_SaveExternalEEPROMEntry(&NVM_Hardware_Settings); + NVM_SaveExternalEEPROMEntry(&NVM_Game_Settings); +#else // CONFIG__HAS_EXTERNAL_NVM + NVM_SaveOnChipEEPROMEntry(&NVM_Hardware_Settings); + NVM_SaveOnChipEEPROMEntry(&NVM_Game_Settings); +#endif // CONFIG__HAS_EXTERNAL_NVM + + return SYSTEMK_RESULT_SUCCESS; +} diff --git a/2020TPCAppNoDFU.cydsn/Sample_Tasks.c b/2020TPCAppNoDFU.cydsn/Sample_Tasks.c new file mode 100644 index 0000000..46bf192 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/Sample_Tasks.c @@ -0,0 +1,93 @@ +/* Include Files */ +#include "KTag.h" + +TaskHandle_t Sample_Task_Handle; + +// LED Functionality +static void LED_CoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ); +#define LED_COROUTINE_PRIORITY 0 +static const TickType_t Delay_50ms = 50 / portTICK_PERIOD_MS; +static const TickType_t Delay_100ms = 100 / portTICK_PERIOD_MS; +static const TickType_t Delay_600ms = 600 / portTICK_PERIOD_MS; + +// Serial Debug Functionality +static void Serial_Debug_CoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ); +#define SERIAL_DEBUG_COROUTINE_PRIORITY 0 +static const TickType_t Delay_1s = 1000 / portTICK_PERIOD_MS; + +void Sample_Task_Init(void) +{ +} + +//! Sample task: blinks the LED and sends text out on the UART. +/*! + * \param pvParameters (not used) + * \return None (infinite loop) + */ +void Sample_Task(void * pvParameters) +{ + xCoRoutineCreate(LED_CoRoutine, LED_COROUTINE_PRIORITY, 0 ); + xCoRoutineCreate(Serial_Debug_CoRoutine, SERIAL_DEBUG_COROUTINE_PRIORITY, 0 ); + + while (true) + { + vCoRoutineSchedule(); + + // Delay a bit here so as to not starve the idle task. + vTaskDelay(10 / portTICK_PERIOD_MS); + } +} + +//! Blinks the LED. +static void LED_CoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) +{ + crSTART( xHandle ); + + static bool is_startup = false; + + while (true) + { + if (is_startup == false) + { + Cy_GPIO_Write(Red_LED_PORT, Red_LED_NUM, 1); + crDELAY(xHandle, Delay_100ms); + + Cy_GPIO_Write(Red_LED_PORT, Red_LED_NUM, 0); + crDELAY(xHandle, Delay_50ms); + + Cy_GPIO_Write(Red_LED_PORT, Red_LED_NUM, 1); + crDELAY(xHandle, Delay_100ms); + + Cy_GPIO_Write(Red_LED_PORT, Red_LED_NUM, 0); + crDELAY(xHandle, Delay_50ms); + + Cy_GPIO_Write(Red_LED_PORT, Red_LED_NUM, 1); + crDELAY(xHandle, Delay_100ms); + + Cy_GPIO_Write(Red_LED_PORT, Red_LED_NUM, 0); + + is_startup = true; + } + crDELAY(xHandle, Delay_600ms); + } + + crEND(); +} + +static void Serial_Debug_CoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex ) +{ + crSTART( xHandle ); + + //static uint32_t i = 0; + + while (true) + { + //Debug_printf("%lu\n", i++); + //vSerialPutString(" * ", 50); + crDELAY(xHandle, Delay_1s); + } + + crEND(); +} + +/* [] END OF FILE */ diff --git a/2020TPCAppNoDFU.cydsn/Sample_Tasks.h b/2020TPCAppNoDFU.cydsn/Sample_Tasks.h new file mode 100644 index 0000000..4d0780a --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/Sample_Tasks.h @@ -0,0 +1,9 @@ +#ifndef SAMPLE_TASKS_H +#define SAMPLE_TASKS_H + +extern TaskHandle_t Sample_Task_Handle; + +void Sample_Task_Init(void); +void Sample_Task(void * pvParameters); + +#endif // SAMPLE_TASKS_H diff --git a/2020TPCAppNoDFU.cydsn/Switches.c b/2020TPCAppNoDFU.cydsn/Switches.c new file mode 100644 index 0000000..8fbdbeb --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/Switches.c @@ -0,0 +1,196 @@ +/* Include Files */ +#include "KTag.h" + +TaskHandle_t Switches_Task_Handle; + +#define SWITCHES_TASK_PERIOD_IN_TICKS (100 / portTICK_PERIOD_MS) + +//! Continuously pressing a switch for this length of time will be interpreted as a long press. +/*! + * #Duration_Of_Long_Press_in_Ticks must be an integer multiple of #SWITCHES_TASK_PERIOD_IN_TICKS! + */ +static const TickType_t Duration_Of_Long_Press_in_Ticks = (10 * SWITCHES_TASK_PERIOD_IN_TICKS); + +#if (defined LIL_BRUV) || (defined LITTLE_BOY_BLUE) +static TickType_t Up_Switch_Time_Pressed_in_Ticks = 0; +static TickType_t Up_Switch_Time_Released_in_Ticks = 0; +static TickType_t Down_Switch_Time_Pressed_in_Ticks = 0; +static TickType_t Down_Switch_Time_Released_in_Ticks = 0; +static TickType_t Forward_Switch_Time_Pressed_in_Ticks = 0; +static TickType_t Forward_Switch_Time_Released_in_Ticks = 0; +static TickType_t Backward_Switch_Time_Pressed_in_Ticks = 0; +static TickType_t Backward_Switch_Time_Released_in_Ticks = 0; +#elif (defined TWENTY20TPC) +static TickType_t Accessory_Switch_Time_Pressed_in_Ticks = 0; +static TickType_t Accessory_Switch_Total_Time_Pressed_in_Ticks = 0; +static TickType_t Accessory_Switch_Time_Released_in_Ticks = 0; +static TickType_t Accessory_Switch_Time_Since_Last_Release_in_Ticks = 0; +#endif // Model + +void Switches_Init(void) +{ + +} + + +//! Reads the hardware switches and creates press and release events. +/*! + * This is a periodic task--see https://www.freertos.org/vtaskdelayuntil.html. + */ +void Switches_Task(void * pvParameters) +{ + TickType_t xLastWakeTime; + + // Initialize the xLastWakeTime variable with the current time. + xLastWakeTime = xTaskGetTickCount(); + + while (true) + { +#if (defined LIL_BRUV) || (defined LITTLE_BOY_BLUE) + if (Cy_GPIO_Read(Pin_Up_PORT, Pin_Up_NUM) == 0) + { + if (Up_Switch_Time_Pressed_in_Ticks == 0) + { + Up_Switch_Time_Released_in_Ticks = 0; + KEvent_T switch_event = {.ID = KEVENT_UP_SWITCH_PRESSED, .Data = &Up_Switch_Time_Released_in_Ticks}; + Post_KEvent(&switch_event); + } + else if (Up_Switch_Time_Pressed_in_Ticks == Duration_Of_Long_Press_in_Ticks) + { + KEvent_T switch_event = {.ID = KEVENT_UP_SWITCH_LONG_PRESSED, .Data = &Up_Switch_Time_Pressed_in_Ticks}; + Post_KEvent(&switch_event); + } + + Up_Switch_Time_Pressed_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } + else + { + if (Up_Switch_Time_Released_in_Ticks == 0) + { + Up_Switch_Time_Pressed_in_Ticks = 0; + KEvent_T switch_event = {.ID = KEVENT_UP_SWITCH_RELEASED, .Data = &Up_Switch_Time_Pressed_in_Ticks}; + Post_KEvent(&switch_event); + } + + Up_Switch_Time_Released_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } + + if (Cy_GPIO_Read(Pin_Down_PORT, Pin_Down_NUM) == 0) + { + if (Down_Switch_Time_Pressed_in_Ticks == 0) + { + Down_Switch_Time_Released_in_Ticks = 0; + KEvent_T switch_event = {.ID = KEVENT_DOWN_SWITCH_PRESSED, .Data = &Down_Switch_Time_Released_in_Ticks}; + Post_KEvent(&switch_event); + } + else if (Down_Switch_Time_Pressed_in_Ticks == Duration_Of_Long_Press_in_Ticks) + { + KEvent_T switch_event = {.ID = KEVENT_DOWN_SWITCH_LONG_PRESSED, .Data = &Down_Switch_Time_Pressed_in_Ticks}; + Post_KEvent(&switch_event); + } + + Down_Switch_Time_Pressed_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } + else + { + if (Down_Switch_Time_Released_in_Ticks == 0) + { + Down_Switch_Time_Pressed_in_Ticks = 0; + KEvent_T switch_event = {.ID = KEVENT_DOWN_SWITCH_RELEASED, .Data = &Down_Switch_Time_Pressed_in_Ticks}; + Post_KEvent(&switch_event); + } + + Down_Switch_Time_Released_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } + + if (Cy_GPIO_Read(Pin_Forward_PORT, Pin_Forward_NUM) == 0) + { + if (Forward_Switch_Time_Pressed_in_Ticks == 0) + { + Forward_Switch_Time_Released_in_Ticks = 0; + KEvent_T switch_event = {.ID = KEVENT_FORWARD_SWITCH_PRESSED, .Data = &Forward_Switch_Time_Released_in_Ticks}; + Post_KEvent(&switch_event); + } + else if (Forward_Switch_Time_Pressed_in_Ticks == Duration_Of_Long_Press_in_Ticks) + { + KEvent_T switch_event = {.ID = KEVENT_FORWARD_SWITCH_LONG_PRESSED, .Data = &Forward_Switch_Time_Pressed_in_Ticks}; + Post_KEvent(&switch_event); + } + + Forward_Switch_Time_Pressed_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } + else + { + if (Forward_Switch_Time_Released_in_Ticks == 0) + { + Forward_Switch_Time_Pressed_in_Ticks = 0; + KEvent_T switch_event = {.ID = KEVENT_FORWARD_SWITCH_RELEASED, .Data = &Forward_Switch_Time_Pressed_in_Ticks}; + Post_KEvent(&switch_event); + } + + Forward_Switch_Time_Released_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } + + if (Cy_GPIO_Read(Pin_Backward_PORT, Pin_Backward_NUM) == 0) + { + if (Backward_Switch_Time_Pressed_in_Ticks == 0) + { + Backward_Switch_Time_Released_in_Ticks = 0; + KEvent_T switch_event = {.ID = KEVENT_BACKWARD_SWITCH_PRESSED, .Data = &Backward_Switch_Time_Released_in_Ticks}; + Post_KEvent(&switch_event); + } + else if (Backward_Switch_Time_Pressed_in_Ticks == Duration_Of_Long_Press_in_Ticks) + { + KEvent_T switch_event = {.ID = KEVENT_BACKWARD_SWITCH_LONG_PRESSED, .Data = &Backward_Switch_Time_Pressed_in_Ticks}; + Post_KEvent(&switch_event); + } + + Backward_Switch_Time_Pressed_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } + else + { + if (Backward_Switch_Time_Released_in_Ticks == 0) + { + Backward_Switch_Time_Pressed_in_Ticks = 0; + KEvent_T switch_event = {.ID = KEVENT_BACKWARD_SWITCH_RELEASED, .Data = &Backward_Switch_Time_Pressed_in_Ticks}; + Post_KEvent(&switch_event); + } + + Backward_Switch_Time_Released_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } +#elif (defined TWENTY20TPC) + // Use the Remote Trigger pin as the Accessory input, since we never got around to using remote triggers. + if (Cy_GPIO_Read(Pin_Remote_Trigger_PORT, Pin_Remote_Trigger_NUM) == 0) + { + if (Accessory_Switch_Time_Pressed_in_Ticks == 0) + { + Accessory_Switch_Time_Since_Last_Release_in_Ticks = Accessory_Switch_Time_Released_in_Ticks; + KEvent_T switch_event = {.ID = KEVENT_ACCESSORY_SWITCH_PRESSED, .Data = (void *) pdTICKS_TO_MS(Accessory_Switch_Time_Since_Last_Release_in_Ticks)}; + Post_KEvent(&switch_event); + Accessory_Switch_Time_Released_in_Ticks = 0; + } + if ((UINT32_MAX - Accessory_Switch_Time_Pressed_in_Ticks) > SWITCHES_TASK_PERIOD_IN_TICKS) + { + Accessory_Switch_Time_Pressed_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } + } + else + { + if (Accessory_Switch_Time_Released_in_Ticks == 0) + { + Accessory_Switch_Total_Time_Pressed_in_Ticks = Accessory_Switch_Time_Pressed_in_Ticks; + KEvent_T switch_event = {.ID = KEVENT_ACCESSORY_SWITCH_RELEASED, .Data = (void *) pdTICKS_TO_MS(Accessory_Switch_Total_Time_Pressed_in_Ticks)}; + Post_KEvent(&switch_event); + Accessory_Switch_Time_Pressed_in_Ticks = 0; + } + if ((UINT32_MAX - Accessory_Switch_Time_Released_in_Ticks) > SWITCHES_TASK_PERIOD_IN_TICKS) + { + Accessory_Switch_Time_Released_in_Ticks += SWITCHES_TASK_PERIOD_IN_TICKS; + } + } +#endif // Model + + // Wait for the next cycle. + vTaskDelayUntil(&xLastWakeTime, SWITCHES_TASK_PERIOD_IN_TICKS); + } +} diff --git a/2020TPCAppNoDFU.cydsn/Switches.h b/2020TPCAppNoDFU.cydsn/Switches.h new file mode 100644 index 0000000..5472fdf --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/Switches.h @@ -0,0 +1,9 @@ +#ifndef SWITCHES_H +#define SWITCHES_H + +extern TaskHandle_t Switches_Task_Handle; + +void Switches_Init(void); +void Switches_Task(void * pvParameters); + +#endif // SWITCHES_H diff --git a/2020TPCAppNoDFU.cydsn/SystemK b/2020TPCAppNoDFU.cydsn/SystemK new file mode 160000 index 0000000..4fe072f --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/SystemK @@ -0,0 +1 @@ +Subproject commit 4fe072f2d3280b19aa53e197bd22ec44b174ff88 diff --git a/2020TPCAppNoDFU.cydsn/Tag_Sensors.c b/2020TPCAppNoDFU.cydsn/Tag_Sensors.c new file mode 100644 index 0000000..2b535e1 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/Tag_Sensors.c @@ -0,0 +1,582 @@ +/* Include Files */ +#include "KTag.h" + +TaskHandle_t Tag_Sensors_Task_Handle; + +//#define DEBUG_TAG_SENSORS + +#define MAX_RX_PULSES (2 * MAX_PULSES) + +typedef enum +{ + FALLING_EDGE, + RISING_EDGE +} EdgeDirection_T; + +static volatile uint32_t LocalIncomingPulseDurations[MAX_RX_PULSES]; +static volatile uint32_t RemoteIncomingPulseDurations[MAX_RX_PULSES]; +static volatile uint16_t LocalPulseIndex = 0; +static volatile uint16_t RemotePulseIndex = 0; +static volatile uint16_t NumberOfLocalIncomingPulses = 0; +static volatile uint16_t NumberOfRemoteIncomingPulses = 0; +static volatile TagSensorLocation_T LocalActiveSensor = TAG_SENSOR_NONE; +static uint32_t LocalProcessingPulseDurations[MAX_RX_PULSES]; +static uint32_t RemoteProcessingPulseDurations[MAX_RX_PULSES]; +static uint16_t NumberOfLocalProcessingPulses = 0; +static uint16_t NumberOfRemoteProcessingPulses = 0; +static TimedPulseTrain_T LocalProcessingPulses; +static TimedPulseTrain_T RemoteProcessingPulses; +static TagSensorLocation_T LocalProcessingSensor = TAG_SENSOR_NONE; +static volatile EdgeDirection_T LocalExpectedEdgeDirection = FALLING_EDGE; +static volatile EdgeDirection_T RemoteExpectedEdgeDirection = FALLING_EDGE; + + +void On_Forward_Tag_Sensor_Rising_Edge(); +void On_Forward_Tag_Sensor_Falling_Edge(); +void On_Left_Tag_Sensor_Rising_Edge(); +void On_Left_Tag_Sensor_Falling_Edge(); +void On_Right_Tag_Sensor_Rising_Edge(); +void On_Right_Tag_Sensor_Falling_Edge(); +void On_Remote_Tag_Sensor_Rising_Edge(); +void On_Remote_Tag_Sensor_Falling_Edge(); +void On_Local_Tag_Sensor_Bit_Stream_Timer(); +void On_Remote_Tag_Sensor_Bit_Stream_Timer(); + +QueueHandle_t xQueueTagSensors; + +#ifdef DEBUG_TAG_SENSORS +static char8 buffer[30]; +#endif // DEBUG_TAG_SENSORS + +inline static void AppendLocalPulse(uint32_t duration) +{ + LocalIncomingPulseDurations[LocalPulseIndex] = duration; + + if (LocalPulseIndex < (MAX_RX_PULSES - 1)) + { + LocalPulseIndex++; + } +} + +inline static void AppendRemotePulse(uint32_t duration) +{ + RemoteIncomingPulseDurations[RemotePulseIndex] = duration; + + if (RemotePulseIndex < (MAX_RX_PULSES - 1)) + { + RemotePulseIndex++; + } +} + +inline static void EnableAllLocalEdgeISRs(void) +{ + NVIC_EnableIRQ(Forward_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_EnableIRQ(Forward_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + NVIC_EnableIRQ(Left_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_EnableIRQ(Left_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + NVIC_EnableIRQ(Right_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_EnableIRQ(Right_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); +} + +inline static void EnableAllRemoteEdgeISRs(void) +{ + NVIC_EnableIRQ(Remote_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_EnableIRQ(Remote_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); +} + +inline static void DisableAllLocalRisingEdgeISRs(void) +{ + NVIC_DisableIRQ(Forward_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_DisableIRQ(Left_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_DisableIRQ(Right_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); +} + +inline static void DisableAllRemoteRisingEdgeISRs(void) +{ + NVIC_DisableIRQ(Remote_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); +} + +inline static void DisableAllLocalFallingEdgeISRs(void) +{ + NVIC_DisableIRQ(Forward_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + NVIC_DisableIRQ(Left_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + NVIC_DisableIRQ(Right_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); +} + +inline static void DisableAllRemoteFallingEdgeISRs(void) +{ + NVIC_DisableIRQ(Remote_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); +} + +inline static void DisableAllLocalEdgeISRs(void) +{ + DisableAllLocalRisingEdgeISRs(); + DisableAllLocalFallingEdgeISRs(); +} + +inline static void DisableAllRemoteEdgeISRs(void) +{ + DisableAllRemoteRisingEdgeISRs(); + DisableAllRemoteFallingEdgeISRs(); +} + +inline static void ClearAllPendingLocalEdgeISRs(void) +{ + NVIC_ClearPendingIRQ(Forward_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_ClearPendingIRQ(Forward_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + NVIC_ClearPendingIRQ(Left_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_ClearPendingIRQ(Left_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + NVIC_ClearPendingIRQ(Right_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_ClearPendingIRQ(Right_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); +} + +inline static void ClearAllPendingRemoteEdgeISRs(void) +{ + NVIC_ClearPendingIRQ(Remote_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + NVIC_ClearPendingIRQ(Remote_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); +} + +void Tag_Sensors_Init(void) +{ + // Register the Local ISRs. + Cy_SysInt_Init(&Forward_Tag_Sensor_Rising_Edge_ISR_cfg, On_Forward_Tag_Sensor_Rising_Edge); + Cy_SysInt_Init(&Forward_Tag_Sensor_Falling_Edge_ISR_cfg, On_Forward_Tag_Sensor_Falling_Edge); + Cy_SysInt_Init(&Left_Tag_Sensor_Rising_Edge_ISR_cfg, On_Left_Tag_Sensor_Rising_Edge); + Cy_SysInt_Init(&Left_Tag_Sensor_Falling_Edge_ISR_cfg, On_Left_Tag_Sensor_Falling_Edge); + Cy_SysInt_Init(&Right_Tag_Sensor_Rising_Edge_ISR_cfg, On_Right_Tag_Sensor_Rising_Edge); + Cy_SysInt_Init(&Right_Tag_Sensor_Falling_Edge_ISR_cfg, On_Right_Tag_Sensor_Falling_Edge); + Cy_SysInt_Init(&Local_Tag_Sensor_Bit_Stream_Timer_Interrupt_cfg, On_Local_Tag_Sensor_Bit_Stream_Timer); + + // Register the Remote ISRs. + Cy_SysInt_Init(&Remote_Tag_Sensor_Rising_Edge_ISR_cfg, On_Remote_Tag_Sensor_Rising_Edge); + Cy_SysInt_Init(&Remote_Tag_Sensor_Falling_Edge_ISR_cfg, On_Remote_Tag_Sensor_Falling_Edge); + Cy_SysInt_Init(&Remote_Tag_Sensor_Bit_Stream_Timer_Interrupt_cfg, On_Remote_Tag_Sensor_Bit_Stream_Timer); + + // Enable the forward, left, right, and remote sensors. + Tag_Sensor_Register_Write(0xFF - 0x0F); + + xQueueTagSensors = xQueueCreate(5, sizeof(TagSensorsAction_T)); + + // Enable the timers. + NVIC_EnableIRQ(Local_Tag_Sensor_Bit_Stream_Timer_Interrupt_cfg.intrSrc); + NVIC_EnableIRQ(Remote_Tag_Sensor_Bit_Stream_Timer_Interrupt_cfg.intrSrc); + + // Enable the sensors. + EnableAllLocalEdgeISRs(); + EnableAllRemoteEdgeISRs(); + +} + +void Tag_Sensors_Task(void * pvParameters) +{ + portBASE_TYPE xStatus; + + while (true) + { + TagSensorsAction_T action; + + xStatus = xQueueReceive(xQueueTagSensors, &action, 0); + + if (xStatus == pdPASS) + { + switch (action) + { + case TAG_SENSOR_PROCESS_LOCAL_BUFFER: + { + for (uint8_t i = 0; i < NumberOfLocalIncomingPulses; i++) + { + LocalProcessingPulseDurations[i] = LocalIncomingPulseDurations[i]; + } + NumberOfLocalProcessingPulses = NumberOfLocalIncomingPulses; + NumberOfLocalIncomingPulses = 0; + LocalProcessingSensor = LocalActiveSensor; + LocalActiveSensor = TAG_SENSOR_NONE; + EnableAllLocalEdgeISRs(); + +#ifdef DEBUG_TAG_SENSORS + COMM_Console_Print_String("\n"); + + switch (LocalProcessingSensor) + { + case TAG_SENSOR_FORWARD: + COMM_Console_Print_String("Tag Rx'd FORWARD\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + break; + + case TAG_SENSOR_LEFT: + COMM_Console_Print_String("Tag Rx'd LEFT\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + break; + + case TAG_SENSOR_RIGHT: + COMM_Console_Print_String("Tag Rx'd RIGHT\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + break; + + default: + case TAG_SENSOR_REMOTE: + case TAG_SENSOR_NONE: + break; + } + + for (uint_fast16_t i = 0; i < NumberOfLocalProcessingPulses; i++) + { + // Even pulses are marks; odd pulses are spaces. + if ((i % 2) == 0) + { + COMM_Console_Print_String("{.symbol = MARK, .time = "); + sprintf(buffer, "%lu}, // %d\n", LocalProcessingPulseDurations[i], i); + COMM_Console_Print_String(buffer); + vTaskDelay(pdMS_TO_TICKS(10)); + } + // A falling edge is the end of space. + else + { + COMM_Console_Print_String("{.symbol = SPACE, .time = "); + sprintf(buffer, "%lu}, // %d\n", LocalProcessingPulseDurations[i], i); + COMM_Console_Print_String(buffer); + vTaskDelay(pdMS_TO_TICKS(10)); + } + } +#endif // DEBUG_TAG_SENSORS + + LocalProcessingPulses.count = NumberOfLocalProcessingPulses; + for (uint_fast16_t i = 0; (i < NumberOfLocalProcessingPulses) && (i < MAX_RX_PULSES); i++) + { + if ((i % 2) == 0) + { + LocalProcessingPulses.bitstream[i].symbol = MARK; + } + else + { + LocalProcessingPulses.bitstream[i].symbol = SPACE; + } + LocalProcessingPulses.bitstream[i].duration = LocalProcessingPulseDurations[i]; + } + LocalProcessingPulses.bitstream[NumberOfLocalProcessingPulses].duration = LAST_PULSE; + LocalProcessingPulses.receiver = LocalProcessingSensor; + + DecodedPacket_T * result = PROTOCOLS_MaybeDecodePacket(&LocalProcessingPulses); + + if (result != NULL) + { + if (result->Generic.type == DECODED_PACKET_TYPE_TAG_RECEIVED) + { + KEvent_T tag_received_event = {.ID = KEVENT_TAG_RECEIVED, .Data = result}; + Post_KEvent(&tag_received_event); + } + else if (result->Generic.type == DECODED_PACKET_TYPE_COMMAND_RECEIVED) + { + KEvent_T command_received_event = {.ID = KEVENT_COMMAND_RECEIVED, .Data = result}; + Post_KEvent(&command_received_event); + } + } + else + { + KEvent_T near_miss_event = {.ID = KEVENT_NEAR_MISS, .Data = NULL}; + Post_KEvent(&near_miss_event); + } + } + break; + + case TAG_SENSOR_PROCESS_REMOTE_BUFFER: + { + for (uint8_t i = 0; i < NumberOfRemoteIncomingPulses; i++) + { + RemoteProcessingPulseDurations[i] = RemoteIncomingPulseDurations[i]; + } + NumberOfRemoteProcessingPulses = NumberOfRemoteIncomingPulses; + NumberOfRemoteIncomingPulses = 0; + EnableAllRemoteEdgeISRs(); + +#ifdef DEBUG_TAG_SENSORS + COMM_Console_Print_String("\n"); + + COMM_Console_Print_String("Tag Rx'd REMOTE\n"); + vTaskDelay(pdMS_TO_TICKS(10)); + + for (uint_fast16_t i = 0; i < NumberOfRemoteProcessingPulses; i++) + { + // Even pulses are marks; odd pulses are spaces. + if ((i % 2) == 0) + { + COMM_Console_Print_String("{.symbol = MARK, .time = "); + sprintf(buffer, "%lu}, // %d\n", RemoteProcessingPulseDurations[i], i); + COMM_Console_Print_String(buffer); + vTaskDelay(pdMS_TO_TICKS(10)); + } + // A falling edge is the end of space. + else + { + COMM_Console_Print_String("{.symbol = SPACE, .time = "); + sprintf(buffer, "%lu}, // %d\n", RemoteProcessingPulseDurations[i], i); + COMM_Console_Print_String(buffer); + vTaskDelay(pdMS_TO_TICKS(10)); + } + } +#endif // DEBUG_TAG_SENSORS + RemoteProcessingPulses.count = NumberOfRemoteProcessingPulses; + for (uint_fast16_t i = 0; (i < NumberOfRemoteProcessingPulses) && (i < MAX_RX_PULSES); i++) + { + if ((i % 2) == 0) + { + RemoteProcessingPulses.bitstream[i].symbol = MARK; + } + else + { + RemoteProcessingPulses.bitstream[i].symbol = SPACE; + } + RemoteProcessingPulses.bitstream[i].duration = RemoteProcessingPulseDurations[i]; + } + RemoteProcessingPulses.bitstream[NumberOfRemoteProcessingPulses].duration = LAST_PULSE; + RemoteProcessingPulses.receiver = TAG_SENSOR_REMOTE; + + DecodedPacket_T * result = PROTOCOLS_MaybeDecodePacket(&RemoteProcessingPulses); + + if (result != NULL) + { + if (result->Generic.type == DECODED_PACKET_TYPE_TAG_RECEIVED) + { + KEvent_T tag_received_event = {.ID = KEVENT_TAG_RECEIVED, .Data = result}; + Post_KEvent(&tag_received_event); + } + else if (result->Generic.type == DECODED_PACKET_TYPE_COMMAND_RECEIVED) + { + KEvent_T command_received_event = {.ID = KEVENT_COMMAND_RECEIVED, .Data = result}; + Post_KEvent(&command_received_event); + } + } + else + { + KEvent_T near_miss_event = {.ID = KEVENT_NEAR_MISS, .Data = NULL}; + Post_KEvent(&near_miss_event); + } + } + break; + + default: + break; + } + } + + vTaskDelay(100 / portTICK_PERIOD_MS); + } +} + +// A rising edge means the IR carrier frequency is no longer detected. +void On_Forward_Tag_Sensor_Rising_Edge() +{ + uint32_t counter = Local_Tag_Sensor_Bit_Stream_Timer_GetCounter(); + + if (LocalActiveSensor == TAG_SENSOR_FORWARD) + { + if (LocalExpectedEdgeDirection == RISING_EDGE) + { + Local_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NVIC_ClearPendingIRQ(Forward_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + + AppendLocalPulse(counter); + LocalExpectedEdgeDirection = FALLING_EDGE; + } + } +} + +// A falling edge means the IR carrier frequency has been detected. +void On_Forward_Tag_Sensor_Falling_Edge() +{ + uint32_t counter = Local_Tag_Sensor_Bit_Stream_Timer_GetCounter(); + + if ((LocalActiveSensor == TAG_SENSOR_FORWARD) || (LocalActiveSensor == TAG_SENSOR_NONE)) + { + if (LocalExpectedEdgeDirection == FALLING_EDGE) + { + Local_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NVIC_ClearPendingIRQ(Forward_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + + if (LocalPulseIndex == 0) + { + Local_Tag_Sensor_Bit_Stream_Timer_Start(); + LocalActiveSensor = TAG_SENSOR_FORWARD; + } + else + { + AppendLocalPulse(counter); + } + LocalExpectedEdgeDirection = RISING_EDGE; + } + } +} + +// A rising edge means the IR carrier frequency is no longer detected. +void On_Left_Tag_Sensor_Rising_Edge() +{ + uint32_t counter = Local_Tag_Sensor_Bit_Stream_Timer_GetCounter(); + + if (LocalActiveSensor == TAG_SENSOR_LEFT) + { + if (LocalExpectedEdgeDirection == RISING_EDGE) + { + Local_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NVIC_ClearPendingIRQ(Left_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + + AppendLocalPulse(counter); + LocalExpectedEdgeDirection = FALLING_EDGE; + } + } +} + +// A falling edge means the IR carrier frequency has been detected. +void On_Left_Tag_Sensor_Falling_Edge() +{ + uint32_t counter = Local_Tag_Sensor_Bit_Stream_Timer_GetCounter(); + + if ((LocalActiveSensor == TAG_SENSOR_LEFT) || (LocalActiveSensor == TAG_SENSOR_NONE)) + { + if (LocalExpectedEdgeDirection == FALLING_EDGE) + { + Local_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NVIC_ClearPendingIRQ(Left_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + + if (LocalPulseIndex == 0) + { + Local_Tag_Sensor_Bit_Stream_Timer_Start(); + LocalActiveSensor = TAG_SENSOR_LEFT; + } + else + { + AppendLocalPulse(counter); + } + LocalExpectedEdgeDirection = RISING_EDGE; + } + } +} + +// A rising edge means the IR carrier frequency is no longer detected. +void On_Right_Tag_Sensor_Rising_Edge() +{ + uint32_t counter = Local_Tag_Sensor_Bit_Stream_Timer_GetCounter(); + + if (LocalActiveSensor == TAG_SENSOR_RIGHT) + { + if (LocalExpectedEdgeDirection == RISING_EDGE) + { + Local_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NVIC_ClearPendingIRQ(Right_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + + AppendLocalPulse(counter); + LocalExpectedEdgeDirection = FALLING_EDGE; + } + } +} + +// A falling edge means the IR carrier frequency has been detected. +void On_Right_Tag_Sensor_Falling_Edge() +{ + uint32_t counter = Local_Tag_Sensor_Bit_Stream_Timer_GetCounter(); + + if ((LocalActiveSensor == TAG_SENSOR_RIGHT) || (LocalActiveSensor == TAG_SENSOR_NONE)) + { + if (LocalExpectedEdgeDirection == FALLING_EDGE) + { + Local_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NVIC_ClearPendingIRQ(Left_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + + if (LocalPulseIndex == 0) + { + Local_Tag_Sensor_Bit_Stream_Timer_Start(); + LocalActiveSensor = TAG_SENSOR_RIGHT; + } + else + { + AppendLocalPulse(counter); + } + LocalExpectedEdgeDirection = RISING_EDGE; + } + } +} + +// A rising edge means the IR carrier frequency is no longer detected. +void On_Remote_Tag_Sensor_Rising_Edge() +{ + uint32_t counter = Remote_Tag_Sensor_Bit_Stream_Timer_GetCounter(); + + if (RemoteExpectedEdgeDirection == RISING_EDGE) + { + Remote_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NVIC_ClearPendingIRQ(Remote_Tag_Sensor_Rising_Edge_ISR_cfg.intrSrc); + + AppendRemotePulse(counter); + RemoteExpectedEdgeDirection = FALLING_EDGE; + } +} + +// A falling edge means the IR carrier frequency has been detected. +void On_Remote_Tag_Sensor_Falling_Edge() +{ + uint32_t counter = Remote_Tag_Sensor_Bit_Stream_Timer_GetCounter(); + + if (RemoteExpectedEdgeDirection == FALLING_EDGE) + { + Remote_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NVIC_ClearPendingIRQ(Remote_Tag_Sensor_Falling_Edge_ISR_cfg.intrSrc); + + if (RemotePulseIndex == 0) + { + Remote_Tag_Sensor_Bit_Stream_Timer_Start(); + } + else + { + AppendRemotePulse(counter); + } + RemoteExpectedEdgeDirection = RISING_EDGE; + } +} + +void On_Local_Tag_Sensor_Bit_Stream_Timer() +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + + // Read and clear the interrupt status. + uint32_t status = Local_Tag_Sensor_Bit_Stream_Timer_GetInterruptStatus(); + Local_Tag_Sensor_Bit_Stream_Timer_ClearInterrupt(CY_TCPWM_INT_ON_TC); + + if (status & CY_TCPWM_INT_ON_TC) + { + // The timer expired. + Local_Tag_Sensor_Bit_Stream_Timer_TriggerStop(); + Local_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NumberOfLocalIncomingPulses = LocalPulseIndex; + LocalPulseIndex = 0; + DisableAllLocalEdgeISRs(); + LocalExpectedEdgeDirection = FALLING_EDGE; + const TagSensorsAction_T action = TAG_SENSOR_PROCESS_LOCAL_BUFFER; + xQueueSendFromISR(xQueueTagSensors, &action, &xHigherPriorityTaskWoken); + } + + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); +} + +void On_Remote_Tag_Sensor_Bit_Stream_Timer() +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + + // Read and clear the interrupt status. + uint32_t status = Remote_Tag_Sensor_Bit_Stream_Timer_GetInterruptStatus(); + Remote_Tag_Sensor_Bit_Stream_Timer_ClearInterrupt(CY_TCPWM_INT_ON_TC); + + if (status & CY_TCPWM_INT_ON_TC) + { + // The timer expired. + Remote_Tag_Sensor_Bit_Stream_Timer_TriggerStop(); + Remote_Tag_Sensor_Bit_Stream_Timer_SetCounter(0); + NumberOfRemoteIncomingPulses = RemotePulseIndex; + RemotePulseIndex = 0; + DisableAllRemoteEdgeISRs(); + RemoteExpectedEdgeDirection = FALLING_EDGE; + const TagSensorsAction_T action = TAG_SENSOR_PROCESS_REMOTE_BUFFER; + xQueueSendFromISR(xQueueTagSensors, &action, &xHigherPriorityTaskWoken); + } + + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); +} + diff --git a/2020TPCAppNoDFU.cydsn/Tag_Sensors.h b/2020TPCAppNoDFU.cydsn/Tag_Sensors.h new file mode 100644 index 0000000..d32d049 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/Tag_Sensors.h @@ -0,0 +1,16 @@ +#ifndef TAG_SENSORS_H +#define TAG_SENSORS_H + + +extern TaskHandle_t Tag_Sensors_Task_Handle; + +void Tag_Sensors_Init(void); +void Tag_Sensors_Task(void * pvParameters); + +typedef enum +{ + TAG_SENSOR_PROCESS_LOCAL_BUFFER, + TAG_SENSOR_PROCESS_REMOTE_BUFFER +} TagSensorsAction_T; + +#endif // TAG_SENSORS_H \ No newline at end of file diff --git a/2020TPCAppNoDFU.cydsn/TopDesign/TopDesign.cysch b/2020TPCAppNoDFU.cydsn/TopDesign/TopDesign.cysch new file mode 100644 index 0000000000000000000000000000000000000000..31e67d511cb3b372eae69a6952e6ab3223639e5d GIT binary patch literal 653620 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

=RYO?W{r66xU=sr1)kT@ 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๫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ΝA}sNFn@Lb3_5pPUw8#af$kVUCFrEs{+r> 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

Z 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 HYXJU#uT66z literal 0 HcmV?d00001 diff --git a/2020TPCAppNoDFU.cydsn/UTIL/UTIL.h b/2020TPCAppNoDFU.cydsn/UTIL/UTIL.h new file mode 100644 index 0000000..e06dd9f --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/UTIL/UTIL.h @@ -0,0 +1,41 @@ +/** \dir UTIL + * + * \brief Utility Software + * + * This directory/namespace contains miscellaneous utility functions. + * + */ + +/** \file + * \brief This file defines the interface to the UTIL package used by this software. + * + * This file should be included by any file outside the UTIL package wishing to make use + * of any of the UTIL functionality. + * + * \note As always, and should be included before this file. + */ + +#ifndef UTIL_H +#define UTIL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Preprocessor and Type Definitions */ +#define STR_HELPER(x) #x +#define STR(x) STR_HELPER(x) + +/* Include Files */ +#include "UTIL_CircularBuffer.h" + +/* Public Variables */ + +/* Public Functions */ + + +#ifdef __cplusplus +} +#endif + +#endif // UTIL_H diff --git a/2020TPCAppNoDFU.cydsn/UTIL/UTIL_CircularBuffer.c b/2020TPCAppNoDFU.cydsn/UTIL/UTIL_CircularBuffer.c new file mode 100644 index 0000000..fb1423f --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/UTIL/UTIL_CircularBuffer.c @@ -0,0 +1,160 @@ +/** \file + * \brief This file implements a circular buffer. + * + */ + +/* Include Files */ +#include +#include +#include + +#include "FreeRTOS.h" +#include "task.h" + +#include "UTIL_CircularBuffer.h" + +/* Local Definitions */ + +/* Public Functions */ + +/* Public Data */ + +/* ******************* Module Level Information ********************* */ + +/* Private Function Prototypes */ + +/* Private Data */ + +/* Module Level Code */ + +//! Increments a value using modular arithmetic. +/*! + * \param value the value to be incremented + * \param modulus the modulus to use + * \return (value + 1) modulo modulus + */ +inline uint16_t ModuloIncrement(const uint16_t value, const uint16_t modulus) +{ + uint16_t nextValue = value + 1; + if (nextValue >= modulus) + { + nextValue = 0; + } + return (nextValue); +} + +//! Initializes the circular buffer, and clears the flags. +/*! + * \param this pointer to the circular buffer in question + * \param buffer pointer to the memory allocated to store this circular buffer + * \param size size (in bytes) of this circular buffer + */ +void UTIL_InitCircularBuffer(UTIL_CircularBuffer_T * const this, uint8_t * buffer, uint16_t size) +{ + this->buffer = buffer; + this->size = size; + this->head = 0; + this->tail = 0; + this->count = 0; + // Note that there is no need to zero out the actual buffer, + // since it will be overwritten when values are added. +} + +//! Adds a value to the end of the circular buffer. +/*! + * If the buffer is full, the value is dropped and the overflow flag is set. + * + * \param this pointer to the circular buffer in question + * \param value the value to be added to the buffer + */ +UTIL_CircularBufferResult_T UTIL_PushToCircularBuffer(UTIL_CircularBuffer_T * const this, uint8_t value) +{ + UTIL_CircularBufferResult_T result = UTIL_CIRCULARBUFFERRESULT_UNKNOWN; + + //UBaseType_t uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); + portDISABLE_INTERRUPTS(); + + if (this->count < this->size) + { + this->buffer[this->head] = value; + this->head = ModuloIncrement(this->head, this->size); + this->count++; + result = UTIL_CIRCULARBUFFERRESULT_SUCCESS; + } + else + { + result = UTIL_CIRCULARBUFFERRESULT_ERROR_OVERFLOW; + } + + portENABLE_INTERRUPTS(); + //taskEXIT_CRITICAL_FROM_ISR(uxSavedInterruptStatus); + + return result; +} + +//! Retrieves a value from the beginning of the circular buffer (FIFO). +/*! + * If the buffer is empty, zero is returned and the underflow flag is set. + * + * \param this pointer to the circular buffer in question + * \return the oldest value in the buffer + */ +UTIL_CircularBufferResult_T UTIL_PopFromCircularBuffer(UTIL_CircularBuffer_T * const this, uint8_t * const value) +{ + UTIL_CircularBufferResult_T result = UTIL_CIRCULARBUFFERRESULT_UNKNOWN; + + //UBaseType_t uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); + portDISABLE_INTERRUPTS(); + + if (this->count > 0) + { + *value = this->buffer[this->tail]; + this->tail = ModuloIncrement(this->tail, this->size); + this->count--; + result = UTIL_CIRCULARBUFFERRESULT_SUCCESS; + } + else + { + *value = 0; + result = UTIL_CIRCULARBUFFERRESULT_ERROR_UNDERFLOW; + } + + portENABLE_INTERRUPTS(); + //taskEXIT_CRITICAL_FROM_ISR(uxSavedInterruptStatus); + + return result; +} + +//! Determines whether or not the circular buffer is empty. +/*! + * \param this pointer to the circular buffer in question + * \return true if the buffer is empty; false otherwise + */ +bool UTIL_IsCircularBufferEmpty(UTIL_CircularBuffer_T * const this) +{ + bool result = false; + + if (this->count == 0) + { + result = true; + } + + return result; +} + +//! Determines whether or not the circular buffer is full. +/*! + * \param this pointer to the circular buffer in question + * \return true if the buffer is full; false otherwise + */ +bool UTIL_IsCircularBufferFull(UTIL_CircularBuffer_T * const this) +{ + bool result = false; + + if (this->count >= this->size) + { + result = true; + } + + return result; +} diff --git a/2020TPCAppNoDFU.cydsn/UTIL/UTIL_CircularBuffer.h b/2020TPCAppNoDFU.cydsn/UTIL/UTIL_CircularBuffer.h new file mode 100644 index 0000000..1e5fa9b --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/UTIL/UTIL_CircularBuffer.h @@ -0,0 +1,41 @@ +/** \file + * \brief This file contains definitions for a circular buffer. + * + */ + +#ifndef UTIL_CIRCULARBUFFER_H +#define UTIL_CIRCULARBUFFER_H + +/* Definitions */ + +typedef enum +{ + //! The result could not be determined. + UTIL_CIRCULARBUFFERRESULT_UNKNOWN = 0, + //! The requested action completed successfully. + UTIL_CIRCULARBUFFERRESULT_SUCCESS, + //! There is no more room in the buffer. + UTIL_CIRCULARBUFFERRESULT_ERROR_OVERFLOW, + //! There is no data left in the buffer. + UTIL_CIRCULARBUFFERRESULT_ERROR_UNDERFLOW +} UTIL_CircularBufferResult_T; + +//! Circular buffer data structure. +typedef struct +{ + uint8_t * buffer; + uint16_t size; + volatile uint16_t head; + volatile uint16_t tail; + volatile uint16_t count; +} UTIL_CircularBuffer_T; + +/* Function Declarations */ + +void UTIL_InitCircularBuffer(UTIL_CircularBuffer_T * const this, uint8_t * buffer, uint16_t size); +UTIL_CircularBufferResult_T UTIL_PushToCircularBuffer(UTIL_CircularBuffer_T * const this, uint8_t value); +UTIL_CircularBufferResult_T UTIL_PopFromCircularBuffer(UTIL_CircularBuffer_T * const this, uint8_t * const value); +bool UTIL_IsCircularBufferEmpty(UTIL_CircularBuffer_T * const this); +bool UTIL_IsCircularBufferFull(UTIL_CircularBuffer_T * const this); + +#endif // UTIL_CIRCULARBUFFER_H diff --git a/2020TPCAppNoDFU.cydsn/cy8c6xx7_cm0plus.icf b/2020TPCAppNoDFU.cydsn/cy8c6xx7_cm0plus.icf new file mode 100644 index 0000000..71ba887 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/cy8c6xx7_cm0plus.icf @@ -0,0 +1,218 @@ +/***************************************************************************//** +* \file cy8c6xx7_cm0plus.icf +* \version 2.20 +* +* Linker file for the IAR compiler. +* +* The main purpose of the linker script is to describe how the sections in the +* input files should be mapped into the output file, and to control the memory +* layout of the output file. +* +* \note The entry point is fixed and starts at 0x10000000. The valid application +* image should be placed there. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case you may see warnings during the +* build process. In your project, you can simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x00000000; + +/* The symbols below define the location and size of blocks of memory in the target. + * Use these symbols to specify the memory regions available for allocation. + */ + +/* The following symbols control RAM and flash memory allocation for the CM0+ core. + * You can change the memory allocation by editing RAM and Flash symbols. + * Your changes must be aligned with the corresponding symbols for CM4 core in 'xx_cm4_dual.icf', + * where 'xx' is the device group; for example, 'cy8c6xx7_cm4_dual.icf'. + */ +/* RAM */ +define symbol __ICFEDIT_region_IRAM1_start__ = 0x08000000; +define symbol __ICFEDIT_region_IRAM1_end__ = 0x08024000; +/* Flash */ +define symbol __ICFEDIT_region_IROM1_start__ = 0x10000000; +define symbol __ICFEDIT_region_IROM1_end__ = 0x10080000; + +/* The following symbols define a 32K flash region used for EEPROM emulation. + * This region can also be used as the general purpose flash. + * You can assign sections to this memory region for only one of the cores. + * Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. + * Therefore, repurposing this memory region will prevent such middleware from operation. + */ +define symbol __ICFEDIT_region_IROM2_start__ = 0x14000000; +define symbol __ICFEDIT_region_IROM2_end__ = 0x14007FFF; + +/* The following symbols define device specific memory regions and must not be changed. */ +/* Supervisory FLASH - User Data */ +define symbol __ICFEDIT_region_IROM3_start__ = 0x16000800; +define symbol __ICFEDIT_region_IROM3_end__ = 0x160007FF; + +/* Supervisory FLASH - Normal Access Restrictions (NAR) */ +define symbol __ICFEDIT_region_IROM4_start__ = 0x16001A00; +define symbol __ICFEDIT_region_IROM4_end__ = 0x16001BFF; + +/* Supervisory FLASH - Public Key */ +define symbol __ICFEDIT_region_IROM5_start__ = 0x16005A00; +define symbol __ICFEDIT_region_IROM5_end__ = 0x160065FF; + +/* Supervisory FLASH - Table of Content # 2 */ +define symbol __ICFEDIT_region_IROM6_start__ = 0x16007C00; +define symbol __ICFEDIT_region_IROM6_end__ = 0x16007DFF; + +/* Supervisory FLASH - Table of Content # 2 Copy */ +define symbol __ICFEDIT_region_IROM7_start__ = 0x16007E00; +define symbol __ICFEDIT_region_IROM7_end__ = 0x16007FFF; + +/* eFuse */ +define symbol __ICFEDIT_region_IROM8_start__ = 0x90700000; +define symbol __ICFEDIT_region_IROM8_end__ = 0x907FFFFF; + +/* XIP */ +define symbol __ICFEDIT_region_EROM1_start__ = 0x18000000; +define symbol __ICFEDIT_region_EROM1_end__ = 0x1FFFFFFF; + +define symbol __ICFEDIT_region_EROM2_start__ = 0x0; +define symbol __ICFEDIT_region_EROM2_end__ = 0x0; +define symbol __ICFEDIT_region_EROM3_start__ = 0x0; +define symbol __ICFEDIT_region_EROM3_end__ = 0x0; + + +define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; +define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM1_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM1_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM2_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM2_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; +/*-Sizes-*/ +if (!isdefinedsymbol(__STACK_SIZE)) { + define symbol __ICFEDIT_size_cstack__ = 0x1000; +} else { + define symbol __ICFEDIT_size_cstack__ = __STACK_SIZE; +} +define symbol __ICFEDIT_size_proc_stack__ = 0x0; +if (!isdefinedsymbol(__HEAP_SIZE)) { + define symbol __ICFEDIT_size_heap__ = 0x0400; +} else { + define symbol __ICFEDIT_size_heap__ = __HEAP_SIZE; +} +/**** End of ICF editor section. ###ICF###*/ + + +define memory mem with size = 4G; +define region IROM1_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__]; +define region IROM2_region = mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__]; +define region IROM3_region = mem:[from __ICFEDIT_region_IROM3_start__ to __ICFEDIT_region_IROM3_end__]; +define region IROM4_region = mem:[from __ICFEDIT_region_IROM4_start__ to __ICFEDIT_region_IROM4_end__]; +define region IROM5_region = mem:[from __ICFEDIT_region_IROM5_start__ to __ICFEDIT_region_IROM5_end__]; +define region IROM6_region = mem:[from __ICFEDIT_region_IROM6_start__ to __ICFEDIT_region_IROM6_end__]; +define region IROM7_region = mem:[from __ICFEDIT_region_IROM7_start__ to __ICFEDIT_region_IROM7_end__]; +define region IROM8_region = mem:[from __ICFEDIT_region_IROM8_start__ to __ICFEDIT_region_IROM8_end__]; +define region EROM1_region = mem:[from __ICFEDIT_region_EROM1_start__ to __ICFEDIT_region_EROM1_end__]; +define region IRAM1_region = mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; +define block HSTACK {block HEAP, block PROC_STACK, last block CSTACK}; +define block RO {first section .intvec, readonly}; + +/*-Initializations-*/ +initialize by copy { readwrite }; +do not initialize { section .noinit, section .intvec_ram }; + + +/*-Placement-*/ + +/* Flash */ +".cy_app_header" : place at start of IROM1_region { section .cy_app_header }; +place in IROM1_region { block RO }; + +/* Emulated EEPROM Flash area */ +".cy_em_eeprom" : place at start of IROM2_region { section .cy_em_eeprom }; + +/* Supervisory Flash - User Data */ +".cy_sflash_user_data" : place at start of IROM3_region { section .cy_sflash_user_data }; + +/* Supervisory Flash - NAR */ +".cy_sflash_nar" : place at start of IROM4_region { section .cy_sflash_nar }; + +/* Supervisory Flash - Public Key */ +".cy_sflash_public_key" : place at start of IROM5_region { section .cy_sflash_public_key }; + +/* Supervisory Flash - TOC2 */ +".cy_toc_part2" : place at start of IROM6_region { section .cy_toc_part2 }; + +/* Supervisory Flash - RTOC2 */ +".cy_rtoc_part2" : place at start of IROM7_region { section .cy_rtoc_part2 }; + +/* eFuse */ +".cy_efuse" : place at start of IROM8_region { section .cy_efuse }; + +/* Execute in Place (XIP). See the smif driver documentation for details. */ +".cy_xip" : place at start of EROM1_region { section .cy_xip }; + +/* RAM */ +place at start of IRAM1_region { readwrite section .intvec_ram}; +place in IRAM1_region { readwrite }; +place at end of IRAM1_region { block HSTACK }; + +/* These sections are used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. */ +".cymeta" : place at address mem : 0x90500000 { readonly section .cymeta }; + + +keep { section .cy_app_header, + section .cy_em_eeprom, + section .cy_sflash_user_data, + section .cy_sflash_nar, + section .cy_sflash_public_key, + section .cy_toc_part2, + section .cy_rtoc_part2, + section .cy_efuse, + section .cy_xip, + section .cymeta, + }; + + +/* The following symbols used by the cymcuelftool. */ +/* Flash */ +define exported symbol __cy_memory_0_start = 0x10000000; +define exported symbol __cy_memory_0_length = 0x00100000; +define exported symbol __cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +define exported symbol __cy_memory_1_start = 0x14000000; +define exported symbol __cy_memory_1_length = 0x8000; +define exported symbol __cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +define exported symbol __cy_memory_2_start = 0x16000000; +define exported symbol __cy_memory_2_length = 0x8000; +define exported symbol __cy_memory_2_row_size = 0x200; + +/* XIP */ +define exported symbol __cy_memory_3_start = 0x18000000; +define exported symbol __cy_memory_3_length = 0x08000000; +define exported symbol __cy_memory_3_row_size = 0x200; + +/* eFuse */ +define exported symbol __cy_memory_4_start = 0x90700000; +define exported symbol __cy_memory_4_length = 0x100000; +define exported symbol __cy_memory_4_row_size = 1; + +/* EOF */ diff --git a/2020TPCAppNoDFU.cydsn/cy8c6xx7_cm0plus.ld b/2020TPCAppNoDFU.cydsn/cy8c6xx7_cm0plus.ld new file mode 100644 index 0000000..90fb447 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/cy8c6xx7_cm0plus.ld @@ -0,0 +1,402 @@ +/***************************************************************************//** +* \file cy8c6xx7_cm0plus.ld +* \version 2.20 +* +* Linker file for the GNU C compiler. +* +* The main purpose of the linker script is to describe how the sections in the +* input files should be mapped into the output file, and to control the memory +* layout of the output file. +* +* \note The entry point location is fixed and starts at 0x10000000. The valid +* application image should be placed there. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case you may see warnings during the +* build process. In your project, you can simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +SEARCH_DIR(.) +GROUP(-lgcc -lc -lnosys) +ENTRY(Reset_Handler) + + +/* Force symbol to be entered in the output file as an undefined symbol. Doing +* this may, for example, trigger linking of additional modules from standard +* libraries. You may list several symbols for each EXTERN, and you may use +* EXTERN multiple times. This command has the same effect as the -u command-line +* option. +*/ +EXTERN(Reset_Handler) + +/* The MEMORY section below describes the location and size of blocks of memory in the target. +* Use this section to specify the memory regions available for allocation. +*/ +MEMORY +{ + /* The ram and flash regions control RAM and flash memory allocation for the CM0+ core. + * You can change the memory allocation by editing the 'ram' and 'flash' regions. + * Your changes must be aligned with the corresponding memory regions for the CM4 core in 'xx_cm4_dual.ld', + * where 'xx' is the device group; for example, 'cy8c6xx7_cm4_dual.ld'. + */ + ram (rwx) : ORIGIN = 0x08000000, LENGTH = 0x24000 + flash (rx) : ORIGIN = 0x10000000, LENGTH = 0x80000 + + /* This is a 32K flash region used for EEPROM emulation. This region can also be used as the general purpose flash. + * You can assign sections to this memory region for only one of the cores. + * Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. + * Therefore, repurposing this memory region will prevent such middleware from operation. + */ + em_eeprom (rx) : ORIGIN = 0x14000000, LENGTH = 0x4000 /* 16 KB */ + + /* The following regions define device specific memory regions and must not be changed. */ + sflash_user_data (rx) : ORIGIN = 0x16000800, LENGTH = 0x800 /* Supervisory flash: User data */ + sflash_nar (rx) : ORIGIN = 0x16001A00, LENGTH = 0x200 /* Supervisory flash: Normal Access Restrictions (NAR) */ + sflash_public_key (rx) : ORIGIN = 0x16005A00, LENGTH = 0xC00 /* Supervisory flash: Public Key */ + sflash_toc_2 (rx) : ORIGIN = 0x16007C00, LENGTH = 0x200 /* Supervisory flash: Table of Content # 2 */ + sflash_rtoc_2 (rx) : ORIGIN = 0x16007E00, LENGTH = 0x200 /* Supervisory flash: Table of Content # 2 Copy */ + xip (rx) : ORIGIN = 0x18000000, LENGTH = 0x8000000 /* 128 MB */ + efuse (r) : ORIGIN = 0x90700000, LENGTH = 0x100000 /* 1 MB */ +} + +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a libnosys.a) + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __Vectors_End + * __Vectors_Size + */ + + +SECTIONS +{ + .cy_app_header : + { + KEEP(*(.cy_app_header)) + } > flash + + .text : + { + . = ALIGN(4); + __Vectors = . ; + KEEP(*(.vectors)) + . = ALIGN(4); + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + __end__ = .; + + . = ALIGN(4); + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + /* Read-only code (constants). */ + *(.rodata .rodata.* .constdata .constdata.* .conststring .conststring.*) + + KEEP(*(.eh_frame*)) + } > flash + + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > flash + + __exidx_start = .; + + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > flash + __exidx_end = .; + + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_psoc6_01_cm0plus.S */ + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + + /* Copy interrupt vectors from flash to RAM */ + LONG (__Vectors) /* From */ + LONG (__ram_vectors_start__) /* To */ + LONG (__Vectors_End - __Vectors) /* Size */ + + /* Copy data section to RAM */ + LONG (__etext) /* From */ + LONG (__data_start__) /* To */ + LONG (__data_end__ - __data_start__) /* Size */ + + __copy_table_end__ = .; + } > flash + + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_psoc6_01_cm0plus.S */ + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + __zero_table_end__ = .; + } > flash + + __etext = . ; + + + .ramVectors (NOLOAD) : ALIGN(8) + { + __ram_vectors_start__ = .; + KEEP(*(.ram_vectors)) + __ram_vectors_end__ = .; + } > ram + + + .data __ram_vectors_end__ : AT (__etext) + { + __data_start__ = .; + + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + + KEEP(*(.cy_ramfunc*)) + . = ALIGN(4); + + __data_end__ = .; + + } > ram + + + /* Place variables in the section that should not be initialized during the + * device startup. + */ + .noinit (NOLOAD) : ALIGN(8) + { + KEEP(*(.noinit)) + } > ram + + + /* The uninitialized global or static variables are placed in this section. + * + * The NOLOAD attribute tells linker that .bss section does not consume + * any space in the image. The NOLOAD attribute changes the .bss type to + * NOBITS, and that makes linker to A) not allocate section in memory, and + * A) put information to clear the section with all zeros during application + * loading. + * + * Without the NOLOAD attribute, the .bss section might get PROGBITS type. + * This makes linker to A) allocate zeroed section in memory, and B) copy + * this section to RAM during application loading. + */ + .bss (NOLOAD): + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > ram + + + .heap (NOLOAD): + { + __HeapBase = .; + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + __HeapLimit = .; + } > ram + + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (NOLOAD): + { + KEEP(*(.stack*)) + } > ram + + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(ram) + LENGTH(ram); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") + + + /* Emulated EEPROM Flash area */ + .cy_em_eeprom : + { + KEEP(*(.cy_em_eeprom)) + } > em_eeprom + + + /* Supervisory Flash: User data */ + .cy_sflash_user_data : + { + KEEP(*(.cy_sflash_user_data)) + } > sflash_user_data + + + /* Supervisory Flash: Normal Access Restrictions (NAR) */ + .cy_sflash_nar : + { + KEEP(*(.cy_sflash_nar)) + } > sflash_nar + + + /* Supervisory Flash: Public Key */ + .cy_sflash_public_key : + { + KEEP(*(.cy_sflash_public_key)) + } > sflash_public_key + + + /* Supervisory Flash: Table of Content # 2 */ + .cy_toc_part2 : + { + KEEP(*(.cy_toc_part2)) + } > sflash_toc_2 + + + /* Supervisory Flash: Table of Content # 2 Copy */ + .cy_rtoc_part2 : + { + KEEP(*(.cy_rtoc_part2)) + } > sflash_rtoc_2 + + + /* Places the code in the Execute in Place (XIP) section. See the smif driver + * documentation for details. + */ + .cy_xip : + { + KEEP(*(.cy_xip)) + } > xip + + + /* eFuse */ + .cy_efuse : + { + KEEP(*(.cy_efuse)) + } > efuse + + + /* These sections are used for additional metadata (silicon revision, + * Silicon/JTAG ID, etc.) storage. + */ + .cymeta 0x90500000 : { KEEP(*(.cymeta)) } :NONE +} + + +/* The following symbols used by the cymcuelftool. */ +/* Flash */ +__cy_memory_0_start = 0x10000000; +__cy_memory_0_length = 0x00100000; +__cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +__cy_memory_1_start = 0x14000000; +__cy_memory_1_length = 0x8000; +__cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +__cy_memory_2_start = 0x16000000; +__cy_memory_2_length = 0x8000; +__cy_memory_2_row_size = 0x200; + +/* XIP */ +__cy_memory_3_start = 0x18000000; +__cy_memory_3_length = 0x08000000; +__cy_memory_3_row_size = 0x200; + +/* eFuse */ +__cy_memory_4_start = 0x90700000; +__cy_memory_4_length = 0x100000; +__cy_memory_4_row_size = 1; + +/* EOF */ diff --git a/2020TPCAppNoDFU.cydsn/cy8c6xx7_cm0plus.scat b/2020TPCAppNoDFU.cydsn/cy8c6xx7_cm0plus.scat new file mode 100644 index 0000000..6c49340 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/cy8c6xx7_cm0plus.scat @@ -0,0 +1,207 @@ +#! armcc -E +; The first line specifies a preprocessor command that the linker invokes +; to pass a scatter file through a C preprocessor. + +;******************************************************************************* +;* \file cy8c6xx7_cm0plus.scat +;* \version 2.20 +;* +;* Linker file for the ARMCC. +;* +;* The main purpose of the linker script is to describe how the sections in the +;* input files should be mapped into the output file, and to control the memory +;* layout of the output file. +;* +;* \note The entry point location is fixed and starts at 0x10000000. The valid +;* application image should be placed there. +;* +;* \note The linker files included with the PDL template projects must be +;* generic and handle all common use cases. Your project may not use every +;* section defined in the linker files. In that case you may see the warnings +;* during the build process: L6314W (no section matches pattern) and/or L6329W +;* (pattern only matches removed unused sections). In your project, you can +;* suppress the warning by passing the "--diag_suppress=L6314W,L6329W" option to +;* the linker, simply comment out or remove the relevant code in the linker +;* file. +;* +;******************************************************************************* +;* \copyright +;* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +;* You may use this file only in accordance with the license, terms, conditions, +;* disclaimers, and limitations in the end user license agreement accompanying +;* the software package with which this file was provided. +;******************************************************************************/ + +; The defines below describe the location and size of blocks of memory in the target. +; Use these defines to specify the memory regions available for allocation. + +; The following defines control RAM and flash memory allocation for the CM0+ core. +; You can change the memory allocation by editing the RAM and Flash defines. +; Your changes must be aligned with the corresponding defines for the CM4 core in 'xx_cm4_dual.scat', +; where 'xx' is the device group; for example, 'cy8c6xx7_cm4_dual.scat'. +; RAM +#define RAM_START 0x08000000 +#define RAM_SIZE 0x00024000 +; Flash +#define FLASH_START 0x10000000 +#define FLASH_SIZE 0x00080000 + +; The following defines describe a 32K flash region used for EEPROM emulation. +; This region can also be used as the general purpose flash. +; You can assign sections to this memory region for only one of the cores. +; Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. +; Therefore, repurposing this memory region will prevent such middleware from operation. +#define EM_EEPROM_START 0x14000000 +#define EM_EEPROM_SIZE 0x8000 + +; The following defines describe device specific memory regions and must not be changed. +; Supervisory flash: User data +#define SFLASH_USER_DATA_START 0x16000800 +#define SFLASH_USER_DATA_SIZE 0x00000800 + +; Supervisory flash: Normal Access Restrictions (NAR) +#define SFLASH_NAR_START 0x16001A00 +#define SFLASH_NAR_SIZE 0x00000200 + +; Supervisory flash: Public Key +#define SFLASH_PUBLIC_KEY_START 0x16005A00 +#define SFLASH_PUBLIC_KEY_SIZE 0x00000C00 + +; Supervisory flash: Table of Content # 2 +#define SFLASH_TOC_2_START 0x16007C00 +#define SFLASH_TOC_2_SIZE 0x00000200 + +; Supervisory flash: Table of Content # 2 Copy +#define SFLASH_RTOC_2_START 0x16007E00 +#define SFLASH_RTOC_2_SIZE 0x00000200 + +; External memory +#define XIP_START 0x18000000 +#define XIP_SIZE 0x08000000 + +; eFuse +#define EFUSE_START 0x90700000 +#define EFUSE_SIZE 0x100000 + + +LR_FLASH FLASH_START FLASH_SIZE +{ + .cy_app_header +0 + { + * (.cy_app_header) + } + + ER_FLASH_VECTORS +0 + { + * (RESET, +FIRST) + } + + ER_FLASH_CODE +0 FIXED + { + * (InRoot$$Sections) + * (+RO) + } + + ER_RAM_VECTORS RAM_START UNINIT + { + * (RESET_RAM, +FIRST) + } + + ER_RAM_DATA +0 + { + * (.cy_ramfunc) + .ANY (+RW, +ZI) + } + + ; Place variables in the section that should not be initialized during the + ; device startup. + ER_RAM_NOINIT_DATA +0 UNINIT + { + * (.noinit) + } +} + + +; Emulated EEPROM Flash area +LR_EM_EEPROM EM_EEPROM_START EM_EEPROM_SIZE +{ + .cy_em_eeprom +0 + { + * (.cy_em_eeprom) + } +} + +; Supervisory flash: User data +LR_SFLASH_USER_DATA SFLASH_USER_DATA_START SFLASH_USER_DATA_SIZE +{ + .cy_sflash_user_data +0 + { + * (.cy_sflash_user_data) + } +} + +; Supervisory flash: Normal Access Restrictions (NAR) +LR_SFLASH_NAR SFLASH_NAR_START SFLASH_NAR_SIZE +{ + .cy_sflash_nar +0 + { + * (.cy_sflash_nar) + } +} + +; Supervisory flash: Public Key +LR_SFLASH_PUBLIC_KEY SFLASH_PUBLIC_KEY_START SFLASH_PUBLIC_KEY_SIZE +{ + .cy_sflash_public_key +0 + { + * (.cy_sflash_public_key) + } +} + +; Supervisory flash: Table of Content # 2 +LR_SFLASH_TOC_2 SFLASH_TOC_2_START SFLASH_TOC_2_SIZE +{ + .cy_toc_part2 +0 + { + * (.cy_toc_part2) + } +} + +; Supervisory flash: Table of Content # 2 Copy +LR_SFLASH_RTOC_2 SFLASH_RTOC_2_START SFLASH_RTOC_2_SIZE +{ + .cy_rtoc_part2 +0 + { + * (.cy_rtoc_part2) + } +} + + +; Places the code in the Execute in Place (XIP) section. See the smif driver documentation for details. +LR_EROM XIP_START XIP_SIZE +{ + .cy_xip +0 + { + * (.cy_xip) + } +} + + +; eFuse +LR_EFUSE EFUSE_START EFUSE_SIZE +{ + .cy_efuse +0 + { + * (.cy_efuse) + } +} + + +; The section is used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. +CYMETA 0x90500000 +{ + .cymeta +0 { * (.cymeta) } +} + + +/* [] END OF FILE */ diff --git a/2020TPCAppNoDFU.cydsn/cy8c6xx7_cm4_dual.icf b/2020TPCAppNoDFU.cydsn/cy8c6xx7_cm4_dual.icf new file mode 100644 index 0000000..0f831e7 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/cy8c6xx7_cm4_dual.icf @@ -0,0 +1,219 @@ +/***************************************************************************//** +* \file cy8c6xx7_cm4_dual.icf +* \version 2.20 +* +* Linker file for the IAR compiler. +* +* The main purpose of the linker script is to describe how the sections in the +* input files should be mapped into the output file, and to control the memory +* layout of the output file. +* +* \note The entry point is fixed and starts at 0x10000000. The valid application +* image should be placed there. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case you may see warnings during the +* build process. In your project, you can simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_4.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x00000000; + +/* The symbols below define the location and size of blocks of memory in the target. + * Use these symbols to specify the memory regions available for allocation. + */ + +/* The following symbols control RAM and flash memory allocation for the CM4 core. + * You can change the memory allocation by editing RAM and Flash symbols. + * Note that 2 KB of RAM (at the end of the RAM section) are reserved for system use. + * Using this memory region for other purposes will lead to unexpected behavior. + * Your changes must be aligned with the corresponding symbols for CM0+ core in 'xx_cm0plus.icf', + * where 'xx' is the device group; for example, 'cy8c6xx7_cm0plus.icf'. + */ +/* RAM */ +define symbol __ICFEDIT_region_IRAM1_start__ = 0x08024000; +define symbol __ICFEDIT_region_IRAM1_end__ = 0x08047800; +/* Flash */ +define symbol __ICFEDIT_region_IROM1_start__ = 0x10080000; +define symbol __ICFEDIT_region_IROM1_end__ = 0x10100000; + +/* The following symbols define a 32K flash region used for EEPROM emulation. + * This region can also be used as the general purpose flash. + * You can assign sections to this memory region for only one of the cores. + * Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. + * Therefore, repurposing this memory region will prevent such middleware from operation. + */ +define symbol __ICFEDIT_region_IROM2_start__ = 0x14000000; +define symbol __ICFEDIT_region_IROM2_end__ = 0x14007FFF; + +/* The following symbols define device specific memory regions and must not be changed. */ +/* Supervisory FLASH - User Data */ +define symbol __ICFEDIT_region_IROM3_start__ = 0x16000800; +define symbol __ICFEDIT_region_IROM3_end__ = 0x160007FF; + +/* Supervisory FLASH - Normal Access Restrictions (NAR) */ +define symbol __ICFEDIT_region_IROM4_start__ = 0x16001A00; +define symbol __ICFEDIT_region_IROM4_end__ = 0x16001BFF; + +/* Supervisory FLASH - Public Key */ +define symbol __ICFEDIT_region_IROM5_start__ = 0x16005A00; +define symbol __ICFEDIT_region_IROM5_end__ = 0x160065FF; + +/* Supervisory FLASH - Table of Content # 2 */ +define symbol __ICFEDIT_region_IROM6_start__ = 0x16007C00; +define symbol __ICFEDIT_region_IROM6_end__ = 0x16007DFF; + +/* Supervisory FLASH - Table of Content # 2 Copy */ +define symbol __ICFEDIT_region_IROM7_start__ = 0x16007E00; +define symbol __ICFEDIT_region_IROM7_end__ = 0x16007FFF; + +/* eFuse */ +define symbol __ICFEDIT_region_IROM8_start__ = 0x90700000; +define symbol __ICFEDIT_region_IROM8_end__ = 0x907FFFFF; + +/* XIP */ +define symbol __ICFEDIT_region_EROM1_start__ = 0x18000000; +define symbol __ICFEDIT_region_EROM1_end__ = 0x1FFFFFFF; + +define symbol __ICFEDIT_region_EROM2_start__ = 0x0; +define symbol __ICFEDIT_region_EROM2_end__ = 0x0; +define symbol __ICFEDIT_region_EROM3_start__ = 0x0; +define symbol __ICFEDIT_region_EROM3_end__ = 0x0; + + +define symbol __ICFEDIT_region_IRAM2_start__ = 0x0; +define symbol __ICFEDIT_region_IRAM2_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM1_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM1_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM2_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM2_end__ = 0x0; +define symbol __ICFEDIT_region_ERAM3_start__ = 0x0; +define symbol __ICFEDIT_region_ERAM3_end__ = 0x0; +/*-Sizes-*/ +if (!isdefinedsymbol(__STACK_SIZE)) { + define symbol __ICFEDIT_size_cstack__ = 0x1000; +} else { + define symbol __ICFEDIT_size_cstack__ = __STACK_SIZE; +} +define symbol __ICFEDIT_size_proc_stack__ = 0x0; +if (!isdefinedsymbol(__HEAP_SIZE)) { + define symbol __ICFEDIT_size_heap__ = 0x0400; +} else { + define symbol __ICFEDIT_size_heap__ = __HEAP_SIZE; +} +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region IROM1_region = mem:[from __ICFEDIT_region_IROM1_start__ to __ICFEDIT_region_IROM1_end__]; +define region IROM2_region = mem:[from __ICFEDIT_region_IROM2_start__ to __ICFEDIT_region_IROM2_end__]; +define region IROM3_region = mem:[from __ICFEDIT_region_IROM3_start__ to __ICFEDIT_region_IROM3_end__]; +define region IROM4_region = mem:[from __ICFEDIT_region_IROM4_start__ to __ICFEDIT_region_IROM4_end__]; +define region IROM5_region = mem:[from __ICFEDIT_region_IROM5_start__ to __ICFEDIT_region_IROM5_end__]; +define region IROM6_region = mem:[from __ICFEDIT_region_IROM6_start__ to __ICFEDIT_region_IROM6_end__]; +define region IROM7_region = mem:[from __ICFEDIT_region_IROM7_start__ to __ICFEDIT_region_IROM7_end__]; +define region IROM8_region = mem:[from __ICFEDIT_region_IROM8_start__ to __ICFEDIT_region_IROM8_end__]; +define region EROM1_region = mem:[from __ICFEDIT_region_EROM1_start__ to __ICFEDIT_region_EROM1_end__]; +define region IRAM1_region = mem:[from __ICFEDIT_region_IRAM1_start__ to __ICFEDIT_region_IRAM1_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; +define block PROC_STACK with alignment = 8, size = __ICFEDIT_size_proc_stack__ { }; +define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; +define block HSTACK {block HEAP, block PROC_STACK, last block CSTACK}; +define block RO {first section .intvec, readonly}; + +/*-Initializations-*/ +initialize by copy { readwrite }; +do not initialize { section .noinit, section .intvec_ram }; + + +/*-Placement-*/ + +/* Flash */ +place at start of IROM1_region { block RO }; +".cy_app_signature" : place at address (__ICFEDIT_region_IROM1_end__ - 0x200) { section .cy_app_signature }; + +/* Emulated EEPROM Flash area */ +".cy_em_eeprom" : place at start of IROM2_region { section .cy_em_eeprom }; + +/* Supervisory Flash - User Data */ +".cy_sflash_user_data" : place at start of IROM3_region { section .cy_sflash_user_data }; + +/* Supervisory Flash - NAR */ +".cy_sflash_nar" : place at start of IROM4_region { section .cy_sflash_nar }; + +/* Supervisory Flash - Public Key */ +".cy_sflash_public_key" : place at start of IROM5_region { section .cy_sflash_public_key }; + +/* Supervisory Flash - TOC2 */ +".cy_toc_part2" : place at start of IROM6_region { section .cy_toc_part2 }; + +/* Supervisory Flash - RTOC2 */ +".cy_rtoc_part2" : place at start of IROM7_region { section .cy_rtoc_part2 }; + +/* eFuse */ +".cy_efuse" : place at start of IROM8_region { section .cy_efuse }; + +/* Execute in Place (XIP). See the smif driver documentation for details. */ +".cy_xip" : place at start of EROM1_region { section .cy_xip }; + +/* RAM */ +place at start of IRAM1_region { readwrite section .intvec_ram}; +place in IRAM1_region { readwrite }; +place at end of IRAM1_region { block HSTACK }; + +/* These sections are used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. */ +".cymeta" : place at address mem : 0x90500000 { readonly section .cymeta }; + + +keep { section .cy_app_signature, + section .cy_em_eeprom, + section .cy_sflash_user_data, + section .cy_sflash_nar, + section .cy_sflash_public_key, + section .cy_toc_part2, + section .cy_rtoc_part2, + section .cy_efuse, + section .cy_xip, + section .cymeta, + }; + + +/* The following symbols used by the cymcuelftool. */ +/* Flash */ +define exported symbol __cy_memory_0_start = 0x10000000; +define exported symbol __cy_memory_0_length = 0x00100000; +define exported symbol __cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +define exported symbol __cy_memory_1_start = 0x14000000; +define exported symbol __cy_memory_1_length = 0x8000; +define exported symbol __cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +define exported symbol __cy_memory_2_start = 0x16000000; +define exported symbol __cy_memory_2_length = 0x8000; +define exported symbol __cy_memory_2_row_size = 0x200; + +/* XIP */ +define exported symbol __cy_memory_3_start = 0x18000000; +define exported symbol __cy_memory_3_length = 0x08000000; +define exported symbol __cy_memory_3_row_size = 0x200; + +/* eFuse */ +define exported symbol __cy_memory_4_start = 0x90700000; +define exported symbol __cy_memory_4_length = 0x100000; +define exported symbol __cy_memory_4_row_size = 1; + +/* EOF */ diff --git a/2020TPCAppNoDFU.cydsn/cy8c6xx7_cm4_dual.ld b/2020TPCAppNoDFU.cydsn/cy8c6xx7_cm4_dual.ld new file mode 100644 index 0000000..54e5e5e --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/cy8c6xx7_cm4_dual.ld @@ -0,0 +1,408 @@ +/***************************************************************************//** +* \file cy8c6xx7_cm4_dual.ld +* \version 2.20 +* +* Linker file for the GNU C compiler. +* +* The main purpose of the linker script is to describe how the sections in the +* input files should be mapped into the output file, and to control the memory +* layout of the output file. +* +* \note The entry point location is fixed and starts at 0x10000000. The valid +* application image should be placed there. +* +* \note The linker files included with the PDL template projects must be generic +* and handle all common use cases. Your project may not use every section +* defined in the linker files. In that case you may see warnings during the +* build process. In your project, you can simply comment out or remove the +* relevant code in the linker file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +OUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm") +SEARCH_DIR(.) +GROUP(-lgcc -lc -lnosys) +ENTRY(Reset_Handler) + + +/* Force symbol to be entered in the output file as an undefined symbol. Doing +* this may, for example, trigger linking of additional modules from standard +* libraries. You may list several symbols for each EXTERN, and you may use +* EXTERN multiple times. This command has the same effect as the -u command-line +* option. +*/ +EXTERN(Reset_Handler) + +/* The MEMORY section below describes the location and size of blocks of memory in the target. +* Use this section to specify the memory regions available for allocation. +*/ +MEMORY +{ + /* The ram and flash regions control RAM and flash memory allocation for the CM4 core. + * You can change the memory allocation by editing the 'ram' and 'flash' regions. + * Note that 2 KB of RAM (at the end of the RAM section) are reserved for system use. + * Using this memory region for other purposes will lead to unexpected behavior. + * Your changes must be aligned with the corresponding memory regions for CM0+ core in 'xx_cm0plus.ld', + * where 'xx' is the device group; for example, 'cy8c6xx7_cm0plus.ld'. + */ + ram (rwx) : ORIGIN = 0x08024000, LENGTH = 0x23800 + flash (rx) : ORIGIN = 0x10080000, LENGTH = 0x80000 + + /* This is a 32K flash region used for EEPROM emulation. This region can also be used as the general purpose flash. + * You can assign sections to this memory region for only one of the cores. + * Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. + * Therefore, repurposing this memory region will prevent such middleware from operation. + */ + em_eeprom (rx) : ORIGIN = 0x14004000, LENGTH = 0x4000 /* 16 KB */ + + /* The following regions define device specific memory regions and must not be changed. */ + sflash_user_data (rx) : ORIGIN = 0x16000800, LENGTH = 0x800 /* Supervisory flash: User data */ + sflash_nar (rx) : ORIGIN = 0x16001A00, LENGTH = 0x200 /* Supervisory flash: Normal Access Restrictions (NAR) */ + sflash_public_key (rx) : ORIGIN = 0x16005A00, LENGTH = 0xC00 /* Supervisory flash: Public Key */ + sflash_toc_2 (rx) : ORIGIN = 0x16007C00, LENGTH = 0x200 /* Supervisory flash: Table of Content # 2 */ + sflash_rtoc_2 (rx) : ORIGIN = 0x16007E00, LENGTH = 0x200 /* Supervisory flash: Table of Content # 2 Copy */ + xip (rx) : ORIGIN = 0x18000000, LENGTH = 0x8000000 /* 128 MB */ + efuse (r) : ORIGIN = 0x90700000, LENGTH = 0x100000 /* 1 MB */ +} + +/* Library configurations */ +GROUP(libgcc.a libc.a libm.a libnosys.a) + +/* Linker script to place sections and symbol values. Should be used together + * with other linker script that defines memory regions FLASH and RAM. + * It references following symbols, which must be defined in code: + * Reset_Handler : Entry of reset handler + * + * It defines following symbols, which code can use without definition: + * __exidx_start + * __exidx_end + * __copy_table_start__ + * __copy_table_end__ + * __zero_table_start__ + * __zero_table_end__ + * __etext + * __data_start__ + * __preinit_array_start + * __preinit_array_end + * __init_array_start + * __init_array_end + * __fini_array_start + * __fini_array_end + * __data_end__ + * __bss_start__ + * __bss_end__ + * __end__ + * end + * __HeapLimit + * __StackLimit + * __StackTop + * __stack + * __Vectors_End + * __Vectors_Size + */ + + +SECTIONS +{ + .text : + { + . = ALIGN(4); + __Vectors = . ; + KEEP(*(.vectors)) + . = ALIGN(4); + __Vectors_End = .; + __Vectors_Size = __Vectors_End - __Vectors; + __end__ = .; + + . = ALIGN(4); + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + /* Read-only code (constants). */ + *(.rodata .rodata.* .constdata .constdata.* .conststring .conststring.*) + + KEEP(*(.eh_frame*)) + } > flash + + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > flash + + __exidx_start = .; + + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > flash + __exidx_end = .; + + + /* To copy multiple ROM to RAM sections, + * uncomment .copy.table section and, + * define __STARTUP_COPY_MULTIPLE in startup_psoc6_01_cm4.S */ + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + + /* Copy interrupt vectors from flash to RAM */ + LONG (__Vectors) /* From */ + LONG (__ram_vectors_start__) /* To */ + LONG (__Vectors_End - __Vectors) /* Size */ + + /* Copy data section to RAM */ + LONG (__etext) /* From */ + LONG (__data_start__) /* To */ + LONG (__data_end__ - __data_start__) /* Size */ + + __copy_table_end__ = .; + } > flash + + + /* To clear multiple BSS sections, + * uncomment .zero.table section and, + * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_psoc6_01_cm4.S */ + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + __zero_table_end__ = .; + } > flash + + __etext = . ; + + + .ramVectors (NOLOAD) : ALIGN(8) + { + __ram_vectors_start__ = .; + KEEP(*(.ram_vectors)) + __ram_vectors_end__ = .; + } > ram + + + .data __ram_vectors_end__ : AT (__etext) + { + __data_start__ = .; + + *(vtable) + *(.data*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + + KEEP(*(.cy_ramfunc*)) + . = ALIGN(4); + + __data_end__ = .; + + } > ram + + + /* Place variables in the section that should not be initialized during the + * device startup. + */ + .noinit (NOLOAD) : ALIGN(8) + { + KEEP(*(.noinit)) + } > ram + + + /* The uninitialized global or static variables are placed in this section. + * + * The NOLOAD attribute tells linker that .bss section does not consume + * any space in the image. The NOLOAD attribute changes the .bss type to + * NOBITS, and that makes linker to A) not allocate section in memory, and + * A) put information to clear the section with all zeros during application + * loading. + * + * Without the NOLOAD attribute, the .bss section might get PROGBITS type. + * This makes linker to A) allocate zeroed section in memory, and B) copy + * this section to RAM during application loading. + */ + .bss (NOLOAD): + { + . = ALIGN(4); + __bss_start__ = .; + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + } > ram + + + .heap (NOLOAD): + { + __HeapBase = .; + __end__ = .; + end = __end__; + KEEP(*(.heap*)) + __HeapLimit = .; + } > ram + + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (NOLOAD): + { + KEEP(*(.stack*)) + } > ram + + + /* Set stack top to end of RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(ram) + LENGTH(ram); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + + /* Check if data + heap + stack exceeds RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack") + + + /* Used for the digital signature of the secure application and the Bootloader SDK application. + * The size of the section depends on the required data size. */ + .cy_app_signature ORIGIN(flash) + LENGTH(flash) - 256 : + { + KEEP(*(.cy_app_signature)) + } > flash + + + /* Emulated EEPROM Flash area */ + .cy_em_eeprom : + { + KEEP(*(.cy_em_eeprom)) + } > em_eeprom + + + /* Supervisory Flash: User data */ + .cy_sflash_user_data : + { + KEEP(*(.cy_sflash_user_data)) + } > sflash_user_data + + + /* Supervisory Flash: Normal Access Restrictions (NAR) */ + .cy_sflash_nar : + { + KEEP(*(.cy_sflash_nar)) + } > sflash_nar + + + /* Supervisory Flash: Public Key */ + .cy_sflash_public_key : + { + KEEP(*(.cy_sflash_public_key)) + } > sflash_public_key + + + /* Supervisory Flash: Table of Content # 2 */ + .cy_toc_part2 : + { + KEEP(*(.cy_toc_part2)) + } > sflash_toc_2 + + + /* Supervisory Flash: Table of Content # 2 Copy */ + .cy_rtoc_part2 : + { + KEEP(*(.cy_rtoc_part2)) + } > sflash_rtoc_2 + + + /* Places the code in the Execute in Place (XIP) section. See the smif driver + * documentation for details. + */ + .cy_xip : + { + KEEP(*(.cy_xip)) + } > xip + + + /* eFuse */ + .cy_efuse : + { + KEEP(*(.cy_efuse)) + } > efuse + + + /* These sections are used for additional metadata (silicon revision, + * Silicon/JTAG ID, etc.) storage. + */ + .cymeta 0x90500000 : { KEEP(*(.cymeta)) } :NONE +} + + +/* The following symbols used by the cymcuelftool. */ +/* Flash */ +__cy_memory_0_start = 0x10000000; +__cy_memory_0_length = 0x00100000; +__cy_memory_0_row_size = 0x200; + +/* Emulated EEPROM Flash area */ +__cy_memory_1_start = 0x14000000; +__cy_memory_1_length = 0x8000; +__cy_memory_1_row_size = 0x200; + +/* Supervisory Flash */ +__cy_memory_2_start = 0x16000000; +__cy_memory_2_length = 0x8000; +__cy_memory_2_row_size = 0x200; + +/* XIP */ +__cy_memory_3_start = 0x18000000; +__cy_memory_3_length = 0x08000000; +__cy_memory_3_row_size = 0x200; + +/* eFuse */ +__cy_memory_4_start = 0x90700000; +__cy_memory_4_length = 0x100000; +__cy_memory_4_row_size = 1; + +/* EOF */ diff --git a/2020TPCAppNoDFU.cydsn/cy8c6xx7_cm4_dual.scat b/2020TPCAppNoDFU.cydsn/cy8c6xx7_cm4_dual.scat new file mode 100644 index 0000000..d45ccea --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/cy8c6xx7_cm4_dual.scat @@ -0,0 +1,213 @@ +#! armcc -E +; The first line specifies a preprocessor command that the linker invokes +; to pass a scatter file through a C preprocessor. + +;******************************************************************************* +;* \file cy8c6xx7_cm4_dual.scat +;* \version 2.20 +;* +;* Linker file for the ARMCC. +;* +;* The main purpose of the linker script is to describe how the sections in the +;* input files should be mapped into the output file, and to control the memory +;* layout of the output file. +;* +;* \note The entry point location is fixed and starts at 0x10000000. The valid +;* application image should be placed there. +;* +;* \note The linker files included with the PDL template projects must be +;* generic and handle all common use cases. Your project may not use every +;* section defined in the linker files. In that case you may see the warnings +;* during the build process: L6314W (no section matches pattern) and/or L6329W +;* (pattern only matches removed unused sections). In your project, you can +;* suppress the warning by passing the "--diag_suppress=L6314W,L6329W" option to +;* the linker, simply comment out or remove the relevant code in the linker +;* file. +;* +;******************************************************************************* +;* \copyright +;* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +;* You may use this file only in accordance with the license, terms, conditions, +;* disclaimers, and limitations in the end user license agreement accompanying +;* the software package with which this file was provided. +;******************************************************************************/ + +; The defines below describe the location and size of blocks of memory in the target. +; Use these defines to specify the memory regions available for allocation. + +; The following defines control RAM and flash memory allocation for the CM4 core. +; You can change the memory allocation by editing RAM and Flash defines. +; Note that 2 KB of RAM (at the end of the RAM section) are reserved for system use. +; Using this memory region for other purposes will lead to unexpected behavior. +; Your changes must be aligned with the corresponding defines for CM0+ core in 'xx_cm0plus.scat', +; where 'xx' is the device group; for example, 'cy8c6xx7_cm0plus.scat'. +; RAM +#define RAM_START 0x08024000 +#define RAM_SIZE 0x00023800 +; Flash +#define FLASH_START 0x10080000 +#define FLASH_SIZE 0x00080000 + +; The following defines describe a 32K flash region used for EEPROM emulation. +; This region can also be used as the general purpose flash. +; You can assign sections to this memory region for only one of the cores. +; Note some middleware (e.g. BLE, Emulated EEPROM) can place their data into this memory region. +; Therefore, repurposing this memory region will prevent such middleware from operation. +#define EM_EEPROM_START 0x14000000 +#define EM_EEPROM_SIZE 0x8000 + +; The following defines describe device specific memory regions and must not be changed. +; Supervisory flash: User data +#define SFLASH_USER_DATA_START 0x16000800 +#define SFLASH_USER_DATA_SIZE 0x00000800 + +; Supervisory flash: Normal Access Restrictions (NAR) +#define SFLASH_NAR_START 0x16001A00 +#define SFLASH_NAR_SIZE 0x00000200 + +; Supervisory flash: Public Key +#define SFLASH_PUBLIC_KEY_START 0x16005A00 +#define SFLASH_PUBLIC_KEY_SIZE 0x00000C00 + +; Supervisory flash: Table of Content # 2 +#define SFLASH_TOC_2_START 0x16007C00 +#define SFLASH_TOC_2_SIZE 0x00000200 + +; Supervisory flash: Table of Content # 2 Copy +#define SFLASH_RTOC_2_START 0x16007E00 +#define SFLASH_RTOC_2_SIZE 0x00000200 + +; External memory +#define XIP_START 0x18000000 +#define XIP_SIZE 0x08000000 + +; eFuse +#define EFUSE_START 0x90700000 +#define EFUSE_SIZE 0x100000 + + +LR_FLASH FLASH_START FLASH_SIZE +{ + ER_FLASH_VECTORS +0 + { + * (RESET, +FIRST) + } + + ER_FLASH_CODE +0 FIXED + { + * (InRoot$$Sections) + * (+RO) + } + + ER_RAM_VECTORS RAM_START UNINIT + { + * (RESET_RAM, +FIRST) + } + + ER_RAM_DATA +0 + { + * (.cy_ramfunc) + .ANY (+RW, +ZI) + } + + ; Place variables in the section that should not be initialized during the + ; device startup. + ER_RAM_NOINIT_DATA +0 UNINIT + { + * (.noinit) + } + + + ; Used for the digital signature of the secure application and the + ; Bootloader SDK application. The size of the section depends on the required + ; data size. + .cy_app_signature (FLASH_START + FLASH_SIZE - 256) 256 + { + * (.cy_app_signature) + } +} + + +; Emulated EEPROM Flash area +LR_EM_EEPROM EM_EEPROM_START EM_EEPROM_SIZE +{ + .cy_em_eeprom +0 + { + * (.cy_em_eeprom) + } +} + +; Supervisory flash: User data +LR_SFLASH_USER_DATA SFLASH_USER_DATA_START SFLASH_USER_DATA_SIZE +{ + .cy_sflash_user_data +0 + { + * (.cy_sflash_user_data) + } +} + +; Supervisory flash: Normal Access Restrictions (NAR) +LR_SFLASH_NAR SFLASH_NAR_START SFLASH_NAR_SIZE +{ + .cy_sflash_nar +0 + { + * (.cy_sflash_nar) + } +} + +; Supervisory flash: Public Key +LR_SFLASH_PUBLIC_KEY SFLASH_PUBLIC_KEY_START SFLASH_PUBLIC_KEY_SIZE +{ + .cy_sflash_public_key +0 + { + * (.cy_sflash_public_key) + } +} + +; Supervisory flash: Table of Content # 2 +LR_SFLASH_TOC_2 SFLASH_TOC_2_START SFLASH_TOC_2_SIZE +{ + .cy_toc_part2 +0 + { + * (.cy_toc_part2) + } +} + +; Supervisory flash: Table of Content # 2 Copy +LR_SFLASH_RTOC_2 SFLASH_RTOC_2_START SFLASH_RTOC_2_SIZE +{ + .cy_rtoc_part2 +0 + { + * (.cy_rtoc_part2) + } +} + + +; Places the code in the Execute in Place (XIP) section. See the smif driver documentation for details. +LR_EROM XIP_START XIP_SIZE +{ + .cy_xip +0 + { + * (.cy_xip) + } +} + + +; eFuse +LR_EFUSE EFUSE_START EFUSE_SIZE +{ + .cy_efuse +0 + { + * (.cy_efuse) + } +} + + +; The section is used for additional metadata (silicon revision, Silicon/JTAG ID, etc.) storage. +CYMETA 0x90500000 +{ + .cymeta +0 { * (.cymeta) } +} + + +/* [] END OF FILE */ diff --git a/2020TPCAppNoDFU.cydsn/cy_ble_config.h b/2020TPCAppNoDFU.cydsn/cy_ble_config.h new file mode 100644 index 0000000..2f382ef --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/cy_ble_config.h @@ -0,0 +1,66 @@ +/***************************************************************************//** +* \file cy_ble_config.h +* \version 2.80 +* +* \brief +* The user BLE configuration file. Allows redefining the configuration #define(s) +* generated by the BLE customizer. +* +******************************************************************************** +* \copyright +* Copyright 2017-2023, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef CY_BLE_CONF_H +#define CY_BLE_CONF_H + +#include "ble/cy_ble_defines.h" + +/** + * The BLE_config.h file is generated by the BLE customizer and includes all common + * configuration defines (CY_BLE_CONFIG_***). + */ +#include "BLE_config.h" + +#include +#ifndef CY_IP_MXBLESS + #error "The BLE middleware is not supported on this device" +#endif + +/** + * The BLE Interrupt Notification Feature - Exposes BLE interrupt notifications + * to an application that indicates a different link layer and radio state + * transition to the user from the BLESS interrupt context. + * This callback is triggered at the beginning of a received BLESS interrupt + * (based on the registered interrupt mask). After this feature is enabled, + * the following APIs are available: + * Cy_BLE_RegisterInterruptCallback() and Cy_BLE_UnRegisterInterruptCallback(). + * + * The valid value: 1u - enable / 0u - disable. + * + * BLE Dual mode requires an additional define IPC channel and IPC Interrupt + * structure to send notification from the controller core to host core. + * Use the following defines: + * #define CY_BLE_INTR_NOTIFY_IPC_CHAN (9..15) + * #define CY_BLE_INTR_NOTIFY_IPC_INTR (9..15) + * #define CY_BLE_INTR_NOTIFY_IPC_INTR_PRIOR (0..7) + */ +#define CY_BLE_INTR_NOTIFY_FEATURE_ENABLE (0u) + + +/** + * To redefine the config #define(s) generated by the BLE customizer, + * use the construction #undef... #define. + * + * #undef CY_BLE_CONFIG_ENABLE_LL_PRIVACY + * #define CY_BLE_CONFIG_ENABLE_LL_PRIVACY (1u) + * + */ + + +#endif /* !defined(CY_BLE_CONF_H)*/ + +/* [] END OF FILE */ diff --git a/2020TPCAppNoDFU.cydsn/cyapicallbacks.h b/2020TPCAppNoDFU.cydsn/cyapicallbacks.h new file mode 100644 index 0000000..e919754 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/cyapicallbacks.h @@ -0,0 +1,28 @@ +/* ======================================== + * + * Copyright YOUR COMPANY, THE YEAR + * All Rights Reserved + * UNPUBLISHED, LICENSED SOFTWARE. + * + * CONFIDENTIAL AND PROPRIETARY INFORMATION + * WHICH IS THE PROPERTY OF your company. + * + * ======================================== +*/ +#ifndef CYAPICALLBACKS_H +#define CYAPICALLBACKS_H + + +#if CY_CPU_CORTEX_M0P + /*Define your Cortex-M0P macro callbacks here */ +#endif + +#if CY_CPU_CORTEX_M4 + /*Define your Cortex-M4 macro callbacks here */ +#endif + + /*For more information, refer to the Writing Code topic in the PSoC Creator Help.*/ + + +#endif /* CYAPICALLBACKS_H */ +/* [] */ diff --git a/2020TPCAppNoDFU.cydsn/gcc/startup_psoc6_01_cm0plus.S b/2020TPCAppNoDFU.cydsn/gcc/startup_psoc6_01_cm0plus.S new file mode 100644 index 0000000..e26df0a --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/gcc/startup_psoc6_01_cm0plus.S @@ -0,0 +1,404 @@ +/**************************************************************************//** + * @file startup_psoc6_01_cm0plus.S + * @brief CMSIS Core Device Startup File for + * ARMCM0plus Device Series + * @version V5.00 + * @date 02. March 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + /* Address of the NMI handler */ + #define CY_NMI_HANLDER_ADDR 0x0000000D + + /* The CPU VTOR register */ + #define CY_CPU_VTOR_ADDR 0xE000ED08 + + /* Copy flash vectors and data section to RAM */ + #define __STARTUP_COPY_MULTIPLE + + /* Clear single BSS section */ + #define __STARTUP_CLEAR_BSS + + .syntax unified + .arch armv6-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00001000 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000400 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long CY_NMI_HANLDER_ADDR /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts Description */ + .long NvicMux0_IRQHandler /* CM0+ NVIC Mux input 0 */ + .long NvicMux1_IRQHandler /* CM0+ NVIC Mux input 1 */ + .long NvicMux2_IRQHandler /* CM0+ NVIC Mux input 2 */ + .long NvicMux3_IRQHandler /* CM0+ NVIC Mux input 3 */ + .long NvicMux4_IRQHandler /* CM0+ NVIC Mux input 4 */ + .long NvicMux5_IRQHandler /* CM0+ NVIC Mux input 5 */ + .long NvicMux6_IRQHandler /* CM0+ NVIC Mux input 6 */ + .long NvicMux7_IRQHandler /* CM0+ NVIC Mux input 7 */ + .long NvicMux8_IRQHandler /* CM0+ NVIC Mux input 8 */ + .long NvicMux9_IRQHandler /* CM0+ NVIC Mux input 9 */ + .long NvicMux10_IRQHandler /* CM0+ NVIC Mux input 10 */ + .long NvicMux11_IRQHandler /* CM0+ NVIC Mux input 11 */ + .long NvicMux12_IRQHandler /* CM0+ NVIC Mux input 12 */ + .long NvicMux13_IRQHandler /* CM0+ NVIC Mux input 13 */ + .long NvicMux14_IRQHandler /* CM0+ NVIC Mux input 14 */ + .long NvicMux15_IRQHandler /* CM0+ NVIC Mux input 15 */ + .long NvicMux16_IRQHandler /* CM0+ NVIC Mux input 16 */ + .long NvicMux17_IRQHandler /* CM0+ NVIC Mux input 17 */ + .long NvicMux18_IRQHandler /* CM0+ NVIC Mux input 18 */ + .long NvicMux19_IRQHandler /* CM0+ NVIC Mux input 19 */ + .long NvicMux20_IRQHandler /* CM0+ NVIC Mux input 20 */ + .long NvicMux21_IRQHandler /* CM0+ NVIC Mux input 21 */ + .long NvicMux22_IRQHandler /* CM0+ NVIC Mux input 22 */ + .long NvicMux23_IRQHandler /* CM0+ NVIC Mux input 23 */ + .long NvicMux24_IRQHandler /* CM0+ NVIC Mux input 24 */ + .long NvicMux25_IRQHandler /* CM0+ NVIC Mux input 25 */ + .long NvicMux26_IRQHandler /* CM0+ NVIC Mux input 26 */ + .long NvicMux27_IRQHandler /* CM0+ NVIC Mux input 27 */ + .long NvicMux28_IRQHandler /* CM0+ NVIC Mux input 28 */ + .long NvicMux29_IRQHandler /* CM0+ NVIC Mux input 29 */ + .long NvicMux30_IRQHandler /* CM0+ NVIC Mux input 30 */ + .long NvicMux31_IRQHandler /* CM0+ NVIC Mux input 31 */ + + .size __Vectors, . - __Vectors + .equ __VectorsSize, . - __Vectors + + .section .ram_vectors + .align 2 + .globl __ramVectors +__ramVectors: + .space __VectorsSize + .size __ramVectors, . - __ramVectors + + + .text + .thumb + .thumb_func + .align 2 + + /* + * Device startup customization + * + * Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) + * because this function is executed as the first instruction in the ResetHandler. + * The PDL is also not initialized to use the proper register offsets. + * The user of this function is responsible for initializing the PDL and resources before using them. + */ + .weak Cy_OnResetUser + .func Cy_OnResetUser, Cy_OnResetUser + .type Cy_OnResetUser, %function + +Cy_OnResetUser: + bx lr + .size Cy_OnResetUser, . - Cy_OnResetUser + .endfunc + + /* Reset handler */ + .weak Reset_Handler + .type Reset_Handler, %function + +Reset_Handler: + bl Cy_OnResetUser + cpsid i + +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + blt .L_loop0_0_done + ldr r0, [r1, r3] + str r0, [r2, r3] + b .L_loop0_0 + +.L_loop0_0_done: + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + + subs r3, r2 + ble .L_loop1_done + +.L_loop1: + subs r3, #4 + ldr r0, [r1,r3] + str r0, [r2,r3] + bgt .L_loop1 + +.L_loop1_done: +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise define macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + blt .L_loop2_0_done + str r0, [r1, r2] + b .L_loop2_0 +.L_loop2_0_done: + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 + + subs r2, r1 + ble .L_loop3_done + +.L_loop3: + subs r2, #4 + str r0, [r1, r2] + bgt .L_loop3 +.L_loop3_done: +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + + /* Update Vector Table Offset Register. */ + ldr r0, =__ramVectors + ldr r1, =CY_CPU_VTOR_ADDR + str r0, [r1] + dsb 0xF + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + + bl main + + /* Should never get here */ + b . + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + .weak Cy_SysLib_FaultHandler + .type Cy_SysLib_FaultHandler, %function + +Cy_SysLib_FaultHandler: + b . + .size Cy_SysLib_FaultHandler, . - Cy_SysLib_FaultHandler + .type Fault_Handler, %function + +Fault_Handler: + /* Storing LR content for Creator call stack trace */ + push {LR} + movs r0, #4 + mov r1, LR + tst r0, r1 + beq .L_MSP + mrs r0, PSP + b .L_API_call +.L_MSP: + mrs r0, MSP +.L_API_call: + /* Compensation of stack pointer address due to pushing 4 bytes of LR */ + adds r0, r0, #4 + bl Cy_SysLib_FaultHandler + b . + .size Fault_Handler, . - Fault_Handler + +.macro def_fault_Handler fault_handler_name + .weak \fault_handler_name + .set \fault_handler_name, Fault_Handler + .endm + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + + def_fault_Handler HardFault_Handler + + def_irq_handler SVC_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler NvicMux0_IRQHandler /* CM0+ NVIC Mux input 0 */ + def_irq_handler NvicMux1_IRQHandler /* CM0+ NVIC Mux input 1 */ + def_irq_handler NvicMux2_IRQHandler /* CM0+ NVIC Mux input 2 */ + def_irq_handler NvicMux3_IRQHandler /* CM0+ NVIC Mux input 3 */ + def_irq_handler NvicMux4_IRQHandler /* CM0+ NVIC Mux input 4 */ + def_irq_handler NvicMux5_IRQHandler /* CM0+ NVIC Mux input 5 */ + def_irq_handler NvicMux6_IRQHandler /* CM0+ NVIC Mux input 6 */ + def_irq_handler NvicMux7_IRQHandler /* CM0+ NVIC Mux input 7 */ + def_irq_handler NvicMux8_IRQHandler /* CM0+ NVIC Mux input 8 */ + def_irq_handler NvicMux9_IRQHandler /* CM0+ NVIC Mux input 9 */ + def_irq_handler NvicMux10_IRQHandler /* CM0+ NVIC Mux input 10 */ + def_irq_handler NvicMux11_IRQHandler /* CM0+ NVIC Mux input 11 */ + def_irq_handler NvicMux12_IRQHandler /* CM0+ NVIC Mux input 12 */ + def_irq_handler NvicMux13_IRQHandler /* CM0+ NVIC Mux input 13 */ + def_irq_handler NvicMux14_IRQHandler /* CM0+ NVIC Mux input 14 */ + def_irq_handler NvicMux15_IRQHandler /* CM0+ NVIC Mux input 15 */ + def_irq_handler NvicMux16_IRQHandler /* CM0+ NVIC Mux input 16 */ + def_irq_handler NvicMux17_IRQHandler /* CM0+ NVIC Mux input 17 */ + def_irq_handler NvicMux18_IRQHandler /* CM0+ NVIC Mux input 18 */ + def_irq_handler NvicMux19_IRQHandler /* CM0+ NVIC Mux input 19 */ + def_irq_handler NvicMux20_IRQHandler /* CM0+ NVIC Mux input 20 */ + def_irq_handler NvicMux21_IRQHandler /* CM0+ NVIC Mux input 21 */ + def_irq_handler NvicMux22_IRQHandler /* CM0+ NVIC Mux input 22 */ + def_irq_handler NvicMux23_IRQHandler /* CM0+ NVIC Mux input 23 */ + def_irq_handler NvicMux24_IRQHandler /* CM0+ NVIC Mux input 24 */ + def_irq_handler NvicMux25_IRQHandler /* CM0+ NVIC Mux input 25 */ + def_irq_handler NvicMux26_IRQHandler /* CM0+ NVIC Mux input 26 */ + def_irq_handler NvicMux27_IRQHandler /* CM0+ NVIC Mux input 27 */ + def_irq_handler NvicMux28_IRQHandler /* CM0+ NVIC Mux input 28 */ + def_irq_handler NvicMux29_IRQHandler /* CM0+ NVIC Mux input 29 */ + def_irq_handler NvicMux30_IRQHandler /* CM0+ NVIC Mux input 30 */ + def_irq_handler NvicMux31_IRQHandler /* CM0+ NVIC Mux input 31 */ + + .end + + +/* [] END OF FILE */ diff --git a/2020TPCAppNoDFU.cydsn/gcc/startup_psoc6_01_cm4.S b/2020TPCAppNoDFU.cydsn/gcc/startup_psoc6_01_cm4.S new file mode 100644 index 0000000..b904621 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/gcc/startup_psoc6_01_cm4.S @@ -0,0 +1,635 @@ +/**************************************************************************//** + * @file startup_psoc6_01_cm4.S + * @brief CMSIS Core Device Startup File for + * ARMCM4 Device Series + * @version V5.00 + * @date 02. March 2016 + ******************************************************************************/ +/* + * Copyright (c) 2009-2016 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + + /* Address of the NMI handler */ + #define CY_NMI_HANLDER_ADDR 0x0000000D + + /* The CPU VTOR register */ + #define CY_CPU_VTOR_ADDR 0xE000ED08 + + /* Copy flash vectors and data section to RAM */ + #define __STARTUP_COPY_MULTIPLE + + /* Clear single BSS section */ + #define __STARTUP_CLEAR_BSS + + .syntax unified + .arch armv7-m + + .section .stack + .align 3 +#ifdef __STACK_SIZE + .equ Stack_Size, __STACK_SIZE +#else + .equ Stack_Size, 0x00001000 +#endif + .globl __StackTop + .globl __StackLimit +__StackLimit: + .space Stack_Size + .size __StackLimit, . - __StackLimit +__StackTop: + .size __StackTop, . - __StackTop + + .section .heap + .align 3 +#ifdef __HEAP_SIZE + .equ Heap_Size, __HEAP_SIZE +#else + .equ Heap_Size, 0x00000400 +#endif + .globl __HeapBase + .globl __HeapLimit +__HeapBase: + .if Heap_Size + .space Heap_Size + .endif + .size __HeapBase, . - __HeapBase +__HeapLimit: + .size __HeapLimit, . - __HeapLimit + + .section .vectors + .align 2 + .globl __Vectors +__Vectors: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long CY_NMI_HANLDER_ADDR /* NMI Handler */ + .long HardFault_Handler /* Hard Fault Handler */ + .long MemManage_Handler /* MPU Fault Handler */ + .long BusFault_Handler /* Bus Fault Handler */ + .long UsageFault_Handler /* Usage Fault Handler */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long 0 /* Reserved */ + .long SVC_Handler /* SVCall Handler */ + .long DebugMon_Handler /* Debug Monitor Handler */ + .long 0 /* Reserved */ + .long PendSV_Handler /* PendSV Handler */ + .long SysTick_Handler /* SysTick Handler */ + + /* External interrupts Description */ + .long ioss_interrupts_gpio_0_IRQHandler /* GPIO Port Interrupt #0 */ + .long ioss_interrupts_gpio_1_IRQHandler /* GPIO Port Interrupt #1 */ + .long ioss_interrupts_gpio_2_IRQHandler /* GPIO Port Interrupt #2 */ + .long ioss_interrupts_gpio_3_IRQHandler /* GPIO Port Interrupt #3 */ + .long ioss_interrupts_gpio_4_IRQHandler /* GPIO Port Interrupt #4 */ + .long ioss_interrupts_gpio_5_IRQHandler /* GPIO Port Interrupt #5 */ + .long ioss_interrupts_gpio_6_IRQHandler /* GPIO Port Interrupt #6 */ + .long ioss_interrupts_gpio_7_IRQHandler /* GPIO Port Interrupt #7 */ + .long ioss_interrupts_gpio_8_IRQHandler /* GPIO Port Interrupt #8 */ + .long ioss_interrupts_gpio_9_IRQHandler /* GPIO Port Interrupt #9 */ + .long ioss_interrupts_gpio_10_IRQHandler /* GPIO Port Interrupt #10 */ + .long ioss_interrupts_gpio_11_IRQHandler /* GPIO Port Interrupt #11 */ + .long ioss_interrupts_gpio_12_IRQHandler /* GPIO Port Interrupt #12 */ + .long ioss_interrupts_gpio_13_IRQHandler /* GPIO Port Interrupt #13 */ + .long ioss_interrupts_gpio_14_IRQHandler /* GPIO Port Interrupt #14 */ + .long ioss_interrupt_gpio_IRQHandler /* GPIO All Ports */ + .long ioss_interrupt_vdd_IRQHandler /* GPIO Supply Detect Interrupt */ + .long lpcomp_interrupt_IRQHandler /* Low Power Comparator Interrupt */ + .long scb_8_interrupt_IRQHandler /* Serial Communication Block #8 (DeepSleep capable) */ + .long srss_interrupt_mcwdt_0_IRQHandler /* Multi Counter Watchdog Timer interrupt */ + .long srss_interrupt_mcwdt_1_IRQHandler /* Multi Counter Watchdog Timer interrupt */ + .long srss_interrupt_backup_IRQHandler /* Backup domain interrupt */ + .long srss_interrupt_IRQHandler /* Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) */ + .long pass_interrupt_ctbs_IRQHandler /* CTBm Interrupt (all CTBms) */ + .long bless_interrupt_IRQHandler /* Bluetooth Radio interrupt */ + .long cpuss_interrupts_ipc_0_IRQHandler /* CPUSS Inter Process Communication Interrupt #0 */ + .long cpuss_interrupts_ipc_1_IRQHandler /* CPUSS Inter Process Communication Interrupt #1 */ + .long cpuss_interrupts_ipc_2_IRQHandler /* CPUSS Inter Process Communication Interrupt #2 */ + .long cpuss_interrupts_ipc_3_IRQHandler /* CPUSS Inter Process Communication Interrupt #3 */ + .long cpuss_interrupts_ipc_4_IRQHandler /* CPUSS Inter Process Communication Interrupt #4 */ + .long cpuss_interrupts_ipc_5_IRQHandler /* CPUSS Inter Process Communication Interrupt #5 */ + .long cpuss_interrupts_ipc_6_IRQHandler /* CPUSS Inter Process Communication Interrupt #6 */ + .long cpuss_interrupts_ipc_7_IRQHandler /* CPUSS Inter Process Communication Interrupt #7 */ + .long cpuss_interrupts_ipc_8_IRQHandler /* CPUSS Inter Process Communication Interrupt #8 */ + .long cpuss_interrupts_ipc_9_IRQHandler /* CPUSS Inter Process Communication Interrupt #9 */ + .long cpuss_interrupts_ipc_10_IRQHandler /* CPUSS Inter Process Communication Interrupt #10 */ + .long cpuss_interrupts_ipc_11_IRQHandler /* CPUSS Inter Process Communication Interrupt #11 */ + .long cpuss_interrupts_ipc_12_IRQHandler /* CPUSS Inter Process Communication Interrupt #12 */ + .long cpuss_interrupts_ipc_13_IRQHandler /* CPUSS Inter Process Communication Interrupt #13 */ + .long cpuss_interrupts_ipc_14_IRQHandler /* CPUSS Inter Process Communication Interrupt #14 */ + .long cpuss_interrupts_ipc_15_IRQHandler /* CPUSS Inter Process Communication Interrupt #15 */ + .long scb_0_interrupt_IRQHandler /* Serial Communication Block #0 */ + .long scb_1_interrupt_IRQHandler /* Serial Communication Block #1 */ + .long scb_2_interrupt_IRQHandler /* Serial Communication Block #2 */ + .long scb_3_interrupt_IRQHandler /* Serial Communication Block #3 */ + .long scb_4_interrupt_IRQHandler /* Serial Communication Block #4 */ + .long scb_5_interrupt_IRQHandler /* Serial Communication Block #5 */ + .long scb_6_interrupt_IRQHandler /* Serial Communication Block #6 */ + .long scb_7_interrupt_IRQHandler /* Serial Communication Block #7 */ + .long csd_interrupt_IRQHandler /* CSD (Capsense) interrupt */ + .long cpuss_interrupts_dw0_0_IRQHandler /* CPUSS DataWire #0, Channel #0 */ + .long cpuss_interrupts_dw0_1_IRQHandler /* CPUSS DataWire #0, Channel #1 */ + .long cpuss_interrupts_dw0_2_IRQHandler /* CPUSS DataWire #0, Channel #2 */ + .long cpuss_interrupts_dw0_3_IRQHandler /* CPUSS DataWire #0, Channel #3 */ + .long cpuss_interrupts_dw0_4_IRQHandler /* CPUSS DataWire #0, Channel #4 */ + .long cpuss_interrupts_dw0_5_IRQHandler /* CPUSS DataWire #0, Channel #5 */ + .long cpuss_interrupts_dw0_6_IRQHandler /* CPUSS DataWire #0, Channel #6 */ + .long cpuss_interrupts_dw0_7_IRQHandler /* CPUSS DataWire #0, Channel #7 */ + .long cpuss_interrupts_dw0_8_IRQHandler /* CPUSS DataWire #0, Channel #8 */ + .long cpuss_interrupts_dw0_9_IRQHandler /* CPUSS DataWire #0, Channel #9 */ + .long cpuss_interrupts_dw0_10_IRQHandler /* CPUSS DataWire #0, Channel #10 */ + .long cpuss_interrupts_dw0_11_IRQHandler /* CPUSS DataWire #0, Channel #11 */ + .long cpuss_interrupts_dw0_12_IRQHandler /* CPUSS DataWire #0, Channel #12 */ + .long cpuss_interrupts_dw0_13_IRQHandler /* CPUSS DataWire #0, Channel #13 */ + .long cpuss_interrupts_dw0_14_IRQHandler /* CPUSS DataWire #0, Channel #14 */ + .long cpuss_interrupts_dw0_15_IRQHandler /* CPUSS DataWire #0, Channel #15 */ + .long cpuss_interrupts_dw1_0_IRQHandler /* CPUSS DataWire #1, Channel #0 */ + .long cpuss_interrupts_dw1_1_IRQHandler /* CPUSS DataWire #1, Channel #1 */ + .long cpuss_interrupts_dw1_2_IRQHandler /* CPUSS DataWire #1, Channel #2 */ + .long cpuss_interrupts_dw1_3_IRQHandler /* CPUSS DataWire #1, Channel #3 */ + .long cpuss_interrupts_dw1_4_IRQHandler /* CPUSS DataWire #1, Channel #4 */ + .long cpuss_interrupts_dw1_5_IRQHandler /* CPUSS DataWire #1, Channel #5 */ + .long cpuss_interrupts_dw1_6_IRQHandler /* CPUSS DataWire #1, Channel #6 */ + .long cpuss_interrupts_dw1_7_IRQHandler /* CPUSS DataWire #1, Channel #7 */ + .long cpuss_interrupts_dw1_8_IRQHandler /* CPUSS DataWire #1, Channel #8 */ + .long cpuss_interrupts_dw1_9_IRQHandler /* CPUSS DataWire #1, Channel #9 */ + .long cpuss_interrupts_dw1_10_IRQHandler /* CPUSS DataWire #1, Channel #10 */ + .long cpuss_interrupts_dw1_11_IRQHandler /* CPUSS DataWire #1, Channel #11 */ + .long cpuss_interrupts_dw1_12_IRQHandler /* CPUSS DataWire #1, Channel #12 */ + .long cpuss_interrupts_dw1_13_IRQHandler /* CPUSS DataWire #1, Channel #13 */ + .long cpuss_interrupts_dw1_14_IRQHandler /* CPUSS DataWire #1, Channel #14 */ + .long cpuss_interrupts_dw1_15_IRQHandler /* CPUSS DataWire #1, Channel #15 */ + .long cpuss_interrupts_fault_0_IRQHandler /* CPUSS Fault Structure Interrupt #0 */ + .long cpuss_interrupts_fault_1_IRQHandler /* CPUSS Fault Structure Interrupt #1 */ + .long cpuss_interrupt_crypto_IRQHandler /* CRYPTO Accelerator Interrupt */ + .long cpuss_interrupt_fm_IRQHandler /* FLASH Macro Interrupt */ + .long cpuss_interrupts_cm0_cti_0_IRQHandler /* CM0+ CTI #0 */ + .long cpuss_interrupts_cm0_cti_1_IRQHandler /* CM0+ CTI #1 */ + .long cpuss_interrupts_cm4_cti_0_IRQHandler /* CM4 CTI #0 */ + .long cpuss_interrupts_cm4_cti_1_IRQHandler /* CM4 CTI #1 */ + .long tcpwm_0_interrupts_0_IRQHandler /* TCPWM #0, Counter #0 */ + .long tcpwm_0_interrupts_1_IRQHandler /* TCPWM #0, Counter #1 */ + .long tcpwm_0_interrupts_2_IRQHandler /* TCPWM #0, Counter #2 */ + .long tcpwm_0_interrupts_3_IRQHandler /* TCPWM #0, Counter #3 */ + .long tcpwm_0_interrupts_4_IRQHandler /* TCPWM #0, Counter #4 */ + .long tcpwm_0_interrupts_5_IRQHandler /* TCPWM #0, Counter #5 */ + .long tcpwm_0_interrupts_6_IRQHandler /* TCPWM #0, Counter #6 */ + .long tcpwm_0_interrupts_7_IRQHandler /* TCPWM #0, Counter #7 */ + .long tcpwm_1_interrupts_0_IRQHandler /* TCPWM #1, Counter #0 */ + .long tcpwm_1_interrupts_1_IRQHandler /* TCPWM #1, Counter #1 */ + .long tcpwm_1_interrupts_2_IRQHandler /* TCPWM #1, Counter #2 */ + .long tcpwm_1_interrupts_3_IRQHandler /* TCPWM #1, Counter #3 */ + .long tcpwm_1_interrupts_4_IRQHandler /* TCPWM #1, Counter #4 */ + .long tcpwm_1_interrupts_5_IRQHandler /* TCPWM #1, Counter #5 */ + .long tcpwm_1_interrupts_6_IRQHandler /* TCPWM #1, Counter #6 */ + .long tcpwm_1_interrupts_7_IRQHandler /* TCPWM #1, Counter #7 */ + .long tcpwm_1_interrupts_8_IRQHandler /* TCPWM #1, Counter #8 */ + .long tcpwm_1_interrupts_9_IRQHandler /* TCPWM #1, Counter #9 */ + .long tcpwm_1_interrupts_10_IRQHandler /* TCPWM #1, Counter #10 */ + .long tcpwm_1_interrupts_11_IRQHandler /* TCPWM #1, Counter #11 */ + .long tcpwm_1_interrupts_12_IRQHandler /* TCPWM #1, Counter #12 */ + .long tcpwm_1_interrupts_13_IRQHandler /* TCPWM #1, Counter #13 */ + .long tcpwm_1_interrupts_14_IRQHandler /* TCPWM #1, Counter #14 */ + .long tcpwm_1_interrupts_15_IRQHandler /* TCPWM #1, Counter #15 */ + .long tcpwm_1_interrupts_16_IRQHandler /* TCPWM #1, Counter #16 */ + .long tcpwm_1_interrupts_17_IRQHandler /* TCPWM #1, Counter #17 */ + .long tcpwm_1_interrupts_18_IRQHandler /* TCPWM #1, Counter #18 */ + .long tcpwm_1_interrupts_19_IRQHandler /* TCPWM #1, Counter #19 */ + .long tcpwm_1_interrupts_20_IRQHandler /* TCPWM #1, Counter #20 */ + .long tcpwm_1_interrupts_21_IRQHandler /* TCPWM #1, Counter #21 */ + .long tcpwm_1_interrupts_22_IRQHandler /* TCPWM #1, Counter #22 */ + .long tcpwm_1_interrupts_23_IRQHandler /* TCPWM #1, Counter #23 */ + .long udb_interrupts_0_IRQHandler /* UDB Interrupt #0 */ + .long udb_interrupts_1_IRQHandler /* UDB Interrupt #1 */ + .long udb_interrupts_2_IRQHandler /* UDB Interrupt #2 */ + .long udb_interrupts_3_IRQHandler /* UDB Interrupt #3 */ + .long udb_interrupts_4_IRQHandler /* UDB Interrupt #4 */ + .long udb_interrupts_5_IRQHandler /* UDB Interrupt #5 */ + .long udb_interrupts_6_IRQHandler /* UDB Interrupt #6 */ + .long udb_interrupts_7_IRQHandler /* UDB Interrupt #7 */ + .long udb_interrupts_8_IRQHandler /* UDB Interrupt #8 */ + .long udb_interrupts_9_IRQHandler /* UDB Interrupt #9 */ + .long udb_interrupts_10_IRQHandler /* UDB Interrupt #10 */ + .long udb_interrupts_11_IRQHandler /* UDB Interrupt #11 */ + .long udb_interrupts_12_IRQHandler /* UDB Interrupt #12 */ + .long udb_interrupts_13_IRQHandler /* UDB Interrupt #13 */ + .long udb_interrupts_14_IRQHandler /* UDB Interrupt #14 */ + .long udb_interrupts_15_IRQHandler /* UDB Interrupt #15 */ + .long pass_interrupt_sar_IRQHandler /* SAR ADC interrupt */ + .long audioss_interrupt_i2s_IRQHandler /* I2S Audio interrupt */ + .long audioss_interrupt_pdm_IRQHandler /* PDM/PCM Audio interrupt */ + .long profile_interrupt_IRQHandler /* Energy Profiler interrupt */ + .long smif_interrupt_IRQHandler /* Serial Memory Interface interrupt */ + .long usb_interrupt_hi_IRQHandler /* USB Interrupt */ + .long usb_interrupt_med_IRQHandler /* USB Interrupt */ + .long usb_interrupt_lo_IRQHandler /* USB Interrupt */ + .long pass_interrupt_dacs_IRQHandler /* Consolidated interrrupt for all DACs */ + + + .size __Vectors, . - __Vectors + .equ __VectorsSize, . - __Vectors + + .section .ram_vectors + .align 2 + .globl __ramVectors +__ramVectors: + .space __VectorsSize + .size __ramVectors, . - __ramVectors + + + .text + .thumb + .thumb_func + .align 2 + + /* + * Device startup customization + * + * Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) + * because this function is executed as the first instruction in the ResetHandler. + * The PDL is also not initialized to use the proper register offsets. + * The user of this function is responsible for initializing the PDL and resources before using them. + */ + .weak Cy_OnResetUser + .func Cy_OnResetUser, Cy_OnResetUser + .type Cy_OnResetUser, %function + +Cy_OnResetUser: + bx lr + .size Cy_OnResetUser, . - Cy_OnResetUser + .endfunc + + /* Reset handler */ + .weak Reset_Handler + .type Reset_Handler, %function + +Reset_Handler: + bl Cy_OnResetUser + cpsid i + +/* Firstly it copies data from read only memory to RAM. There are two schemes + * to copy. One can copy more than one sections. Another can only copy + * one section. The former scheme needs more instructions and read-only + * data to implement than the latter. + * Macro __STARTUP_COPY_MULTIPLE is used to choose between two schemes. */ + +#ifdef __STARTUP_COPY_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of triplets, each of which specify: + * offset 0: LMA of start of a section to copy from + * offset 4: VMA of start of a section to copy to + * offset 8: size of the section to copy. Must be multiply of 4 + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r4, =__copy_table_start__ + ldr r5, =__copy_table_end__ + +.L_loop0: + cmp r4, r5 + bge .L_loop0_done + ldr r1, [r4] + ldr r2, [r4, #4] + ldr r3, [r4, #8] + +.L_loop0_0: + subs r3, #4 + ittt ge + ldrge r0, [r1, r3] + strge r0, [r2, r3] + bge .L_loop0_0 + + adds r4, #12 + b .L_loop0 + +.L_loop0_done: +#else +/* Single section scheme. + * + * The ranges of copy from/to are specified by following symbols + * __etext: LMA of start of the section to copy from. Usually end of text + * __data_start__: VMA of start of the section to copy to + * __data_end__: VMA of end of the section to copy to + * + * All addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__etext + ldr r2, =__data_start__ + ldr r3, =__data_end__ + +.L_loop1: + cmp r2, r3 + ittt lt + ldrlt r0, [r1], #4 + strlt r0, [r2], #4 + blt .L_loop1 +#endif /*__STARTUP_COPY_MULTIPLE */ + +/* This part of work usually is done in C library startup code. Otherwise, + * define this macro to enable it in this startup. + * + * There are two schemes too. One can clear multiple BSS sections. Another + * can only clear one section. The former is more size expensive than the + * latter. + * + * Define macro __STARTUP_CLEAR_BSS_MULTIPLE to choose the former. + * Otherwise define macro __STARTUP_CLEAR_BSS to choose the later. + */ +#ifdef __STARTUP_CLEAR_BSS_MULTIPLE +/* Multiple sections scheme. + * + * Between symbol address __copy_table_start__ and __copy_table_end__, + * there are array of tuples specifying: + * offset 0: Start of a BSS section + * offset 4: Size of this BSS section. Must be multiply of 4 + */ + ldr r3, =__zero_table_start__ + ldr r4, =__zero_table_end__ + +.L_loop2: + cmp r3, r4 + bge .L_loop2_done + ldr r1, [r3] + ldr r2, [r3, #4] + movs r0, 0 + +.L_loop2_0: + subs r2, #4 + itt ge + strge r0, [r1, r2] + bge .L_loop2_0 + + adds r3, #8 + b .L_loop2 +.L_loop2_done: +#elif defined (__STARTUP_CLEAR_BSS) +/* Single BSS section scheme. + * + * The BSS section is specified by following symbols + * __bss_start__: start of the BSS section. + * __bss_end__: end of the BSS section. + * + * Both addresses must be aligned to 4 bytes boundary. + */ + ldr r1, =__bss_start__ + ldr r2, =__bss_end__ + + movs r0, 0 +.L_loop3: + cmp r1, r2 + itt lt + strlt r0, [r1], #4 + blt .L_loop3 +#endif /* __STARTUP_CLEAR_BSS_MULTIPLE || __STARTUP_CLEAR_BSS */ + + /* Update Vector Table Offset Register. */ + ldr r0, =__ramVectors + ldr r1, =CY_CPU_VTOR_ADDR + str r0, [r1] + dsb 0xF + + /* Enable the FPU if used */ + bl Cy_SystemInitFpuEnable + +#ifndef __NO_SYSTEM_INIT + bl SystemInit +#endif + + bl main + + /* Should never get here */ + b . + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak Default_Handler + .type Default_Handler, %function + +Default_Handler: + b . + .size Default_Handler, . - Default_Handler + + + .weak Cy_SysLib_FaultHandler + .type Cy_SysLib_FaultHandler, %function + +Cy_SysLib_FaultHandler: + b . + .size Cy_SysLib_FaultHandler, . - Cy_SysLib_FaultHandler + .type Fault_Handler, %function + +Fault_Handler: + /* Storing LR content for Creator call stack trace */ + push {LR} + movs r0, #4 + mov r1, LR + tst r0, r1 + beq .L_MSP + mrs r0, PSP + b .L_API_call +.L_MSP: + mrs r0, MSP +.L_API_call: + /* Compensation of stack pointer address due to pushing 4 bytes of LR */ + adds r0, r0, #4 + bl Cy_SysLib_FaultHandler + b . + .size Fault_Handler, . - Fault_Handler + +.macro def_fault_Handler fault_handler_name + .weak \fault_handler_name + .set \fault_handler_name, Fault_Handler + .endm + +/* Macro to define default handlers. Default handler + * will be weak symbol and just dead loops. They can be + * overwritten by other handlers */ + .macro def_irq_handler handler_name + .weak \handler_name + .set \handler_name, Default_Handler + .endm + + def_irq_handler NMI_Handler + + def_fault_Handler HardFault_Handler + def_fault_Handler MemManage_Handler + def_fault_Handler BusFault_Handler + def_fault_Handler UsageFault_Handler + + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + + def_irq_handler ioss_interrupts_gpio_0_IRQHandler /* GPIO Port Interrupt #0 */ + def_irq_handler ioss_interrupts_gpio_1_IRQHandler /* GPIO Port Interrupt #1 */ + def_irq_handler ioss_interrupts_gpio_2_IRQHandler /* GPIO Port Interrupt #2 */ + def_irq_handler ioss_interrupts_gpio_3_IRQHandler /* GPIO Port Interrupt #3 */ + def_irq_handler ioss_interrupts_gpio_4_IRQHandler /* GPIO Port Interrupt #4 */ + def_irq_handler ioss_interrupts_gpio_5_IRQHandler /* GPIO Port Interrupt #5 */ + def_irq_handler ioss_interrupts_gpio_6_IRQHandler /* GPIO Port Interrupt #6 */ + def_irq_handler ioss_interrupts_gpio_7_IRQHandler /* GPIO Port Interrupt #7 */ + def_irq_handler ioss_interrupts_gpio_8_IRQHandler /* GPIO Port Interrupt #8 */ + def_irq_handler ioss_interrupts_gpio_9_IRQHandler /* GPIO Port Interrupt #9 */ + def_irq_handler ioss_interrupts_gpio_10_IRQHandler /* GPIO Port Interrupt #10 */ + def_irq_handler ioss_interrupts_gpio_11_IRQHandler /* GPIO Port Interrupt #11 */ + def_irq_handler ioss_interrupts_gpio_12_IRQHandler /* GPIO Port Interrupt #12 */ + def_irq_handler ioss_interrupts_gpio_13_IRQHandler /* GPIO Port Interrupt #13 */ + def_irq_handler ioss_interrupts_gpio_14_IRQHandler /* GPIO Port Interrupt #14 */ + def_irq_handler ioss_interrupt_gpio_IRQHandler /* GPIO All Ports */ + def_irq_handler ioss_interrupt_vdd_IRQHandler /* GPIO Supply Detect Interrupt */ + def_irq_handler lpcomp_interrupt_IRQHandler /* Low Power Comparator Interrupt */ + def_irq_handler scb_8_interrupt_IRQHandler /* Serial Communication Block #8 (DeepSleep capable) */ + def_irq_handler srss_interrupt_mcwdt_0_IRQHandler /* Multi Counter Watchdog Timer interrupt */ + def_irq_handler srss_interrupt_mcwdt_1_IRQHandler /* Multi Counter Watchdog Timer interrupt */ + def_irq_handler srss_interrupt_backup_IRQHandler /* Backup domain interrupt */ + def_irq_handler srss_interrupt_IRQHandler /* Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) */ + def_irq_handler pass_interrupt_ctbs_IRQHandler /* CTBm Interrupt (all CTBms) */ + def_irq_handler bless_interrupt_IRQHandler /* Bluetooth Radio interrupt */ + def_irq_handler cpuss_interrupts_ipc_0_IRQHandler /* CPUSS Inter Process Communication Interrupt #0 */ + def_irq_handler cpuss_interrupts_ipc_1_IRQHandler /* CPUSS Inter Process Communication Interrupt #1 */ + def_irq_handler cpuss_interrupts_ipc_2_IRQHandler /* CPUSS Inter Process Communication Interrupt #2 */ + def_irq_handler cpuss_interrupts_ipc_3_IRQHandler /* CPUSS Inter Process Communication Interrupt #3 */ + def_irq_handler cpuss_interrupts_ipc_4_IRQHandler /* CPUSS Inter Process Communication Interrupt #4 */ + def_irq_handler cpuss_interrupts_ipc_5_IRQHandler /* CPUSS Inter Process Communication Interrupt #5 */ + def_irq_handler cpuss_interrupts_ipc_6_IRQHandler /* CPUSS Inter Process Communication Interrupt #6 */ + def_irq_handler cpuss_interrupts_ipc_7_IRQHandler /* CPUSS Inter Process Communication Interrupt #7 */ + def_irq_handler cpuss_interrupts_ipc_8_IRQHandler /* CPUSS Inter Process Communication Interrupt #8 */ + def_irq_handler cpuss_interrupts_ipc_9_IRQHandler /* CPUSS Inter Process Communication Interrupt #9 */ + def_irq_handler cpuss_interrupts_ipc_10_IRQHandler /* CPUSS Inter Process Communication Interrupt #10 */ + def_irq_handler cpuss_interrupts_ipc_11_IRQHandler /* CPUSS Inter Process Communication Interrupt #11 */ + def_irq_handler cpuss_interrupts_ipc_12_IRQHandler /* CPUSS Inter Process Communication Interrupt #12 */ + def_irq_handler cpuss_interrupts_ipc_13_IRQHandler /* CPUSS Inter Process Communication Interrupt #13 */ + def_irq_handler cpuss_interrupts_ipc_14_IRQHandler /* CPUSS Inter Process Communication Interrupt #14 */ + def_irq_handler cpuss_interrupts_ipc_15_IRQHandler /* CPUSS Inter Process Communication Interrupt #15 */ + def_irq_handler scb_0_interrupt_IRQHandler /* Serial Communication Block #0 */ + def_irq_handler scb_1_interrupt_IRQHandler /* Serial Communication Block #1 */ + def_irq_handler scb_2_interrupt_IRQHandler /* Serial Communication Block #2 */ + def_irq_handler scb_3_interrupt_IRQHandler /* Serial Communication Block #3 */ + def_irq_handler scb_4_interrupt_IRQHandler /* Serial Communication Block #4 */ + def_irq_handler scb_5_interrupt_IRQHandler /* Serial Communication Block #5 */ + def_irq_handler scb_6_interrupt_IRQHandler /* Serial Communication Block #6 */ + def_irq_handler scb_7_interrupt_IRQHandler /* Serial Communication Block #7 */ + def_irq_handler csd_interrupt_IRQHandler /* CSD (Capsense) interrupt */ + def_irq_handler cpuss_interrupts_dw0_0_IRQHandler /* CPUSS DataWire #0, Channel #0 */ + def_irq_handler cpuss_interrupts_dw0_1_IRQHandler /* CPUSS DataWire #0, Channel #1 */ + def_irq_handler cpuss_interrupts_dw0_2_IRQHandler /* CPUSS DataWire #0, Channel #2 */ + def_irq_handler cpuss_interrupts_dw0_3_IRQHandler /* CPUSS DataWire #0, Channel #3 */ + def_irq_handler cpuss_interrupts_dw0_4_IRQHandler /* CPUSS DataWire #0, Channel #4 */ + def_irq_handler cpuss_interrupts_dw0_5_IRQHandler /* CPUSS DataWire #0, Channel #5 */ + def_irq_handler cpuss_interrupts_dw0_6_IRQHandler /* CPUSS DataWire #0, Channel #6 */ + def_irq_handler cpuss_interrupts_dw0_7_IRQHandler /* CPUSS DataWire #0, Channel #7 */ + def_irq_handler cpuss_interrupts_dw0_8_IRQHandler /* CPUSS DataWire #0, Channel #8 */ + def_irq_handler cpuss_interrupts_dw0_9_IRQHandler /* CPUSS DataWire #0, Channel #9 */ + def_irq_handler cpuss_interrupts_dw0_10_IRQHandler /* CPUSS DataWire #0, Channel #10 */ + def_irq_handler cpuss_interrupts_dw0_11_IRQHandler /* CPUSS DataWire #0, Channel #11 */ + def_irq_handler cpuss_interrupts_dw0_12_IRQHandler /* CPUSS DataWire #0, Channel #12 */ + def_irq_handler cpuss_interrupts_dw0_13_IRQHandler /* CPUSS DataWire #0, Channel #13 */ + def_irq_handler cpuss_interrupts_dw0_14_IRQHandler /* CPUSS DataWire #0, Channel #14 */ + def_irq_handler cpuss_interrupts_dw0_15_IRQHandler /* CPUSS DataWire #0, Channel #15 */ + def_irq_handler cpuss_interrupts_dw1_0_IRQHandler /* CPUSS DataWire #1, Channel #0 */ + def_irq_handler cpuss_interrupts_dw1_1_IRQHandler /* CPUSS DataWire #1, Channel #1 */ + def_irq_handler cpuss_interrupts_dw1_2_IRQHandler /* CPUSS DataWire #1, Channel #2 */ + def_irq_handler cpuss_interrupts_dw1_3_IRQHandler /* CPUSS DataWire #1, Channel #3 */ + def_irq_handler cpuss_interrupts_dw1_4_IRQHandler /* CPUSS DataWire #1, Channel #4 */ + def_irq_handler cpuss_interrupts_dw1_5_IRQHandler /* CPUSS DataWire #1, Channel #5 */ + def_irq_handler cpuss_interrupts_dw1_6_IRQHandler /* CPUSS DataWire #1, Channel #6 */ + def_irq_handler cpuss_interrupts_dw1_7_IRQHandler /* CPUSS DataWire #1, Channel #7 */ + def_irq_handler cpuss_interrupts_dw1_8_IRQHandler /* CPUSS DataWire #1, Channel #8 */ + def_irq_handler cpuss_interrupts_dw1_9_IRQHandler /* CPUSS DataWire #1, Channel #9 */ + def_irq_handler cpuss_interrupts_dw1_10_IRQHandler /* CPUSS DataWire #1, Channel #10 */ + def_irq_handler cpuss_interrupts_dw1_11_IRQHandler /* CPUSS DataWire #1, Channel #11 */ + def_irq_handler cpuss_interrupts_dw1_12_IRQHandler /* CPUSS DataWire #1, Channel #12 */ + def_irq_handler cpuss_interrupts_dw1_13_IRQHandler /* CPUSS DataWire #1, Channel #13 */ + def_irq_handler cpuss_interrupts_dw1_14_IRQHandler /* CPUSS DataWire #1, Channel #14 */ + def_irq_handler cpuss_interrupts_dw1_15_IRQHandler /* CPUSS DataWire #1, Channel #15 */ + def_irq_handler cpuss_interrupts_fault_0_IRQHandler /* CPUSS Fault Structure Interrupt #0 */ + def_irq_handler cpuss_interrupts_fault_1_IRQHandler /* CPUSS Fault Structure Interrupt #1 */ + def_irq_handler cpuss_interrupt_crypto_IRQHandler /* CRYPTO Accelerator Interrupt */ + def_irq_handler cpuss_interrupt_fm_IRQHandler /* FLASH Macro Interrupt */ + def_irq_handler cpuss_interrupts_cm0_cti_0_IRQHandler /* CM0+ CTI #0 */ + def_irq_handler cpuss_interrupts_cm0_cti_1_IRQHandler /* CM0+ CTI #1 */ + def_irq_handler cpuss_interrupts_cm4_cti_0_IRQHandler /* CM4 CTI #0 */ + def_irq_handler cpuss_interrupts_cm4_cti_1_IRQHandler /* CM4 CTI #1 */ + def_irq_handler tcpwm_0_interrupts_0_IRQHandler /* TCPWM #0, Counter #0 */ + def_irq_handler tcpwm_0_interrupts_1_IRQHandler /* TCPWM #0, Counter #1 */ + def_irq_handler tcpwm_0_interrupts_2_IRQHandler /* TCPWM #0, Counter #2 */ + def_irq_handler tcpwm_0_interrupts_3_IRQHandler /* TCPWM #0, Counter #3 */ + def_irq_handler tcpwm_0_interrupts_4_IRQHandler /* TCPWM #0, Counter #4 */ + def_irq_handler tcpwm_0_interrupts_5_IRQHandler /* TCPWM #0, Counter #5 */ + def_irq_handler tcpwm_0_interrupts_6_IRQHandler /* TCPWM #0, Counter #6 */ + def_irq_handler tcpwm_0_interrupts_7_IRQHandler /* TCPWM #0, Counter #7 */ + def_irq_handler tcpwm_1_interrupts_0_IRQHandler /* TCPWM #1, Counter #0 */ + def_irq_handler tcpwm_1_interrupts_1_IRQHandler /* TCPWM #1, Counter #1 */ + def_irq_handler tcpwm_1_interrupts_2_IRQHandler /* TCPWM #1, Counter #2 */ + def_irq_handler tcpwm_1_interrupts_3_IRQHandler /* TCPWM #1, Counter #3 */ + def_irq_handler tcpwm_1_interrupts_4_IRQHandler /* TCPWM #1, Counter #4 */ + def_irq_handler tcpwm_1_interrupts_5_IRQHandler /* TCPWM #1, Counter #5 */ + def_irq_handler tcpwm_1_interrupts_6_IRQHandler /* TCPWM #1, Counter #6 */ + def_irq_handler tcpwm_1_interrupts_7_IRQHandler /* TCPWM #1, Counter #7 */ + def_irq_handler tcpwm_1_interrupts_8_IRQHandler /* TCPWM #1, Counter #8 */ + def_irq_handler tcpwm_1_interrupts_9_IRQHandler /* TCPWM #1, Counter #9 */ + def_irq_handler tcpwm_1_interrupts_10_IRQHandler /* TCPWM #1, Counter #10 */ + def_irq_handler tcpwm_1_interrupts_11_IRQHandler /* TCPWM #1, Counter #11 */ + def_irq_handler tcpwm_1_interrupts_12_IRQHandler /* TCPWM #1, Counter #12 */ + def_irq_handler tcpwm_1_interrupts_13_IRQHandler /* TCPWM #1, Counter #13 */ + def_irq_handler tcpwm_1_interrupts_14_IRQHandler /* TCPWM #1, Counter #14 */ + def_irq_handler tcpwm_1_interrupts_15_IRQHandler /* TCPWM #1, Counter #15 */ + def_irq_handler tcpwm_1_interrupts_16_IRQHandler /* TCPWM #1, Counter #16 */ + def_irq_handler tcpwm_1_interrupts_17_IRQHandler /* TCPWM #1, Counter #17 */ + def_irq_handler tcpwm_1_interrupts_18_IRQHandler /* TCPWM #1, Counter #18 */ + def_irq_handler tcpwm_1_interrupts_19_IRQHandler /* TCPWM #1, Counter #19 */ + def_irq_handler tcpwm_1_interrupts_20_IRQHandler /* TCPWM #1, Counter #20 */ + def_irq_handler tcpwm_1_interrupts_21_IRQHandler /* TCPWM #1, Counter #21 */ + def_irq_handler tcpwm_1_interrupts_22_IRQHandler /* TCPWM #1, Counter #22 */ + def_irq_handler tcpwm_1_interrupts_23_IRQHandler /* TCPWM #1, Counter #23 */ + def_irq_handler udb_interrupts_0_IRQHandler /* UDB Interrupt #0 */ + def_irq_handler udb_interrupts_1_IRQHandler /* UDB Interrupt #1 */ + def_irq_handler udb_interrupts_2_IRQHandler /* UDB Interrupt #2 */ + def_irq_handler udb_interrupts_3_IRQHandler /* UDB Interrupt #3 */ + def_irq_handler udb_interrupts_4_IRQHandler /* UDB Interrupt #4 */ + def_irq_handler udb_interrupts_5_IRQHandler /* UDB Interrupt #5 */ + def_irq_handler udb_interrupts_6_IRQHandler /* UDB Interrupt #6 */ + def_irq_handler udb_interrupts_7_IRQHandler /* UDB Interrupt #7 */ + def_irq_handler udb_interrupts_8_IRQHandler /* UDB Interrupt #8 */ + def_irq_handler udb_interrupts_9_IRQHandler /* UDB Interrupt #9 */ + def_irq_handler udb_interrupts_10_IRQHandler /* UDB Interrupt #10 */ + def_irq_handler udb_interrupts_11_IRQHandler /* UDB Interrupt #11 */ + def_irq_handler udb_interrupts_12_IRQHandler /* UDB Interrupt #12 */ + def_irq_handler udb_interrupts_13_IRQHandler /* UDB Interrupt #13 */ + def_irq_handler udb_interrupts_14_IRQHandler /* UDB Interrupt #14 */ + def_irq_handler udb_interrupts_15_IRQHandler /* UDB Interrupt #15 */ + def_irq_handler pass_interrupt_sar_IRQHandler /* SAR ADC interrupt */ + def_irq_handler audioss_interrupt_i2s_IRQHandler /* I2S Audio interrupt */ + def_irq_handler audioss_interrupt_pdm_IRQHandler /* PDM/PCM Audio interrupt */ + def_irq_handler profile_interrupt_IRQHandler /* Energy Profiler interrupt */ + def_irq_handler smif_interrupt_IRQHandler /* Serial Memory Interface interrupt */ + def_irq_handler usb_interrupt_hi_IRQHandler /* USB Interrupt */ + def_irq_handler usb_interrupt_med_IRQHandler /* USB Interrupt */ + def_irq_handler usb_interrupt_lo_IRQHandler /* USB Interrupt */ + def_irq_handler pass_interrupt_dacs_IRQHandler /* Consolidated interrrupt for all DACs */ + + .end + + +/* [] END OF FILE */ diff --git a/2020TPCAppNoDFU.cydsn/iar/startup_psoc6_01_cm0plus.s b/2020TPCAppNoDFU.cydsn/iar/startup_psoc6_01_cm0plus.s new file mode 100644 index 0000000..a867384 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/iar/startup_psoc6_01_cm0plus.s @@ -0,0 +1,423 @@ +;/**************************************************************************//** +; * @file startup_psoc6_01_cm0plus.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0plus Device Series +; * @version V5.00 +; * @date 08. March 2016 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2016 ARM Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * Licensed under the Apache License, Version 2.0 (the License); you may +; * not use this file except in compliance with the License. +; * You may obtain a copy of the License at +; * +; * www.apache.org/licenses/LICENSE-2.0 +; * +; * 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. +; */ + +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + SECTION .intvec_ram:DATA:NOROOT(2) + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + EXTERN __iar_data_init3 + PUBLIC __vector_table + PUBLIC __vector_table_0x1c + PUBLIC __Vectors + PUBLIC __Vectors_End + PUBLIC __Vectors_Size + PUBLIC __ramVectors + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler + + DCD 0x0000000D ; NMI_Handler is defined in ROM code + DCD HardFault_Handler + DCD 0 + DCD 0 + DCD 0 +__vector_table_0x1c + DCD 0 + DCD 0 + DCD 0 + DCD 0 + DCD SVC_Handler + DCD 0 + DCD 0 + DCD PendSV_Handler + DCD SysTick_Handler + + ; External interrupts Power Mode Description + DCD NvicMux0_IRQHandler ; CM0+ NVIC Mux input 0 + DCD NvicMux1_IRQHandler ; CM0+ NVIC Mux input 1 + DCD NvicMux2_IRQHandler ; CM0+ NVIC Mux input 2 + DCD NvicMux3_IRQHandler ; CM0+ NVIC Mux input 3 + DCD NvicMux4_IRQHandler ; CM0+ NVIC Mux input 4 + DCD NvicMux5_IRQHandler ; CM0+ NVIC Mux input 5 + DCD NvicMux6_IRQHandler ; CM0+ NVIC Mux input 6 + DCD NvicMux7_IRQHandler ; CM0+ NVIC Mux input 7 + DCD NvicMux8_IRQHandler ; CM0+ NVIC Mux input 8 + DCD NvicMux9_IRQHandler ; CM0+ NVIC Mux input 9 + DCD NvicMux10_IRQHandler ; CM0+ NVIC Mux input 10 + DCD NvicMux11_IRQHandler ; CM0+ NVIC Mux input 11 + DCD NvicMux12_IRQHandler ; CM0+ NVIC Mux input 12 + DCD NvicMux13_IRQHandler ; CM0+ NVIC Mux input 13 + DCD NvicMux14_IRQHandler ; CM0+ NVIC Mux input 14 + DCD NvicMux15_IRQHandler ; CM0+ NVIC Mux input 15 + DCD NvicMux16_IRQHandler ; CM0+ NVIC Mux input 16 + DCD NvicMux17_IRQHandler ; CM0+ NVIC Mux input 17 + DCD NvicMux18_IRQHandler ; CM0+ NVIC Mux input 18 + DCD NvicMux19_IRQHandler ; CM0+ NVIC Mux input 19 + DCD NvicMux20_IRQHandler ; CM0+ NVIC Mux input 20 + DCD NvicMux21_IRQHandler ; CM0+ NVIC Mux input 21 + DCD NvicMux22_IRQHandler ; CM0+ NVIC Mux input 22 + DCD NvicMux23_IRQHandler ; CM0+ NVIC Mux input 23 + DCD NvicMux24_IRQHandler ; CM0+ NVIC Mux input 24 + DCD NvicMux25_IRQHandler ; CM0+ NVIC Mux input 25 + DCD NvicMux26_IRQHandler ; CM0+ NVIC Mux input 26 + DCD NvicMux27_IRQHandler ; CM0+ NVIC Mux input 27 + DCD NvicMux28_IRQHandler ; CM0+ NVIC Mux input 28 + DCD NvicMux29_IRQHandler ; CM0+ NVIC Mux input 29 + DCD NvicMux30_IRQHandler ; CM0+ NVIC Mux input 30 + DCD NvicMux31_IRQHandler ; CM0+ NVIC Mux input 31 + +__Vectors_End + +__Vectors EQU __vector_table +__Vectors_Size EQU __Vectors_End - __Vectors + + SECTION .intvec_ram:DATA:REORDER:NOROOT(2) +__ramVectors + DS32 __Vectors_Size + + + THUMB + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default handlers +;; + PUBWEAK Default_Handler + SECTION .text:CODE:REORDER:NOROOT(2) +Default_Handler + B Default_Handler + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Weak function for startup customization +;; +;; Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) +;; because this function is executed as the first instruction in the ResetHandler. +;; The PDL is also not initialized to use the proper register offsets. +;; The user of this function is responsible for initializing the PDL and resources before using them. +;; + PUBWEAK Cy_OnResetUser + SECTION .text:CODE:REORDER:NOROOT(2) +Cy_OnResetUser + BX LR + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Define strong version to return zero for +;; __iar_program_start to skip data sections +;; initialization. +;; + PUBLIC __low_level_init + SECTION .text:CODE:REORDER:NOROOT(2) +__low_level_init + MOVS R0, #0 + BX LR + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER:NOROOT(2) +Reset_Handler + + ; Define strong function for startup customization + LDR R0, =Cy_OnResetUser + BLX R0 + + ; Disable global interrupts + CPSID I + + ; Copy vectors from ROM to RAM + LDR r1, =__vector_table + LDR r0, =__ramVectors + LDR r2, =__Vectors_Size +intvec_copy + LDR r3, [r1] + STR r3, [r0] + ADDS r0, r0, #4 + ADDS r1, r1, #4 + SUBS r2, r2, #1 + CMP r2, #0 + BNE intvec_copy + + ; Update Vector Table Offset Register + LDR r0, =__ramVectors + LDR r1, =0xE000ED08 + STR r0, [r1] + dsb + + ; Initialize data sections + LDR R0, =__iar_data_init3 + BLX R0 + + LDR R0, =SystemInit + BLX R0 + + LDR R0, =__iar_program_start + BLX R0 + +; Should never get here +Cy_Main_Exited + B Cy_Main_Exited + + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +NMI_Handler + B NMI_Handler + + + PUBWEAK Cy_SysLib_FaultHandler + SECTION .text:CODE:REORDER:NOROOT(1) +Cy_SysLib_FaultHandler + B Cy_SysLib_FaultHandler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +HardFault_Handler + IMPORT Cy_SysLib_FaultHandler + movs r0, #4 + mov r1, LR + tst r0, r1 + beq L_MSP + mrs r0, PSP + b L_API_call +L_MSP + mrs r0, MSP +L_API_call + ; Storing LR content for Creator call stack trace + push {LR} + bl Cy_SysLib_FaultHandler + + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SVC_Handler + B SVC_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SysTick_Handler + B SysTick_Handler + + + ; External interrupts + PUBWEAK NvicMux0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux0_IRQHandler + B NvicMux0_IRQHandler + + PUBWEAK NvicMux1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux1_IRQHandler + B NvicMux1_IRQHandler + + PUBWEAK NvicMux2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux2_IRQHandler + B NvicMux2_IRQHandler + + PUBWEAK NvicMux3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux3_IRQHandler + B NvicMux3_IRQHandler + + PUBWEAK NvicMux4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux4_IRQHandler + B NvicMux4_IRQHandler + + PUBWEAK NvicMux5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux5_IRQHandler + B NvicMux5_IRQHandler + + PUBWEAK NvicMux6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux6_IRQHandler + B NvicMux6_IRQHandler + + PUBWEAK NvicMux7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux7_IRQHandler + B NvicMux7_IRQHandler + + PUBWEAK NvicMux8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux8_IRQHandler + B NvicMux8_IRQHandler + + PUBWEAK NvicMux9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux9_IRQHandler + B NvicMux9_IRQHandler + + PUBWEAK NvicMux10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux10_IRQHandler + B NvicMux10_IRQHandler + + PUBWEAK NvicMux11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux11_IRQHandler + B NvicMux11_IRQHandler + + PUBWEAK NvicMux12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux12_IRQHandler + B NvicMux12_IRQHandler + + PUBWEAK NvicMux13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux13_IRQHandler + B NvicMux13_IRQHandler + + PUBWEAK NvicMux14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux14_IRQHandler + B NvicMux14_IRQHandler + + PUBWEAK NvicMux15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux15_IRQHandler + B NvicMux15_IRQHandler + + PUBWEAK NvicMux16_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux16_IRQHandler + B NvicMux16_IRQHandler + + PUBWEAK NvicMux17_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux17_IRQHandler + B NvicMux17_IRQHandler + + PUBWEAK NvicMux18_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux18_IRQHandler + B NvicMux18_IRQHandler + + PUBWEAK NvicMux19_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux19_IRQHandler + B NvicMux19_IRQHandler + + PUBWEAK NvicMux20_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux20_IRQHandler + B NvicMux20_IRQHandler + + PUBWEAK NvicMux21_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux21_IRQHandler + B NvicMux21_IRQHandler + + PUBWEAK NvicMux22_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux22_IRQHandler + B NvicMux22_IRQHandler + + PUBWEAK NvicMux23_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux23_IRQHandler + B NvicMux23_IRQHandler + + PUBWEAK NvicMux24_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux24_IRQHandler + B NvicMux24_IRQHandler + + PUBWEAK NvicMux25_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux25_IRQHandler + B NvicMux25_IRQHandler + + PUBWEAK NvicMux26_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux26_IRQHandler + B NvicMux26_IRQHandler + + PUBWEAK NvicMux27_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux27_IRQHandler + B NvicMux27_IRQHandler + + PUBWEAK NvicMux28_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux28_IRQHandler + B NvicMux28_IRQHandler + + PUBWEAK NvicMux29_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux29_IRQHandler + B NvicMux29_IRQHandler + + PUBWEAK NvicMux30_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux30_IRQHandler + B NvicMux30_IRQHandler + + PUBWEAK NvicMux31_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +NvicMux31_IRQHandler + B NvicMux31_IRQHandler + + + END + + +; [] END OF FILE diff --git a/2020TPCAppNoDFU.cydsn/iar/startup_psoc6_01_cm4.s b/2020TPCAppNoDFU.cydsn/iar/startup_psoc6_01_cm4.s new file mode 100644 index 0000000..6f1e869 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/iar/startup_psoc6_01_cm4.s @@ -0,0 +1,1142 @@ +;/**************************************************************************//** +; * @file startup_psoc6_01_cm4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device Series +; * @version V5.00 +; * @date 08. March 2016 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2016 ARM Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * Licensed under the Apache License, Version 2.0 (the License); you may +; * not use this file except in compliance with the License. +; * You may obtain a copy of the License at +; * +; * www.apache.org/licenses/LICENSE-2.0 +; * +; * 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. +; */ + +; +; The modules in this file are included in the libraries, and may be replaced +; by any user-defined modules that define the PUBLIC symbol _program_start or +; a user defined start symbol. +; To override the cstartup defined in the library, simply add your modified +; version to the workbench project. +; +; The vector table is normally located at address 0. +; When debugging in RAM, it can be located in RAM, aligned to at least 2^6. +; The name "__vector_table" has special meaning for C-SPY: +; it is where the SP start value is found, and the NVIC vector +; table register (VTOR) is initialized to this address if != 0. +; +; Cortex-M version +; + + MODULE ?cstartup + + ;; Forward declaration of sections. + SECTION CSTACK:DATA:NOROOT(3) + SECTION .intvec_ram:DATA:NOROOT(2) + SECTION .intvec:CODE:NOROOT(2) + + EXTERN __iar_program_start + EXTERN SystemInit + EXTERN Cy_SystemInitFpuEnable + EXTERN __iar_data_init3 + PUBLIC __vector_table + PUBLIC __vector_table_0x1c + PUBLIC __Vectors + PUBLIC __Vectors_End + PUBLIC __Vectors_Size + PUBLIC __ramVectors + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler + + DCD 0x0000000D ; NMI_Handler is defined in ROM code + DCD HardFault_Handler + DCD MemManage_Handler + DCD BusFault_Handler + DCD UsageFault_Handler +__vector_table_0x1c + DCD 0 + DCD 0 + DCD 0 + DCD 0 + DCD SVC_Handler + DCD DebugMon_Handler + DCD 0 + DCD PendSV_Handler + DCD SysTick_Handler + + + ; External interrupts Description + DCD ioss_interrupts_gpio_0_IRQHandler ; GPIO Port Interrupt #0 + DCD ioss_interrupts_gpio_1_IRQHandler ; GPIO Port Interrupt #1 + DCD ioss_interrupts_gpio_2_IRQHandler ; GPIO Port Interrupt #2 + DCD ioss_interrupts_gpio_3_IRQHandler ; GPIO Port Interrupt #3 + DCD ioss_interrupts_gpio_4_IRQHandler ; GPIO Port Interrupt #4 + DCD ioss_interrupts_gpio_5_IRQHandler ; GPIO Port Interrupt #5 + DCD ioss_interrupts_gpio_6_IRQHandler ; GPIO Port Interrupt #6 + DCD ioss_interrupts_gpio_7_IRQHandler ; GPIO Port Interrupt #7 + DCD ioss_interrupts_gpio_8_IRQHandler ; GPIO Port Interrupt #8 + DCD ioss_interrupts_gpio_9_IRQHandler ; GPIO Port Interrupt #9 + DCD ioss_interrupts_gpio_10_IRQHandler ; GPIO Port Interrupt #10 + DCD ioss_interrupts_gpio_11_IRQHandler ; GPIO Port Interrupt #11 + DCD ioss_interrupts_gpio_12_IRQHandler ; GPIO Port Interrupt #12 + DCD ioss_interrupts_gpio_13_IRQHandler ; GPIO Port Interrupt #13 + DCD ioss_interrupts_gpio_14_IRQHandler ; GPIO Port Interrupt #14 + DCD ioss_interrupt_gpio_IRQHandler ; GPIO All Ports + DCD ioss_interrupt_vdd_IRQHandler ; GPIO Supply Detect Interrupt + DCD lpcomp_interrupt_IRQHandler ; Low Power Comparator Interrupt + DCD scb_8_interrupt_IRQHandler ; Serial Communication Block #8 (DeepSleep capable) + DCD srss_interrupt_mcwdt_0_IRQHandler ; Multi Counter Watchdog Timer interrupt + DCD srss_interrupt_mcwdt_1_IRQHandler ; Multi Counter Watchdog Timer interrupt + DCD srss_interrupt_backup_IRQHandler ; Backup domain interrupt + DCD srss_interrupt_IRQHandler ; Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) + DCD pass_interrupt_ctbs_IRQHandler ; CTBm Interrupt (all CTBms) + DCD bless_interrupt_IRQHandler ; Bluetooth Radio interrupt + DCD cpuss_interrupts_ipc_0_IRQHandler ; CPUSS Inter Process Communication Interrupt #0 + DCD cpuss_interrupts_ipc_1_IRQHandler ; CPUSS Inter Process Communication Interrupt #1 + DCD cpuss_interrupts_ipc_2_IRQHandler ; CPUSS Inter Process Communication Interrupt #2 + DCD cpuss_interrupts_ipc_3_IRQHandler ; CPUSS Inter Process Communication Interrupt #3 + DCD cpuss_interrupts_ipc_4_IRQHandler ; CPUSS Inter Process Communication Interrupt #4 + DCD cpuss_interrupts_ipc_5_IRQHandler ; CPUSS Inter Process Communication Interrupt #5 + DCD cpuss_interrupts_ipc_6_IRQHandler ; CPUSS Inter Process Communication Interrupt #6 + DCD cpuss_interrupts_ipc_7_IRQHandler ; CPUSS Inter Process Communication Interrupt #7 + DCD cpuss_interrupts_ipc_8_IRQHandler ; CPUSS Inter Process Communication Interrupt #8 + DCD cpuss_interrupts_ipc_9_IRQHandler ; CPUSS Inter Process Communication Interrupt #9 + DCD cpuss_interrupts_ipc_10_IRQHandler ; CPUSS Inter Process Communication Interrupt #10 + DCD cpuss_interrupts_ipc_11_IRQHandler ; CPUSS Inter Process Communication Interrupt #11 + DCD cpuss_interrupts_ipc_12_IRQHandler ; CPUSS Inter Process Communication Interrupt #12 + DCD cpuss_interrupts_ipc_13_IRQHandler ; CPUSS Inter Process Communication Interrupt #13 + DCD cpuss_interrupts_ipc_14_IRQHandler ; CPUSS Inter Process Communication Interrupt #14 + DCD cpuss_interrupts_ipc_15_IRQHandler ; CPUSS Inter Process Communication Interrupt #15 + DCD scb_0_interrupt_IRQHandler ; Serial Communication Block #0 + DCD scb_1_interrupt_IRQHandler ; Serial Communication Block #1 + DCD scb_2_interrupt_IRQHandler ; Serial Communication Block #2 + DCD scb_3_interrupt_IRQHandler ; Serial Communication Block #3 + DCD scb_4_interrupt_IRQHandler ; Serial Communication Block #4 + DCD scb_5_interrupt_IRQHandler ; Serial Communication Block #5 + DCD scb_6_interrupt_IRQHandler ; Serial Communication Block #6 + DCD scb_7_interrupt_IRQHandler ; Serial Communication Block #7 + DCD csd_interrupt_IRQHandler ; CSD (Capsense) interrupt + DCD cpuss_interrupts_dw0_0_IRQHandler ; CPUSS DataWire #0, Channel #0 + DCD cpuss_interrupts_dw0_1_IRQHandler ; CPUSS DataWire #0, Channel #1 + DCD cpuss_interrupts_dw0_2_IRQHandler ; CPUSS DataWire #0, Channel #2 + DCD cpuss_interrupts_dw0_3_IRQHandler ; CPUSS DataWire #0, Channel #3 + DCD cpuss_interrupts_dw0_4_IRQHandler ; CPUSS DataWire #0, Channel #4 + DCD cpuss_interrupts_dw0_5_IRQHandler ; CPUSS DataWire #0, Channel #5 + DCD cpuss_interrupts_dw0_6_IRQHandler ; CPUSS DataWire #0, Channel #6 + DCD cpuss_interrupts_dw0_7_IRQHandler ; CPUSS DataWire #0, Channel #7 + DCD cpuss_interrupts_dw0_8_IRQHandler ; CPUSS DataWire #0, Channel #8 + DCD cpuss_interrupts_dw0_9_IRQHandler ; CPUSS DataWire #0, Channel #9 + DCD cpuss_interrupts_dw0_10_IRQHandler ; CPUSS DataWire #0, Channel #10 + DCD cpuss_interrupts_dw0_11_IRQHandler ; CPUSS DataWire #0, Channel #11 + DCD cpuss_interrupts_dw0_12_IRQHandler ; CPUSS DataWire #0, Channel #12 + DCD cpuss_interrupts_dw0_13_IRQHandler ; CPUSS DataWire #0, Channel #13 + DCD cpuss_interrupts_dw0_14_IRQHandler ; CPUSS DataWire #0, Channel #14 + DCD cpuss_interrupts_dw0_15_IRQHandler ; CPUSS DataWire #0, Channel #15 + DCD cpuss_interrupts_dw1_0_IRQHandler ; CPUSS DataWire #1, Channel #0 + DCD cpuss_interrupts_dw1_1_IRQHandler ; CPUSS DataWire #1, Channel #1 + DCD cpuss_interrupts_dw1_2_IRQHandler ; CPUSS DataWire #1, Channel #2 + DCD cpuss_interrupts_dw1_3_IRQHandler ; CPUSS DataWire #1, Channel #3 + DCD cpuss_interrupts_dw1_4_IRQHandler ; CPUSS DataWire #1, Channel #4 + DCD cpuss_interrupts_dw1_5_IRQHandler ; CPUSS DataWire #1, Channel #5 + DCD cpuss_interrupts_dw1_6_IRQHandler ; CPUSS DataWire #1, Channel #6 + DCD cpuss_interrupts_dw1_7_IRQHandler ; CPUSS DataWire #1, Channel #7 + DCD cpuss_interrupts_dw1_8_IRQHandler ; CPUSS DataWire #1, Channel #8 + DCD cpuss_interrupts_dw1_9_IRQHandler ; CPUSS DataWire #1, Channel #9 + DCD cpuss_interrupts_dw1_10_IRQHandler ; CPUSS DataWire #1, Channel #10 + DCD cpuss_interrupts_dw1_11_IRQHandler ; CPUSS DataWire #1, Channel #11 + DCD cpuss_interrupts_dw1_12_IRQHandler ; CPUSS DataWire #1, Channel #12 + DCD cpuss_interrupts_dw1_13_IRQHandler ; CPUSS DataWire #1, Channel #13 + DCD cpuss_interrupts_dw1_14_IRQHandler ; CPUSS DataWire #1, Channel #14 + DCD cpuss_interrupts_dw1_15_IRQHandler ; CPUSS DataWire #1, Channel #15 + DCD cpuss_interrupts_fault_0_IRQHandler ; CPUSS Fault Structure Interrupt #0 + DCD cpuss_interrupts_fault_1_IRQHandler ; CPUSS Fault Structure Interrupt #1 + DCD cpuss_interrupt_crypto_IRQHandler ; CRYPTO Accelerator Interrupt + DCD cpuss_interrupt_fm_IRQHandler ; FLASH Macro Interrupt + DCD cpuss_interrupts_cm0_cti_0_IRQHandler ; CM0+ CTI #0 + DCD cpuss_interrupts_cm0_cti_1_IRQHandler ; CM0+ CTI #1 + DCD cpuss_interrupts_cm4_cti_0_IRQHandler ; CM4 CTI #0 + DCD cpuss_interrupts_cm4_cti_1_IRQHandler ; CM4 CTI #1 + DCD tcpwm_0_interrupts_0_IRQHandler ; TCPWM #0, Counter #0 + DCD tcpwm_0_interrupts_1_IRQHandler ; TCPWM #0, Counter #1 + DCD tcpwm_0_interrupts_2_IRQHandler ; TCPWM #0, Counter #2 + DCD tcpwm_0_interrupts_3_IRQHandler ; TCPWM #0, Counter #3 + DCD tcpwm_0_interrupts_4_IRQHandler ; TCPWM #0, Counter #4 + DCD tcpwm_0_interrupts_5_IRQHandler ; TCPWM #0, Counter #5 + DCD tcpwm_0_interrupts_6_IRQHandler ; TCPWM #0, Counter #6 + DCD tcpwm_0_interrupts_7_IRQHandler ; TCPWM #0, Counter #7 + DCD tcpwm_1_interrupts_0_IRQHandler ; TCPWM #1, Counter #0 + DCD tcpwm_1_interrupts_1_IRQHandler ; TCPWM #1, Counter #1 + DCD tcpwm_1_interrupts_2_IRQHandler ; TCPWM #1, Counter #2 + DCD tcpwm_1_interrupts_3_IRQHandler ; TCPWM #1, Counter #3 + DCD tcpwm_1_interrupts_4_IRQHandler ; TCPWM #1, Counter #4 + DCD tcpwm_1_interrupts_5_IRQHandler ; TCPWM #1, Counter #5 + DCD tcpwm_1_interrupts_6_IRQHandler ; TCPWM #1, Counter #6 + DCD tcpwm_1_interrupts_7_IRQHandler ; TCPWM #1, Counter #7 + DCD tcpwm_1_interrupts_8_IRQHandler ; TCPWM #1, Counter #8 + DCD tcpwm_1_interrupts_9_IRQHandler ; TCPWM #1, Counter #9 + DCD tcpwm_1_interrupts_10_IRQHandler ; TCPWM #1, Counter #10 + DCD tcpwm_1_interrupts_11_IRQHandler ; TCPWM #1, Counter #11 + DCD tcpwm_1_interrupts_12_IRQHandler ; TCPWM #1, Counter #12 + DCD tcpwm_1_interrupts_13_IRQHandler ; TCPWM #1, Counter #13 + DCD tcpwm_1_interrupts_14_IRQHandler ; TCPWM #1, Counter #14 + DCD tcpwm_1_interrupts_15_IRQHandler ; TCPWM #1, Counter #15 + DCD tcpwm_1_interrupts_16_IRQHandler ; TCPWM #1, Counter #16 + DCD tcpwm_1_interrupts_17_IRQHandler ; TCPWM #1, Counter #17 + DCD tcpwm_1_interrupts_18_IRQHandler ; TCPWM #1, Counter #18 + DCD tcpwm_1_interrupts_19_IRQHandler ; TCPWM #1, Counter #19 + DCD tcpwm_1_interrupts_20_IRQHandler ; TCPWM #1, Counter #20 + DCD tcpwm_1_interrupts_21_IRQHandler ; TCPWM #1, Counter #21 + DCD tcpwm_1_interrupts_22_IRQHandler ; TCPWM #1, Counter #22 + DCD tcpwm_1_interrupts_23_IRQHandler ; TCPWM #1, Counter #23 + DCD udb_interrupts_0_IRQHandler ; UDB Interrupt #0 + DCD udb_interrupts_1_IRQHandler ; UDB Interrupt #1 + DCD udb_interrupts_2_IRQHandler ; UDB Interrupt #2 + DCD udb_interrupts_3_IRQHandler ; UDB Interrupt #3 + DCD udb_interrupts_4_IRQHandler ; UDB Interrupt #4 + DCD udb_interrupts_5_IRQHandler ; UDB Interrupt #5 + DCD udb_interrupts_6_IRQHandler ; UDB Interrupt #6 + DCD udb_interrupts_7_IRQHandler ; UDB Interrupt #7 + DCD udb_interrupts_8_IRQHandler ; UDB Interrupt #8 + DCD udb_interrupts_9_IRQHandler ; UDB Interrupt #9 + DCD udb_interrupts_10_IRQHandler ; UDB Interrupt #10 + DCD udb_interrupts_11_IRQHandler ; UDB Interrupt #11 + DCD udb_interrupts_12_IRQHandler ; UDB Interrupt #12 + DCD udb_interrupts_13_IRQHandler ; UDB Interrupt #13 + DCD udb_interrupts_14_IRQHandler ; UDB Interrupt #14 + DCD udb_interrupts_15_IRQHandler ; UDB Interrupt #15 + DCD pass_interrupt_sar_IRQHandler ; SAR ADC interrupt + DCD audioss_interrupt_i2s_IRQHandler ; I2S Audio interrupt + DCD audioss_interrupt_pdm_IRQHandler ; PDM/PCM Audio interrupt + DCD profile_interrupt_IRQHandler ; Energy Profiler interrupt + DCD smif_interrupt_IRQHandler ; Serial Memory Interface interrupt + DCD usb_interrupt_hi_IRQHandler ; USB Interrupt + DCD usb_interrupt_med_IRQHandler ; USB Interrupt + DCD usb_interrupt_lo_IRQHandler ; USB Interrupt + DCD pass_interrupt_dacs_IRQHandler ; Consolidated interrrupt for all DACs + +__Vectors_End + +__Vectors EQU __vector_table +__Vectors_Size EQU __Vectors_End - __Vectors + + SECTION .intvec_ram:DATA:REORDER:NOROOT(2) +__ramVectors + DS32 __Vectors_Size + + + THUMB + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default handlers +;; + PUBWEAK Default_Handler + SECTION .text:CODE:REORDER:NOROOT(2) +Default_Handler + B Default_Handler + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Weak function for startup customization +;; +;; Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) +;; because this function is executed as the first instruction in the ResetHandler. +;; The PDL is also not initialized to use the proper register offsets. +;; The user of this function is responsible for initializing the PDL and resources before using them. +;; + PUBWEAK Cy_OnResetUser + SECTION .text:CODE:REORDER:NOROOT(2) +Cy_OnResetUser + BX LR + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Define strong version to return zero for +;; __iar_program_start to skip data sections +;; initialization. +;; + PUBLIC __low_level_init + SECTION .text:CODE:REORDER:NOROOT(2) +__low_level_init + MOVS R0, #0 + BX LR + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER:NOROOT(2) +Reset_Handler + + ; Define strong function for startup customization + LDR R0, =Cy_OnResetUser + BLX R0 + + ; Disable global interrupts + CPSID I + + ; Copy vectors from ROM to RAM + LDR r1, =__vector_table + LDR r0, =__ramVectors + LDR r2, =__Vectors_Size +intvec_copy + LDR r3, [r1] + STR r3, [r0] + ADDS r0, r0, #4 + ADDS r1, r1, #4 + SUBS r2, r2, #1 + CMP r2, #0 + BNE intvec_copy + + ; Update Vector Table Offset Register + LDR r0, =__ramVectors + LDR r1, =0xE000ED08 + STR r0, [r1] + dsb + + ; Enable the FPU if used + LDR R0, =Cy_SystemInitFpuEnable + BLX R0 + + ; Initialize data sections + LDR R0, =__iar_data_init3 + BLX R0 + + LDR R0, =SystemInit + BLX R0 + + LDR R0, =__iar_program_start + BLX R0 + +; Should never get here +Cy_Main_Exited + B Cy_Main_Exited + + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +NMI_Handler + B NMI_Handler + + + PUBWEAK Cy_SysLib_FaultHandler + SECTION .text:CODE:REORDER:NOROOT(1) +Cy_SysLib_FaultHandler + B Cy_SysLib_FaultHandler + + PUBWEAK HardFault_Wrapper + SECTION .text:CODE:REORDER:NOROOT(1) +HardFault_Wrapper + IMPORT Cy_SysLib_FaultHandler + movs r0, #4 + mov r1, LR + tst r0, r1 + beq L_MSP + mrs r0, PSP + b L_API_call +L_MSP + mrs r0, MSP +L_API_call + ; Storing LR content for Creator call stack trace + push {LR} + bl Cy_SysLib_FaultHandler + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +HardFault_Handler + B HardFault_Wrapper + + PUBWEAK MemManage_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +MemManage_Handler + B HardFault_Wrapper + + PUBWEAK BusFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +BusFault_Handler + B HardFault_Wrapper + + PUBWEAK UsageFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +UsageFault_Handler + B HardFault_Wrapper + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SVC_Handler + B SVC_Handler + + PUBWEAK DebugMon_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +DebugMon_Handler + B DebugMon_Handler + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +PendSV_Handler + B PendSV_Handler + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SysTick_Handler + B SysTick_Handler + + + ; External interrupts + PUBWEAK ioss_interrupts_gpio_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_0_IRQHandler + B ioss_interrupts_gpio_0_IRQHandler + + PUBWEAK ioss_interrupts_gpio_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_1_IRQHandler + B ioss_interrupts_gpio_1_IRQHandler + + PUBWEAK ioss_interrupts_gpio_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_2_IRQHandler + B ioss_interrupts_gpio_2_IRQHandler + + PUBWEAK ioss_interrupts_gpio_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_3_IRQHandler + B ioss_interrupts_gpio_3_IRQHandler + + PUBWEAK ioss_interrupts_gpio_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_4_IRQHandler + B ioss_interrupts_gpio_4_IRQHandler + + PUBWEAK ioss_interrupts_gpio_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_5_IRQHandler + B ioss_interrupts_gpio_5_IRQHandler + + PUBWEAK ioss_interrupts_gpio_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_6_IRQHandler + B ioss_interrupts_gpio_6_IRQHandler + + PUBWEAK ioss_interrupts_gpio_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_7_IRQHandler + B ioss_interrupts_gpio_7_IRQHandler + + PUBWEAK ioss_interrupts_gpio_8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_8_IRQHandler + B ioss_interrupts_gpio_8_IRQHandler + + PUBWEAK ioss_interrupts_gpio_9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_9_IRQHandler + B ioss_interrupts_gpio_9_IRQHandler + + PUBWEAK ioss_interrupts_gpio_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_10_IRQHandler + B ioss_interrupts_gpio_10_IRQHandler + + PUBWEAK ioss_interrupts_gpio_11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_11_IRQHandler + B ioss_interrupts_gpio_11_IRQHandler + + PUBWEAK ioss_interrupts_gpio_12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_12_IRQHandler + B ioss_interrupts_gpio_12_IRQHandler + + PUBWEAK ioss_interrupts_gpio_13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_13_IRQHandler + B ioss_interrupts_gpio_13_IRQHandler + + PUBWEAK ioss_interrupts_gpio_14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupts_gpio_14_IRQHandler + B ioss_interrupts_gpio_14_IRQHandler + + PUBWEAK ioss_interrupt_gpio_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupt_gpio_IRQHandler + B ioss_interrupt_gpio_IRQHandler + + PUBWEAK ioss_interrupt_vdd_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +ioss_interrupt_vdd_IRQHandler + B ioss_interrupt_vdd_IRQHandler + + PUBWEAK lpcomp_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +lpcomp_interrupt_IRQHandler + B lpcomp_interrupt_IRQHandler + + PUBWEAK scb_8_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_8_interrupt_IRQHandler + B scb_8_interrupt_IRQHandler + + PUBWEAK srss_interrupt_mcwdt_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +srss_interrupt_mcwdt_0_IRQHandler + B srss_interrupt_mcwdt_0_IRQHandler + + PUBWEAK srss_interrupt_mcwdt_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +srss_interrupt_mcwdt_1_IRQHandler + B srss_interrupt_mcwdt_1_IRQHandler + + PUBWEAK srss_interrupt_backup_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +srss_interrupt_backup_IRQHandler + B srss_interrupt_backup_IRQHandler + + PUBWEAK srss_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +srss_interrupt_IRQHandler + B srss_interrupt_IRQHandler + + PUBWEAK pass_interrupt_ctbs_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +pass_interrupt_ctbs_IRQHandler + B pass_interrupt_ctbs_IRQHandler + + PUBWEAK bless_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +bless_interrupt_IRQHandler + B bless_interrupt_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_0_IRQHandler + B cpuss_interrupts_ipc_0_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_1_IRQHandler + B cpuss_interrupts_ipc_1_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_2_IRQHandler + B cpuss_interrupts_ipc_2_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_3_IRQHandler + B cpuss_interrupts_ipc_3_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_4_IRQHandler + B cpuss_interrupts_ipc_4_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_5_IRQHandler + B cpuss_interrupts_ipc_5_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_6_IRQHandler + B cpuss_interrupts_ipc_6_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_7_IRQHandler + B cpuss_interrupts_ipc_7_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_8_IRQHandler + B cpuss_interrupts_ipc_8_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_9_IRQHandler + B cpuss_interrupts_ipc_9_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_10_IRQHandler + B cpuss_interrupts_ipc_10_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_11_IRQHandler + B cpuss_interrupts_ipc_11_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_12_IRQHandler + B cpuss_interrupts_ipc_12_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_13_IRQHandler + B cpuss_interrupts_ipc_13_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_14_IRQHandler + B cpuss_interrupts_ipc_14_IRQHandler + + PUBWEAK cpuss_interrupts_ipc_15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_ipc_15_IRQHandler + B cpuss_interrupts_ipc_15_IRQHandler + + PUBWEAK scb_0_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_0_interrupt_IRQHandler + B scb_0_interrupt_IRQHandler + + PUBWEAK scb_1_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_1_interrupt_IRQHandler + B scb_1_interrupt_IRQHandler + + PUBWEAK scb_2_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_2_interrupt_IRQHandler + B scb_2_interrupt_IRQHandler + + PUBWEAK scb_3_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_3_interrupt_IRQHandler + B scb_3_interrupt_IRQHandler + + PUBWEAK scb_4_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_4_interrupt_IRQHandler + B scb_4_interrupt_IRQHandler + + PUBWEAK scb_5_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_5_interrupt_IRQHandler + B scb_5_interrupt_IRQHandler + + PUBWEAK scb_6_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_6_interrupt_IRQHandler + B scb_6_interrupt_IRQHandler + + PUBWEAK scb_7_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +scb_7_interrupt_IRQHandler + B scb_7_interrupt_IRQHandler + + PUBWEAK csd_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +csd_interrupt_IRQHandler + B csd_interrupt_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_0_IRQHandler + B cpuss_interrupts_dw0_0_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_1_IRQHandler + B cpuss_interrupts_dw0_1_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_2_IRQHandler + B cpuss_interrupts_dw0_2_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_3_IRQHandler + B cpuss_interrupts_dw0_3_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_4_IRQHandler + B cpuss_interrupts_dw0_4_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_5_IRQHandler + B cpuss_interrupts_dw0_5_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_6_IRQHandler + B cpuss_interrupts_dw0_6_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_7_IRQHandler + B cpuss_interrupts_dw0_7_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_8_IRQHandler + B cpuss_interrupts_dw0_8_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_9_IRQHandler + B cpuss_interrupts_dw0_9_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_10_IRQHandler + B cpuss_interrupts_dw0_10_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_11_IRQHandler + B cpuss_interrupts_dw0_11_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_12_IRQHandler + B cpuss_interrupts_dw0_12_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_13_IRQHandler + B cpuss_interrupts_dw0_13_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_14_IRQHandler + B cpuss_interrupts_dw0_14_IRQHandler + + PUBWEAK cpuss_interrupts_dw0_15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw0_15_IRQHandler + B cpuss_interrupts_dw0_15_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_0_IRQHandler + B cpuss_interrupts_dw1_0_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_1_IRQHandler + B cpuss_interrupts_dw1_1_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_2_IRQHandler + B cpuss_interrupts_dw1_2_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_3_IRQHandler + B cpuss_interrupts_dw1_3_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_4_IRQHandler + B cpuss_interrupts_dw1_4_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_5_IRQHandler + B cpuss_interrupts_dw1_5_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_6_IRQHandler + B cpuss_interrupts_dw1_6_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_7_IRQHandler + B cpuss_interrupts_dw1_7_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_8_IRQHandler + B cpuss_interrupts_dw1_8_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_9_IRQHandler + B cpuss_interrupts_dw1_9_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_10_IRQHandler + B cpuss_interrupts_dw1_10_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_11_IRQHandler + B cpuss_interrupts_dw1_11_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_12_IRQHandler + B cpuss_interrupts_dw1_12_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_13_IRQHandler + B cpuss_interrupts_dw1_13_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_14_IRQHandler + B cpuss_interrupts_dw1_14_IRQHandler + + PUBWEAK cpuss_interrupts_dw1_15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_dw1_15_IRQHandler + B cpuss_interrupts_dw1_15_IRQHandler + + PUBWEAK cpuss_interrupts_fault_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_fault_0_IRQHandler + B cpuss_interrupts_fault_0_IRQHandler + + PUBWEAK cpuss_interrupts_fault_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_fault_1_IRQHandler + B cpuss_interrupts_fault_1_IRQHandler + + PUBWEAK cpuss_interrupt_crypto_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupt_crypto_IRQHandler + B cpuss_interrupt_crypto_IRQHandler + + PUBWEAK cpuss_interrupt_fm_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupt_fm_IRQHandler + B cpuss_interrupt_fm_IRQHandler + + PUBWEAK cpuss_interrupts_cm0_cti_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_cm0_cti_0_IRQHandler + B cpuss_interrupts_cm0_cti_0_IRQHandler + + PUBWEAK cpuss_interrupts_cm0_cti_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_cm0_cti_1_IRQHandler + B cpuss_interrupts_cm0_cti_1_IRQHandler + + PUBWEAK cpuss_interrupts_cm4_cti_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_cm4_cti_0_IRQHandler + B cpuss_interrupts_cm4_cti_0_IRQHandler + + PUBWEAK cpuss_interrupts_cm4_cti_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +cpuss_interrupts_cm4_cti_1_IRQHandler + B cpuss_interrupts_cm4_cti_1_IRQHandler + + PUBWEAK tcpwm_0_interrupts_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_0_IRQHandler + B tcpwm_0_interrupts_0_IRQHandler + + PUBWEAK tcpwm_0_interrupts_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_1_IRQHandler + B tcpwm_0_interrupts_1_IRQHandler + + PUBWEAK tcpwm_0_interrupts_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_2_IRQHandler + B tcpwm_0_interrupts_2_IRQHandler + + PUBWEAK tcpwm_0_interrupts_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_3_IRQHandler + B tcpwm_0_interrupts_3_IRQHandler + + PUBWEAK tcpwm_0_interrupts_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_4_IRQHandler + B tcpwm_0_interrupts_4_IRQHandler + + PUBWEAK tcpwm_0_interrupts_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_5_IRQHandler + B tcpwm_0_interrupts_5_IRQHandler + + PUBWEAK tcpwm_0_interrupts_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_6_IRQHandler + B tcpwm_0_interrupts_6_IRQHandler + + PUBWEAK tcpwm_0_interrupts_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_0_interrupts_7_IRQHandler + B tcpwm_0_interrupts_7_IRQHandler + + PUBWEAK tcpwm_1_interrupts_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_0_IRQHandler + B tcpwm_1_interrupts_0_IRQHandler + + PUBWEAK tcpwm_1_interrupts_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_1_IRQHandler + B tcpwm_1_interrupts_1_IRQHandler + + PUBWEAK tcpwm_1_interrupts_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_2_IRQHandler + B tcpwm_1_interrupts_2_IRQHandler + + PUBWEAK tcpwm_1_interrupts_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_3_IRQHandler + B tcpwm_1_interrupts_3_IRQHandler + + PUBWEAK tcpwm_1_interrupts_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_4_IRQHandler + B tcpwm_1_interrupts_4_IRQHandler + + PUBWEAK tcpwm_1_interrupts_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_5_IRQHandler + B tcpwm_1_interrupts_5_IRQHandler + + PUBWEAK tcpwm_1_interrupts_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_6_IRQHandler + B tcpwm_1_interrupts_6_IRQHandler + + PUBWEAK tcpwm_1_interrupts_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_7_IRQHandler + B tcpwm_1_interrupts_7_IRQHandler + + PUBWEAK tcpwm_1_interrupts_8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_8_IRQHandler + B tcpwm_1_interrupts_8_IRQHandler + + PUBWEAK tcpwm_1_interrupts_9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_9_IRQHandler + B tcpwm_1_interrupts_9_IRQHandler + + PUBWEAK tcpwm_1_interrupts_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_10_IRQHandler + B tcpwm_1_interrupts_10_IRQHandler + + PUBWEAK tcpwm_1_interrupts_11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_11_IRQHandler + B tcpwm_1_interrupts_11_IRQHandler + + PUBWEAK tcpwm_1_interrupts_12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_12_IRQHandler + B tcpwm_1_interrupts_12_IRQHandler + + PUBWEAK tcpwm_1_interrupts_13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_13_IRQHandler + B tcpwm_1_interrupts_13_IRQHandler + + PUBWEAK tcpwm_1_interrupts_14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_14_IRQHandler + B tcpwm_1_interrupts_14_IRQHandler + + PUBWEAK tcpwm_1_interrupts_15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_15_IRQHandler + B tcpwm_1_interrupts_15_IRQHandler + + PUBWEAK tcpwm_1_interrupts_16_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_16_IRQHandler + B tcpwm_1_interrupts_16_IRQHandler + + PUBWEAK tcpwm_1_interrupts_17_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_17_IRQHandler + B tcpwm_1_interrupts_17_IRQHandler + + PUBWEAK tcpwm_1_interrupts_18_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_18_IRQHandler + B tcpwm_1_interrupts_18_IRQHandler + + PUBWEAK tcpwm_1_interrupts_19_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_19_IRQHandler + B tcpwm_1_interrupts_19_IRQHandler + + PUBWEAK tcpwm_1_interrupts_20_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_20_IRQHandler + B tcpwm_1_interrupts_20_IRQHandler + + PUBWEAK tcpwm_1_interrupts_21_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_21_IRQHandler + B tcpwm_1_interrupts_21_IRQHandler + + PUBWEAK tcpwm_1_interrupts_22_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_22_IRQHandler + B tcpwm_1_interrupts_22_IRQHandler + + PUBWEAK tcpwm_1_interrupts_23_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +tcpwm_1_interrupts_23_IRQHandler + B tcpwm_1_interrupts_23_IRQHandler + + PUBWEAK udb_interrupts_0_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_0_IRQHandler + B udb_interrupts_0_IRQHandler + + PUBWEAK udb_interrupts_1_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_1_IRQHandler + B udb_interrupts_1_IRQHandler + + PUBWEAK udb_interrupts_2_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_2_IRQHandler + B udb_interrupts_2_IRQHandler + + PUBWEAK udb_interrupts_3_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_3_IRQHandler + B udb_interrupts_3_IRQHandler + + PUBWEAK udb_interrupts_4_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_4_IRQHandler + B udb_interrupts_4_IRQHandler + + PUBWEAK udb_interrupts_5_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_5_IRQHandler + B udb_interrupts_5_IRQHandler + + PUBWEAK udb_interrupts_6_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_6_IRQHandler + B udb_interrupts_6_IRQHandler + + PUBWEAK udb_interrupts_7_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_7_IRQHandler + B udb_interrupts_7_IRQHandler + + PUBWEAK udb_interrupts_8_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_8_IRQHandler + B udb_interrupts_8_IRQHandler + + PUBWEAK udb_interrupts_9_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_9_IRQHandler + B udb_interrupts_9_IRQHandler + + PUBWEAK udb_interrupts_10_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_10_IRQHandler + B udb_interrupts_10_IRQHandler + + PUBWEAK udb_interrupts_11_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_11_IRQHandler + B udb_interrupts_11_IRQHandler + + PUBWEAK udb_interrupts_12_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_12_IRQHandler + B udb_interrupts_12_IRQHandler + + PUBWEAK udb_interrupts_13_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_13_IRQHandler + B udb_interrupts_13_IRQHandler + + PUBWEAK udb_interrupts_14_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_14_IRQHandler + B udb_interrupts_14_IRQHandler + + PUBWEAK udb_interrupts_15_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +udb_interrupts_15_IRQHandler + B udb_interrupts_15_IRQHandler + + PUBWEAK pass_interrupt_sar_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +pass_interrupt_sar_IRQHandler + B pass_interrupt_sar_IRQHandler + + PUBWEAK audioss_interrupt_i2s_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +audioss_interrupt_i2s_IRQHandler + B audioss_interrupt_i2s_IRQHandler + + PUBWEAK audioss_interrupt_pdm_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +audioss_interrupt_pdm_IRQHandler + B audioss_interrupt_pdm_IRQHandler + + PUBWEAK profile_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +profile_interrupt_IRQHandler + B profile_interrupt_IRQHandler + + PUBWEAK smif_interrupt_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +smif_interrupt_IRQHandler + B smif_interrupt_IRQHandler + + PUBWEAK usb_interrupt_hi_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +usb_interrupt_hi_IRQHandler + B usb_interrupt_hi_IRQHandler + + PUBWEAK usb_interrupt_med_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +usb_interrupt_med_IRQHandler + B usb_interrupt_med_IRQHandler + + PUBWEAK usb_interrupt_lo_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +usb_interrupt_lo_IRQHandler + B usb_interrupt_lo_IRQHandler + + PUBWEAK pass_interrupt_dacs_IRQHandler + SECTION .text:CODE:REORDER:NOROOT(1) +pass_interrupt_dacs_IRQHandler + B pass_interrupt_dacs_IRQHandler + + + END + + +; [] END OF FILE diff --git a/2020TPCAppNoDFU.cydsn/main_cm0p.c b/2020TPCAppNoDFU.cydsn/main_cm0p.c new file mode 100644 index 0000000..25e9c11 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/main_cm0p.c @@ -0,0 +1,30 @@ +#include "project.h" + +#include "COMM_IPC_Messages.h" + +int main(void) +{ + __enable_irq(); + +#if(CY_BLE_STACK_MODE_IPC) + /* Start BLE Controller for dual core mode */ + Cy_BLE_Start(NULL); +#endif /* (CY_BLE_STACK_MODE_IPC)*/ + + COMM_InitIPCMessages(); + + /* Enable CM4. CY_CORTEX_M4_APPL_ADDR must be updated if CM4 memory layout is changed. */ + Cy_SysEnableCM4(CY_CORTEX_M4_APPL_ADDR); + + while(true) + { +#if(CY_BLE_STACK_MODE_IPC) + /* Process BLE events continuously for controller in dual core mode */ + Cy_BLE_ProcessEvents(); +#endif /* CY_BLE_STACK_MODE_IPC */ + + /* To achieve low power in the device */ + Cy_SysPm_DeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT); + } +} + diff --git a/2020TPCAppNoDFU.cydsn/main_cm4.c b/2020TPCAppNoDFU.cydsn/main_cm4.c new file mode 100644 index 0000000..2f41a28 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/main_cm4.c @@ -0,0 +1,107 @@ +/** \file + * \brief This file provides the entry point for the application running on the Cortex-M4 core. + * + * ## CapSense + * To tune the CapSense buttons, do the following: + * 1. Define `TUNE_CAPSENSE` below. + * 2. Rebuild the project, and load it on to your board. + * 3. Right-click on the `CapSense` component on the "CapSense" schematic page in `TopDesign.cysch`, and choose "Launch Tuner". + * 4. Follow the instructions in [AN85951 - PSoC 4 and PSoC 6 MCU CapSense Design Guide](https://www.cypress.com/documentation/application-notes/an85951-psoc-4-and-psoc-6-mcu-capsense-design-guide) to complete the tuning. + * + */ + + +/* Include Files */ +#include "KTag.h" + + +// See the instructions at the top of this file for how to tune CapSense--this is only part of what you need. +//#define TUNE_CAPSENSE + + +#ifndef TUNE_CAPSENSE +int main() +{ + CONFIG_InitTasks(); + + /* Enable global interrupts. */ + __enable_irq(); + + COMM_InitIPCMessages(); + + CONFIG_RunTasks(); +} +#endif // TUNE_CAPSENSE + + +void vApplicationIdleHook(void) +{ + CyDelay(500); +} + + +void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName ) +{ + /* Halt the CPU */ + CY_ASSERT(0); +} + + +void vApplicationMallocFailedHook( void ) +{ + /* Halt the CPU */ + CY_ASSERT(0); +} + + +#ifdef TUNE_CAPSENSE +int main() +{ + uint8 header[] = {0x0Du, 0x0Au}; + uint8 tail[] = {0x00u, 0xFFu, 0xFFu}; + + __enable_irq(); /* Enable global interrupts. */ + + UART_Console_Start(); /* Start UART SCB Component */ + CapSense_Start(); /* Initialize Component */ + CapSense_ScanAllWidgets(); /* Scan all widgets */ + + for(;;) + { + /* Do this only when a scan is done */ + if(CapSense_NOT_BUSY == CapSense_IsBusy()) + { + CapSense_ProcessAllWidgets(); /* Process all widgets */ + + /* Send packet header */ + UART_Console_PutArrayBlocking((uint8 *)(&header), sizeof(header)); + /* Send packet with CapSense data */ + UART_Console_PutArrayBlocking((uint8 *)(&CapSense_dsRam), sizeof(CapSense_dsRam)); + /* Send packet tail */ + UART_Console_PutArrayBlocking((uint8 *)(&tail), sizeof(tail)); + + CapSense_ScanAllWidgets(); /* Start next scan */ + } + } +} +#endif // TUNE_CAPSENSE + +void vApplicationGetIdleTaskMemory(StaticTask_t** ppxIdleTaskTCBBuffer, StackType_t** ppxIdleTaskStackBuffer, uint32_t* pulIdleTaskStackSize) +{ + static StaticTask_t xIdleTaskTCB; + static StackType_t uxIdleTaskStack[configMINIMAL_STACK_SIZE]; + + *ppxIdleTaskTCBBuffer = &xIdleTaskTCB; + *ppxIdleTaskStackBuffer = uxIdleTaskStack; + *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; +} + +void vApplicationGetTimerTaskMemory(StaticTask_t** ppxTimerTaskTCBBuffer, StackType_t** ppxTimerTaskStackBuffer, uint32_t* pulTimerTaskStackSize) +{ + static StaticTask_t xTimerTaskTCB; + static StackType_t uxTimerTaskStack[configTIMER_TASK_STACK_DEPTH]; + + *ppxTimerTaskTCBBuffer = &xTimerTaskTCB; + *ppxTimerTaskStackBuffer = uxTimerTaskStack; + *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH; +} \ No newline at end of file diff --git a/2020TPCAppNoDFU.cydsn/mdk/startup_psoc6_01_cm0plus.s b/2020TPCAppNoDFU.cydsn/mdk/startup_psoc6_01_cm0plus.s new file mode 100644 index 0000000..9358665 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/mdk/startup_psoc6_01_cm0plus.s @@ -0,0 +1,321 @@ +;/**************************************************************************//** +; * @file startup_psoc6_01_cm0plus.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM0plus Device Series +; * @version V5.00 +; * @date 02. March 2016 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2016 ARM Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * Licensed under the Apache License, Version 2.0 (the License); you may +; * not use this file except in compliance with the License. +; * You may obtain a copy of the License at +; * +; * www.apache.org/licenses/LICENSE-2.0 +; * +; * 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. +; */ + +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + IF :DEF:__STACK_SIZE +Stack_Size EQU __STACK_SIZE + ELSE +Stack_Size EQU 0x00001000 + ENDIF + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + IF :DEF:__HEAP_SIZE +Heap_Size EQU __HEAP_SIZE + ELSE +Heap_Size EQU 0x00000400 + ENDIF + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + + DCD 0x0000000D ; NMI Handler located at ROM code + DCD HardFault_Handler ; Hard Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + + ; External interrupts Description + DCD NvicMux0_IRQHandler ; CM0+ NVIC Mux input 0 + DCD NvicMux1_IRQHandler ; CM0+ NVIC Mux input 1 + DCD NvicMux2_IRQHandler ; CM0+ NVIC Mux input 2 + DCD NvicMux3_IRQHandler ; CM0+ NVIC Mux input 3 + DCD NvicMux4_IRQHandler ; CM0+ NVIC Mux input 4 + DCD NvicMux5_IRQHandler ; CM0+ NVIC Mux input 5 + DCD NvicMux6_IRQHandler ; CM0+ NVIC Mux input 6 + DCD NvicMux7_IRQHandler ; CM0+ NVIC Mux input 7 + DCD NvicMux8_IRQHandler ; CM0+ NVIC Mux input 8 + DCD NvicMux9_IRQHandler ; CM0+ NVIC Mux input 9 + DCD NvicMux10_IRQHandler ; CM0+ NVIC Mux input 10 + DCD NvicMux11_IRQHandler ; CM0+ NVIC Mux input 11 + DCD NvicMux12_IRQHandler ; CM0+ NVIC Mux input 12 + DCD NvicMux13_IRQHandler ; CM0+ NVIC Mux input 13 + DCD NvicMux14_IRQHandler ; CM0+ NVIC Mux input 14 + DCD NvicMux15_IRQHandler ; CM0+ NVIC Mux input 15 + DCD NvicMux16_IRQHandler ; CM0+ NVIC Mux input 16 + DCD NvicMux17_IRQHandler ; CM0+ NVIC Mux input 17 + DCD NvicMux18_IRQHandler ; CM0+ NVIC Mux input 18 + DCD NvicMux19_IRQHandler ; CM0+ NVIC Mux input 19 + DCD NvicMux20_IRQHandler ; CM0+ NVIC Mux input 20 + DCD NvicMux21_IRQHandler ; CM0+ NVIC Mux input 21 + DCD NvicMux22_IRQHandler ; CM0+ NVIC Mux input 22 + DCD NvicMux23_IRQHandler ; CM0+ NVIC Mux input 23 + DCD NvicMux24_IRQHandler ; CM0+ NVIC Mux input 24 + DCD NvicMux25_IRQHandler ; CM0+ NVIC Mux input 25 + DCD NvicMux26_IRQHandler ; CM0+ NVIC Mux input 26 + DCD NvicMux27_IRQHandler ; CM0+ NVIC Mux input 27 + DCD NvicMux28_IRQHandler ; CM0+ NVIC Mux input 28 + DCD NvicMux29_IRQHandler ; CM0+ NVIC Mux input 29 + DCD NvicMux30_IRQHandler ; CM0+ NVIC Mux input 30 + DCD NvicMux31_IRQHandler ; CM0+ NVIC Mux input 31 + +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + EXPORT __ramVectors + AREA RESET_RAM, READWRITE, NOINIT +__ramVectors SPACE __Vectors_Size + + + AREA |.text|, CODE, READONLY + + +; Weak function for startup customization +; +; Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) +; because this function is executed as the first instruction in the ResetHandler. +; The PDL is also not initialized to use the proper register offsets. +; The user of this function is responsible for initializing the PDL and resources before using them. +; +Cy_OnResetUser PROC + EXPORT Cy_OnResetUser [WEAK] + BX LR + ENDP + +; Reset Handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT __main + + ; Define strong function for startup customization + BL Cy_OnResetUser + + ; Disable global interrupts + CPSID I + + ; Copy vectors from ROM to RAM + LDR r1, =__Vectors + LDR r0, =__ramVectors + LDR r2, =__Vectors_Size +Vectors_Copy + LDR r3, [r1] + STR r3, [r0] + ADDS r0, r0, #4 + ADDS r1, r1, #4 + SUBS r2, r2, #1 + CMP r2, #0 + BNE Vectors_Copy + + ; Update Vector Table Offset Register. */ + LDR r0, =__ramVectors + LDR r1, =0xE000ED08 + STR r0, [r1] + dsb 0xF + + LDR R0, =__main + BLX R0 + + ; Should never get here + B . + + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +Cy_SysLib_FaultHandler PROC + EXPORT Cy_SysLib_FaultHandler [WEAK] + B . + ENDP + +HardFault_Handler PROC + EXPORT HardFault_Handler [WEAK] + movs r0, #4 + mov r1, LR + tst r0, r1 + beq L_MSP + mrs r0, PSP + bl L_API_call +L_MSP + mrs r0, MSP +L_API_call + bl Cy_SysLib_FaultHandler + ENDP + +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + EXPORT Default_Handler [WEAK] + EXPORT NvicMux0_IRQHandler [WEAK] + EXPORT NvicMux1_IRQHandler [WEAK] + EXPORT NvicMux2_IRQHandler [WEAK] + EXPORT NvicMux3_IRQHandler [WEAK] + EXPORT NvicMux4_IRQHandler [WEAK] + EXPORT NvicMux5_IRQHandler [WEAK] + EXPORT NvicMux6_IRQHandler [WEAK] + EXPORT NvicMux7_IRQHandler [WEAK] + EXPORT NvicMux8_IRQHandler [WEAK] + EXPORT NvicMux9_IRQHandler [WEAK] + EXPORT NvicMux10_IRQHandler [WEAK] + EXPORT NvicMux11_IRQHandler [WEAK] + EXPORT NvicMux12_IRQHandler [WEAK] + EXPORT NvicMux13_IRQHandler [WEAK] + EXPORT NvicMux14_IRQHandler [WEAK] + EXPORT NvicMux15_IRQHandler [WEAK] + EXPORT NvicMux16_IRQHandler [WEAK] + EXPORT NvicMux17_IRQHandler [WEAK] + EXPORT NvicMux18_IRQHandler [WEAK] + EXPORT NvicMux19_IRQHandler [WEAK] + EXPORT NvicMux20_IRQHandler [WEAK] + EXPORT NvicMux21_IRQHandler [WEAK] + EXPORT NvicMux22_IRQHandler [WEAK] + EXPORT NvicMux23_IRQHandler [WEAK] + EXPORT NvicMux24_IRQHandler [WEAK] + EXPORT NvicMux25_IRQHandler [WEAK] + EXPORT NvicMux26_IRQHandler [WEAK] + EXPORT NvicMux27_IRQHandler [WEAK] + EXPORT NvicMux28_IRQHandler [WEAK] + EXPORT NvicMux29_IRQHandler [WEAK] + EXPORT NvicMux30_IRQHandler [WEAK] + EXPORT NvicMux31_IRQHandler [WEAK] + +NvicMux0_IRQHandler +NvicMux1_IRQHandler +NvicMux2_IRQHandler +NvicMux3_IRQHandler +NvicMux4_IRQHandler +NvicMux5_IRQHandler +NvicMux6_IRQHandler +NvicMux7_IRQHandler +NvicMux8_IRQHandler +NvicMux9_IRQHandler +NvicMux10_IRQHandler +NvicMux11_IRQHandler +NvicMux12_IRQHandler +NvicMux13_IRQHandler +NvicMux14_IRQHandler +NvicMux15_IRQHandler +NvicMux16_IRQHandler +NvicMux17_IRQHandler +NvicMux18_IRQHandler +NvicMux19_IRQHandler +NvicMux20_IRQHandler +NvicMux21_IRQHandler +NvicMux22_IRQHandler +NvicMux23_IRQHandler +NvicMux24_IRQHandler +NvicMux25_IRQHandler +NvicMux26_IRQHandler +NvicMux27_IRQHandler +NvicMux28_IRQHandler +NvicMux29_IRQHandler +NvicMux30_IRQHandler +NvicMux31_IRQHandler + + B . + ENDP + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, =Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, =(Heap_Mem + Heap_Size) + LDR R3, =Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + END + + +; [] END OF FILE diff --git a/2020TPCAppNoDFU.cydsn/mdk/startup_psoc6_01_cm4.s b/2020TPCAppNoDFU.cydsn/mdk/startup_psoc6_01_cm4.s new file mode 100644 index 0000000..c41752b --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/mdk/startup_psoc6_01_cm4.s @@ -0,0 +1,696 @@ +;/**************************************************************************//** +; * @file startup_psoc6_01_cm4.s +; * @brief CMSIS Core Device Startup File for +; * ARMCM4 Device Series +; * @version V5.00 +; * @date 02. March 2016 +; ******************************************************************************/ +;/* +; * Copyright (c) 2009-2016 ARM Limited. All rights reserved. +; * +; * SPDX-License-Identifier: Apache-2.0 +; * +; * Licensed under the Apache License, Version 2.0 (the License); you may +; * not use this file except in compliance with the License. +; * You may obtain a copy of the License at +; * +; * www.apache.org/licenses/LICENSE-2.0 +; * +; * 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. +; */ + +;/* +;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------ +;*/ + +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + IF :DEF:__STACK_SIZE +Stack_Size EQU __STACK_SIZE + ELSE +Stack_Size EQU 0x00001000 + ENDIF + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + IF :DEF:__HEAP_SIZE +Heap_Size EQU __HEAP_SIZE + ELSE +Heap_Size EQU 0x00000400 + ENDIF + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + + PRESERVE8 + THUMB + +; Vector Table Mapped to Address 0 at Reset + + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + + DCD 0x0000000D ; NMI Handler located at ROM code + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External interrupts Power Mode Description + DCD ioss_interrupts_gpio_0_IRQHandler ; GPIO Port Interrupt #0 + DCD ioss_interrupts_gpio_1_IRQHandler ; GPIO Port Interrupt #1 + DCD ioss_interrupts_gpio_2_IRQHandler ; GPIO Port Interrupt #2 + DCD ioss_interrupts_gpio_3_IRQHandler ; GPIO Port Interrupt #3 + DCD ioss_interrupts_gpio_4_IRQHandler ; GPIO Port Interrupt #4 + DCD ioss_interrupts_gpio_5_IRQHandler ; GPIO Port Interrupt #5 + DCD ioss_interrupts_gpio_6_IRQHandler ; GPIO Port Interrupt #6 + DCD ioss_interrupts_gpio_7_IRQHandler ; GPIO Port Interrupt #7 + DCD ioss_interrupts_gpio_8_IRQHandler ; GPIO Port Interrupt #8 + DCD ioss_interrupts_gpio_9_IRQHandler ; GPIO Port Interrupt #9 + DCD ioss_interrupts_gpio_10_IRQHandler ; GPIO Port Interrupt #10 + DCD ioss_interrupts_gpio_11_IRQHandler ; GPIO Port Interrupt #11 + DCD ioss_interrupts_gpio_12_IRQHandler ; GPIO Port Interrupt #12 + DCD ioss_interrupts_gpio_13_IRQHandler ; GPIO Port Interrupt #13 + DCD ioss_interrupts_gpio_14_IRQHandler ; GPIO Port Interrupt #14 + DCD ioss_interrupt_gpio_IRQHandler ; GPIO All Ports + DCD ioss_interrupt_vdd_IRQHandler ; GPIO Supply Detect Interrupt + DCD lpcomp_interrupt_IRQHandler ; Low Power Comparator Interrupt + DCD scb_8_interrupt_IRQHandler ; Serial Communication Block #8 (DeepSleep capable) + DCD srss_interrupt_mcwdt_0_IRQHandler ; Multi Counter Watchdog Timer interrupt + DCD srss_interrupt_mcwdt_1_IRQHandler ; Multi Counter Watchdog Timer interrupt + DCD srss_interrupt_backup_IRQHandler ; Backup domain interrupt + DCD srss_interrupt_IRQHandler ; Other combined Interrupts for SRSS (LVD, WDT, CLKCAL) + DCD pass_interrupt_ctbs_IRQHandler ; CTBm Interrupt (all CTBms) + DCD bless_interrupt_IRQHandler ; Bluetooth Radio interrupt + DCD cpuss_interrupts_ipc_0_IRQHandler ; CPUSS Inter Process Communication Interrupt #0 + DCD cpuss_interrupts_ipc_1_IRQHandler ; CPUSS Inter Process Communication Interrupt #1 + DCD cpuss_interrupts_ipc_2_IRQHandler ; CPUSS Inter Process Communication Interrupt #2 + DCD cpuss_interrupts_ipc_3_IRQHandler ; CPUSS Inter Process Communication Interrupt #3 + DCD cpuss_interrupts_ipc_4_IRQHandler ; CPUSS Inter Process Communication Interrupt #4 + DCD cpuss_interrupts_ipc_5_IRQHandler ; CPUSS Inter Process Communication Interrupt #5 + DCD cpuss_interrupts_ipc_6_IRQHandler ; CPUSS Inter Process Communication Interrupt #6 + DCD cpuss_interrupts_ipc_7_IRQHandler ; CPUSS Inter Process Communication Interrupt #7 + DCD cpuss_interrupts_ipc_8_IRQHandler ; CPUSS Inter Process Communication Interrupt #8 + DCD cpuss_interrupts_ipc_9_IRQHandler ; CPUSS Inter Process Communication Interrupt #9 + DCD cpuss_interrupts_ipc_10_IRQHandler ; CPUSS Inter Process Communication Interrupt #10 + DCD cpuss_interrupts_ipc_11_IRQHandler ; CPUSS Inter Process Communication Interrupt #11 + DCD cpuss_interrupts_ipc_12_IRQHandler ; CPUSS Inter Process Communication Interrupt #12 + DCD cpuss_interrupts_ipc_13_IRQHandler ; CPUSS Inter Process Communication Interrupt #13 + DCD cpuss_interrupts_ipc_14_IRQHandler ; CPUSS Inter Process Communication Interrupt #14 + DCD cpuss_interrupts_ipc_15_IRQHandler ; CPUSS Inter Process Communication Interrupt #15 + DCD scb_0_interrupt_IRQHandler ; Serial Communication Block #0 + DCD scb_1_interrupt_IRQHandler ; Serial Communication Block #1 + DCD scb_2_interrupt_IRQHandler ; Serial Communication Block #2 + DCD scb_3_interrupt_IRQHandler ; Serial Communication Block #3 + DCD scb_4_interrupt_IRQHandler ; Serial Communication Block #4 + DCD scb_5_interrupt_IRQHandler ; Serial Communication Block #5 + DCD scb_6_interrupt_IRQHandler ; Serial Communication Block #6 + DCD scb_7_interrupt_IRQHandler ; Serial Communication Block #7 + DCD csd_interrupt_IRQHandler ; CSD (Capsense) interrupt + DCD cpuss_interrupts_dw0_0_IRQHandler ; CPUSS DataWire #0, Channel #0 + DCD cpuss_interrupts_dw0_1_IRQHandler ; CPUSS DataWire #0, Channel #1 + DCD cpuss_interrupts_dw0_2_IRQHandler ; CPUSS DataWire #0, Channel #2 + DCD cpuss_interrupts_dw0_3_IRQHandler ; CPUSS DataWire #0, Channel #3 + DCD cpuss_interrupts_dw0_4_IRQHandler ; CPUSS DataWire #0, Channel #4 + DCD cpuss_interrupts_dw0_5_IRQHandler ; CPUSS DataWire #0, Channel #5 + DCD cpuss_interrupts_dw0_6_IRQHandler ; CPUSS DataWire #0, Channel #6 + DCD cpuss_interrupts_dw0_7_IRQHandler ; CPUSS DataWire #0, Channel #7 + DCD cpuss_interrupts_dw0_8_IRQHandler ; CPUSS DataWire #0, Channel #8 + DCD cpuss_interrupts_dw0_9_IRQHandler ; CPUSS DataWire #0, Channel #9 + DCD cpuss_interrupts_dw0_10_IRQHandler ; CPUSS DataWire #0, Channel #10 + DCD cpuss_interrupts_dw0_11_IRQHandler ; CPUSS DataWire #0, Channel #11 + DCD cpuss_interrupts_dw0_12_IRQHandler ; CPUSS DataWire #0, Channel #12 + DCD cpuss_interrupts_dw0_13_IRQHandler ; CPUSS DataWire #0, Channel #13 + DCD cpuss_interrupts_dw0_14_IRQHandler ; CPUSS DataWire #0, Channel #14 + DCD cpuss_interrupts_dw0_15_IRQHandler ; CPUSS DataWire #0, Channel #15 + DCD cpuss_interrupts_dw1_0_IRQHandler ; CPUSS DataWire #1, Channel #0 + DCD cpuss_interrupts_dw1_1_IRQHandler ; CPUSS DataWire #1, Channel #1 + DCD cpuss_interrupts_dw1_2_IRQHandler ; CPUSS DataWire #1, Channel #2 + DCD cpuss_interrupts_dw1_3_IRQHandler ; CPUSS DataWire #1, Channel #3 + DCD cpuss_interrupts_dw1_4_IRQHandler ; CPUSS DataWire #1, Channel #4 + DCD cpuss_interrupts_dw1_5_IRQHandler ; CPUSS DataWire #1, Channel #5 + DCD cpuss_interrupts_dw1_6_IRQHandler ; CPUSS DataWire #1, Channel #6 + DCD cpuss_interrupts_dw1_7_IRQHandler ; CPUSS DataWire #1, Channel #7 + DCD cpuss_interrupts_dw1_8_IRQHandler ; CPUSS DataWire #1, Channel #8 + DCD cpuss_interrupts_dw1_9_IRQHandler ; CPUSS DataWire #1, Channel #9 + DCD cpuss_interrupts_dw1_10_IRQHandler ; CPUSS DataWire #1, Channel #10 + DCD cpuss_interrupts_dw1_11_IRQHandler ; CPUSS DataWire #1, Channel #11 + DCD cpuss_interrupts_dw1_12_IRQHandler ; CPUSS DataWire #1, Channel #12 + DCD cpuss_interrupts_dw1_13_IRQHandler ; CPUSS DataWire #1, Channel #13 + DCD cpuss_interrupts_dw1_14_IRQHandler ; CPUSS DataWire #1, Channel #14 + DCD cpuss_interrupts_dw1_15_IRQHandler ; CPUSS DataWire #1, Channel #15 + DCD cpuss_interrupts_fault_0_IRQHandler ; CPUSS Fault Structure Interrupt #0 + DCD cpuss_interrupts_fault_1_IRQHandler ; CPUSS Fault Structure Interrupt #1 + DCD cpuss_interrupt_crypto_IRQHandler ; CRYPTO Accelerator Interrupt + DCD cpuss_interrupt_fm_IRQHandler ; FLASH Macro Interrupt + DCD cpuss_interrupts_cm0_cti_0_IRQHandler ; CM0+ CTI #0 + DCD cpuss_interrupts_cm0_cti_1_IRQHandler ; CM0+ CTI #1 + DCD cpuss_interrupts_cm4_cti_0_IRQHandler ; CM4 CTI #0 + DCD cpuss_interrupts_cm4_cti_1_IRQHandler ; CM4 CTI #1 + DCD tcpwm_0_interrupts_0_IRQHandler ; TCPWM #0, Counter #0 + DCD tcpwm_0_interrupts_1_IRQHandler ; TCPWM #0, Counter #1 + DCD tcpwm_0_interrupts_2_IRQHandler ; TCPWM #0, Counter #2 + DCD tcpwm_0_interrupts_3_IRQHandler ; TCPWM #0, Counter #3 + DCD tcpwm_0_interrupts_4_IRQHandler ; TCPWM #0, Counter #4 + DCD tcpwm_0_interrupts_5_IRQHandler ; TCPWM #0, Counter #5 + DCD tcpwm_0_interrupts_6_IRQHandler ; TCPWM #0, Counter #6 + DCD tcpwm_0_interrupts_7_IRQHandler ; TCPWM #0, Counter #7 + DCD tcpwm_1_interrupts_0_IRQHandler ; TCPWM #1, Counter #0 + DCD tcpwm_1_interrupts_1_IRQHandler ; TCPWM #1, Counter #1 + DCD tcpwm_1_interrupts_2_IRQHandler ; TCPWM #1, Counter #2 + DCD tcpwm_1_interrupts_3_IRQHandler ; TCPWM #1, Counter #3 + DCD tcpwm_1_interrupts_4_IRQHandler ; TCPWM #1, Counter #4 + DCD tcpwm_1_interrupts_5_IRQHandler ; TCPWM #1, Counter #5 + DCD tcpwm_1_interrupts_6_IRQHandler ; TCPWM #1, Counter #6 + DCD tcpwm_1_interrupts_7_IRQHandler ; TCPWM #1, Counter #7 + DCD tcpwm_1_interrupts_8_IRQHandler ; TCPWM #1, Counter #8 + DCD tcpwm_1_interrupts_9_IRQHandler ; TCPWM #1, Counter #9 + DCD tcpwm_1_interrupts_10_IRQHandler ; TCPWM #1, Counter #10 + DCD tcpwm_1_interrupts_11_IRQHandler ; TCPWM #1, Counter #11 + DCD tcpwm_1_interrupts_12_IRQHandler ; TCPWM #1, Counter #12 + DCD tcpwm_1_interrupts_13_IRQHandler ; TCPWM #1, Counter #13 + DCD tcpwm_1_interrupts_14_IRQHandler ; TCPWM #1, Counter #14 + DCD tcpwm_1_interrupts_15_IRQHandler ; TCPWM #1, Counter #15 + DCD tcpwm_1_interrupts_16_IRQHandler ; TCPWM #1, Counter #16 + DCD tcpwm_1_interrupts_17_IRQHandler ; TCPWM #1, Counter #17 + DCD tcpwm_1_interrupts_18_IRQHandler ; TCPWM #1, Counter #18 + DCD tcpwm_1_interrupts_19_IRQHandler ; TCPWM #1, Counter #19 + DCD tcpwm_1_interrupts_20_IRQHandler ; TCPWM #1, Counter #20 + DCD tcpwm_1_interrupts_21_IRQHandler ; TCPWM #1, Counter #21 + DCD tcpwm_1_interrupts_22_IRQHandler ; TCPWM #1, Counter #22 + DCD tcpwm_1_interrupts_23_IRQHandler ; TCPWM #1, Counter #23 + DCD udb_interrupts_0_IRQHandler ; UDB Interrupt #0 + DCD udb_interrupts_1_IRQHandler ; UDB Interrupt #1 + DCD udb_interrupts_2_IRQHandler ; UDB Interrupt #2 + DCD udb_interrupts_3_IRQHandler ; UDB Interrupt #3 + DCD udb_interrupts_4_IRQHandler ; UDB Interrupt #4 + DCD udb_interrupts_5_IRQHandler ; UDB Interrupt #5 + DCD udb_interrupts_6_IRQHandler ; UDB Interrupt #6 + DCD udb_interrupts_7_IRQHandler ; UDB Interrupt #7 + DCD udb_interrupts_8_IRQHandler ; UDB Interrupt #8 + DCD udb_interrupts_9_IRQHandler ; UDB Interrupt #9 + DCD udb_interrupts_10_IRQHandler ; UDB Interrupt #10 + DCD udb_interrupts_11_IRQHandler ; UDB Interrupt #11 + DCD udb_interrupts_12_IRQHandler ; UDB Interrupt #12 + DCD udb_interrupts_13_IRQHandler ; UDB Interrupt #13 + DCD udb_interrupts_14_IRQHandler ; UDB Interrupt #14 + DCD udb_interrupts_15_IRQHandler ; UDB Interrupt #15 + DCD pass_interrupt_sar_IRQHandler ; SAR ADC interrupt + DCD audioss_interrupt_i2s_IRQHandler ; I2S Audio interrupt + DCD audioss_interrupt_pdm_IRQHandler ; PDM/PCM Audio interrupt + DCD profile_interrupt_IRQHandler ; Energy Profiler interrupt + DCD smif_interrupt_IRQHandler ; Serial Memory Interface interrupt + DCD usb_interrupt_hi_IRQHandler ; USB Interrupt + DCD usb_interrupt_med_IRQHandler ; USB Interrupt + DCD usb_interrupt_lo_IRQHandler ; USB Interrupt + DCD pass_interrupt_dacs_IRQHandler ; Consolidated interrrupt for all DACs + +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + EXPORT __ramVectors + AREA RESET_RAM, READWRITE, NOINIT +__ramVectors SPACE __Vectors_Size + + + AREA |.text|, CODE, READONLY + + +; Weak function for startup customization +; +; Note. The global resources are not yet initialized (for example global variables, peripherals, clocks) +; because this function is executed as the first instruction in the ResetHandler. +; The PDL is also not initialized to use the proper register offsets. +; The user of this function is responsible for initializing the PDL and resources before using them. +; +Cy_OnResetUser PROC + EXPORT Cy_OnResetUser [WEAK] + BX LR + ENDP + + +; Reset Handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT Cy_SystemInitFpuEnable + IMPORT __main + + ; Define strong function for startup customization + BL Cy_OnResetUser + + ; Disable global interrupts + CPSID I + + ; Copy vectors from ROM to RAM + LDR r1, =__Vectors + LDR r0, =__ramVectors + LDR r2, =__Vectors_Size +Vectors_Copy + LDR r3, [r1] + STR r3, [r0] + ADDS r0, r0, #4 + ADDS r1, r1, #4 + SUBS r2, r2, #1 + CMP r2, #0 + BNE Vectors_Copy + + ; Update Vector Table Offset Register. */ + LDR r0, =__ramVectors + LDR r1, =0xE000ED08 + STR r0, [r1] + dsb 0xF + + ; Enable the FPU if used + LDR R0, =Cy_SystemInitFpuEnable + BLX R0 + + LDR R0, =__main + BLX R0 + + ; Should never get here + B . + + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP + +Cy_SysLib_FaultHandler PROC + EXPORT Cy_SysLib_FaultHandler [WEAK] + B . + ENDP +HardFault_Wrapper\ + PROC + EXPORT HardFault_Wrapper [WEAK] + movs r0, #4 + mov r1, LR + tst r0, r1 + beq L_MSP + mrs r0, PSP + bl L_API_call +L_MSP + mrs r0, MSP +L_API_call + bl Cy_SysLib_FaultHandler + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B HardFault_Wrapper + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B HardFault_Wrapper + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B HardFault_Wrapper + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B HardFault_Wrapper + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + EXPORT Default_Handler [WEAK] + EXPORT ioss_interrupts_gpio_0_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_1_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_2_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_3_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_4_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_5_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_6_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_7_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_8_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_9_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_10_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_11_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_12_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_13_IRQHandler [WEAK] + EXPORT ioss_interrupts_gpio_14_IRQHandler [WEAK] + EXPORT ioss_interrupt_gpio_IRQHandler [WEAK] + EXPORT ioss_interrupt_vdd_IRQHandler [WEAK] + EXPORT lpcomp_interrupt_IRQHandler [WEAK] + EXPORT scb_8_interrupt_IRQHandler [WEAK] + EXPORT srss_interrupt_mcwdt_0_IRQHandler [WEAK] + EXPORT srss_interrupt_mcwdt_1_IRQHandler [WEAK] + EXPORT srss_interrupt_backup_IRQHandler [WEAK] + EXPORT srss_interrupt_IRQHandler [WEAK] + EXPORT pass_interrupt_ctbs_IRQHandler [WEAK] + EXPORT bless_interrupt_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_0_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_1_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_2_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_3_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_4_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_5_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_6_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_7_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_8_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_9_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_10_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_11_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_12_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_13_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_14_IRQHandler [WEAK] + EXPORT cpuss_interrupts_ipc_15_IRQHandler [WEAK] + EXPORT scb_0_interrupt_IRQHandler [WEAK] + EXPORT scb_1_interrupt_IRQHandler [WEAK] + EXPORT scb_2_interrupt_IRQHandler [WEAK] + EXPORT scb_3_interrupt_IRQHandler [WEAK] + EXPORT scb_4_interrupt_IRQHandler [WEAK] + EXPORT scb_5_interrupt_IRQHandler [WEAK] + EXPORT scb_6_interrupt_IRQHandler [WEAK] + EXPORT scb_7_interrupt_IRQHandler [WEAK] + EXPORT csd_interrupt_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_0_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_1_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_2_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_3_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_4_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_5_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_6_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_7_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_8_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_9_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_10_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_11_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_12_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_13_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_14_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw0_15_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_0_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_1_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_2_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_3_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_4_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_5_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_6_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_7_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_8_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_9_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_10_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_11_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_12_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_13_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_14_IRQHandler [WEAK] + EXPORT cpuss_interrupts_dw1_15_IRQHandler [WEAK] + EXPORT cpuss_interrupts_fault_0_IRQHandler [WEAK] + EXPORT cpuss_interrupts_fault_1_IRQHandler [WEAK] + EXPORT cpuss_interrupt_crypto_IRQHandler [WEAK] + EXPORT cpuss_interrupt_fm_IRQHandler [WEAK] + EXPORT cpuss_interrupts_cm0_cti_0_IRQHandler [WEAK] + EXPORT cpuss_interrupts_cm0_cti_1_IRQHandler [WEAK] + EXPORT cpuss_interrupts_cm4_cti_0_IRQHandler [WEAK] + EXPORT cpuss_interrupts_cm4_cti_1_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_0_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_1_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_2_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_3_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_4_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_5_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_6_IRQHandler [WEAK] + EXPORT tcpwm_0_interrupts_7_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_0_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_1_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_2_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_3_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_4_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_5_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_6_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_7_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_8_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_9_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_10_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_11_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_12_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_13_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_14_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_15_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_16_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_17_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_18_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_19_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_20_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_21_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_22_IRQHandler [WEAK] + EXPORT tcpwm_1_interrupts_23_IRQHandler [WEAK] + EXPORT udb_interrupts_0_IRQHandler [WEAK] + EXPORT udb_interrupts_1_IRQHandler [WEAK] + EXPORT udb_interrupts_2_IRQHandler [WEAK] + EXPORT udb_interrupts_3_IRQHandler [WEAK] + EXPORT udb_interrupts_4_IRQHandler [WEAK] + EXPORT udb_interrupts_5_IRQHandler [WEAK] + EXPORT udb_interrupts_6_IRQHandler [WEAK] + EXPORT udb_interrupts_7_IRQHandler [WEAK] + EXPORT udb_interrupts_8_IRQHandler [WEAK] + EXPORT udb_interrupts_9_IRQHandler [WEAK] + EXPORT udb_interrupts_10_IRQHandler [WEAK] + EXPORT udb_interrupts_11_IRQHandler [WEAK] + EXPORT udb_interrupts_12_IRQHandler [WEAK] + EXPORT udb_interrupts_13_IRQHandler [WEAK] + EXPORT udb_interrupts_14_IRQHandler [WEAK] + EXPORT udb_interrupts_15_IRQHandler [WEAK] + EXPORT pass_interrupt_sar_IRQHandler [WEAK] + EXPORT audioss_interrupt_i2s_IRQHandler [WEAK] + EXPORT audioss_interrupt_pdm_IRQHandler [WEAK] + EXPORT profile_interrupt_IRQHandler [WEAK] + EXPORT smif_interrupt_IRQHandler [WEAK] + EXPORT usb_interrupt_hi_IRQHandler [WEAK] + EXPORT usb_interrupt_med_IRQHandler [WEAK] + EXPORT usb_interrupt_lo_IRQHandler [WEAK] + EXPORT pass_interrupt_dacs_IRQHandler [WEAK] + +ioss_interrupts_gpio_0_IRQHandler +ioss_interrupts_gpio_1_IRQHandler +ioss_interrupts_gpio_2_IRQHandler +ioss_interrupts_gpio_3_IRQHandler +ioss_interrupts_gpio_4_IRQHandler +ioss_interrupts_gpio_5_IRQHandler +ioss_interrupts_gpio_6_IRQHandler +ioss_interrupts_gpio_7_IRQHandler +ioss_interrupts_gpio_8_IRQHandler +ioss_interrupts_gpio_9_IRQHandler +ioss_interrupts_gpio_10_IRQHandler +ioss_interrupts_gpio_11_IRQHandler +ioss_interrupts_gpio_12_IRQHandler +ioss_interrupts_gpio_13_IRQHandler +ioss_interrupts_gpio_14_IRQHandler +ioss_interrupt_gpio_IRQHandler +ioss_interrupt_vdd_IRQHandler +lpcomp_interrupt_IRQHandler +scb_8_interrupt_IRQHandler +srss_interrupt_mcwdt_0_IRQHandler +srss_interrupt_mcwdt_1_IRQHandler +srss_interrupt_backup_IRQHandler +srss_interrupt_IRQHandler +pass_interrupt_ctbs_IRQHandler +bless_interrupt_IRQHandler +cpuss_interrupts_ipc_0_IRQHandler +cpuss_interrupts_ipc_1_IRQHandler +cpuss_interrupts_ipc_2_IRQHandler +cpuss_interrupts_ipc_3_IRQHandler +cpuss_interrupts_ipc_4_IRQHandler +cpuss_interrupts_ipc_5_IRQHandler +cpuss_interrupts_ipc_6_IRQHandler +cpuss_interrupts_ipc_7_IRQHandler +cpuss_interrupts_ipc_8_IRQHandler +cpuss_interrupts_ipc_9_IRQHandler +cpuss_interrupts_ipc_10_IRQHandler +cpuss_interrupts_ipc_11_IRQHandler +cpuss_interrupts_ipc_12_IRQHandler +cpuss_interrupts_ipc_13_IRQHandler +cpuss_interrupts_ipc_14_IRQHandler +cpuss_interrupts_ipc_15_IRQHandler +scb_0_interrupt_IRQHandler +scb_1_interrupt_IRQHandler +scb_2_interrupt_IRQHandler +scb_3_interrupt_IRQHandler +scb_4_interrupt_IRQHandler +scb_5_interrupt_IRQHandler +scb_6_interrupt_IRQHandler +scb_7_interrupt_IRQHandler +csd_interrupt_IRQHandler +cpuss_interrupts_dw0_0_IRQHandler +cpuss_interrupts_dw0_1_IRQHandler +cpuss_interrupts_dw0_2_IRQHandler +cpuss_interrupts_dw0_3_IRQHandler +cpuss_interrupts_dw0_4_IRQHandler +cpuss_interrupts_dw0_5_IRQHandler +cpuss_interrupts_dw0_6_IRQHandler +cpuss_interrupts_dw0_7_IRQHandler +cpuss_interrupts_dw0_8_IRQHandler +cpuss_interrupts_dw0_9_IRQHandler +cpuss_interrupts_dw0_10_IRQHandler +cpuss_interrupts_dw0_11_IRQHandler +cpuss_interrupts_dw0_12_IRQHandler +cpuss_interrupts_dw0_13_IRQHandler +cpuss_interrupts_dw0_14_IRQHandler +cpuss_interrupts_dw0_15_IRQHandler +cpuss_interrupts_dw1_0_IRQHandler +cpuss_interrupts_dw1_1_IRQHandler +cpuss_interrupts_dw1_2_IRQHandler +cpuss_interrupts_dw1_3_IRQHandler +cpuss_interrupts_dw1_4_IRQHandler +cpuss_interrupts_dw1_5_IRQHandler +cpuss_interrupts_dw1_6_IRQHandler +cpuss_interrupts_dw1_7_IRQHandler +cpuss_interrupts_dw1_8_IRQHandler +cpuss_interrupts_dw1_9_IRQHandler +cpuss_interrupts_dw1_10_IRQHandler +cpuss_interrupts_dw1_11_IRQHandler +cpuss_interrupts_dw1_12_IRQHandler +cpuss_interrupts_dw1_13_IRQHandler +cpuss_interrupts_dw1_14_IRQHandler +cpuss_interrupts_dw1_15_IRQHandler +cpuss_interrupts_fault_0_IRQHandler +cpuss_interrupts_fault_1_IRQHandler +cpuss_interrupt_crypto_IRQHandler +cpuss_interrupt_fm_IRQHandler +cpuss_interrupts_cm0_cti_0_IRQHandler +cpuss_interrupts_cm0_cti_1_IRQHandler +cpuss_interrupts_cm4_cti_0_IRQHandler +cpuss_interrupts_cm4_cti_1_IRQHandler +tcpwm_0_interrupts_0_IRQHandler +tcpwm_0_interrupts_1_IRQHandler +tcpwm_0_interrupts_2_IRQHandler +tcpwm_0_interrupts_3_IRQHandler +tcpwm_0_interrupts_4_IRQHandler +tcpwm_0_interrupts_5_IRQHandler +tcpwm_0_interrupts_6_IRQHandler +tcpwm_0_interrupts_7_IRQHandler +tcpwm_1_interrupts_0_IRQHandler +tcpwm_1_interrupts_1_IRQHandler +tcpwm_1_interrupts_2_IRQHandler +tcpwm_1_interrupts_3_IRQHandler +tcpwm_1_interrupts_4_IRQHandler +tcpwm_1_interrupts_5_IRQHandler +tcpwm_1_interrupts_6_IRQHandler +tcpwm_1_interrupts_7_IRQHandler +tcpwm_1_interrupts_8_IRQHandler +tcpwm_1_interrupts_9_IRQHandler +tcpwm_1_interrupts_10_IRQHandler +tcpwm_1_interrupts_11_IRQHandler +tcpwm_1_interrupts_12_IRQHandler +tcpwm_1_interrupts_13_IRQHandler +tcpwm_1_interrupts_14_IRQHandler +tcpwm_1_interrupts_15_IRQHandler +tcpwm_1_interrupts_16_IRQHandler +tcpwm_1_interrupts_17_IRQHandler +tcpwm_1_interrupts_18_IRQHandler +tcpwm_1_interrupts_19_IRQHandler +tcpwm_1_interrupts_20_IRQHandler +tcpwm_1_interrupts_21_IRQHandler +tcpwm_1_interrupts_22_IRQHandler +tcpwm_1_interrupts_23_IRQHandler +udb_interrupts_0_IRQHandler +udb_interrupts_1_IRQHandler +udb_interrupts_2_IRQHandler +udb_interrupts_3_IRQHandler +udb_interrupts_4_IRQHandler +udb_interrupts_5_IRQHandler +udb_interrupts_6_IRQHandler +udb_interrupts_7_IRQHandler +udb_interrupts_8_IRQHandler +udb_interrupts_9_IRQHandler +udb_interrupts_10_IRQHandler +udb_interrupts_11_IRQHandler +udb_interrupts_12_IRQHandler +udb_interrupts_13_IRQHandler +udb_interrupts_14_IRQHandler +udb_interrupts_15_IRQHandler +pass_interrupt_sar_IRQHandler +audioss_interrupt_i2s_IRQHandler +audioss_interrupt_pdm_IRQHandler +profile_interrupt_IRQHandler +smif_interrupt_IRQHandler +usb_interrupt_hi_IRQHandler +usb_interrupt_med_IRQHandler +usb_interrupt_lo_IRQHandler +pass_interrupt_dacs_IRQHandler + + B . + ENDP + + ALIGN + + +; User Initial Stack & Heap + + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap PROC + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + ENDP + + ALIGN + + ENDIF + + END + + +; [] END OF FILE diff --git a/2020TPCAppNoDFU.cydsn/stdio_user.c b/2020TPCAppNoDFU.cydsn/stdio_user.c new file mode 100644 index 0000000..077d110 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/stdio_user.c @@ -0,0 +1,65 @@ +/***************************************************************************//** +* \file stdio_user.c +* \version 1.20 +* +* \brief +* This file provides low level function implementation to retarget +* I/O functions of the standard C run-time library. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include "stdio_user.h" + +#if defined (IO_STDOUT_ENABLE) && defined (IO_STDOUT_UART) +/******************************************************************************* +* Function Name: STDIO_PutChar +******************************************************************************** +* +* This function outputs a character through user defined target. +* Note: this is a template function which may be overwritten by the USER in order +* to change the target used in redirecting STDOUT stream. +* +* \param ch +* The character to send. +* +*******************************************************************************/ +void STDIO_PutChar(uint32_t ch) +{ + /* Place the call to your function here. */ + while(0U == Cy_SCB_UART_Put(IO_STDOUT_UART, ch)) + { + /* Wait until FIFO is full */ + } +} +#endif /* IO_STDOUT_ENABLE && IO_STDOUT_UART */ + +#if defined (IO_STDIN_ENABLE) && defined (IO_STDIN_UART) +/******************************************************************************* +* Function Name: STDIO_GetChar +******************************************************************************** +* +* This function retrieves STDIN from a user specified input source. +* Note: this is a template function which may be overwritten by the USER in order +* to change the target used in redirecting STDIN stream. +* +* \return +* The received character. +* +*******************************************************************************/ +uint32_t STDIO_GetChar(void) +{ + /* Place the call to your function here. */ + while(0UL == Cy_SCB_UART_GetNumInRxFifo(IO_STDIN_UART)) + { + } + return (Cy_SCB_UART_Get(IO_STDIN_UART)); +} +#endif /* IO_STDIN_ENABLE && IO_STDIN_UART */ + +/* [] END OF FILE */ diff --git a/2020TPCAppNoDFU.cydsn/stdio_user.h b/2020TPCAppNoDFU.cydsn/stdio_user.h new file mode 100644 index 0000000..a4c3bc1 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/stdio_user.h @@ -0,0 +1,200 @@ +/***************************************************************************//** +* \file stdio_user.h +* \version 1.20 +* +* \brief +* This file provides configuration macros and function prototypes to retarget +* I/O functions of the standard C run-time library. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#ifndef STDIO_USER_H +#define STDIO_USER_H +/** +* \addtogroup group_retarget_io +* \{ +* Retarget the I/O functions of the standard C run-time library to the user-defined target. +* +* Application code frequently uses standard I/O library functions, such as +* scanf()/printf() to perform input/output operations. This utility allows you to retarget +* standard C run-time library I/O functions to the user-defined target. +* +*

Design

+* The file retarget.c defines functions that replace weakly linked I/O functions +* in the standard library (i.e. _write() and _read()). The functions in +* retarget.c in turn call the STDIO_PutChar() and STDIO_GetChar() +* implemented in stdio_user.c. +* +*

Use

+* The files for this utility are in this folder: +* \/utilities/retarget_io +* +* The first thing you need to do is add the source files to your project. +* +* For a 3rd Party IDE, add the retarget_io folder to your list of include +* paths and add the files retarget.c and stdio_user.c to your project. +* +* For PSoC Creator, create a PSoC Creator project. Then click +* Project > Build Setting > Peripheral Driver Library. To +* add Retarget I/O source files to your project, enable it as shown on the +* screenshot below. After selecting Retarget I/O in the PDL software package +* list, click OK and build the project. The Retarget I/O source files are +* added to your project and are available for modification. +* ![Figure 1. Build Settings dialog in PSoC Creator](retarget_io_build_settings.png) +* +* For ModusToolbox, create or open existing ModusToolbox project. Open +* Middleware Selector (Project > ModusToolbox Middleware Selector), +* select Retarget I/O item, and click OK (see the screenshot below). +* The Retarget I/O source files are added to your project and are available for +* modification. +* ![Figure 2. Middleware Selector dialog in ModusToolbox](retarget_io_middleware_selector.png) +* +* There are multiple serial communication blocks (SCB) available. By default +* the Retarget I/O files use SCB0. The stdio_user.h file defines these macros: +* \code #define IO_STDOUT_UART SCB0 +* #define IO_STDIN_UART SCB0 \endcode +* +* Modify these macros to use the SCB in your design. Standard library I/O +* calls are then retargeted to that SCB. +* +* If you use PSoC Creator, the code generator creates a symbol UART_HW +* to represent the SCB block used in your design. In this case you can +* include "project.h" to access that symbol, and modify the macros like this: +* \code #define IO_STDOUT_UART UART_HW +* #define IO_STDIN_UART UART_HW \endcode +* +* The functions implemented in retarget.c are weakly linked. If you wish +* to modify those functions, you can write your own implementation, and +* not use stdio_user.c at all. +* +* \note The standard library is not standard in how it treats an I/O stream. +* Some implement a data buffer by default. The buffer is not flushed until +* it is full. In that case it may appear that your I/O is not working. You +* should be aware of how the library buffers data, and you should identify +* a buffering strategy and buffer size for a specified stream. If you +* supply a buffer, it must exist until the stream is closed. The following +* line of code disables the buffer for the standard library that +* accompanies the GCC compiler: +* \code setvbuf( stdin, NULL, _IONBF, 0 ); \endcode +* +* +*

MISRA-C Compliance

+* The Retarget IO utility has the following specific deviations: +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
5.6ANo identifier in one name space should have the same spelling +* as an identifier in another name space, with the exception of +* structure member and union member names.Violated since the utility redefines the function declared in standard +* library.
6.3Atypedefs that indicate size and signedness should be used in +* place of the basic numerical type.Basic numerical types are used to match the definition of the +* function with the prototype defined in the standard library.
8.8RAn external object or function shall be declared in one and only one file.The _write is declared in the standard i/o library with +* weak attribute and is redefined in the utility.
14.2RAll non-null statements shall either:
(a) have at least one +* side-effect however executed, or
(b) cause control flow to change.
The unused function parameters are cast to void. This statement +* has no side-effect and is used to suppress a compiler warning.
20.9RThe input/output library shall not be used in +* production code.stdio.h file is included to connect the standard function +* definition with their declaration in the standard library.
+* +*

Changelog

+* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
VersionChangesReason for Change
1.20Changed include path for cy_scb_uart.h to reflect the PDL source code structure
1.10Added STDIN support
1.0Initial version
+* \} +*/ +#include +#include "cy_device_headers.h" + +/* Must remain uncommented to use this utility */ +#define IO_STDOUT_ENABLE +#define IO_STDIN_ENABLE +#define IO_STDOUT_UART UART_Console_HW +#define IO_STDIN_UART UART_Console_HW + +#if defined(IO_STDOUT_ENABLE) || defined(IO_STDIN_ENABLE) +#if defined(IO_STDOUT_UART) || defined(IO_STDIN_UART) +#include "cy_scb_uart.h" +#endif /* IO_STDOUT_UART || IO_STDIN_UART */ +#endif /* IO_STDOUT_ENABLE || IO_STDIN_ENABLE */ + +/* Controls whether CR is added for LF */ +#ifndef STDOUT_CR_LF +#define STDOUT_CR_LF 0 +#endif /* STDOUT_CR_LF */ + +#if defined(__cplusplus) +extern "C" { +#endif + +#if defined (IO_STDOUT_ENABLE) && defined (IO_STDOUT_UART) +void STDIO_PutChar(uint32_t ch); +#endif /* IO_STDOUT_ENABLE && IO_STDOUT_UART */ + +#if defined (IO_STDIN_ENABLE) && defined (IO_STDIN_UART) +uint32_t STDIO_GetChar(void); +#endif /* IO_STDIN_ENABLE && IO_STDIN_UART */ + +#if defined(__cplusplus) +} +#endif + +#endif /* STDIO_USER_H */ + + +/* [] END OF FILE */ diff --git a/2020TPCAppNoDFU.cydsn/system_psoc6.h b/2020TPCAppNoDFU.cydsn/system_psoc6.h new file mode 100644 index 0000000..73d1263 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/system_psoc6.h @@ -0,0 +1,648 @@ +/***************************************************************************//** +* \file system_psoc6.h +* \version 2.20 +* +* \brief Device system header file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + + +#ifndef _SYSTEM_PSOC6_H_ +#define _SYSTEM_PSOC6_H_ + +/** +* \addtogroup group_system_config +* \{ +* Provides device startup, system configuration, and linker script files. +* The system startup provides the followings features: +* - See \ref group_system_config_device_initialization for the: +* * \ref group_system_config_dual_core_device_initialization +* * \ref group_system_config_single_core_device_initialization +* - \ref group_system_config_device_memory_definition +* - \ref group_system_config_heap_stack_config +* - \ref group_system_config_merge_apps +* - \ref group_system_config_default_handlers +* - \ref group_system_config_device_vector_table +* - \ref group_system_config_cm4_functions +* +* \section group_system_config_configuration Configuration Considerations +* +* \subsection group_system_config_device_memory_definition Device Memory Definition +* The flash and RAM allocation for each CPU is defined by the linker scripts. +* For dual-core devices, the physical flash and RAM memory is shared between the CPU cores. +* 2 KB of RAM (allocated at the end of RAM) are reserved for system use. +* For Single-Core devices the system reserves additional 80 bytes of RAM. +* Using the reserved memory area for other purposes will lead to unexpected behavior. +* +* \note The linker files provided with the PDL are generic and handle all common +* use cases. Your project may not use every section defined in the linker files. +* In that case you may see warnings during the build process. To eliminate build +* warnings in your project, you can simply comment out or remove the relevant +* code in the linker file. +* +* ARM GCC\n +* The flash and RAM sections for the CPU are defined in the linker files: +* 'xx_yy.ld', where 'xx' is the device group, and 'yy' is the target CPU; for example, +* 'cy8c6xx7_cm0plus.ld' and 'cy8c6xx7_cm4_dual.ld'. +* \note If the start of the Cortex-M4 application image is changed, the value +* of the of the \ref CY_CORTEX_M4_APPL_ADDR should also be changed. The +* \ref CY_CORTEX_M4_APPL_ADDR macro should be used as the parameter for the +* Cy_SysEnableCM4() function call. +* +* Change the flash and RAM sizes by editing the macros value in the +* linker files for both CPUs: +* - 'xx_cm0plus.ld', where 'xx' is the device group: +* \code +* flash (rx) : ORIGIN = 0x10000000, LENGTH = 0x00080000 +* ram (rwx) : ORIGIN = 0x08000000, LENGTH = 0x00024000 +* \endcode +* - 'xx_cm4_dual.ld', where 'xx' is the device group: +* \code +* flash (rx) : ORIGIN = 0x10080000, LENGTH = 0x00080000 +* ram (rwx) : ORIGIN = 0x08024000, LENGTH = 0x00023800 +* \endcode +* +* Change the value of the \ref CY_CORTEX_M4_APPL_ADDR macro to the rom ORIGIN's +* value in the 'xx_cm4_dual.ld' file, where 'xx' is the device group. Do this +* by either: +* - Passing the following commands to the compiler:\n +* \code -D CY_CORTEX_M4_APPL_ADDR=0x10080000 \endcode +* - Editing the \ref CY_CORTEX_M4_APPL_ADDR value in the 'system_xx.h', where 'xx' is device family:\n +* \code #define CY_CORTEX_M4_APPL_ADDR (0x10080000u) \endcode +* +* ARM MDK\n +* The flash and RAM sections for the CPU are defined in the linker files: +* 'xx_yy.scat', where 'xx' is the device group, and 'yy' is the target CPU; for example, +* 'cy8c6xx7_cm0plus.scat' and 'cy8c6xx7_cm4_dual.scat'. +* \note If the start of the Cortex-M4 application image is changed, the value +* of the of the \ref CY_CORTEX_M4_APPL_ADDR should also be changed. The +* \ref CY_CORTEX_M4_APPL_ADDR macro should be used as the parameter for the \ref +* Cy_SysEnableCM4() function call. +* +* \note The linker files provided with the PDL are generic and handle all common +* use cases. Your project may not use every section defined in the linker files. +* In that case you may see the warnings during the build process: +* L6314W (no section matches pattern) and/or L6329W +* (pattern only matches removed unused sections). In your project, you can +* suppress the warning by passing the "--diag_suppress=L6314W,L6329W" option to +* the linker. You can also comment out or remove the relevant code in the linker +* file. +* +* Change the flash and RAM sizes by editing the macros value in the +* linker files for both CPUs: +* - 'xx_cm0plus.scat', where 'xx' is the device group: +* \code +* #define FLASH_START 0x10000000 +* #define FLASH_SIZE 0x00080000 +* #define RAM_START 0x08000000 +* #define RAM_SIZE 0x00024000 +* \endcode +* - 'xx_cm4_dual.scat', where 'xx' is the device group: +* \code +* #define FLASH_START 0x10080000 +* #define FLASH_SIZE 0x00080000 +* #define RAM_START 0x08024000 +* #define RAM_SIZE 0x00023800 +* \endcode +* +* Change the value of the \ref CY_CORTEX_M4_APPL_ADDR macro to the FLASH_START +* value in the 'xx_cm4_dual.scat' file, +* where 'xx' is the device group. Do this by either: +* - Passing the following commands to the compiler:\n +* \code -D CY_CORTEX_M4_APPL_ADDR=0x10080000 \endcode +* - Editing the \ref CY_CORTEX_M4_APPL_ADDR value in the 'system_xx.h', where +* 'xx' is device family:\n +* \code #define CY_CORTEX_M4_APPL_ADDR (0x10080000u) \endcode +* +* IAR\n +* The flash and RAM sections for the CPU are defined in the linker files: +* 'xx_yy.icf', where 'xx' is the device group, and 'yy' is the target CPU; for example, +* 'cy8c6xx7_cm0plus.icf' and 'cy8c6xx7_cm4_dual.icf'. +* \note If the start of the Cortex-M4 application image is changed, the value +* of the of the \ref CY_CORTEX_M4_APPL_ADDR should also be changed. The +* \ref CY_CORTEX_M4_APPL_ADDR macro should be used as the parameter for the \ref +* Cy_SysEnableCM4() function call. +* +* Change the flash and RAM sizes by editing the macros value in the +* linker files for both CPUs: +* - 'xx_cm0plus.icf', where 'xx' is the device group: +* \code +* define symbol __ICFEDIT_region_IROM1_start__ = 0x10000000; +* define symbol __ICFEDIT_region_IROM1_end__ = 0x10080000; +* define symbol __ICFEDIT_region_IRAM1_start__ = 0x08000000; +* define symbol __ICFEDIT_region_IRAM1_end__ = 0x08024000; +* \endcode +* - 'xx_cm4_dual.icf', where 'xx' is the device group: +* \code +* define symbol __ICFEDIT_region_IROM1_start__ = 0x10080000; +* define symbol __ICFEDIT_region_IROM1_end__ = 0x10100000; +* define symbol __ICFEDIT_region_IRAM1_start__ = 0x08024000; +* define symbol __ICFEDIT_region_IRAM1_end__ = 0x08047800; +* \endcode +* +* Change the value of the \ref CY_CORTEX_M4_APPL_ADDR macro to the +* __ICFEDIT_region_IROM1_start__ value in the 'xx_cm4_dual.icf' file, where 'xx' +* is the device group. Do this by either: +* - Passing the following commands to the compiler:\n +* \code -D CY_CORTEX_M4_APPL_ADDR=0x10080000 \endcode +* - Editing the \ref CY_CORTEX_M4_APPL_ADDR value in the 'system_xx.h', where +* 'xx' is device family:\n +* \code #define CY_CORTEX_M4_APPL_ADDR (0x10080000u) \endcode +* +* \subsection group_system_config_device_initialization Device Initialization +* After a power-on-reset (POR), the boot process is handled by the boot code +* from the on-chip ROM that is always executed by the Cortex-M0+ core. The boot +* code passes the control to the Cortex-M0+ startup code located in flash. +* +* \subsubsection group_system_config_dual_core_device_initialization Dual-Core Devices +* The Cortex-M0+ startup code performs the device initialization by a call to +* SystemInit() and then calls the main() function. The Cortex-M4 core is disabled +* by default. Enable the core using the \ref Cy_SysEnableCM4() function. +* See \ref group_system_config_cm4_functions for more details. +* \note Startup code executes SystemInit() function for the both Cortex-M0+ and Cortex-M4 cores. +* The function has a separate implementation on each core. +* Both function implementations unlock and disable the WDT. +* Therefore enable the WDT after both cores have been initialized. +* +* \subsubsection group_system_config_single_core_device_initialization Single-Core Devices +* The Cortex-M0+ core is not user-accessible on these devices. In this case the +* Flash Boot handles setup of the CM0+ core and starts the Cortex-M4 core. +* +* \subsection group_system_config_heap_stack_config Heap and Stack Configuration +* There are two ways to adjust heap and stack configurations: +* -# Editing source code files +* -# Specifying via command line +* +* By default, the stack size is set to 0x00001000 and the heap size is set to 0x00000400. +* +* \subsubsection group_system_config_heap_stack_config_gcc ARM GCC +* - Editing source code files\n +* The heap and stack sizes are defined in the assembler startup files +* (e.g. startup_psoc6_01_cm0plus.S and startup_psoc6_01_cm4.S). +* Change the heap and stack sizes by modifying the following lines:\n +* \code .equ Stack_Size, 0x00001000 \endcode +* \code .equ Heap_Size, 0x00000400 \endcode +* +* - Specifying via command line\n +* Change the heap and stack sizes passing the following commands to the compiler:\n +* \code -D __STACK_SIZE=0x000000400 \endcode +* \code -D __HEAP_SIZE=0x000000100 \endcode +* +* \subsubsection group_system_config_heap_stack_config_mdk ARM MDK +* - Editing source code files\n +* The heap and stack sizes are defined in the assembler startup files +* (e.g. startup_psoc6_01_cm0plus.s and startup_psoc6_01_cm4.s). +* Change the heap and stack sizes by modifying the following lines:\n +* \code Stack_Size EQU 0x00001000 \endcode +* \code Heap_Size EQU 0x00000400 \endcode +* +* - Specifying via command line\n +* Change the heap and stack sizes passing the following commands to the assembler:\n +* \code "--predefine=___STACK_SIZE SETA 0x000000400" \endcode +* \code "--predefine=__HEAP_SIZE SETA 0x000000100" \endcode +* +* \subsubsection group_system_config_heap_stack_config_iar IAR +* - Editing source code files\n +* The heap and stack sizes are defined in the linker scatter files: 'xx_yy.icf', +* where 'xx' is the device family, and 'yy' is the target CPU; for example, +* cy8c6xx7_cm0plus.icf and cy8c6xx7_cm4_dual.icf. +* Change the heap and stack sizes by modifying the following lines:\n +* \code Stack_Size EQU 0x00001000 \endcode +* \code Heap_Size EQU 0x00000400 \endcode +* +* - Specifying via command line\n +* Change the heap and stack sizes passing the following commands to the +* linker (including quotation marks):\n +* \code --define_symbol __STACK_SIZE=0x000000400 \endcode +* \code --define_symbol __HEAP_SIZE=0x000000100 \endcode +* +* \subsection group_system_config_merge_apps Merging CM0+ and CM4 Executables +* The CM0+ project and linker script build the CM0+ application image. Similarly, +* the CM4 linker script builds the CM4 application image. Each specifies +* locations, sizes, and contents of sections in memory. See +* \ref group_system_config_device_memory_definition for the symbols and default +* values. +* +* The cymcuelftool is invoked by a post-build command. The precise project +* setting is IDE-specific. +* +* The cymcuelftool combines the two executables. The tool examines the +* executables to ensure that memory regions either do not overlap, or contain +* identical bytes (shared). If there are no problems, it creates a new ELF file +* with the merged image, without changing any of the addresses or data. +* +* \subsection group_system_config_default_handlers Default Interrupt Handlers Definition +* The default interrupt handler functions are defined as weak functions to a dummy +* handler in the startup file. The naming convention for the interrupt handler names +* is _IRQHandler. A default interrupt handler can be overwritten in +* user code by defining the handler function using the same name. For example: +* \code +* void scb_0_interrupt_IRQHandler(void) +*{ +* ... +*} +* \endcode +* +* \subsection group_system_config_device_vector_table Vectors Table Copy from Flash to RAM +* This process uses memory sections defined in the linker script. The startup +* code actually defines the contents of the vector table and performs the copy. +* \subsubsection group_system_config_device_vector_table_gcc ARM GCC +* The linker script file is 'xx_yy.ld', where 'xx' is the device family, and +* 'yy' is the target CPU; for example, cy8c6xx7_cm0plus.ld and cy8c6xx7_cm4_dual.ld. +* It defines sections and locations in memory.\n +* Copy interrupt vectors from flash to RAM: \n +* From: \code LONG (__Vectors) \endcode +* To: \code LONG (__ram_vectors_start__) \endcode +* Size: \code LONG (__Vectors_End - __Vectors) \endcode +* The vector table address (and the vector table itself) are defined in the +* assembler startup files (e.g. startup_psoc6_01_cm0plus.S and startup_psoc6_01_cm4.S). +* The code in these files copies the vector table from Flash to RAM. +* \subsubsection group_system_config_device_vector_table_mdk ARM MDK +* The linker script file is 'xx_yy.scat', where 'xx' is the device family, +* and 'yy' is the target CPU; for example, cy8c6xx7_cm0plus.scat and +* cy8c6xx7_cm4_dual.scat. The linker script specifies that the vector table +* (RESET_RAM) shall be first in the RAM section.\n +* RESET_RAM represents the vector table. It is defined in the assembler startup +* files (e.g. startup_psoc6_01_cm0plus.s and startup_psoc6_01_cm4.s). +* The code in these files copies the vector table from Flash to RAM. +* +* \subsubsection group_system_config_device_vector_table_iar IAR +* The linker script file is 'xx_yy.icf', where 'xx' is the device family, and +* 'yy' is the target CPU; for example, cy8c6xx7_cm0plus.icf and cy8c6xx7_cm4_dual.icf. +* This file defines the .intvec_ram section and its location. +* \code place at start of IRAM1_region { readwrite section .intvec_ram}; \endcode +* The vector table address (and the vector table itself) are defined in the +* assembler startup files (e.g. startup_psoc6_01_cm0plus.s and startup_psoc6_01_cm4.s). +* The code in these files copies the vector table from Flash to RAM. +* +* \section group_system_config_more_information More Information +* Refer to the
PDL User Guide for the +* more details. +* +* \section group_system_config_MISRA MISRA Compliance +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
MISRA RuleRule Class (Required/Advisory)Rule DescriptionDescription of Deviation(s)
2.3RThe character sequence // shall not be used within a comment.The comments provide a useful WEB link to the documentation.
+* +* \section group_system_config_changelog Changelog +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +* +*
VersionChangesReason for Change
2.20Moved the Cy_IPC_SystemSemaInit(), Cy_IPC_SystemPipeInit() functions implementation from IPC to Startup.Changed the IPC driver configuration method from compile time to run time.
2.10Added constructor attribute to SystemInit() function declaration for ARM MDK compiler. \n +* Removed $Sub$$main symbol for ARM MDK compiler. +* uVision Debugger support.
Updated description of the Startup behavior for Single-Core Devices. \n +* Added note about WDT disabling by SystemInit() function. +* Documentation improvement.
2.0Added restoring of FLL registers to the default state in SystemInit() API for single core devices. +* Single core device support. +*
Added Normal Access Restrictions, Public Key, TOC part2 and TOC part2 copy to Supervisory flash linker memory regions. \n +* Renamed 'wflash' memory region to 'em_eeprom'. +* Linker scripts usability improvement.
Added Cy_IPC_SystemSemaInit(), Cy_IPC_SystemPipeInit(), Cy_Flash_Init() functions call to SystemInit() API.Reserved system resources for internal operations.
Added clearing and releasing of IPC structure #7 (reserved for the Deep-Sleep operations) to SystemInit() API.To avoid deadlocks in case of SW or WDT reset during Deep-Sleep entering.
1.0Initial version
+* +* +* \defgroup group_system_config_macro Macro +* \{ +* \defgroup group_system_config_system_macro System +* \defgroup group_system_config_cm4_status_macro Cortex-M4 Status +* \defgroup group_system_config_user_settings_macro User Settings +* \} +* \defgroup group_system_config_functions Functions +* \{ +* \defgroup group_system_config_system_functions System +* \defgroup group_system_config_cm4_functions Cortex-M4 Control +* \} +* \defgroup group_system_config_globals Global Variables +* +* \} +*/ + +/** +* \addtogroup group_system_config_system_functions +* \{ +* \details +* The following system functions implement CMSIS Core functions. +* Refer to the [CMSIS documentation] +* (http://www.keil.com/pack/doc/CMSIS/Core/html/group__system__init__gr.html "System and Clock Configuration") +* for more details. +* \} +*/ + +#ifdef __cplusplus +extern "C" { +#endif + + +/******************************************************************************* +* Include files +*******************************************************************************/ +#include + + +/******************************************************************************* +* Global preprocessor symbols/macros ('define') +*******************************************************************************/ +#if ((defined(__GNUC__) && (__ARM_ARCH == 6) && (__ARM_ARCH_6M__ == 1)) || \ + (defined (__ICCARM__) && (__CORE__ == __ARM6M__)) || \ + (defined(__ARMCC_VERSION) && (__TARGET_ARCH_THUMB == 3))) + #define CY_SYSTEM_CPU_CM0P 1UL +#else + #define CY_SYSTEM_CPU_CM0P 0UL +#endif + +#if defined (CY_PSOC_CREATOR_USED) && (CY_PSOC_CREATOR_USED == 1U) + #include "cyfitter.h" +#endif /* (CY_PSOC_CREATOR_USED) && (CY_PSOC_CREATOR_USED == 1U) */ + + + + +/******************************************************************************* +* +* START OF USER SETTINGS HERE +* =========================== +* +* All lines with '<<<' can be set by user. +* +*******************************************************************************/ + +/** +* \addtogroup group_system_config_user_settings_macro +* \{ +*/ + +#if defined (CYDEV_CLK_EXTCLK__HZ) + #define CY_CLK_EXT_FREQ_HZ (CYDEV_CLK_EXTCLK__HZ) +#else + /***************************************************************************//** + * External Clock Frequency (in Hz, [value]UL). If compiled within + * PSoC Creator and the clock is enabled in the DWR, the value from DWR used. + * Otherwise, edit the value below. + * (USER SETTING) + *******************************************************************************/ + #define CY_CLK_EXT_FREQ_HZ (24000000UL) /* <<< 24 MHz */ +#endif /* (CYDEV_CLK_EXTCLK__HZ) */ + + +#if defined (CYDEV_CLK_ECO__HZ) + #define CY_CLK_ECO_FREQ_HZ (CYDEV_CLK_ECO__HZ) +#else + /***************************************************************************//** + * \brief External crystal oscillator frequency (in Hz, [value]UL). If compiled + * within PSoC Creator and the clock is enabled in the DWR, the value from DWR + * used. + * (USER SETTING) + *******************************************************************************/ + #define CY_CLK_ECO_FREQ_HZ (24000000UL) /* <<< 24 MHz */ +#endif /* (CYDEV_CLK_ECO__HZ) */ + + +#if defined (CYDEV_CLK_ALTHF__HZ) + #define CY_CLK_ALTHF_FREQ_HZ (CYDEV_CLK_ALTHF__HZ) +#else + /***************************************************************************//** + * \brief Alternate high frequency (in Hz, [value]UL). If compiled within + * PSoC Creator and the clock is enabled in the DWR, the value from DWR used. + * Otherwise, edit the value below. + * (USER SETTING) + *******************************************************************************/ + #define CY_CLK_ALTHF_FREQ_HZ (32000000UL) /* <<< 32 MHz */ +#endif /* (CYDEV_CLK_ALTHF__HZ) */ + + +/***************************************************************************//** +* \brief Start address of the Cortex-M4 application ([address]UL) +* (USER SETTING) +*******************************************************************************/ +#define CY_CORTEX_M4_APPL_ADDR ( CY_FLASH_BASE + CY_FLASH_SIZE / 2U) /* <<< Half of flash is reserved for the Cortex-M0+ application */ + + +/***************************************************************************//** +* \brief IPC Semaphores allocation ([value]UL). +* (USER SETTING) +*******************************************************************************/ +#define CY_IPC_SEMA_COUNT (128UL) /* <<< This will allow 128 (4*32) semaphores */ + + +/***************************************************************************//** +* \brief IPC Pipe definitions ([value]UL). +* (USER SETTING) +*******************************************************************************/ +#define CY_IPC_MAX_ENDPOINTS (8UL) /* <<< 8 endpoints */ + + +/******************************************************************************* +* +* END OF USER SETTINGS HERE +* ========================= +* +*******************************************************************************/ + +/** \} group_system_config_user_settings_macro */ + + +/** +* \addtogroup group_system_config_system_macro +* \{ +*/ + +#if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) + /** The Cortex-M0+ startup driver identifier */ + #define CY_STARTUP_M0P_ID ((uint32_t)((uint32_t)((0x0EU) & 0x3FFFU) << 18U)) +#endif /* (CY_SYSTEM_CPU_CM0P == 1UL) */ + +#if (CY_SYSTEM_CPU_CM0P != 1UL) || defined(CY_DOXYGEN) + /** The Cortex-M4 startup driver identifier */ + #define CY_STARTUP_M4_ID ((uint32_t)((uint32_t)((0x0FU) & 0x3FFFU) << 18U)) +#endif /* (CY_SYSTEM_CPU_CM0P != 1UL) */ + +/** \} group_system_config_system_macro */ + + +/** +* \addtogroup group_system_config_system_functions +* \{ +*/ +#if defined(__ARMCC_VERSION) + extern void SystemInit(void) __attribute__((constructor)); +#else + extern void SystemInit(void); +#endif /* (__ARMCC_VERSION) */ + +extern void SystemCoreClockUpdate(void); +/** \} group_system_config_system_functions */ + + +/** +* \addtogroup group_system_config_cm4_functions +* \{ +*/ +extern uint32_t Cy_SysGetCM4Status(void); +extern void Cy_SysEnableCM4(uint32_t vectorTableOffset); +extern void Cy_SysDisableCM4(void); +extern void Cy_SysRetainCM4(void); +extern void Cy_SysResetCM4(void); +/** \} group_system_config_cm4_functions */ + + +/** \cond */ +extern void Default_Handler (void); + +void Cy_SysIpcPipeIsrCm0(void); +void Cy_SysIpcPipeIsrCm4(void); + +extern void Cy_SystemInit(void); +extern void Cy_SystemInitFpuEnable(void); + +extern uint32_t cy_delayFreqHz; +extern uint32_t cy_delayFreqKhz; +extern uint8_t cy_delayFreqMhz; +extern uint32_t cy_delay32kMs; +/** \endcond */ + + +#if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) +/** +* \addtogroup group_system_config_cm4_status_macro +* \{ +*/ +#define CY_SYS_CM4_STATUS_ENABLED (3U) /**< The Cortex-M4 core is enabled: power on, clock on, no isolate, no reset and no retain. */ +#define CY_SYS_CM4_STATUS_DISABLED (0U) /**< The Cortex-M4 core is disabled: power off, clock off, isolate, reset and no retain. */ +#define CY_SYS_CM4_STATUS_RETAINED (2U) /**< The Cortex-M4 core is retained. power off, clock off, isolate, no reset and retain. */ +#define CY_SYS_CM4_STATUS_RESET (1U) /**< The Cortex-M4 core is in the Reset mode: clock off, no isolated, no retain and reset. */ +/** \} group_system_config_cm4_status_macro */ + +#endif /* (CY_SYSTEM_CPU_CM0P == 1UL) */ + + +/******************************************************************************* +* IPC Configuration +* ========================= +*******************************************************************************/ +/* IPC CY_PIPE default configuration */ +#define CY_SYS_CYPIPE_CLIENT_CNT (8UL) + +#define CY_SYS_INTR_CYPIPE_MUX_EP0 (1UL) /* IPC CYPRESS PIPE */ +#define CY_SYS_INTR_CYPIPE_PRIOR_EP0 (1UL) /* Notifier Priority */ +#define CY_SYS_INTR_CYPIPE_PRIOR_EP1 (1UL) /* Notifier Priority */ + +#define CY_SYS_CYPIPE_CHAN_MASK_EP0 (0x0001UL << CY_IPC_CHAN_CYPIPE_EP0) +#define CY_SYS_CYPIPE_CHAN_MASK_EP1 (0x0001UL << CY_IPC_CHAN_CYPIPE_EP1) + + +/******************************************************************************/ +/* + * The System pipe configuration defines the IPC channel number, interrupt + * number, and the pipe interrupt mask for the endpoint. + * + * The format of the endPoint configuration + * Bits[31:16] Interrupt Mask + * Bits[15:8 ] IPC interrupt + * Bits[ 7:0 ] IPC channel + */ + +/* System Pipe addresses */ +/* CyPipe defines */ + +#define CY_SYS_CYPIPE_INTR_MASK ( CY_SYS_CYPIPE_CHAN_MASK_EP0 | CY_SYS_CYPIPE_CHAN_MASK_EP1 ) + +#define CY_SYS_CYPIPE_CONFIG_EP0 ( (CY_SYS_CYPIPE_INTR_MASK << CY_IPC_PIPE_CFG_IMASK_Pos) \ + | (CY_IPC_INTR_CYPIPE_EP0 << CY_IPC_PIPE_CFG_INTR_Pos) \ + | CY_IPC_CHAN_CYPIPE_EP0) +#define CY_SYS_CYPIPE_CONFIG_EP1 ( (CY_SYS_CYPIPE_INTR_MASK << CY_IPC_PIPE_CFG_IMASK_Pos) \ + | (CY_IPC_INTR_CYPIPE_EP1 << CY_IPC_PIPE_CFG_INTR_Pos) \ + | CY_IPC_CHAN_CYPIPE_EP1) + +/******************************************************************************/ + + +/** \addtogroup group_system_config_globals +* \{ +*/ + +extern uint32_t SystemCoreClock; +extern uint32_t cy_BleEcoClockFreqHz; +extern uint32_t cy_Hfclk0FreqHz; +extern uint32_t cy_PeriClkFreqHz; + +/** \} group_system_config_globals */ + + + +/** \cond INTERNAL */ +/******************************************************************************* +* Backward compatibility macro. The following code is DEPRECATED and must +* not be used in new projects +*******************************************************************************/ + +/* BWC defines for functions related to enter/exit critical section */ +#define Cy_SaveIRQ Cy_SysLib_EnterCriticalSection +#define Cy_RestoreIRQ Cy_SysLib_ExitCriticalSection +#define CY_SYS_INTR_CYPIPE_EP0 (CY_IPC_INTR_CYPIPE_EP0) +#define CY_SYS_INTR_CYPIPE_EP1 (CY_IPC_INTR_CYPIPE_EP1) + +/** \endcond */ + +#ifdef __cplusplus +} +#endif + +#endif /* _SYSTEM_PSOC6_H_ */ + + +/* [] END OF FILE */ diff --git a/2020TPCAppNoDFU.cydsn/system_psoc6_cm0plus.c b/2020TPCAppNoDFU.cydsn/system_psoc6_cm0plus.c new file mode 100644 index 0000000..038e7b4 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/system_psoc6_cm0plus.c @@ -0,0 +1,699 @@ +/***************************************************************************//** +* \file system_psoc6_cm0plus.c +* \version 2.20 +* +* The device system-source file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include +#include "system_psoc6.h" +#include "cy_device.h" +#include "cy_device_headers.h" +#include "cy_syslib.h" +#include "cy_wdt.h" + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) + #include "cy_ipc_sema.h" + #include "cy_ipc_pipe.h" + #include "cy_ipc_drv.h" + + #if defined(CY_DEVICE_PSOC6ABLE2) + #include "cy_flash.h" + #endif /* defined(CY_DEVICE_PSOC6ABLE2) */ + +#endif /* !defined(CY_IPC_DEFAULT_CFG_DISABLE) */ + + +/******************************************************************************* +* SystemCoreClockUpdate() +*******************************************************************************/ + +/** Default HFClk frequency in Hz */ +#define CY_CLK_HFCLK0_FREQ_HZ_DEFAULT (150000000UL) + +/** Default PeriClk frequency in Hz */ +#define CY_CLK_PERICLK_FREQ_HZ_DEFAULT (75000000UL) + +/** Default SlowClk system core frequency in Hz */ +#define CY_CLK_SYSTEM_FREQ_HZ_DEFAULT (75000000UL) + +/** IMO frequency in Hz */ +#define CY_CLK_IMO_FREQ_HZ (8000000UL) + +/** HVILO frequency in Hz */ +#define CY_CLK_HVILO_FREQ_HZ (32000UL) + +/** PILO frequency in Hz */ +#define CY_CLK_PILO_FREQ_HZ (32768UL) + +/** WCO frequency in Hz */ +#define CY_CLK_WCO_FREQ_HZ (32768UL) + +/** ALTLF frequency in Hz */ +#define CY_CLK_ALTLF_FREQ_HZ (32768UL) + + +/** +* Holds the SlowClk (Cortex-M0+) or FastClk (Cortex-M4) system core clock, +* which is the system clock frequency supplied to the SysTick timer and the +* processor core clock. +* This variable implements CMSIS Core global variable. +* Refer to the [CMSIS documentation] +* (http://www.keil.com/pack/doc/CMSIS/Core/html/group__system__init__gr.html "System and Clock Configuration") +* for more details. +* This variable can be used by debuggers to query the frequency +* of the debug timer or to configure the trace clock speed. +* +* \attention Compilers must be configured to avoid removing this variable in case +* the application program is not using it. Debugging systems require the variable +* to be physically present in memory so that it can be examined to configure the debugger. */ +uint32_t SystemCoreClock = CY_CLK_SYSTEM_FREQ_HZ_DEFAULT; + +/** Holds the HFClk0 clock frequency. Updated by \ref SystemCoreClockUpdate(). */ +uint32_t cy_Hfclk0FreqHz = CY_CLK_HFCLK0_FREQ_HZ_DEFAULT; + +/** Holds the PeriClk clock frequency. Updated by \ref SystemCoreClockUpdate(). */ +uint32_t cy_PeriClkFreqHz = CY_CLK_PERICLK_FREQ_HZ_DEFAULT; + +/** Holds the Alternate high frequency clock in Hz. Updated by \ref SystemCoreClockUpdate(). */ +#if (defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL)) || defined (CY_DOXYGEN) + uint32_t cy_BleEcoClockFreqHz = CY_CLK_ALTHF_FREQ_HZ; +#endif /* (defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL)) || defined (CY_DOXYGEN) */ + + +/******************************************************************************* +* SystemInit() +*******************************************************************************/ + +/* CLK_FLL_CONFIG default values */ +#define CY_FB_CLK_FLL_CONFIG_VALUE (0x01000000u) +#define CY_FB_CLK_FLL_CONFIG2_VALUE (0x00020001u) +#define CY_FB_CLK_FLL_CONFIG3_VALUE (0x00002800u) +#define CY_FB_CLK_FLL_CONFIG4_VALUE (0x000000FFu) + + +/******************************************************************************* +* SystemCoreClockUpdate (void) +*******************************************************************************/ + +/* Do not use these definitions directly in your application */ +#define CY_DELAY_MS_OVERFLOW_THRESHOLD (0x8000u) +#define CY_DELAY_1K_THRESHOLD (1000u) +#define CY_DELAY_1K_MINUS_1_THRESHOLD (CY_DELAY_1K_THRESHOLD - 1u) +#define CY_DELAY_1M_THRESHOLD (1000000u) +#define CY_DELAY_1M_MINUS_1_THRESHOLD (CY_DELAY_1M_THRESHOLD - 1u) +uint32_t cy_delayFreqHz = CY_CLK_SYSTEM_FREQ_HZ_DEFAULT; + +uint32_t cy_delayFreqKhz = (CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / + CY_DELAY_1K_THRESHOLD; + +uint8_t cy_delayFreqMhz = (uint8_t)((CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1M_MINUS_1_THRESHOLD) / + CY_DELAY_1M_THRESHOLD); + +uint32_t cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * + ((CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / CY_DELAY_1K_THRESHOLD); + +#define CY_ROOT_PATH_SRC_IMO (0UL) +#define CY_ROOT_PATH_SRC_EXT (1UL) +#if (SRSS_ECO_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_ECO (2UL) +#endif /* (SRSS_ECO_PRESENT == 1U) */ +#if (SRSS_ALTHF_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_ALTHF (3UL) +#endif /* (SRSS_ALTHF_PRESENT == 1U) */ +#define CY_ROOT_PATH_SRC_DSI_MUX (4UL) +#define CY_ROOT_PATH_SRC_DSI_MUX_HVILO (16UL) +#define CY_ROOT_PATH_SRC_DSI_MUX_WCO (17UL) +#if (SRSS_ALTLF_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_DSI_MUX_ALTLF (18UL) +#endif /* (SRSS_ALTLF_PRESENT == 1U) */ +#if (SRSS_PILO_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_DSI_MUX_PILO (19UL) +#endif /* (SRSS_PILO_PRESENT == 1U) */ + + +/******************************************************************************* +* Cy_SysEnableCM4(), Cy_SysRetainCM4(), and Cy_SysResetCM4() +*******************************************************************************/ +#define CY_SYS_CM4_PWR_CTL_KEY_OPEN (0x05FAUL) +#define CY_SYS_CM4_PWR_CTL_KEY_CLOSE (0xFA05UL) +#define CY_SYS_CM4_VECTOR_TABLE_VALID_ADDR (0x000003FFUL) + + +/******************************************************************************* +* Function Name: SystemInit +****************************************************************************//** +* +* Initializes the system: +* - Restores FLL registers to the default state. +* - Unlocks and disables WDT. +* - Calls Cy_PDL_Init() function to define the driver library. +* - Calls the Cy_SystemInit() function, if compiled from PSoC Creator. +* - Calls \ref SystemCoreClockUpdate(). +* +*******************************************************************************/ +void SystemInit(void) +{ + Cy_PDL_Init(CY_DEVICE_CFG); + + /* Restore FLL registers to the default state as they are not restored by the ROM code */ + uint32_t copy = SRSS->CLK_FLL_CONFIG; + copy &= ~SRSS_CLK_FLL_CONFIG_FLL_ENABLE_Msk; + SRSS->CLK_FLL_CONFIG = copy; + + copy = SRSS->CLK_ROOT_SELECT[0u]; + copy &= ~SRSS_CLK_ROOT_SELECT_ROOT_DIV_Msk; /* Set ROOT_DIV = 0*/ + SRSS->CLK_ROOT_SELECT[0u] = copy; + + SRSS->CLK_FLL_CONFIG = CY_FB_CLK_FLL_CONFIG_VALUE; + SRSS->CLK_FLL_CONFIG2 = CY_FB_CLK_FLL_CONFIG2_VALUE; + SRSS->CLK_FLL_CONFIG3 = CY_FB_CLK_FLL_CONFIG3_VALUE; + SRSS->CLK_FLL_CONFIG4 = CY_FB_CLK_FLL_CONFIG4_VALUE; + + /* Unlock and disable WDT */ + Cy_WDT_Unlock(); + Cy_WDT_Disable(); + + Cy_SystemInit(); + SystemCoreClockUpdate(); + +#if defined(CY_DEVICE_PSOC6ABLE2) && !defined(CY_PSOC6ABLE2_REV_0A_SUPPORT_DISABLE) + if (CY_SYSLIB_DEVICE_REV_0A == Cy_SysLib_GetDeviceRevision()) + { + /* Clear data register of IPC structure #7, reserved for the Deep-Sleep operations. */ + IPC_STRUCT7->DATA = 0UL; + /* Release IPC structure #7 to avoid deadlocks in case of SW or WDT reset during Deep-Sleep entering. */ + IPC_STRUCT7->RELEASE = 0UL; + } +#endif /* defined(CY_DEVICE_PSOC6ABLE2) && !defined(CY_PSOC6ABLE2_REV_0A_SUPPORT_DISABLE) */ + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) + /* Allocate and initialize semaphores for the system operations. */ + static uint32_t ipcSemaArray[CY_IPC_SEMA_COUNT / CY_IPC_SEMA_PER_WORD]; + + (void) Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, CY_IPC_SEMA_COUNT, ipcSemaArray); + + + /******************************************************************************** + * + * Initializes the system pipes. The system pipes are used by BLE and Flash. + * + * If the default startup file is not used, or SystemInit() is not called in your + * project, call the following three functions prior to executing any flash or + * EmEEPROM write or erase operation: + * -# Cy_IPC_Sema_Init() + * -# Cy_IPC_Pipe_Config() + * -# Cy_IPC_Pipe_Init() + * -# Cy_Flash_Init() + * + *******************************************************************************/ + + /* Create an array of endpoint structures */ + static cy_stc_ipc_pipe_ep_t systemIpcPipeEpArray[CY_IPC_MAX_ENDPOINTS]; + + Cy_IPC_Pipe_Config(systemIpcPipeEpArray); + + static cy_ipc_pipe_callback_ptr_t systemIpcPipeSysCbArray[CY_SYS_CYPIPE_CLIENT_CNT]; + + static const cy_stc_ipc_pipe_config_t systemIpcPipeConfigCm0 = + { + /* .ep0ConfigData */ + { + /* .ipcNotifierNumber */ CY_IPC_INTR_CYPIPE_EP0, + /* .ipcNotifierPriority */ CY_SYS_INTR_CYPIPE_PRIOR_EP0, + /* .ipcNotifierMuxNumber */ CY_SYS_INTR_CYPIPE_MUX_EP0, + /* .epAddress */ CY_IPC_EP_CYPIPE_CM0_ADDR, + /* .epConfig */ CY_SYS_CYPIPE_CONFIG_EP0 + }, + /* .ep1ConfigData */ + { + /* .ipcNotifierNumber */ CY_IPC_INTR_CYPIPE_EP1, + /* .ipcNotifierPriority */ CY_SYS_INTR_CYPIPE_PRIOR_EP1, + /* .ipcNotifierMuxNumber */ 0u, + /* .epAddress */ CY_IPC_EP_CYPIPE_CM4_ADDR, + /* .epConfig */ CY_SYS_CYPIPE_CONFIG_EP1 + }, + /* .endpointClientsCount */ CY_SYS_CYPIPE_CLIENT_CNT, + /* .endpointsCallbacksArray */ systemIpcPipeSysCbArray, + /* .userPipeIsrHandler */ &Cy_SysIpcPipeIsrCm0 + }; + + if (cy_device->flashPipeRequired != 0u) + { + Cy_IPC_Pipe_Init(&systemIpcPipeConfigCm0); + } + +#if defined(CY_DEVICE_PSOC6ABLE2) + Cy_Flash_Init(); +#endif /* defined(CY_DEVICE_PSOC6ABLE2) */ + +#endif /* !defined(CY_IPC_DEFAULT_CFG_DISABLE) */ +} + + +/******************************************************************************* +* Function Name: Cy_SystemInit +****************************************************************************//** +* +* The function is called during device startup. Once project compiled as part of +* the PSoC Creator project, the Cy_SystemInit() function is generated by the +* PSoC Creator. +* +* The function generated by PSoC Creator performs all of the necessary device +* configuration based on the design settings. This includes settings from the +* Design Wide Resources (DWR) such as Clocks and Pins as well as any component +* configuration that is necessary. +* +*******************************************************************************/ +__WEAK void Cy_SystemInit(void) +{ + /* Empty weak function. The actual implementation to be in the PSoC Creator + * generated strong function. + */ +} + + +/******************************************************************************* +* Function Name: SystemCoreClockUpdate +****************************************************************************//** +* +* Gets core clock frequency and updates \ref SystemCoreClock, \ref +* cy_Hfclk0FreqHz, and \ref cy_PeriClkFreqHz. +* +* Updates global variables used by the \ref Cy_SysLib_Delay(), \ref +* Cy_SysLib_DelayUs(), and \ref Cy_SysLib_DelayCycles(). +* +*******************************************************************************/ +void SystemCoreClockUpdate (void) +{ + uint32_t srcFreqHz; + uint32_t pathFreqHz; + uint32_t slowClkDiv; + uint32_t periClkDiv; + uint32_t rootPath; + uint32_t srcClk; + + /* Get root path clock for the high-frequency clock # 0 */ + rootPath = _FLD2VAL(SRSS_CLK_ROOT_SELECT_ROOT_MUX, SRSS->CLK_ROOT_SELECT[0u]); + + /* Get source of the root path clock */ + srcClk = _FLD2VAL(SRSS_CLK_PATH_SELECT_PATH_MUX, SRSS->CLK_PATH_SELECT[rootPath]); + + /* Get frequency of the source */ + switch (srcClk) + { + case CY_ROOT_PATH_SRC_IMO: + srcFreqHz = CY_CLK_IMO_FREQ_HZ; + break; + + case CY_ROOT_PATH_SRC_EXT: + srcFreqHz = CY_CLK_EXT_FREQ_HZ; + break; + + #if (SRSS_ECO_PRESENT == 1U) + case CY_ROOT_PATH_SRC_ECO: + srcFreqHz = CY_CLK_ECO_FREQ_HZ; + break; + #endif /* (SRSS_ECO_PRESENT == 1U) */ + +#if defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) && (SRSS_ALTHF_PRESENT == 1U) + case CY_ROOT_PATH_SRC_ALTHF: + srcFreqHz = cy_BleEcoClockFreqHz; + break; +#endif /* defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) && (SRSS_ALTHF_PRESENT == 1U) */ + + case CY_ROOT_PATH_SRC_DSI_MUX: + { + uint32_t dsi_src; + dsi_src = _FLD2VAL(SRSS_CLK_DSI_SELECT_DSI_MUX, SRSS->CLK_DSI_SELECT[rootPath]); + switch (dsi_src) + { + case CY_ROOT_PATH_SRC_DSI_MUX_HVILO: + srcFreqHz = CY_CLK_HVILO_FREQ_HZ; + break; + + case CY_ROOT_PATH_SRC_DSI_MUX_WCO: + srcFreqHz = CY_CLK_WCO_FREQ_HZ; + break; + + #if (SRSS_ALTLF_PRESENT == 1U) + case CY_ROOT_PATH_SRC_DSI_MUX_ALTLF: + srcFreqHz = CY_CLK_ALTLF_FREQ_HZ; + break; + #endif /* (SRSS_ALTLF_PRESENT == 1U) */ + + #if (SRSS_PILO_PRESENT == 1U) + case CY_ROOT_PATH_SRC_DSI_MUX_PILO: + srcFreqHz = CY_CLK_PILO_FREQ_HZ; + break; + #endif /* (SRSS_PILO_PRESENT == 1U) */ + + default: + srcFreqHz = CY_CLK_HVILO_FREQ_HZ; + break; + } + } + break; + + default: + srcFreqHz = CY_CLK_EXT_FREQ_HZ; + break; + } + + if (rootPath == 0UL) + { + /* FLL */ + bool fllLocked = ( 0UL != _FLD2VAL(SRSS_CLK_FLL_STATUS_LOCKED, SRSS->CLK_FLL_STATUS)); + bool fllOutputOutput = ( 3UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3)); + bool fllOutputAuto = ((0UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3)) || + (1UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3))); + if ((fllOutputAuto && fllLocked) || fllOutputOutput) + { + uint32_t fllMult; + uint32_t refDiv; + uint32_t outputDiv; + + fllMult = _FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_MULT, SRSS->CLK_FLL_CONFIG); + refDiv = _FLD2VAL(SRSS_CLK_FLL_CONFIG2_FLL_REF_DIV, SRSS->CLK_FLL_CONFIG2); + outputDiv = _FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_OUTPUT_DIV, SRSS->CLK_FLL_CONFIG) + 1UL; + + pathFreqHz = ((srcFreqHz / refDiv) * fllMult) / outputDiv; + } + else + { + pathFreqHz = srcFreqHz; + } + } + else if (rootPath == 1UL) + { + /* PLL */ + bool pllLocked = ( 0UL != _FLD2VAL(SRSS_CLK_PLL_STATUS_LOCKED, SRSS->CLK_PLL_STATUS[0UL])); + bool pllOutputOutput = ( 3UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL])); + bool pllOutputAuto = ((0UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL])) || + (1UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL]))); + if ((pllOutputAuto && pllLocked) || pllOutputOutput) + { + uint32_t feedbackDiv; + uint32_t referenceDiv; + uint32_t outputDiv; + + feedbackDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_FEEDBACK_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + referenceDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_REFERENCE_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + outputDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_OUTPUT_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + + pathFreqHz = ((srcFreqHz * feedbackDiv) / referenceDiv) / outputDiv; + + } + else + { + pathFreqHz = srcFreqHz; + } + } + else + { + /* Direct */ + pathFreqHz = srcFreqHz; + } + + /* Get frequency after hf_clk pre-divider */ + pathFreqHz = pathFreqHz >> _FLD2VAL(SRSS_CLK_ROOT_SELECT_ROOT_DIV, SRSS->CLK_ROOT_SELECT[0u]); + cy_Hfclk0FreqHz = pathFreqHz; + + /* Slow Clock Divider */ + slowClkDiv = 1u + _FLD2VAL(CPUSS_CM0_CLOCK_CTL_SLOW_INT_DIV, CPUSS->CM0_CLOCK_CTL); + + /* Peripheral Clock Divider */ + periClkDiv = 1u + _FLD2VAL(CPUSS_CM0_CLOCK_CTL_PERI_INT_DIV, CPUSS->CM0_CLOCK_CTL); + + pathFreqHz = pathFreqHz / periClkDiv; + cy_PeriClkFreqHz = pathFreqHz; + pathFreqHz = pathFreqHz / slowClkDiv; + SystemCoreClock = pathFreqHz; + + /* Sets clock frequency for Delay API */ + cy_delayFreqHz = SystemCoreClock; + cy_delayFreqMhz = (uint8_t)((cy_delayFreqHz + CY_DELAY_1M_MINUS_1_THRESHOLD) / CY_DELAY_1M_THRESHOLD); + cy_delayFreqKhz = (cy_delayFreqHz + CY_DELAY_1K_MINUS_1_THRESHOLD) / CY_DELAY_1K_THRESHOLD; + cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * cy_delayFreqKhz; +} + + +#if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) +/******************************************************************************* +* Function Name: Cy_SysGetCM4Status +****************************************************************************//** +* +* Returns the Cortex-M4 core power mode. +* +* \return \ref group_system_config_cm4_status_macro +* +*******************************************************************************/ +uint32_t Cy_SysGetCM4Status(void) +{ + uint32_t regValue; + + /* Get current power mode */ + regValue = CPUSS->CM4_PWR_CTL & CPUSS_CM4_PWR_CTL_PWR_MODE_Msk; + + return (regValue); +} + + +/******************************************************************************* +* Function Name: Cy_SysEnableCM4 +****************************************************************************//** +* +* Sets vector table base address and enables the Cortex-M4 core. +* +* \note If the CPU is already enabled, it is reset and then enabled. +* +* \param vectorTableOffset The offset of the vector table base address from +* memory address 0x00000000. The offset should be multiple to 1024 bytes. +* +*******************************************************************************/ +void Cy_SysEnableCM4(uint32_t vectorTableOffset) +{ + uint32_t regValue; + uint32_t interruptState; + uint32_t cpuState; + + CY_ASSERT_L2((vectorTableOffset & CY_SYS_CM4_VECTOR_TABLE_VALID_ADDR) == 0UL); + + interruptState = Cy_SysLib_EnterCriticalSection(); + + cpuState = Cy_SysGetCM4Status(); + if (CY_SYS_CM4_STATUS_ENABLED == cpuState) + { + Cy_SysResetCM4(); + } + + CPUSS->CM4_VECTOR_TABLE_BASE = vectorTableOffset; + + regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); + regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); + regValue |= CY_SYS_CM4_STATUS_ENABLED; + CPUSS->CM4_PWR_CTL = regValue; + + while((CPUSS->CM4_STATUS & CPUSS_CM4_STATUS_PWR_DONE_Msk) == 0UL) + { + /* Wait for the power mode to take effect */ + } + + Cy_SysLib_ExitCriticalSection(interruptState); +} + + +/******************************************************************************* +* Function Name: Cy_SysDisableCM4 +****************************************************************************//** +* +* Disables the Cortex-M4 core and waits for the mode to take the effect. +* +* \warning Do not call the function while the Cortex-M4 is executing because +* such a call may corrupt/abort a pending bus-transaction by the CPU and cause +* unexpected behavior in the system including a deadlock. Call the function +* while the Cortex-M4 core is in the Sleep or Deep Sleep low-power mode. Use +* the \ref group_syspm Power Management (syspm) API to put the CPU into the +* low-power modes. Use the \ref Cy_SysPm_ReadStatus() to get a status of the +* CPU. +* +*******************************************************************************/ +void Cy_SysDisableCM4(void) +{ + uint32_t interruptState; + uint32_t regValue; + + interruptState = Cy_SysLib_EnterCriticalSection(); + + regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); + regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); + regValue |= CY_SYS_CM4_STATUS_DISABLED; + CPUSS->CM4_PWR_CTL = regValue; + + while((CPUSS->CM4_STATUS & CPUSS_CM4_STATUS_PWR_DONE_Msk) == 0UL) + { + /* Wait for the power mode to take effect */ + } + + Cy_SysLib_ExitCriticalSection(interruptState); +} + + +/******************************************************************************* +* Function Name: Cy_SysRetainCM4 +****************************************************************************//** +* +* Retains the Cortex-M4 core and exists without waiting for the mode to take +* effect. +* +* \note The retained mode can be entered only from the enabled mode. +* +* \warning Do not call the function while the Cortex-M4 is executing because +* such a call may corrupt/abort a pending bus-transaction by the CPU and cause +* unexpected behavior in the system including a deadlock. Call the function +* while the Cortex-M4 core is in the Sleep or Deep Sleep low-power mode. Use +* the \ref group_syspm Power Management (syspm) API to put the CPU into the +* low-power modes. Use the \ref Cy_SysPm_ReadStatus() to get a status of the CPU. +* +*******************************************************************************/ +void Cy_SysRetainCM4(void) +{ + uint32_t interruptState; + uint32_t regValue; + + interruptState = Cy_SysLib_EnterCriticalSection(); + + regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); + regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); + regValue |= CY_SYS_CM4_STATUS_RETAINED; + CPUSS->CM4_PWR_CTL = regValue; + + Cy_SysLib_ExitCriticalSection(interruptState); +} + + +/******************************************************************************* +* Function Name: Cy_SysResetCM4 +****************************************************************************//** +* +* Resets the Cortex-M4 core and waits for the mode to take the effect. +* +* \note The reset mode can not be entered from the retained mode. +* +* \warning Do not call the function while the Cortex-M4 is executing because +* such a call may corrupt/abort a pending bus-transaction by the CPU and cause +* unexpected behavior in the system including a deadlock. Call the function +* while the Cortex-M4 core is in the Sleep or Deep Sleep low-power mode. Use +* the \ref group_syspm Power Management (syspm) API to put the CPU into the +* low-power modes. Use the \ref Cy_SysPm_ReadStatus() to get a status of the CPU. +* +*******************************************************************************/ +void Cy_SysResetCM4(void) +{ + uint32_t interruptState; + uint32_t regValue; + + interruptState = Cy_SysLib_EnterCriticalSection(); + + regValue = CPUSS->CM4_PWR_CTL & ~(CPUSS_CM4_PWR_CTL_VECTKEYSTAT_Msk | CPUSS_CM4_PWR_CTL_PWR_MODE_Msk); + regValue |= _VAL2FLD(CPUSS_CM4_PWR_CTL_VECTKEYSTAT, CY_SYS_CM4_PWR_CTL_KEY_OPEN); + regValue |= CY_SYS_CM4_STATUS_RESET; + CPUSS->CM4_PWR_CTL = regValue; + + while((CPUSS->CM4_STATUS & CPUSS_CM4_STATUS_PWR_DONE_Msk) == 0UL) + { + /* Wait for the power mode to take effect */ + } + + Cy_SysLib_ExitCriticalSection(interruptState); +} +#endif /* #if (CY_SYSTEM_CPU_CM0P == 1UL) || defined(CY_DOXYGEN) */ + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) +/******************************************************************************* +* Function Name: Cy_SysIpcPipeIsrCm0 +****************************************************************************//** +* +* This is the interrupt service routine for the system pipe. +* +*******************************************************************************/ +void Cy_SysIpcPipeIsrCm0(void) +{ + Cy_IPC_Pipe_ExecuteCallback(CY_IPC_EP_CYPIPE_CM0_ADDR); +} +#endif + +/******************************************************************************* +* Function Name: Cy_MemorySymbols +****************************************************************************//** +* +* The intention of the function is to declare boundaries of the memories for the +* MDK compilers. For the rest of the supported compilers, this is done using +* linker configuration files. The following symbols used by the cymcuelftool. +* +*******************************************************************************/ +#if defined (__ARMCC_VERSION) +__asm void Cy_MemorySymbols(void) +{ + /* Flash */ + EXPORT __cy_memory_0_start + EXPORT __cy_memory_0_length + EXPORT __cy_memory_0_row_size + + /* Working Flash */ + EXPORT __cy_memory_1_start + EXPORT __cy_memory_1_length + EXPORT __cy_memory_1_row_size + + /* Supervisory Flash */ + EXPORT __cy_memory_2_start + EXPORT __cy_memory_2_length + EXPORT __cy_memory_2_row_size + + /* XIP */ + EXPORT __cy_memory_3_start + EXPORT __cy_memory_3_length + EXPORT __cy_memory_3_row_size + + /* eFuse */ + EXPORT __cy_memory_4_start + EXPORT __cy_memory_4_length + EXPORT __cy_memory_4_row_size + + + /* Flash */ +__cy_memory_0_start EQU __cpp(CY_FLASH_BASE) +__cy_memory_0_length EQU __cpp(CY_FLASH_SIZE) +__cy_memory_0_row_size EQU 0x200 + + /* Flash region for EEPROM emulation */ +__cy_memory_1_start EQU __cpp(CY_EM_EEPROM_BASE) +__cy_memory_1_length EQU __cpp(CY_EM_EEPROM_SIZE) +__cy_memory_1_row_size EQU 0x200 + + /* Supervisory Flash */ +__cy_memory_2_start EQU __cpp(CY_SFLASH_BASE) +__cy_memory_2_length EQU __cpp(CY_SFLASH_SIZE) +__cy_memory_2_row_size EQU 0x200 + + /* XIP */ +__cy_memory_3_start EQU __cpp(CY_XIP_BASE) +__cy_memory_3_length EQU __cpp(CY_XIP_SIZE) +__cy_memory_3_row_size EQU 0x200 + + /* eFuse */ +__cy_memory_4_start EQU __cpp(0x90700000) +__cy_memory_4_length EQU __cpp(0x100000) +__cy_memory_4_row_size EQU __cpp(1) +} +#endif /* defined (__ARMCC_VERSION) */ + + +/* [] END OF FILE */ diff --git a/2020TPCAppNoDFU.cydsn/system_psoc6_cm4.c b/2020TPCAppNoDFU.cydsn/system_psoc6_cm4.c new file mode 100644 index 0000000..c4d8c11 --- /dev/null +++ b/2020TPCAppNoDFU.cydsn/system_psoc6_cm4.c @@ -0,0 +1,542 @@ +/***************************************************************************//** +* \file system_psoc6_cm4.c +* \version 2.20 +* +* The device system-source file. +* +******************************************************************************** +* \copyright +* Copyright 2016-2018, Cypress Semiconductor Corporation. All rights reserved. +* You may use this file only in accordance with the license, terms, conditions, +* disclaimers, and limitations in the end user license agreement accompanying +* the software package with which this file was provided. +*******************************************************************************/ + +#include +#include "system_psoc6.h" +#include "cy_device.h" +#include "cy_device_headers.h" +#include "cy_syslib.h" +#include "cy_wdt.h" + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) + #include "cy_ipc_sema.h" + #include "cy_ipc_pipe.h" + #include "cy_ipc_drv.h" + + #if defined(CY_DEVICE_PSOC6ABLE2) + #include "cy_flash.h" + #endif /* defined(CY_DEVICE_PSOC6ABLE2) */ +#endif /* !defined(CY_IPC_DEFAULT_CFG_DISABLE) */ + + +/******************************************************************************* +* SystemCoreClockUpdate() +*******************************************************************************/ + +/** Default HFClk frequency in Hz */ +#define CY_CLK_HFCLK0_FREQ_HZ_DEFAULT (150000000UL) + +/** Default PeriClk frequency in Hz */ +#define CY_CLK_PERICLK_FREQ_HZ_DEFAULT (75000000UL) + +/** Default SlowClk system core frequency in Hz */ +#define CY_CLK_SYSTEM_FREQ_HZ_DEFAULT (75000000UL) + +/** IMO frequency in Hz */ +#define CY_CLK_IMO_FREQ_HZ (8000000UL) + +/** HVILO frequency in Hz */ +#define CY_CLK_HVILO_FREQ_HZ (32000UL) + +/** PILO frequency in Hz */ +#define CY_CLK_PILO_FREQ_HZ (32768UL) + +/** WCO frequency in Hz */ +#define CY_CLK_WCO_FREQ_HZ (32768UL) + +/** ALTLF frequency in Hz */ +#define CY_CLK_ALTLF_FREQ_HZ (32768UL) + + +/** +* Holds the SlowClk (Cortex-M0+) or FastClk (Cortex-M4) system core clock, +* which is the system clock frequency supplied to the SysTick timer and the +* processor core clock. +* This variable implements CMSIS Core global variable. +* Refer to the [CMSIS documentation] +* (http://www.keil.com/pack/doc/CMSIS/Core/html/group__system__init__gr.html "System and Clock Configuration") +* for more details. +* This variable can be used by debuggers to query the frequency +* of the debug timer or to configure the trace clock speed. +* +* \attention Compilers must be configured to avoid removing this variable in case +* the application program is not using it. Debugging systems require the variable +* to be physically present in memory so that it can be examined to configure the debugger. */ +uint32_t SystemCoreClock = CY_CLK_SYSTEM_FREQ_HZ_DEFAULT; + +/** Holds the HFClk0 clock frequency. Updated by \ref SystemCoreClockUpdate(). */ +uint32_t cy_Hfclk0FreqHz = CY_CLK_HFCLK0_FREQ_HZ_DEFAULT; + +/** Holds the PeriClk clock frequency. Updated by \ref SystemCoreClockUpdate(). */ +uint32_t cy_PeriClkFreqHz = CY_CLK_PERICLK_FREQ_HZ_DEFAULT; + +/** Holds the Alternate high frequency clock in Hz. Updated by \ref SystemCoreClockUpdate(). */ +#if (defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL)) || defined (CY_DOXYGEN) + uint32_t cy_BleEcoClockFreqHz = CY_CLK_ALTHF_FREQ_HZ; +#endif /* (defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL)) || defined (CY_DOXYGEN) */ + +/* SCB->CPACR */ +#define SCB_CPACR_CP10_CP11_ENABLE (0xFUL << 20u) + + +/******************************************************************************* +* SystemInit() +*******************************************************************************/ + +/* CLK_FLL_CONFIG default values */ +#define CY_FB_CLK_FLL_CONFIG_VALUE (0x01000000u) +#define CY_FB_CLK_FLL_CONFIG2_VALUE (0x00020001u) +#define CY_FB_CLK_FLL_CONFIG3_VALUE (0x00002800u) +#define CY_FB_CLK_FLL_CONFIG4_VALUE (0x000000FFu) + + +/******************************************************************************* +* SystemCoreClockUpdate (void) +*******************************************************************************/ + +/* Do not use these definitions directly in your application */ +#define CY_DELAY_MS_OVERFLOW_THRESHOLD (0x8000u) +#define CY_DELAY_1K_THRESHOLD (1000u) +#define CY_DELAY_1K_MINUS_1_THRESHOLD (CY_DELAY_1K_THRESHOLD - 1u) +#define CY_DELAY_1M_THRESHOLD (1000000u) +#define CY_DELAY_1M_MINUS_1_THRESHOLD (CY_DELAY_1M_THRESHOLD - 1u) +uint32_t cy_delayFreqHz = CY_CLK_SYSTEM_FREQ_HZ_DEFAULT; + +uint32_t cy_delayFreqKhz = (CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / + CY_DELAY_1K_THRESHOLD; + +uint8_t cy_delayFreqMhz = (uint8_t)((CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1M_MINUS_1_THRESHOLD) / + CY_DELAY_1M_THRESHOLD); + +uint32_t cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * + ((CY_CLK_SYSTEM_FREQ_HZ_DEFAULT + CY_DELAY_1K_MINUS_1_THRESHOLD) / CY_DELAY_1K_THRESHOLD); + +#define CY_ROOT_PATH_SRC_IMO (0UL) +#define CY_ROOT_PATH_SRC_EXT (1UL) +#if (SRSS_ECO_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_ECO (2UL) +#endif /* (SRSS_ECO_PRESENT == 1U) */ +#if (SRSS_ALTHF_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_ALTHF (3UL) +#endif /* (SRSS_ALTHF_PRESENT == 1U) */ +#define CY_ROOT_PATH_SRC_DSI_MUX (4UL) +#define CY_ROOT_PATH_SRC_DSI_MUX_HVILO (16UL) +#define CY_ROOT_PATH_SRC_DSI_MUX_WCO (17UL) +#if (SRSS_ALTLF_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_DSI_MUX_ALTLF (18UL) +#endif /* (SRSS_ALTLF_PRESENT == 1U) */ +#if (SRSS_PILO_PRESENT == 1U) + #define CY_ROOT_PATH_SRC_DSI_MUX_PILO (19UL) +#endif /* (SRSS_PILO_PRESENT == 1U) */ + + +/******************************************************************************* +* Function Name: SystemInit +****************************************************************************//** +* \cond +* Initializes the system: +* - Restores FLL registers to the default state for single core devices. +* - Unlocks and disables WDT. +* - Calls Cy_PDL_Init() function to define the driver library. +* - Calls the Cy_SystemInit() function, if compiled from PSoC Creator. +* - Calls \ref SystemCoreClockUpdate(). +* \endcond +*******************************************************************************/ +void SystemInit(void) +{ + Cy_PDL_Init(CY_DEVICE_CFG); + +#ifdef __CM0P_PRESENT + #if (__CM0P_PRESENT == 0) + /* Restore FLL registers to the default state as they are not restored by the ROM code */ + uint32_t copy = SRSS->CLK_FLL_CONFIG; + copy &= ~SRSS_CLK_FLL_CONFIG_FLL_ENABLE_Msk; + SRSS->CLK_FLL_CONFIG = copy; + + copy = SRSS->CLK_ROOT_SELECT[0u]; + copy &= ~SRSS_CLK_ROOT_SELECT_ROOT_DIV_Msk; /* Set ROOT_DIV = 0*/ + SRSS->CLK_ROOT_SELECT[0u] = copy; + + SRSS->CLK_FLL_CONFIG = CY_FB_CLK_FLL_CONFIG_VALUE; + SRSS->CLK_FLL_CONFIG2 = CY_FB_CLK_FLL_CONFIG2_VALUE; + SRSS->CLK_FLL_CONFIG3 = CY_FB_CLK_FLL_CONFIG3_VALUE; + SRSS->CLK_FLL_CONFIG4 = CY_FB_CLK_FLL_CONFIG4_VALUE; + + /* Unlock and disable WDT */ + Cy_WDT_Unlock(); + Cy_WDT_Disable(); + #endif /* (__CM0P_PRESENT == 0) */ +#endif /* __CM0P_PRESENT */ + + Cy_SystemInit(); + SystemCoreClockUpdate(); + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) + +#ifdef __CM0P_PRESENT + #if (__CM0P_PRESENT == 0) + /* Allocate and initialize semaphores for the system operations. */ + static uint32_t ipcSemaArray[CY_IPC_SEMA_COUNT / CY_IPC_SEMA_PER_WORD]; + (void) Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, CY_IPC_SEMA_COUNT, ipcSemaArray); + #else + (void) Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, 0ul, NULL); + #endif /* (__CM0P_PRESENT) */ +#else + (void) Cy_IPC_Sema_Init(CY_IPC_CHAN_SEMA, 0ul, NULL); +#endif /* __CM0P_PRESENT */ + + + /******************************************************************************** + * + * Initializes the system pipes. The system pipes are used by BLE and Flash. + * + * If the default startup file is not used, or SystemInit() is not called in your + * project, call the following three functions prior to executing any flash or + * EmEEPROM write or erase operation: + * -# Cy_IPC_Sema_Init() + * -# Cy_IPC_Pipe_Config() + * -# Cy_IPC_Pipe_Init() + * -# Cy_Flash_Init() + * + *******************************************************************************/ + /* Create an array of endpoint structures */ + static cy_stc_ipc_pipe_ep_t systemIpcPipeEpArray[CY_IPC_MAX_ENDPOINTS]; + + Cy_IPC_Pipe_Config(systemIpcPipeEpArray); + + static cy_ipc_pipe_callback_ptr_t systemIpcPipeSysCbArray[CY_SYS_CYPIPE_CLIENT_CNT]; + + static const cy_stc_ipc_pipe_config_t systemIpcPipeConfigCm4 = + { + /* .ep0ConfigData */ + { + /* .ipcNotifierNumber */ CY_IPC_INTR_CYPIPE_EP0, + /* .ipcNotifierPriority */ CY_SYS_INTR_CYPIPE_PRIOR_EP0, + /* .ipcNotifierMuxNumber */ CY_SYS_INTR_CYPIPE_MUX_EP0, + /* .epAddress */ CY_IPC_EP_CYPIPE_CM0_ADDR, + /* .epConfig */ CY_SYS_CYPIPE_CONFIG_EP0 + }, + /* .ep1ConfigData */ + { + /* .ipcNotifierNumber */ CY_IPC_INTR_CYPIPE_EP1, + /* .ipcNotifierPriority */ CY_SYS_INTR_CYPIPE_PRIOR_EP1, + /* .ipcNotifierMuxNumber */ 0u, + /* .epAddress */ CY_IPC_EP_CYPIPE_CM4_ADDR, + /* .epConfig */ CY_SYS_CYPIPE_CONFIG_EP1 + }, + /* .endpointClientsCount */ CY_SYS_CYPIPE_CLIENT_CNT, + /* .endpointsCallbacksArray */ systemIpcPipeSysCbArray, + /* .userPipeIsrHandler */ &Cy_SysIpcPipeIsrCm4 + }; + + if (cy_device->flashPipeRequired != 0u) + { + Cy_IPC_Pipe_Init(&systemIpcPipeConfigCm4); + } + +#if defined(CY_DEVICE_PSOC6ABLE2) + Cy_Flash_Init(); +#endif /* defined(CY_DEVICE_PSOC6ABLE2) */ + +#endif /* !defined(CY_IPC_DEFAULT_CFG_DISABLE) */ +} + + +/******************************************************************************* +* Function Name: Cy_SystemInit +****************************************************************************//** +* +* The function is called during device startup. Once project compiled as part of +* the PSoC Creator project, the Cy_SystemInit() function is generated by the +* PSoC Creator. +* +* The function generated by PSoC Creator performs all of the necessary device +* configuration based on the design settings. This includes settings from the +* Design Wide Resources (DWR) such as Clocks and Pins as well as any component +* configuration that is necessary. +* +*******************************************************************************/ +__WEAK void Cy_SystemInit(void) +{ + /* Empty weak function. The actual implementation to be in the PSoC Creator + * generated strong function. + */ +} + + +/******************************************************************************* +* Function Name: SystemCoreClockUpdate +****************************************************************************//** +* +* Gets core clock frequency and updates \ref SystemCoreClock, \ref +* cy_Hfclk0FreqHz, and \ref cy_PeriClkFreqHz. +* +* Updates global variables used by the \ref Cy_SysLib_Delay(), \ref +* Cy_SysLib_DelayUs(), and \ref Cy_SysLib_DelayCycles(). +* +*******************************************************************************/ +void SystemCoreClockUpdate (void) +{ + uint32_t srcFreqHz; + uint32_t pathFreqHz; + uint32_t fastClkDiv; + uint32_t periClkDiv; + uint32_t rootPath; + uint32_t srcClk; + + /* Get root path clock for the high-frequency clock # 0 */ + rootPath = _FLD2VAL(SRSS_CLK_ROOT_SELECT_ROOT_MUX, SRSS->CLK_ROOT_SELECT[0u]); + + /* Get source of the root path clock */ + srcClk = _FLD2VAL(SRSS_CLK_PATH_SELECT_PATH_MUX, SRSS->CLK_PATH_SELECT[rootPath]); + + /* Get frequency of the source */ + switch (srcClk) + { + case CY_ROOT_PATH_SRC_IMO: + srcFreqHz = CY_CLK_IMO_FREQ_HZ; + break; + + case CY_ROOT_PATH_SRC_EXT: + srcFreqHz = CY_CLK_EXT_FREQ_HZ; + break; + + #if (SRSS_ECO_PRESENT == 1U) + case CY_ROOT_PATH_SRC_ECO: + srcFreqHz = CY_CLK_ECO_FREQ_HZ; + break; + #endif /* (SRSS_ECO_PRESENT == 1U) */ + +#if defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) && (SRSS_ALTHF_PRESENT == 1U) + case CY_ROOT_PATH_SRC_ALTHF: + srcFreqHz = cy_BleEcoClockFreqHz; + break; +#endif /* defined (CY_IP_MXBLESS) && (CY_IP_MXBLESS == 1UL) && (SRSS_ALTHF_PRESENT == 1U) */ + + case CY_ROOT_PATH_SRC_DSI_MUX: + { + uint32_t dsi_src; + dsi_src = _FLD2VAL(SRSS_CLK_DSI_SELECT_DSI_MUX, SRSS->CLK_DSI_SELECT[rootPath]); + switch (dsi_src) + { + case CY_ROOT_PATH_SRC_DSI_MUX_HVILO: + srcFreqHz = CY_CLK_HVILO_FREQ_HZ; + break; + + case CY_ROOT_PATH_SRC_DSI_MUX_WCO: + srcFreqHz = CY_CLK_WCO_FREQ_HZ; + break; + + #if (SRSS_ALTLF_PRESENT == 1U) + case CY_ROOT_PATH_SRC_DSI_MUX_ALTLF: + srcFreqHz = CY_CLK_ALTLF_FREQ_HZ; + break; + #endif /* (SRSS_ALTLF_PRESENT == 1U) */ + + #if (SRSS_PILO_PRESENT == 1U) + case CY_ROOT_PATH_SRC_DSI_MUX_PILO: + srcFreqHz = CY_CLK_PILO_FREQ_HZ; + break; + #endif /* (SRSS_PILO_PRESENT == 1U) */ + + default: + srcFreqHz = CY_CLK_HVILO_FREQ_HZ; + break; + } + } + break; + + default: + srcFreqHz = CY_CLK_EXT_FREQ_HZ; + break; + } + + if (rootPath == 0UL) + { + /* FLL */ + bool fllLocked = ( 0UL != _FLD2VAL(SRSS_CLK_FLL_STATUS_LOCKED, SRSS->CLK_FLL_STATUS)); + bool fllOutputOutput = ( 3UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3)); + bool fllOutputAuto = ((0UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3)) || + (1UL == _FLD2VAL(SRSS_CLK_FLL_CONFIG3_BYPASS_SEL, SRSS->CLK_FLL_CONFIG3))); + if ((fllOutputAuto && fllLocked) || fllOutputOutput) + { + uint32_t fllMult; + uint32_t refDiv; + uint32_t outputDiv; + + fllMult = _FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_MULT, SRSS->CLK_FLL_CONFIG); + refDiv = _FLD2VAL(SRSS_CLK_FLL_CONFIG2_FLL_REF_DIV, SRSS->CLK_FLL_CONFIG2); + outputDiv = _FLD2VAL(SRSS_CLK_FLL_CONFIG_FLL_OUTPUT_DIV, SRSS->CLK_FLL_CONFIG) + 1UL; + + pathFreqHz = ((srcFreqHz / refDiv) * fllMult) / outputDiv; + } + else + { + pathFreqHz = srcFreqHz; + } + } + else if (rootPath == 1UL) + { + /* PLL */ + bool pllLocked = ( 0UL != _FLD2VAL(SRSS_CLK_PLL_STATUS_LOCKED, SRSS->CLK_PLL_STATUS[0UL])); + bool pllOutputOutput = ( 3UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL])); + bool pllOutputAuto = ((0UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL])) || + (1UL == _FLD2VAL(SRSS_CLK_PLL_CONFIG_BYPASS_SEL, SRSS->CLK_PLL_CONFIG[0UL]))); + if ((pllOutputAuto && pllLocked) || pllOutputOutput) + { + uint32_t feedbackDiv; + uint32_t referenceDiv; + uint32_t outputDiv; + + feedbackDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_FEEDBACK_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + referenceDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_REFERENCE_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + outputDiv = _FLD2VAL(SRSS_CLK_PLL_CONFIG_OUTPUT_DIV, SRSS->CLK_PLL_CONFIG[0UL]); + + pathFreqHz = ((srcFreqHz * feedbackDiv) / referenceDiv) / outputDiv; + + } + else + { + pathFreqHz = srcFreqHz; + } + } + else + { + /* Direct */ + pathFreqHz = srcFreqHz; + } + + /* Get frequency after hf_clk pre-divider */ + pathFreqHz = pathFreqHz >> _FLD2VAL(SRSS_CLK_ROOT_SELECT_ROOT_DIV, SRSS->CLK_ROOT_SELECT[0u]); + cy_Hfclk0FreqHz = pathFreqHz; + + /* Fast Clock Divider */ + fastClkDiv = 1u + _FLD2VAL(CPUSS_CM4_CLOCK_CTL_FAST_INT_DIV, CPUSS->CM4_CLOCK_CTL); + + /* Peripheral Clock Divider */ + periClkDiv = 1u + _FLD2VAL(CPUSS_CM0_CLOCK_CTL_PERI_INT_DIV, CPUSS->CM0_CLOCK_CTL); + cy_PeriClkFreqHz = pathFreqHz / periClkDiv; + + pathFreqHz = pathFreqHz / fastClkDiv; + SystemCoreClock = pathFreqHz; + + /* Sets clock frequency for Delay API */ + cy_delayFreqHz = SystemCoreClock; + cy_delayFreqMhz = (uint8_t)((cy_delayFreqHz + CY_DELAY_1M_MINUS_1_THRESHOLD) / CY_DELAY_1M_THRESHOLD); + cy_delayFreqKhz = (cy_delayFreqHz + CY_DELAY_1K_MINUS_1_THRESHOLD) / CY_DELAY_1K_THRESHOLD; + cy_delay32kMs = CY_DELAY_MS_OVERFLOW_THRESHOLD * cy_delayFreqKhz; +} + + +/******************************************************************************* +* Function Name: Cy_SystemInitFpuEnable +****************************************************************************//** +* +* Enables the FPU if it is used. The function is called from the startup file. +* +*******************************************************************************/ +void Cy_SystemInitFpuEnable(void) +{ + #if defined (__FPU_USED) && (__FPU_USED == 1U) + uint32_t interruptState; + interruptState = Cy_SysLib_EnterCriticalSection(); + SCB->CPACR |= SCB_CPACR_CP10_CP11_ENABLE; + __DSB(); + __ISB(); + Cy_SysLib_ExitCriticalSection(interruptState); + #endif /* (__FPU_USED) && (__FPU_USED == 1U) */ +} + + +#if !defined(CY_IPC_DEFAULT_CFG_DISABLE) +/******************************************************************************* +* Function Name: Cy_SysIpcPipeIsrCm4 +****************************************************************************//** +* +* This is the interrupt service routine for the system pipe. +* +*******************************************************************************/ +void Cy_SysIpcPipeIsrCm4(void) +{ + Cy_IPC_Pipe_ExecuteCallback(CY_IPC_EP_CYPIPE_CM4_ADDR); +} +#endif + +/******************************************************************************* +* Function Name: Cy_MemorySymbols +****************************************************************************//** +* +* The intention of the function is to declare boundaries of the memories for the +* MDK compilers. For the rest of the supported compilers, this is done using +* linker configuration files. The following symbols used by the cymcuelftool. +* +*******************************************************************************/ +#if defined (__ARMCC_VERSION) +__asm void Cy_MemorySymbols(void) +{ + /* Flash */ + EXPORT __cy_memory_0_start + EXPORT __cy_memory_0_length + EXPORT __cy_memory_0_row_size + + /* Working Flash */ + EXPORT __cy_memory_1_start + EXPORT __cy_memory_1_length + EXPORT __cy_memory_1_row_size + + /* Supervisory Flash */ + EXPORT __cy_memory_2_start + EXPORT __cy_memory_2_length + EXPORT __cy_memory_2_row_size + + /* XIP */ + EXPORT __cy_memory_3_start + EXPORT __cy_memory_3_length + EXPORT __cy_memory_3_row_size + + /* eFuse */ + EXPORT __cy_memory_4_start + EXPORT __cy_memory_4_length + EXPORT __cy_memory_4_row_size + + /* Flash */ +__cy_memory_0_start EQU __cpp(CY_FLASH_BASE) +__cy_memory_0_length EQU __cpp(CY_FLASH_SIZE) +__cy_memory_0_row_size EQU 0x200 + + /* Flash region for EEPROM emulation */ +__cy_memory_1_start EQU __cpp(CY_EM_EEPROM_BASE) +__cy_memory_1_length EQU __cpp(CY_EM_EEPROM_SIZE) +__cy_memory_1_row_size EQU 0x200 + + /* Supervisory Flash */ +__cy_memory_2_start EQU __cpp(CY_SFLASH_BASE) +__cy_memory_2_length EQU __cpp(CY_SFLASH_SIZE) +__cy_memory_2_row_size EQU 0x200 + + /* XIP */ +__cy_memory_3_start EQU __cpp(CY_XIP_BASE) +__cy_memory_3_length EQU __cpp(CY_XIP_SIZE) +__cy_memory_3_row_size EQU 0x200 + + /* eFuse */ +__cy_memory_4_start EQU __cpp(0x90700000) +__cy_memory_4_length EQU __cpp(0x100000) +__cy_memory_4_row_size EQU __cpp(1) +} + +#endif /* defined (__ARMCC_VERSION) */ + + +/* [] END OF FILE */ diff --git a/Keys/Keys_README.md b/Keys/Keys_README.md new file mode 100644 index 0000000..9fcb7ac --- /dev/null +++ b/Keys/Keys_README.md @@ -0,0 +1,4 @@ +# About the Keys + +This is the folder where the keys go. Thay are not here. If you need them, +[send a message to Joe](https://forum.ktag.clubk.club/new-message?username=joe&title=2020TPC%20Keys&body=I%20need%20the%202020TPC%20keys.%20Here%27s%20why%3A) and tell him why. \ No newline at end of file diff --git a/README.md b/README.md index 28230cc..da8e3d6 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,53 @@ -# 2020TPC-SW +# 2020TPC Software -Software for the 2020TPC using PSoC Creator. \ No newline at end of file +## Overview + +This is software for the [2020TPC](https://git.ktag.clubk.club/Hardware/2020TPC-HW-Body/) using +[PSoC™ Creator](https://www.infineon.com/cms/en/design-support/tools/sdk/psoc-software/psoc-creator/)†. + +The primary documentation for the 2020TPC is on the KTag website at https://ktag.clubk.club/Devices/2020TPC/. + +You can ask questions (and get answers!) about this software on the KTag forum at https://forum.ktag.clubk.club/c/software/. + +## License: [AGPL-3.0-or-later](https://spdx.org/licenses/AGPL-3.0-or-later.html) + +This software is part of the KTag project, a DIY laser tag game with customizable features and wide interoperability. + +🛡️ 🃞 + +Copyright © 2020-2025 Joseph P. Kearney and the KTag developers. + +This program is free software: you can redistribute it and/or modify it under +the terms of the GNU Affero General Public License as published by the Free +Software Foundation, either version 3 of the License, or (at your option) any +later version. + +This program 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 Affero General Public License for more +details. + +There should be a copy of the GNU Affero General Public License in the [LICENSE](LICENSE) +file in the root of this repository. If not, see . + +## Licensed Software + +This software makes use of the following licensed software components and libraries: + +| Name | Version | URL +|----------------------------|---------:|----------------------------------------------- +| Cypress PSoC™ Creator | 4.4.0.80 | https://www.infineon.com/cms/en/design-support/tools/sdk/psoc-software/psoc-creator/ +| PSoC™ 6 Peripheral Driver Library (PDL) for PSoC™ Creator
(installed in C:\Program Files (x86)\Cypress\PDL\3.1.7) | 3.1.7 | https://www.infineon.com/cms/en/design-support/software/device-driver-libraries/psoc-6-peripheral-driver-library-pdl-for-psoc-creator/ + +## Open-Source Software + +This software makes use of the following open-source software libraries and components: + +| Name | Version | License ([SPDX](https://spdx.org/licenses/)) | URL +|----------------------------|--------:|--------------------------------------------------------------------------|--------------------------------------------- +| SystemK | 1.0 | [AGPL-3.0-or-later](https://spdx.org/licenses/AGPL-3.0-or-later.html) | https://git.ktag.clubk.club/Software/SystemK/ +| FreeRTOS™ | 10.0.1 | [MIT](https://spdx.org/licenses/MIT.html) | https://www.freertos.org/ + + + +† PSOC™ Creator is a trademark of Infineon Technologies AG. All trade names, trademarks, and registered trademarks mentioned in this documentation are the property of their respective owners, and are hereby acknowledged. \ No newline at end of file diff --git a/autocode.py b/autocode.py new file mode 100644 index 0000000..85580f3 --- /dev/null +++ b/autocode.py @@ -0,0 +1,392 @@ +#!/usr/bin/env python +"""Generates C code for the nonvolatile memory (NVM) data structures. +""" + +# Imports +import argparse +import codecs +import datetime +import glob +import logging +import os +import pathlib +import pprint +import shutil + +import colorama +import openpyxl + +APP_NAME = "KTag Autocode Generator" +__author__ = "Joe Kearney" +__version__ = "00.02" + +NVM_SPREADSHEET_FILENAME = "2020TPC Nonvolatile Memory.xlsx" +SCRIPT_PATH = os.path.dirname(os.path.realpath(__file__)) +DESTINATION_PATHS = ("2020TPCApp1.cydsn/NVM", "2020TPCAppNoDFU.cydsn/NVM") + +# See https://developer.arm.com/documentation/dui0472/m/c-and-c---implementation-details/basic-data-types-in-arm-c-and-c-- +# and +# https://en.wikibooks.org/wiki/C_Programming/inttypes.h +CortexM_type_sizes_in_bytes = { + "bool": 1, + "int8_t": 1, + "uint8_t": 1, + "int16_t": 2, + "uint16_t": 2, + "int32_t": 4, + "uint32_t": 4, + "float": 4, + "int64_t": 8, + "uint64_t": 8, + "double": 8, +} + +# Initialize the pretty-printer. +pp = pprint.PrettyPrinter(indent=4) + + +# Openpyxl helper function from https://stackoverflow.com/questions/23562366/how-do-i-get-value-present-in-a-merged-cell +def getValueWithMergeLookup(sheet, cell): + idx = cell.coordinate + for my_range in sheet.merged_cells.ranges: + merged_cells = list(openpyxl.utils.rows_from_range(str(my_range))) + for row in merged_cells: + if idx in row: + # If this is a merged cell, + # return the first cell of the merge range + coordinates_of_first_cell = merged_cells[0][0] + return sheet[coordinates_of_first_cell].value + + return sheet[idx].value + + +# Set up logging. +rootLogger = logging.getLogger() +rootLogger.setLevel(logging.DEBUG) +fileHandler = logging.FileHandler('Autocode.log', mode='w') +logFormatter = logging.Formatter( + '{asctime} {name} {levelname:8s} {message}', style='{') +fileHandler.setFormatter(logFormatter) +rootLogger.addHandler(fileHandler) +consoleHandler = logging.StreamHandler() +consoleHandler.setFormatter(logFormatter) +rootLogger.addHandler(consoleHandler) +logger = logging.getLogger('autocode.py') + + +def main(): + version_information = APP_NAME + ' version ' + __version__ + + logger.info(version_information) + + colorama.init(autoreset=True) + + parser = argparse.ArgumentParser( + description='Generate autocode', epilog=version_information) + commands = parser.add_mutually_exclusive_group() + commands.add_argument( + '-n', '--nvm', help='Generate nonvolatile memory autocode', action='store_true') + parser.add_argument('-v', '--version', action='version', + version=version_information) + + args = parser.parse_args() + d = vars(args) + + if (d['nvm'] == True): + generate_NVM_autocode() + else: + # If no commands were specified, show the help and exit. + parser.parse_args(['-h']) + + +def generate_NVM_autocode(): + logger.info('Generating nonvolatile memory autocode...') + + wb = openpyxl.load_workbook( + filename=NVM_SPREADSHEET_FILENAME) + ws = wb['NVM'] + + headerColumnsByName = dict() + for rowIndex, row in enumerate(ws.iter_rows(min_row=1, max_row=1), start=1): + for columnIndex, cell in enumerate(row, start=0): + headerColumnsByName[cell.value] = columnIndex + + NVMItemsByID = dict() + NVMLocations = set() + NVMEntriesByLocation = dict() + + for rowIndex, row in enumerate(ws.iter_rows(min_row=2)): + if (row[headerColumnsByName['ID']].value is not None): + item_ID = int(row[headerColumnsByName['ID']].value) + + nvm_item = dict() + nvm_item['ID'] = item_ID + nvm_item['Location'] = row[headerColumnsByName['Location']].value + if nvm_item['Location'] != 'None': + if nvm_item['Location'] not in NVMLocations: + # This is a new location. + NVMLocations.add(nvm_item['Location']) + NVMEntriesByLocation[nvm_item['Location']] = list() + + nvm_item['Name'] = row[headerColumnsByName['Item Name']].value + nvm_item['Item Name in Code'] = nvm_item['Name'].replace( + ' ', '_') + nvm_item['Item Shorthand Macro'] = 'NVM_' + \ + nvm_item['Name'].upper().replace(' ', '_') + nvm_item['Entry'] = row[headerColumnsByName['Entry Name']].value + nvm_item['Entry Name in Code'] = 'NVM_' + \ + nvm_item['Entry'].replace(' ', '_') + nvm_item['Entry Type Name'] = nvm_item['Entry Name in Code'] + '_T' + nvm_item['RAM Entry Name in Code'] = 'NVM_' + \ + nvm_item['Entry'].replace(' ', '_') + nvm_item['Datatype'] = row[headerColumnsByName['Datatype']].value + + # Validate the datatype and get the size. + if nvm_item['Datatype'] not in CortexM_type_sizes_in_bytes.keys(): + logger.error('NVM item ' + str(item_ID) + ' on row ' + str(rowIndex + 2) + + ' has unknown datatype \"' + str(nvm_item['Datatype']) + '\"!') + else: + nvm_item['Data Size in Bytes'] = CortexM_type_sizes_in_bytes[nvm_item['Datatype']] + + nvm_item['Default Value'] = row[headerColumnsByName['Default Value']].value + nvm_item['Description'] = row[headerColumnsByName['Description']].value + nvm_item['Notes'] = row[headerColumnsByName['Notes']].value + + # pp.pprint(nvm_item) + if nvm_item['Entry'] not in NVMEntriesByLocation[nvm_item['Location']]: + NVMEntriesByLocation[nvm_item['Location']].append( + nvm_item['Entry']) + NVMItemsByID[item_ID] = nvm_item + + for location in NVMLocations: + logger.info('Generating code for ' + location + ' NVM.') + + with codecs.open('NVM_' + location + 'EEPROMEntries.h', 'w', "utf-8") as f: + f.write("/*\n") + f.write( + " * __ ________ _____ ______ __ \n") + f.write( + " * / //_/_ __/___ _____ _ / ___/____ __ _______________ / ____/___ ____/ /__ \n") + f.write( + " * / ,< / / / __ `/ __ `/ \__ \/ __ \/ / / / ___/ ___/ _ \ / / / __ \/ __ / _ \ \n") + f.write( + " * / /| | / / / /_/ / /_/ / ___/ / /_/ / /_/ / / / /__/ __/ / /___/ /_/ / /_/ / __/ \n") + f.write( + " * /_/ |_|/_/ \__,_/\__, / /____/\____/\__,_/_/ \___/\___/ \____/\____/\__,_/\___/ \n") + f.write( + " * /____/ \n") + f.write(" *\n") + f.write( + " * 🃞 THIS FILE IS PART OF THE KTAG SOURCE CODE. Visit https://ktag.clubk.club/ for more. 🃞\n") + f.write(" *\n") + f.write(" */\n") + + f.write('\n') + f.write('/** \\file\n') + f.write( + ' * \\brief [Autogenerated] This file declares the ' + location + ' EEPROM entries.\n') + f.write(' *\n') + f.write( + ' * \\note AUTOGENERATED: This file was generated automatically on ' + + '{dt:%A}, {dt:%B} {dt.day}, {dt.year} at {dt:%r}'.format(dt=datetime.datetime.now()) + + '.\n') + f.write(' * DO NOT MODIFY THIS FILE MANUALLY!\n') + f.write(' */\n') + f.write('\n') + f.write('#ifndef NVM_' + location.upper() + 'EEPROMENTRIES_H\n') + f.write('#define NVM_' + location.upper() + 'EEPROMENTRIES_H\n') + f.write('\n') + f.write('#ifdef __cplusplus\n') + f.write('extern "C" {\n') + f.write('#endif\n') + f.write('\n') + f.write('/* Preprocessor and Type Definitions */\n') + f.write('\n') + + for entry in NVMEntriesByLocation[location]: + entry_name_in_code = 'NVM_' + entry.replace(' ', '_') + entry_type_name = entry_name_in_code + '_T' + f.write('typedef struct __attribute__((packed))\n') + f.write('{\n') + # List all the items in this entry. + for item_ID in NVMItemsByID: + item = NVMItemsByID[item_ID] + if item['Entry'] == entry: + if item['Description'] is not None: + f.write(' //! ' + item['Description'] + '\n') + f.write(' ' + item['Datatype'] + + ' ' + item['Item Name in Code'] + ';\n') + f.write('} ' + entry_type_name + ';\n') + f.write('\n') + + f.write('\n') + f.write('/* Include Files */\n') + f.write('\n') + f.write('/* Public Variables */\n') + f.write('\n') + + for entry in NVMEntriesByLocation[location]: + entry_name_in_code = 'NVM_' + entry.replace(' ', '_') + entry_type_name = entry_name_in_code + '_T' + f.write('extern NVM_EEPROMEntry_T ' + + entry_name_in_code + ';\n') + + f.write('\n') + f.write('extern NVM_EEPROMEntry_T * const NVM_' + + location + 'EEPROMEntries[];\n') + f.write('extern const uint8_t NVM_N_' + + location.upper() + '_EEPROM_ENTRIES;\n') + f.write('\n') + f.write('// Shorthand macros, to save you time.\n') + + for item_ID in NVMItemsByID: + item = NVMItemsByID[item_ID] + if item['Location'] == location: + f.write('#define ' + item['Item Shorthand Macro'] + ' (((' + item['Entry Type Name'] + + '*)' + item['Entry Name in Code'] + '.Value)->' + item['Item Name in Code'] + ')\n') + f.write('#define ' + item['Item Shorthand Macro'] + + '_ENTRY_PTR (&' + item['Entry Name in Code'] + ')\n') + f.write('\n') + + f.write('\n') + f.write('#ifdef __cplusplus\n') + f.write('}\n') + f.write('#endif\n') + f.write('\n') + f.write('#endif // NVM_' + location.upper() + 'EEPROMENTRIES_H\n') + f.write('\n') + + with codecs.open('NVM_' + location + 'EEPROMEntries.c', 'w', "utf-8") as f: + f.write("/*\n") + f.write( + " * __ ________ _____ ______ __ \n") + f.write( + " * / //_/_ __/___ _____ _ / ___/____ __ _______________ / ____/___ ____/ /__ \n") + f.write( + " * / ,< / / / __ `/ __ `/ \__ \/ __ \/ / / / ___/ ___/ _ \ / / / __ \/ __ / _ \ \n") + f.write( + " * / /| | / / / /_/ / /_/ / ___/ / /_/ / /_/ / / / /__/ __/ / /___/ /_/ / /_/ / __/ \n") + f.write( + " * /_/ |_|/_/ \__,_/\__, / /____/\____/\__,_/_/ \___/\___/ \____/\____/\__,_/\___/ \n") + f.write( + " * /____/ \n") + f.write(" *\n") + f.write( + " * 🃞 THIS FILE IS PART OF THE KTAG SOURCE CODE. Visit https://ktag.clubk.club/ for more. 🃞\n") + f.write(" *\n") + f.write(" */\n") + + f.write('\n') + f.write('/** \\file\n') + f.write( + ' * \\brief [Autogenerated] This file defines the ' + location + ' EEPROM entries.\n') + f.write(' *\n') + f.write( + ' * \\note AUTOGENERATED: This file was generated automatically on ' + + '{dt:%A}, {dt:%B} {dt.day}, {dt.year} at {dt:%r}'.format(dt=datetime.datetime.now()) + + '.\n') + f.write(' * DO NOT MODIFY THIS FILE MANUALLY!\n') + f.write(' */\n') + f.write('\n') + + f.write('/* Include Files */\n') + f.write('#include "KTag.h"\n') + f.write('\n') + f.write('/* EEPROM Entries */\n') + f.write('\n') + f.write('/** \defgroup NVM_' + location.upper() + + '_EEPROM NVM ' + location + ' EEPROM\n') + f.write(' *\n') + f.write(' * The ' + location + + ' EEPROM is divided into logical "entries", represented by instances of the #NVM_EEPROMEntry_T type.\n') + f.write(' * At startup, these entries are loaded into their respective RAM copies by NVM_Init' + + location + 'EEPROM(). The application\n') + f.write(' * then updates the RAM copies directly, and requests that the NVM_' + + location + 'EEPROMTask() save these back to the EEPROM\n') + f.write(' * when necessary.\n') + f.write(' * @{ */\n') + f.write('\n') + + # Here is the magic: keep track of the locations in EE as we create the data structures. + current_EE_address_in_bytes = 0 + + for entry in NVMEntriesByLocation[location]: + entry_name_in_code = 'NVM_' + entry.replace(' ', '_') + entry_RAM_name_in_code = 'RAM_' + entry.replace(' ', '_') + entry_default_name_in_code = 'DEFAULT_' + \ + entry.replace(' ', '_') + entry_type_name = entry_name_in_code + '_T' + f.write('static ' + entry_type_name + ' ' + + entry_RAM_name_in_code + ';\n') + f.write('\n') + f.write('static const ' + entry_type_name + ' ' + + entry_default_name_in_code + ' = \n') + f.write('{\n') + + # Assign defaults to all the items in this entry, and calculate the total size. + entry_size_in_bytes = 0 + CRC_size_in_bytes = 2 + for item_ID in NVMItemsByID: + item = NVMItemsByID[item_ID] + if item['Entry'] == entry: + if item['Description'] is not None: + f.write(' //! ' + item['Description'] + '\n') + f.write( + ' .' + item['Item Name in Code'] + ' = ' + str(item['Default Value']) + ',\n') + entry_size_in_bytes += item['Data Size in Bytes'] + + f.write('};\n') + f.write('\n') + + f.write('NVM_EEPROMEntry_T ' + entry_name_in_code + ' = \n') + f.write('{\n') + f.write(' //! Size == sizeof(' + entry_type_name + ')\n') + f.write(' .Size = ' + str(entry_size_in_bytes) + ',\n') + f.write(' .EE_Address = ' + + str(current_EE_address_in_bytes) + ',\n') + current_EE_address_in_bytes += entry_size_in_bytes + f.write(' .EE_CRC_Address = ' + + str(current_EE_address_in_bytes) + ',\n') + current_EE_address_in_bytes += CRC_size_in_bytes + f.write(' .Value = (uint8_t *)&' + + entry_RAM_name_in_code + ',\n') + f.write(' .Default = (uint8_t *)&' + + entry_default_name_in_code + ',\n') + f.write(' .State = NVM_STATE_UNINITIALIZED\n') + f.write('};\n') + + f.write('\n') + f.write('/** @} */\n') + f.write('\n') + f.write('NVM_EEPROMEntry_T * const NVM_' + + location + 'EEPROMEntries[] =\n') + f.write('{\n') + + for entry in NVMEntriesByLocation[location]: + entry_name_in_code = 'NVM_' + entry.replace(' ', '_') + f.write(' &' + entry_name_in_code + ',\n') + + f.write('};\n') + f.write('\n') + f.write('//! Size of the #NVM_' + location + + 'EEPROMEntries array (i.e. the number of ' + location + ' EEPROM entries).\n') + f.write('const uint8_t NVM_N_' + location.upper() + '_EEPROM_ENTRIES = (uint8_t) (sizeof(NVM_' + + location + 'EEPROMEntries) / sizeof(NVM_EEPROMEntry_T *));\n') + f.write('\n') + + for destination in DESTINATION_PATHS: + destination = os.path.normpath(os.path.join(SCRIPT_PATH, destination)) + logger.info("Copying files to " + destination + ".") + for file in glob.glob("NVM_*.[ch]"): + shutil.copy2(file, destination) + + logger.info("Cleaning up.") + for file in glob.glob("NVM_*.[ch]"): + path = pathlib.Path(file) + path.unlink() + + logger.info('Nonvolatile memory autocode generation completed.') + + +if __name__ == "__main__": + main()