From 88e47a8b23eb433fea4a3716ba5857fcfe67f55a Mon Sep 17 00:00:00 2001 From: Frank Voorburg Date: Thu, 26 Mar 2020 11:29:46 +0000 Subject: [PATCH] Refs #817. Reintegrating branch where the S32K11 port was developed. git-svn-id: https://svn.code.sf.net/p/openblt/code/trunk@773 5dc33758-31d5-4daf-9ae8-b24bf3d40d73 --- .../Boot/.cproject | 152 + .../Boot/.project | 59 + .../com.nxp.s32ds.cle.runtime.component.prefs | 8 + ...ssorexpert.core.ide.newprojectwizard.prefs | 2 + .../Boot/.settings/language.settings.xml | 14 + .../org.eclipse.cdt.codan.core.prefs | 3 + .../Boot/.settings/org.eclipse.cdt.core.prefs | 21 + .../Boot/Boot_Debug.launch | 221 + .../Boot/Debug/openblt_s32k118.elf | Bin 0 -> 551340 bytes .../Boot/Debug/openblt_s32k118.srec | 435 + .../Boot/S32K118_25_flash.ld | 278 + .../Boot/blt_conf.h | 176 + .../Boot/boot.dox | 7 + .../ARMCM0_S32K14_S32K118EVB_GCC/Boot/hooks.c | 307 + .../ARMCM0_S32K14_S32K118EVB_GCC/Boot/led.c | 108 + .../ARMCM0_S32K14_S32K118EVB_GCC/Boot/led.h | 40 + .../Boot/lib/S32K118.h | 10438 ++++++++++++++++ .../Boot/lib/S32K118_features.h | 1302 ++ .../Boot/lib/devassert.h | 84 + .../Boot/lib/device_registers.h | 67 + .../Boot/lib/s32_core_cm0.h | 198 + .../Boot/lib/system_S32K118.c | 176 + .../Boot/lib/system_S32K118.h | 105 + .../ARMCM0_S32K14_S32K118EVB_GCC/Boot/main.c | 189 + .../Boot/startup/startup.c | 248 + .../Boot/startup/startup.h | 133 + .../Boot/startup/startup_S32K118.S | 227 + .../Prog/.cproject | 151 + .../Prog/.project | 26 + .../com.nxp.s32ds.cle.runtime.component.prefs | 8 + ...ssorexpert.core.ide.newprojectwizard.prefs | 2 + .../Prog/.settings/language.settings.xml | 14 + .../org.eclipse.cdt.codan.core.prefs | 3 + .../Prog/.settings/org.eclipse.cdt.core.prefs | 21 + .../Prog/Debug/demoprog_s32k118.elf | Bin 0 -> 502580 bytes .../Prog/Debug/demoprog_s32k118.srec | 206 + .../Prog/Prog_Debug.launch | 221 + .../Prog/S32K118_25_flash.ld | 278 + .../ARMCM0_S32K14_S32K118EVB_GCC/Prog/boot.c | 772 ++ .../ARMCM0_S32K14_S32K118EVB_GCC/Prog/boot.h | 40 + .../Prog/header.h | 42 + .../ARMCM0_S32K14_S32K118EVB_GCC/Prog/led.c | 96 + .../ARMCM0_S32K14_S32K118EVB_GCC/Prog/led.h | 39 + .../Prog/lib/S32K118.h | 10438 ++++++++++++++++ .../Prog/lib/S32K118_features.h | 1302 ++ .../Prog/lib/devassert.h | 84 + .../Prog/lib/device_registers.h | 67 + .../Prog/lib/s32_core_cm0.h | 198 + .../Prog/lib/system_S32K118.c | 176 + .../Prog/lib/system_S32K118.h | 105 + .../ARMCM0_S32K14_S32K118EVB_GCC/Prog/main.c | 187 + .../Prog/prog.dox | 13 + .../Prog/startup/startup.c | 248 + .../Prog/startup/startup.h | 133 + .../Prog/startup/startup_S32K118.S | 228 + .../ARMCM0_S32K14_S32K118EVB_GCC/Prog/timer.c | 88 + .../ARMCM0_S32K14_S32K118EVB_GCC/Prog/timer.h | 38 + .../ARMCM0_S32K14_S32K118EVB_GCC/demo.dox | 8 + .../Boot/S32K118_25_flash.icf | 125 + .../Boot/bin/openblt_s32k118.out | Bin 0 -> 146036 bytes .../Boot/bin/openblt_s32k118.srec | 443 + .../Boot/blt_conf.h | 176 + .../Boot/boot.dox | 7 + .../ARMCM0_S32K14_S32K118EVB_IAR/Boot/hooks.c | 307 + .../Boot/ide/s32k118.dep | 716 ++ .../Boot/ide/s32k118.ewd | 2966 +++++ .../Boot/ide/s32k118.ewp | 2266 ++++ .../Boot/ide/s32k118.ewt | 2528 ++++ .../Boot/ide/s32k118.eww | 7 + .../ARMCM0_S32K14_S32K118EVB_IAR/Boot/led.c | 108 + .../ARMCM0_S32K14_S32K118EVB_IAR/Boot/led.h | 40 + .../Boot/lib/S32K118.h | 10438 ++++++++++++++++ .../Boot/lib/S32K118_features.h | 1302 ++ .../Boot/lib/devassert.h | 84 + .../Boot/lib/device_registers.h | 67 + .../Boot/lib/s32_core_cm0.h | 198 + .../Boot/lib/startup.c | 248 + .../Boot/lib/startup.h | 133 + .../Boot/lib/system_S32K118.c | 176 + .../Boot/lib/system_S32K118.h | 105 + .../ARMCM0_S32K14_S32K118EVB_IAR/Boot/main.c | 186 + .../Boot/startup_S32K118.s | 287 + .../Prog/S32K118_25_flash.icf | 125 + .../Prog/bin/demoprog_s32k118.out | Bin 0 -> 54708 bytes .../Prog/bin/demoprog_s32k118.srec | 195 + .../ARMCM0_S32K14_S32K118EVB_IAR/Prog/boot.c | 772 ++ .../ARMCM0_S32K14_S32K118EVB_IAR/Prog/boot.h | 40 + .../Prog/header.h | 42 + .../Prog/ide/s32k118.dep | 247 + .../Prog/ide/s32k118.ewd | 2966 +++++ .../Prog/ide/s32k118.ewp | 2167 ++++ .../Prog/ide/s32k118.ewt | 2432 ++++ .../Prog/ide/s32k118.eww | 7 + .../ARMCM0_S32K14_S32K118EVB_IAR/Prog/led.c | 96 + .../ARMCM0_S32K14_S32K118EVB_IAR/Prog/led.h | 39 + .../Prog/lib/S32K118.h | 10438 ++++++++++++++++ .../Prog/lib/S32K118_features.h | 1302 ++ .../Prog/lib/devassert.h | 84 + .../Prog/lib/device_registers.h | 67 + .../Prog/lib/s32_core_cm0.h | 198 + .../Prog/lib/startup.c | 248 + .../Prog/lib/startup.h | 133 + .../Prog/lib/system_S32K118.c | 176 + .../Prog/lib/system_S32K118.h | 105 + .../ARMCM0_S32K14_S32K118EVB_IAR/Prog/main.c | 184 + .../Prog/prog.dox | 13 + .../Prog/startup_S32K118.s | 288 + .../ARMCM0_S32K14_S32K118EVB_IAR/Prog/timer.c | 88 + .../ARMCM0_S32K14_S32K118EVB_IAR/Prog/timer.h | 38 + .../ARMCM0_S32K14_S32K118EVB_IAR/demo.dox | 8 + .../Boot/Debug/openblt_s32k144.elf | Bin 643712 -> 643712 bytes .../Boot/Debug/openblt_s32k144.srec | 4 +- .../ARMCM4_S32K14_S32K144EVB_GCC/Boot/main.c | 4 +- .../Prog/Debug/demoprog_s32k144.elf | Bin 593988 -> 593988 bytes .../ARMCM4_S32K14_S32K144EVB_GCC/Prog/boot.c | 2 +- .../ARMCM4_S32K14_S32K144EVB_GCC/Prog/main.c | 4 +- .../ARMCM4_S32K14_S32K144EVB_IAR/Boot/main.c | 2 +- Target/Source/ARMCM0_S32K11/GCC/cpu_comp.c | 59 + Target/Source/ARMCM0_S32K11/IAR/cpu_comp.c | 59 + Target/Source/ARMCM0_S32K11/can.c | 600 + Target/Source/ARMCM0_S32K11/cpu.c | 192 + Target/Source/ARMCM0_S32K11/flash.c | 1018 ++ Target/Source/ARMCM0_S32K11/flash.h | 45 + Target/Source/ARMCM0_S32K11/nvm.c | 245 + Target/Source/ARMCM0_S32K11/rs232.c | 335 + Target/Source/ARMCM0_S32K11/target.dox | 9 + Target/Source/ARMCM0_S32K11/timer.c | 110 + Target/Source/ARMCM0_S32K11/types.h | 57 + 128 files changed, 78378 insertions(+), 8 deletions(-) create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.cproject create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.project create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/com.nxp.s32ds.cle.runtime.component.prefs create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/com.processorexpert.core.ide.newprojectwizard.prefs create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/language.settings.xml create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/org.eclipse.cdt.core.prefs create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/Boot_Debug.launch create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/Debug/openblt_s32k118.elf create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/Debug/openblt_s32k118.srec create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/S32K118_25_flash.ld create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/blt_conf.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/boot.dox create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/hooks.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/led.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/led.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/S32K118.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/S32K118_features.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/devassert.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/device_registers.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/s32_core_cm0.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/system_S32K118.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/system_S32K118.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/main.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/startup/startup.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/startup/startup.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/startup/startup_S32K118.S create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.cproject create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.project create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/com.nxp.s32ds.cle.runtime.component.prefs create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/com.processorexpert.core.ide.newprojectwizard.prefs create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/language.settings.xml create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/org.eclipse.cdt.core.prefs create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/Debug/demoprog_s32k118.elf create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/Debug/demoprog_s32k118.srec create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/Prog_Debug.launch create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/S32K118_25_flash.ld create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/boot.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/boot.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/header.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/led.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/led.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/S32K118.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/S32K118_features.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/devassert.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/device_registers.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/s32_core_cm0.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/system_S32K118.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/system_S32K118.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/main.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/prog.dox create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/startup/startup.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/startup/startup.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/startup/startup_S32K118.S create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/timer.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/timer.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/demo.dox create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/S32K118_25_flash.icf create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/bin/openblt_s32k118.out create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/bin/openblt_s32k118.srec create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/blt_conf.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/boot.dox create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/hooks.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.dep create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.ewd create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.ewp create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.ewt create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.eww create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/led.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/led.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/S32K118.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/S32K118_features.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/devassert.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/device_registers.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/s32_core_cm0.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/startup.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/startup.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/system_S32K118.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/system_S32K118.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/main.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/startup_S32K118.s create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/S32K118_25_flash.icf create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/bin/demoprog_s32k118.out create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/bin/demoprog_s32k118.srec create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/boot.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/boot.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/header.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.dep create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.ewd create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.ewp create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.ewt create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.eww create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/led.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/led.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/S32K118.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/S32K118_features.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/devassert.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/device_registers.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/s32_core_cm0.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/startup.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/startup.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/system_S32K118.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/system_S32K118.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/main.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/prog.dox create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/startup_S32K118.s create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/timer.c create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/timer.h create mode 100644 Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/demo.dox create mode 100644 Target/Source/ARMCM0_S32K11/GCC/cpu_comp.c create mode 100644 Target/Source/ARMCM0_S32K11/IAR/cpu_comp.c create mode 100644 Target/Source/ARMCM0_S32K11/can.c create mode 100644 Target/Source/ARMCM0_S32K11/cpu.c create mode 100644 Target/Source/ARMCM0_S32K11/flash.c create mode 100644 Target/Source/ARMCM0_S32K11/flash.h create mode 100644 Target/Source/ARMCM0_S32K11/nvm.c create mode 100644 Target/Source/ARMCM0_S32K11/rs232.c create mode 100644 Target/Source/ARMCM0_S32K11/target.dox create mode 100644 Target/Source/ARMCM0_S32K11/timer.c create mode 100644 Target/Source/ARMCM0_S32K11/types.h diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.cproject b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.cproject new file mode 100644 index 00000000..60fbbc7e --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.cproject @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.project b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.project new file mode 100644 index 00000000..72af3138 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.project @@ -0,0 +1,59 @@ + + + Boot + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + core + 2 + OPENBLT_CORE + + + + + 1585049461138 + core + 9 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-false-false-ARMCM0_S32K11 + + + + 1585049472883 + core/ARMCM0_S32K11 + 9 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-false-false-GCC + + + + + + OPENBLT_CORE + $%7BPARENT-3-PROJECT_LOC%7D/Source + + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/com.nxp.s32ds.cle.runtime.component.prefs b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/com.nxp.s32ds.cle.runtime.component.prefs new file mode 100644 index 00000000..637f1f53 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/com.nxp.s32ds.cle.runtime.component.prefs @@ -0,0 +1,8 @@ +com.nxp.s32ds.cle.runtime.component.registry.archetype.id=application +com.nxp.s32ds.cle.runtime.component.registry.archetype.platform.id= +com.nxp.s32ds.cle.runtime.hardware.registry.core.id=CortexM0P +com.nxp.s32ds.cle.runtime.hardware.registry.device.id=S32K118 +com.nxp.s32ds.cle.runtime.hardware.registry.deviceCore.id=S32K118_M0P +com.nxp.s32ds.cle.runtime.hardware.registry.family.id=S32K1 +com.nxp.s32ds.cle.runtime.lang.registry.lang.id=c +eclipse.preferences.version=1 diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/com.processorexpert.core.ide.newprojectwizard.prefs b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/com.processorexpert.core.ide.newprojectwizard.prefs new file mode 100644 index 00000000..87ca305f --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/com.processorexpert.core.ide.newprojectwizard.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +versionGenerated/versionGenerated=1.8.4.RT7_b1743-0713 diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/language.settings.xml b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/language.settings.xml new file mode 100644 index 00000000..1d5a5190 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/language.settings.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/org.eclipse.cdt.codan.core.prefs b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 00000000..98b63502 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/org.eclipse.cdt.core.prefs b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 00000000..ad5ecd0f --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/.settings/org.eclipse.cdt.core.prefs @@ -0,0 +1,21 @@ +eclipse.preferences.version=1 +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.1550428572/PATH/delimiter=; +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.1550428572/PATH/operation=prepend +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.1550428572/PATH/value= +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.1550428572/append=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.1550428572/appendContributed=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.1790416382/PATH/delimiter=; +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.1790416382/PATH/operation=prepend +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.1790416382/PATH/value= +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.1790416382/append=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.1790416382/appendContributed=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.2059606998/PATH/delimiter=; +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.2059606998/PATH/operation=prepend +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.2059606998/PATH/value= +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.2059606998/append=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.2059606998/appendContributed=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.1486592527/PATH/delimiter=; +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.1486592527/PATH/operation=prepend +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.1486592527/PATH/value= +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.1486592527/append=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.1486592527/appendContributed=true diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/Boot_Debug.launch b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/Boot_Debug.launch new file mode 100644 index 00000000..0374d306 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/Boot_Debug.launch @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/Debug/openblt_s32k118.elf b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/Debug/openblt_s32k118.elf new file mode 100644 index 0000000000000000000000000000000000000000..ef1f15030daf7bd26fbf87a959ff6c6d0178ea08 GIT binary patch literal 551340 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\UpSTsAiaUk{6mp zde&o_$dj!+JGm-Z@m?axJU_t5VB8P${e%fD_!rfnM)c^?44$^NA z)QUF(PHR(4p$yW7@DMCm8$)H#Gg=W{g@tI}pp`aM`|o-v!?a!-Acbq+d>0U*?fd^6 z(|+s*Ta-4PzMhKKc2Tw+qs^sb?pf{qC5RcTb)xT#qUjg%+w#prpMD2%E zcRR05d>#Ev(%#$zhh%NEE0ihP1r?xN(B6F$wp1;T4)qtck1b$J)6T5`q-(!>1 zN%|)>m$l~foj``xX)Bahv@?RCysD-DPmOU+J5KZVy7um2#Jr*1N_&5n_H|k=Zfa*- zgfd&(M5*m9t=JN_9BpkkqU373FG6`+%cW_Ur?rcRGGF^4?NtTZqm=p;YW?ZFc}Lqw zg@U`<(MN!L+O+jh7HQjQA1l_nWy7IFyOZX0saB&w3uW4cY)IwWR@$H|v=fxA-PgWJ zm4!;}Q8Q2;Xn$yhRHZ#q1WL7bEzORHT2&a7HQKNpfLbkM9h8r>?=av{r(L3e^09V7 zGnDn((x;Fbw8_(u8ns4r`fSqjJ^?gq9S@>sE!qM~&s((#w6eEp_r=4ZT`N2S>529| z+DtpNgY>F8wIlhkJ=G4phK9Pd`~9Ho))v@8*`w9o#8c|k4rjuzPkVheDE->QA455y zeNO=x)Xx3{${}sQtB5(QZRi7YMB924%4gar8qm+RO{)=eR6F1Tc%gmj3d&3EcXTox z*P8u^C==SS6xb%UHomY;X^rUYG_Ac!S+l+F1QiV(bmeWJIO=}C0ywVQ!-3LCcb{sb z&bn*^z(rT?0tZ*!Qpy$Gbg5!U?z*^hkUVtfXuI~*byN1_rSr~&9$k) z6Rg{84>+TXr=2TA$D%`asLnJJlrWvC1Q4$4+6-HSE}ahUk-9~{AWD=juN3`^*6pOT zZ;Y;)t}D;#KK~TVSX~57nK<1zB_Q#-fDb`Q&}CBMa!%*LhIC#x*a}F}#nI(ZvToCD zK#Fcp4%$oA)!zg2qK@qgNYj0@54Ln&%~yzdNq7A@D3^5wrEt$c{toGij{Xx!MyBpJ zDuZ6tnbQ&Kn(i$s>0Q_TX#u}1od*rRo4P5=RI_ynmXL1gdcK2{qwAzhCs$WYFW|Or zC1oXfx?uX!B40N!45>i(d@d-3x_O7-cSqN^1k8K7LyG`KIu7ly#ky^?(WMey^A`A( z>co`jmg(H+GlO#7>M2kvbT928-PfJo2&mL;y#silJ5mU!(q+-T_CuZ70Ys_M{YrP& zwYs88*dFN`I{rA*{*6V&;0I5M|hVvYwQMdj!C{4Oa$}yXD>#3gHqPzJ9 zC~dkb+N;`i(Uf>T(KWsTTZgWJ5{XV-AEnt(bsMNe+NBG<52;%>{3{%Kb#r$>>eF?` zfZ4C}xsK2SI@|AH8`PcJh37J)Q_xy4tV^OXKce%aoHod&FB`$aY|eE8B5bVo0-|h& zvH&qQy`^x7wXq6>6mRo=4y1E7Ki&tNx2gXJQIc)^sSQRY#qf9nXKOuy3?9W2*J(3r2#|Fr

Nn8%e4+oH3O!@`c$yY3^=#Tq$MpjpkS6r}H$j=y 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
ekN#`0Lsz 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�#j}6$a&$a?{Q2*rfBg9Q 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 m_interrupts + + .flash_config : + { + . = ALIGN(4); + KEEP(*(.FlashConfig)) /* Flash Configuration Field (FCF) */ + . = ALIGN(4); + } > m_flash_config + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* Define a global symbol at end of code. */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization. */ + .interrupts_ram : + { + . = ALIGN(4); + __VECTOR_RAM__ = .; + __RAM_START = .; + __interrupts_ram_start__ = .; /* Create a global symbol at data start. */ + *(.m_interrupts_ram) /* This is a user defined section. */ + . += M_VECTOR_RAM_SIZE; + . = ALIGN(4); + __interrupts_ram_end__ = .; /* Define a global symbol at data end. */ + } > m_data + + __VECTOR_RAM = DEFINED(__flash_vector_table__) ? ORIGIN(m_interrupts) : __VECTOR_RAM__ ; + __RAM_VECTOR_TABLE_SIZE = DEFINED(__flash_vector_table__) ? 0x0 : (__interrupts_ram_end__ - __interrupts_ram_start__) ; + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* Create a global symbol at data start. */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* Define a global symbol at data end. */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + __CODE_ROM = __DATA_END; /* Symbol is used by code initialization. */ + .code : AT(__CODE_ROM) + { + . = ALIGN(4); + __CODE_RAM = .; + __code_start__ = .; /* Create a global symbol at code start. */ + __code_ram_start__ = .; + *(.code_ram) /* Custom section for storing code in RAM */ + . = ALIGN(4); + __code_end__ = .; /* Define a global symbol at code end. */ + __code_ram_end__ = .; + } > m_data + + __CODE_END = __CODE_ROM + (__code_end__ - __code_start__); + __CUSTOM_ROM = __CODE_END; + + /* Custom Section Block that can be used to place data at absolute address. */ + /* Use __attribute__((section (".customSection"))) to place data here. */ + .customSectionBlock ORIGIN(m_data_2) : AT(__CUSTOM_ROM) + { + __customSection_start__ = .; + KEEP(*(.customSection)) /* Keep section even if not referenced. */ + __customSection_end__ = .; + } > m_data_2 + __CUSTOM_END = __CUSTOM_ROM + (__customSection_end__ - __customSection_start__); + + /* Uninitialized data section. */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section. */ + . = ALIGN(4); + __BSS_START = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __BSS_END = .; + } > m_data_2 + + .heap : + { + . = ALIGN(8); + __end__ = .; + __heap_start__ = .; + PROVIDE(end = .); + PROVIDE(_end = .); + PROVIDE(__end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; + __heap_end__ = .; + } > m_data_2 + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + __RAM_END = __StackTop; + + .stack __StackLimit : + { + . = ALIGN(8); + __stack_start__ = .; + . += STACK_SIZE; + __stack_end__ = .; + } > m_data_2 + + /* Labels required by EWL */ + __START_BSS = __BSS_START; + __END_BSS = __BSS_END; + __SP_INIT = __StackTop; + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data_2 overflowed with stack and heap") +} + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/blt_conf.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/blt_conf.h new file mode 100644 index 00000000..b8eb972f --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/blt_conf.h @@ -0,0 +1,176 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/blt_conf.h +* \brief Bootloader configuration header file. +* \ingroup Boot_ARMCM0_S32K14_S32K118EVB_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ +#ifndef BLT_CONF_H +#define BLT_CONF_H + +/**************************************************************************************** +* C P U D R I V E R C O N F I G U R A T I O N +****************************************************************************************/ +/* To properly initialize the baudrate clocks of the communication interface, typically + * the speed of the crystal oscillator and/or the speed at which the system runs is + * needed. Set these through configurables BOOT_CPU_XTAL_SPEED_KHZ and + * BOOT_CPU_SYSTEM_SPEED_KHZ, respectively. To enable data exchange with the host that is + * not dependent on the targets architecture, the byte ordering needs to be known. + * Setting BOOT_CPU_BYTE_ORDER_MOTOROLA to 1 selects big endian mode and 0 selects + * little endian mode. + * + * Set BOOT_CPU_USER_PROGRAM_START_HOOK to 1 if you would like a hook function to be + * called the moment the user program is about to be started. This could be used to + * de-initialize application specific parts, for example to stop blinking an LED, etc. + */ +/** \brief Frequency of the external crystal oscillator. */ +#define BOOT_CPU_XTAL_SPEED_KHZ (40000) +/** \brief Desired system speed. */ +#define BOOT_CPU_SYSTEM_SPEED_KHZ (48000) +/** \brief Motorola or Intel style byte ordering. */ +#define BOOT_CPU_BYTE_ORDER_MOTOROLA (0) +/** \brief Enable/disable hook function call right before user program start. */ +#define BOOT_CPU_USER_PROGRAM_START_HOOK (1) + + +/**************************************************************************************** +* C O M M U N I C A T I O N I N T E R F A C E C O N F I G U R A T I O N +****************************************************************************************/ +/* The UART communication interface is selected by setting the BOOT_COM_UART_ENABLE + * configurable to 1. Configurable BOOT_COM_UART_BAUDRATE selects the communication speed + * in bits/second. The maximum amount of data bytes in a message for data transmission + * and reception is set through BOOT_COM_UART_TX_MAX_DATA and BOOT_COM_UART_RX_MAX_DATA, + * respectively. It is common for a microcontroller to have more than 1 UART interface + * on board. The zero-based BOOT_COM_UART_CHANNEL_INDEX selects the UART interface. + * + */ +/** \brief Enable/disable UART transport layer. */ +#define BOOT_COM_RS232_ENABLE (1) +/** \brief Configure the desired communication speed. */ +#define BOOT_COM_RS232_BAUDRATE (57600) +/** \brief Configure number of bytes in the target->host data packet. */ +#define BOOT_COM_RS232_TX_MAX_DATA (64) +/** \brief Configure number of bytes in the host->target data packet. */ +#define BOOT_COM_RS232_RX_MAX_DATA (64) +/** \brief Select the desired UART peripheral as a zero based index. */ +#define BOOT_COM_RS232_CHANNEL_INDEX (0) + +/* The CAN communication interface is selected by setting the BOOT_COM_CAN_ENABLE + * configurable to 1. Configurable BOOT_COM_CAN_BAUDRATE selects the communication speed + * in bits/second. Two CAN messages are reserved for communication with the host. The + * message identifier for sending data from the target to the host is configured with + * BOOT_COM_CAN_TXMSG_ID. The one for receiving data from the host is configured with + * BOOT_COM_CAN_RXMSG_ID. Note that an extended 29-bit CAN identifier is configured by + * OR-ing with mask 0x80000000. The maximum amount of data bytes in a message for data + * transmission and reception is set through BOOT_COM_CAN_TX_MAX_DATA and + * BOOT_COM_CAN_RX_MAX_DATA, respectively. It is common for a microcontroller to have more + * than 1 CAN controller on board. The zero-based BOOT_COM_CAN_CHANNEL_INDEX selects the + * CAN controller channel. + * + */ +/** \brief Enable/disable CAN transport layer. */ +#define BOOT_COM_CAN_ENABLE (1) +/** \brief Configure the desired CAN baudrate. */ +#define BOOT_COM_CAN_BAUDRATE (500000) +/** \brief Configure CAN message ID target->host. */ +#define BOOT_COM_CAN_TX_MSG_ID (0x7E1 /*| 0x80000000*/) +/** \brief Configure number of bytes in the target->host CAN message. */ +#define BOOT_COM_CAN_TX_MAX_DATA (8) +/** \brief Configure CAN message ID host->target. */ +#define BOOT_COM_CAN_RX_MSG_ID (0x667 /*| 0x80000000*/) +/** \brief Configure number of bytes in the host->target CAN message. */ +#define BOOT_COM_CAN_RX_MAX_DATA (8) +/** \brief Select the desired CAN peripheral as a zero based index. */ +#define BOOT_COM_CAN_CHANNEL_INDEX (0) + + +/**************************************************************************************** +* B A C K D O O R E N T R Y C O N F I G U R A T I O N +****************************************************************************************/ +/* It is possible to implement an application specific method to force the bootloader to + * stay active after a reset. Such a backdoor entry into the bootloader is desired in + * situations where the user program does not run properly and therefore cannot + * reactivate the bootloader. By enabling these hook functions, the application can + * implement the backdoor, which overrides the default backdoor entry that is programmed + * into the bootloader. When desired for security purposes, these hook functions can + * also be implemented in a way that disables the backdoor entry altogether. + */ +/** \brief Enable/disable the backdoor override hook functions. */ +#define BOOT_BACKDOOR_HOOKS_ENABLE (0) + + +/**************************************************************************************** +* N O N - V O L A T I L E M E M O R Y D R I V E R C O N F I G U R A T I O N +****************************************************************************************/ +/* The NVM driver typically supports erase and program operations of the internal memory + * present on the microcontroller. Through these hook functions the NVM driver can be + * extended to support additional memory types such as external flash memory and serial + * eeproms. The size of the internal memory in kilobytes is specified with configurable + * BOOT_NVM_SIZE_KB. If desired the internal checksum writing and verification method can + * be overridden with a application specific method by enabling configuration switch + * BOOT_NVM_CHECKSUM_HOOKS_ENABLE. + */ +/** \brief Enable/disable the NVM hook function for supporting additional memory devices. */ +#define BOOT_NVM_HOOKS_ENABLE (0) +/** \brief Configure the size of the default memory device (typically flash EEPROM). */ +#define BOOT_NVM_SIZE_KB (256) +/** \brief Enable/disable hooks functions to override the user program checksum handling. */ +#define BOOT_NVM_CHECKSUM_HOOKS_ENABLE (0) + + +/**************************************************************************************** +* W A T C H D O G D R I V E R C O N F I G U R A T I O N +****************************************************************************************/ +/* The COP driver cannot be configured internally in the bootloader, because its use + * and configuration is application specific. The bootloader does need to service the + * watchdog in case it is used. When the application requires the use of a watchdog, + * set BOOT_COP_HOOKS_ENABLE to be able to initialize and service the watchdog through + * hook functions. + */ +/** \brief Enable/disable the hook functions for controlling the watchdog. */ +#define BOOT_COP_HOOKS_ENABLE (1) + + +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y C O N F I G U R A T I O N +****************************************************************************************/ +/* A security mechanism can be enabled in the bootloader's XCP module by setting configu- + * rable BOOT_XCP_SEED_KEY_ENABLE to 1. Before any memory erase or programming + * operations can be performed, access to this resource need to be unlocked. + * In the Microboot settings on tab "XCP Protection" you need to specify a DLL that + * implements the unlocking algorithm. The demo programs are configured for the (simple) + * algorithm in "libseednkey.dll". The source code for this DLL is available so it can be + * customized to your needs. + * During the unlock sequence, Microboot requests a seed from the bootloader, which is in + * the format of a byte array. Using this seed the unlock algorithm in the DLL computes + * a key, which is also a byte array, and sends this back to the bootloader. The + * bootloader then verifies this key to determine if programming and erase operations are + * permitted. + * After enabling this feature the hook functions XcpGetSeedHook() and XcpVerifyKeyHook() + * are called by the bootloader to obtain the seed and to verify the key, respectively. + */ +#define BOOT_XCP_SEED_KEY_ENABLE (0) + + +#endif /* BLT_CONF_H */ +/*********************************** end of blt_conf.h *********************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/boot.dox b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/boot.dox new file mode 100644 index 00000000..94742d6d --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/boot.dox @@ -0,0 +1,7 @@ +/** +\defgroup Boot_ARMCM0_S32K14_S32K118EVB_GCC Bootloader +\brief Bootloader. +\ingroup ARMCM0_S32K14_S32K118EVB_GCC +*/ + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/hooks.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/hooks.c new file mode 100644 index 00000000..3bd5251b --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/hooks.c @@ -0,0 +1,307 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/hooks.c +* \brief Bootloader callback source file. +* \ingroup Boot_ARMCM0_S32K14_S32K118EVB_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#include "led.h" /* LED driver header */ +#include "device_registers.h" /* device registers */ + + +/**************************************************************************************** +* B A C K D O O R E N T R Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_BACKDOOR_HOOKS_ENABLE > 0) +/************************************************************************************//** +** \brief Initializes the backdoor entry option. +** \return none. +** +****************************************************************************************/ +void BackDoorInitHook(void) +{ +} /*** end of BackDoorInitHook ***/ + + +/************************************************************************************//** +** \brief Checks if a backdoor entry is requested. +** \return BLT_TRUE if the backdoor entry is requested, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool BackDoorEntryHook(void) +{ + /* default implementation always activates the bootloader after a reset */ + return BLT_TRUE; +} /*** end of BackDoorEntryHook ***/ +#endif /* BOOT_BACKDOOR_HOOKS_ENABLE > 0 */ + + +/**************************************************************************************** +* C P U D R I V E R H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_CPU_USER_PROGRAM_START_HOOK > 0) +/************************************************************************************//** +** \brief Callback that gets called when the bootloader is about to exit and +** hand over control to the user program. This is the last moment that +** some final checking can be performed and if necessary prevent the +** bootloader from activiting the user program. +** \return BLT_TRUE if it is okay to start the user program, BLT_FALSE to keep +** keep the bootloader active. +** +****************************************************************************************/ +blt_bool CpuUserProgramStartHook(void) +{ + /* additional and optional backdoor entry through the pushbutton (SW2) on the board. to + * force the bootloader to stay active after reset, keep it pressed during reset. + */ + if ((PTD->PDIR & GPIO_PDIR_PDI(1 << 3U)) != 0U) + { + /* pushbutton pressed, so do not start the user program and keep the + * bootloader active instead. + */ + return BLT_FALSE; + } + + /* clean up the LED driver */ + LedBlinkExit(); + + /* okay to start the user program */ + return BLT_TRUE; +} /*** end of CpuUserProgramStartHook ***/ +#endif /* BOOT_CPU_USER_PROGRAM_START_HOOK > 0 */ + + +/**************************************************************************************** +* W A T C H D O G D R I V E R H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_COP_HOOKS_ENABLE > 0) +/************************************************************************************//** +** \brief Callback that gets called at the end of the internal COP driver +** initialization routine. It can be used to configure and enable the +** watchdog. +** \return none. +** +****************************************************************************************/ +void CopInitHook(void) +{ + /* this function is called upon initialization. might as well use it to initialize + * the LED driver. It is kind of a visual watchdog anyways. + */ + LedBlinkInit(100); +} /*** end of CopInitHook ***/ + + +/************************************************************************************//** +** \brief Callback that gets called at the end of the internal COP driver +** service routine. This gets called upon initialization and during +** potential long lasting loops and routine. It can be used to service +** the watchdog to prevent a watchdog reset. +** \return none. +** +****************************************************************************************/ +void CopServiceHook(void) +{ + /* run the LED blink task. this is a better place to do it than in the main() program + * loop. certain operations such as flash erase can take a long time, which would cause + * a blink interval to be skipped. this function is also called during such operations, + * so no blink intervals will be skipped when calling the LED blink task here. + */ + LedBlinkTask(); +} /*** end of CopServiceHook ***/ +#endif /* BOOT_COP_HOOKS_ENABLE > 0 */ + + +/**************************************************************************************** +* N O N - V O L A T I L E M E M O R Y D R I V E R H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_NVM_HOOKS_ENABLE > 0) +/************************************************************************************//** +** \brief Callback that gets called at the start of the internal NVM driver +** initialization routine. +** \return none. +** +****************************************************************************************/ +void NvmInitHook(void) +{ +} /*** end of NvmInitHook ***/ + + +/************************************************************************************//** +** \brief Callback that gets called at the start of a firmware update to reinitialize +** the NVM driver. +** \return none. +** +****************************************************************************************/ +void NvmReinitHook(void) +{ +} /*** end of NvmReinitHook ***/ + + +/************************************************************************************//** +** \brief Callback that gets called at the start of the NVM driver write +** routine. It allows additional memory to be operated on. If the address +** is not within the range of the additional memory, then +** BLT_NVM_NOT_IN_RANGE must be returned to indicate that the data hasn't +** been written yet. +** \param addr Start address. +** \param len Length in bytes. +** \param data Pointer to the data buffer. +** \return BLT_NVM_OKAY if successful, BLT_NVM_NOT_IN_RANGE if the address is +** not within the supported memory range, or BLT_NVM_ERROR is the write +** operation failed. +** +****************************************************************************************/ +blt_int8u NvmWriteHook(blt_addr addr, blt_int32u len, blt_int8u *data) +{ + return BLT_NVM_NOT_IN_RANGE; +} /*** end of NvmWriteHook ***/ + + +/************************************************************************************//** +** \brief Callback that gets called at the start of the NVM driver erase +** routine. It allows additional memory to be operated on. If the address +** is not within the range of the additional memory, then +** BLT_NVM_NOT_IN_RANGE must be returned to indicate that the memory +** hasn't been erased yet. +** \param addr Start address. +** \param len Length in bytes. +** \return BLT_NVM_OKAY if successful, BLT_NVM_NOT_IN_RANGE if the address is +** not within the supported memory range, or BLT_NVM_ERROR is the erase +** operation failed. +** +****************************************************************************************/ +blt_int8u NvmEraseHook(blt_addr addr, blt_int32u len) +{ + return BLT_NVM_NOT_IN_RANGE; +} /*** end of NvmEraseHook ***/ + + +/************************************************************************************//** +** \brief Callback that gets called at the end of the NVM programming session. +** \return BLT_TRUE is successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool NvmDoneHook(void) +{ + return BLT_TRUE; +} /*** end of NvmDoneHook ***/ +#endif /* BOOT_NVM_HOOKS_ENABLE > 0 */ + + +#if (BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0) +/************************************************************************************//** +** \brief Verifies the checksum, which indicates that a valid user program is +** present and can be started. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool NvmVerifyChecksumHook(void) +{ + return BLT_TRUE; +} /*** end of NvmVerifyChecksum ***/ + + +/************************************************************************************//** +** \brief Writes a checksum of the user program to non-volatile memory. This is +** performed once the entire user program has been programmed. Through +** the checksum, the bootloader can check if a valid user programming is +** present and can be started. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool NvmWriteChecksumHook(void) +{ + return BLT_TRUE; +} +#endif /* BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0 */ + + +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "libseednkey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + +/*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/led.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/led.c new file mode 100644 index 00000000..c4fb84ef --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/led.c @@ -0,0 +1,108 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/led.c +* \brief LED driver source file. +* \ingroup Boot_ARMCM0_S32K14_S32K118EVB_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#include "led.h" /* module header */ +#include "device_registers.h" /* device registers */ + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/** \brief Holds the desired LED blink interval time. */ +static blt_int16u ledBlinkIntervalMs; + + +/************************************************************************************//** +** \brief Initializes the LED blink driver. +** \param interval_ms Specifies the desired LED blink interval time in milliseconds. +** \return none. +** +****************************************************************************************/ +void LedBlinkInit(blt_int16u interval_ms) +{ + /* LED GPIO pin configuration. PE8 = GPIO, MUX = ALT1. */ + PORTE->PCR[8] = PORT_PCR_MUX(1); + /* Configure Port E pin 8 GPIO as digital output. */ + PTE->PDDR |= GPIO_PDDR_PDD(1 << 8U); + /* Turn the LED off on Port E pin 8. */ + PTE->PCOR |= GPIO_PSOR_PTSO(1 << 8U); + /* store the interval time between LED toggles */ + ledBlinkIntervalMs = interval_ms; +} /*** end of LedBlinkInit ***/ + + +/************************************************************************************//** +** \brief Task function for blinking the LED as a fixed timer interval. +** \return none. +** +****************************************************************************************/ +void LedBlinkTask(void) +{ + static blt_bool ledOn = BLT_FALSE; + static blt_int32u nextBlinkEvent = 0; + + /* check for blink event */ + if (TimerGet() >= nextBlinkEvent) + { + /* toggle the LED state */ + if (ledOn == BLT_FALSE) + { + ledOn = BLT_TRUE; + /* Turn the LED on. */ + PTE->PSOR |= GPIO_PSOR_PTSO(1 << 8U); + } + else + { + ledOn = BLT_FALSE; + /* Turn the LED off. */ + PTE->PCOR |= GPIO_PSOR_PTSO(1 << 8U); + } + /* schedule the next blink event */ + nextBlinkEvent = TimerGet() + ledBlinkIntervalMs; + } +} /*** end of LedBlinkTask ***/ + + +/************************************************************************************//** +** \brief Cleans up the LED blink driver. This is intended to be used upon program +** exit. +** \return none. +** +****************************************************************************************/ +void LedBlinkExit(void) +{ + /* Turn the LED off. */ + PTE->PCOR |= GPIO_PSOR_PTSO(1 << 8U); +} /*** end of LedBlinkExit ***/ + + +/*********************************** end of led.c **************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/led.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/led.h new file mode 100644 index 00000000..1dcb725e --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/led.h @@ -0,0 +1,40 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/led.h +* \brief LED driver header file. +* \ingroup Boot_ARMCM0_S32K14_S32K118EVB_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ +#ifndef LED_H +#define LED_H + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +void LedBlinkInit(blt_int16u interval_ms); +void LedBlinkTask(void); +void LedBlinkExit(void); + + +#endif /* LED_H */ +/*********************************** end of led.h **************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/S32K118.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/S32K118.h new file mode 100644 index 00000000..d1f10a17 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/S32K118.h @@ -0,0 +1,10438 @@ +/* +** ################################################################### +** Processor: S32K118 +** Reference manual: S32K1XXRM Rev. 9, 09/2018 +** Version: rev. 1.3, 2019-02-19 +** Build: b190219 +** +** Abstract: +** Peripheral Access Layer for S32K118 +** +** Copyright (c) 1997 - 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2019 NXP +** All rights reserved. +** +** THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +** INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +** STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +** IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +** +** http: www.nxp.com +** mail: support@nxp.com +** +** Revisions: +** - rev. 1.0 (2017-12-14) - Mihai Volmer +** Initial version based on S32K1XXRM Rev. 6, 12/2017. +** - rev. 1.1 (2018-02-08) - Mihai Volmer +** Renamed the NVIC register array IP to IPR to reflect the register access difference from Cortex-M4 NVIC registers +** Fixed CSE_PRAM base address +** - rev. 1.2 (2018-07-19) - Dan Nastasa +** Updated the header based on S32K1XXRM Rev. 8, 06/2018. +** Added MTB_DWT peripheral to the header file +** - rev. 1.3 (2019-02-19) - Ionut Pavel +** Updated the header based on S32K1XXRM Rev. 9, 09/2018. +** Removed LMEM_LMDR2 register from the header file. +** Modified LMEM_LMPECR register to Read-Only. +** +** ################################################################### +*/ + +/*! + * @file S32K118.h + * @version 1.3 + * @date 2019-02-19 + * @brief Peripheral Access Layer for S32K118 + * + * This file contains register definitions and macros for easy access to their + * bit fields. + * + * This file assumes LITTLE endian system. + */ + +/** +* @page misra_violations MISRA-C:2012 violations +* +* @section [global] +* Violates MISRA 2012 Advisory Rule 2.3, local typedef not referenced +* The SoC header defines typedef for all modules. +* +* @section [global] +* Violates MISRA 2012 Advisory Rule 2.5, local macro not referenced +* The SoC header defines macros for all modules and registers. +* +* @section [global] +* Violates MISRA 2012 Advisory Directive 4.9, Function-like macro +* These are generated macros used for accessing the bit-fields from registers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 5.1, identifier clash +* The supported compilers use more than 31 significant characters for identifiers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 5.2, identifier clash +* The supported compilers use more than 31 significant characters for identifiers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 5.4, identifier clash +* The supported compilers use more than 31 significant characters for identifiers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 5.5, identifier clash +* The supported compilers use more than 31 significant characters for identifiers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 21.1, defined macro '__I' is reserved to the compiler +* This type qualifier is needed to ensure correct I/O access and addressing. +*/ + +/* ---------------------------------------------------------------------------- + -- MCU activation + ---------------------------------------------------------------------------- */ + +/* Prevention from multiple including the same memory map */ +#if !defined(S32K118_H_) /* Check if memory map has not been already included */ +#define S32K118_H_ +#define MCU_S32K118 + +/* Check if another memory map has not been also included */ +#if (defined(MCU_ACTIVE)) + #error S32K118 memory map: There is already included another memory map. Only one memory map can be included. +#endif /* (defined(MCU_ACTIVE)) */ +#define MCU_ACTIVE + +#include + +/** Memory map major version (memory maps with equal major version number are + * compatible) */ +#define MCU_MEM_MAP_VERSION 0x0100u +/** Memory map minor version */ +#define MCU_MEM_MAP_VERSION_MINOR 0x0003u + +/* ---------------------------------------------------------------------------- + -- Generic macros + ---------------------------------------------------------------------------- */ + +/* IO definitions (access restrictions to peripheral registers) */ +/** +* IO Type Qualifiers are used +* \li to specify the access to peripheral variables. +* \li for automatic generation of peripheral register debug information. +*/ +#ifndef __IO +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ +#endif + + +/** +* @brief 32 bits memory read macro. +*/ +#if !defined(REG_READ32) + #define REG_READ32(address) (*(volatile uint32_t*)(address)) +#endif + +/** +* @brief 32 bits memory write macro. +*/ +#if !defined(REG_WRITE32) + #define REG_WRITE32(address, value) ((*(volatile uint32_t*)(address))= (uint32_t)(value)) +#endif + +/** +* @brief 32 bits bits setting macro. +*/ +#if !defined(REG_BIT_SET32) + #define REG_BIT_SET32(address, mask) ((*(volatile uint32_t*)(address))|= (uint32_t)(mask)) +#endif + +/** +* @brief 32 bits bits clearing macro. +*/ +#if !defined(REG_BIT_CLEAR32) + #define REG_BIT_CLEAR32(address, mask) ((*(volatile uint32_t*)(address))&= ((uint32_t)~((uint32_t)(mask)))) +#endif + +/** +* @brief 32 bit clear bits and set with new value +* @note It is user's responsability to make sure that value has only "mask" bits set - (value&~mask)==0 +*/ +#if !defined(REG_RMW32) + #define REG_RMW32(address, mask, value) (REG_WRITE32((address), ((REG_READ32(address)& ((uint32_t)~((uint32_t)(mask))))| ((uint32_t)(value))))) +#endif + + +/* ---------------------------------------------------------------------------- + -- Interrupt vector numbers for S32K118 + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Interrupt_vector_numbers_S32K118 Interrupt vector numbers for S32K118 + * @{ + */ + +/** Interrupt Number Definitions */ +#define NUMBER_OF_INT_VECTORS 48u /**< Number of interrupts in the Vector table */ + +/** + * @brief Defines the Interrupt Numbers definitions + * + * This enumeration is used to configure the interrupts. + * + * Implements : IRQn_Type_Class + */ +typedef enum +{ + /* Auxiliary constants */ + NotAvail_IRQn = -128, /**< Not available device specific interrupt */ + + /* Core interrupts */ + NonMaskableInt_IRQn = -14, /**< Non Maskable Interrupt */ + HardFault_IRQn = -13, /**< Cortex-M0 SV Hard Fault Interrupt */ + SVCall_IRQn = -5, /**< Cortex-M0 SV Call Interrupt */ + PendSV_IRQn = -2, /**< Cortex-M0 Pend SV Interrupt */ + SysTick_IRQn = -1, /**< Cortex-M0 System Tick Interrupt */ + + /* Device specific interrupts */ + DMA0_IRQn = 0u, /**< DMA channel 0 transfer complete */ + DMA1_IRQn = 1u, /**< DMA channel 1 transfer complete */ + DMA2_IRQn = 2u, /**< DMA channel 2 transfer complete */ + DMA3_IRQn = 3u, /**< DMA channel 3 transfer complete */ + DMA_Error_IRQn = 4u, /**< DMA error interrupt channels 0-3 */ + ERM_fault_IRQn = 5u, /**< ERM single and double bit error correction */ + RTC_IRQn = 6u, /**< RTC alarm interrupt */ + RTC_Seconds_IRQn = 7u, /**< RTC seconds interrupt */ + LPTMR0_IRQn = 8u, /**< LPTIMER interrupt request */ + PORT_IRQn = 9u, /**< Port A, B, C, D and E pin detect interrupt */ + CAN0_ORed_Err_Wakeup_IRQn = 10u, /**< OR’ed [Bus Off OR Bus Off Done OR Transmit Warning OR Receive Warning], Interrupt indicating that errors were detected on the CAN bus, Interrupt asserted when Pretended Networking operation is enabled, and a valid message matches the selected filter criteria during Low Power mode */ + CAN0_ORed_0_31_MB_IRQn = 11u, /**< OR'ed Message buffer (0-15, 16-31) */ + FTM0_Ch0_7_IRQn = 12u, /**< FTM0 Channel 0 to 7 interrupt */ + FTM0_Fault_IRQn = 13u, /**< FTM0 Fault interrupt */ + FTM0_Ovf_Reload_IRQn = 14u, /**< FTM0 Counter overflow and Reload interrupt */ + FTM1_Ch0_7_IRQn = 15u, /**< FTM1 Channel 0 to 7 interrupt */ + FTM1_Fault_IRQn = 16u, /**< FTM1 Fault interrupt */ + FTM1_Ovf_Reload_IRQn = 17u, /**< FTM1 Counter overflow and Reload interrupt */ + FTFC_IRQn = 18u, /**< FTFC Command complete, Read collision and Double bit fault detect */ + PDB0_IRQn = 19u, /**< PDB0 interrupt */ + LPIT0_IRQn = 20u, /**< LPIT interrupt */ + SCG_CMU_LVD_LVWSCG_IRQn = 21u, /**< PMC Low voltage detect interrupt, SCG bus interrupt request and CMU loss of range interrupt */ + WDOG_IRQn = 22u, /**< WDOG interrupt request out before wdg reset out */ + RCM_IRQn = 23u, /**< RCM Asynchronous Interrupt */ + LPI2C0_Master_Slave_IRQn = 24u, /**< LPI2C0 Master Interrupt and Slave Interrupt */ + FLEXIO_IRQn = 25u, /**< FlexIO Interrupt */ + LPSPI0_IRQn = 26u, /**< LPSPI0 Interrupt */ + LPSPI1_IRQn = 27u, /**< LPSPI1 Interrupt */ + ADC0_IRQn = 28u, /**< ADC0 interrupt request. */ + CMP0_IRQn = 29u, /**< CMP0 interrupt request */ + LPUART1_RxTx_IRQn = 30u, /**< LPUART1 Transmit / Receive Interrupt */ + LPUART0_RxTx_IRQn = 31u /**< LPUART0 Transmit / Receive Interrupt */ +} IRQn_Type; + +/*! + * @} + */ /* end of group Interrupt_vector_numbers_S32K118 */ + + +/* ---------------------------------------------------------------------------- + -- Device Peripheral Access Layer for S32K118 + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Peripheral_access_layer_S32K118 Device Peripheral Access Layer for S32K118 + * @{ + */ + +/* @brief This module covers memory mapped registers available on SoC */ + +/* ---------------------------------------------------------------------------- + -- ADC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup ADC_Peripheral_Access_Layer ADC Peripheral Access Layer + * @{ + */ + + +/** ADC - Size of Registers Arrays */ +#define ADC_SC1_COUNT 16u +#define ADC_R_COUNT 16u +#define ADC_CV_COUNT 2u + +/** ADC - Register Layout Typedef */ +typedef struct { + __IO uint32_t SC1[ADC_SC1_COUNT]; /**< ADC Status and Control Register 1, array offset: 0x0, array step: 0x4 */ + __IO uint32_t CFG1; /**< ADC Configuration Register 1, offset: 0x40 */ + __IO uint32_t CFG2; /**< ADC Configuration Register 2, offset: 0x44 */ + __I uint32_t R[ADC_R_COUNT]; /**< ADC Data Result Registers, array offset: 0x48, array step: 0x4 */ + __IO uint32_t CV[ADC_CV_COUNT]; /**< Compare Value Registers, array offset: 0x88, array step: 0x4 */ + __IO uint32_t SC2; /**< Status and Control Register 2, offset: 0x90 */ + __IO uint32_t SC3; /**< Status and Control Register 3, offset: 0x94 */ + __IO uint32_t BASE_OFS; /**< BASE Offset Register, offset: 0x98 */ + __IO uint32_t OFS; /**< ADC Offset Correction Register, offset: 0x9C */ + __IO uint32_t USR_OFS; /**< USER Offset Correction Register, offset: 0xA0 */ + __IO uint32_t XOFS; /**< ADC X Offset Correction Register, offset: 0xA4 */ + __IO uint32_t YOFS; /**< ADC Y Offset Correction Register, offset: 0xA8 */ + __IO uint32_t G; /**< ADC Gain Register, offset: 0xAC */ + __IO uint32_t UG; /**< ADC User Gain Register, offset: 0xB0 */ + __IO uint32_t CLPS; /**< ADC General Calibration Value Register S, offset: 0xB4 */ + __IO uint32_t CLP3; /**< ADC Plus-Side General Calibration Value Register 3, offset: 0xB8 */ + __IO uint32_t CLP2; /**< ADC Plus-Side General Calibration Value Register 2, offset: 0xBC */ + __IO uint32_t CLP1; /**< ADC Plus-Side General Calibration Value Register 1, offset: 0xC0 */ + __IO uint32_t CLP0; /**< ADC Plus-Side General Calibration Value Register 0, offset: 0xC4 */ + __IO uint32_t CLPX; /**< ADC Plus-Side General Calibration Value Register X, offset: 0xC8 */ + __IO uint32_t CLP9; /**< ADC Plus-Side General Calibration Value Register 9, offset: 0xCC */ + __IO uint32_t CLPS_OFS; /**< ADC General Calibration Offset Value Register S, offset: 0xD0 */ + __IO uint32_t CLP3_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 3, offset: 0xD4 */ + __IO uint32_t CLP2_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 2, offset: 0xD8 */ + __IO uint32_t CLP1_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 1, offset: 0xDC */ + __IO uint32_t CLP0_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 0, offset: 0xE0 */ + __IO uint32_t CLPX_OFS; /**< ADC Plus-Side General Calibration Offset Value Register X, offset: 0xE4 */ + __IO uint32_t CLP9_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 9, offset: 0xE8 */ +} ADC_Type, *ADC_MemMapPtr; + + /** Number of instances of the ADC module. */ +#define ADC_INSTANCE_COUNT (1u) + + +/* ADC - Peripheral instance base addresses */ +/** Peripheral ADC0 base address */ +#define ADC0_BASE (0x4003B000u) +/** Peripheral ADC0 base pointer */ +#define ADC0 ((ADC_Type *)ADC0_BASE) +/** Array initializer of ADC peripheral base addresses */ +#define ADC_BASE_ADDRS { ADC0_BASE } +/** Array initializer of ADC peripheral base pointers */ +#define ADC_BASE_PTRS { ADC0 } + /** Number of interrupt vector arrays for the ADC module. */ +#define ADC_IRQS_ARR_COUNT (1u) + /** Number of interrupt channels for the ADC module. */ +#define ADC_IRQS_CH_COUNT (1u) +/** Interrupt vectors for the ADC peripheral type */ +#define ADC_IRQS { ADC0_IRQn } + +/* ---------------------------------------------------------------------------- + -- ADC Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup ADC_Register_Masks ADC Register Masks + * @{ + */ + +/* SC1 Bit Fields */ +#define ADC_SC1_ADCH_MASK 0x1Fu +#define ADC_SC1_ADCH_SHIFT 0u +#define ADC_SC1_ADCH_WIDTH 5u +#define ADC_SC1_ADCH(x) (((uint32_t)(((uint32_t)(x))<VTOR} + +/* FTM module features */ + +/* @brief Number of PWM channels */ +#define FEATURE_FTM_CHANNEL_COUNT (8U) +/* @brief Number of fault channels */ +#define FTM_FEATURE_FAULT_CHANNELS (4U) +/* @brief Width of control channel */ +#define FTM_FEATURE_COMBINE_CHAN_CTRL_WIDTH (8U) +/* @brief Output channel offset */ +#define FTM_FEATURE_OUTPUT_CHANNEL_OFFSET (16U) +/* @brief Max counter value */ +#define FTM_FEATURE_CNT_MAX_VALUE_U32 (0x0000FFFFU) +/* @brief Input capture for single shot */ +#define FTM_FEATURE_INPUT_CAPTURE_SINGLE_SHOT (2U) +/* @brief Dithering has supported on the generated PWM signals */ +#define FEATURE_FTM_HAS_SUPPORTED_DITHERING (1U) +/* @brief Number of interrupt vector for channels of the FTM module. */ +#define FEATURE_FTM_HAS_NUM_IRQS_CHANS (1U) + +/* LPIT module features */ + +/*! @brief Number of interrupt vector for channels of the LPIT module. */ +#define FEATURE_LPIT_HAS_NUM_IRQS_CHANS (1U) +/*! @brief Clock names for LPIT. */ +#define LPIT_CLOCK_NAMES {LPIT0_CLK} + +/* LPI2C module features */ + +/* @brief DMA instance used for LPI2C module */ +#define LPI2C_DMA_INSTANCE 0U + +/* @brief EDMA requests for LPI2C module. */ +#define LPI2C_EDMA_REQ {{(uint8_t)EDMA_REQ_LPI2C0_TX, (uint8_t)EDMA_REQ_LPI2C0_RX}} +/* @brief PCC clocks for LPI2C module. */ +#define LPI2C_PCC_CLOCKS {LPI2C0_CLK} + +/* @brief Disable high-speed and ultra-fast operating modes for S32K14x. */ +#define LPI2C_HAS_FAST_PLUS_MODE (0U) +#define LPI2C_HAS_HIGH_SPEED_MODE (0U) +#define LPI2C_HAS_ULTRA_FAST_MODE (0U) + +/* LPI2C module features */ + +/* @brief DMA instance used for LPI2C module */ +#define LPI2C_DMA_INSTANCE 0U + +/* @brief EDMA requests for LPI2C module. */ +#define LPI2C_EDMA_REQ {{(uint8_t)EDMA_REQ_LPI2C0_TX, (uint8_t)EDMA_REQ_LPI2C0_RX}} +/* @brief PCC clocks for LPI2C module. */ +#define LPI2C_PCC_CLOCKS {LPI2C0_CLK} + +/* @brief Disable high-speed and ultra-fast operating modes for S32K14x. */ +#define LPI2C_HAS_FAST_PLUS_MODE (0U) +#define LPI2C_HAS_HIGH_SPEED_MODE (0U) +#define LPI2C_HAS_ULTRA_FAST_MODE (0U) + +/* MSCM module features */ + +/* @brief Has interrupt router control registers (IRSPRCn). */ +#define FEATURE_MSCM_HAS_INTERRUPT_ROUTER (0) +/* @brief Has directed CPU interrupt routerregisters (IRCPxxx). */ +#define FEATURE_MSCM_HAS_CPU_INTERRUPT_ROUTER (0) + +/* CSEc module features */ + +/*! @brief CSE_PRAM offset of the page length parameter used by the following +commands: CMD_ENC_ECB, CMD_ENC_CBC, CMD_DEC_ECB, CMD_DEC_CBC, CMD_MP_COMPRESS */ +#define FEATURE_CSEC_PAGE_LENGTH_OFFSET (0xEU) +/*! @brief CSE_PRAM offset of the message length parameter used by the following +commands: CMD_GENERATE_MAC, CMD_VERIFY_MAC (both copy and pointer methods) */ +#define FEATURE_CSEC_MESSAGE_LENGTH_OFFSET (0xCU) +/*! @brief CSE_PRAM offset of the MAC length parameter used by the following +commands: CMD_VERIFY_MAC (both copy and pointer methods) */ +#define FEATURE_CSEC_MAC_LENGTH_OFFSET (0x8U) +/*! @brief CSE_PRAM offset of the boot size parameter used by the following +commands: CMD_BOOT_DEFINE */ +#define FEATURE_CSEC_BOOT_SIZE_OFFSET (0x1CU) +/*! @brief CSE_PRAM offset of the boot flavor parameter used by the following +commands: CMD_BOOT_DEFINE */ +#define FEATURE_CSEC_BOOT_FLAVOR_OFFSET (0x1BU) +/*! @brief CSE_PRAM offset of the Flash start address parameter used by the +following commands: CMD_GENERATE_MAC, CMD_VERIFY_MAC (pointer method) */ +#define FEATURE_CSEC_FLASH_START_ADDRESS_OFFSET (0x10U) +/*! @brief CSE_PRAM offset of the verification status parameter used by the +following commands: CMD_VERIFY_MAC (both copy and pointer methods) */ +#define FEATURE_CSEC_VERIFICATION_STATUS_OFFSET (0x14U) +/*! @brief CSE_PRAM offset of the error bits field contained by all commands */ +#define FEATURE_CSEC_ERROR_BITS_OFFSET (0x4U) +/*! @brief CSE_PRAM offset of the SREG parameter used by the following commands: +CMD_GET_ID */ +#define FEATURE_CSEC_SREG_OFFSET (0x2FU) + +/*! @brief CSE_PRAM offset of page 0 */ +#define FEATURE_CSEC_PAGE_0_OFFSET (0x0U) +/*! @brief CSE_PRAM offset of page 1 */ +#define FEATURE_CSEC_PAGE_1_OFFSET (0x10U) +/*! @brief CSE_PRAM offset of page 2 */ +#define FEATURE_CSEC_PAGE_2_OFFSET (0x20U) +/*! @brief CSE_PRAM offset of page 3 */ +#define FEATURE_CSEC_PAGE_3_OFFSET (0x30U) +/*! @brief CSE_PRAM offset of page 4 */ +#define FEATURE_CSEC_PAGE_4_OFFSET (0x40U) +/*! @brief CSE_PRAM offset of page 5 */ +#define FEATURE_CSEC_PAGE_5_OFFSET (0x50U) +/*! @brief CSE_PRAM offset of page 6 */ +#define FEATURE_CSEC_PAGE_6_OFFSET (0x60U) +/*! @brief CSE_PRAM offset of page 7 */ +#define FEATURE_CSEC_PAGE_7_OFFSET (0x70U) + +/* CRC module features */ + +/* @brief CRC module use for S32K. */ +#define FEATURE_CRC_DRIVER_SOFT_POLYNOMIAL +/* @brief Default CRC bit width */ +#define FEATURE_CRC_DEFAULT_WIDTH CRC_BITS_16 +/* @brief Default CRC read transpose */ +#define FEATURE_CRC_DEFAULT_READ_TRANSPOSE CRC_TRANSPOSE_NONE +/* @brief Default CRC write transpose */ +#define FEATURE_CRC_DEFAULT_WRITE_TRANSPOSE CRC_TRANSPOSE_NONE +/* @brief Default polynomial 0x1021U */ +#define FEATURE_CRC_DEFAULT_POLYNOMIAL (0x1021U) +/* @brief Default seed value is 0xFFFFU */ +#define FEATURE_CRC_DEFAULT_SEED (0xFFFFU) + +/* PORT module features */ +/*! @brief PORT Used for setting Pins */ +#define FEATURE_PINS_DRIVER_USING_PORT (1) +/* @brief Has control lock (register bit PCR[LK]). */ +#define FEATURE_PORT_HAS_PIN_CONTROL_LOCK (1) +/* @brief Has open drain control (register bit PCR[ODE]). */ +#define FEATURE_PINS_HAS_OPEN_DRAIN (0) +/* @brief Has digital filter (registers DFER, DFCR and DFWR). */ +#define FEATURE_PORT_HAS_DIGITAL_FILTER (1) +/* @brief Has trigger output to trigger other peripherals (register bit field PCR[IRQC] values). */ +#define FEATURE_PORT_HAS_TRIGGER_OUT (0) +/* @brief Has setting flag only (register bit field PCR[IRQC] values). */ +#define FEATURE_PORT_HAS_FLAG_SET_ONLY (0) +/* @brief Has over-current feature (register bit field PCR[OCIE] values). */ +#define FEATURE_PINS_HAS_OVER_CURRENT (0) +/* @brief Has pull resistor selection available. */ +#define FEATURE_PINS_HAS_PULL_SELECTION (1) +/* @brief Has slew rate control (register bit PCR[SRE]). */ +#define FEATURE_PINS_HAS_SLEW_RATE (0) +/* @brief Has passive filter (register bit field PCR[PFE]). */ +#define FEATURE_PORT_HAS_PASSIVE_FILTER (1) +/* @brief Has drive strength (register bit PCR[DSE]). */ +#define FEATURE_PINS_HAS_DRIVE_STRENGTH (1) +/* @brief Has drive strength control bits*/ +#define FEATURE_PINS_HAS_DRIVE_STRENGTH_CONTROL (0) +/* @brief Has port input disable control bits*/ +#define FEATURE_PORT_HAS_INPUT_DISABLE (0) +/* @brief SIM_CHIPCTL_ADC_INTERLEAVE_EN bit is not available */ +#define FEATURE_PINS_HAS_ADC_INTERLEAVE_EN (0) + +/* MPU module features */ + +/* @brief Specifies hardware revision level. */ +#define FEATURE_MPU_HARDWARE_REVISION_LEVEL (1U) +/* @brief Has process identifier support. */ +#define FEATURE_MPU_HAS_PROCESS_IDENTIFIER (1U) +/* @brief Specifies total number of bus masters. */ +#define FEATURE_MPU_MASTER_COUNT (3U) +/* @brief Specifies maximum number of masters which have separated +privilege rights for user and supervisor mode accesses (e.g. master0~3 in S32K1xx). +*/ +#define FEATURE_MPU_MAX_LOW_MASTER_NUMBER (3U) +/* @brief Specifies maximum number of masters which have only +read and write permissions (e.g. master4~7 in S32K1xx). +*/ +#define FEATURE_MPU_MAX_HIGH_MASTER_NUMBER (7U) + +/* @brief Specifies number of set access control right bits for + masters which have separated privilege rights for user and + supervisor mode accesses (e.g. master0~3 in S32K1xx). +*/ +#define FEATURE_MPU_LOW_MASTER_CONTROL_WIDTH (6U) +/* @brief Specifies number of set access control right bits for + masters which have only read and write permissions(e.g. master4~7 in S32K1xx). +*/ +#define FEATURE_MPU_HIGH_MASTER_CONTROL_WIDTH (2U) + +/* @brief The MPU Logical Bus Master Number for core bus master. */ +#define FEATURE_MPU_MASTER_CORE (0U) +/* @brief The MPU Logical Bus Master Number for Debugger master. */ +#define FEATURE_MPU_MASTER_DEBUGGER (1U) +/* @brief The MPU Logical Bus Master Number for DMA master. */ +#define FEATURE_MPU_MASTER_DMA (2U) +/* @brief Specifies master number. */ +#define FEATURE_MPU_MASTER \ +{ \ + FEATURE_MPU_MASTER_CORE, /*!< CORE */ \ + FEATURE_MPU_MASTER_DEBUGGER, /*!< DEBUGGER */ \ + FEATURE_MPU_MASTER_DMA, /*!< DMA */ \ +} + +/* @brief Specifies total number of slave ports. */ +#define FEATURE_MPU_SLAVE_COUNT (2U) +/* @brief The MPU Slave Port Assignment for Flash Controller and boot ROM. */ +#define FEATURE_MPU_SLAVE_FLASH_BOOTROM (0U) +/* @brief The MPU Slave Port Assignment for SRAM, MTB, DWT and MCM. */ +#define FEATURE_MPU_SLAVE_SRAM_MTB_DWT_MCM (1U) +/* @brief The MPU Slave Port mask. */ +#define FEATURE_MPU_SLAVE_MASK (0xC0000000U) +#define FEATURE_MPU_SLAVE_SHIFT (30u) +#define FEATURE_MPU_SLAVE_WIDTH (2u) +#define FEATURE_MPU_SLAVE(x) (((uint32_t)(((uint32_t)(x))<> (uint32_t)FEATURE_DMA_CH_WIDTH) +/* @brief DMA virtual channel to channel */ +#define FEATURE_DMA_VCH_TO_CH(x) ((x) & ((uint32_t)FEATURE_DMA_CHANNELS - 1U)) +/* @brief DMA supports the following particular channel priorities: */ +#define FEATURE_DMA_4_CH_PRIORITIES +/* @brief DMA supports bus bandwidth control. */ +#define FEATURE_DMA_ENGINE_STALL + +/* DMAMUX module features */ + +/* @brief DMAMUX peripheral is available in silicon. */ +#define FEATURE_DMAMUX_AVAILABLE +/* @brief Number of DMA channels. */ +#define FEATURE_DMAMUX_CHANNELS (4U) +/* @brief Has the periodic trigger capability */ +#define FEATURE_DMAMUX_HAS_TRIG (1) +/* @brief Conversion from request source to the actual DMAMUX channel */ +#define FEATURE_DMAMUX_REQ_SRC_TO_CH(x) (x) +/* @brief Mapping between request source and DMAMUX instance */ +#define FEATURE_DMAMUX_REQ_SRC_TO_INSTANCE(x) (0U) +/* @brief Conversion from eDMA channel index to DMAMUX channel. */ +#define FEATURE_DMAMUX_DMA_CH_TO_CH(x) (x) +/* @brief Conversion from DMAMUX channel DMAMUX register index. */ +#define FEATURE_DMAMUX_CHN_REG_INDEX(x) (x) +/* @brief Clock names for DMAMUX. */ +#define FEATURE_DMAMUX_CLOCK_NAMES {DMAMUX0_CLK} + +/*! + * @brief Structure for the DMA hardware request + * + * Defines the structure for the DMA hardware request collections. The user can configure the + * hardware request into DMAMUX to trigger the DMA transfer accordingly. The index + * of the hardware request varies according to the to SoC. + */ +typedef enum { + EDMA_REQ_DISABLED = 0U, + EDMA_REQ_LPUART0_RX = 2U, + EDMA_REQ_LPUART0_TX = 3U, + EDMA_REQ_LPUART1_RX = 4U, + EDMA_REQ_LPUART1_TX = 5U, + EDMA_REQ_FLEXIO_SHIFTER0 = 10U, + EDMA_REQ_FLEXIO_SHIFTER1 = 11U, + EDMA_REQ_FLEXIO_SHIFTER2 = 12U, + EDMA_REQ_FLEXIO_SHIFTER3 = 13U, + EDMA_REQ_LPSPI0_RX = 14U, + EDMA_REQ_LPSPI0_TX = 15U, + EDMA_REQ_LPSPI1_RX = 16U, + EDMA_REQ_LPSPI1_TX = 17U, + EDMA_REQ_FTM1_CHANNEL_0 = 20U, + EDMA_REQ_FTM1_CHANNEL_1 = 21U, + EDMA_REQ_FTM1_CHANNEL_2 = 22U, + EDMA_REQ_FTM1_CHANNEL_3 = 23U, + EDMA_REQ_FTM1_CHANNEL_4 = 24U, + EDMA_REQ_FTM1_CHANNEL_5 = 25U, + EDMA_REQ_FTM1_CHANNEL_6 = 26U, + EDMA_REQ_FTM1_CHANNEL_7 = 27U, + EDMA_REQ_FTM0_OR_CH0_CH7 = 36U, + EDMA_REQ_ADC0 = 42U, + EDMA_REQ_LPI2C0_RX = 44U, + EDMA_REQ_LPI2C0_TX = 45U, + EDMA_REQ_PDB0 = 46U, + EDMA_REQ_CMP0 = 48U, + EDMA_REQ_PORTA = 49U, + EDMA_REQ_PORTB = 50U, + EDMA_REQ_PORTC = 51U, + EDMA_REQ_PORTD = 52U, + EDMA_REQ_PORTE = 53U, + EDMA_REQ_FLEXCAN0 = 54U, + EDMA_REQ_LPTMR0 = 59U, + EDMA_REQ_DMAMUX_ALWAYS_ENABLED0 = 62U, + EDMA_REQ_DMAMUX_ALWAYS_ENABLED1 = 63U +} dma_request_source_t; + + +/* TRGMUX module features */ +/*! + * @brief Enumeration for trigger source module of TRGMUX + * + * Describes all possible inputs (trigger sources) of the TRGMUX IP + * This enumeration depends on the supported instances in device + */ +enum trgmux_trigger_source_e +{ + TRGMUX_TRIG_SOURCE_DISABLED = 0U, + TRGMUX_TRIG_SOURCE_VDD = 1U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN0 = 2U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN1 = 3U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN2 = 4U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN3 = 5U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN4 = 6U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN5 = 7U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN6 = 8U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN7 = 9U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN8 = 10U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN9 = 11U, + TRGMUX_TRIG_SOURCE_CMP0_OUT = 14U, + TRGMUX_TRIG_SOURCE_LPIT_CH0 = 17U, + TRGMUX_TRIG_SOURCE_LPIT_CH1 = 18U, + TRGMUX_TRIG_SOURCE_LPIT_CH2 = 19U, + TRGMUX_TRIG_SOURCE_LPIT_CH3 = 20U, + TRGMUX_TRIG_SOURCE_LPTMR0 = 21U, + TRGMUX_TRIG_SOURCE_FTM0_INIT_TRIG = 22U, + TRGMUX_TRIG_SOURCE_FTM0_EXT_TRIG = 23U, + TRGMUX_TRIG_SOURCE_FTM1_INIT_TRIG = 24U, + TRGMUX_TRIG_SOURCE_FTM1_EXT_TRIG = 25U, + TRGMUX_TRIG_SOURCE_ADC0_SC1A_COCO = 30U, + TRGMUX_TRIG_SOURCE_ADC0_SC1B_COCO = 31U, + TRGMUX_TRIG_SOURCE_PDB0_CH0_TRIG = 34U, + TRGMUX_TRIG_SOURCE_PDB0_PULSE_OUT = 36U, + TRGMUX_TRIG_SOURCE_RTC_ALARM = 43U, + TRGMUX_TRIG_SOURCE_RTC_SECOND = 44U, + TRGMUX_TRIG_SOURCE_FLEXIO_TRIG0 = 45U, + TRGMUX_TRIG_SOURCE_FLEXIO_TRIG1 = 46U, + TRGMUX_TRIG_SOURCE_FLEXIO_TRIG2 = 47U, + TRGMUX_TRIG_SOURCE_FLEXIO_TRIG3 = 48U, + TRGMUX_TRIG_SOURCE_LPUART0_RX_DATA = 49U, + TRGMUX_TRIG_SOURCE_LPUART0_TX_DATA = 50U, + TRGMUX_TRIG_SOURCE_LPUART0_RX_IDLE = 51U, + TRGMUX_TRIG_SOURCE_LPUART1_RX_DATA = 52U, + TRGMUX_TRIG_SOURCE_LPUART1_TX_DATA = 53U, + TRGMUX_TRIG_SOURCE_LPUART1_RX_IDLE = 54U, + TRGMUX_TRIG_SOURCE_LPI2C0_MASTER_TRIG = 55U, + TRGMUX_TRIG_SOURCE_LPI2C0_SLAVE_TRIG = 56U, + TRGMUX_TRIG_SOURCE_LPSPI0_FRAME = 59U, + TRGMUX_TRIG_SOURCE_LPSPI0_RX_DATA = 60U, + TRGMUX_TRIG_SOURCE_LPSPI1_FRAME = 61U, + TRGMUX_TRIG_SOURCE_LPSPI1_RX_DATA = 62U, + TRGMUX_TRIG_SOURCE_SIM_SW_TRIG = 63U, +}; + +/*! + * @brief Enumeration for target module of TRGMUX + * + * Describes all possible outputs (target modules) of the TRGMUX IP + * This enumeration depends on the supported instances in device + */ +enum trgmux_target_module_e +{ + TRGMUX_TARGET_MODULE_DMA_CH0 = 0U, + TRGMUX_TARGET_MODULE_DMA_CH1 = 1U, + TRGMUX_TARGET_MODULE_DMA_CH2 = 2U, + TRGMUX_TARGET_MODULE_DMA_CH3 = 3U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT0 = 4U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT1 = 5U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT2 = 6U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT3 = 7U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT4 = 8U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT5 = 9U, + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA0 = 12U, + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA1 = 13U, + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA2 = 14U, + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA3 = 15U, + TRGMUX_TARGET_MODULE_CMP0_SAMPLE = 28U, + TRGMUX_TARGET_MODULE_FTM0_HWTRIG0 = 40U, + TRGMUX_TARGET_MODULE_FTM0_FAULT0 = 41U, + TRGMUX_TARGET_MODULE_FTM0_FAULT1 = 42U, + TRGMUX_TARGET_MODULE_FTM0_FAULT2 = 43U, + TRGMUX_TARGET_MODULE_FTM1_HWTRIG0 = 44U, + TRGMUX_TARGET_MODULE_FTM1_FAULT0 = 45U, + TRGMUX_TARGET_MODULE_FTM1_FAULT1 = 46U, + TRGMUX_TARGET_MODULE_FTM1_FAULT2 = 47U, + TRGMUX_TARGET_MODULE_PDB0_TRG_IN = 56U, + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM0 = 68U, + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM1 = 69U, + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM2 = 70U, + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM3 = 71U, + TRGMUX_TARGET_MODULE_LPIT_TRG_CH0 = 72U, + TRGMUX_TARGET_MODULE_LPIT_TRG_CH1 = 73U, + TRGMUX_TARGET_MODULE_LPIT_TRG_CH2 = 74U, + TRGMUX_TARGET_MODULE_LPIT_TRG_CH3 = 75U, + TRGMUX_TARGET_MODULE_LPUART0_TRG = 76U, + TRGMUX_TARGET_MODULE_LPUART1_TRG = 80U, + TRGMUX_TARGET_MODULE_LPI2C0_TRG = 84U, + TRGMUX_TARGET_MODULE_LPSPI0_TRG = 92U, + TRGMUX_TARGET_MODULE_LPSPI1_TRG = 96U, + TRGMUX_TARGET_MODULE_LPTMR0_ALT0 = 100U, +}; + +/* @brief Constant array storing the value of all TRGMUX output(target module) identifiers */ +#define FEATURE_TRGMUX_TARGET_MODULE \ +{ \ + TRGMUX_TARGET_MODULE_DMA_CH0, \ + TRGMUX_TARGET_MODULE_DMA_CH1, \ + TRGMUX_TARGET_MODULE_DMA_CH2, \ + TRGMUX_TARGET_MODULE_DMA_CH3, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT0, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT1, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT2, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT3, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT4, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT5, \ + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA0, \ + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA1, \ + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA2, \ + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA3, \ + TRGMUX_TARGET_MODULE_CMP0_SAMPLE, \ + TRGMUX_TARGET_MODULE_FTM0_HWTRIG0, \ + TRGMUX_TARGET_MODULE_FTM0_FAULT0, \ + TRGMUX_TARGET_MODULE_FTM0_FAULT1, \ + TRGMUX_TARGET_MODULE_FTM0_FAULT2, \ + TRGMUX_TARGET_MODULE_FTM1_HWTRIG0, \ + TRGMUX_TARGET_MODULE_FTM1_FAULT0, \ + TRGMUX_TARGET_MODULE_FTM1_FAULT1, \ + TRGMUX_TARGET_MODULE_FTM1_FAULT2, \ + TRGMUX_TARGET_MODULE_PDB0_TRG_IN, \ + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM0, \ + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM1, \ + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM2, \ + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM3, \ + TRGMUX_TARGET_MODULE_LPIT_TRG_CH0, \ + TRGMUX_TARGET_MODULE_LPIT_TRG_CH1, \ + TRGMUX_TARGET_MODULE_LPIT_TRG_CH2, \ + TRGMUX_TARGET_MODULE_LPIT_TRG_CH3, \ + TRGMUX_TARGET_MODULE_LPUART0_TRG, \ + TRGMUX_TARGET_MODULE_LPUART1_TRG, \ + TRGMUX_TARGET_MODULE_LPI2C0_TRG, \ + TRGMUX_TARGET_MODULE_LPSPI0_TRG, \ + TRGMUX_TARGET_MODULE_LPSPI1_TRG, \ + TRGMUX_TARGET_MODULE_LPTMR0_ALT0 \ +} + + +/* LPSPI module features */ +/* @brief Initial value for state structure */ +#define FEATURE_LPSPI_STATE_STRUCTURES_NULL {NULL, NULL} +/* @brief Clock indexes for LPSPI clock */ +#define FEATURE_LPSPI_CLOCKS_NAMES {LPSPI0_CLK, LPSPI1_CLK}; + +/* FlexIO module features */ + +/* @brief Define the maximum number of shifters for any FlexIO instance. */ +#define FEATURE_FLEXIO_MAX_SHIFTER_COUNT (4U) +/* @brief Define DMA request names for Flexio. */ +#define FEATURE_FLEXIO_DMA_REQ_0 EDMA_REQ_FLEXIO_SHIFTER0 +#define FEATURE_FLEXIO_DMA_REQ_1 EDMA_REQ_FLEXIO_SHIFTER1 +#define FEATURE_FLEXIO_DMA_REQ_2 EDMA_REQ_FLEXIO_SHIFTER2 +#define FEATURE_FLEXIO_DMA_REQ_3 EDMA_REQ_FLEXIO_SHIFTER3 + +/* LPUART module features */ + +/* @brief Has extended data register ED. */ +#define FEATURE_LPUART_HAS_EXTENDED_DATA_REGISTER_FLAGS (1) +/* @brief Hardware flow control (RTS, CTS) is supported. */ +#define FEATURE_LPUART_HAS_MODEM_SUPPORT (1) +/* @brief Baud rate oversampling is available. */ +#define FEATURE_LPUART_HAS_BAUD_RATE_OVER_SAMPLING_SUPPORT (1) +/* @brief Baud rate oversampling is available. */ +#define FEATURE_LPUART_HAS_BOTH_EDGE_SAMPLING_SUPPORT (1) +/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ +#define FEATURE_LPUART_FIFO_SIZE (4U) +/* @brief Supports two match addresses to filter incoming frames. */ +#define FEATURE_LPUART_HAS_ADDRESS_MATCHING (1) +/* @brief Has transmitter/receiver DMA enable bits. */ +#define FEATURE_LPUART_HAS_DMA_ENABLE (1) +/* @brief Flag clearance mask for STAT register. */ +#define FEATURE_LPUART_STAT_REG_FLAGS_MASK (0xC01FC000U) +/* @brief Flag clearance mask for FIFO register. */ +#define FEATURE_LPUART_FIFO_REG_FLAGS_MASK (0x00030000U) +/* @brief Reset mask for FIFO register. */ +#define FEATURE_LPUART_FIFO_RESET_MASK (0x0003C000U) +/* @brief Default oversampling ratio. */ +#define FEATURE_LPUART_DEFAULT_OSR (0x0FUL) +/* @brief Default baud rate modulo divisor. */ +#define FEATURE_LPUART_DEFAULT_SBR (0x04UL) +/* @brief Clock names for LPUART. */ +#define LPUART_CLOCK_NAMES {LPUART0_CLK, LPUART1_CLK} + +/* ADC module features */ + +/*! @brief ADC feature flag for extended number of SC1 and R registers, + * generically named 'alias registers' */ +#define FEATURE_ADC_HAS_EXTRA_NUM_REGS (0) + +#define NUMBER_OF_ALT_CLOCKS ADC_CLK_ALT_1 +/*! @brief ADC feature flag for defining number of external ADC channels. + * If each ADC instance has different number of external channels, then + * this define is set with the maximum value. */ +#define FEATURE_ADC_MAX_NUM_EXT_CHANS (16) +#define FEATURE_ADC_HAS_CHANNEL_2 (1) +#define FEATURE_ADC_HAS_CHANNEL_8 (1) +#define ADC_CLOCKS {ADC0_CLK} +/*! @brief ADC number of control channels */ +#if FEATURE_ADC_HAS_EXTRA_NUM_REGS +#define ADC_CTRL_CHANS_COUNT ADC_aSC1_COUNT +#else +#define ADC_CTRL_CHANS_COUNT ADC_SC1_COUNT +#endif /* FEATURE_ADC_HAS_EXTRA_NUM_REGS */ + +/*! @brief ADC default Sample Time from RM */ +#define ADC_DEFAULT_SAMPLE_TIME (0x0CU) +/*! @brief ADC default User Gain from RM */ +#define ADC_DEFAULT_USER_GAIN (0x04U) +/* @brief Max of adc clock frequency */ +#define ADC_CLOCK_FREQ_MAX_RUNTIME (50000000u) +/* @brief Min of adc clock frequency */ +#define ADC_CLOCK_FREQ_MIN_RUNTIME (2000000u) + +/* CAN module features */ + +/* @brief Frames available in Rx FIFO flag shift */ +#define FEATURE_CAN_RXFIFO_FRAME_AVAILABLE (5U) +/* @brief Rx FIFO warning flag shift */ +#define FEATURE_CAN_RXFIFO_WARNING (6U) +/* @brief Rx FIFO overflow flag shift */ +#define FEATURE_CAN_RXFIFO_OVERFLOW (7U) +/* @brief Has Flexible Data Rate for CAN0 */ +#define FEATURE_CAN0_HAS_FD (1) +/* @brief Maximum number of Message Buffers supported for payload size 8 for CAN0 */ +#define FEATURE_CAN0_MAX_MB_NUM (32U) +/* @brief Has PE clock source select (bit field CAN_CTRL1[CLKSRC]). */ +#define FEATURE_CAN_HAS_PE_CLKSRC_SELECT (1) +/* @brief Has DMA enable (bit field MCR[DMA]). */ +#define FEATURE_CAN_HAS_DMA_ENABLE (1) +/* @brief Maximum number of Message Buffers supported for payload size 8 for any of the CAN instances */ +#define FEATURE_CAN_MAX_MB_NUM (32U) +/* @brief Maximum number of Message Buffers supported for payload size 8 for any of the CAN instances */ +#define FEATURE_CAN_MAX_MB_NUM_ARRAY { FEATURE_CAN0_MAX_MB_NUM } +/* @brief Has Pretending Networking mode */ +#define FEATURE_CAN_HAS_PRETENDED_NETWORKING (1) +/* @brief Has Stuff Bit Count Enable Bit */ +#define FEATURE_CAN_HAS_STFCNTEN_ENABLE (0) +/* @brief Has ISO CAN FD Enable Bit */ +#define FEATURE_CAN_HAS_ISOCANFDEN_ENABLE (1) +/* @brief Has Message Buffer Data Size Region 1 */ +#define FEATURE_CAN_HAS_MBDSR1 (0) +/* @brief Has Message Buffer Data Size Region 2 */ +#define FEATURE_CAN_HAS_MBDSR2 (0) +/* @brief DMA hardware requests for all FlexCAN instances */ +#define FEATURE_CAN_EDMA_REQUESTS { EDMA_REQ_FLEXCAN0 } + +/* @brief Maximum number of Message Buffers IRQs */ +#define FEATURE_CAN_MB_IRQS_MAX_COUNT (2U) +/* @brief Message Buffers IRQs */ +#define FEATURE_CAN_MB_IRQS { CAN_ORed_0_15_MB_IRQS, \ + CAN_ORed_16_31_MB_IRQS } +/* @brief Has Wake Up Irq channels (CAN_Wake_Up_IRQS_CH_COUNT > 0u) */ +#define FEATURE_CAN_HAS_WAKE_UP_IRQ (1) +/* @brief Has Self Wake Up mode */ +#define FEATURE_CAN_HAS_SELF_WAKE_UP (0) +/* @brief Has Flexible Data Rate */ +#define FEATURE_CAN_HAS_FD (1) +/* @brief Clock name for the PE oscillator clock source */ +#define FEATURE_CAN_PE_OSC_CLK_NAME SOSC_CLK +/* @bried FlexCAN has Detection And Correction of Memory Errors */ +#define FEATURE_CAN_HAS_MEM_ERR_DET (0) + +/* LPTMR module features */ + +/* @brief LPTMR pulse counter input options */ +#define FEATURE_LPTMR_HAS_INPUT_ALT1_SELECTION (1U) + +/* OSIF module features */ + +#define FEATURE_OSIF_USE_SYSTICK (1) +#define FEATURE_OSIF_USE_PIT (0) +#define FEATURE_OSIF_FREERTOS_ISR_CONTEXT_METHOD (1) /* Cortex M device */ + +/* PDB module features */ + +/* @brief PDB has back-to-back at instance level */ +#define FEATURE_PDB_HAS_INSTANCE_BACKTOBACK (0) + +#endif /* S32K118_FEATURES_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/devassert.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/devassert.h new file mode 100644 index 00000000..243c8d45 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/devassert.h @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2017 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DEVASSERT_H +#define DEVASSERT_H + +#include + +/** + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 2.5, global macro not referenced. + * The macro is defined to be used by drivers to validate input parameters and can be disabled. + * + * @section [global] + * Violates MISRA 2012 Advisory Directive 4.9, Function-like macro defined. + * The macros are used to validate input parameters to driver functions. + * + */ + +/** +\page Error_detection_and_reporting Error detection and reporting + +S32 SDK drivers can use a mechanism to validate data coming from upper software layers (application code) by performing +a number of checks on input parameters' range or other invariants that can be statically checked (not dependent on +runtime conditions). A failed validation is indicative of a software bug in application code, therefore it is important +to use this mechanism during development. + +The validation is performed by using DEV_ASSERT macro. +A default implementation of this macro is provided in this file. However, application developers can provide their own +implementation in a custom file. This requires defining the CUSTOM_DEVASSERT symbol with the specific file name in the +project configuration (for example: -DCUSTOM_DEVASSERT="custom_devassert.h") + +The default implementation accommodates two behaviors, based on DEV_ERROR_DETECT symbol: + - When DEV_ERROR_DETECT symbol is defined in the project configuration (for example: -DDEV_ERROR_DETECT), the validation + performed by the DEV_ASSERT macro is enabled, and a failed validation triggers a software breakpoint and further execution is + prevented (application spins in an infinite loop) + This configuration is recommended for development environments, as it prevents further execution and allows investigating + potential problems from the point of error detection. + - When DEV_ERROR_DETECT symbol is not defined, the DEV_ASSERT macro is implemented as no-op, therefore disabling all validations. + This configuration can be used to eliminate the overhead of development-time checks. + +It is the application developer's responsibility to decide the error detection strategy for production code: one can opt to +disable development-time checking altogether (by not defining DEV_ERROR_DETECT symbol), or one can opt to keep the checks +in place and implement a recovery mechanism in case of a failed validation, by defining CUSTOM_DEVASSERT to point +to the file containing the custom implementation. +*/ + +#if defined (CUSTOM_DEVASSERT) + /* If the CUSTOM_DEVASSERT symbol is defined, then add the custom implementation */ + #include CUSTOM_DEVASSERT +#elif defined (DEV_ERROR_DETECT) + /* Implement default assert macro */ +static inline void DevAssert(volatile bool x) +{ + if(x) { } else { BKPT_ASM; for(;;) {} } +} + #define DEV_ASSERT(x) DevAssert(x) +#else + /* Assert macro does nothing */ + #define DEV_ASSERT(x) ((void)0) +#endif + +#endif /* DEVASSERT_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/device_registers.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/device_registers.h new file mode 100644 index 00000000..583a35d5 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/device_registers.h @@ -0,0 +1,67 @@ +/* +** ################################################################### +** Abstract: +** Common include file for CMSIS register access layer headers. +** +** Copyright (c) 2015 Freescale Semiconductor, Inc. +** Copyright 2016-2017 NXP +** All rights reserved. +** +** THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +** INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +** STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +** IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +** +** http: www.nxp.com +** mail: support@nxp.com +** ################################################################### +*/ + +#ifndef DEVICE_REGISTERS_H +#define DEVICE_REGISTERS_H + +/** +* @page misra_violations MISRA-C:2012 violations +* +* @section [global] +* Violates MISRA 2012 Advisory Rule 2.5, global macro not referenced. +* The macro defines the device currently in use and may be used by components for specific checks. +* +*/ + + +/* + * Include the cpu specific register header files. + * + * The CPU macro should be declared in the project or makefile. + */ + +#if defined(CPU_S32K118) + + #define S32K11x_SERIES + + /* Specific core definitions */ + #include "s32_core_cm0.h" + /* Register definitions */ + #include "S32K118.h" + /* CPU specific feature definitions */ + #include "S32K118_features.h" + +#else + #error "No valid CPU defined!" +#endif + +#include "devassert.h" + +#endif /* DEVICE_REGISTERS_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/s32_core_cm0.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/s32_core_cm0.h new file mode 100644 index 00000000..2dcd6e17 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/s32_core_cm0.h @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2015-2016 Freescale Semiconductor, Inc. + * Copyright 2016-2017 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + */ +/*! + * @file s32_core_cm0.h + * + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Directive 4.9, Function-like macro + * Function-like macros are used instead of inline functions in order to ensure + * that the performance will not be decreased if the functions will not be + * inlined by the compiler. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 2.5, Global macro not referenced. + * The macros defined are used only on some of the drivers, so this might be reported + * when the analysis is made only on one driver. + */ + +/* + * Tool Chains: + * GNUC flag is defined also by ARM compiler - it shows the current major version of the compatible GCC version + * __GNUC__ : GNU Compiler Collection + * __ghs__ : Green Hills ARM Compiler + * __ICCARM__ : IAR ARM Compiler + * __DCC__ : Wind River Diab Compiler + * __ARMCC_VERSION : ARM Compiler + */ + +#if !defined (CORE_CM0_H) +#define CORE_CM0_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/** \brief BKPT_ASM + * + * Macro to be used to trigger an debug interrupt + */ +#if defined ( __DCC__ ) +#define BKPT_ASM __asm ("BKPT 0\n\t") +#else +#define BKPT_ASM __asm ("BKPT #0\n\t") +#endif + +/** \brief Enable interrupts + */ +#if defined (__GNUC__) +#define ENABLE_INTERRUPTS() __asm volatile ("cpsie i" : : : "memory"); +#elif defined ( __DCC__ ) +#define ENABLE_INTERRUPTS() __asm (".short 0xb662"); +#else +#define ENABLE_INTERRUPTS() __asm("cpsie i") +#endif + + +/** \brief Disable interrupts + */ +#if defined (__GNUC__) +#define DISABLE_INTERRUPTS() __asm volatile ("cpsid i" : : : "memory"); +#elif defined ( __DCC__ ) +#define DISABLE_INTERRUPTS() __asm (".short 0xb672"); +#else +#define DISABLE_INTERRUPTS() __asm("cpsid i") +#endif + + +/** \brief Enter low-power standby state + * WFI (Wait For Interrupt) makes the processor suspend execution (Clock is stopped) until an IRQ interrupts. + */ +#if defined (__GNUC__) +#define STANDBY() __asm volatile ("wfi") +#elif defined ( __DCC__ ) +#define STANDBY() __asm (".short 0xbf30"); +#else +#define STANDBY() __asm ("wfi") +#endif + +/** \brief No-op + */ +#define NOP() __asm volatile ("nop") + + +/** \brief Reverse byte order in a word. + * ARM Documentation Cortex-M0 Devices Generic User Guide + * Accordingly to 3.5.7. REV, REV16, and REVSH + * Restriction "This function requires low registers R0-R7 register" + */ +#if defined (__GNUC__) || defined (__ICCARM__) || defined (__ARMCC_VERSION) +#define REV_BYTES_32(a, b) __asm volatile ("rev %0, %1" : "=l" (b) : "l" (a)) +#elif defined (__ghs__) +#define REV_BYTES_32(a, b) __asm volatile ("rev %0, %1" : "=r" (b) : "r" (a)) +#else +#define REV_BYTES_32(a, b) (b = ((a & 0xFF000000U) >> 24U) | ((a & 0xFF0000U) >> 8U) \ + | ((a & 0xFF00U) << 8U) | ((a & 0xFFU) << 24U)) +#endif + +/** \brief Reverse byte order in each halfword independently. + * ARM Documentation Cortex-M0 Devices Generic User Guide + * Accordingly to 3.5.7. REV, REV16, and REVSH + * Restriction "This function requires low registers R0-R7 register" + */ +#if defined (__GNUC__) || defined (__ICCARM__) || defined (__ARMCC_VERSION) +#define REV_BYTES_16(a, b) __asm volatile ("rev16 %0, %1" : "=l" (b) : "l" (a)) +#elif defined (__ghs__) +#define REV_BYTES_16(a, b) __asm volatile ("rev16 %0, %1" : "=r" (b) : "r" (a)) +#else +#define REV_BYTES_16(a, b) (b = ((a & 0xFF000000U) >> 8U) | ((a & 0xFF0000U) << 8U) \ + | ((a & 0xFF00U) >> 8U) | ((a & 0xFFU) << 8U)) +#endif + +/** \brief Places a function in RAM. + */ +#if defined ( __GNUC__ ) || defined (__ARMCC_VERSION) + #define START_FUNCTION_DECLARATION_RAMSECTION + #define END_FUNCTION_DECLARATION_RAMSECTION __attribute__((section (".code_ram"))); +#elif defined ( __ghs__ ) + #define START_FUNCTION_DECLARATION_RAMSECTION _Pragma("ghs callmode=far") + #define END_FUNCTION_DECLARATION_RAMSECTION __attribute__((section (".code_ram")));\ + _Pragma("ghs callmode=default") +#elif defined ( __ICCARM__ ) + #define START_FUNCTION_DECLARATION_RAMSECTION __ramfunc + #define END_FUNCTION_DECLARATION_RAMSECTION ; +#elif defined ( __DCC__ ) + #define START_FUNCTION_DECLARATION_RAMSECTION _Pragma("section CODE \".code_ram\" \"\" far-absolute") \ + _Pragma("use_section CODE") + #define END_FUNCTION_DECLARATION_RAMSECTION ; \ + _Pragma("section CODE \".text\"") +#else + /* Keep compatibility with software analysis tools */ + #define START_FUNCTION_DECLARATION_RAMSECTION + #define END_FUNCTION_DECLARATION_RAMSECTION ; +#endif + + /* For GCC, IAR, GHS, Diab and ARMC there is no need to specify the section when + defining a function, it is enough to specify it at the declaration. This + also enables compatibility with software analysis tools. */ + #define START_FUNCTION_DEFINITION_RAMSECTION + #define END_FUNCTION_DEFINITION_RAMSECTION + +#if defined (__ICCARM__) + #define DISABLE_CHECK_RAMSECTION_FUNCTION_CALL _Pragma("diag_suppress=Ta022") + #define ENABLE_CHECK_RAMSECTION_FUNCTION_CALL _Pragma("diag_default=Ta022") +#else + #define DISABLE_CHECK_RAMSECTION_FUNCTION_CALL + #define ENABLE_CHECK_RAMSECTION_FUNCTION_CALL +#endif + +/** \brief Get Core ID + * + * GET_CORE_ID returns the processor identification number for cm0 + */ +#define GET_CORE_ID() 0U + +/** \brief Data alignment. + */ +#if defined ( __GNUC__ ) || defined ( __ghs__ ) || defined ( __DCC__ ) || defined (__ARMCC_VERSION) + #define ALIGNED(x) __attribute__((aligned(x))) +#elif defined ( __ICCARM__ ) + #define stringify(s) tostring(s) + #define tostring(s) #s + #define ALIGNED(x) _Pragma(stringify(data_alignment=x)) +#else + /* Keep compatibility with software analysis tools */ + #define ALIGNED(x) +#endif + +/** \brief Endianness. + */ +#define CORE_LITTLE_ENDIAN + +#ifdef __cplusplus +} +#endif + +#endif /* CORE_CM0_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/system_S32K118.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/system_S32K118.c new file mode 100644 index 00000000..868b365b --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/system_S32K118.c @@ -0,0 +1,176 @@ +/* + * Copyright 2017-2018 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.9, An object should be defined at block + * scope if its identifier only appears in a single function. + * An object with static storage duration declared at block scope cannot be + * accessed directly from outside the block. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 11.4, A conversion should not be performed + * between a pointer to object and an integer type. + * The cast is required to initialize a pointer with an unsigned int define, + * representing an address. + * + * @section [global] + * Violates MISRA 2012 Required Rule 11.6, A cast shall not be performed + * between pointer to void and an arithmetic type. + * The cast is required to initialize a pointer with an unsigned int define, + * representing an address. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.7, External could be made static. + * Function is defined for usage by application code. + * + */ + +#include "device_registers.h" +#include "system_S32K118.h" +#include "stdbool.h" + +/* ---------------------------------------------------------------------------- + -- Core clock + ---------------------------------------------------------------------------- */ + +uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK; + +/*FUNCTION********************************************************************** + * + * Function Name : SystemInit + * Description : This function disables the watchdog, enables FPU + * and the power mode protection if the corresponding feature macro + * is enabled. SystemInit is called from startup_device file. + * + * Implements : SystemInit_Activity + *END**************************************************************************/ +void SystemInit(void) +{ +/**************************************************************************/ +/* WDOG DISABLE*/ +/**************************************************************************/ + +#if (DISABLE_WDOG) + /* Write of the WDOG unlock key to CNT register, must be done in order to allow any modifications*/ + WDOG->CNT = (uint32_t ) FEATURE_WDOG_UNLOCK_VALUE; + /* The dummy read is used in order to make sure that the WDOG registers will be configured only + * after the write of the unlock value was completed. */ + (void)WDOG->CNT; + + /* Initial write of WDOG configuration register: + * enables support for 32-bit refresh/unlock command write words, + * clock select from LPO, update enable, watchdog disabled */ + WDOG->CS = (uint32_t ) ( (1UL << WDOG_CS_CMD32EN_SHIFT) | + (FEATURE_WDOG_CLK_FROM_LPO << WDOG_CS_CLK_SHIFT) | + (0U << WDOG_CS_EN_SHIFT) | + (1U << WDOG_CS_UPDATE_SHIFT) ); + + /* Configure timeout */ + WDOG->TOVAL = (uint32_t )0xFFFF; +#endif /* (DISABLE_WDOG) */ +} + +/*FUNCTION********************************************************************** + * + * Function Name : SystemCoreClockUpdate + * Description : This function must be called whenever the core clock is changed + * during program execution. It evaluates the clock register settings and calculates + * the current core clock. + * + * Implements : SystemCoreClockUpdate_Activity + *END**************************************************************************/ +void SystemCoreClockUpdate(void) +{ + uint32_t SCGOUTClock = 0U; /* Variable to store output clock frequency of the SCG module */ + uint32_t regValue; /* Temporary variable */ + uint32_t divider; + bool validSystemClockSource = true; + + divider = ((SCG->CSR & SCG_CSR_DIVCORE_MASK) >> SCG_CSR_DIVCORE_SHIFT) + 1U; + + switch ((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT) + { + case 0x1: + /* System OSC */ + SCGOUTClock = CPU_XTAL_CLK_HZ; + break; + case 0x2: + /* Slow IRC */ + regValue = (SCG->SIRCCFG & SCG_SIRCCFG_RANGE_MASK) >> SCG_SIRCCFG_RANGE_SHIFT; + if (regValue != 0UL) + { + SCGOUTClock = FEATURE_SCG_SIRC_HIGH_RANGE_FREQ; + } + else + { + validSystemClockSource = false; + } + break; + case 0x3: + /* Fast IRC */ + regValue = (SCG->FIRCCFG & SCG_FIRCCFG_RANGE_MASK) >> SCG_FIRCCFG_RANGE_SHIFT; + if (regValue == 0x0UL) + { + SCGOUTClock = FEATURE_SCG_FIRC_FREQ0; + } + else + { + validSystemClockSource = false; + } + break; + default: + validSystemClockSource = false; + break; + } + + if (validSystemClockSource == true) + { + SystemCoreClock = (SCGOUTClock / divider); + } +} + +/*FUNCTION********************************************************************** + * + * Function Name : SystemSoftwareReset + * Description : This function is used to initiate a system reset + * + * Implements : SystemSoftwareReset_Activity + *END**************************************************************************/ +void SystemSoftwareReset(void) +{ + uint32_t regValue; + + /* Read Application Interrupt and Reset Control Register */ + regValue = S32_SCB->AIRCR; + + /* Clear register key */ + regValue &= ~( S32_SCB_AIRCR_VECTKEY_MASK); + + /* Configure System reset request bit and Register Key */ + regValue |= S32_SCB_AIRCR_VECTKEY(FEATURE_SCB_VECTKEY); + regValue |= S32_SCB_AIRCR_SYSRESETREQ(0x1u); + + /* Write computed register value */ + S32_SCB->AIRCR = regValue; +} + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/system_S32K118.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/system_S32K118.h new file mode 100644 index 00000000..6e98f97f --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/lib/system_S32K118.h @@ -0,0 +1,105 @@ +/* + * Copyright 2017-2018 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +/*! @addtogroup soc_support_S32K118*/ +/*! @{*/ + +/*! + * @file system_S32K118.h + * @brief Device specific configuration file for S32K118 + */ + +#ifndef SYSTEM_S32K118_H_ +#define SYSTEM_S32K118_H_ /**< Symbol preventing repeated inclusion */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * CPU Settings. + *****************************************************************************/ + +/* Watchdog disable */ +#ifndef DISABLE_WDOG + #define DISABLE_WDOG 1 +#endif + +/* Value of the external crystal or oscillator clock frequency in Hz */ +#ifndef CPU_XTAL_CLK_HZ + #define CPU_XTAL_CLK_HZ 8000000u +#endif + +/* Value of the fast internal oscillator clock frequency in Hz */ +#ifndef CPU_INT_FAST_CLK_HZ + #define CPU_INT_FAST_CLK_HZ 48000000u +#endif + +/* Default System clock value */ +#ifndef DEFAULT_SYSTEM_CLOCK + #define DEFAULT_SYSTEM_CLOCK 48000000u +#endif + +/** + * @brief System clock frequency (core clock) + * + * The system clock frequency supplied to the SysTick timer and the processor + * core clock. This variable can be used by the user application to setup the + * SysTick timer or configure other parameters. It may also be used by debugger to + * query the frequency of the debug timer or configure the trace clock speed + * SystemCoreClock is initialized with a correct predefined value. + */ +extern uint32_t SystemCoreClock; + +/** + * @brief Setup the SoC. + * + * This function disables the watchdog. + * if the corresponding feature macro is enabled. + * SystemInit is called from startup_device file. + */ +void SystemInit(void); + +/** + * @brief Updates the SystemCoreClock variable. + * + * It must be called whenever the core clock is changed during program + * execution. SystemCoreClockUpdate() evaluates the clock register settings and calculates + * the current core clock. + * This function must be called when user does not want to use clock manager component. + * If clock manager is used, the CLOCK_SYS_GetFreq function must be used with CORE_CLOCK + * parameter. + * + */ +void SystemCoreClockUpdate(void); + +/** + * @brief Initiates a system reset. + * + * This function is used to initiate a system reset + */ +void SystemSoftwareReset(void); + +#ifdef __cplusplus +} +#endif + +/*! @}*/ +#endif /* #if !defined(SYSTEM_S32K118_H_) */ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/main.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/main.c new file mode 100644 index 00000000..58518ee6 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/main.c @@ -0,0 +1,189 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/main.c +* \brief Bootloader application source file. +* \ingroup Boot_ARMCM0_S32K14_S32K118EVB_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#include "device_registers.h" /* device registers */ +#include "system_S32K118.h" /* device sconfiguration */ + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +static void Init(void); +static void SystemClockConfig(void); + + +/************************************************************************************//** +** \brief This is the entry point for the bootloader application and is called +** by the reset interrupt vector after the C-startup routines executed. +** \return Program return code. +** +****************************************************************************************/ +int main(void) +{ + /* Initialize the microcontroller. */ + Init(); + /* Initialize the bootloader. */ + BootInit(); + + /* Start the infinite program loop. */ + while (1) + { + /* Run the bootloader task. */ + BootTask(); + } + + /* Program should never get here. */ + return 0; +} /*** end of main ***/ + + +/************************************************************************************//** +** \brief Initializes the microcontroller. +** \return none. +** +****************************************************************************************/ +static void Init(void) +{ + /* Configure the system clock. */ + SystemClockConfig(); + /* Enable the peripheral clock for the ports that are used. */ + PCC->PCCn[PCC_PORTB_INDEX] |= PCC_PCCn_CGC_MASK; + PCC->PCCn[PCC_PORTD_INDEX] |= PCC_PCCn_CGC_MASK; + PCC->PCCn[PCC_PORTE_INDEX] |= PCC_PCCn_CGC_MASK; + + /* Configure SW2 (PD3) GPIO pin for (optional) backdoor entry input. */ + /* Input GPIO pin configuration. PD3 = GPIO, MUX = ALT1. */ + PORTD->PCR[3] |= PORT_PCR_MUX(1); + /* Disable pull device, as SW2 already has a pull down resistor on the board. */ + PORTD->PCR[3] &= ~PORT_PCR_PE(1); + /* Configure and enable Port D pin 3 GPIO as digital input */ + PTD->PDDR &= ~GPIO_PDDR_PDD(1 << 3U); + PTD->PIDR &= ~GPIO_PIDR_PID(1 << 3U); +#if (BOOT_COM_RS232_ENABLE > 0) + /* UART RX GPIO pin configuration. PB0 = UART0 RX, MUX = ALT2. */ + PORTB->PCR[0] |= PORT_PCR_MUX(2); + /* UART TX GPIO pin configuration. PB1 = UART0 TX, MUX = ALT2. */ + PORTB->PCR[1] |= PORT_PCR_MUX(2); +#endif +#if (BOOT_COM_CAN_ENABLE > 0) + /* CAN RX GPIO pin configuration. PE4 = CAN0 RX, MUX = ALT5. */ + PORTE->PCR[4] |= PORT_PCR_MUX(5); + /* CAN TX GPIO pin configuration. PE5 = CAN0 TX, MUX = ALT5. */ + PORTE->PCR[5] |= PORT_PCR_MUX(5); +#endif +} /*** end of Init ***/ + + +/************************************************************************************//** +** \brief System Clock Configuration. This code was derived from a S32 Design Studio +** example program. It enables the SOCS (40 MHz external crystal), FIRC (48 +** MHz internal) and SIRC (8 MHz internal). The FIRC is used as a source for +** the system clock and configures the normal RUN mode for the following clock +** settings: +** - CORE_CLK = 48 MHz +** - SYS_CLK = 48 MHz +** - BUS_CLK = 48 MHz +** - FLASH_CLK = 24 MHz +** - SOSCDIV1_CLK = 40 MHz +** - SOSCDIV2_CLK = 40 MHz +** - FIRCDIV1_CLK = 48 MHz +** - FIRCDIV2_CLK = 48 MHz +** - SIRCDIV1_CLK = 8 MHz +** - SIRCDIV2_CLK = 8 MHz +** \return none. +** +****************************************************************************************/ +static void SystemClockConfig(void) +{ + /* --------- SOSC Initialization (40 MHz) ------------------------------------------ */ + /* SOSCDIV1 & SOSCDIV2 =1: divide by 1. */ + SCG->SOSCDIV = SCG_SOSCDIV_SOSCDIV1(1) | SCG_SOSCDIV_SOSCDIV2(1); + /* Range=3: High freq (SOSC betw 8MHz - 40MHz). + * HGO=0: Config xtal osc for low power. + * EREFS=1: Input is external XTAL. + */ + SCG->SOSCCFG = SCG_SOSCCFG_RANGE(3) | SCG_SOSCCFG_EREFS_MASK; + /* Ensure SOSCCSR unlocked. */ + while (SCG->SOSCCSR & SCG_SOSCCSR_LK_MASK) + { + ; + } + + /* LK=0: SOSCCSR can be written. + * SOSCCMRE=0: OSC CLK monitor IRQ if enabled. + * SOSCCM=0: OSC CLK monitor disabled. + * SOSCERCLKEN=0: Sys OSC 3V ERCLK output clk disabled. + * SOSCLPEN=0: Sys OSC disabled in VLP modes. + * SOSCSTEN=0: Sys OSC disabled in Stop modes. + * SOSCEN=1: Enable oscillator. + */ + SCG->SOSCCSR = SCG_SOSCCSR_SOSCEN_MASK; + /* Wait for system OSC clock to become valid. */ + while (!(SCG->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK)) + { + ; + } + + /* --------- FIRC Initialization --------------------------------------------------- */ + /* Fast IRC is enabled and trimmed to 48 MHz in reset (default). Enable FIRCDIV2_CLK + * and FIRCDIV1_CLK, divide by 1 = 48 MHz. + */ + SCG->FIRCDIV = SCG_FIRCDIV_FIRCDIV1(1) | SCG_FIRCDIV_FIRCDIV2(1); + + /* --------- SIRC Initialization --------------------------------------------------- */ + /* Slow IRC is enabled with high range (8 MHz) in reset. Enable SIRCDIV2_CLK and + * SIRCDIV1_CLK, divide by 1 = 8MHz asynchronous clock source. + */ + SCG->SIRCDIV = SCG_SIRCDIV_SIRCDIV1(1) | SCG_SIRCDIV_SIRCDIV2(1); + + /* --------- Change to normal RUN mode with 48MHz FIRC ----------------------------- */ + /* Select FIRC as clock source. + * DIVCORE=0, div. by 1: Core clock = 48 MHz. + * DIVBUS=0, div. by 1: bus clock = 48 MHz. + * DIVSLOW=1, div. by 2: SCG slow, flash clock= 24 MHz + */ + SCG->RCCR = SCG_RCCR_SCS(3) | SCG_RCCR_DIVCORE(0) | SCG_RCCR_DIVBUS(0) | + SCG_RCCR_DIVSLOW(1); + + /* Wait until system clock source is FIRC. */ + while (((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT ) != 3U) + { + ; + } + /* Evaluate the clock register settings and calculates the current core clock. This + * function must be called when the clock manager component is not used. + */ + SystemCoreClockUpdate(); +} /*** end of SystemClockConfig ***/ + + +/*********************************** end of main.c *************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/startup/startup.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/startup/startup.c new file mode 100644 index 00000000..2d0efc61 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/startup/startup.c @@ -0,0 +1,248 @@ +/* + * Copyright (c) 2013 - 2014, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.9, An object should be defined at block + * scope if its identifier only appears in a single function. + * All variables with this problem are defined in the linker files. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.11, When an array with external linkage + * is declared, its size should be explicitly specified. + * The size of the arrays can not be explicitly determined. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 11.4, A conversion should not be performed + * between a pointer to object and an integer type. + * The cast is required to initialize a pointer with an unsigned int define, + * representing an address. + * + * @section [global] + * Violates MISRA 2012 Required Rule 11.6, A cast shall not be performed + * between pointer to void and an arithmetic type. + * The cast is required to initialize a pointer with an unsigned int define, + * representing an address. + * + * @section [global] + * Violates MISRA 2012 Required Rule 2.1, A project shall not contain unreachable + * code. + * The condition compares two address defined in linker files that can be different. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.7, External could be made static. + * Function is defined for usage by application code. + * + * @section [global] + * Violates MISRA 2012 Mandatory Rule 17.3, Symbol 'MFSPR' undeclared, assumed + * to return int. + * This is an e200 Power Architecture Assembly instruction used to retrieve + * the core number. + * + */ + +#include "startup.h" +#include + + +/******************************************************************************* + * Static Variables + ******************************************************************************/ +static volatile uint32_t * const s_vectors[NUMBER_OF_CORES] = FEATURE_INTERRUPT_INT_VECTORS; + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*FUNCTION********************************************************************** + * + * Function Name : init_data_bss + * Description : Make necessary initializations for RAM. + * - Copy the vector table from ROM to RAM. + * - Copy initialized data from ROM to RAM. + * - Copy code that should reside in RAM from ROM + * - Clear the zero-initialized data section. + * + * Tool Chains: + * __GNUC__ : GNU Compiler Collection + * __ghs__ : Green Hills ARM Compiler + * __ICCARM__ : IAR ARM Compiler + * __DCC__ : Wind River Diab Compiler + * __ARMCC_VERSION : ARMC Compiler + * + * Implements : init_data_bss_Activity + *END**************************************************************************/ +void init_data_bss(void) +{ + uint32_t n; + uint8_t coreId; +/* For ARMC we are using the library method of initializing DATA, Custom Section and + * Code RAM sections so the below variables are not needed */ +#if !defined(__ARMCC_VERSION) + /* Declare pointers for various data sections. These pointers + * are initialized using values pulled in from the linker file */ + uint8_t * data_ram; + uint8_t * code_ram; + uint8_t * bss_start; + uint8_t * custom_ram; + const uint8_t * data_rom, * data_rom_end; + const uint8_t * code_rom, * code_rom_end; + const uint8_t * bss_end; + const uint8_t * custom_rom, * custom_rom_end; +#endif + /* Addresses for VECTOR_TABLE and VECTOR_RAM come from the linker file */ + +#if defined(__ARMCC_VERSION) + extern uint32_t __RAM_VECTOR_TABLE_SIZE; + extern uint32_t __VECTOR_ROM; + extern uint32_t __VECTOR_RAM; +#else + extern uint32_t __RAM_VECTOR_TABLE_SIZE[]; + extern uint32_t __VECTOR_TABLE[]; + extern uint32_t __VECTOR_RAM[]; +#endif + /* Get section information from linker files */ +#if defined(__ICCARM__) + /* Data */ + data_ram = __section_begin(".data"); + data_rom = __section_begin(".data_init"); + data_rom_end = __section_end(".data_init"); + + /* CODE RAM */ + #pragma section = "__CODE_ROM" + #pragma section = "__CODE_RAM" + code_ram = __section_begin("__CODE_RAM"); + code_rom = __section_begin("__CODE_ROM"); + code_rom_end = __section_end("__CODE_ROM"); + + /* BSS */ + bss_start = __section_begin(".bss"); + bss_end = __section_end(".bss"); + + custom_ram = __section_begin(".customSection"); + custom_rom = __section_begin(".customSection_init"); + custom_rom_end = __section_end(".customSection_init"); + +#elif defined (__ARMCC_VERSION) + /* VECTOR TABLE*/ + uint8_t * vector_table_size = (uint8_t *)__RAM_VECTOR_TABLE_SIZE; + uint32_t * vector_rom = (uint32_t *)__VECTOR_ROM; + uint32_t * vector_ram = (uint32_t *)__VECTOR_RAM; +#else + extern uint32_t __DATA_ROM[]; + extern uint32_t __DATA_RAM[]; + extern uint32_t __DATA_END[]; + + extern uint32_t __CODE_RAM[]; + extern uint32_t __CODE_ROM[]; + extern uint32_t __CODE_END[]; + + extern uint32_t __BSS_START[]; + extern uint32_t __BSS_END[]; + + extern uint32_t __CUSTOM_ROM[]; + extern uint32_t __CUSTOM_END[]; + + /* Data */ + data_ram = (uint8_t *)__DATA_RAM; + data_rom = (uint8_t *)__DATA_ROM; + data_rom_end = (uint8_t *)__DATA_END; + /* CODE RAM */ + code_ram = (uint8_t *)__CODE_RAM; + code_rom = (uint8_t *)__CODE_ROM; + code_rom_end = (uint8_t *)__CODE_END; + /* BSS */ + bss_start = (uint8_t *)__BSS_START; + bss_end = (uint8_t *)__BSS_END; + + /* Custom section */ + custom_ram = CUSTOMSECTION_SECTION_START; + custom_rom = (uint8_t *)__CUSTOM_ROM; + custom_rom_end = (uint8_t *)__CUSTOM_END; + +#endif + +#if !defined(__ARMCC_VERSION) + /* Copy initialized data from ROM to RAM */ + while (data_rom_end != data_rom) + { + *data_ram = *data_rom; + data_ram++; + data_rom++; + } + + /* Copy functions from ROM to RAM */ + while (code_rom_end != code_rom) + { + *code_ram = *code_rom; + code_ram++; + code_rom++; + } + + /* Clear the zero-initialized data section */ + while(bss_end != bss_start) + { + *bss_start = 0; + bss_start++; + } + + /* Copy customsection rom to ram */ + while(custom_rom_end != custom_rom) + { + *custom_ram = *custom_rom; + custom_rom++; + custom_ram++; + } +#endif + coreId = (uint8_t)GET_CORE_ID(); +#if defined (__ARMCC_VERSION) + /* Copy the vector table from ROM to RAM */ + /* Workaround */ + for (n = 0; n < (((uint32_t)(vector_table_size))/sizeof(uint32_t)); n++) + { + vector_ram[n] = vector_rom[n]; + } + /* Point the VTOR to the position of vector table */ + *s_vectors[coreId] = (uint32_t) __VECTOR_RAM; +#else + /* Check if VECTOR_TABLE copy is needed */ + if (__VECTOR_RAM != __VECTOR_TABLE) + { + /* Copy the vector table from ROM to RAM */ + for (n = 0; n < (((uint32_t)__RAM_VECTOR_TABLE_SIZE)/sizeof(uint32_t)); n++) + { + __VECTOR_RAM[n] = __VECTOR_TABLE[n]; + } + /* Point the VTOR to the position of vector table */ + *s_vectors[coreId] = (uint32_t)__VECTOR_RAM; + } + else + { + /* Point the VTOR to the position of vector table */ + *s_vectors[coreId] = (uint32_t)__VECTOR_TABLE; + } +#endif + +} + +/******************************************************************************* + * EOF + ******************************************************************************/ + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/startup/startup.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/startup/startup.h new file mode 100644 index 00000000..8384b7db --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/startup/startup.h @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2013 - 2014, Freescale Semiconductor, Inc. + * Copyright 2016-2019 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef STARTUP_H +#define STARTUP_H + +#include +#include "device_registers.h" +/** + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 2.5, Local macro not referenced. + * The defined macro is used as include guard. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.9, An object should be defined at block + * scope if its identifier only appears in a single function. + * All variables with this problem are defined in the linker files. + * + */ + +/******************************************************************************* + * API + ******************************************************************************/ + +/*! + * @brief define symbols that specific start and end addres of some basic sections. + */ +#if (defined(S32K14x_SERIES) || defined(S32K11x_SERIES) || defined(S32V234_SERIES) || defined(MPC574x_SERIES) || defined(S32R_SERIES) || defined(S32MTV_SERIES) || defined(SJA1110_SERIES)) || defined (S32K144W_M4_SERIES) + #if (defined(__ICCARM__)) + #define INTERRUPTS_SECTION_START __section_begin(".intvec") + #define INTERRUPTS_SECTION_END __section_end(".intvec") + #define BSS_SECTION_START __section_begin(".bss") + #define BSS_SECTION_END __section_end(".bss") + #define DATA_SECTION_START __section_begin(".data") + #define DATA_SECTION_END __section_end(".data") + #define CUSTOMSECTION_SECTION_START __section_begin(".customSection") + #define CUSTOMSECTION_SECTION_END __section_end(".customSection") + #define CODE_RAM_SECTION_START __section_begin("__CODE_RAM") + #define CODE_RAM_SECTION_END __section_end("__CODE_RAM") + #define DATA_INIT_SECTION_START __section_begin(".data_init") + #define DATA_INIT_SECTION_END __section_end(".data_init") + #define CODE_ROM_SECTION_START __section_begin("__CODE_ROM") + #define CODE_ROM_SECTION_END __section_end("__CODE_ROM") + + #elif (defined(__ARMCC_VERSION)) + #define INTERRUPTS_SECTION_START (uint8_t *)__VECTOR_ROM_START + #define INTERRUPTS_SECTION_END (uint8_t *)__VECTOR_ROM_END + #define BSS_SECTION_START (uint8_t *)__BSS_START + #define BSS_SECTION_END (uint8_t *)__BSS_END + #define DATA_SECTION_START (uint8_t *)__DATA_RAM_START + #define DATA_SECTION_END (uint8_t *)__DATA_RAM_END + #define CUSTOMSECTION_SECTION_START (uint8_t *)__CUSTOM_SECTION_START + #define CUSTOMSECTION_SECTION_END (uint8_t *)__CUSTOM_SECTION_END + #define CODE_RAM_SECTION_START (uint8_t *)__CODE_RAM_START + #define CODE_RAM_SECTION_END (uint8_t *)__CODE_RAM_END + + extern uint32_t __VECTOR_ROM_START; + extern uint32_t __VECTOR_ROM_END; + extern uint32_t __BSS_START; + extern uint32_t __BSS_END; + extern uint32_t __DATA_RAM_START; + extern uint32_t __DATA_RAM_END; + extern uint32_t __CUSTOM_SECTION_START; + extern uint32_t __CUSTOM_SECTION_END; + extern uint32_t __CODE_RAM_START; + extern uint32_t __CODE_RAM_END; + #else + #define INTERRUPTS_SECTION_START (uint8_t *)&__interrupts_start__ + #define INTERRUPTS_SECTION_END (uint8_t *)&__interrupts_end__ + #define BSS_SECTION_START (uint8_t *)&__bss_start__ + #define BSS_SECTION_END (uint8_t *)&__bss_end__ + #define DATA_SECTION_START (uint8_t *)&__data_start__ + #define DATA_SECTION_END (uint8_t *)&__data_end__ + #define CUSTOMSECTION_SECTION_START (uint8_t *)&__customSection_start__ + #define CUSTOMSECTION_SECTION_END (uint8_t *)&__customSection_end__ + #define CODE_RAM_SECTION_START (uint8_t *)&__code_ram_start__ + #define CODE_RAM_SECTION_END (uint8_t *)&__code_ram_end__ + + extern uint32_t __interrupts_start__; + extern uint32_t __interrupts_end__; + extern uint32_t __bss_start__; + extern uint32_t __bss_end__; + extern uint32_t __data_start__; + extern uint32_t __data_end__; + extern uint32_t __customSection_start__; + extern uint32_t __customSection_end__; + extern uint32_t __code_ram_start__; + extern uint32_t __code_ram_end__; + #endif +#endif + +#if (defined(__ICCARM__)) + #pragma section = ".data" + #pragma section = ".data_init" + #pragma section = ".bss" + #pragma section = ".intvec" + #pragma section = ".customSection" + #pragma section = ".customSection_init" + #pragma section = "__CODE_RAM" + #pragma section = "__CODE_ROM" +#endif + +/*! + * @brief Make necessary initializations for RAM. + * + * - Copy initialized data from ROM to RAM. + * - Clear the zero-initialized data section. + * - Copy the vector table from ROM to RAM. This could be an option. + */ +void init_data_bss(void); + +#endif /* STARTUP_H*/ +/******************************************************************************* + * EOF + ******************************************************************************/ + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/startup/startup_S32K118.S b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/startup/startup_S32K118.S new file mode 100644 index 00000000..4f53518d --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/startup/startup_S32K118.S @@ -0,0 +1,227 @@ +/* ---------------------------------------------------------------------------------------*/ +/* @file: startup_S32K118.s */ +/* @purpose: GNU Compiler Collection Startup File */ +/* S32K118 */ +/* @version: 1.0 */ +/* @date: 2018-1-22 */ +/* @build: b170107 */ +/* ---------------------------------------------------------------------------------------*/ +/* */ +/* Copyright 2018 NXP */ +/* All rights reserved. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR */ +/* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES */ +/* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. */ +/* IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, */ +/* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */ +/* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR */ +/* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) */ +/* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, */ +/* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING */ +/* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF */ +/* THE POSSIBILITY OF SUCH DAMAGE. */ +/*****************************************************************************/ +/* Version: GNU Compiler Collection */ +/*****************************************************************************/ + .syntax unified + .arch armv6-m + + .section .isr_vector, "a" + .align 2 + .globl __isr_vector +__isr_vector: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* Non Maskable Interrupt */ + .long HardFault_Handler /* Cortex-M0 SV Hard Fault Interrupt */ + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long SVC_Handler /* Cortex-M0 SV Call Interrupt */ + .long 0 + .long 0 + .long PendSV_Handler /* Cortex-M0 Pend SV Interrupt */ + .long SysTick_Handler /* Cortex-M0 System Tick Interrupt */ + + + .long DMA0_IRQHandler /* DMA channel 0 transfer complete */ + .long DMA1_IRQHandler /* DMA channel 1 transfer complete */ + .long DMA2_IRQHandler /* DMA channel 2 transfer complete */ + .long DMA3_IRQHandler /* DMA channel 3 transfer complete */ + .long DMA_Error_IRQHandler /* DMA error interrupt channels 0-3 */ + .long ERM_fault_IRQHandler /* ERM single and double bit error correction */ + .long RTC_IRQHandler /* RTC alarm interrupt */ + .long RTC_Seconds_IRQHandler /* RTC seconds interrupt */ + .long LPTMR0_IRQHandler /* LPTIMER interrupt request */ + .long PORT_IRQHandler /* Port A, B, C, D and E pin detect interrupt */ + .long CAN0_ORed_Err_Wakeup_IRQHandler /* OR’ed [Bus Off OR Bus Off Done OR Transmit Warning OR Receive Warning], Interrupt indicating that errors were detected on the CAN bus, Interrupt asserted when Pretended Networking operation is enabled, and a valid message matches the selected filter criteria during Low Power mode */ + .long CAN0_ORed_0_31_MB_IRQHandler /* OR’ed Message buffer (0-15, 16-31) */ + .long FTM0_Ch0_7_IRQHandler /* FTM0 Channel 0 to 7 interrupt */ + .long FTM0_Fault_IRQHandler /* FTM0 Fault interrupt */ + .long FTM0_Ovf_Reload_IRQHandler /* FTM0 Counter overflow and Reload interrupt */ + .long FTM1_Ch0_7_IRQHandler /* FTM1 Channel 0 to 7 interrupt */ + .long FTM1_Fault_IRQHandler /* FTM1 Fault interrupt */ + .long FTM1_Ovf_Reload_IRQHandler /* FTM1 Counter overflow and Reload interrupt */ + .long FTFC_IRQHandler /* FTFC Command complete, Read collision and Double bit fault detect */ + .long PDB0_IRQHandler /* PDB0 interrupt */ + .long LPIT0_IRQHandler /* LPIT interrupt */ + .long SCG_CMU_LVD_LVWSCG_IRQHandler /* PMC Low voltage detect interrupt, SCG bus interrupt request and CMU loss of range interrupt */ + .long WDOG_IRQHandler /* WDOG interrupt request out before wdg reset out */ + .long RCM_IRQHandler /* RCM Asynchronous Interrupt */ + .long LPI2C0_Master_Slave_IRQHandler /* LPI2C0 Master Interrupt and Slave Interrupt */ + .long FLEXIO_IRQHandler /* FlexIO Interrupt */ + .long LPSPI0_IRQHandler /* LPSPI0 Interrupt */ + .long LPSPI1_IRQHandler /* LPSPI1 Interrupt */ + .long ADC0_IRQHandler /* ADC0 interrupt request. */ + .long CMP0_IRQHandler /* CMP0 interrupt request */ + .long LPUART1_RxTx_IRQHandler /* LPUART1 Transmit / Receive Interrupt */ + .long LPUART0_RxTx_IRQHandler /* LPUART0 Transmit / Receive Interrupt */ + + .size __isr_vector, . - __isr_vector + +/* Flash Configuration */ + .section .FlashConfig, "a" + .long 0xFFFFFFFF /* 8 bytes backdoor comparison key */ + .long 0xFFFFFFFF /* */ + .long 0xFFFFFFFF /* 4 bytes program flash protection bytes */ + .long 0xFFFF7FFE /* FDPROT:FEPROT:FOPT:FSEC(0xFE = unsecured) */ + + .text + .thumb + +/* Reset Handler */ + + .thumb_func + .align 2 + .globl Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + cpsid i /* Mask interrupts */ + + /* Init the rest of the registers */ + ldr r1,=0 + ldr r2,=0 + ldr r3,=0 + ldr r4,=0 + ldr r5,=0 + ldr r6,=0 + ldr r7,=0 + mov r8,r7 + mov r9,r7 + mov r10,r7 + mov r11,r7 + mov r12,r7 + +#ifdef START_FROM_FLASH + + /* Init ECC RAM */ + + ldr r1, =__RAM_START + ldr r2, =__RAM_END + + subs r2, r1 + subs r2, #1 + ble .LC5 + + movs r0, 0 + movs r3, #4 +.LC4: + str r0, [r1] + add r1, r1, r3 + subs r2, 4 + bge .LC4 +.LC5: +#endif + + /* Initialize the stack pointer */ + ldr r0,=__StackTop + mov r13,r0 + +#ifndef __NO_SYSTEM_INIT + /* Call the system init routine */ + ldr r0,=SystemInit + blx r0 +#endif + + /* Init .data and .bss sections */ + ldr r0,=init_data_bss + blx r0 + cpsie i /* Unmask interrupts */ + +#ifndef __START +#ifdef __EWL__ +#define __START __thumb_startup +#else +#define __START _start +#endif +#endif + bl __START + +JumpToSelf: + b JumpToSelf + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak DefaultISR + .type DefaultISR, %function +DefaultISR: + b DefaultISR + .size DefaultISR, . - DefaultISR + +/* 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, DefaultISR + .endm + +/* Exception Handlers */ + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler SVC_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + def_irq_handler DMA0_IRQHandler + def_irq_handler DMA1_IRQHandler + def_irq_handler DMA2_IRQHandler + def_irq_handler DMA3_IRQHandler + def_irq_handler DMA_Error_IRQHandler + def_irq_handler ERM_fault_IRQHandler + def_irq_handler RTC_IRQHandler + def_irq_handler RTC_Seconds_IRQHandler + def_irq_handler LPTMR0_IRQHandler + def_irq_handler PORT_IRQHandler + def_irq_handler CAN0_ORed_Err_Wakeup_IRQHandler + def_irq_handler CAN0_ORed_0_31_MB_IRQHandler + def_irq_handler FTM0_Ch0_7_IRQHandler + def_irq_handler FTM0_Fault_IRQHandler + def_irq_handler FTM0_Ovf_Reload_IRQHandler + def_irq_handler FTM1_Ch0_7_IRQHandler + def_irq_handler FTM1_Fault_IRQHandler + def_irq_handler FTM1_Ovf_Reload_IRQHandler + def_irq_handler FTFC_IRQHandler + def_irq_handler PDB0_IRQHandler + def_irq_handler LPIT0_IRQHandler + def_irq_handler SCG_CMU_LVD_LVWSCG_IRQHandler + def_irq_handler WDOG_IRQHandler + def_irq_handler RCM_IRQHandler + def_irq_handler LPI2C0_Master_Slave_IRQHandler + def_irq_handler FLEXIO_IRQHandler + def_irq_handler LPSPI0_IRQHandler + def_irq_handler LPSPI1_IRQHandler + def_irq_handler ADC0_IRQHandler + def_irq_handler CMP0_IRQHandler + def_irq_handler LPUART1_RxTx_IRQHandler + def_irq_handler LPUART0_RxTx_IRQHandler + + .end diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.cproject b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.cproject new file mode 100644 index 00000000..934ca17c --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.cproject @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.project b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.project new file mode 100644 index 00000000..aa7f79b4 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.project @@ -0,0 +1,26 @@ + + + Prog + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/com.nxp.s32ds.cle.runtime.component.prefs b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/com.nxp.s32ds.cle.runtime.component.prefs new file mode 100644 index 00000000..637f1f53 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/com.nxp.s32ds.cle.runtime.component.prefs @@ -0,0 +1,8 @@ +com.nxp.s32ds.cle.runtime.component.registry.archetype.id=application +com.nxp.s32ds.cle.runtime.component.registry.archetype.platform.id= +com.nxp.s32ds.cle.runtime.hardware.registry.core.id=CortexM0P +com.nxp.s32ds.cle.runtime.hardware.registry.device.id=S32K118 +com.nxp.s32ds.cle.runtime.hardware.registry.deviceCore.id=S32K118_M0P +com.nxp.s32ds.cle.runtime.hardware.registry.family.id=S32K1 +com.nxp.s32ds.cle.runtime.lang.registry.lang.id=c +eclipse.preferences.version=1 diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/com.processorexpert.core.ide.newprojectwizard.prefs b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/com.processorexpert.core.ide.newprojectwizard.prefs new file mode 100644 index 00000000..87ca305f --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/com.processorexpert.core.ide.newprojectwizard.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +versionGenerated/versionGenerated=1.8.4.RT7_b1743-0713 diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/language.settings.xml b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/language.settings.xml new file mode 100644 index 00000000..79b318f7 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/language.settings.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/org.eclipse.cdt.codan.core.prefs b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 00000000..98b63502 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +inEditor=false +onBuild=false diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/org.eclipse.cdt.core.prefs b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 00000000..053e5f50 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/.settings/org.eclipse.cdt.core.prefs @@ -0,0 +1,21 @@ +eclipse.preferences.version=1 +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.1790979322/PATH/delimiter=; +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.1790979322/PATH/operation=prepend +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.1790979322/PATH/value= +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.1790979322/append=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.1790979322/appendContributed=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.839914523/PATH/delimiter=; +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.839914523/PATH/operation=prepend +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.839914523/PATH/value= +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.839914523/append=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.839914523/appendContributed=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.1876020028/PATH/delimiter=; +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.1876020028/PATH/operation=prepend +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.1876020028/PATH/value= +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.1876020028/append=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.1876020028/appendContributed=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.246914351/PATH/delimiter=; +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.246914351/PATH/operation=prepend +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.246914351/PATH/value= +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.246914351/append=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.246914351/appendContributed=true diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/Debug/demoprog_s32k118.elf b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/Debug/demoprog_s32k118.elf new file mode 100644 index 0000000000000000000000000000000000000000..50377abc37bfba349f75c4d47c9b913bdf202355 GIT binary patch literal 502580 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 aCbwkzTgZ#r2{zm}K7NzCJ$S+|eEu(G&DJFV literal 0 HcmV?d00001 diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/Debug/demoprog_s32k118.srec b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/Debug/demoprog_s32k118.srec new file mode 100644 index 00000000..9957447f --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/Debug/demoprog_s32k118.srec @@ -0,0 +1,206 @@ +S018000064656D6F70726F675F7333326B3131382E7372656373 +S1132000005800203D250000992500009925000076 +S113201000000000000000000000000000000000BC +S113202000000000000000000000000099250000EE +S1132030000000000000000099250000D92C0000D9 +S11320409925000099250000992500009925000094 +S11320509925000099250000992500009925000084 +S11320609925000099250000992500009925000074 +S11320709925000099250000992500009925000064 +S11320809925000099250000992500009925000054 +S11320909925000099250000992500009925000044 +S11320A09925000099250000992500009925000034 +S11320B09925000099250000992500009925000024 +S10720C0EE11AA551A +S1132400FFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFF59 +S1132410054B0648033310B51B1A062B03D9044B8E +S1132420002B00D0984710BD28010020280100206F +S1132430000000000648074910B5091A8910CB0F9F +S11324405918491003D0044B002B00D0984710BDF5 +S113245028010020280100200000000010B5074CCE +S11324602378002B09D1FFF7D3FF054B002B02D0B3 +S1132470044800E000BF0123237010BDC0300020D9 +S113248000000000382F0000094B10B5002B03D0CA +S11324900849094800E000BF08480368002B02D13E +S11324A0FFF7C8FF10BD064B002BF9D09847F7E79C +S11324B000000000C4300020382F00002401002058 +S11324C000000000164B002B00D1144B9D46402207 +S11324D092029A1A924600218B460F461348144AD8 +S11324E0121A00F0F9FC0F4B002B00D098470E4B4A +S11324F0002B00D098470020002104000D000D4857 +S1132500002802D00C4800E000BF00F0C1FC20000D +S1132510290000F05DFB00F0A5FCC04600000800A7 +S1132520005800200000000000000000C03000201F +S113253034310020000000000000000072B6104991 +S11325400F4A0F4B0E4C0E4D0D4E0D4FB846B9466B +S1132550BA46BB46BC460B490B4A521A013A05DD42 +S11325600020042308601944043AFBDA074885462E +S1132570074880470748804762B6FFF7A3FFFEE796 +S11325800000000000000020005800200058002037 +S1132590E92C0000892D0000FEE7C0460022430814 +S11325A08B4274D303098B425FD3030A8B4244D317 +S11325B0030B8B4228D3030C8B420DD3FF22090259 +S11325C012BA030C8B4202D31212090265D0030B18 +S11325D08B4219D300E0090AC30B8B4201D3CB030E +S11325E0C01A5241830B8B4201D38B03C01A524150 +S11325F0430B8B4201D34B03C01A5241030B8B4252 +S113260001D30B03C01A5241C30A8B4201D3CB023C +S1132610C01A5241830A8B4201D38B02C01A524121 +S1132620430A8B4201D34B02C01A5241030A8B4224 +S113263001D30B02C01A5241CDD2C3098B4201D33C +S1132640CB01C01A524183098B4201D38B01C01ABA +S1132650524143098B4201D34B01C01A5241030931 +S11326608B4201D30B01C01A5241C3088B4201D3E0 +S1132670CB00C01A524183088B4201D38B00C01A8D +S1132680524143088B4201D34B00C01A5241411AB4 +S113269000D20146524110467047FFE701B50020C1 +S11326A000F006F802BDC0460029F7D076E770476F +S11326B07047C04670B50C4B1B68002B00DB70BD27 +S11326C0094A13685B005B08136000F0FFFAFA30F4 +S11326D00400054E80256D0333682B42EFD000F0D3 +S11326E0F5FA8442F8D2EAE70040024070B50D4B97 +S11326F019688022D2050A431A601968802252059B +S11327000A431A6000F0E2FAFA300400054E80250C +S11327106D0433682B4203D100F0D8FA8442F8D216 +S113272070BDC04600400240F0B585B0002302AA47 +S1132730137001335370013393700233D370043335 +S1132740137108335371103393712033D371AA4A30 +S11327506933FF33D158A9480140D150D05884215E +S1132760C9050143D1505C33A54AD3585B055B0FBF +S113277005D18021490081239B00D150012382226D +S113278092009F498A58D20776D49E4802AAD15C07 +S1132790FFF704FFE1210902FFF700FFC31D1B043B +S11327A0DB0CE022D2041A43974B1A61974A5A6110 +S11327B000229A611A625A62F02292029A629A6A1A +S11327C088210A439A620122DA62C02212039A61C2 +S11327D08949902288588023DB0503438B50FFF7F7 +S11327E069FFFFF783FF8A4B1B68002B13DB884AC2 +S11327F0116880231B060B43136000F067FAFA305C +S11328000400834E80256D0333682B4203D100F00E +S11328105DFA8442F8D27E4A53687E490B40536085 +S1132820FFF748FFFFF762FF002302AA137001338A +S11328305370013393700233D3700433137108332C +S11328405371103393712033D371C4336C4AD3580A +S11328505B055B0F06D1802149000533FF33D1505E +S1132860043BFF3B02AAD15C6B48FFF797FE019043 +S11328706A4F0026002505E0694887E701360437DA +S1132880122E1BD03A785401A41AA400A418A40050 +S113289021000198FFF708FF0029EFD121000198DA +S11328A0FFF77CFE85B26B1E9BB2FF2BE6D8B60009 +S11328B05A4B9E197778B078F17802E00021002015 +S11328C00027534A5468574B1C40546054686B1E8D +S11328D01B062343536056687D1E07232B40334356 +S11328E053605468431EDB04E025AD032B402343AF +S11328F0536054684B1E1B04E021C9020B40234360 +S113290053605268031C042800D90423DBB2013B42 +S11329109B05C02109040B4013433D4A536053688F +S113292080210B4353600023100000211A00203241 +S1132930920011500133802BF8D100233448002138 +S1132940882292009A18920011500133202BF7D15B +S11329502F4B1A687F218A4360390A431A60196829 +S1132960802292020A431A601968802252020A43A2 +S11329701A601A682C490A401A602C492C4A99504A +S11329808021C9048822520099502A49043299505E +S113299000229A62013A1A63274A1A621A6827497E +S11329A00A401A605A6826490A405A601A6813494C +S11329B00A401A601A6823490A401A6000F086F92E +S11329C0FA300400124E80256D0433682B4203D084 +S11329D000F07CF98442F8D200F078F9FA3004006F +S11329E00B4E80252D0533682B4203D000F06EF981 +S11329F08442F8D205B0F0BD00500640FFFFFFBF8F +S1132A000040064080841E0000A0064000C01FC095 +S1132A1000400240FFDFFFFF409C0000EC2E00005E +S1132A2000127A0078FF0000FFFFFFDFFFFFFF5F67 +S1132A30A408000000009C1906003B00FFFF7FFF74 +S1132A40F7EFFFFFFFFFFFEF30B583B03A4B1B7882 +S1132A50002B3AD1394B5B699B0207D5374BDB69B5 +S1132A60DBB2374A1370013B3F2B23D9354B1B6B29 +S1132A709B051DD588235B00324AD1580903090FF1 +S1132A8052D00023032430481A006240D2B2125CB0 +S1132A906D465A550133DAB29142F5D8294B80225A +S1132AA092001A639A68294B1A602B78FF2B2BD05B +S1132AB003B030BD00F00AF9254B186001221E4B0B +S1132AC01A700022234B1A70D0E71C4B5B699B02DF +S1132AD01FD520490B78194AD469194AD018447073 +S1132AE00133DBB20B7012789A42BFD10022124B31 +S1132AF01A70134B5B78FF2BB8D1114B9B78002BCA +S1132B00B4D100F031F9B1E70229D1D100F02CF9A8 +S1132B10CEE700F0DBF80E4B1B6864339842A5D96E +S1132B200022054B1A70A1E7064B802292001A631B +S1132B309A68064B1A60BBE72131002000A00640CA +S1132B40E03000200040024018410240DC30002008 +S1132B50243100202231002080235B00044A1362C8 +S1132B60044A51691943516191680B43936070475A +S1132B7000D0044000F10F4010B500F0A7F8114B4D +S1132B801B68C31AF422FF3293420FD90E4B1B78F1 +S1132B90002B0CD1F33AFF3A0B4B1A700B4A5168D5 +S1132BA080235B000B435360064B186010BD00226A +S1132BB0054B1A70054A916880235B000B439360B0 +S1132BC0F2E7C0462C3100202831002000F10F40EC +S1132BD010B52D4B0221FF31822252009950CD397C +S1132BE0043299501900083A80231B04885818426B +S1132BF0FCD1012180235B00234AD15011001A002B +S1132C0080235B0488581842FCD01F4B0222FF32F9 +S1132C10C12189005A500139FF395A501B4A5A615F +S1132C2019000F220B691B0E1340032BFAD100F07D +S1132C306DF8174B9420400019588022D205114397 +S1132C4019509A214900585802435A50114B196897 +S1132C50802292001143196059680A435A600E4B4E +S1132C601969A022D2001143196159690A435A61B2 +S1132C7000F014F8FFF770FF62B6FFF755FDFFF799 +S1132C807BFFFFF7E1FEFAE7004006400100000386 +S1132C900050064000A0044000D0044010B5084B8A +S1132CA01868FA218900FFF779FC0138054B586050 +S1132CB000229A6007211960034B1A6010BDC046B8 +S1132CC0C000002010E000E030310020014B186803 +S1132CD07047C04630310020024A13680133136044 +S1132CE07047C04630310020044B054A5A605A6888 +S1132CF0044A1A60044A9A607047C046002005409E +S1132D0020C528D920210000FFFF000010B5124B78 +S1132D1019691B691B011B0F022B0CD0032B12D04A +S1132D20012B07D10D480903090F0131FFF736FCC8 +S1132D300B4B186010BD82239B00074AD358DB0756 +S1132D40F8D50648EFE7C2239B00034AD3589B07F4 +S1132D50F0D10448E7E7C0460040064000127A007C +S1132D60C0000020006CDC020448054943581B04E1 +S1132D701B0C044A134343507047C04600E000E074 +S1132D800C0D00000400FA0530B5274A274B9A427F +S1132D9009D02649891A0023254C1000C25CE2544C +S1132DA001338B42FAD1234A234B9A4209D0224958 +S1132DB0891A0023214C1000C25CE2540133994269 +S1132DC0FAD11F4A1F4B9A4206D0130000211D4A14 +S1132DD0197001339342FBD11B4A1C4B9A4209D010 +S1132DE01A49891A00231A4C1000C25CE2540133B8 +S1132DF09942FAD1174A184B9A4210D017498908B8 +S1132E0009D000230022134C1348C558E550013261 +S1132E1004338A42F9D1124B0E4A1A6030BD104B6A +S1132E200D4A1A60FAE7C046602F0000C82F000060 +S1132E30C0000020C82F0000C82F00002801002077 +S1132E40C030002034310020C82F0000C82F0000FB +S1132E50C03000200000002000200000C00000005E +S1132E6008ED00E0084B10B50400002B02D000214F +S1132E7000E000BF054B1868836A002B00D0984718 +S1132E80200000F031F8C04600000000342F00009C +S1132E9070B500260C4D0D4C641BA410A64209D13C +S1132EA0002600F049F80A4D0A4C641BA410A642FF +S1132EB005D170BDB300EB5898470136EEE7B30077 +S1132EC0EB5898470136F2E7582F0000582F0000BE +S1132ED0582F00005C2F000003008218934200D199 +S1132EE0704719700133F9E7FEE700000803020296 +S1132EF0090303020A0303030B0403030C0404037E +S1132F000D0504030E0504040F060404100605044D +S1132F10110705041207050513080505140806051D +S1132F2015080705160807061708080618080807ED +S1132F3019080808C4000020F8B5C046F8BC08BC4D +S1132F409E467047F8B5C046F8BC08BC9E4670471C +S10B2F5074F5FF7F010000008D +S1072F5889240000C4 +S1072F5C5D240000EC +S1132F60006CDC0200000000000000000000000013 +S1132F70000000000000000000000000000000004D +S1132F80000000000000000000000000000000003D +S1132F90000000000000000000000000000000002D +S1132FA0000000000000000000000000000000001D +S1132FB0000000000000000000000000000000000D +S10B2FC0000000000000000005 +S903253D9A diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/Prog_Debug.launch b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/Prog_Debug.launch new file mode 100644 index 00000000..be1e9f3f --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/Prog_Debug.launch @@ -0,0 +1,221 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/S32K118_25_flash.ld b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/S32K118_25_flash.ld new file mode 100644 index 00000000..cf44acda --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/S32K118_25_flash.ld @@ -0,0 +1,278 @@ +/* +** ################################################################### +** Processor: S32K118 with 25 KB SRAM +** Compiler: GNU C Compiler +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright 2018 NXP +** All rights reserved. +** +** THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +** INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +** STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +** IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +** +** http: www.freescale.com +** mail: support@freescale.com +** +** ################################################################### +*/ + +/* Entry Point */ +ENTRY(Reset_Handler) +/* +To use "new" operator with EWL in C++ project the following symbol shall be defined +*/ +/*EXTERN(_ZN10__cxxabiv119__terminate_handlerE)*/ + +HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x00000200; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x00000200; + +/* If symbol __flash_vector_table__=1 is defined at link time + * the interrupt vector will not be copied to RAM. + * Warning: Using the interrupt vector from Flash will not allow + * INT_SYS_InstallHandler because the section is Read Only. + */ +M_VECTOR_RAM_SIZE = DEFINED(__flash_vector_table__) ? 0x0 : 0x00C0; + +/* Specify the memory areas */ +MEMORY +{ + /* Flash */ + m_interrupts (RX) : ORIGIN = 0x00002000, LENGTH = 0x000000C4 + m_flash_config (RX) : ORIGIN = 0x00002400, LENGTH = 0x00000010 + m_text (RX) : ORIGIN = 0x00002410, LENGTH = 0x0003FBF0 - 0x2000 + + /* SRAM_L */ + + /* SRAM_U */ + m_data (RW) : ORIGIN = 0x20000000, LENGTH = 0x000030C0 + m_data_2 (RW) : ORIGIN = 0x200030C0, LENGTH = 0x00002740 +} + +/* Define output sections */ +SECTIONS +{ + /* The startup code goes first into internal flash */ + .interrupts : + { + __VECTOR_TABLE = .; + __interrupts_start__ = .; + . = ALIGN(4); + KEEP(*(.isr_vector)) /* Startup code */ + __interrupts_end__ = .; + . = ALIGN(4); + } > m_interrupts + + .flash_config : + { + . = ALIGN(4); + KEEP(*(.FlashConfig)) /* Flash Configuration Field (FCF) */ + . = ALIGN(4); + } > m_flash_config + + /* The program code and other data goes into internal flash */ + .text : + { + . = ALIGN(4); + *(.text) /* .text sections (code) */ + *(.text*) /* .text* sections (code) */ + *(.rodata) /* .rodata sections (constants, strings, etc.) */ + *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ + *(.glue_7) /* glue arm to thumb code */ + *(.glue_7t) /* glue thumb to arm code */ + *(.eh_frame) + KEEP (*(.init)) + KEEP (*(.fini)) + . = ALIGN(4); + } > m_text + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > m_text + + .ARM : + { + __exidx_start = .; + *(.ARM.exidx*) + __exidx_end = .; + } > m_text + + .ctors : + { + __CTOR_LIST__ = .; + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + __CTOR_END__ = .; + } > m_text + + .dtors : + { + __DTOR_LIST__ = .; + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + __DTOR_END__ = .; + } > m_text + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array*)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } > m_text + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array*)) + PROVIDE_HIDDEN (__init_array_end = .); + } > m_text + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT(.fini_array.*))) + KEEP (*(.fini_array*)) + PROVIDE_HIDDEN (__fini_array_end = .); + } > m_text + + __etext = .; /* Define a global symbol at end of code. */ + __DATA_ROM = .; /* Symbol is used by startup for data initialization. */ + .interrupts_ram : + { + . = ALIGN(4); + __VECTOR_RAM__ = .; + __RAM_START = .; + __interrupts_ram_start__ = .; /* Create a global symbol at data start. */ + *(.m_interrupts_ram) /* This is a user defined section. */ + . += M_VECTOR_RAM_SIZE; + . = ALIGN(4); + __interrupts_ram_end__ = .; /* Define a global symbol at data end. */ + } > m_data + + __VECTOR_RAM = DEFINED(__flash_vector_table__) ? ORIGIN(m_interrupts) : __VECTOR_RAM__ ; + __RAM_VECTOR_TABLE_SIZE = DEFINED(__flash_vector_table__) ? 0x0 : (__interrupts_ram_end__ - __interrupts_ram_start__) ; + + .data : AT(__DATA_ROM) + { + . = ALIGN(4); + __DATA_RAM = .; + __data_start__ = .; /* Create a global symbol at data start. */ + *(.data) /* .data sections */ + *(.data*) /* .data* sections */ + KEEP(*(.jcr*)) + . = ALIGN(4); + __data_end__ = .; /* Define a global symbol at data end. */ + } > m_data + + __DATA_END = __DATA_ROM + (__data_end__ - __data_start__); + __CODE_ROM = __DATA_END; /* Symbol is used by code initialization. */ + .code : AT(__CODE_ROM) + { + . = ALIGN(4); + __CODE_RAM = .; + __code_start__ = .; /* Create a global symbol at code start. */ + __code_ram_start__ = .; + *(.code_ram) /* Custom section for storing code in RAM */ + . = ALIGN(4); + __code_end__ = .; /* Define a global symbol at code end. */ + __code_ram_end__ = .; + } > m_data + + __CODE_END = __CODE_ROM + (__code_end__ - __code_start__); + __CUSTOM_ROM = __CODE_END; + + /* Custom Section Block that can be used to place data at absolute address. */ + /* Use __attribute__((section (".customSection"))) to place data here. */ + .customSectionBlock ORIGIN(m_data_2) : AT(__CUSTOM_ROM) + { + __customSection_start__ = .; + KEEP(*(.customSection)) /* Keep section even if not referenced. */ + __customSection_end__ = .; + } > m_data_2 + __CUSTOM_END = __CUSTOM_ROM + (__customSection_end__ - __customSection_start__); + + /* Uninitialized data section. */ + .bss : + { + /* This is used by the startup in order to initialize the .bss section. */ + . = ALIGN(4); + __BSS_START = .; + __bss_start__ = .; + *(.bss) + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + __BSS_END = .; + } > m_data_2 + + .heap : + { + . = ALIGN(8); + __end__ = .; + __heap_start__ = .; + PROVIDE(end = .); + PROVIDE(_end = .); + PROVIDE(__end = .); + __HeapBase = .; + . += HEAP_SIZE; + __HeapLimit = .; + __heap_limit = .; + __heap_end__ = .; + } > m_data_2 + + /* Initializes stack on the end of block */ + __StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2); + __StackLimit = __StackTop - STACK_SIZE; + PROVIDE(__stack = __StackTop); + __RAM_END = __StackTop; + + .stack __StackLimit : + { + . = ALIGN(8); + __stack_start__ = .; + . += STACK_SIZE; + __stack_end__ = .; + } > m_data_2 + + /* Labels required by EWL */ + __START_BSS = __BSS_START; + __END_BSS = __BSS_END; + __SP_INIT = __StackTop; + + .ARM.attributes 0 : { *(.ARM.attributes) } + + ASSERT(__StackLimit >= __HeapLimit, "region m_data_2 overflowed with stack and heap") +} + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/boot.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/boot.c new file mode 100644 index 00000000..dabb48bf --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/boot.c @@ -0,0 +1,772 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/boot.c +* \brief Demo program bootloader interface source file. +* \ingroup Prog_ARMCM0_S32K14_S32K118EVB_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "header.h" /* generic header */ + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +#if (BOOT_COM_RS232_ENABLE > 0) +static void BootComRs232Init(void); +static void BootComRs232CheckActivationRequest(void); +#endif +#if (BOOT_COM_CAN_ENABLE > 0) +static void BootComCanInit(void); +static void BootComCanCheckActivationRequest(void); +#endif + + +/************************************************************************************//** +** \brief Initializes the communication interface. +** \return none. +** +****************************************************************************************/ +void BootComInit(void) +{ +#if (BOOT_COM_RS232_ENABLE > 0) + BootComRs232Init(); +#endif +#if (BOOT_COM_CAN_ENABLE > 0) + BootComCanInit(); +#endif +} /*** end of BootComInit ***/ + + +/************************************************************************************//** +** \brief Receives the CONNECT request from the host, which indicates that the +** bootloader should be activated and, if so, activates it. +** \return none. +** +****************************************************************************************/ +void BootComCheckActivationRequest(void) +{ +#if (BOOT_COM_RS232_ENABLE > 0) + BootComRs232CheckActivationRequest(); +#endif +#if (BOOT_COM_CAN_ENABLE > 0) + BootComCanCheckActivationRequest(); +#endif +} /*** end of BootComCheckActivationRequest ***/ + + +/************************************************************************************//** +** \brief Bootloader activation function. +** \return none. +** +****************************************************************************************/ +void BootActivate(void) +{ + /* Activate the bootloader by performing a software reset. */ + SystemSoftwareReset(); +} /*** end of BootActivate ***/ + + +#if (BOOT_COM_RS232_ENABLE > 0) +/**************************************************************************************** +* U N I V E R S A L A S Y N C H R O N O U S R X T X I N T E R F A C E +****************************************************************************************/ + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +/** \brief Timeout time for the reception of a CTO packet. The timer is started upon + * reception of the first packet byte. + */ +#define RS232_CTO_RX_PACKET_TIMEOUT_MS (100u) +/** \brief Set the peripheral LPUART base pointer. */ +#define LPUARTx (LPUART0) +/** \brief Set the PCC index offset for LPUART. */ +#define PCC_LPUARTx_INDEX (PCC_LPUART0_INDEX) + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +static unsigned char Rs232ReceiveByte(unsigned char *data); + + +/************************************************************************************//** +** \brief Initializes the UART communication interface. +** \return none. +** +****************************************************************************************/ +static void BootComRs232Init(void) +{ + unsigned long sourceClockFreqHz; + unsigned long div2RegValue; + unsigned short baudrateSbr0_12; + unsigned char const div2DividerLookup[] = + { + 0U, /* 0b000. Output disabled. */ + 1U, /* 0b001. Divide by 1. */ + 2U, /* 0b010. Divide by 2. */ + 4U, /* 0b011. Divide by 4. */ + 8U, /* 0b100. Divide by 8. */ + 16U, /* 0b101. Divide by 16. */ + 32U, /* 0b110. Divide by 32. */ + 64U, /* 0b111. Divide by 64. */ + }; + + /* Make sure the UART peripheral clock is disabled before configuring its source + * clock. + */ + PCC->PCCn[PCC_LPUARTx_INDEX] &= ~PCC_PCCn_CGC_MASK; + /* Select option 2 as the UART peripheral source clock and enable the clock. Option 2 + * is the SIRCDIV2_CLK, which is available on all peripherals and configurations. + */ + PCC->PCCn[PCC_LPUARTx_INDEX] |= PCC_PCCn_PCS(2) | PCC_PCCn_CGC_MASK; + /* Obtain the DIV2 divider value of the SIRC_CLK. */ + div2RegValue = (SCG->SIRCDIV & SCG_SIRCDIV_SIRCDIV2_MASK) >> SCG_SIRCDIV_SIRCDIV2_SHIFT; + /* Check if the DIV2 register value for SIRC is 0. In this case SIRCDIV2_CLK is + * currently disabled. + */ + if (div2RegValue == 0U) + { + /* Configure the DIV2 for a default divide by 1 to make sure the SIRCDIV2_CLK is + * actually enabled. + */ + div2RegValue = 1U; + SCG->SIRCDIV = SCG_SIRCDIV_SIRCDIV2(div2RegValue); + } + /* Determine the SIRC clock frequency. If SIRC high range is enabled, it is 8 MHz. If + * SIRC low range is enabled, it is 2 MHz. + */ + sourceClockFreqHz = 8000000U; + if ((SCG->SIRCCFG & SCG_SIRCCFG_RANGE_MASK) == SCG_SIRCCFG_RANGE(0)) + { + sourceClockFreqHz = 2000000U; + } + /* Now process the configured DIV2 divider factor to get the actual frequency of the + * UART peripheral source clock. + */ + sourceClockFreqHz /= div2DividerLookup[div2RegValue]; + /* Configure the baudrate from BOOT_COM_RS232_BAUDRATE, taking into account that an + * oversampling of 8 will be configured. Default 8,n,1 format is used. Integer + * rounding is used to get the best value for baudrateSbr0_12. Actual baudrate equals + * sourceClockFreqHz / 8 / baudrateSbr0_12. + */ + baudrateSbr0_12 = (((sourceClockFreqHz / BOOT_COM_RS232_BAUDRATE) + (8U - 1U)) / 8U) & + LPUART_BAUD_SBR_MASK; + /* OSR=7: Over sampling ratio = 7+1=8. + * SBNS=0: One stop bit. + * BOTHEDGE=0: receiver samples only on rising edge. + * M10=0: Rx and Tx use 7 to 9 bit data characters. + * RESYNCDIS=0: Resync during rec'd data word supported. + * LBKDIE, RXEDGIE=0: interrupts disable. + * TDMAE, RDMAE, TDMAE=0: DMA requests disabled. + * MAEN1, MAEN2, MATCFG=0: Match disabled. + */ + LPUARTx->BAUD = LPUART_BAUD_SBR(baudrateSbr0_12) | LPUART_BAUD_OSR(7); + /* Clear the error/interrupt flags */ + LPUARTx->STAT = FEATURE_LPUART_STAT_REG_FLAGS_MASK; + /* Reset all features/interrupts by default */ + LPUARTx->CTRL = 0x00000000; + /* Reset match addresses */ + LPUARTx->MATCH = 0x00000000; +#if FEATURE_LPUART_HAS_MODEM_SUPPORT + /* Reset IrDA modem features */ + LPUARTx->MODIR = 0x00000000; +#endif +#if FEATURE_LPUART_FIFO_SIZE > 0U + /* Reset FIFO feature */ + LPUARTx->FIFO = FEATURE_LPUART_FIFO_RESET_MASK; + /* Enable the transmit and receive FIFOs. */ + LPUARTx->FIFO |= LPUART_FIFO_TXFE(1) | LPUART_FIFO_RXFE(1); + /* Set the reception water mark to 0 and the transmitter water mark to 1. */ + LPUARTx->WATER = LPUART_WATER_TXWATER(1) | LPUART_WATER_RXWATER(0); +#endif + /* Enable transmitter and receiver, no parity, 8 bit char: + * RE=1: Receiver enabled. + * TE=1: Transmitter enabled. + * PE,PT=0: No hw parity generation or checking. + * M7,M,R8T9,R9T8=0: 8-bit data characters. + * DOZEEN=0: LPUART enabled in Doze mode. + * ORIE,NEIE,FEIE,PEIE,TIE,TCIE,RIE,ILIE,MA1IE,MA2IE=0: no IRQ. + * TxDIR=0: TxD pin is input if in single-wire mode. + * TXINV=0: Transmit data not inverted. + * RWU,WAKE=0: normal operation; rcvr not in standby. + * IDLCFG=0: one idle character. + * ILT=0: Idle char bit count starts after start bit. + * SBK=0: Normal transmitter operation - no break char. + * LOOPS,RSRC=0: no loop back. + */ + LPUARTx->CTRL = LPUART_CTRL_RE_MASK | LPUART_CTRL_TE_MASK; +} /*** end of BootComRs232Init ***/ + + +/************************************************************************************//** +** \brief Receives the CONNECT request from the host, which indicates that the +** bootloader should be activated and, if so, activates it. +** \return none. +** +****************************************************************************************/ +static void BootComRs232CheckActivationRequest(void) +{ + static unsigned char xcpCtoReqPacket[BOOT_COM_RS232_RX_MAX_DATA+1]; + static unsigned char xcpCtoRxLength; + static unsigned char xcpCtoRxInProgress = 0; + static unsigned long xcpCtoRxStartTime = 0; + + /* start of cto packet received? */ + if (xcpCtoRxInProgress == 0) + { + /* store the message length when received */ + if (Rs232ReceiveByte(&xcpCtoReqPacket[0]) == 1) + { + /* check that the length has a valid value. it should not be 0 */ + if ( (xcpCtoReqPacket[0] > 0) && + (xcpCtoReqPacket[0] <= BOOT_COM_RS232_RX_MAX_DATA) ) + { + /* store the start time */ + xcpCtoRxStartTime = TimerGet(); + /* indicate that a cto packet is being received */ + xcpCtoRxInProgress = 1; + /* reset packet data count */ + xcpCtoRxLength = 0; + } + } + } + else + { + /* store the next packet byte */ + if (Rs232ReceiveByte(&xcpCtoReqPacket[xcpCtoRxLength+1]) == 1) + { + /* increment the packet data count */ + xcpCtoRxLength++; + + /* check to see if the entire packet was received */ + if (xcpCtoRxLength == xcpCtoReqPacket[0]) + { + /* done with cto packet reception */ + xcpCtoRxInProgress = 0; + + /* check if this was an XCP CONNECT command */ + if ((xcpCtoReqPacket[1] == 0xff) && (xcpCtoReqPacket[2] == 0x00)) + { + /* connection request received so start the bootloader */ + BootActivate(); + } + } + } + else + { + /* check packet reception timeout */ + if (TimerGet() > (xcpCtoRxStartTime + RS232_CTO_RX_PACKET_TIMEOUT_MS)) + { + /* cancel cto packet reception due to timeout. note that this automatically + * discards the already received packet bytes, allowing the host to retry. + */ + xcpCtoRxInProgress = 0; + } + } + } +} /*** end of BootComRs232CheckActivationRequest ***/ + + +/************************************************************************************//** +** \brief Receives a communication interface byte if one is present. +** \param data Pointer to byte where the data is to be stored. +** \return 1 if a byte was received, 0 otherwise. +** +****************************************************************************************/ +static unsigned char Rs232ReceiveByte(unsigned char *data) +{ + unsigned char result = 0; + + /* Check if a new byte was received by means of the RDRF-bit. */ + if (((LPUARTx->STAT & LPUART_STAT_RDRF_MASK) >> LPUART_STAT_RDRF_SHIFT) != 0U) + { + /* Retrieve and store the newly received byte. */ + *data = LPUARTx->DATA; + /* Update the result. */ + result = 1; + } + + /* Give the result back to the caller. */ + return result; +} /*** end of Rs232ReceiveByte ***/ +#endif /* BOOT_COM_RS232_ENABLE > 0 */ + + +#if (BOOT_COM_CAN_ENABLE > 0) +/**************************************************************************************** +* C O N T R O L L E R A R E A N E T W O R K I N T E R F A C E +****************************************************************************************/ + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +/** \brief Timeout for entering/leaving CAN initialization mode in milliseconds. */ +#define CAN_INIT_TIMEOUT_MS (250U) + +/** \brief Set the peripheral CAN0 base pointer. */ +#define CANx (CAN0) +/** \brief Set the PCC index offset for CAN0. */ +#define PCC_FlexCANx_INDEX (PCC_FlexCAN0_INDEX) +/** \brief Set the number of message boxes supported by CAN0. */ +#define CANx_MAX_MB_NUM (FEATURE_CAN0_MAX_MB_NUM) + +/** \brief The mailbox used for receiving the XCP command message. */ +#define CAN_RX_MSGBOX_NUM (9U) + + +/**************************************************************************************** +* Type definitions +****************************************************************************************/ +/** \brief Structure type for grouping CAN bus timing related information. */ +typedef struct t_can_bus_timing +{ + unsigned char timeQuanta; /**< Total number of time quanta */ + unsigned char propSeg; /**< CAN propagation segment */ + unsigned char phaseSeg1; /**< CAN phase segment 1 */ + unsigned char phaseSeg2; /**< CAN phase segment 2 */ +} tCanBusTiming; + + +/**************************************************************************************** +* Local constant declarations +****************************************************************************************/ +/** \brief CAN bit timing table for dynamically calculating the bittiming settings. + * \details According to the CAN protocol 1 bit-time can be made up of between 8..25 + * time quanta (TQ). The total TQ in a bit is SYNC + TSEG1 + TSEG2 with SYNC + * always being 1. The sample point is (SYNC + TSEG1) / (SYNC + TSEG1 + TSEG2) + * * 100%. This array contains possible and valid time quanta configurations + * with a sample point between 68..78%. A visual representation of the TQ in + * a bit is: + * | SYNCSEG | TIME1SEG | TIME2SEG | + * Or with an alternative representation: + * | SYNCSEG | PROPSEG | PHASE1SEG | PHASE2SEG | + * With the alternative representation TIME1SEG = PROPSEG + PHASE1SEG. + * + */ +static const tCanBusTiming canTiming[] = +{ + /* Time-Quanta | PROPSEG | PSEG1 | PSEG2 | Sample-Point */ + /* ---------------------------------------------------- */ + { 8U, 3U, 2U, 2U }, /*1+3+2+1=8 | 3 | 2 | 2 | 75% */ + { 9U, 3U, 3U, 2U }, /* 9 | 3 | 3 | 2 | 78% */ + { 10U, 3U, 3U, 3U }, /* 10 | 3 | 3 | 3 | 70% */ + { 11U, 4U, 3U, 3U }, /* 11 | 4 | 3 | 3 | 73% */ + { 12U, 4U, 4U, 3U }, /* 12 | 4 | 4 | 3 | 75% */ + { 13U, 5U, 4U, 3U }, /* 13 | 5 | 4 | 3 | 77% */ + { 14U, 5U, 4U, 4U }, /* 14 | 5 | 4 | 4 | 71% */ + { 15U, 6U, 4U, 4U }, /* 15 | 6 | 4 | 4 | 73% */ + { 16U, 6U, 5U, 4U }, /* 16 | 6 | 5 | 4 | 75% */ + { 17U, 7U, 5U, 4U }, /* 17 | 7 | 5 | 4 | 76% */ + { 18U, 7U, 5U, 5U }, /* 18 | 7 | 5 | 5 | 72% */ + { 19U, 8U, 5U, 5U }, /* 19 | 8 | 5 | 5 | 74% */ + { 20U, 8U, 6U, 5U }, /* 20 | 8 | 6 | 5 | 75% */ + { 21U, 8U, 7U, 5U }, /* 21 | 8 | 7 | 5 | 76% */ + { 22U, 8U, 7U, 6U }, /* 22 | 8 | 7 | 6 | 73% */ + { 23U, 8U, 8U, 6U }, /* 23 | 8 | 8 | 6 | 74% */ + { 24U, 8U, 8U, 7U }, /* 24 | 8 | 8 | 7 | 71% */ + { 25U, 8U, 8U, 8U } /* 25 | 8 | 8 | 8 | 68% */ +}; + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/** \brief Dummy variable to store the CAN controller's free running timer value in. + * This is needed at the end of a CAN message reception to unlock the mailbox + * again. If this variable is declared locally within the function, it generates + * an unwanted compiler warning about assigning a value and not using it. + * For this reason this dummy variabled is declare here as a module global. + */ +static volatile unsigned long dummyTimerVal; + + +/************************************************************************************//** +** \brief Search algorithm to match the desired baudrate to a possible bus +** timing configuration. +** \param baud The desired baudrate in kbps. Valid values are 10..1000. +** \param prescaler Pointer to where the value for the prescaler will be stored. +** \param busTimingCfg Pointer to where the bus timing values will be stored. +** \return 1 if the CAN bustiming register values were found, 0 otherwise. +** +****************************************************************************************/ +static unsigned char CanGetSpeedConfig(unsigned short baud, unsigned short * prescaler, + tCanBusTiming * busTimingCfg) +{ + unsigned char cnt; + unsigned long canClockFreqkHz; + unsigned long div2RegValue; + unsigned char const div2DividerLookup[] = + { + 0U, /* 0b000. Output disabled. */ + 1U, /* 0b001. Divide by 1. */ + 2U, /* 0b010. Divide by 2. */ + 4U, /* 0b011. Divide by 4. */ + 8U, /* 0b100. Divide by 8. */ + 16U, /* 0b101. Divide by 16. */ + 32U, /* 0b110. Divide by 32. */ + 64U, /* 0b111. Divide by 64. */ + }; + + /* Obtain the DIV2 divider value of the SOSC_CLK. */ + div2RegValue = (SCG->SOSCDIV & SCG_SOSCDIV_SOSCDIV2_MASK) >> SCG_SOSCDIV_SOSCDIV2_SHIFT; + /* Check if the DIV2 register value for SOSC is 0. In this case SOSCDIV2_CLK is + * currently disabled. + */ + if (div2RegValue == 0U) + { + /* Configure the DIV2 for a default divide by 1 to make sure the SOSCDIV2_CLK is + * actually enabled. + */ + div2RegValue = 1U; + SCG->SOSCDIV = SCG_SOSCDIV_SOSCDIV2(div2RegValue); + } + /* Determine the SOSC clock frequency. */ + canClockFreqkHz = BOOT_CPU_XTAL_SPEED_KHZ; + /* Now process the configured DIV2 divider factor to get the actual frequency of the + * CAN peripheral source clock. + */ + canClockFreqkHz /= div2DividerLookup[div2RegValue]; + + /* Loop through all possible time quanta configurations to find a match. */ + for (cnt=0; cnt < sizeof(canTiming)/sizeof(canTiming[0]); cnt++) + { + if ((canClockFreqkHz % (baud * canTiming[cnt].timeQuanta)) == 0U) + { + /* Compute the prescaler that goes with this TQ configuration. */ + *prescaler = canClockFreqkHz/(baud * canTiming[cnt].timeQuanta); + + /* Make sure the prescaler is valid. */ + if ((*prescaler > 0U) && (*prescaler <= 256U)) + { + /* Store the bustiming configuration. */ + *busTimingCfg = canTiming[cnt]; + /* Found a good bus timing configuration. */ + return 1U; + } + } + } + /* Could not find a good bus timing configuration. */ + return 0U; +} /*** end of CanGetSpeedConfig ***/ + + +/************************************************************************************//** +** \brief Places the CAN controller in freeze mode. Note that the CAN controller +** can only be placed in freeze mode, if it is actually enabled. +** \return none. +** +****************************************************************************************/ +static void CanFreezeModeEnter(void) +{ + unsigned long timeout; + + /* Request to enter freeze mode. */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_FRZ_MASK) | CAN_MCR_FRZ(1U); + CANx->MCR = (CANx->MCR & ~CAN_MCR_HALT_MASK) | CAN_MCR_HALT(1U); + /* Set timeout time for entering freeze mode. */ + timeout = TimerGet() + CAN_INIT_TIMEOUT_MS; + /* Wait for freeze mode acknowledgement. */ + while (((CANx->MCR & CAN_MCR_FRZACK_MASK)) == 0U) + { + /* Break loop upon timeout. This would indicate a hardware failure. */ + if (TimerGet() > timeout) + { + break; + } + } +} /*** end of CanFreezeModeEnter ***/ + + +/************************************************************************************//** +** \brief Leaves the CAN controller's freeze mode. Note that this operation can +** only be done, if it is actually enabled. +** \return none. +** +****************************************************************************************/ +static void CanFreezeModeExit(void) +{ + unsigned long timeout; + + /* Request to leave freeze mode. */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_FRZ_MASK) | CAN_MCR_FRZ(0U); + CANx->MCR = (CANx->MCR & ~CAN_MCR_HALT_MASK) | CAN_MCR_HALT(0U); + /* Set timeout time for leaving freeze mode. */ + timeout = TimerGet() + CAN_INIT_TIMEOUT_MS; + /* Wait for non freeze mode acknowledgement. */ + while (((CANx->MCR & CAN_MCR_FRZACK_MASK)) != 0U) + { + /* Break loop upon timeout. This would indicate a hardware failure. */ + if (TimerGet() > timeout) + { + break; + } + } +} /*** end of CanFreezeModeExit ***/ + + +/************************************************************************************//** +** \brief Places the CAN controller in disabled mode. +** \return none. +** +****************************************************************************************/ +static void CanDisabledModeEnter(void) +{ + unsigned long timeout; + + /* Only continue if the CAN controller is currently enabled. */ + if ((CANx->MCR & CAN_MCR_MDIS_MASK) == 0U) + { + /* Request disabled mode. */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_MDIS_MASK) | CAN_MCR_MDIS(1U); + /* Set timeout time for entering disabled mode. */ + timeout = TimerGet() + CAN_INIT_TIMEOUT_MS; + /* Wait for disabled mode acknowledgement. */ + while (((CANx->MCR & CAN_MCR_LPMACK_MASK)) == 0U) + { + /* Break loop upon timeout. This would indicate a hardware failure. */ + if (TimerGet() > timeout) + { + break; + } + } + } +} /*** end of CanDisabledModeEnter ***/ + +/************************************************************************************//** +** \brief Places the CAN controller in enabled mode. +** \return none. +** +****************************************************************************************/ +static void CanDisabledModeExit(void) +{ + unsigned long timeout; + + /* Only continue if the CAN controller is currently disabled. */ + if ((CANx->MCR & CAN_MCR_MDIS_MASK) != 0U) + { + /* Request enabled mode. */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_MDIS_MASK) | CAN_MCR_MDIS(0U); + /* Set timeout time for leaving disabled mode. */ + timeout = TimerGet() + CAN_INIT_TIMEOUT_MS; + /* Wait for disabled mode acknowledgement. */ + while (((CANx->MCR & CAN_MCR_LPMACK_MASK)) != 0U) + { + /* Break loop upon timeout. This would indicate a hardware failure. */ + if (TimerGet() > timeout) + { + break; + } + } + } +} /*** end of CanDisabledModeExit ***/ + + +/************************************************************************************//** +** \brief Initializes the CAN communication interface. +** \return none. +** +****************************************************************************************/ +static void BootComCanInit(void) +{ + unsigned short prescaler = 0; + tCanBusTiming timingCfg = { 0 }; + unsigned char rjw; + unsigned short idx; + unsigned long timeout; + unsigned long rxMsgId = BOOT_COM_CAN_RX_MSG_ID; + + /* Enable the CAN peripheral clock. */ + PCC->PCCn[PCC_FlexCANx_INDEX] |= PCC_PCCn_CGC_MASK; + + /* The source clock needs to be configured first. For this the CAN controller must be + * in disabled mode, but that can only be entered after first entering freeze mode, + * which in turn can only be in enabled mode. So first enable the module, then goto + * freeze mode and finally enter disabled mode. + */ + CanDisabledModeExit(); + CanFreezeModeEnter(); + CanDisabledModeEnter(); + /* Configure SOSCDIV2 as the source clock. This assumes that an external oscillator + * is available, which is typically the case to meet the clock tolerance requirements + * of the CAN 2.0B secification. + */ + CANx->CTRL1 &= ~CAN_CTRL1_CLKSRC_MASK; + /* Leave disabled mode. */ + CanDisabledModeExit(); + /* Make sure freeze mode is active to be able to initialize the CAN controller. */ + CanFreezeModeEnter(); + + /* Obtain bittiming configuration information. */ + (void)CanGetSpeedConfig(BOOT_COM_CAN_BAUDRATE/1000, &prescaler, &timingCfg); + + /* Reset the current bittiming configuration. */ + CANx->CTRL1 &= ~(CAN_CTRL1_PRESDIV_MASK | CAN_CTRL1_PROPSEG_MASK | + CAN_CTRL1_PSEG1_MASK | CAN_CTRL1_PSEG2_MASK | CAN_CTRL1_RJW_MASK | + CAN_CTRL1_SMP_MASK); + /* Configure the baudrate prescaler. */ + CANx->CTRL1 |= CAN_CTRL1_PRESDIV(prescaler - 1U); + /* Configure the propagation segment. */ + CANx->CTRL1 |= CAN_CTRL1_PROPSEG(timingCfg.propSeg - 1U); + /* Configure the phase segments. */ + CANx->CTRL1 |= CAN_CTRL1_PSEG1(timingCfg.phaseSeg1 - 1U); + CANx->CTRL1 |= CAN_CTRL1_PSEG2(timingCfg.phaseSeg2 - 1U); + /* The resynchronization jump width (RJW) can be 1 - 4 TQ, yet should never be larger + * than pseg1. Configure the longest possible value for RJW. + */ + rjw = (timingCfg.phaseSeg1 < 4) ? timingCfg.phaseSeg1 : 4; + CANx->CTRL1 |= CAN_CTRL1_RJW(rjw - 1U); + /* All the entries in canTiming[] have a PSEG1 >= 2, so three samples can be used to + * determine the value of the received bit, instead of the default one. + */ + CANx->CTRL1 |= CAN_CTRL1_SMP(1U); + + /* Clear the message box RAM. Each message box covers 4 words (1 word = 32-bits. */ + for (idx = 0; idx < (CANx_MAX_MB_NUM * 4U); idx++) + { + CANx->RAMn[idx] = 0U; + } + /* Clear the reception mask register for each message box. */ + for (idx = 0; idx < CANx_MAX_MB_NUM; idx++) + { + CANx->RXIMR[idx] = 0U; + } + /* Configure the maximum number of message boxes. */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_MAXMB_MASK) | CAN_MCR_MAXMB(CANx_MAX_MB_NUM - 1U); + /* Disable the self reception feature. */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_SRXDIS_MASK) | CAN_MCR_SRXDIS(1U); + + /* Enable individual reception masking. This disables the legacy support for the + * global reception mask and the mailbox 14/15 individual reception mask. + */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_IRMQ_MASK) | CAN_MCR_IRMQ(1U); + /* Disable the reception FIFO. This driver only needs to receive one CAN message + * identifier. It is sufficient to use just one dedicated mailbox for this. + */ + CANx->MCR &= ~CAN_MCR_RFEN_MASK; + /* Configure the mask of the invididual message reception mailbox to check all ID bits + * and also the IDE bit. + */ + CANx->RXIMR[CAN_RX_MSGBOX_NUM] = 0x40000000U | 0x1FFFFFFFU; + /* Configure the reception mailbox to receive just the CAN message configured with + * BOOT_COM_CAN_RX_MSG_ID. + * EDL, BRS, ESI=0: CANFD not used. + * CODE=0b0100: mailbox set to active and empty. + * IDE=0: 11-bit CAN identifier. + * SRR, RTR, TIME STAMP=0: not applicable. + */ + CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 0U] = 0x04000000; + /* Store the message identifier to receive in the mailbox RAM. */ + if ((rxMsgId & 0x80000000U) != 0U) + { + /* It is a 29-bit extended CAN identifier. */ + rxMsgId &= ~0x80000000U; + /* Set the IDE bit to configure the message for a 29-bit identifier. */ + CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 0U] |= CAN_WMBn_CS_IDE_MASK; + /* Store the 29-bit CAN identifier. */ + CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 1U] = CAN_WMBn_ID_ID(rxMsgId); + } + else + { + /* Store the 11-bit CAN identifier. */ + CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 1U] = CAN_WMBn_ID_ID(rxMsgId << 18U); + } + + /* Disable all message box interrupts. */ + CANx->IMASK1 = 0U; + /* Clear all mesasge box interrupt flags. */ + CANx->IFLAG1 = CAN_IMASK1_BUF31TO0M_MASK; + /* Clear all error interrupt flags */ + CANx->ESR1 = CAN_ESR1_ERRINT_MASK | CAN_ESR1_BOFFINT_MASK | CAN_ESR1_RWRNINT_MASK | + CAN_ESR1_TWRNINT_MASK | CAN_ESR1_BOFFDONEINT_MASK | + CAN_ESR1_ERRINT_FAST_MASK | CAN_ESR1_ERROVR_MASK; + + /* Switch to normal user mode. */ + CANx->MCR &= ~CAN_MCR_SUPV_MASK; + CANx->CTRL1 &= ~(CAN_CTRL1_LOM_MASK | CAN_CTRL1_LPB_MASK); + /* Exit freeze mode. */ + CanFreezeModeExit(); + /* Set timeout time for entering normal user mode. */ + timeout = TimerGet() + CAN_INIT_TIMEOUT_MS; + /* Wait for normal user mode acknowledgement. */ + while (((CANx->MCR & CAN_MCR_NOTRDY_MASK)) != 0U) + { + /* Break loop upon timeout. This would indicate a hardware failure. */ + if (TimerGet() > timeout) + { + break; + } + } +} /*** end of BootComCanInit ***/ + + +/************************************************************************************//** +** \brief Receives the CONNECT request from the host, which indicates that the +** bootloader should be activated and, if so, activates it. +** \return none. +** +****************************************************************************************/ +static void BootComCanCheckActivationRequest(void) +{ + unsigned char * pMsgBoxData; + unsigned char byteIdx; + unsigned char rxMsgData[8]; + unsigned char rxMsgLen; + + /* Check if a message was received in the individual mailbox configured to receive + * the BOOT_COM_CAN_RX_MSG_ID message. + */ + if ((CANx->IFLAG1 & (1U << CAN_RX_MSGBOX_NUM)) != 0U) + { + /* Note that there is no need to verify the identifier of the CAN message because the + * mailbox is configured to only receive the BOOT_COM_CAN_TX_MSG_ID message. Start + * by reading out the DLC of the newly received CAN message. + */ + rxMsgLen = (CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 0U] & CAN_WMBn_CS_DLC_MASK) >> CAN_WMBn_CS_DLC_SHIFT; + /* Read the data bytes of the CAN message from the mailbox RAM. */ + pMsgBoxData = (unsigned char *)(&CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 2U]); + for (byteIdx = 0; byteIdx < rxMsgLen; byteIdx++) + { + rxMsgData[byteIdx] = pMsgBoxData[((byteIdx) & ~3U) + (3U - ((byteIdx) & 3U))]; + } + /* Clear the mailbox interrupt flag by writing a 1 to the corresponding box. */ + CANx->IFLAG1 = (1U << CAN_RX_MSGBOX_NUM); + /* Read the free running timer to unlock the mailbox. */ + dummyTimerVal = CANx->TIMER; + + /* check if this was an XCP CONNECT command */ + if ((rxMsgData[0] == 0xff) && (rxMsgLen == 2)) + { + /* connection request received so start the bootloader */ + BootActivate(); + } + } +} /*** end of BootComCanCheckActivationRequest ***/ +#endif /* BOOT_COM_CAN_ENABLE > 0 */ + + +/*********************************** end of boot.c *************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/boot.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/boot.h new file mode 100644 index 00000000..9d2c34c3 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/boot.h @@ -0,0 +1,40 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/boot.h +* \brief Demo program bootloader interface header file. +* \ingroup Prog_ARMCM0_S32K14_S32K118EVB_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ +#ifndef BOOT_H +#define BOOT_H + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +void BootComInit(void); +void BootComCheckActivationRequest(void); +void BootActivate(void); + + +#endif /* BOOT_H */ +/*********************************** end of boot.h *************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/header.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/header.h new file mode 100644 index 00000000..857057fa --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/header.h @@ -0,0 +1,42 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/header.h +* \brief Generic header file. +* \ingroup Prog_ARMCM0_S32K14_S32K118EVB_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ +#ifndef HEADER_H +#define HEADER_H + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "../Boot/blt_conf.h" /* bootloader configuration */ +#include "boot.h" /* bootloader interface driver */ +#include "led.h" /* LED driver */ +#include "timer.h" /* Timer driver */ +#include "device_registers.h" /* Device registers */ +#include "system_S32K118.h" /* Device sconfiguration */ + +#endif /* HEADER_H */ +/*********************************** end of header.h ***********************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/led.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/led.c new file mode 100644 index 00000000..97e67db4 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/led.c @@ -0,0 +1,96 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/led.c +* \brief LED driver source file. +* \ingroup Prog_ARMCM0_S32K14_S32K118EVB_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "header.h" /* generic header */ + + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +/** \brief Toggle interval time in milliseconds. */ +#define LED_TOGGLE_MS (500U) + + +/************************************************************************************//** +** \brief Initializes the LED. +** \return none. +** +****************************************************************************************/ +void LedInit(void) +{ + /* LED GPIO pin configuration. PE8 = GPIO, MUX = ALT1. */ + PORTE->PCR[8] = PORT_PCR_MUX(1); + /* Configure Port E pin 8 GPIO as digital output. */ + PTE->PDDR |= GPIO_PDDR_PDD(1 << 8U); + /* Turn the LED off on Port E pin 8. */ + PTE->PCOR |= GPIO_PSOR_PTSO(1 << 8U); +} /*** end of LedInit ***/ + + +/************************************************************************************//** +** \brief Toggles the LED at a fixed time interval. +** \return none. +** +****************************************************************************************/ +void LedToggle(void) +{ + static unsigned char led_toggle_state = 0; + static unsigned long timer_counter_last = 0; + unsigned long timer_counter_now; + + /* Check if toggle interval time passed. */ + timer_counter_now = TimerGet(); + if ( (timer_counter_now - timer_counter_last) < LED_TOGGLE_MS) + { + /* Not yet time to toggle. */ + return; + } + + /* Determine toggle action. */ + if (led_toggle_state == 0) + { + led_toggle_state = 1; + /* Turn the LED on. */ + PTE->PSOR |= GPIO_PSOR_PTSO(1 << 8U); + } + else + { + led_toggle_state = 0; + /* Turn the LED off. */ + PTE->PCOR |= GPIO_PSOR_PTSO(1 << 8U); + } + + /* Store toggle time to determine next toggle interval. */ + timer_counter_last = timer_counter_now; +} /*** end of LedToggle ***/ + + +/*********************************** end of led.c **************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/led.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/led.h new file mode 100644 index 00000000..28d28c0c --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/led.h @@ -0,0 +1,39 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/led.h +* \brief LED driver header file. +* \ingroup Prog_ARMCM0_S32K14_S32K118EVB_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ +#ifndef LED_H +#define LED_H + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +void LedInit(void); +void LedToggle(void); + + +#endif /* LED_H */ +/*********************************** end of led.h **************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/S32K118.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/S32K118.h new file mode 100644 index 00000000..d1f10a17 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/S32K118.h @@ -0,0 +1,10438 @@ +/* +** ################################################################### +** Processor: S32K118 +** Reference manual: S32K1XXRM Rev. 9, 09/2018 +** Version: rev. 1.3, 2019-02-19 +** Build: b190219 +** +** Abstract: +** Peripheral Access Layer for S32K118 +** +** Copyright (c) 1997 - 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2019 NXP +** All rights reserved. +** +** THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +** INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +** STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +** IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +** +** http: www.nxp.com +** mail: support@nxp.com +** +** Revisions: +** - rev. 1.0 (2017-12-14) - Mihai Volmer +** Initial version based on S32K1XXRM Rev. 6, 12/2017. +** - rev. 1.1 (2018-02-08) - Mihai Volmer +** Renamed the NVIC register array IP to IPR to reflect the register access difference from Cortex-M4 NVIC registers +** Fixed CSE_PRAM base address +** - rev. 1.2 (2018-07-19) - Dan Nastasa +** Updated the header based on S32K1XXRM Rev. 8, 06/2018. +** Added MTB_DWT peripheral to the header file +** - rev. 1.3 (2019-02-19) - Ionut Pavel +** Updated the header based on S32K1XXRM Rev. 9, 09/2018. +** Removed LMEM_LMDR2 register from the header file. +** Modified LMEM_LMPECR register to Read-Only. +** +** ################################################################### +*/ + +/*! + * @file S32K118.h + * @version 1.3 + * @date 2019-02-19 + * @brief Peripheral Access Layer for S32K118 + * + * This file contains register definitions and macros for easy access to their + * bit fields. + * + * This file assumes LITTLE endian system. + */ + +/** +* @page misra_violations MISRA-C:2012 violations +* +* @section [global] +* Violates MISRA 2012 Advisory Rule 2.3, local typedef not referenced +* The SoC header defines typedef for all modules. +* +* @section [global] +* Violates MISRA 2012 Advisory Rule 2.5, local macro not referenced +* The SoC header defines macros for all modules and registers. +* +* @section [global] +* Violates MISRA 2012 Advisory Directive 4.9, Function-like macro +* These are generated macros used for accessing the bit-fields from registers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 5.1, identifier clash +* The supported compilers use more than 31 significant characters for identifiers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 5.2, identifier clash +* The supported compilers use more than 31 significant characters for identifiers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 5.4, identifier clash +* The supported compilers use more than 31 significant characters for identifiers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 5.5, identifier clash +* The supported compilers use more than 31 significant characters for identifiers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 21.1, defined macro '__I' is reserved to the compiler +* This type qualifier is needed to ensure correct I/O access and addressing. +*/ + +/* ---------------------------------------------------------------------------- + -- MCU activation + ---------------------------------------------------------------------------- */ + +/* Prevention from multiple including the same memory map */ +#if !defined(S32K118_H_) /* Check if memory map has not been already included */ +#define S32K118_H_ +#define MCU_S32K118 + +/* Check if another memory map has not been also included */ +#if (defined(MCU_ACTIVE)) + #error S32K118 memory map: There is already included another memory map. Only one memory map can be included. +#endif /* (defined(MCU_ACTIVE)) */ +#define MCU_ACTIVE + +#include + +/** Memory map major version (memory maps with equal major version number are + * compatible) */ +#define MCU_MEM_MAP_VERSION 0x0100u +/** Memory map minor version */ +#define MCU_MEM_MAP_VERSION_MINOR 0x0003u + +/* ---------------------------------------------------------------------------- + -- Generic macros + ---------------------------------------------------------------------------- */ + +/* IO definitions (access restrictions to peripheral registers) */ +/** +* IO Type Qualifiers are used +* \li to specify the access to peripheral variables. +* \li for automatic generation of peripheral register debug information. +*/ +#ifndef __IO +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ +#endif + + +/** +* @brief 32 bits memory read macro. +*/ +#if !defined(REG_READ32) + #define REG_READ32(address) (*(volatile uint32_t*)(address)) +#endif + +/** +* @brief 32 bits memory write macro. +*/ +#if !defined(REG_WRITE32) + #define REG_WRITE32(address, value) ((*(volatile uint32_t*)(address))= (uint32_t)(value)) +#endif + +/** +* @brief 32 bits bits setting macro. +*/ +#if !defined(REG_BIT_SET32) + #define REG_BIT_SET32(address, mask) ((*(volatile uint32_t*)(address))|= (uint32_t)(mask)) +#endif + +/** +* @brief 32 bits bits clearing macro. +*/ +#if !defined(REG_BIT_CLEAR32) + #define REG_BIT_CLEAR32(address, mask) ((*(volatile uint32_t*)(address))&= ((uint32_t)~((uint32_t)(mask)))) +#endif + +/** +* @brief 32 bit clear bits and set with new value +* @note It is user's responsability to make sure that value has only "mask" bits set - (value&~mask)==0 +*/ +#if !defined(REG_RMW32) + #define REG_RMW32(address, mask, value) (REG_WRITE32((address), ((REG_READ32(address)& ((uint32_t)~((uint32_t)(mask))))| ((uint32_t)(value))))) +#endif + + +/* ---------------------------------------------------------------------------- + -- Interrupt vector numbers for S32K118 + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Interrupt_vector_numbers_S32K118 Interrupt vector numbers for S32K118 + * @{ + */ + +/** Interrupt Number Definitions */ +#define NUMBER_OF_INT_VECTORS 48u /**< Number of interrupts in the Vector table */ + +/** + * @brief Defines the Interrupt Numbers definitions + * + * This enumeration is used to configure the interrupts. + * + * Implements : IRQn_Type_Class + */ +typedef enum +{ + /* Auxiliary constants */ + NotAvail_IRQn = -128, /**< Not available device specific interrupt */ + + /* Core interrupts */ + NonMaskableInt_IRQn = -14, /**< Non Maskable Interrupt */ + HardFault_IRQn = -13, /**< Cortex-M0 SV Hard Fault Interrupt */ + SVCall_IRQn = -5, /**< Cortex-M0 SV Call Interrupt */ + PendSV_IRQn = -2, /**< Cortex-M0 Pend SV Interrupt */ + SysTick_IRQn = -1, /**< Cortex-M0 System Tick Interrupt */ + + /* Device specific interrupts */ + DMA0_IRQn = 0u, /**< DMA channel 0 transfer complete */ + DMA1_IRQn = 1u, /**< DMA channel 1 transfer complete */ + DMA2_IRQn = 2u, /**< DMA channel 2 transfer complete */ + DMA3_IRQn = 3u, /**< DMA channel 3 transfer complete */ + DMA_Error_IRQn = 4u, /**< DMA error interrupt channels 0-3 */ + ERM_fault_IRQn = 5u, /**< ERM single and double bit error correction */ + RTC_IRQn = 6u, /**< RTC alarm interrupt */ + RTC_Seconds_IRQn = 7u, /**< RTC seconds interrupt */ + LPTMR0_IRQn = 8u, /**< LPTIMER interrupt request */ + PORT_IRQn = 9u, /**< Port A, B, C, D and E pin detect interrupt */ + CAN0_ORed_Err_Wakeup_IRQn = 10u, /**< OR’ed [Bus Off OR Bus Off Done OR Transmit Warning OR Receive Warning], Interrupt indicating that errors were detected on the CAN bus, Interrupt asserted when Pretended Networking operation is enabled, and a valid message matches the selected filter criteria during Low Power mode */ + CAN0_ORed_0_31_MB_IRQn = 11u, /**< OR'ed Message buffer (0-15, 16-31) */ + FTM0_Ch0_7_IRQn = 12u, /**< FTM0 Channel 0 to 7 interrupt */ + FTM0_Fault_IRQn = 13u, /**< FTM0 Fault interrupt */ + FTM0_Ovf_Reload_IRQn = 14u, /**< FTM0 Counter overflow and Reload interrupt */ + FTM1_Ch0_7_IRQn = 15u, /**< FTM1 Channel 0 to 7 interrupt */ + FTM1_Fault_IRQn = 16u, /**< FTM1 Fault interrupt */ + FTM1_Ovf_Reload_IRQn = 17u, /**< FTM1 Counter overflow and Reload interrupt */ + FTFC_IRQn = 18u, /**< FTFC Command complete, Read collision and Double bit fault detect */ + PDB0_IRQn = 19u, /**< PDB0 interrupt */ + LPIT0_IRQn = 20u, /**< LPIT interrupt */ + SCG_CMU_LVD_LVWSCG_IRQn = 21u, /**< PMC Low voltage detect interrupt, SCG bus interrupt request and CMU loss of range interrupt */ + WDOG_IRQn = 22u, /**< WDOG interrupt request out before wdg reset out */ + RCM_IRQn = 23u, /**< RCM Asynchronous Interrupt */ + LPI2C0_Master_Slave_IRQn = 24u, /**< LPI2C0 Master Interrupt and Slave Interrupt */ + FLEXIO_IRQn = 25u, /**< FlexIO Interrupt */ + LPSPI0_IRQn = 26u, /**< LPSPI0 Interrupt */ + LPSPI1_IRQn = 27u, /**< LPSPI1 Interrupt */ + ADC0_IRQn = 28u, /**< ADC0 interrupt request. */ + CMP0_IRQn = 29u, /**< CMP0 interrupt request */ + LPUART1_RxTx_IRQn = 30u, /**< LPUART1 Transmit / Receive Interrupt */ + LPUART0_RxTx_IRQn = 31u /**< LPUART0 Transmit / Receive Interrupt */ +} IRQn_Type; + +/*! + * @} + */ /* end of group Interrupt_vector_numbers_S32K118 */ + + +/* ---------------------------------------------------------------------------- + -- Device Peripheral Access Layer for S32K118 + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Peripheral_access_layer_S32K118 Device Peripheral Access Layer for S32K118 + * @{ + */ + +/* @brief This module covers memory mapped registers available on SoC */ + +/* ---------------------------------------------------------------------------- + -- ADC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup ADC_Peripheral_Access_Layer ADC Peripheral Access Layer + * @{ + */ + + +/** ADC - Size of Registers Arrays */ +#define ADC_SC1_COUNT 16u +#define ADC_R_COUNT 16u +#define ADC_CV_COUNT 2u + +/** ADC - Register Layout Typedef */ +typedef struct { + __IO uint32_t SC1[ADC_SC1_COUNT]; /**< ADC Status and Control Register 1, array offset: 0x0, array step: 0x4 */ + __IO uint32_t CFG1; /**< ADC Configuration Register 1, offset: 0x40 */ + __IO uint32_t CFG2; /**< ADC Configuration Register 2, offset: 0x44 */ + __I uint32_t R[ADC_R_COUNT]; /**< ADC Data Result Registers, array offset: 0x48, array step: 0x4 */ + __IO uint32_t CV[ADC_CV_COUNT]; /**< Compare Value Registers, array offset: 0x88, array step: 0x4 */ + __IO uint32_t SC2; /**< Status and Control Register 2, offset: 0x90 */ + __IO uint32_t SC3; /**< Status and Control Register 3, offset: 0x94 */ + __IO uint32_t BASE_OFS; /**< BASE Offset Register, offset: 0x98 */ + __IO uint32_t OFS; /**< ADC Offset Correction Register, offset: 0x9C */ + __IO uint32_t USR_OFS; /**< USER Offset Correction Register, offset: 0xA0 */ + __IO uint32_t XOFS; /**< ADC X Offset Correction Register, offset: 0xA4 */ + __IO uint32_t YOFS; /**< ADC Y Offset Correction Register, offset: 0xA8 */ + __IO uint32_t G; /**< ADC Gain Register, offset: 0xAC */ + __IO uint32_t UG; /**< ADC User Gain Register, offset: 0xB0 */ + __IO uint32_t CLPS; /**< ADC General Calibration Value Register S, offset: 0xB4 */ + __IO uint32_t CLP3; /**< ADC Plus-Side General Calibration Value Register 3, offset: 0xB8 */ + __IO uint32_t CLP2; /**< ADC Plus-Side General Calibration Value Register 2, offset: 0xBC */ + __IO uint32_t CLP1; /**< ADC Plus-Side General Calibration Value Register 1, offset: 0xC0 */ + __IO uint32_t CLP0; /**< ADC Plus-Side General Calibration Value Register 0, offset: 0xC4 */ + __IO uint32_t CLPX; /**< ADC Plus-Side General Calibration Value Register X, offset: 0xC8 */ + __IO uint32_t CLP9; /**< ADC Plus-Side General Calibration Value Register 9, offset: 0xCC */ + __IO uint32_t CLPS_OFS; /**< ADC General Calibration Offset Value Register S, offset: 0xD0 */ + __IO uint32_t CLP3_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 3, offset: 0xD4 */ + __IO uint32_t CLP2_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 2, offset: 0xD8 */ + __IO uint32_t CLP1_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 1, offset: 0xDC */ + __IO uint32_t CLP0_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 0, offset: 0xE0 */ + __IO uint32_t CLPX_OFS; /**< ADC Plus-Side General Calibration Offset Value Register X, offset: 0xE4 */ + __IO uint32_t CLP9_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 9, offset: 0xE8 */ +} ADC_Type, *ADC_MemMapPtr; + + /** Number of instances of the ADC module. */ +#define ADC_INSTANCE_COUNT (1u) + + +/* ADC - Peripheral instance base addresses */ +/** Peripheral ADC0 base address */ +#define ADC0_BASE (0x4003B000u) +/** Peripheral ADC0 base pointer */ +#define ADC0 ((ADC_Type *)ADC0_BASE) +/** Array initializer of ADC peripheral base addresses */ +#define ADC_BASE_ADDRS { ADC0_BASE } +/** Array initializer of ADC peripheral base pointers */ +#define ADC_BASE_PTRS { ADC0 } + /** Number of interrupt vector arrays for the ADC module. */ +#define ADC_IRQS_ARR_COUNT (1u) + /** Number of interrupt channels for the ADC module. */ +#define ADC_IRQS_CH_COUNT (1u) +/** Interrupt vectors for the ADC peripheral type */ +#define ADC_IRQS { ADC0_IRQn } + +/* ---------------------------------------------------------------------------- + -- ADC Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup ADC_Register_Masks ADC Register Masks + * @{ + */ + +/* SC1 Bit Fields */ +#define ADC_SC1_ADCH_MASK 0x1Fu +#define ADC_SC1_ADCH_SHIFT 0u +#define ADC_SC1_ADCH_WIDTH 5u +#define ADC_SC1_ADCH(x) (((uint32_t)(((uint32_t)(x))<VTOR} + +/* FTM module features */ + +/* @brief Number of PWM channels */ +#define FEATURE_FTM_CHANNEL_COUNT (8U) +/* @brief Number of fault channels */ +#define FTM_FEATURE_FAULT_CHANNELS (4U) +/* @brief Width of control channel */ +#define FTM_FEATURE_COMBINE_CHAN_CTRL_WIDTH (8U) +/* @brief Output channel offset */ +#define FTM_FEATURE_OUTPUT_CHANNEL_OFFSET (16U) +/* @brief Max counter value */ +#define FTM_FEATURE_CNT_MAX_VALUE_U32 (0x0000FFFFU) +/* @brief Input capture for single shot */ +#define FTM_FEATURE_INPUT_CAPTURE_SINGLE_SHOT (2U) +/* @brief Dithering has supported on the generated PWM signals */ +#define FEATURE_FTM_HAS_SUPPORTED_DITHERING (1U) +/* @brief Number of interrupt vector for channels of the FTM module. */ +#define FEATURE_FTM_HAS_NUM_IRQS_CHANS (1U) + +/* LPIT module features */ + +/*! @brief Number of interrupt vector for channels of the LPIT module. */ +#define FEATURE_LPIT_HAS_NUM_IRQS_CHANS (1U) +/*! @brief Clock names for LPIT. */ +#define LPIT_CLOCK_NAMES {LPIT0_CLK} + +/* LPI2C module features */ + +/* @brief DMA instance used for LPI2C module */ +#define LPI2C_DMA_INSTANCE 0U + +/* @brief EDMA requests for LPI2C module. */ +#define LPI2C_EDMA_REQ {{(uint8_t)EDMA_REQ_LPI2C0_TX, (uint8_t)EDMA_REQ_LPI2C0_RX}} +/* @brief PCC clocks for LPI2C module. */ +#define LPI2C_PCC_CLOCKS {LPI2C0_CLK} + +/* @brief Disable high-speed and ultra-fast operating modes for S32K14x. */ +#define LPI2C_HAS_FAST_PLUS_MODE (0U) +#define LPI2C_HAS_HIGH_SPEED_MODE (0U) +#define LPI2C_HAS_ULTRA_FAST_MODE (0U) + +/* LPI2C module features */ + +/* @brief DMA instance used for LPI2C module */ +#define LPI2C_DMA_INSTANCE 0U + +/* @brief EDMA requests for LPI2C module. */ +#define LPI2C_EDMA_REQ {{(uint8_t)EDMA_REQ_LPI2C0_TX, (uint8_t)EDMA_REQ_LPI2C0_RX}} +/* @brief PCC clocks for LPI2C module. */ +#define LPI2C_PCC_CLOCKS {LPI2C0_CLK} + +/* @brief Disable high-speed and ultra-fast operating modes for S32K14x. */ +#define LPI2C_HAS_FAST_PLUS_MODE (0U) +#define LPI2C_HAS_HIGH_SPEED_MODE (0U) +#define LPI2C_HAS_ULTRA_FAST_MODE (0U) + +/* MSCM module features */ + +/* @brief Has interrupt router control registers (IRSPRCn). */ +#define FEATURE_MSCM_HAS_INTERRUPT_ROUTER (0) +/* @brief Has directed CPU interrupt routerregisters (IRCPxxx). */ +#define FEATURE_MSCM_HAS_CPU_INTERRUPT_ROUTER (0) + +/* CSEc module features */ + +/*! @brief CSE_PRAM offset of the page length parameter used by the following +commands: CMD_ENC_ECB, CMD_ENC_CBC, CMD_DEC_ECB, CMD_DEC_CBC, CMD_MP_COMPRESS */ +#define FEATURE_CSEC_PAGE_LENGTH_OFFSET (0xEU) +/*! @brief CSE_PRAM offset of the message length parameter used by the following +commands: CMD_GENERATE_MAC, CMD_VERIFY_MAC (both copy and pointer methods) */ +#define FEATURE_CSEC_MESSAGE_LENGTH_OFFSET (0xCU) +/*! @brief CSE_PRAM offset of the MAC length parameter used by the following +commands: CMD_VERIFY_MAC (both copy and pointer methods) */ +#define FEATURE_CSEC_MAC_LENGTH_OFFSET (0x8U) +/*! @brief CSE_PRAM offset of the boot size parameter used by the following +commands: CMD_BOOT_DEFINE */ +#define FEATURE_CSEC_BOOT_SIZE_OFFSET (0x1CU) +/*! @brief CSE_PRAM offset of the boot flavor parameter used by the following +commands: CMD_BOOT_DEFINE */ +#define FEATURE_CSEC_BOOT_FLAVOR_OFFSET (0x1BU) +/*! @brief CSE_PRAM offset of the Flash start address parameter used by the +following commands: CMD_GENERATE_MAC, CMD_VERIFY_MAC (pointer method) */ +#define FEATURE_CSEC_FLASH_START_ADDRESS_OFFSET (0x10U) +/*! @brief CSE_PRAM offset of the verification status parameter used by the +following commands: CMD_VERIFY_MAC (both copy and pointer methods) */ +#define FEATURE_CSEC_VERIFICATION_STATUS_OFFSET (0x14U) +/*! @brief CSE_PRAM offset of the error bits field contained by all commands */ +#define FEATURE_CSEC_ERROR_BITS_OFFSET (0x4U) +/*! @brief CSE_PRAM offset of the SREG parameter used by the following commands: +CMD_GET_ID */ +#define FEATURE_CSEC_SREG_OFFSET (0x2FU) + +/*! @brief CSE_PRAM offset of page 0 */ +#define FEATURE_CSEC_PAGE_0_OFFSET (0x0U) +/*! @brief CSE_PRAM offset of page 1 */ +#define FEATURE_CSEC_PAGE_1_OFFSET (0x10U) +/*! @brief CSE_PRAM offset of page 2 */ +#define FEATURE_CSEC_PAGE_2_OFFSET (0x20U) +/*! @brief CSE_PRAM offset of page 3 */ +#define FEATURE_CSEC_PAGE_3_OFFSET (0x30U) +/*! @brief CSE_PRAM offset of page 4 */ +#define FEATURE_CSEC_PAGE_4_OFFSET (0x40U) +/*! @brief CSE_PRAM offset of page 5 */ +#define FEATURE_CSEC_PAGE_5_OFFSET (0x50U) +/*! @brief CSE_PRAM offset of page 6 */ +#define FEATURE_CSEC_PAGE_6_OFFSET (0x60U) +/*! @brief CSE_PRAM offset of page 7 */ +#define FEATURE_CSEC_PAGE_7_OFFSET (0x70U) + +/* CRC module features */ + +/* @brief CRC module use for S32K. */ +#define FEATURE_CRC_DRIVER_SOFT_POLYNOMIAL +/* @brief Default CRC bit width */ +#define FEATURE_CRC_DEFAULT_WIDTH CRC_BITS_16 +/* @brief Default CRC read transpose */ +#define FEATURE_CRC_DEFAULT_READ_TRANSPOSE CRC_TRANSPOSE_NONE +/* @brief Default CRC write transpose */ +#define FEATURE_CRC_DEFAULT_WRITE_TRANSPOSE CRC_TRANSPOSE_NONE +/* @brief Default polynomial 0x1021U */ +#define FEATURE_CRC_DEFAULT_POLYNOMIAL (0x1021U) +/* @brief Default seed value is 0xFFFFU */ +#define FEATURE_CRC_DEFAULT_SEED (0xFFFFU) + +/* PORT module features */ +/*! @brief PORT Used for setting Pins */ +#define FEATURE_PINS_DRIVER_USING_PORT (1) +/* @brief Has control lock (register bit PCR[LK]). */ +#define FEATURE_PORT_HAS_PIN_CONTROL_LOCK (1) +/* @brief Has open drain control (register bit PCR[ODE]). */ +#define FEATURE_PINS_HAS_OPEN_DRAIN (0) +/* @brief Has digital filter (registers DFER, DFCR and DFWR). */ +#define FEATURE_PORT_HAS_DIGITAL_FILTER (1) +/* @brief Has trigger output to trigger other peripherals (register bit field PCR[IRQC] values). */ +#define FEATURE_PORT_HAS_TRIGGER_OUT (0) +/* @brief Has setting flag only (register bit field PCR[IRQC] values). */ +#define FEATURE_PORT_HAS_FLAG_SET_ONLY (0) +/* @brief Has over-current feature (register bit field PCR[OCIE] values). */ +#define FEATURE_PINS_HAS_OVER_CURRENT (0) +/* @brief Has pull resistor selection available. */ +#define FEATURE_PINS_HAS_PULL_SELECTION (1) +/* @brief Has slew rate control (register bit PCR[SRE]). */ +#define FEATURE_PINS_HAS_SLEW_RATE (0) +/* @brief Has passive filter (register bit field PCR[PFE]). */ +#define FEATURE_PORT_HAS_PASSIVE_FILTER (1) +/* @brief Has drive strength (register bit PCR[DSE]). */ +#define FEATURE_PINS_HAS_DRIVE_STRENGTH (1) +/* @brief Has drive strength control bits*/ +#define FEATURE_PINS_HAS_DRIVE_STRENGTH_CONTROL (0) +/* @brief Has port input disable control bits*/ +#define FEATURE_PORT_HAS_INPUT_DISABLE (0) +/* @brief SIM_CHIPCTL_ADC_INTERLEAVE_EN bit is not available */ +#define FEATURE_PINS_HAS_ADC_INTERLEAVE_EN (0) + +/* MPU module features */ + +/* @brief Specifies hardware revision level. */ +#define FEATURE_MPU_HARDWARE_REVISION_LEVEL (1U) +/* @brief Has process identifier support. */ +#define FEATURE_MPU_HAS_PROCESS_IDENTIFIER (1U) +/* @brief Specifies total number of bus masters. */ +#define FEATURE_MPU_MASTER_COUNT (3U) +/* @brief Specifies maximum number of masters which have separated +privilege rights for user and supervisor mode accesses (e.g. master0~3 in S32K1xx). +*/ +#define FEATURE_MPU_MAX_LOW_MASTER_NUMBER (3U) +/* @brief Specifies maximum number of masters which have only +read and write permissions (e.g. master4~7 in S32K1xx). +*/ +#define FEATURE_MPU_MAX_HIGH_MASTER_NUMBER (7U) + +/* @brief Specifies number of set access control right bits for + masters which have separated privilege rights for user and + supervisor mode accesses (e.g. master0~3 in S32K1xx). +*/ +#define FEATURE_MPU_LOW_MASTER_CONTROL_WIDTH (6U) +/* @brief Specifies number of set access control right bits for + masters which have only read and write permissions(e.g. master4~7 in S32K1xx). +*/ +#define FEATURE_MPU_HIGH_MASTER_CONTROL_WIDTH (2U) + +/* @brief The MPU Logical Bus Master Number for core bus master. */ +#define FEATURE_MPU_MASTER_CORE (0U) +/* @brief The MPU Logical Bus Master Number for Debugger master. */ +#define FEATURE_MPU_MASTER_DEBUGGER (1U) +/* @brief The MPU Logical Bus Master Number for DMA master. */ +#define FEATURE_MPU_MASTER_DMA (2U) +/* @brief Specifies master number. */ +#define FEATURE_MPU_MASTER \ +{ \ + FEATURE_MPU_MASTER_CORE, /*!< CORE */ \ + FEATURE_MPU_MASTER_DEBUGGER, /*!< DEBUGGER */ \ + FEATURE_MPU_MASTER_DMA, /*!< DMA */ \ +} + +/* @brief Specifies total number of slave ports. */ +#define FEATURE_MPU_SLAVE_COUNT (2U) +/* @brief The MPU Slave Port Assignment for Flash Controller and boot ROM. */ +#define FEATURE_MPU_SLAVE_FLASH_BOOTROM (0U) +/* @brief The MPU Slave Port Assignment for SRAM, MTB, DWT and MCM. */ +#define FEATURE_MPU_SLAVE_SRAM_MTB_DWT_MCM (1U) +/* @brief The MPU Slave Port mask. */ +#define FEATURE_MPU_SLAVE_MASK (0xC0000000U) +#define FEATURE_MPU_SLAVE_SHIFT (30u) +#define FEATURE_MPU_SLAVE_WIDTH (2u) +#define FEATURE_MPU_SLAVE(x) (((uint32_t)(((uint32_t)(x))<> (uint32_t)FEATURE_DMA_CH_WIDTH) +/* @brief DMA virtual channel to channel */ +#define FEATURE_DMA_VCH_TO_CH(x) ((x) & ((uint32_t)FEATURE_DMA_CHANNELS - 1U)) +/* @brief DMA supports the following particular channel priorities: */ +#define FEATURE_DMA_4_CH_PRIORITIES +/* @brief DMA supports bus bandwidth control. */ +#define FEATURE_DMA_ENGINE_STALL + +/* DMAMUX module features */ + +/* @brief DMAMUX peripheral is available in silicon. */ +#define FEATURE_DMAMUX_AVAILABLE +/* @brief Number of DMA channels. */ +#define FEATURE_DMAMUX_CHANNELS (4U) +/* @brief Has the periodic trigger capability */ +#define FEATURE_DMAMUX_HAS_TRIG (1) +/* @brief Conversion from request source to the actual DMAMUX channel */ +#define FEATURE_DMAMUX_REQ_SRC_TO_CH(x) (x) +/* @brief Mapping between request source and DMAMUX instance */ +#define FEATURE_DMAMUX_REQ_SRC_TO_INSTANCE(x) (0U) +/* @brief Conversion from eDMA channel index to DMAMUX channel. */ +#define FEATURE_DMAMUX_DMA_CH_TO_CH(x) (x) +/* @brief Conversion from DMAMUX channel DMAMUX register index. */ +#define FEATURE_DMAMUX_CHN_REG_INDEX(x) (x) +/* @brief Clock names for DMAMUX. */ +#define FEATURE_DMAMUX_CLOCK_NAMES {DMAMUX0_CLK} + +/*! + * @brief Structure for the DMA hardware request + * + * Defines the structure for the DMA hardware request collections. The user can configure the + * hardware request into DMAMUX to trigger the DMA transfer accordingly. The index + * of the hardware request varies according to the to SoC. + */ +typedef enum { + EDMA_REQ_DISABLED = 0U, + EDMA_REQ_LPUART0_RX = 2U, + EDMA_REQ_LPUART0_TX = 3U, + EDMA_REQ_LPUART1_RX = 4U, + EDMA_REQ_LPUART1_TX = 5U, + EDMA_REQ_FLEXIO_SHIFTER0 = 10U, + EDMA_REQ_FLEXIO_SHIFTER1 = 11U, + EDMA_REQ_FLEXIO_SHIFTER2 = 12U, + EDMA_REQ_FLEXIO_SHIFTER3 = 13U, + EDMA_REQ_LPSPI0_RX = 14U, + EDMA_REQ_LPSPI0_TX = 15U, + EDMA_REQ_LPSPI1_RX = 16U, + EDMA_REQ_LPSPI1_TX = 17U, + EDMA_REQ_FTM1_CHANNEL_0 = 20U, + EDMA_REQ_FTM1_CHANNEL_1 = 21U, + EDMA_REQ_FTM1_CHANNEL_2 = 22U, + EDMA_REQ_FTM1_CHANNEL_3 = 23U, + EDMA_REQ_FTM1_CHANNEL_4 = 24U, + EDMA_REQ_FTM1_CHANNEL_5 = 25U, + EDMA_REQ_FTM1_CHANNEL_6 = 26U, + EDMA_REQ_FTM1_CHANNEL_7 = 27U, + EDMA_REQ_FTM0_OR_CH0_CH7 = 36U, + EDMA_REQ_ADC0 = 42U, + EDMA_REQ_LPI2C0_RX = 44U, + EDMA_REQ_LPI2C0_TX = 45U, + EDMA_REQ_PDB0 = 46U, + EDMA_REQ_CMP0 = 48U, + EDMA_REQ_PORTA = 49U, + EDMA_REQ_PORTB = 50U, + EDMA_REQ_PORTC = 51U, + EDMA_REQ_PORTD = 52U, + EDMA_REQ_PORTE = 53U, + EDMA_REQ_FLEXCAN0 = 54U, + EDMA_REQ_LPTMR0 = 59U, + EDMA_REQ_DMAMUX_ALWAYS_ENABLED0 = 62U, + EDMA_REQ_DMAMUX_ALWAYS_ENABLED1 = 63U +} dma_request_source_t; + + +/* TRGMUX module features */ +/*! + * @brief Enumeration for trigger source module of TRGMUX + * + * Describes all possible inputs (trigger sources) of the TRGMUX IP + * This enumeration depends on the supported instances in device + */ +enum trgmux_trigger_source_e +{ + TRGMUX_TRIG_SOURCE_DISABLED = 0U, + TRGMUX_TRIG_SOURCE_VDD = 1U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN0 = 2U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN1 = 3U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN2 = 4U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN3 = 5U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN4 = 6U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN5 = 7U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN6 = 8U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN7 = 9U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN8 = 10U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN9 = 11U, + TRGMUX_TRIG_SOURCE_CMP0_OUT = 14U, + TRGMUX_TRIG_SOURCE_LPIT_CH0 = 17U, + TRGMUX_TRIG_SOURCE_LPIT_CH1 = 18U, + TRGMUX_TRIG_SOURCE_LPIT_CH2 = 19U, + TRGMUX_TRIG_SOURCE_LPIT_CH3 = 20U, + TRGMUX_TRIG_SOURCE_LPTMR0 = 21U, + TRGMUX_TRIG_SOURCE_FTM0_INIT_TRIG = 22U, + TRGMUX_TRIG_SOURCE_FTM0_EXT_TRIG = 23U, + TRGMUX_TRIG_SOURCE_FTM1_INIT_TRIG = 24U, + TRGMUX_TRIG_SOURCE_FTM1_EXT_TRIG = 25U, + TRGMUX_TRIG_SOURCE_ADC0_SC1A_COCO = 30U, + TRGMUX_TRIG_SOURCE_ADC0_SC1B_COCO = 31U, + TRGMUX_TRIG_SOURCE_PDB0_CH0_TRIG = 34U, + TRGMUX_TRIG_SOURCE_PDB0_PULSE_OUT = 36U, + TRGMUX_TRIG_SOURCE_RTC_ALARM = 43U, + TRGMUX_TRIG_SOURCE_RTC_SECOND = 44U, + TRGMUX_TRIG_SOURCE_FLEXIO_TRIG0 = 45U, + TRGMUX_TRIG_SOURCE_FLEXIO_TRIG1 = 46U, + TRGMUX_TRIG_SOURCE_FLEXIO_TRIG2 = 47U, + TRGMUX_TRIG_SOURCE_FLEXIO_TRIG3 = 48U, + TRGMUX_TRIG_SOURCE_LPUART0_RX_DATA = 49U, + TRGMUX_TRIG_SOURCE_LPUART0_TX_DATA = 50U, + TRGMUX_TRIG_SOURCE_LPUART0_RX_IDLE = 51U, + TRGMUX_TRIG_SOURCE_LPUART1_RX_DATA = 52U, + TRGMUX_TRIG_SOURCE_LPUART1_TX_DATA = 53U, + TRGMUX_TRIG_SOURCE_LPUART1_RX_IDLE = 54U, + TRGMUX_TRIG_SOURCE_LPI2C0_MASTER_TRIG = 55U, + TRGMUX_TRIG_SOURCE_LPI2C0_SLAVE_TRIG = 56U, + TRGMUX_TRIG_SOURCE_LPSPI0_FRAME = 59U, + TRGMUX_TRIG_SOURCE_LPSPI0_RX_DATA = 60U, + TRGMUX_TRIG_SOURCE_LPSPI1_FRAME = 61U, + TRGMUX_TRIG_SOURCE_LPSPI1_RX_DATA = 62U, + TRGMUX_TRIG_SOURCE_SIM_SW_TRIG = 63U, +}; + +/*! + * @brief Enumeration for target module of TRGMUX + * + * Describes all possible outputs (target modules) of the TRGMUX IP + * This enumeration depends on the supported instances in device + */ +enum trgmux_target_module_e +{ + TRGMUX_TARGET_MODULE_DMA_CH0 = 0U, + TRGMUX_TARGET_MODULE_DMA_CH1 = 1U, + TRGMUX_TARGET_MODULE_DMA_CH2 = 2U, + TRGMUX_TARGET_MODULE_DMA_CH3 = 3U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT0 = 4U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT1 = 5U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT2 = 6U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT3 = 7U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT4 = 8U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT5 = 9U, + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA0 = 12U, + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA1 = 13U, + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA2 = 14U, + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA3 = 15U, + TRGMUX_TARGET_MODULE_CMP0_SAMPLE = 28U, + TRGMUX_TARGET_MODULE_FTM0_HWTRIG0 = 40U, + TRGMUX_TARGET_MODULE_FTM0_FAULT0 = 41U, + TRGMUX_TARGET_MODULE_FTM0_FAULT1 = 42U, + TRGMUX_TARGET_MODULE_FTM0_FAULT2 = 43U, + TRGMUX_TARGET_MODULE_FTM1_HWTRIG0 = 44U, + TRGMUX_TARGET_MODULE_FTM1_FAULT0 = 45U, + TRGMUX_TARGET_MODULE_FTM1_FAULT1 = 46U, + TRGMUX_TARGET_MODULE_FTM1_FAULT2 = 47U, + TRGMUX_TARGET_MODULE_PDB0_TRG_IN = 56U, + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM0 = 68U, + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM1 = 69U, + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM2 = 70U, + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM3 = 71U, + TRGMUX_TARGET_MODULE_LPIT_TRG_CH0 = 72U, + TRGMUX_TARGET_MODULE_LPIT_TRG_CH1 = 73U, + TRGMUX_TARGET_MODULE_LPIT_TRG_CH2 = 74U, + TRGMUX_TARGET_MODULE_LPIT_TRG_CH3 = 75U, + TRGMUX_TARGET_MODULE_LPUART0_TRG = 76U, + TRGMUX_TARGET_MODULE_LPUART1_TRG = 80U, + TRGMUX_TARGET_MODULE_LPI2C0_TRG = 84U, + TRGMUX_TARGET_MODULE_LPSPI0_TRG = 92U, + TRGMUX_TARGET_MODULE_LPSPI1_TRG = 96U, + TRGMUX_TARGET_MODULE_LPTMR0_ALT0 = 100U, +}; + +/* @brief Constant array storing the value of all TRGMUX output(target module) identifiers */ +#define FEATURE_TRGMUX_TARGET_MODULE \ +{ \ + TRGMUX_TARGET_MODULE_DMA_CH0, \ + TRGMUX_TARGET_MODULE_DMA_CH1, \ + TRGMUX_TARGET_MODULE_DMA_CH2, \ + TRGMUX_TARGET_MODULE_DMA_CH3, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT0, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT1, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT2, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT3, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT4, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT5, \ + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA0, \ + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA1, \ + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA2, \ + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA3, \ + TRGMUX_TARGET_MODULE_CMP0_SAMPLE, \ + TRGMUX_TARGET_MODULE_FTM0_HWTRIG0, \ + TRGMUX_TARGET_MODULE_FTM0_FAULT0, \ + TRGMUX_TARGET_MODULE_FTM0_FAULT1, \ + TRGMUX_TARGET_MODULE_FTM0_FAULT2, \ + TRGMUX_TARGET_MODULE_FTM1_HWTRIG0, \ + TRGMUX_TARGET_MODULE_FTM1_FAULT0, \ + TRGMUX_TARGET_MODULE_FTM1_FAULT1, \ + TRGMUX_TARGET_MODULE_FTM1_FAULT2, \ + TRGMUX_TARGET_MODULE_PDB0_TRG_IN, \ + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM0, \ + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM1, \ + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM2, \ + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM3, \ + TRGMUX_TARGET_MODULE_LPIT_TRG_CH0, \ + TRGMUX_TARGET_MODULE_LPIT_TRG_CH1, \ + TRGMUX_TARGET_MODULE_LPIT_TRG_CH2, \ + TRGMUX_TARGET_MODULE_LPIT_TRG_CH3, \ + TRGMUX_TARGET_MODULE_LPUART0_TRG, \ + TRGMUX_TARGET_MODULE_LPUART1_TRG, \ + TRGMUX_TARGET_MODULE_LPI2C0_TRG, \ + TRGMUX_TARGET_MODULE_LPSPI0_TRG, \ + TRGMUX_TARGET_MODULE_LPSPI1_TRG, \ + TRGMUX_TARGET_MODULE_LPTMR0_ALT0 \ +} + + +/* LPSPI module features */ +/* @brief Initial value for state structure */ +#define FEATURE_LPSPI_STATE_STRUCTURES_NULL {NULL, NULL} +/* @brief Clock indexes for LPSPI clock */ +#define FEATURE_LPSPI_CLOCKS_NAMES {LPSPI0_CLK, LPSPI1_CLK}; + +/* FlexIO module features */ + +/* @brief Define the maximum number of shifters for any FlexIO instance. */ +#define FEATURE_FLEXIO_MAX_SHIFTER_COUNT (4U) +/* @brief Define DMA request names for Flexio. */ +#define FEATURE_FLEXIO_DMA_REQ_0 EDMA_REQ_FLEXIO_SHIFTER0 +#define FEATURE_FLEXIO_DMA_REQ_1 EDMA_REQ_FLEXIO_SHIFTER1 +#define FEATURE_FLEXIO_DMA_REQ_2 EDMA_REQ_FLEXIO_SHIFTER2 +#define FEATURE_FLEXIO_DMA_REQ_3 EDMA_REQ_FLEXIO_SHIFTER3 + +/* LPUART module features */ + +/* @brief Has extended data register ED. */ +#define FEATURE_LPUART_HAS_EXTENDED_DATA_REGISTER_FLAGS (1) +/* @brief Hardware flow control (RTS, CTS) is supported. */ +#define FEATURE_LPUART_HAS_MODEM_SUPPORT (1) +/* @brief Baud rate oversampling is available. */ +#define FEATURE_LPUART_HAS_BAUD_RATE_OVER_SAMPLING_SUPPORT (1) +/* @brief Baud rate oversampling is available. */ +#define FEATURE_LPUART_HAS_BOTH_EDGE_SAMPLING_SUPPORT (1) +/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ +#define FEATURE_LPUART_FIFO_SIZE (4U) +/* @brief Supports two match addresses to filter incoming frames. */ +#define FEATURE_LPUART_HAS_ADDRESS_MATCHING (1) +/* @brief Has transmitter/receiver DMA enable bits. */ +#define FEATURE_LPUART_HAS_DMA_ENABLE (1) +/* @brief Flag clearance mask for STAT register. */ +#define FEATURE_LPUART_STAT_REG_FLAGS_MASK (0xC01FC000U) +/* @brief Flag clearance mask for FIFO register. */ +#define FEATURE_LPUART_FIFO_REG_FLAGS_MASK (0x00030000U) +/* @brief Reset mask for FIFO register. */ +#define FEATURE_LPUART_FIFO_RESET_MASK (0x0003C000U) +/* @brief Default oversampling ratio. */ +#define FEATURE_LPUART_DEFAULT_OSR (0x0FUL) +/* @brief Default baud rate modulo divisor. */ +#define FEATURE_LPUART_DEFAULT_SBR (0x04UL) +/* @brief Clock names for LPUART. */ +#define LPUART_CLOCK_NAMES {LPUART0_CLK, LPUART1_CLK} + +/* ADC module features */ + +/*! @brief ADC feature flag for extended number of SC1 and R registers, + * generically named 'alias registers' */ +#define FEATURE_ADC_HAS_EXTRA_NUM_REGS (0) + +#define NUMBER_OF_ALT_CLOCKS ADC_CLK_ALT_1 +/*! @brief ADC feature flag for defining number of external ADC channels. + * If each ADC instance has different number of external channels, then + * this define is set with the maximum value. */ +#define FEATURE_ADC_MAX_NUM_EXT_CHANS (16) +#define FEATURE_ADC_HAS_CHANNEL_2 (1) +#define FEATURE_ADC_HAS_CHANNEL_8 (1) +#define ADC_CLOCKS {ADC0_CLK} +/*! @brief ADC number of control channels */ +#if FEATURE_ADC_HAS_EXTRA_NUM_REGS +#define ADC_CTRL_CHANS_COUNT ADC_aSC1_COUNT +#else +#define ADC_CTRL_CHANS_COUNT ADC_SC1_COUNT +#endif /* FEATURE_ADC_HAS_EXTRA_NUM_REGS */ + +/*! @brief ADC default Sample Time from RM */ +#define ADC_DEFAULT_SAMPLE_TIME (0x0CU) +/*! @brief ADC default User Gain from RM */ +#define ADC_DEFAULT_USER_GAIN (0x04U) +/* @brief Max of adc clock frequency */ +#define ADC_CLOCK_FREQ_MAX_RUNTIME (50000000u) +/* @brief Min of adc clock frequency */ +#define ADC_CLOCK_FREQ_MIN_RUNTIME (2000000u) + +/* CAN module features */ + +/* @brief Frames available in Rx FIFO flag shift */ +#define FEATURE_CAN_RXFIFO_FRAME_AVAILABLE (5U) +/* @brief Rx FIFO warning flag shift */ +#define FEATURE_CAN_RXFIFO_WARNING (6U) +/* @brief Rx FIFO overflow flag shift */ +#define FEATURE_CAN_RXFIFO_OVERFLOW (7U) +/* @brief Has Flexible Data Rate for CAN0 */ +#define FEATURE_CAN0_HAS_FD (1) +/* @brief Maximum number of Message Buffers supported for payload size 8 for CAN0 */ +#define FEATURE_CAN0_MAX_MB_NUM (32U) +/* @brief Has PE clock source select (bit field CAN_CTRL1[CLKSRC]). */ +#define FEATURE_CAN_HAS_PE_CLKSRC_SELECT (1) +/* @brief Has DMA enable (bit field MCR[DMA]). */ +#define FEATURE_CAN_HAS_DMA_ENABLE (1) +/* @brief Maximum number of Message Buffers supported for payload size 8 for any of the CAN instances */ +#define FEATURE_CAN_MAX_MB_NUM (32U) +/* @brief Maximum number of Message Buffers supported for payload size 8 for any of the CAN instances */ +#define FEATURE_CAN_MAX_MB_NUM_ARRAY { FEATURE_CAN0_MAX_MB_NUM } +/* @brief Has Pretending Networking mode */ +#define FEATURE_CAN_HAS_PRETENDED_NETWORKING (1) +/* @brief Has Stuff Bit Count Enable Bit */ +#define FEATURE_CAN_HAS_STFCNTEN_ENABLE (0) +/* @brief Has ISO CAN FD Enable Bit */ +#define FEATURE_CAN_HAS_ISOCANFDEN_ENABLE (1) +/* @brief Has Message Buffer Data Size Region 1 */ +#define FEATURE_CAN_HAS_MBDSR1 (0) +/* @brief Has Message Buffer Data Size Region 2 */ +#define FEATURE_CAN_HAS_MBDSR2 (0) +/* @brief DMA hardware requests for all FlexCAN instances */ +#define FEATURE_CAN_EDMA_REQUESTS { EDMA_REQ_FLEXCAN0 } + +/* @brief Maximum number of Message Buffers IRQs */ +#define FEATURE_CAN_MB_IRQS_MAX_COUNT (2U) +/* @brief Message Buffers IRQs */ +#define FEATURE_CAN_MB_IRQS { CAN_ORed_0_15_MB_IRQS, \ + CAN_ORed_16_31_MB_IRQS } +/* @brief Has Wake Up Irq channels (CAN_Wake_Up_IRQS_CH_COUNT > 0u) */ +#define FEATURE_CAN_HAS_WAKE_UP_IRQ (1) +/* @brief Has Self Wake Up mode */ +#define FEATURE_CAN_HAS_SELF_WAKE_UP (0) +/* @brief Has Flexible Data Rate */ +#define FEATURE_CAN_HAS_FD (1) +/* @brief Clock name for the PE oscillator clock source */ +#define FEATURE_CAN_PE_OSC_CLK_NAME SOSC_CLK +/* @bried FlexCAN has Detection And Correction of Memory Errors */ +#define FEATURE_CAN_HAS_MEM_ERR_DET (0) + +/* LPTMR module features */ + +/* @brief LPTMR pulse counter input options */ +#define FEATURE_LPTMR_HAS_INPUT_ALT1_SELECTION (1U) + +/* OSIF module features */ + +#define FEATURE_OSIF_USE_SYSTICK (1) +#define FEATURE_OSIF_USE_PIT (0) +#define FEATURE_OSIF_FREERTOS_ISR_CONTEXT_METHOD (1) /* Cortex M device */ + +/* PDB module features */ + +/* @brief PDB has back-to-back at instance level */ +#define FEATURE_PDB_HAS_INSTANCE_BACKTOBACK (0) + +#endif /* S32K118_FEATURES_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/devassert.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/devassert.h new file mode 100644 index 00000000..243c8d45 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/devassert.h @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2017 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DEVASSERT_H +#define DEVASSERT_H + +#include + +/** + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 2.5, global macro not referenced. + * The macro is defined to be used by drivers to validate input parameters and can be disabled. + * + * @section [global] + * Violates MISRA 2012 Advisory Directive 4.9, Function-like macro defined. + * The macros are used to validate input parameters to driver functions. + * + */ + +/** +\page Error_detection_and_reporting Error detection and reporting + +S32 SDK drivers can use a mechanism to validate data coming from upper software layers (application code) by performing +a number of checks on input parameters' range or other invariants that can be statically checked (not dependent on +runtime conditions). A failed validation is indicative of a software bug in application code, therefore it is important +to use this mechanism during development. + +The validation is performed by using DEV_ASSERT macro. +A default implementation of this macro is provided in this file. However, application developers can provide their own +implementation in a custom file. This requires defining the CUSTOM_DEVASSERT symbol with the specific file name in the +project configuration (for example: -DCUSTOM_DEVASSERT="custom_devassert.h") + +The default implementation accommodates two behaviors, based on DEV_ERROR_DETECT symbol: + - When DEV_ERROR_DETECT symbol is defined in the project configuration (for example: -DDEV_ERROR_DETECT), the validation + performed by the DEV_ASSERT macro is enabled, and a failed validation triggers a software breakpoint and further execution is + prevented (application spins in an infinite loop) + This configuration is recommended for development environments, as it prevents further execution and allows investigating + potential problems from the point of error detection. + - When DEV_ERROR_DETECT symbol is not defined, the DEV_ASSERT macro is implemented as no-op, therefore disabling all validations. + This configuration can be used to eliminate the overhead of development-time checks. + +It is the application developer's responsibility to decide the error detection strategy for production code: one can opt to +disable development-time checking altogether (by not defining DEV_ERROR_DETECT symbol), or one can opt to keep the checks +in place and implement a recovery mechanism in case of a failed validation, by defining CUSTOM_DEVASSERT to point +to the file containing the custom implementation. +*/ + +#if defined (CUSTOM_DEVASSERT) + /* If the CUSTOM_DEVASSERT symbol is defined, then add the custom implementation */ + #include CUSTOM_DEVASSERT +#elif defined (DEV_ERROR_DETECT) + /* Implement default assert macro */ +static inline void DevAssert(volatile bool x) +{ + if(x) { } else { BKPT_ASM; for(;;) {} } +} + #define DEV_ASSERT(x) DevAssert(x) +#else + /* Assert macro does nothing */ + #define DEV_ASSERT(x) ((void)0) +#endif + +#endif /* DEVASSERT_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/device_registers.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/device_registers.h new file mode 100644 index 00000000..583a35d5 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/device_registers.h @@ -0,0 +1,67 @@ +/* +** ################################################################### +** Abstract: +** Common include file for CMSIS register access layer headers. +** +** Copyright (c) 2015 Freescale Semiconductor, Inc. +** Copyright 2016-2017 NXP +** All rights reserved. +** +** THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +** INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +** STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +** IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +** +** http: www.nxp.com +** mail: support@nxp.com +** ################################################################### +*/ + +#ifndef DEVICE_REGISTERS_H +#define DEVICE_REGISTERS_H + +/** +* @page misra_violations MISRA-C:2012 violations +* +* @section [global] +* Violates MISRA 2012 Advisory Rule 2.5, global macro not referenced. +* The macro defines the device currently in use and may be used by components for specific checks. +* +*/ + + +/* + * Include the cpu specific register header files. + * + * The CPU macro should be declared in the project or makefile. + */ + +#if defined(CPU_S32K118) + + #define S32K11x_SERIES + + /* Specific core definitions */ + #include "s32_core_cm0.h" + /* Register definitions */ + #include "S32K118.h" + /* CPU specific feature definitions */ + #include "S32K118_features.h" + +#else + #error "No valid CPU defined!" +#endif + +#include "devassert.h" + +#endif /* DEVICE_REGISTERS_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/s32_core_cm0.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/s32_core_cm0.h new file mode 100644 index 00000000..2dcd6e17 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/s32_core_cm0.h @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2015-2016 Freescale Semiconductor, Inc. + * Copyright 2016-2017 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + */ +/*! + * @file s32_core_cm0.h + * + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Directive 4.9, Function-like macro + * Function-like macros are used instead of inline functions in order to ensure + * that the performance will not be decreased if the functions will not be + * inlined by the compiler. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 2.5, Global macro not referenced. + * The macros defined are used only on some of the drivers, so this might be reported + * when the analysis is made only on one driver. + */ + +/* + * Tool Chains: + * GNUC flag is defined also by ARM compiler - it shows the current major version of the compatible GCC version + * __GNUC__ : GNU Compiler Collection + * __ghs__ : Green Hills ARM Compiler + * __ICCARM__ : IAR ARM Compiler + * __DCC__ : Wind River Diab Compiler + * __ARMCC_VERSION : ARM Compiler + */ + +#if !defined (CORE_CM0_H) +#define CORE_CM0_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/** \brief BKPT_ASM + * + * Macro to be used to trigger an debug interrupt + */ +#if defined ( __DCC__ ) +#define BKPT_ASM __asm ("BKPT 0\n\t") +#else +#define BKPT_ASM __asm ("BKPT #0\n\t") +#endif + +/** \brief Enable interrupts + */ +#if defined (__GNUC__) +#define ENABLE_INTERRUPTS() __asm volatile ("cpsie i" : : : "memory"); +#elif defined ( __DCC__ ) +#define ENABLE_INTERRUPTS() __asm (".short 0xb662"); +#else +#define ENABLE_INTERRUPTS() __asm("cpsie i") +#endif + + +/** \brief Disable interrupts + */ +#if defined (__GNUC__) +#define DISABLE_INTERRUPTS() __asm volatile ("cpsid i" : : : "memory"); +#elif defined ( __DCC__ ) +#define DISABLE_INTERRUPTS() __asm (".short 0xb672"); +#else +#define DISABLE_INTERRUPTS() __asm("cpsid i") +#endif + + +/** \brief Enter low-power standby state + * WFI (Wait For Interrupt) makes the processor suspend execution (Clock is stopped) until an IRQ interrupts. + */ +#if defined (__GNUC__) +#define STANDBY() __asm volatile ("wfi") +#elif defined ( __DCC__ ) +#define STANDBY() __asm (".short 0xbf30"); +#else +#define STANDBY() __asm ("wfi") +#endif + +/** \brief No-op + */ +#define NOP() __asm volatile ("nop") + + +/** \brief Reverse byte order in a word. + * ARM Documentation Cortex-M0 Devices Generic User Guide + * Accordingly to 3.5.7. REV, REV16, and REVSH + * Restriction "This function requires low registers R0-R7 register" + */ +#if defined (__GNUC__) || defined (__ICCARM__) || defined (__ARMCC_VERSION) +#define REV_BYTES_32(a, b) __asm volatile ("rev %0, %1" : "=l" (b) : "l" (a)) +#elif defined (__ghs__) +#define REV_BYTES_32(a, b) __asm volatile ("rev %0, %1" : "=r" (b) : "r" (a)) +#else +#define REV_BYTES_32(a, b) (b = ((a & 0xFF000000U) >> 24U) | ((a & 0xFF0000U) >> 8U) \ + | ((a & 0xFF00U) << 8U) | ((a & 0xFFU) << 24U)) +#endif + +/** \brief Reverse byte order in each halfword independently. + * ARM Documentation Cortex-M0 Devices Generic User Guide + * Accordingly to 3.5.7. REV, REV16, and REVSH + * Restriction "This function requires low registers R0-R7 register" + */ +#if defined (__GNUC__) || defined (__ICCARM__) || defined (__ARMCC_VERSION) +#define REV_BYTES_16(a, b) __asm volatile ("rev16 %0, %1" : "=l" (b) : "l" (a)) +#elif defined (__ghs__) +#define REV_BYTES_16(a, b) __asm volatile ("rev16 %0, %1" : "=r" (b) : "r" (a)) +#else +#define REV_BYTES_16(a, b) (b = ((a & 0xFF000000U) >> 8U) | ((a & 0xFF0000U) << 8U) \ + | ((a & 0xFF00U) >> 8U) | ((a & 0xFFU) << 8U)) +#endif + +/** \brief Places a function in RAM. + */ +#if defined ( __GNUC__ ) || defined (__ARMCC_VERSION) + #define START_FUNCTION_DECLARATION_RAMSECTION + #define END_FUNCTION_DECLARATION_RAMSECTION __attribute__((section (".code_ram"))); +#elif defined ( __ghs__ ) + #define START_FUNCTION_DECLARATION_RAMSECTION _Pragma("ghs callmode=far") + #define END_FUNCTION_DECLARATION_RAMSECTION __attribute__((section (".code_ram")));\ + _Pragma("ghs callmode=default") +#elif defined ( __ICCARM__ ) + #define START_FUNCTION_DECLARATION_RAMSECTION __ramfunc + #define END_FUNCTION_DECLARATION_RAMSECTION ; +#elif defined ( __DCC__ ) + #define START_FUNCTION_DECLARATION_RAMSECTION _Pragma("section CODE \".code_ram\" \"\" far-absolute") \ + _Pragma("use_section CODE") + #define END_FUNCTION_DECLARATION_RAMSECTION ; \ + _Pragma("section CODE \".text\"") +#else + /* Keep compatibility with software analysis tools */ + #define START_FUNCTION_DECLARATION_RAMSECTION + #define END_FUNCTION_DECLARATION_RAMSECTION ; +#endif + + /* For GCC, IAR, GHS, Diab and ARMC there is no need to specify the section when + defining a function, it is enough to specify it at the declaration. This + also enables compatibility with software analysis tools. */ + #define START_FUNCTION_DEFINITION_RAMSECTION + #define END_FUNCTION_DEFINITION_RAMSECTION + +#if defined (__ICCARM__) + #define DISABLE_CHECK_RAMSECTION_FUNCTION_CALL _Pragma("diag_suppress=Ta022") + #define ENABLE_CHECK_RAMSECTION_FUNCTION_CALL _Pragma("diag_default=Ta022") +#else + #define DISABLE_CHECK_RAMSECTION_FUNCTION_CALL + #define ENABLE_CHECK_RAMSECTION_FUNCTION_CALL +#endif + +/** \brief Get Core ID + * + * GET_CORE_ID returns the processor identification number for cm0 + */ +#define GET_CORE_ID() 0U + +/** \brief Data alignment. + */ +#if defined ( __GNUC__ ) || defined ( __ghs__ ) || defined ( __DCC__ ) || defined (__ARMCC_VERSION) + #define ALIGNED(x) __attribute__((aligned(x))) +#elif defined ( __ICCARM__ ) + #define stringify(s) tostring(s) + #define tostring(s) #s + #define ALIGNED(x) _Pragma(stringify(data_alignment=x)) +#else + /* Keep compatibility with software analysis tools */ + #define ALIGNED(x) +#endif + +/** \brief Endianness. + */ +#define CORE_LITTLE_ENDIAN + +#ifdef __cplusplus +} +#endif + +#endif /* CORE_CM0_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/system_S32K118.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/system_S32K118.c new file mode 100644 index 00000000..868b365b --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/system_S32K118.c @@ -0,0 +1,176 @@ +/* + * Copyright 2017-2018 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.9, An object should be defined at block + * scope if its identifier only appears in a single function. + * An object with static storage duration declared at block scope cannot be + * accessed directly from outside the block. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 11.4, A conversion should not be performed + * between a pointer to object and an integer type. + * The cast is required to initialize a pointer with an unsigned int define, + * representing an address. + * + * @section [global] + * Violates MISRA 2012 Required Rule 11.6, A cast shall not be performed + * between pointer to void and an arithmetic type. + * The cast is required to initialize a pointer with an unsigned int define, + * representing an address. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.7, External could be made static. + * Function is defined for usage by application code. + * + */ + +#include "device_registers.h" +#include "system_S32K118.h" +#include "stdbool.h" + +/* ---------------------------------------------------------------------------- + -- Core clock + ---------------------------------------------------------------------------- */ + +uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK; + +/*FUNCTION********************************************************************** + * + * Function Name : SystemInit + * Description : This function disables the watchdog, enables FPU + * and the power mode protection if the corresponding feature macro + * is enabled. SystemInit is called from startup_device file. + * + * Implements : SystemInit_Activity + *END**************************************************************************/ +void SystemInit(void) +{ +/**************************************************************************/ +/* WDOG DISABLE*/ +/**************************************************************************/ + +#if (DISABLE_WDOG) + /* Write of the WDOG unlock key to CNT register, must be done in order to allow any modifications*/ + WDOG->CNT = (uint32_t ) FEATURE_WDOG_UNLOCK_VALUE; + /* The dummy read is used in order to make sure that the WDOG registers will be configured only + * after the write of the unlock value was completed. */ + (void)WDOG->CNT; + + /* Initial write of WDOG configuration register: + * enables support for 32-bit refresh/unlock command write words, + * clock select from LPO, update enable, watchdog disabled */ + WDOG->CS = (uint32_t ) ( (1UL << WDOG_CS_CMD32EN_SHIFT) | + (FEATURE_WDOG_CLK_FROM_LPO << WDOG_CS_CLK_SHIFT) | + (0U << WDOG_CS_EN_SHIFT) | + (1U << WDOG_CS_UPDATE_SHIFT) ); + + /* Configure timeout */ + WDOG->TOVAL = (uint32_t )0xFFFF; +#endif /* (DISABLE_WDOG) */ +} + +/*FUNCTION********************************************************************** + * + * Function Name : SystemCoreClockUpdate + * Description : This function must be called whenever the core clock is changed + * during program execution. It evaluates the clock register settings and calculates + * the current core clock. + * + * Implements : SystemCoreClockUpdate_Activity + *END**************************************************************************/ +void SystemCoreClockUpdate(void) +{ + uint32_t SCGOUTClock = 0U; /* Variable to store output clock frequency of the SCG module */ + uint32_t regValue; /* Temporary variable */ + uint32_t divider; + bool validSystemClockSource = true; + + divider = ((SCG->CSR & SCG_CSR_DIVCORE_MASK) >> SCG_CSR_DIVCORE_SHIFT) + 1U; + + switch ((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT) + { + case 0x1: + /* System OSC */ + SCGOUTClock = CPU_XTAL_CLK_HZ; + break; + case 0x2: + /* Slow IRC */ + regValue = (SCG->SIRCCFG & SCG_SIRCCFG_RANGE_MASK) >> SCG_SIRCCFG_RANGE_SHIFT; + if (regValue != 0UL) + { + SCGOUTClock = FEATURE_SCG_SIRC_HIGH_RANGE_FREQ; + } + else + { + validSystemClockSource = false; + } + break; + case 0x3: + /* Fast IRC */ + regValue = (SCG->FIRCCFG & SCG_FIRCCFG_RANGE_MASK) >> SCG_FIRCCFG_RANGE_SHIFT; + if (regValue == 0x0UL) + { + SCGOUTClock = FEATURE_SCG_FIRC_FREQ0; + } + else + { + validSystemClockSource = false; + } + break; + default: + validSystemClockSource = false; + break; + } + + if (validSystemClockSource == true) + { + SystemCoreClock = (SCGOUTClock / divider); + } +} + +/*FUNCTION********************************************************************** + * + * Function Name : SystemSoftwareReset + * Description : This function is used to initiate a system reset + * + * Implements : SystemSoftwareReset_Activity + *END**************************************************************************/ +void SystemSoftwareReset(void) +{ + uint32_t regValue; + + /* Read Application Interrupt and Reset Control Register */ + regValue = S32_SCB->AIRCR; + + /* Clear register key */ + regValue &= ~( S32_SCB_AIRCR_VECTKEY_MASK); + + /* Configure System reset request bit and Register Key */ + regValue |= S32_SCB_AIRCR_VECTKEY(FEATURE_SCB_VECTKEY); + regValue |= S32_SCB_AIRCR_SYSRESETREQ(0x1u); + + /* Write computed register value */ + S32_SCB->AIRCR = regValue; +} + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/system_S32K118.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/system_S32K118.h new file mode 100644 index 00000000..6e98f97f --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/lib/system_S32K118.h @@ -0,0 +1,105 @@ +/* + * Copyright 2017-2018 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +/*! @addtogroup soc_support_S32K118*/ +/*! @{*/ + +/*! + * @file system_S32K118.h + * @brief Device specific configuration file for S32K118 + */ + +#ifndef SYSTEM_S32K118_H_ +#define SYSTEM_S32K118_H_ /**< Symbol preventing repeated inclusion */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * CPU Settings. + *****************************************************************************/ + +/* Watchdog disable */ +#ifndef DISABLE_WDOG + #define DISABLE_WDOG 1 +#endif + +/* Value of the external crystal or oscillator clock frequency in Hz */ +#ifndef CPU_XTAL_CLK_HZ + #define CPU_XTAL_CLK_HZ 8000000u +#endif + +/* Value of the fast internal oscillator clock frequency in Hz */ +#ifndef CPU_INT_FAST_CLK_HZ + #define CPU_INT_FAST_CLK_HZ 48000000u +#endif + +/* Default System clock value */ +#ifndef DEFAULT_SYSTEM_CLOCK + #define DEFAULT_SYSTEM_CLOCK 48000000u +#endif + +/** + * @brief System clock frequency (core clock) + * + * The system clock frequency supplied to the SysTick timer and the processor + * core clock. This variable can be used by the user application to setup the + * SysTick timer or configure other parameters. It may also be used by debugger to + * query the frequency of the debug timer or configure the trace clock speed + * SystemCoreClock is initialized with a correct predefined value. + */ +extern uint32_t SystemCoreClock; + +/** + * @brief Setup the SoC. + * + * This function disables the watchdog. + * if the corresponding feature macro is enabled. + * SystemInit is called from startup_device file. + */ +void SystemInit(void); + +/** + * @brief Updates the SystemCoreClock variable. + * + * It must be called whenever the core clock is changed during program + * execution. SystemCoreClockUpdate() evaluates the clock register settings and calculates + * the current core clock. + * This function must be called when user does not want to use clock manager component. + * If clock manager is used, the CLOCK_SYS_GetFreq function must be used with CORE_CLOCK + * parameter. + * + */ +void SystemCoreClockUpdate(void); + +/** + * @brief Initiates a system reset. + * + * This function is used to initiate a system reset + */ +void SystemSoftwareReset(void); + +#ifdef __cplusplus +} +#endif + +/*! @}*/ +#endif /* #if !defined(SYSTEM_S32K118_H_) */ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/main.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/main.c new file mode 100644 index 00000000..556b5d8c --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/main.c @@ -0,0 +1,187 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/main.c +* \brief Demo program application source file. +* \ingroup Prog_ARMCM0_S32K14_S32K118EVB_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "header.h" /* generic header */ + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +static void Init(void); +static void SystemClockConfig(void); + + +/************************************************************************************//** +** \brief This is the entry point for the bootloader application and is called +** by the reset interrupt vector after the C-startup routines executed. +** \return Program return code. +** +****************************************************************************************/ +int main(void) +{ + /* Initialize the microcontroller. */ + Init(); + /* Initialize the bootloader interface */ + BootComInit(); + + /* Start the infinite program loop. */ + while (1) + { + /* Toggle LED with a fixed frequency. */ + LedToggle(); + /* Check for bootloader activation request */ + BootComCheckActivationRequest(); + } + + /* Program should never get here. */ + return 0; +} /*** end of main ***/ + + +/************************************************************************************//** +** \brief Initializes the microcontroller. +** \return none. +** +****************************************************************************************/ +static void Init(void) +{ + /* Configure the system clock. */ + SystemClockConfig(); + /* Enable the peripheral clock for the ports that are used. */ + PCC->PCCn[PCC_PORTB_INDEX] |= PCC_PCCn_CGC_MASK; + PCC->PCCn[PCC_PORTE_INDEX] |= PCC_PCCn_CGC_MASK; + +#if (BOOT_COM_RS232_ENABLE > 0) + /* UART RX GPIO pin configuration. PB0 = UART0 RX, MUX = ALT2. */ + PORTB->PCR[0] |= PORT_PCR_MUX(2); + /* UART TX GPIO pin configuration. PB1 = UART0 TX, MUX = ALT2. */ + PORTB->PCR[1] |= PORT_PCR_MUX(2); +#endif +#if (BOOT_COM_CAN_ENABLE > 0) + /* CAN RX GPIO pin configuration. PE4 = CAN0 RX, MUX = ALT5. */ + PORTE->PCR[4] |= PORT_PCR_MUX(5); + /* CAN TX GPIO pin configuration. PE5 = CAN0 TX, MUX = ALT5. */ + PORTE->PCR[5] |= PORT_PCR_MUX(5); +#endif + + /* Initialize the timer driver. */ + TimerInit(); + /* Initialize the led driver. */ + LedInit(); + /* Enable the global interrupts. */ + ENABLE_INTERRUPTS(); +} /*** end of Init ***/ + + +/************************************************************************************//** +** \brief System Clock Configuration. This code was derived from a S32 Design Studio +** example program. It enables the SOCS (40 MHz external crystal), FIRC (48 +** MHz internal) and SIRC (8 MHz internal). The FIRC is used as a source for +** the system clock and configures the normal RUN mode for the following clock +** settings: +** - CORE_CLK = 48 MHz +** - SYS_CLK = 48 MHz +** - BUS_CLK = 48 MHz +** - FLASH_CLK = 24 MHz +** - SOSCDIV1_CLK = 40 MHz +** - SOSCDIV2_CLK = 40 MHz +** - FIRCDIV1_CLK = 48 MHz +** - FIRCDIV2_CLK = 48 MHz +** - SIRCDIV1_CLK = 8 MHz +** - SIRCDIV2_CLK = 8 MHz +** \return none. +** +****************************************************************************************/ +static void SystemClockConfig(void) +{ + /* --------- SOSC Initialization (40 MHz) ------------------------------------------ */ + /* SOSCDIV1 & SOSCDIV2 =1: divide by 1. */ + SCG->SOSCDIV = SCG_SOSCDIV_SOSCDIV1(1) | SCG_SOSCDIV_SOSCDIV2(1); + /* Range=3: High freq (SOSC betw 8MHz - 40MHz). + * HGO=0: Config xtal osc for low power. + * EREFS=1: Input is external XTAL. + */ + SCG->SOSCCFG = SCG_SOSCCFG_RANGE(3) | SCG_SOSCCFG_EREFS_MASK; + /* Ensure SOSCCSR unlocked. */ + while (SCG->SOSCCSR & SCG_SOSCCSR_LK_MASK) + { + ; + } + + /* LK=0: SOSCCSR can be written. + * SOSCCMRE=0: OSC CLK monitor IRQ if enabled. + * SOSCCM=0: OSC CLK monitor disabled. + * SOSCERCLKEN=0: Sys OSC 3V ERCLK output clk disabled. + * SOSCLPEN=0: Sys OSC disabled in VLP modes. + * SOSCSTEN=0: Sys OSC disabled in Stop modes. + * SOSCEN=1: Enable oscillator. + */ + SCG->SOSCCSR = SCG_SOSCCSR_SOSCEN_MASK; + /* Wait for system OSC clock to become valid. */ + while (!(SCG->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK)) + { + ; + } + + /* --------- FIRC Initialization --------------------------------------------------- */ + /* Fast IRC is enabled and trimmed to 48 MHz in reset (default). Enable FIRCDIV2_CLK + * and FIRCDIV1_CLK, divide by 1 = 48 MHz. + */ + SCG->FIRCDIV = SCG_FIRCDIV_FIRCDIV1(1) | SCG_FIRCDIV_FIRCDIV2(1); + + /* --------- SIRC Initialization --------------------------------------------------- */ + /* Slow IRC is enabled with high range (8 MHz) in reset. Enable SIRCDIV2_CLK and + * SIRCDIV1_CLK, divide by 1 = 8MHz asynchronous clock source. + */ + SCG->SIRCDIV = SCG_SIRCDIV_SIRCDIV1(1) | SCG_SIRCDIV_SIRCDIV2(1); + + /* --------- Change to normal RUN mode with 48MHz FIRC ----------------------------- */ + /* Select FIRC as clock source. + * DIVCORE=0, div. by 1: Core clock = 48 MHz. + * DIVBUS=0, div. by 1: bus clock = 48 MHz. + * DIVSLOW=1, div. by 2: SCG slow, flash clock= 24 MHz + */ + SCG->RCCR = SCG_RCCR_SCS(3) | SCG_RCCR_DIVCORE(0) | SCG_RCCR_DIVBUS(0) | + SCG_RCCR_DIVSLOW(1); + + /* Wait until system clock source is FIRC. */ + while (((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT ) != 3U) + { + ; + } + /* Evaluate the clock register settings and calculates the current core clock. This + * function must be called when the clock manager component is not used. + */ + SystemCoreClockUpdate(); +} /*** end of SystemClockConfig ***/ + + +/*********************************** end of main.c *************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/prog.dox b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/prog.dox new file mode 100644 index 00000000..99399e11 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/prog.dox @@ -0,0 +1,13 @@ +/** +\defgroup Prog_ARMCM0_S32K14_S32K118EVB_GCC User Program +\ingroup ARMCM0_S32K14_S32K118EVB_GCC +\brief User Program. +\details The intention of the demo user program is two-fold. (1) To test the + bootloader, you need some sort of firmware to see if you can perform a + firmware update with the bootloader. This program can be used for this + purpose. (2) To make firmware programmable by the bootloader, a few + adjustments to the firmware are required. The demo user program serves as an + example for how these adjustments can be implemented. This demo user program + is a template that can be used as a starting point for creating your own + demo user program. +*/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/startup/startup.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/startup/startup.c new file mode 100644 index 00000000..2d0efc61 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/startup/startup.c @@ -0,0 +1,248 @@ +/* + * Copyright (c) 2013 - 2014, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.9, An object should be defined at block + * scope if its identifier only appears in a single function. + * All variables with this problem are defined in the linker files. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.11, When an array with external linkage + * is declared, its size should be explicitly specified. + * The size of the arrays can not be explicitly determined. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 11.4, A conversion should not be performed + * between a pointer to object and an integer type. + * The cast is required to initialize a pointer with an unsigned int define, + * representing an address. + * + * @section [global] + * Violates MISRA 2012 Required Rule 11.6, A cast shall not be performed + * between pointer to void and an arithmetic type. + * The cast is required to initialize a pointer with an unsigned int define, + * representing an address. + * + * @section [global] + * Violates MISRA 2012 Required Rule 2.1, A project shall not contain unreachable + * code. + * The condition compares two address defined in linker files that can be different. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.7, External could be made static. + * Function is defined for usage by application code. + * + * @section [global] + * Violates MISRA 2012 Mandatory Rule 17.3, Symbol 'MFSPR' undeclared, assumed + * to return int. + * This is an e200 Power Architecture Assembly instruction used to retrieve + * the core number. + * + */ + +#include "startup.h" +#include + + +/******************************************************************************* + * Static Variables + ******************************************************************************/ +static volatile uint32_t * const s_vectors[NUMBER_OF_CORES] = FEATURE_INTERRUPT_INT_VECTORS; + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*FUNCTION********************************************************************** + * + * Function Name : init_data_bss + * Description : Make necessary initializations for RAM. + * - Copy the vector table from ROM to RAM. + * - Copy initialized data from ROM to RAM. + * - Copy code that should reside in RAM from ROM + * - Clear the zero-initialized data section. + * + * Tool Chains: + * __GNUC__ : GNU Compiler Collection + * __ghs__ : Green Hills ARM Compiler + * __ICCARM__ : IAR ARM Compiler + * __DCC__ : Wind River Diab Compiler + * __ARMCC_VERSION : ARMC Compiler + * + * Implements : init_data_bss_Activity + *END**************************************************************************/ +void init_data_bss(void) +{ + uint32_t n; + uint8_t coreId; +/* For ARMC we are using the library method of initializing DATA, Custom Section and + * Code RAM sections so the below variables are not needed */ +#if !defined(__ARMCC_VERSION) + /* Declare pointers for various data sections. These pointers + * are initialized using values pulled in from the linker file */ + uint8_t * data_ram; + uint8_t * code_ram; + uint8_t * bss_start; + uint8_t * custom_ram; + const uint8_t * data_rom, * data_rom_end; + const uint8_t * code_rom, * code_rom_end; + const uint8_t * bss_end; + const uint8_t * custom_rom, * custom_rom_end; +#endif + /* Addresses for VECTOR_TABLE and VECTOR_RAM come from the linker file */ + +#if defined(__ARMCC_VERSION) + extern uint32_t __RAM_VECTOR_TABLE_SIZE; + extern uint32_t __VECTOR_ROM; + extern uint32_t __VECTOR_RAM; +#else + extern uint32_t __RAM_VECTOR_TABLE_SIZE[]; + extern uint32_t __VECTOR_TABLE[]; + extern uint32_t __VECTOR_RAM[]; +#endif + /* Get section information from linker files */ +#if defined(__ICCARM__) + /* Data */ + data_ram = __section_begin(".data"); + data_rom = __section_begin(".data_init"); + data_rom_end = __section_end(".data_init"); + + /* CODE RAM */ + #pragma section = "__CODE_ROM" + #pragma section = "__CODE_RAM" + code_ram = __section_begin("__CODE_RAM"); + code_rom = __section_begin("__CODE_ROM"); + code_rom_end = __section_end("__CODE_ROM"); + + /* BSS */ + bss_start = __section_begin(".bss"); + bss_end = __section_end(".bss"); + + custom_ram = __section_begin(".customSection"); + custom_rom = __section_begin(".customSection_init"); + custom_rom_end = __section_end(".customSection_init"); + +#elif defined (__ARMCC_VERSION) + /* VECTOR TABLE*/ + uint8_t * vector_table_size = (uint8_t *)__RAM_VECTOR_TABLE_SIZE; + uint32_t * vector_rom = (uint32_t *)__VECTOR_ROM; + uint32_t * vector_ram = (uint32_t *)__VECTOR_RAM; +#else + extern uint32_t __DATA_ROM[]; + extern uint32_t __DATA_RAM[]; + extern uint32_t __DATA_END[]; + + extern uint32_t __CODE_RAM[]; + extern uint32_t __CODE_ROM[]; + extern uint32_t __CODE_END[]; + + extern uint32_t __BSS_START[]; + extern uint32_t __BSS_END[]; + + extern uint32_t __CUSTOM_ROM[]; + extern uint32_t __CUSTOM_END[]; + + /* Data */ + data_ram = (uint8_t *)__DATA_RAM; + data_rom = (uint8_t *)__DATA_ROM; + data_rom_end = (uint8_t *)__DATA_END; + /* CODE RAM */ + code_ram = (uint8_t *)__CODE_RAM; + code_rom = (uint8_t *)__CODE_ROM; + code_rom_end = (uint8_t *)__CODE_END; + /* BSS */ + bss_start = (uint8_t *)__BSS_START; + bss_end = (uint8_t *)__BSS_END; + + /* Custom section */ + custom_ram = CUSTOMSECTION_SECTION_START; + custom_rom = (uint8_t *)__CUSTOM_ROM; + custom_rom_end = (uint8_t *)__CUSTOM_END; + +#endif + +#if !defined(__ARMCC_VERSION) + /* Copy initialized data from ROM to RAM */ + while (data_rom_end != data_rom) + { + *data_ram = *data_rom; + data_ram++; + data_rom++; + } + + /* Copy functions from ROM to RAM */ + while (code_rom_end != code_rom) + { + *code_ram = *code_rom; + code_ram++; + code_rom++; + } + + /* Clear the zero-initialized data section */ + while(bss_end != bss_start) + { + *bss_start = 0; + bss_start++; + } + + /* Copy customsection rom to ram */ + while(custom_rom_end != custom_rom) + { + *custom_ram = *custom_rom; + custom_rom++; + custom_ram++; + } +#endif + coreId = (uint8_t)GET_CORE_ID(); +#if defined (__ARMCC_VERSION) + /* Copy the vector table from ROM to RAM */ + /* Workaround */ + for (n = 0; n < (((uint32_t)(vector_table_size))/sizeof(uint32_t)); n++) + { + vector_ram[n] = vector_rom[n]; + } + /* Point the VTOR to the position of vector table */ + *s_vectors[coreId] = (uint32_t) __VECTOR_RAM; +#else + /* Check if VECTOR_TABLE copy is needed */ + if (__VECTOR_RAM != __VECTOR_TABLE) + { + /* Copy the vector table from ROM to RAM */ + for (n = 0; n < (((uint32_t)__RAM_VECTOR_TABLE_SIZE)/sizeof(uint32_t)); n++) + { + __VECTOR_RAM[n] = __VECTOR_TABLE[n]; + } + /* Point the VTOR to the position of vector table */ + *s_vectors[coreId] = (uint32_t)__VECTOR_RAM; + } + else + { + /* Point the VTOR to the position of vector table */ + *s_vectors[coreId] = (uint32_t)__VECTOR_TABLE; + } +#endif + +} + +/******************************************************************************* + * EOF + ******************************************************************************/ + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/startup/startup.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/startup/startup.h new file mode 100644 index 00000000..8384b7db --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/startup/startup.h @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2013 - 2014, Freescale Semiconductor, Inc. + * Copyright 2016-2019 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef STARTUP_H +#define STARTUP_H + +#include +#include "device_registers.h" +/** + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 2.5, Local macro not referenced. + * The defined macro is used as include guard. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.9, An object should be defined at block + * scope if its identifier only appears in a single function. + * All variables with this problem are defined in the linker files. + * + */ + +/******************************************************************************* + * API + ******************************************************************************/ + +/*! + * @brief define symbols that specific start and end addres of some basic sections. + */ +#if (defined(S32K14x_SERIES) || defined(S32K11x_SERIES) || defined(S32V234_SERIES) || defined(MPC574x_SERIES) || defined(S32R_SERIES) || defined(S32MTV_SERIES) || defined(SJA1110_SERIES)) || defined (S32K144W_M4_SERIES) + #if (defined(__ICCARM__)) + #define INTERRUPTS_SECTION_START __section_begin(".intvec") + #define INTERRUPTS_SECTION_END __section_end(".intvec") + #define BSS_SECTION_START __section_begin(".bss") + #define BSS_SECTION_END __section_end(".bss") + #define DATA_SECTION_START __section_begin(".data") + #define DATA_SECTION_END __section_end(".data") + #define CUSTOMSECTION_SECTION_START __section_begin(".customSection") + #define CUSTOMSECTION_SECTION_END __section_end(".customSection") + #define CODE_RAM_SECTION_START __section_begin("__CODE_RAM") + #define CODE_RAM_SECTION_END __section_end("__CODE_RAM") + #define DATA_INIT_SECTION_START __section_begin(".data_init") + #define DATA_INIT_SECTION_END __section_end(".data_init") + #define CODE_ROM_SECTION_START __section_begin("__CODE_ROM") + #define CODE_ROM_SECTION_END __section_end("__CODE_ROM") + + #elif (defined(__ARMCC_VERSION)) + #define INTERRUPTS_SECTION_START (uint8_t *)__VECTOR_ROM_START + #define INTERRUPTS_SECTION_END (uint8_t *)__VECTOR_ROM_END + #define BSS_SECTION_START (uint8_t *)__BSS_START + #define BSS_SECTION_END (uint8_t *)__BSS_END + #define DATA_SECTION_START (uint8_t *)__DATA_RAM_START + #define DATA_SECTION_END (uint8_t *)__DATA_RAM_END + #define CUSTOMSECTION_SECTION_START (uint8_t *)__CUSTOM_SECTION_START + #define CUSTOMSECTION_SECTION_END (uint8_t *)__CUSTOM_SECTION_END + #define CODE_RAM_SECTION_START (uint8_t *)__CODE_RAM_START + #define CODE_RAM_SECTION_END (uint8_t *)__CODE_RAM_END + + extern uint32_t __VECTOR_ROM_START; + extern uint32_t __VECTOR_ROM_END; + extern uint32_t __BSS_START; + extern uint32_t __BSS_END; + extern uint32_t __DATA_RAM_START; + extern uint32_t __DATA_RAM_END; + extern uint32_t __CUSTOM_SECTION_START; + extern uint32_t __CUSTOM_SECTION_END; + extern uint32_t __CODE_RAM_START; + extern uint32_t __CODE_RAM_END; + #else + #define INTERRUPTS_SECTION_START (uint8_t *)&__interrupts_start__ + #define INTERRUPTS_SECTION_END (uint8_t *)&__interrupts_end__ + #define BSS_SECTION_START (uint8_t *)&__bss_start__ + #define BSS_SECTION_END (uint8_t *)&__bss_end__ + #define DATA_SECTION_START (uint8_t *)&__data_start__ + #define DATA_SECTION_END (uint8_t *)&__data_end__ + #define CUSTOMSECTION_SECTION_START (uint8_t *)&__customSection_start__ + #define CUSTOMSECTION_SECTION_END (uint8_t *)&__customSection_end__ + #define CODE_RAM_SECTION_START (uint8_t *)&__code_ram_start__ + #define CODE_RAM_SECTION_END (uint8_t *)&__code_ram_end__ + + extern uint32_t __interrupts_start__; + extern uint32_t __interrupts_end__; + extern uint32_t __bss_start__; + extern uint32_t __bss_end__; + extern uint32_t __data_start__; + extern uint32_t __data_end__; + extern uint32_t __customSection_start__; + extern uint32_t __customSection_end__; + extern uint32_t __code_ram_start__; + extern uint32_t __code_ram_end__; + #endif +#endif + +#if (defined(__ICCARM__)) + #pragma section = ".data" + #pragma section = ".data_init" + #pragma section = ".bss" + #pragma section = ".intvec" + #pragma section = ".customSection" + #pragma section = ".customSection_init" + #pragma section = "__CODE_RAM" + #pragma section = "__CODE_ROM" +#endif + +/*! + * @brief Make necessary initializations for RAM. + * + * - Copy initialized data from ROM to RAM. + * - Clear the zero-initialized data section. + * - Copy the vector table from ROM to RAM. This could be an option. + */ +void init_data_bss(void); + +#endif /* STARTUP_H*/ +/******************************************************************************* + * EOF + ******************************************************************************/ + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/startup/startup_S32K118.S b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/startup/startup_S32K118.S new file mode 100644 index 00000000..d872acfa --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/startup/startup_S32K118.S @@ -0,0 +1,228 @@ +/* ---------------------------------------------------------------------------------------*/ +/* @file: startup_S32K118.s */ +/* @purpose: GNU Compiler Collection Startup File */ +/* S32K118 */ +/* @version: 1.0 */ +/* @date: 2018-1-22 */ +/* @build: b170107 */ +/* ---------------------------------------------------------------------------------------*/ +/* */ +/* Copyright 2018 NXP */ +/* All rights reserved. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR */ +/* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES */ +/* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. */ +/* IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, */ +/* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */ +/* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR */ +/* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) */ +/* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, */ +/* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING */ +/* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF */ +/* THE POSSIBILITY OF SUCH DAMAGE. */ +/*****************************************************************************/ +/* Version: GNU Compiler Collection */ +/*****************************************************************************/ + .syntax unified + .arch armv6-m + + .section .isr_vector, "a" + .align 2 + .globl __isr_vector +__isr_vector: + .long __StackTop /* Top of Stack */ + .long Reset_Handler /* Reset Handler */ + .long NMI_Handler /* Non Maskable Interrupt */ + .long HardFault_Handler /* Cortex-M0 SV Hard Fault Interrupt */ + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long 0 + .long SVC_Handler /* Cortex-M0 SV Call Interrupt */ + .long 0 + .long 0 + .long PendSV_Handler /* Cortex-M0 Pend SV Interrupt */ + .long SysTick_Handler /* Cortex-M0 System Tick Interrupt */ + + + .long DMA0_IRQHandler /* DMA channel 0 transfer complete */ + .long DMA1_IRQHandler /* DMA channel 1 transfer complete */ + .long DMA2_IRQHandler /* DMA channel 2 transfer complete */ + .long DMA3_IRQHandler /* DMA channel 3 transfer complete */ + .long DMA_Error_IRQHandler /* DMA error interrupt channels 0-3 */ + .long ERM_fault_IRQHandler /* ERM single and double bit error correction */ + .long RTC_IRQHandler /* RTC alarm interrupt */ + .long RTC_Seconds_IRQHandler /* RTC seconds interrupt */ + .long LPTMR0_IRQHandler /* LPTIMER interrupt request */ + .long PORT_IRQHandler /* Port A, B, C, D and E pin detect interrupt */ + .long CAN0_ORed_Err_Wakeup_IRQHandler /* OR’ed [Bus Off OR Bus Off Done OR Transmit Warning OR Receive Warning], Interrupt indicating that errors were detected on the CAN bus, Interrupt asserted when Pretended Networking operation is enabled, and a valid message matches the selected filter criteria during Low Power mode */ + .long CAN0_ORed_0_31_MB_IRQHandler /* OR’ed Message buffer (0-15, 16-31) */ + .long FTM0_Ch0_7_IRQHandler /* FTM0 Channel 0 to 7 interrupt */ + .long FTM0_Fault_IRQHandler /* FTM0 Fault interrupt */ + .long FTM0_Ovf_Reload_IRQHandler /* FTM0 Counter overflow and Reload interrupt */ + .long FTM1_Ch0_7_IRQHandler /* FTM1 Channel 0 to 7 interrupt */ + .long FTM1_Fault_IRQHandler /* FTM1 Fault interrupt */ + .long FTM1_Ovf_Reload_IRQHandler /* FTM1 Counter overflow and Reload interrupt */ + .long FTFC_IRQHandler /* FTFC Command complete, Read collision and Double bit fault detect */ + .long PDB0_IRQHandler /* PDB0 interrupt */ + .long LPIT0_IRQHandler /* LPIT interrupt */ + .long SCG_CMU_LVD_LVWSCG_IRQHandler /* PMC Low voltage detect interrupt, SCG bus interrupt request and CMU loss of range interrupt */ + .long WDOG_IRQHandler /* WDOG interrupt request out before wdg reset out */ + .long RCM_IRQHandler /* RCM Asynchronous Interrupt */ + .long LPI2C0_Master_Slave_IRQHandler /* LPI2C0 Master Interrupt and Slave Interrupt */ + .long FLEXIO_IRQHandler /* FlexIO Interrupt */ + .long LPSPI0_IRQHandler /* LPSPI0 Interrupt */ + .long LPSPI1_IRQHandler /* LPSPI1 Interrupt */ + .long ADC0_IRQHandler /* ADC0 interrupt request. */ + .long CMP0_IRQHandler /* CMP0 interrupt request */ + .long LPUART1_RxTx_IRQHandler /* LPUART1 Transmit / Receive Interrupt */ + .long LPUART0_RxTx_IRQHandler /* LPUART0 Transmit / Receive Interrupt */ + .long 0x55AA11EE /* Reserved for OpenBLT checksum */ + + .size __isr_vector, . - __isr_vector + +/* Flash Configuration */ + .section .FlashConfig, "a" + .long 0xFFFFFFFF /* 8 bytes backdoor comparison key */ + .long 0xFFFFFFFF /* */ + .long 0xFFFFFFFF /* 4 bytes program flash protection bytes */ + .long 0xFFFF7FFE /* FDPROT:FEPROT:FOPT:FSEC(0xFE = unsecured) */ + + .text + .thumb + +/* Reset Handler */ + + .thumb_func + .align 2 + .globl Reset_Handler + .weak Reset_Handler + .type Reset_Handler, %function +Reset_Handler: + cpsid i /* Mask interrupts */ + + /* Init the rest of the registers */ + ldr r1,=0 + ldr r2,=0 + ldr r3,=0 + ldr r4,=0 + ldr r5,=0 + ldr r6,=0 + ldr r7,=0 + mov r8,r7 + mov r9,r7 + mov r10,r7 + mov r11,r7 + mov r12,r7 + +#ifdef START_FROM_FLASH + + /* Init ECC RAM */ + + ldr r1, =__RAM_START + ldr r2, =__RAM_END + + subs r2, r1 + subs r2, #1 + ble .LC5 + + movs r0, 0 + movs r3, #4 +.LC4: + str r0, [r1] + add r1, r1, r3 + subs r2, 4 + bge .LC4 +.LC5: +#endif + + /* Initialize the stack pointer */ + ldr r0,=__StackTop + mov r13,r0 + +#ifndef __NO_SYSTEM_INIT + /* Call the system init routine */ + ldr r0,=SystemInit + blx r0 +#endif + + /* Init .data and .bss sections */ + ldr r0,=init_data_bss + blx r0 + cpsie i /* Unmask interrupts */ + +#ifndef __START +#ifdef __EWL__ +#define __START __thumb_startup +#else +#define __START _start +#endif +#endif + bl __START + +JumpToSelf: + b JumpToSelf + + .pool + .size Reset_Handler, . - Reset_Handler + + .align 1 + .thumb_func + .weak DefaultISR + .type DefaultISR, %function +DefaultISR: + b DefaultISR + .size DefaultISR, . - DefaultISR + +/* 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, DefaultISR + .endm + +/* Exception Handlers */ + def_irq_handler NMI_Handler + def_irq_handler HardFault_Handler + def_irq_handler SVC_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + def_irq_handler DMA0_IRQHandler + def_irq_handler DMA1_IRQHandler + def_irq_handler DMA2_IRQHandler + def_irq_handler DMA3_IRQHandler + def_irq_handler DMA_Error_IRQHandler + def_irq_handler ERM_fault_IRQHandler + def_irq_handler RTC_IRQHandler + def_irq_handler RTC_Seconds_IRQHandler + def_irq_handler LPTMR0_IRQHandler + def_irq_handler PORT_IRQHandler + def_irq_handler CAN0_ORed_Err_Wakeup_IRQHandler + def_irq_handler CAN0_ORed_0_31_MB_IRQHandler + def_irq_handler FTM0_Ch0_7_IRQHandler + def_irq_handler FTM0_Fault_IRQHandler + def_irq_handler FTM0_Ovf_Reload_IRQHandler + def_irq_handler FTM1_Ch0_7_IRQHandler + def_irq_handler FTM1_Fault_IRQHandler + def_irq_handler FTM1_Ovf_Reload_IRQHandler + def_irq_handler FTFC_IRQHandler + def_irq_handler PDB0_IRQHandler + def_irq_handler LPIT0_IRQHandler + def_irq_handler SCG_CMU_LVD_LVWSCG_IRQHandler + def_irq_handler WDOG_IRQHandler + def_irq_handler RCM_IRQHandler + def_irq_handler LPI2C0_Master_Slave_IRQHandler + def_irq_handler FLEXIO_IRQHandler + def_irq_handler LPSPI0_IRQHandler + def_irq_handler LPSPI1_IRQHandler + def_irq_handler ADC0_IRQHandler + def_irq_handler CMP0_IRQHandler + def_irq_handler LPUART1_RxTx_IRQHandler + def_irq_handler LPUART0_RxTx_IRQHandler + + .end diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/timer.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/timer.c new file mode 100644 index 00000000..3b764d8f --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/timer.c @@ -0,0 +1,88 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/timer.c +* \brief Timer driver source file. +* \ingroup Prog_ARMCM0_S32K14_S32K118EVB_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "header.h" /* generic header */ + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/** \brief Local variable for storing the number of milliseconds that have elapsed since + * startup. + */ +static unsigned long millisecond_counter; + + +/************************************************************************************//** +** \brief Initializes the timer. +** \return none. +** +****************************************************************************************/ +void TimerInit(void) +{ + /* Configure the systick frequency as a 1 ms event generator. */ + S32_SysTick->RVR = (SystemCoreClock / 1000U) - 1U; + /* Reset the current counter value. */ + S32_SysTick->CVR = 0U; + /* Select core clock as source and enable the timer. */ + S32_SysTick->CSR = S32_SysTick_CSR_ENABLE_MASK | + S32_SysTick_CSR_TICKINT_MASK | + S32_SysTick_CSR_CLKSOURCE_MASK; + /* Reset the millisecond counter value. */ + millisecond_counter = 0U; +} /*** end of TimerInit ***/ + + +/************************************************************************************//** +** \brief Obtains the counter value of the millisecond timer. +** \return Current value of the millisecond timer. +** +****************************************************************************************/ +unsigned long TimerGet(void) +{ + /* Read and return the tick counter value. */ + return millisecond_counter; +} /*** end of TimerGet ***/ + + +/************************************************************************************//** +** \brief Interrupt service routine of the timer. +** \return none. +** +****************************************************************************************/ +void SysTick_Handler(void) +{ + /* Increment the millisecond counter. */ + millisecond_counter++; +} /*** end of SysTick_Handler ***/ + + +/*********************************** end of timer.c ************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/timer.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/timer.h new file mode 100644 index 00000000..c9798948 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/timer.h @@ -0,0 +1,38 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_GCC/Prog/timer.h +* \brief Timer driver header file. +* \ingroup Prog_ARMCM0_S32K14_S32K118EVB_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ +#ifndef TIMER_H +#define TIMER_H + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +void TimerInit(void); +unsigned long TimerGet(void); + +#endif /* TIMER_H */ +/*********************************** end of timer.h ************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/demo.dox b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/demo.dox new file mode 100644 index 00000000..796e0c8a --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_GCC/demo.dox @@ -0,0 +1,8 @@ +/** +\defgroup ARMCM0_S32K14_S32K118EVB_GCC Demo for S32K118EVB/GCC +\ingroup Demos +\brief Preconfigured programs for the NXP S32K118EVB board and the S32 Design Studio + development environment, which is based on the ARM GCC toolchain. +*/ + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/S32K118_25_flash.icf b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/S32K118_25_flash.icf new file mode 100644 index 00000000..384e4be7 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/S32K118_25_flash.icf @@ -0,0 +1,125 @@ +/* +** ################################################################### +** Processor: S32K118 with 25 KB SRAM +** Compiler: IAR ANSI C/C++ Compiler for ARM +** +** Abstract: +** Linker file for the IAR ANSI C/C++ Compiler for ARM +** +** Copyright 2018 NXP +** All rights reserved. +** +** THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +** INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +** STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +** IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +** +** http: www.freescale.com +** mail: support@freescale.com +** +** ################################################################### +*/ + +/* If symbol __flash_vector_table__=1 is defined at link time + * the interrupt vector will not be copied to RAM. + * Warning: Using the interrupt vector from FLASH will not allow + * INT_SYS_InstallHandler because the section is Read Only. + */ +define symbol __ram_vector_table_size__ = isdefinedsymbol(__flash_vector_table__) ? 0 : 0x000000C0; +define symbol __ram_vector_table_offset__ = isdefinedsymbol(__flash_vector_table__) ? 0 : 0x000000BF; + +/* Flash */ +define symbol m_interrupts_start = 0x00000000; +define symbol m_interrupts_end = 0x000000BF; + +define symbol m_flash_config_start = 0x00000400; +define symbol m_flash_config_end = 0x0000040F; + +define symbol m_text_start = 0x00000410; +define symbol m_text_end = 0x00001FFF; + +/* SRAM_L */ +define symbol m_custom_start = 0x1FFFFC00; +define symbol m_custom_end = 0x1FFFFFFF; + +/* SRAM_U */ +define symbol m_interrupts_ram_start = 0x20000000; +define symbol m_interrupts_ram_end = 0x20000000 + __ram_vector_table_offset__; + +define symbol m_data_start = m_interrupts_ram_start + __ram_vector_table_size__; +define symbol m_data_end = 0x200030BF; + +define symbol m_data_2_start = 0x200030C0; +define symbol m_data_2_end = 0x200057FF; + +/* Sizes */ +if (isdefinedsymbol(__stack_size__)) { + define symbol __size_cstack__ = __stack_size__; +} else { + define symbol __size_cstack__ = 0x00000200; +} + +if (isdefinedsymbol(__heap_size__)) { + define symbol __size_heap__ = __heap_size__; +} else { + define symbol __size_heap__ = 0x00000200; +} + +define exported symbol __VECTOR_TABLE = m_interrupts_start; +define exported symbol __VECTOR_RAM = isdefinedsymbol(__flash_vector_table__) ? m_interrupts_start : m_interrupts_ram_start; +define exported symbol __RAM_VECTOR_TABLE_SIZE = __ram_vector_table_size__; + +define exported symbol __RAM_START = m_interrupts_ram_start; +define exported symbol __RAM_END = m_data_2_end; + +define memory mem with size = 4G; +define region m_flash_config_region = mem:[from m_flash_config_start to m_flash_config_end]; +define region TEXT_region = mem:[from m_interrupts_start to m_interrupts_end] + | mem:[from m_text_start to m_text_end]; +define region DATA_region = mem:[from m_data_start to m_data_end]; +define region DATA_region_2 = mem:[from m_data_2_start to m_data_2_end-__size_cstack__]; +define region CSTACK_region = mem:[from m_data_2_end-__size_cstack__+1 to m_data_2_end]; +define region m_interrupts_ram_region = mem:[from m_interrupts_ram_start to m_interrupts_ram_end]; +define region CUSTOM_region = mem:[from m_custom_start to m_custom_end]; + + +define block CSTACK with alignment = 8, size = __size_cstack__ { }; +define block HEAP with alignment = 8, size = __size_heap__ { }; +define block RW { readwrite }; +define block ZI { zi }; + +/* Custom Section Block that can be used to place data at absolute address. */ +/* Use __attribute__((section (".customSection"))) to place data here. */ +/* Use this section only when MTB (Micro Trace Buffer) is not used, because MTB uses the same RAM area, as described in S32K Reference Manual. */ +define block customSectionBlock { section .customSection }; + +define block __CODE_ROM { section .textrw_init }; +define block __CODE_RAM { section .textrw }; + +initialize manually { section .textrw }; +initialize manually { section .bss }; +initialize manually { section .customSection }; +initialize manually { section .data }; +initialize manually { section __DLIB_PERTHREAD }; +do not initialize { section .noinit, section .bss, section .data, section __DLIB_PERTHREAD, section .customSection }; + +place at address mem: m_interrupts_start { readonly section .intvec }; +place in m_flash_config_region { section FlashConfig }; +place in TEXT_region { readonly }; +place in TEXT_region { block __CODE_ROM }; +place in DATA_region { block RW }; +place in DATA_region { block __CODE_RAM }; +place in CUSTOM_region { first block customSectionBlock }; +place in DATA_region_2 { block ZI }; +place in DATA_region_2 { last block HEAP }; +place in CSTACK_region { block CSTACK }; +place in m_interrupts_ram_region { section m_interrupts_ram }; + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/bin/openblt_s32k118.out b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/bin/openblt_s32k118.out new file mode 100644 index 0000000000000000000000000000000000000000..4109b77024018ff9a64a9e5dd62009d1d894d8f5 GIT binary patch literal 146036 zcmeEv31C&l)&Jb(E!kfdLVy4-VM_oZ0YqF034}xgvbj{LBqR?K2}wwT#;r!HEoxo6 zskJTEUEA-YC|0d#Tw0fI323!d+gP>KR=@JK)&x}E|M#1@^A=v9Btl~UpEtSh-aBWO zbIzPOGjnFUbU{U_VHiSRrpOcg`sNrR?woB3`xuiT*DT=|7GRl#o+nCy5?`WA z`^e~;6W^XwF3L)BMPcoxVt1GL&atAsOzbxIxP+^lUl-x)qh1#{-Ldr_+k3a!B1ISz z+sa?fz52}8$Gvdo(ya0^aicCAb0brpSSViDYUKO6{78A?UYF<|!Blhh=EFUhZ*>~- z2@D*c?k>78Zn68uJ#JATQ)%C3_(hJm@r&j0wPM_BCASt&?KH)Xt;XcME^+h8we4Br z266M%&htg*8DFQ|Pj;SHJI@#DilqOiO2m!g=AvwI!?~q)&cZTL+ffkgIWyR?)!gor zDJF>GlQU|^*Nz&2-_h#nou!_M&eP{SGn{9Ze5TcQ%t))fHA_quonFx3+dgNTFIl!!GAut;M;#S5d#^*}fyhUzquiZ^a0&Lj7$jaN;^!aRg-C>>Z-($!j1poWaywZJhpZJiaw2Z<*NU7M zN~EmZ!q5-M&|0Drx&XgrQ?aL0Na)s}EyUEY#Q6a)80pV)1N$5IwEK%h&gcyzFDv%$ z6t~1>F}_=5h=k6Gqvy00G@X}yX|{QD(HQdv^JbCvc9-Z@Dec?-zuPX~VvP6t>q@;% zfYplK|I;gF+u?6bm+%`mq;;2P$BT8PquO?Cy|vi8BOaW*e`SJrZRKVn%1_oWI>jBvwkmyb z-da6SAOxgpsfzSP4ah3TP@yq%in?v*3w=6ZnlH}o1eQ!}*ZrWs31in2y5E^Lc)|Mn#@9{DWuQRICOx};<4zU@tr#oz=n zQFNb|O)Zh0mxUM_dq_-h6@lsN9Jl6Fw$&AOuaPdkp5TC53DZWeiP zyK%d4+qk{B<8a60PQaarI|+9(?iAcC5AEB;?gx5}?R@?Om16g|d&Ta1dQnnq+ZP&0wLKUd>wRBzH*L!hNx}^cn+F+RpM74o*d5>N z7xTxoZxwkTbT!Eo?sihT2hR^mMV|dqd9m1?-dj{$xv;2M)0}T@Dw*T)lj= zN)t-{{F2DE;;$)A*kQ$8Q#@iviT9e~X*=eP6g!O4W%GQcO$&p$apv64H1{>duAOOV zappC}hI~r@J4JU~{4)q??EHn%F>=|wFU$99#HKSjRNx3M!pzCVLB;9p4p^8Fh5 z&a{o4r^t8IPdkec-*12ivG9VEf9dsZ-?wY^!%Yi$w{HvfeD!1UIM{Rb$EJKf>pZ7^ zqP`oP=ifdSc?L^Kcd%!nbaO#>3Xk!!@SELY_uqRBzX`r~?oKIc-&W%nyB~6R`Xru0 z_>lTPkw>?GbaaK`_cw{%6`u$^ecQ9Q6;{-h`i0p2&c{Zcr_1n9g*4Ze8f|p@SFeKI z{|RBjKOq9Pt2cdn)54~0ZjmU)F3M{&^6V~_&;o>8@Nr%n@-g&X_lem3i(bg%wqa!g z5Lc&}=jpU}TBxx--9>(Px7TlXOIrK_-;fUYjXz|+uM6S-WdZd0Hk7E{*FsW7ry*YAqR^{1{YMCSd43g92?WI2z zBBNV$XW{nYuAC|SO$#CGXjhCve4|cIuT3aPuN;Zzh?3OG5#`=?)^5R`*Mh?8_dOJameu%{y!S01;iD9c~z+wO{hFin4_U6k>^ zDMen~TYyIf?gw$(_!j=3l$#>HX;Y0UO2)mo!W8qzy|~O2S2vY4A?&vQmRzMYiEhIW zKKp-)T$S~3TQEPfOYFY7_wI@kzkj8XXLk7@OBeRe_xsO*1iWVWOL8h#%=hP<(~Xk6 ztk<{ww(__(Bma~xqwR(K8J)k(pWFGH{Np-1^QU)q<poqO}sIzP@&@BAb`qjO*Wu+IE$v3pDJ&vuF3zwCV)zqj{3iQjj7AII<2y^rGe z^4^E>yP@|%{I2fZg5O~8kMNtl=YIUY(|Zqo=kK`_zsvXBj^A_kd~cT@c#rA5b=Qw} zwQsv>D{Ak3hHO0~p_UgD?QVbD?5vvXV9zt3DT;NkQrmk&MvGx00#CC1a*L`l=lnVdoo3`FwAMBa*39;E+ zU)NTYwYjFYttgu~7otvLX#akp8-f|#*%cE-+3ecdg35E-bS!p6ECrQ1mL^c`s|e=2 z+4QH;^J+IEwPS+*4Z>f!VePBHPi9t}o87*3-WbMq_9r6G>M8_Pxxs{P#uDs#?vvZ=NwF8yC>|GXzb6#_kx$yU zwnuQo9UR*|R;I7~)^55&~3$pyZz(KzlgPdbu;_cJ!l`eB`ff&w0URKwa>yT)qW+PXELu z_8#r8?J!&~1$$f{2YVKMa%J&{I|>oQO->BEb8bWo(-FfBXkRe=bMgs!35R|;*z@O) zf<4nhp}#Ccr@qA0;@nI(*fUo9H<{Y6;XgCv|9t7+_p-mXNECVf@a+xzM(jU<@8HJ@ zHz777Z|r&QqN3ZFC+vTqeb^2jrTwXJk%VlkLzVZ9^HqmYSb80(K0@__2 zxoI|9eTacPB8TP(clULuD{g{3EHC-Z67&zmRa@KhKiEmgrWlAHko?63wU_2>DjACy z3M&f`(^aN^D|g;50u_ao7nWUwn)RYG$bpU8^r(cF>qNQNtZgUWC06D0qQlz?A9nY> zb_d=!;C(}xr;;{+Cf3PibSbE9lCk+~8yznGbziV&#>ckUJFB2p7%t@1n|p&j`5#{a zIqE@~sT?hYC^C!g#S`X+C-%PeMpPzPi_82i-;`_IqQ!BHOb{4QQa@gnJy}d1nb`R2OFGG4krWjmx zC*FPY%%Tk3d4Lt*c8lYMpEw0C4fgy!7<|(sgaAAkL*~hRfbo zTiO`Xb`2<34JXGJnUzNE6}hT>t&7lrXtCy)wFzeT__sxNQAUYfSyN_=uQ@rbHn#{i zg|2ExC%(7m&73$h*z=b?9iuzE9d<`z`&RyTQ#wn|LNDg5va>|4Q_>d)b?leZZ|(p;x$jXA{~Z9#|db%l24iS4o8*E$0(@jl5&J{HS?mb^6=p zu>U?%+dMN450ekXPxS8>cDe_LJ_tUSAO5hfjBin9Gp{D_ln|w?C@>B7y9zv zrEbc`lXkJYNTgjTym+=>F-G_{u0?m@A4rRy&_eZg50;zH}ye>q`A}M zN0y`~jw}&R#v$yNJ?OC@Y`F|8M7r=D>)u)LP=*+Ww-Y)(-cj&)xkv0w><};89ajl+ zr`Zln^2N(0+uX80?Lz6Lzz|LyUIZvK=?s&-AxvqgPTnD<=!` zodrmm`O!;8F6DcN@$t*U0F!r_`b7^jS$IT>mDh`2K^c0IdC1cO+_P{ecGyKPp}+Ym zZn4=evT^&^FTu^a(u-T*wo7m$?+uu&Gm6|rKHTlw_VxSJ3Dz+ zkulZo%-U&9P3$yxW^@lLOYa_5F}`*}kvPieOe+)J=_0;64K8z}^7% z>;rCP8SPA|@S~rc0uA2Pn}pJp1U+?C)?V}iugXH3d?)(^`+DXF*=x0-7Ywv$QT}@^ zP|fz>R+NQjp(8tRQ(z&w!o~w?NWQ!HUZCDlB?vJ`y;JRqBK3|SLX@fZIKD4Y@2D|2 zz98d~LkE@WJrNH`f^<*fdy{&H9af+(FWpo4-mY#R-vx5JU7%dyYFF=Rd`CH>dpcj+ z)q4itg(cmG@wHvOXW})uZDQHP@<}IKH%&Tu(kXcr<~Q;x@)jB2%v+SdIR8}fZL2$_ z&BJn;ZGHdx;@&Rv=9^)W&1&;CEz3STyJr{qS(9ztyt#M}?CD!zoi1q0gRONvVdJvI zi1LvqUtOHm>F&12uPjOYf<57jB`cPmojt7LPVXJXAMDI1??Bt=%o6XJW~Hk;^Y0S%ej~+COuO6Xz636 zKP`Q{G`>9kIbyzj+(*B6mt9%vE^A-Nd-cP?o>xBEw+m7EgJ&Qe zj0qh(Qi#HAWQAp#ah7GqTb7kzTUMfNTS+e4N_N?Hircn*ZkL_vaoK4emn+@ta%Fhk zu3=t}E7R+75BGZASzfPagxBjWId0_{jm_&;wluD3J-@0su=3QVKtplGidD;J&N!v8 zaOH}s=Cy&=mCGA9HdhB$&Re#qWKn^JRaZ4ks|IqPCXVKo88c@vmfcCPp!Z2;G&tIgU4%vcbo8^o)O}9%}-s4h^PdPT_uZvU4A?|jHD2GHF zsfOj9;7w2P4KEqKe8l^UQHo6MmTIKAeZ&8}c=)cxJ_qK>L`3DoLQ$a*jE74?%1H?5 znr0a35$ViLEEnpuBY zOzqJZatC9K6_biiL!=mB3z?m0^Tn5t5=u{qxczd5j7i?#Eeo}K67p+Cg5{lq56^)! z&wUUErl!mMNr2`{kKv^+M@$DGf~D3(DI!UE;88X}2?r$68v_ZmIG!vH5nS#gf%bve z?mAi~DH1iy;w8(5MX}7gKYI|P>%bhb4#JV-7&as+HrQdwO3?JXW2n?w92Wx#)9>kn ze)B-|A5O9J^ueY9mU{0n2o7X5hFgbJ_}zVQ;BXQe7M4CJPKhixK70(*g~+W$hGhv= zcwgn+buh_cSz<{_jbVx-LJ=j&RwXI6m>h}#CG^3*!>700G3Xysp4tbI_`{;?V=I~n zejd1@Ied&ch(bS{C2L^pk5xrsg(H%*^7Qsm-^BM(Mh>Dp4_4)+#NeK+lxKtlIg%gu z?{#Qw?Gh%bFCChAKpmPO=|`FNsuE76cYqS^IYb;0hd_LKUs zuSSRE)P9aGV$;dzUY;l$Wqm5Bfwz`)^_Bz;7As5|`@ZCbnVIK6az7PWKN%S-x$FD7}#)s@{v4TaKpUWj2gUDnWkeQsEwyu$usj zrQsWFR*O!+&}$4`D%|mS*kT7@u{5NPAPmzXFcB<#sc^d_Y-*pd?Lf~Km4LN#VrA(rWH<7mPuS_OMA+h977=8Rk-UX5jG95i*?OdCi-B!LwqYJ1N)!G=m%`;+M-i3*Ky2QA8=_!~BEU`#h0-+K zHl47W0lO^*<|!m>7E0)cF|ccA5H=Z^w>JhhcNSsekw+CVu!Tnx)&biP@z$53;RR&3 zEy|Eb5dP4mV0RruSPfthr_iNf8|Dz!09dRnna30M5@Z(w7rIoqKTFs@04ohaG++L5 z0>jOLCW)1aQ&A*s(ThlwEl~wlai-5D%!|_08WZO$5_U0Q^J8ES%wxF3K51A56^Fd- z6Sk;?u$HF2W)B#Ebdgo3ZP|Pje*%q3G?Xisx}+J0PPrRl=eFUn6t#?xOK}F5nN&RABUeI3f;i%HxA^2+dwIR z_Ml`AD1wEEKsS~99RaExu?Z3A_Vm2;wkup$+F!B0+D~4fEi1YZk#2m?OTYLE>&gK{ zl4+vliz3C6GvG+hMkKm9Kj26oG6=qJd>MOHT(P(*2YHlpaQ5*+S^<3|ZVyd0`D$iYRoir#}h=jR$c#!s=cT zlee$5zS2(=ScG3dG`a&dFa6T~D-qb_gzjbaI|B0Y6hxrAVgtwu5^)`(&^@+(s}V-< z8$_VHbpwjP=SKSx{R1x|8&CvG5rOU?_B#T~!%c`l_aX-<4;0DYAsXG`?2kw?>@ak! zbceLRVV5GTAF_z{k(^s`sFg9b!nFviJGArCFC3UwU_`$~M7sAo;D{(sV<88+tK9G0 zWTB`;1iC+s2>PpBSfky6D0H`bKve*<^e>1+_s{e2eW=+&8rWaf{r3UTzzkW7D0DY} zz!}1bShTcFV8B%wn>l+Bkv1SiVT4%w!yv}B04-2$aQHNFvH0JJxU_*{fW@DJ`zoU8 zaBLa<*5-_WCQfbe=(prEg0m2Twu%fWg6|*#Z93_91eE#L5rMX^^e0Ox^I3>M+g}DC z^GyD1{Ae>xf08HjzKyWjjMH!0W&R@qZR;6O1S8Pd)&`*gMQ|1(&{m@XMerR&piN5y zir{rbpzTisieNMRz8Pz2{70&U3}Pz2vc1lruy?+7Tz-6X-WiBX;Ovt>z*G!CW! zZ8{sEMxy3E7tv@dTa=RQZ`pVd5owcLzf~J~@&O{yb~`Y&zdRu^$G}{n&3p6G&mUMz zg-W6w5ow!Ve;C1xc^qN2&2NAiLsennN1F%xEn}o%J|fUI#QxC0#M|+sZH)cSOh)h& zezYNSK-in;=WA!KM4ML!T&T&2O^8U_V*A4ghJ6-cwXL>4VcEE*VNu(1S%&&;E@DnBKqT7eJAj;! z^dkyw8}1Jc%*AIBR@;vIor_G|1x{!KbAJ+N*m(%64bc4wOXgpKA8nu>5c8=8pGG9w zl085z$UMZf!jRE>0C`AqDiDRXjSq+%Msgz}(MI$ENAg=lqOI)%ii8{)1@3CI`~WyY z$vg*9XzP8yC6f_+9}#F1f4?KZ1OU;E2u{F2!z{edOTUEW`zywo>EhX+{k%WYN=cuB zXqs@tPTnue26U`gi*UK-+dCCgnNR?&--#Dkl>5a5hOI}~dyzcf`$Inc-;1yhAuO5M zpRfob-bUEx@iGnX^V#0J(kP__^d}zTFcmq!cnn9R`iBDrxfWrUA*>hg{T5_Ka33P5 zMFdXXU58r=qj1LbGiJ{4uW4-dW3ftjxYx3(Ypa@t;k9o?`qsvVmb$eKff|2ZL#wbo zp4IiOtE7iZ%xNS1@)MAmGd7B=4Rh9rT=5*SChEdA2Mc#S&i4R##|!2GVYyz!?>xzm z(yF@pjm-gJOm)lUB61=c%Zqyrm;&c9Iak87yS}c0U(;vYhc6+Xz-^1m_}kBHSY1`U zuBNfEc_0}v0wwTRq-mM^@jm?RtJ&{AM&J}hW! z4M30@8&=e<4+!q!XIG?85-y7?_Y6Tv8$w2h(B#@CF^Sj}rDg*=t}Qgg_dY||h51*U zo(l}Qvd$1c3}a~bugvKT8i=6k8Jo{xqz+Rx#7!uDmg~RqRt)i<5AiQ=sB0C*X;?Jm zhb#SaJY0w$;db(S5b@Px@h3q&?F0r2-z|94_?FZLs@DnQVrYpXI5Pl8-?2^(_uwO} zNB*A&!u4RTLYS3_56Z4&Vr2;6TK*4Q|pdgLSw z)HNejOWYYwyPq`yblQN@)-xS;VTkM%(0m%6mUR#CC`OD*8uQ#qMmt>SmlGS%JH>4a z$)iESlj*X${~|`Su7tXY#&bng3xu!?cy5Lt`lTI7hzFUA;*tU6WnZgN``tj;0c0Nl z8WHu9Qx941!#P|#sg{E4dLSBhY^iN*ZWX4-L;O9r>Qja3bp^<|C|%B`unv1xf=EgTHT zp|+|e0GC2InbA%&;ADyPP*u9gNI_L9zd^{HjhMiaQZOP%I~2~|h>S>?F(OyHu(0qDTy?B;*UWAP!T^6@NF+>w`+~K9We-+(fDFS*PQ!*Nu!%*wx06)vy z0;G`f3j?jon*xEFlE#KLn4)KFGE#FyGX^6&AOH->$xCsot2WjUHm&gM0CfWt*VG(n zsjfofobL0=UqhrmL>UKJSNT=42GLz*%si4=NC}DOG!$2DTb;xHlY4yB#joy zs3#bT6VJj#z3&h;4N#1U4lPl7PTUh9%0M$f5%r29YJOcy)#~~{O+;p0Z6^7#^^u~9 zbK$~tea%#vRVC?SYi$TcP*2k<#jxY8A-aCs2VF9|?lqIfidG=ba1Te3b-zQ_HzZkG zA&EmsmYz8HYmhY)EhUv*+kg~GmTD|LXSx%Odw?wcu11q3K0;Z&V5W|s5_=AC<{aug zsi|Is`%mEh8r_@EJs+jgOiibz`a50fYTAVHOSmv>3QBZ1*MDWE4rdXaK-cEBMJ;Q~ zp)7yxxXyuV;yFO?@6b(#vD37yBxUbd6=-g5Y+lvau!=qSRWoNEi#jdws*u;;9@y)w z8T9&4$m=Ty@j4S;VeG-r5aybmrMV5`zi*&PrgH5xAcb68(OlKgvc9f$2|8c_XpUW$ zJJVPPzA@AaSfS%;s?bn^`?!gJ1sAUYD6SrzUbxIWnpw1stPknTcP(EgGvpn**0rD; z&kXr1Tv@U8O20ar{^t12f;x+DLf#cOw#}ERy=VDGGPR=#S$#okpqwJ`KKwJqGPq(I z|Il((Pg&(y_ESJra@Cu!xVkJ*9jH4mpqcuR9Y4Y#{pSF427DfOvSRE*_QZUWYAjJ~ zeaJrMSbl$rq@$kSSdUzJ*iOk{_}l0h#i^gzDI@58DTj2>x^ewL`uR3Sqcf1GWrqw>PJ{T$|JyQ zqc($vG;Wn`c;G>SDyS3JBxRifAEQv^3vmZ-M@j}K8}zjEM?v65j1Q@7xLXm(hOaQb zWq`uzK#zVo)m*pMr7#Z;noO4CFXJ%|^;`(emlc}(*GG37sE7-hQQaQB~WrHYqbN z8HsrY5r343gF?={_h`-kTO&E0z~2oGReBY`7_j=!heXv1Mb%zS)!%_QV>vUDs*fG2 zQqYJL;+etDt4iPkg2c`EIS=nDuYL{}>Z=y?#~T9GtpPM#zHi14H%IoD=)0_>)&@0zr2tlwd1`$iW{9`;u{^z65qOiPIVYxied|q8ObmB?w z6yqWwO5YrqXZ{h<4+fBv`x%XzHV!0TZveU+)U~Yh8tZB>C&&IZkO~j1);H3a=?OdN zW>nb4X;0ZNA)uE(Fb-kpPc>^Ek@iXLz;?~u(mp9&s%mPQ#W#(V=_CAtBOMMO`YBe2 zg%5i1%`aihz606!1y~*}*MmT+q-moPvg06R-$CBdE7t>{4>`0r>-9e6C=f1mxD?KR zP&hB=(93BUZ(q{fxVE`!y)aI8XBj^Q{tWhK-0miVFh~<q4A<*&gT zy1!x39EvR24IFcU#-Bi5Pl&uUAcZVh6j)!<*mQv~zHXpMy$^ipo#o$CgJCDSj~tD2 zB195;p`MoJYP#f4q03~t$ZGuS#<9oGgv&y>xYsl{f=S;rl2eDnX&s$f8|g4ClMY{k zgIcSPmFsA>^;hpkODV=TR#rD{T!lvPfOKL#)_?S{*kUtGmK%xDr^=*Hi;-UR^#$;% z0sT}@4wcH&z>Wo|d4pqN6Gk4!FK+}h8Gx(3^h}1KCqb`0dmSV^9U|eW5D5z!Xd@KH zEDRan1q$e&OATOvLRQ$~jZZBWYwD|7Y6qgmSB-@gAAQ7#;V(yXhX=VFJsoy{hK6dl zX}@&WfdcmylEF96FO0-L!udA5C#8wR_wY{lq@W>^ITo3i@-_S#Eoi#Hv?Ygm1qQfM zE{t@oyD$JpJB1;&*M^Pj;pW8v4;-&BRWz$H{9OsfQGP0{>&63($O0F)KsEYTDy86kZ0f-;vQtjXG7d94u*%>C{g{Bk;Sn)9@S?!?Xb@T zM`huvsJejTEx#EDo_@m^H35k7{4~RvL?ID%_0NzIt=R`$g#FMSsO7|WQRijCs5J&C zT3*hlkn*eAAb&O7$;PA5J@m~rt5_?Fg5(Ip&>*gt&SnGQMvZt}F3^&QpV3^`3Z;3K z8J}*{LzI67>>1>K-0`xU0yZY+`vAQUP`s>}uQI0>UJIAWFgM1lUiek!+~SvzL>-(G zbeHuS^okhikLegzBgWUv#0A~8uxKh=Lj343lhVkK6?9xv*WA*&%F)qsVB;w>Df?o8 z&m|aIF&g@`nKX*fs{w`m9QTmQm0ke794K{%nD!CS3d@z86V-w`#dzP0A0_4Meqhg_ zT>c#5%iqo9bn@jz63#iJRjrtEiMgVfQYC}$Hj~Fv;JPL4oZc~{wClCo?*XNDnAnuS z&|)oVKRwV~x8{N{@poA9*^>BuK%Zf`a63f&U6vw#3|hy15`VX)h@T~Ur0f6=De-#M z`2`cu$PE$CF>y)!{6@}${kavNCP`iiq#1(C%tItUZz;WSv81Sbs43D*;C&M@r3ywn zm7Q;CieR$SJ+)$Jf_dl`2U=P<2o*oxpc=agWH1gchY!*CchE@S-IB&nhMGpbRR3$B z@%0dms99C6vHp?`1!1(?sbd67}UN(3LEIj&mP?Ns{OzJ+#iFSM5Lelyn zTtf`F+*X;KF5BS7P%C*-aWZltdlL4Wg0)X&GVME3Y?q&3*IHfcu;4CxM4lj-`M{k4 zua02BUH0*F2`dLIKB7{)%RXf}nXm!wAtu~o4;x9(w@4I^5_RZfX} z+@)9@2eVg*Ur)F)N3n?J(GfEi*Q)-R@uVwL^6B)DyK0?vz@6M`q5B$kxK=5^Q?AUh zZvpTX8K9OeomFyz*wX+on{J5!w6M!)Jmbpr{{caM6anFI^D5bfdDfLVo~@Lp0L8kb zq0R+zaxV~BnvdNZU`$m4|6`pCvT3LKo>1ryyD{sIY<&gDGbFd%h>vZjJ?uW}1kz}s zLl7U+PJ7s0eg>iA01ai>BW@+&3+SlYd~zbgqweHPdOkbsuIm_KJmyXwB{fPIxLjtz zPuc6ahf#`Oqct&Oc!^-}mi^%L&oEQaEy0BBka zb&lz6PG(OQ;;by4V;-GjoGB@71(M>Qc+zqOk^cb5Gh`EUEToWr;yG$2iOztzD3leC zdXmx@WCk50vf?pMlH^_)+||U(A#G-Lpce`9#S7rWdzug4XW%01D-2JquWG1S9@wxk z(7>^a*F8yox#pGuU&W373_RQ7uV{T8vN?2qV0~lM0YtN$bBN|FIK6lkt&p4zzp@sy zJzEB139Fa_l|oBc%m9TuWJ|iu@L}?W+|<*-{!mS)M;d#*^$m9@K4k<90kc7g{TkQ| zE2?fI!kRCw`(@yfFiws48;`)-CP)>7pMx8-e!@BPS)onu%5&6otbNzCxqd;~8s#{i zqGyBKXWR=~=$-rUU>A_j9xZxwW=<`D@z;W+g>A!nm@n*d0Q0e2WC<%^JA+2 zhCmxSq{!(7=b3mCG+ikU-iIZx!AlvAb zyY30`SKK&MfY~+_IP0zd?gh?wYn4&Z z9ya1f%51$Is59hL+!#W{J%sW|BuK)Dlh9KSk-$nHBphhq;CUlH*PtA7n>xn8%^aab zaStIWL;`kkaT7?%!-N%;8;`&Rq^MDySB!X{%!4<9IQ_Fn3oE%n#5p{C$nBRt^_V`U zxZll{VRMBTZAU5d{dKqQG4-v@T|FSfa`bx=JM?r&_K2ii`n^b`ge(-8$^w-yzmX19 zJ{+L(wS($hah;XC18?SpGtuam|1$`Pb`=bw}Cpv0|D0i=$@hheO=thhec>m55&z?1j{w z!&SW(>L=i8g$#!Ex-qE0#3pdnw$#&!DW6p)k zE0SMW6Njn0H36)Fd(ucAPDXwN09xxvX-FBMcX9n%2?~#9K*D*N0sF0k`<;RL0A~UF zRE$M3DEDr4cdQ7e^WADNxs*EXOA2!kD_#+T!sK0~>eb~&ON{I-P z(9mMlN3gh>**lgsps-Y7LdAZ_722U%km^>il=Cq+4rpR=(E<$Bv7!qb{+x>LL!fPM zHC%7t83sBvns*mmUHq|MHWK*!i2?gd(ni)^t6IgAhAU%SzWkgy1K&R|Tw}&fcE%6h z{|vLi-LmRDIU3X=_ALTI^K&PoY<8d_X2=QHD4N9HbBI$02PYHt7SXAYw-+JCrvh^; zZZBl64xKJJFuQ6sCz!0nTe5*-=Ix?!Uj z$yhp8JIFBE`e9?}J~P@~MN~hofUr`)uwnqWCH@OzfwnQX+9_|!3Wh!X)?=FZfj2WG zqq(uohlm8`%TE&(kL{_JR`9>0s<+GE_$?XAV$Brb-CfWEm4Jj#Ns%cRtOCh5|9)jtioQpan$P6pQd zW!Y&>&~0eNRJ%tS4Iq&LAHwZfUb67i(^jZ#H3G?5%-ZYV0nHe_YtfqIVRU_fuIQ?8 z!y;j8+61_QeBOcAnlf_e~Ja(@ne_6&tCWu;y&EA2*gvZ9AW|Pv!BaW$AGr? zyrKeT?Y>HAcBoPmDvNOalgnWr0QtBn+jp~0JIpphfy zEkUbzg2tP68;Q4EL5Q(4D2C&JIDPYI1?(<_+mYs>L0q5k@B|RQE`<1_8gX6Tmt)4k zVqi}1JktS<*P+H-A1!ebbnxFa=I+Nd=CJ!gO(muq6!He3PXCWd)ZdZXST+p$sY1~0 z9Z04AC{V0&L6T!S1*T&XbA=(QFJU^nHmlBqTdo{--vq?nKgUnlw>GIIc7yO{fRa3F zEgJoDlNGvEr0~l?*>@Jwa~+y=!nDO!wB50>FP5Ac%B^Kp!>V3bo8WHxx(x%X z*yeLHAZ)hi#Maul1T95wlxU7CN%?_Hp|uhHeSFVPA)3Z|8K6w9QDZ-+Mciqah0dBZ z*`kq~yyzuru;R&0Ui5e2>=tp2Va^T_gX z2AV(8XnKF_pc%P8#r+2Mr^rE;{{R>>7*CMFa`M5(SRY(dx&qbGB+b|d6~=0V9BmAh z`)WMKjfbBG&J4(tYlQgqVB@S0%y|enpA*8lD-vhNkcKYq^W2AqXK64L&&hH2MSI>D zH}P}`_J;r|v*q)~%%cmCBYI~YsSO54y!H7#=b{E$nXhxlS_ohbn!j(C@4-wE2IWygaiPh@Bl!&e`BZHJlTwVVZfzOiE_d*T6xD|HeJ2jL?T7op!nq$4}PTyA^1F5wK~qVnxGG z)}p|6vxQwH9{{Qh$3u}|(HU%%^;t|m1Ik|yq5PCWd3m4}n`fG z@;LKMZqZ1<#K~m(PRaDg2b%(-Qh`K|J_D`35Ct4Vr}VAo=Dlp=U@vtmX@vMEkYosN z3J6eB3wBr&^I4wKyvl7vAQB7GRvlryoL$W%>&BSgpot`0yeV`c%{a%~0$tsx4whcaRL1r62ELvPwi!^PKuBK`9eE(iNJ?eUX{{ewe; zy*>{t*a!CDKMm6VAoiU=k^XDL*#E=9o@ei1^4?(co|vQ|(JO%c+@rMgP>59l zh89}H9ZtXQO3D%+0!IemQDhGDzwVllN9M7?m;cT`cSkFfd02b=yOy~p?_La zePb24e-F{01RNQFhoCv=-{YXa5TFD(8|Xe)vTqp_Y9n2^G0&1#=->NY$r&W`dbsKl z&Oxl?^|5WOK;hVFI+y+yB6B%U1JJa->q67zhd`8}_JwJE*QJ^++%QVf`ZtHx59ku2 z^*x8yj8UYOx^Pgllo(?KNc;=5z8RwRXK+zjTD-BYzDBlamU9*T9yjXoLZHfUJXFrf z**)&5)0tySB^6YMgGz-y-fk^K>CEXm$DR#QAqUx=RWZWY7Kd%t8-OW;6^Dt~7B^)Y ziMUP@G3d3UK3?ySAYx~Th;Z%b5P{tqp`GJUJ3atB8R&{I32(-!+VK~Xgh6kh=)?Wa zTq(r)1v($X4HSn2VSF{74HO{B5IoJ#k)yB1I}H>JIHH9;*m9)L6?_}`FDlgd$H-Ah zeSn9Ib;LuCjt8a;#`6RnB0A!g9GyKhMCg+ZSAG#QP!CLmW0rl3M6>}@2Fnf;@s>lx z&60>gFAVy0#ovI4V`k`_h$#$9ngdN$JR9vR2}yoA37i3^;dW+~d?n$i0+wl9_ZYAp z%2Qb|s_Kfz*eVx?V0GDXE6-?bUbnKPaZT&_h-@Vf(kiZ4;f!RiTv64$Hqg5A(1zv@ zH8wSJ&_CZ%%OVSf;A}v&m)A@~bL|&j{l`CDTa4BVngT8Owk~`2Pycis8#++W?EV41 z=Q!WBLVcgKTA%a=mzU^c3e1wN2(P|Q#rAWdj~ih^ZQ_@VY7%y*3w=!GL3E+7wGEgM zul>zws;}DEQn$LUzOMBGy2@m}YO4__?JK_xwq*@`#}wxxTTHQ-zXQoChq)p|zM;s6 z!NBBcdoIJuOLn;|Bi*zh2KP(BxD&ts*91fJKP(81juNP%Tw-( zv%Fb=8d(yP<|B#;PhUe?zc#>tRN`UyO)u!bOBRyve_lv%E~eI0N?Yn8!^12;1G-a* zN5!WuA0$SXja4ifJaZ0`F`j~vnVD%>S@_q*V}lgRBakXjkVC4^vSg(0m*^ae)x-?^ z#wc#5rRgt4&D7%0YnwAWeYS7QT%TK}ABGgnqMuU}c$ zP`$GHP;2JH+bTG;*jCoptv*!z4o5pK^SZ6O=!dXe5vEIYE3|H<0czK67;S3n!tIXMv(Hp0#4X_ z8)Lp}>#%CDIqbWn1vAY!#c@^j`hsxuMs*dJw7MRB28q3D>n4{gs>xL=Y}w`r*Q{`f zYGSD`r-`LLbQ4Pjb(&b}LpQP1m(#>jANx14R9xXEmh$B^u@n$ZtlMOPJ?qn{iTzuo ziZh1887d7P9f#t3C90E*T-0fCQzxSa?>0@%nPw=~3*_ken-(@7p+IEoe;NfV%W0!-+SpN{=!BfzH$5%}9 z1I-Wc!vlWAfgj0($q$}B20ZT6cz_>aJlGzg@zWGXTz+|U81Q%oc%=F)<9G>%QtEm5l7|^$IEDtFu^}zY>AJA zjJLkD$~8<9HWlT>GNw*&SveDd^u#Qu%p?HmZw(I8JiQ7?Z?ThIDa0AA5tn5aPWHJx zsjf-ZmzKDOL$`pxsc227n}xvaDcOqs>F2H3m{zQA)1FEluKR_PX#mje+qZe(6G5^X z({@09hc%QM%P=KQ&=B-!3LVkz^$A*B3apDDYclUk1y z%{(IrDSrobS0dV5Qm2#cZe{kO!OO(q&wccs{y(>eYV{V`I6p-DCzPRV*Ov~SF|=07 z$0_{%G{#UOjQ+gB9)e-=FcgT#QPg%WBU7rHBb64eFJlP4F<4X2PN6LD=Oc|Ov&aJwrIpbmKwTwc3PL&fhRD)v>n8QPrfZb!j zE(zGl9&?GpZ!8SZM{5jSR^i|x#siCh*tNbjd1SDVnS_6EVW!@=SKn z0`s7x;xZ)&XpePyk}*a$C7(kOp0rF~sw-iX)jWm_PD+*x?i?)Kd3p%}!i)CR=Hpilys~Y=*P#tz) ziabzy6)0J$Ry?fqmTR;W=Y_JdKkxI#{{QL5zCMJ-eCltz{^@$q4J_?4U{3l zszzb;zQW2FDeIc+hK@@-m<3$gr-x{r3BmKF3Owm^75INz1ybcyEVkQyFEbjH2@688;}_(`X0rV|tlWtiL@(=4BN9)(6r4g z%;bwPS?WO5sULh!@thc-_9jt-#W~;fp@LW{)!!+ftH1x#>Tl2+c`eb~Sn4_7bq3WFhQlmsL!MRSXv0*_YE6>eJT;MXDDdIAL%`=5>YUWf z{IR){{rNeQb0@nDztn|4kZO7;FyjG2!0ba}mImwVC@U@(Mv~DmWm$ICXiVs}3R#&< zfRcPj4g>QH+L#3@|KCipQiBXAh&wojdlVOcRtxL*{P9R7!m=pK>j6^b*4!xx~!3Gb9NCrhg-Or}{9h0jOrKc9rR#TfKvoSN^C zQTsPpPyELG54GLhEj7nsw!~}R7!Gexcuk&yMBRZ#M+Sy;tkkKKCWIE!VXPdp(A40R zW#(F**|SEC8lL6%TS-`-tL$gj3>Kz5P6(JjN@X*8Ob*sV4bOBOKyIVeD?QD{iWP6vof3T$ks#Y**aG38Og3g0aXrXWqeRIdFa1 zU@?tH;Q-59otgR=xaKktRVQCLSV-`g8X&P1NN|jN6o&8%^h(Gn$g^L`#_V%_HD*6s ztF7hwXz^KEwH(&3=7E_4+V4>94<-02(EO1ZsE=tnADM!>RQT0mROsJBAm-ojJZP`EPY54$%gHb?1Bl0 zz|iR@*#EKP$Cv*vCZvE)p6Ft=8_Ai&!WW6bcP4*^Wy!x`nf~EpaG5r6z4kMJH}~AL zZpJ`37i9ll7XOz%FaG`Cv|#Xyf3%eh0~E5k>tTIK=O~!Tgg6GJj`X8lU+$gzO<39 z)XXd>qqMQkODZ&25_FX|TOBK{<}*LHntyIJAIu#~)Ou=kxAw5R)$kwM+qzg5|Fii! z5FORm;uLIw>>Pz;DAusL=FvJR-W(ZB%^Wofg;#9>rmTWTK7F2$gY>2C8{=)N12;(rRAAVh4EJir7=-pwRY ziDO1+rfdeQttl%$of7IRL7qN>1Rs_(>QcW|mbxR58jlV^YSI{;ZpERw#nl5l1!iGm z@-^)w*)C%O=4F5PQn^1<+#SPGqy8|XHsTxeYDc2Q27@}SJM~8jYaR~*tY45O3QUqP zvSoToHyr^k@yrgS_eZ3cG?w&bWu}5n7i3^&u@Z+PMk)`=K+?By(Le%T(nlXz*7B$e zB=ZE*OC0Ib0@!|}vXUoLAiZBRy;N*{C^?hiNy%SgpdNAjoB=n8*};zBHZax+6sd zB!JxEpm(e+u9qCCJmqNvNdKMa^d|s;^e6<5SlQtL06^ehSd(F;W=|a!663?PolPHQ z2fM5z#UG=xg2sqT&K{nY?Gzsx%+x6E5y)z8v5$1$V7fFny5=*hhZj($EhN0@NaZp2 z#z(?mj@JoG8OzRQU5#aJ+&YOP1;j?n+Yw_vx3~u`k1Jd-hAfi}m9xep#RKk2k97aY zbX7G$wsVI15o?HX2YDoUIksQsW`9a?fj(Z?CJgr_@`*)BeCH!{MZ&Rj;6dTD{tZ0i z-@su!KWO~_F8sYJydRIyMPh8RX+aAc6l_@>)If{>obAk0v@9V7@5 zi3~Cl-*h`j5N_~=Ab$9g7dfHa!dV&N7GmcX_flH^JNKr(YCbYXQmB3jBvrF>n6UwJW}O56%Z>4cy0xGQlZ z41VP`5xOjC_$kSTG>;d=MOcscc-zM=X$BU>Wq`SHV@@=_qul z{YoJtf;?znd@?-nigfDJEx8YWrsKw^>L^@7Q3zd%ga{3D#%jRMm2m!2)D3Y49}FIS zMbOVs&@r{Kq3L?C;L8{b>4iGwgE1IlS!_gbjE#paz9KlF{GAc&k0>&vs`7Psx}GInsUi6m9eWtgswo!Ecp|B2mfvA@ zMxmjbs@m`(FUHDjMW(dzNgvTyWSq+YiY%gxlWwtbmcbS3pAYsg168W8M&kXNN?!M#T&{p9|T8V3b-^D$i(P97A+I5T8K_o z?*|g1699$~@j;)_mm)=~5#{gnSby;dk|~4nmvKbs4Z24nbDR9W#7}p9krN=Ek0SZH zf{#+%>X(uL4EboIoBU-&aFpN9kBUdOhF41H>3q;*^rigCcCqqz#=-n8r*}p|ZJ{F~ z&2)<{+Zm24d{*LBUOMUs#Tj-wL;K=0l1Kge&0Q5Kw+gH;FsbI~be+_lJ*BZukvf*?3h=M845S z^c9H{soFozf7b-@^${jA&eneepZ{;*ebE^i|AFAhTY8J)FTP12b9?E*fXfaH1bbu* zhdcr4Z}KX}Z!K;xj1Pjt*HpZoi5m>#BN|BWtXY(J@huuo z(P1bQ&8FDU07y=1yod+hLwFI+q6obBAUL9s;!8r6&e9&Di)^kFj72so+NgA|gD<3; z#TfM!kuFsin#+9D$k!!&Fi`ZRg2*br84&1xK4SfuaMdLH)q9kVARZu@4}!xNefe=8 zydGeNA$l(!p^G0%_w$WD!Wa2Mm;G29iRG&RBg*kQ(7AY_TZD0-5}&u?R;lof9>N!K zS3#C&$Hb5mD-3y2a+R+Yj*B#QD5p@pNk%KDka>W*l1>n`S{;(Yr@Vzs7-?Z|HQHNN z*sW5#QBkU(r)wvQl9R$p?Z&60#Uq`7ML37osP~Zc5qYMK9Oi@I@HGpsb8w?k!AF^d z@V7!buHYj&1d~_MEsc$iTp_Z`Xu`MXz;KAd)u}xwBcY2Ql-9^Al0HY-*aw0$m-iP( zC!NS3QFt($5GE?le}{+4n^>_2pBZ$vOpL!5;)Ww1?YPzNSL7Rizb4=Kdy{Ez53c8GsTp9KZKIk!gW#W~t zstFYfr%y%zy!aZrSbFw%qrb3D3ze@>7}E*EC(8}OM|q+SFPA37hKhGkB z?*xFMrud-G@I^|;<5qSuzD2|R4jf3t0s%v!iZ(t=)q7ONMIbRBU?9N9yy039Trvj9dse9&j~6&VjRY=2I$T!0up2#&rY13NXvfyxoV(N|>PK1zrs zEX(hR&+DAq50B`=^*}`O~bKDL~bS6oKAxSwM9dP|X0U!-47upqh$+nLst&8aEP{TDghV zOptJNoYmm6;@!5D;ISr~)+CTR!y+xVbqq*5F~Q1|Um(q6ValK6i6#vZ91l+?fG;P4 zKPLf+xx^6sndh~}`4~$s;+_ER^cg{4Ol1UQsyocofsvTge-cfZ2_Ub(**<6(###P! zYbJ7f7IIYPHgflPMu@JK#ukvXPPq1bpzm7(UKZXS`-pMzXv?S{&4LwM1M})%E{!c;L07_a?j52}JI3Bc| z;2|xLW6&m*39t<70wKGprfmEE0y>==fX!=Z2{gBsR@K#SYz|00KNi2HD6mz#`5Jr` zS5>c@-`Ln(-cZ*nz4)bl{NdQdKkK*xvHUM zeO>DkWK%$8&^Q^(KhXl29QL;?P#vf{FA(8PC6qCht=!1a18HR?~ zuAtu-F2p@yDA|cG&BNo-2q&|hnEODq08mq;Vh^MUf5^Of)vZ9aoO!aQsyeW!s%=?Y zMWBIE%Q-Ek*mVeDR)oUj$aJ;?>F4mKDQ$sxGz6+!12v3S+B8fNguI2>(G+6GX!tP2 zUD-n1hc^{P)AB$wPkUx)C-~`Ogm?&FQXZN%hJsIong zh!85Fci}T#XI|6BMS=AtjZIuKq)YL2py?TWeHV8L5^CPy$R522Rf;*r_B6i2eik%P zJf#;<0*rnO#8^VVg}amoJcKY-cw7%L9|t@_@H3k0T2%zf!&WrfkB;=Ppt-6=d6*zm z*p)BD$B`+>7^J3X*|;76)g3j(Ta$(OB+}#Qf#$k37ex6~NOw;WVn?LU`Hc-K$!Tyk z#a8ql-j0Mrq%@n0f!(~C8XO(c0v|$vjR^6rqtINAq=IZHu5Wa-nJQ4*KN~_mxQU)4~vJg{LSj;&WrL_UCw7iJ6bI^OQZ z4FS{qYpz-^#kLGP00W|iE>JLz5#pEllD->du?hLefx9U-%n_n9?87NKAx}zT&Er+h zu>@8GYKrUY8rFp*QhE6^ykIu8ETq~?NG&NZe>p*jUm%9aSQcm%3zY?IPDS^ZjG*@7 z26lJ|p+M<#!=O;wip{S8)CG?WwOlSdE}@J>R5MC1J}@t=1s0zd)~Tv4TU9K?{~!kH z2tdOnN`V)Zgp~xq;qs(#m^xn-d?$1tg@k=)Q~VwN$OOmVL5hIF`LP8`6FB}uMM@R9 z%?nkfL%~_b<8?!vQJU?;vTy;C@IJJ?(g!`|LY(i2s`MFKF{$F#aEcJ`A-PbJj>qB) z90jEKaaM&8e~t8}Qx5s_18R!6Q-$~l>HZhK>QK5@)l{`sty=A<0abL@FH=0Dig)t2 zu{j{~7%o~j&w=Hdb^bQo%2$XPP=-j#w?c?hkW|=1iH_#9CM2thnPTiCrwj22LXk?@ zCJM!+^lQ@@VFfMWXg@jCJgOQbmVc%Yk3~ihk%SVcx8UQakv<>`_|#R_!z;s;_?gw= z8ZQSvO!37pLIdILE4T^WuhK;I08c6BD0z20sWyhr2VK9a?0N=Xsk@`RIyqYdcinjS z=BjX`0O{(;BAPEsoYqwe5eHs7@j;(8ZEOuhRT>i!sVQ2kgm@5dI^pKVRwzhtvvFf{ zbs(}bn6z3|n~u-rf!31N#s$sIjm-$I>)&_bsRLh*r;_z-Y_c^$FG5N1ebuU{hW((9 zu8#1gq^=%xKOGenwRdY(>qdo@%I9g2nkS-sEx(|lx|XTQ;bT+07vlr*lq;qx#d!Z3 zA)btmBhb2toWZ5M)U6d_SCp62n(7;?BD03$kt~>DvX<92q9GIZHxW=%oKPpk&!hYm zZ>+1Yk$JP+srpqWn&%4fvnZcVi%3>A0BDXr2anJ6CKN{Q(TRzsRM6e3?o}u zD$SGY50GX_eV|I^wDOpOMoOQ^g-fC;1uwy4pU5p~4m4ql0w5&hnrA~?okcWpFM#M8 zqv9nCR^sDt|T+# z{J8ipc@qoVO^C@5Z$qV9jQ*!KezM*8S?4;WG-g6kB8}^kjch}vadk4%NO!yPN1b>o z(_tcMT}l71y)OZbsyg?-OXenXVX^>W3(FA0GC=l_0D=-SK_W>AN!V<3m?RStNM^#! zWFrA;wbs_P?$5gR*_Ntxsn%+%E%vF!minwqOZ)Ua+uGLpS_^7%>Ei$QopaCR%!thd z$$Ni!b0IVLcfWJb_nq&2=R4my=gvJkKeL;CX`yQw&tu>TZk&_q9S=F~rH}jVaWQVt zl7!^q!o)S(;h)D@Fe)%+o|IWd1}HebRu##+9J!nR6Y6IG_BCBUvb?GwtA|V6G}T z5QD5j`wK}+MyP&?1ihMMd?!8`E190u^HbGHT*kjc#`!ZMGWH7@b$#Mbg_OEJtMt!nx`?<$!KlT01eQ@vBS+xm&}I<)-z$)2YDXlt>tul{t0ZqtlCsdaSCOtI}X?4=hP!Lso}gVSa^^o(WZZldQY zcC#zP`gq&Y|?<3?~cb&1%eai{R$-TuE$jLm^A@Xv}QN*dr zEt)b_)AR=;BHqVDbU>9;TvFp3(ubg)DMt7&k3m5L zvu-pssHnG9rvy%Sqpr4`zxDIgml=KaE0{G7N`59Cer9L=8c}o8=0rD>^D@jYurju1 zl1;+$J~t7cI7aZ*n=z-XY03XNsLoDjam6oL!3<-3=?f;xWg9ZI(u;J>n6dk5W59Em zWIdM(M-=IV3{t=oe+f3#~Zs`P5%Nms&bVOWEtiX z)DBY8%_L14O)cOUK@eyO?pHmUsxGt|A`gO!C?OEeRh|>YeVjVP9@xG56RLr0QD!Ag*+FepCoy9LK&*E4f3!^xB?-udO>`Zgb@KEVdL&}bs|^Neh6jLdEa2$H~UTa z`%6rXJbC^Ht{_6xeD?9*mrh62jkkIt4!|2oFssx7|k=kX!ht9@eF z@X9;z-@3LS5)q>SX`we5hx@>RjTUaf&|94g4r&#B{FFYfCfmuSGdq3Yh8d7!1m)d; z{v!(xExCFFMCa&D!D6)0dn5RC9W=t4UWgvqZC+9Es13 zh3EJ9I^E+0j5FXn9VAXyjQ0xr8w$g{~rY$>D*Yb9rT_LK_9MT6fAIHE{ z*Xv)dV{DTw4Qh+BfpLtW#+jM|hBWX>;v8wK8zGdcIMIi(JUizzF-MX!TT_xD=QRVOtz1cQn=vhGPxZBSbI53MZGDtwO#5WB zXnQUuD76<$@KIC{7mIzGat3tqz<|1dxBh!sXs8=0?p>y4+c*DOWAFV}n#rd*k`RAm zRIVA_S^sJ3WC|%s=e)!n!=nA+w>piB_OvV-N}g8w+3MFNQS2LD!yvl~(f0w2@SW*AYNRc- znOb@mL zFZ_bB$K@Mh+0rK2tdNWIkpEG*JUT`wq??5zDR&Oyoz*Np{wj-)c_FEt{lVB%hPjH< z9Hy=I?G^VMlU%7HKC+uVFoveosl2hQ0)N(6a9O1pwp|>H1p~q zbuEdl=~w*CYB%+1)MkvV1%H4s^wzI9_ezH*gg}LzW73BAFc*vjkJch=7Hu8z+%5T! znRr|9oUf1(VQhHw~OUqO4r=$)|DIk z$`n0$skZVC`QP%t4{Hk^X%gsD+ftu*3E%O-tCc{_#_v!?TRdeGk7 z%y!AWk4iJ2Mn||u)5gEDNA2aBdFk(#6<~y^={DP*xz}&I)YQ>}G{d&x2rPHMi7+C2 zE2ak4-(p*4OeuX1yHf9%dBnEeXz|=H0tzED3u`|xAhpX0&tmxJz-)}om+3}zh26|B z!YF@hA=*IJtZ91kyzkk~X*jXb$rPNV8E3jOjCLrDI!#MqsGin{VoggyUfZ0F516K{ zdsZc;E(atD=4J)WUBN74hx_Xo7$eh3^S(E0x_OSSPHV3Go87F{wali=S!1G&znS-; zUOwI?v`JIuX`16#d)3KYcQ5~gbeCjID}4dl!TjT3*6p@jV>&dHY}*bE^%?@Ko9;Y8r6en}DaoYF-O&PCgsTb{2r}OCRGarzf&2S;$*UfW3 zhsZ{^8Q#+Ox>$i}+hJDVU1ccnGDlqPXo;qbgTdV1uVzeO?)GLjAB%v%nBmHTJI6`C z`_8<(MG-Nu$sFJVgI2+?W+@oHh&Y{&5&Sy_1~vrd|JE!K_HrmVv`tadW`xkoH2qn!?rgEaRZh|KV^M2Gb61g{-PV+m*69*?&5dJ`VBI zpsx%2Rg-7_Y0BJiAkw^U-St(NoZD>#U0W|;nbYQ@O#Dk%fD6q<(lLU9)@jOVP|$V# zVzJ{YCcefOfKtC`+F2N;*S=EqF4{op-Cc)DH+MXV2+eNn5uo7g7HMtc(+~_E7ik_xxlxvQZV<+mLziV`re4-#HW4>=@pwbK@K1 zFV&P3X!6N^bzB;=yvK>l+*zWMCie-yFlqPXTymn|PDSr$+-WC6rdwjH?OhdD$yRB~ za_IJ#{pw6!dp~0(Q(e;qSHqqaY#UrxzNV^esQS9L!Ky#E4Xtyx4Pge!2)eJil<}s$ z3K?%=tFDi)yp5WY4YRy#KwZgsf1Zs|@?2TET6M%!$~Nitvnx%d_+H(%`pddj0B?vH z;*hJ&RE#wDI(W?;T|+`n#Bau6>U2DlfSRBU@0dJit_GY#m4aggJDbZ#=(nY+S_TV`lgy;Qz2htjB{uj6K7iKS}M?pW)LNtQY?;z-rcBzMmnlL# zwp?P(M(cyNS<~I-fUS4tmuT3j+q#X;uJu2MfEaOM8k~uG+1ZdXiKJvpRdEiIu0iyB z7M#fi1M2Ct;;ZT(Fj-AFj12ci8oe)i+MLWfip(T+$-Bmo=T(f+$MeN{TX^y1b~Am| zJFw;S4KFyf#@l$WV)$L3GRGN7?z4@Fp35CceA?M)OI^5pzunxChZSYRS$YSaIB3EX z2h4JG)icj-`gFDQw_a8>+H{K<43&zG5&Tdd9uvdF#K8eIm4{qUSQ9H)b2D{}YG*BY z%{Z^?(18OF(<(G&Z6ro|wG#QHtv@F># zEd;r+5LDmwY0(+Qu9pTg%)?A1+I5MQ``hcO)FYPr4%A^MI>6_4s@GeqjnDiyi88~O z?wXr3an1p>#|N`_%sG(vtvLrul5!?uk_Z=FMqk;K#oMxXAT}GC|2_ioq?KPg{kw~| zp?l2Up=*Wb<)>h2V$a;a(Q?76^()dBJ;X>QN02t9(2k(N{QzdIPs4iB3L~8@D^@#i zKzNHbI)u5Ceq9YeX*Zh;kLR1)Q4m$3?PFNk{zMT4juGm#gh!P(?i4Z1b*yAb#+>Bg6`G zMKGVDH;v5FtFexeVmh|{+}L*==Gh#yG+~su(&1{(DZ>*3nlY~Qz{2mKB^!NN4_K5Y z_syV`?#vrc>u+=&qj?(HBe|Njt{lqVVYIk={Y+-s*@F50+RZpIw!|fPDV`QY^}p1o zj^~0OCPz8^#E6lR6*LCQRAZjI%4jN6F_CKwy0-F=j`p%(T8fjIlXdp$(LNE<{fU?v z8V~9AmLB8LFzr&ovi*L1Wk4{GzD4_cp9r}crZ^}P%teG zfSDFQ2Ls;WvVJvrCUbP3Cr78N^Mg{DGA-Q1>Vft%VB)W!r~=0bX6oWq@LZ~D=T-0w z0thT-?y0KCd2B`9s_MK4&=xTD^*nJpGov2UY|py$KFR~szTclVEI?k zsyz4zwBX|#&G^XLhL1m^ZEHVk$43F3{h$LM!8Uw6=)=dGt@y~NkD8tMNbkhQ#XIov zES+83g^zQ{`f-dP>QPuZ9G!lCnmWkU{CA4e)OoWolWRwF3NL>^R3=>3^U9QIpTZ9a z`C!nrWz1gp4(1Ea7QGQg;-1vW<{8*S0nW2Gj=KB=`dgF-g(;{)-w)v)0;65 z&=k~jGv>|zu49~lThpFfknR{S;KsB)dh&t^4u`m~A#Kn63`eSfHR(eOzT-#}uqyR= zz;ppC8O#u{JoR})g=7=Ng~#@#x)8vbt_-0iyZOjIqc7EEH}Btvsk(E#s1;SAZ5>#H zqv}?lM+8a72(^Vaf$@3LMd_kVdkLhq zh*|V6rK=MrqhVKR{qzdhAi;f|v#QQpnERAqlOjf@$n3teUAl-Df&wr-Ty>M3X4T)Mf~K;Spk3jEr$Z*(LLqny_f z@0c?chEsZs3`JFF;|5j`=IG+AW!^5v-8exkXkRyhG>$$P0w8Xup@~Nu`s0Ble&2Ex2vzm zbEue$y!s9%A??(_B%~f}^b$6+S+=w-K_V zvT?McK4gy-^mL0Y_1R24aj-p;*Np$7E!CK;VqUHInr#fuJf$ zOUDS6^aTvy@-%JYfhpoi{YSZ^BU?F1w@fipR{X8}ZU?Q(vekb>E&bQw=HSPJCQf6% z%W&A1W$<#MlvY?|H!&HK>Y9(ioX;3?U%e0F;@1w)JR22LjHb>Uh0<4R$^=cD^xhQF zH~xherHm$t1bbt*ECAwSu4eMyJ*CI2P6CgIGjpd1G2Wj%z=dNNk$KZp!TpA*vAx>V zA1}jLtzWos+DwA6p%^q?%i=D4^7p5zsdg5Qe-~_ESq>_su%1CGR#kbuv$A@Pvl_p; z^aY)pmgbcd6&B@hE-rGm1%l4<`Whv-%~`R$iGC0oYFblYUb}A7-omEx?rt}J zP}fu)Xz_M7HTt@`n<_U~7L*m_g}b_)3vk2cKyYVMD9{$}`{?aD-M+3s6L?hA6!6WD zOT-??m77+3AYT)`8=xuByrap>UR{tEAX!dw*3I}SeJkF0FgBT^0ArGIi`PFk`3Abi zDBtd}$+x>_tn&4=;OB*7l6hN4r*CXBrXTf>NzU!~1$byoa>ffZ#w1_*q4$_%?DvgL zllJ$HP16g~FSy4<6Crw~MbFr@5i4)eBaDsw(c6iSMeoA*2p)@^X_vErGdI^C@C16o z9$$ah=MQxR{Lb8y&8@k^-xTQf`I|e#o=|bo&O+=z4VK^?^tE;b@iSFEJMDoj`lz(+~MC2SyJscd8-cpdttnXK%%y8>xK@jo-Oz2F9nFYGnC)hx_N`yIJJ+CQLe2&KOG{l% zRB!wZ6``ieu4Z3rtFP5b!E!TR_R{WLnpfQ94R$qk_*2laq%-Fh{ zCB?-jDO`>uvf&W^FCS#m<2CfeVUoC&v+a61XNb85I9TDuuz zw^LboA^{Gjt`d$WF?$nP(oGDdeE!wdjn+iwCvGU!62Q{K*gBfhW$qJmG~EeDlW;T% zM{_bBy!roNAVp7ijIE<7D=t3~M-wxUf}DwgRAL~N7)YHO1F7yF>*234_C2L1!S_&K zht*>)aKZ^CoKV6Eof1xnKO{P~4rpn~2|bU)L`%4ugsVxonp4Bo@W;l-*w<8)eEfkH zf37m&dJ?WD;d)L9*JJ&zWNcl}vXY`vxt=(mY2vacoKeCVC7jVI;f&Z%(Z<#ll`maA z7OsdSPdK84BT6`;Q^FDP->#0aCn_HkPsBt|xT1tBO1Pp^!WFS!yN|6WTD|6kexyZ` zB^*t{(Igzrso`ko^%rC7XetU$$k9YU>qD>UNVuJZ+ex^cQ^M_7Z^s#9$Fq8L6VTQR z2cjJhmo(ve60RrVdQJ(~6M22s7(1WJ(K(+uSHI{z2%-cDr<8C?38!=_IVJIqt>GaV z-oV<`e6rpHR#-L`t6;J33=HA@MJN5;Mb6w1-p^ID;tXeQA5MaJDOp2fd3~d2P5t^B z&zkD;hPC{CUU+lb@cX>zWnNBtnb(-SPAL@gBEzxmP%4YYWaWT$DA5H;^ec&eCDE^( z68(zxBGj?=OckT*SB^W*=8`5{Pr~&iT+b=tdf1zi$JX(zDLtVd(vV~cN0V?g2}kq4 z;AmRJaIq#Yupk&Nt?`6A^SmzMC`KOd(o36%2YDC=dK$JiG*;GlR&T7Tb`$p0uJ=^c zR&FV;X!Lm4h4pofo|;N`)y5j@LgU(vHLE?$lRis=T~>{Ku=B^FzUwe2j|n z@yh1To>sgEx&dR(kn_U{!tFg>&G}M+F!BvJtuo2i1Bz0=<+=?(ZTdF_}R3Ho;RVA}wC{e3tP9_Yp!%yBW$-9cY{ z-5uDc;LEfUZll78*shd1$?!wP@As`p}hRt#4I{G+9hQzEcpWr=DhR`DX$9%^s)$kF4+Y8J*K9^f48BLI@OT$GzhOF#pGmF;+!U+KeSiDoyAz zW`K@{E!0Ibdcz}z$W>^s8(WPwcZ5R;tNh3@7;E0g)l-yKkDDS^!wDn(u#rY7F4|I~ zNl<3z?y|Ckss3|Q{g95L%=AN4S*r>2{IGdO6c%lo!+?2uC~6i?D~j?83lw8~a*bVesI(>b z41KW*LSCpH(@bG+GtR{KKo{Zi0;R4{sVmB@D^}`Ca_g2Tb!AH3G9{1g=;!e^HwS&a z5ft?LxBEf@wqcV;p8y^HwtzUN{RAWDffjMvH+1`a zt$gQ31zeyRM7K(7PgmCfX(_nL3lj(iTCqR-QgLGG2nyjUDzmYA=neTAu){Hy7x)!wfecr*_VX)M7}ZPpH1u_ZTiT@yn}Z!;AIHtau8KNi@$~fs~2#tJVvM>-CKS$&WD1nPLKW2JYM;Z`$!r4&FII< z!TRx+Qcs(?*ZW$0@DQs9!oH{r+=YDDr^q+Or0K8nv%Q3Uq0m3es=wOj-yUxNr%4)U zH+a@jGk%STfkItq8YHFFAr-=*@~){cZa)^UA<92TQ9_ct)vUYEoKos&+ z`dgK}>I%5|>WUKO?4GXf#z2Fwvkj4zKa8x(gpZ(SRjj^bY>E)`05n2E){&3SVx!$& zn8E_M@UD)|&W@0;CE#zxS_xJ;C>V)vyJyR)+4D-u7Iax%t*d)FI$JB+eJwj1db+G@ z(5)YOw-7=f@RBaTcUHApMDn9yZ@4F9VQWY0XjIYZ^9G|Y)p+}(FVqEn-B<&TzF6=mFL&*^XM?hJT^Yz+h0Fx#R^1Z;$kfSMIK#ET4}!zeGf1$u%l zh_#^_g(_~VL6;_3yx<^ z*mTIg_o%2en zU@D^12e`@V-tt;{Lg7Fcg{1H$IXSBluPV_O*%aPCqf}!E8CL3j+gT2c#KB4)bB!nD zeuqCp5z5KIq(cuANtV!4&|laBG3(1~q6*?^s5*yAV~NlD-C@+wvD=EfS=`1H!=h*2 z`?6r1pR%hFPs|c-@&!BE2BNRI@q;UV1G<}yAzzSs8B!5~{~(1t72Q3I6~0;jAktvM zhG;dut_m!~VYCLXO~dp6+I$Aq=qX6^~!97t_hKO8SQ{`EUu?Buk zr>yk`@i1CXXE<`DVN*rqyv~Oa$)*TIB-_~0vNM9+HRT1Ks`?EgGvLA)Toi+gW3Y$y zRPx2j`WjCglSsuEN-~>wDWg^*-v^V{RxsZZ?IU<7HFm z`KWBxMCqi?y*jGs)pb>kQ5PC2&hk{$Z1hxba^r6^K}q1v?)6c)zM@7ZBe$Z80#6N| zTl57z4VVG-$>cTFm0POtu<5WZRM$1sRYmbI=ydn#(`qHuNHM*Om|&{N;v z*e|E!*9$&$-R)zBQ`JzCalAAJ z15#KE&x^!LIi9c!hSzvII(rb};|>Zqr3^W=ZUFEg+$Hxre5Hh6qWJ)2H6~q{B1ou7G4c&69q1-JG-UHM(}SuPsO@O{v=^#ty>Y7c_Lo(!9bU%C*<=KEUWSEUbd{f zv3Chu1&R8g<(_jRSB`#=6gj7pBqf=DSyyeiq9`*Wi3~<}O4tPbQo~BFaQY1rCVIC$ zn!aDcM1M`f#Q%tdiN0-I^!=?8Ci<4~(e!N+CiqF*Cny8ku_Q~CoErt}9;WPIUBX8FA!VY>e%36twR zP$1H$D3Pkb^(5u!2le>=g4KR?$hQ?(97Mkg;0fGM`KU^YvLD~yELNP%0fIB687I3$O>wx9{W-GAV-!ubnk@}aNz)cbk z18w(_!S911N^Fl ze-8YbgkJ&vqlEted_=-;0>3TczXHE2;UpdYQo;^kMe2Vi11Cv%HgJlB7XXi!a3OHI zgqH(Pl5hp^R0&rD&yes&V5fx70~QDK55R|D@2hZ;{J~woP;eE&3YZxsb2g!drkdasOfqZwD?1KHI|m zz)R2x9kcMoz~c+y{~;&U|5d>0MZ@?u;A;5qSCO9lBlQogv%t6TcX^RA7z)+*of4+{ zPDdX6;QhsCBuw@Ff`qBQQz0)u42AsNBngwhTP0!gck+0I{N0rjo&4Q35+;8qk5|aw zl|UbYANjk5(67Mc?{cL2Cx0i8Z^++;B|7=LehHJm8S4x=t-8B*>e|Lj~$=}^1Ve)skNtpcI9TL79b#VYyOy$>MZx2Q4X1M*Vjj?Ze zyhiOu9ymbrboV=(D^ykx(m-${~vl744MnDmo-Z5>i1CzQ~k>G1603%l;~8yMr5^EkiX55=;Ut~NSOTXVhNMKEs!wz z+Y$+rzg;Tf^HE>>XEA21zq|xkj4!Fat_2nc#WP2NX}rkm+hFmR81GX0zs97u!FP)o zM^kLdMBog%83$pC4VGEs6|%pDz=aad2VN)P<-p?5Aw>mYD?c6ik^fDR#y@qSYnJ_! zd|RaZsXX5WKFrOZ^(S=yQmegEdTM{QQv0R$CeJTXdwW=-Q+s<+E zACxfJ`ymOFy+12qviBDxO!j_Q!es9+Nto>Y6$$?!ru+tC(QQ)urSgZR{)@_gmDGQc z|G81Zq>p)v4oaBxaY(|$u`>6UwUGCNG)2iqI*0sj^_$HLzOt^!_R;eQ97i}5qQ z*!{2K#12eDRLbui;5kSy8_D5)$dIbruq$oA3wN%-z#CN-#a8s^?SF3j{rX^VY2rWl%F4lLiX;IFxmSG z36s6AkuceNyM)QV@0Kw6_lG4+{{0^kCjagvWwOIi$iK_;?d0F(`F8T}@_ak_cX_^@ z{QIj?e&pX%r1=-}@A7;+`FE#8C;u+b&&T@Luc7|L{2tZcJ;351|3-8%e@^s=fx9LD ze;_9PGr-woJUA%*i@*gIrtvD_)iJnQ!f$}yDB)wk;t=v&W$~x{DnM`)eh6?m7;=UZVf`IP@lo zPX6>fsXWJylfGR_e@3LOas7NY1|N#SQzLDOr$09a-xGu1jlq?Xw!rVd1ep43;a|Qf z(KBFQk4NDo zgpYo3MHEg_ZkBL5=ywCpLHS4x6JS3N0p|k`S@?0_yMWs)dcnL7R7{8ZrQUy#yPHG=-1N(rfNf1^r7aoxAPXitR zrjVKFQ-H4qKEuMZfqx2&Zkf^N13wR(XW?bQDt!843vUL_m2eNR7g)%5A#e{cxqRYx zIq=oMLLdJE{3R*8Span8N%QF2G|EI z(*HN`1;8+KmjC;}*8&T9(xAwjfe%~sIlxaM@hx!5B)YGm&f31fLBWN zTY=X}_$$Ecfkk_L2)F@Q=BS|VjYx@=ww2Xbht=5q5H)l(#^pIk&g61x*49|;e3fcAAi&asLTfx#YxY| zIB_lxkzXz@MAE@dDBUsYEUZJMD*zVh$R5};H&QyH5#M6#8(-|8bki+=FRoF#a{SS^ zI9`CjYpu9XTqAlN{^WEsitv01>R&#HelGsxbSX88a=l+p#pxX}>2CWj{L6VCPS+EY z?v-h<7ZJEy$%)^mW70j02P|$Rhost data packet. */ +#define BOOT_COM_RS232_TX_MAX_DATA (64) +/** \brief Configure number of bytes in the host->target data packet. */ +#define BOOT_COM_RS232_RX_MAX_DATA (64) +/** \brief Select the desired UART peripheral as a zero based index. */ +#define BOOT_COM_RS232_CHANNEL_INDEX (0) + +/* The CAN communication interface is selected by setting the BOOT_COM_CAN_ENABLE + * configurable to 1. Configurable BOOT_COM_CAN_BAUDRATE selects the communication speed + * in bits/second. Two CAN messages are reserved for communication with the host. The + * message identifier for sending data from the target to the host is configured with + * BOOT_COM_CAN_TXMSG_ID. The one for receiving data from the host is configured with + * BOOT_COM_CAN_RXMSG_ID. Note that an extended 29-bit CAN identifier is configured by + * OR-ing with mask 0x80000000. The maximum amount of data bytes in a message for data + * transmission and reception is set through BOOT_COM_CAN_TX_MAX_DATA and + * BOOT_COM_CAN_RX_MAX_DATA, respectively. It is common for a microcontroller to have more + * than 1 CAN controller on board. The zero-based BOOT_COM_CAN_CHANNEL_INDEX selects the + * CAN controller channel. + * + */ +/** \brief Enable/disable CAN transport layer. */ +#define BOOT_COM_CAN_ENABLE (1) +/** \brief Configure the desired CAN baudrate. */ +#define BOOT_COM_CAN_BAUDRATE (500000) +/** \brief Configure CAN message ID target->host. */ +#define BOOT_COM_CAN_TX_MSG_ID (0x7E1 /*| 0x80000000*/) +/** \brief Configure number of bytes in the target->host CAN message. */ +#define BOOT_COM_CAN_TX_MAX_DATA (8) +/** \brief Configure CAN message ID host->target. */ +#define BOOT_COM_CAN_RX_MSG_ID (0x667 /*| 0x80000000*/) +/** \brief Configure number of bytes in the host->target CAN message. */ +#define BOOT_COM_CAN_RX_MAX_DATA (8) +/** \brief Select the desired CAN peripheral as a zero based index. */ +#define BOOT_COM_CAN_CHANNEL_INDEX (0) + + +/**************************************************************************************** +* B A C K D O O R E N T R Y C O N F I G U R A T I O N +****************************************************************************************/ +/* It is possible to implement an application specific method to force the bootloader to + * stay active after a reset. Such a backdoor entry into the bootloader is desired in + * situations where the user program does not run properly and therefore cannot + * reactivate the bootloader. By enabling these hook functions, the application can + * implement the backdoor, which overrides the default backdoor entry that is programmed + * into the bootloader. When desired for security purposes, these hook functions can + * also be implemented in a way that disables the backdoor entry altogether. + */ +/** \brief Enable/disable the backdoor override hook functions. */ +#define BOOT_BACKDOOR_HOOKS_ENABLE (0) + + +/**************************************************************************************** +* N O N - V O L A T I L E M E M O R Y D R I V E R C O N F I G U R A T I O N +****************************************************************************************/ +/* The NVM driver typically supports erase and program operations of the internal memory + * present on the microcontroller. Through these hook functions the NVM driver can be + * extended to support additional memory types such as external flash memory and serial + * eeproms. The size of the internal memory in kilobytes is specified with configurable + * BOOT_NVM_SIZE_KB. If desired the internal checksum writing and verification method can + * be overridden with a application specific method by enabling configuration switch + * BOOT_NVM_CHECKSUM_HOOKS_ENABLE. + */ +/** \brief Enable/disable the NVM hook function for supporting additional memory devices. */ +#define BOOT_NVM_HOOKS_ENABLE (0) +/** \brief Configure the size of the default memory device (typically flash EEPROM). */ +#define BOOT_NVM_SIZE_KB (256) +/** \brief Enable/disable hooks functions to override the user program checksum handling. */ +#define BOOT_NVM_CHECKSUM_HOOKS_ENABLE (0) + + +/**************************************************************************************** +* W A T C H D O G D R I V E R C O N F I G U R A T I O N +****************************************************************************************/ +/* The COP driver cannot be configured internally in the bootloader, because its use + * and configuration is application specific. The bootloader does need to service the + * watchdog in case it is used. When the application requires the use of a watchdog, + * set BOOT_COP_HOOKS_ENABLE to be able to initialize and service the watchdog through + * hook functions. + */ +/** \brief Enable/disable the hook functions for controlling the watchdog. */ +#define BOOT_COP_HOOKS_ENABLE (1) + + +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y C O N F I G U R A T I O N +****************************************************************************************/ +/* A security mechanism can be enabled in the bootloader's XCP module by setting configu- + * rable BOOT_XCP_SEED_KEY_ENABLE to 1. Before any memory erase or programming + * operations can be performed, access to this resource need to be unlocked. + * In the Microboot settings on tab "XCP Protection" you need to specify a DLL that + * implements the unlocking algorithm. The demo programs are configured for the (simple) + * algorithm in "libseednkey.dll". The source code for this DLL is available so it can be + * customized to your needs. + * During the unlock sequence, Microboot requests a seed from the bootloader, which is in + * the format of a byte array. Using this seed the unlock algorithm in the DLL computes + * a key, which is also a byte array, and sends this back to the bootloader. The + * bootloader then verifies this key to determine if programming and erase operations are + * permitted. + * After enabling this feature the hook functions XcpGetSeedHook() and XcpVerifyKeyHook() + * are called by the bootloader to obtain the seed and to verify the key, respectively. + */ +#define BOOT_XCP_SEED_KEY_ENABLE (0) + + +#endif /* BLT_CONF_H */ +/*********************************** end of blt_conf.h *********************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/boot.dox b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/boot.dox new file mode 100644 index 00000000..b81a6301 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/boot.dox @@ -0,0 +1,7 @@ +/** +\defgroup Boot_ARMCM0_S32K14_S32K118EVB_IAR Bootloader +\brief Bootloader. +\ingroup ARMCM0_S32K14_S32K118EVB_IAR +*/ + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/hooks.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/hooks.c new file mode 100644 index 00000000..3bd5251b --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/hooks.c @@ -0,0 +1,307 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/hooks.c +* \brief Bootloader callback source file. +* \ingroup Boot_ARMCM0_S32K14_S32K118EVB_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#include "led.h" /* LED driver header */ +#include "device_registers.h" /* device registers */ + + +/**************************************************************************************** +* B A C K D O O R E N T R Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_BACKDOOR_HOOKS_ENABLE > 0) +/************************************************************************************//** +** \brief Initializes the backdoor entry option. +** \return none. +** +****************************************************************************************/ +void BackDoorInitHook(void) +{ +} /*** end of BackDoorInitHook ***/ + + +/************************************************************************************//** +** \brief Checks if a backdoor entry is requested. +** \return BLT_TRUE if the backdoor entry is requested, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool BackDoorEntryHook(void) +{ + /* default implementation always activates the bootloader after a reset */ + return BLT_TRUE; +} /*** end of BackDoorEntryHook ***/ +#endif /* BOOT_BACKDOOR_HOOKS_ENABLE > 0 */ + + +/**************************************************************************************** +* C P U D R I V E R H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_CPU_USER_PROGRAM_START_HOOK > 0) +/************************************************************************************//** +** \brief Callback that gets called when the bootloader is about to exit and +** hand over control to the user program. This is the last moment that +** some final checking can be performed and if necessary prevent the +** bootloader from activiting the user program. +** \return BLT_TRUE if it is okay to start the user program, BLT_FALSE to keep +** keep the bootloader active. +** +****************************************************************************************/ +blt_bool CpuUserProgramStartHook(void) +{ + /* additional and optional backdoor entry through the pushbutton (SW2) on the board. to + * force the bootloader to stay active after reset, keep it pressed during reset. + */ + if ((PTD->PDIR & GPIO_PDIR_PDI(1 << 3U)) != 0U) + { + /* pushbutton pressed, so do not start the user program and keep the + * bootloader active instead. + */ + return BLT_FALSE; + } + + /* clean up the LED driver */ + LedBlinkExit(); + + /* okay to start the user program */ + return BLT_TRUE; +} /*** end of CpuUserProgramStartHook ***/ +#endif /* BOOT_CPU_USER_PROGRAM_START_HOOK > 0 */ + + +/**************************************************************************************** +* W A T C H D O G D R I V E R H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_COP_HOOKS_ENABLE > 0) +/************************************************************************************//** +** \brief Callback that gets called at the end of the internal COP driver +** initialization routine. It can be used to configure and enable the +** watchdog. +** \return none. +** +****************************************************************************************/ +void CopInitHook(void) +{ + /* this function is called upon initialization. might as well use it to initialize + * the LED driver. It is kind of a visual watchdog anyways. + */ + LedBlinkInit(100); +} /*** end of CopInitHook ***/ + + +/************************************************************************************//** +** \brief Callback that gets called at the end of the internal COP driver +** service routine. This gets called upon initialization and during +** potential long lasting loops and routine. It can be used to service +** the watchdog to prevent a watchdog reset. +** \return none. +** +****************************************************************************************/ +void CopServiceHook(void) +{ + /* run the LED blink task. this is a better place to do it than in the main() program + * loop. certain operations such as flash erase can take a long time, which would cause + * a blink interval to be skipped. this function is also called during such operations, + * so no blink intervals will be skipped when calling the LED blink task here. + */ + LedBlinkTask(); +} /*** end of CopServiceHook ***/ +#endif /* BOOT_COP_HOOKS_ENABLE > 0 */ + + +/**************************************************************************************** +* N O N - V O L A T I L E M E M O R Y D R I V E R H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_NVM_HOOKS_ENABLE > 0) +/************************************************************************************//** +** \brief Callback that gets called at the start of the internal NVM driver +** initialization routine. +** \return none. +** +****************************************************************************************/ +void NvmInitHook(void) +{ +} /*** end of NvmInitHook ***/ + + +/************************************************************************************//** +** \brief Callback that gets called at the start of a firmware update to reinitialize +** the NVM driver. +** \return none. +** +****************************************************************************************/ +void NvmReinitHook(void) +{ +} /*** end of NvmReinitHook ***/ + + +/************************************************************************************//** +** \brief Callback that gets called at the start of the NVM driver write +** routine. It allows additional memory to be operated on. If the address +** is not within the range of the additional memory, then +** BLT_NVM_NOT_IN_RANGE must be returned to indicate that the data hasn't +** been written yet. +** \param addr Start address. +** \param len Length in bytes. +** \param data Pointer to the data buffer. +** \return BLT_NVM_OKAY if successful, BLT_NVM_NOT_IN_RANGE if the address is +** not within the supported memory range, or BLT_NVM_ERROR is the write +** operation failed. +** +****************************************************************************************/ +blt_int8u NvmWriteHook(blt_addr addr, blt_int32u len, blt_int8u *data) +{ + return BLT_NVM_NOT_IN_RANGE; +} /*** end of NvmWriteHook ***/ + + +/************************************************************************************//** +** \brief Callback that gets called at the start of the NVM driver erase +** routine. It allows additional memory to be operated on. If the address +** is not within the range of the additional memory, then +** BLT_NVM_NOT_IN_RANGE must be returned to indicate that the memory +** hasn't been erased yet. +** \param addr Start address. +** \param len Length in bytes. +** \return BLT_NVM_OKAY if successful, BLT_NVM_NOT_IN_RANGE if the address is +** not within the supported memory range, or BLT_NVM_ERROR is the erase +** operation failed. +** +****************************************************************************************/ +blt_int8u NvmEraseHook(blt_addr addr, blt_int32u len) +{ + return BLT_NVM_NOT_IN_RANGE; +} /*** end of NvmEraseHook ***/ + + +/************************************************************************************//** +** \brief Callback that gets called at the end of the NVM programming session. +** \return BLT_TRUE is successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool NvmDoneHook(void) +{ + return BLT_TRUE; +} /*** end of NvmDoneHook ***/ +#endif /* BOOT_NVM_HOOKS_ENABLE > 0 */ + + +#if (BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0) +/************************************************************************************//** +** \brief Verifies the checksum, which indicates that a valid user program is +** present and can be started. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool NvmVerifyChecksumHook(void) +{ + return BLT_TRUE; +} /*** end of NvmVerifyChecksum ***/ + + +/************************************************************************************//** +** \brief Writes a checksum of the user program to non-volatile memory. This is +** performed once the entire user program has been programmed. Through +** the checksum, the bootloader can check if a valid user programming is +** present and can be started. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool NvmWriteChecksumHook(void) +{ + return BLT_TRUE; +} +#endif /* BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0 */ + + +/**************************************************************************************** +* S E E D / K E Y S E C U R I T Y H O O K F U N C T I O N S +****************************************************************************************/ + +#if (BOOT_XCP_SEED_KEY_ENABLE > 0) +/************************************************************************************//** +** \brief Provides a seed to the XCP master that will be used for the key +** generation when the master attempts to unlock the specified resource. +** Called by the GET_SEED command. +** \param resource Resource that the seed if requested for (XCP_RES_XXX). +** \param seed Pointer to byte buffer wher the seed will be stored. +** \return Length of the seed in bytes. +** +****************************************************************************************/ +blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed) +{ + /* request seed for unlocking ProGraMming resource */ + if ((resource & XCP_RES_PGM) != 0) + { + seed[0] = 0x55; + } + + /* return seed length */ + return 1; +} /*** end of XcpGetSeedHook ***/ + + +/************************************************************************************//** +** \brief Called by the UNLOCK command and checks if the key to unlock the +** specified resource was correct. If so, then the resource protection +** will be removed. +** \param resource resource to unlock (XCP_RES_XXX). +** \param key pointer to the byte buffer holding the key. +** \param len length of the key in bytes. +** \return 1 if the key was correct, 0 otherwise. +** +****************************************************************************************/ +blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len) +{ + /* suppress compiler warning for unused parameter */ + len = len; + + /* the example key algorithm in "libseednkey.dll" works as follows: + * - PGM will be unlocked if key = seed - 1 + */ + + /* check key for unlocking ProGraMming resource */ + if ((resource == XCP_RES_PGM) && (key[0] == (0x55-1))) + { + /* correct key received for unlocking PGM resource */ + return 1; + } + + /* still here so key incorrect */ + return 0; +} /*** end of XcpVerifyKeyHook ***/ +#endif /* BOOT_XCP_SEED_KEY_ENABLE > 0 */ + + +/*********************************** end of hooks.c ************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.dep b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.dep new file mode 100644 index 00000000..4098019d --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.dep @@ -0,0 +1,716 @@ + + + 4 + 688922450 + + Debug + + $PROJ_DIR$\..\lib\startup.c + $PROJ_DIR$\..\main.c + $PROJ_DIR$\..\timer.h + $PROJ_DIR$\..\obj\s32k118.pbd + $PROJ_DIR$\..\boot.c + $PROJ_DIR$\..\obj\timer.xcl + $PROJ_DIR$\..\lib\S32K118_features.h + $PROJ_DIR$\..\lib\startup.h + $PROJ_DIR$\..\startup_S32K118.s + $PROJ_DIR$\..\obj\system_S32K118.xcl + $PROJ_DIR$\..\bin\demoprog_s32k118.out + $PROJ_DIR$\..\led.h + $PROJ_DIR$\..\obj\system_S32K118.__cstat.et + $PROJ_DIR$\..\obj\boot.o + $PROJ_DIR$\..\obj\led.o + $PROJ_DIR$\..\timer.c + $PROJ_DIR$\..\obj\timer.o + $PROJ_DIR$\..\obj\timer.__cstat.et + $PROJ_DIR$\..\obj\led.xcl + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\..\obj\boot.xcl + $PROJ_DIR$\..\obj\main.o + $PROJ_DIR$\..\lib\system_S32K118.c + $PROJ_DIR$\..\lib\system_S32K118.h + $PROJ_DIR$\..\obj\main.xcl + $PROJ_DIR$\..\header.h + $PROJ_DIR$\..\led.c + $PROJ_DIR$\..\obj\startup.xcl + $PROJ_DIR$\..\obj\startup_S32K118.o + $PROJ_DIR$\..\obj\startup.__cstat.et + $PROJ_DIR$\..\boot.h + $PROJ_DIR$\..\obj\system_S32K118.o + $PROJ_DIR$\..\lib\devassert.h + $PROJ_DIR$\..\lib\device_registers.h + $PROJ_DIR$\..\lib\s32_core_cm0.h + $PROJ_DIR$\..\lib\S32K118.h + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $PROJ_DIR$\..\obj\boot.__cstat.et + $TOOLKIT_DIR$\lib\m6M_tl.a + $TOOLKIT_DIR$\inc\c\stdint.h + $TOOLKIT_DIR$\lib\rt6M_tl.a + $PROJ_DIR$\..\S32K118_25_flash.icf + $PROJ_DIR$\..\obj\demoprog_s32k118.map + $TOOLKIT_DIR$\lib\shb_l.a + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $TOOLKIT_DIR$\inc\c\ycheck.h + $PROJ_DIR$\..\obj\main.__cstat.et + $PROJ_DIR$\..\obj\led.__cstat.et + $PROJ_DIR$\..\bin\demoprog_s32k118.srec + $TOOLKIT_DIR$\inc\c\stdbool.h + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\lib\dl6M_tln.a + $PROJ_DIR$\..\obj\startup.o + $PROJ_DIR$\..\blt_conf.h + $PROJ_DIR$\..\obj\cpu_comp.__cstat.et + $PROJ_DIR$\..\obj\cpu.__cstat.et + $PROJ_DIR$\..\obj\flash.__cstat.et + $PROJ_DIR$\..\obj\assert.__cstat.et + $PROJ_DIR$\..\obj\can.__cstat.et + $PROJ_DIR$\..\obj\cop.__cstat.et + $PROJ_DIR$\..\obj\net.__cstat.et + $PROJ_DIR$\..\obj\nvm.__cstat.et + $PROJ_DIR$\..\obj\rs232.__cstat.et + $PROJ_DIR$\..\obj\backdoor.__cstat.et + $PROJ_DIR$\..\obj\hooks.__cstat.et + $PROJ_DIR$\..\obj\com.__cstat.et + $PROJ_DIR$\..\obj\file.__cstat.et + $PROJ_DIR$\..\obj\xcp.__cstat.et + $PROJ_DIR$\..\..\..\..\Source\com.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\nvm.c + $PROJ_DIR$\..\..\..\..\Source\boot.c + $PROJ_DIR$\..\..\..\..\Source\boot.h + $PROJ_DIR$\..\..\..\..\Source\com.h + $PROJ_DIR$\..\..\..\..\Source\file.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\flash.h + $PROJ_DIR$\..\..\..\..\Source\assert.c + $PROJ_DIR$\..\obj\cpu_comp.xcl + $PROJ_DIR$\..\..\..\..\Source\file.h + $PROJ_DIR$\..\..\..\..\Source\net.c + $PROJ_DIR$\..\..\..\..\Source\net.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\rs232.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\types.h + $PROJ_DIR$\..\obj\cpu_comp.o + $PROJ_DIR$\..\..\..\..\Source\can.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\timer.c + $PROJ_DIR$\..\..\..\..\Source\cop.h + $PROJ_DIR$\..\..\..\..\Source\nvm.h + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\cpu.c + $PROJ_DIR$\..\..\..\..\Source\assert.h + $PROJ_DIR$\..\..\..\..\Source\backdoor.c + $PROJ_DIR$\..\..\..\..\Source\backdoor.h + $PROJ_DIR$\..\..\..\..\Source\cpu.h + $PROJ_DIR$\..\..\..\..\Source\cop.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\can.c + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\flash.c + $PROJ_DIR$\..\..\..\..\Source\plausibility.h + $PROJ_DIR$\..\bin\openblt_s32k118.srec + $PROJ_DIR$\..\obj\flash.o + $PROJ_DIR$\..\obj\flash.xcl + $PROJ_DIR$\..\obj\nvm.xcl + $PROJ_DIR$\..\obj\rs232.xcl + $PROJ_DIR$\..\obj\nvm.o + $PROJ_DIR$\..\obj\can.o + $PROJ_DIR$\..\bin\openblt_s32k118.out + $PROJ_DIR$\..\obj\cpu.o + $PROJ_DIR$\..\obj\rs232.o + $PROJ_DIR$\..\obj\can.xcl + $PROJ_DIR$\..\obj\cpu.xcl + $PROJ_DIR$\..\..\..\..\Source\usb.h + $PROJ_DIR$\..\..\..\..\Source\rs232.h + $PROJ_DIR$\..\..\..\..\Source\xcp.c + $PROJ_DIR$\..\hooks.c + $PROJ_DIR$\..\..\..\..\Source\xcp.h + $PROJ_DIR$\..\..\..\..\Source\timer.h + $PROJ_DIR$\..\obj\assert.o + $PROJ_DIR$\..\obj\com.xcl + $PROJ_DIR$\..\obj\net.xcl + $PROJ_DIR$\..\obj\xcp.o + $PROJ_DIR$\..\obj\backdoor.xcl + $PROJ_DIR$\..\obj\backdoor.o + $PROJ_DIR$\..\obj\assert.xcl + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\IAR\cpu_comp.c + $PROJ_DIR$\..\obj\com.o + $PROJ_DIR$\..\obj\file.o + $PROJ_DIR$\..\obj\file.xcl + $PROJ_DIR$\..\obj\net.o + $PROJ_DIR$\..\obj\xcp.xcl + $PROJ_DIR$\..\obj\cop.xcl + $PROJ_DIR$\..\obj\cop.o + $PROJ_DIR$\..\obj\hooks.o + $PROJ_DIR$\..\obj\hooks.xcl + $TOOLKIT_DIR$\inc\c\string.h + $PROJ_DIR$\..\obj\openblt_s32k118.map + $TOOLKIT_DIR$\inc\c\ysizet.h + $TOOLKIT_DIR$\inc\c\ctype.h + $TOOLKIT_DIR$\inc\c\DLib_Product_string.h + + + [ROOT_NODE] + + + ILINK + 103 132 + + + + + $PROJ_DIR$\..\lib\startup.c + + + ICCARM + 52 + + + __cstat + 29 + + + BICOMP + 27 + + + + + ICCARM + 7 39 45 19 36 44 50 33 34 35 6 32 49 + + + + + $PROJ_DIR$\..\main.c + + + ICCARM + 21 + + + __cstat + 46 + + + BICOMP + 24 + + + + + ICCARM + 71 81 88 53 95 91 85 86 113 90 77 72 112 33 34 35 39 45 19 36 44 50 6 32 49 23 + + + + + $PROJ_DIR$\..\boot.c + + + ICCARM + 13 + + + __cstat + 37 + + + BICOMP + 20 + + + + + ICCARM + 25 53 30 11 2 33 34 35 39 45 19 36 44 50 6 32 49 23 + + + + + $PROJ_DIR$\..\startup_S32K118.s + + + AARM + 28 + + + + + $PROJ_DIR$\..\bin\demoprog_s32k118.out + + + OBJCOPY + 48 + + + + + ILINK + 41 13 14 21 52 28 31 16 43 40 38 51 + + + + + $PROJ_DIR$\..\timer.c + + + ICCARM + 16 + + + __cstat + 17 + + + BICOMP + 5 + + + + + ICCARM + 25 53 30 11 2 33 34 35 39 45 19 36 44 50 6 32 49 23 + + + + + $PROJ_DIR$\..\lib\system_S32K118.c + + + ICCARM + 31 + + + __cstat + 12 + + + BICOMP + 9 + + + + + ICCARM + 33 34 35 39 45 19 36 44 50 6 32 49 23 + + + + + $PROJ_DIR$\..\led.c + + + ICCARM + 14 + + + __cstat + 47 + + + BICOMP + 18 + + + + + ICCARM + 71 81 88 53 95 91 85 86 113 90 77 72 112 11 33 34 35 39 45 19 36 44 50 6 32 49 + + + + + $PROJ_DIR$\..\..\..\..\Source\com.c + + + ICCARM + 122 + + + __cstat + 65 + + + BICOMP + 115 + + + + + ICCARM + 71 81 88 53 95 91 85 86 113 90 77 72 112 83 109 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\nvm.c + + + ICCARM + 101 + + + __cstat + 61 + + + BICOMP + 99 + + + + + ICCARM + 71 81 88 53 95 91 85 86 113 90 77 72 112 74 + + + + + $PROJ_DIR$\..\..\..\..\Source\boot.c + + + ICCARM + 13 + + + __cstat + 37 + + + BICOMP + 20 + + + + + ICCARM + 71 81 88 53 95 91 85 86 113 90 77 72 112 + + + + + $PROJ_DIR$\..\..\..\..\Source\file.c + + + ICCARM + 123 + + + __cstat + 66 + + + BICOMP + 124 + + + + + ICCARM + 71 81 88 53 95 91 85 86 113 90 77 72 112 131 45 19 36 44 50 133 135 134 + + + + + $PROJ_DIR$\..\..\..\..\Source\assert.c + + + ICCARM + 114 + + + __cstat + 57 + + + BICOMP + 120 + + + + + ICCARM + 71 81 88 53 95 91 85 86 113 90 77 72 112 + + + + + $PROJ_DIR$\..\..\..\..\Source\net.c + + + ICCARM + 125 + + + __cstat + 60 + + + BICOMP + 116 + + + + + ICCARM + 71 81 88 53 95 91 85 86 113 90 77 72 112 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\rs232.c + + + ICCARM + 105 + + + __cstat + 62 + + + BICOMP + 100 + + + + + ICCARM + 71 81 88 53 95 91 85 86 113 90 77 72 112 33 34 35 39 45 19 36 44 50 6 32 49 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\timer.c + + + ICCARM + 16 + + + __cstat + 17 + + + BICOMP + 5 + + + + + ICCARM + 71 81 88 53 95 91 85 86 113 90 77 72 112 33 34 35 39 45 19 36 44 50 6 32 49 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\cpu.c + + + ICCARM + 104 + + + __cstat + 55 + + + BICOMP + 107 + + + + + ICCARM + 71 81 88 53 95 91 85 86 113 90 77 72 112 33 34 35 39 45 19 36 44 50 6 32 49 + + + + + $PROJ_DIR$\..\..\..\..\Source\backdoor.c + + + ICCARM + 119 + + + __cstat + 63 + + + BICOMP + 118 + + + + + ICCARM + 71 81 88 53 95 91 85 86 113 90 77 72 112 + + + + + $PROJ_DIR$\..\..\..\..\Source\cop.c + + + ICCARM + 128 + + + __cstat + 59 + + + BICOMP + 127 + + + + + ICCARM + 71 81 88 53 95 91 85 86 113 90 77 72 112 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\can.c + + + ICCARM + 102 + + + __cstat + 58 + + + BICOMP + 106 + + + + + ICCARM + 71 81 88 53 95 91 85 86 113 90 77 72 112 33 34 35 39 45 19 36 44 50 6 32 49 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\flash.c + + + ICCARM + 97 + + + __cstat + 56 + + + BICOMP + 98 + + + + + ICCARM + 71 81 88 53 95 91 85 86 113 90 77 72 112 33 34 35 39 45 19 36 44 50 6 32 49 + + + + + $PROJ_DIR$\..\bin\openblt_s32k118.out + + + OBJCOPY + 96 + + + ILINK + 132 + + + + + ILINK + 41 114 119 13 102 122 128 104 82 123 97 129 14 21 125 101 105 52 28 31 16 117 43 40 38 51 + + + + + $PROJ_DIR$\..\..\..\..\Source\xcp.c + + + ICCARM + 117 + + + __cstat + 67 + + + BICOMP + 126 + + + + + ICCARM + 71 81 88 53 95 91 85 86 113 90 77 72 112 + + + + + $PROJ_DIR$\..\hooks.c + + + ICCARM + 129 + + + __cstat + 64 + + + BICOMP + 130 + + + + + ICCARM + 71 81 88 53 95 91 85 86 113 90 77 72 112 11 33 34 35 39 45 19 36 44 50 6 32 49 + + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\IAR\cpu_comp.c + + + ICCARM + 82 + + + __cstat + 54 + + + BICOMP + 76 + + + + + ICCARM + 71 81 88 53 95 91 85 86 113 90 77 72 112 + + + + + $PROJ_DIR$\..\bin\demoprog_s32k118.out + OBJCOPY + + + + Release + + + [MULTI_TOOL] + ILINK + + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.ewd b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.ewd new file mode 100644 index 00000000..42f98615 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.ewd @@ -0,0 +1,2966 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8BE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 6 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8BE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.ewp b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.ewp new file mode 100644 index 00000000..84b975e7 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.ewp @@ -0,0 +1,2266 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Boot + + lib + + $PROJ_DIR$\..\lib\devassert.h + + + $PROJ_DIR$\..\lib\device_registers.h + + + $PROJ_DIR$\..\lib\s32_core_cm0.h + + + $PROJ_DIR$\..\lib\S32K118.h + + + $PROJ_DIR$\..\lib\S32K118_features.h + + + $PROJ_DIR$\..\lib\startup.c + + + $PROJ_DIR$\..\lib\startup.h + + + $PROJ_DIR$\..\lib\system_S32K118.c + + + $PROJ_DIR$\..\lib\system_S32K118.h + + + + $PROJ_DIR$\..\blt_conf.h + + + $PROJ_DIR$\..\hooks.c + + + $PROJ_DIR$\..\led.c + + + $PROJ_DIR$\..\led.h + + + $PROJ_DIR$\..\main.c + + + $PROJ_DIR$\..\startup_S32K118.s + + + + Source + + ARMCM0_S32K11 + + IAR + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\IAR\cpu_comp.c + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\can.c + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\cpu.c + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\flash.c + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\flash.h + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\nvm.c + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\rs232.c + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\timer.c + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\types.h + + + + $PROJ_DIR$\..\..\..\..\Source\assert.c + + + $PROJ_DIR$\..\..\..\..\Source\assert.h + + + $PROJ_DIR$\..\..\..\..\Source\backdoor.c + + + $PROJ_DIR$\..\..\..\..\Source\backdoor.h + + + $PROJ_DIR$\..\..\..\..\Source\boot.c + + + $PROJ_DIR$\..\..\..\..\Source\boot.h + + + $PROJ_DIR$\..\..\..\..\Source\can.h + + + $PROJ_DIR$\..\..\..\..\Source\com.c + + + $PROJ_DIR$\..\..\..\..\Source\com.h + + + $PROJ_DIR$\..\..\..\..\Source\cop.c + + + $PROJ_DIR$\..\..\..\..\Source\cop.h + + + $PROJ_DIR$\..\..\..\..\Source\cpu.h + + + $PROJ_DIR$\..\..\..\..\Source\file.c + + + $PROJ_DIR$\..\..\..\..\Source\file.h + + + $PROJ_DIR$\..\..\..\..\Source\net.c + + + $PROJ_DIR$\..\..\..\..\Source\net.h + + + $PROJ_DIR$\..\..\..\..\Source\nvm.h + + + $PROJ_DIR$\..\..\..\..\Source\plausibility.h + + + $PROJ_DIR$\..\..\..\..\Source\rs232.h + + + $PROJ_DIR$\..\..\..\..\Source\timer.h + + + $PROJ_DIR$\..\..\..\..\Source\usb.h + + + $PROJ_DIR$\..\..\..\..\Source\xcp.c + + + $PROJ_DIR$\..\..\..\..\Source\xcp.h + + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.ewt b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.ewt new file mode 100644 index 00000000..9ffc1596 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.ewt @@ -0,0 +1,2528 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 261 + + 261 + + 0 + + 1 + 600 + 1 + 2 + 0 + 1 + 100 + + + 1.5.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 261 + + 261 + + 0 + + 1 + 600 + 1 + 2 + 0 + 1 + 100 + + + 1.5.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + Boot + + lib + + $PROJ_DIR$\..\lib\devassert.h + + + $PROJ_DIR$\..\lib\device_registers.h + + + $PROJ_DIR$\..\lib\s32_core_cm0.h + + + $PROJ_DIR$\..\lib\S32K118.h + + + $PROJ_DIR$\..\lib\S32K118_features.h + + + $PROJ_DIR$\..\lib\startup.c + + + $PROJ_DIR$\..\lib\startup.h + + + $PROJ_DIR$\..\lib\system_S32K118.c + + + $PROJ_DIR$\..\lib\system_S32K118.h + + + + $PROJ_DIR$\..\blt_conf.h + + + $PROJ_DIR$\..\hooks.c + + + $PROJ_DIR$\..\led.c + + + $PROJ_DIR$\..\led.h + + + $PROJ_DIR$\..\main.c + + + $PROJ_DIR$\..\startup_S32K118.s + + + + Source + + ARMCM0_S32K11 + + IAR + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\IAR\cpu_comp.c + + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\can.c + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\cpu.c + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\flash.c + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\flash.h + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\nvm.c + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\rs232.c + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\timer.c + + + $PROJ_DIR$\..\..\..\..\Source\ARMCM0_S32K11\types.h + + + + $PROJ_DIR$\..\..\..\..\Source\assert.c + + + $PROJ_DIR$\..\..\..\..\Source\assert.h + + + $PROJ_DIR$\..\..\..\..\Source\backdoor.c + + + $PROJ_DIR$\..\..\..\..\Source\backdoor.h + + + $PROJ_DIR$\..\..\..\..\Source\boot.c + + + $PROJ_DIR$\..\..\..\..\Source\boot.h + + + $PROJ_DIR$\..\..\..\..\Source\can.h + + + $PROJ_DIR$\..\..\..\..\Source\com.c + + + $PROJ_DIR$\..\..\..\..\Source\com.h + + + $PROJ_DIR$\..\..\..\..\Source\cop.c + + + $PROJ_DIR$\..\..\..\..\Source\cop.h + + + $PROJ_DIR$\..\..\..\..\Source\cpu.h + + + $PROJ_DIR$\..\..\..\..\Source\file.c + + + $PROJ_DIR$\..\..\..\..\Source\file.h + + + $PROJ_DIR$\..\..\..\..\Source\net.c + + + $PROJ_DIR$\..\..\..\..\Source\net.h + + + $PROJ_DIR$\..\..\..\..\Source\nvm.h + + + $PROJ_DIR$\..\..\..\..\Source\plausibility.h + + + $PROJ_DIR$\..\..\..\..\Source\rs232.h + + + $PROJ_DIR$\..\..\..\..\Source\timer.h + + + $PROJ_DIR$\..\..\..\..\Source\usb.h + + + $PROJ_DIR$\..\..\..\..\Source\xcp.c + + + $PROJ_DIR$\..\..\..\..\Source\xcp.h + + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.eww b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.eww new file mode 100644 index 00000000..ca137aad --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/ide/s32k118.eww @@ -0,0 +1,7 @@ + + + + $WS_DIR$\s32k118.ewp + + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/led.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/led.c new file mode 100644 index 00000000..c4fb84ef --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/led.c @@ -0,0 +1,108 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/led.c +* \brief LED driver source file. +* \ingroup Boot_ARMCM0_S32K14_S32K118EVB_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#include "led.h" /* module header */ +#include "device_registers.h" /* device registers */ + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/** \brief Holds the desired LED blink interval time. */ +static blt_int16u ledBlinkIntervalMs; + + +/************************************************************************************//** +** \brief Initializes the LED blink driver. +** \param interval_ms Specifies the desired LED blink interval time in milliseconds. +** \return none. +** +****************************************************************************************/ +void LedBlinkInit(blt_int16u interval_ms) +{ + /* LED GPIO pin configuration. PE8 = GPIO, MUX = ALT1. */ + PORTE->PCR[8] = PORT_PCR_MUX(1); + /* Configure Port E pin 8 GPIO as digital output. */ + PTE->PDDR |= GPIO_PDDR_PDD(1 << 8U); + /* Turn the LED off on Port E pin 8. */ + PTE->PCOR |= GPIO_PSOR_PTSO(1 << 8U); + /* store the interval time between LED toggles */ + ledBlinkIntervalMs = interval_ms; +} /*** end of LedBlinkInit ***/ + + +/************************************************************************************//** +** \brief Task function for blinking the LED as a fixed timer interval. +** \return none. +** +****************************************************************************************/ +void LedBlinkTask(void) +{ + static blt_bool ledOn = BLT_FALSE; + static blt_int32u nextBlinkEvent = 0; + + /* check for blink event */ + if (TimerGet() >= nextBlinkEvent) + { + /* toggle the LED state */ + if (ledOn == BLT_FALSE) + { + ledOn = BLT_TRUE; + /* Turn the LED on. */ + PTE->PSOR |= GPIO_PSOR_PTSO(1 << 8U); + } + else + { + ledOn = BLT_FALSE; + /* Turn the LED off. */ + PTE->PCOR |= GPIO_PSOR_PTSO(1 << 8U); + } + /* schedule the next blink event */ + nextBlinkEvent = TimerGet() + ledBlinkIntervalMs; + } +} /*** end of LedBlinkTask ***/ + + +/************************************************************************************//** +** \brief Cleans up the LED blink driver. This is intended to be used upon program +** exit. +** \return none. +** +****************************************************************************************/ +void LedBlinkExit(void) +{ + /* Turn the LED off. */ + PTE->PCOR |= GPIO_PSOR_PTSO(1 << 8U); +} /*** end of LedBlinkExit ***/ + + +/*********************************** end of led.c **************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/led.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/led.h new file mode 100644 index 00000000..1dcb725e --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/led.h @@ -0,0 +1,40 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/led.h +* \brief LED driver header file. +* \ingroup Boot_ARMCM0_S32K14_S32K118EVB_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ +#ifndef LED_H +#define LED_H + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +void LedBlinkInit(blt_int16u interval_ms); +void LedBlinkTask(void); +void LedBlinkExit(void); + + +#endif /* LED_H */ +/*********************************** end of led.h **************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/S32K118.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/S32K118.h new file mode 100644 index 00000000..d1f10a17 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/S32K118.h @@ -0,0 +1,10438 @@ +/* +** ################################################################### +** Processor: S32K118 +** Reference manual: S32K1XXRM Rev. 9, 09/2018 +** Version: rev. 1.3, 2019-02-19 +** Build: b190219 +** +** Abstract: +** Peripheral Access Layer for S32K118 +** +** Copyright (c) 1997 - 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2019 NXP +** All rights reserved. +** +** THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +** INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +** STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +** IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +** +** http: www.nxp.com +** mail: support@nxp.com +** +** Revisions: +** - rev. 1.0 (2017-12-14) - Mihai Volmer +** Initial version based on S32K1XXRM Rev. 6, 12/2017. +** - rev. 1.1 (2018-02-08) - Mihai Volmer +** Renamed the NVIC register array IP to IPR to reflect the register access difference from Cortex-M4 NVIC registers +** Fixed CSE_PRAM base address +** - rev. 1.2 (2018-07-19) - Dan Nastasa +** Updated the header based on S32K1XXRM Rev. 8, 06/2018. +** Added MTB_DWT peripheral to the header file +** - rev. 1.3 (2019-02-19) - Ionut Pavel +** Updated the header based on S32K1XXRM Rev. 9, 09/2018. +** Removed LMEM_LMDR2 register from the header file. +** Modified LMEM_LMPECR register to Read-Only. +** +** ################################################################### +*/ + +/*! + * @file S32K118.h + * @version 1.3 + * @date 2019-02-19 + * @brief Peripheral Access Layer for S32K118 + * + * This file contains register definitions and macros for easy access to their + * bit fields. + * + * This file assumes LITTLE endian system. + */ + +/** +* @page misra_violations MISRA-C:2012 violations +* +* @section [global] +* Violates MISRA 2012 Advisory Rule 2.3, local typedef not referenced +* The SoC header defines typedef for all modules. +* +* @section [global] +* Violates MISRA 2012 Advisory Rule 2.5, local macro not referenced +* The SoC header defines macros for all modules and registers. +* +* @section [global] +* Violates MISRA 2012 Advisory Directive 4.9, Function-like macro +* These are generated macros used for accessing the bit-fields from registers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 5.1, identifier clash +* The supported compilers use more than 31 significant characters for identifiers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 5.2, identifier clash +* The supported compilers use more than 31 significant characters for identifiers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 5.4, identifier clash +* The supported compilers use more than 31 significant characters for identifiers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 5.5, identifier clash +* The supported compilers use more than 31 significant characters for identifiers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 21.1, defined macro '__I' is reserved to the compiler +* This type qualifier is needed to ensure correct I/O access and addressing. +*/ + +/* ---------------------------------------------------------------------------- + -- MCU activation + ---------------------------------------------------------------------------- */ + +/* Prevention from multiple including the same memory map */ +#if !defined(S32K118_H_) /* Check if memory map has not been already included */ +#define S32K118_H_ +#define MCU_S32K118 + +/* Check if another memory map has not been also included */ +#if (defined(MCU_ACTIVE)) + #error S32K118 memory map: There is already included another memory map. Only one memory map can be included. +#endif /* (defined(MCU_ACTIVE)) */ +#define MCU_ACTIVE + +#include + +/** Memory map major version (memory maps with equal major version number are + * compatible) */ +#define MCU_MEM_MAP_VERSION 0x0100u +/** Memory map minor version */ +#define MCU_MEM_MAP_VERSION_MINOR 0x0003u + +/* ---------------------------------------------------------------------------- + -- Generic macros + ---------------------------------------------------------------------------- */ + +/* IO definitions (access restrictions to peripheral registers) */ +/** +* IO Type Qualifiers are used +* \li to specify the access to peripheral variables. +* \li for automatic generation of peripheral register debug information. +*/ +#ifndef __IO +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ +#endif + + +/** +* @brief 32 bits memory read macro. +*/ +#if !defined(REG_READ32) + #define REG_READ32(address) (*(volatile uint32_t*)(address)) +#endif + +/** +* @brief 32 bits memory write macro. +*/ +#if !defined(REG_WRITE32) + #define REG_WRITE32(address, value) ((*(volatile uint32_t*)(address))= (uint32_t)(value)) +#endif + +/** +* @brief 32 bits bits setting macro. +*/ +#if !defined(REG_BIT_SET32) + #define REG_BIT_SET32(address, mask) ((*(volatile uint32_t*)(address))|= (uint32_t)(mask)) +#endif + +/** +* @brief 32 bits bits clearing macro. +*/ +#if !defined(REG_BIT_CLEAR32) + #define REG_BIT_CLEAR32(address, mask) ((*(volatile uint32_t*)(address))&= ((uint32_t)~((uint32_t)(mask)))) +#endif + +/** +* @brief 32 bit clear bits and set with new value +* @note It is user's responsability to make sure that value has only "mask" bits set - (value&~mask)==0 +*/ +#if !defined(REG_RMW32) + #define REG_RMW32(address, mask, value) (REG_WRITE32((address), ((REG_READ32(address)& ((uint32_t)~((uint32_t)(mask))))| ((uint32_t)(value))))) +#endif + + +/* ---------------------------------------------------------------------------- + -- Interrupt vector numbers for S32K118 + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Interrupt_vector_numbers_S32K118 Interrupt vector numbers for S32K118 + * @{ + */ + +/** Interrupt Number Definitions */ +#define NUMBER_OF_INT_VECTORS 48u /**< Number of interrupts in the Vector table */ + +/** + * @brief Defines the Interrupt Numbers definitions + * + * This enumeration is used to configure the interrupts. + * + * Implements : IRQn_Type_Class + */ +typedef enum +{ + /* Auxiliary constants */ + NotAvail_IRQn = -128, /**< Not available device specific interrupt */ + + /* Core interrupts */ + NonMaskableInt_IRQn = -14, /**< Non Maskable Interrupt */ + HardFault_IRQn = -13, /**< Cortex-M0 SV Hard Fault Interrupt */ + SVCall_IRQn = -5, /**< Cortex-M0 SV Call Interrupt */ + PendSV_IRQn = -2, /**< Cortex-M0 Pend SV Interrupt */ + SysTick_IRQn = -1, /**< Cortex-M0 System Tick Interrupt */ + + /* Device specific interrupts */ + DMA0_IRQn = 0u, /**< DMA channel 0 transfer complete */ + DMA1_IRQn = 1u, /**< DMA channel 1 transfer complete */ + DMA2_IRQn = 2u, /**< DMA channel 2 transfer complete */ + DMA3_IRQn = 3u, /**< DMA channel 3 transfer complete */ + DMA_Error_IRQn = 4u, /**< DMA error interrupt channels 0-3 */ + ERM_fault_IRQn = 5u, /**< ERM single and double bit error correction */ + RTC_IRQn = 6u, /**< RTC alarm interrupt */ + RTC_Seconds_IRQn = 7u, /**< RTC seconds interrupt */ + LPTMR0_IRQn = 8u, /**< LPTIMER interrupt request */ + PORT_IRQn = 9u, /**< Port A, B, C, D and E pin detect interrupt */ + CAN0_ORed_Err_Wakeup_IRQn = 10u, /**< OR’ed [Bus Off OR Bus Off Done OR Transmit Warning OR Receive Warning], Interrupt indicating that errors were detected on the CAN bus, Interrupt asserted when Pretended Networking operation is enabled, and a valid message matches the selected filter criteria during Low Power mode */ + CAN0_ORed_0_31_MB_IRQn = 11u, /**< OR'ed Message buffer (0-15, 16-31) */ + FTM0_Ch0_7_IRQn = 12u, /**< FTM0 Channel 0 to 7 interrupt */ + FTM0_Fault_IRQn = 13u, /**< FTM0 Fault interrupt */ + FTM0_Ovf_Reload_IRQn = 14u, /**< FTM0 Counter overflow and Reload interrupt */ + FTM1_Ch0_7_IRQn = 15u, /**< FTM1 Channel 0 to 7 interrupt */ + FTM1_Fault_IRQn = 16u, /**< FTM1 Fault interrupt */ + FTM1_Ovf_Reload_IRQn = 17u, /**< FTM1 Counter overflow and Reload interrupt */ + FTFC_IRQn = 18u, /**< FTFC Command complete, Read collision and Double bit fault detect */ + PDB0_IRQn = 19u, /**< PDB0 interrupt */ + LPIT0_IRQn = 20u, /**< LPIT interrupt */ + SCG_CMU_LVD_LVWSCG_IRQn = 21u, /**< PMC Low voltage detect interrupt, SCG bus interrupt request and CMU loss of range interrupt */ + WDOG_IRQn = 22u, /**< WDOG interrupt request out before wdg reset out */ + RCM_IRQn = 23u, /**< RCM Asynchronous Interrupt */ + LPI2C0_Master_Slave_IRQn = 24u, /**< LPI2C0 Master Interrupt and Slave Interrupt */ + FLEXIO_IRQn = 25u, /**< FlexIO Interrupt */ + LPSPI0_IRQn = 26u, /**< LPSPI0 Interrupt */ + LPSPI1_IRQn = 27u, /**< LPSPI1 Interrupt */ + ADC0_IRQn = 28u, /**< ADC0 interrupt request. */ + CMP0_IRQn = 29u, /**< CMP0 interrupt request */ + LPUART1_RxTx_IRQn = 30u, /**< LPUART1 Transmit / Receive Interrupt */ + LPUART0_RxTx_IRQn = 31u /**< LPUART0 Transmit / Receive Interrupt */ +} IRQn_Type; + +/*! + * @} + */ /* end of group Interrupt_vector_numbers_S32K118 */ + + +/* ---------------------------------------------------------------------------- + -- Device Peripheral Access Layer for S32K118 + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Peripheral_access_layer_S32K118 Device Peripheral Access Layer for S32K118 + * @{ + */ + +/* @brief This module covers memory mapped registers available on SoC */ + +/* ---------------------------------------------------------------------------- + -- ADC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup ADC_Peripheral_Access_Layer ADC Peripheral Access Layer + * @{ + */ + + +/** ADC - Size of Registers Arrays */ +#define ADC_SC1_COUNT 16u +#define ADC_R_COUNT 16u +#define ADC_CV_COUNT 2u + +/** ADC - Register Layout Typedef */ +typedef struct { + __IO uint32_t SC1[ADC_SC1_COUNT]; /**< ADC Status and Control Register 1, array offset: 0x0, array step: 0x4 */ + __IO uint32_t CFG1; /**< ADC Configuration Register 1, offset: 0x40 */ + __IO uint32_t CFG2; /**< ADC Configuration Register 2, offset: 0x44 */ + __I uint32_t R[ADC_R_COUNT]; /**< ADC Data Result Registers, array offset: 0x48, array step: 0x4 */ + __IO uint32_t CV[ADC_CV_COUNT]; /**< Compare Value Registers, array offset: 0x88, array step: 0x4 */ + __IO uint32_t SC2; /**< Status and Control Register 2, offset: 0x90 */ + __IO uint32_t SC3; /**< Status and Control Register 3, offset: 0x94 */ + __IO uint32_t BASE_OFS; /**< BASE Offset Register, offset: 0x98 */ + __IO uint32_t OFS; /**< ADC Offset Correction Register, offset: 0x9C */ + __IO uint32_t USR_OFS; /**< USER Offset Correction Register, offset: 0xA0 */ + __IO uint32_t XOFS; /**< ADC X Offset Correction Register, offset: 0xA4 */ + __IO uint32_t YOFS; /**< ADC Y Offset Correction Register, offset: 0xA8 */ + __IO uint32_t G; /**< ADC Gain Register, offset: 0xAC */ + __IO uint32_t UG; /**< ADC User Gain Register, offset: 0xB0 */ + __IO uint32_t CLPS; /**< ADC General Calibration Value Register S, offset: 0xB4 */ + __IO uint32_t CLP3; /**< ADC Plus-Side General Calibration Value Register 3, offset: 0xB8 */ + __IO uint32_t CLP2; /**< ADC Plus-Side General Calibration Value Register 2, offset: 0xBC */ + __IO uint32_t CLP1; /**< ADC Plus-Side General Calibration Value Register 1, offset: 0xC0 */ + __IO uint32_t CLP0; /**< ADC Plus-Side General Calibration Value Register 0, offset: 0xC4 */ + __IO uint32_t CLPX; /**< ADC Plus-Side General Calibration Value Register X, offset: 0xC8 */ + __IO uint32_t CLP9; /**< ADC Plus-Side General Calibration Value Register 9, offset: 0xCC */ + __IO uint32_t CLPS_OFS; /**< ADC General Calibration Offset Value Register S, offset: 0xD0 */ + __IO uint32_t CLP3_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 3, offset: 0xD4 */ + __IO uint32_t CLP2_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 2, offset: 0xD8 */ + __IO uint32_t CLP1_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 1, offset: 0xDC */ + __IO uint32_t CLP0_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 0, offset: 0xE0 */ + __IO uint32_t CLPX_OFS; /**< ADC Plus-Side General Calibration Offset Value Register X, offset: 0xE4 */ + __IO uint32_t CLP9_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 9, offset: 0xE8 */ +} ADC_Type, *ADC_MemMapPtr; + + /** Number of instances of the ADC module. */ +#define ADC_INSTANCE_COUNT (1u) + + +/* ADC - Peripheral instance base addresses */ +/** Peripheral ADC0 base address */ +#define ADC0_BASE (0x4003B000u) +/** Peripheral ADC0 base pointer */ +#define ADC0 ((ADC_Type *)ADC0_BASE) +/** Array initializer of ADC peripheral base addresses */ +#define ADC_BASE_ADDRS { ADC0_BASE } +/** Array initializer of ADC peripheral base pointers */ +#define ADC_BASE_PTRS { ADC0 } + /** Number of interrupt vector arrays for the ADC module. */ +#define ADC_IRQS_ARR_COUNT (1u) + /** Number of interrupt channels for the ADC module. */ +#define ADC_IRQS_CH_COUNT (1u) +/** Interrupt vectors for the ADC peripheral type */ +#define ADC_IRQS { ADC0_IRQn } + +/* ---------------------------------------------------------------------------- + -- ADC Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup ADC_Register_Masks ADC Register Masks + * @{ + */ + +/* SC1 Bit Fields */ +#define ADC_SC1_ADCH_MASK 0x1Fu +#define ADC_SC1_ADCH_SHIFT 0u +#define ADC_SC1_ADCH_WIDTH 5u +#define ADC_SC1_ADCH(x) (((uint32_t)(((uint32_t)(x))<VTOR} + +/* FTM module features */ + +/* @brief Number of PWM channels */ +#define FEATURE_FTM_CHANNEL_COUNT (8U) +/* @brief Number of fault channels */ +#define FTM_FEATURE_FAULT_CHANNELS (4U) +/* @brief Width of control channel */ +#define FTM_FEATURE_COMBINE_CHAN_CTRL_WIDTH (8U) +/* @brief Output channel offset */ +#define FTM_FEATURE_OUTPUT_CHANNEL_OFFSET (16U) +/* @brief Max counter value */ +#define FTM_FEATURE_CNT_MAX_VALUE_U32 (0x0000FFFFU) +/* @brief Input capture for single shot */ +#define FTM_FEATURE_INPUT_CAPTURE_SINGLE_SHOT (2U) +/* @brief Dithering has supported on the generated PWM signals */ +#define FEATURE_FTM_HAS_SUPPORTED_DITHERING (1U) +/* @brief Number of interrupt vector for channels of the FTM module. */ +#define FEATURE_FTM_HAS_NUM_IRQS_CHANS (1U) + +/* LPIT module features */ + +/*! @brief Number of interrupt vector for channels of the LPIT module. */ +#define FEATURE_LPIT_HAS_NUM_IRQS_CHANS (1U) +/*! @brief Clock names for LPIT. */ +#define LPIT_CLOCK_NAMES {LPIT0_CLK} + +/* LPI2C module features */ + +/* @brief DMA instance used for LPI2C module */ +#define LPI2C_DMA_INSTANCE 0U + +/* @brief EDMA requests for LPI2C module. */ +#define LPI2C_EDMA_REQ {{(uint8_t)EDMA_REQ_LPI2C0_TX, (uint8_t)EDMA_REQ_LPI2C0_RX}} +/* @brief PCC clocks for LPI2C module. */ +#define LPI2C_PCC_CLOCKS {LPI2C0_CLK} + +/* @brief Disable high-speed and ultra-fast operating modes for S32K14x. */ +#define LPI2C_HAS_FAST_PLUS_MODE (0U) +#define LPI2C_HAS_HIGH_SPEED_MODE (0U) +#define LPI2C_HAS_ULTRA_FAST_MODE (0U) + +/* LPI2C module features */ + +/* @brief DMA instance used for LPI2C module */ +#define LPI2C_DMA_INSTANCE 0U + +/* @brief EDMA requests for LPI2C module. */ +#define LPI2C_EDMA_REQ {{(uint8_t)EDMA_REQ_LPI2C0_TX, (uint8_t)EDMA_REQ_LPI2C0_RX}} +/* @brief PCC clocks for LPI2C module. */ +#define LPI2C_PCC_CLOCKS {LPI2C0_CLK} + +/* @brief Disable high-speed and ultra-fast operating modes for S32K14x. */ +#define LPI2C_HAS_FAST_PLUS_MODE (0U) +#define LPI2C_HAS_HIGH_SPEED_MODE (0U) +#define LPI2C_HAS_ULTRA_FAST_MODE (0U) + +/* MSCM module features */ + +/* @brief Has interrupt router control registers (IRSPRCn). */ +#define FEATURE_MSCM_HAS_INTERRUPT_ROUTER (0) +/* @brief Has directed CPU interrupt routerregisters (IRCPxxx). */ +#define FEATURE_MSCM_HAS_CPU_INTERRUPT_ROUTER (0) + +/* CSEc module features */ + +/*! @brief CSE_PRAM offset of the page length parameter used by the following +commands: CMD_ENC_ECB, CMD_ENC_CBC, CMD_DEC_ECB, CMD_DEC_CBC, CMD_MP_COMPRESS */ +#define FEATURE_CSEC_PAGE_LENGTH_OFFSET (0xEU) +/*! @brief CSE_PRAM offset of the message length parameter used by the following +commands: CMD_GENERATE_MAC, CMD_VERIFY_MAC (both copy and pointer methods) */ +#define FEATURE_CSEC_MESSAGE_LENGTH_OFFSET (0xCU) +/*! @brief CSE_PRAM offset of the MAC length parameter used by the following +commands: CMD_VERIFY_MAC (both copy and pointer methods) */ +#define FEATURE_CSEC_MAC_LENGTH_OFFSET (0x8U) +/*! @brief CSE_PRAM offset of the boot size parameter used by the following +commands: CMD_BOOT_DEFINE */ +#define FEATURE_CSEC_BOOT_SIZE_OFFSET (0x1CU) +/*! @brief CSE_PRAM offset of the boot flavor parameter used by the following +commands: CMD_BOOT_DEFINE */ +#define FEATURE_CSEC_BOOT_FLAVOR_OFFSET (0x1BU) +/*! @brief CSE_PRAM offset of the Flash start address parameter used by the +following commands: CMD_GENERATE_MAC, CMD_VERIFY_MAC (pointer method) */ +#define FEATURE_CSEC_FLASH_START_ADDRESS_OFFSET (0x10U) +/*! @brief CSE_PRAM offset of the verification status parameter used by the +following commands: CMD_VERIFY_MAC (both copy and pointer methods) */ +#define FEATURE_CSEC_VERIFICATION_STATUS_OFFSET (0x14U) +/*! @brief CSE_PRAM offset of the error bits field contained by all commands */ +#define FEATURE_CSEC_ERROR_BITS_OFFSET (0x4U) +/*! @brief CSE_PRAM offset of the SREG parameter used by the following commands: +CMD_GET_ID */ +#define FEATURE_CSEC_SREG_OFFSET (0x2FU) + +/*! @brief CSE_PRAM offset of page 0 */ +#define FEATURE_CSEC_PAGE_0_OFFSET (0x0U) +/*! @brief CSE_PRAM offset of page 1 */ +#define FEATURE_CSEC_PAGE_1_OFFSET (0x10U) +/*! @brief CSE_PRAM offset of page 2 */ +#define FEATURE_CSEC_PAGE_2_OFFSET (0x20U) +/*! @brief CSE_PRAM offset of page 3 */ +#define FEATURE_CSEC_PAGE_3_OFFSET (0x30U) +/*! @brief CSE_PRAM offset of page 4 */ +#define FEATURE_CSEC_PAGE_4_OFFSET (0x40U) +/*! @brief CSE_PRAM offset of page 5 */ +#define FEATURE_CSEC_PAGE_5_OFFSET (0x50U) +/*! @brief CSE_PRAM offset of page 6 */ +#define FEATURE_CSEC_PAGE_6_OFFSET (0x60U) +/*! @brief CSE_PRAM offset of page 7 */ +#define FEATURE_CSEC_PAGE_7_OFFSET (0x70U) + +/* CRC module features */ + +/* @brief CRC module use for S32K. */ +#define FEATURE_CRC_DRIVER_SOFT_POLYNOMIAL +/* @brief Default CRC bit width */ +#define FEATURE_CRC_DEFAULT_WIDTH CRC_BITS_16 +/* @brief Default CRC read transpose */ +#define FEATURE_CRC_DEFAULT_READ_TRANSPOSE CRC_TRANSPOSE_NONE +/* @brief Default CRC write transpose */ +#define FEATURE_CRC_DEFAULT_WRITE_TRANSPOSE CRC_TRANSPOSE_NONE +/* @brief Default polynomial 0x1021U */ +#define FEATURE_CRC_DEFAULT_POLYNOMIAL (0x1021U) +/* @brief Default seed value is 0xFFFFU */ +#define FEATURE_CRC_DEFAULT_SEED (0xFFFFU) + +/* PORT module features */ +/*! @brief PORT Used for setting Pins */ +#define FEATURE_PINS_DRIVER_USING_PORT (1) +/* @brief Has control lock (register bit PCR[LK]). */ +#define FEATURE_PORT_HAS_PIN_CONTROL_LOCK (1) +/* @brief Has open drain control (register bit PCR[ODE]). */ +#define FEATURE_PINS_HAS_OPEN_DRAIN (0) +/* @brief Has digital filter (registers DFER, DFCR and DFWR). */ +#define FEATURE_PORT_HAS_DIGITAL_FILTER (1) +/* @brief Has trigger output to trigger other peripherals (register bit field PCR[IRQC] values). */ +#define FEATURE_PORT_HAS_TRIGGER_OUT (0) +/* @brief Has setting flag only (register bit field PCR[IRQC] values). */ +#define FEATURE_PORT_HAS_FLAG_SET_ONLY (0) +/* @brief Has over-current feature (register bit field PCR[OCIE] values). */ +#define FEATURE_PINS_HAS_OVER_CURRENT (0) +/* @brief Has pull resistor selection available. */ +#define FEATURE_PINS_HAS_PULL_SELECTION (1) +/* @brief Has slew rate control (register bit PCR[SRE]). */ +#define FEATURE_PINS_HAS_SLEW_RATE (0) +/* @brief Has passive filter (register bit field PCR[PFE]). */ +#define FEATURE_PORT_HAS_PASSIVE_FILTER (1) +/* @brief Has drive strength (register bit PCR[DSE]). */ +#define FEATURE_PINS_HAS_DRIVE_STRENGTH (1) +/* @brief Has drive strength control bits*/ +#define FEATURE_PINS_HAS_DRIVE_STRENGTH_CONTROL (0) +/* @brief Has port input disable control bits*/ +#define FEATURE_PORT_HAS_INPUT_DISABLE (0) +/* @brief SIM_CHIPCTL_ADC_INTERLEAVE_EN bit is not available */ +#define FEATURE_PINS_HAS_ADC_INTERLEAVE_EN (0) + +/* MPU module features */ + +/* @brief Specifies hardware revision level. */ +#define FEATURE_MPU_HARDWARE_REVISION_LEVEL (1U) +/* @brief Has process identifier support. */ +#define FEATURE_MPU_HAS_PROCESS_IDENTIFIER (1U) +/* @brief Specifies total number of bus masters. */ +#define FEATURE_MPU_MASTER_COUNT (3U) +/* @brief Specifies maximum number of masters which have separated +privilege rights for user and supervisor mode accesses (e.g. master0~3 in S32K1xx). +*/ +#define FEATURE_MPU_MAX_LOW_MASTER_NUMBER (3U) +/* @brief Specifies maximum number of masters which have only +read and write permissions (e.g. master4~7 in S32K1xx). +*/ +#define FEATURE_MPU_MAX_HIGH_MASTER_NUMBER (7U) + +/* @brief Specifies number of set access control right bits for + masters which have separated privilege rights for user and + supervisor mode accesses (e.g. master0~3 in S32K1xx). +*/ +#define FEATURE_MPU_LOW_MASTER_CONTROL_WIDTH (6U) +/* @brief Specifies number of set access control right bits for + masters which have only read and write permissions(e.g. master4~7 in S32K1xx). +*/ +#define FEATURE_MPU_HIGH_MASTER_CONTROL_WIDTH (2U) + +/* @brief The MPU Logical Bus Master Number for core bus master. */ +#define FEATURE_MPU_MASTER_CORE (0U) +/* @brief The MPU Logical Bus Master Number for Debugger master. */ +#define FEATURE_MPU_MASTER_DEBUGGER (1U) +/* @brief The MPU Logical Bus Master Number for DMA master. */ +#define FEATURE_MPU_MASTER_DMA (2U) +/* @brief Specifies master number. */ +#define FEATURE_MPU_MASTER \ +{ \ + FEATURE_MPU_MASTER_CORE, /*!< CORE */ \ + FEATURE_MPU_MASTER_DEBUGGER, /*!< DEBUGGER */ \ + FEATURE_MPU_MASTER_DMA, /*!< DMA */ \ +} + +/* @brief Specifies total number of slave ports. */ +#define FEATURE_MPU_SLAVE_COUNT (2U) +/* @brief The MPU Slave Port Assignment for Flash Controller and boot ROM. */ +#define FEATURE_MPU_SLAVE_FLASH_BOOTROM (0U) +/* @brief The MPU Slave Port Assignment for SRAM, MTB, DWT and MCM. */ +#define FEATURE_MPU_SLAVE_SRAM_MTB_DWT_MCM (1U) +/* @brief The MPU Slave Port mask. */ +#define FEATURE_MPU_SLAVE_MASK (0xC0000000U) +#define FEATURE_MPU_SLAVE_SHIFT (30u) +#define FEATURE_MPU_SLAVE_WIDTH (2u) +#define FEATURE_MPU_SLAVE(x) (((uint32_t)(((uint32_t)(x))<> (uint32_t)FEATURE_DMA_CH_WIDTH) +/* @brief DMA virtual channel to channel */ +#define FEATURE_DMA_VCH_TO_CH(x) ((x) & ((uint32_t)FEATURE_DMA_CHANNELS - 1U)) +/* @brief DMA supports the following particular channel priorities: */ +#define FEATURE_DMA_4_CH_PRIORITIES +/* @brief DMA supports bus bandwidth control. */ +#define FEATURE_DMA_ENGINE_STALL + +/* DMAMUX module features */ + +/* @brief DMAMUX peripheral is available in silicon. */ +#define FEATURE_DMAMUX_AVAILABLE +/* @brief Number of DMA channels. */ +#define FEATURE_DMAMUX_CHANNELS (4U) +/* @brief Has the periodic trigger capability */ +#define FEATURE_DMAMUX_HAS_TRIG (1) +/* @brief Conversion from request source to the actual DMAMUX channel */ +#define FEATURE_DMAMUX_REQ_SRC_TO_CH(x) (x) +/* @brief Mapping between request source and DMAMUX instance */ +#define FEATURE_DMAMUX_REQ_SRC_TO_INSTANCE(x) (0U) +/* @brief Conversion from eDMA channel index to DMAMUX channel. */ +#define FEATURE_DMAMUX_DMA_CH_TO_CH(x) (x) +/* @brief Conversion from DMAMUX channel DMAMUX register index. */ +#define FEATURE_DMAMUX_CHN_REG_INDEX(x) (x) +/* @brief Clock names for DMAMUX. */ +#define FEATURE_DMAMUX_CLOCK_NAMES {DMAMUX0_CLK} + +/*! + * @brief Structure for the DMA hardware request + * + * Defines the structure for the DMA hardware request collections. The user can configure the + * hardware request into DMAMUX to trigger the DMA transfer accordingly. The index + * of the hardware request varies according to the to SoC. + */ +typedef enum { + EDMA_REQ_DISABLED = 0U, + EDMA_REQ_LPUART0_RX = 2U, + EDMA_REQ_LPUART0_TX = 3U, + EDMA_REQ_LPUART1_RX = 4U, + EDMA_REQ_LPUART1_TX = 5U, + EDMA_REQ_FLEXIO_SHIFTER0 = 10U, + EDMA_REQ_FLEXIO_SHIFTER1 = 11U, + EDMA_REQ_FLEXIO_SHIFTER2 = 12U, + EDMA_REQ_FLEXIO_SHIFTER3 = 13U, + EDMA_REQ_LPSPI0_RX = 14U, + EDMA_REQ_LPSPI0_TX = 15U, + EDMA_REQ_LPSPI1_RX = 16U, + EDMA_REQ_LPSPI1_TX = 17U, + EDMA_REQ_FTM1_CHANNEL_0 = 20U, + EDMA_REQ_FTM1_CHANNEL_1 = 21U, + EDMA_REQ_FTM1_CHANNEL_2 = 22U, + EDMA_REQ_FTM1_CHANNEL_3 = 23U, + EDMA_REQ_FTM1_CHANNEL_4 = 24U, + EDMA_REQ_FTM1_CHANNEL_5 = 25U, + EDMA_REQ_FTM1_CHANNEL_6 = 26U, + EDMA_REQ_FTM1_CHANNEL_7 = 27U, + EDMA_REQ_FTM0_OR_CH0_CH7 = 36U, + EDMA_REQ_ADC0 = 42U, + EDMA_REQ_LPI2C0_RX = 44U, + EDMA_REQ_LPI2C0_TX = 45U, + EDMA_REQ_PDB0 = 46U, + EDMA_REQ_CMP0 = 48U, + EDMA_REQ_PORTA = 49U, + EDMA_REQ_PORTB = 50U, + EDMA_REQ_PORTC = 51U, + EDMA_REQ_PORTD = 52U, + EDMA_REQ_PORTE = 53U, + EDMA_REQ_FLEXCAN0 = 54U, + EDMA_REQ_LPTMR0 = 59U, + EDMA_REQ_DMAMUX_ALWAYS_ENABLED0 = 62U, + EDMA_REQ_DMAMUX_ALWAYS_ENABLED1 = 63U +} dma_request_source_t; + + +/* TRGMUX module features */ +/*! + * @brief Enumeration for trigger source module of TRGMUX + * + * Describes all possible inputs (trigger sources) of the TRGMUX IP + * This enumeration depends on the supported instances in device + */ +enum trgmux_trigger_source_e +{ + TRGMUX_TRIG_SOURCE_DISABLED = 0U, + TRGMUX_TRIG_SOURCE_VDD = 1U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN0 = 2U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN1 = 3U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN2 = 4U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN3 = 5U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN4 = 6U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN5 = 7U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN6 = 8U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN7 = 9U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN8 = 10U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN9 = 11U, + TRGMUX_TRIG_SOURCE_CMP0_OUT = 14U, + TRGMUX_TRIG_SOURCE_LPIT_CH0 = 17U, + TRGMUX_TRIG_SOURCE_LPIT_CH1 = 18U, + TRGMUX_TRIG_SOURCE_LPIT_CH2 = 19U, + TRGMUX_TRIG_SOURCE_LPIT_CH3 = 20U, + TRGMUX_TRIG_SOURCE_LPTMR0 = 21U, + TRGMUX_TRIG_SOURCE_FTM0_INIT_TRIG = 22U, + TRGMUX_TRIG_SOURCE_FTM0_EXT_TRIG = 23U, + TRGMUX_TRIG_SOURCE_FTM1_INIT_TRIG = 24U, + TRGMUX_TRIG_SOURCE_FTM1_EXT_TRIG = 25U, + TRGMUX_TRIG_SOURCE_ADC0_SC1A_COCO = 30U, + TRGMUX_TRIG_SOURCE_ADC0_SC1B_COCO = 31U, + TRGMUX_TRIG_SOURCE_PDB0_CH0_TRIG = 34U, + TRGMUX_TRIG_SOURCE_PDB0_PULSE_OUT = 36U, + TRGMUX_TRIG_SOURCE_RTC_ALARM = 43U, + TRGMUX_TRIG_SOURCE_RTC_SECOND = 44U, + TRGMUX_TRIG_SOURCE_FLEXIO_TRIG0 = 45U, + TRGMUX_TRIG_SOURCE_FLEXIO_TRIG1 = 46U, + TRGMUX_TRIG_SOURCE_FLEXIO_TRIG2 = 47U, + TRGMUX_TRIG_SOURCE_FLEXIO_TRIG3 = 48U, + TRGMUX_TRIG_SOURCE_LPUART0_RX_DATA = 49U, + TRGMUX_TRIG_SOURCE_LPUART0_TX_DATA = 50U, + TRGMUX_TRIG_SOURCE_LPUART0_RX_IDLE = 51U, + TRGMUX_TRIG_SOURCE_LPUART1_RX_DATA = 52U, + TRGMUX_TRIG_SOURCE_LPUART1_TX_DATA = 53U, + TRGMUX_TRIG_SOURCE_LPUART1_RX_IDLE = 54U, + TRGMUX_TRIG_SOURCE_LPI2C0_MASTER_TRIG = 55U, + TRGMUX_TRIG_SOURCE_LPI2C0_SLAVE_TRIG = 56U, + TRGMUX_TRIG_SOURCE_LPSPI0_FRAME = 59U, + TRGMUX_TRIG_SOURCE_LPSPI0_RX_DATA = 60U, + TRGMUX_TRIG_SOURCE_LPSPI1_FRAME = 61U, + TRGMUX_TRIG_SOURCE_LPSPI1_RX_DATA = 62U, + TRGMUX_TRIG_SOURCE_SIM_SW_TRIG = 63U, +}; + +/*! + * @brief Enumeration for target module of TRGMUX + * + * Describes all possible outputs (target modules) of the TRGMUX IP + * This enumeration depends on the supported instances in device + */ +enum trgmux_target_module_e +{ + TRGMUX_TARGET_MODULE_DMA_CH0 = 0U, + TRGMUX_TARGET_MODULE_DMA_CH1 = 1U, + TRGMUX_TARGET_MODULE_DMA_CH2 = 2U, + TRGMUX_TARGET_MODULE_DMA_CH3 = 3U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT0 = 4U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT1 = 5U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT2 = 6U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT3 = 7U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT4 = 8U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT5 = 9U, + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA0 = 12U, + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA1 = 13U, + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA2 = 14U, + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA3 = 15U, + TRGMUX_TARGET_MODULE_CMP0_SAMPLE = 28U, + TRGMUX_TARGET_MODULE_FTM0_HWTRIG0 = 40U, + TRGMUX_TARGET_MODULE_FTM0_FAULT0 = 41U, + TRGMUX_TARGET_MODULE_FTM0_FAULT1 = 42U, + TRGMUX_TARGET_MODULE_FTM0_FAULT2 = 43U, + TRGMUX_TARGET_MODULE_FTM1_HWTRIG0 = 44U, + TRGMUX_TARGET_MODULE_FTM1_FAULT0 = 45U, + TRGMUX_TARGET_MODULE_FTM1_FAULT1 = 46U, + TRGMUX_TARGET_MODULE_FTM1_FAULT2 = 47U, + TRGMUX_TARGET_MODULE_PDB0_TRG_IN = 56U, + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM0 = 68U, + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM1 = 69U, + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM2 = 70U, + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM3 = 71U, + TRGMUX_TARGET_MODULE_LPIT_TRG_CH0 = 72U, + TRGMUX_TARGET_MODULE_LPIT_TRG_CH1 = 73U, + TRGMUX_TARGET_MODULE_LPIT_TRG_CH2 = 74U, + TRGMUX_TARGET_MODULE_LPIT_TRG_CH3 = 75U, + TRGMUX_TARGET_MODULE_LPUART0_TRG = 76U, + TRGMUX_TARGET_MODULE_LPUART1_TRG = 80U, + TRGMUX_TARGET_MODULE_LPI2C0_TRG = 84U, + TRGMUX_TARGET_MODULE_LPSPI0_TRG = 92U, + TRGMUX_TARGET_MODULE_LPSPI1_TRG = 96U, + TRGMUX_TARGET_MODULE_LPTMR0_ALT0 = 100U, +}; + +/* @brief Constant array storing the value of all TRGMUX output(target module) identifiers */ +#define FEATURE_TRGMUX_TARGET_MODULE \ +{ \ + TRGMUX_TARGET_MODULE_DMA_CH0, \ + TRGMUX_TARGET_MODULE_DMA_CH1, \ + TRGMUX_TARGET_MODULE_DMA_CH2, \ + TRGMUX_TARGET_MODULE_DMA_CH3, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT0, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT1, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT2, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT3, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT4, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT5, \ + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA0, \ + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA1, \ + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA2, \ + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA3, \ + TRGMUX_TARGET_MODULE_CMP0_SAMPLE, \ + TRGMUX_TARGET_MODULE_FTM0_HWTRIG0, \ + TRGMUX_TARGET_MODULE_FTM0_FAULT0, \ + TRGMUX_TARGET_MODULE_FTM0_FAULT1, \ + TRGMUX_TARGET_MODULE_FTM0_FAULT2, \ + TRGMUX_TARGET_MODULE_FTM1_HWTRIG0, \ + TRGMUX_TARGET_MODULE_FTM1_FAULT0, \ + TRGMUX_TARGET_MODULE_FTM1_FAULT1, \ + TRGMUX_TARGET_MODULE_FTM1_FAULT2, \ + TRGMUX_TARGET_MODULE_PDB0_TRG_IN, \ + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM0, \ + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM1, \ + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM2, \ + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM3, \ + TRGMUX_TARGET_MODULE_LPIT_TRG_CH0, \ + TRGMUX_TARGET_MODULE_LPIT_TRG_CH1, \ + TRGMUX_TARGET_MODULE_LPIT_TRG_CH2, \ + TRGMUX_TARGET_MODULE_LPIT_TRG_CH3, \ + TRGMUX_TARGET_MODULE_LPUART0_TRG, \ + TRGMUX_TARGET_MODULE_LPUART1_TRG, \ + TRGMUX_TARGET_MODULE_LPI2C0_TRG, \ + TRGMUX_TARGET_MODULE_LPSPI0_TRG, \ + TRGMUX_TARGET_MODULE_LPSPI1_TRG, \ + TRGMUX_TARGET_MODULE_LPTMR0_ALT0 \ +} + + +/* LPSPI module features */ +/* @brief Initial value for state structure */ +#define FEATURE_LPSPI_STATE_STRUCTURES_NULL {NULL, NULL} +/* @brief Clock indexes for LPSPI clock */ +#define FEATURE_LPSPI_CLOCKS_NAMES {LPSPI0_CLK, LPSPI1_CLK}; + +/* FlexIO module features */ + +/* @brief Define the maximum number of shifters for any FlexIO instance. */ +#define FEATURE_FLEXIO_MAX_SHIFTER_COUNT (4U) +/* @brief Define DMA request names for Flexio. */ +#define FEATURE_FLEXIO_DMA_REQ_0 EDMA_REQ_FLEXIO_SHIFTER0 +#define FEATURE_FLEXIO_DMA_REQ_1 EDMA_REQ_FLEXIO_SHIFTER1 +#define FEATURE_FLEXIO_DMA_REQ_2 EDMA_REQ_FLEXIO_SHIFTER2 +#define FEATURE_FLEXIO_DMA_REQ_3 EDMA_REQ_FLEXIO_SHIFTER3 + +/* LPUART module features */ + +/* @brief Has extended data register ED. */ +#define FEATURE_LPUART_HAS_EXTENDED_DATA_REGISTER_FLAGS (1) +/* @brief Hardware flow control (RTS, CTS) is supported. */ +#define FEATURE_LPUART_HAS_MODEM_SUPPORT (1) +/* @brief Baud rate oversampling is available. */ +#define FEATURE_LPUART_HAS_BAUD_RATE_OVER_SAMPLING_SUPPORT (1) +/* @brief Baud rate oversampling is available. */ +#define FEATURE_LPUART_HAS_BOTH_EDGE_SAMPLING_SUPPORT (1) +/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ +#define FEATURE_LPUART_FIFO_SIZE (4U) +/* @brief Supports two match addresses to filter incoming frames. */ +#define FEATURE_LPUART_HAS_ADDRESS_MATCHING (1) +/* @brief Has transmitter/receiver DMA enable bits. */ +#define FEATURE_LPUART_HAS_DMA_ENABLE (1) +/* @brief Flag clearance mask for STAT register. */ +#define FEATURE_LPUART_STAT_REG_FLAGS_MASK (0xC01FC000U) +/* @brief Flag clearance mask for FIFO register. */ +#define FEATURE_LPUART_FIFO_REG_FLAGS_MASK (0x00030000U) +/* @brief Reset mask for FIFO register. */ +#define FEATURE_LPUART_FIFO_RESET_MASK (0x0003C000U) +/* @brief Default oversampling ratio. */ +#define FEATURE_LPUART_DEFAULT_OSR (0x0FUL) +/* @brief Default baud rate modulo divisor. */ +#define FEATURE_LPUART_DEFAULT_SBR (0x04UL) +/* @brief Clock names for LPUART. */ +#define LPUART_CLOCK_NAMES {LPUART0_CLK, LPUART1_CLK} + +/* ADC module features */ + +/*! @brief ADC feature flag for extended number of SC1 and R registers, + * generically named 'alias registers' */ +#define FEATURE_ADC_HAS_EXTRA_NUM_REGS (0) + +#define NUMBER_OF_ALT_CLOCKS ADC_CLK_ALT_1 +/*! @brief ADC feature flag for defining number of external ADC channels. + * If each ADC instance has different number of external channels, then + * this define is set with the maximum value. */ +#define FEATURE_ADC_MAX_NUM_EXT_CHANS (16) +#define FEATURE_ADC_HAS_CHANNEL_2 (1) +#define FEATURE_ADC_HAS_CHANNEL_8 (1) +#define ADC_CLOCKS {ADC0_CLK} +/*! @brief ADC number of control channels */ +#if FEATURE_ADC_HAS_EXTRA_NUM_REGS +#define ADC_CTRL_CHANS_COUNT ADC_aSC1_COUNT +#else +#define ADC_CTRL_CHANS_COUNT ADC_SC1_COUNT +#endif /* FEATURE_ADC_HAS_EXTRA_NUM_REGS */ + +/*! @brief ADC default Sample Time from RM */ +#define ADC_DEFAULT_SAMPLE_TIME (0x0CU) +/*! @brief ADC default User Gain from RM */ +#define ADC_DEFAULT_USER_GAIN (0x04U) +/* @brief Max of adc clock frequency */ +#define ADC_CLOCK_FREQ_MAX_RUNTIME (50000000u) +/* @brief Min of adc clock frequency */ +#define ADC_CLOCK_FREQ_MIN_RUNTIME (2000000u) + +/* CAN module features */ + +/* @brief Frames available in Rx FIFO flag shift */ +#define FEATURE_CAN_RXFIFO_FRAME_AVAILABLE (5U) +/* @brief Rx FIFO warning flag shift */ +#define FEATURE_CAN_RXFIFO_WARNING (6U) +/* @brief Rx FIFO overflow flag shift */ +#define FEATURE_CAN_RXFIFO_OVERFLOW (7U) +/* @brief Has Flexible Data Rate for CAN0 */ +#define FEATURE_CAN0_HAS_FD (1) +/* @brief Maximum number of Message Buffers supported for payload size 8 for CAN0 */ +#define FEATURE_CAN0_MAX_MB_NUM (32U) +/* @brief Has PE clock source select (bit field CAN_CTRL1[CLKSRC]). */ +#define FEATURE_CAN_HAS_PE_CLKSRC_SELECT (1) +/* @brief Has DMA enable (bit field MCR[DMA]). */ +#define FEATURE_CAN_HAS_DMA_ENABLE (1) +/* @brief Maximum number of Message Buffers supported for payload size 8 for any of the CAN instances */ +#define FEATURE_CAN_MAX_MB_NUM (32U) +/* @brief Maximum number of Message Buffers supported for payload size 8 for any of the CAN instances */ +#define FEATURE_CAN_MAX_MB_NUM_ARRAY { FEATURE_CAN0_MAX_MB_NUM } +/* @brief Has Pretending Networking mode */ +#define FEATURE_CAN_HAS_PRETENDED_NETWORKING (1) +/* @brief Has Stuff Bit Count Enable Bit */ +#define FEATURE_CAN_HAS_STFCNTEN_ENABLE (0) +/* @brief Has ISO CAN FD Enable Bit */ +#define FEATURE_CAN_HAS_ISOCANFDEN_ENABLE (1) +/* @brief Has Message Buffer Data Size Region 1 */ +#define FEATURE_CAN_HAS_MBDSR1 (0) +/* @brief Has Message Buffer Data Size Region 2 */ +#define FEATURE_CAN_HAS_MBDSR2 (0) +/* @brief DMA hardware requests for all FlexCAN instances */ +#define FEATURE_CAN_EDMA_REQUESTS { EDMA_REQ_FLEXCAN0 } + +/* @brief Maximum number of Message Buffers IRQs */ +#define FEATURE_CAN_MB_IRQS_MAX_COUNT (2U) +/* @brief Message Buffers IRQs */ +#define FEATURE_CAN_MB_IRQS { CAN_ORed_0_15_MB_IRQS, \ + CAN_ORed_16_31_MB_IRQS } +/* @brief Has Wake Up Irq channels (CAN_Wake_Up_IRQS_CH_COUNT > 0u) */ +#define FEATURE_CAN_HAS_WAKE_UP_IRQ (1) +/* @brief Has Self Wake Up mode */ +#define FEATURE_CAN_HAS_SELF_WAKE_UP (0) +/* @brief Has Flexible Data Rate */ +#define FEATURE_CAN_HAS_FD (1) +/* @brief Clock name for the PE oscillator clock source */ +#define FEATURE_CAN_PE_OSC_CLK_NAME SOSC_CLK +/* @bried FlexCAN has Detection And Correction of Memory Errors */ +#define FEATURE_CAN_HAS_MEM_ERR_DET (0) + +/* LPTMR module features */ + +/* @brief LPTMR pulse counter input options */ +#define FEATURE_LPTMR_HAS_INPUT_ALT1_SELECTION (1U) + +/* OSIF module features */ + +#define FEATURE_OSIF_USE_SYSTICK (1) +#define FEATURE_OSIF_USE_PIT (0) +#define FEATURE_OSIF_FREERTOS_ISR_CONTEXT_METHOD (1) /* Cortex M device */ + +/* PDB module features */ + +/* @brief PDB has back-to-back at instance level */ +#define FEATURE_PDB_HAS_INSTANCE_BACKTOBACK (0) + +#endif /* S32K118_FEATURES_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/devassert.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/devassert.h new file mode 100644 index 00000000..243c8d45 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/devassert.h @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2017 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DEVASSERT_H +#define DEVASSERT_H + +#include + +/** + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 2.5, global macro not referenced. + * The macro is defined to be used by drivers to validate input parameters and can be disabled. + * + * @section [global] + * Violates MISRA 2012 Advisory Directive 4.9, Function-like macro defined. + * The macros are used to validate input parameters to driver functions. + * + */ + +/** +\page Error_detection_and_reporting Error detection and reporting + +S32 SDK drivers can use a mechanism to validate data coming from upper software layers (application code) by performing +a number of checks on input parameters' range or other invariants that can be statically checked (not dependent on +runtime conditions). A failed validation is indicative of a software bug in application code, therefore it is important +to use this mechanism during development. + +The validation is performed by using DEV_ASSERT macro. +A default implementation of this macro is provided in this file. However, application developers can provide their own +implementation in a custom file. This requires defining the CUSTOM_DEVASSERT symbol with the specific file name in the +project configuration (for example: -DCUSTOM_DEVASSERT="custom_devassert.h") + +The default implementation accommodates two behaviors, based on DEV_ERROR_DETECT symbol: + - When DEV_ERROR_DETECT symbol is defined in the project configuration (for example: -DDEV_ERROR_DETECT), the validation + performed by the DEV_ASSERT macro is enabled, and a failed validation triggers a software breakpoint and further execution is + prevented (application spins in an infinite loop) + This configuration is recommended for development environments, as it prevents further execution and allows investigating + potential problems from the point of error detection. + - When DEV_ERROR_DETECT symbol is not defined, the DEV_ASSERT macro is implemented as no-op, therefore disabling all validations. + This configuration can be used to eliminate the overhead of development-time checks. + +It is the application developer's responsibility to decide the error detection strategy for production code: one can opt to +disable development-time checking altogether (by not defining DEV_ERROR_DETECT symbol), or one can opt to keep the checks +in place and implement a recovery mechanism in case of a failed validation, by defining CUSTOM_DEVASSERT to point +to the file containing the custom implementation. +*/ + +#if defined (CUSTOM_DEVASSERT) + /* If the CUSTOM_DEVASSERT symbol is defined, then add the custom implementation */ + #include CUSTOM_DEVASSERT +#elif defined (DEV_ERROR_DETECT) + /* Implement default assert macro */ +static inline void DevAssert(volatile bool x) +{ + if(x) { } else { BKPT_ASM; for(;;) {} } +} + #define DEV_ASSERT(x) DevAssert(x) +#else + /* Assert macro does nothing */ + #define DEV_ASSERT(x) ((void)0) +#endif + +#endif /* DEVASSERT_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/device_registers.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/device_registers.h new file mode 100644 index 00000000..583a35d5 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/device_registers.h @@ -0,0 +1,67 @@ +/* +** ################################################################### +** Abstract: +** Common include file for CMSIS register access layer headers. +** +** Copyright (c) 2015 Freescale Semiconductor, Inc. +** Copyright 2016-2017 NXP +** All rights reserved. +** +** THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +** INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +** STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +** IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +** +** http: www.nxp.com +** mail: support@nxp.com +** ################################################################### +*/ + +#ifndef DEVICE_REGISTERS_H +#define DEVICE_REGISTERS_H + +/** +* @page misra_violations MISRA-C:2012 violations +* +* @section [global] +* Violates MISRA 2012 Advisory Rule 2.5, global macro not referenced. +* The macro defines the device currently in use and may be used by components for specific checks. +* +*/ + + +/* + * Include the cpu specific register header files. + * + * The CPU macro should be declared in the project or makefile. + */ + +#if defined(CPU_S32K118) + + #define S32K11x_SERIES + + /* Specific core definitions */ + #include "s32_core_cm0.h" + /* Register definitions */ + #include "S32K118.h" + /* CPU specific feature definitions */ + #include "S32K118_features.h" + +#else + #error "No valid CPU defined!" +#endif + +#include "devassert.h" + +#endif /* DEVICE_REGISTERS_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/s32_core_cm0.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/s32_core_cm0.h new file mode 100644 index 00000000..2dcd6e17 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/s32_core_cm0.h @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2015-2016 Freescale Semiconductor, Inc. + * Copyright 2016-2017 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + */ +/*! + * @file s32_core_cm0.h + * + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Directive 4.9, Function-like macro + * Function-like macros are used instead of inline functions in order to ensure + * that the performance will not be decreased if the functions will not be + * inlined by the compiler. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 2.5, Global macro not referenced. + * The macros defined are used only on some of the drivers, so this might be reported + * when the analysis is made only on one driver. + */ + +/* + * Tool Chains: + * GNUC flag is defined also by ARM compiler - it shows the current major version of the compatible GCC version + * __GNUC__ : GNU Compiler Collection + * __ghs__ : Green Hills ARM Compiler + * __ICCARM__ : IAR ARM Compiler + * __DCC__ : Wind River Diab Compiler + * __ARMCC_VERSION : ARM Compiler + */ + +#if !defined (CORE_CM0_H) +#define CORE_CM0_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/** \brief BKPT_ASM + * + * Macro to be used to trigger an debug interrupt + */ +#if defined ( __DCC__ ) +#define BKPT_ASM __asm ("BKPT 0\n\t") +#else +#define BKPT_ASM __asm ("BKPT #0\n\t") +#endif + +/** \brief Enable interrupts + */ +#if defined (__GNUC__) +#define ENABLE_INTERRUPTS() __asm volatile ("cpsie i" : : : "memory"); +#elif defined ( __DCC__ ) +#define ENABLE_INTERRUPTS() __asm (".short 0xb662"); +#else +#define ENABLE_INTERRUPTS() __asm("cpsie i") +#endif + + +/** \brief Disable interrupts + */ +#if defined (__GNUC__) +#define DISABLE_INTERRUPTS() __asm volatile ("cpsid i" : : : "memory"); +#elif defined ( __DCC__ ) +#define DISABLE_INTERRUPTS() __asm (".short 0xb672"); +#else +#define DISABLE_INTERRUPTS() __asm("cpsid i") +#endif + + +/** \brief Enter low-power standby state + * WFI (Wait For Interrupt) makes the processor suspend execution (Clock is stopped) until an IRQ interrupts. + */ +#if defined (__GNUC__) +#define STANDBY() __asm volatile ("wfi") +#elif defined ( __DCC__ ) +#define STANDBY() __asm (".short 0xbf30"); +#else +#define STANDBY() __asm ("wfi") +#endif + +/** \brief No-op + */ +#define NOP() __asm volatile ("nop") + + +/** \brief Reverse byte order in a word. + * ARM Documentation Cortex-M0 Devices Generic User Guide + * Accordingly to 3.5.7. REV, REV16, and REVSH + * Restriction "This function requires low registers R0-R7 register" + */ +#if defined (__GNUC__) || defined (__ICCARM__) || defined (__ARMCC_VERSION) +#define REV_BYTES_32(a, b) __asm volatile ("rev %0, %1" : "=l" (b) : "l" (a)) +#elif defined (__ghs__) +#define REV_BYTES_32(a, b) __asm volatile ("rev %0, %1" : "=r" (b) : "r" (a)) +#else +#define REV_BYTES_32(a, b) (b = ((a & 0xFF000000U) >> 24U) | ((a & 0xFF0000U) >> 8U) \ + | ((a & 0xFF00U) << 8U) | ((a & 0xFFU) << 24U)) +#endif + +/** \brief Reverse byte order in each halfword independently. + * ARM Documentation Cortex-M0 Devices Generic User Guide + * Accordingly to 3.5.7. REV, REV16, and REVSH + * Restriction "This function requires low registers R0-R7 register" + */ +#if defined (__GNUC__) || defined (__ICCARM__) || defined (__ARMCC_VERSION) +#define REV_BYTES_16(a, b) __asm volatile ("rev16 %0, %1" : "=l" (b) : "l" (a)) +#elif defined (__ghs__) +#define REV_BYTES_16(a, b) __asm volatile ("rev16 %0, %1" : "=r" (b) : "r" (a)) +#else +#define REV_BYTES_16(a, b) (b = ((a & 0xFF000000U) >> 8U) | ((a & 0xFF0000U) << 8U) \ + | ((a & 0xFF00U) >> 8U) | ((a & 0xFFU) << 8U)) +#endif + +/** \brief Places a function in RAM. + */ +#if defined ( __GNUC__ ) || defined (__ARMCC_VERSION) + #define START_FUNCTION_DECLARATION_RAMSECTION + #define END_FUNCTION_DECLARATION_RAMSECTION __attribute__((section (".code_ram"))); +#elif defined ( __ghs__ ) + #define START_FUNCTION_DECLARATION_RAMSECTION _Pragma("ghs callmode=far") + #define END_FUNCTION_DECLARATION_RAMSECTION __attribute__((section (".code_ram")));\ + _Pragma("ghs callmode=default") +#elif defined ( __ICCARM__ ) + #define START_FUNCTION_DECLARATION_RAMSECTION __ramfunc + #define END_FUNCTION_DECLARATION_RAMSECTION ; +#elif defined ( __DCC__ ) + #define START_FUNCTION_DECLARATION_RAMSECTION _Pragma("section CODE \".code_ram\" \"\" far-absolute") \ + _Pragma("use_section CODE") + #define END_FUNCTION_DECLARATION_RAMSECTION ; \ + _Pragma("section CODE \".text\"") +#else + /* Keep compatibility with software analysis tools */ + #define START_FUNCTION_DECLARATION_RAMSECTION + #define END_FUNCTION_DECLARATION_RAMSECTION ; +#endif + + /* For GCC, IAR, GHS, Diab and ARMC there is no need to specify the section when + defining a function, it is enough to specify it at the declaration. This + also enables compatibility with software analysis tools. */ + #define START_FUNCTION_DEFINITION_RAMSECTION + #define END_FUNCTION_DEFINITION_RAMSECTION + +#if defined (__ICCARM__) + #define DISABLE_CHECK_RAMSECTION_FUNCTION_CALL _Pragma("diag_suppress=Ta022") + #define ENABLE_CHECK_RAMSECTION_FUNCTION_CALL _Pragma("diag_default=Ta022") +#else + #define DISABLE_CHECK_RAMSECTION_FUNCTION_CALL + #define ENABLE_CHECK_RAMSECTION_FUNCTION_CALL +#endif + +/** \brief Get Core ID + * + * GET_CORE_ID returns the processor identification number for cm0 + */ +#define GET_CORE_ID() 0U + +/** \brief Data alignment. + */ +#if defined ( __GNUC__ ) || defined ( __ghs__ ) || defined ( __DCC__ ) || defined (__ARMCC_VERSION) + #define ALIGNED(x) __attribute__((aligned(x))) +#elif defined ( __ICCARM__ ) + #define stringify(s) tostring(s) + #define tostring(s) #s + #define ALIGNED(x) _Pragma(stringify(data_alignment=x)) +#else + /* Keep compatibility with software analysis tools */ + #define ALIGNED(x) +#endif + +/** \brief Endianness. + */ +#define CORE_LITTLE_ENDIAN + +#ifdef __cplusplus +} +#endif + +#endif /* CORE_CM0_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/startup.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/startup.c new file mode 100644 index 00000000..2d0efc61 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/startup.c @@ -0,0 +1,248 @@ +/* + * Copyright (c) 2013 - 2014, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.9, An object should be defined at block + * scope if its identifier only appears in a single function. + * All variables with this problem are defined in the linker files. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.11, When an array with external linkage + * is declared, its size should be explicitly specified. + * The size of the arrays can not be explicitly determined. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 11.4, A conversion should not be performed + * between a pointer to object and an integer type. + * The cast is required to initialize a pointer with an unsigned int define, + * representing an address. + * + * @section [global] + * Violates MISRA 2012 Required Rule 11.6, A cast shall not be performed + * between pointer to void and an arithmetic type. + * The cast is required to initialize a pointer with an unsigned int define, + * representing an address. + * + * @section [global] + * Violates MISRA 2012 Required Rule 2.1, A project shall not contain unreachable + * code. + * The condition compares two address defined in linker files that can be different. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.7, External could be made static. + * Function is defined for usage by application code. + * + * @section [global] + * Violates MISRA 2012 Mandatory Rule 17.3, Symbol 'MFSPR' undeclared, assumed + * to return int. + * This is an e200 Power Architecture Assembly instruction used to retrieve + * the core number. + * + */ + +#include "startup.h" +#include + + +/******************************************************************************* + * Static Variables + ******************************************************************************/ +static volatile uint32_t * const s_vectors[NUMBER_OF_CORES] = FEATURE_INTERRUPT_INT_VECTORS; + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*FUNCTION********************************************************************** + * + * Function Name : init_data_bss + * Description : Make necessary initializations for RAM. + * - Copy the vector table from ROM to RAM. + * - Copy initialized data from ROM to RAM. + * - Copy code that should reside in RAM from ROM + * - Clear the zero-initialized data section. + * + * Tool Chains: + * __GNUC__ : GNU Compiler Collection + * __ghs__ : Green Hills ARM Compiler + * __ICCARM__ : IAR ARM Compiler + * __DCC__ : Wind River Diab Compiler + * __ARMCC_VERSION : ARMC Compiler + * + * Implements : init_data_bss_Activity + *END**************************************************************************/ +void init_data_bss(void) +{ + uint32_t n; + uint8_t coreId; +/* For ARMC we are using the library method of initializing DATA, Custom Section and + * Code RAM sections so the below variables are not needed */ +#if !defined(__ARMCC_VERSION) + /* Declare pointers for various data sections. These pointers + * are initialized using values pulled in from the linker file */ + uint8_t * data_ram; + uint8_t * code_ram; + uint8_t * bss_start; + uint8_t * custom_ram; + const uint8_t * data_rom, * data_rom_end; + const uint8_t * code_rom, * code_rom_end; + const uint8_t * bss_end; + const uint8_t * custom_rom, * custom_rom_end; +#endif + /* Addresses for VECTOR_TABLE and VECTOR_RAM come from the linker file */ + +#if defined(__ARMCC_VERSION) + extern uint32_t __RAM_VECTOR_TABLE_SIZE; + extern uint32_t __VECTOR_ROM; + extern uint32_t __VECTOR_RAM; +#else + extern uint32_t __RAM_VECTOR_TABLE_SIZE[]; + extern uint32_t __VECTOR_TABLE[]; + extern uint32_t __VECTOR_RAM[]; +#endif + /* Get section information from linker files */ +#if defined(__ICCARM__) + /* Data */ + data_ram = __section_begin(".data"); + data_rom = __section_begin(".data_init"); + data_rom_end = __section_end(".data_init"); + + /* CODE RAM */ + #pragma section = "__CODE_ROM" + #pragma section = "__CODE_RAM" + code_ram = __section_begin("__CODE_RAM"); + code_rom = __section_begin("__CODE_ROM"); + code_rom_end = __section_end("__CODE_ROM"); + + /* BSS */ + bss_start = __section_begin(".bss"); + bss_end = __section_end(".bss"); + + custom_ram = __section_begin(".customSection"); + custom_rom = __section_begin(".customSection_init"); + custom_rom_end = __section_end(".customSection_init"); + +#elif defined (__ARMCC_VERSION) + /* VECTOR TABLE*/ + uint8_t * vector_table_size = (uint8_t *)__RAM_VECTOR_TABLE_SIZE; + uint32_t * vector_rom = (uint32_t *)__VECTOR_ROM; + uint32_t * vector_ram = (uint32_t *)__VECTOR_RAM; +#else + extern uint32_t __DATA_ROM[]; + extern uint32_t __DATA_RAM[]; + extern uint32_t __DATA_END[]; + + extern uint32_t __CODE_RAM[]; + extern uint32_t __CODE_ROM[]; + extern uint32_t __CODE_END[]; + + extern uint32_t __BSS_START[]; + extern uint32_t __BSS_END[]; + + extern uint32_t __CUSTOM_ROM[]; + extern uint32_t __CUSTOM_END[]; + + /* Data */ + data_ram = (uint8_t *)__DATA_RAM; + data_rom = (uint8_t *)__DATA_ROM; + data_rom_end = (uint8_t *)__DATA_END; + /* CODE RAM */ + code_ram = (uint8_t *)__CODE_RAM; + code_rom = (uint8_t *)__CODE_ROM; + code_rom_end = (uint8_t *)__CODE_END; + /* BSS */ + bss_start = (uint8_t *)__BSS_START; + bss_end = (uint8_t *)__BSS_END; + + /* Custom section */ + custom_ram = CUSTOMSECTION_SECTION_START; + custom_rom = (uint8_t *)__CUSTOM_ROM; + custom_rom_end = (uint8_t *)__CUSTOM_END; + +#endif + +#if !defined(__ARMCC_VERSION) + /* Copy initialized data from ROM to RAM */ + while (data_rom_end != data_rom) + { + *data_ram = *data_rom; + data_ram++; + data_rom++; + } + + /* Copy functions from ROM to RAM */ + while (code_rom_end != code_rom) + { + *code_ram = *code_rom; + code_ram++; + code_rom++; + } + + /* Clear the zero-initialized data section */ + while(bss_end != bss_start) + { + *bss_start = 0; + bss_start++; + } + + /* Copy customsection rom to ram */ + while(custom_rom_end != custom_rom) + { + *custom_ram = *custom_rom; + custom_rom++; + custom_ram++; + } +#endif + coreId = (uint8_t)GET_CORE_ID(); +#if defined (__ARMCC_VERSION) + /* Copy the vector table from ROM to RAM */ + /* Workaround */ + for (n = 0; n < (((uint32_t)(vector_table_size))/sizeof(uint32_t)); n++) + { + vector_ram[n] = vector_rom[n]; + } + /* Point the VTOR to the position of vector table */ + *s_vectors[coreId] = (uint32_t) __VECTOR_RAM; +#else + /* Check if VECTOR_TABLE copy is needed */ + if (__VECTOR_RAM != __VECTOR_TABLE) + { + /* Copy the vector table from ROM to RAM */ + for (n = 0; n < (((uint32_t)__RAM_VECTOR_TABLE_SIZE)/sizeof(uint32_t)); n++) + { + __VECTOR_RAM[n] = __VECTOR_TABLE[n]; + } + /* Point the VTOR to the position of vector table */ + *s_vectors[coreId] = (uint32_t)__VECTOR_RAM; + } + else + { + /* Point the VTOR to the position of vector table */ + *s_vectors[coreId] = (uint32_t)__VECTOR_TABLE; + } +#endif + +} + +/******************************************************************************* + * EOF + ******************************************************************************/ + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/startup.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/startup.h new file mode 100644 index 00000000..8384b7db --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/startup.h @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2013 - 2014, Freescale Semiconductor, Inc. + * Copyright 2016-2019 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef STARTUP_H +#define STARTUP_H + +#include +#include "device_registers.h" +/** + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 2.5, Local macro not referenced. + * The defined macro is used as include guard. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.9, An object should be defined at block + * scope if its identifier only appears in a single function. + * All variables with this problem are defined in the linker files. + * + */ + +/******************************************************************************* + * API + ******************************************************************************/ + +/*! + * @brief define symbols that specific start and end addres of some basic sections. + */ +#if (defined(S32K14x_SERIES) || defined(S32K11x_SERIES) || defined(S32V234_SERIES) || defined(MPC574x_SERIES) || defined(S32R_SERIES) || defined(S32MTV_SERIES) || defined(SJA1110_SERIES)) || defined (S32K144W_M4_SERIES) + #if (defined(__ICCARM__)) + #define INTERRUPTS_SECTION_START __section_begin(".intvec") + #define INTERRUPTS_SECTION_END __section_end(".intvec") + #define BSS_SECTION_START __section_begin(".bss") + #define BSS_SECTION_END __section_end(".bss") + #define DATA_SECTION_START __section_begin(".data") + #define DATA_SECTION_END __section_end(".data") + #define CUSTOMSECTION_SECTION_START __section_begin(".customSection") + #define CUSTOMSECTION_SECTION_END __section_end(".customSection") + #define CODE_RAM_SECTION_START __section_begin("__CODE_RAM") + #define CODE_RAM_SECTION_END __section_end("__CODE_RAM") + #define DATA_INIT_SECTION_START __section_begin(".data_init") + #define DATA_INIT_SECTION_END __section_end(".data_init") + #define CODE_ROM_SECTION_START __section_begin("__CODE_ROM") + #define CODE_ROM_SECTION_END __section_end("__CODE_ROM") + + #elif (defined(__ARMCC_VERSION)) + #define INTERRUPTS_SECTION_START (uint8_t *)__VECTOR_ROM_START + #define INTERRUPTS_SECTION_END (uint8_t *)__VECTOR_ROM_END + #define BSS_SECTION_START (uint8_t *)__BSS_START + #define BSS_SECTION_END (uint8_t *)__BSS_END + #define DATA_SECTION_START (uint8_t *)__DATA_RAM_START + #define DATA_SECTION_END (uint8_t *)__DATA_RAM_END + #define CUSTOMSECTION_SECTION_START (uint8_t *)__CUSTOM_SECTION_START + #define CUSTOMSECTION_SECTION_END (uint8_t *)__CUSTOM_SECTION_END + #define CODE_RAM_SECTION_START (uint8_t *)__CODE_RAM_START + #define CODE_RAM_SECTION_END (uint8_t *)__CODE_RAM_END + + extern uint32_t __VECTOR_ROM_START; + extern uint32_t __VECTOR_ROM_END; + extern uint32_t __BSS_START; + extern uint32_t __BSS_END; + extern uint32_t __DATA_RAM_START; + extern uint32_t __DATA_RAM_END; + extern uint32_t __CUSTOM_SECTION_START; + extern uint32_t __CUSTOM_SECTION_END; + extern uint32_t __CODE_RAM_START; + extern uint32_t __CODE_RAM_END; + #else + #define INTERRUPTS_SECTION_START (uint8_t *)&__interrupts_start__ + #define INTERRUPTS_SECTION_END (uint8_t *)&__interrupts_end__ + #define BSS_SECTION_START (uint8_t *)&__bss_start__ + #define BSS_SECTION_END (uint8_t *)&__bss_end__ + #define DATA_SECTION_START (uint8_t *)&__data_start__ + #define DATA_SECTION_END (uint8_t *)&__data_end__ + #define CUSTOMSECTION_SECTION_START (uint8_t *)&__customSection_start__ + #define CUSTOMSECTION_SECTION_END (uint8_t *)&__customSection_end__ + #define CODE_RAM_SECTION_START (uint8_t *)&__code_ram_start__ + #define CODE_RAM_SECTION_END (uint8_t *)&__code_ram_end__ + + extern uint32_t __interrupts_start__; + extern uint32_t __interrupts_end__; + extern uint32_t __bss_start__; + extern uint32_t __bss_end__; + extern uint32_t __data_start__; + extern uint32_t __data_end__; + extern uint32_t __customSection_start__; + extern uint32_t __customSection_end__; + extern uint32_t __code_ram_start__; + extern uint32_t __code_ram_end__; + #endif +#endif + +#if (defined(__ICCARM__)) + #pragma section = ".data" + #pragma section = ".data_init" + #pragma section = ".bss" + #pragma section = ".intvec" + #pragma section = ".customSection" + #pragma section = ".customSection_init" + #pragma section = "__CODE_RAM" + #pragma section = "__CODE_ROM" +#endif + +/*! + * @brief Make necessary initializations for RAM. + * + * - Copy initialized data from ROM to RAM. + * - Clear the zero-initialized data section. + * - Copy the vector table from ROM to RAM. This could be an option. + */ +void init_data_bss(void); + +#endif /* STARTUP_H*/ +/******************************************************************************* + * EOF + ******************************************************************************/ + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/system_S32K118.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/system_S32K118.c new file mode 100644 index 00000000..868b365b --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/system_S32K118.c @@ -0,0 +1,176 @@ +/* + * Copyright 2017-2018 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.9, An object should be defined at block + * scope if its identifier only appears in a single function. + * An object with static storage duration declared at block scope cannot be + * accessed directly from outside the block. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 11.4, A conversion should not be performed + * between a pointer to object and an integer type. + * The cast is required to initialize a pointer with an unsigned int define, + * representing an address. + * + * @section [global] + * Violates MISRA 2012 Required Rule 11.6, A cast shall not be performed + * between pointer to void and an arithmetic type. + * The cast is required to initialize a pointer with an unsigned int define, + * representing an address. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.7, External could be made static. + * Function is defined for usage by application code. + * + */ + +#include "device_registers.h" +#include "system_S32K118.h" +#include "stdbool.h" + +/* ---------------------------------------------------------------------------- + -- Core clock + ---------------------------------------------------------------------------- */ + +uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK; + +/*FUNCTION********************************************************************** + * + * Function Name : SystemInit + * Description : This function disables the watchdog, enables FPU + * and the power mode protection if the corresponding feature macro + * is enabled. SystemInit is called from startup_device file. + * + * Implements : SystemInit_Activity + *END**************************************************************************/ +void SystemInit(void) +{ +/**************************************************************************/ +/* WDOG DISABLE*/ +/**************************************************************************/ + +#if (DISABLE_WDOG) + /* Write of the WDOG unlock key to CNT register, must be done in order to allow any modifications*/ + WDOG->CNT = (uint32_t ) FEATURE_WDOG_UNLOCK_VALUE; + /* The dummy read is used in order to make sure that the WDOG registers will be configured only + * after the write of the unlock value was completed. */ + (void)WDOG->CNT; + + /* Initial write of WDOG configuration register: + * enables support for 32-bit refresh/unlock command write words, + * clock select from LPO, update enable, watchdog disabled */ + WDOG->CS = (uint32_t ) ( (1UL << WDOG_CS_CMD32EN_SHIFT) | + (FEATURE_WDOG_CLK_FROM_LPO << WDOG_CS_CLK_SHIFT) | + (0U << WDOG_CS_EN_SHIFT) | + (1U << WDOG_CS_UPDATE_SHIFT) ); + + /* Configure timeout */ + WDOG->TOVAL = (uint32_t )0xFFFF; +#endif /* (DISABLE_WDOG) */ +} + +/*FUNCTION********************************************************************** + * + * Function Name : SystemCoreClockUpdate + * Description : This function must be called whenever the core clock is changed + * during program execution. It evaluates the clock register settings and calculates + * the current core clock. + * + * Implements : SystemCoreClockUpdate_Activity + *END**************************************************************************/ +void SystemCoreClockUpdate(void) +{ + uint32_t SCGOUTClock = 0U; /* Variable to store output clock frequency of the SCG module */ + uint32_t regValue; /* Temporary variable */ + uint32_t divider; + bool validSystemClockSource = true; + + divider = ((SCG->CSR & SCG_CSR_DIVCORE_MASK) >> SCG_CSR_DIVCORE_SHIFT) + 1U; + + switch ((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT) + { + case 0x1: + /* System OSC */ + SCGOUTClock = CPU_XTAL_CLK_HZ; + break; + case 0x2: + /* Slow IRC */ + regValue = (SCG->SIRCCFG & SCG_SIRCCFG_RANGE_MASK) >> SCG_SIRCCFG_RANGE_SHIFT; + if (regValue != 0UL) + { + SCGOUTClock = FEATURE_SCG_SIRC_HIGH_RANGE_FREQ; + } + else + { + validSystemClockSource = false; + } + break; + case 0x3: + /* Fast IRC */ + regValue = (SCG->FIRCCFG & SCG_FIRCCFG_RANGE_MASK) >> SCG_FIRCCFG_RANGE_SHIFT; + if (regValue == 0x0UL) + { + SCGOUTClock = FEATURE_SCG_FIRC_FREQ0; + } + else + { + validSystemClockSource = false; + } + break; + default: + validSystemClockSource = false; + break; + } + + if (validSystemClockSource == true) + { + SystemCoreClock = (SCGOUTClock / divider); + } +} + +/*FUNCTION********************************************************************** + * + * Function Name : SystemSoftwareReset + * Description : This function is used to initiate a system reset + * + * Implements : SystemSoftwareReset_Activity + *END**************************************************************************/ +void SystemSoftwareReset(void) +{ + uint32_t regValue; + + /* Read Application Interrupt and Reset Control Register */ + regValue = S32_SCB->AIRCR; + + /* Clear register key */ + regValue &= ~( S32_SCB_AIRCR_VECTKEY_MASK); + + /* Configure System reset request bit and Register Key */ + regValue |= S32_SCB_AIRCR_VECTKEY(FEATURE_SCB_VECTKEY); + regValue |= S32_SCB_AIRCR_SYSRESETREQ(0x1u); + + /* Write computed register value */ + S32_SCB->AIRCR = regValue; +} + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/system_S32K118.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/system_S32K118.h new file mode 100644 index 00000000..6e98f97f --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/lib/system_S32K118.h @@ -0,0 +1,105 @@ +/* + * Copyright 2017-2018 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +/*! @addtogroup soc_support_S32K118*/ +/*! @{*/ + +/*! + * @file system_S32K118.h + * @brief Device specific configuration file for S32K118 + */ + +#ifndef SYSTEM_S32K118_H_ +#define SYSTEM_S32K118_H_ /**< Symbol preventing repeated inclusion */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * CPU Settings. + *****************************************************************************/ + +/* Watchdog disable */ +#ifndef DISABLE_WDOG + #define DISABLE_WDOG 1 +#endif + +/* Value of the external crystal or oscillator clock frequency in Hz */ +#ifndef CPU_XTAL_CLK_HZ + #define CPU_XTAL_CLK_HZ 8000000u +#endif + +/* Value of the fast internal oscillator clock frequency in Hz */ +#ifndef CPU_INT_FAST_CLK_HZ + #define CPU_INT_FAST_CLK_HZ 48000000u +#endif + +/* Default System clock value */ +#ifndef DEFAULT_SYSTEM_CLOCK + #define DEFAULT_SYSTEM_CLOCK 48000000u +#endif + +/** + * @brief System clock frequency (core clock) + * + * The system clock frequency supplied to the SysTick timer and the processor + * core clock. This variable can be used by the user application to setup the + * SysTick timer or configure other parameters. It may also be used by debugger to + * query the frequency of the debug timer or configure the trace clock speed + * SystemCoreClock is initialized with a correct predefined value. + */ +extern uint32_t SystemCoreClock; + +/** + * @brief Setup the SoC. + * + * This function disables the watchdog. + * if the corresponding feature macro is enabled. + * SystemInit is called from startup_device file. + */ +void SystemInit(void); + +/** + * @brief Updates the SystemCoreClock variable. + * + * It must be called whenever the core clock is changed during program + * execution. SystemCoreClockUpdate() evaluates the clock register settings and calculates + * the current core clock. + * This function must be called when user does not want to use clock manager component. + * If clock manager is used, the CLOCK_SYS_GetFreq function must be used with CORE_CLOCK + * parameter. + * + */ +void SystemCoreClockUpdate(void); + +/** + * @brief Initiates a system reset. + * + * This function is used to initiate a system reset + */ +void SystemSoftwareReset(void); + +#ifdef __cplusplus +} +#endif + +/*! @}*/ +#endif /* #if !defined(SYSTEM_S32K118_H_) */ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/main.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/main.c new file mode 100644 index 00000000..a2a5cb42 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/main.c @@ -0,0 +1,186 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_GCC/Boot/main.c +* \brief Bootloader application source file. +* \ingroup Boot_ARMCM0_S32K14_S32K118EVB_GCC +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#include "device_registers.h" /* device registers */ +#include "system_S32K118.h" /* device sconfiguration */ + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +static void Init(void); +static void SystemClockConfig(void); + + +/************************************************************************************//** +** \brief This is the entry point for the bootloader application and is called +** by the reset interrupt vector after the C-startup routines executed. +** \return none. +** +****************************************************************************************/ +void main(void) +{ + /* Initialize the microcontroller. */ + Init(); + /* Initialize the bootloader. */ + BootInit(); + + /* Start the infinite program loop. */ + while (1) + { + /* Run the bootloader task. */ + BootTask(); + } +} /*** end of main ***/ + + +/************************************************************************************//** +** \brief Initializes the microcontroller. +** \return none. +** +****************************************************************************************/ +static void Init(void) +{ + /* Configure the system clock. */ + SystemClockConfig(); + /* Enable the peripheral clock for the ports that are used. */ + PCC->PCCn[PCC_PORTB_INDEX] |= PCC_PCCn_CGC_MASK; + PCC->PCCn[PCC_PORTD_INDEX] |= PCC_PCCn_CGC_MASK; + PCC->PCCn[PCC_PORTE_INDEX] |= PCC_PCCn_CGC_MASK; + + /* Configure SW2 (PD3) GPIO pin for (optional) backdoor entry input. */ + /* Input GPIO pin configuration. PD3 = GPIO, MUX = ALT1. */ + PORTD->PCR[3] |= PORT_PCR_MUX(1); + /* Disable pull device, as SW2 already has a pull down resistor on the board. */ + PORTD->PCR[3] &= ~PORT_PCR_PE(1); + /* Configure and enable Port D pin 3 GPIO as digital input */ + PTD->PDDR &= ~GPIO_PDDR_PDD(1 << 3U); + PTD->PIDR &= ~GPIO_PIDR_PID(1 << 3U); +#if (BOOT_COM_RS232_ENABLE > 0) + /* UART RX GPIO pin configuration. PB0 = UART0 RX, MUX = ALT2. */ + PORTB->PCR[0] |= PORT_PCR_MUX(2); + /* UART TX GPIO pin configuration. PB1 = UART0 TX, MUX = ALT2. */ + PORTB->PCR[1] |= PORT_PCR_MUX(2); +#endif +#if (BOOT_COM_CAN_ENABLE > 0) + /* CAN RX GPIO pin configuration. PE4 = CAN0 RX, MUX = ALT5. */ + PORTE->PCR[4] |= PORT_PCR_MUX(5); + /* CAN TX GPIO pin configuration. PE5 = CAN0 TX, MUX = ALT5. */ + PORTE->PCR[5] |= PORT_PCR_MUX(5); +#endif +} /*** end of Init ***/ + + +/************************************************************************************//** +** \brief System Clock Configuration. This code was derived from a S32 Design Studio +** example program. It enables the SOCS (40 MHz external crystal), FIRC (48 +** MHz internal) and SIRC (8 MHz internal). The FIRC is used as a source for +** the system clock and configures the normal RUN mode for the following clock +** settings: +** - CORE_CLK = 48 MHz +** - SYS_CLK = 48 MHz +** - BUS_CLK = 48 MHz +** - FLASH_CLK = 24 MHz +** - SOSCDIV1_CLK = 40 MHz +** - SOSCDIV2_CLK = 40 MHz +** - FIRCDIV1_CLK = 48 MHz +** - FIRCDIV2_CLK = 48 MHz +** - SIRCDIV1_CLK = 8 MHz +** - SIRCDIV2_CLK = 8 MHz +** \return none. +** +****************************************************************************************/ +static void SystemClockConfig(void) +{ + /* --------- SOSC Initialization (40 MHz) ------------------------------------------ */ + /* SOSCDIV1 & SOSCDIV2 =1: divide by 1. */ + SCG->SOSCDIV = SCG_SOSCDIV_SOSCDIV1(1) | SCG_SOSCDIV_SOSCDIV2(1); + /* Range=3: High freq (SOSC betw 8MHz - 40MHz). + * HGO=0: Config xtal osc for low power. + * EREFS=1: Input is external XTAL. + */ + SCG->SOSCCFG = SCG_SOSCCFG_RANGE(3) | SCG_SOSCCFG_EREFS_MASK; + /* Ensure SOSCCSR unlocked. */ + while (SCG->SOSCCSR & SCG_SOSCCSR_LK_MASK) + { + ; + } + + /* LK=0: SOSCCSR can be written. + * SOSCCMRE=0: OSC CLK monitor IRQ if enabled. + * SOSCCM=0: OSC CLK monitor disabled. + * SOSCERCLKEN=0: Sys OSC 3V ERCLK output clk disabled. + * SOSCLPEN=0: Sys OSC disabled in VLP modes. + * SOSCSTEN=0: Sys OSC disabled in Stop modes. + * SOSCEN=1: Enable oscillator. + */ + SCG->SOSCCSR = SCG_SOSCCSR_SOSCEN_MASK; + /* Wait for system OSC clock to become valid. */ + while (!(SCG->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK)) + { + ; + } + + /* --------- FIRC Initialization --------------------------------------------------- */ + /* Fast IRC is enabled and trimmed to 48 MHz in reset (default). Enable FIRCDIV2_CLK + * and FIRCDIV1_CLK, divide by 1 = 48 MHz. + */ + SCG->FIRCDIV = SCG_FIRCDIV_FIRCDIV1(1) | SCG_FIRCDIV_FIRCDIV2(1); + + /* --------- SIRC Initialization --------------------------------------------------- */ + /* Slow IRC is enabled with high range (8 MHz) in reset. Enable SIRCDIV2_CLK and + * SIRCDIV1_CLK, divide by 1 = 8MHz asynchronous clock source. + */ + SCG->SIRCDIV = SCG_SIRCDIV_SIRCDIV1(1) | SCG_SIRCDIV_SIRCDIV2(1); + + /* --------- Change to normal RUN mode with 48MHz FIRC ----------------------------- */ + /* Select FIRC as clock source. + * DIVCORE=0, div. by 1: Core clock = 48 MHz. + * DIVBUS=0, div. by 1: bus clock = 48 MHz. + * DIVSLOW=1, div. by 2: SCG slow, flash clock= 24 MHz + */ + SCG->RCCR = SCG_RCCR_SCS(3) | SCG_RCCR_DIVCORE(0) | SCG_RCCR_DIVBUS(0) | + SCG_RCCR_DIVSLOW(1); + + /* Wait until system clock source is FIRC. */ + while (((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT ) != 3U) + { + ; + } + /* Evaluate the clock register settings and calculates the current core clock. This + * function must be called when the clock manager component is not used. + */ + SystemCoreClockUpdate(); +} /*** end of SystemClockConfig ***/ + + +/*********************************** end of main.c *************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/startup_S32K118.s b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/startup_S32K118.s new file mode 100644 index 00000000..68f775b7 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Boot/startup_S32K118.s @@ -0,0 +1,287 @@ +; --------------------------------------------------------------------------------------- +; @file: startup_S32K118.s +; @purpose: IAR Startup File +; S32K118 +; @version: 1.0 +; @date: 2018-1-22 +; @build: b170107 +; --------------------------------------------------------------------------------------- +; +; Copyright 2018 NXP +; All rights reserved. +; +; THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR +; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +; IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +; INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +; STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +; IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +; THE POSSIBILITY OF SUCH DAMAGE. +; +; 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:CODE:ROOT(2) + + EXTERN main + EXTERN SystemInit + EXTERN init_data_bss + PUBLIC __vector_table + PUBLIC __vector_table_0x1c + PUBLIC __Vectors + PUBLIC __Vectors_End + PUBLIC __Vectors_Size + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; Non Maskable Interrupt + DCD HardFault_Handler ; Cortex-M0 SV Hard Fault Interrupt + DCD 0 + DCD 0 + DCD 0 +__vector_table_0x1c + DCD 0 + DCD 0 + DCD 0 + DCD 0 + DCD SVC_Handler ; Cortex-M0 SV Call Interrupt + DCD 0 + DCD 0 + DCD PendSV_Handler ; Cortex-M0 Pend SV Interrupt + DCD SysTick_Handler ; Cortex-M0 System Tick Interrupt + + + DCD DMA0_IRQHandler ; DMA channel 0 transfer complete + DCD DMA1_IRQHandler ; DMA channel 1 transfer complete + DCD DMA2_IRQHandler ; DMA channel 2 transfer complete + DCD DMA3_IRQHandler ; DMA channel 3 transfer complete + DCD DMA_Error_IRQHandler ; DMA error interrupt channels 0-3 + DCD ERM_fault_IRQHandler ; ERM single and double bit error correction + DCD RTC_IRQHandler ; RTC alarm interrupt + DCD RTC_Seconds_IRQHandler ; RTC seconds interrupt + DCD LPTMR0_IRQHandler ; LPTIMER interrupt request + DCD PORT_IRQHandler ; Port A, B, C, D and E pin detect interrupt + DCD CAN0_ORed_Err_Wakeup_IRQHandler ; OR’ed [Bus Off OR Bus Off Done OR Transmit Warning OR Receive Warning], Interrupt indicating that errors were detected on the CAN bus, Interrupt asserted when Pretended Networking operation is enabled, and a valid message matches the selected filter criteria during Low Power mode + DCD CAN0_ORed_0_31_MB_IRQHandler ; OR’ed Message buffer (0-15, 16-31) + DCD FTM0_Ch0_7_IRQHandler ; FTM0 Channel 0 to 7 interrupt + DCD FTM0_Fault_IRQHandler ; FTM0 Fault interrupt + DCD FTM0_Ovf_Reload_IRQHandler ; FTM0 Counter overflow and Reload interrupt + DCD FTM1_Ch0_7_IRQHandler ; FTM1 Channel 0 to 7 interrupt + DCD FTM1_Fault_IRQHandler ; FTM1 Fault interrupt + DCD FTM1_Ovf_Reload_IRQHandler ; FTM1 Counter overflow and Reload interrupt + DCD FTFC_IRQHandler ; FTFC Command complete, Read collision and Double bit fault detect + DCD PDB0_IRQHandler ; PDB0 interrupt + DCD LPIT0_IRQHandler ; LPIT interrupt + DCD SCG_CMU_LVD_LVWSCG_IRQHandler ; PMC Low voltage detect interrupt, SCG bus interrupt request and CMU loss of range interrupt + DCD WDOG_IRQHandler ; WDOG interrupt request out before wdg reset out + DCD RCM_IRQHandler ; RCM Asynchronous Interrupt + DCD LPI2C0_Master_Slave_IRQHandler ; LPI2C0 Master Interrupt and Slave Interrupt + DCD FLEXIO_IRQHandler ; FlexIO Interrupt + DCD LPSPI0_IRQHandler ; LPSPI0 Interrupt + DCD LPSPI1_IRQHandler ; LPSPI1 Interrupt + DCD ADC0_IRQHandler ; ADC0 interrupt request. + DCD CMP0_IRQHandler ; CMP0 interrupt request + DCD LPUART1_RxTx_IRQHandler ; LPUART1 Transmit / Receive Interrupt + DCD LPUART0_RxTx_IRQHandler ; LPUART0 Transmit / Receive Interrupt +__Vectors_End + + SECTION FlashConfig:CODE +__FlashConfig + DCD 0xFFFFFFFF ; 8 bytes backdoor comparison key + DCD 0xFFFFFFFF ; + DCD 0xFFFFFFFF ; 4 bytes program flash protection bytes + DCD 0xFFFF7FFE ; FDPROT:FEPROT:FOPT:FSEC(0xFE = unsecured) +__FlashConfig_End + +__Vectors EQU __vector_table +__Vectors_Size EQU __Vectors_End - __Vectors + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER:NOROOT(2) +Reset_Handler + CPSID I ; Mask interrupts + ;; Init the rest of the registers + LDR R1,=0 + LDR R2,=0 + LDR R3,=0 + LDR R4,=0 + LDR R5,=0 + LDR R6,=0 + LDR R7,=0 + MOV R8,R7 + MOV R9,R7 + MOV R10,R7 + MOV R11,R7 + MOV R12,R7 + +#ifdef START_FROM_FLASH + IMPORT __RAM_START, __RAM_END + ;; INIT ECC RAM + + LDR R1, =__RAM_START + LDR R2, =__RAM_END + + SUBS R2, R2, R1 + SUBS R2, #1 + BLE .LC5 + + MOVS R0, #0 + MOVS R3, #4 + .LC4: + STR R0, [R1] + ADD R1, R1, R3 + SUBS R2, #4 + BGE .LC4 + .LC5: +#endif + ;; Initialize the stack pointer + LDR R0, =sfe(CSTACK) + MOV R13,R0 + +#ifndef __NO_SYSTEM_INIT + ;; Call the CMSIS system init routine + LDR R0, =SystemInit + BLX R0 +#endif + + ;; Init .data and .bss sections + LDR R0, =init_data_bss + BLX R0 + CPSIE I ; Unmask interrupts + + BL main +JumpToSelf + B JumpToSelf + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +NMI_Handler + B . + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +HardFault_Handler + B . + + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SVC_Handler + B . + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +PendSV_Handler + B . + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SysTick_Handler + B . + + PUBWEAK DMA0_IRQHandler + PUBWEAK DMA1_IRQHandler + PUBWEAK DMA2_IRQHandler + PUBWEAK DMA3_IRQHandler + PUBWEAK DMA_Error_IRQHandler + PUBWEAK ERM_fault_IRQHandler + PUBWEAK RTC_IRQHandler + PUBWEAK RTC_Seconds_IRQHandler + PUBWEAK LPTMR0_IRQHandler + PUBWEAK PORT_IRQHandler + PUBWEAK CAN0_ORed_Err_Wakeup_IRQHandler + PUBWEAK CAN0_ORed_0_31_MB_IRQHandler + PUBWEAK FTM0_Ch0_7_IRQHandler + PUBWEAK FTM0_Fault_IRQHandler + PUBWEAK FTM0_Ovf_Reload_IRQHandler + PUBWEAK FTM1_Ch0_7_IRQHandler + PUBWEAK FTM1_Fault_IRQHandler + PUBWEAK FTM1_Ovf_Reload_IRQHandler + PUBWEAK FTFC_IRQHandler + PUBWEAK PDB0_IRQHandler + PUBWEAK LPIT0_IRQHandler + PUBWEAK SCG_CMU_LVD_LVWSCG_IRQHandler + PUBWEAK WDOG_IRQHandler + PUBWEAK RCM_IRQHandler + PUBWEAK LPI2C0_Master_Slave_IRQHandler + PUBWEAK FLEXIO_IRQHandler + PUBWEAK LPSPI0_IRQHandler + PUBWEAK LPSPI1_IRQHandler + PUBWEAK ADC0_IRQHandler + PUBWEAK CMP0_IRQHandler + PUBWEAK LPUART1_RxTx_IRQHandler + PUBWEAK LPUART0_RxTx_IRQHandler + PUBWEAK DefaultISR + SECTION .text:CODE:REORDER:NOROOT(1) +NMI_Handler +HardFault_Handler +SVC_Handler +PendSV_Handler +SysTick_Handler +DMA0_IRQHandler +DMA1_IRQHandler +DMA2_IRQHandler +DMA3_IRQHandler +DMA_Error_IRQHandler +ERM_fault_IRQHandler +RTC_IRQHandler +RTC_Seconds_IRQHandler +LPTMR0_IRQHandler +PORT_IRQHandler +CAN0_ORed_Err_Wakeup_IRQHandler +CAN0_ORed_0_31_MB_IRQHandler +FTM0_Ch0_7_IRQHandler +FTM0_Fault_IRQHandler +FTM0_Ovf_Reload_IRQHandler +FTM1_Ch0_7_IRQHandler +FTM1_Fault_IRQHandler +FTM1_Ovf_Reload_IRQHandler +FTFC_IRQHandler +PDB0_IRQHandler +LPIT0_IRQHandler +SCG_CMU_LVD_LVWSCG_IRQHandler +WDOG_IRQHandler +RCM_IRQHandler +LPI2C0_Master_Slave_IRQHandler +FLEXIO_IRQHandler +LPSPI0_IRQHandler +LPSPI1_IRQHandler +ADC0_IRQHandler +CMP0_IRQHandler +LPUART1_RxTx_IRQHandler +LPUART0_RxTx_IRQHandler +DefaultISR + B DefaultISR + + END diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/S32K118_25_flash.icf b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/S32K118_25_flash.icf new file mode 100644 index 00000000..611257c3 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/S32K118_25_flash.icf @@ -0,0 +1,125 @@ +/* +** ################################################################### +** Processor: S32K118 with 25 KB SRAM +** Compiler: IAR ANSI C/C++ Compiler for ARM +** +** Abstract: +** Linker file for the IAR ANSI C/C++ Compiler for ARM +** +** Copyright 2018 NXP +** All rights reserved. +** +** THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +** INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +** STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +** IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +** +** http: www.freescale.com +** mail: support@freescale.com +** +** ################################################################### +*/ + +/* If symbol __flash_vector_table__=1 is defined at link time + * the interrupt vector will not be copied to RAM. + * Warning: Using the interrupt vector from FLASH will not allow + * INT_SYS_InstallHandler because the section is Read Only. + */ +define symbol __ram_vector_table_size__ = isdefinedsymbol(__flash_vector_table__) ? 0 : 0x000000C0; +define symbol __ram_vector_table_offset__ = isdefinedsymbol(__flash_vector_table__) ? 0 : 0x000000BF; + +/* Flash */ +define symbol m_interrupts_start = 0x00002000; +define symbol m_interrupts_end = 0x000020C3; + +define symbol m_flash_config_start = 0x00002400; +define symbol m_flash_config_end = 0x0000240F; + +define symbol m_text_start = 0x00002410; +define symbol m_text_end = 0x0003FFFF; + +/* SRAM_L */ +define symbol m_custom_start = 0x1FFFFC00; +define symbol m_custom_end = 0x1FFFFFFF; + +/* SRAM_U */ +define symbol m_interrupts_ram_start = 0x20000000; +define symbol m_interrupts_ram_end = 0x20000000 + __ram_vector_table_offset__; + +define symbol m_data_start = m_interrupts_ram_start + __ram_vector_table_size__; +define symbol m_data_end = 0x200030BF; + +define symbol m_data_2_start = 0x200030C0; +define symbol m_data_2_end = 0x200057FF; + +/* Sizes */ +if (isdefinedsymbol(__stack_size__)) { + define symbol __size_cstack__ = __stack_size__; +} else { + define symbol __size_cstack__ = 0x00000200; +} + +if (isdefinedsymbol(__heap_size__)) { + define symbol __size_heap__ = __heap_size__; +} else { + define symbol __size_heap__ = 0x00000200; +} + +define exported symbol __VECTOR_TABLE = m_interrupts_start; +define exported symbol __VECTOR_RAM = isdefinedsymbol(__flash_vector_table__) ? m_interrupts_start : m_interrupts_ram_start; +define exported symbol __RAM_VECTOR_TABLE_SIZE = __ram_vector_table_size__; + +define exported symbol __RAM_START = m_interrupts_ram_start; +define exported symbol __RAM_END = m_data_2_end; + +define memory mem with size = 4G; +define region m_flash_config_region = mem:[from m_flash_config_start to m_flash_config_end]; +define region TEXT_region = mem:[from m_interrupts_start to m_interrupts_end] + | mem:[from m_text_start to m_text_end]; +define region DATA_region = mem:[from m_data_start to m_data_end]; +define region DATA_region_2 = mem:[from m_data_2_start to m_data_2_end-__size_cstack__]; +define region CSTACK_region = mem:[from m_data_2_end-__size_cstack__+1 to m_data_2_end]; +define region m_interrupts_ram_region = mem:[from m_interrupts_ram_start to m_interrupts_ram_end]; +define region CUSTOM_region = mem:[from m_custom_start to m_custom_end]; + + +define block CSTACK with alignment = 8, size = __size_cstack__ { }; +define block HEAP with alignment = 8, size = __size_heap__ { }; +define block RW { readwrite }; +define block ZI { zi }; + +/* Custom Section Block that can be used to place data at absolute address. */ +/* Use __attribute__((section (".customSection"))) to place data here. */ +/* Use this section only when MTB (Micro Trace Buffer) is not used, because MTB uses the same RAM area, as described in S32K Reference Manual. */ +define block customSectionBlock { section .customSection }; + +define block __CODE_ROM { section .textrw_init }; +define block __CODE_RAM { section .textrw }; + +initialize manually { section .textrw }; +initialize manually { section .bss }; +initialize manually { section .customSection }; +initialize manually { section .data }; +initialize manually { section __DLIB_PERTHREAD }; +do not initialize { section .noinit, section .bss, section .data, section __DLIB_PERTHREAD, section .customSection }; + +place at address mem: m_interrupts_start { readonly section .intvec }; +place in m_flash_config_region { section FlashConfig }; +place in TEXT_region { readonly }; +place in TEXT_region { block __CODE_ROM }; +place in DATA_region { block RW }; +place in DATA_region { block __CODE_RAM }; +place in CUSTOM_region { first block customSectionBlock }; +place in DATA_region_2 { block ZI }; +place in DATA_region_2 { last block HEAP }; +place in CSTACK_region { block CSTACK }; +place in m_interrupts_ram_region { section m_interrupts_ram }; + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/bin/demoprog_s32k118.out b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/bin/demoprog_s32k118.out new file mode 100644 index 0000000000000000000000000000000000000000..451e2f91706fe070bf0c7b69b432bf5b8a5ab6ec GIT binary patch literal 54708 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 literal 0 HcmV?d00001 diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/bin/demoprog_s32k118.srec b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/bin/demoprog_s32k118.srec new file mode 100644 index 00000000..c2aeabe2 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/bin/demoprog_s32k118.srec @@ -0,0 +1,195 @@ +S018000064656D6F70726F675F7333326B3131382E7372656373 +S1132000005800202D2E0000FB2A0000FB2A0000AF +S113201000000000000000000000000000000000BC +S1132020000000000000000000000000FB2A000087 +S11320300000000000000000FB2A0000292B000023 +S1132040FB2A0000FB2A0000FB2A0000FB2A0000F8 +S1132050FB2A0000FB2A0000FB2A0000FB2A0000E8 +S1132060FB2A0000FB2A0000FB2A0000FB2A0000D8 +S1132070FB2A0000FB2A0000FB2A0000FB2A0000C8 +S1132080FB2A0000FB2A0000FB2A0000FB2A0000B8 +S1132090FB2A0000FB2A0000FB2A0000FB2A0000A8 +S11320A0FB2A0000FB2A0000FB2A0000FB2A000098 +S11320B0FB2A0000FB2A0000FB2A0000FB2A000088 +S10720C0EE11AA551A +S1132400FFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFF59 +S113241080B500F00DF800F087F901BD80B500F03B +S113242059F800F04BFA01BD80B500F0E9FA01BD9E +S11324301CB568469B490CC90CC0083908389A4831 +S11324400168A54A0A40026001688422D2050A4351 +S11324500260A2480168090A4907490F002905D109 +S113246001210A02E023DB00134003609C4801249D +S11324709C4A12682240002A00D19B486A46515C5B +S113248000F0E4FAE121090200F0E0FAC01DC008FE +S1132490C004C00C80B2C004C00CE021C9040143D4 +S11324A09248016092489349086093480021016072 +S11324B0924A1160924A11609249F02292020A6093 +S11324C00A68882313430B608F490C60C0210903F9 +S11324D0016013BD70B58D4C2078002815D18C4D4A +S11324E0280000F037F8012833D12878002830D0AC +S11324F0287841282DDA00F014FB86490860012071 +S1132500207000208449087023E0834D804E287891 +S11325103018401C00F01EF8012811D12878401C06 +S1132520287028783178884213D100202070707880 +S1132530FF280ED1B07800280BD1FFF775FF08E013 +S113254000F0EFFA734909686431814201D2002036 +S1132550207070BD00B500210122664B1B685B0D25 +S11325601340002B03D0D3490968017011000800FF +S1132570C0B200BDFEB507000D00140068466749EF +S11325800CC90CC00839083865480168090A4907AC +S1132590490F002905D101210A02E023DB00134081 +S11325A0036060486A46515C00F050FA01900026CE +S11325B06846078000E0761C3000C0B212282BD297 +S11325C0BD4F019869460A883100C9B204235943B2 +S11325D0795C514300F03AFA0029ECD1019869463C +S11325E00A883100C9B204235943795C514300F08D +S11325F02DFA288028880028DDD02888FF21891C0E +S11326008842D8D22000F6B204214E43B9190422DC +S113261000F0B4FA012000E00020FEBD38B5C24C41 +S113262020688021C9050143216020688021490573 +S11326300143216000F075FA0500FA352068C001F5 +S113264003D400F06EFA8542F8D231BD38B5B64CE9 +S113265020682149014021602068B449014021607B +S113266000F05FFA0500FA352068C00103D500F0D8 +S113267058FA8542F8D231BD38B5AB4C20680028F1 +S11326800FD42068802109060143216000F049FA33 +S11326900500FA352068C00203D400F042FA8542EE +S11326A0F8D231BD242F0000A851064038B59E4C05 +S11326B0206800280ED5206840004008206000F003 +S11326C030FA0500FA352068C00203D500F029FA73 +S11326D08542F8D231BD0000FFFFFFBF044206402F +S11326E000127A000842064080841E0010A00640B2 +S11326F000C01FC014A0064018A0064020A0064039 +S113270024A0064028A006402CA006401531002035 +S1132710C030002004310020143100202C2F000090 +S113272004410640409C0000FEB50027380069467D +S113273008800422002101A800F02DFA7C4D7D4878 +S113274001688022D2050A430260FFF7AFFFFFF75A +S113275065FFFFF791FF784C2068784901402160BC +S1132760FFF7A4FFFFF75AFF01AA6946FA204000C9 +S1132770FFF700FF20687249014021602068694624 +S11327800988491E09060143216001A8216842788D +S1132790521E5207520F0A43226021688278521E49 +S11327A0D204E0239B0313400B4323602168C278C7 +S11327B0521E1204E023DB0213400B432360817892 +S11327C0042901DA807800E004202168C0B2401EA8 +S11327D08005C022120402400A432260206880213E +S11327E001432160380006E05649020092B20423F6 +S11327F05343CF50401C010089B28029F4D33800E0 +S113280006E05149020092B204235343CF50401CC6 +S1132810010089B22029F4D3434E30687F218843D4 +S11328201F210143316030688021890201433160F6 +S113283030688021490201433160306843490140D6 +S1132840316043484349086043488021C90401601A +S1132850002D0BD569004908026880239B031343AC +S11328600360C800C0083D49086004E0A804C00033 +S1132870C0083A4908603A4807600020C043394913 +S11328800860394839490860306839490140316085 +S11328902068384901402160FFF7D8FE00F041F973 +S11328A00400FA343068000103D500F03AF9844298 +S11328B0F8D2F7BD1CA00640842E0000FEB580208F +S11328C0800028490A680240002A2BD0224A126854 +S11328D0120C1207120F284B00240FE02500EDB252 +S11328E00326B543ED1C2600F6B2B607B60FAD1BA2 +S11328F05D5D6E462700FFB2F555641C2500160089 +S1132900EDB2F6B2B542E9D308601C4800681C4930 +S1132910086068460078FF2804D1D2B2022A01D1A7 +S1132920FFF782FDF7BD000000400240FFFFFFEF0C +S1132930670600009050064004400240FFDFFFFF9E +S113294078FF00008040024080480240FFFFFFDF24 +S1132950FFFFFF5FA44802401041024014410240BF +S1132960284002403040024006003B002040024024 +S1132970FFFF7FFFF7EFFFFF1841024008400240CE +S11329800831002023482449016000682348244971 +S11329900860244824490860704770B5002210007C +S11329A001252B000F24214E3168090C2140491CBC +S11329B03668360E3440012C04D018D3032C0CD0C6 +S11329C002D314E01A4813E01A4C24682540002D61 +S11329D001D0174800E013000AE0174C2468A4074C +S11329E0A40F002C01D1154800E0130000E01300EF +S11329F0DBB2002B03D000F029F81149086070BD48 +S1132A00104A106880B21049014304200843106042 +S1132A10704700000420054020C528D9202100006B +S1132A2000200540FFFF000008200540104006403C +S1132A3000127A000842064008430640006CDC029B +S1132A40C00000200CED00E00000FA050022030A9B +S1132A508B420BD203098B4219D243088B422ED2EC +S1132A60411A00D20146524110467047FF22090222 +S1132A703FD012068B4205D3121209028B4201D3B6 +S1132A801212090203098B4219D300E0090AC3098F +S1132A908B4201D3CB01C01A524183098B4201D32B +S1132AA08B01C01A524143098B4201D34B01C01A16 +S1132AB0524103098B4201D30B01C01A5241C3088E +S1132AC08B4201D3CB00C01A524183088B4201D3FD +S1132AD08B00C01A524143088B4201D34B00C01AE9 +S1132AE05241884200D3401A5241CFD20146104687 +S1132AF0704708B500F05AF808BDFEE700B50D4868 +S1132B000068FA218900FFF7A1FF401E0A49086006 +S1132B1000200A4908600721094A11600949086030 +S1132B2000BD08480068704706480168491C0160F8 +S1132B3070470000C000002014E000E018E000E04E +S1132B4010E000E01031002070B4103A03D378C9CB +S1132B50103A78C0FBD2530701D318C918C001D565 +S1132B6008C908C0D20704D30B880380891C801CC1 +S1132B70002A01D50B78037070BC70478B0701D114 +S1132B808307E1D0124205D00B78491C0370401C26 +S1132B90521EF9D1704710B504000800110002005C +S1132BA0200000F005F8200010BD00007047000070 +S1132BB01206130A1A43130C1A4300BF094205D024 +S1132BC0830705D00270401C491EF9D170470000EC +S1132BD01300103906D330B41400150010393CC06A +S1132BE0FCD230BC490700D30CC000D504C0890016 +S1132BF002D30280801C002900D5027070470000B7 +S1132C0080B500F007F8FFF703FC00F076F8FFF753 +S1132C1005FCFAE780B500F024F88020C0052249BD +S1132C200A6802430A6021490A6810430860802048 +S1132C3080001F490A6802430A601E490A6810435B +S1132C400860A020C0001C490A6802430A601B49AE +S1132C500A6810430860FFF751FF00F041F862B6BC +S1132C6001BD80B5FF20801C154908603421154A38 +S1132C70116015490A681202FBD401220A600A682D +S1132C80D201FCD511490860114908601148124964 +S1132C90086012480068000E0007000F0328F8D1EE +S1132CA0FFF77BFE01BD0000285106403451064069 +S1132CB000A0044004A0044010D0044014D00440F8 +S1132CC004410640084106400041064004430640D2 +S1132CD00442064001000003144006401040064030 +S1132CE0802040001549086015490A6802430A60BB +S1132CF014490A6810430860704710B5FFF711FFC4 +S1132D0011490A68821AFA235B009A4215D30F4AC2 +S1132D101378002B08D1012313700D4A1368802403 +S1132D2064001C43146007E000231370054A136811 +S1132D30802464001C431460086010BD20D004404B +S1132D4014F10F4008F10F400C310020163100201F +S1132D5004F10F40FFB526482649274A0392274A23 +S1132D60274B284C0294284C284D0195284D294E78 +S1132D70294F009703E00F780770401C491C039FFC +S1132D808F42F8D10298984207D018781070521CDC +S1132D905B1CF7E700202070641C0198A042F9D165 +S1132DA00098B04204D030782870761C6D1CF7E788 +S1132DB00023180019491A4A8A4212D006E0042452 +S1132DC05C430C5904255D4354515B1C154CA40809 +S1132DD0A342F4D31449C0B20423584308580260F0 +S1132DE005E0114AC0B20423584310580160FFBDE6 +S1132DF0C0000020382F00003C2F0000C400002039 +S1132E003C2F00003C2F0000C03000201731002070 +S1132E10000000000000000000000000002000008E +S1132E2000000020C0000000342F000072B6002112 +S1132E30002200230024002500260027B846B946B6 +S1132E40BA46BB46BC460A490A4A521A013A05DD4B +S1132E500020042308601944043AFBDA0648854636 +S1132E60064880470648804762B6FFF7C9FEFEE77A +S1132E7000000020FF570020005800208529000092 +S1132E80552D000008030202090303020A03030389 +S1132E900B0403030C0404030D0504030E050404CE +S1132EA00F0604041006050411070504120705059E +S1132EB0130805051408060515080705160807066E +S1132EC017080806180808071908080800F00DF87C +S1132ED0002801D000BF00BF00BF00BF002000BF1A +S1132EE000BFFFF78DFE00F002F80120704780B5A7 +S1132EF000F002F801BD00000746384600F002F871 +S1132F00FBE7000080B500BF00BF024A1100182093 +S1132F10ABBEFBE72600020000BF00BF00BF00BF3E +S1132F20FFF7D4FF0001020408102040000102044E +S10F2F300810204008ED00E0006CDC02FA +S9032F19B4 diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/boot.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/boot.c new file mode 100644 index 00000000..65095b5b --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/boot.c @@ -0,0 +1,772 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/boot.c +* \brief Demo program bootloader interface source file. +* \ingroup Prog_ARMCM0_S32K14_S32K118EVB_IAR +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "header.h" /* generic header */ + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +#if (BOOT_COM_RS232_ENABLE > 0) +static void BootComRs232Init(void); +static void BootComRs232CheckActivationRequest(void); +#endif +#if (BOOT_COM_CAN_ENABLE > 0) +static void BootComCanInit(void); +static void BootComCanCheckActivationRequest(void); +#endif + + +/************************************************************************************//** +** \brief Initializes the communication interface. +** \return none. +** +****************************************************************************************/ +void BootComInit(void) +{ +#if (BOOT_COM_RS232_ENABLE > 0) + BootComRs232Init(); +#endif +#if (BOOT_COM_CAN_ENABLE > 0) + BootComCanInit(); +#endif +} /*** end of BootComInit ***/ + + +/************************************************************************************//** +** \brief Receives the CONNECT request from the host, which indicates that the +** bootloader should be activated and, if so, activates it. +** \return none. +** +****************************************************************************************/ +void BootComCheckActivationRequest(void) +{ +#if (BOOT_COM_RS232_ENABLE > 0) + BootComRs232CheckActivationRequest(); +#endif +#if (BOOT_COM_CAN_ENABLE > 0) + BootComCanCheckActivationRequest(); +#endif +} /*** end of BootComCheckActivationRequest ***/ + + +/************************************************************************************//** +** \brief Bootloader activation function. +** \return none. +** +****************************************************************************************/ +void BootActivate(void) +{ + /* Activate the bootloader by performing a software reset. */ + SystemSoftwareReset(); +} /*** end of BootActivate ***/ + + +#if (BOOT_COM_RS232_ENABLE > 0) +/**************************************************************************************** +* U N I V E R S A L A S Y N C H R O N O U S R X T X I N T E R F A C E +****************************************************************************************/ + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +/** \brief Timeout time for the reception of a CTO packet. The timer is started upon + * reception of the first packet byte. + */ +#define RS232_CTO_RX_PACKET_TIMEOUT_MS (100u) +/** \brief Set the peripheral LPUART base pointer. */ +#define LPUARTx (LPUART0) +/** \brief Set the PCC index offset for LPUART. */ +#define PCC_LPUARTx_INDEX (PCC_LPUART0_INDEX) + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +static unsigned char Rs232ReceiveByte(unsigned char *data); + + +/************************************************************************************//** +** \brief Initializes the UART communication interface. +** \return none. +** +****************************************************************************************/ +static void BootComRs232Init(void) +{ + unsigned long sourceClockFreqHz; + unsigned long div2RegValue; + unsigned short baudrateSbr0_12; + unsigned char const div2DividerLookup[] = + { + 0U, /* 0b000. Output disabled. */ + 1U, /* 0b001. Divide by 1. */ + 2U, /* 0b010. Divide by 2. */ + 4U, /* 0b011. Divide by 4. */ + 8U, /* 0b100. Divide by 8. */ + 16U, /* 0b101. Divide by 16. */ + 32U, /* 0b110. Divide by 32. */ + 64U, /* 0b111. Divide by 64. */ + }; + + /* Make sure the UART peripheral clock is disabled before configuring its source + * clock. + */ + PCC->PCCn[PCC_LPUARTx_INDEX] &= ~PCC_PCCn_CGC_MASK; + /* Select option 2 as the UART peripheral source clock and enable the clock. Option 2 + * is the SIRCDIV2_CLK, which is available on all peripherals and configurations. + */ + PCC->PCCn[PCC_LPUARTx_INDEX] |= PCC_PCCn_PCS(2) | PCC_PCCn_CGC_MASK; + /* Obtain the DIV2 divider value of the SIRC_CLK. */ + div2RegValue = (SCG->SIRCDIV & SCG_SIRCDIV_SIRCDIV2_MASK) >> SCG_SIRCDIV_SIRCDIV2_SHIFT; + /* Check if the DIV2 register value for SIRC is 0. In this case SIRCDIV2_CLK is + * currently disabled. + */ + if (div2RegValue == 0U) + { + /* Configure the DIV2 for a default divide by 1 to make sure the SIRCDIV2_CLK is + * actually enabled. + */ + div2RegValue = 1U; + SCG->SIRCDIV = SCG_SIRCDIV_SIRCDIV2(div2RegValue); + } + /* Determine the SIRC clock frequency. If SIRC high range is enabled, it is 8 MHz. If + * SIRC low range is enabled, it is 2 MHz. + */ + sourceClockFreqHz = 8000000U; + if ((SCG->SIRCCFG & SCG_SIRCCFG_RANGE_MASK) == SCG_SIRCCFG_RANGE(0)) + { + sourceClockFreqHz = 2000000U; + } + /* Now process the configured DIV2 divider factor to get the actual frequency of the + * UART peripheral source clock. + */ + sourceClockFreqHz /= div2DividerLookup[div2RegValue]; + /* Configure the baudrate from BOOT_COM_RS232_BAUDRATE, taking into account that an + * oversampling of 8 will be configured. Default 8,n,1 format is used. Integer + * rounding is used to get the best value for baudrateSbr0_12. Actual baudrate equals + * sourceClockFreqHz / 8 / baudrateSbr0_12. + */ + baudrateSbr0_12 = (((sourceClockFreqHz / BOOT_COM_RS232_BAUDRATE) + (8U - 1U)) / 8U) & + LPUART_BAUD_SBR_MASK; + /* OSR=7: Over sampling ratio = 7+1=8. + * SBNS=0: One stop bit. + * BOTHEDGE=0: receiver samples only on rising edge. + * M10=0: Rx and Tx use 7 to 9 bit data characters. + * RESYNCDIS=0: Resync during rec'd data word supported. + * LBKDIE, RXEDGIE=0: interrupts disable. + * TDMAE, RDMAE, TDMAE=0: DMA requests disabled. + * MAEN1, MAEN2, MATCFG=0: Match disabled. + */ + LPUARTx->BAUD = LPUART_BAUD_SBR(baudrateSbr0_12) | LPUART_BAUD_OSR(7); + /* Clear the error/interrupt flags */ + LPUARTx->STAT = FEATURE_LPUART_STAT_REG_FLAGS_MASK; + /* Reset all features/interrupts by default */ + LPUARTx->CTRL = 0x00000000; + /* Reset match addresses */ + LPUARTx->MATCH = 0x00000000; +#if FEATURE_LPUART_HAS_MODEM_SUPPORT + /* Reset IrDA modem features */ + LPUARTx->MODIR = 0x00000000; +#endif +#if FEATURE_LPUART_FIFO_SIZE > 0U + /* Reset FIFO feature */ + LPUARTx->FIFO = FEATURE_LPUART_FIFO_RESET_MASK; + /* Enable the transmit and receive FIFOs. */ + LPUARTx->FIFO |= LPUART_FIFO_TXFE(1) | LPUART_FIFO_RXFE(1); + /* Set the reception water mark to 0 and the transmitter water mark to 1. */ + LPUARTx->WATER = LPUART_WATER_TXWATER(1) | LPUART_WATER_RXWATER(0); +#endif + /* Enable transmitter and receiver, no parity, 8 bit char: + * RE=1: Receiver enabled. + * TE=1: Transmitter enabled. + * PE,PT=0: No hw parity generation or checking. + * M7,M,R8T9,R9T8=0: 8-bit data characters. + * DOZEEN=0: LPUART enabled in Doze mode. + * ORIE,NEIE,FEIE,PEIE,TIE,TCIE,RIE,ILIE,MA1IE,MA2IE=0: no IRQ. + * TxDIR=0: TxD pin is input if in single-wire mode. + * TXINV=0: Transmit data not inverted. + * RWU,WAKE=0: normal operation; rcvr not in standby. + * IDLCFG=0: one idle character. + * ILT=0: Idle char bit count starts after start bit. + * SBK=0: Normal transmitter operation - no break char. + * LOOPS,RSRC=0: no loop back. + */ + LPUARTx->CTRL = LPUART_CTRL_RE_MASK | LPUART_CTRL_TE_MASK; +} /*** end of BootComRs232Init ***/ + + +/************************************************************************************//** +** \brief Receives the CONNECT request from the host, which indicates that the +** bootloader should be activated and, if so, activates it. +** \return none. +** +****************************************************************************************/ +static void BootComRs232CheckActivationRequest(void) +{ + static unsigned char xcpCtoReqPacket[BOOT_COM_RS232_RX_MAX_DATA+1]; + static unsigned char xcpCtoRxLength; + static unsigned char xcpCtoRxInProgress = 0; + static unsigned long xcpCtoRxStartTime = 0; + + /* start of cto packet received? */ + if (xcpCtoRxInProgress == 0) + { + /* store the message length when received */ + if (Rs232ReceiveByte(&xcpCtoReqPacket[0]) == 1) + { + /* check that the length has a valid value. it should not be 0 */ + if ( (xcpCtoReqPacket[0] > 0) && + (xcpCtoReqPacket[0] <= BOOT_COM_RS232_RX_MAX_DATA) ) + { + /* store the start time */ + xcpCtoRxStartTime = TimerGet(); + /* indicate that a cto packet is being received */ + xcpCtoRxInProgress = 1; + /* reset packet data count */ + xcpCtoRxLength = 0; + } + } + } + else + { + /* store the next packet byte */ + if (Rs232ReceiveByte(&xcpCtoReqPacket[xcpCtoRxLength+1]) == 1) + { + /* increment the packet data count */ + xcpCtoRxLength++; + + /* check to see if the entire packet was received */ + if (xcpCtoRxLength == xcpCtoReqPacket[0]) + { + /* done with cto packet reception */ + xcpCtoRxInProgress = 0; + + /* check if this was an XCP CONNECT command */ + if ((xcpCtoReqPacket[1] == 0xff) && (xcpCtoReqPacket[2] == 0x00)) + { + /* connection request received so start the bootloader */ + BootActivate(); + } + } + } + else + { + /* check packet reception timeout */ + if (TimerGet() > (xcpCtoRxStartTime + RS232_CTO_RX_PACKET_TIMEOUT_MS)) + { + /* cancel cto packet reception due to timeout. note that this automatically + * discards the already received packet bytes, allowing the host to retry. + */ + xcpCtoRxInProgress = 0; + } + } + } +} /*** end of BootComRs232CheckActivationRequest ***/ + + +/************************************************************************************//** +** \brief Receives a communication interface byte if one is present. +** \param data Pointer to byte where the data is to be stored. +** \return 1 if a byte was received, 0 otherwise. +** +****************************************************************************************/ +static unsigned char Rs232ReceiveByte(unsigned char *data) +{ + unsigned char result = 0; + + /* Check if a new byte was received by means of the RDRF-bit. */ + if (((LPUARTx->STAT & LPUART_STAT_RDRF_MASK) >> LPUART_STAT_RDRF_SHIFT) != 0U) + { + /* Retrieve and store the newly received byte. */ + *data = LPUARTx->DATA; + /* Update the result. */ + result = 1; + } + + /* Give the result back to the caller. */ + return result; +} /*** end of Rs232ReceiveByte ***/ +#endif /* BOOT_COM_RS232_ENABLE > 0 */ + + +#if (BOOT_COM_CAN_ENABLE > 0) +/**************************************************************************************** +* C O N T R O L L E R A R E A N E T W O R K I N T E R F A C E +****************************************************************************************/ + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +/** \brief Timeout for entering/leaving CAN initialization mode in milliseconds. */ +#define CAN_INIT_TIMEOUT_MS (250U) + +/** \brief Set the peripheral CAN0 base pointer. */ +#define CANx (CAN0) +/** \brief Set the PCC index offset for CAN0. */ +#define PCC_FlexCANx_INDEX (PCC_FlexCAN0_INDEX) +/** \brief Set the number of message boxes supported by CAN0. */ +#define CANx_MAX_MB_NUM (FEATURE_CAN0_MAX_MB_NUM) + +/** \brief The mailbox used for receiving the XCP command message. */ +#define CAN_RX_MSGBOX_NUM (9U) + + +/**************************************************************************************** +* Type definitions +****************************************************************************************/ +/** \brief Structure type for grouping CAN bus timing related information. */ +typedef struct t_can_bus_timing +{ + unsigned char timeQuanta; /**< Total number of time quanta */ + unsigned char propSeg; /**< CAN propagation segment */ + unsigned char phaseSeg1; /**< CAN phase segment 1 */ + unsigned char phaseSeg2; /**< CAN phase segment 2 */ +} tCanBusTiming; + + +/**************************************************************************************** +* Local constant declarations +****************************************************************************************/ +/** \brief CAN bit timing table for dynamically calculating the bittiming settings. + * \details According to the CAN protocol 1 bit-time can be made up of between 8..25 + * time quanta (TQ). The total TQ in a bit is SYNC + TSEG1 + TSEG2 with SYNC + * always being 1. The sample point is (SYNC + TSEG1) / (SYNC + TSEG1 + TSEG2) + * * 100%. This array contains possible and valid time quanta configurations + * with a sample point between 68..78%. A visual representation of the TQ in + * a bit is: + * | SYNCSEG | TIME1SEG | TIME2SEG | + * Or with an alternative representation: + * | SYNCSEG | PROPSEG | PHASE1SEG | PHASE2SEG | + * With the alternative representation TIME1SEG = PROPSEG + PHASE1SEG. + * + */ +static const tCanBusTiming canTiming[] = +{ + /* Time-Quanta | PROPSEG | PSEG1 | PSEG2 | Sample-Point */ + /* ---------------------------------------------------- */ + { 8U, 3U, 2U, 2U }, /*1+3+2+1=8 | 3 | 2 | 2 | 75% */ + { 9U, 3U, 3U, 2U }, /* 9 | 3 | 3 | 2 | 78% */ + { 10U, 3U, 3U, 3U }, /* 10 | 3 | 3 | 3 | 70% */ + { 11U, 4U, 3U, 3U }, /* 11 | 4 | 3 | 3 | 73% */ + { 12U, 4U, 4U, 3U }, /* 12 | 4 | 4 | 3 | 75% */ + { 13U, 5U, 4U, 3U }, /* 13 | 5 | 4 | 3 | 77% */ + { 14U, 5U, 4U, 4U }, /* 14 | 5 | 4 | 4 | 71% */ + { 15U, 6U, 4U, 4U }, /* 15 | 6 | 4 | 4 | 73% */ + { 16U, 6U, 5U, 4U }, /* 16 | 6 | 5 | 4 | 75% */ + { 17U, 7U, 5U, 4U }, /* 17 | 7 | 5 | 4 | 76% */ + { 18U, 7U, 5U, 5U }, /* 18 | 7 | 5 | 5 | 72% */ + { 19U, 8U, 5U, 5U }, /* 19 | 8 | 5 | 5 | 74% */ + { 20U, 8U, 6U, 5U }, /* 20 | 8 | 6 | 5 | 75% */ + { 21U, 8U, 7U, 5U }, /* 21 | 8 | 7 | 5 | 76% */ + { 22U, 8U, 7U, 6U }, /* 22 | 8 | 7 | 6 | 73% */ + { 23U, 8U, 8U, 6U }, /* 23 | 8 | 8 | 6 | 74% */ + { 24U, 8U, 8U, 7U }, /* 24 | 8 | 8 | 7 | 71% */ + { 25U, 8U, 8U, 8U } /* 25 | 8 | 8 | 8 | 68% */ +}; + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/** \brief Dummy variable to store the CAN controller's free running timer value in. + * This is needed at the end of a CAN message reception to unlock the mailbox + * again. If this variable is declared locally within the function, it generates + * an unwanted compiler warning about assigning a value and not using it. + * For this reason this dummy variabled is declare here as a module global. + */ +static volatile unsigned long dummyTimerVal; + + +/************************************************************************************//** +** \brief Search algorithm to match the desired baudrate to a possible bus +** timing configuration. +** \param baud The desired baudrate in kbps. Valid values are 10..1000. +** \param prescaler Pointer to where the value for the prescaler will be stored. +** \param busTimingCfg Pointer to where the bus timing values will be stored. +** \return 1 if the CAN bustiming register values were found, 0 otherwise. +** +****************************************************************************************/ +static unsigned char CanGetSpeedConfig(unsigned short baud, unsigned short * prescaler, + tCanBusTiming * busTimingCfg) +{ + unsigned char cnt; + unsigned long canClockFreqkHz; + unsigned long div2RegValue; + unsigned char const div2DividerLookup[] = + { + 0U, /* 0b000. Output disabled. */ + 1U, /* 0b001. Divide by 1. */ + 2U, /* 0b010. Divide by 2. */ + 4U, /* 0b011. Divide by 4. */ + 8U, /* 0b100. Divide by 8. */ + 16U, /* 0b101. Divide by 16. */ + 32U, /* 0b110. Divide by 32. */ + 64U, /* 0b111. Divide by 64. */ + }; + + /* Obtain the DIV2 divider value of the SOSC_CLK. */ + div2RegValue = (SCG->SOSCDIV & SCG_SOSCDIV_SOSCDIV2_MASK) >> SCG_SOSCDIV_SOSCDIV2_SHIFT; + /* Check if the DIV2 register value for SOSC is 0. In this case SOSCDIV2_CLK is + * currently disabled. + */ + if (div2RegValue == 0U) + { + /* Configure the DIV2 for a default divide by 1 to make sure the SOSCDIV2_CLK is + * actually enabled. + */ + div2RegValue = 1U; + SCG->SOSCDIV = SCG_SOSCDIV_SOSCDIV2(div2RegValue); + } + /* Determine the SOSC clock frequency. */ + canClockFreqkHz = BOOT_CPU_XTAL_SPEED_KHZ; + /* Now process the configured DIV2 divider factor to get the actual frequency of the + * CAN peripheral source clock. + */ + canClockFreqkHz /= div2DividerLookup[div2RegValue]; + + /* Loop through all possible time quanta configurations to find a match. */ + for (cnt=0; cnt < sizeof(canTiming)/sizeof(canTiming[0]); cnt++) + { + if ((canClockFreqkHz % (baud * canTiming[cnt].timeQuanta)) == 0U) + { + /* Compute the prescaler that goes with this TQ configuration. */ + *prescaler = canClockFreqkHz/(baud * canTiming[cnt].timeQuanta); + + /* Make sure the prescaler is valid. */ + if ((*prescaler > 0U) && (*prescaler <= 256U)) + { + /* Store the bustiming configuration. */ + *busTimingCfg = canTiming[cnt]; + /* Found a good bus timing configuration. */ + return 1U; + } + } + } + /* Could not find a good bus timing configuration. */ + return 0U; +} /*** end of CanGetSpeedConfig ***/ + + +/************************************************************************************//** +** \brief Places the CAN controller in freeze mode. Note that the CAN controller +** can only be placed in freeze mode, if it is actually enabled. +** \return none. +** +****************************************************************************************/ +static void CanFreezeModeEnter(void) +{ + unsigned long timeout; + + /* Request to enter freeze mode. */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_FRZ_MASK) | CAN_MCR_FRZ(1U); + CANx->MCR = (CANx->MCR & ~CAN_MCR_HALT_MASK) | CAN_MCR_HALT(1U); + /* Set timeout time for entering freeze mode. */ + timeout = TimerGet() + CAN_INIT_TIMEOUT_MS; + /* Wait for freeze mode acknowledgement. */ + while (((CANx->MCR & CAN_MCR_FRZACK_MASK)) == 0U) + { + /* Break loop upon timeout. This would indicate a hardware failure. */ + if (TimerGet() > timeout) + { + break; + } + } +} /*** end of CanFreezeModeEnter ***/ + + +/************************************************************************************//** +** \brief Leaves the CAN controller's freeze mode. Note that this operation can +** only be done, if it is actually enabled. +** \return none. +** +****************************************************************************************/ +static void CanFreezeModeExit(void) +{ + unsigned long timeout; + + /* Request to leave freeze mode. */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_FRZ_MASK) | CAN_MCR_FRZ(0U); + CANx->MCR = (CANx->MCR & ~CAN_MCR_HALT_MASK) | CAN_MCR_HALT(0U); + /* Set timeout time for leaving freeze mode. */ + timeout = TimerGet() + CAN_INIT_TIMEOUT_MS; + /* Wait for non freeze mode acknowledgement. */ + while (((CANx->MCR & CAN_MCR_FRZACK_MASK)) != 0U) + { + /* Break loop upon timeout. This would indicate a hardware failure. */ + if (TimerGet() > timeout) + { + break; + } + } +} /*** end of CanFreezeModeExit ***/ + + +/************************************************************************************//** +** \brief Places the CAN controller in disabled mode. +** \return none. +** +****************************************************************************************/ +static void CanDisabledModeEnter(void) +{ + unsigned long timeout; + + /* Only continue if the CAN controller is currently enabled. */ + if ((CANx->MCR & CAN_MCR_MDIS_MASK) == 0U) + { + /* Request disabled mode. */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_MDIS_MASK) | CAN_MCR_MDIS(1U); + /* Set timeout time for entering disabled mode. */ + timeout = TimerGet() + CAN_INIT_TIMEOUT_MS; + /* Wait for disabled mode acknowledgement. */ + while (((CANx->MCR & CAN_MCR_LPMACK_MASK)) == 0U) + { + /* Break loop upon timeout. This would indicate a hardware failure. */ + if (TimerGet() > timeout) + { + break; + } + } + } +} /*** end of CanDisabledModeEnter ***/ + +/************************************************************************************//** +** \brief Places the CAN controller in enabled mode. +** \return none. +** +****************************************************************************************/ +static void CanDisabledModeExit(void) +{ + unsigned long timeout; + + /* Only continue if the CAN controller is currently disabled. */ + if ((CANx->MCR & CAN_MCR_MDIS_MASK) != 0U) + { + /* Request enabled mode. */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_MDIS_MASK) | CAN_MCR_MDIS(0U); + /* Set timeout time for leaving disabled mode. */ + timeout = TimerGet() + CAN_INIT_TIMEOUT_MS; + /* Wait for disabled mode acknowledgement. */ + while (((CANx->MCR & CAN_MCR_LPMACK_MASK)) != 0U) + { + /* Break loop upon timeout. This would indicate a hardware failure. */ + if (TimerGet() > timeout) + { + break; + } + } + } +} /*** end of CanDisabledModeExit ***/ + + +/************************************************************************************//** +** \brief Initializes the CAN communication interface. +** \return none. +** +****************************************************************************************/ +static void BootComCanInit(void) +{ + unsigned short prescaler = 0; + tCanBusTiming timingCfg = { 0 }; + unsigned char rjw; + unsigned short idx; + unsigned long timeout; + unsigned long rxMsgId = BOOT_COM_CAN_RX_MSG_ID; + + /* Enable the CAN peripheral clock. */ + PCC->PCCn[PCC_FlexCANx_INDEX] |= PCC_PCCn_CGC_MASK; + + /* The source clock needs to be configured first. For this the CAN controller must be + * in disabled mode, but that can only be entered after first entering freeze mode, + * which in turn can only be in enabled mode. So first enable the module, then goto + * freeze mode and finally enter disabled mode. + */ + CanDisabledModeExit(); + CanFreezeModeEnter(); + CanDisabledModeEnter(); + /* Configure SOSCDIV2 as the source clock. This assumes that an external oscillator + * is available, which is typically the case to meet the clock tolerance requirements + * of the CAN 2.0B secification. + */ + CANx->CTRL1 &= ~CAN_CTRL1_CLKSRC_MASK; + /* Leave disabled mode. */ + CanDisabledModeExit(); + /* Make sure freeze mode is active to be able to initialize the CAN controller. */ + CanFreezeModeEnter(); + + /* Obtain bittiming configuration information. */ + (void)CanGetSpeedConfig(BOOT_COM_CAN_BAUDRATE/1000, &prescaler, &timingCfg); + + /* Reset the current bittiming configuration. */ + CANx->CTRL1 &= ~(CAN_CTRL1_PRESDIV_MASK | CAN_CTRL1_PROPSEG_MASK | + CAN_CTRL1_PSEG1_MASK | CAN_CTRL1_PSEG2_MASK | CAN_CTRL1_RJW_MASK | + CAN_CTRL1_SMP_MASK); + /* Configure the baudrate prescaler. */ + CANx->CTRL1 |= CAN_CTRL1_PRESDIV(prescaler - 1U); + /* Configure the propagation segment. */ + CANx->CTRL1 |= CAN_CTRL1_PROPSEG(timingCfg.propSeg - 1U); + /* Configure the phase segments. */ + CANx->CTRL1 |= CAN_CTRL1_PSEG1(timingCfg.phaseSeg1 - 1U); + CANx->CTRL1 |= CAN_CTRL1_PSEG2(timingCfg.phaseSeg2 - 1U); + /* The resynchronization jump width (RJW) can be 1 - 4 TQ, yet should never be larger + * than pseg1. Configure the longest possible value for RJW. + */ + rjw = (timingCfg.phaseSeg1 < 4) ? timingCfg.phaseSeg1 : 4; + CANx->CTRL1 |= CAN_CTRL1_RJW(rjw - 1U); + /* All the entries in canTiming[] have a PSEG1 >= 2, so three samples can be used to + * determine the value of the received bit, instead of the default one. + */ + CANx->CTRL1 |= CAN_CTRL1_SMP(1U); + + /* Clear the message box RAM. Each message box covers 4 words (1 word = 32-bits. */ + for (idx = 0; idx < (CANx_MAX_MB_NUM * 4U); idx++) + { + CANx->RAMn[idx] = 0U; + } + /* Clear the reception mask register for each message box. */ + for (idx = 0; idx < CANx_MAX_MB_NUM; idx++) + { + CANx->RXIMR[idx] = 0U; + } + /* Configure the maximum number of message boxes. */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_MAXMB_MASK) | CAN_MCR_MAXMB(CANx_MAX_MB_NUM - 1U); + /* Disable the self reception feature. */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_SRXDIS_MASK) | CAN_MCR_SRXDIS(1U); + + /* Enable individual reception masking. This disables the legacy support for the + * global reception mask and the mailbox 14/15 individual reception mask. + */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_IRMQ_MASK) | CAN_MCR_IRMQ(1U); + /* Disable the reception FIFO. This driver only needs to receive one CAN message + * identifier. It is sufficient to use just one dedicated mailbox for this. + */ + CANx->MCR &= ~CAN_MCR_RFEN_MASK; + /* Configure the mask of the invididual message reception mailbox to check all ID bits + * and also the IDE bit. + */ + CANx->RXIMR[CAN_RX_MSGBOX_NUM] = 0x40000000U | 0x1FFFFFFFU; + /* Configure the reception mailbox to receive just the CAN message configured with + * BOOT_COM_CAN_RX_MSG_ID. + * EDL, BRS, ESI=0: CANFD not used. + * CODE=0b0100: mailbox set to active and empty. + * IDE=0: 11-bit CAN identifier. + * SRR, RTR, TIME STAMP=0: not applicable. + */ + CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 0U] = 0x04000000; + /* Store the message identifier to receive in the mailbox RAM. */ + if ((rxMsgId & 0x80000000U) != 0U) + { + /* It is a 29-bit extended CAN identifier. */ + rxMsgId &= ~0x80000000U; + /* Set the IDE bit to configure the message for a 29-bit identifier. */ + CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 0U] |= CAN_WMBn_CS_IDE_MASK; + /* Store the 29-bit CAN identifier. */ + CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 1U] = CAN_WMBn_ID_ID(rxMsgId); + } + else + { + /* Store the 11-bit CAN identifier. */ + CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 1U] = CAN_WMBn_ID_ID(rxMsgId << 18U); + } + + /* Disable all message box interrupts. */ + CANx->IMASK1 = 0U; + /* Clear all mesasge box interrupt flags. */ + CANx->IFLAG1 = CAN_IMASK1_BUF31TO0M_MASK; + /* Clear all error interrupt flags */ + CANx->ESR1 = CAN_ESR1_ERRINT_MASK | CAN_ESR1_BOFFINT_MASK | CAN_ESR1_RWRNINT_MASK | + CAN_ESR1_TWRNINT_MASK | CAN_ESR1_BOFFDONEINT_MASK | + CAN_ESR1_ERRINT_FAST_MASK | CAN_ESR1_ERROVR_MASK; + + /* Switch to normal user mode. */ + CANx->MCR &= ~CAN_MCR_SUPV_MASK; + CANx->CTRL1 &= ~(CAN_CTRL1_LOM_MASK | CAN_CTRL1_LPB_MASK); + /* Exit freeze mode. */ + CanFreezeModeExit(); + /* Set timeout time for entering normal user mode. */ + timeout = TimerGet() + CAN_INIT_TIMEOUT_MS; + /* Wait for normal user mode acknowledgement. */ + while (((CANx->MCR & CAN_MCR_NOTRDY_MASK)) != 0U) + { + /* Break loop upon timeout. This would indicate a hardware failure. */ + if (TimerGet() > timeout) + { + break; + } + } +} /*** end of BootComCanInit ***/ + + +/************************************************************************************//** +** \brief Receives the CONNECT request from the host, which indicates that the +** bootloader should be activated and, if so, activates it. +** \return none. +** +****************************************************************************************/ +static void BootComCanCheckActivationRequest(void) +{ + unsigned char * pMsgBoxData; + unsigned char byteIdx; + unsigned char rxMsgData[8]; + unsigned char rxMsgLen; + + /* Check if a message was received in the individual mailbox configured to receive + * the BOOT_COM_CAN_RX_MSG_ID message. + */ + if ((CANx->IFLAG1 & (1U << CAN_RX_MSGBOX_NUM)) != 0U) + { + /* Note that there is no need to verify the identifier of the CAN message because the + * mailbox is configured to only receive the BOOT_COM_CAN_TX_MSG_ID message. Start + * by reading out the DLC of the newly received CAN message. + */ + rxMsgLen = (CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 0U] & CAN_WMBn_CS_DLC_MASK) >> CAN_WMBn_CS_DLC_SHIFT; + /* Read the data bytes of the CAN message from the mailbox RAM. */ + pMsgBoxData = (unsigned char *)(&CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 2U]); + for (byteIdx = 0; byteIdx < rxMsgLen; byteIdx++) + { + rxMsgData[byteIdx] = pMsgBoxData[((byteIdx) & ~3U) + (3U - ((byteIdx) & 3U))]; + } + /* Clear the mailbox interrupt flag by writing a 1 to the corresponding box. */ + CANx->IFLAG1 = (1U << CAN_RX_MSGBOX_NUM); + /* Read the free running timer to unlock the mailbox. */ + dummyTimerVal = CANx->TIMER; + + /* check if this was an XCP CONNECT command */ + if ((rxMsgData[0] == 0xff) && (rxMsgLen == 2)) + { + /* connection request received so start the bootloader */ + BootActivate(); + } + } +} /*** end of BootComCanCheckActivationRequest ***/ +#endif /* BOOT_COM_CAN_ENABLE > 0 */ + + +/*********************************** end of boot.c *************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/boot.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/boot.h new file mode 100644 index 00000000..897be52f --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/boot.h @@ -0,0 +1,40 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/boot.h +* \brief Demo program bootloader interface header file. +* \ingroup Prog_ARMCM0_S32K14_S32K118EVB_IAR +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ +#ifndef BOOT_H +#define BOOT_H + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +void BootComInit(void); +void BootComCheckActivationRequest(void); +void BootActivate(void); + + +#endif /* BOOT_H */ +/*********************************** end of boot.h *************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/header.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/header.h new file mode 100644 index 00000000..d5404645 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/header.h @@ -0,0 +1,42 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/header.h +* \brief Generic header file. +* \ingroup Prog_ARMCM0_S32K14_S32K118EVB_IAR +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ +#ifndef HEADER_H +#define HEADER_H + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "../Boot/blt_conf.h" /* bootloader configuration */ +#include "boot.h" /* bootloader interface driver */ +#include "led.h" /* LED driver */ +#include "timer.h" /* Timer driver */ +#include "device_registers.h" /* Device registers */ +#include "system_S32K118.h" /* Device sconfiguration */ + +#endif /* HEADER_H */ +/*********************************** end of header.h ***********************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.dep b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.dep new file mode 100644 index 00000000..b10e1d58 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.dep @@ -0,0 +1,247 @@ + + + 4 + 544470611 + + Debug + + $PROJ_DIR$\..\obj\timer.__cstat.et + $PROJ_DIR$\..\obj\led.xcl + $TOOLKIT_DIR$\inc\c\yvals.h + $PROJ_DIR$\..\boot.h + $PROJ_DIR$\..\boot.c + $PROJ_DIR$\..\header.h + $PROJ_DIR$\..\timer.c + $PROJ_DIR$\..\obj\s32k118.pbd + $PROJ_DIR$\..\led.c + $PROJ_DIR$\..\obj\startup.__cstat.et + $PROJ_DIR$\..\obj\system_S32K118.o + $PROJ_DIR$\..\obj\system_S32K118.__cstat.et + $PROJ_DIR$\..\obj\timer.xcl + $PROJ_DIR$\..\lib\S32K118_features.h + $PROJ_DIR$\..\lib\system_S32K118.h + $PROJ_DIR$\..\obj\system_S32K118.xcl + $PROJ_DIR$\..\obj\startup.xcl + $PROJ_DIR$\..\obj\boot.xcl + $PROJ_DIR$\..\timer.h + $PROJ_DIR$\..\lib\startup.h + $PROJ_DIR$\..\obj\boot.o + $PROJ_DIR$\..\obj\startup_S32K118.o + $PROJ_DIR$\..\obj\main.xcl + $PROJ_DIR$\..\main.c + $PROJ_DIR$\..\lib\startup.c + $PROJ_DIR$\..\obj\main.o + $PROJ_DIR$\..\bin\demoprog_s32k118.out + $PROJ_DIR$\..\startup_S32K118.s + $PROJ_DIR$\..\obj\led.o + $PROJ_DIR$\..\lib\system_S32K118.c + $PROJ_DIR$\..\led.h + $PROJ_DIR$\..\obj\timer.o + $PROJ_DIR$\..\lib\s32_core_cm0.h + $PROJ_DIR$\..\lib\S32K118.h + $PROJ_DIR$\..\lib\devassert.h + $PROJ_DIR$\..\lib\device_registers.h + $PROJ_DIR$\..\obj\startup.o + $TOOLKIT_DIR$\inc\c\DLib_Product.h + $TOOLKIT_DIR$\inc\c\stdint.h + $TOOLKIT_DIR$\inc\c\DLib_Defaults.h + $TOOLKIT_DIR$\lib\m6M_tl.a + $TOOLKIT_DIR$\lib\shb_l.a + $PROJ_DIR$\..\obj\main.__cstat.et + $PROJ_DIR$\..\obj\boot.__cstat.et + $PROJ_DIR$\..\obj\led.__cstat.et + $PROJ_DIR$\..\obj\demoprog_s32k118.map + $PROJ_DIR$\..\S32K118_25_flash.icf + $TOOLKIT_DIR$\lib\rt6M_tl.a + $PROJ_DIR$\..\..\Boot\blt_conf.h + $PROJ_DIR$\..\bin\demoprog_s32k118.srec + $TOOLKIT_DIR$\inc\c\stdbool.h + $TOOLKIT_DIR$\inc\c\DLib_Config_Normal.h + $TOOLKIT_DIR$\lib\dl6M_tln.a + $TOOLKIT_DIR$\inc\c\ycheck.h + + + [ROOT_NODE] + + + ILINK + 26 45 + + + + + $PROJ_DIR$\..\boot.c + + + ICCARM + 20 + + + BICOMP + 17 + + + __cstat + 43 + + + + + ICCARM + 5 48 3 30 18 35 32 33 38 53 2 39 51 37 13 34 50 14 + + + + + $PROJ_DIR$\..\timer.c + + + ICCARM + 31 + + + BICOMP + 12 + + + __cstat + 0 + + + + + ICCARM + 5 48 3 30 18 35 32 33 38 53 2 39 51 37 13 34 50 14 + + + + + $PROJ_DIR$\..\led.c + + + ICCARM + 28 + + + BICOMP + 1 + + + __cstat + 44 + + + + + ICCARM + 5 48 3 30 18 35 32 33 38 53 2 39 51 37 13 34 50 14 + + + + + $PROJ_DIR$\..\main.c + + + ICCARM + 25 + + + BICOMP + 22 + + + __cstat + 42 + + + + + ICCARM + 5 48 3 30 18 35 32 33 38 53 2 39 51 37 13 34 50 14 + + + + + $PROJ_DIR$\..\lib\startup.c + + + ICCARM + 36 + + + BICOMP + 16 + + + __cstat + 9 + + + + + ICCARM + 19 38 53 2 39 51 37 35 32 33 13 34 50 + + + + + $PROJ_DIR$\..\bin\demoprog_s32k118.out + + + OBJCOPY + 49 + + + ILINK + 45 + + + + + ILINK + 46 20 28 25 36 21 10 31 41 47 40 52 + + + + + $PROJ_DIR$\..\startup_S32K118.s + + + AARM + 21 + + + + + $PROJ_DIR$\..\lib\system_S32K118.c + + + ICCARM + 10 + + + BICOMP + 15 + + + __cstat + 11 + + + + + ICCARM + 35 32 33 38 53 2 39 51 37 13 34 50 14 + + + + + + Release + + + [MULTI_TOOL] + ILINK + + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.ewd b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.ewd new file mode 100644 index 00000000..42f98615 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.ewd @@ -0,0 +1,2966 @@ + + + 3 + + Debug + + ARM + + 1 + + C-SPY + 2 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8BE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 6 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\RemedyRtosViewer\RemedyRtosViewer.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8BE.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.ewp b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.ewp new file mode 100644 index 00000000..d3c30882 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.ewp @@ -0,0 +1,2167 @@ + + + 3 + + Debug + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 23 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Prog + + lib + + $PROJ_DIR$\..\lib\devassert.h + + + $PROJ_DIR$\..\lib\device_registers.h + + + $PROJ_DIR$\..\lib\s32_core_cm0.h + + + $PROJ_DIR$\..\lib\S32K118.h + + + $PROJ_DIR$\..\lib\S32K118_features.h + + + $PROJ_DIR$\..\lib\startup.c + + + $PROJ_DIR$\..\lib\startup.h + + + $PROJ_DIR$\..\lib\system_S32K118.c + + + $PROJ_DIR$\..\lib\system_S32K118.h + + + + $PROJ_DIR$\..\boot.c + + + $PROJ_DIR$\..\boot.h + + + $PROJ_DIR$\..\header.h + + + $PROJ_DIR$\..\led.c + + + $PROJ_DIR$\..\led.h + + + $PROJ_DIR$\..\main.c + + + $PROJ_DIR$\..\startup_S32K118.s + + + $PROJ_DIR$\..\timer.c + + + $PROJ_DIR$\..\timer.h + + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.ewt b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.ewt new file mode 100644 index 00000000..405ef8f9 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.ewt @@ -0,0 +1,2432 @@ + + + 3 + + Debug + + ARM + + 1 + + C-STAT + 261 + + 261 + + 0 + + 1 + 600 + 1 + 2 + 0 + 1 + 100 + + + 1.5.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + Release + + ARM + + 0 + + C-STAT + 261 + + 261 + + 0 + + 1 + 600 + 1 + 2 + 0 + 1 + 100 + + + 1.5.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + RuntimeChecking + 0 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + Prog + + lib + + $PROJ_DIR$\..\lib\devassert.h + + + $PROJ_DIR$\..\lib\device_registers.h + + + $PROJ_DIR$\..\lib\s32_core_cm0.h + + + $PROJ_DIR$\..\lib\S32K118.h + + + $PROJ_DIR$\..\lib\S32K118_features.h + + + $PROJ_DIR$\..\lib\startup.c + + + $PROJ_DIR$\..\lib\startup.h + + + $PROJ_DIR$\..\lib\system_S32K118.c + + + $PROJ_DIR$\..\lib\system_S32K118.h + + + + $PROJ_DIR$\..\boot.c + + + $PROJ_DIR$\..\boot.h + + + $PROJ_DIR$\..\header.h + + + $PROJ_DIR$\..\led.c + + + $PROJ_DIR$\..\led.h + + + $PROJ_DIR$\..\main.c + + + $PROJ_DIR$\..\startup_S32K118.s + + + $PROJ_DIR$\..\timer.c + + + $PROJ_DIR$\..\timer.h + + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.eww b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.eww new file mode 100644 index 00000000..ca137aad --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/ide/s32k118.eww @@ -0,0 +1,7 @@ + + + + $WS_DIR$\s32k118.ewp + + + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/led.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/led.c new file mode 100644 index 00000000..07031dec --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/led.c @@ -0,0 +1,96 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/led.c +* \brief LED driver source file. +* \ingroup Prog_ARMCM0_S32K14_S32K118EVB_IAR +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "header.h" /* generic header */ + + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +/** \brief Toggle interval time in milliseconds. */ +#define LED_TOGGLE_MS (500U) + + +/************************************************************************************//** +** \brief Initializes the LED. +** \return none. +** +****************************************************************************************/ +void LedInit(void) +{ + /* LED GPIO pin configuration. PE8 = GPIO, MUX = ALT1. */ + PORTE->PCR[8] = PORT_PCR_MUX(1); + /* Configure Port E pin 8 GPIO as digital output. */ + PTE->PDDR |= GPIO_PDDR_PDD(1 << 8U); + /* Turn the LED off on Port E pin 8. */ + PTE->PCOR |= GPIO_PSOR_PTSO(1 << 8U); +} /*** end of LedInit ***/ + + +/************************************************************************************//** +** \brief Toggles the LED at a fixed time interval. +** \return none. +** +****************************************************************************************/ +void LedToggle(void) +{ + static unsigned char led_toggle_state = 0; + static unsigned long timer_counter_last = 0; + unsigned long timer_counter_now; + + /* Check if toggle interval time passed. */ + timer_counter_now = TimerGet(); + if ( (timer_counter_now - timer_counter_last) < LED_TOGGLE_MS) + { + /* Not yet time to toggle. */ + return; + } + + /* Determine toggle action. */ + if (led_toggle_state == 0) + { + led_toggle_state = 1; + /* Turn the LED on. */ + PTE->PSOR |= GPIO_PSOR_PTSO(1 << 8U); + } + else + { + led_toggle_state = 0; + /* Turn the LED off. */ + PTE->PCOR |= GPIO_PSOR_PTSO(1 << 8U); + } + + /* Store toggle time to determine next toggle interval. */ + timer_counter_last = timer_counter_now; +} /*** end of LedToggle ***/ + + +/*********************************** end of led.c **************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/led.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/led.h new file mode 100644 index 00000000..5365c03f --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/led.h @@ -0,0 +1,39 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/led.h +* \brief LED driver header file. +* \ingroup Prog_ARMCM0_S32K14_S32K118EVB_IAR +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ +#ifndef LED_H +#define LED_H + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +void LedInit(void); +void LedToggle(void); + + +#endif /* LED_H */ +/*********************************** end of led.h **************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/S32K118.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/S32K118.h new file mode 100644 index 00000000..d1f10a17 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/S32K118.h @@ -0,0 +1,10438 @@ +/* +** ################################################################### +** Processor: S32K118 +** Reference manual: S32K1XXRM Rev. 9, 09/2018 +** Version: rev. 1.3, 2019-02-19 +** Build: b190219 +** +** Abstract: +** Peripheral Access Layer for S32K118 +** +** Copyright (c) 1997 - 2016 Freescale Semiconductor, Inc. +** Copyright 2016-2019 NXP +** All rights reserved. +** +** THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +** INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +** STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +** IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +** +** http: www.nxp.com +** mail: support@nxp.com +** +** Revisions: +** - rev. 1.0 (2017-12-14) - Mihai Volmer +** Initial version based on S32K1XXRM Rev. 6, 12/2017. +** - rev. 1.1 (2018-02-08) - Mihai Volmer +** Renamed the NVIC register array IP to IPR to reflect the register access difference from Cortex-M4 NVIC registers +** Fixed CSE_PRAM base address +** - rev. 1.2 (2018-07-19) - Dan Nastasa +** Updated the header based on S32K1XXRM Rev. 8, 06/2018. +** Added MTB_DWT peripheral to the header file +** - rev. 1.3 (2019-02-19) - Ionut Pavel +** Updated the header based on S32K1XXRM Rev. 9, 09/2018. +** Removed LMEM_LMDR2 register from the header file. +** Modified LMEM_LMPECR register to Read-Only. +** +** ################################################################### +*/ + +/*! + * @file S32K118.h + * @version 1.3 + * @date 2019-02-19 + * @brief Peripheral Access Layer for S32K118 + * + * This file contains register definitions and macros for easy access to their + * bit fields. + * + * This file assumes LITTLE endian system. + */ + +/** +* @page misra_violations MISRA-C:2012 violations +* +* @section [global] +* Violates MISRA 2012 Advisory Rule 2.3, local typedef not referenced +* The SoC header defines typedef for all modules. +* +* @section [global] +* Violates MISRA 2012 Advisory Rule 2.5, local macro not referenced +* The SoC header defines macros for all modules and registers. +* +* @section [global] +* Violates MISRA 2012 Advisory Directive 4.9, Function-like macro +* These are generated macros used for accessing the bit-fields from registers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 5.1, identifier clash +* The supported compilers use more than 31 significant characters for identifiers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 5.2, identifier clash +* The supported compilers use more than 31 significant characters for identifiers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 5.4, identifier clash +* The supported compilers use more than 31 significant characters for identifiers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 5.5, identifier clash +* The supported compilers use more than 31 significant characters for identifiers. +* +* @section [global] +* Violates MISRA 2012 Required Rule 21.1, defined macro '__I' is reserved to the compiler +* This type qualifier is needed to ensure correct I/O access and addressing. +*/ + +/* ---------------------------------------------------------------------------- + -- MCU activation + ---------------------------------------------------------------------------- */ + +/* Prevention from multiple including the same memory map */ +#if !defined(S32K118_H_) /* Check if memory map has not been already included */ +#define S32K118_H_ +#define MCU_S32K118 + +/* Check if another memory map has not been also included */ +#if (defined(MCU_ACTIVE)) + #error S32K118 memory map: There is already included another memory map. Only one memory map can be included. +#endif /* (defined(MCU_ACTIVE)) */ +#define MCU_ACTIVE + +#include + +/** Memory map major version (memory maps with equal major version number are + * compatible) */ +#define MCU_MEM_MAP_VERSION 0x0100u +/** Memory map minor version */ +#define MCU_MEM_MAP_VERSION_MINOR 0x0003u + +/* ---------------------------------------------------------------------------- + -- Generic macros + ---------------------------------------------------------------------------- */ + +/* IO definitions (access restrictions to peripheral registers) */ +/** +* IO Type Qualifiers are used +* \li to specify the access to peripheral variables. +* \li for automatic generation of peripheral register debug information. +*/ +#ifndef __IO +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ +#endif + + +/** +* @brief 32 bits memory read macro. +*/ +#if !defined(REG_READ32) + #define REG_READ32(address) (*(volatile uint32_t*)(address)) +#endif + +/** +* @brief 32 bits memory write macro. +*/ +#if !defined(REG_WRITE32) + #define REG_WRITE32(address, value) ((*(volatile uint32_t*)(address))= (uint32_t)(value)) +#endif + +/** +* @brief 32 bits bits setting macro. +*/ +#if !defined(REG_BIT_SET32) + #define REG_BIT_SET32(address, mask) ((*(volatile uint32_t*)(address))|= (uint32_t)(mask)) +#endif + +/** +* @brief 32 bits bits clearing macro. +*/ +#if !defined(REG_BIT_CLEAR32) + #define REG_BIT_CLEAR32(address, mask) ((*(volatile uint32_t*)(address))&= ((uint32_t)~((uint32_t)(mask)))) +#endif + +/** +* @brief 32 bit clear bits and set with new value +* @note It is user's responsability to make sure that value has only "mask" bits set - (value&~mask)==0 +*/ +#if !defined(REG_RMW32) + #define REG_RMW32(address, mask, value) (REG_WRITE32((address), ((REG_READ32(address)& ((uint32_t)~((uint32_t)(mask))))| ((uint32_t)(value))))) +#endif + + +/* ---------------------------------------------------------------------------- + -- Interrupt vector numbers for S32K118 + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Interrupt_vector_numbers_S32K118 Interrupt vector numbers for S32K118 + * @{ + */ + +/** Interrupt Number Definitions */ +#define NUMBER_OF_INT_VECTORS 48u /**< Number of interrupts in the Vector table */ + +/** + * @brief Defines the Interrupt Numbers definitions + * + * This enumeration is used to configure the interrupts. + * + * Implements : IRQn_Type_Class + */ +typedef enum +{ + /* Auxiliary constants */ + NotAvail_IRQn = -128, /**< Not available device specific interrupt */ + + /* Core interrupts */ + NonMaskableInt_IRQn = -14, /**< Non Maskable Interrupt */ + HardFault_IRQn = -13, /**< Cortex-M0 SV Hard Fault Interrupt */ + SVCall_IRQn = -5, /**< Cortex-M0 SV Call Interrupt */ + PendSV_IRQn = -2, /**< Cortex-M0 Pend SV Interrupt */ + SysTick_IRQn = -1, /**< Cortex-M0 System Tick Interrupt */ + + /* Device specific interrupts */ + DMA0_IRQn = 0u, /**< DMA channel 0 transfer complete */ + DMA1_IRQn = 1u, /**< DMA channel 1 transfer complete */ + DMA2_IRQn = 2u, /**< DMA channel 2 transfer complete */ + DMA3_IRQn = 3u, /**< DMA channel 3 transfer complete */ + DMA_Error_IRQn = 4u, /**< DMA error interrupt channels 0-3 */ + ERM_fault_IRQn = 5u, /**< ERM single and double bit error correction */ + RTC_IRQn = 6u, /**< RTC alarm interrupt */ + RTC_Seconds_IRQn = 7u, /**< RTC seconds interrupt */ + LPTMR0_IRQn = 8u, /**< LPTIMER interrupt request */ + PORT_IRQn = 9u, /**< Port A, B, C, D and E pin detect interrupt */ + CAN0_ORed_Err_Wakeup_IRQn = 10u, /**< OR’ed [Bus Off OR Bus Off Done OR Transmit Warning OR Receive Warning], Interrupt indicating that errors were detected on the CAN bus, Interrupt asserted when Pretended Networking operation is enabled, and a valid message matches the selected filter criteria during Low Power mode */ + CAN0_ORed_0_31_MB_IRQn = 11u, /**< OR'ed Message buffer (0-15, 16-31) */ + FTM0_Ch0_7_IRQn = 12u, /**< FTM0 Channel 0 to 7 interrupt */ + FTM0_Fault_IRQn = 13u, /**< FTM0 Fault interrupt */ + FTM0_Ovf_Reload_IRQn = 14u, /**< FTM0 Counter overflow and Reload interrupt */ + FTM1_Ch0_7_IRQn = 15u, /**< FTM1 Channel 0 to 7 interrupt */ + FTM1_Fault_IRQn = 16u, /**< FTM1 Fault interrupt */ + FTM1_Ovf_Reload_IRQn = 17u, /**< FTM1 Counter overflow and Reload interrupt */ + FTFC_IRQn = 18u, /**< FTFC Command complete, Read collision and Double bit fault detect */ + PDB0_IRQn = 19u, /**< PDB0 interrupt */ + LPIT0_IRQn = 20u, /**< LPIT interrupt */ + SCG_CMU_LVD_LVWSCG_IRQn = 21u, /**< PMC Low voltage detect interrupt, SCG bus interrupt request and CMU loss of range interrupt */ + WDOG_IRQn = 22u, /**< WDOG interrupt request out before wdg reset out */ + RCM_IRQn = 23u, /**< RCM Asynchronous Interrupt */ + LPI2C0_Master_Slave_IRQn = 24u, /**< LPI2C0 Master Interrupt and Slave Interrupt */ + FLEXIO_IRQn = 25u, /**< FlexIO Interrupt */ + LPSPI0_IRQn = 26u, /**< LPSPI0 Interrupt */ + LPSPI1_IRQn = 27u, /**< LPSPI1 Interrupt */ + ADC0_IRQn = 28u, /**< ADC0 interrupt request. */ + CMP0_IRQn = 29u, /**< CMP0 interrupt request */ + LPUART1_RxTx_IRQn = 30u, /**< LPUART1 Transmit / Receive Interrupt */ + LPUART0_RxTx_IRQn = 31u /**< LPUART0 Transmit / Receive Interrupt */ +} IRQn_Type; + +/*! + * @} + */ /* end of group Interrupt_vector_numbers_S32K118 */ + + +/* ---------------------------------------------------------------------------- + -- Device Peripheral Access Layer for S32K118 + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Peripheral_access_layer_S32K118 Device Peripheral Access Layer for S32K118 + * @{ + */ + +/* @brief This module covers memory mapped registers available on SoC */ + +/* ---------------------------------------------------------------------------- + -- ADC Peripheral Access Layer + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup ADC_Peripheral_Access_Layer ADC Peripheral Access Layer + * @{ + */ + + +/** ADC - Size of Registers Arrays */ +#define ADC_SC1_COUNT 16u +#define ADC_R_COUNT 16u +#define ADC_CV_COUNT 2u + +/** ADC - Register Layout Typedef */ +typedef struct { + __IO uint32_t SC1[ADC_SC1_COUNT]; /**< ADC Status and Control Register 1, array offset: 0x0, array step: 0x4 */ + __IO uint32_t CFG1; /**< ADC Configuration Register 1, offset: 0x40 */ + __IO uint32_t CFG2; /**< ADC Configuration Register 2, offset: 0x44 */ + __I uint32_t R[ADC_R_COUNT]; /**< ADC Data Result Registers, array offset: 0x48, array step: 0x4 */ + __IO uint32_t CV[ADC_CV_COUNT]; /**< Compare Value Registers, array offset: 0x88, array step: 0x4 */ + __IO uint32_t SC2; /**< Status and Control Register 2, offset: 0x90 */ + __IO uint32_t SC3; /**< Status and Control Register 3, offset: 0x94 */ + __IO uint32_t BASE_OFS; /**< BASE Offset Register, offset: 0x98 */ + __IO uint32_t OFS; /**< ADC Offset Correction Register, offset: 0x9C */ + __IO uint32_t USR_OFS; /**< USER Offset Correction Register, offset: 0xA0 */ + __IO uint32_t XOFS; /**< ADC X Offset Correction Register, offset: 0xA4 */ + __IO uint32_t YOFS; /**< ADC Y Offset Correction Register, offset: 0xA8 */ + __IO uint32_t G; /**< ADC Gain Register, offset: 0xAC */ + __IO uint32_t UG; /**< ADC User Gain Register, offset: 0xB0 */ + __IO uint32_t CLPS; /**< ADC General Calibration Value Register S, offset: 0xB4 */ + __IO uint32_t CLP3; /**< ADC Plus-Side General Calibration Value Register 3, offset: 0xB8 */ + __IO uint32_t CLP2; /**< ADC Plus-Side General Calibration Value Register 2, offset: 0xBC */ + __IO uint32_t CLP1; /**< ADC Plus-Side General Calibration Value Register 1, offset: 0xC0 */ + __IO uint32_t CLP0; /**< ADC Plus-Side General Calibration Value Register 0, offset: 0xC4 */ + __IO uint32_t CLPX; /**< ADC Plus-Side General Calibration Value Register X, offset: 0xC8 */ + __IO uint32_t CLP9; /**< ADC Plus-Side General Calibration Value Register 9, offset: 0xCC */ + __IO uint32_t CLPS_OFS; /**< ADC General Calibration Offset Value Register S, offset: 0xD0 */ + __IO uint32_t CLP3_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 3, offset: 0xD4 */ + __IO uint32_t CLP2_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 2, offset: 0xD8 */ + __IO uint32_t CLP1_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 1, offset: 0xDC */ + __IO uint32_t CLP0_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 0, offset: 0xE0 */ + __IO uint32_t CLPX_OFS; /**< ADC Plus-Side General Calibration Offset Value Register X, offset: 0xE4 */ + __IO uint32_t CLP9_OFS; /**< ADC Plus-Side General Calibration Offset Value Register 9, offset: 0xE8 */ +} ADC_Type, *ADC_MemMapPtr; + + /** Number of instances of the ADC module. */ +#define ADC_INSTANCE_COUNT (1u) + + +/* ADC - Peripheral instance base addresses */ +/** Peripheral ADC0 base address */ +#define ADC0_BASE (0x4003B000u) +/** Peripheral ADC0 base pointer */ +#define ADC0 ((ADC_Type *)ADC0_BASE) +/** Array initializer of ADC peripheral base addresses */ +#define ADC_BASE_ADDRS { ADC0_BASE } +/** Array initializer of ADC peripheral base pointers */ +#define ADC_BASE_PTRS { ADC0 } + /** Number of interrupt vector arrays for the ADC module. */ +#define ADC_IRQS_ARR_COUNT (1u) + /** Number of interrupt channels for the ADC module. */ +#define ADC_IRQS_CH_COUNT (1u) +/** Interrupt vectors for the ADC peripheral type */ +#define ADC_IRQS { ADC0_IRQn } + +/* ---------------------------------------------------------------------------- + -- ADC Register Masks + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup ADC_Register_Masks ADC Register Masks + * @{ + */ + +/* SC1 Bit Fields */ +#define ADC_SC1_ADCH_MASK 0x1Fu +#define ADC_SC1_ADCH_SHIFT 0u +#define ADC_SC1_ADCH_WIDTH 5u +#define ADC_SC1_ADCH(x) (((uint32_t)(((uint32_t)(x))<VTOR} + +/* FTM module features */ + +/* @brief Number of PWM channels */ +#define FEATURE_FTM_CHANNEL_COUNT (8U) +/* @brief Number of fault channels */ +#define FTM_FEATURE_FAULT_CHANNELS (4U) +/* @brief Width of control channel */ +#define FTM_FEATURE_COMBINE_CHAN_CTRL_WIDTH (8U) +/* @brief Output channel offset */ +#define FTM_FEATURE_OUTPUT_CHANNEL_OFFSET (16U) +/* @brief Max counter value */ +#define FTM_FEATURE_CNT_MAX_VALUE_U32 (0x0000FFFFU) +/* @brief Input capture for single shot */ +#define FTM_FEATURE_INPUT_CAPTURE_SINGLE_SHOT (2U) +/* @brief Dithering has supported on the generated PWM signals */ +#define FEATURE_FTM_HAS_SUPPORTED_DITHERING (1U) +/* @brief Number of interrupt vector for channels of the FTM module. */ +#define FEATURE_FTM_HAS_NUM_IRQS_CHANS (1U) + +/* LPIT module features */ + +/*! @brief Number of interrupt vector for channels of the LPIT module. */ +#define FEATURE_LPIT_HAS_NUM_IRQS_CHANS (1U) +/*! @brief Clock names for LPIT. */ +#define LPIT_CLOCK_NAMES {LPIT0_CLK} + +/* LPI2C module features */ + +/* @brief DMA instance used for LPI2C module */ +#define LPI2C_DMA_INSTANCE 0U + +/* @brief EDMA requests for LPI2C module. */ +#define LPI2C_EDMA_REQ {{(uint8_t)EDMA_REQ_LPI2C0_TX, (uint8_t)EDMA_REQ_LPI2C0_RX}} +/* @brief PCC clocks for LPI2C module. */ +#define LPI2C_PCC_CLOCKS {LPI2C0_CLK} + +/* @brief Disable high-speed and ultra-fast operating modes for S32K14x. */ +#define LPI2C_HAS_FAST_PLUS_MODE (0U) +#define LPI2C_HAS_HIGH_SPEED_MODE (0U) +#define LPI2C_HAS_ULTRA_FAST_MODE (0U) + +/* LPI2C module features */ + +/* @brief DMA instance used for LPI2C module */ +#define LPI2C_DMA_INSTANCE 0U + +/* @brief EDMA requests for LPI2C module. */ +#define LPI2C_EDMA_REQ {{(uint8_t)EDMA_REQ_LPI2C0_TX, (uint8_t)EDMA_REQ_LPI2C0_RX}} +/* @brief PCC clocks for LPI2C module. */ +#define LPI2C_PCC_CLOCKS {LPI2C0_CLK} + +/* @brief Disable high-speed and ultra-fast operating modes for S32K14x. */ +#define LPI2C_HAS_FAST_PLUS_MODE (0U) +#define LPI2C_HAS_HIGH_SPEED_MODE (0U) +#define LPI2C_HAS_ULTRA_FAST_MODE (0U) + +/* MSCM module features */ + +/* @brief Has interrupt router control registers (IRSPRCn). */ +#define FEATURE_MSCM_HAS_INTERRUPT_ROUTER (0) +/* @brief Has directed CPU interrupt routerregisters (IRCPxxx). */ +#define FEATURE_MSCM_HAS_CPU_INTERRUPT_ROUTER (0) + +/* CSEc module features */ + +/*! @brief CSE_PRAM offset of the page length parameter used by the following +commands: CMD_ENC_ECB, CMD_ENC_CBC, CMD_DEC_ECB, CMD_DEC_CBC, CMD_MP_COMPRESS */ +#define FEATURE_CSEC_PAGE_LENGTH_OFFSET (0xEU) +/*! @brief CSE_PRAM offset of the message length parameter used by the following +commands: CMD_GENERATE_MAC, CMD_VERIFY_MAC (both copy and pointer methods) */ +#define FEATURE_CSEC_MESSAGE_LENGTH_OFFSET (0xCU) +/*! @brief CSE_PRAM offset of the MAC length parameter used by the following +commands: CMD_VERIFY_MAC (both copy and pointer methods) */ +#define FEATURE_CSEC_MAC_LENGTH_OFFSET (0x8U) +/*! @brief CSE_PRAM offset of the boot size parameter used by the following +commands: CMD_BOOT_DEFINE */ +#define FEATURE_CSEC_BOOT_SIZE_OFFSET (0x1CU) +/*! @brief CSE_PRAM offset of the boot flavor parameter used by the following +commands: CMD_BOOT_DEFINE */ +#define FEATURE_CSEC_BOOT_FLAVOR_OFFSET (0x1BU) +/*! @brief CSE_PRAM offset of the Flash start address parameter used by the +following commands: CMD_GENERATE_MAC, CMD_VERIFY_MAC (pointer method) */ +#define FEATURE_CSEC_FLASH_START_ADDRESS_OFFSET (0x10U) +/*! @brief CSE_PRAM offset of the verification status parameter used by the +following commands: CMD_VERIFY_MAC (both copy and pointer methods) */ +#define FEATURE_CSEC_VERIFICATION_STATUS_OFFSET (0x14U) +/*! @brief CSE_PRAM offset of the error bits field contained by all commands */ +#define FEATURE_CSEC_ERROR_BITS_OFFSET (0x4U) +/*! @brief CSE_PRAM offset of the SREG parameter used by the following commands: +CMD_GET_ID */ +#define FEATURE_CSEC_SREG_OFFSET (0x2FU) + +/*! @brief CSE_PRAM offset of page 0 */ +#define FEATURE_CSEC_PAGE_0_OFFSET (0x0U) +/*! @brief CSE_PRAM offset of page 1 */ +#define FEATURE_CSEC_PAGE_1_OFFSET (0x10U) +/*! @brief CSE_PRAM offset of page 2 */ +#define FEATURE_CSEC_PAGE_2_OFFSET (0x20U) +/*! @brief CSE_PRAM offset of page 3 */ +#define FEATURE_CSEC_PAGE_3_OFFSET (0x30U) +/*! @brief CSE_PRAM offset of page 4 */ +#define FEATURE_CSEC_PAGE_4_OFFSET (0x40U) +/*! @brief CSE_PRAM offset of page 5 */ +#define FEATURE_CSEC_PAGE_5_OFFSET (0x50U) +/*! @brief CSE_PRAM offset of page 6 */ +#define FEATURE_CSEC_PAGE_6_OFFSET (0x60U) +/*! @brief CSE_PRAM offset of page 7 */ +#define FEATURE_CSEC_PAGE_7_OFFSET (0x70U) + +/* CRC module features */ + +/* @brief CRC module use for S32K. */ +#define FEATURE_CRC_DRIVER_SOFT_POLYNOMIAL +/* @brief Default CRC bit width */ +#define FEATURE_CRC_DEFAULT_WIDTH CRC_BITS_16 +/* @brief Default CRC read transpose */ +#define FEATURE_CRC_DEFAULT_READ_TRANSPOSE CRC_TRANSPOSE_NONE +/* @brief Default CRC write transpose */ +#define FEATURE_CRC_DEFAULT_WRITE_TRANSPOSE CRC_TRANSPOSE_NONE +/* @brief Default polynomial 0x1021U */ +#define FEATURE_CRC_DEFAULT_POLYNOMIAL (0x1021U) +/* @brief Default seed value is 0xFFFFU */ +#define FEATURE_CRC_DEFAULT_SEED (0xFFFFU) + +/* PORT module features */ +/*! @brief PORT Used for setting Pins */ +#define FEATURE_PINS_DRIVER_USING_PORT (1) +/* @brief Has control lock (register bit PCR[LK]). */ +#define FEATURE_PORT_HAS_PIN_CONTROL_LOCK (1) +/* @brief Has open drain control (register bit PCR[ODE]). */ +#define FEATURE_PINS_HAS_OPEN_DRAIN (0) +/* @brief Has digital filter (registers DFER, DFCR and DFWR). */ +#define FEATURE_PORT_HAS_DIGITAL_FILTER (1) +/* @brief Has trigger output to trigger other peripherals (register bit field PCR[IRQC] values). */ +#define FEATURE_PORT_HAS_TRIGGER_OUT (0) +/* @brief Has setting flag only (register bit field PCR[IRQC] values). */ +#define FEATURE_PORT_HAS_FLAG_SET_ONLY (0) +/* @brief Has over-current feature (register bit field PCR[OCIE] values). */ +#define FEATURE_PINS_HAS_OVER_CURRENT (0) +/* @brief Has pull resistor selection available. */ +#define FEATURE_PINS_HAS_PULL_SELECTION (1) +/* @brief Has slew rate control (register bit PCR[SRE]). */ +#define FEATURE_PINS_HAS_SLEW_RATE (0) +/* @brief Has passive filter (register bit field PCR[PFE]). */ +#define FEATURE_PORT_HAS_PASSIVE_FILTER (1) +/* @brief Has drive strength (register bit PCR[DSE]). */ +#define FEATURE_PINS_HAS_DRIVE_STRENGTH (1) +/* @brief Has drive strength control bits*/ +#define FEATURE_PINS_HAS_DRIVE_STRENGTH_CONTROL (0) +/* @brief Has port input disable control bits*/ +#define FEATURE_PORT_HAS_INPUT_DISABLE (0) +/* @brief SIM_CHIPCTL_ADC_INTERLEAVE_EN bit is not available */ +#define FEATURE_PINS_HAS_ADC_INTERLEAVE_EN (0) + +/* MPU module features */ + +/* @brief Specifies hardware revision level. */ +#define FEATURE_MPU_HARDWARE_REVISION_LEVEL (1U) +/* @brief Has process identifier support. */ +#define FEATURE_MPU_HAS_PROCESS_IDENTIFIER (1U) +/* @brief Specifies total number of bus masters. */ +#define FEATURE_MPU_MASTER_COUNT (3U) +/* @brief Specifies maximum number of masters which have separated +privilege rights for user and supervisor mode accesses (e.g. master0~3 in S32K1xx). +*/ +#define FEATURE_MPU_MAX_LOW_MASTER_NUMBER (3U) +/* @brief Specifies maximum number of masters which have only +read and write permissions (e.g. master4~7 in S32K1xx). +*/ +#define FEATURE_MPU_MAX_HIGH_MASTER_NUMBER (7U) + +/* @brief Specifies number of set access control right bits for + masters which have separated privilege rights for user and + supervisor mode accesses (e.g. master0~3 in S32K1xx). +*/ +#define FEATURE_MPU_LOW_MASTER_CONTROL_WIDTH (6U) +/* @brief Specifies number of set access control right bits for + masters which have only read and write permissions(e.g. master4~7 in S32K1xx). +*/ +#define FEATURE_MPU_HIGH_MASTER_CONTROL_WIDTH (2U) + +/* @brief The MPU Logical Bus Master Number for core bus master. */ +#define FEATURE_MPU_MASTER_CORE (0U) +/* @brief The MPU Logical Bus Master Number for Debugger master. */ +#define FEATURE_MPU_MASTER_DEBUGGER (1U) +/* @brief The MPU Logical Bus Master Number for DMA master. */ +#define FEATURE_MPU_MASTER_DMA (2U) +/* @brief Specifies master number. */ +#define FEATURE_MPU_MASTER \ +{ \ + FEATURE_MPU_MASTER_CORE, /*!< CORE */ \ + FEATURE_MPU_MASTER_DEBUGGER, /*!< DEBUGGER */ \ + FEATURE_MPU_MASTER_DMA, /*!< DMA */ \ +} + +/* @brief Specifies total number of slave ports. */ +#define FEATURE_MPU_SLAVE_COUNT (2U) +/* @brief The MPU Slave Port Assignment for Flash Controller and boot ROM. */ +#define FEATURE_MPU_SLAVE_FLASH_BOOTROM (0U) +/* @brief The MPU Slave Port Assignment for SRAM, MTB, DWT and MCM. */ +#define FEATURE_MPU_SLAVE_SRAM_MTB_DWT_MCM (1U) +/* @brief The MPU Slave Port mask. */ +#define FEATURE_MPU_SLAVE_MASK (0xC0000000U) +#define FEATURE_MPU_SLAVE_SHIFT (30u) +#define FEATURE_MPU_SLAVE_WIDTH (2u) +#define FEATURE_MPU_SLAVE(x) (((uint32_t)(((uint32_t)(x))<> (uint32_t)FEATURE_DMA_CH_WIDTH) +/* @brief DMA virtual channel to channel */ +#define FEATURE_DMA_VCH_TO_CH(x) ((x) & ((uint32_t)FEATURE_DMA_CHANNELS - 1U)) +/* @brief DMA supports the following particular channel priorities: */ +#define FEATURE_DMA_4_CH_PRIORITIES +/* @brief DMA supports bus bandwidth control. */ +#define FEATURE_DMA_ENGINE_STALL + +/* DMAMUX module features */ + +/* @brief DMAMUX peripheral is available in silicon. */ +#define FEATURE_DMAMUX_AVAILABLE +/* @brief Number of DMA channels. */ +#define FEATURE_DMAMUX_CHANNELS (4U) +/* @brief Has the periodic trigger capability */ +#define FEATURE_DMAMUX_HAS_TRIG (1) +/* @brief Conversion from request source to the actual DMAMUX channel */ +#define FEATURE_DMAMUX_REQ_SRC_TO_CH(x) (x) +/* @brief Mapping between request source and DMAMUX instance */ +#define FEATURE_DMAMUX_REQ_SRC_TO_INSTANCE(x) (0U) +/* @brief Conversion from eDMA channel index to DMAMUX channel. */ +#define FEATURE_DMAMUX_DMA_CH_TO_CH(x) (x) +/* @brief Conversion from DMAMUX channel DMAMUX register index. */ +#define FEATURE_DMAMUX_CHN_REG_INDEX(x) (x) +/* @brief Clock names for DMAMUX. */ +#define FEATURE_DMAMUX_CLOCK_NAMES {DMAMUX0_CLK} + +/*! + * @brief Structure for the DMA hardware request + * + * Defines the structure for the DMA hardware request collections. The user can configure the + * hardware request into DMAMUX to trigger the DMA transfer accordingly. The index + * of the hardware request varies according to the to SoC. + */ +typedef enum { + EDMA_REQ_DISABLED = 0U, + EDMA_REQ_LPUART0_RX = 2U, + EDMA_REQ_LPUART0_TX = 3U, + EDMA_REQ_LPUART1_RX = 4U, + EDMA_REQ_LPUART1_TX = 5U, + EDMA_REQ_FLEXIO_SHIFTER0 = 10U, + EDMA_REQ_FLEXIO_SHIFTER1 = 11U, + EDMA_REQ_FLEXIO_SHIFTER2 = 12U, + EDMA_REQ_FLEXIO_SHIFTER3 = 13U, + EDMA_REQ_LPSPI0_RX = 14U, + EDMA_REQ_LPSPI0_TX = 15U, + EDMA_REQ_LPSPI1_RX = 16U, + EDMA_REQ_LPSPI1_TX = 17U, + EDMA_REQ_FTM1_CHANNEL_0 = 20U, + EDMA_REQ_FTM1_CHANNEL_1 = 21U, + EDMA_REQ_FTM1_CHANNEL_2 = 22U, + EDMA_REQ_FTM1_CHANNEL_3 = 23U, + EDMA_REQ_FTM1_CHANNEL_4 = 24U, + EDMA_REQ_FTM1_CHANNEL_5 = 25U, + EDMA_REQ_FTM1_CHANNEL_6 = 26U, + EDMA_REQ_FTM1_CHANNEL_7 = 27U, + EDMA_REQ_FTM0_OR_CH0_CH7 = 36U, + EDMA_REQ_ADC0 = 42U, + EDMA_REQ_LPI2C0_RX = 44U, + EDMA_REQ_LPI2C0_TX = 45U, + EDMA_REQ_PDB0 = 46U, + EDMA_REQ_CMP0 = 48U, + EDMA_REQ_PORTA = 49U, + EDMA_REQ_PORTB = 50U, + EDMA_REQ_PORTC = 51U, + EDMA_REQ_PORTD = 52U, + EDMA_REQ_PORTE = 53U, + EDMA_REQ_FLEXCAN0 = 54U, + EDMA_REQ_LPTMR0 = 59U, + EDMA_REQ_DMAMUX_ALWAYS_ENABLED0 = 62U, + EDMA_REQ_DMAMUX_ALWAYS_ENABLED1 = 63U +} dma_request_source_t; + + +/* TRGMUX module features */ +/*! + * @brief Enumeration for trigger source module of TRGMUX + * + * Describes all possible inputs (trigger sources) of the TRGMUX IP + * This enumeration depends on the supported instances in device + */ +enum trgmux_trigger_source_e +{ + TRGMUX_TRIG_SOURCE_DISABLED = 0U, + TRGMUX_TRIG_SOURCE_VDD = 1U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN0 = 2U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN1 = 3U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN2 = 4U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN3 = 5U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN4 = 6U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN5 = 7U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN6 = 8U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN7 = 9U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN8 = 10U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN9 = 11U, + TRGMUX_TRIG_SOURCE_CMP0_OUT = 14U, + TRGMUX_TRIG_SOURCE_LPIT_CH0 = 17U, + TRGMUX_TRIG_SOURCE_LPIT_CH1 = 18U, + TRGMUX_TRIG_SOURCE_LPIT_CH2 = 19U, + TRGMUX_TRIG_SOURCE_LPIT_CH3 = 20U, + TRGMUX_TRIG_SOURCE_LPTMR0 = 21U, + TRGMUX_TRIG_SOURCE_FTM0_INIT_TRIG = 22U, + TRGMUX_TRIG_SOURCE_FTM0_EXT_TRIG = 23U, + TRGMUX_TRIG_SOURCE_FTM1_INIT_TRIG = 24U, + TRGMUX_TRIG_SOURCE_FTM1_EXT_TRIG = 25U, + TRGMUX_TRIG_SOURCE_ADC0_SC1A_COCO = 30U, + TRGMUX_TRIG_SOURCE_ADC0_SC1B_COCO = 31U, + TRGMUX_TRIG_SOURCE_PDB0_CH0_TRIG = 34U, + TRGMUX_TRIG_SOURCE_PDB0_PULSE_OUT = 36U, + TRGMUX_TRIG_SOURCE_RTC_ALARM = 43U, + TRGMUX_TRIG_SOURCE_RTC_SECOND = 44U, + TRGMUX_TRIG_SOURCE_FLEXIO_TRIG0 = 45U, + TRGMUX_TRIG_SOURCE_FLEXIO_TRIG1 = 46U, + TRGMUX_TRIG_SOURCE_FLEXIO_TRIG2 = 47U, + TRGMUX_TRIG_SOURCE_FLEXIO_TRIG3 = 48U, + TRGMUX_TRIG_SOURCE_LPUART0_RX_DATA = 49U, + TRGMUX_TRIG_SOURCE_LPUART0_TX_DATA = 50U, + TRGMUX_TRIG_SOURCE_LPUART0_RX_IDLE = 51U, + TRGMUX_TRIG_SOURCE_LPUART1_RX_DATA = 52U, + TRGMUX_TRIG_SOURCE_LPUART1_TX_DATA = 53U, + TRGMUX_TRIG_SOURCE_LPUART1_RX_IDLE = 54U, + TRGMUX_TRIG_SOURCE_LPI2C0_MASTER_TRIG = 55U, + TRGMUX_TRIG_SOURCE_LPI2C0_SLAVE_TRIG = 56U, + TRGMUX_TRIG_SOURCE_LPSPI0_FRAME = 59U, + TRGMUX_TRIG_SOURCE_LPSPI0_RX_DATA = 60U, + TRGMUX_TRIG_SOURCE_LPSPI1_FRAME = 61U, + TRGMUX_TRIG_SOURCE_LPSPI1_RX_DATA = 62U, + TRGMUX_TRIG_SOURCE_SIM_SW_TRIG = 63U, +}; + +/*! + * @brief Enumeration for target module of TRGMUX + * + * Describes all possible outputs (target modules) of the TRGMUX IP + * This enumeration depends on the supported instances in device + */ +enum trgmux_target_module_e +{ + TRGMUX_TARGET_MODULE_DMA_CH0 = 0U, + TRGMUX_TARGET_MODULE_DMA_CH1 = 1U, + TRGMUX_TARGET_MODULE_DMA_CH2 = 2U, + TRGMUX_TARGET_MODULE_DMA_CH3 = 3U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT0 = 4U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT1 = 5U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT2 = 6U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT3 = 7U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT4 = 8U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT5 = 9U, + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA0 = 12U, + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA1 = 13U, + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA2 = 14U, + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA3 = 15U, + TRGMUX_TARGET_MODULE_CMP0_SAMPLE = 28U, + TRGMUX_TARGET_MODULE_FTM0_HWTRIG0 = 40U, + TRGMUX_TARGET_MODULE_FTM0_FAULT0 = 41U, + TRGMUX_TARGET_MODULE_FTM0_FAULT1 = 42U, + TRGMUX_TARGET_MODULE_FTM0_FAULT2 = 43U, + TRGMUX_TARGET_MODULE_FTM1_HWTRIG0 = 44U, + TRGMUX_TARGET_MODULE_FTM1_FAULT0 = 45U, + TRGMUX_TARGET_MODULE_FTM1_FAULT1 = 46U, + TRGMUX_TARGET_MODULE_FTM1_FAULT2 = 47U, + TRGMUX_TARGET_MODULE_PDB0_TRG_IN = 56U, + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM0 = 68U, + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM1 = 69U, + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM2 = 70U, + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM3 = 71U, + TRGMUX_TARGET_MODULE_LPIT_TRG_CH0 = 72U, + TRGMUX_TARGET_MODULE_LPIT_TRG_CH1 = 73U, + TRGMUX_TARGET_MODULE_LPIT_TRG_CH2 = 74U, + TRGMUX_TARGET_MODULE_LPIT_TRG_CH3 = 75U, + TRGMUX_TARGET_MODULE_LPUART0_TRG = 76U, + TRGMUX_TARGET_MODULE_LPUART1_TRG = 80U, + TRGMUX_TARGET_MODULE_LPI2C0_TRG = 84U, + TRGMUX_TARGET_MODULE_LPSPI0_TRG = 92U, + TRGMUX_TARGET_MODULE_LPSPI1_TRG = 96U, + TRGMUX_TARGET_MODULE_LPTMR0_ALT0 = 100U, +}; + +/* @brief Constant array storing the value of all TRGMUX output(target module) identifiers */ +#define FEATURE_TRGMUX_TARGET_MODULE \ +{ \ + TRGMUX_TARGET_MODULE_DMA_CH0, \ + TRGMUX_TARGET_MODULE_DMA_CH1, \ + TRGMUX_TARGET_MODULE_DMA_CH2, \ + TRGMUX_TARGET_MODULE_DMA_CH3, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT0, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT1, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT2, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT3, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT4, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT5, \ + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA0, \ + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA1, \ + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA2, \ + TRGMUX_TARGET_MODULE_ADC0_ADHWT_TLA3, \ + TRGMUX_TARGET_MODULE_CMP0_SAMPLE, \ + TRGMUX_TARGET_MODULE_FTM0_HWTRIG0, \ + TRGMUX_TARGET_MODULE_FTM0_FAULT0, \ + TRGMUX_TARGET_MODULE_FTM0_FAULT1, \ + TRGMUX_TARGET_MODULE_FTM0_FAULT2, \ + TRGMUX_TARGET_MODULE_FTM1_HWTRIG0, \ + TRGMUX_TARGET_MODULE_FTM1_FAULT0, \ + TRGMUX_TARGET_MODULE_FTM1_FAULT1, \ + TRGMUX_TARGET_MODULE_FTM1_FAULT2, \ + TRGMUX_TARGET_MODULE_PDB0_TRG_IN, \ + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM0, \ + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM1, \ + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM2, \ + TRGMUX_TARGET_MODULE_FLEXIO_TRG_TIM3, \ + TRGMUX_TARGET_MODULE_LPIT_TRG_CH0, \ + TRGMUX_TARGET_MODULE_LPIT_TRG_CH1, \ + TRGMUX_TARGET_MODULE_LPIT_TRG_CH2, \ + TRGMUX_TARGET_MODULE_LPIT_TRG_CH3, \ + TRGMUX_TARGET_MODULE_LPUART0_TRG, \ + TRGMUX_TARGET_MODULE_LPUART1_TRG, \ + TRGMUX_TARGET_MODULE_LPI2C0_TRG, \ + TRGMUX_TARGET_MODULE_LPSPI0_TRG, \ + TRGMUX_TARGET_MODULE_LPSPI1_TRG, \ + TRGMUX_TARGET_MODULE_LPTMR0_ALT0 \ +} + + +/* LPSPI module features */ +/* @brief Initial value for state structure */ +#define FEATURE_LPSPI_STATE_STRUCTURES_NULL {NULL, NULL} +/* @brief Clock indexes for LPSPI clock */ +#define FEATURE_LPSPI_CLOCKS_NAMES {LPSPI0_CLK, LPSPI1_CLK}; + +/* FlexIO module features */ + +/* @brief Define the maximum number of shifters for any FlexIO instance. */ +#define FEATURE_FLEXIO_MAX_SHIFTER_COUNT (4U) +/* @brief Define DMA request names for Flexio. */ +#define FEATURE_FLEXIO_DMA_REQ_0 EDMA_REQ_FLEXIO_SHIFTER0 +#define FEATURE_FLEXIO_DMA_REQ_1 EDMA_REQ_FLEXIO_SHIFTER1 +#define FEATURE_FLEXIO_DMA_REQ_2 EDMA_REQ_FLEXIO_SHIFTER2 +#define FEATURE_FLEXIO_DMA_REQ_3 EDMA_REQ_FLEXIO_SHIFTER3 + +/* LPUART module features */ + +/* @brief Has extended data register ED. */ +#define FEATURE_LPUART_HAS_EXTENDED_DATA_REGISTER_FLAGS (1) +/* @brief Hardware flow control (RTS, CTS) is supported. */ +#define FEATURE_LPUART_HAS_MODEM_SUPPORT (1) +/* @brief Baud rate oversampling is available. */ +#define FEATURE_LPUART_HAS_BAUD_RATE_OVER_SAMPLING_SUPPORT (1) +/* @brief Baud rate oversampling is available. */ +#define FEATURE_LPUART_HAS_BOTH_EDGE_SAMPLING_SUPPORT (1) +/* @brief Capacity (number of entries) of the transmit/receive FIFO (or zero if no FIFO is available). */ +#define FEATURE_LPUART_FIFO_SIZE (4U) +/* @brief Supports two match addresses to filter incoming frames. */ +#define FEATURE_LPUART_HAS_ADDRESS_MATCHING (1) +/* @brief Has transmitter/receiver DMA enable bits. */ +#define FEATURE_LPUART_HAS_DMA_ENABLE (1) +/* @brief Flag clearance mask for STAT register. */ +#define FEATURE_LPUART_STAT_REG_FLAGS_MASK (0xC01FC000U) +/* @brief Flag clearance mask for FIFO register. */ +#define FEATURE_LPUART_FIFO_REG_FLAGS_MASK (0x00030000U) +/* @brief Reset mask for FIFO register. */ +#define FEATURE_LPUART_FIFO_RESET_MASK (0x0003C000U) +/* @brief Default oversampling ratio. */ +#define FEATURE_LPUART_DEFAULT_OSR (0x0FUL) +/* @brief Default baud rate modulo divisor. */ +#define FEATURE_LPUART_DEFAULT_SBR (0x04UL) +/* @brief Clock names for LPUART. */ +#define LPUART_CLOCK_NAMES {LPUART0_CLK, LPUART1_CLK} + +/* ADC module features */ + +/*! @brief ADC feature flag for extended number of SC1 and R registers, + * generically named 'alias registers' */ +#define FEATURE_ADC_HAS_EXTRA_NUM_REGS (0) + +#define NUMBER_OF_ALT_CLOCKS ADC_CLK_ALT_1 +/*! @brief ADC feature flag for defining number of external ADC channels. + * If each ADC instance has different number of external channels, then + * this define is set with the maximum value. */ +#define FEATURE_ADC_MAX_NUM_EXT_CHANS (16) +#define FEATURE_ADC_HAS_CHANNEL_2 (1) +#define FEATURE_ADC_HAS_CHANNEL_8 (1) +#define ADC_CLOCKS {ADC0_CLK} +/*! @brief ADC number of control channels */ +#if FEATURE_ADC_HAS_EXTRA_NUM_REGS +#define ADC_CTRL_CHANS_COUNT ADC_aSC1_COUNT +#else +#define ADC_CTRL_CHANS_COUNT ADC_SC1_COUNT +#endif /* FEATURE_ADC_HAS_EXTRA_NUM_REGS */ + +/*! @brief ADC default Sample Time from RM */ +#define ADC_DEFAULT_SAMPLE_TIME (0x0CU) +/*! @brief ADC default User Gain from RM */ +#define ADC_DEFAULT_USER_GAIN (0x04U) +/* @brief Max of adc clock frequency */ +#define ADC_CLOCK_FREQ_MAX_RUNTIME (50000000u) +/* @brief Min of adc clock frequency */ +#define ADC_CLOCK_FREQ_MIN_RUNTIME (2000000u) + +/* CAN module features */ + +/* @brief Frames available in Rx FIFO flag shift */ +#define FEATURE_CAN_RXFIFO_FRAME_AVAILABLE (5U) +/* @brief Rx FIFO warning flag shift */ +#define FEATURE_CAN_RXFIFO_WARNING (6U) +/* @brief Rx FIFO overflow flag shift */ +#define FEATURE_CAN_RXFIFO_OVERFLOW (7U) +/* @brief Has Flexible Data Rate for CAN0 */ +#define FEATURE_CAN0_HAS_FD (1) +/* @brief Maximum number of Message Buffers supported for payload size 8 for CAN0 */ +#define FEATURE_CAN0_MAX_MB_NUM (32U) +/* @brief Has PE clock source select (bit field CAN_CTRL1[CLKSRC]). */ +#define FEATURE_CAN_HAS_PE_CLKSRC_SELECT (1) +/* @brief Has DMA enable (bit field MCR[DMA]). */ +#define FEATURE_CAN_HAS_DMA_ENABLE (1) +/* @brief Maximum number of Message Buffers supported for payload size 8 for any of the CAN instances */ +#define FEATURE_CAN_MAX_MB_NUM (32U) +/* @brief Maximum number of Message Buffers supported for payload size 8 for any of the CAN instances */ +#define FEATURE_CAN_MAX_MB_NUM_ARRAY { FEATURE_CAN0_MAX_MB_NUM } +/* @brief Has Pretending Networking mode */ +#define FEATURE_CAN_HAS_PRETENDED_NETWORKING (1) +/* @brief Has Stuff Bit Count Enable Bit */ +#define FEATURE_CAN_HAS_STFCNTEN_ENABLE (0) +/* @brief Has ISO CAN FD Enable Bit */ +#define FEATURE_CAN_HAS_ISOCANFDEN_ENABLE (1) +/* @brief Has Message Buffer Data Size Region 1 */ +#define FEATURE_CAN_HAS_MBDSR1 (0) +/* @brief Has Message Buffer Data Size Region 2 */ +#define FEATURE_CAN_HAS_MBDSR2 (0) +/* @brief DMA hardware requests for all FlexCAN instances */ +#define FEATURE_CAN_EDMA_REQUESTS { EDMA_REQ_FLEXCAN0 } + +/* @brief Maximum number of Message Buffers IRQs */ +#define FEATURE_CAN_MB_IRQS_MAX_COUNT (2U) +/* @brief Message Buffers IRQs */ +#define FEATURE_CAN_MB_IRQS { CAN_ORed_0_15_MB_IRQS, \ + CAN_ORed_16_31_MB_IRQS } +/* @brief Has Wake Up Irq channels (CAN_Wake_Up_IRQS_CH_COUNT > 0u) */ +#define FEATURE_CAN_HAS_WAKE_UP_IRQ (1) +/* @brief Has Self Wake Up mode */ +#define FEATURE_CAN_HAS_SELF_WAKE_UP (0) +/* @brief Has Flexible Data Rate */ +#define FEATURE_CAN_HAS_FD (1) +/* @brief Clock name for the PE oscillator clock source */ +#define FEATURE_CAN_PE_OSC_CLK_NAME SOSC_CLK +/* @bried FlexCAN has Detection And Correction of Memory Errors */ +#define FEATURE_CAN_HAS_MEM_ERR_DET (0) + +/* LPTMR module features */ + +/* @brief LPTMR pulse counter input options */ +#define FEATURE_LPTMR_HAS_INPUT_ALT1_SELECTION (1U) + +/* OSIF module features */ + +#define FEATURE_OSIF_USE_SYSTICK (1) +#define FEATURE_OSIF_USE_PIT (0) +#define FEATURE_OSIF_FREERTOS_ISR_CONTEXT_METHOD (1) /* Cortex M device */ + +/* PDB module features */ + +/* @brief PDB has back-to-back at instance level */ +#define FEATURE_PDB_HAS_INSTANCE_BACKTOBACK (0) + +#endif /* S32K118_FEATURES_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/devassert.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/devassert.h new file mode 100644 index 00000000..243c8d45 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/devassert.h @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * Copyright 2016-2017 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DEVASSERT_H +#define DEVASSERT_H + +#include + +/** + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 2.5, global macro not referenced. + * The macro is defined to be used by drivers to validate input parameters and can be disabled. + * + * @section [global] + * Violates MISRA 2012 Advisory Directive 4.9, Function-like macro defined. + * The macros are used to validate input parameters to driver functions. + * + */ + +/** +\page Error_detection_and_reporting Error detection and reporting + +S32 SDK drivers can use a mechanism to validate data coming from upper software layers (application code) by performing +a number of checks on input parameters' range or other invariants that can be statically checked (not dependent on +runtime conditions). A failed validation is indicative of a software bug in application code, therefore it is important +to use this mechanism during development. + +The validation is performed by using DEV_ASSERT macro. +A default implementation of this macro is provided in this file. However, application developers can provide their own +implementation in a custom file. This requires defining the CUSTOM_DEVASSERT symbol with the specific file name in the +project configuration (for example: -DCUSTOM_DEVASSERT="custom_devassert.h") + +The default implementation accommodates two behaviors, based on DEV_ERROR_DETECT symbol: + - When DEV_ERROR_DETECT symbol is defined in the project configuration (for example: -DDEV_ERROR_DETECT), the validation + performed by the DEV_ASSERT macro is enabled, and a failed validation triggers a software breakpoint and further execution is + prevented (application spins in an infinite loop) + This configuration is recommended for development environments, as it prevents further execution and allows investigating + potential problems from the point of error detection. + - When DEV_ERROR_DETECT symbol is not defined, the DEV_ASSERT macro is implemented as no-op, therefore disabling all validations. + This configuration can be used to eliminate the overhead of development-time checks. + +It is the application developer's responsibility to decide the error detection strategy for production code: one can opt to +disable development-time checking altogether (by not defining DEV_ERROR_DETECT symbol), or one can opt to keep the checks +in place and implement a recovery mechanism in case of a failed validation, by defining CUSTOM_DEVASSERT to point +to the file containing the custom implementation. +*/ + +#if defined (CUSTOM_DEVASSERT) + /* If the CUSTOM_DEVASSERT symbol is defined, then add the custom implementation */ + #include CUSTOM_DEVASSERT +#elif defined (DEV_ERROR_DETECT) + /* Implement default assert macro */ +static inline void DevAssert(volatile bool x) +{ + if(x) { } else { BKPT_ASM; for(;;) {} } +} + #define DEV_ASSERT(x) DevAssert(x) +#else + /* Assert macro does nothing */ + #define DEV_ASSERT(x) ((void)0) +#endif + +#endif /* DEVASSERT_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/device_registers.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/device_registers.h new file mode 100644 index 00000000..583a35d5 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/device_registers.h @@ -0,0 +1,67 @@ +/* +** ################################################################### +** Abstract: +** Common include file for CMSIS register access layer headers. +** +** Copyright (c) 2015 Freescale Semiconductor, Inc. +** Copyright 2016-2017 NXP +** All rights reserved. +** +** THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +** INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +** STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +** IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +** THE POSSIBILITY OF SUCH DAMAGE. +** +** http: www.nxp.com +** mail: support@nxp.com +** ################################################################### +*/ + +#ifndef DEVICE_REGISTERS_H +#define DEVICE_REGISTERS_H + +/** +* @page misra_violations MISRA-C:2012 violations +* +* @section [global] +* Violates MISRA 2012 Advisory Rule 2.5, global macro not referenced. +* The macro defines the device currently in use and may be used by components for specific checks. +* +*/ + + +/* + * Include the cpu specific register header files. + * + * The CPU macro should be declared in the project or makefile. + */ + +#if defined(CPU_S32K118) + + #define S32K11x_SERIES + + /* Specific core definitions */ + #include "s32_core_cm0.h" + /* Register definitions */ + #include "S32K118.h" + /* CPU specific feature definitions */ + #include "S32K118_features.h" + +#else + #error "No valid CPU defined!" +#endif + +#include "devassert.h" + +#endif /* DEVICE_REGISTERS_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/s32_core_cm0.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/s32_core_cm0.h new file mode 100644 index 00000000..2dcd6e17 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/s32_core_cm0.h @@ -0,0 +1,198 @@ +/* + * Copyright (c) 2015-2016 Freescale Semiconductor, Inc. + * Copyright 2016-2017 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + * + */ +/*! + * @file s32_core_cm0.h + * + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Directive 4.9, Function-like macro + * Function-like macros are used instead of inline functions in order to ensure + * that the performance will not be decreased if the functions will not be + * inlined by the compiler. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 2.5, Global macro not referenced. + * The macros defined are used only on some of the drivers, so this might be reported + * when the analysis is made only on one driver. + */ + +/* + * Tool Chains: + * GNUC flag is defined also by ARM compiler - it shows the current major version of the compatible GCC version + * __GNUC__ : GNU Compiler Collection + * __ghs__ : Green Hills ARM Compiler + * __ICCARM__ : IAR ARM Compiler + * __DCC__ : Wind River Diab Compiler + * __ARMCC_VERSION : ARM Compiler + */ + +#if !defined (CORE_CM0_H) +#define CORE_CM0_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/** \brief BKPT_ASM + * + * Macro to be used to trigger an debug interrupt + */ +#if defined ( __DCC__ ) +#define BKPT_ASM __asm ("BKPT 0\n\t") +#else +#define BKPT_ASM __asm ("BKPT #0\n\t") +#endif + +/** \brief Enable interrupts + */ +#if defined (__GNUC__) +#define ENABLE_INTERRUPTS() __asm volatile ("cpsie i" : : : "memory"); +#elif defined ( __DCC__ ) +#define ENABLE_INTERRUPTS() __asm (".short 0xb662"); +#else +#define ENABLE_INTERRUPTS() __asm("cpsie i") +#endif + + +/** \brief Disable interrupts + */ +#if defined (__GNUC__) +#define DISABLE_INTERRUPTS() __asm volatile ("cpsid i" : : : "memory"); +#elif defined ( __DCC__ ) +#define DISABLE_INTERRUPTS() __asm (".short 0xb672"); +#else +#define DISABLE_INTERRUPTS() __asm("cpsid i") +#endif + + +/** \brief Enter low-power standby state + * WFI (Wait For Interrupt) makes the processor suspend execution (Clock is stopped) until an IRQ interrupts. + */ +#if defined (__GNUC__) +#define STANDBY() __asm volatile ("wfi") +#elif defined ( __DCC__ ) +#define STANDBY() __asm (".short 0xbf30"); +#else +#define STANDBY() __asm ("wfi") +#endif + +/** \brief No-op + */ +#define NOP() __asm volatile ("nop") + + +/** \brief Reverse byte order in a word. + * ARM Documentation Cortex-M0 Devices Generic User Guide + * Accordingly to 3.5.7. REV, REV16, and REVSH + * Restriction "This function requires low registers R0-R7 register" + */ +#if defined (__GNUC__) || defined (__ICCARM__) || defined (__ARMCC_VERSION) +#define REV_BYTES_32(a, b) __asm volatile ("rev %0, %1" : "=l" (b) : "l" (a)) +#elif defined (__ghs__) +#define REV_BYTES_32(a, b) __asm volatile ("rev %0, %1" : "=r" (b) : "r" (a)) +#else +#define REV_BYTES_32(a, b) (b = ((a & 0xFF000000U) >> 24U) | ((a & 0xFF0000U) >> 8U) \ + | ((a & 0xFF00U) << 8U) | ((a & 0xFFU) << 24U)) +#endif + +/** \brief Reverse byte order in each halfword independently. + * ARM Documentation Cortex-M0 Devices Generic User Guide + * Accordingly to 3.5.7. REV, REV16, and REVSH + * Restriction "This function requires low registers R0-R7 register" + */ +#if defined (__GNUC__) || defined (__ICCARM__) || defined (__ARMCC_VERSION) +#define REV_BYTES_16(a, b) __asm volatile ("rev16 %0, %1" : "=l" (b) : "l" (a)) +#elif defined (__ghs__) +#define REV_BYTES_16(a, b) __asm volatile ("rev16 %0, %1" : "=r" (b) : "r" (a)) +#else +#define REV_BYTES_16(a, b) (b = ((a & 0xFF000000U) >> 8U) | ((a & 0xFF0000U) << 8U) \ + | ((a & 0xFF00U) >> 8U) | ((a & 0xFFU) << 8U)) +#endif + +/** \brief Places a function in RAM. + */ +#if defined ( __GNUC__ ) || defined (__ARMCC_VERSION) + #define START_FUNCTION_DECLARATION_RAMSECTION + #define END_FUNCTION_DECLARATION_RAMSECTION __attribute__((section (".code_ram"))); +#elif defined ( __ghs__ ) + #define START_FUNCTION_DECLARATION_RAMSECTION _Pragma("ghs callmode=far") + #define END_FUNCTION_DECLARATION_RAMSECTION __attribute__((section (".code_ram")));\ + _Pragma("ghs callmode=default") +#elif defined ( __ICCARM__ ) + #define START_FUNCTION_DECLARATION_RAMSECTION __ramfunc + #define END_FUNCTION_DECLARATION_RAMSECTION ; +#elif defined ( __DCC__ ) + #define START_FUNCTION_DECLARATION_RAMSECTION _Pragma("section CODE \".code_ram\" \"\" far-absolute") \ + _Pragma("use_section CODE") + #define END_FUNCTION_DECLARATION_RAMSECTION ; \ + _Pragma("section CODE \".text\"") +#else + /* Keep compatibility with software analysis tools */ + #define START_FUNCTION_DECLARATION_RAMSECTION + #define END_FUNCTION_DECLARATION_RAMSECTION ; +#endif + + /* For GCC, IAR, GHS, Diab and ARMC there is no need to specify the section when + defining a function, it is enough to specify it at the declaration. This + also enables compatibility with software analysis tools. */ + #define START_FUNCTION_DEFINITION_RAMSECTION + #define END_FUNCTION_DEFINITION_RAMSECTION + +#if defined (__ICCARM__) + #define DISABLE_CHECK_RAMSECTION_FUNCTION_CALL _Pragma("diag_suppress=Ta022") + #define ENABLE_CHECK_RAMSECTION_FUNCTION_CALL _Pragma("diag_default=Ta022") +#else + #define DISABLE_CHECK_RAMSECTION_FUNCTION_CALL + #define ENABLE_CHECK_RAMSECTION_FUNCTION_CALL +#endif + +/** \brief Get Core ID + * + * GET_CORE_ID returns the processor identification number for cm0 + */ +#define GET_CORE_ID() 0U + +/** \brief Data alignment. + */ +#if defined ( __GNUC__ ) || defined ( __ghs__ ) || defined ( __DCC__ ) || defined (__ARMCC_VERSION) + #define ALIGNED(x) __attribute__((aligned(x))) +#elif defined ( __ICCARM__ ) + #define stringify(s) tostring(s) + #define tostring(s) #s + #define ALIGNED(x) _Pragma(stringify(data_alignment=x)) +#else + /* Keep compatibility with software analysis tools */ + #define ALIGNED(x) +#endif + +/** \brief Endianness. + */ +#define CORE_LITTLE_ENDIAN + +#ifdef __cplusplus +} +#endif + +#endif /* CORE_CM0_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/startup.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/startup.c new file mode 100644 index 00000000..2d0efc61 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/startup.c @@ -0,0 +1,248 @@ +/* + * Copyright (c) 2013 - 2014, Freescale Semiconductor, Inc. + * Copyright 2016-2018 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.9, An object should be defined at block + * scope if its identifier only appears in a single function. + * All variables with this problem are defined in the linker files. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.11, When an array with external linkage + * is declared, its size should be explicitly specified. + * The size of the arrays can not be explicitly determined. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 11.4, A conversion should not be performed + * between a pointer to object and an integer type. + * The cast is required to initialize a pointer with an unsigned int define, + * representing an address. + * + * @section [global] + * Violates MISRA 2012 Required Rule 11.6, A cast shall not be performed + * between pointer to void and an arithmetic type. + * The cast is required to initialize a pointer with an unsigned int define, + * representing an address. + * + * @section [global] + * Violates MISRA 2012 Required Rule 2.1, A project shall not contain unreachable + * code. + * The condition compares two address defined in linker files that can be different. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.7, External could be made static. + * Function is defined for usage by application code. + * + * @section [global] + * Violates MISRA 2012 Mandatory Rule 17.3, Symbol 'MFSPR' undeclared, assumed + * to return int. + * This is an e200 Power Architecture Assembly instruction used to retrieve + * the core number. + * + */ + +#include "startup.h" +#include + + +/******************************************************************************* + * Static Variables + ******************************************************************************/ +static volatile uint32_t * const s_vectors[NUMBER_OF_CORES] = FEATURE_INTERRUPT_INT_VECTORS; + +/******************************************************************************* + * Code + ******************************************************************************/ + +/*FUNCTION********************************************************************** + * + * Function Name : init_data_bss + * Description : Make necessary initializations for RAM. + * - Copy the vector table from ROM to RAM. + * - Copy initialized data from ROM to RAM. + * - Copy code that should reside in RAM from ROM + * - Clear the zero-initialized data section. + * + * Tool Chains: + * __GNUC__ : GNU Compiler Collection + * __ghs__ : Green Hills ARM Compiler + * __ICCARM__ : IAR ARM Compiler + * __DCC__ : Wind River Diab Compiler + * __ARMCC_VERSION : ARMC Compiler + * + * Implements : init_data_bss_Activity + *END**************************************************************************/ +void init_data_bss(void) +{ + uint32_t n; + uint8_t coreId; +/* For ARMC we are using the library method of initializing DATA, Custom Section and + * Code RAM sections so the below variables are not needed */ +#if !defined(__ARMCC_VERSION) + /* Declare pointers for various data sections. These pointers + * are initialized using values pulled in from the linker file */ + uint8_t * data_ram; + uint8_t * code_ram; + uint8_t * bss_start; + uint8_t * custom_ram; + const uint8_t * data_rom, * data_rom_end; + const uint8_t * code_rom, * code_rom_end; + const uint8_t * bss_end; + const uint8_t * custom_rom, * custom_rom_end; +#endif + /* Addresses for VECTOR_TABLE and VECTOR_RAM come from the linker file */ + +#if defined(__ARMCC_VERSION) + extern uint32_t __RAM_VECTOR_TABLE_SIZE; + extern uint32_t __VECTOR_ROM; + extern uint32_t __VECTOR_RAM; +#else + extern uint32_t __RAM_VECTOR_TABLE_SIZE[]; + extern uint32_t __VECTOR_TABLE[]; + extern uint32_t __VECTOR_RAM[]; +#endif + /* Get section information from linker files */ +#if defined(__ICCARM__) + /* Data */ + data_ram = __section_begin(".data"); + data_rom = __section_begin(".data_init"); + data_rom_end = __section_end(".data_init"); + + /* CODE RAM */ + #pragma section = "__CODE_ROM" + #pragma section = "__CODE_RAM" + code_ram = __section_begin("__CODE_RAM"); + code_rom = __section_begin("__CODE_ROM"); + code_rom_end = __section_end("__CODE_ROM"); + + /* BSS */ + bss_start = __section_begin(".bss"); + bss_end = __section_end(".bss"); + + custom_ram = __section_begin(".customSection"); + custom_rom = __section_begin(".customSection_init"); + custom_rom_end = __section_end(".customSection_init"); + +#elif defined (__ARMCC_VERSION) + /* VECTOR TABLE*/ + uint8_t * vector_table_size = (uint8_t *)__RAM_VECTOR_TABLE_SIZE; + uint32_t * vector_rom = (uint32_t *)__VECTOR_ROM; + uint32_t * vector_ram = (uint32_t *)__VECTOR_RAM; +#else + extern uint32_t __DATA_ROM[]; + extern uint32_t __DATA_RAM[]; + extern uint32_t __DATA_END[]; + + extern uint32_t __CODE_RAM[]; + extern uint32_t __CODE_ROM[]; + extern uint32_t __CODE_END[]; + + extern uint32_t __BSS_START[]; + extern uint32_t __BSS_END[]; + + extern uint32_t __CUSTOM_ROM[]; + extern uint32_t __CUSTOM_END[]; + + /* Data */ + data_ram = (uint8_t *)__DATA_RAM; + data_rom = (uint8_t *)__DATA_ROM; + data_rom_end = (uint8_t *)__DATA_END; + /* CODE RAM */ + code_ram = (uint8_t *)__CODE_RAM; + code_rom = (uint8_t *)__CODE_ROM; + code_rom_end = (uint8_t *)__CODE_END; + /* BSS */ + bss_start = (uint8_t *)__BSS_START; + bss_end = (uint8_t *)__BSS_END; + + /* Custom section */ + custom_ram = CUSTOMSECTION_SECTION_START; + custom_rom = (uint8_t *)__CUSTOM_ROM; + custom_rom_end = (uint8_t *)__CUSTOM_END; + +#endif + +#if !defined(__ARMCC_VERSION) + /* Copy initialized data from ROM to RAM */ + while (data_rom_end != data_rom) + { + *data_ram = *data_rom; + data_ram++; + data_rom++; + } + + /* Copy functions from ROM to RAM */ + while (code_rom_end != code_rom) + { + *code_ram = *code_rom; + code_ram++; + code_rom++; + } + + /* Clear the zero-initialized data section */ + while(bss_end != bss_start) + { + *bss_start = 0; + bss_start++; + } + + /* Copy customsection rom to ram */ + while(custom_rom_end != custom_rom) + { + *custom_ram = *custom_rom; + custom_rom++; + custom_ram++; + } +#endif + coreId = (uint8_t)GET_CORE_ID(); +#if defined (__ARMCC_VERSION) + /* Copy the vector table from ROM to RAM */ + /* Workaround */ + for (n = 0; n < (((uint32_t)(vector_table_size))/sizeof(uint32_t)); n++) + { + vector_ram[n] = vector_rom[n]; + } + /* Point the VTOR to the position of vector table */ + *s_vectors[coreId] = (uint32_t) __VECTOR_RAM; +#else + /* Check if VECTOR_TABLE copy is needed */ + if (__VECTOR_RAM != __VECTOR_TABLE) + { + /* Copy the vector table from ROM to RAM */ + for (n = 0; n < (((uint32_t)__RAM_VECTOR_TABLE_SIZE)/sizeof(uint32_t)); n++) + { + __VECTOR_RAM[n] = __VECTOR_TABLE[n]; + } + /* Point the VTOR to the position of vector table */ + *s_vectors[coreId] = (uint32_t)__VECTOR_RAM; + } + else + { + /* Point the VTOR to the position of vector table */ + *s_vectors[coreId] = (uint32_t)__VECTOR_TABLE; + } +#endif + +} + +/******************************************************************************* + * EOF + ******************************************************************************/ + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/startup.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/startup.h new file mode 100644 index 00000000..8384b7db --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/startup.h @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2013 - 2014, Freescale Semiconductor, Inc. + * Copyright 2016-2019 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef STARTUP_H +#define STARTUP_H + +#include +#include "device_registers.h" +/** + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 2.5, Local macro not referenced. + * The defined macro is used as include guard. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.9, An object should be defined at block + * scope if its identifier only appears in a single function. + * All variables with this problem are defined in the linker files. + * + */ + +/******************************************************************************* + * API + ******************************************************************************/ + +/*! + * @brief define symbols that specific start and end addres of some basic sections. + */ +#if (defined(S32K14x_SERIES) || defined(S32K11x_SERIES) || defined(S32V234_SERIES) || defined(MPC574x_SERIES) || defined(S32R_SERIES) || defined(S32MTV_SERIES) || defined(SJA1110_SERIES)) || defined (S32K144W_M4_SERIES) + #if (defined(__ICCARM__)) + #define INTERRUPTS_SECTION_START __section_begin(".intvec") + #define INTERRUPTS_SECTION_END __section_end(".intvec") + #define BSS_SECTION_START __section_begin(".bss") + #define BSS_SECTION_END __section_end(".bss") + #define DATA_SECTION_START __section_begin(".data") + #define DATA_SECTION_END __section_end(".data") + #define CUSTOMSECTION_SECTION_START __section_begin(".customSection") + #define CUSTOMSECTION_SECTION_END __section_end(".customSection") + #define CODE_RAM_SECTION_START __section_begin("__CODE_RAM") + #define CODE_RAM_SECTION_END __section_end("__CODE_RAM") + #define DATA_INIT_SECTION_START __section_begin(".data_init") + #define DATA_INIT_SECTION_END __section_end(".data_init") + #define CODE_ROM_SECTION_START __section_begin("__CODE_ROM") + #define CODE_ROM_SECTION_END __section_end("__CODE_ROM") + + #elif (defined(__ARMCC_VERSION)) + #define INTERRUPTS_SECTION_START (uint8_t *)__VECTOR_ROM_START + #define INTERRUPTS_SECTION_END (uint8_t *)__VECTOR_ROM_END + #define BSS_SECTION_START (uint8_t *)__BSS_START + #define BSS_SECTION_END (uint8_t *)__BSS_END + #define DATA_SECTION_START (uint8_t *)__DATA_RAM_START + #define DATA_SECTION_END (uint8_t *)__DATA_RAM_END + #define CUSTOMSECTION_SECTION_START (uint8_t *)__CUSTOM_SECTION_START + #define CUSTOMSECTION_SECTION_END (uint8_t *)__CUSTOM_SECTION_END + #define CODE_RAM_SECTION_START (uint8_t *)__CODE_RAM_START + #define CODE_RAM_SECTION_END (uint8_t *)__CODE_RAM_END + + extern uint32_t __VECTOR_ROM_START; + extern uint32_t __VECTOR_ROM_END; + extern uint32_t __BSS_START; + extern uint32_t __BSS_END; + extern uint32_t __DATA_RAM_START; + extern uint32_t __DATA_RAM_END; + extern uint32_t __CUSTOM_SECTION_START; + extern uint32_t __CUSTOM_SECTION_END; + extern uint32_t __CODE_RAM_START; + extern uint32_t __CODE_RAM_END; + #else + #define INTERRUPTS_SECTION_START (uint8_t *)&__interrupts_start__ + #define INTERRUPTS_SECTION_END (uint8_t *)&__interrupts_end__ + #define BSS_SECTION_START (uint8_t *)&__bss_start__ + #define BSS_SECTION_END (uint8_t *)&__bss_end__ + #define DATA_SECTION_START (uint8_t *)&__data_start__ + #define DATA_SECTION_END (uint8_t *)&__data_end__ + #define CUSTOMSECTION_SECTION_START (uint8_t *)&__customSection_start__ + #define CUSTOMSECTION_SECTION_END (uint8_t *)&__customSection_end__ + #define CODE_RAM_SECTION_START (uint8_t *)&__code_ram_start__ + #define CODE_RAM_SECTION_END (uint8_t *)&__code_ram_end__ + + extern uint32_t __interrupts_start__; + extern uint32_t __interrupts_end__; + extern uint32_t __bss_start__; + extern uint32_t __bss_end__; + extern uint32_t __data_start__; + extern uint32_t __data_end__; + extern uint32_t __customSection_start__; + extern uint32_t __customSection_end__; + extern uint32_t __code_ram_start__; + extern uint32_t __code_ram_end__; + #endif +#endif + +#if (defined(__ICCARM__)) + #pragma section = ".data" + #pragma section = ".data_init" + #pragma section = ".bss" + #pragma section = ".intvec" + #pragma section = ".customSection" + #pragma section = ".customSection_init" + #pragma section = "__CODE_RAM" + #pragma section = "__CODE_ROM" +#endif + +/*! + * @brief Make necessary initializations for RAM. + * + * - Copy initialized data from ROM to RAM. + * - Clear the zero-initialized data section. + * - Copy the vector table from ROM to RAM. This could be an option. + */ +void init_data_bss(void); + +#endif /* STARTUP_H*/ +/******************************************************************************* + * EOF + ******************************************************************************/ + diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/system_S32K118.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/system_S32K118.c new file mode 100644 index 00000000..868b365b --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/system_S32K118.c @@ -0,0 +1,176 @@ +/* + * Copyright 2017-2018 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @page misra_violations MISRA-C:2012 violations + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.9, An object should be defined at block + * scope if its identifier only appears in a single function. + * An object with static storage duration declared at block scope cannot be + * accessed directly from outside the block. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 11.4, A conversion should not be performed + * between a pointer to object and an integer type. + * The cast is required to initialize a pointer with an unsigned int define, + * representing an address. + * + * @section [global] + * Violates MISRA 2012 Required Rule 11.6, A cast shall not be performed + * between pointer to void and an arithmetic type. + * The cast is required to initialize a pointer with an unsigned int define, + * representing an address. + * + * @section [global] + * Violates MISRA 2012 Advisory Rule 8.7, External could be made static. + * Function is defined for usage by application code. + * + */ + +#include "device_registers.h" +#include "system_S32K118.h" +#include "stdbool.h" + +/* ---------------------------------------------------------------------------- + -- Core clock + ---------------------------------------------------------------------------- */ + +uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK; + +/*FUNCTION********************************************************************** + * + * Function Name : SystemInit + * Description : This function disables the watchdog, enables FPU + * and the power mode protection if the corresponding feature macro + * is enabled. SystemInit is called from startup_device file. + * + * Implements : SystemInit_Activity + *END**************************************************************************/ +void SystemInit(void) +{ +/**************************************************************************/ +/* WDOG DISABLE*/ +/**************************************************************************/ + +#if (DISABLE_WDOG) + /* Write of the WDOG unlock key to CNT register, must be done in order to allow any modifications*/ + WDOG->CNT = (uint32_t ) FEATURE_WDOG_UNLOCK_VALUE; + /* The dummy read is used in order to make sure that the WDOG registers will be configured only + * after the write of the unlock value was completed. */ + (void)WDOG->CNT; + + /* Initial write of WDOG configuration register: + * enables support for 32-bit refresh/unlock command write words, + * clock select from LPO, update enable, watchdog disabled */ + WDOG->CS = (uint32_t ) ( (1UL << WDOG_CS_CMD32EN_SHIFT) | + (FEATURE_WDOG_CLK_FROM_LPO << WDOG_CS_CLK_SHIFT) | + (0U << WDOG_CS_EN_SHIFT) | + (1U << WDOG_CS_UPDATE_SHIFT) ); + + /* Configure timeout */ + WDOG->TOVAL = (uint32_t )0xFFFF; +#endif /* (DISABLE_WDOG) */ +} + +/*FUNCTION********************************************************************** + * + * Function Name : SystemCoreClockUpdate + * Description : This function must be called whenever the core clock is changed + * during program execution. It evaluates the clock register settings and calculates + * the current core clock. + * + * Implements : SystemCoreClockUpdate_Activity + *END**************************************************************************/ +void SystemCoreClockUpdate(void) +{ + uint32_t SCGOUTClock = 0U; /* Variable to store output clock frequency of the SCG module */ + uint32_t regValue; /* Temporary variable */ + uint32_t divider; + bool validSystemClockSource = true; + + divider = ((SCG->CSR & SCG_CSR_DIVCORE_MASK) >> SCG_CSR_DIVCORE_SHIFT) + 1U; + + switch ((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT) + { + case 0x1: + /* System OSC */ + SCGOUTClock = CPU_XTAL_CLK_HZ; + break; + case 0x2: + /* Slow IRC */ + regValue = (SCG->SIRCCFG & SCG_SIRCCFG_RANGE_MASK) >> SCG_SIRCCFG_RANGE_SHIFT; + if (regValue != 0UL) + { + SCGOUTClock = FEATURE_SCG_SIRC_HIGH_RANGE_FREQ; + } + else + { + validSystemClockSource = false; + } + break; + case 0x3: + /* Fast IRC */ + regValue = (SCG->FIRCCFG & SCG_FIRCCFG_RANGE_MASK) >> SCG_FIRCCFG_RANGE_SHIFT; + if (regValue == 0x0UL) + { + SCGOUTClock = FEATURE_SCG_FIRC_FREQ0; + } + else + { + validSystemClockSource = false; + } + break; + default: + validSystemClockSource = false; + break; + } + + if (validSystemClockSource == true) + { + SystemCoreClock = (SCGOUTClock / divider); + } +} + +/*FUNCTION********************************************************************** + * + * Function Name : SystemSoftwareReset + * Description : This function is used to initiate a system reset + * + * Implements : SystemSoftwareReset_Activity + *END**************************************************************************/ +void SystemSoftwareReset(void) +{ + uint32_t regValue; + + /* Read Application Interrupt and Reset Control Register */ + regValue = S32_SCB->AIRCR; + + /* Clear register key */ + regValue &= ~( S32_SCB_AIRCR_VECTKEY_MASK); + + /* Configure System reset request bit and Register Key */ + regValue |= S32_SCB_AIRCR_VECTKEY(FEATURE_SCB_VECTKEY); + regValue |= S32_SCB_AIRCR_SYSRESETREQ(0x1u); + + /* Write computed register value */ + S32_SCB->AIRCR = regValue; +} + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/system_S32K118.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/system_S32K118.h new file mode 100644 index 00000000..6e98f97f --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/lib/system_S32K118.h @@ -0,0 +1,105 @@ +/* + * Copyright 2017-2018 NXP + * All rights reserved. + * + * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING + * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + + +/*! @addtogroup soc_support_S32K118*/ +/*! @{*/ + +/*! + * @file system_S32K118.h + * @brief Device specific configuration file for S32K118 + */ + +#ifndef SYSTEM_S32K118_H_ +#define SYSTEM_S32K118_H_ /**< Symbol preventing repeated inclusion */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * CPU Settings. + *****************************************************************************/ + +/* Watchdog disable */ +#ifndef DISABLE_WDOG + #define DISABLE_WDOG 1 +#endif + +/* Value of the external crystal or oscillator clock frequency in Hz */ +#ifndef CPU_XTAL_CLK_HZ + #define CPU_XTAL_CLK_HZ 8000000u +#endif + +/* Value of the fast internal oscillator clock frequency in Hz */ +#ifndef CPU_INT_FAST_CLK_HZ + #define CPU_INT_FAST_CLK_HZ 48000000u +#endif + +/* Default System clock value */ +#ifndef DEFAULT_SYSTEM_CLOCK + #define DEFAULT_SYSTEM_CLOCK 48000000u +#endif + +/** + * @brief System clock frequency (core clock) + * + * The system clock frequency supplied to the SysTick timer and the processor + * core clock. This variable can be used by the user application to setup the + * SysTick timer or configure other parameters. It may also be used by debugger to + * query the frequency of the debug timer or configure the trace clock speed + * SystemCoreClock is initialized with a correct predefined value. + */ +extern uint32_t SystemCoreClock; + +/** + * @brief Setup the SoC. + * + * This function disables the watchdog. + * if the corresponding feature macro is enabled. + * SystemInit is called from startup_device file. + */ +void SystemInit(void); + +/** + * @brief Updates the SystemCoreClock variable. + * + * It must be called whenever the core clock is changed during program + * execution. SystemCoreClockUpdate() evaluates the clock register settings and calculates + * the current core clock. + * This function must be called when user does not want to use clock manager component. + * If clock manager is used, the CLOCK_SYS_GetFreq function must be used with CORE_CLOCK + * parameter. + * + */ +void SystemCoreClockUpdate(void); + +/** + * @brief Initiates a system reset. + * + * This function is used to initiate a system reset + */ +void SystemSoftwareReset(void); + +#ifdef __cplusplus +} +#endif + +/*! @}*/ +#endif /* #if !defined(SYSTEM_S32K118_H_) */ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/main.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/main.c new file mode 100644 index 00000000..1ef5439f --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/main.c @@ -0,0 +1,184 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/main.c +* \brief Demo program application source file. +* \ingroup Prog_ARMCM0_S32K14_S32K118EVB_IAR +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "header.h" /* generic header */ + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +static void Init(void); +static void SystemClockConfig(void); + + +/************************************************************************************//** +** \brief This is the entry point for the bootloader application and is called +** by the reset interrupt vector after the C-startup routines executed. +** \return none. +** +****************************************************************************************/ +void main(void) +{ + /* Initialize the microcontroller. */ + Init(); + /* Initialize the bootloader interface */ + BootComInit(); + + /* Start the infinite program loop. */ + while (1) + { + /* Toggle LED with a fixed frequency. */ + LedToggle(); + /* Check for bootloader activation request */ + BootComCheckActivationRequest(); + } +} /*** end of main ***/ + + +/************************************************************************************//** +** \brief Initializes the microcontroller. +** \return none. +** +****************************************************************************************/ +static void Init(void) +{ + /* Configure the system clock. */ + SystemClockConfig(); + /* Enable the peripheral clock for the ports that are used. */ + PCC->PCCn[PCC_PORTB_INDEX] |= PCC_PCCn_CGC_MASK; + PCC->PCCn[PCC_PORTE_INDEX] |= PCC_PCCn_CGC_MASK; + +#if (BOOT_COM_RS232_ENABLE > 0) + /* UART RX GPIO pin configuration. PB0 = UART0 RX, MUX = ALT2. */ + PORTB->PCR[0] |= PORT_PCR_MUX(2); + /* UART TX GPIO pin configuration. PB1 = UART0 TX, MUX = ALT2. */ + PORTB->PCR[1] |= PORT_PCR_MUX(2); +#endif +#if (BOOT_COM_CAN_ENABLE > 0) + /* CAN RX GPIO pin configuration. PE4 = CAN0 RX, MUX = ALT5. */ + PORTE->PCR[4] |= PORT_PCR_MUX(5); + /* CAN TX GPIO pin configuration. PE5 = CAN0 TX, MUX = ALT5. */ + PORTE->PCR[5] |= PORT_PCR_MUX(5); +#endif + + /* Initialize the timer driver. */ + TimerInit(); + /* Initialize the led driver. */ + LedInit(); + /* Enable the global interrupts. */ + ENABLE_INTERRUPTS(); +} /*** end of Init ***/ + + +/************************************************************************************//** +** \brief System Clock Configuration. This code was derived from a S32 Design Studio +** example program. It enables the SOCS (40 MHz external crystal), FIRC (48 +** MHz internal) and SIRC (8 MHz internal). The FIRC is used as a source for +** the system clock and configures the normal RUN mode for the following clock +** settings: +** - CORE_CLK = 48 MHz +** - SYS_CLK = 48 MHz +** - BUS_CLK = 48 MHz +** - FLASH_CLK = 24 MHz +** - SOSCDIV1_CLK = 40 MHz +** - SOSCDIV2_CLK = 40 MHz +** - FIRCDIV1_CLK = 48 MHz +** - FIRCDIV2_CLK = 48 MHz +** - SIRCDIV1_CLK = 8 MHz +** - SIRCDIV2_CLK = 8 MHz +** \return none. +** +****************************************************************************************/ +static void SystemClockConfig(void) +{ + /* --------- SOSC Initialization (40 MHz) ------------------------------------------ */ + /* SOSCDIV1 & SOSCDIV2 =1: divide by 1. */ + SCG->SOSCDIV = SCG_SOSCDIV_SOSCDIV1(1) | SCG_SOSCDIV_SOSCDIV2(1); + /* Range=3: High freq (SOSC betw 8MHz - 40MHz). + * HGO=0: Config xtal osc for low power. + * EREFS=1: Input is external XTAL. + */ + SCG->SOSCCFG = SCG_SOSCCFG_RANGE(3) | SCG_SOSCCFG_EREFS_MASK; + /* Ensure SOSCCSR unlocked. */ + while (SCG->SOSCCSR & SCG_SOSCCSR_LK_MASK) + { + ; + } + + /* LK=0: SOSCCSR can be written. + * SOSCCMRE=0: OSC CLK monitor IRQ if enabled. + * SOSCCM=0: OSC CLK monitor disabled. + * SOSCERCLKEN=0: Sys OSC 3V ERCLK output clk disabled. + * SOSCLPEN=0: Sys OSC disabled in VLP modes. + * SOSCSTEN=0: Sys OSC disabled in Stop modes. + * SOSCEN=1: Enable oscillator. + */ + SCG->SOSCCSR = SCG_SOSCCSR_SOSCEN_MASK; + /* Wait for system OSC clock to become valid. */ + while (!(SCG->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK)) + { + ; + } + + /* --------- FIRC Initialization --------------------------------------------------- */ + /* Fast IRC is enabled and trimmed to 48 MHz in reset (default). Enable FIRCDIV2_CLK + * and FIRCDIV1_CLK, divide by 1 = 48 MHz. + */ + SCG->FIRCDIV = SCG_FIRCDIV_FIRCDIV1(1) | SCG_FIRCDIV_FIRCDIV2(1); + + /* --------- SIRC Initialization --------------------------------------------------- */ + /* Slow IRC is enabled with high range (8 MHz) in reset. Enable SIRCDIV2_CLK and + * SIRCDIV1_CLK, divide by 1 = 8MHz asynchronous clock source. + */ + SCG->SIRCDIV = SCG_SIRCDIV_SIRCDIV1(1) | SCG_SIRCDIV_SIRCDIV2(1); + + /* --------- Change to normal RUN mode with 48MHz FIRC ----------------------------- */ + /* Select FIRC as clock source. + * DIVCORE=0, div. by 1: Core clock = 48 MHz. + * DIVBUS=0, div. by 1: bus clock = 48 MHz. + * DIVSLOW=1, div. by 2: SCG slow, flash clock= 24 MHz + */ + SCG->RCCR = SCG_RCCR_SCS(3) | SCG_RCCR_DIVCORE(0) | SCG_RCCR_DIVBUS(0) | + SCG_RCCR_DIVSLOW(1); + + /* Wait until system clock source is FIRC. */ + while (((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT ) != 3U) + { + ; + } + /* Evaluate the clock register settings and calculates the current core clock. This + * function must be called when the clock manager component is not used. + */ + SystemCoreClockUpdate(); +} /*** end of SystemClockConfig ***/ + + +/*********************************** end of main.c *************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/prog.dox b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/prog.dox new file mode 100644 index 00000000..a63f202e --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/prog.dox @@ -0,0 +1,13 @@ +/** +\defgroup Prog_ARMCM0_S32K14_S32K118EVB_IAR User Program +\ingroup ARMCM0_S32K14_S32K118EVB_IAR +\brief User Program. +\details The intention of the demo user program is two-fold. (1) To test the + bootloader, you need some sort of firmware to see if you can perform a + firmware update with the bootloader. This program can be used for this + purpose. (2) To make firmware programmable by the bootloader, a few + adjustments to the firmware are required. The demo user program serves as an + example for how these adjustments can be implemented. This demo user program + is a template that can be used as a starting point for creating your own + demo user program. +*/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/startup_S32K118.s b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/startup_S32K118.s new file mode 100644 index 00000000..24552fbc --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/startup_S32K118.s @@ -0,0 +1,288 @@ +; --------------------------------------------------------------------------------------- +; @file: startup_S32K118.s +; @purpose: IAR Startup File +; S32K118 +; @version: 1.0 +; @date: 2018-1-22 +; @build: b170107 +; --------------------------------------------------------------------------------------- +; +; Copyright 2018 NXP +; All rights reserved. +; +; THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR +; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +; IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +; INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +; STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +; IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +; THE POSSIBILITY OF SUCH DAMAGE. +; +; 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:CODE:ROOT(2) + + EXTERN main + EXTERN SystemInit + EXTERN init_data_bss + PUBLIC __vector_table + PUBLIC __vector_table_0x1c + PUBLIC __Vectors + PUBLIC __Vectors_End + PUBLIC __Vectors_Size + + DATA + +__vector_table + DCD sfe(CSTACK) + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; Non Maskable Interrupt + DCD HardFault_Handler ; Cortex-M0 SV Hard Fault Interrupt + DCD 0 + DCD 0 + DCD 0 +__vector_table_0x1c + DCD 0 + DCD 0 + DCD 0 + DCD 0 + DCD SVC_Handler ; Cortex-M0 SV Call Interrupt + DCD 0 + DCD 0 + DCD PendSV_Handler ; Cortex-M0 Pend SV Interrupt + DCD SysTick_Handler ; Cortex-M0 System Tick Interrupt + + + DCD DMA0_IRQHandler ; DMA channel 0 transfer complete + DCD DMA1_IRQHandler ; DMA channel 1 transfer complete + DCD DMA2_IRQHandler ; DMA channel 2 transfer complete + DCD DMA3_IRQHandler ; DMA channel 3 transfer complete + DCD DMA_Error_IRQHandler ; DMA error interrupt channels 0-3 + DCD ERM_fault_IRQHandler ; ERM single and double bit error correction + DCD RTC_IRQHandler ; RTC alarm interrupt + DCD RTC_Seconds_IRQHandler ; RTC seconds interrupt + DCD LPTMR0_IRQHandler ; LPTIMER interrupt request + DCD PORT_IRQHandler ; Port A, B, C, D and E pin detect interrupt + DCD CAN0_ORed_Err_Wakeup_IRQHandler ; OR’ed [Bus Off OR Bus Off Done OR Transmit Warning OR Receive Warning], Interrupt indicating that errors were detected on the CAN bus, Interrupt asserted when Pretended Networking operation is enabled, and a valid message matches the selected filter criteria during Low Power mode + DCD CAN0_ORed_0_31_MB_IRQHandler ; OR’ed Message buffer (0-15, 16-31) + DCD FTM0_Ch0_7_IRQHandler ; FTM0 Channel 0 to 7 interrupt + DCD FTM0_Fault_IRQHandler ; FTM0 Fault interrupt + DCD FTM0_Ovf_Reload_IRQHandler ; FTM0 Counter overflow and Reload interrupt + DCD FTM1_Ch0_7_IRQHandler ; FTM1 Channel 0 to 7 interrupt + DCD FTM1_Fault_IRQHandler ; FTM1 Fault interrupt + DCD FTM1_Ovf_Reload_IRQHandler ; FTM1 Counter overflow and Reload interrupt + DCD FTFC_IRQHandler ; FTFC Command complete, Read collision and Double bit fault detect + DCD PDB0_IRQHandler ; PDB0 interrupt + DCD LPIT0_IRQHandler ; LPIT interrupt + DCD SCG_CMU_LVD_LVWSCG_IRQHandler ; PMC Low voltage detect interrupt, SCG bus interrupt request and CMU loss of range interrupt + DCD WDOG_IRQHandler ; WDOG interrupt request out before wdg reset out + DCD RCM_IRQHandler ; RCM Asynchronous Interrupt + DCD LPI2C0_Master_Slave_IRQHandler ; LPI2C0 Master Interrupt and Slave Interrupt + DCD FLEXIO_IRQHandler ; FlexIO Interrupt + DCD LPSPI0_IRQHandler ; LPSPI0 Interrupt + DCD LPSPI1_IRQHandler ; LPSPI1 Interrupt + DCD ADC0_IRQHandler ; ADC0 interrupt request. + DCD CMP0_IRQHandler ; CMP0 interrupt request + DCD LPUART1_RxTx_IRQHandler ; LPUART1 Transmit / Receive Interrupt + DCD LPUART0_RxTx_IRQHandler ; LPUART0 Transmit / Receive Interrupt + DCD 0x55AA11EE ; Reserved for OpenBLT checksum +__Vectors_End + + SECTION FlashConfig:CODE +__FlashConfig + DCD 0xFFFFFFFF ; 8 bytes backdoor comparison key + DCD 0xFFFFFFFF ; + DCD 0xFFFFFFFF ; 4 bytes program flash protection bytes + DCD 0xFFFF7FFE ; FDPROT:FEPROT:FOPT:FSEC(0xFE = unsecured) +__FlashConfig_End + +__Vectors EQU __vector_table +__Vectors_Size EQU __Vectors_End - __Vectors + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;; Default interrupt handlers. +;; + THUMB + + PUBWEAK Reset_Handler + SECTION .text:CODE:REORDER:NOROOT(2) +Reset_Handler + CPSID I ; Mask interrupts + ;; Init the rest of the registers + LDR R1,=0 + LDR R2,=0 + LDR R3,=0 + LDR R4,=0 + LDR R5,=0 + LDR R6,=0 + LDR R7,=0 + MOV R8,R7 + MOV R9,R7 + MOV R10,R7 + MOV R11,R7 + MOV R12,R7 + +#ifdef START_FROM_FLASH + IMPORT __RAM_START, __RAM_END + ;; INIT ECC RAM + + LDR R1, =__RAM_START + LDR R2, =__RAM_END + + SUBS R2, R2, R1 + SUBS R2, #1 + BLE .LC5 + + MOVS R0, #0 + MOVS R3, #4 + .LC4: + STR R0, [R1] + ADD R1, R1, R3 + SUBS R2, #4 + BGE .LC4 + .LC5: +#endif + ;; Initialize the stack pointer + LDR R0, =sfe(CSTACK) + MOV R13,R0 + +#ifndef __NO_SYSTEM_INIT + ;; Call the CMSIS system init routine + LDR R0, =SystemInit + BLX R0 +#endif + + ;; Init .data and .bss sections + LDR R0, =init_data_bss + BLX R0 + CPSIE I ; Unmask interrupts + + BL main +JumpToSelf + B JumpToSelf + + PUBWEAK NMI_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +NMI_Handler + B . + + PUBWEAK HardFault_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +HardFault_Handler + B . + + + PUBWEAK SVC_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SVC_Handler + B . + + PUBWEAK PendSV_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +PendSV_Handler + B . + + PUBWEAK SysTick_Handler + SECTION .text:CODE:REORDER:NOROOT(1) +SysTick_Handler + B . + + PUBWEAK DMA0_IRQHandler + PUBWEAK DMA1_IRQHandler + PUBWEAK DMA2_IRQHandler + PUBWEAK DMA3_IRQHandler + PUBWEAK DMA_Error_IRQHandler + PUBWEAK ERM_fault_IRQHandler + PUBWEAK RTC_IRQHandler + PUBWEAK RTC_Seconds_IRQHandler + PUBWEAK LPTMR0_IRQHandler + PUBWEAK PORT_IRQHandler + PUBWEAK CAN0_ORed_Err_Wakeup_IRQHandler + PUBWEAK CAN0_ORed_0_31_MB_IRQHandler + PUBWEAK FTM0_Ch0_7_IRQHandler + PUBWEAK FTM0_Fault_IRQHandler + PUBWEAK FTM0_Ovf_Reload_IRQHandler + PUBWEAK FTM1_Ch0_7_IRQHandler + PUBWEAK FTM1_Fault_IRQHandler + PUBWEAK FTM1_Ovf_Reload_IRQHandler + PUBWEAK FTFC_IRQHandler + PUBWEAK PDB0_IRQHandler + PUBWEAK LPIT0_IRQHandler + PUBWEAK SCG_CMU_LVD_LVWSCG_IRQHandler + PUBWEAK WDOG_IRQHandler + PUBWEAK RCM_IRQHandler + PUBWEAK LPI2C0_Master_Slave_IRQHandler + PUBWEAK FLEXIO_IRQHandler + PUBWEAK LPSPI0_IRQHandler + PUBWEAK LPSPI1_IRQHandler + PUBWEAK ADC0_IRQHandler + PUBWEAK CMP0_IRQHandler + PUBWEAK LPUART1_RxTx_IRQHandler + PUBWEAK LPUART0_RxTx_IRQHandler + PUBWEAK DefaultISR + SECTION .text:CODE:REORDER:NOROOT(1) +NMI_Handler +HardFault_Handler +SVC_Handler +PendSV_Handler +SysTick_Handler +DMA0_IRQHandler +DMA1_IRQHandler +DMA2_IRQHandler +DMA3_IRQHandler +DMA_Error_IRQHandler +ERM_fault_IRQHandler +RTC_IRQHandler +RTC_Seconds_IRQHandler +LPTMR0_IRQHandler +PORT_IRQHandler +CAN0_ORed_Err_Wakeup_IRQHandler +CAN0_ORed_0_31_MB_IRQHandler +FTM0_Ch0_7_IRQHandler +FTM0_Fault_IRQHandler +FTM0_Ovf_Reload_IRQHandler +FTM1_Ch0_7_IRQHandler +FTM1_Fault_IRQHandler +FTM1_Ovf_Reload_IRQHandler +FTFC_IRQHandler +PDB0_IRQHandler +LPIT0_IRQHandler +SCG_CMU_LVD_LVWSCG_IRQHandler +WDOG_IRQHandler +RCM_IRQHandler +LPI2C0_Master_Slave_IRQHandler +FLEXIO_IRQHandler +LPSPI0_IRQHandler +LPSPI1_IRQHandler +ADC0_IRQHandler +CMP0_IRQHandler +LPUART1_RxTx_IRQHandler +LPUART0_RxTx_IRQHandler +DefaultISR + B DefaultISR + + END diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/timer.c b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/timer.c new file mode 100644 index 00000000..0eaaf6da --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/timer.c @@ -0,0 +1,88 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/timer.c +* \brief Timer driver source file. +* \ingroup Prog_ARMCM0_S32K14_S32K118EVB_IAR +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "header.h" /* generic header */ + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/** \brief Local variable for storing the number of milliseconds that have elapsed since + * startup. + */ +static unsigned long millisecond_counter; + + +/************************************************************************************//** +** \brief Initializes the timer. +** \return none. +** +****************************************************************************************/ +void TimerInit(void) +{ + /* Configure the systick frequency as a 1 ms event generator. */ + S32_SysTick->RVR = (SystemCoreClock / 1000U) - 1U; + /* Reset the current counter value. */ + S32_SysTick->CVR = 0U; + /* Select core clock as source and enable the timer. */ + S32_SysTick->CSR = S32_SysTick_CSR_ENABLE_MASK | + S32_SysTick_CSR_TICKINT_MASK | + S32_SysTick_CSR_CLKSOURCE_MASK; + /* Reset the millisecond counter value. */ + millisecond_counter = 0U; +} /*** end of TimerInit ***/ + + +/************************************************************************************//** +** \brief Obtains the counter value of the millisecond timer. +** \return Current value of the millisecond timer. +** +****************************************************************************************/ +unsigned long TimerGet(void) +{ + /* Read and return the tick counter value. */ + return millisecond_counter; +} /*** end of TimerGet ***/ + + +/************************************************************************************//** +** \brief Interrupt service routine of the timer. +** \return none. +** +****************************************************************************************/ +void SysTick_Handler(void) +{ + /* Increment the millisecond counter. */ + millisecond_counter++; +} /*** end of SysTick_Handler ***/ + + +/*********************************** end of timer.c ************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/timer.h b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/timer.h new file mode 100644 index 00000000..cb46f881 --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/timer.h @@ -0,0 +1,38 @@ +/************************************************************************************//** +* \file Demo/ARMCM0_S32K14_S32K118EVB_IAR/Prog/timer.h +* \brief Timer driver header file. +* \ingroup Prog_ARMCM0_S32K14_S32K118EVB_IAR +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ +#ifndef TIMER_H +#define TIMER_H + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +void TimerInit(void); +unsigned long TimerGet(void); + +#endif /* TIMER_H */ +/*********************************** end of timer.h ************************************/ diff --git a/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/demo.dox b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/demo.dox new file mode 100644 index 00000000..f24879cf --- /dev/null +++ b/Target/Demo/ARMCM0_S32K14_S32K118EVB_IAR/demo.dox @@ -0,0 +1,8 @@ +/** +\defgroup ARMCM0_S32K14_S32K118EVB_IAR Demo for S32K118EVB/IAR +\ingroup Demos +\brief Preconfigured programs for the NXP S32K118EVB board and the IAR Embedded + Workbench for ARM. +*/ + + diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/Debug/openblt_s32k144.elf b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/Debug/openblt_s32k144.elf index c57a777aa4d34f5a7329dd423dcb408983c5881f..1d29f29387cec7523ab673dd7c78c5bb54c41470 100644 GIT binary patch delta 121751 zcmce_hb^PA^kS69_rwbt5ug{s=y@AFP*G>H% z=wx^+04Ms6IKETkDd6~Q@e7BpTeN^D6tcfA_yb6`=OC8HKf+xyshf@M#pm&lJ>&C) zt(U+l8-$C?<=!OpH$IO|QWHWf&Tb5gWCtS`FHs43 z>@IZ_G%n)ZFS(Ik?h5{6hR3Ff5-t z;3u1di|E8xSL3)Ma~}`4E*Q^FHOY9=X|I7vbTC3`DA&T`-sIbO3!rw9?tUrYu_+F{ zMw&ZL#A8z(j2lnJ=N4KnGt;;})*#1VFIhFsXt4aR503x!!STO7IR4iW^1nVf=(=$( z_1t>X0}~#>Q{oTrg!cGimTN`CiAE%(5eeL;LLsClDfs#%=@E%y35_So{aSAnynG-}K570Tr_GXMDBpFY1X6i>HxYcwV7kIT22{cSeP zCdvOa8~mVPmy(w5UCYL9O}|cdx-Y|fko@bt6MVgQ{I9ctgMxpIThv(B(J|>=*xQ17 zH0jweJjxQmE$DgTdc>4E7@>F>F?Sq{SbUN@)VK{3z*RMNR~D1vpx`PjT*Uo3ZIfOe zK6Z$XIYf=cv0K0#7yKyT@tTW&;}$h(=dptHryaifiI)&l-~bO4_v7-KH0<1rT%H$% z!o*v)k(djDNMiW19NZ=LqTmp5Vp%xp3I)f&@gy=u80XovG2_d9-?S5B<5o3oGBBP1 z#e&NKG?vMK8rp})mI*4r^^(cbNmnj-O|E1zBXJduZt&!?t<PzjY`K%?6z)>XkxVXE zuhnoSIde&?IELRkjB{(Ve&8E23MCt6yp+dl_lX(^odmvJF7+zZA-zC9?Y{ufemdqN z6Ha|?8A8|yYNF*j?s1!;wo!0Kf8s8@PD0E>UPp{k$S|WAp8UHA5s%hB{a0VZsk<`qtE3U*O}+cJ-UVMbw`nB#x1}$@<|f1Lw*0GgH|}WLuiJotwt=rx z`QNtz!Plw09tMK18+s&uvPW#z;N5<(=G_*4)-kvzb3L zYdcvPW)o-b-1Y0!suWO1X0SY-W(W6MXLl?E|IUpSj%hbdKo7!g2Y0aZKxPmp?9znE z;97PW$C$abUF=LordL-n15x8{(YT)J))3d1-5TTS-hB+N3%Z+`j$Ckecl=K7zLX4l zG$n(zw>e4A@!On?#!t~nT!e+VIF6=CeMd5#x!rx;8=Gj) zX>K5moAhiv%VS$O7^C!V3^Xkrj9F^Qe9?C?m&8;Gdbl zxNCzgeg0+cep}!Fr&&tQXqNu(IFr4~eK*9y)Nm7q^sAqN{xR9WU<_EbQMI^AsvJVP zVay1gD4#n%q%~8{y%{pT&ysi%Zwem@{MW7pk2gy9|MDbgP~65J5?$uO4gCq%it^D` zKG%O}ch7SCqCeKklj5io^2Rv-=L{(2b_})j{_i9Im!0k3;}F`o|2+^pKkHv&i>5!eo?efcqUW}bX!-vXUsjD6#7Z)RJPFrr zq?MV={W8+x^)Gkef7<4`9V3mMD9`v7jjjCOcY*Jlh?&?f*dcLbAKy0o7?RL~c|GzU zW?bg{QEq%@MyCIm*FvU%`+NK-kCbQ;kN$-98x?`jpRjSGERZbj!T5$YN{8I=!012s z4m{p2H<}Y)(;W)<`OUgQ^B>{pw*dOvuJtb~kU!jU*nW$;|7{)q=X!NaW5?blaH9Z} z7AO}u!5t4RVZzq~ROr>1j#tM4s-0LOV0Lq_f9~n%hmf0$b2@np{Gf`7Gb`iyTa)g8797W(9@aq zT*V1KJ!R28>tq{lQ^1G zJ|N>CCJ^4GKmBg`iI9Dl6NVW~J})Pdhee~wc4QIg$Bki^BgwHs~ zvw_@PO^WJp5`8>L>dW8L?{+iD_0g_$HMb;8NdjGmIOajCO(ehIP7PQbx4Jt+wtgSU zwhK$mw+SSCS4=LJchHHD;V0>LlTU;ULutgu@}?Xi#e`B)tVY6v5zM3O+n?yFUrfz} zwI$5-J|rpZNRrbyr*Nw;lht+&jl1JAlFa#mB(<$c@}(t7wl5>wTR%~UtXBGcGJ*W` zbjQ`kTjfjc0Pi;svC7%rD;M8P!x=gwb zZ9`E_OWQal=XOXQ5^a93B{sJRB&Z4lTP%zk9DI%pMc9 za?F-Q%&QA@-C0d)Wg{{!*+9Q%8cALnNev8hJn8(7 zBEs=|G$ErllD8k5ktDMh;gy3)-gp}|?^WMMOoz>+7~PyeLdVFm&eQKW$2wlLnzS`6 zIVy^wYlkv2ez}R{>w6N?{*dIw+vs{dhO{x>G=KmRVM?Dn74Jm`jdyugLZ7FNCQ(NpgS3j#ipZ@^+3r;PylM zt?x6*QoD)!XdbWAFF%^H2@#^y=nLC-9T+VIu*V~5uMZedYNuE2GuC^y6 zx$8h$4w98;F*QGIFu7(X()GnLl7w_1WKB6)l{$7EV+nO7#xc!XJJw*K!$YZv{8VnF ztL_Nd#&o0KgPS=zH(x+b`?`>$c*i|n_Z@-q{vdha7yA7{$PHhsv(00ON!Uv5bnZny z;ug{Pa?{B8*kIBIf2QA!exl!99h>+0U#O>jUz1fjA`F(7c8-1*x1#H^fpir(I&rp! zw5`^YZNMwK&e<#EiFg;A66T{kiw~w`uOa|iv zNq)_7UR?h|$dyg$y1y@JC$jYWgyX5dSCeFsC;9hA*o30wernjZS%9mg2}xYqlV=|s zVD-5VmEG3B-XYr<>c#T?8j>6a#T>mlK0gceq45WxsZZ(b)GxcSADp z@qK6qAEGnnhqJ-(HL3G*Xn&qV$N3Z|1gz||`1_FCW@OXSoVDK>iaDKz!r;$)UjX%I zR*VE{9rK*#b^ya10L;$R%mXf!$#X|^M}0EQzlQ6$x+4%znvV(7cA)hS0HG$xrhFdB|tVfqupB{g}t&1Ocw@eoMf=7yNu5CUt^8u-Sec?`W)e^tQgm8Zcc-g!=z~=_$Ne##* zCaw+^9OF&5$j(G}0T<5v^$H}CDQt&9Z(|BZVjw%1u1{eQ!?dP#7sqVe24MmtSPZ*l zX3GNzQ`;|w!-ArR*neqSIiFmov+EM$&H!}=1lrz^N?jEI)g4My}k zAh(zs8ra=tF6cq-GW(iCSkA=Uz-_2x&Qnx&pGgfvI}aJxxqv)o0nD zF9=^CmZrJ=iivs-!?#Sl1j=frRQK%(G}leQ@@SPy#gNuRN8opR$L|hZDfsL^tO~1Y zpqL`yL5=2Poeg#T9#+2O+l)1K>xD*Jmw6#6q1n=^ivV_AE-yvL`i>n2yIEt7&Ig%1 zE*JfoeN7M0f^-H(ORi1Db;U{A>iw9p6g~Pgt?7J@Vy4sc+s5S3h~k*`GXaTbTqv$d zVFrbug+0s{cZ};W!%|>;nu*{J1X=5KY6hUly$v)@k|4muelu~E{E9%$(LGBd_a(?+ zn_K|*{>&c;o<(b!W5Zyzj;Xl7@I;YJA{|&!%r9Ng*lXrFJ+2STmn?L|oBxbrBtQP; zhA;@>&m9NI7XE`$7)0=eZK2!6ufRQIbNP2VerwTrk^}<7+#SGLHdEHos+X-RI@mpF z9}Grkj)r1>g&ROYOoLrub~5&7fE{827XfgQu?)d3_m=5C``ay+Ce)!bE(@@?i<&-0 zj4NvPkgmuUG!K4j4sI%JB3SFqrUo8MHI?Jm44nwGNV{Hl%dys^92N_%W_) zK|&ZwPmnFlQhNA182?|u?P79X;SOdphy2jFeT<{Owrs}H3T|Lv{h^1)?ITAJ@M#GchIt_3Vmqsd<(RVlId=?C|-dcw%Lfii*1)h zcee9Bx>?-?b-?tjq`Ta&r@;o}K_5Q?I&9GvTt{d9#}=(`NKe2sj2=L}AiDoethoJb z2R0ZkdtU1Y?Vz$OxEUS5;kP$4p)rULbEph5U*;ACXJO2rO0*EpbRPpZ5lr?4kXYt1 zh3;|8mK1@3W^=_@SnOsNOaU~VNgaW<_Am{&v|tZ$^WIRMVw7A_u%_MBN?2cK-mHS> z2h6x3AP<={^UVBQ|$^dS};d$0@R|J@MCo%}osnG*Sl z=O9etZ`lWu&3_gMgZ=#QwlL4(&!Cl@&tFmta+?3-G$4iifZt$ugRcn#Ddqp{k6zy4 zyCk6#75wwGiXZT+Z-RTu*BpdFHQz}2k+)!|jW%LGK_?c0fb10{)0T5gAf61}alu2Z}dbLV+AjM0W40i z;S7ZFf|K!Zaa!;H2Xrpl|%SaAX$y}UJ2|92ww{- zD29F`c;5-FzY{E=IImg|tGfdBz2ICtEItT^P`>a{aH7!e8o{V-9$TQS6=ZINgD--c z1t4{Ty77Q|3(GjP?<2fG8H}&c^BxRW3(a%rCJ6VBhR$DjxIf5R;X>L)*9k`$V7^|c zb^$U_C^AAABn(bO3mb$b3!&R6JVYBrh%mM{xJ|+rovE0zS-6*j1t%<}L~EyRgwd*oO%p$si0DKCS~7A$+{mUJ}6=>d!d^%no6U7)?bBcaMVC7-1?^Fk*$4 z4uHl9XLD^hjm_;0WQoG&@8Bg#IDRGY$-;$rzt8RxnpOjtBJ@F|$EFIeJ%W=op$pC| zcDJxz7YNgZ3&sMnM;JH@x(s1LA;@0gk~)w~;R7*rSwb;wAp3-qDB;Q$CV4`*Uzjl+ z&E^OP+0!B!g>AuZ2oDP1cL(H}c!4swqe9h6aL0rn{siQ>@HQnO zCxq8~LU&S_>I2;=;nE^Bn=iciGstOSe;b4a!fZYuXM`r4MeJGOBwCs0gpUb%URX=z zgbTtjn+u#43g=VgS0uc=57JA*E3Ls@7M?x|?y4}o4Y+H}}z|X5dPM4K86wcZ9p6AiOK=f(Vx_6JC4=UAgdK7Ywjc_@3gtd%}ue z6;R$6<~Bm79tc%j$rh`vQxJ4j!dDMLUI-UZ)#9Zv_6%BoE$lHB_&36Zlxw^d{@NFi zcfu-K8t;X8wT#Iue6s=#eH6CG!NqO6*(7AKY#{psH4(&q*8vS~ zV7Jq>-N>dK1_@!M^8nezKDh|pW;U)rIF60$1+tZWOXaUn_UToa+u1nBZp!{cADl$6 zRlm}+i)6F@0W^vYrTAnU%l5-v+rf^dVK@V1T!aY*7i2#q1#Z%;YX>p*^FV?VJy%m2B1w z=?Doy@>Me>|i%$87x>UofuSi2t$ZF9T zN^#bR4hvxCCwk}vJAY9H9Up5&eW-rBPV|X#!u29{Fj@!@&2JL}WuR!42P}d_8!7qU zAaeGEw~eA_x1kFbt!V*Wh=@smaFb}KecKM~>Pr<6+C_Vxz#vStfM$NU=XGB6c9Uy;HP^a?C{0_K$!hiLz`bfk_tK{1eJuA`c#>ryn3Z zFVane@PbIPfkpIlQM4DaDqAS3o&~2xqA8ux#3j)>`|ub%pUl&MUKjPYqNN+6<%`ja zo1%eF!QB!ueSj<$6?F%9TNL30u0&K23ooT2pFFg5M>OLV%Mh5ayG?Mb}SE3E=z`YiYLnz6<5#8(o@>VpCYG&_5Culpa7Co-z z=0+H%54sIqji?pH+Mh+!$HT5x%oIYm;@!r$o^f83?DPHpg65WCLFU@wYgG`2A6XOL6w6Ew8J>CG7! zY;gafP3%MXC1hYPG7LUur*G6HOyI|}4 z{98DLeqzslK&}<wX44>ySYS=ysFir@7B8!XPHgEd5)M~D0-@$usj zZWeDl4k0Jbl)`X__~8a{(c%({zGK7@`vHj+FKPoWPCSn`l6bMVKOhO>c%;wlPBFhL zAc^9D?ig8;IG2ij$>Q-1pxY(p?h{*3)nc>7y*tC*e(^~vC+3Kio6zt9alu{)bH#NlfjlU_O)p0d ziM!D`dsysN3Spl35iOJ>;+3&L9u=?bMHPu-VsBcZ$Hl9%fH@)Va1P|8xaUv^Pl<2Z z0L>Ry?glw6-ll-AKzv;c?u>ZvPHx1u#*Bvhdz-cMpC{n@n%MUs+Pf}ZWPs-z;u0@# zH^n7XUc4nf=n9v`V&}hrye+PXhOZLwN&Ddhtm}Dgp(_`keF9{K*zF-8mEwus7~ef{ zBo&nJi$iDwdLUjx+tEYu2buwo#IbZTJQnv1fcX>gItq@Ti9IOadoB)~0)r~?mG<{!IMN&Nl$TZ1hdSkR(5`>q&Y`WxtmZGIS5)IWt_DUAe63mpW;mpwe z^n|lqNnhGc4oNI|@N!sk{UC&SlF=(cj!0%U068X^mjr|35)*g=DMV96F_cAu23{}Q?l%PjNq0enqt9XNzYv%wZToU%Oty(3BHf!vi`j|M4|^rCuVx#WcgPAeqMEHJE;)EUs=Jqbg*&V9)XDRd7c zHz>7!C}}`}%OlB7nzN53Jt*~iBIz{@UY<%iQXu_Il0{k4b4lxg;Ho5;&Y0Gc@CEcj z>ZPPU6{=oIDyaLfCHo5ieIu!&(%oB$hcAThBn4|R&}vB#MSt%l<+Q**NQTmb|0t=V z>eweq_FD9!Msm{+!q1YHkI{=-NyvKWzDWA_hh3edBp*6&sf7*zAE~IBXgsFAv~wa1 zS4&TY!D5Yc1WhVG>BUj7@RyFD>~O7g>vkBflP+Hf$a-n@0oVsf#kGJ0O1n~!9wZH+ zkaB}`$T=8nltytru~u8J2Vk~H?@>^{Rr)#|Bvjfq6%E*>L0!RxN#9d7CtUilA%qc9 z(@h8?rS8t~93^ezisrUSi&=2nrG5Vda)*?2gU@K`a@r1Kr12xrYOHiVRo3IA8T2wD zUYhm-kOXP`G^!-;l-{8%Em4}#3KmJynh7Au(zlN7T>9G>G?*g&iL&-o>BSa6rb#pK z?IpWg%216YUD`YszV}Fj*1|4BI+qsdUg>T11XHyh%T>2+{x^P1JiMW%}qmgiSN-91J zVZQYI3kXk3E!pT`fplmnbZ4X<)ZSTX>t7)}C-vt{@uFr0lrvwDy3>FzN?R@fS19dI z5o3{bB1KS_q$4PBye#d`4Uf0>x=w-HEvdRWx>qbs-Ug4ir8NQYSR#$i0=`t*loHxI z(kT?v-IeNQ!=Ox>O11ZL=?*R>A+XOKa`gH1Nca~opQ&=(qE~N z`$QTw1(2uG6%-XclggJu_*{C44%#Yd7}>p$evX3OOX=R^MC4@U=KhT+!D08POL6Xc{3SF|SzY@N8$;#-hL5eK9 z4Irs91&t(4rlqC0Teg;x(sY^2dKm1HS(m{)LpC4|!o9Ndf1{yHnIF}DvScFe%1(`K zJC#dvWOHd(I3U|kdEY@^v1d&&saY219vX zrda{y1=$u_gBN8@t3e87a$3okWD?rSFUv~SqZe0XapiD&RhBm!y|^Z8b_mGpvUSsd zydevt^3F}!=m9XeCHo8CWwFJwM-2eEEi3yAkP?|0pBk~HvWQvW?#MQMX9MQ0%!MMr zGMVKLl;twxaBvl}kW0W+%8JtfxhHF?h48-Y52u?z7~t zsC>6izM=xcZ22FRFxxLb;{#!i{0uF=1M)=|(4$=WoR)wbl&8?1d`O-{{W~m=qZc-L z^13p#dPJ@WfzM;|r*s}2mv{XYb|>Vk-T-n^erW+9r{rCl2E%E-TvmmaPRl#Cg|a}d zrSCe<$S2e3c2>S-1fb{SiT04ajK}m;dOSt)ru$%US)RWEx-0Vga@bv!52LE=HTjkk zu)8i_s)6u^d|xsQZpv>^?dX;~E)=?Axi16ZZF#dD@KPdgUJOzySN;Lr9eIphnaQ-a zeJ_CdLwP;=g5r^U>hFL&mX}k+`b4g$63kQiydsci@(yj#-RJTSl=D`}tLTJ&A(uwO z*-Lo|Wr45c1yoXgEpL_u-CKELH;{Mo`;@;_%caZEm-ljyTy*fGJe3~fC%Jwo>hf%j zygy|ppXG5>TBwzGxd8G-o%igQ)qQWVeUK$ogmLQzJV;_p5nyA@8407+Nm-b6!t6h~}R z!Dc9m=tGRXidIL_(JaMa4~%S|!a}EJwqoi-K=v!fH3B3@5kvRjfFg}zo?ON7n=m-2 z_??CBkfIrVl5kj|I1iGiSaKJ-BZ|w(@N!hqwk60hMY~`ik1H0_Ck-bQ{!!eKG&R$~ zerO+JmH?Ut=M`;3K`tmz?!#8D@O1(yR5V-%Ql$7b70td>n6?1&PNAUB%-$;ux1sx} zShg80)F?!hIM*rys6bq&IO&Ib;G=wZ0(WbJatzfk|m49LX);?P0q^xlx$%s1Ib}$_aDfGeT(%L<^D1`7a=hQa+ps$TsElc4%R{ zvUw_mJCqre*+(lwsYn;2G%H~jtL#IeWSsIGy)}qe_HPa^3ChJZO?N6=5tpb8%LOD! zSx(1EvQjktDWJQQeo=6mqC7tr(p2R|Ik+_Cr;pI>R{pgPhUvZmhX`rg&DdoMx@SU%m!ZTvrxOhusb35USMN zR9+4RxF)nDqG{50QQd3gSNZ7O6@B&Sf*Ur4$yMt zXxhsvlw0UUN~Llg?N|4d&tF4$UwN4})CbBxDIt2OTs#YqN6O$5H27Epxwig~?thSEy-Zad4HWeYmofBKbON8^RAJET8=kavjMLFkEK)TKOkNqIqoqcJl z>~QY#6FL~}{OmFeVw}%1K*l;hqtC+PoNvE@Fy1-(H+V^KzC=}~ozA6l=n|dhJ_j<% zd4?~{lbuU!luYb$PTUD-igUvWfTlXvs|Wiu=TO>sb~{%Ohc4ZDtS7iV&f_v+km2mq z5Z?AWSG)w5>AbiEx-91hlp5}HPR>LV+0Kisu-otaiavPCalUpP+yUpBUf^<_+vEUp z(AiLrw(CRA{b|`8cHTS;PV=0NI(R$cyrMI>qt44H^El=_Zzsrc=dgNkbHce<3AmHa zAOD2iDd*EF800(06oQ;~4x0&KfpY}K3}>8~wJe`(q@;Ha#(OK9T{+2T)N!=a;r=7ZP~(4FAI>!}92)8(o&lu0hh^B_%jxk2&&E|(D66jNL{C%8#-=|pGG zZWs4@K&HFkAFAOox%|W}&eBZpcLK6~E?LRA%lloHd;-aFxkYR6fXg3~aes1Mrc*iS zkjs_+ActKftzeMn(wJi2BQCyXG;q`W{gnCr}uAmOgY77#|bp4tS%NY~D>AW^Owd&Xfr>B+aye2nWX z$_!&&-~R93RZnRR*j3>Sbm6Mb6x>9r+=bwxRPNll zY!BOIN(fR_W#Je@n(A{Q+S{#Ks0Wv>N?ZbNk81x`>Y3_QG`PL0=|4i3srs-ABuf<^ z0AKr54`{7st73iwWWVYnMSwY~(D$%Apz1{_Pp)bbRp1Y*?)QT5km~sZ^zX3hk$u<^ zMx^UH47ww#nUoD3Ro$i&=a{M?=d<6#mbwb6eAV%dkeyaFIssn=s#%v|eMYsEUM8JY z4e1G&=Tr~0u)d&5{|v}Qm2o+Qg{lEPfGkptrg;96s=uS~r;<+rQ=O${U#?ma2xNt-4{fNGD$P7V?x_q^VZX21Nj2REDm4{EAF5uG>qn}l zDsYcg?WO|xMAb}BS?W_&KIMMTROge>ndhp#lzCUF>PjJep=wUAPhYBj%Lnq6st09~ zuT@j1qVPuLZ-(%#DwEd0J5|tb2&+{yD1v;i`kmgCeo!5y`}c%-uSYO z^;aj7x3%iy2f?jVYpP+sUhTR9{S8p>{DKAp)vqZL2vVP;h;@VdAiWFQs2*}3cERdB zh*4~8h&q{G{cTd;7zo47>dTa}aOy|&xVES>MnSk$Eouo8s$TXZ4DITP^!hYR{pumO zaJ7);MTB}hmDeNHt;eG?QR?mYz-?1spjdUg`U7nlJJh@BQADd(P#q^mJ>U*FTdX=} z5ukDEnGNABUVZEs>=V=tDXiJ4K9mSuqPpj2SR|>N_6JE;S5gSDOTCdglcKJy0Wwv+ zeIa_0rtY@@2D{ZE=O9d12XDq8_NY5jsGOl5MkniD^|ir3W~yuG4O^B?Jt!KOeQL#N zu-WPk!Em}?ok9t4j(XsC@OD7`Gwo`*>VN2MwL-PpfTq3V;gK3-`j}jC!*( z+?-V>c7pPp`pQK>&#RN@h1mtQ3q?#9)%880D^x$E*;%CCL-FDzwe&l1m(_X!bXU}M z`{3-VdJ?_cxTfZxhWT|hOI6|<>Y=m=-&7YJ1-YeeHg^u}i`AYN;rq7wHVbHpdg(0K zm#QPFkbOt(k_Fve^_u?R%G3!?fRw8z8X&Ate+&nyR5zw4a!KGHed{q0=w);sP(gwmBb*VGRXZ09*bhYYww3ff9`=0{m zt+_}QS|8168@1%C38t-KwWbSIP}XSF^}zXQR$m9kUvrO6)3uuJ5+K)Uj6*(L9=}<>^5qyz6BSoxl6HGh-PjY3^u_I=9@KbsG`hiCaNIZqPe)8 zvh%GP4Fx%&8qZ)fXxB8|1ujf8Xd{}4(BzOXQuD)dIE~WWqMF<`O}qJUvt6@O1KkeI zS`EBJYw9T9h|v_&DHp5h*biKsX7R7^60f=K4@iQh4}C6|sL@gUl%z@D!LwlfXw-Z- z-K9BB%P>WAnhy6=4X-^&nr4SR?G(=8BHC>CYTCbqw=B&_5y(Ex?!jn2Tk|*&PqDs>w8ul+VYw5wh)O6&-;+5tqZF8?Rtuny9(YzS}?yaWX zc93_Pu{!j=S|b{c-oMvG+e1#{f&Nqvy3ZQ%3izzm^rf=h7mX+c$T|%pht6BOuN$2C zXuCCl&R5&R6V0yHE}{HojkaY0h@bXHI{o~$ibn9VR-1Ga!gbmv6tk_@jw^&gfc9Ah zxIk_B5$J-ne)JM#gZ8jf1$=MRZnC#2U^JZtlpJr?UZ@6!(>AAkeT()I{qwo4+OD*W zLbchO!P<X)6iSdhs9(*9z>b3K*;HdKkDJ+L`arnP_ch1xSom^A0{^wVw2eM4UF6 z(*1btC=rke+AHVLr=8kS6jCK>JH3SKWUYP~guApYnt@BvexdKNQneLPfTU>)93=#8 zznL&k*Zx4?;O)^i_JuA(yT|Tzh7tAZr$7st+V0n2o~5m;1lgx$wgQ>09UKd?U%TKQ z%yYC|spfD%`#Y`ETli8xAxjYQ>aAyD=qO-?PZF??r0}vz}H=E9>o`B z+I>#wLb>)N<@goaIsE{s)LyFwxu;#pMIN`>6ajGZRGa@jfX}otO5dMr`yYX@O1qxk z61>pH(YutF+Q+n4ztU#*fc0zbhyu8LqrFMz^IL8FIheoGj%f^CwU)mNUfye0C&J)^ z)|^`=bevsOQJ3G8dNH$TGui?%tfjXLe8=dkeB4RD7WA6>J% z(D~{lG|bhy2q$!AjV>SooS*LeDd_xliHBgYR@Z}Df5L;GHpw1*4h8ro6nTW`Tzdhz zN!RXgKsM{n)PUo3UFjpxEjmdXw6In8nxf=T-8c&S?7Hv)fQ0GR9{~y1P5TL6B6Oyo zp^Ma=Jp~e_n>7W(ZMx}iVYgk^qcxB_bS>$h!A9!>>6K@U&YSCbQq-#zCI4}{m2|kr z>teMSY=SP1-oWkD#q9x?s1q%MuOyw7K8{M(Rna3#(Zwj?D^>TCeZhI`09AdU%h26; z2;pAc@nvWrQ`ad8!Ytj>R^ayOu25>6t*hIJhW6{?s2q}`YdZmu1G?o@bI8?grA{2w zJ)sv+hjg21&K=ebqnIsEw>ts`M|3~?f*jQ)Q(AINC!&E|nsq0^NWaXyS~nj0ZPob(6M0cTQ)g68L%D3m1?Jx@yX%F6t(? z1*A~7oBs7gk?vszxJ$Z#4(QBfod>P?E4q#gV18A1Adj~6YdQ_x%Imt@?!es8-F^$@ zP2IjjaC%FZLbJD6H})QMw{5H#OhGRyhZE<{k9bM=#-ltkxHgLpy8qW9azw(>F6i=&w(VgU_}4 z_P=02>-0D1FkY{pLaz)1^f5My3wnD!a*Mt<-NCK;R&>OM>Q~bzXm(+}JRvR&WDLi2rxUP60nv|jKG&=`HiTrT*u!FDqMZW8tTGoVY-N73_0)-PHK zZkK-6Jv5)9?>zxcr0R#agfLBS?hk|A`r!BA()EdVV6aF32bDfD^qa)c?bQ#Ypd(ZN zRtYXk?@OEUKK*NYi?m<=J0&1F`eQ$WJD@Lex&TbB{yVN!L2G6WH>JR8^X&ucv-rcBuctJ0rFG33S3q{Zs>4h2yFX_wN!Clsy4uQL(kDwUzs(!<9kZbyL z^l-21qke~%8~UGT0&-K&r@`LR|3hVvVtx8ya3%UG8f8uc&XAHW-R0sR4_uB$et6%m3=3n%wT=^M|^LC0@eBDx0 zAY1LGw?Dsx2q2TTm;krSEg=kalT)x86=*VbGjE!98_vCbss@FNF{HHIxz zi1#xHDO&V5%$p1QwT5<-6|OgYFo6p&q^Cd^Xo#gUOprmIfOa<+M%njV#aF$`x!^V# z2DXLI&4#}8Wguth6%5x~3~98Iw;E>BXEULOnb~k=H$0&CU10_ff9N6%kB5Oo8m{F* z7-ev!Qr0#@6^-+#p}-3Urwr36|2u6+=?LzO;U-nd&Kbr~z3_ser;UQULW6HJ^!JjX z55?c5hSPtc7k3Qz-@)*%;a*R0Wrj!*AmxUaltxwzXH(_=%|Z0MdC{-%`RsUe$!+-HV_b#xw883H!I;)P+|8%SRo z8c^2$$}r#@gl`PvTZ6nc^!^9JcZQU|!Bra+Gr@f@3>pdF9}S($VfV?9_!E5B7?|6D z)EZX(4epEKGfj&+Lj$h&MU8FME#SjFIz)g(c)WK5iS$^tneLs(KlBgCws~x(y2W;n zD;r_G!=oevo=? zK7iiFAv0m-W2~hZ*w?t^Z|GJV-A+Td#;6$t13zPLI*a^`bE#mp);NCygzJny2LrO+ zm_^e&z&M{PD)i9R(kT#ZY`zqT5MzfWP;D~uIHpKrTTK%`)M%pk+iqMe0Wi$SorT8; z<4R`;BaICxgNQP66tiwK)&;>}hw*(6kZ9xQ-*NY2jCm9&#v1eJP>nY>oClI%{Cy9) zx6{~_-kl^GCq#oJ8x6E+>@pUt1ean=W76%bZZd|pW-1Y77#mkWn`!)`3J$W2J!xOu zXSC43vW;0|q02E^C&TLjqk=0h@@Qu21l18^i%$R^HSWC%#4+OvZ*=CkaX8)F6UNi@ zZ`Dp3XW3nDVcCu$&jrR#!=XE49N8G;tZ`TpT%I$wo(SD}qhEapFBn@+19#DQi}sg7 zV*)i)WXz_@!zE+vbM*GI@sk(YyJB2O=2wlEZouxk(Vr5b8^&j}4c{~t&Vufiaos=& zi;XLlPLSR-THuj!?X5Scp zqq_ZD;}wc9-Wj!%=#9dAW8q}5AB@e`!~Uc37A3BqjLYZ-)flHy4ePUU`fK!}))=mY z?u*f*G3@G$*PcS??YWeujF0CJ6xI29UZ6J^t36Myw?`Kvg_=hj@jB1ul;^DX6jBBk z;Mpn%B+#>_D}+IwEy(u<&){_U-sm}M9JpZ5SG6D^p10`O+2m=a)wS6(Z96);#q+@o zG`Q8%V>yJOp6gG-&h9yj3UOhc=Qjcp?s>L1xCqb2wv~WJdfE@5r6|u7DhqD&G*5-a zc29rm%nr{bRKtz-d_>uJjAzsd7{+>@`woyePj^3X@t%E*Kqh!L>rw<5x~b}bw{(lrkB5f zTWy;52HYCcE*&6#CZqiqm^*)ApbIeF-UFY3rbb-!Rn0s;ePt7D>P108h-s@YJZ~~Z z(nvO&w(kVtOmAs;TTK5rQdv{zVB9&oX&vqCVWy2wU=VIP*$T)AlM{W_6KM+Fi&mpd zD=6F9W@`TjTHS6sw2kw+X0feV3}L*99}AxeCL>j6cbYsYxlc3=rGL7ZWHQnDl5G0! z8n|7i=bwR0F)a%RmuiZn@0Nk9H%+51?Jlr^jcqIk**VksT|k^S z#We(X!L;fNtP4#~--8sH7P_F-OD12s1(!_?`T}{?)R2Sjn(01GiR-4nP2g^ro(xCF zZkdkzffSq0@_@W;GIa-6Vp>U=SE;Fn0--ymE%TwfYs$A}L0V=CRzO;A`Xd@+s4%&_ zM@yBaX(zzlGrjJEChnW`bPhZ)wWGY~p=o0@>>rsL{{`-`X)Fuw3A}-OYI33p_RO?k zCCGEr%V>})(-?Xa`N9-=5CeQ^T1sL3E7Q^_+S6W}O0IHUZdh!$4?z0C zhhB}z(gF6LO%{s7YE8cMFHq`CJbE+i?X~zby!m)>l*RaZ>8K*T+N(9?for@5&_U|w zwfh2){$8H_;ANYa8>QZ-y`)BP=e-_N7JJd_<6f8-c`db{xXXC7tJw}+v6m(g<|SSi zsH%C#E4UV1nb&>#Vxz+A1$_y8&&!o|#s^+i4ehRFjGBq&y4`HztT+puw^>NrtdF^w zeR3I!C++(~=x-kU0j;k!AEK0YojFJXZoT=RRB!?2RgYm1Xud{~MUc722e{r~KH~_> z&8_H#S+F^82aqA=!IwZbnHyYy&&}pDvthuQpVEBWVs6^F1c0m(5}PlfJ)xifu&l51Acls;&l_ZM`B z&0l7UYPzjNUyQHD9Gkc-%ZD6b2{E4QO$nG*7o(2YbparCD^^Y|RH(VBSUh z#~Jgl6wRMCpWKDcoHI+L;Le+mu7;Zn=3Z1`y=cyDh_Mu!dr=v@$gCR#;U#mgAaIw> zC;Or^SIpHl5MDLUod@JKvw%L!ylx(G3(jtsAJ5}*i{-;s_kyt49N8Sg+vcNmn@Y?g zisnnrzZZktG3#4`+%>;^guaxS=kQ@rZtk=U!V0s~EErUpTMkCA@0q9DYbzM5ZO>Y8 zPt3E|qc2a*Q-=Za%sf;MyXWRBX7r`Xd_NPA7v=@y0C{Qthdw5JWxiAf?zMSb2)MWA zn&q&2Xa0k_RBdiR`RaRfkDoz4nxB?~d@@hg16gBsDS+K)^FIgS^NTri64kNm%qi)R zdRu;71`tW6)rJ8D|>n+ja zK>{qpZvzr&DJ|n%OVl<4O}Jo7AQi?!EYTDUZL)M6hyiZ4bc%$Ivt<7UgDsYoR3O=E z*+_3wLM?M5fwWuth=2^Ud}xJR5pIc50U2S5qK_mZEvxAKkFvPtf!k(TIv2g(Vc9SU zcF~rRi=d0K%&?t-GS;$y2W6aPMKGF(w@jdAonRS2+)m5)D(Dg|5-qqSi-tnuWJ@F! zrFU7*(W{aa%XKPPrCPq*4PBb0FGaPxEp=*;bj#zu(CxA0(aD`*@ubXcuO+c1NTy}} zP)fbBESD<4?z23kNu6y;^nk^F%M^;;b1eI5QXa7U_zoS;wfsUk^dZYBs{I_cEB*Qj?N%tiSpKR6sk7{E3PW$}(|^GESlb%W zysvdFHNV>0f@*_ntld@v;%B|K5pMjggK6VmYyIm!gzKyu%n+`(wpW4#SOqje1Fg|v z;DW5Pa7ughP*EV!I+~V3l69R0!enbN z+URy!&ji9-igoe;aH-abmq6027g#`cTgTB(oNnDnIp7{^HPt{etS6@dve&wm_JK_6 z>WB34NtV@60yq1tQz>A|ww{`WmiAi*(AQNt*3tBe`GB?Q1B@xx8YTziptWKIgomtc zD5yDXHJ8IY&-!#S$PsG>IqV2RzgF! z+-%!8$aS-yf`F+o`#1sKZkVlag|O0WdlZCKX0L_AX|>rh4!9b#`?Nv4Y4+*Y;A+hV z9>H0iS=V-O^=2F@qu(-Xra^w&th^7x2D8I+LGHY3HsdQu@0z_s-Rqv&t+^og&4#OC z@xaVr4C=sY@nHabKQ=Qt2VslZd$!-LkAjBjMlrbILNqq4i-j+@9z*EVq9ne@-XA03(y^5#8ID#X7I}ZiD3j& znJAX=HRS?vjM@L8g$WG596*jTK8^uNWZVmc-7&^j_aj1Drn?0i;VhY99ShxYMiPCj z6O1(l;7&3UsnT_d;WGhY3ggZKaH)*9Xns1w_>I!jG{$rKEkHWM)CIZ>#zngGa+a~a z36OJ)9X~*q$=LrM8j-~~at@Ge##%Xa=NV<|;WLL(uw1189!1*?+Rn}YH$S%0UeSSGPY7#=PF}>>M%u&T@K)i8A2a$ zC5)Y4!e=St>uhk>7^kVjmoZMJLRijl|Amg+t~0);qGbi+$TpB0jFWEyQ^`=#m#kuZ zOGiD`j6W$|sbRcH*N$#7dSgIp898+@sAFuPk5$h|+zxV^@sh3qH84y+1>_Fn-+tKL zWwdodcaLFDEA4$o6D4&I7)mwWt$WBgUJYddozpY|2-kGMMw>yMwXtOCUQLw=?0Ti}4q|pl-%B zb9m`tZ2AevUWPYT_$|}>7%%dG>1TA%QNaLX$wrVthSwBWJYzhzL}Q*aMB4!wV!UAw z-3a3)tp=lvo3wV0F+Av;bethO2H^`v%Udvb$?!DZ>@iuS50nGq&h*Lz#Dlq+)*Vl# z&FgTspIKWAp%?RS0}Ku@w}wLK%?$HL3w@YFRPym<4h93_$9yniDjbN4O~BU4J%utUrrW$<>G`BeynN0`@+!yuaZ z!891eFxO9j#4>l%OccjlOPw^H$@~be6PRDqB6gJdxemfaX0EZm7Z*b|QCfF`xt1<} zoMdKx2Hh!U>~08Cm<0_GrZTUrfbcX^O0Ve*Q%iYr8Z*+kx(|O5;G5roJjZOM+&h!` z55>!3ni|*iVLqyR3hp9PNImBg^OX#Z&t*QP(SDgZ`WA$FOz-c&02kO~;XOj9~O z8)2TOtKy?f?{e6UF~9i?+&J@egsNl4<~R!elG#O%`HH#XG|VQLvCBXvneNX(+*xs7 zKv&cvO;-u56i1MwtUELzC$cuv1@B|5CMO`1Sl21FOJ>dc7zW2#FaJgG z6D(FdgeO_d2e3QE@}le_g;g>w!lQGczBviPG*;DpJlD5S?3&U z)kf$tSw`B_XR!`k1((g@X28pNR%bXGk;5vnhG2?9E_OVW$MPF9KML< zy$7V2rQHcq!b+u5X(=mO21W9|MG+!7|XPbtlU|3+?V=-J~*C zH|zZ)5caTqCt=vjah^41l ze3%uu3c3-N`*k#Cl$Bcm;TY@rY;fbO9}k)sgPxl#cq`!~#1pLXg$OmtI&VySjy#Va z4dDUyZo2v7&F;~|j}P0|6cAtbwq4--*s~l#{MkNKk`7>>9|IT2p8pm|5c>eleZlPh zDwv0`|9lByDBG6y24QSh`Uv6d(gElq*vW^0jAVCpKp4fIZVllub z`^`a+!|a+R5FTOA?8aM+W+y*^Fos<<3SlgJg9o@cb_5r?c=j3UatZ7QVQ_ksT}G)@ zB0KR7K$6(!X)Be?ZlXiI!6TwtHhwjG1F4E6>o$XWLF@1Z-#&Ps!MCi@TCg=DdRqGc zdG;6YfXiVA&{^aK_L%~37uh@M%Uoh-)3lJw_DiE=;WB$>I6~yHEB8T}&rW+E+!glv z0bmN)DgS~iWIv=@<5hM5t?NbXVF7f-Y(35SCG1|Rtdz3TSkPT#uc0ze8T%{RN|m!m zdEl!$8hV3$fOcz@>_!~oxJ|EO7q-K&n*EOy&>D6EEyXw42j>G*%Whu> zi#qnkT6nv~esv4N+w2}!a1Cs}8^|5@-?V4E$9^>ecT?CK$D|6$E?Ap7S|8b+G^2 z3}Gkx@dS`v>?0?j>t@%a8G}c#h`dGX{{Y*o446T-Cru2`*#f%8GQ`H;sKf|iCz~Ml z2>UVpZ-h~HK4oiT>@9~t#@VCAfV^OTM%l|t_Tgh7uh_3>k2S#_p<|>;cIFz`d6;+c z;lFmlb`69JNE{^_6Ku9#mj16OE% zPzF+D&ZLT5iMbmyBCmh8+uU?SuP{&XK=cOlh)x8$V?OQ;qcF&+k9LNw#R%P4X9r8S$Dzpn@`OJH(>ttdNgg&Jb|*GXXY#0 zK!(h@H{osAJnbKFBj*40p)sT8%ND>{w1qisUK1=vx4=BnqHGdel11Vc#652DQ~+|$ z;)NH4nHIH;GPudI*qjb%wuOTBU*|1mNPx+);5UL?urQ^)_eG1)??EnERF;C|TBsr> z226Q-SA!|An7j>AXz>a4`KuPJ3YZmHq)#m8Q)$3kRyDJ+ZKS2VA?wNev)REfn7)M2E!?c@1R1BE|v%1}z-B;p>^j8k*&wTO6S+(vU?p6+eb8q_lw^u~@zr z!cmLMlwOQk6w~?exP>+4DlaWoG(h*t;t~~^CoJlz`%PMKX&>!w`HTu}9+v)>f%LT8 z>Glnz`z?*1f*i11TMt8TO97Q3eJnQ|g>PR=<{S`zOJ4;b0ha#sUIQ&1mO>b08O#G0 zZ0SW@h~;j7Kte53X{R4%sk(|s3b*v5ffZr-1La$hmVIUp1*;^>eA>t+ zTP~vA-f>GwJ>s3P>|YAVNz1%QSf8>S`VGPq%Pw0$QY{5X5a+a|kyg($mXnkqr&(GV z`(NT`$nt|gp0kuj0-0&qK~;w=%U2~v(^n>|-IfJHdC78SEl95A&$NhMwp>V&@+@0u z`=4(qr_||+<$ISw3M`vwy(_fbxdxD{mg_P=iYy-#Az-oP3<^O0e>MyvIJ-7ePmAKz41pLq1$1D0nDZSfY}2DT&*_vZmh&Cu zlJOir+J7JAT$~O_BB!1PZ5pSj7VjyY<4CDq2InaqfS%=C%{0!Nz?5$HAK3Gp{j^EW z;mo0adx29#6ZJ*TIVy(ba+c)7_hrtiTX2)dS-u&Ne2&r@!YiC55fBz|gfznzawODq zu5#X&Kv&F(zYJjsXAaFLr5t-2iq|-idtp$D8+B(j8i$MjU%`L@`NMiP`#_2v+MuEn^S!rh8>(8bQIai*_{P%U7W&9K)N~6 z5osf)Z*8SL=K$x238)4+?-~myO%{Fi<_rjjIZc#Vj&LNjDIVni*gCF24h?}1W63mrM10;m|``6$?xo%=W!ni%Vz=d-S zo!}z4dzXQW2-wNFq1X4vjg+{fm%E+_~BCmdq_E z06ETmWdP&^H)JKalUz)b80*{|9Sl;qJ%=DnMlcgfxG2B2rqJfpc2?6ZW<*L zxm=5@2yvO~mkC`S_t6dr^SNKng25GT|6K?Rxc^<6Zh?Wpb)h`!D)+xZV2Zf8!%!A; z=TQZtgu9RhVJUZE#9QO0>(X8TSiwzphN_Y~_$HpSiu>(UaMfJrCx}3!re?gteyK!0+3I+71yBa;C}lQ zq?5av21^%r$OaAU<{qg;b9=bQ>DBdeYt~7i?BgC>1!X@sn^ zcL3eblhM}4i)Ypga)5WE89HxXF7*c=-mI@6^yP(}2l3WA%quBmETZa>_R}oc_P|(M(|oqDk4l?E;P{^C#K>Be@dBo46l%~ zp;%t_B{+@aU8mEac%EB2NCL0l0LW3^E+2S1##`|L+MC4dY=yUE-mmn6j`MbG0P+OS ziwW)|?0RV8mTouX9ne8M2C<|R>ew1&6PjgrQjyiGxn*7B~{AZ{IxzYoHC9@_}v zEuPEAu)obKq!YLX-l}=f-Qh*iU52~7lpH|r@w{kveV^C48RP-)ViMZ)koOwZ_8NJo z0)cGe^-@Edd6TrCe$1OoU%rKx{+SzSD{oW;!!}<0Z?Jg6v!NP(J1>X&|5Khl&8Zzc z=1w%Ylh>C8VHYpg2(FtK`Wd|S@B(Nj+{@$BwA9CoUJQeNo|J`R^}-E{gx=JMejszc1p4Nz?Ctro}0Szik0zvHZ~g*An=LX&#E_7f>xM zfxn!V^`rdN&k!JyZ}4lm-t&-pv&cdZTw*7ltoJtF2djnf6Hgk74ZKl2eOdAH7d+x z5%WemfF*n@s&AF@%P0@L#vj=NQpTS}bTuY<-hkOxO;q`KfvARFJ!^s0sk8PmAZ%gvp+)E z$X`vD>K^e|(z4vdFA0XOnV>l%z;sI&lm%l>vR{q33n78pq=s@cUpGOO6JAePz zFn`K7rS9LsFIquMZzo^(2cTX2!Sk^1=6`Y+q=%oMVLbZAl!Yt0DYqElp9qJ^Ab*_B z%AfI>bX5PGuQ1+x1M{H|6>rA*G43EQ_|fx0Uh-pqg54|rXH;OB;IDd&_>+A82I$tDhnOi$;r!QN* zECRC5s{9$^KDF|p+I){y(-?$(R*rPsJ7Be(^1NqOU(gU5vigUbJ!19ZPYB1Xc+Wu& z2v~Pv=PlrW49-U|*8~t>fvy7veu8)^YxxWQn~Qh>f=ewB1`1BQ(eYD|K==PWi@=oP zh6wogU>_=&^o1^5@V*ozLh!jO3?l_;*Px3M%%?{>DER&eIHN#81*1cP99slDEST2^ z5-ljN#IwW*yr+SS75qju<2ZruQXu06=IfwK5Y$eZfgTmO(7c`~$fE2tGZA#+(+I&`tR>f_2$|qzRVLyqqrBNef7ZAeZK!vx3Ht zK+XxYcOc9Z{JapzEWs{1ugDhsV_Y={U42O#Ai0A5*8#~BT%HRqUy!>SO}ZjjPRmGv zVC@}ng@WawAXf!AvB6p@D5I>uSdec9u0*imBwUvY+N?pY34+FeEEDvE08%cvPnDwU z0?}=d3V}Ql1~&wY{{mMfV7i5YRtqxe@T5lIMG5px!JCKSrdD7|8|XSgX#_~UVD&>Z z=9XY9WlFaN<~%?e1UV9LcLaY^f4D1{%K>*!;76;;eZlJOfIJYy(@1+LIJykxj|B56 z|7jBJq1?P#FeS(h0UrxEJHWOGE*}J@RbZfZ*d};;73`k~u4Tb#yWo%jZk`G@eF@Sb zxDg7{DflQ523>+RTj8Z!@FD^RJ%V`~q3abSJwT*>!E?&O1_XO6pc@p}(Ny$I;7?@A>c(R90rB;1Nyw));s8Y!pGWU7@V(lk}Lk5 z<8(i3XWGL0TOVHuX@GSet+0XC2FhT9tQqvfy%-FJCKL1a}?liSf8P{e$)E69fWn(a!SK)Ss!`? zFAdgLW`NwaevRhZ`_?(r0eNU0(FEZm>oA&Ro2?xe<7rx~>*$6|oApAfX%AQrtb}mT z`itdM`+H`6Tn_1T>v?IgAF|dtLpf|6Y_y&?#cajY^YHf4+CV#$3G29zft<9C8AqGk zg`14K=S?wnTRsNi0pXxIkUm0lI%4t_HeQ3!PxvR*fc=Frln)08#hxI6!b#dm1qtnb z0~aj3GzX9n;j9plP~jlGtuSFMB}L)FF}e~HA#{8X$VlP!4?v=XlfHl)6kee(XcWc? zsYG^2=tqm_Vc~unX-9-rUjrH~thxj)Mkwln?^t2|3$!Ut__uNW8#p}f`Uh^3guayY zCJRew(l{NP6~5oft(UfrC-UW2-g?FXR0ua#?)!yzyR#d2>)P$OB3c_ zL7;Tuj5h$u5GtrQo)z+`kDL?6I>0zW>r804au!N5NZwN2Oz^+ml=>o1wSn&c} zwQ!+ZEHE{~c3SRk3KuR0sTB^>f>9@&pf6c3bf(?qEn#&8xZA=9i@-GqV|F0Y9bxW5 zJlS1g_#ANegjcApcwd-KSAZS}Z<-_0Lt!9Qxf_LTui+sc2`|_~*d*ND4ALxYnf4v% zW8oe-FfGClK1YaFp;O~53JIFu3|7oDba;uE5v zRS=#MxzfG16w!PRbg8107#N%uCDN3cCOYQ~k}i7dB_J81kUWsHA|4?#MV?E6%n~i9 zi6L9GlCrn+qS1I57UleWq3eroWm(zgB70tc};bqZ$4M?7-pJv>A z(HE4oUJ>2c2VsHetO_$t z2wyMS5(V9D(Hh$1Hi!l&cfBLBJ%?7@74isp$9(SmwFIz@SJ zL)RtxDFb%hA_=7&J)$5UTG%V^KO_#LKo`ZckcUmr7dN@l4!S`6CN0oc#cDd&FBYq*Tw5ykeGgojn7b2@ z>*Bv?y1Ol|q*`->IB^NMJK|wlPVS0#T}9k`V(U#XxG$E|wYdl4%hu366gN+SL8JIV z33QLdVmhsC5|2}2+bp(ROat+;_)RS=TEsilkhY3T{sPw~RyaZTMEvhL2;0Tq(SGZx zc&{VebcpwP0n#bnMfqlz_}?N3yTuPF|LPIzDE00Y+m?gt6WL z#ezh%;+gpU&!-`QdM-XiS;~<3gI@t15x-5RE2HAZDXjb9Mg%jS~};11YGO*kv~7iqW*|Hl}oK>4wb>s;^YpG@gO*p3M)Q@Oj_n z4LWd~|G*|k5B8x=b0SEiO^LB-K2n08DUEBfVIKf#wGmU zV=)FYWV4a-gkhTv)E`D{oHx0mF{3uV_n;iNsjq~^3mZlmlrL?jy$#(fn*_?WCT#wt z%eIp?`=i0ROI~b*&O?${2s=;7hcpN8mjqLJ(@T4wW zNK%u~&_GEKRm_4U9h8>`OM0jv86x?K=BZGLIsvZ3Bqlq+g-iDR3|)j|pc@8}k{F|E zp^2rN{xs~OB@5|@Cq`0p91&tA4B9!wNh%6p5HI0SmXaWer?5vQ0qdbllq{gB=$K@^ z30x;h<~;|OEb)+_)yE~HI&dc>uN{Q5lahC-!h1@xmU65Vi67nWPL;H8g57D!4mTZ? zXC&7t%}A5fJ^+_4*(?W_A*ovkH)kb(?}O7!i6?cLEJ+r9o@~ikDyW~Axcv@cj^v^M z!V3~Mt%4UNU(q4oB}q*hBIQcFo8j!TliBJ6NfEGy3mKb*} zGFj%3b{pCfN$^8ROC^qUc6UwEO(U&L5?>FlTrx!f%j=R_x=U3d$)yeH4apf93@RnD z#`NV=%;c=EfUJ{fsJK=y8Mp@BEs2Fa3~o!t2hofM$u{Z%cO+Fm!ThcyuN?;WB&o*L zi%k~k0-r$FD49v6#7B}P?I2B(YFZtdB_Ghq>|@C>8H6p8i{As;Dp}A5*KLx)An2Y* zOn-*1U9!pe&tm)wr~VUw^h)-=2J=42&`)Smzhu)=gdLEuA3--LS+E=2Gl{dYW-$sA zogc%?n8fiG$hgGn3|zmI6w~q0E6G205Kc&TZbgJi$>qZ^cbEFntm+{Z>!9{(0r8Q}eiK4pX$Ykre$u_Op!1goI71g8{eCf(76YYx zM@WODpU{X7mi}Vg{q7VT{}}^7nBQCk#3(h;y{1Fb_v!rWu=Gb;Adg6YrffM{`jxSH z34X|(Z2~S{dRUI9PLR$_2IQ#pAx$rd(%zZS9h1h>elkgFM&Bw~dYq1hj!T!*@!1LK zqBD5vlhVy}W9yVOmR8La=@@;MROv$z$Z6@4g)lfHweEl}O}cqA?9!#Fw7h3Xv*yw} zJS*LxhV-0tit&e)*lum40$+~Qnm+Oc>2AtXFG?ql0eMNfn`&^m(i8p=UX~8iMUOn` z*Lg6=m$p&`<%;wO?eYqwuhZ71Q2H$myQ|Uzv(V5Y=?mKB6-yVNh3gXOl4}r_N-xnN z^EIh!9CT&U6UOE5V5T(r9bBc}sTLD-iak)R)RBwNgDD*3?N& z86fr21Ul-zCH;iTIJc$${tRJ*lz#=tJJK(|fcahNj0))PNnMH|yf6Kd3h)o4*C`Wy zDE;$o1ZtGdblU>@NctK59JEOqU;<^cl&6C5v2=uPHnm7c{)1tww3~9dHff0ykWZu* z7ZI>sIy8bvPo?u)K{}+#?Lc-)_x8Z9OL}P;AU#r-k0I=p_S0+Xlg@vH2>nv!0E7cl zafuetLFsp-d?wvVn~LXBQ+k*o=@S~J!_psy0U439pTc5Px|WUu#-s<{gPU>b9-8l8 zNEybzm*Q0xy#aG~*)#LD|Yhk>Uo_ANm6%U+|cqnB*yCO{6zT4-|dmdTz4@RCo6sl;xCJ%76!;tS`a8uHl5x8794oHaXcPe;?%KB)~hRMd= z^pJ+j1~#Sgr4`3Z2T^exw0u_a9Orz zGnL))WT8}W&6j;jmB1@9pY^aPkZqugb%io(f?kzfuL3EObyAVPSawN|S6d=`Mkghu zG9lgkxF+LL3BFABB;2@{fqj4jjnqn65S=tv$!1fYS1lV~0XH?WOO#mNlqoKQ)XILR zG^9@U106Hf%RYC3@Rls#M+k4rCN_h+Bm0Q%(A<@sqdf1P?BiAl@5_EV0^tK0gLZZg zWoA_CX_Ot_2*@MZDmTi~n`FHEP=3B_Ad?iKAF`!5cbRZ zpFubvTXj&2CJxFzpc3RW8HcjX=dx)ZBJPmPGah7EHjOU$jL2Lgz>UhvC}A3t&A$Nq zas1LB+zZ)9#wsStu&=9N?qR!xvOZ7SC$ul!Z|g^UA}`ywlMw!Zts@P1Z(9xZHXmEt zzrp$1?xCF3&vxIN2;^_8yA7WKw$tcZN04pvBRC7TEmeXGu??YQGt}1I8Nx8zj!$78 zZu=Hh)*@_^jNU7d{+yZ(;SpP>F_386i!}Mf*e<23(V4biQbJc_+k6<@E!(g^5VpZ~ zCMt;2@7n%EUhdllxWnL~?L-mCBipM~fNZu+rlg?9){d64UfabBpzE^@rm|PRZ3z9y ze$e*bJUDx1`_L@|7SCxKTab2ez|~3MPBmDYXLbRe@b7+ zTVDFW4N4z*ix9qj<*ye)=_l8G2hLyKO{Zr8@*&|x-W@4F{RF}&xp@zoeNf)l4FjV*juPKP@~v~G;ZN`# zmfO%TKaR*xzXoZve2-DR(!`YakaEDI@|{#kOq8$L3a7{9rc)3pNj|F*-jd~O??ZQ7 zKHg&7Z9YZd_E#Vr%BR@#LJh&jAO)uf1e0dY>F3CrIV2~^Sk#@6}<$sa0Jb5r3k>|_XTj1r2 zTDGa@#sMdm{fU6I{C-{}99y<*&vZ*mcQyFW|ac zzUE_aJ@Ty25usNeM)O*q{P&p<_RG_0RvwVs--K{b{+Srgp2_D@Mf$m%vmCl1c{vTL zVfpV3a5f?@rrpP=oJ;fnn0)V7Fc_B~KLX(kxi4`q<@Rn=*mx!HH-Mdx>yJV?DgSRO z+_)?1sIPk{EIdFw71xv?UW!-rCld}Rc6Z$&9hvObEg6(GKfZFI2dr>I&3oxkE! zHy{HPGpJ4%s3`mjBuK#+L1Tgy-%#2Yq9|NT)tOL5L@C%X#i75!g)0gvSBg-4@-5s% zD*C7#8l{+JfZ;(!G-c36g{2jQhZO7f!tSslo!KCam_{>wiX#6T zaH)#Zw7#EKT%el68O8ZK(4{G&FM&%}FdX0|L-Es_;La&NrMy2=Vf7XuS&CQGjj|OZ zw3MA!h~1Wf<|vAa;q8LLo9@D0RNVRi_Lme5ROrf8Xsn^TtXN3tU!Fo}3SGVeIU)v( z!j_(_K*6V3qfn8i0_3VfK?!(~qVy1S#fpNXFfUO^@&UP~c(xsoGKG>#{pE_eE4~Bf zy5dvH<8LUcX$`DY#2y8yQmm#E?rKHGkKk$)Gw3$kO+^-M=V}$sS71=5IL?Lddc^{q zI848#Snwl+w-q-6;JZO_dl$^_C`{=g?ka+eraUZH?sQ`CNRdATWV0fHj!Yjbs>!ZJ zp`=}Yt70l$;(ns|y$D{~6&+K+Jym#8n%SYKr)k{XuIXD454$>A$~^5%ePAAEcZp`~ zV|L%s1=eIcUI>II>|T5Va>{NiB{SJ}uFUfYc;4<)T7h%yX3v52g54){iSMEvkCvEA zb{C|^Cf<}~OMX`4L9f`cPeWN?_vJm1Lc4I|JU;r2@DD&s>^}JdkWxDqA8xMMEvL_1 zX7|ZBgynWEi_nbgb|0mqi4}H_rorHb-LMbhR@!;Y1f@Ab{0Rtyv8nLImk`B zUMdvV+6|wCU7g*JRMV-qll%zbZM%K6ZE3JuyP3{M@7M)V9&*=i<_=))+ojQE`v-Ov z5#S!$32D}7wA)TQvPX8^w7YDwE3^XFY?rbYy2p0+=|)G3T^5brR=XQU<6CT#W#2ER zqvj4fU)u0=+L?yIX_sAK4w~O>r{X}@W9LGf+g`ih=q6de-3BTq57;S^zzy1!NaZmvbrmipF!xM%$)+xQ+cZc zKKCp6-+_23D`^-VP|lr+CV4AA_!STzr4#ioU*%ous(#9^Ljdtt&Q1jhP<}?WjzHx% zlpX{rxwC-`Rz3-YU5L_&ekl;D{4yQFFy&k~$^^odg_Mv+C}Zi1L@MLx;iHs0zK8Ij zayxD8jLNmUfjp$V`~|qf%3q#CcSJe&07677XWPRdMwyro-?7Ty!-0%b8Yu^iS3dj` zkOZZ2IUq-sb~12@N;%~k$CT6lqXVTRr7v~sWaaiSI6bbM=ro=cOj+nwOb3-I%3o^H7Am@}{GhmRZjM|1~WGOd9 zgJdh82H@44SH2$v^Bm=z#Xw$ACeu#mqH^kXKrSg~e}=Z@Drde&%k5?5N3;*mQ|A8# zE?>DU9OR19Aq5r%$}t*%h00UOuqaZNJ3v^h+;bLOiPDksf>LGt&j@i%Il~xgJ!R2~ zv#ViVq5PKqO8gC_gc7exrSt!5lzQ?_lwBi&cl@u7R5WY7%pQ0a)}0o%*YSMd2*xuhASMX8~E zTC1{|wsLLCzbQv~qWqYqsdnYJl=D7S-k1cWLpkj;aGlEXe?YpF<-5?_Zsjh@+k2F= zsqWLO45!trPuV#aZRuC;qG@$NncENHpi=7%pU;%FZYKeKuFSdu<&bhMB_PAfpXoqq zMCnhMQDy!ukTGTMG3dsXK1B%lLg_#uUMfpH!M#%Yb^|h@{LdWRq_XM~h`aq6TBtni zRkXGDv=6EV*>CSpr7SP|{Tgrw>|>_7fqL7=QeDr-{xjN7`r5}bLHz6`)v))sm+yow zz&`&=gb1|1b{1Ta{Utj03%0MH4oHaooXy}u?f;tvF3kQaedKWa#y=s9uphn$yGVO$ z73`wyZK)h{(Efcouru0^o6j)jil)qROQe&E8}{{eAXWBX(n3&UpE(RrtvzNGOjq_B zsJQgVzKLqNP4-z|1JZ0CdkoxT`(7&Pw%EJ93t_AMP z`3H96_NO|*y|8~k>-0-|emLIYEBo$Oh%jNl=wIk2?SF^|aaRRXY12dXMm2PvstZmK z?pJxw0q3Pk90YejwU-W5eN=1LL+Gojrcv*wy5~msfc#Y|+Uy0Wwy#3mK$RaoOOR@> z5r)Ak`|XGus#^H}&6lbs30$};jh2H5RRN{kk@$-P;G$G-z5~01DhK+6MwRn_Kps{t zrgNDisyz`17_HJ!#VJPhZ6!#osrl>yn5+qf10_Dc(r&Sjy zSvaGrrF<<-HBR||x{C8A9l>O%`c}jDSyibeFy~Z4$}=-nwp7i^QvKo!VYW)ELEQ7I z_d+4eQ5iDe`-1AA351ta@63fku1e*O2feJiLaoSCog0SFe3fi3bXQcLe*>;SWk&OO zp=w4WycDT+BgL9Fy;#LH2J%fzzkf3ZhSyc5N?6MQ~HCdKiNc zHL9^2K-Q`*4FOW8`e-3Yy((`4$XhDbyMWwQy}uL&4XW!o5Z+M@aUr~`@>9U>o+{fo z-wH)l`6+OXs@3$F9;uen6xO7Y&@oiA>diMnT2$>{LD;H#-2F zKByX<3ig@mr5fIbR9ec5hgJLHz>TObk;SNL?FP6RQ!QNvGOh}t!t@K(Rl4r`Qsr;# zw8HHA*=p!K)V;66&Qtx55oEu*We7qqwHa-}4yX^)4@JDy2TpOB)6M)lS;z#LL{%>(4H+MSB}N7U<%fQwdRHpXaB|4F-$SoN(w zaB=EYw4;hw%U=T|LA_iEFGtnuXTSLtr`69XA3vl1co=qRYDX3z=|I9DL;Zx(r?cvT zPJ}q8p0gJuQ|(d)U6%UIKk;U=)vS2f-B7nt1-)Kfw(&KLqPyz%=mhA#I-hn057p}_ zZG5Eex()ls>c6Pm(4zkI8n{;VCfXpisTD^ce4;*(4Pm?b;kOVzRhQbKF&*mmZ$LWL z4HkfOsrRh|q+2b#0!WW~9(~DP^{a<~^r`1yF>;&Uul{uplmqHF%OD+88(#zWO#Rgt zfIe5Vf*>4HhxWtUuzKo7G;KtEIRe5_^*jY2W9k4pd>>aIehS?SbrYSFzf}MAD}=Aq zVp=FB)Yp80oK!ES^vm7hJS9UO4qwcH&@IT}BIUQi4s(0JhB*BD0WhHs_6&FnbLcTZ z81BHNx=4h>cDhUz=^)Un z9NHvCo(R7^n@b;|+2IwXb}bGqlvlSoSe^x@-C^be2%kCl9EI??Lk%U(LkFSjWFv%^h93oTK=T_->)skJWz;^JnKUeXH9pia{4|Om zAoSPN4!}!*Cio;spymTd=z=s1(gkb6X;g)1F8l&#p_&SsCBrnuR7?xkm^B#rc2j1% z#S}srrRkc4?}M6k6yB)WMcg6H7nQI-ta*s z&CL?%;x#q@0GXf}nF`%e&0)Gzo2Xg)|MXh(Z5SZQnzH>M$29>q@Nz=)i(3#PoziT` zgJFv19Xj?&)%+U(a$1v@4PBbXo^q9R&C&*t49yp>LwHuRo2KVXO|KNfEX{i@@RqG9 zcnaNlO~Ol%9L*9Mu@^K+w4J`F`THD@mo)#|MmWtl2Zg4Q!q!Dg-Uf*ECZ8 zSD-PYtxloF@i%Z+H3OrtFVZmn1y`)GeFUyVb9yF7spex5$TiKL@9|2@HF8?YuWQ=v z;jBVqPKBHs8rd#5tI`U%G^wWGZfaaJraNQ(()>lgm#o*A=@H_V=JIYB z-qxt6f@{!hqJ`j&X75&nxU1R7hVY)|#5n99X!@4``B3wMqeh5+I=ttLciX8)vfGcslYTPQt@|jDum+OvkXYimEjz9Fm=?%wO-@&}n zamhBcqRO#|((GzS=h@KJII3w--Ea@%fUXD4jXd{{K zRGkTu;q-|RbnF%yhD(oHEPlP#;LP(@_EJ&pXXF2FpyWMM@9E&38IQ zmFX)^E9tQdoHWBAg-$c5>~Pho`5nY9a$2W^d9jnFv0sK>xsx)>GACzxzvWJ67eaU4 z>Fok=6;AiRhusaQbh_SO>C{Ju(^XE#zk{yE>HL?lyXo|TX60I^{LcWXb6VmFNWD|W z9FSX1^DY8;+sT}=#s(*^LU4DT%&wym_niKt7kl5y$#x&u2TronU>`cIvIVr!$=eC! zkyF_RaN6WlNy*M*C*D%LycVag=~c8kePztGH8I`sj4rfwIE~Vp*5&l$AsBQ!O{F=n z$LX#&?0TI%)ZqG@GT(*IekXHlKn9!=PQY%^={9we=T2|XyBl&^8UQcDPLe$^7;(C0 zj+Tu%-HSFVLdR}km`Aa}j zoWpOxO}cX%?c&cme|!<!z%;%et0I%BADR?=#6(>Y`{khRXabr9A&&ozVa zmh(I@BHecW{Qz_g&Wzt7yyN^vFNAlUw^PaWp7Z;C2zcMQ?>cl3oWp1;dFY%(^@2v{ zC$zbKlt}aK6Z|Ljz}%eOKae*)wzfEs%_3Q>6xB5A2Yf;PFeH@ zXE{Q2I=^%<#ya9;GoI3$KIcE(;jZ6VdIH>lbNM^K3_9n(0jJNLGuOe}b7!Y6cpGwl zO2x}z=doxw9dZ7n6lB!dw;#eW=d^J^#+@fDVE4j#7iH-$ogef-_{y2l4B>?HAv(XC zbWV4HPj~IxMyV6FwH5S1y|f8*2jPI$<~nrV+7=U-`)Et!;M!Mf#)QsKtJwyfzjpKt zxB%_wT5v&H`ye2LwfDLp4AB-EKti>fJ^~5TK8S{SxHgf6un}7A2)Ib?J2aT0v>(!) zyo1`?Ze(H9x>AmINW1$dki%Lr9nc)nUZCtGT05f%kQnXH^Y9R{+Nm^g$7vfEfQ#48 zk%LRnE~R<&sP;Tf1&P|%>tTLO`^$T9mZUAG6XRrU5>0)_wNrn+zxN2wG(&1ozb4AqH>yc8fEh7+6Y?GGPHO8fc;tRVN2MZ(?0(I zPBXPXUWGxH_TD3qY^^WV0MBa`l-=iOt@SXtpq)yq*ClOy0qk~kE^HuGVb_k2K&a|g0)~=z(lxPd7m~c&7_cwH9 z+5oaE*P1yX?sYAfa^MQ>1oi40+IK^stJH>E0jbh<4^P2QGpe;OcEG+yJ4|WoP3;KP zhHJHcRKls#E_DJ|ueDtX-7W2_o8WG1zrPM|4O$f)wcXL?8WZeI7One=a-0X+jc4#^ z54G7wkVdUQ2IM1c3Qhb?TGNlw>}G8koo+qWR^9=mMZ32Ix>oJLQ#7JY+dvhKC)xyK zmv)Nj_YbL8c4_~94+h=Z%5C6!w3c*o+^hAIgY;<^ldxZ#Mq_zE`&S#x2es1q;GS#$ zy9~&XcG?)YVXcxr&xp1w7LZZxf*BBwY4g_MiN>`XjC)*gRmgiPgp=AN`h}3Yi-!8W zhs%4Eu6eqw9R%6$vU@QMyj(;nAO~E2wMGPQmrm*jJ}&KSwA0t6V&t0F83lqj4r|tfjs2WN^9<6m+iJd9&u5w1c`R>{Th%MmkdhGVqKnW z1{dezZ``HBg)Ry0&?{Z$?!t3cyY!jE^-Y&O3LxuTCK5nyxkMUMbyH;Xj?vjdmrJHQ ze0IBB&NaT_V6xh+fKJSwyO>a?9CG2Afg5)DiMrv4%iSuFQJ0TO;dIQ!o~m@?E^psP zLtnUT`xvcw=`xQx$14|WN014Z(H+oDx_q}AA>4JhjzQ?5YorCnQ&+BmftPOQT<8wy zqJj|5TetXiTDE+2i;Ni#nEt<{p%tKetc06DofB<6gLGS>014KOQ?)Kc_cqnSLUnI1 z0whc)rHc>Yx_C-MB6Piv0g2RQ(6x;y-DxVT9MsL*0%Ft+(^ZEY=-$tEZ*DKv%m1T%qpf`yfTSs!+VFV%-S+;HyLzilW%a7{Ng4PMH0QAw~X z*WIPu>ALQcnm$W~u3|dK4c!lvbXDrC4}etZ#*J`VtqY(uxJI{|ss%T7sg&&1>Y`SF z)ago$>5fQoYu5qNtJ_XTdVRVDRxt0^JwFKHfUZUdyFs1!F`mU+zl91^0s5;`pbOH! z?g|p3&v^?5VfqH@p%MD`eISg|Z=(6#sQ0JD=$Jm49zIDwG8Yk&^{R1@?HhPfmmIjNWuQ?9=qYzd@L;FQKuYq0bG5w{!YE6e3f9kj7w^ zen~q>w*ESmLvr-f=s^8~es4Osi~7c|(d>PCDR{c2~hwfZrd zG3)eyZv&~p9$1ZO>ZC4Ht|{RI!$_34LbE$G+p{{p%Jz4I!NLH)*^ z^WgiLKJRltpX(pdZ-R#Oe_Vpaus)kMG$Z;J>I$QJ-3wTZ>Ah%j9oH+qNB9@|gLKmT zQvcyI7`)O~P_8+lm(cm*q<*dgknRR+>ZBfqAB{0u^y9Z^aCjS>Xu0t*n2KQMYxqwI zJ3m8)4xGPXCB5|kLms6&frc}4U>;-$sfI4tpr)KH#PD$hyo4GGsK69vu-*q};fB#Y zFo-a``!={p!%|8dqYQgEAO{Vvg+XUDtiW1^smstt<)*`irZ{j%3@iD-L>q!9!NnME zIwE|m;XNw|;|zA;;NlG%DT_!j{J9Nrj~bk4)17FDV1OJmbUp@2GQ@TQnQT}_4}aY7 z+YC56VX&lQ-;;)Ul#-k>toiH{#7!}9<^!5)P|{C|P8+l*HW*DzGt{NRFx{~7 zBfQuQ!wez!{Vl40hPCF4evyu-F1f8J%H33_Vt0>GVG#}(dUDW;L#~lDuN-!5`~%1%uHEl|M7y>eN1I|?f28>+)^&WovDtt= zcIz&niLUEu>N@6H_#wC?S6Kr{vg@835FU3ubPa|lTo+%2;Yn8kWu>QF=j{X}#q}kX z*i&6Ml|gvg^=C?#&bXFRi7w66l=^MD>mZHO3|H9;2+z85=b(k>T+h-8ai*)m?KQZ` za{ZNdq1mokVpyDaJtRiJ9M>pQKrgt?^n&i9YunFobIEn-DsZ{3H7y{QT?f{}AkXzF zE${iR$*th7xSstOq`>vSRtO7S=j}t>tFDE&Ap9R`?;RKA6|DR zNiTB_!AFJ?UPQ z+rOg&xnW*Fv2bSHCrIOZ9h){QfdFnk^VMAmHom&uy^b=lnYeb zzdjlkHTFBbVNq-UKK0k@?61*YSa1LQ6v$os4<#7B!G7*^7~Hduq0P6^UReyT$^O?J z&^6nybcgwU`$=^0ti`@{3xp5sot}cU+Lx5VXPf=Uk<8Z=oOXLh%1Jxy%fE-kL;JaO z+N#t3x3}Q5%RY=2rf&Od)e!dBH&V~0*Zv!-v^=se&%$IL+ebQqdtzUmY@O!F9LZU{l`{#XN+!Z%zmGn@&HW7w96(Qe1xJ&V21%$g5zr2S@?NJQN z#SnWHf=CGWDGC`t?pLhRgLo?DQ&GiB@!15}c`Mk%AoNlAQ#N-%ahsk5U&UPq*!d|= z#{+Uu@yl+ILkc&SKu~|hyRGJaO!Qx8aj zV%J)jCo0xjA7UWaou|O1Dm;gPOjEq1h$UU|wG7DfiZ7`Ak)hC05SXd>I|#Zgh46C> zo2~GqST0AA>Ib_E3jSyq43CGF`Xj3T1ARKEb0{B3*e?+k-ZNi-BpaIhEap!rVhw^iqHli8x?+jKsG6A zs5;iH@Hh|1eTA4#lC&s_>3Sb1dMWU4Rg9)?Y@1@22?p(oZ)XA7p?K>D`k{%3iZput zIu*f`FLxp$r^vnsVZXvL z8e~8*VhH9>75ksU;F+R`9^B`O)%4Ym7mAOzfP1MBCu6)p#eFRU?ZsD$&1EngQV82% z=%!rz4wUXn0iE;qQ0lgW+o^0+!rLz86KccmR_bWE*`qu>65jSIN7LiKPuWkY+kWMo zco0uzWD<~G%59Y0c`LJWAoNkHn+KMG-VTV)YHOxS=mob_$$hexgb}SH3b;2RM|+8#Wm%R^m3Oe zUr;CYy3&6=gyqT}iurFS4{_nMLixnC4APs*BH9jbDOcD-d0QzA1y`wT`~sLN<^5Fn zzN7qgF1Tvthbu9Q8m0ZuK-MZfo`TdVLntz?SI+GQxvNaQ3-bo$0xGTEQ&!XW%Nvy$ z&*7y>sh9#tvr;-9ko(HTHdIe+Q94lR=YevBEhf{dJU|t$Hl+{!q)59`Fb>cTrS&%$ zK2(NLLA+BrnI57pWpX}*-O84i;Chryie7t_4{5J>q|BhZ_E?!;3Gzf~+6~gDoO2Q8 z{YuRUa0ANbeufBdi}LqN82*{^1FOn~IcAz|9o)Q9`qRQSq-4>NBRAE-Z(-rC+DYdj zJXFDpF}0nloz~NO#)LJ2r7+m9x=SY`JyoyKn(w7LKL7)7m6{4FKC1C_V&i~niYKP# ztLiuh&QDdf7{eY^3F5#VQl*!I^H(`efS1Fn;TvIoMD-)J0RmJLzJ$)IT4sIAf@7W6 zFMFXDL>0OjK2NCj9m7DODg))bVX6fofP|}F!+)HUs_*GRk5H+`fs0fX(zylSO{dWdIL0w&xf zs8(99(VV`dm_1chNH1ubDkvR>>8h_O1V69hT!7OI)ol8HV5TZ47Uo&1vxP9oR((!& zjvUo#O5!f4PN-m)tBRqz)kRgzI&gWa_T@0hSN-%kAO)&(^jTk0^>blfs7j$rDpJW^ zDXS<}x$gp|L^baOq?c6=RD`{vn(Ghls_MPrm`thaP6Eg^RmW-Am#GwAfLvFtS`1RI zN~IU{hDu0Bxhhn~LU1=#%j_|kTdHAn7V);qmwJwss4La^{qgyEM>wtH&IM8y|HXCD{kmkC$0jF2|AFb@T)uQXiyn#a}(1;<3Z( z66$CkQ3p_x6rf&1NBFJkD-PfS)xq>@iAUAWlL0xVe%lvzLFz%erN`A1C&PEJy5%w; zA?jb~5jvrEjDTIJ`V}4Q4O911d>^j9MfKv7YQ1X;FcIo6s1y{b&U44SPpQ3Wt&UQs zxWHSq+K);>G3sx}f;+92QtlC}{;~!Jaq1g=;LfOzQvD!a?KK~ev+4~R7$m6uZo^rk zdNLu;sio!6C8@W}0!dbvt-~x*)aC7Dk*cnzV@YZ1zv@8J)gNw$#d-Crzd*WWoAq;yiYkpg?bzO#=mZp1OZBHHb7IiDNCLXB27eUyn-WmsCn>tzwyLR=A7a$$#;~ubksJ?O?kWTe@ zT0FYcb`&{vt6iuB-lINECqjDFL$kp>QkT;L@mSsLN>zj>>e|0R`qUy1SoEs}OE8%M z^=?{@pQ`uRgL|e9FvH@x+W#X6U#M$nv3se`q^9todd9DSyiz+X0ym@{$AL39%{`i- zyJpp7a2}e3zhJOa6YmJ~U7EN*FwkyI(M;=kXNJgi7Y(>ivzcP8{h9?Pxbf74QdH=r zQBaKMt$ED~3m?s`E_gejIZv17t1(f#&`)#eZP*>ubb7(ykY;Zeh`+|z0K3DQJCx-f z(X4zMBtT>HK7>}y^3P!xsQEkxc1Jb$RE3Zp)2tkX(;&@D3TlpPF8Tr!tnvQ_x)9A( zCWI$64)g$pYIag=6Q((F8}{Lv_Vv)6)D#_rFhaB1deDV2MQWzcAXd{|09~ABskOuf zE8zSl%py_q=rxdYntlabCu!<-V!p|mP&#^+qN)2Cx>QZa9k@=@#IFUHt{LVG?!2a% z2WJ@?4#nP?8edw$vNV%<&}C~1XTm&3bBr3G7c}gV5aw!zO#||x#!UNoo~B)L85a4P zs#hQd8Yk;!3z9}lI-tdxVc9S&(WDMRcUg0sUbicn6nhMRRZ~m3W2xr1qnPhC&7+a< zR;I}#yX%_k(*P;g9HQjyhNd|JT!m)M3{2*x<_^_^ZfQo5`E5-Ty{(m+erh*YX~t4+ zb4T;$+mzf_YqsnJrbhFCmbF^V)>{zPX+GZ$`+7~{R;%3)SO~YI!m?3g8UbmO=55N& znl&DD_Upc8_e_u$&4SS&4>VJvKw35XUx&9g%>ace?V7Q)?R99}Z-aZNaefKXsVQ&4 zHFar*1{-6!xqC*b_8>J3qizxND=FlJmTjnsB2<3H$*;H>Sci2H? zh#L-XZ@};s4*irA+;rHs0t4Q1sH1YrZHGnl!d5yQrY=>LLm!o&?>N+d3R3Oh(*j|Q zgE9loY8`qTKlV! z28JyTdMZjka9A=9q}5^cD(KoAK1l~@cZjB1S%<@2+Poh+{P6?4bUHl$6}m150WIU* z4!c%>^f-jQ1=qa}G8;f1J4j=guZ`wBaoFdLi|KPXx}{gMY*r9@;ZC){y0l@visz zfbP?tehZheU%NC27M@xamDjwq%g=*&Ycri-=%cNg1K$UIHXl?0n%T)M+3XV+UN8>9np^Z6}kYelL$zw_JA6YKy4rSJgTj=&R@acx~?t) zcU-%7HITvDk7@S|(JmKZgcI5k@!-O=D@x%kT$`B>g8Fh9+T1BXW@@ieX(dZ5nGRvLc0JXVa z!ClZ=s9=(-UF8h!qILwWK6%=i)FRKshMY(oU5x5)LI{Hdt zg?64b>}Tw^jB40dYNP3StkP~sg3~+N_vv&(wf3X0A*|8f`w3jFRyG48)M<;UvQw`e z`3;Z_TH_jU_q5;A0@bK}upL~JRzrH zJVAVQ-`$7MPj_`1oE_BN6#{ukca07^`s?z2FzjJn?QbAQbj9>E2IyYThJjW0r*-98 z=CJQR{uW%2F5@Y5$8}kBUxRf&$}!InUDz#nIib5t-TqKrvj&hb-4{l1Sad3g}Mhwhjl0(v{OL9jyznc7Mm1u<&)-{o-}s&<1%{7fXHQ1l<>( zLYSxv&c(3jbU`7wq9k4LNRVV*5e3dEx<)Dmr0UjKwcj%)xN>|T%+}?pV3(s?MG4gf z-POn7a&_)U!Cln#H^6nCPE6m~$k*L@7X}5o;j}Sc(#27pQK*}j1YMC%asaN2bv4wY zDA854gS)Kz)E@>{bO-5MMptz|U4%iYuAV-XYr1sTXkf~8>)4Q9*HxYXSFRiVH^>d$ zJqpGvbUR05q?@`ST9j_-VvfPhZJqx^Kq_^s{s5`c4N^jNN4K1UglgReI;U5o3qA>5 ztxib`Wt~nH1Fl|oi6W%Cx=*6vr9l_qNHx}bx?g_>Y1GC2g#nv%1+*VG>u%UteSTn! z|KxrxlLK;&hR#~c*W(yl zOf8`Oy1NwO59qE?-}0&MYpS(8)1hdNCtWvN3+{!^?i9F}x;JQt8q{sCfwxz>{qKSs z(!Dkd5I6mP3OC*L6U7jE=vh?2-KpPB0p4!?s`(&$^nH{`?bSQeK>PIJE~pA{_Uk8x zf%VkqJ%dv({gziT5l|n!oUZ$T{^@e)eD%xbLFcF67zy1WeR33p{`%ef06DBz zpMvg)K8y--0eT;6?P`4A$L=~N6QrL@PttMyXHQ`ltoOVQE=2zw)s}IPF9(oN{eu{T9j_qVye4fQ;4$`C_0LeRv*xp4M-*uKW?d zm>z0^!CC#nI0zHx%x?J3wC557K8 zy`}$z4IM#HTso5fveTWl)-hK-bxWdz5e26 znBUbud>veaKKX0t?&$}pp4F(AO#s)dFB*XPef?}}0Zn2PoqcN8pQN|1L%-hvb`SMQ zva$|t^O4>_kMd)EYCE_m`kDWn5zz0i1EgPn z+#6&-?@k%aQ~f-;$wwWfv>S#vW_^U~3w2!U`VH*E9mmE&8sWIX2=0`logKVIJEnXI z!_$r>SD;IEJUtaRJI!%?8{DKj%H~3N-jPG8M26#>F4$!{4y=GK%dw~f=Gl&V21t(M z{Z5bzjNuLVyi&*bk6?Js@kK1SGRNV&U{LN@K@Y$U$NQ(Dt8iq|+j7(KkM}@sIeP4X z@V4X4z3@`$D51}#%5kD~^BN>1LWbec=kS(gkW+&s+fdaC`y4~q$8--3%Z`HN z8h+sbdC{P!fG^K5>|=2GhCTE&78s7a4(^g+3%$XGhQW=16d6VggI%%V1%;a>1|Qn_ zE*r+)w66P=DSF>PM;xvhmeW@y$_zhH;rhDa78}BH1Je`28-^^p_Z5cboeK?(X4+;@>S54sSV5iq4nuc2>>e7JN{~)NrUb%ngY_j0dJJEz$Gm$D4Gr|HJTq*ejp4bWZUL1xUly`m5AJ|*^BQozM(?E{en!i3AP*WDju`fkv6o_fe`A*ioE{RuY2_+kr`CyX*P zEJBUb20+4%S1KVqXR3{l1_-Y}0g3Ozw$jQNLP7i-Lm zg)YvRMCTvQ7>lSw9B*9yH^^Dz8VdXpj3Rq_pc0L}RQx|@TwsAkl5w+j)&~5Z%w*~% zr5imLLU`U77y~yMMh{9PGL2&?*2^-osi~W7?4+W2j`0fRC>M-JZE=HgjYbOjE*iUE z!AqX8`8`1Ljla{PQ(*k^7a%VgzqI;o!C&xT(b1C) zc4fwq;n0;E-?G+iVNTIJp**C@*hkIAYGc!Oq)B zM47vf(~p_3JK*%V599edU21Rz>*sWunj{CEww42P$VoN{N`I&5OAsD*su=;{5vK#M z!)bt1*$)`d>U7@)xD@G3+HTWGI^(;?^cl5}_nJ;w?`_6L)wUH7FVoO%`1CgY zXo9(qX>S6^0h14<)xM??^&ozxMHChsG$}vEL=Tx{6r1{+-na(gVN)d~v`0(_Xzd9w ztxSc^YVuWs3pDj;;q0jC?M^_BnWl{b7i5}B+s<**4p$SP!KM#`K|)N6TOmDR`l}QJ zhMGRLz&^}0hf?Qo(+cWFo;3YNxl4rUXDTM1GW||ZK$J2ROy#pdPMgM4 zG!tv8q*yV|bW#Q38B^0P+_ZSpL`n(In$A2O4rziZpDIC#rjQNb&YAkgS$qFREPt9- z*)-FaC74vY={rhE&zpXz2A5&-ufm9#rZ##TvrI;+TV$Iij({%5AU4SewHBnG}$uytZUPYz>iVKQO^EZK%m<+CKFyLj=r?bIc zF-@h@$yZH%^vegOrchcXubF1P1Fp=pj{^1UrUlfxC^voEgOP5S621hfFa=X&c++%m z0=Qcy?{`3Mo2FB9rOI@fBBnbgKOP3EHkHunfErWSpU~BsmIk_l)|sADIicRvK+D}- zlgk)j8cd15!s4Fk__yF1O*<%&YclmGz@XW5o<5TMrgPMTYcaiJ58(q-?{q*~O*kCi^@Xz6lx2YQk!ku8U>=*s zeum3_VtT}dn?6&jCxrc`SPIbwOv|k~+fdkfk4`ZSn)<>p?N_D=nLrMiR@0N{X8w|X zXwlsqu@jt!c>*ndJI(P5OlFt)4GK$ko98vd*&cJ22zGnTi>Tz>i<12ovloSJ56mS8Fo{;P49Rbq$m~=8Sqsd(9W=wS8^nAqtg=4&1uWGrsnDVI-RHVa%NNl;_a-MfsuTi zm!7~Ze4W1u0@BaB6Ab|CY-rDhS?oF;Zc!(j}Xgohp~t8bI#2ET$~1+GUmq z1~o2^>9?P1UCfO@*14p=g0S9Yy9|)KF3HU>XmHUuL3q!F&w|fJmu=w~x5*`d`WekG zq5?V=ci*Ly4{3|bOKQSBaM|(C@@`=$A@s4-1;V$lU@5c*pLB9J4N$}oiEaT|>X_V#t1K^@94HTcmSawjxf7-H`w#`^ekPaL>&hjMJ zI&~Xk^s>4m@RMjMmV=zLY^NejlEugeHrcXtKK!IuzP|&KYMDTxL7K&FHZCgNVwVQU zdCMoX%4b*_=>^WTOltwjvK$@@l5M#iWewZLkXxeCz+SWzDBwHKa$y)qzUAzfurIKD z^Bm-oW!5A>3N3qSKP$3);{{S|IqHXzN-Q&HVaAs&tp|X-VtI$M&#RWp>4214KD63y zM^P+$9(3iFsTDVAfj12iaXZ-&U&!~w0v;Q3YyLRbn%wl~WEt4CACc)e0rH+vQx~UMz-#sW5`Qs^h z_$xV&BCoAYRHxmpR^tC%{gg0vXEafmyOYuC46={0O%IhPV>FdEeHczJ0rz7p`5eL{ zj86J8qm{8K7Y>gyB3-}*F>K0V7s`nJ0mw+kz7gO~Gfq-)AItc_3=+q9i)x{XpD+^Q zK$92(T5M7n7v_MZG2*Cjd7d$%AJ9z3r>!8_jM3C9xxg5=0^}m&C#%*Ko9<_{v6eDQ zKf_36jBJV>%NZFI@>ehh>D22j#&o)tN`@`1>30}@{kShRjNe_r)iG4GDBfi(reiwy z7}}LEXks`wrff%8KQAUwuC*#NqaNUf*tdCrg+4R!n2N)|! z_>6IiLgg0>ZVY@5GU6sfIK=qw4?x_RCw76`$?Q6Y5q2}5+F`uC%qJg$>}Re|1H_B@ zH?6)t%)hq+>B~HD3*;cP`!JmOGY?S<;Rv(R6XsTCDIMrO%6!k2jt2!X(;R^bW=^L% z?Fr@=Opq|<>)!!$lKK7+EFzixV__e~Ttmx!40AjWcCpMTy02%LQGFQcEOVPZxJ2el z7jQ{TYc>p0m=ej0OO9DJT<)=|+ulR2&fUb30O0!n-@FaTg-uja8}9unby5K zOidZQ)H65J3(~;cPzPZnv;BQct(p1rBKo>Q3-jAf*tar2dl$-fCi6XT51I37!F4gK zsKnmGlu={s5i|H(4F81bLcwA`^W{}=&zTZR+Fml}l>+jL=}foFjg>hPUOZThG~h1Q zyOdIRvP!pM7T&B`JRp5p35cKPat^YrRDtnlt)su~b%Zsf0@TWyxf#&otYE6Ags_?x zVWd!2XCsi|tm_KvM;?sNUF&E^JI`Xh2WTd1*;+ueSWjc%Jezfns(m@E@$?esvp(;G zu$bjL6XXhOmKTJjtkJYo-C!-CD&bAm_9d9`ZPv0b3{l0JN|n57*3m}jYFRhmgsz^Y zet;1gSS{VqwXj--KY*KutQxw*U96TNV0u_qD}N{6t;zJMxwH3BFMlVyhyw84>@;dg z>}P*TnV1hd!X2DH+n1sVD?9NZoE>9JIpB`7>!>v!!d6!R8OmN94`DRhO6mJ)cFPGk zi(}7phA^J})?{!AY}<1{o@1Z=6I>Fz?rRq)liA;df~2rh{V`GoJB5T<>?}vP$zk`? zPLj)xY6Qt+Z=fbd0h<>Lu8`eB;YTrhlC@_i{%YF%AsAd|S5AfS7CUYlNF`fLJLnzu zBFczr*yH!Xu8!SKIm})5o?~#<%szSxTnpQ0K0b+7_NIE=rgruRw2eMw|Fj9_UF-st zb>%MnF@U9qAnj*&QG@p>JL!EWpR--Kuz1N{^*(g3*gkKAxN#QHOX<$p>VWIr!|6{4 zav!Id-dj)3Y%L((oT1_14sbrF{L_!K=mwC7ICG{!cbJn*aYGd+m%QBJjHTK|HRr7B zeOT0UwoyrfFMIUD}eXC@Ev&amC=bU=#7`)_kP+|Hu_X}DK>bP&u10>1D`wx(08__!JFS~IQ z#!|SJZWBX?uFu;PQ;MBo^OOoBnKo@30KI7A;{g)D8xX_kF`h3y@gY15Hb71|Z;%q# zv%J2&;1YOJii#6?$ z`r(_0ycxs5b@KX00@B4xqm8+nSNInUdw4EV81(Y;wpmB)WsG+%Y=d-w7tV+DDKCx! zooBp}bQ7QRR#5iyf)`D3|4Uvub<75NDhiNZ@%Gah&>`MK`h55DTPTn9_W^m0 zzr`ElRq%)2fx#_)ygzi+{Azl`YWYtxK^pjGS33TCkMBweStEbir!Z{ck8TFn%1@`Y zx|9FSWk7ocx?;GA6ON!X<&5zC0*o6k+(fU~S>eQJcu5d?QdK`um}>%ePH3bDAxSu$ zqLO6cdvxe7MW~}*d8&{(9wbfZe4Q4bbfNfjkn_S)+Wa$wpL_x?Q`ks_sw`o^NpRW1 zczV`ygwrWhy&z=F1Gy;7BsY1&2uhang+Euppg`FFF$^vVJL;h;6kee|SdnlsbsCC= zk$XW(g#PzIE(;Bt*`u*X2+h>#xGKz|+g&P5%>;K%IL^9pKV!^@@5S(TQ&`yqa!dG$ z3A!rb7HjB!#t3mt7lac=Qz$<1h&6vd!|_cy-bgmuZ-&RePWk`NQt)3+g)~d&!;Igl@t1({ z@9bPF{(XNm{kvFA+9fg8MF$v~e+Reucb5GBnk8Mj^(-*|$8m8R*ZDG*{p(BguP^a` z`TF;B`9J#_{-4+IZgL1_Io0(9{+({Nru#9bF#Ch7O@0jZzvBr09S8UGKR+%J%~^Ah zvHf4n|NTw1{m%(as|v+bW;_kErXFHA|Lgz%>RNH%I{g3p@%!IADZlHUw7=$@<_1%)40AA7j{V zmOu4RdRPc-vFNj`VhA6x8tIVRW7fbtjNZrEU<-qOR`>{tSO-{FB4F{9rJ!!oGgf|? z)$SMqoH29~d61Pvi{mR+RWZmAYlz|`H+BPUMegjx*jlu{%?Andc9bjkaVBp6N{{q}WcK1I& zN_>cY&L0;3>^eS_N7(OC3KhV{S1>3FpG=WaAiGrv;Zb(m5V&LPwjaWKrzteee>^Hq$N_!`?`#;%WAq zbcQ09?LG@!9Q#%)oSb3XQc)?MJ&`uKv+NB9KoZzqtD#F|M^bumj{WNpND{k+2VF9o zcNoYNw&h!pRCe?m5T>yczr(QU>~E}Rf*4}g4e=0WvIl4z&0^1?T1^hScPFNFfnE9z zkhyFb9pJdge)dF&c$)a0{oQy^Brj-#~x68rb-7`BjI^({yddoiV}#q3o2hC&JZ zO)9lsW?NFAyTWcG}+ti z*z;<@-DW@Lz@U=d-2rlk{SlR>s@bEa15(3YIt^Sc`<-%JQawAKvZ=f5PhJDpz`jPg z_dWIl`hsl}dw^1hW_IJx6d~VdXH3SVTG%rG+QSoE=TV`mi``3ETsM2eD5!ea;UyUT z5qthh;2*O$+Jih{|NJE&ee5oJH3ry76)7uuOf~Rl><{Sl-E;O1BakoIXT1O!WM@W0 z_=+988r%^34E6ThIh!di@!)()b%33mm##Tb?&9qE9_${DH^oeQIV0|4_G!Eg%Ou?Nk^$#5uVboImH}LXabzCs`OF zfYWgk=2lcLKms{`w*h&K)Acibc0rtEst_ON1pEMKFo*LM?%D~CVG}T+oEtvSg>j;& z1r^R2$b~S1Grk>mk({-D(4FFV{{~$YN0ABNF`P3LDW2wxrt)nprw+>%CywKo1z|i# zLr>#b&M;pf6F7xD4oVG)oQmJzEs3+L9MWWt=mkg${-h&FDyO~@_o9^JNtw$v&h=U# zt2y6L&G0T~Jgph`I3E|nX%i>;d+6?SbaZ&3mvfwIYmYdlUx9qgIXw)Q^n|mLGSWVd z=S3LwbFLzr@qZp5a1FTw>@&_|8N|;y?He)U7o1D9Ougi62>>_95!0#1SDZ06Kn`(2 z4#BG%_xN5+%ANZORnVO==}rhwa9>e5 zA(UIO5hRQ|dL~?lb0;qZ@+5Z$RjVSnnY83Zayd&e?Ni)MQrJatL!JQ=%}sViMV=GG zt)hJOG(uP4;U2RASIaF9hnG68 zdk#jb=YHP{^SfLVZ6Xca*LDMPk9*=HjMvD`qk?!7m;WXVnz>J?S$3cM7wwNN+@Kv0 zKH!F1+rk*bj9LqH9bDTWkcZrTqha336$HR%7x%MIAnfM85Q6k@wOcV>FW2XNaF4jA zZ9qQeR?P=_!Ziuux{sSr%W*%qZP0(svC-dsQv=-#?#wJWd&&LI47)+@s8|SJarg6q z9O6bhU@mSpIaGIdw^_Fq#KUF=wK8_vw7Y@ZWmE7m40hWDQ5LqxW;vZ)+G{iWCLsH4 zMq96kqZ}Ma^YpgKXvaW4HjhhSaKPq0+E0CLR@-49Kbyr07#y^jK<$x3Hg%_<^S4?4 zHppR{I%>8YvDy0qkN}%wt>COSFMfivK$~g{oE^0>(w`qbW^-pf%oATJpk% zDTn!>&Eq!chHMd##XdT^Yd`<;wB` z=qzvPB+Mp(w~vahiM%JY^q%9rcn@3>PkR_9$vl@IAxzo%c%RWeo6UQjYFs(IR(eq`@V3(t&|Kd3h1-F-$aAAN zG>^A~`keW^52@xArp>yYFEP}ZQpJ~lK z#TYhXG+pN&{xIsv?B#Ez4|gAbu0P|%Fw6Q1;Jx`iG(jJJu^i+8|6L&_;mf!A8=N2i z^C!R`Ig^xf2SNeD?fHW#tGy*`foll#&z}{ zFv0v*YNLhl^BQqKPVk#4cnRh2IEw+o_!&BI;ryrn>`MGK)LMw(XHvsIlAp2+o=@?W zzrs9c{^LT&7$*OP5zh0!UjSzr{4Z%W$>NXCftPIl?Mw)B`16d<9y#osXpcDMO+rT|jOub^nEiofM+ zT)`cFD8+)+`~{~$YWRM1BWn5Es32O$zvS8iTF;Mp4dgEWb|^>#f1wtbd;IQUaEj92 zco;VEhel(-W9lK&pnXb1Uz`=NWqU%VK0L;Tu8 z=-dS3X#;QPe@=70+kd`YGI69WI&;WJdQ zm6pRWL4*TF4HvAZBIij#A~nP#1ZTPdi4;Vv`VjP#pq{d{C_&^*SVRk6ID^Cpp8T_% z3)VSez*vD3W$kf-Ycqg6BS@T&0pkS>I+k-*Fg*jl69nFSVV5XaLoew$LHtPQk_2(q z^|4q1^<}U-FYw(4XBh$}#gkcrKNK*?7A&QHc#dE)6?HENhDHLCE0{n#(?!9L6oupo z{-8EqzTi1=1%lilIJ+d^U52nwaJ3u4BEk4nOt4s>3V^OeFowpvESU8(gjWQ6{NIe= zPAjIIxl}NUF6f%zy$#^X1dAzRye@E|2&!D*K!M{8!RP*(hzSdCQ{Z+-AfJxuRSRN* z;ju>W!V?~A1)<5n*9oRlLR&9bK{4H3!H6GW&>)DTX4XBy3ID{1VXhzKfVnSlrH*Hd zU}-P#4+Qu20N5%Bq1>@e@beK2+AcW00+0^DHj0WK3Pis{*eNKdjkZe=NOs+Vm&ak( zBdEFwVXuJoBgiAcMA`%&3(nK2q$h$d%3}Hi&5>}{FL1QZIK!C2@b%viIZHa+8?)Rk zd^iXAJ;G`JXClXZ@iFD~Uczs0f_Mx2oPh8VUOx}wEBvq*#7}s-2d)kZucFq>IV8-I zVHkhmgC&^WVPSWNKmXLb%;Xm9*m%Zx*AevYpA^OpKp7#Fy1+hC=-&k4DWQ_~q$uGi zsuDyC-2~9Z2p3b|;RTr)gIJF<7Oemr^xm?JnrTm7lc0XoO zAv}2xPHzfxe#9(p38!TNd0V(|6_Ay}Kq~K43H3{0a7Xy(>oBMmw!Q;Mjj(~bS+&A( zXa;cVgvVBcs}~;p$Q78oLR*Re8-(NQp}Z#?s{z+2^eYFZNmxz2|7PLT;Sk;zmeVKD zA~gIC@<3Q62BcLujV`TSI5QU`bqECo;2sL&zQim#g`rP@>=wq+;ng1DZYtFE3LUMO z=p*4?P2@)zjJv3sZmoyNmr~N5qA6S;cZqDM>9bq(Vj9RE(MkiH?iEc9$4vK& zQujdUDcWEQ;w6&yV~XCQ&K5ZH5qXb?>jNS^ML52qKSxkQ)K6q~1Lly(*$wvoqT6+;2caM9t4(e?qi{qS{c= z_e(&+L<_@!JSkdi2QEUiu?x;3MXxCEJ|zl&1!0uv2Ibz-qIfLXc_HpmqoiA0KFoLvihCF4<5$R$8%jYmCniC z5Ec4BS0TDDg56D#nyRw5M2GWXcU$y3osX>)rNqFXN>oX;qdTIL0nkXRB!CFMza(?oq_rE*eQCm=4j}>mUzB zAI`>fJ4GK-&f6vGq8++hBnXAG9#Ji2fxV()Dk(n_O-qLEi74tbkUr6U%3u0Lf-RWK zfM^VTmHe3~jy}fcqLC_UwZ0H7rtIXU=p>aE21TEgg1i!?(;GGB4o&Rx8p z3Rxavk1`nS6#LRXyh}W;0+8L}KmEtY4Rej6I;yAGkD@X!u_GNc@)n;-z%}@YxwKIq z5O1aj+*kZp9Uy+VsP=GF{1%l?g2bwSz9%Do!y257dT)RhK2M0hqV+jc{Np2#FmWEmv*F^(+b}pO zo=JtK2yulwgpuN>AAy__FUtjq62DI6{Ah7{EFdxBFT3FEwD?LFxL9%LPte7Qf2Ann zjQFobAn{_GRzS{*GpaC9g7|{#O0bFI>mNaRPCPRg6HOM|kHM9th{w~enJQlS0FX4X zX)++`;xM`g=f!6z=E)Fis85?I{)GcwmUtQ+^2`>CuY%-=f4vLc1@Vm-c*zydc@N~G z_^TeBr$sO7=-8H8>66ZDWc}z0F z3nK(c)^|gAT=L)tK!PRTy^j$>B-7&{JRwP>%sx~SKt;MR$v6q@!X=9+lsqZ9LS2Ih z$>Qno5-HhCkLfANOyZ&>ff;~AOYYHj5+mV$*8%8h$?oHD8Y{WF2GTgmH4(TolIPE$ ziak>hzT@cfn+pQ6)#Dev*Ei?@{@nV*-gpdWS0ti)KwOnvOam#Ee4hf{HOVMSFv=uPzJ`lIW!AXT=GL>3x zN*XDmx+Q6KgO}TqGWwoHr9?rMnkvbS06^|YPD}=*T5^=CPBoIY?b)dV!$>@=nf3nF4?{r1|5?54?!ME?$VmwDXE}*s7vzco0JK6OX`+E*(3Rq z(wtt&>y$@7k_5!T>0^965I&K#PR4}$B#Y@cQ2HgWQ6w@TDYioRRPw!b+e?6 zdMWv2E}RWYT5o)|JSvTv1uw^>tCg5% zkkm~3-EnCK1*E~!-_k%rq#pFBoREIvgb9X9AKrjLnDjCO$Z+Yy-*81Ir8SQsjF5(| zgO^BYIaQfXN$W(=MM>9m0vRp+-UH?_(ppzaCQeJEP5~M#o#YH?oOI$u*q@OG(83ch z?bkqeR%&3th6bg;K*5X-pD^NR@7y0J}74Zz6>0 z(p$H|otM5?2rff9I~|Zr>F9~HTxUra(`%D0Jw)I5%8`y80dE(i+dc-DE8Rkw$3^Md zQy_WLz=?2^FP&Bku0Z~Wl$QwkR`{mBn?^u3wK*jx?euFTB~~|*1uJhAsw>aE`o)>?OX=9!?vGQ z0(rzXrUv!_wy)8LZMEh7h-(V8oj{${qqZrYAjfQ1(xVz=JC}lu@DgVGyAKRb+6Iip2obhlQ=vQ3_O%6au%~QqN}-Iljadt6jBO>w|EF#J zXi#&P?l}QVvuZG{!AF;*uG0K?*&_raTp-iHgXoYi?;WvJey~0(7-O= z_Qg}^F4-QpmS-`BF*yE%$zxn4w8oU$e*6It*KAu~0bgbtN$LM}+jVT<%WYj$80UuV zFdeuG+eNW}+_asO4epjL>cv=bZ1>X2R%v^LLcc28rHf$RZQD?S%NnwsON-wwJ8KHa z9=je2+xOYMK@qm6op$yIFbuG3rOK4m?uZc5K)WBbAV=-S&VcZk-KB#t46^$;9OSs& zFl%BqKIvt5FnpNZYRU}5?FRmYmy>pjmGB*5HwjimZj+)l^y7IzZB7*C+x^mjw*K?!0Uvr92rj3svAVW%n0C zm?i6M!Thpityc8~26x1#YUnP=exPh9S5`wi&PCZIfA_R8u5mk{DwO3NfUHP1IUl}? zWvg$%x!e%bdFK@P}%p-$;jSuWk*XR@_a zNqa6E?*Q(FOhwt{OWCSt)I@$I+e?w)kSzRHjO!*}{T!UTJbf%C<00SuF33*#%3%=h zl9xMTq}_5iCWL$BQRHo}JTDX6KKZbInD3X{ZNq#$<)>a@Kri_tN(8*+S14ljk!Mmb z?0{TxA9lX-1jHz=96xyswf+vuE0@CXko*RvEdKIV`nV3u6LkPO>NsKY zCH3H3!{uR{06i)HVG_JW$S+=meWZL6g*B(-Sy9kM$rrqYMYMeCVvrbl6NLb$%oLA>1W3WR6nzK3uT3G%rVDksX-w6mU*-?9fXN&bR5Y{{7EG59{@}(ca+j;r7w5nyu|E7&PQ$BnvbXoH6?qC+#^3lJ5 zT#%363|+3=lXm@!^23x;Zmng=MrPEAOb4Q%IKZtaAj8QNMD|bwWXci* ze&753b)UQY-re)QdEe)`yXSeKg`UnL>(i7k7F)mS4z9$SJqfx}>+y4NR%X4P_BI|^ zPt1pTx%Cw45?5HiN0abF>!KSVmDY;QKfwNxwf%kguClJ00%*1M@87|`#yW-?*|pYl zGN7xo_I(>%y>-$nfHYWt#(}WW`b9KIleLU~k!I`Aqacs1mkz_{6Kg-3W?HOs_9D_# z>(PGm*cF*)tQUk`)^a;U=(djB4bo$MIvk#TaKeyh>L7+bCnGW#MZ=Lr&AOqHi z$@QT1qG)hK)(3g;^1|AOrrlxd2n~cI)-|(1URtlFpKjDzMDOyL_1n4NycqYXL+j1R z_oPTZjBuJ7b}>xULGfi+i@^CYc9jF;&uFIAG=TBObRYv6S+3xM7&TlVgBhdl@D{@G zpiDTF5x)j@VT`gqaN&$P%FQAen@_?Z5_T|;VrZzNY-W5m55hf+`|(tr?`1G3$=S!S z4@W=?L!JU|KjYmnggC&sNWvJ#iXCto%c!KDTpYu7E8N60jxwN2U<5GWC6O^s^~OQQ zBUZXhQa36_(&Sci*fvOUXi>xQ=s#>%N6=NM_r5dJ))^)hr97~3hYzR2jJa`FiM+l*5BtoIJ%$SMf$GNxSwxzG5j z2?m7>0rdil812-tC}zwL1+s*}JPBbbqx319l`$gsW7rQEVRK+m&N#{jq=K=Jb{`%x zv;tZcDj87;V5=A`%Cf2%z4VIIFs7Y^(^^Ky4%pW*-aZSio^gFIbPbGLDsCGYSJr_v zF{HEy-^@s!2IOPLW+Sff31dwibWa(_X_9Vbd`AtTHbywTQ|*j-nAWE}W323$upG+} zBdZ)1oeZZ$*mp4k=!flQ=qJLWhfzk;TrWd?2HbPT^AExGFIWG8 zAOn9ZIUhghCnD%xGN%0tpQDVosBJgKm>L1(IKyfNbY9GJufv%)^K}VyKFs;{2)m2< zE7dQ)Oy>d+Kjz1@`uQ_wI>Ji;^VmZO1DQ^gvjs8N7Q!Hy`K%FK2(#fjbi0{;vN~+iQFpH}}_A))_HQL8K9|g|B+(A>xex}0& z2&0*kEdLc)2|dgAgG*q3+mFE{GSeGD4l)`2@Og-7Pe&vUGmlfbe}uVeDv(Lc(z_Vb zQRXU2sgjw7Zn!?qWd8wS3R9&3m&zQY^H?XCjj@27WET9tg}_|=EzD0bSI`-}(@dEU zbZ3~SEe^M=rY=}K6A{vxZ#;l`26Ma#N#9u{zC8R zWoFoNa95ZI%>QQD8B1syyumz4g+dl{56#8d%pWPS&SCC45AG&&7HwbVGW{vR&0}WK z?2^x%VJ^yIOmA6^Fn5?O@0dHXINB5RRu?f>=VK(r%ug19lrZ1&fmtcDoF1?;<}l@_ z511Ff1}SISn2p)O1*ho|s%CDYSGv4z`RK{ek1dT z#eg(19}IvrGk2O}vW1>AgW;r|nfDHW&zP@K`QE{N`#OZ3%plq&=wcqGy_9ZdE6vqC z%=G!N?qz;h0GH314{3ewV;;E!^M2-P8FT~8i7D_h$lR3-gCV9Dr4=ujN9IB|%q)n9 zaD?eamC{Ql`@LUbKgxXg0`_A}CA}Nt%;64Lc(In)!i_geQ3st5YdT%#F4lopFc@D} za1uB_*4WO8Q}KV8wUZY2BdkMATx=5SFzvt{WgR{Z zE}1p;XZSkC64K$Q zR=XP9IaVo^#^+h%VF+}Ab(q>A7g^eMfLvnjpq|5J)?OOK6;>No}DqS*+J66U%0CJt>*bVU0S#;wI|=mDahe+V8>TvBHNy@>wS+ zGb&&$p+EC{i&Z}XZf>*I?}6?P%R(*iyR5D`Aoo}UR88GyeXa$hkd^i-42oDSXTTM+ zf^`^73CoV&`BIktCzzM9E@je`{(!}xTUpMkvIVAsRn-UOL)N*ga9YVqrKk51YfUqB zRV>x#5LUA!YvHDbwToVvT9!u>AayKfT0`ntKhP7_!1|dAuSS+_FASPk!_*vUW-X?T z*vBki>c>7|HMUZBqlL9;129in(tj|DR#uqVC68hMIn7_4EL*CPyIA2g<#e-}zJjoa z^{)BrJUh>(A0QiGz56N1Aj>}ksuwJ)KQW?V)~W^s7-4xI1bNBI_y%N*b$KhuI4k5j zh!;D(7NhlMPoDs?i~VRV;`p*x)AH%ZR`4P8XD1(q&j7aDm$;xnb_FfQLF}(+%P^RI z(33KQ5cV+*EOxW!YylU_Ude=E7&~e;48z%9!~q(?-uMh7jATdCD;ve$bQ#D!?1gj( z_p;Tr#O`D7q9bS)_U2ItquIGsR2^Wi^+wzn_U8Zh|JhAh@EONm8V3^3UL>IBJ%K%) z=F~*?q-TI0WH)X$hv#!V9|prsGW)_A=#H^t>GwF!{&^?36!v$`2%pMcxDFvsus?8y z@Fbi6HVo3(;e+5#v6E|IaGL!awLZ?UBd0-kmc5jcj&ye4EN~fYADWEMv3qG3=>q!~ zDnKr>vpxoQiCy%{Jzy@g-OcI(7b{=$R|P^(pGB~~&3=b=t?sZLsm{C0&bNW^9(y{S z2q|Q5n+jbKdolyUVs^bPxDqz+D!5Yi0m?zk*rC}V57>9;$1P{a{sJ!*>@U6r<4`uRlUG96$X>h&!X~zOJ_0tg zCDsr=X2)ItdBWaF&sGb2lsSKRPDRe)3sVB$)+vgJq2ie0D z%x7+KSl6fz_LA+l2V|7}#}LfN*eA>lw-~eIDP!@mIgtw4E*rL`qZk=LI!!UbHYLsw zhSp_BTJ80u) zx9zG@=)!EjIRY-ic9IAr);6DN%sAU>T7BYewS@}OLm8|n)-$JIB$AVa#zUlQDD5qoJEv>*KqRx!YFDvkNaU*$7y~O zTs;NPdMMn;iZLBMBT2ZoJuXm)XMQV z4_zDQZz>7eIp-7TcNV_=_s@i)vOYT7Uob#y*NFQe*{o$N` zPU_#_1~@an1vkWbcO`tk;20ZVH_S=?1inW&R#kwEa{l`p+!*I2Jr?5}iFx6DhUb5k zz(?EZ4uBl68?*t5vHLHI?w#E~^Z{9%T@>{#;_XVqV4YxBeFmO$?TmCP@3x(YCbPSC zX@@}W+wG45DY9F>76v7DPGulvcF(D>Ew{T%H9(_XGDT>z>#POWY}d!6-|VrSDi)Y0 zcI~f2*?TPuz+O8Oog#m3cb^vdK0BuQ zjY6l*>!?dQVpsDc%wF0R(lAHu@Hri>+-_nXfL`3?-@?qBJ4!jQ5BJx0u--gEn+?}%_jNwYCf{5jsDQAu2j_-y+0(Wpe zNFw*;FSz>$xtWwG9^z)wqI!fY-2#%t{pB=>!KHFf zTAi}|_t1)?%>^wJP4RjZ|!q4IL5_hJ#p~z0b zGeC8ns~QII2KQ_k5Lw)Ry)c+;?gw;pbGZ5Rt=diQca}Mocx_jc=K`+b1L$sXSIR(c zbKgG(mv^`>pFww*>nDcr9@lvTxcl5nnqLaJNffAvd!9NE#oR+37;Oo6*a7iMx!cIR zj9Xj*yK=5S6+#uJ7>KDX%&}232HSr#d3zmq@p6ap4-z2 zT?3a%FKQEa>w1K5=Kekk!^hk=X~llR^g6t6hp^ANKT_Ymk6TI^Mn9Lio^})lxrLvD9pWm2VE=+! zNrme$_Yb;3Bis$t!+Ocx*o#q&a-(NKH^#M-!ET)UpdCUl``_u2@wQ({qP?7jEA( z3KC&oNy|>8J)hpLDEpJ~80a4RC*L68UVFP85bm=Nx(Pdr{dd%e+i!n243KF1+Y7-R zu$Ou61T@CpatV=Q?Ng~O7-!G_8W!>P{xp~b`(LStn`r-(s_}#Nu{kh2WPisUki+)2 ze&CMSFX953WG~eNdDQ;-93YeJk9`Gl%>E-fEPdSm5Os!9><4H~Nwq&y3FHa;RkO^6 zrPeG5T1?K^=e>zrdDgzj6(rr>+R{*EWj8zN1Xh``w^9?pnZm*95sHarLC%S&Ma;>Y7!zJ&SgF)QeTc~z(3Glb`8 zPAp?=nMkK>!g&iQDTv_h^?~O|UJPAH6fgcLh?&<%m$!%a&;LtV-o9nHa~578&FuSm zVQnyo=G{~Sd4Tr{o$86r-|Y|{;Y~aQpGiC} zb!U(A?5Vg<=DkOsE*|6YXni@(bAJFXh1c;C$W-1R(cn(-VyJy^lGk1bFQ<4LXh^4d z`)H9n!y8!(a+dd=8oG3zJ?(~O@a(Cze2!QDCd|+C@;1;BiVM7+hhQ)A3MezZ#53qI z?905vqYz%=Z$gtUS8TOzKZkvC@$k(ziLa=0J&kR0sMxETM(e&mrv|kp2$#i{T~C!G=oje1})L;O;uKQWbmO;l){)7diZH z$*Hrla~+9??vVo{1m@Ka_o%B`>kvK)uHNA>o!Dq}=%SOr%?@*EW_;q%DYeY4x3acM zG{64PY4*(9(0TDE(=_YNS6Du;NAtw(Z3zAO%Z3m=fPa-r+Ccv9>EMF+|C|69%>SDJh8M3uy;Cj$cK`&f@tAbudWaFQaiL z@&oC&I>>jRvi=Z%($64=`I3(TIl^DSfn5@Rr3mCG|6|Kn4OWaf3up#S;h&HpdMf|L zYI97bz%!Z7)|}ygMuE=qx6)*n&i^f8cBA zF7b_Y1m!Y+9zD`m_*?#h?izp02L_q^Rck=5^XqBv;Re5q9>Q$?>U}WC;Y;Y{zRBO{ zSq?Ur|0+F2`Fvp>xB`9(%^$b;n<$&V&A*v~!QA0be-+$a{*7I5bC17(I;{8km!-It zLjD43gBS5x??PD2U$7fo3IFC>7)&XDUo31Jog2HmD={#455YxuuB0;%P*ok8mO-A^%=dj1a+VbH)g`~hJj|CR4x z(8PCMhEX^3H(Ev;t?zv>40?ce_9Jj zH~$|xOxVLOt_Ro4UmF3gk3X^lcK!U{Xh;Km3Dv8E{P|yiyx_MtfDH3LX9GFHpHl$4 zm;8UOz~>l0eLeND$N8zJAoUV#`VXA9VDi@>K7un-V7N=rwg^yP!Iy#H`~*4nApU|& zZV(0tGU?z;pkRP{r$K_mPeFnOA5;MnBB-f1&#kuht zqk?zlL6M8TDi{%?5T1)D@b+*Nf&H=k4mo$L2)D4bAlFnsLuit|3Tn;yXU1P2EpvNLhaF#0aYynFE^Blo19uVFXL{q;zSCITC z4DtlGvdoD!9M8$L(A^Pyu@S<%g7dUDc~9^PT-eSejqCZg%02z3fd3jzE%p7>4|$JxKHa)mEh59 za9txXnT@qG6+h71QZKknjr;~dA|(Kg0*f>7O@fw105%KWtOj{3*lFHgYv<|p7JRe` z4*!k8whN*&0emLdM;r4U0_AB~cM2ZT$%8Jz9Y1j0g4wk&=n<6A#&54+I^E*uf_5sr z`vfWl%=-mtBOn8US=6{66xh?VJ0zG&UD+3c=v<6%SnvTgj79`5o+`L`DTo(BIVSk4 z31nQ5CWoPyu>Bu!-a;)G;eCVw6n>XbMZG~^;p@8q@e@7>gByS0GMe}UgnvDTFi;rE zhcHO!HVY(JIEfz65MkneaJz+{QVts`9Mr;Rm~cazC#2!Ryj_q+2v1!C7b(0-X>ycM zvJAv5%%v|h_6YNH0NE?d{t3c;LJ7Td7U3JTuI?Aw)8Vmb;nZdb4+vLIfR`BIJUZt0rAW!aJ4Cu5TtcU-E($-QE#^x? z`4e2zW#RrAfLswaehA@Jp@x#0YeIel%rk}UpMzW%o}rrkhVTSE5Lv=UG#_LOKRN|r z4*r%c%x?;xIlwMgIDxteo_WH11;FGBm-&Dc2y^Mxy(Rp7805C_r%+(-2tQ4Px4XiX z%@E!bez_OI`@#uPa9Swj$iWo}tEfOM7OwvmT#2x!4$ex2?O%c`6UwQL{y^A3FL}A} zRu_a7!suBb4|&3=8zHR}+R)?mNcdnDNR@D)5Ej+KcP*iydf$v74)maFegzve7 zYZh8=BE)0iT3YI!2uo{W*CPC80d!A=*|Y++3gc<(wN2<0fk^Gb>2wdD3C$_cbqLw7 z!>&_!;Sh9P!Un4Ix`h+NVbCLV;e3qP}b*@ld%j=YTvn_ma<5_M30=`FHSf%6f)NCI+~sNyt;uV@{e zME4V2phNloBEM}IQ-G+23im)!H_ebiqG}f)gGJ^j=t4yI>v1i+MZt6{Lq(eZpTZD* zbqzxb7d+E`@{Z<^w{+X81vB9}Pmj*5=ZkCiN1egoVw(IM(|9Tx?RL6{@SLhv^riAEp!LDEP9p<;T6%3YcRB{B40{HuZe!!24SXXD|Pg)iv$92 zH$-aMB+U}7qqa`AsE7J6IiepIfV(Nu1c1vGZQ1~zd7^L6fy)=2pa;G{bSxFZTOzMt zY0K@lXfrh}?}!e34sus?>{VdyiRRNUd0+HBZS@q2{-SiHNc1WlJ1Q1+#)6cHE|kKc zRJ4kItTNG|FG0#hFXNmHD z&QZSlR3x4Y->o9+4M4Vu%G2ScUGz8Ipl70dM|kNFt^NtfPLV%W__b5IL?hRL=@zxp zRzZ)5^$|#~$af+vo{JitFql4(_DeweMbqDaZcy}+R)Zl?F|D01MBcPdIxI3AhHymG zG#dslMLw3|4lBme-9|vX#J=f(c#GH2y5l2udj-yRiAzc#^cDZ}E)4v{>mnfZ7e@wT zgaP7yYWW0;d&2+;5?2peRGn5b&t*Oc5g}elB}%0DkP3!T;&~nr?h!AgCw{MZoO-+a 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 }#bm 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ʳq%jf5&-6J2>w-PiUXKkF$Rdj2}3zv`~EH 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 diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/Debug/openblt_s32k144.srec b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/Debug/openblt_s32k144.srec index 35deb67d..96221e7b 100644 --- a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/Debug/openblt_s32k144.srec +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/Debug/openblt_s32k144.srec @@ -417,7 +417,7 @@ S11319E0081C0000081C0000081C00000C1C00005F S11319F002440346934200D1704703F8011BF9E700 S1131A00FEE70000433A2F576F726B2F736F6674B3 S1131A10776172652F4F70656E424C545F53333259 -S1131A204B31342F5461726765742F536F75726331 +S1131A204B31312F5461726765742F536F75726334 S1131A30652F41524D434D345F5333324B31342F74 S1131A4063616E2E630000000803020209030302AF S1131A500A0303030B0403030C0404030D0504032A @@ -441,7 +441,7 @@ S1131B6000800000130000000080060000800000D8 S1131B7014000000000007000080000015000000B1 S1131B80008007000080000016000000433A2F5731 S1131B906F726B2F736F6674776172652F4F706508 -S1131BA06E424C545F5333324B31342F546172675D +S1131BA06E424C545F5333324B31312F5461726760 S1131BB065742F536F757263652F41524D434D34D5 S1131BC05F5333324B31342F72733233322E63000E S1131BD04F70656E424C54000884FF1FF8B500BF77 diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/main.c b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/main.c index c2644ac6..0d5397d2 100644 --- a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/main.c +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/main.c @@ -194,8 +194,8 @@ static void SystemClockConfig(void) * DIVBUS=1, div. by 2: bus clock = 40 MHz. * DIVSLOW=2, div. by 2: SCG slow, flash clock= 26 2/3 MHz. */ - SCG->RCCR= SCG_RCCR_SCS(6) | SCG_RCCR_DIVCORE(0b01) | SCG_RCCR_DIVBUS(0b01) | - SCG_RCCR_DIVSLOW(0b10); + SCG->RCCR= SCG_RCCR_SCS(6) | SCG_RCCR_DIVCORE(1) | SCG_RCCR_DIVBUS(1) | + SCG_RCCR_DIVSLOW(2); /* Wait until system clock source is SPLL. */ while (((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT ) != 6U) { diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/Debug/demoprog_s32k144.elf b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/Debug/demoprog_s32k144.elf index f0b3d461763f984c6d55a1225af8d3a58833c9c5..a87f5e9cea11f2002b3d96501a3a8ce58115576a 100644 GIT binary patch delta 115789 zcmd432T)Y$(>^+f2}}ki!Y~Yz%sK12X4klD*fp&=hh1}aT^*1p3L>Kn0xH1(qGCiu zOh^zTDk365445%XkZ_-#-S2nrck9-@U)`#I)!(f;J>C6u_j}HHL%;nVHZ#VY8DlaqYkP+{CsJ@f}loJFs{h?t;ZDS?s6qYn|@m z_{$m?vD?pr5jPSS&i;SQ`}=cPj?SD%>@VQ?lMsbd%szzQEdE+wFeP?|!~d>DlS=Ij zpTEj_%B8pakR}kNv7513EHS@&4VZIm^6Jb_v`S=6Eft-(EY3x{NYDR`z?bY`GvE8X z1B-Lnu4&GnN}3G2rZs=u5@@d2HSPJ94{(raXFBuWkhd&*1G@7UkWDtb8$$ocPuvNc z9J^*9-(@|Rt7OxiHH1H}JGflC>Sy7A{$p62Yj$^|_$$f7b@pI*7{hl8z@6S;&jaHn zvRGfs+*<{a{x&-dB9=hpKNEmFyD3W~N;!%^al9+IC>^6?2MQ{VHz|o?Tj;@ zKOQf?m7P)WqbXo(JLAf)oCBtfoze0i`k`TM?Tnrur$x)#5z~cb=GQEO@Ah_8b3Vrd zxDIxvHOo0;7PyX@GTe?JkKx?*Oyr<7hph{g-QDdiU)}Qm((*NShQl9XO;swO$UHP5MtRI!G7JIMR*iy@5vCN`R)E_N&0E-d%Pe7Zz>>P&??eK@r+s^SBk-bZ8 zYS|iQVn!rwiuU^aW9J~6kpQIcKXwkH&vegz|JXT*?A^-$A3Fz8Rt5SOC*U7LwkTl= z0tWtL$QH$Ig>LgdhHR0&HwCr)kpi+sH?0>{lbWRU1|p>8H9P^A;VU>S-f$XsvZX4t zhMCA50G5Bj+DF~gd2v36#Y|&pz_VG-zkIi@Qg>x8S`Vvr%-`1QYLkPzll6nTEi=&S z>DrE|w~lmei|a;Lz4X;7Hj8m{VBR>gSju|qVOKXOvR#e1zH&9T>^lYOSi56pAD_k2 zE(>KyFcy)t13MsU>_2jYwTqj{Vek{{M7QqDF00jTysS$ipl_*7T=onWORw{{*0~wX zwLih-U(99!i{-hoHJ8QwO>>Xu;3p0&W`q4F=cBcsM#->Fj@QW9Jbq6H7Qd%;sfWfs z3&sFU|3=}di22O_ZTjm8&A-#1!~e_7H-ucv1iO=x^2OzWg(jtuv%U7AhR z1`J}e^xr{802U+tchC{XVWj^KI^y_@^xr|(0cK)G`tP8#+c`-89dvd(2kF0q&Ti)* z{ddsW?Hr{4HR$YyZ0Wy)&Thz-{yXUGhHUA-gRUP1WJ_;ai;R;D{|>s_43;4pblly88nVXUC_zH6_hiwvYJ)T+n z^y({rp@UrPz~!wNjHHn7#8s`fEgj5sWJ+y!eqx%$r^ovzqm!-xmhcwTE?dZ&Rzu2T2~ijF7HHaKV}~7amwaCc;z|lBCyj(iU0w_EyV{ z8%Xl5KWY7EqcyCt*4*A6mbtYgv8*F+B}2$V!+t_`` zPe>o6u3Xj=%7$5E!YP&>c{Thaf9A5pM5+m3ojGsXdRg~*-zKG=LuSSj-cX&q+ORq_@CR8{Nf(Eo=+iU`U`Tc$Rvzk zC`op0q8ng+Cb_B&Sq&~B`J$#|RW*>bSW^g5|0Z1@dy~8X znFN=0BZIVWexl!BXOru;KhpI`OTzSvr)#kNEorus{FN&O_{IK2BavxvSsQA}c0nUG z<#Qn6o79s$$`M&63^GXc;TwsVSp>?xK=QmIk`KE`a@zvBR+LeI!^`NZ>p+-Cn3jR* zMiTy93S-VAtB20y=i+LTyd6rCc1VbzwZEF~tLV376wd;}H4r1(M~?nn8hS%(D{aoBg4!>r1Z3wj)UsGvNzMDU9zll8468b?qd2)WhZwX2vZFKS4v7XCp{H ze;HXRoAOu|E^F3i``z59>%^7>DnPD_w`hNuMXgBEDU%FBrjfg!Ptdg#2|bsUKbqXt zBdzDMu4zaz_5k@Av4^gc?9DCyndDPFs9BYE4?f$;L-JjCwy=Wk5z{JwK*b*9sL28P zU3Q(Wd0$B@GLdol7W$p#M)HIx3h;;hO`q*TO^n-35~udmpg8*|e$68!bD6GdBItVh zH$pB8ByUffk;HPf2N^UQN{UNS6#kHres9@I^2f~yG~0e>ama9CFq9fGegkPs9mvsu zD7r2!A=^QAs}nyG^890xceK%UaSUla?7i(Qi)>5YQFEVInh@F0ikwbE;>~3_JJNO6 z6q4Ldr{8bele=qfgq#vY5`HLYSIi>XpDROdJSVQ;y;GaE#l53I{1{-dpA@3u!nTLY472|cBi+_QOHWHSy&@N=(;AA?!&1U z{eEG8q|x;xiE$!7X8YrfM|}W|SVT?nt)}0F9E#OzA^m=8Z|G-FBdPl>Ax9$`DDY@2 zT_ycUVq9WP_^J8G?Dr(nb*KA}%BA1Qt?63z6J0ynBX6%JE!&5DuXsb(s$^{OSd;9d z=f_hhz_51or}#^)o`ckuX)6i8emsS@*n4S0A!*CFnA)noi-tF9*V#w!D8v^{AehonSGXsVJ6v*iHa2~|0Kw`V8@sh3N++A!>0rzhY7UmhZrqSS^&sPZUv3w z@*u$YU1#Gec;DXPpN1Gx&Vg@!+6tpD%(MO=wT%1(qIfxUr1d4xVV@9)P={Y>1_^gC zJOX#XVHT~hhaKLHg#R>$=q~@db804lKyyC=Si_r#7J%9<>x}5V!cW85Z&4$lSk#~f zXe+ZZ9?St|(<`9T89lAgx0tvg=rdoKO?CgiO<`0W8spp_qkz}a*@|l`DP3E4K?=od zv*u6K9@|nmk=O3!@jzfpkh7-|>qB14U|cLCw+-jvEJgMH!F&4*sB`*M0z zh7K>$h9*IjJ~Xq@V{6lNz14G=$}*jLT%SgIdIL|<+a7w5rv4FSCs7OV*7 zS3V-_VqUxe7s+^EXE$eYl9ae_BiqIxNqHFu@_-)x#jztN02_C8%_ivHvU@)RH|ia` zYd-8N*_;n}I`7$@k0JfQPN4kvBm1}*!cXkAEfMfDTSg1tSN3&U3%{}XH^Ei01LI*( z%^ptKR1Ld>?XO{s``|;US#lfLq1hmf?5@89;>Fpz9dW%mCYpvfaejIR10T-d`SeIQ zJx4?5&*?n?B!Kfw4oD#9Z(A{(jhM6;UP3s1QOV31rp9NO-DQ%XZlezFoM%W0O2mq*BWqrUSla^_&zbig+&)gAKgfPg6(uJJI7@Ot4s!IL;4*=exfOn9LbB3Xo%*A1!mBJkF8d1UbQ(QU`L9bDVm`DbD^d zKu>f2qVzKb<#Pzna8}Gl+*Hm~8Zl=%UA@4iaT*RncaAgRM9%okygm*XzZNS~-gkJ`i&+%;w z?mnlEhC~799v21=I03I6eq(VTa+;#u+{v$mg62+SgWadYf(Se_;$xKL$Zr$%(80dC!ToP5*^) zAA7AIxUZa@O1P=w2!8Afa5p zIe={E4!R9p7b64DjId&_QOhj;lUjZ4(9X=1{QQXBVfsE#+ zQ>w6=dl&V8?q2R|%Ti!sxCaBEjO7kq3S}JkNEL)l+jb^&&$)jkL->)) z%LDnuJ@PBaXYM507<}OlrwREhcl~7;d_#%`FIC)O58%3*ySo6$8g4hr25Pyp7CT_` z{+*jeQ%@aNz7uy*&+RY|ZW_4#cz`x?{V5aj;w|-ty*IDzXZYU4^ZN}tAKoxZAboke zX(!~zQ_)=D&bGk~|9GPXe8bV`di^F|IwgdpDINa(ikA~i7B%DaNij)fb{>#2pe z5MIywP;TQ*Xboj3Z%90Z+j(b;!G-ZQ-iFS~69mD{4&IVdaN)eZ66kEa+pi&v;EkrP zzKeIU09+)`K*?hi@0By!6wSLG4diY#8<0J`GTQm><@LV`q-P9oK6QauUZ1uI7{?3j z4QM>CcoKyBc-7V!zbRC2t07C^?azcPkvC&4?(7inyDfPX`mYHmk=$h7vbP||cnj|W zd7Sr_^6(S9W0XdmvUbCA=#$5YXW6ka6l_|NbXQ7z@B@&c#~b(Z&Q4?xcG zLVCb1owuqBxbwWWo6y_~JU8Ml@?O(zUgDie1LQJqv|}S^2Cu|6YBZx5>-!nuvw5;A zU~+i%R93pmTblt$E>Ca~x@)}ndk|jdJ^KXV4c?D4AiT*d^#^y0mq1mx+q}b_LGpOH zJfX9 zze{-c&cJmkuj2=pm+`LA((stK*B6j-UQrhWdcvC@3+^fJM-Lc08G8(dcMlIYRB=P5-XA9!zQ*Yc59))Cw% z-kQIF{LEu0hxo#aI01vNym*>SzwydyA*|x{qv^VuH}()n4KMQxAho=Uh0uNHd7lPX z$Gc$}4{!Cn-3gF3@WxPP-^jZ%5)JfnbesX5w`0ZvkWG$3atM7KyVB_Pb$r(q27Zn# z+OGLKj_|^x3virW07#(YfOhb`*>Q#h!XU?9KLN7E(eVe^ZFQ`93SF>cc@E4&9Q|@> z(b?vhN2^At~K8K17xS8r4EpA#{n8+3E+8ize?17{OUK`3K)!QqMH}Atj%#|*T=CIS z7z62N$JLZ5e|3x=2(HRewFz8}V+74L-yPe^U|;VTLepoX<1w1Az4_yvL45d(4MIP@ zVgQf<{HxXAHuJ+rfZM{qI1^ri`AaFI4&mRUL9mT4!?7thlwXY1d^mSIzvdjIVf>|+ zAhq(Hg)rR9A4OAS48K=j+(j(^-Z4Pp__Frk;`x1OI@!nf@&#l+zd;Fu1N`bPwxeSh z4b#z?(4df&Kkr;R> z=0{N7u7v+w1!txF>onJt@!L}$ea!FM4hH4?i*I56gx}USdK{zZyP^TY3VwEHczMA$ z%Ryf9BWNXf#b*Mcd(D4N`R!Z2;4~t<<4>K0MpW|Kc0!={{GC?s-xW-@Eo~g*&P=rx zjAL3@zCVPMdj9S_;2ZdLU*M#Xf7KCf@DkMTgw9(K(F;yC2~8gZn+1mXfCLFvZHBWg0xPYTTLtT>VZj2i0whH6d9V;p zw+SNGfejUm{0RH)f^Y7y2oqR4f>;GcEg(AtE*D|HQ_x7ccDP_24O*MP;)A#mf_DDa z*okt>OlniKfa?X}Zb5Yx?Dh!mJi`OoD+r*RB}T9+8IV{()Gy%T1i#b1FkVo41Hyd* ze-4EE1v4fg!U4hCWzZcItf7@PLC{eFE>W;*1)Loc=vSaENrH*AoE#AtM*?zGuu6;5 zDQ>brNrUc~;MaVR6M{K3+D;1ISVvAWPR^p;dz#?geyGv~UC+V%yugi)N-hX4t_Qg& z7;Xl+EXbs-V1_`@1>}lg_6Wqw6#Q@(c3FZxCt;T@7-$1BM<6c;+W*}bRCR=1f#3?2JOyfa3u#PX+FjTs#w$bqDuc zumOjH+zJ7!H+;SjETJ^yrC=OYWnT#Qd1a~h3`dRQTA8x(~OkNOv6`b+LeSQ=CP8nU5V9sy| zs|Bv~R%-+qRN$x;j1535z6%apAgmJ%tblpFU}pey4T2vB!md$JbrCu*A;Y82;VszpVBPvBb;J`g|9G^dW@g&?ys=$7v_&dqyXVNWWU@%VeKM7HVb>4wT4X5@Ow~Y zG(`Bf_1F}n<B4u!6Qu2Zf&~=}Hg={0@>Rw3y-akTCZ*1WXcsqaE~N;UqdDJ0iT&3%aAi zj#RTq7H&KV-^YYI{9t!n*qa9131Phox|6~WS+F}LoJb?$v~U9-!ZX69MIfodem5!Z zS>Y#I@X~~@{styp=r9a!&I=b(#o>bRHzT-E0gV|T$>mT=N_2(yLfCSGLhcqoiiHo4z^+8Nb21{8 z3dd2pRwnE}7Y2`oxgP;37j}!WmQRz9=tSG?=fV;iiWNeAB@A8&(|v(_DZJ(i?v-#M z6-HkRpG^nkjgUV9!neXTs~~(Q%;}0imBOWD_gFE-Dq2o+z*&(CKG5Wz6UlZ0nJy}(Jm|cr!+S)!AnHSVwTq$=eF3>7+V78mmqn2S zAj}Ze(iD3|boCMpGDY)fvdI$V?+2GHQbybMOk*^&e;*3W4bi<-@O@Kcr4e^a^!XFW zZP7bgQSOMwyTa*RQT}EGyeBf3!9HK~d>#Vc7yXb1WPxZPZMPqYexOoIp-A5s1`kCw zt}rMPDVo@{(;35H4HYsTi^e{NVYw)VjzFJ?8mPSRR1|mw&}X7VN)exnes%&^A&Q`a z@C%Vj2*^uO(4Qc$MZK-lXDKX&)lj_`HRi(C2hp1wP<<2?(|+@lD1^30pGD!nq7h$2 z!X^-Y70skK_)X-~1a?)TZfyXm7PVanVU4JqHYT+qEep=-M9fqXhLX=xA*q#9DA z=x-Cec!{O-sf4%qvQ0gMkyzwxKzzjk&q4gefmAl}7l)69vjA~M3?gh6@Ari;NbD;C z*&^;+g$P^4^2hKJEMB6A&k*t4uh4B1YubVf6*u<=Buso@Bh0Ph05fzu#OT0c!`B}LJ{Kb)4=W$5A_5zQe5c)5+xpy2yfBiK~${TE%qD&r+dUnR3z9d ze%}JZ81bzBAhF`ldx4A>`$)j;6ECTRv;E>bmw-GVj;e<6pxE^RgbCvH)L#?D8w?O0 z5*PkO^LLWior(m9#hg{P_A?oSCGZg9pAc_f3+XBGBPyhw7S~gkNf9r^hl1QQVx<>^ zsp5l_kDnEPy9GCC;$E!)IVV0z6L7lNLM=Tnt}6n$AZ}KU_!q@{g5dMA_#rJm8RD4> zV0T44j*6t2;<-xz$r3wBH^XVR_#qvZ=7c%T{wiV#iw?Fdn2~o26-z^#8;Hu zcj6gMpsN%wvX#%mT%|h!?u%IUBgj{AnjawF#Gh86EmdMc8ro7LK1{EvR?MLO&HXM8 zq1{8Bc+EN>>&0H#APwTVG@=^C!zlUnl1N^F^Og*s4YEn{;RXzRBtOtf>MJ>r2Z*0! z%SSZHU$Wdn*+hUOpE_xv)s)0Mo(m?WSuv{hf9iSzhRTiJqq&($!}D{+$9;_ z+*Ugq{m7eU)fmZZI**N&ETlvwPEtr)$9Tyks_*QRBzi-*U!tMWdq6Vc639VGXbV6R zB;|B`k|=3>fyNw?q`d)`B&nPM-C;=t!x}!~5l2+~zW=p=>mwd^SuF&O5Rvd@$ zn#4@IpX-tun$~Ve1hjv-DQTd3%Pq+-lnCCI)Ov&DN!}%*5g#PMVSs#($ z8!2lKlOCZ;hE;mUc55zfaOSTth>-4B58*DUH=X=PO8?x92vJhUR}e-^XUqa*x3stu zBJ7c-?}u=&RMrAT-Ac0++bR6Y{@zQ_~;Py$EwSt%Z(oWQ44@f5wcToE1 zEFcNeH?)!@O26CY&%-qQ!3Vm-Qn3K8k4Qh&!u+Vz%OApI=^yk0k4cB!fWdL8a15NC zkWL>BFDIof2SRvCdS^Je)6!q5+MXh9@*@n+NR?DcN|i~f?lo#FecbOLQJbEV^G-M=PXL+k!^X?ht9Zb&(2KyFIcoq+C^G@dpT zx22!^*;dSF8S6%^bD;c1=2Ay0DU06K{r|`oe&PlLus@LkRs^~suw+y z_6vrtSnARjH&G&;tOF^PE~DA7O#1XaLOhnv=m=!FbT&w=A%?f+u={r-;&_-v-D>w34M_sq!sb2^aIsRzDXsNl2l2j>}(Hd zwe;W#Kx?D{F7RC|tt91l>5Uc;)=3ko+*vP8SOi^zw7)fUp^-nEY8<{!W?Sh3#yI(k z5?qjzWGKwGIE5{N%dJk?lnDhp1rLYWHm7#9{R(w*O#|8P#Bl-%b6Wlc23Dsqnn-py zeR~DuPNx=;5QaOAYYSp?I%u2x2jkvjKpmV#JKd&4b+^-Iss!zET17o>uhX(|Xl9I4 z%X=`0b!x@{8Ryh_F>W*7soHi7=1vQ#1d-sB7 z9CLbc46ctm#p+>x!f6g=#3!A6=_905P7`k;!fB^d$Kfo+X{Zi%XPnB8LzwF1nFsEy z)9rrX(wz3B0CLXhr2!30clw1!)On}h2gBzDrvfFMU37Bo(FyD&r|IK@5$m+3Tt>O)yh9b~Y`b~=3vB*$s!Y}=7Pk;xa+qWs-yDeXDxotjcNY;^i- z5Qw)km-6gj=Xtg_e=6+HQM8x;|OlA^HQqc#5k{b31O^rw=FP;cXo3_*nQ5L z0f6jx?&$>Xfb;9_Vki@wds7aU=)8<_|3l83X*Nu9KFfofBhJlf2|DWBT@Pfk^DZN} zW6nv|m?a9!4*K5ZwDY_}c$8in8U)LCcGad?Dj&TJY{>CT-8f}D3QrF`gu z^MLaRaMAgwCjwk@Zc6FGWoHYOMKheWG&x;yPW%d8mUEE^x@_mh_0Z)wbE))r)!9O) zJGsuEZQ~a)3dUqxxClLF4;uz|oV)#uKzE%pMuEHMyqjv#`Of{$f!ufAN>z#i=le8M zJ#g-n1TTfoO?$!Td*^P~a9@qiTWB)#b;+Y6U4NHOs~`+?IW`{1AeVxUunTu7qcV}r z2$xqQKz6zGxA7LEEx|VT#c0dq0>q1TDWdICoXhq#u#0zj@(Y~pb1~71v){#Y z5$q1SIO>5+a5>);kVF@kDCiEk*k~?1?Bal`3ipW1u5^&2F1vFOHreGjHMrw0TWDOJ za7mzHdD5jjRjW_AuqT5{ak;A61LYZ)H!dKlE=MZi^sGxoFWdFSjG^N-s#ZrBlL}DjWC(c4uW* zX@`?0TS8^-bFwKkTGD0rU!rB_WhHbJeL;57c5w;Q-jeb+AlWioAex&a>y`n#tFkcq zupn0!ngQW8*_GZfzb@m_k=9LFvpPU-$^Kdg;ceN^R2|8a9i{~Qj%=d6$R_JJ4Ul`X zD>M=0%Z}1~cVD)Msv8Be0Xx7wknJZ(p-gKz1^b7xQNMyMlCA57#ypZmdEj1(Wf$pW zw?ww43c6C+UHX`;Om>RS4<5@N(RePG`BQn~iOhos;ZxZk3jld0 zx`jRRku)*%%;`!W{WHN*}JuZO34cE3cEn%Qg9c4$xhfx1$v5hCG|T z^SCL0=8dqoNE<;xFIh5x=>mJRy? zxq!;359D{~T^Gu)o(Fj-*DQd2kzAPryGQbKTp)|(P3PF^S1=lZpCj0E`5l!_zmn0Y zy=sB2ko)!n_Jw>2mH%GKHQ#KbS2FD;kJBLJ2YD@(#6QaSWI_2!UV0u5KFgobmup|- z>pWrqRlad9Am8NU4x%|#@**3!YI!B)TQ%~TG>g^BpR|YYyPV|&QYW8dD_)72`84_5 zq-aH>%|}s1ecM-Y!~>k4Vs0Uv`76R`A@2lkvqDT6NRWcl84k~7!xeA0 zA)rk$JONyUV#HR2h*ZSj&%3x$3jKOGjaE#g8pCeI__=ViN5NJ=w^xzj3@PK z6|ZQ0h*JoE0vE5SvlXsFPpYT={2@gZ_4Oph99rrQEACU9jwqy7=#DDJE`iTv#gJj} zc}!uV{mF5Ktp>Ui3J1!OPboU^Ku#-iheDU4s7{6MjN%6x*{O>DRL(uC$fG@bnqof{ zTFxoFXvTvy6%Buj|E(zVut~chl;9baE}xvl$IIUM?QeSCMIEMn+sJKBB zqL=cnD}>(4?*@=f%4J%_^-+d?2E zU=XBi_88n2<=uy4y9_ycBP1>^DyOW+nKeD zQE-w*eT34X-g;rZ#`2N+_HN}WN?!IT+lIl*US-$L@DiikQw|cV1_*L$0%Cuu|k)ktd9XXqf9P=MXGY?Z$O?^ zdecBlQ?{Z!?wm5tc6%LOK?6-$my`{Z7GGBS&`g-2yi8f-73H!NaGAnq^@-N1Hs}o%G~~dJXJP+1$m}a?uE1G%A`4PU7;LE z&-{h5TZr}X293pM2h86o52T{imCDm*Am1zZ(HX%9WzP=aJ}MP-n)*o@p9{Os%6Ka8 zd{MgIz#V;6Hf;voH)Yiwc&Sn*?}tIP(u>yd8l}_)x?1J*-4K3PmJa||r+m8*=JiTv z>QfEM7z?evjmq0Jz`Ru1RI&0_g_c3NN%e}>A|F*QgU0x(2JZvsr*fv`$X_-0JPZO< zakQWYstm&++^lMs1QMjGZvovFl`G9(TUE=Z!aP_teH(Nks>yWo+f-vHD+pCB?`?t8 z?W**3kcO!`eFtY%Ii!Hwp(fSG6$%x)_y;PXA(6t^NWePBmQPFdZXAb(q%d zeX0@{ko~H0QLs3mdX)(7pekx9pb4r1n$HqdBk3U~sm_St?Xc<;<;O=ge< z$x*pbhI3UlWD4Tts(P_tcTL3)gYLTOPpTf@P_>~&=cej1?M!Z|lBuiRR{7GG`gtlR z%7yNz7I#MUyQ+#@aQ9RZf5JRpm3jdN_f_o~jjehE)6Qb0n<-HZqj6KJn)MXgGF8P3 zkjJWC)UC=@KD0M^qH=hPh)-41_JMn*`hiXspQ}DoVX{K?yaMEfs>u{UUaBsw#Upv8 zn%N5EwJM=CoV`_PX=D9PHH7B4O4T^pLB3Z#m(slSK_!?D=|@$fHPpL>CHEwl8r1}R z_RpWVNS$iVERY6OkA)zOs>t&oUTRnB@ZRc<42X|Uh0pzb*hcNC~*8(_CtJ&lgWg4AAA^xmTG-5Lg4)ypmO!3L|>(I*2T>i56F zaGUyD6riE%xaVl@c6AmF)G+nNGeGW8C(|R`sqREeZn)Z?D%v)6hgt}CsRfkyMyi`_ zLfk0zPma(pS#uHsi*EyyL-UrUUfQ6yD{p*cT`x9RS%?A#Hka?!NsfVmV(=- z&JTqB0kwh3u?N+alno@Pm(g2FR2Q!YcSv1P4rG#g??l8stTs`d`iQ!c_DM(8559p* zR$qDygJbGzQ^6fqpK*llgnA049VgXlDgDjDDfI)I#ZRldoCfBM`qUtJOI25o1$R~* zbsZLI>Z8`FKD{knX#13-PW>6=s`@^C2b8N$>H}xj)Q=WJcwH?q!R&^55Y0|E)diGk z-d1~2xh7BT;{xFw^$ZQTyXsD7!QE4DAV|Kt%N3COYF-(_6{vq)1}_iPg;f72RQI5J zf2c0EECgGm{+Hzn%UlxUQyTb+ikOkL6dUAcPfCH##OU#S14^3qFnx4qzAsk_prKd;qa=-Bv;+Nmqd->RKogS=D6HlxI| zQk_BR?|XIO0~mf#_qzw>M|Bcyz&@#CdqenH?M`*SFX|oc@b*=Ga0AFU_25wuR;kBZ z%Y5A}x2Sehr#8|mT(4e2rvVM>X}iHSs(;;w=w7Zubt+Ho5*tm3JT4E|UQ9 zbxonlpr30weFx(2`hdPB2yneg3umBfBh5TPuD`T|!4}uY7Lcv34zvvkcKtpFx)9e< zmLCA!<~otOQK;)1s_AZbjbY(dtghFu1G>Yt!*uxG>00$Cbm6YGbZBjJ9X1_Ji*TJf z2asK^)p^iGx(3_<7vsXhf?*Zz_p(G^aEGbcjyXTS6SQnyIayjz?8Ti zp!v4cRa}7xWv=4yAm3cKQF7(y7FY%n_ZUJF1c;yy43fvpF^^PEK-Fi?`R_%6_kTq^ua{#GzJ6H(ryW6aV zxR*M&?Wyot?>2K4kPU8~e*vV??R_G`dTHKK^5Lynu@1;hnwgeA;M7Oc$qEZ!jcq3| zewrhcg!*eP&xd`0<~D7sH*3r~a6y`dhoIY{xli?wt(s+Vh#RcAPo>rnjmQbeZJLA? zAfcK+=Rvn!lTJ0kFpb&=#HtxaDa8&=295chn!Htm;3iyio_5|g&A`b}Mree-P)2GN zQRW||c|vPfw8lskrQMp2-66cB`9h7!(sZM|I!B}FYTM<<7%cq?AT7~EQ%R{*-Ad9K+{54b`T)&gE$XueQk>7`~G z<<74(E9u1awWhlf25&T3&tdRZvyRR(Dm9} z(#?ui+X{i-<<8m#66r2?1&MNB5Ju0(y~zZ)-0i-c^1nUqJFUr^TlCvB9?V_$UiU!q z-KDheEpWd=JB26iSJV(bb#GA&?wR{jdgRaD)w=!=`w)6U`=d?rrwq?&{qYWYFL)%Yrj6Z4=5Gy|vy6KyK3V)Fw{;&ZQYYM%$D|V63(sWe0IuaTUz>Y5f*}?AIEC7T)r|<3q1|s=xS26pjO6R8_RcR5=4v-I1G%QpbmNE^gtDw*MQn@2<9uCnDU_HYM|XZR`86E6`5#1@eJ*G>!g3 z?eTfgJ=6vafUrnAuR90QN80L6Ff7)7v%sQ6TSaGirP>TRe3xkrg|K+6J^U8Pa&34i z$W!eWt07p?L-ITDFSVnn3%=4`r=IazdxSoEd!rpBgYca;`XET9w&_8{d#@cqSqc_kBDb+5}s${mrHMGtfgKgWYD2#m?Y@JeHpU+2Zj> zPZ(_V7)GvxJ?PKz)+6`|4C6eCUPBk}k?IR>pT{zHaQi*nx&V2=!_yhagC31jK@vQ+-vK1i zW13C8m1&_WrVo&gdpx4g8%}u4Z3}YJLt`7h73Y{GH9%H)w4?)zmmWu~qqn(R0{a60 z$s^)9$QO@aXbS%7F_}(zymcd75nz+<%0zHJx*tA(^VPMYa}__`!+03@>yoqKD?r!q z2qaK9A`~~fSyxU+g+aQM;}CAqh2I6YRd-=G?1FViC=m(KwQUY(+jNd&XfY4f-L+@z zx*V#6hUu>D1F`B}(B1CPeWHOHu2TT(mk&SGD+7j0^DI;9TgCc=w_6_OR}!WRvwJ+=#8zxoz!i)0puy&NBS7( zw60%o7^LWoc?f$(=RoT~s&02%AkXUNwnuBzbgX&^&*`RFUA8OuH`~GNl1^(I9fCeP z#Sab3))lz{pQE$7!O2zK`!yifbj^c-ysq1J2;2=_7bCcvx|QF7ysayvkB;(mW9V_* z(e0<(yQ{0Ay=%ViF1?%kx?1WO1-ggs;2!9lMxqT5b-R5)igY&Gnmy88wa{2D)|Jf% zrbO3lF1S)%3)&`>>1vKc_*gel0%5uCM=ISs(OvkANKbVG=_{^hy6L?@p6gapMqi;j zNn4#4y5D19{!+JbHMmzgBM;nbUET(8Z*-lgpS{(ktp|Ch3*1ZVd8O`mI+lB{dv^+V z_(7LXx%fw&kj}e5>4sCE`mFnGT@r@xw$4ITt(!a?q*gbRR=DrFm7U?FPPdiPrh47@ zcEC64s`{g4UY>t^gG+DEGTM%8@@#mIw)l98XxHcK$)kzI&$IJwApJexPz`LiXWk1y zay+}z2)*HXjP|UzJlmasd7kHWTboe)ov)P&Kt-MffiN%jOrkuw)YGpP++)weAK~nY zXZsQepLvGT4y(fR4ZXRSo>BBzUwaNc14yOk6x+5?93pDz1$gVtC+K6b zv-%@9a1UwvZX=*Or@yuuy7PLTHw-T53w{N;sNa|ba!KEkat~q4Tl(`gTpw!UBEdT{wH7*DSP2tc-ZX zcPhOV=_8s$`bhtX){`5>z(LX2xDb=573sRd zsuvDLv!Cg&*ydRoV~;I<;9l!T2cR);^qYqQ@>V}j1iN>71D%#t>YG#f=Doh2a@Y_0 zKJ@wANBv;yp73s#20DSN)1OZRqCvlC6M{GDhaQ2@%g|>dIB!Gt43JHR9S-p9V;J5K zNMA#zP2l_tujqOD8x);D0t^#Yfdm>(Qektm;Q{rmBr zpkX0~K+9rawi)(RBVee3ODW5CgK{vSVTRX~Nm~sa=D~i4VHTAvb{f=lC=za{j{wqU zSjh!4!Vp4x(_MyQI-ia-h;~32WtdCLceFuIJF?vdmp^e6dkxaTu!}M5SqfdOL7PL% zO`M^e2R7co2|pf@r5Q45Z<=mMr|QdjgDS`x8lkad(-t?wFq_`(6~lb`=s(l2 zco9gJq5WDQvkh?+^3Utlj`T*wF4a;Uhc*C%s4h?S_GAWa| zWf(!lqT7aBvk*4VkV|LFcMPG~(A_nhqlxsMVUZ;jY`)>*Ik5K)@0TD%fk6=t=mUeB z9$cZJ^ly-dh79W8MTXirFnDC>CW7x0!;JYLrG{Sf0Vy*)rUCKT(3VDbxnT&c*iQ`3 zR1|q?sObmfGs6n{e~djhjJg73g<){CHDQ;WDYrci$J%*~I%=h1R14h1dqbKJxDN(n z3F3V;oM1pc8G>j}`PuN5wzgjkEt|phSHnR%F8^leK|{965JMZ}YQvxLK-L%*QlMIc z$qPc9Q?-VdI>UKS=o$=DT!uuHer-JwzAJI_q zGad?r8-HWf3%Cg|4t@?{pz*O5!p+9zl->pz_flbKi?Mn;xUI(TlzavogWJGoh%xpl zgxidlydexVGAF@pH~LW_KFr7&O4+;BD0c&Nhw(uMFguO?=vXt{IGF~Y%@|56V}$YQ zSU`3e8=gQIY3y8&7DgG{(C2p1#`kLg*=<}*dyl=wJ(MKG7}pGhFxGgVQkpoUED2n^ z@l7VkKI2kKe)b!C@;Uh1(gVg6TEPz*$5X8}!FW&y--*WNG<_X1-r5XrNygPwNH}a9 zeGlY_@r(l?M~%~If=xF1(Z1`Lan@;gIc|I~6Oa?el{5pKG_s!qa?0515xkr>j;FjQ z#h6XsJ)SX^<5M9EH`S>91n61gpJjM7X~z5X{n|O>?vW6t8wd3S^t>^T>P#1mf+-*u zjc*@8cgdJS9pbXF*)jyoFnS$<@QTsIz&z9Vg9dh4#_JI<$TsS)0g_{M^8vYPjHil4 zu5sKK5X&{=iY>rgH=1MM?S?UoR{fjCIxB>?j7vh{^tN$rb8vaaZ?u8CW85?w++Cya z3B27ix=aI?Z)`zj@B79|QALMjuZ>q} z#(QHNMi1|;F+BmgcSgS-VOMEfNo)CgqlA+855~-`F!*RZM@J-|j2mcs@Y&dtc28f7 zzqa%Q`_*`b2J<&#oDR||V=m1T)y8v_pVSzC@&KtdZnot{V%!e>0$rm~@&mkinLg2m z(AyN!0^BB3U)m7(m>Q3Q_?r4z@GAUFsWU+QO%01+7hw8z4Y)v)f&S8Cv#D)+AcIWG z?a*y8nTv2QTTK(_83voG?dyzb8hx9v&E)+%NT|ux@(YyPO~pwdVWuwuAXZZY743JJ z1Rc_!gP$r&o0wXsnA850;#h^nTA{jB-)fX6z024Gihnx zV_HKkj4|yw1xT!^au-OP>DgA;#hbd9(0Rf>lOi16_M5UO%ROM~N9VW)O#{w@OE7(> z%q`J0o%W@NOyiv)Ofo&mz>OX;r4%E?QPbNRcu6)z4}k8NiRTXCansfkKu(x;{t4Yl z)38Bk#VJ#ZV}P7Co$C%=imCor2IKaO=^WXon&JmRdDirI7mzg5UfMyOGv$s!)6z|q zlq#M#U0wp=1ycdlQZAat=)qkwO=aNwvdNbYFfvTp0SJG^bdz>MnI`;iLoj|!mDAue z+qCB>xE#~RsnA_DwNB(<+~%5;D{*VrOvYuvTsIAx1aiZ)LI})FQ%NYuEmPhlklUtP z^hWbc=Vl}P9g}|)$X!#fJ21FsYDRA>-^7~&QeaA^?{6NM{3ilZXi~q1-9wYtOX!MB zS12ERWD?Po?^$fp&@e7B?YIeLsmY%@M42g;l9R`#0^7#j=%m@y*`Av^(A3xP7<@K8Y>u#BOgpCl^3~Ll21S+Wn}z25YSTJe6KhOkX(v!?`a*;9 zyQ!}eEb2^0X$xI%nnB;THkj(EwApAn-4zC2=H(}0;B8KzrDl_PA`eI(voqD$ea+S( zF!wXZhd}6W?n(J;fO$N93mIsx3jt)aIp~YcwufnMN%BI#Q1h$ZfNnQmZ4JXPbMGG@ z++qHS`ua}uHL9hCo3s7^v6;nGpo%aHR|C1rJTVx;NVD&L7(|&nF))ZW532^*Z7!$p zHujhwC4=lWOUA<>#vD!SR;;;vAcS$|+m>dK#+(1R53=9fGzx7yV4g+K@}Rl16~YAb zq{)CLnzf4|JY)`j2w{@hleWBv&F$$K9x)H91b5V|Ckb-E5|JaNay? z9=HqUy+4DyXddi?JG^9$rJ3}ySxJ@24D+Hf2zbR@?gdDuIpaQrS>`mF3A4?sLxIdO zx21gMs@a(fU9P!TI>*m`>L2j5YO-A@z=G%1Maob${0#5VHU)w-;$GmeR zgm=xu{({qc<{w2M`Q~Gkb>24zP+7ac?4d#U2j;G{Lo77MrXlV_^G{TKC^D;#!{Cwm zB9%#t&4*e8Sz>-4YP%J~Xe?#XV4s*D?SjQqbC+{~J~OxO0`9q4>xEWSm``2@d13Cv zg6^exhX>-mGW%1h{WjI=LLKU>nMIlRH*+p6@KxsjgQV+@Yx;ctMQgRSu4=W8x@y8mLP#J9 z2_Yeb5HhH>u3B5`Xl)&Bwc6U+Docg}G6FpZ*GMfK}-4Vt=&p?hce)j_87~=^|Fp&%n-Gt+ewx=*Z!KnTQ!YGDu9k`Q> zbuIY|NcaxARL1T~=q@r= zE{86SF<~XRON_sAz@;;G(ixA-42M8CyTS-GTE>{no%s#*CNde5{)O-c!;E&{vKalw zAE0AxJq7dIjB&q%wQ zr;H_VqBcARSIL-7U6uz7IVJa1j2YDFu4a6+5!^$@92<kzqoxs% zM~ukpfIMcLH1f{iZ-+!vwph;y$il@oGCDs4X=3=&>++ltTZll-3{zS&Uof`554#pd zJ>_XH89R00UNQDv!~kD2KK~D-m2u7hVH;z^DD2)aaySsSGcMEn(ZLu?t*lN)Vm}~V zjI+nUbu*sv=oa)a8kb|By^I7}6Z#mxFMzV2Q9q1 z_C_)@8X-K+%`pfw@Z$NFuXpCddWmy-5%zF`KFB zmdw=k!C4CPZ)=cL=HOQ7E;8#AVV=hPl?s|m%wrPzD?91Tbu{kF%$>8~<_fc#HWjZj zXJ&)D#{8Rpv+K+!G)H7G&66YIJr&HrG zhj}amklV~6YCq>Pn-f9unBUUjr#sBrCG-as^YJ?YTEL7R59M8EF$-KFGr$&ZikMf1 zFw$b?FI4&6W3DoV;eBRx6P%VXB?2HznYK~j%9v%7U{KB+Lm%o_FcqaRc);9L0$~;N zH!6RtnWB9l51F&FVNlDQMiaDK9kV3~^bxam9+Z!nXQ;XHgc)@Zn5Rr1>ZLzp>b4j3(!?cGyv+T4WkRlWDbS z$}5;ZG<|RYkQ!5C8FaO#o2iTQ$kek9!pEk$lp#DZHS7fPscE_;uB_hlInCM)ru!QK zX*6Z-K%gemjGGWPn|{&(;R{n+Zy;Mt|D%-RrD>-pgs)A5XVMecYPyyZ{Wen(y+3bE z=RGv0o=2W^gi@kz(*p9^YdS)$gg(|7~K#i?vvwB*ePMakR zfjeXN%W{N@HT$L%!?HakfT{1;|rGC*3)6V93Gd>i%ZJj^vW;KkEC=qCuh%+uF`c$;4(pFZaM$j;Y1 z?-<7EXTI@6kVEE|#DMsl7tk#XFu(jMgn{Pfl!qNQA0RHse77GU!RDbxKm5^ZNn0nJ z8O+z^E5$2rlaA8LCcFK8?au;L%7xlc(mtG*i9(fOgIcNScWtws3 zv0<<~Z(c};8RE^qrTdy-o@+$FMDr;_fLt&yJO)UTx&1ZhlFcWqfiA_|V=}ePQ_WeF zcV09ouKAy#(B+w* zpw`YEbB5tb%Hov`^i+gf|K>95{H$eE-qL#W-?<{6f@-<))M=9W-Mc@$(V#wm-X$U)P5l>0bh=nW? zkWq_I=uvZLy%z}L!HOkko~$~zlTdoGis&rq0oLEN_3X_GIEoNHtVQF%`Lfbzwen-- ze+-L5tVy2G`LkZomP`Pv=qH2-WKF#Sa+viql@md%;vc{Tv)<Bo~GjbK^PPO_0zW;9JTS$QrIQH;}`e1P^-TQEMo)uy6xHQANwS84^I7;9bs^fRq#H9_gTx{ z16RUgx4@v3RltCkG8W@cgfC~A+5u9*GA2?6SjpNR4)TEIO?$yrtOGJ&s#$S#BI6;e z#~;EPR{Iy=YFRfa2dZOz7G`X}h?n=pX#}ok`RE{RV1-cP+{oG)4${Qh@)Ly3tRJYc z`GPf@o}(6)R~~dPS^J)YykhO47v(jp#u`IxW%(6hz-_E_x}|SeU(&VFRo^RD}<+))}v* znap+I_JZ?Z5B&mjPxkk-fb?RQM8Nz2d)jLdZ}z-8=zQ4ILqUAm-)?}=k3Dh;xY6$i8Cy{Sswtlye+s?@xsA1bh4?M2%u^=Yl)QmL`EjvrAk6ImP~pQmz=b?NWF- z!@kyp2xr;NG|$GeTb2QNj_vj%xHxt#t(524cfSLPXLD5`iR_!J0J*^avlHe??1#1x zCbM6>4kmA#qHBwu8Ixdj2!*xyqXm(FgcLk^eOCQ;z7u>YlV9#`1~4)Au3 zUA-5&>+JF~FwbBoEX9~I+4EXJve*$jU~rSoUIAS;yGIA^7TaVQ4071zE`Z!-$9lWL zO)h(DC@^{KyPKiRXXl>=SHLc$`QR@5v<-xX>}nryMeJqNlqqJ1(eHSVy@QX@-)A$a zBV59cq)urmdn4t2W$ZQn5SFt)p*^k&_KV#RRBVSapZN{kOSW#ydnnCbu^ax^6kwk`g5kHa zlV~HVjh#x>>Kpce0+HI;bEdu1kl0rHj|Ld(lL_Fk$72H2G^VLr(2J_62eh@D0Uj)vK*-+&!qThdQC%I>Dg z)Sa^{3_1_aj&^XKoERcr949G+2RIEzhb#D-PU~oY^dM)S00TY5*|Qe`{W-_)!%G0i z`vFKG=i^wA!<_lE5I2bPFcMraXUlxV3*l_&fO#lq*;}|aa4s4E3FDN`fi9dg`4jkz z;5;*CA<$L^ty0H1%Rh$j1n1HJDt?ZTa*2~1lPB;J&9S2O{uJj-2O^y2ME?M1F`Nn0 zFr+h_*ZvTm<&34AIhJEhGu=6kh`L8{oL~KbJkOCj!aSZ+XjqW3*uf2}#JChr11-C$ zob|3SyT}W8UDR-H3&lzL5!ts3!;Z;t$!6Rda+hTfyGdYw0 zfb|W|KT{Dci<5pC_?w)ut0Bzh*zW{)i!*x>NDk-ew}9N{geGImxtvd^VV1`!wuYBG z939=be2&j5kOEFQH8Kl1BSkPM;#5(xTFmj-26B({X&f-m;w7z&TGnM z$~ZQ&p)BX@Scprh;4G)7y^<3?1l#c|a>8lte#Xf^4X&P}`qCAK4V=|cz%+7h4qz}%obrER z|D5x2I=E&|;5Ash;H1!rrWVexJQ%#>9HO=R6{noK?yorl8euDkdBpH6bI#`{qrr7@ zW`+RS#X0H)NH^y!ZR7WF@{M-aO%}Udpl-|n=gfYPK~CyqkRi^rUtu@Q38yCZ2xkLL z@}r#8rO>%s&fbZ59+pdKKhD!KY8qT0u$)-|h_|KN28_(d@;R;jzLw(ofcRNvQPF+S zawT=G4_VsZ!yx=EODn+zST5pu!CRnZ#w1uAwoLs7(jd#wSs=ldpJc)?#8NaKx=_nJ zTHy?q^No`-Ow6a4s^L4*(wPC>amz!7MOic4?$gqL%JSPCAg3)gwBp2AHc?7-#`25f z2z%Djlsb0jEX!y`jI(T{M%H;t1N}PjmKVuoqUGUkT*C#+)pWEc$#OC6IVD@ZrG`bS z<$9`)E?O?#3A;2)2Q}<2S-NZoB;C?>{4rQuw)8YU%`jOk9;AgU)3W3ipcR(Q-H6*_ zIdu;pZI*}oAZ)js(*e?H`P*eU?Y1nY*Q(cYj!}|nvUthcVQ_xj@9ERCgIpu^oDOj{ z)E@Qc_CA9!fZJD)r& zAvke6n}BfFxe=5zW^lhO0P+U6d?L6k?pM?yxXGPC%Rn|a^&z-hTxKvx4)^`B7}0Gm zYaI-7xdDs7<#7{EA;KN*W;RGZH}4&g1zaI*$=&7ZSAi6AODaH$xYBSK6mxe^p_3Z- zxxWU1lyFVE4O4E-af>m)u##)6McfD6^OWyYahK4}Ts1e+2HZpLbNZ2LxZ}*h)pAeJ zykEzyqDAZx*OQ*}$J~XV!Tc%r7fNcLai3C3UC&+Zi+kO`t=kB$k!uqMNE7!u-L&W2 zALqfmnS0nR9Zp|xC6;j0!ri+8_f14&29Y}Zd$p?fv{-f`h5-E8}5hH zBJSWeP-@l5jmm|ti`!&`uA4jQGjP4!1@xBoaWko-*Ux=31>`L^g%nSXaCumj(f3`RR_o}s@v{1mHti2sJ*RTh+v*(sc0N|k zG%5L7X}iJsSv^((dC+PPCG&@@%I8DqZ{=XTeiJj!)Et~^2)n58Y8KCf(6ut9f=HWmYpN$EdJ+9)ds*tX@2X z&uXjFV?k=HX3}Il_SouW4TMjvKDGS{(t4{Qn&um=7SU4h+$uE@!cMEM`4Dzl zX{ndiZB-(Ku*WLv0_=OO;tapvwsJF4?J#1+TMgBy)uw(7!ku?J6vTr!?=8$cd3{bG zUOd+nm>uA8`+)T3wSR%=zP!wx5c=_o^B_FP8=>;x5N{2wd;YvIcaQ*H5S2rLya&6$ z9p(up0}{mhGzcV^7i)C9Win&Jd}^|X@g5l0-NL?4;XjCel=m&Y8OL}%KSCGD3(Np_ zoVWBf>`w4ryhXeyUWdUwcky?NsYE`@dqyvHEH82_ROfh3E#TsKA5%Z=JntwAcO{;8 zJsZ9fc;o8;N#xz7orMcLA+5bhynWdSkjyKa07we&Z+ezedFu@$xgxhO7DINOx174! z8N8e(s4{u~()P;@-fZf-W$`*Gr@YCVwh72=UfWBMTfABl=I~}R!QJMyQTIHLcZJ@@ zJG@`$U|2ry8X*gK_o*Jd%Zs3jp^&$t0m35Q+-=~BdDGk?V0e$WQ3dusFSi$53GWW& zL#4b-S{urEUrqxl=RJJ`Qo(ymH@=d`rj+ynZ+j@XD&8!DRP**y5Aq@Jv+1~&8eYjq zh+E4WraoF7Zw{SIdBhuLBG6;rdg|^z;axPbz*Riunc748j2Hg|q@MRF=B;rJygig} zHuC=Z0ZyBElR}LixA7m7T{i5zGh^myCkR`4e%^qz@$8}zu${Nlc=I+6C0XS|*T=Ja z1lRq%DRTgM%ggu;!gsuziQoo!hL<3NyvuZmc!>9vCy>LuDU<|_@Mh5RG0MB`1J0fQ zr4SGg{zB@=d-6ZM3hn^^`#-^X^LN?fl6?5rcrftgcg{fsKYo@QOR?UXD$a9#y>_O z!uk7eKp4TFvI(4#zy1#x9N}+HgYYPS1rza(@xRY>1C8WQ{|@9he^1E`Jd7{63u5g0&>5;emdnzvHVXrL3fT{G#%tT z|7$Pk;`xd6(%GQL`5waS{JYeC$>4up17Rlr4>`yU{=5b7 zlEt4&ncPkO=DiSR^Y>C?^%j5EW|Q}%<8t@~bTe}KF4RNK;~zZ(H+T3BenZ=L5+i)ZzeJf*J^yh7 z%p3Shszw_5JJ>)r@we&>QFj-)*_HwMif=swcCYzolc8(n%V|Y#nR86<@ zMYQ&J@Gs;7(#hXK^LZEl_jc!13Sc@KzYwFe|9>&jqtBiuWXdRYAuMnbq-~H9@gKj1o5=C)55^Z z`h&&b4p{$L1LAF+vkXFCYdvkB_*u{N#9$6uhl}9zkhSZV@DgBsnu_^AYX>?TblCa_ zN_>K>MLBdxE!cVw9~L3jero^?wbs!qZLr=!#ZI_&AuVwc*1ul@FvL%9UyG7Hu)RebL+1hp=-9@b`ioC*44q_TCBb3%<)TWFHbt8_R89m za=X{oKhU=>t=20k18TDlp|atPH8USvyEV%ih8@=G_aN-F4%Nb2mvuulM$v7Z_B|jy z*5&U(*lV5q2ax^Nb7|Ayt#!dDxOdhI=zzz7^+qd@LF)zd$PHQNQ?}qXY&}d}j}dDJ z1K3gPPuf7-ZEn!r^RQ{6+{4r6)USwpz~%?~Ls;H6_fJ6QV^cT);%j3=3*tc=UIrkC zY?3Q67=N3m-+~LUx$`|B={8GW!|uAxbZQ-E+Gr``%Cc#G4P^Ezo6Z>+caDwkKDf!X z$@>-3J2ruI*#$N^w=uLr8(%8%i)}tC1G#S#nFwL6jl>I1>uf6Nc*G-{QZ=~8Hi0o9 zPi#&ZrrewB)=L>)qs;)VK20|Byy5b>jo%8yd0}&kW|9`0>)$~5(k6qJ-d8r$b^-a? z#(|m+tu|}p0BN&1S_bmQ=Hq{$>##|qqNUU3>KZ`0Y~pE7@3vV_X?3qn2(9#eHc>S1 z_S<~FlFn+rwP~w`a=<312o{4jb$L(@*@$Q#de|n7GN2Kg+!zQ)Z9Y2+&RsCN96Ap{ z(k<9|3T)(X>LoC2!mtkro_%N-xwmMQ?|R@L|DE zlmQ0`Zqa-cEErGSwh+PUb>Kn;b9X{#5OlV}AWSf<02eOcc^QuunJn5=d>;0Zg7rIL zaa=HT29Zt(PS1icN??->=t;qCsy?FyyD0oA!4xWfPYV{)yc8p_83A`ju&o>1S;1af zJ7Wc&&fv}o0>j`ePH@@yd9lgd&y~*LE(pfc)1M?@)q+bF?57zzMc`@RmCRUKK({_! zki@{KFAMVNZ+Bf0thI#jsz5<2*foLMXW*_25~$CSAsA2fd!`_#08wuUqW6Hy5?q)G z&o>1U>K9uK1ju(>%ecM-bi-2x+e>U+}33>v%fa0hm|DWFP@p=FKt%%P zZbT>+Y!kxZo}g>Ian3!HMf`X=HeDgO{0W9uDZu}qi8M*@fh{bm1hc5Htrnc2ANQeP z?(eX#5!f4ly@#_zryC)BBAELMkf(zC%^=SNAEdy%UQl@sJ{tsiA_yA=Q>cg9Bv}3g zKA#IN`9s$%NTE+IUIZJ$z)EkJ0Zgfvk2gkIUh!c=3;ef&sU0$^bft_j6p!h|2yfrJZZQ7IZB z{P!~Kj6$0ba7Tn5V}U#>^s|QfG2utFha4$1Nis|;pFSbn1l&pC55})bOlHiyMp=1` z@ER3yXM{%j;m!&L#=Rxz>bp=YBVIU@mV*T0Dr=BLVfa)8x*&Y~0=guj{a1*PEF4-7 zU5fCF3g}XWRuTv=3Ofv`<#XLWpy%w0(3yVWtHQ3?P+b!yR|9`t7)~9f4B@{AAj}m0 zNuF;A3m56Yl?bIKuqzclorADtLM=5U%7wRS z3!_5VGv9cl)MU<=j+u}?6kem2XN_=g5q#GQBXS_D6COmLdE6u6$~_Q17Dmm4(DsAk3u6c~IE(9Ndtw+mM0*zBe9T+(iOw z`~V)Ju~c4oin1pI=q3784B-LMiDiIzi@v5=!$%ZE-E3dcSHU2DqGQyKI4F`1fgBQz z&^Y}?<&6jsAPU$IE>QH5J)9jD&9wjt5-F*Y2o_0qKo=sa`Tq~mL=~>^W)Qu21H&-U zKI4DoXb2dnr+!TISrpqEN~S zPK!RLWGzNiydIIxh{`{~2+xY7Dg*=MWcH`3PcAD2!B`fuL4}5Xg-~e zDH5^i3X4T&>1fbBk%%^5?~4ZL9V!tqKZom5(RF(N%S7T#+SMr+X{pAl5QR*DvQl(f z4dnyT2lU!hiKedt_fT{$8{TR};gp`$iacmbtxh!d2!xMBujm-hW6?tDpF9zHd00H#H> z%O6f(iYn+p%q!7Ry1}nSt$9GUiWbrj( z1Qv&F+r{95Y%3@e47ROzgfPT5g0lHgTLWbm2HW@PwF}|GLv=F_qbu%bxX1IMo?eA{eN@`T~*m{`3Nw4jke{i?^ZSz*Fu>rg=9&>`(bwpm;x> zjyx=$x)J6<;^(w)8!Qf?16d*BYEL)|75CH3ZV+=R4Gt5pG;XLinW46(%=3uYNIjgR zVsjpJ$HWoCKt_t^&|H38{2%>cpA+KDI7EmNKc#aG(PHZeKu(Ew(eB`BakVkC8h;vJ zKvVlU@iY+(;>1hnM?Eht5dab|w%Z9VLA>rTNTS$^((Vi5hC?t&64x20KE%oBYenEL ziYpT^mNc<}&ZJ!uFBpM&x_E##4lj!@`$Bg`te`jRs(A1hc)2EC{TO!F#l;>l$Pgz~ zK$t0ZB4;+p#NUD|zd3cbW7;@gyol!^W5mXwSCqo=7toJqa8O7Q_Y^;#uf zPtR7hIAsLFhvKXXII9sm>;qRTUPoP*I&lvzkB`LisW5*m-kJf(6Y(`_gFO}dyn>f! z;un;?*NdOIQQp=l&Y&}HP2y}SVV;Ylis7wUoOu!43-OJIuxJrKSqyJ4#V^;x;FVZ+ z8N%0M`CCM46<=Bnu1)+GP5f`fA98UM+r`IeC#gehpb5BB{BId_UE*>}xb7Bb_CePp z{(deM>%HQNWgvaxLRt&^#fvF7d@KH$ruui{d}`$kh<6@?a8Ue&xFPYU)N&XWw>yCw z5x_4Z_(<|;=Jb`!`FxB)@p$%< zcNc*PkZhr6JWw*L2XPNerndkSBw0s`e6S?Ou>bK~w{t%O5iSXE1|mZ8j>c(}Z0A6D zMDocF;Ezh8=>8s)6wvY16qo-nS&4azJtc4N>x$bGIv@ci+P#u+=-EP_yc)n~Gvm7*PGs15QyQ6RXFnan8+PNz>tK;(7imyDo8dNi6T%!jZ(5sf+hrYu zD%Y;)PYCnuZmxs*9lK?0xX!oxfa<9NyWjdDylWRW86zvSI}wL?MRqsehe5GjxG&7_ z*~P5@FaXwRBMZkotoaD z2D@eX@X~14L~me|-H#ClS^XThaB331wEK&arB`-iL*etaUCCvHZM7?*mTH?_9rdZ+ z*m0=K(P1}jF@&9V9;d-|*$IRo-F7E7z^>PBj63Z5?DUkx_S@YHhVZT34BGb}u*;w# zWY8{YKZZ19*E$pNhV6pf=)oDWOQfY>)b2A{INha(+hE}#jT{5cQ@Y~?485d*KY<*O zE~ZDtTUs&!c0STqe*oeueYhQ*pHxN<_(5q`HNqc~im03EFOA=gfC19bDG&xqV?PG+ zu=MpI*ab<)WYX*xEM1cfX^7O<9KJ)P%u{eo4eP-jm3ntVcT9TU3n3zl0E<0FY7Asul=ON~N?sMN6O1+2vEx zc;Q$iqo<`mP%aT8y-i8s8R>WQ7MzvlABIJ&G=g@3&Pi2yfW%3&Xv^rlbmIl+;-xOM zcak8T*9xbJQoBJ2FG!yv#T=I;ov{kKWa&R4ASu%HCg@V7dGkRoN<$XIAWfR~9VMfe zq~ngkB3)`v=aw!@*90QO6=?t^oL8m&d_b>B7p(*2x^&t)j3Pt&(@Joe(l$#N+>n0r zH@Gb6HR?Ftlx~TGLAErFUfx^MUGxpxZK=Wm!d$76cJA_|68f?4NYy(K!7X3vNUKbN zbl)$K-j$C16NZJ-u!ZneB+dI1A&RB8lylvadX{2n_oWXg6)% z!FPo;>mlqarFvJ82U0(3aaKv~s9#boUDX8PL+STya5d6ADZVU_G|}Q>h!;AYEomsYepCg_5*p=_YzSUPyx}zip8|e1{M(r73H{y^^-< z1$iwU*p4x^O2491yiKa62F)9(oR+h8Y2E~c?~wY^Ox-CxNXbu^w8sV^laebOx2`RSLMZ}b7?t@M3Lw%T73%v2c`c~h#~2HcW}c}KU&vD zr1nd|jY=D@fVkV&(h}xj|FZ))Py2uGfq2;$Q3vXPeIjM<-u6BQkLPn&#!xMG$o@3# z82Q_~Z-TD?`$-Al0`1Ly$8ZnZe?S`yLH1i$fD5+&g7)4+> z!t5uDVHa+nVd#85cS<&G1r*!2l!M&2ml)-ZCW{q6{Rm(6_S@-mhX(s%>WntpCs5JW zWd9x27tifkw1M)%-eCiTE%p)gguJvjUk2eTdrhoifAbu-Mw;6??f-rNVVC{ZC|pms z{hi$yLy!G+8d#tGlSt_L?UnRbR^Hmzd4PLoFa8&H1NI7f%LeV|yTD+`K0FBK!}ibn z5opBT{a@%t?dL~}s(!eMt;V`s0KPG` z{s+kWGUF|{DUs!$K!{S=i$WmFWijo5RLDYUFRM}(F#_ZR**Bj9QYHJBc0a3SSFb?$ zP&R4-VU6sb2zIryyj(=6lRXpSk{-!+Yy;%6?3x?>_D^K2|3IF~9BImVCJXxmZt7)L zAA&T>w$p0fB%9&}@?6$55yEEKc53^+ko`laC|YDk|AFt9vOlP3dnG$d`E;vHL;ELf zvU7L9y^)=!Jf&T>?pHuMWI2@4cFNYTCZ}Dp9duNpTUIN9w_e!_N`Cuf6-IFVGE1^} zE9*^w@SRLG8{P(F71QBuP!{Bfiy4wRQqDar%bf|xh-?gPxs1x#8bI9ThZaKTA-_f& zHlFfIYMyz?6T2WhARk;XZUbHix$k8_edI3ZL44&|HL&-SR}TPsQ2y&BaEIjo>;mzZ zyV93a0rCg8Fs4BHNA$uTmIoxjE=b-{3`ns2S{Cd=2N@)Y?>%9m2*R!sLJKe*xDW^6uZD>y*#W zhp+cMFJBW1;amAX5jC-fW+(^c z_TvE^lE?fC;jnxn)dM5)&3=H6%IzqJa(6gONsNcXBYKGg9aL@*9(I`A1}@0KZz;H7 zhhMq@32_kVAPjYwJPgj@u#pm@Fb7K|E-Bn0nFVBoL-XfUR2v-@8WH}8gY$7nk2+kM z3&Ud$x9K;JbT~;DdfcJ%Zy--NR6hYE${~9eASWGS=nao{_=t`TTyYpjO{A+1+wUXb zHHUqa*Ofc0aDYLzLyQebjl*ukhPD}QQ>pT-cPOW{tkGeIDa@WbtWN>rg@bZ3gxwCU zv@-QLT&2{w*Wp8&#`_$WIsww}@cv{7-#QdgoA;eV%hwpgfWzvE&<#55qn`1Q!(vKC zhaI>y^^70R(s{6V+(pd$Sz2oEV%w!@3RqU$V3fFhMHGf)vly2A<|dX<6{e^HeftoVT1 z!y$_P`4~m0VteUwum(i}O)p`JKW`#nxT0tjAtDreX%t32T5+MO6@xXBEGAg2XDe@?daIu`dul z&nwPc1|(jwc>s0^3eSTeiHZbzw38IeDB(y}aH>F36n{*BFjWyw({Gw0Q2^m3#rx!eaJDH)_JO=?Y6<<-2aznv9gkfhX zmQZq*t;qcVx?2iw%0F@x@6(3xZNJ<} zj(aFaNOny74}(c@bo>eisg6>5MlU+PUIH(d9JkQhknZ>^rMs6M<+P)C#c{_8%4x4U z?xK(Vt~p*i2kyG#ASLt}j%Mq@WjY?b4eo~H394hV9No(h;-=%-H4xr%JYWoYga4a4 z&3FOiJ0EJK6guiJU}!~-%vP8eJKm-#_MYQRI{bCt@q5a9OB_8ugs#-__)h4`92X^n zlsh)tLs;RsmNv#J9piJsRXNV81Xu0Y5!!`6uS>tJuhNH#r-RCPD_obq($WhgP${G- zBS<-snj9g@FQ|qxC{1Y#KU}$rYFwkzH3Q>1s;s{Y5~)-RKu#zP+0dO-vOj^BQ_2Je zyu>IysdP(LenO4W6y-1%Bvo0=r}gBb^1D%3q$ywfg1e+#-UgDcoX3LwW#zWN5%7vq zPr2Sz<@g=Oj&`iOe$?X2QhwqOa#N|MUp`y;5zW)Ll&(~vb}zJ zXXr|mf4EUEvP|hmGi|wY!G3tFP!9hKOr_F)Jjes(@~ePWDKjY#tX8&VgR4>gSp;OQ z@-w>Yb;@F@ARj4v;=w&ut`z|JMA=Gp(o?0^QiOk|{FxGy2IYm>xcWw=2fceu%Di9x zm$NCKH)9md%B(ObUnsw$&sypd7JBxsvX0uks6jcrr#8Bm`A*FyfD|~z&4rh{P9II#4rQTJ zs{`B=IepY(nASVp?I&7!OPpG%(_iXjMe9bH(_{KNyWDBfJqRnEI13SQk)X8rm z%%3@}egUrDNj>=nlnqY%-XKz=ldmDQ*W7K*TsV8>RBH#>Yo|#+0nzG&Cl9}f(|{P< z8>cUp!Mxo`vlq@foFdPF>vVcP3wB*jdg|JCJGr`IWIax{ZLsTgy6p{JpVP8%`0RHI zy$SNxX;nLf@0?->0U2;QY7V8Lmxaq6W4chqU0@n|=exgPo< z52)Uw8|$r#r;^r3b!P;euj-!@aO$TTSP1T*D)E13g;Wu=pW?5Ieg)Tos!x1D4y*RQ zgfK|us0ImEHLd^&Q3V}?d8mrB1n~^2-}}IYsebzf5yDm5Cjt_oTJ1&_MwOT{u_LNC z+d+=1f+=-7rm~K8>+BmI} zRKYw(HAxR=XH-`%0(n+-kEX*|)weYJpHoet88c4BNOyzsyy^s1ukosr1Wiy~q{dUC zYEuok3#z&yI89Quy#`5E)zkWxqO$x8_Nl5oGuT~JO`#PcO|>ou2A5Q0o`IyR#?fPV zS+$?C_A9DX6%4Mb9&$mhtCF%{m!aCgdf&+F#oM&yHN@GfQ2J2kmMUN#NRBF^3Buc| zX;cv9s*Y0NJXH<#0PRAAE_f%&xLGG(& z(%mmnE&BoHrK)twL(5eC)XgndHM>zyr9x%q2)0rcOLM~m)o2B{D%Gt*c&k=<(B%D4 z^>-XdjmnP$VXf*UeS=n~T14s0Bb9psF6yz$H3H;`Y8qX{QLPX^bcDoqEZS2c^Wpgt9cewcoh*Kv&Ot!l_v+=s9C zL{wM|tAfgKnIozl?*Tcg+DYGPyF2$#?&sk=jxsY(=Pg|zUe0%C0C~Xqc|3@>b1yw> zKF%}E;nUaoDxF&Lb6z_La?p9z2!w~6XY1h8-?_!Otlwm@+rm8%hB#lbgn6iQJMEDh zoVQiOAk3LZb#=INEX^bl&OV_aMrXk)AdfgpsRBRh{J99^n6qR)NTlOiFR04C=RExV>nI7PgnpBMgvN&O`L|&ueEcl}N45Mc3f#jq_9+AlsdH z_dwU-97L~Dr}HD4nY*32GC+Eqm(uLp>-^0kaDC1`^zimOcjkk}!XOT-SFfdKKS=!_HCThy zyQc#aqLz7q3srwcNsU2WQx8a(+LH+quAaCH_7Up+t3ZruX*D26)H6E49aWpqqH#=p z^cF~@I?NdK&P22+odTX!H&YrItDZLmK%Q`GaR$$U{ALd$=e+TCbAfV}a#VbL(|=T|^vsPVsh zBi&SYSOa)NJ@WvfW~trFpu4Gd{2g4jTE7w8E%i!jUfot-4#B18s^xSzGEco#iJ{z4 zS5a}0uQr^6mjdZ$8N zO4U242T-PNphU1-ojVVtLOqYBhDx;qeIoZj?RFB7D)nJ%O1G(3>0$Rq9gzv&?dp}Z z*V>`p9tL5j`lU0FUFx+BK>E0x{SBPIOX4UXfi8Y(N{@nEYA1sYadD=n(BRTWhT$%9 zn&piyizzRPadD?xa>hk45h2dHi0C1Xbs7IR1{3G9IuHiuUHT#*jCa||1W9mFCPH|@ z#r1udC%J6;9l~T6XDaMdT(Se;?4rxsmt*JP2XV=ym-Uj%&F3KLE?w06xZ<+b*fEIb zeZfomVO;LfQMel}jg&ZMxjd!e-*ic*b3fTGJE@|(<gza;&rmD2x z~KJAI*~kE=PYsph1`KwForiva1^g!!8!vfE;ltp)I>nmxXd5-8FFr zMDWnG8r$J|X7Oq0d^B}*sMJ>z#)qAsX18(S2$G{$bdDuZ^ST7W!4)&)sRa6F_)@-AsEJm~K z8ORyUqedXlYA(@r#%j*dR>?Wd_RHYnH0vmHIIlUs4sqi(ztCcvplOZ)m#8VDhQbAn zdk{vLq!~I7yJSt%QryB6&CCeekx$haw7^`{4E_pCnx>Eoa!C_UxkkFCisswPnl*cj z@-ZfJ)a^8HW@zq=f@EqgQAgv3=8wEQ#}q^YK4`?==fM-Vn^#!xT+g@(Tk z!WK=W2@GCpQYrg;rO8x4_geEF8(gcVlzzxI4NnQ=8_fe+|JpU%!aK*zaNE`kRkx;? zwhMbSuBX8DYIs#Z^l5zmgUfym=MKjAR^v_O(K}5w%`F2O>tH|zHOrquH>9biaKoD9 z7MPD{X3GH?)pUD6=dPVh(}9Qf_}2*Tsr3y9#7nE7b8H8+e^|r<>aG20F^G@0l=?2d z+Q?V%=BK?)9r=UW8mG8r>>>lJ#?gS6FmfehAOp$aNQyH1Lsg=&RCaB9#t zDG)GB`{#ND4A)+90T-ct{shFRJ!TH!5$%4ODvoOH|AP53?Ps*(5vh$n3-jaJH=hD| zLi?j}$~e5N=G8!+)-v`XUW`_?0^AvGsL^2@Cf2dnfQ-`$DLXu`{dF^R@!C#mUMFaO zzXf5UHk;Cs3)N6PNrycm=erGzpe#jo%?qg|?Wg!Afn{Rz!H9mG6MC zN?Y>*NVV2_C3Fw9;!kPcu|}IruUD=1=p0Dvw0_20A7B>zhPK6?X>XfBSFauaEp!c9 z$sKTw+MEAD*Q9+)iQ#kYz8#3$tX0#I$rsvjy&x^xr6m~eOKl$|53jTpwA8%T_HP2$ zs=ZFRN1JvbMR=plr%9z<>+}%94sDkYgq_;>PpM_mrTv1Mt=-!6MtJMd78rMo$5*;N z+cB88+FE1E`(x(1T`dJSthJ#xctk6v&f=(+a~%fmxID+2n_vVn=mx2$5vB{LL*U`Mjx!KO=t}m&nNhcmj&K~& zJ)?!>sO}{dFvoPiP!A|l=idf$T=!uXBAn3u;|(rK_tR^P?4<5jGF>-t2d*#c+=pO(Md!K%!mGLzw`s7rri-Gc!gbv% zD*iHbsz@j^buY0SHtvRQBIQU~y7_dt8wS}rGkU#m=?>9}&m7&-2Ozg~3n)3x z)mcy{B~Q0#1Gqc7@idX=>lSwbQlOg{g9vwZMJ9k0>VDt<0h|`;wj0Yn#1s%44P}Wg z;3|Zrx~DT?QKl=T6u4YxO&L>#?nN>TD|JtJAP;m?AHbkWx9<^<)w;Ko3qI7{{~DKF zqua6t2DQ4+o>) zy&7%0>r{ij(RptKvR#*D>>Q8PVjW$4x9)K>;`Qh@Jp$>~$(};kr@MLvs9UHNWsL%R1aBEqn4&T>Q;(fx1_cB4981MJ-O#wE~s=>Md& z*i#=x2N%5b!#X%SpwDq$2F*S zZvrwvUz7=9px&G+(!=`O#=;3>=1$p4)x1IfU_3~ezTa3n5i`%`I`}-Qk6HlpWBSXM zFpt!0b76N}|Ls}?I-!rH2RBN;@>AHI)PF?hR-*NjTVQZXe~D7U)B47FfW+wYseg4w z|Jha`&+1KS5{}jXz7~*kdN0Zhs|)7~I{~ zm!1G9SO23qgn9aK>LuRM_t8?Hub)~9=LPyBv<~0ZSJNC@sNYM?*&@A#4M?#*DF+en z>G!^b`F(xT8E_@~|2~74QvG;3CRwJx;{mQ*|L0ivtk6$bQ37eDo=2Mu5AX~?S*4GO z0#~iimICuoKad9BHTuJprPu1EbUv?6FWw5|BmH&Cg&*txqYU?nzO)78slL-_G7-=5 zy?)p=>RlKRHtFpa!sm1SstGV?)=Ngfz0kW)LG%`VIkk*l>g#6X%3kS(3!rom;QSP7;U=3zQK1xo)COu7j>DI&OBzbsbIr{;n50 zVHe<BAoc3q>ykV0H%#e)lVjV%IaaD7AVwlLS=Eieyv zHK8thgsaX0I-_g9+h6c@#Pz+8;pV9857c@%<{G#GT%>CweT#71bzwH3CtSm5cPq+O z@CS4!U6&t)U9{_Oly{tR-AoPG)2{E~-?$i878PG-T;1u_JnLFR_b1l%uRsXTxmtVy z66eaK3q0@I{Av=s#k(G++m+z@ud#Cq4luu>d?&@Vc>|oLx`r6#lW?D&(NurgHJB#u zE3T7hvAybQPPz9r*C{vQ<+^Ju6}K6#2NMCwbiJ7egBz~tRN!a1en9L0O;@oVcG<21 z>I~g-9o-5p$F=hZ7~FQ1$^glA{f8clJl879=kK_-&_(3CO5LccC~#eP0GPY33!)({ zbj_l6Xp!suFmT1LTc%+!_gojmgWPxhKgQlOAj&KF7j~E3WjnCd5|db>F~(kFVvQ{- zyX-Ez?84e&NwdZnV+AZ=LlKl!R0I(O0RcrRf(TL-1r!hvse*tMJE)ZRH~)L@hxdNE zUox4Q-^@AB^PDm>=PZVW!#>|WawbTD{oS8I3hk#+?c$OBEH%75w*QYpzao1^84QZ; z(_VlpvA>WG^2C1LOdw0`FWm)KX79I$-cz~#GJ4*p_PLhXcG%LAo? zFg5nIw4~J9Cs80;XCLSW$aDLv6TsEmcl-juR~pW#~h{V;I;s?o;*Ijg!g5!^YIdYEODEpxK#Q>wCrsP0jvDOB|< znfM80a=3y_gzyR}UHrZm;@>9l-2Ue?`0ge)W`XmKr(!?HaKY*dyxxREs&P_V7bLywu(; zusEhJp`tne(VB2dy!}?9k~$70QDKV^Las?K*B&ZlP+cl zsWaDsTvWT#?a*NL7|Sy$bA+NN2;3EQA-%o`b#(@~NcA<#7cvaC5w++=tol(OkZWo? ziW{%1cke}id#a)ysth%D`}p(e-VTa)JA_8JXCL{Kr>(c znd}PGK@^V{sfPI+e4@6y1B+7iDoWJL z)KQeZm#gLb0C}oDM2k>`y7>`=&(vZ6!n{)5O@Tp`dRZHquU7js16iYvj)s?7^)_2T z>eT%yC3~*!UISshy3a_E2K5aEdpc%-dT$`uMsIUvpIk{uu~)u)O2rq(7Dj(8K6^;mNiMn8af?+_J&_C7cq_JduA!?!nK z(CKiPBH)h>%jt1HIkeFv`s^^ul@{ABhXx9cx*eKn)9-N@nhC>R2Q#f`Zkh@j_wJgE z-_YP*4W|sqeHzwA2={9?P;7NTbMq#MhsHpgiKixp2QLRT9Ru)24r!j9hO@((vArNi zG_ltpJgTX30@6$K-T1-qc1*K{j(Lu2PE)Glt?`HecS3XEPc-kNDYLBT%N)QQEVS(I z%k1xZB^#FKGzXVMd0sP-ZWsh;&d~w<1r0A6-3ZczQfc9$Ch{(j!I}kBqQ0bwrRsNx zrYZ}*Lp3&h*j?7NQ`{G(S>**`xaP~B;N^-Yf_D1|%?Eo3BQ<|hf)}Ov>H&~fH3NrI z3L34+rBkCAjrBjk#A?RVetAu^@NYD6T{HVP%d~#j*{6*JG)1GNk8xY`0}b6&O(In` z?r7SK;Lu;%hn8Xhb~9c|1f;#YSvKDaZeMA z`_SzBnh)~<$(B4N=2*^&DwI< zJ<+7lm@Cz6r$nGkGiMGU<(fpw2cBxUe}JpdG>nAnXPVHd@L8$(umH$vP2p;AHJS&s zu+(Zow}GqE459q)xh9%Q&h?rDR26E_bh=VT_d@e~3^0wFrIZRbY3Ba|XtQR@6mTy! zem?@*s&S^n#5PSUT`O(ZDCR=f(|@<#J)49Hte7$q0)G_$B=_+IlREodJ!wG_{E zXsYS%M5iW11@cj2v4QTB=1tcKC_ig|YmZz9j zBv@FqLq-5|S}Te{^JldGXyDXeTSFnpS?%xd0X?UkLaXz6ZH5Gp0PT$;7+lcqqU0h_ zyN6yvkoMeL2rp`vd(An1g2h zP8;4;Z5sXbE?Udk5BnJHfvFJ2YI_pV?ltY&0QBj)_Df3fW(+t0@Wl&C(s@=C3uJ34xDJRgveQg^TkUXu)It>;N zw277(15po;r?~pDHo70Y6=}O^xhd8jItyrt*7FL4Pqb4u!%eBSY!P&2S{1chu1#_U zd8)NN4_$@!0_9uJw4oQlRchNP464$$hQUj$t8;W<{rY-pk&9-aD&9;pCk~wIg zjSCFlYm=#d^+7xO37mFl-_}6bsU2$h>r2e@@wD%BYfDOD*rWX{f}38gJMGQa`#;E-;W0A3F3HhqB4Bf1gi z(E3r`5z1A)bfNzNc}%y8HlyRZ0j`sw^wwnsK*_AzW8RN7Pqz zH|c0AQs?9bU6k$%iaf6B#u#88tt$utBv!YdR?cg>^il9~U6)MRbewLerR6IOry21; z-qJZy^&nYyKM1X-prbHI)dhBfyQAAemnqV8=~To@*A4QAm%F<4bli}kd$b%}rmmW< zJY?y1Qb93W_Z=M~_17PNagD7Tx4mAgwz4e__|A zOQwQ$yKdbp*uB!JQo+5}J-dt+-snaQ1oExU=S%tr$KL7Y{0hu_UE4EYKIlS^f^_Ht zD6{F*_0ktPNwpNB+T*9T-aT4jL(Jc zrsL&d=zYB7n3wR9;5c;xgo%!0D8oo{?9HWEY?>U4a$?^@&sqxTuezUG}QJX9Y;K zejHWTWApCrE|2jXVfL|@R| zaIhY_y@o|(zRxhc4#ES57>oKFJkoGlI*u5wKZe0k!>BIkybRkk;EovzD8D{#P%HrP zHau7k>>=cLC{4S;{{x9O zR8x!?V|clcR?Jv~kcvUq4CgJohGBPoOf{?o!?M}1Pc$s1JDW*{97;288Tb?kCL4aB zC@sYh*9r6620tM>lWN$*$D6rhP*FUXW~l!RFX@I=v@72={7I`zhM{f~keP;qL9oj* z_)x7a+mPD;l4Gbm09~$O#JEi`yl04{WdFWl$~|y-2CMUM`oPeS(z1t!?9;H%H|)9q zU7?}DvS2uKglj*lVwM^v*2AvcFk%vPPYo?}SW;oAVxVi!3@sgiR2ddftXOTRSPfx~ zLG>e?)f)Wda9wBcKM1?$hLLm}S#QV>hp@rW+XC)|A%os%qv0eK9-0gZR2ObG{I&|t zUK&2RI>1efK~14TtKpYY7`7Q!FNCn&P-_G7$}r^upsx+ri(vT1piKhz)^LU*xp#&c z))2lotX~e~2g7;V;yVorIdmTlx5k3|WZ3m9xX*@K`ZYqA;hQ$}qT8^CE@|`_-i#vJ zYjD{Lsk@WvXSmtxq`d~ieNM@hFx>C-(F#s*#^_nidLY=bgI$02kmC=1S4p1*eXO@D}LQIUjC< zoJ!ar!A_oQ0lnn(jzZNCr!D{r>~B~=QXEEA(q=Cn1fs&(d&Bc^tTCy-A-TL z2DHa1gf0^GIz7S`$aXVYs6gv(+^`1RUgH$n4E7o0*1>MSQ9)(t14i$OARfkvbYARf z5;SV;tHFr~bwTeZieIp0V8d4oRI0t=|`nzukwI zKx3l;=0V0QRxrP4JlzR{U}NVZ=q?$@=%EWW&ZT=nmyIrTiWO!&J{-buuF3Vh}mL)L@j8ehBq3CumC?P##~ zjeeAM=NXe1!07{H9__jhjk#Ze%Qw!WxV^ym*8m6$jh#(s>5=gmUFv*n{A&=JC^9Bd z%vx-$p_snJXnPvMQsZ|N_LLc?P`S0-_FT(qNqN3xqF>U7kQT8kf9= zu*rCekj=(QTA5xNx5Yr%VjM+*eyj05MTu?3krcVM8&$5ypnPq7P1lv)7zH%P-Wu;x z+WgLlsuPwS;~5&PAB-EW0McPhrZ~LQC~1f9k4ENJKt358mw|jXwwwT@%jiWrbGOl% zR^T3E%`ND9jm-{d$jxLs8*kLz6yOeSuc<<2(T-(E7cPGeLl09wI@j?uRZtP>plL9r zxQ9%;=*JL;O@-1L^x{VS&0Urm@5-^52mf>j0AA`uCg9=^MCY!&Yt1%Tefz+C2w}8}{uKfj{^(GS~ z^9`m#io9N!9v?#sjizs!0ckRA>jPc0sc{<~;-zUR&59P&hi`#wGYM&vX*UU0LHEkU zD~0g2sg5M;0O!8VY6&U(7&vESL_CvXRxXO+UIhjYbO5PCYBXsjP}K1I>sA!kRr zt8m!)@>O*7i1XqCK#n?p^*tK$a+bPYfZ=iHnlpfUJKK!`=7h5!6G9*7Ksuqg;jEy2 zFv*aUMoTDrL^W6m^$7-=$jgQ|E_w zU|->ET8DO@IcI+buG0CT<<2;!jL9BmDH+Ec^n;ozPA{BK^@Cxf^LQrQG&_%D!TzOl zBNe(@oJ%QLZFL^q4oI7`R0(0bv$JLFc&3c8#4>0SieRr2@oGAp$D{(%>0C~~1perJ zk?cM>|3|seXXnB7@Y&_Oh@yvX=T#da>~VIcl+4ZL10BD)yLeLyu-C=*4EnpzwAzJF4hzp+;n+GHQjiZOBA&vxVX@yNOWnlhe48y(emX4=HOW#G-2+zd`a*Ka zZYuHDyKLk@*x=H~4t6hG`qI(ZLG!c)5PF&arrO1E^Ou9*<%D@ZWwpNMzGG z7IWlLK+c#4jf7o@*$@X3YPO=AnwQN}kAe#`hf-h=Ztgn-EnG2gru{0y{Hyh1u#x6F zmR%FknO`%}nOO4zTnu1eGygy(jO*rITtMT@;XlF64fEDgkelYElL3i0+m44pf_cvk zKoZUUInX7UH%CKv%N$V$l5BoQD_DxzmqNtb<}+3BnQERuU*L{8IS#rsbJZdU)6M0s z|DlU_&6#uHEyHZv0g`EMrwBF6%%yE4+blrn#m+IG@P>V^Ig=_)_smsCfxK_tPnlhw zx#|WW56u5kYW2`Om2Noan-l14tHAs{E#rmecc;KTGCwpx_t?BD0nUodhcCK<7Mtgh zVTl>{?eLY&D!K|&YR;tYmzfnaU|(*Y`7OAoX15^taKRwVyQ^>#3RJ4vS`U#up$j z&Hj_1Y%wpQB&F3HLmh52A9@Jxm3bu{?Y%Y!S{6-4%s-8`whnU_8?h;cr!$t*0o7b7 z?OzM6X!hE>Q*y3l8}MI)2h|mv&z-}6m%gE*#)`7v@c(P-=$67C%T$p3)%*(oT^~qG z+{PEf;BE5~M`*XWWdgZ1l%oA@5#(X}wn_?1cK%B>+yP#tFM&qo)$7zeum_hwA{3BpqhyS4CVVU(r9;TeX5Be=7S_Y^1uGQ8FT8N#rZ zfxE)!MVx*2P~g|L^APEn3Ka|WG1 z>|-XLf$IZIJuNMs%oh_u4l&DVIv!z$((>xXRP6-vIJ2l2A>O)^Svtt(Px=I(m}v^=7Dn9Utk6>K!TVfR{;~u^zMO02y=Ts*k5LS zIxt}u!Q{}vP!uzR%GJ?K<1gT1na*Z#*O^T>VQ_;P_B*(Eraf{Ob|P~Z#ZkAIaym{< zVY;N#TT5jYTf;DoDWw$iE)z2r%K$T)mi%mHB-IgeneRMdc%M0fHsJ?M-Yh`!nZGNc zD`dX70P>hw`Vzuork^*QJz-9#m9dPOk_Ru9%qH?#&2+DTu$E~agRVViPXC$yDs=<1 zry2H*O!06io0-SI1J}Y_NCy{f%yD#X@`@R04>xa^pO>NecT9H*&OR_VJplKKIhpdQ zE++FnAU(`@dR=Z-)8z27*XlhrxZmo-E0DuhhTZ7JQ7eNrkjJgU5ZQjsK4CSEvJ_vd z^>pL>l-1KEfLg3}Z3gt5)m@8bIzz^ES!DTbI%Bfy0Uxv&XEl-bu|%s8qky?(Rq_Wc zlCAoM!E1`u5-O|RwpvfK_pTL(B9a`diqRnVt)?A;@PXAVTALnO&7yi-kyQ@`a3xla zw5OI@`BTlT+$!ujbQM+;>2R*ns-qsdYO62*=MP>qSOvU*n-;5I9st^AmD>f(D=Uxv zAaAU;dBgCXRYw3IomQvmzWpbw`xK~lS>@BGbZ3=b!}IQAnJs_JU<`IWN12E}tDS`= z&anpNfD2&7V!Ua^utfxKZ2qp5`a9&oBCMP&cXyZ$^M1njZ*ewa#M!l9hBwlObSse@h{wht7gmp z23O0zK*hG_?5aU%qJiCz0n&(nq8*TC{JIB_7Iq^2EbBE}^do$}We=p|pZDyB6u9nS zZ#Tl=6MN!H7<93fAy)WHm?fOkn_%&bqnr%Pb!+*5AaT~e{t0h4tdnWT-n8~_hcMpy z_acx4>khj7oM=6&61pU7e=2L-vYxyVx-@I^J`g|dBtDw(=W_pqE`U29dnEfJ_Yu{g zqPbNEz{PM6D8RYKaXy{dNZ{7pP{}H_hDXv>3eP?x3)vg&Rp>VJml@5|B3TBHGd0x!+Lj`4zXs1_rOW;+^2$a2u$| z@RqBhA^(p1Fc`Y`T+s?}AGqFw(a{d>SU!ZE+^8?XedK;eFZ~nuxjp4WpSg9EEp&19 z#C3BcXeI99@&~}8mphgIK$|CT-d||qFfWR}h!;=b1f)055DU(iccKpz#G85&B$&7U3`hviPXlt9H!2wIhVwirk%-`Jq@&y@o-zy0qIq*D>%7Seq$uMS zFPqkaWS$pgN-4b8cfsA}X$}IC!JG3fyyWoegMhrp>!wq-Jl;8~%|GP1*;6(DF|U3o zEQ)!~Cx9vEMbm_>;PDbcs(Js?&D$E@6Z#=TEzf@%3>$bZ&%ibEw6qB75X4jXnke}GUl=3_*8TwQmY|#JQpp0{MQ|yC6EqBO3(iglBvr79;>R?>K-a-= zlP-wwgzvk8EB>&^5DX^!Oo2lcbXkJFU%)V1F#RyN9Kl@Lu5$&y)`Q#=ByWJ-eL+4| znezl{`g9Kj+#BE?3f_+dS0JcS!)KwOh%%5z0xvpQeJmIwLJLKL{8}++v0$(c7Nr8k zOH09AhJ4aCD(Md1N2$ON8AV|ezg>zt7=^+Eqdo#U@)ufI#+JSVZj!hTl4-$~{__}L zO8*RE_OTkwwQk}8Z#9I+9{Aj{cphVx^aVzzm5|BiY(XYw#kFB8{7TyijF{{NeUhWU)4|J#A}|Ifj|1^;gj@)j@_^!vYh%12KT zOj&&)uz1gB$SkuKGWw#^riK5j(|Z>(#{AzV*8j(Z`@c*o|CdR}LdI-*&S}3ehP&cE zH9i?bL4j-qV=nDam5gchRjUw`<4wO{b+}};f$DVGR{a_Q$+Ie_6S#*~T@*VOST)mK*hf}9u5_ib$m+-W z_<|)?!{x_S)itc~3E&2khfa3K))|V9B z1+f;;h3AVbU)mRfS-(+j@e=Ex2S^C3<2FbrYa@l2mswxaNm3Xqg9?`6tcR3FU17bU zZxz8BG6q~E>t#KBMzQK?hrY^E)1nZ~GB^Md!}`f}4V1AgDTRvHSWCM=uCrokRK&4D zd;q<{+OZVmCTnDW2;*5>R-@en*0OKlEs-_Z4O|kd=Q4D+SjL}#OlIZL_0QX^kM8JN zDyts_x_4M#&{=pI%jaJ}(pfld$3n%rGRqap3|1Va8JVm)>O~f71nuzIEcI>(b6ESV z0Lf*|9Sw_nEcJEh?z5a8g5}ba2S;v%2}b`0`rtrHxgV0%l96hsgm_G1)f!`f!!e0 zte2EX)v)?f2vx`0MIqmF*5cJb*0UOhp-&C08AB~&?HPk?exhT`xN7=EH;M$A*B@NMI>^n&y-s}Tw z06D>)pAVf6d;TnNzW9d)Ku)ozB%>ie_7+OnE$lu_kkf3hCLsOUi+_XpS@wp1fIP=e zUJc}V{E2bAiVN)K|M>%Hf$YnkPzJFVY=ZJ4yYUVTFR_zfz%Yb8<1log>|u0#c$w{- z2;brCd$iMDVSAm0E`pt~7rIEcE*ZkBY&#lj(QJVikTK{nAhGP6zv1jUJC8;{9Q!eq zq;B9Jb8`i~$&M()_r+>JWz&c3`Ly(uv%}v)Sj9d}D?tr=cNU!1u}A+3T|Ik8G=#6& zoC1(H>?keBTegcB&-9MHn6icU?44;a_`qKK0A4!Si|C?UC;NN}kRRDoq|kk0ui8M@ zhd#42Y3b==OHbh`y4mCC%2*G3HV4pNwudk5-8h@vVeifvP34choC7-O_Hh|aNi6~A&l&VPAZIyEw&>G2PX0L{&!gLb1aPW$LwJERhjPNN0y)2L0uAEK9E}Dq zat_V_G?-K20^uc2r|(LgOwrN_Sr{iI1F~?=N=hWIa6Vh29WZ`}{06gV&gK@77|yy! zK*n-f>VUk)i5ZGcT<1*w5xO`|@3$Z~IMvJ0iJKh%N$?WS38%<5f#XT3Zz4xa<)K@g zV?V$ynX`2gxD?Llz3A?3PCw#OInDH#cR2A$fTVFW)^z13o%77%puxX;zMrlxWN{=N zz+`i}gF$jQ|509$%i&Qu>>ekW(#HFo=Wig)|rX z3f&7iN=u>!&zYSCWC>?I)sCNVLjFXbN;wM}!Ig1}=KxvGnMw2eDJOypu7dLqMa0iI zkK^IGk~5wv6;+&jv^7+7F6;-ShEq;8$y(0uRFkaZ{4@{-&pBVydQ{H|dJbU&XRs@T zFF19+WArlDWM`;ea>CAlv~aBZ!n&1n`#4;-aU$r|wR7ZDHh;x=xgE{D=2VRb_lC1= z2as<$42mJ%aZXd6;5{dp7Sj)$s!tGhaPTKdFh4l@Dtq-lu#1`9^|AI0h0fPHW+=!>>l6+kr>tGO0P(Z_`2{$O_3BmdcG}v* z8Q#uVKOchz{jH7bU>*4^p z%MGWTK7)IA5rmoCDU=>&aRaGDmCfxd7DJiC4dQ~$ia^v+_(gR@wH)|riyx(&vhT#J;`x(pT*=*qljMC6aipAy6grCf|a23a{TS2ygRJcY>ty7E_5K zjh7LGzNGVblR)nBR;$on25;IU*k$r&UWZ*4Z>|N%Y@W0RkR09)%WETJz{06i&3?ce za~K8>c}M6#GM{&huIv=>3aPzEyk(R=Jmxh;f)w#Yl>Zg;I_M0rgm?EFK%VfvIOaRn zJjk_(=KnL^(>jn!9;XjT6>q}@kZPWb1D>mfryH#U5T>@~Y}#*TTC)Sxzf2iBiKh-WOQGF=}}Y z8$e$1`q)GInzv;b?BDPnr2+bu_n`=G-tmUGLHM2*Pgl=B@JtlZb@0~EZ#+7Aed()y zVp08zt3*h&q%I5{Xgwn=9{tjB~g7|;^g5F-_J6J&%%r`rMyTt#!6_61AJ=gJ| zq5K9)oi6j=P|y{|_cVco^IeC+=@ovi4h=@|KTrxC$#Cj!}kEeSI(fmF1 zL&F&U$pf&9<_|7yVZt!<=A&lp5DhEm6&wfDdCi36VhL^-| zqF?nT^O=j_CWXI_Dh{{#I;wl6@@Tl*3Nr_fpJ}&d;FZle>H$e{dOm{TVpR zi;EUsq8 z6!kJ^D4+082Ek1!zl%b$GX4=N&zJMRKMVV(eD)DQD)?nluzSWoWkyStd;^7RRs1{**x9n&nc}1WLE-`Oj!7Ht@f0gTV`a@_ry2`S<#QYvQl-Lwn8q=PLkt z$>$m&Y~gRCD=w}4?8#`TjlYTP+WFCzwM!X;ZNHrj;d}luS~))O=cQXtFJ%nkZlGAM zi|=enTgn(~`-G0w4+vI_2Gm0^!NbB>#^^t^jtYcF1b;sUIV#w%2gXZKe-q@mAfXM! zTTo@0xePnPaf=IxYbO;~{RJvIu{bN3_#BY)g7#nWN&*CH4CvGaK@tTGfr9OH_H|M4 zj;4FCAhi?RCBa1_3_=7&6%d9BvVQ})EV#ZEt%nIxtf31R+@X#2ieTpmkO;wdqX3B% zh^d7r!PxI;`dt;Q`4J>q@QD(t7(wzsu#XiaorCb2K)(YmT^A%}83}^F zX$?pe*u8`9mOyd}$YenU#X%{8aqVd7wqPdZYN-O%EI{rELOjr5n!x{O2-5|hXojD7STHRK$P&R^O1GZ~rctS-RPgmI7?cS<_Ju*YK=zI0 zixrGP3;I(bqgtS^hGC5$a0$3tK@XJ|>I4U)0DUe9rx3ATu*3#jgW&W(ATI<8J|K;P z!&Fyq7R>Nnu}bDz+6h&=pf?x3UI|{(G2ClG1?8J>1ji^ndMogw%bf27{BIz9FZh+d z;0M9JZ(!FUm@*2GPQmDP5PlTYP-5~)@I@au>k=?pAnX=oQPR>Qm`gRJUcs&*@Zu&E zj|1l}OtUCgGDNOYD?s)OJ*l95KzNYKCLTgRJ)C(8(*x1MAz=ueHXau47l9lR&gwu5 zM}^XAc<~Z${2D%w3D>@d?zpi3XmH-bZ`}d$5r*!8xv$W3D0C-c{Eqbp@Xr-f6OgFPes3^t&I(oG@ODl(pNduIg>B1H-z0ZWNr%A)xtr%Q0@j{g77lM z@oN+^DCTMsZuf(*Sr~T`+)JS=9dxt^!|BknRk-pS z=-PzqEj6pKR(*L5+&iJ-Cy@8TqyvC_5Wd-hzH|tAN$AT*VI+N~PeKL*&3+ahqwJwe zxNSR--9oo4kRIV$no+&NMHKwHi9|2Jxr-LB2H7iml?Q`;qG_~~?iYm?0CGTd}V2L@GERk+Tz!zM_wmb)OUsr#Es+wA~%e`-v(j->`_*UWNH-k&bGZXGDv?wR~EQ zapX>`YM`jO9VAG!jslg7qEbp7gGDY>-?=0TcZV=U)SqT=s7Q4OUE?xA;M?mh1H0RLY4AGFO=u@U>BvtUUMDPD+%NNy7hAvmMB^JVaqM?-i z+!uYMWi3y{qx|K8sE6t;4@LGA2WB=kH4b7$Hg5Y5O1;cE07c7JruS3 zh@+^I;VUk*JY0(h{8bBs)8dmmAv_~?{}Vp_#eW?_3undFbUt`aymA#F=fxEh&_aMX zIRwHBV#zG{3>3ekqF9i4w+MC@#RiHCgTvF#)uc?!5~)5cZ9QR;uRWr zxi0>0E`)L7LOK_}A=Xm0{igVvpI{I#mQy7uL420}=1-z{J|*Ny;-&OGZi&axmXIut zqo6589N|id>us@+nn)F|rxV^g;`+EfpL604Won8v;nVIFIT@PsOvnpsNtu z&B8-G6PxKSQ>Az_t%gE@$0Q*AxH{ES(6u+xLgH7V)|DnNV@r#Y{{Zc%l38Y2Lp|R2`ZcBr%P3%hhRJ(W~ zz0y}=B_%Si#bQc_--vY)@cCA}gi1p1#FuGDd@p`Qb(0Tb5rrfj;-#m?LfR?5d=1c# zVoy8x{v>WAFCKvc>!-{+aZjyWs4cO+E#x=WPyAB`CmVD~-4dHk%FTW}wY?k6{pG zGn@hBMVpBm@R-3iot7Aw+pMD!M3_yc8<62Pn=R!Kx?ZET>8j0_i_vvY#Mr!u zf$LbCps!(m&1MZn#Mf>1KZP#N#`ytSxM33)3uiZNexYBP#M@NGLYQFlRROp}oBY|} zl57HQ0&>fyaS%F~Y-3L|D#gY`H}P)Ul*r*M)u!(c6TsfF`RI=((rgNXLDFqDe+4&p zZGy_cW!M<0K9p%QP6CT8n;Q>7vTc4@ZHf8|k$eSh%AajEQO?nAGmM5|ug#A6Anvwo zinG0Jf3v*&i!sa?Xqg<&e{G#RigmgY-?~AY&TK;CeU_EBZNV=Q;xtO*tTCkG<(Um|IdJg z*#2k(F4VSpsu0RB+Zhyth1+hX*#C;{AzBS1Y!f+f6J`4?Z9!LUr+y7&wC$O};9_he zd;>SiTu-J!cEk3!D|nUhwtsyFNw96E8I@@J6}kY?*jWzlroFKBVPYa9L^x=h=00d!fmy*r`Hwq;Z4F~`=GPIq!` z-&*i*49FNmEbG=|!~|HupwM>85;XM4Hr)Z-W83poi!QRAeG8=6_9#^;N^Fa1rFvpJ zAp%}XZHG;V&vx4>_wZc3wnu0&+izDuN4g$%6ShKl&@P6qOdPf=84o)@yDBOZS?nHh zAv|r@qyjl(H^;)+fWCNH25dlI%q3_q$gZ5yrHghaw!tpguGSvTF4+yC9Vf)@tM#zE zY-jy7kYRQy!vG1lvpWmj6*~*9g^_klR8`nfc4v}7uG*c?Mzhg&IwiPRyCXEOuGxjr zw7hONm8#Woc2;I^H|=s10Z_)Ku#0Mg(?q+5>6ZH&7=y;&qpH;j$)9u~&R24u zUiv9X1`TbCWIF@8GZM~B=*~($(t*`E$#u(@8!=ELDA$aVG*hO2Rq{#+E?RPKGq@PZ zu#?m&i6H>oHOYSl=&nm1?g5FDgwvJR8&;z&WJxRs(cNsxlyunTNPOsKL9WC* z9m0E(yE9;ZU&5v%tp}3fU4T54?AQ)rzGMkiM+zj76o3~>od2iDCKvadduAEqO}wxklna<%wF!Kn{d;l0W|dO9{UQPXBnhzx_gON5vcfKj%Ud+w zBbiIlUazEgGn#Re#(f0mE`3RX-Cn5&Rmb*8JAF6(BU?I>W`d{GJsGlt(r2{89FlIN zpXMBvy7r)fBhu#-#2=N0Qh~)wy2cs0W77MzusbeIpy0q;Dwzi43F#&J`J0b)BaIAS zsceXE%|BAtPdY#>(j^&yoR)5;1oe#c24!mg(xCz%&r185(E2&4Umdvf(kyy}0I8bh z_66y#E#LyBt6zZ&lKRn6??tK2Mj(TwLx;fGC8>8h%tNF@D3}P9ZV!d-vh>d`7=%gJ zSuB4uMBhssfsBw=yayywnohrNijpR*1M;dgB?H1}X^%IaJx0o4SqlEfW>6CV_J&lG z4L3KXnX!PzOV1AiG(pOl0xnVd+9KY9IaW!Xxg(8R52tBTAst$!OZ(BK&%06^$`doB z9IA6mLLYFUHN`t0Ax|;<^p>&>#2G%3#{BB?#OP%82tw?%>D*VM#Nfzu&q&zC4K9LsE zw=R|Dq=1x3`~Ly^a;ZEUc2A|Z*g#fDhpn-6Z(;Q39k2#lBP~=|zW#^NU+MM<*aqqT z*}%S#Zlv;GqqP4Ai{>B37_*^2ntUbwL?!Xp(tu1T-$*M{;NY#aR)&7OlWzYC_V1;8 z)&lZDYPgKr<6Tlsk2`K_OEMrYX3rA#u6asq5R;gfj zO!oR6xZ^TwidDR2mIxS}koi&U<|ETnvD8=QX$Rp+*|1+v19M7NI}fa%tmQZww8$2R zfjccz9YquVvOsSL&&s~0`>E$-&QxPKFLPQ8Hvuv$8FUw9>9+6^DC?n6J4n_<`@=;U ze;&ACS(l}BD@IZ`S>WNT=vik*G80IhY(_4m&t)vCm)Fb6D4}kU{ay)Oqs*G_X*J2pDV}MTZKQ$!Qnr~+ zDqCd3+F{TtTSft1o9uNUxOSQ3cj#Wp`t_nuuVo9@gL@;}N(XdrWdj|+y^}SZlYzdM zl_=2t53<8c0PT?FSw3yUXr4A0x-OaH4mj^3Q`n z_R2SZfp+)Fz25?|U;cLv$N~9Jv`cu%e;5WYo^nwcga_r{QV4TMUReNx!}8(P;Eu>2 zr9yX9-c7UCOWret!m(rWahqU&T+R-L(p&xuRYOk51+<*|$eS(k|1k#huG6ePEoXN7 z-rm{Y^)-#{^YX0}yadQc`@qWu`Q(Z45-1O-0SS_G-@yE$JgWg*u-uXd?vi{G9hHR0 z1MZ`M>`_ctt+>M_g@b4X!#@g zI5>@w*HWP+R&Jpm;$M@yTfDb3WFrH7p}Q&X4g`spM?Zr_f_#$>$V9n2O|&HWNQ&cb z$uC;+x8oD^(2{jW-a}z=ntUIvgz54$iX!jIH{S%8AwS0l$&`QehcHXtM(abid@wEU zIr5|L(BEA70afjpG2{|{dB<$k@eE0AB#fv`~i zhvknQ4AIb=G}MaZ*%Y@G%Wu)XS|T4W0P>0an;;-d<>xK_I~W7hztD_+Ccp6-q*DI! zD&A|Ad=9PV)$$73{A%Pc{{X3#=gtA7PTu<-5o_SOK|Yt>`3w1!W4_h9 z`@8Nt3G-HYXaaiOCciQ3}k8-gcbf4ra&O`WFUh^}!E_us3n0L!~T4GYStUxbaui2IHB|D!T5% z;GE*>3JA|DzJCq707W&`&@U+Vq(c{|P|)dLkYeNxKrSj4_h+ua3{gbVo_$I2%nl?( zVK@tmP(@QXxXX&On*a?{l+bz>u29oUj8Mc2;4M-SNAYo#Vj;y5R~6@);X7L4c>xA7 ziag4UViiu7&$}>kMpK3Dro#IWknswc0bGKj(-DwF#TD8elN1@$iCYR)C|oBicF{;p zQ4FL}bz3o?P6ksISKL7ED8~8u&UTZ!?xwPShGGNdq?w8tYrthGF1`oJR@hO5lcQLO zOXcib#q>U~yQkp#KzCp97gdk*6r*Ubp-U>)xE5d!f-AB0QUI+70VWcbcpA=q|aQ#`) zFA$_lv1S!WkK%`QAiWCz6c9IMUmEc4%JB@4eab%!aJ^qSfPM;pK)Lm62tAamFT$s% z^2g2@VN5BSwOv& z7wgg86Ut1Qs6NU)@j#wbM$;=irJO)puAkC_D%uw1xK9wCQSvD8^;Ztxi+0Z{=UGE{ zPPrrvKF=#Z(?|_a4j2fZ7nI4g>;@`JTdA-fq?}8=xTp-P0T-<7+63;Bvgjb}LzRQ5 z9D7;WM$tf+ax;CUaAn0#a95NKH9$rvFF2#!NaYZ!Q%5P=C{MboeDVQYwDL|h3}Te` zmVt{^##=*oO}Ui9j_XRL*y>wEKguVxir-L9x&chQGHyP+B`7=f;1ZQ*@53TVdDVB> zz8S8QD1FLSCM*HTQ5MrZpj>6dOgOuze7XU``%2LenB^(w)9UmD4YAh%`@fq6lhc`N8W(0O8Kk@x*Db40m52k&{_!Vl$|qxe6G|;AgovNZh|x@ zf2JAzLb;2|OO47Y7r-?sC)3rRX5~9NHh!tJnGEw5rEN1vt1@Uf1)gpHA4%68*Yx@P zOIxkATD2|+A!aj@5R#CD3=%?zomN||Z5?&AwvM)1ZEb6nC3_Pf$`ZkW;s9|oR0Kg# zQAALdEX9S$MiBVD@B91fUU&DtyXUi>=kA^-FuRb_-_F^0Yhd_dw&^yMU9&T(0PCK; z*8pM9Y+LI4_0Ep9g}1)h2e*Ut&z?IU!hzX~&G&cOdflMj(W}{9T7^eu|4zFBqqBcV z1~)eQt9^*>ZN2OVg!8d}LOGAGwVpcfe%8t*fb6tBO`So1>t;F!5@20JrwIbBuhYUA zWIaYRPl)vwPA~|yZt?;Nvwoe*kZ|kapP-Adp6{gvG}8KedX1v2pHfdZ+B)?$T#DJc zyd2P2YuO6;j{u3a(tp{&HmtY-u3tXbLi0*lk^=`^R zlCAIN!63!D_7em;W&N58!hGx8HHcSeeZ@-+iz4f#w4z+GZg4`RQtJ!Fu&=T%>;v?U z^(WLls?xZ2sm$xXQ5j?ZCt+qWXz`X z5W;#hIw<+@VQi+q6YR@a<+Tn@{TK=}EOs(1alrU9j#3gDz_|1a>;oAUR8|Kw_$+WC zj17mO3uWA)en=Q&QySuiGwx8UHG=WZ6d)rR8Jj_(80&wAE}D@?J;4~pY(Ee)<5Nm0 zVi|?>&Brlr{`nEy#53}#^0qKOSPJDX#>AaaCNO@b%s-LQLTgtNgG(KyWQN=g!i$Vv z8cZ=mO?h<*gQ2qQ_P64AnW`aeU?fpXsgdz|Ka}?wg<5b;j56BLX=ZGqlA(q1Y7vC3 zjO8>DwK3kJoskEO{d9vLGGZLzrJd1BjipD7A1HTz%-BLZrcW4dTo^oM6hDB$GsZu( zm+_p@6AFV)M#~aPZC@}FsBZ6Kyhkf=49<|I3uM4{T^h)sEth7?m$tSRkRjXOsRcP~tDxEBm8~QNS2toigA7J( z-z$bQZ>E5Q$8@*?-A?B84`ATW^rNLIfGPYU9GF0+XCS0O%!lE? z1T)XjOB}*{UWpK)%mP}f!kEQ(0SRaR`4S|8`TZD>kxZ-K!9_8n>EL8EGvDkII%D-c zdgKVEscSOx7kc`8m}_XpPh|?}3*5_; zQg)EWoHPLQeN6wgAp4nXvoMqc%)czW3tUt!))y|^g>)9-P!B$)^F8L~D z-ueQjyb4+VLh|o z3l*(#i}qbHZn6CVvO~Bj$X11s^lZ>CJe; zJW7Y&o-#jr55f*+(m{~tOyNPq>txO&@`71!{w>^g>DIMyHNdP|hG>IKmp}ktG8y!< zkRfIo-H2gk05zyyF}=Itd4yR*hmuB_wS3r(G4DKu(A#b`J#HVn>6Fd++I3NP-_P!z zX29_)hcewzv|#O{wXAfa~abTA0B`;=UV+ug|kB*N~mZ^1>{aYsR- z>{e4P6m3^X6;6y@+#ZZG)@}u*H*t2S{(&&wZeKp^EOvg>WZPwz7zxO3yA)4w33l?e z+W<|pd;2URCD|>fIX&5~ehDm6>|W4d_SjYY0b#1$3|m0<+J#?+VVYg-6X??I&h7-a z&u)_~xczoEN+1u|&6x`1LA$Z#AQ^Viw*Wb0_k(3pn3dzKdOCoVZC6Lf8&24*aR$k; zV^}^5!#-xiOCTTGInjp2BfF#K1(CL1K_0+&+wFP)(rfnxO~HM3OKF$Khc(X{0eo4P zzX#{X(!Kz{k6@S*fbQlD%j$eVVK-Op-NDymY6fQQH)l6H3A*|Ec5QehiE5U`a z3X)+L&N@noNCeB-0nQ>>Z!M(7Jc?EMzl@z#LY>eUR@pufGpn7hHkQ>*A8I^n_Q!Bz zVZCeu*~Jn*M)=*VX*5|Uu%1nXmqgai69|#S`onCDvRysu1!ga6Tn3z^v8rifBb_Ct z&E!!$7B4CIbvkv$!`A_6+NFS_jUulAVD($6Dip z(Vl0$HUeQT>j(3+=ou5POJR1A#k4Glz&pFl9|OC>sWgk`pYlTudaR**85LpYG- ztjNRQuCbI{aMxK|hJmbL-KRrGH(3kmcHCm^r^~Bky`F!UW{tiJzH=! ztSMh&4EI>cejv3h3zcSdtWq!fmg`yfe*va}WxoboBg>J>g!`-lrmceE|n$?7IPfRxNp(HDAcP8QXyH|9uB!2IT%a*HGizwd+2fcv)}W8c>vpY5L_VJiFT2L*bM69 z1+xzx1{cB>J%X1|_M~q?!q^L_X%WtTs|t_^Hk)>+BH7=h02#$Tc>^Sxy`DC|V%P^} z(GxebzofoXEc<=>18;HcDd)^Cu^f+X9WaUP2^r8Ou_r#pn3CBGWQ7j*gT@jfspU{`+y za)G@g6XYV>iE^_-c5NICF0&_p4f7)QA+Kt%#q9Vd*q5-^Tme_g{*RW6tL(P5z?8AK zW@0eq?9B1tuCYtW_jPsyRna%t3puzi73?C)dT+809;Mz_6T6s>s5G-Bw8XZsm#u(7D|_N67nMJ zlQwf?Kf^wjvzl5Kah%z-DH6{a*#)G9vt=BRyEqY4o9^b+)Bbb<=bcyx6FF;W`A*`n zsUl0}Ok0nO*u!~uF6>e{DI1~N%VCz#a+Ahs9uGF1^JWA>?Bn=dhMWDI&%?nT;Do#f z!-Jg5wC|C@dHfr6hd8hF;0|-L&C_ywDl zm2;i~m2s?VU|!DIv>L)|oNcsec%4&3nZymwJZctIaBi$d*qfZIw6}bV6Lkf;N=`0K zq_;W0dYuJZ#kr6R_711>cZ8_s%!miHhGWA9cbC)nAILpUA-&(VoS~m!P{&cf1K$mt zmA`;Aa@>Cb9C=(iD%ivy5KU=bZVDxQI^9c|UM3INS!r>*AcS0_o<2P)*sx>7&xNm*Zp)*L|FW zv|ZlM(av<912h&aHqXbAO}S zV-Gill7v+5)(;@u%e_M>O&a&TOmOMkr$r$9xEm??+0WHYpuZP&fP0!&@PpjN)N9S) z9%RAyA+7^WUx&Fjg5fQb`xiA5j&K*;206+-^Ex2MxGQLaJ-8xH_E$raVX%PH<+%6m?8uh6;2Gu&nz74jN)mdor0^c;8necYP!+&grB zEti}8C4_n0k92_Mb8k|gset?TGLQ@0XLZnB69N`;y^lh8nai_+c@bC3 zfL$@Sd>0I^aM@*mlyGhQKuWpk)UmkA{iYYhtBkuj6qs@@KNa4tabsxJzs`MShVTaW z_b526;Qs9Z?k2aN3b{9jWbohx^f9gsdm>FuiJK79wIj{Dy!JvzqOIsw}-0f5z^l)`lJ@slXcl${%bYtAfT6pv3byGp;!;5eP=gae;g20bAb_`@E&*X(i;m7sTVxFFk^J&MrWP@McCs7s}(;;#$IZ-_kt{=MDaEo#FjJXA>fMKHq^v z@vObRfHIm_p9vDf>kR}k^G2y@AIp1NhEc@vKB3h(o;QKoh!)<)EfDVFWzqMuoA=>a z=n{BA^s*%KKE4D<67SF_Fi+;KqNP2Bx0Obi%1b#3$X?#_-5_bawlLVG^V}L}KVctl zMm)Uj=M__ydw^%6ecXe*_w&JJ@P;XKJH%T-b?IT=;;9g3@>&XUp+|YA>k;A@@7YUu zInGOZAG$2wcv}dwd0`EJoZ!W+hc1Wr=|>pFNuFaCAg6e_ZqS|PjeJFa=r@F9@$hFu@crBWEg0P9+0)ai;*DPh zQq4O~=Wl9w0pA01mpA(f?C$ZrA3;~kyG;3D9q%2Q^5@j^81xx8@M5n+*~kl^7ver| zFC`~UylTsiWW1zT=w*ArbEP914|%rtK-zg4I`s93_scZ6dCaSzoDly-E%B!c z`X~l?{a!TZ5Ayz@HSr~H5mf?1yk7b!hj|`TVDXA~j7sPc-by;#I?5ZN*5(-RlnMsk z{6BJF;KR?LrN)>4{dge#_*1FJzLRhM80P-`^auz8_&Um81Nn>TEMyS>RRkcx{E%LY zB?bS5HPagbqxg@L0gdLDieVVTH)tV@<$p-;dK|xuda3dJ;&mVv{v>Kp?cz`T3&`F4 z@53QX;P2cIgG9c<3I<91PX|Gg`OS20BZXgg9ApoF@?sdI@{?%Y+RJbL0KznWg_k{~ z>HKwfK=$*6i5S}f{%X3H2l=jM2s8LgmI8W+&-@L-!~F1j5N7h{P|16Q??U(RDF379 z;EwTUG=m)H4?4h07XR6KAhY?!n_+i?|NCDM=J4O4Pvs|Gzzi z^c+8l-mCNc-PCf=#(@c1U|5p@{C46VfXG-}~$3b_M@16%z#(&>yBBbT~ien(x z_!pNV{0)8u?RQl0>)YYaK&tpzly%7D#W||z2_149{)pXKGgDOWy7G3e}USh_58zPARG9dQI;F2Rt&HENnl&}b-Q8F z%2(zB+Qt_v!9CzJy)lZ1{G4)-cD~{@=pON7?GX1dKY&{GPxyV5>^$Z3=!1L4zqS!} z9sGn$2s`=T(pLKmexMgf7k||p=(_n$)VAy4@1bd`m*3z;FH|4@HOjpE`B!OyAK<^F zNo0_}r38jA`9;gY4e>XBhk(QUtrY$h{~2BO2*36)>_++LY(U2Nz1<+*f;`IHeFRyQ z*Z2y|o8e`r;Nf%x@)vwm3}*oX*?5=-3UVDj1T;u6egQDSf_w>-A%dq=2Zjp5e*_5= zEZ0L9E@*!p77>E(LKs8}-Z=noQGyAy0T3-XYZ0YkW?4xEwMFpoZ`kb;{L=)oTkyLd zAPIs-nqU$I61oXVf{yzzPZrdC3t@`DLjSK}k6<}XfvJLnROjp!?4e0MO;Am(x^%%u zCLs3-n3O5*7rguy1_uPc{D-j|6l~uGVTNG)+IuiOBq*k2<*;Dj4RD!)MU?X#5sbyd z;;6tO9l~RRLi)wRae?6?oMs6!mqM2<*ir@E3BjVTq013WSOo5*;IBe(rv#hmjK^t# zM>w3F5rkWu)2(c0eM`NGJi+8`5atUUX!or^FktxsI?=klFuyDq_d7_DVB}|zVu6<@ zAXfxaXmhGWFh31kso=KR=YZ{$p$~w#E;vTz+zr8AO9hv}U#o*1ZY4M}lU`(;f>peFpA{VEYLS@TtJ=KagjF zgJuXj1S`j2_gqjYfv{6>n!b-0f;Xs@)g?GG07$oBe*(B3L6eMbL9d|oYYenckV$Jo zzu@;dP!0%g)AuzfC@X;QrC`A%a6^I~^R0t3ye=JpY*b*Ffk0z|5UN_dh5f6+`3Nr+ z0_ZDrpfAWz=tsTTox)-|0pl+m;z1Z7+&UKqfx@?$&;<#r*MSQbZtwsJ5eoew3>Cil z5?q+@mvtCexUh|;%?RONbRaKM_`+)#$|zwg)fv&k1h=n90@pMtv}tfIy0qHyh2aF>MBsqt7SOvnY~vap=m&qczAM?i{&-_zlz zE5cen{pH*eJSRX)g{f~rc~y8#1g=aN<_0(A!ZWWh(rdzBsPelm{Kg)JH-t59a9SbM zDuKKybV~tuOL%KC3@U}M(+~A;3r#m+a7Vbh0>WzHZ&d!)2-Vv`?h0pLgh8!v8con% zb;3u-K46mC`<_k=Dsk1dg)EV&(6kNA3zZuY8;krhUK4Eqgoc0TYXyal)*t!IEgTlwdK)w_<{%<2x z`0-`vhJ{I$5WW(g+>8(-!VE|F92G92a&Anx>I2yM*#GE=EAzFV8^wcfKl_i|pxkM{ zc|M50{Z`7j1MH(lfeEzdXFwQazxW}zVEfnj;6m&loJ5FF`;7mcfv{g=xtd|coz+E$ zU-Io`e*k&GK8*w9CHsXIt3y~jbX2L9+eg!6T4SH}1m<_`@9YHRp1tK3bhY+tsEbo? z@7n=kgMATY2#xmUO+enaKjn-oYqoztvv!O9j#fZg?S&f=sLek20)!9k-+KXJyS8ehDS|9rkMaexBPi?^?1CAy3*xDN&DoDS7R)AEj18 zzdd6c$bkKhPQ)LycbNkFM29eHY^6Fh)B2R=kogMSK8IhvMyLZ0-`>P9PB^?l1#gbS zVl8gdfuU-7$n!>BOlo3In;X~ zZoUJHrosY;l2736g2O^KAQv5`SDP0co$mD~rCUV~_LSTfJFrH8yy75c;RcsDq{Kp4 z>R?Ct%2kKJqu|OMN@+DOcX&nx+%<=FU%>pjgI^`M8x9kmfmArGpzr;rLm!(4jB_*aL1vt0$jDj8n1JpH4Z(MkluAz`5i3oIn>UFeXYaMHxQ}LL9`CK zdWY0yKsGq6p{L#G@J$Dh_Z^C88EA6Qb70WyaJU1I7Kc~$xcF9wEmYdJIebl1=mUo% zlv6x(*h3Bcc86OAKpr_5S5HQW#}4yqVgJOT)BO7}uBMY-+!qeq*Fd@)lI;K0l1X~D49n$DM9CLU{#M^N_ z_3C^aKgov|U&qLwAoO!QwFJc9@htfaaNJIIfsVxq7-x{$u-N1HqXRIhj>8MU?R5+vK!`NQTuScJ z9si=9*FMKEHk|Hv{IU-A2OJZxV=xCDCsC%E;dmexc846x=rF@!$M5OBW;zyG5b%iO zlvjWpbu3E&CeKl7ZOK1s z#Sn>ifW74S;ite9I=*up65GzRN5r+QyNjyZK!;X02y{X=C*mecq2 z4Q4xKTmCs_TIrgmJZ(-S&Vf7Pia8@e*5RrJ>@%AKx!1>rTP_%k5aoub~x z=x;cU+=Q13r)B%$`leG#0leID($Xe-rPCa`_qUyb{&(h~%4u34yxnoyNDZlKCutb$ zYn)bm3B$WiN2=lGp3`KS+iRV2sE=0X6laM(ZZ%`6h7!Uir_vgDYj*mH8euI?2`d3< zbsA6UcAJxmGL8pMc4Z(Boi0;>+3pngzYokQ|1`MAPT$im;S;A5IdJyWDd;3d_{^!q zVwHvOrI)J4E~ir3B<^HXy(15S2k2nU^NsXO)3 zX*MNaLrxi#0uDQc@4_HnIZc{|up>@~DG3^NG9&^r=JX!DYTlyP!a;mQ2gsSPsLpE- zlzyUeI!n4!^fzri`-{SMBSe6RGY(v!D2G<7AW_LAScHfs`$88gYNsukFj4tW2oWxt zdIlsy^fQ$ck)mrqfQu5nDF-B4^b76b#E6<7fisKRXMu|qz55Pa$BAxEnha^Y$c1*2 zEuvc%`)n(&JjNcvWYOo@Dm@c|**_MrC z5B1as%Mg9`CY&7-#hZOj&hUCX04GO9L$qcc7v)lMktO<`UXE<)h}x-G$PvZT ztbI~cL%p6;BGy4bPK&-d58+u+{ihI~69rQn>%7Qt0C93fM{}Ud6Is)XnlDn)MHh&I zCPH{Yw5A5ai=vxeREy!i{ZQIcDEgVsY+n`~?}4&Nw1=7>#Uefj!YiUT>C-I{;o;&V z5Y0XW?y6{zHWbT5uZCb=E)sge;JT>vO$cv@7Q6uBj?uh(pFSuH?(*R73D1%O9+!ghPLU>Qq$pcp_xXj2?Wn`rG%5Iz+BK#k3Ikqx~^k3@dO&^;Dye*p4Cw3R-T zr=oib4Dp#Ls2l_C5S^l1`dl=RUd~R@)j80;5NYUMbcqgA3$sTQ7Xe+bXq6>0$7($P zSv!RNB1dmT7!-wl2!ofRNmPaniMCP|J}g>pIhSK)>mls}=Ocdg3(S4R%Vq=VC$5Nx z`A+e)ry%}fW*u|^;^{FUf#UC1LKq|-JqZ#leqeradd6HXrAOi7tV{%m5Es(|9Vxb_ zMs1YXOzUNgIG9R7v-mhQzhcFwspTFg{(Kuqy!g927^X#h#`60~%GfC9ND}Wj0%5ZF zt&@nFBHkbcw@0i$29heS_!yAA;`x+vrHkFZgqMBdb8U#QU;L2f*#qK73xGT*_WBWA zhPaki%0uF-OF<5cr5}PE5nuQQkfY*1yI_7yeAf-a;%#)!b z_h^snwzz!@gjM2WaS+}S@1s_KwK(blHM?uX%O^p3S1hGB{GPbuG%&SdW&#ZB#7h=} z)Qed(rUvnE)U#_8j|KqQB>p-b!e;T>DKKae_kRU1t>PcQ18Ea~Du>+zamyAMJQR!b zfovB?(1-Czyze(~kHw#@eGR4A6LHJ`ngZfIyD zybw=(2f8kC)-LF}#n-7i?-6@a^4%+*LpeyFxZ4%s`^7ys!3~HRB0vVk(X_n06#q;0 zz>v7=G0ca>J-fi^UWs$)z|n|!@pG`FVrP1kW8xl~OuZ$WW1;hrZ0rQ*D@iBfC;31R z;Z8}5#p4YArqgoT9}SjlS7M+clCA$DV5lVN2E2qx{O^E-OC}uviIA{nBW|SRZX&oS z$yyfTMN3w`fO(8$!600lB`3^)#7b^5po^2d`yPD8OPVYN2((T>t5lNY>q!tMOX~ku z@k>;cOYD(YHNs1(#D&)Ty^?(|5Ft&H`U9M$OD0UikoHNQhC;Ys@&@J12P6ub=?+TN z)IG|O{2B!0A&K4-=7%L^<~g}s4==0|V4W}dXDXrovUm=#N|Dd6RbNSbadXVdqd8;72A+dPTr(YrYV+QPRN}f_Sb4%iC17)RTBO8};Tkrm{!S!Aq=KXQn?NG4*cgiE@4~4~Egs>bIbaaW1A6&g{&xOwP4(oMJy0z7w545B;^Ie$VcPP%g&rBwTzc}WPn-`Sozb_bnr(TbSi+)9nCL(XP; zI)|N4kjo>^5k0tuqt1)zXwNZcF6}uTcOImMMYi(_s*X-Lf4K>EInEw)VRzE`;|+kE za&~(w0T!p7eJ%HMt+<+DTDbC@D=qT_mTw0Txs{@@6>An7vt=~=MULOrJt=_k}44VCsaK^P|Ovv}uO*-o7i2rfoi zpad~X^`BTW^Q<_Fx|JBzZfW^5kVL8b4TMjUZnOfIEbVIrNs*4w8Rb3FrL+#EN>5N< zb+0swLZnF*l(wZy7au{~ebNK8a_pBjTR8bvwiAkJgXFMuubF*uhI}f`r^ltWUn6>! zbUS7A+0tJZft--0-hnVjdUOh`PfCNRiaRAOvxLBj*Zxd|J1>o=oH18AuN269Y2`cM z3Z(O?LvTSlgO-7d((Jq7E=h$^AcfL5-@u42OGV3JP$UiGfGd_}?nQ(v(lug`5^3>E zAWNkx+LF5}{rnq{GHJzakaDR$4hGkxTc*%SjT_QmBS9*p_C4k)ml$5@W*AmUEwzYy zM|z0zooXqccIIlNiLT)8N*~Zex+fjy2(DI|O!I!7w3-&NdZ{nH=M7S}HO%izf1#wN zNqV1B>SpQUK-}vVY27Mtty0%mK-#3|>83r9{>X&+LurK9DL8GHYMtTck@Vk{AdjW% zBSD@>Z9-u2RQl{IxOpZ$9uA8RY0y{DJ(s>sE#eo_7D}zUq$x$vbxYeU(Dg_sTZ8M9 z&Y`cgUz$f9y#eX-DIkN=ELzBiq-m>F;uoo?U>;Lz7%8C9!hmvm~q#JVJyz{R=j-vfhqmy${li_4Q4AiG?2 zE1=u$BBVQd&4sB0x#cp0a*W$9526w1j!XMp_^feBdjsU2%PgAA>Re*!!Wvv2--GbJ z%S^ZVkT$!#qG`U>g+oih1DEV05O%qAvmoqt`ILHTJuVe02zy-$j>5jrCByvtWfw0C z)efUBvc*u1xvU<*AiQOlV?cal%t4s>%KAS5@soX#1+$$pX+MzuvQ8eN2g>p`K^P>v zRt#aVY?R7_5ZQOM?uE)?y+OickyH+a%kFFj7a>!=3rM7FW+X_I?107dlGTg}ENZgH z%I;W}U&6jm**}QBTlPJD840r9AE8T>h3A4xl70CUcFD5#LBvauy)b(hahGzbMBXoJ zqL2E3Eb$Gf4$3}w1TI51iTY`WWV=PUD~Dz0FTz)*?5#RLj>xXk&cacdiq_s^vh5cU z;JED81VFN6f782^En8t8EmC{&xR9NfeNEl$Tv=foRC%&(wEdDVv!T9Qfvk&i$_uh- ztAV^I>v#-uNmfh3LfI@KxXZE*>Yf+N&d}F*MfM9F3@eeHBV?)U2GxUCW${!ol*tyh zKv*ubT@UV>Y?@a*46n;peF*l3tf&uMh3pFDLpNo4v^Lz5&6@^NDZBq1(ZhVzY zOeyId*@hT!)w0*=_bd$Nj&h+8Wgp*~ujj6o+;>SZHB1Zt42pzdy? z?1YsQuHwGT-W}2=+2KZzX4y>4TjN?}TPfdcmHqVtoVLj($5?zWTTQn*ZQgWc#;mjt zAbchZ@&}|trb|V@PT3~Qh08dUB7>V0qL4pdoU5Eij?-N;*goCYLwEX}J8&RUi>^u?TJ=hJ@T2fj-<*3o`CF?kE3iaO}?}cT)NzH z43K?tej_0J<)^64OlQcd_ohh_nbUy z8HDHMSE>DyE4RA`VV?XCBS^lSIR{<}54P1~?IsR=Cz6!aRrmZshLm^1H{Hle0#cGCWcrv(~ z^4%Z8?w0&P9JosPN;{C-a%KbqR>@6q&{fNy(27$dubKmLSH6Re72K1*(P&<9m7z#j z1!1FnC#_ibpnB5T;+JV-2(E7TrmT7 zPv!fML-$N>q!qnG&Y-hu&*gqpO?S%GwD!M{A1wl;OTL!o^KN+(3#3Q>6V=wea;t|h z=#vWvf$W#(o8Wpt{ug-}l)pjTOL=A|$dKGZJ;-7CVy|&vU&$v>-ZLV%IR$T{^7GUy z8l*sN3 z8XFa5^y8%aiWdhl!Y0Kxlsh&n7SRY>6rr9lXjQm*K-i|R`WxH>#e7fb9xB$KfUsRr z69w*(!jH}zKUVnp(jm1c3SY|Yo+^Hz-?}_gETRmkLlI47!*hkO1YD;=q=4ZI#oX5* z>{7&h3UA$tmQ;+QN0GA(kX}XQYY_G+j{gDVfWnqG4F(mZW8hvY=FkC;A;l^ekYU9f zdgWdzN+?_K8c~c;*JD)SVFo*-ldXeC(P_OYalcX`6w3>gqvFhi9%!G63mt-F*w>x$C5VpnKt(Lq$uM>)G!B>2^I# zb9#^K3QDW{T%&2F?{`h1d3V5d*&;ftIq2F^3+0e&VL2>@UF(XWeC4X9edrO_9Lj)3 zU5nBo9CNka4bEFR_BC`q%43&c=c{xz!l|Fqyc)yascd@NJbIn;jq?&1gebqHS1nZe zOFBjvrd;9-!vtc z=B0F{>nON=%Jn_q_ACFTwex_|_akrzmEo~)mZ3atvAbqvYxn*~;EpQaqPPE;QdA4> zxN-;0&{;}fv#esqqEfo`rDcsb<>~h@v??Y3cR11{ z<#;z(R4ZpwVOyizM-TU|()M@Q-&49;~_|sa(oudo0U}u z;j=|qtcI{vIfZ(tZOX43;q!s=WGHkGm09$Yi*}{RQUPaLzrVpfQ}$LMLWk0szOv`a z1+T$br_zT0R^JO{x;1oN%9XUu-L3qA#?qsl@@~v6j@S0ZaQRZ1O&2|+ET9zomGVdm z5F^TqZV-+tOQ@MNrd&wvLT^>sdw}?;PJRHLuPS#sbbhL(0)*SC8m$KLSLM)B6`%^B zUVEUb=4}XrRQ8lR1gjpt16_z}63v#Os*ah|V+&JRy$@-)s*yg~2vxS_-VHpYwPCO@ ztGpbCi{*tIkmow@+oE2e)6PwESCvuKvf=$~df=Maw~^>Kg^f5mnq& z1Ujl}Xov2Y%6&c}99O+s0bQ1gcN@BFm5Ua_6RH>H>`Gg&@${aZQGG;D_^hhi2C8$a z<2AsaSH)3BDOa^^Cxm&bKgn~xDuceJ0@ZhPu=au~`WTQGRZHIjg` zpLtxpYSC5*8&oN?;IvU?Tnutw#SR9fN%igP&^4>V^$@nG)|;)WW_XEAP(4(wJb^&% zs`OrXex&-m8RW4l{4rcUQQ1=|@l@qP&8-fVlny66SA9qYSEuT)`*8U}mDCMkm+F0* zWx7@QbbESKkEX$OuWI84aDA#G`tJHwaeaUcsNQ`7gF#grliu2ws`K;UW=NGslk>2u z`vJIDsvdI|2Kd@r@ZzmjD)0b&)NfFE;j6y*E`WaOnHmUps*@K0;;;USW{m)KBz3a` z)$^l3g47ArjtExkUx9?EM`@g)>dICG2vdjc02i*F=niKQYFj6eNcHIx4aGu1xz@Nz``vsWslN7ZdDusEjv_%kSvt3MV&nWZ+ohY;E74|YJ8qvlM7 z@TB_G3UH^?t7)(8wEDn5fSggc(49G}K1sFNIdvpm;Cc1SY9Mpf-;qI{dU6#=zIqGw z2@BL`s5^E+{mugFi(gb9nE~k~^*;nHRJ&aRxvbttO^PCQAnj`ut4%M#T~Tu{!*_{# z>|c;lb+8%Xud271z?G?4bULP7Ev75Hrru9SgRZO9wE22NJw)G7g<5C_*EiMY>HEK> z*5uKyPNn)&sOZ_Mt7cI`td7 zAgotEp<_G^YBu#x8r44Y0J*RJ<0MFvI?Ec6X7$E?jHyNaEzJ(C>fc-ts7<|O?(4`7 zAE=wQ0{T$>F_r%9>WveCd8FPP3a5|Nx9LF46ZLMo!B5rCih+ElX48Y|Q0LBs@VWY% zIS_WLkIsbfg_^w*zPr>1sGjLoyHe+_M?Hg*#9sBE^j`F-87UzBYBd`=_JI0aG}uA) zYB4Ncsu!Mt(;>CnTi}M(uIX_b~uP%d(zgfiIe z?%VJe;uc;F%TPCo0hn;N-bPqNxOHm4MY`RlOfbr=*%QKOw|L6tW8BP?U6|e8q|YkW zjb{ZC=N4*dzhmXNNU|QtB)2_5u*-4VM)}rFH;ox~cidk5iLf z0|pIl@6tf;yJbw<>B>^}6{uz)7DQ;~(7Z z0k>iigoADozX1Qzt)3RHA-5wLAj590zOZ}cwuQotxHZMY^Qc>n1Z2!@4Xv==8vRW` zd^FSO6YMEE=Y97$OZImXO4rE1ZYJA}=Ml(P&yICWpG&okX z$g;A=YQ|gzWuCh<7V6>b);P+bOVGrR0GX&^&|IFR`H%jvPqHR20})a*_vu_iszwnH z$X?B6+8s>O)L8Or@Tc*WG_@bpOjE-kL&K+sdPq~D1mv(rw+URPW_bk25seF_-A6So zAuu?msk2PIi<8mk%E6t`RApi;IT|yaNjs^TGYa!lnjzXaJgqq$2;CWtiN36}n&DsI z<(y`51MJRguKB1W4 z;QF#==7euRi!>iRv}E43;=En=BiJ%cFWa15ho5NBrQOhE(MMdNxlEbJElm*Jl1j~g z^fukrTC-BmwX{YSHS<~c2d0VR{m(IAgX)aO;^FWhw4c;DV@=kzj*W}-Y z#Uo847v3Ig9mE&BKXkpCWwunT_i1h~0O{A1(ONj5;ZklmsQH_Kc8eDvzFL(YWT*CN2_pDw!#;yS zfVPBY&Oj~0?sc=N!G{0x1TbORwe*gMYiIW&ZiIIFBVZ!6%W091(x#htG}w9_{27Qi zZP-UZ#A{#DI4#-@5(sx`-`fcMZfy$P-vn(bEzgPCSsx;7lJ;38NV2vm2X-mi26|`q zXdS6mO4W}325zsmlTHYvY0b8Pq-(EV0NJno@@tR-TE$^FJE%3j`zJ6N+Re5ghqV7$ zKCQ#Sp|TppJ*Mr*!Id4?er}%MIKyg}B^WBN_(Is7)&6D%{+#x^d2n`K`_n{(&DENv z(B)}Us6m&nP3(q~0__d@qaPQv&NSSMT6_AuFKK;^fD~%4X2JZj_AnicdCMFXbrlqeSHte4edo=Kr6KGtp|5gyKpuF z-qL1tgR9gYEr7voZKV@@S812~fZWjr(2QKI4W-4oM!Wu3nBUbFz729uJBIJPLz&-W zZN>+%^VU_+x9_71-vXhpu74+hDLOvQu<1G}{pftZP8JT~L7fdXvkvJ7ZbNrUH|-2O zpVp;(1oJaG;Uoyp>VDb>FXwde(||m$Yot4otMjKcGEe6|9m0IwTW@^^ivnGu+0-<{ zYxn|$g*ty)n=b1Lf}twXmH!E0vF^fhm|xK?5W{teZamdfrMlk+AiS!JeHSAu(<0?V#%Krmo%=6NBDZ(R@w?`(Cwxdpix&vwa z1+`Q=bam9HdajdDm*a(Q8W+MYolhFLZk)x>I*L_Y&?11ii6oiAi z8MN;|q|2ouWLS4>2Zr=Y_iPs8jp!o1=*1b;9igRQOlM6Cr?)<$0~S8|#Mi<3>NmE- z&`%%!6Ua_ImtGZreZ>UW1?Zpr0Z5?!?gnr{dIP=S!TRnRgb&fHshb(9KfDD2!}Kvz zAPmR#F_ri@?{~G;%D^?#ycP37M>1PPz z^*XA$Ec%kQK$K&I%cA3?ZBuczfH zRo_Twm-p%qtKL8|nx_AOa*1^PWl9S7>6g-1uwP#i0gD6rc-jFvsQ<7SkPLkRZ5bWX zuR03dVg1Lncao`RK7-REdfhODNA>rSVvakepYaWJ$Mye2gJkJXwLzDyFJ^(9&_{D& zkfYC8O3CO+{kQ~JoYK3~xuw(k@4^w{j6RGK&a?UfIiTnCoaKO=*H2rHQRM1>S_Cdn z-{A~{eEqk7gDcRVqmJVR{n`u|T-4{#$9qY?nSR4|S#R=yut@(t?c5dXwe+yB=;v-k z1g{dkC#^E2`t83!dR70%pD--b$FkwATwnYrLR{0kQO~BsrXHOFYR>Q z(m&h=U8R0g6MWy+7uyQr$N8P65foh|7_}pw&)jFvYL^^tfeIFp?)>J9_{)l%5NX(@4iHc z$NH=#;GXCo{R{F`KePd3dZwRGsd$HeE;VSL>y5OWb?S>JAp8q`AkEZW`d~_ay7g`T zaNVQtp*Byie&#vo`t*U6nDpxlXy<1@@3<-em_hxUlx)A$zeeBRkiO;;0uJl9QHWRi z8{XhX^g*<)jq2U`;KuZ=XF$B&YiSAdasSx^oUi+~>mYva<3)PVcYpT)v(E$D zMd?(Fg}A5Dj!~$)_iFeGbDx|EF5KPWcMLbeeLQV2M7pnA2rkN=uC*9jt+=M2euS@P_YL%OhZgs1 z)ERAc&!nQQ&3!4=7Z2P;w1Lv@?y(ZWNAB_ThCFt6Tmaz{_fHO(cRXZxwbIkhzMuwgHqo(VDh`vSU9L+BjD4Kq}(00}p|jDuZ-;rt`$q6}NeX|zF^ z2D=!;`@cbGHblIDFxK$H8{py$s@brMH@r>{$6}cGpXGcTes@rJ9c;4U>|-cX43nC{ z?J-F9f=k6#2gqJS#`|!SX4tn1T)N?DEk?M{;JFGz+i%DXLcjxtOsatn8or{eKEsem zXIl;#nAD>@Y`F6SNT$Jo3EdF`hnC8t2A3t^jv3s%sz8q$etrv>EJLXsd}kZ@4#1o+ zq*BG1V;D!Rq?3ku0T7-td`~;8rwxmvAUtDer%COsp?ny2=MB2aFvvAb_QA8uGtB!2 zx_pEG3+M_Adw+-Sg5mTEa2E}u^c#jthV_k;;pVcT=L$fpDPABC3~lc~_|UL{+P>|Ef9Mp&Bg5{0;QO)R4=UQ881_>> z{mk$Q?VofQ4qgHG+>l0jN~dA@uYkNT6jDapWmvJ8oOT;F(ou;XL#-Cx`V0#x`RzB{ zwtyQjIFrSop)V7{mxd2*;BClodpf)g8zMb%F|Q1slyi?5ie>>aYIvQtT*eIIPXO^Y zhOnXYF`lCh8((7;HP8HvN4g>0X&jz2ZY4ekW8i5(1B@RZ0tqx0+=G3Pv1SO+VB@bR z!G#$A*$fhD{DOWt6=uA131bR3PNWYu!WfnbyGY}UYk))<&lSKf+W3;vq!{D;T+7{d zD~{KqsetY_&ZKN2!DzD^T%u7u4g*dyZlG!+**HeuW{Pn+RY7}C8pCjdS(dgKGrVH`b$K+la+>1b-F@fr`V zUl@CSgRaZSDuJ-u*gFQ&V-&0cve)Po3a-!iq6^OYje+xFFkt*H2Esw(KUzRu8o%m1HLeK)bj+xu9Ln2cKP53f9`*DQhkJbJ1!088 zyB**nJ%YXj7v=Fw4dzpI@pyLxoY`X)B}TCx&hO)r;yjLvfQIlQS~>F$sRS0fTVa_oDIkxk97LNQ#~fqv4Jxl zpB1U%=lo$|U$kA)sEsPRa51-a+3#k{g(hSyZ8Jexf#DJ^UD*k}*42OcZ3 zfN1x4|6K@sJf6|Y)a!AUQsX|4w`m&h_xSPyKn6VCd>6t&k8*1BzVvwX6~-{+vG^V6 zhCQ}Z&-j%Gmy*#D4=GJOqaKz#kTH)*w0-Vvs_~+6`k3BN1;*FZlMkt%sY8GeJ55Qn z5$tc8NRxViDVK_(K+{L`Ed-hVpxYa4I`tETA*My0@Dgh3-VYLH%BITHp+!W2NC zQl#lGsuH72MRZ1wL)M^$O&S>3jMv&zj1-sA@cC%FYJ#ylFS>PUf1{Fc2`$ zG@pu;e3LK)!!9uKDLK1nDjE;nC6hnpABCnjX+!w3>E(amicH7q!4;bxj{~`4a+ZRW zm@MmX)2^EQw_{9YrdPCxl$*xrJGo{$u|@`OH%u~W4ON)talzd*)iS`{GDRH%ciWUP z22y3(K$G$vlkPY3)ED^e9QDuZP0U$v(_k7&0BJORHy)7trj;}qH=DksCU1+WuMp;~ zriFA7Z6?n<&;@u7(Ptj&d5gMj;hw(LAd#M~*MN-nOjry%v*!*MkT}o2sW7m3&fSlT zNcY@!49I<+$zIza-S4^hI4}o1chDx_LC;N8#btOF1%Nx`$?k{6Vb6gn5N3LAo(^)v z^IzKXKI&<;4csx$t&}4i_ssbZgURyr{J)~UJ1nZ}d0((5n%GU$L`6-p#~zJ|k=?uP z-n(}TyX-C-H8D+1qDf3lVgW3G1rZRgSh1lZT@h4N5KwxTt{^DV5k$ZOeBb%}@%!a@ z^2{@H-gnNq?VOo8XHf$}r2R5_N2BZ;rozh=`?d5nMBD#L;qF!Y<+P(1W54k@#k8^Z zf6|ZruGwEZ5AC}BYYOOZ*nhejTAcl!L})kdk5e9V%ibjyUEH=mXNEDsewXOojDMT@ zvKR_sb)!N`nmreap{3h@+z5JxeIiY z&%WkM81wC&Xk)CvJ~#(aAzm$*^#v_}&B8Ln%eWcE%7Pst*h zGQ1>%smS3inL;^~ujCWj!uOLHDaREh{0)pNK=LRR;;2Nv5aPJRHy&*#B{N6B%PGmF zkKpBuWCx{g;gS(l7>$s0&w+@PWXz-WBuZlK1>>@$!5!KaiM|OUTJpgR@UKeN|AP)= zBpk(hv66us#b+&8cRi@YcS|y2AH;2moSuBVQ>D2byuut?Gr53NMaT>@DV?1Nu}dnK!s~8nA>9Qx=|TF?f~7OF;3r&~O38Jk zG(86N%Tni!=qg&epQi5^slfu?HR*!|81M~g6Wz;u(i$5;QluBg!%M34?V-P*F-_X| zHQc02->&r?{$ix_547@TOB<=upCkQ@){R{01NwD#p42WA#scZAi7?)mem4(26-vLM zzt&bH9lQy~Vrdtxq$SeSchO;~RA@nmWzq*JXe*aaq6y`Jw8R0%htg&jXcbbA!Jt=4 z9iKvbB$dB=6OC2UZO!PZTI%i_`C^*0c|4reOH03itwH+E4?r|Z@#f))NM9|1)-0W( z1-(V8{148aNspd|)+&AS9(Zk1j;glLr96+3wM##50`G-1aW~pJq*_1t?3DW4hUk(S zTVQ-C4SEg8D`~(q@Lo$*A1p=V8);++|Q>&D#ef#%NqdmK(Zm{*ga?O{UxcUFk;r~QFrZ$5Dvm%vhSYPcV}yTR6!m=#)<&GmECtQ_NhNHcm533qe1_yu-oS zStce5$a734O@~2@g=YWr%ut#!FEAfPJEQR;bDXl*VCE!2FELS6cnV?Glt2q*%HF_f z7}L}M5zaiK^(}&#{WtiLO!BATMKMEZg}BVDyaU1&#Ps<3m5xNnrMW0C9)$e+*+HGn^8lBqo45PG(A| z25^rV`Y+m2m>I-NWjek_A8CwsH6ZB>y9ZhZQ@I~)natTZh%9Cd-TiDvy9)FiCYs{V zT&9z%xp_>DGu2e`nNRJZ7BE3HH{54>^Pv?o32E?F#JJMrUCjJ*0iuNQm<3}gbCQ08 zR>s&-I8)BJT*5^?V0eFshs(t!AQ=As#dDRnbn@ z6Q&QnST&5l@7$N;tzXjn*uWS$5E_|(ouD-_lb-|F%p6<*(ZVEHV0^~-)7RU|9B_rR zHiml_T04^y4af`TJ&J-lm|65-I+>lvFtRS@jhNAaU+*oZ#G;$=%Ee{&FdO>-*~|P+ zztwh;wNvcpD(g>?*$&y-Hi(_F)KNh0l06BA*e!cO@0y!z%ry9Pm&MYlB@da?YluBE zV-JjbWn)?R+$XCQwVgJTohNOE(OVWX8+0F83+<8n%GMWwa7Z?n@@hX>5X~h1GB+Ox zQMS+sbc7y8aNwNz1 zi!Z6N$3Me$y6oF2lx1hiM*aY6w#@reSaW4RE(AYc_WKct`?7Z5)>o6)^$kJOQ`r() z*y?0GA3@a1-q5dq8f0@QMQW6#UxTk^*{}sbw#YWMqwSf@i$0}RSvk$j&t-GI0;F9g z(Cqs{X0n6UA#q_{vKj0dh#b z<6{Uv`QSgn_m^)sLWuHZMSvWZk7|V$Ah)4KhPSrhQh!g z`C!Tt&dX=!q5BK+uPLg#D8H8uLa=f6 zH2Fw+C(`9%wh$Te1r&f~%AY!a2uzmTi_+L^`LNXxIr5EE1IU$EQ6QKnPx=5NU;Y72 z4F&SA=_hjc<<2JoDU=_eqI8qo$br`^_m6|`7P*1;TA#^(IRs;?yiNvWo7|}iNH@i~ z-=OVNg!BU9sqm0fc;uxheHW^?LPl?)ucC>Fev0KZ%ZrN16c?RQxX>**t5`S~U7S-a zrk6NKG4LM@=7Pe}6NHP34u2Sf6~BKBaY-QwfiYCU_X9mlv1S8|;R+cg_7RHs{cskg zaH{J&4i7{TM<44I#qB2$(TX-IeZ(l7#AmPZzE7;92cyWOqi{DB)f711QdH3JZ!4nd z+)upXcgpAz6s=TrzN5%~gey!`tfcQUNwLZi#$-j-61cvrSVob^J;huZj46tjn_)~< zY@$1wrWisOk*?VFA9xvx5c(4gnTkEr`va4us8yoFY{e=%Y@MU{kk;K?MekS8@)Y$n zUFIu_#n3l4S{ikPYJjU@p^ks?4awB+$mHAZX2~hrX9LOWekZC|3RsQn^+A(GLml*DGpHRN*ydUaG zrPn`D1C{<(@J}fVDGffYTu(vS8Rhy)h_lM_Y9P-kuh4Y{DbLeZ$$8~3SD{@{uB6D} zqVnQO^c$@FnHJki%9=CKLX^2wPzY7JcwvNL$~PCm3s*iCa0?@pWBh4HK2qtc0wzlN z`d45sE7RscTu}y7tP!m&r1|!$(!5z*Zfi46-a_-{4dvZlh&bgHs%YF){_#HC-BPZY z0B^UIrIaefD?-_QlZhmHmDLq(Hfd63hF_BNQ(d zD!b_8D^j*orLb5z!VSn0r6B`DDpd+^!&#X!UR=@FX7akDJJ9w>`5%3lRm#%?pj9i| z=K=XxSwzA16J_z+FxDt-sh0m#Id46TwaTM5Ak--%Df+8d#;rhGgR;*|XpPDodXP=Z zxe_3omG^1=Yf-NEYqcHay#586o+~qGyRco!pMv&6Ikymq4yF56xa?HUx{L93DR)zP z^io+wbIU8`{DXkJR_ZIz_C{Gm-E}L&YeDZ(j$IB&ukyJo+FVrc(sbaeI;KPCJ5=s| zfb3MQpmS`yRDVnl0(7_Phsh9bsvN4jxT}uV!<&aHkt*_gR5vMt-K*LvhS}JTUl&6! zx|gab7083C7|Ni$RV$ZaXg;b%UU2HGdb|Q19#Z|a8XfwnVieH)RZkv5h^iygU_7ka zPE$pI>dU`DKcae{c07)%0?&bdOw~LZ$m6Q-#i9N2u}&)j^0exsZRqceigAE;R^=mp z-5(Qc-)lf#P%Wb9@S^J1AJG=9YNg`!CDn!m7(-O?6pnThnV2x9aRe*6*^$jh!w^TI`pxst&c7TXioiW3hpn5FM>1#XLIok%> zJ=IK#_ES_7=?hL(#Z$j&s?)TYk**p{3qghog*to!s`DB^vQ*s>fMlz7QYMh2!q0N? z38)%r63kPHR&8}k!rpHZN;i3qiNr4f?W77OqZ%ujOb@O-Z?f0TDNKeeZf7dB~)4L zRn58%f(vW+7+zf2?Pmem!In&bvz_dJ3K(~>f9Auun>{=WNH=!MEzsTBD}?l5FVai0 zhn1*7*vm#x!D1gf(GI-*?DAnSda}NhMjc>#L{)#=ch>zBiZ*YS-wENv4iX`J+1FIl zIK=wVA#gwT*;yF<+3f$|Ok~&75st%bB`qWYY#k*qN7$dK26U9&*938led`u_IL`jN z8`=r>hX#!7B>StF(BJkm=isp*oM-=bN81IqsV2Y7$u@mTU$!+$du^_~= zpVH@@!0x3JpLbZ{K13ork%HqSb~;s3l3BZNq1|N%(nNlbo!kaU3Oo1=dPrr{Z2(DQ zH*6mOr|Il3V(wd*0)hh3n9c5wg)xV%7z0Kwn?@mU9y^~RrhN8kIEV%8!?_Um*RJ6=oi?=iSgz1?zSK zqLPhX%LDp|)l>jl#g-fZw3MLGI?-X(n;wu8)B?cWw^7;vQUo`iS;$ zt3n|5a=%;wav%3(4Uqe}^f(wjxoMP<9^ewiv_ZDxhpwY+-j};S5aJNmDdr5u%=2Rz zdu!FeUY7|9Kq140yc{5-n2%>71{<||ws)9n=r_0msvE>{+qco-_?uk+J>s(=IB79(GO%|z z$3t+J$mJXdD2e-i8jQ)DAJr1?avikP-{XemziL0RasF|~;!bJ-g`V!hRZc{8oD>pqC^fvCBuR(auy^{;k&dqdkhQvQV zatDkK?jY@5baFPGfOc``6EU=xoSeR`SKK)&(!Sm&GzyuY5L#CN40{t zpTDFB(vz>Jvcdu0ZZGIw{K!aX2YIsuL-OX|3x?*y2c<*v<(sM8c8EW?7IZ(}hN|rT zJo`1;M84DcZ+JV*_Zb2=0sJZ|JsjaZzlC;`ucqH39OEa&1A3f4M7vuj_=SIk_|3Y#oXN%=HxSMDR7=!f7P$EiQit_o5cWAMV<)=~X zeT^S_8(yySL6qFy;P-?8635?82H_?jO$q)jegLiixA`R;c=7x~sthIYz3ZUe;agXM zkjO9l3XmlJUwSQ)`9g~4@A9>D5%>6I&XiT8@RN1{lgdvFgf)%7Mdi?Re!?MW8T{Je z7)&NVF&H9?zi<)!Y(8W;L=K-Qfym{TQtcv-|5|{TeEuH_{R()S5)kh52~VLF@+a>= z6!FY*AdC64iO@=T|Lt_2O8J#^y=8o=xMDb#wCiOsR`3l}6RhMP(ZxLCt7uB8;;&O6 zTFnQ#0P>g*n-A>?->HPC;iI<0_>_O=WAJMEI;w}(@nNGtuji*x$k4z)7z;=vKjkF| zO?(LLT{ZK|h5*vS5C0F4XMCeG&7`e-J;nKLeBF64p7Yn%LbUS>sW|k4zi1E9!5 zgK6_k;nuTm8PcZ>a5fL(Bnq+pGSBX1RUpi)tYEt0(xu zsi#^>+4TYSN-KnydgD+a52`T%KhB79a9S*i?fE=E^;oTD$6-_8daKt)ZbAqab7*if}Sp@f21nQMfKkC z(1O*!P%d#v?NACri275Sbwbtdl>djRUwsKkxO$-iga~zSKAc6WKPP0AdK;w@m(?k> zJ9kB``U$*fb+ArNxayN^T5Q~Odzk+1fl z3AjKlT}}rQ?yEP`3tXtaNbzZr+Csrtv3f>1pe1Up0isl0=K@HXdZaf*x%xB}*dC~x z#q3dt3)~rKRq8))qODq8_%XVFtiDNC_C(Fm7I%&M5N#PeRc{{*W375^D2#RL5wwcb ztGB#@Xi)Fm3SOgn3Ek}`bpXvF&Fa|{Xtk(=zlHIcx-t^TR<(96v^I6WN$~PqeR5zE zpzU}MH;%R$^u7PDV)^T#+mg@cV?91sd=R9-??EwqC|;UskB zEg1KL;3NFq0O2car~>bhu#)BkKS4eP!e3~Z3!^A_ECuhd;1vU2fRKF;#v_7HH+&uy zwo%M-OxQNp6PV*dhysl#gaA78c~XcaW1wJ52eVHJ$-h9H7M$sH=ow*-_+X^%v@t!W zpal!Lbo(v|l}XS-gedWYQFz&=Rbdp7LS7$;C}B9ojhBUOJ22iWLK+>+iWYvR811UC zFdsvU5k8?DHC8C4;Ov^P?=3jHF0|~1>l=dX0<<`xtsmNM3fAeM-xBsT!r5(M_DC4x zg;SpZnIP<=Mf;Ah(wWNYi9%!#M3V5<7ZAz9IGQc*3d2np%ss&`62uf?$_=8A3N*8Y*Tl;aPEkCbE9fXq%M(tW0U=+g`UFEO z5H`%B$p60JNZDnfuzjo|1@P7)REn*mZAZy(Q26#- zm^lrjXcu}v0px{n{zqsXLiGr=bqYyw5M2WP=p{Y?A%rHjSHgb@K)x2tR3GRTtRgoC z@55Yrb~iMu!(hCr;oZ^gZOywh$0uk$423aM^O$ngEX|M+(6TiP==;mjh*{v}YA(Kp zF;8=i-oJcJD&+wMn#yl5-20kfDx4H*hMYsUMH=Tv;1z2|v;$e9;g&&^Y8EYj0&AJ( z#ASFZ*T_pD9%#&zm_5`auLh<<6SWCirKW_grAl*U6|`ziY!jS5*31`e#$oc=PR2To z5DihU8AwH|2F>8n5RIDS-=l{nP0R0SYt~3msgf7iqihy5gR?+3Y(lpaY^jb5^nI_veni>j@x;6E* z==W%*CWF|kvC@p@qAjQQ-c_6Q6FS_X9Z&+~PHn#pFz(X+MzPgy?bWLgZdxNPChppZ zx8TJ?+c_S0WRLd2VL02X{j3*apEfcI#{Jp~M<6}5)8|cww*%TgX`9DOdzey{gIc#s z(7d&~*P(kKZHc)0ecSQ2lZS}g-nSj+9DEPVV_J_@Xgsc6Kqm}NXphkb{7LOw;TXm# zZ4i|fPHRIFfjpy?Q;GVlHj=8}=d=}f;X6n>^lk9YYg;JpyP#d;3FAfWgk|s&ti435 z{UvP&4`Yb-4@&StwG%Ue4AXu%l~T}fZ7S^=MQ8_Z0wz*BkJig5t>O=Kaap_KCvoXm ztn5o?0D4pV9zBd(+9mYr-qv2D%0|4l*#s>?doCB+9qrgY=p#`p-2h{fmZhEHWbHx@ zyn9+ZSG1*Q$L)phRP7HGbfjq`aUQyVy0$|GNQU;WW^|va^+*CTOB+a`Pqy}~*fJL1 z$eIskS zjsT`s`wgXnby}Gc(0c9S#n2kG{$Bvvq_xmyVzai1j+M4($4JrkOk14`(WZSc2jaQ* z0wovi+OMf(_(D5@CbSN16~!~1+DbY*(WO17hIpwJhobG3w(ZR{G``kup6+hy@Yl_9z7B?{n=%cU!@74O(0zbzlNL^o=pIoBa#Z*83qX(Q z7Srr}T$eNgkQ2J-0uWB>wo-BtsM}6A;gs&!a~MzSxarW&==z1C?X2z{I)`yi*C!us zLAr&bAU>@JSa>VYb<=cnU$^HdpoKd3 zU>J*Zi+_ikVqJ*}Z6!K2^;@dD?hH|;8+IIR<+_uUZ#~cjord;M*Gyqhg|6uWyj1GO z>7YH*IsFMyrCa_l`m5G;)57{#*CSSZXghv>+$9+6bWWv!)a$;Zo7SK^)Bw?_+fT>; zn{?Bs;+{9_3fH6C7Tw$x;;ad_b{`IP0`Y||j_Ow(y4gi=+Npc~2*xhmRB`~c zK|Ve7H#rdY=+_K}m%aLp9q_qNKkXQL->=_CxvHl==pP^t=-1F<B@2g(9>g`rb^8@TmR^ zdRLC=7q-FKas7#GXeacU!y!)U$KC)WP=E1T5KifzB|tl^?|tzz27E@}Yd z^ql@W%^~OYgI)l7LGMGwgp2wT+M*8DU!|?B5WS-d+CudoP~;J&pJN0)T%U6ekVyS5 znmMENcV@xMWqllF(^vFU#m0$voxX|z@`m1#st0lU^i$~lCI$+^ZGB)Dw0QlWbeJMR ze}{@#cl35g;3ZN2D{VI<>GM`WOV(G?k%znbEmTmvr=L!n2r2sW6p5zl?`a^?^bdXn zJzc+=4!vdQSI|nFso(2NZnE?$~0oq(HxU zGTQFzL%)Vrs2@mcXOVspt!%~mP&&C(q91e*TB-ha3A8eO0v4M7<@!0aK0VOSq(I`K zeg>^N75epKoS|0gGZ{2K($6b{wMt((3EE@*V=8n#(Ql!uP>ue}KVf{TpN&nX{&o7_ z=(JJ2eml*h4f=P~@Y1MX^bDd&&;Jcxvp$Xr+AaEDo`LsFuf7efRsY~TdT7&6`w+>3ivk1US6x1@VM~X&$-{bdW31?`em? zi*R$+VPG=af*iga264e*j}*LMhnQ5fU3EDBF-9NbFsA`tVjVu8592k5Ih0{scj(h( z+h=zF8xB3I(HQ3tRSW)2hloB9w;T%UA#OYDNddr1+S@ zg?J|n#jDXnpy3+T0!|wuXq62!^sI&mH_WB#dW2#8V2m@;@D07jmkj~QFkUfyPE?ihxF~#FEV_pfzx7x zum#TzIKKp$MYVuv+|fDy}p0H}Gl z$^&l@7=-o_LT-TD~a0x(ctRy2+kWl_kw=GnCT92(Kyc= zyi3NaQ)mk@#^^ALP-BrBjA6!G|3HKrD=9{dFg7S?#*8!$p<+;!@wmA4W2~3rDa*hdxyc#Hf}wMwp?S4DF4KEn)6tyVip@0JOQuNIBg-?%8ZS) zSyFDSu))wC7#lkQsW8eZR;)CZe-Gm$qxuUtt1|kJhU;qM5fAVl8)wjV*%DDAA zXs?Y`^lOAS#*dmYif-d}I;7EKY@0>0*XZ;Ytgen~3Eb>()J1`~(=qNLh`StLdSYm9 zj^Bi%&E4^^c;ZvM|Iv@p=IQw34YVC_eA))Omt#{Uw1bXP+6wV@^vVIm$1!&@+I$`T z@4|ScGz)C9z=lS58FUE;+T6D+EK?}sYZUxacK~o z9e3ezx@DhhiNe_ z20KkxegSWnX$+O6cbg6_fN(P{p#5TZ)7#XqhiOkgXnRbjQqZ>7wD3O=_L-~+Fzz>< zaD+2Y)2->@kOxdH6ry;U_Lo5%G_9dHz}uu>fRXx`j{XaVuc=n_m~K0H%qA@e0j8-< zaC*cfe;?XWQ-Byh9Z8)N&EF?YKc&MH8vR*G*69k=!u-RS8I( zX&RL*Zkhxt2Hi6K*cW}=HvL7%3F1vIlu9R}2TYo2*leijCV$GhGfZ)EIL$O=(5jndN}UKT+r&`Zo?}`+ z9>!c#R~>rFGaaBqo%yEqcIcwObe&?>`=&<}(-)eC9fq;kG@Zhp64PQTx0ae-OhsFn zX*xZva?{KJQJ7=X-+7A^n1?1N5Te55POEOE>063X9+?Jy1FgzbN2k%NO}UXEJ~pYx zU@%Wi8!kfBn7&fN_|){q9mrY}*9v2u$&ZlrriU~$HJCO>z}RS-MS*^kDV?IkX44Fc zTw6?P=L2YLHMP=lr8d)G`o^A{5-DwNH=*i;X~z^mFKdVCw_rdzO>q>5cbP`C!1qg& z?O%YrGS#kxcx`I*2IP&&lUC+#lZ9sB9@C>6XzMlAYtWI4dDsfvQCIT`S7yJZyeE4dRG- z))7FCnwuQacFeqmDj&zqEnW~O%*(35J84#)g$Ohcp>5SuW;aUmPMha$5rx^9B1ZQB zdcpi9yrJy=2E;A1zc_e~?c`yD#zIRnKc{ym+5DA{_~jg1yRZFQ;3wVuZ5yl^X4@`c zGR<$%hHjQQIu~s@<}dD}E!W(~86wYINX3$Ta~ajE3d}pj6LV}ovvCl!=O8lZq(WDv zdFXnyJu>IkK~$MnG(uFHqt?Uc6SJ9;`5JRBMP5(M`3KNLt@)#RK521$1aQ8GHAOk zUl+rto27grjP4dQz3UzpKZ*wTSRClA!d}byFbs5`h0OtEzh&Y~bmVCn>3kAIFUz9< zKo44m&jH5U;%^J1k0p?HD55Q6XdS$6IUfpRoaHS#=yA(3su9L`%Z6=$WLRqH1Vg69 zyA4{FWjn=|*_PAfI>)k)_R(@JLulJC&ypUD9`Y?q>18Rfr1a3#bl(#58yJO_=GCwk zSw5yMl@iMtin>cJiByX&vt-4CUv4q~f_@)Z?oEXD(2^y_&$S(8+y7&+aIUT05`ijC zPc439L9DgRvxS>_%iMn8H&|+^(A8)urew9rGP?zkX3NO;U~I8i#Lwp0j0mdGSg;FvXrw-bF zb9FjMDZmb=VF4KLPN%1IExVo6G%ve3Insl1cXD?D#KS3K zQvws_6cz}6gp=(AXi-kBcynrKly=$%#ISYfjBP2-lrV;)MCO zlfQPO4<_De0>$SEP9LU1+;N&83SOd4X1$YmfoL|HE(5ZAd zd{#KQOoq=&r+Be!KEA$gD)B#Y+Asjd8mB(P!F%fTK5dP8SeMFS^tAp#wF@un1Uq=~ zw(g>=*4Mgf5QLw#UkHq%HDo^^0am*i;GMG?uRsJ@`_f6x^VZMzL%U!NqQKyy_5CU6 zA=vsmtyh<<-wkA;hFIgptqU-i?~*Z?NUIzN1NuitDqX zSFPVH0wl&dY#s=)*6q=NT(gcFfVS(_-^0;%!+NP2BF@@QGuTb5FNKJ=tN|79dD}Xl zo$QmZWM=XAn3+Zs!ITRGO5G>zw4+x?*BS+k62 z%eStHg|h9K+#2`@ z$cI)v)rKmp3My1pS~u*4_Q?7!Ef`hSm2?lQtp{lBe{4NP=jWbS@o$RaVO!sOf$`Q_ z@9yfi2=l3RfGZgF)}#+08mvbaqOsAcq9mos8bJeYw(iM-_RRV%ZSA#M14Y#$+sT8L z($dyxeG{{3k?of@HgjWEEw}Aw6La-*Tek22(*}HLi$5g&zqUXAzqL?eJ8^)`ToH`< z?$cDZG1F9iqb+{*117-umd${L;^_tbM!C10?Hki}w%?(rqdARUqg>@6(XG-*^s5|| zQU}GPc`>{8_y2K|`&TvtV!pB&DAUH2>ITLy9U|pdtYR1?{l7%?R@;6eYLtTph&Ocu RKXi}u92gVnImma%{{g0fqk;ec delta 115768 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 b62nRdrPN+AY2J3%aQ8mZ;qD(E-TnUnRT7KY diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/boot.c b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/boot.c index 0a9d85ae..d2fc02e2 100644 --- a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/boot.c +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/boot.c @@ -143,7 +143,7 @@ static void BootComRs232Init(void) /* Select option 2 as the UART peripheral source clock and enable the clock. Option 2 * is the SIRCDIV2_CLK, which is available on all peripherals and configurations. */ - PCC->PCCn[PCC_LPUARTx_INDEX] |= PCC_PCCn_PCS(0b010) | PCC_PCCn_CGC_MASK; + PCC->PCCn[PCC_LPUARTx_INDEX] |= PCC_PCCn_PCS(2) | PCC_PCCn_CGC_MASK; /* Obtain the DIV2 divider value of the SIRC_CLK. */ div2RegValue = (SCG->SIRCDIV & SCG_SIRCDIV_SIRCDIV2_MASK) >> SCG_SIRCDIV_SIRCDIV2_SHIFT; /* Check if the DIV2 register value for SIRC is 0. In this case SIRCDIV2_CLK is diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/main.c b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/main.c index 49f4795b..4b31b787 100644 --- a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/main.c +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/main.c @@ -190,8 +190,8 @@ static void SystemClockConfig(void) * DIVBUS=1, div. by 2: bus clock = 40 MHz. * DIVSLOW=2, div. by 2: SCG slow, flash clock= 26 2/3 MHz. */ - SCG->RCCR= SCG_RCCR_SCS(6) | SCG_RCCR_DIVCORE(0b01) | SCG_RCCR_DIVBUS(0b01) | - SCG_RCCR_DIVSLOW(0b10); + SCG->RCCR= SCG_RCCR_SCS(6) | SCG_RCCR_DIVCORE(1) | SCG_RCCR_DIVBUS(1) | + SCG_RCCR_DIVSLOW(2); /* Wait until system clock source is SPLL. */ while (((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT ) != 6U) { diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_IAR/Boot/main.c b/Target/Demo/ARMCM4_S32K14_S32K144EVB_IAR/Boot/main.c index fe8a10cd..c2f4a5b0 100644 --- a/Target/Demo/ARMCM4_S32K14_S32K144EVB_IAR/Boot/main.c +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_IAR/Boot/main.c @@ -47,7 +47,7 @@ static void SystemClockConfig(void); ** \return none. ** ****************************************************************************************/ -int main(void) +void main(void) { /* Initialize the microcontroller. */ Init(); diff --git a/Target/Source/ARMCM0_S32K11/GCC/cpu_comp.c b/Target/Source/ARMCM0_S32K11/GCC/cpu_comp.c new file mode 100644 index 00000000..66d6722f --- /dev/null +++ b/Target/Source/ARMCM0_S32K11/GCC/cpu_comp.c @@ -0,0 +1,59 @@ +/************************************************************************************//** +* \file Source/ARMCM0_S32K11/GCC/cpu_comp.c +* \brief Bootloader cpu module source file. +* \ingroup Target_ARMCM0_S32K11 +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ + + +/************************************************************************************//** +** \brief Disable global interrupts. +** \return none. +** +****************************************************************************************/ +void CpuIrqDisable(void) +{ + /* Disable the global interrupts. */ + __asm volatile ("cpsid i" : : : "memory"); +} /*** end of CpuIrqDisable ***/ + + +/************************************************************************************//** +** \brief Enable global interrupts. +** \return none. +** +****************************************************************************************/ +void CpuIrqEnable(void) +{ + /* Enable the global interrupts. */ + __asm volatile ("cpsie i" : : : "memory"); +} /*** end of CpuIrqEnable ***/ + + +/*********************************** end of cpu_comp.c *********************************/ diff --git a/Target/Source/ARMCM0_S32K11/IAR/cpu_comp.c b/Target/Source/ARMCM0_S32K11/IAR/cpu_comp.c new file mode 100644 index 00000000..f98214dc --- /dev/null +++ b/Target/Source/ARMCM0_S32K11/IAR/cpu_comp.c @@ -0,0 +1,59 @@ +/************************************************************************************//** +* \file Source/ARMCM0_S32K11/IAR/cpu_comp.c +* \brief Bootloader cpu module source file. +* \ingroup Target_ARMCM0_S32K11 +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ + + +/************************************************************************************//** +** \brief Disable global interrupts. +** \return none. +** +****************************************************************************************/ +void CpuIrqDisable(void) +{ + /* Disable the global interrupts. */ + __asm("cpsie i"); +} /*** end of CpuIrqDisable ***/ + + +/************************************************************************************//** +** \brief Enable global interrupts. +** \return none. +** +****************************************************************************************/ +void CpuIrqEnable(void) +{ + /* Enable the global interrupts. */ + __asm("cpsie i"); +} /*** end of CpuIrqEnable ***/ + + +/*********************************** end of cpu_comp.c *********************************/ diff --git a/Target/Source/ARMCM0_S32K11/can.c b/Target/Source/ARMCM0_S32K11/can.c new file mode 100644 index 00000000..9c09366d --- /dev/null +++ b/Target/Source/ARMCM0_S32K11/can.c @@ -0,0 +1,600 @@ +/************************************************************************************//** +* \file Source/ARMCM0_S32K11/can.c +* \brief Bootloader CAN communication interface source file. +* \ingroup Target_ARMCM0_S32K11 +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#if (BOOT_COM_CAN_ENABLE > 0) +#include "device_registers.h" /* device registers */ + + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +/** \brief Timeout for entering/leaving CAN initialization mode in milliseconds. */ +#define CAN_INIT_TIMEOUT_MS (250U) +/** \brief Timeout for transmitting a CAN message in milliseconds. */ +#define CAN_MSG_TX_TIMEOUT_MS (50U) + +#if (BOOT_COM_CAN_CHANNEL_INDEX == 0) +/** \brief Set the peripheral CAN0 base pointer. */ +#define CANx (CAN0) +/** \brief Set the PCC index offset for CAN0. */ +#define PCC_FlexCANx_INDEX (PCC_FlexCAN0_INDEX) +/** \brief Set the number of message boxes supported by CAN0. */ +#define CANx_MAX_MB_NUM (FEATURE_CAN0_MAX_MB_NUM) +#endif + +/** \brief The mailbox used for transmitting the XCP respond message. */ +#define CAN_TX_MSGBOX_NUM (8U) +/** \brief The mailbox used for receiving the XCP command message. */ +#define CAN_RX_MSGBOX_NUM (9U) + + +/**************************************************************************************** +* Type definitions +****************************************************************************************/ +/** \brief Structure type for grouping CAN bus timing related information. */ +typedef struct t_can_bus_timing +{ + blt_int8u timeQuanta; /**< Total number of time quanta */ + blt_int8u propSeg; /**< CAN propagation segment */ + blt_int8u phaseSeg1; /**< CAN phase segment 1 */ + blt_int8u phaseSeg2; /**< CAN phase segment 2 */ +} tCanBusTiming; + + +/**************************************************************************************** +* Local constant declarations +****************************************************************************************/ +/** \brief CAN bit timing table for dynamically calculating the bittiming settings. + * \details According to the CAN protocol 1 bit-time can be made up of between 8..25 + * time quanta (TQ). The total TQ in a bit is SYNC + TSEG1 + TSEG2 with SYNC + * always being 1. The sample point is (SYNC + TSEG1) / (SYNC + TSEG1 + TSEG2) + * * 100%. This array contains possible and valid time quanta configurations + * with a sample point between 68..78%. A visual representation of the TQ in + * a bit is: + * | SYNCSEG | TIME1SEG | TIME2SEG | + * Or with an alternative representation: + * | SYNCSEG | PROPSEG | PHASE1SEG | PHASE2SEG | + * With the alternative representation TIME1SEG = PROPSEG + PHASE1SEG. + * + */ +static const tCanBusTiming canTiming[] = +{ + /* Time-Quanta | PROPSEG | PSEG1 | PSEG2 | Sample-Point */ + /* ---------------------------------------------------- */ + { 8U, 3U, 2U, 2U }, /*1+3+2+1=8 | 3 | 2 | 2 | 75% */ + { 9U, 3U, 3U, 2U }, /* 9 | 3 | 3 | 2 | 78% */ + { 10U, 3U, 3U, 3U }, /* 10 | 3 | 3 | 3 | 70% */ + { 11U, 4U, 3U, 3U }, /* 11 | 4 | 3 | 3 | 73% */ + { 12U, 4U, 4U, 3U }, /* 12 | 4 | 4 | 3 | 75% */ + { 13U, 5U, 4U, 3U }, /* 13 | 5 | 4 | 3 | 77% */ + { 14U, 5U, 4U, 4U }, /* 14 | 5 | 4 | 4 | 71% */ + { 15U, 6U, 4U, 4U }, /* 15 | 6 | 4 | 4 | 73% */ + { 16U, 6U, 5U, 4U }, /* 16 | 6 | 5 | 4 | 75% */ + { 17U, 7U, 5U, 4U }, /* 17 | 7 | 5 | 4 | 76% */ + { 18U, 7U, 5U, 5U }, /* 18 | 7 | 5 | 5 | 72% */ + { 19U, 8U, 5U, 5U }, /* 19 | 8 | 5 | 5 | 74% */ + { 20U, 8U, 6U, 5U }, /* 20 | 8 | 6 | 5 | 75% */ + { 21U, 8U, 7U, 5U }, /* 21 | 8 | 7 | 5 | 76% */ + { 22U, 8U, 7U, 6U }, /* 22 | 8 | 7 | 6 | 73% */ + { 23U, 8U, 8U, 6U }, /* 23 | 8 | 8 | 6 | 74% */ + { 24U, 8U, 8U, 7U }, /* 24 | 8 | 8 | 7 | 71% */ + { 25U, 8U, 8U, 8U } /* 25 | 8 | 8 | 8 | 68% */ +}; + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/** \brief Dummy variable to store the CAN controller's free running timer value in. + * This is needed at the end of a CAN message reception to unlock the mailbox + * again. If this variable is declared locally within the function, it generates + * an unwanted compiler warning about assigning a value and not using it. + * For this reason this dummy variabled is declare here as a module global. + */ +static volatile blt_int32u dummyTimerVal; + + +/************************************************************************************//** +** \brief Search algorithm to match the desired baudrate to a possible bus +** timing configuration. +** \param baud The desired baudrate in kbps. Valid values are 10..1000. +** \param prescaler Pointer to where the value for the prescaler will be stored. +** \param busTimingCfg Pointer to where the bus timing values will be stored. +** \return BLT_TRUE if the CAN bustiming register values were found, BLT_FALSE +** otherwise. +** +****************************************************************************************/ +static blt_bool CanGetSpeedConfig(blt_int16u baud, blt_int16u * prescaler, + tCanBusTiming * busTimingCfg) +{ + blt_int8u cnt; + blt_int32u canClockFreqkHz; + blt_int32u div2RegValue; + blt_int8u const div2DividerLookup[] = + { + 0U, /* 0b000. Output disabled. */ + 1U, /* 0b001. Divide by 1. */ + 2U, /* 0b010. Divide by 2. */ + 4U, /* 0b011. Divide by 4. */ + 8U, /* 0b100. Divide by 8. */ + 16U, /* 0b101. Divide by 16. */ + 32U, /* 0b110. Divide by 32. */ + 64U, /* 0b111. Divide by 64. */ + }; + + /* Obtain the DIV2 divider value of the SOSC_CLK. */ + div2RegValue = (SCG->SOSCDIV & SCG_SOSCDIV_SOSCDIV2_MASK) >> SCG_SOSCDIV_SOSCDIV2_SHIFT; + /* Check if the DIV2 register value for SOSC is 0. In this case SOSCDIV2_CLK is + * currently disabled. + */ + if (div2RegValue == 0U) + { + /* Configure the DIV2 for a default divide by 1 to make sure the SOSCDIV2_CLK is + * actually enabled. + */ + div2RegValue = 1U; + SCG->SOSCDIV = SCG_SOSCDIV_SOSCDIV2(div2RegValue); + } + /* Determine the SOSC clock frequency. */ + canClockFreqkHz = BOOT_CPU_XTAL_SPEED_KHZ; + /* Now process the configured DIV2 divider factor to get the actual frequency of the + * CAN peripheral source clock. + */ + canClockFreqkHz /= div2DividerLookup[div2RegValue]; + + /* Loop through all possible time quanta configurations to find a match. */ + for (cnt=0; cnt < sizeof(canTiming)/sizeof(canTiming[0]); cnt++) + { + if ((canClockFreqkHz % (baud * canTiming[cnt].timeQuanta)) == 0U) + { + /* Compute the prescaler that goes with this TQ configuration. */ + *prescaler = canClockFreqkHz/(baud * canTiming[cnt].timeQuanta); + + /* Make sure the prescaler is valid. */ + if ((*prescaler > 0U) && (*prescaler <= 256U)) + { + /* Store the bustiming configuration. */ + *busTimingCfg = canTiming[cnt]; + /* Found a good bus timing configuration. */ + return BLT_TRUE; + } + } + } + /* Could not find a good bus timing configuration. */ + return BLT_FALSE; +} /*** end of CanGetSpeedConfig ***/ + + +/************************************************************************************//** +** \brief Places the CAN controller in freeze mode. Note that the CAN controller +** can only be placed in freeze mode, if it is actually enabled. +** \return none. +** +****************************************************************************************/ +static void CanFreezeModeEnter(void) +{ + blt_int32u timeout; + + /* This function should only be called with the module enabled. */ + ASSERT_RT((CANx->MCR & CAN_MCR_MDIS_MASK) == 0U); + + /* Request to enter freeze mode. */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_FRZ_MASK) | CAN_MCR_FRZ(1U); + CANx->MCR = (CANx->MCR & ~CAN_MCR_HALT_MASK) | CAN_MCR_HALT(1U); + /* Set timeout time for entering freeze mode. */ + timeout = TimerGet() + CAN_INIT_TIMEOUT_MS; + /* Wait for freeze mode acknowledgement. */ + while (((CANx->MCR & CAN_MCR_FRZACK_MASK)) == 0U) + { + /* Keep the watchdog happy. */ + CopService(); + /* Break loop upon timeout. This would indicate a hardware failure. */ + if (TimerGet() > timeout) + { + break; + } + } +} /*** end of CanFreezeModeEnter ***/ + + +/************************************************************************************//** +** \brief Leaves the CAN controller's freeze mode. Note that this operation can +** only be done, if it is actually enabled. +** \return none. +** +****************************************************************************************/ +static void CanFreezeModeExit(void) +{ + blt_int32u timeout; + + /* This function should only be called with the module enabled. */ + ASSERT_RT((CANx->MCR & CAN_MCR_MDIS_MASK) == 0U); + + /* Request to leave freeze mode. */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_FRZ_MASK) | CAN_MCR_FRZ(0U); + CANx->MCR = (CANx->MCR & ~CAN_MCR_HALT_MASK) | CAN_MCR_HALT(0U); + /* Set timeout time for leaving freeze mode. */ + timeout = TimerGet() + CAN_INIT_TIMEOUT_MS; + /* Wait for non freeze mode acknowledgement. */ + while (((CANx->MCR & CAN_MCR_FRZACK_MASK)) != 0U) + { + /* Keep the watchdog happy. */ + CopService(); + /* Break loop upon timeout. This would indicate a hardware failure. */ + if (TimerGet() > timeout) + { + break; + } + } +} /*** end of CanFreezeModeExit ***/ + + +/************************************************************************************//** +** \brief Places the CAN controller in disabled mode. +** \return none. +** +****************************************************************************************/ +static void CanDisabledModeEnter(void) +{ + blt_int32u timeout; + + /* Only continue if the CAN controller is currently enabled. */ + if ((CANx->MCR & CAN_MCR_MDIS_MASK) == 0U) + { + /* Request disabled mode. */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_MDIS_MASK) | CAN_MCR_MDIS(1U); + /* Set timeout time for entering disabled mode. */ + timeout = TimerGet() + CAN_INIT_TIMEOUT_MS; + /* Wait for disabled mode acknowledgement. */ + while (((CANx->MCR & CAN_MCR_LPMACK_MASK)) == 0U) + { + /* Keep the watchdog happy. */ + CopService(); + /* Break loop upon timeout. This would indicate a hardware failure. */ + if (TimerGet() > timeout) + { + break; + } + } + } +} /*** end of CanDisabledModeEnter ***/ + +/************************************************************************************//** +** \brief Places the CAN controller in enabled mode. +** \return none. +** +****************************************************************************************/ +static void CanDisabledModeExit(void) +{ + blt_int32u timeout; + + /* Only continue if the CAN controller is currently disabled. */ + if ((CANx->MCR & CAN_MCR_MDIS_MASK) != 0U) + { + /* Request enabled mode. */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_MDIS_MASK) | CAN_MCR_MDIS(0U); + /* Set timeout time for leaving disabled mode. */ + timeout = TimerGet() + CAN_INIT_TIMEOUT_MS; + /* Wait for disabled mode acknowledgement. */ + while (((CANx->MCR & CAN_MCR_LPMACK_MASK)) != 0U) + { + /* Keep the watchdog happy. */ + CopService(); + /* Break loop upon timeout. This would indicate a hardware failure. */ + if (TimerGet() > timeout) + { + break; + } + } + } +} /*** end of CanDisabledModeExit ***/ + + +/************************************************************************************//** +** \brief Initializes the CAN controller and synchronizes it to the CAN bus. +** \return none. +** +****************************************************************************************/ +void CanInit(void) +{ + blt_int16u prescaler = 0; + tCanBusTiming timingCfg = { 0 }; + blt_int8u rjw; + blt_int16u idx; + blt_int32u timeout; + blt_int32u rxMsgId = BOOT_COM_CAN_RX_MSG_ID; + + /* Perform compile time assertion to check that the configured CAN channel is actually + * supported by this driver. + */ + ASSERT_CT(BOOT_COM_CAN_CHANNEL_INDEX == 0); + + /* Verify the correct configuration of the transmit and receive mailboxes. */ + ASSERT_CT(CAN_TX_MSGBOX_NUM < CANx_MAX_MB_NUM); + ASSERT_CT(CAN_RX_MSGBOX_NUM < CANx_MAX_MB_NUM); + + /* Enable the CAN peripheral clock. */ + PCC->PCCn[PCC_FlexCANx_INDEX] |= PCC_PCCn_CGC_MASK; + + /* The source clock needs to be configured first. For this the CAN controller must be + * in disabled mode, but that can only be entered after first entering freeze mode, + * which in turn can only be in enabled mode. So first enable the module, then goto + * freeze mode and finally enter disabled mode. + */ + CanDisabledModeExit(); + CanFreezeModeEnter(); + CanDisabledModeEnter(); + /* Configure SOSCDIV2 as the source clock. This assumes that an external oscillator + * is available, which is typically the case to meet the clock tolerance requirements + * of the CAN 2.0B secification. + */ + CANx->CTRL1 &= ~CAN_CTRL1_CLKSRC_MASK; + /* Leave disabled mode. */ + CanDisabledModeExit(); + /* Make sure freeze mode is active to be able to initialize the CAN controller. */ + CanFreezeModeEnter(); + + /* Obtain bittiming configuration information. */ + if (CanGetSpeedConfig(BOOT_COM_CAN_BAUDRATE/1000, &prescaler, &timingCfg) == BLT_FALSE) + { + /* Incorrect configuration. The specified baudrate is not supported for the given + * clock configuration. Verify the following settings in blt_conf.h: + * - BOOT_COM_CAN_BAUDRATE + * - BOOT_CPU_XTAL_SPEED_KHZ + * - BOOT_CPU_SYSTEM_SPEED_KHZ + */ + ASSERT_RT(BLT_FALSE); + } + + /* Reset the current bittiming configuration. */ + CANx->CTRL1 &= ~(CAN_CTRL1_PRESDIV_MASK | CAN_CTRL1_PROPSEG_MASK | + CAN_CTRL1_PSEG1_MASK | CAN_CTRL1_PSEG2_MASK | CAN_CTRL1_RJW_MASK | + CAN_CTRL1_SMP_MASK); + /* Configure the baudrate prescaler. */ + CANx->CTRL1 |= CAN_CTRL1_PRESDIV(prescaler - 1U); + /* Configure the propagation segment. */ + CANx->CTRL1 |= CAN_CTRL1_PROPSEG(timingCfg.propSeg - 1U); + /* Configure the phase segments. */ + CANx->CTRL1 |= CAN_CTRL1_PSEG1(timingCfg.phaseSeg1 - 1U); + CANx->CTRL1 |= CAN_CTRL1_PSEG2(timingCfg.phaseSeg2 - 1U); + /* The resynchronization jump width (RJW) can be 1 - 4 TQ, yet should never be larger + * than pseg1. Configure the longest possible value for RJW. + */ + rjw = (timingCfg.phaseSeg1 < 4) ? timingCfg.phaseSeg1 : 4; + CANx->CTRL1 |= CAN_CTRL1_RJW(rjw - 1U); + /* All the entries in canTiming[] have a PSEG1 >= 2, so three samples can be used to + * determine the value of the received bit, instead of the default one. + */ + CANx->CTRL1 |= CAN_CTRL1_SMP(1U); + + /* Clear the message box RAM. Each message box covers 4 words (1 word = 32-bits. */ + for (idx = 0; idx < (CANx_MAX_MB_NUM * 4U); idx++) + { + CANx->RAMn[idx] = 0U; + } + /* Clear the reception mask register for each message box. */ + for (idx = 0; idx < CANx_MAX_MB_NUM; idx++) + { + CANx->RXIMR[idx] = 0U; + } + /* Configure the maximum number of message boxes. */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_MAXMB_MASK) | CAN_MCR_MAXMB(CANx_MAX_MB_NUM - 1U); + /* Disable the self reception feature. */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_SRXDIS_MASK) | CAN_MCR_SRXDIS(1U); + + /* Enable individual reception masking. This disables the legacy support for the + * global reception mask and the mailbox 14/15 individual reception mask. + */ + CANx->MCR = (CANx->MCR & ~CAN_MCR_IRMQ_MASK) | CAN_MCR_IRMQ(1U); + /* Disable the reception FIFO. This driver only needs to receive one CAN message + * identifier. It is sufficient to use just one dedicated mailbox for this. + */ + CANx->MCR &= ~CAN_MCR_RFEN_MASK; + /* Configure the mask of the invididual message reception mailbox to check all ID bits + * and also the IDE bit. + */ + CANx->RXIMR[CAN_RX_MSGBOX_NUM] = 0x40000000U | 0x1FFFFFFFU; + /* Configure the reception mailbox to receive just the CAN message configured with + * BOOT_COM_CAN_RX_MSG_ID. + * EDL, BRS, ESI=0: CANFD not used. + * CODE=0b0100: mailbox set to active and empty. + * IDE=0: 11-bit CAN identifier. + * SRR, RTR, TIME STAMP=0: not applicable. + */ + CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 0U] = 0x04000000; + /* Store the message identifier to receive in the mailbox RAM. */ + if ((rxMsgId & 0x80000000U) != 0U) + { + /* It is a 29-bit extended CAN identifier. */ + rxMsgId &= ~0x80000000U; + /* Set the IDE bit to configure the message for a 29-bit identifier. */ + CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 0U] |= CAN_WMBn_CS_IDE_MASK; + /* Store the 29-bit CAN identifier. */ + CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 1U] = CAN_WMBn_ID_ID(rxMsgId); + } + else + { + /* Store the 11-bit CAN identifier. */ + CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 1U] = CAN_WMBn_ID_ID(rxMsgId << 18U); + } + + /* Disable all message box interrupts. */ + CANx->IMASK1 = 0U; + /* Clear all mesasge box interrupt flags. */ + CANx->IFLAG1 = CAN_IMASK1_BUF31TO0M_MASK; + /* Clear all error interrupt flags */ + CANx->ESR1 = CAN_ESR1_ERRINT_MASK | CAN_ESR1_BOFFINT_MASK | CAN_ESR1_RWRNINT_MASK | + CAN_ESR1_TWRNINT_MASK | CAN_ESR1_BOFFDONEINT_MASK | + CAN_ESR1_ERRINT_FAST_MASK | CAN_ESR1_ERROVR_MASK; + + /* Switch to normal user mode. */ + CANx->MCR &= ~CAN_MCR_SUPV_MASK; + CANx->CTRL1 &= ~(CAN_CTRL1_LOM_MASK | CAN_CTRL1_LPB_MASK); + /* Exit freeze mode. */ + CanFreezeModeExit(); + /* Set timeout time for entering normal user mode. */ + timeout = TimerGet() + CAN_INIT_TIMEOUT_MS; + /* Wait for normal user mode acknowledgement. */ + while (((CANx->MCR & CAN_MCR_NOTRDY_MASK)) != 0U) + { + /* Keep the watchdog happy. */ + CopService(); + /* Break loop upon timeout. This would indicate a hardware failure. */ + if (TimerGet() > timeout) + { + break; + } + } +} /*** end of CanInit ***/ + + +/************************************************************************************//** +** \brief Transmits a packet formatted for the communication interface. +** \param data Pointer to byte array with data that it to be transmitted. +** \param len Number of bytes that are to be transmitted. +** \return none. +** +****************************************************************************************/ +void CanTransmitPacket(blt_int8u *data, blt_int8u len) +{ + blt_int32u timeout; + blt_bool isExtId = BLT_FALSE; + blt_int32u txMsgId = BOOT_COM_CAN_TX_MSG_ID; + blt_int8u * pMsgBoxData; + blt_int8u byteIdx; + + /* Prepare information about the message identifier. */ + if ((txMsgId & 0x80000000U) != 0U) + { + /* It is a 29-bit extended CAN identifier. */ + txMsgId &= ~0x80000000U; + isExtId = BLT_TRUE; + } + + /* Clear the mailbox interrupt flag by writing a 1 to the corresponding box. */ + CANx->IFLAG1 = (1U << CAN_TX_MSGBOX_NUM); + + /* Prepare the mailbox RAM for a basic CAN message. + * EDL,BRS,ESI=0: CANFD not used. + */ + CANx->RAMn[(CAN_TX_MSGBOX_NUM * 4U) + 0U] &= ~0xE0000000U; + /* Configure SRR, IDE, RTR bits for a standard 11-bit transmit frame. */ + CANx->RAMn[(CAN_TX_MSGBOX_NUM * 4U) + 0U] &= ~(CAN_WMBn_CS_IDE_MASK | + CAN_WMBn_CS_RTR_MASK); + CANx->RAMn[(CAN_TX_MSGBOX_NUM * 4U) + 0U] |= CAN_WMBn_CS_SRR_MASK; + /* Configure the DLC. */ + CANx->RAMn[(CAN_TX_MSGBOX_NUM * 4U) + 0U] &= ~CAN_WMBn_CS_DLC_MASK; + CANx->RAMn[(CAN_TX_MSGBOX_NUM * 4U) + 0U] |= CAN_WMBn_CS_DLC(len); + /* Write the data bytes of the CAN message to the mailbox RAM. */ + pMsgBoxData = (blt_int8u * )(&CANx->RAMn[(CAN_TX_MSGBOX_NUM * 4U) + 2U]); + for (byteIdx = 0; byteIdx < len; byteIdx++) + { + pMsgBoxData[((byteIdx) & ~3U) + (3U - ((byteIdx) & 3U))] = data[byteIdx]; + } + /* Store the CAN message identifier in the mailbox RAM. */ + if (isExtId == BLT_FALSE) + { + /* Store the 11-bit CAN identifier. */ + CANx->RAMn[(CAN_TX_MSGBOX_NUM * 4U) + 1U] = CAN_WMBn_ID_ID(txMsgId << 18U); + } + else + { + /* Set the IDE bit to configure the message for a 29-bit identifier. */ + CANx->RAMn[(CAN_TX_MSGBOX_NUM * 4U) + 0U] |= CAN_WMBn_CS_IDE_MASK; + /* Store the 29-bit CAN identifier. */ + CANx->RAMn[(CAN_TX_MSGBOX_NUM * 4U) + 1U] = CAN_WMBn_ID_ID(txMsgId); + } + /* Activate the mailbox to start the transmission by writing 0x0C to the CODE field. */ + CANx->RAMn[(CAN_TX_MSGBOX_NUM * 4U) + 0U] |= (0x0CU << 24U) & 0x0F000000U; + + /* Determine timeout time for the transmit completion. */ + timeout = TimerGet() + CAN_MSG_TX_TIMEOUT_MS; + /* Poll for completion of the transmit operation. */ + while ((CANx->IFLAG1 & (1U << CAN_TX_MSGBOX_NUM)) == 0U) + { + /* Service the watchdog. */ + CopService(); + /* Break loop upon timeout. this would indicate a hardware failure or no other + * nodes connected to the bus. + */ + if (TimerGet() > timeout) + { + break; + } + } +} /*** end of CanTransmitPacket ***/ + + +/************************************************************************************//** +** \brief Receives a communication interface packet if one is present. +** \param data Pointer to byte array where the data is to be stored. +** \param len Pointer where the length of the packet is to be stored. +** \return BLT_TRUE is a packet was received, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool CanReceivePacket(blt_int8u *data, blt_int8u *len) +{ + blt_bool result = BLT_FALSE; + blt_int8u * pMsgBoxData; + blt_int8u byteIdx; + + /* Check if a message was received in the individual mailbox configured to receive + * the BOOT_COM_CAN_RX_MSG_ID message. + */ + if ((CANx->IFLAG1 & (1U << CAN_RX_MSGBOX_NUM)) != 0U) + { + /* Note that there is no need to verify the identifier of the CAN message because the + * mailbox is configured to only receive the BOOT_COM_CAN_TX_MSG_ID message. Start + * by reading out the DLC of the newly received CAN message. + */ + *len = (CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 0U] & CAN_WMBn_CS_DLC_MASK) >> CAN_WMBn_CS_DLC_SHIFT; + /* Read the data bytes of the CAN message from the mailbox RAM. */ + pMsgBoxData = (blt_int8u *)(&CANx->RAMn[(CAN_RX_MSGBOX_NUM * 4U) + 2U]); + for (byteIdx = 0; byteIdx < *len; byteIdx++) + { + data[byteIdx] = pMsgBoxData[((byteIdx) & ~3U) + (3U - ((byteIdx) & 3U))]; + } + /* Clear the mailbox interrupt flag by writing a 1 to the corresponding box. */ + CANx->IFLAG1 = (1U << CAN_RX_MSGBOX_NUM); + /* Read the free running timer to unlock the mailbox. */ + dummyTimerVal = CANx->TIMER; + /* Update the result. */ + result = BLT_TRUE; + } + + /* Give the result back to the caller. */ + return result; +} /*** end of CanReceivePacket ***/ +#endif /* BOOT_COM_CAN_ENABLE > 0 */ + + +/*********************************** end of can.c **************************************/ diff --git a/Target/Source/ARMCM0_S32K11/cpu.c b/Target/Source/ARMCM0_S32K11/cpu.c new file mode 100644 index 00000000..ea785d7f --- /dev/null +++ b/Target/Source/ARMCM0_S32K11/cpu.c @@ -0,0 +1,192 @@ +/************************************************************************************//** +* \file Source/ARMCM0_S32K11/cpu.c +* \brief Bootloader cpu module source file. +* \ingroup Target_ARMCM0_S32K11 +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#include "device_registers.h" /* device registers */ + + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +/** \brief Pointer to the user program's reset vector. */ +#define CPU_USER_PROGRAM_STARTADDR_PTR ((blt_addr)(NvmGetUserProgBaseAddress() + 0x00000004)) +/** \brief Pointer to the user program's vector table. */ +#define CPU_USER_PROGRAM_VECTABLE_OFFSET ((blt_addr)NvmGetUserProgBaseAddress()) + + +/**************************************************************************************** +* Hook functions +****************************************************************************************/ +#if (BOOT_CPU_USER_PROGRAM_START_HOOK > 0) +extern blt_bool CpuUserProgramStartHook(void); +#endif + + +/************************************************************************************//** +** \brief Initializes the CPU module. +** \return none. +** +****************************************************************************************/ +void CpuInit(void) +{ + /* bootloader runs in polling mode so disable the global interrupts. this is done for + * safety reasons. if the bootloader was started from a running user program, it could + * be that the user program did not properly disable the interrupt generation of + * peripherals. */ + CpuIrqDisable(); +} /*** end of CpuInit ***/ + + +/************************************************************************************//** +** \brief Starts the user program, if one is present. In this case this function +** does not return. +** \return none. +** +****************************************************************************************/ +void CpuStartUserProgram(void) +{ + void (*pProgResetHandler)(void); + + /* check if a user program is present by verifying the checksum */ + if (NvmVerifyChecksum() == BLT_FALSE) + { +#if (BOOT_COM_DEFERRED_INIT_ENABLE > 0) && (BOOT_COM_ENABLE > 0) + /* bootloader will stay active so perform deferred initialization to make sure + * the communication interface that were not yet initialized are now initialized. + * this is needed to make sure firmware updates via these communication interfaces + * will be possible. + */ + ComDeferredInit(); +#endif + /* not a valid user program so it cannot be started */ + return; + } +#if (BOOT_CPU_USER_PROGRAM_START_HOOK > 0) + /* invoke callback */ + if (CpuUserProgramStartHook() == BLT_FALSE) + { + #if (BOOT_COM_DEFERRED_INIT_ENABLE > 0) && (BOOT_COM_ENABLE > 0) + /* bootloader will stay active so perform deferred initialization to make sure + * the communication interface that were not yet initialized are now initialized. + * this is needed to make sure firmware updates via these communication interfaces + * will be possible. + */ + ComDeferredInit(); + #endif + /* callback requests the user program to not be started */ + return; + } +#endif +#if (BOOT_COM_ENABLE > 0) + /* release the communication interface */ + ComFree(); +#endif + /* reset the timer */ + TimerReset(); + /* remap user program's vector table */ + S32_SCB->VTOR = CPU_USER_PROGRAM_VECTABLE_OFFSET & (blt_int32u)0x1FFFFF80; + /* The Cortex-M4 core has interrupts enabled out of reset. the bootloader + * explicitly disables these for security reasons. Enable them here again, so it does + * not have to be done by the user program. + */ + CpuIrqEnable(); + /* set the address where the bootloader needs to jump to. this is the address of + * the 2nd entry in the user program's vector table. this address points to the + * user program's reset handler. + */ + pProgResetHandler = (void(*)(void))(*((blt_addr *)CPU_USER_PROGRAM_STARTADDR_PTR)); + /* start the user program by calling its reset interrupt service routine */ + pProgResetHandler(); +#if (BOOT_COM_DEFERRED_INIT_ENABLE > 0) && (BOOT_COM_ENABLE > 0) + /* theoretically, the code never gets here because the user program should now be + * running and the previous function call should not return. In case it did return + * for whatever reason, make sure all communication interfaces are initialized so that + * firmware updates can be started. + */ + ComDeferredInit(); +#endif +} /*** end of CpuStartUserProgram ***/ + + +/************************************************************************************//** +** \brief Copies data from the source to the destination address. +** \param dest Destination address for the data. +** \param src Source address of the data. +** \param len length of the data in bytes. +** \return none. +** +****************************************************************************************/ +void CpuMemCopy(blt_addr dest, blt_addr src, blt_int16u len) +{ + blt_int8u *from, *to; + + /* set casted pointers */ + from = (blt_int8u *)src; + to = (blt_int8u *)dest; + + /* copy all bytes from source address to destination address */ + while (len-- > 0) + { + /* store byte value from source to destination */ + *to++ = *from++; + /* keep the watchdog happy */ + CopService(); + } +} /*** end of CpuMemCopy ***/ + + +/************************************************************************************//** +** \brief Sets the bytes at the destination address to the specified value. +** \param dest Destination address for the data. +** \param value Value to write. +** \param len Number of bytes to write. +** \return none. +** +****************************************************************************************/ +void CpuMemSet(blt_addr dest, blt_int8u value, blt_int16u len) +{ + blt_int8u *to; + + /* set casted pointer */ + to = (blt_int8u *)dest; + + /* set all bytes at the destination address to the specified value */ + while (len-- > 0) + { + /* set byte value */ + *to++ = value; + /* keep the watchdog happy */ + CopService(); + } +} /*** end of CpuMemSet ***/ + + +/*********************************** end of cpu.c **************************************/ diff --git a/Target/Source/ARMCM0_S32K11/flash.c b/Target/Source/ARMCM0_S32K11/flash.c new file mode 100644 index 00000000..591a8d1e --- /dev/null +++ b/Target/Source/ARMCM0_S32K11/flash.c @@ -0,0 +1,1018 @@ +/************************************************************************************//** +* \file Source/ARMCM0_S32K11/flash.c +* \brief Bootloader flash driver source file. +* \ingroup Target_ARMCM0_S32K11 +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#include "device_registers.h" /* device registers */ + + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +/** \brief Value for an invalid sector entry index into flashLayout[]. */ +#define FLASH_INVALID_SECTOR_IDX (0xff) +/** \brief Value for an invalid flash address. */ +#define FLASH_INVALID_ADDRESS (0xffffffff) +/** \brief Standard size of a flash block for writing. */ +#define FLASH_WRITE_BLOCK_SIZE (256) +/** \brief Standard size of a flash block for erasing. This is either 2 or 4 kb depending + * on the microcontroller derivative. + */ +#define FLASH_ERASE_BLOCK_SIZE (FEATURE_FLS_PF_BLOCK_SECTOR_SIZE) +/** \brief Total numbers of sectors in array flashLayout[]. */ +#define FLASH_TOTAL_SECTORS (sizeof(flashLayout)/sizeof(flashLayout[0])) +/** \brief End address of the bootloader programmable flash. */ +#define FLASH_END_ADDRESS (flashLayout[FLASH_TOTAL_SECTORS-1].sector_start + \ + flashLayout[FLASH_TOTAL_SECTORS-1].sector_size - 1) +/** \brief FTFC program phrase command code. */ +#define FLASH_FTFC_CMD_PROGRAM_PHRASE (0x07U) +/** \brief FTFC erase sector command code. */ +#define FLASH_FTFC_CMD_ERASE_SECTOR (0x09U) + +/** \brief Offset into the user program's vector table where the checksum is located. + * Note that the value can be overriden in blt_conf.h, because the size of the + * vector table could vary. When changing this value, don't forget to update the + * location of the checksum in the user program accordingly. Otherwise the + * checksum verification will always fail. + */ +#ifndef BOOT_FLASH_VECTOR_TABLE_CS_OFFSET +#define BOOT_FLASH_VECTOR_TABLE_CS_OFFSET (0xC0) +#endif + + +/**************************************************************************************** +* Plausibility checks +****************************************************************************************/ +#if (BOOT_FLASH_VECTOR_TABLE_CS_OFFSET >= FLASH_WRITE_BLOCK_SIZE) +#error "BOOT_FLASH_VECTOR_TABLE_CS_OFFSET is set too high. It must be located in the first writable block." +#endif + +#ifndef BOOT_FLASH_CUSTOM_LAYOUT_ENABLE +#define BOOT_FLASH_CUSTOM_LAYOUT_ENABLE (0u) +#endif + + +/**************************************************************************************** +* Type definitions +****************************************************************************************/ +/** \brief Flash sector descriptor type. */ +typedef struct +{ + blt_addr sector_start; /**< sector start address */ + blt_int32u sector_size; /**< sector size in bytes */ + blt_int8u sector_num; /**< sector number */ +} tFlashSector; + +/** \brief Structure type for grouping flash block information. + * \details Programming is done per block of max FLASH_WRITE_BLOCK_SIZE. for this a + * flash block manager is implemented in this driver. this flash block manager + * depends on this flash block info structure. It holds the base address of + * the flash block and the data that should be programmed into the flash + * block. The .base_addr must be a multiple of FLASH_WRITE_BLOCK_SIZE. + */ +typedef struct +{ + blt_addr base_addr; + blt_int8u data[FLASH_WRITE_BLOCK_SIZE]; +} tFlashBlockInfo; + + +/**************************************************************************************** +* Hook functions +****************************************************************************************/ +#if (BOOT_FLASH_CRYPTO_HOOKS_ENABLE > 0) +extern blt_bool FlashCryptoDecryptDataHook(blt_int8u * data, blt_int32u size); +#endif + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +static blt_bool FlashInitBlock(tFlashBlockInfo *block, blt_addr address); +static tFlashBlockInfo *FlashSwitchBlock(tFlashBlockInfo *block, blt_addr base_addr); +static blt_bool FlashAddToBlock(tFlashBlockInfo *block, blt_addr address, + blt_int8u *data, blt_int32u len); +static blt_bool FlashWriteBlock(tFlashBlockInfo *block); +static blt_bool FlashEraseSectors(blt_int8u first_sector_idx, + blt_int8u last_sector_idx); +static blt_int8u FlashGetSectorIdx(blt_addr address); +START_FUNCTION_DECLARATION_RAMSECTION +static void FlashCommandSequence(void) +END_FUNCTION_DECLARATION_RAMSECTION + + +/**************************************************************************************** +* Local constant declarations +****************************************************************************************/ +/** \brief If desired, it is possible to set BOOT_FLASH_CUSTOM_LAYOUT_ENABLE to > 0 + * in blt_conf.h and then implement your own version of the flashLayout[] table + * in a source-file with the name flash_layout.c. This way you customize the + * flash memory size reserved for the bootloader, without having to modify + * the flashLayout[] table in this file directly. This file will then include + * flash_layout.c so there is no need to compile it additionally with your + * project. + */ +#if (BOOT_FLASH_CUSTOM_LAYOUT_ENABLE == 0) +/** \brief Array wit the layout of the flash memory. + * \details Also controls what part of the flash memory is reserved for the bootloader. + * If the bootloader size changes, the reserved sectors for the bootloader + * might need adjustment to make sure the bootloader doesn't get overwritten. + */ +static const tFlashSector flashLayout[] = +{ + /* Update the contents of this array with the erase sector sizes as defined in the + * microcontroller's reference manual. The flash sector erase sizes are hardware + * specific and must therefore match, otherwise erase operations cannot be performed + * properly. + * Besides controlling the flash erase size, this array also controls which sectors + * are reserved for the bootloader and will therefore never be erased. Note the for the + * S32K11x, the flash sector erase size is 2kb. It was decided to create entries that + * are equal or a multiple of 2kb to simplify the flash layout array and to keep it + * from getting unnecessarily large. + */ + /*{ 0x00000000, 0x00800, 0}, flash sector 0 - reserved for bootloader */ + /*{ 0x00000800, 0x01000, 1}, flash sector 1 - reserved for bootloader */ + /*{ 0x00001000, 0x00800, 2}, flash sector 2 - reserved for bootloader */ + /*{ 0x00001800, 0x00800, 3}, flash sector 3 - reserved for bootloader */ + { 0x00002000, 0x00800, 4}, /* flash sector 4 - 2kb */ + { 0x00002800, 0x00800, 5}, /* flash sector 5 - 2kb */ + { 0x00003000, 0x00800, 6}, /* flash sector 6 - 2kb */ + { 0x00003800, 0x00800, 7}, /* flash sector 7 - 2kb */ + { 0x00004000, 0x00800, 8}, /* flash sector 8 - 2kb */ + { 0x00004800, 0x00800, 9}, /* flash sector 9 - 2kb */ + { 0x00005000, 0x00800, 10}, /* flash sector 10 - 2kb */ + { 0x00005800, 0x00800, 11}, /* flash sector 11 - 2kb */ + { 0x00006000, 0x00800, 12}, /* flash sector 12 - 2kb */ + { 0x00006800, 0x00800, 13}, /* flash sector 13 - 2kb */ + { 0x00007000, 0x00800, 14}, /* flash sector 14 - 2kb */ + { 0x00007800, 0x00800, 15}, /* flash sector 15 - 2kb */ + { 0x00008000, 0x08000, 16}, /* flash sector 16 - 32kb */ + { 0x00010000, 0x08000, 17}, /* flash sector 17 - 32kb */ + { 0x00018000, 0x08000, 18}, /* flash sector 18 - 32kb */ + #if (BOOT_NVM_SIZE_KB > 128) + { 0x00020000, 0x08000, 19}, /* flash sector 19 - 32kb */ + { 0x00028000, 0x08000, 20}, /* flash sector 20 - 32kb */ + { 0x00030000, 0x08000, 21}, /* flash sector 21 - 32kb */ + { 0x00038000, 0x08000, 22}, /* flash sector 22 - 32kb */ + #endif + #if (BOOT_NVM_SIZE_KB > 256) + #error "BOOT_NVM_SIZE_KB > 256 is currently not supported." + #endif +}; +#else +#include "flash_layout.c" +#endif /* BOOT_FLASH_CUSTOM_LAYOUT_ENABLE == 0 */ + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/** \brief Local variable with information about the flash block that is currently + * being operated on. + * \details The smallest amount of flash that can be programmed is + * FLASH_WRITE_BLOCK_SIZE. A flash block manager is implemented in this driver + * and stores info in this variable. Whenever new data should be flashed, it + * is first added to a RAM buffer, which is part of this variable. Whenever + * the RAM buffer, which has the size of a flash block, is full or data needs + * to be written to a different block, the contents of the RAM buffer are + * programmed to flash. The flash block manager requires some software + * overhead, yet results is faster flash programming because data is first + * harvested, ideally until there is enough to program an entire flash block, + * before the flash device is actually operated on. + */ +static tFlashBlockInfo blockInfo; + +/** \brief Local variable with information about the flash boot block. + * \details The first block of the user program holds the vector table, which on the + * STM32 is also the where the checksum is written to. Is it likely that + * the vector table is first flashed and then, at the end of the programming + * sequence, the checksum. This means that this flash block need to be written + * to twice. Normally this is not a problem with flash memory, as long as you + * write the same values to those bytes that are not supposed to be changed + * and the locations where you do write to are still in the erased 0xFF state. + * Unfortunately, writing twice to flash this way, does not work reliably on + * all micros. This is why we need to have an extra block, the bootblock, + * placed under the management of the block manager. This way is it possible + * to implement functionality so that the bootblock is only written to once + * at the end of the programming sequence. + */ +static tFlashBlockInfo bootBlockInfo; + + +/************************************************************************************//** +** \brief Initializes the flash driver. +** \return none. +** +****************************************************************************************/ +void FlashInit(void) +{ + /* init the flash block info structs by setting the address to an invalid address */ + blockInfo.base_addr = FLASH_INVALID_ADDRESS; + bootBlockInfo.base_addr = FLASH_INVALID_ADDRESS; +} /*** end of FlashInit ***/ + + +/************************************************************************************//** +** \brief Reinitializes the flash driver. +** \return none. +** +****************************************************************************************/ +void FlashReinit(void) +{ + /* init the flash block info structs by setting the address to an invalid address */ + blockInfo.base_addr = FLASH_INVALID_ADDRESS; + bootBlockInfo.base_addr = FLASH_INVALID_ADDRESS; +} /*** end of FlashReinit ***/ + + +/************************************************************************************//** +** \brief Writes the data to flash through a flash block manager. Note that this +** function also checks that no data is programmed outside the flash +** memory region, so the bootloader can never be overwritten. +** \param addr Start address. +** \param len Length in bytes. +** \param data Pointer to the data buffer. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool FlashWrite(blt_addr addr, blt_int32u len, blt_int8u *data) +{ + blt_bool result = BLT_TRUE; + blt_addr base_addr; + + /* validate the len parameter */ + if ((len - 1) > (FLASH_END_ADDRESS - addr)) + { + result = BLT_FALSE; + } + + /* only continue if all is okay so far */ + if (result == BLT_TRUE) + { + /* make sure the addresses are within the flash device */ + if ((FlashGetSectorIdx(addr) == FLASH_INVALID_SECTOR_IDX) || \ + (FlashGetSectorIdx(addr+len-1) == FLASH_INVALID_SECTOR_IDX)) + { + result = BLT_FALSE; + } + } + + /* only continue if all is okay so far */ + if (result == BLT_TRUE) + { + /* if this is the bootblock, then let the boot block manager handle it */ + base_addr = (addr/FLASH_WRITE_BLOCK_SIZE)*FLASH_WRITE_BLOCK_SIZE; + if (base_addr == flashLayout[0].sector_start) + { + /* let the boot block manager handle it */ + result = FlashAddToBlock(&bootBlockInfo, addr, data, len); + } + else + { + /* let the block manager handle it */ + result = FlashAddToBlock(&blockInfo, addr, data, len); + } + } + + /* give the result back to the caller */ + return result; +} /*** end of FlashWrite ***/ + + +/************************************************************************************//** +** \brief Erases the flash memory. Note that this function also checks that no +** data is erased outside the flash memory region, so the bootloader can +** never be erased. +** \param addr Start address. +** \param len Length in bytes. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool FlashErase(blt_addr addr, blt_int32u len) +{ + blt_bool result = BLT_TRUE; + blt_int8u first_sector_idx; + blt_int8u last_sector_idx; + + /* validate the len parameter */ + if ((len - 1) > (FLASH_END_ADDRESS - addr)) + { + result = BLT_FALSE; + } + + /* only continue if all is okay so far */ + if (result == BLT_TRUE) + { + /* obtain the first and last sector entry indices to the flashLayout[] array. */ + first_sector_idx = FlashGetSectorIdx(addr); + last_sector_idx = FlashGetSectorIdx(addr+len-1); + /* check them */ + if ((first_sector_idx == FLASH_INVALID_SECTOR_IDX) || + (last_sector_idx == FLASH_INVALID_SECTOR_IDX)) + { + result = BLT_FALSE; + } + } + + /* only continue if all is okay so far */ + if (result == BLT_TRUE) + { + /* erase the sectors */ + result = FlashEraseSectors(first_sector_idx, last_sector_idx); + } + + /* give the result back to the caller */ + return result; +} /*** end of FlashErase ***/ + + +/************************************************************************************//** +** \brief Writes a checksum of the user program to non-volatile memory. This is +** performed once the entire user program has been programmed. Through +** the checksum, the bootloader can check if the programming session +** was completed, which indicates that a valid user programming is +** present and can be started. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool FlashWriteChecksum(void) +{ + blt_bool result = BLT_TRUE; + blt_int32u signature_checksum = 0; + + /* first check that the bootblock contains valid data. if not, this means the + * bootblock is not part of the reprogramming this time and therefore no + * new checksum needs to be written + */ + if (bootBlockInfo.base_addr != FLASH_INVALID_ADDRESS) + { +#if (BOOT_FLASH_CRYPTO_HOOKS_ENABLE > 0) + /* perform decryption of the bootblock, before calculating the checksum and writing it + * to flash memory. + */ + if (FlashCryptoDecryptDataHook(bootBlockInfo.data, FLASH_WRITE_BLOCK_SIZE) == BLT_FALSE) + { + result = BLT_FALSE; + } +#endif + + /* only continue if all is okay so far */ + if (result == BLT_TRUE) + { + /* compute the checksum. note that the user program's vectors are not yet written + * to flash but are present in the bootblock data structure at this point. + */ + signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x00])); + signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x04])); + signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x08])); + signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x0C])); + signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x10])); + signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x14])); + signature_checksum += *((blt_int32u *)(&bootBlockInfo.data[0+0x18])); + signature_checksum = ~signature_checksum; /* one's complement */ + signature_checksum += 1; /* two's complement */ + + /* write the checksum */ + result = FlashWrite(flashLayout[0].sector_start+BOOT_FLASH_VECTOR_TABLE_CS_OFFSET, + sizeof(blt_addr), (blt_int8u *)&signature_checksum); + } + } + + /* give the result back to the caller */ + return result; +} /*** end of FlashWriteChecksum ***/ + + +/************************************************************************************//** +** \brief Verifies the checksum, which indicates that a valid user program is +** present and can be started. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool FlashVerifyChecksum(void) +{ + blt_bool result = BLT_TRUE; + blt_int32u signature_checksum = 0; + + /* verify the checksum based on how it was written by FlashWriteChecksum(). */ + signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start)); + signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+0x04)); + signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+0x08)); + signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+0x0C)); + signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+0x10)); + signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+0x14)); + signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+0x18)); + /* add the checksum value that was written by FlashWriteChecksum(). Since this was a + * Two complement's value, the resulting value should equal 0. + */ + signature_checksum += *((blt_int32u *)(flashLayout[0].sector_start+BOOT_FLASH_VECTOR_TABLE_CS_OFFSET)); + /* sum should add up to an unsigned 32-bit value of 0 */ + if (signature_checksum != 0) + { + /* checksum not okay */ + result = BLT_FALSE; + } + + /* give the result back to the caller */ + return result; +} /*** end of FlashVerifyChecksum ***/ + + +/************************************************************************************//** +** \brief Finalizes the flash driver operations. There could still be data in +** the currently active block that needs to be flashed. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool FlashDone(void) +{ + blt_bool result = BLT_TRUE; + + /* check if there is still data waiting to be programmed in the boot block */ + if (bootBlockInfo.base_addr != FLASH_INVALID_ADDRESS) + { + if (FlashWriteBlock(&bootBlockInfo) == BLT_FALSE) + { + /* update the result value to flag the error */ + result = BLT_FALSE; + } + } + + /* only continue if all is okay so far */ + if (result == BLT_TRUE) + { + /* check if there is still data waiting to be programmed */ + if (blockInfo.base_addr != FLASH_INVALID_ADDRESS) + { + if (FlashWriteBlock(&blockInfo) == BLT_FALSE) + { + /* update the result value to flag the error */ + result = BLT_FALSE; + } + } + } + + /* give the result back to the caller */ + return result; +} /*** end of FlashDone ***/ + + +/************************************************************************************//** +** \brief Obtains the base address of the flash memory available to the user program. +** This is basically the first address in the flashLayout table. +** \return Base address. +** +****************************************************************************************/ +blt_addr FlashGetUserProgBaseAddress(void) +{ + blt_addr result; + + result = flashLayout[0].sector_start; + + /* give the result back to the caller */ + return result; +} /*** end of FlashGetUserProgBaseAddress ***/ + + +/************************************************************************************//** +** \brief Copies data currently in flash to the block->data and sets the +** base address. +** \param block Pointer to flash block info structure to operate on. +** \param address Base address of the block data. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +static blt_bool FlashInitBlock(tFlashBlockInfo *block, blt_addr address) +{ + blt_bool result = BLT_TRUE; + + /* check address alignment */ + if ((address % FLASH_WRITE_BLOCK_SIZE) != 0) + { + /* update the result value to flag the error */ + result = BLT_FALSE; + } + + /* only continue if all is okay so far */ + if (result == BLT_TRUE) + { + /* make sure that we are initializing a new block and not the same one */ + if (block->base_addr != address) + { + /* set the base address and copies the current data from flash */ + block->base_addr = address; + CpuMemCopy((blt_addr)block->data, address, FLASH_WRITE_BLOCK_SIZE); + } + } + + /* give the result back to the caller */ + return result; +} /*** end of FlashInitBlock ***/ + + +/************************************************************************************//** +** \brief Switches blocks by programming the current one and initializing the +** next. +** \param block Pointer to flash block info structure to operate on. +** \param base_addr Base address of the next block. +** \return The pointer of the block info struct that is now being used, or a NULL +** pointer in case of error. +** +****************************************************************************************/ +static tFlashBlockInfo *FlashSwitchBlock(tFlashBlockInfo *block, blt_addr base_addr) +{ + tFlashBlockInfo * result = BLT_NULL; + + /* check if a switch needs to be made away from the boot block. in this case the boot + * block shouldn't be written yet, because this is done at the end of the programming + * session by FlashDone(), this is right after the checksum was written. + */ + if (block == &bootBlockInfo) + { + /* switch from the boot block to the generic block info structure */ + block = &blockInfo; + result = block; + } + /* check if a switch back into the bootblock is needed. in this case the generic block + * doesn't need to be written here yet. + */ + else if (base_addr == flashLayout[0].sector_start) + { + /* switch from the generic block to the boot block info structure */ + block = &bootBlockInfo; + base_addr = flashLayout[0].sector_start; + result = block; + } + /* no switching between the generic block and the bootblock needed. it is a switch + * within a generic block. the current block needs to be first programmed before a + * switch to the new one can be make. + */ + else + { + /* start by initializing the result to success */ + result = block; + /* need to switch to a new block, so program the current one and init the next */ + if (FlashWriteBlock(block) == BLT_FALSE) + { + /* invalidate the result value to flag the error */ + result = BLT_NULL; + } + } + + /* only continue if all is okay sofar */ + if (result != BLT_NULL) + { + /* initialize the new block when necessary */ + if (FlashInitBlock(block, base_addr) == BLT_FALSE) + { + /* invalidate the result value to flag the error */ + result = BLT_NULL; + } + } + + /* Give the result back to the caller. */ + return result; +} /*** end of FlashSwitchBlock ***/ + + +/************************************************************************************//** +** \brief Programming is done per block. This function adds data to the block +** that is currently collecting data to be written to flash. If the +** address is outside of the current block, the current block is written +** to flash an a new block is initialized. +** \param block Pointer to flash block info structure to operate on. +** \param address Flash destination address. +** \param data Pointer to the byte array with data. +** \param len Number of bytes to add to the block. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +static blt_bool FlashAddToBlock(tFlashBlockInfo *block, blt_addr address, + blt_int8u *data, blt_int32u len) +{ + blt_bool result = BLT_TRUE; + blt_addr current_base_addr; + blt_int8u *dst; + blt_int8u *src; + + /* determine the current base address */ + current_base_addr = (address/FLASH_WRITE_BLOCK_SIZE)*FLASH_WRITE_BLOCK_SIZE; + + /* make sure the blockInfo is not uninitialized */ + if (block->base_addr == FLASH_INVALID_ADDRESS) + { + /* initialize the blockInfo struct for the current block */ + if (FlashInitBlock(block, current_base_addr) == BLT_FALSE) + { + result = BLT_FALSE; + } + } + + /* only continue if all is okay so far */ + if (result == BLT_TRUE) + { + /* check if the new data fits in the current block */ + if (block->base_addr != current_base_addr) + { + /* need to switch to a new block, so program the current one and init the next */ + block = FlashSwitchBlock(block, current_base_addr); + if (block == BLT_NULL) + { + result = BLT_FALSE; + } + } + } + + /* only continue if all is okay so far */ + if (result == BLT_TRUE) + { + /* add the data to the current block, but check for block overflow */ + dst = &(block->data[address - block->base_addr]); + src = data; + do + { + /* keep the watchdog happy */ + CopService(); + /* buffer overflow? */ + if ((blt_addr)(dst-&(block->data[0])) >= FLASH_WRITE_BLOCK_SIZE) + { + /* need to switch to a new block, so program the current one and init the next */ + block = FlashSwitchBlock(block, current_base_addr+FLASH_WRITE_BLOCK_SIZE); + if (block == BLT_NULL) + { + /* flag error and stop looping */ + result = BLT_FALSE; + break; + } + /* reset destination pointer */ + dst = &(block->data[0]); + } + /* write the data to the buffer */ + *dst = *src; + /* update pointers */ + dst++; + src++; + /* decrement byte counter */ + len--; + } + while (len > 0); + } + + /* give the result back to the caller */ + return result; +} /*** end of FlashAddToBlock ***/ + + +/************************************************************************************//** +** \brief Programs FLASH_WRITE_BLOCK_SIZE bytes to flash from the block->data +** array. +** \param block Pointer to flash block info structure to operate on. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +static blt_bool FlashWriteBlock(tFlashBlockInfo *block) +{ + blt_bool result = BLT_TRUE; + blt_addr prog_addr; + blt_int8u * prog_data; + blt_int8u const * flash_data; + blt_int32u phrase_cnt; + blt_int8u const phrase_size = FEATURE_FLS_PF_BLOCK_WRITE_UNIT_SIZE; + blt_int8u phrase_byte_idx; + + /* check that the address is actually within flash */ + if (FlashGetSectorIdx(block->base_addr) == FLASH_INVALID_SECTOR_IDX) + { + result = BLT_FALSE; + } + +#if (BOOT_FLASH_CRYPTO_HOOKS_ENABLE > 0) + #if (BOOT_NVM_CHECKSUM_HOOKS_ENABLE == 0) + /* note that the bootblock is already decrypted in FlashWriteChecksum(), if the + * internal checksum mechanism is used. Therefore don't decrypt it again. + */ + if (block != &bootBlockInfo) + #endif + { + /* perform decryption of the program data before writing it to flash memory. */ + if (FlashCryptoDecryptDataHook(block->data, FLASH_WRITE_BLOCK_SIZE) == BLT_FALSE) + { + result = BLT_FALSE; + } + } +#endif + + /* only continue if all is okay so far */ + if (result == BLT_TRUE) + { + /* program all phrases in the block one by one */ + for (phrase_cnt=0; phrase_cnt<(FLASH_WRITE_BLOCK_SIZE/phrase_size); phrase_cnt++) + { + prog_addr = block->base_addr + (phrase_cnt * phrase_size); + prog_data = &block->data[phrase_cnt * phrase_size]; + /* keep the watchdog happy */ + CopService(); + /* check CCIF to verify that the previous command is completed. */ + if ((FTFC->FSTAT & FTFC_FSTAT_CCIF_MASK) == FTFC_FSTAT_CCIF(0)) + { + /* FTFC module should not be busy anymore. flag error and abort. */ + result = BLT_FALSE; + break; + } + /* clear the old errors that might still be set from a previous operation. */ + FTFC->FSTAT = FTFC_FSTAT_FPVIOL_MASK | FTFC_FSTAT_ACCERR_MASK | FTFC_FSTAT_RDCOLERR_MASK; + /* prepare the program phrase command. + * FTFC->FCCOB[3] = FCCOB0 + */ + FTFC->FCCOB[3] = FLASH_FTFC_CMD_PROGRAM_PHRASE; + /* set the program base address. + * FTFC->FCCOB[2] = FCCOB1 + * FTFC->FCCOB[1] = FCCOB2 + * FTFC->FCCOB[0] = FCCOB3 + */ + FTFC->FCCOB[2] = (blt_int8u)(((blt_addr)(prog_addr >> 16U)) & 0xFFU); + FTFC->FCCOB[1] = (blt_int8u)(((blt_addr)(prog_addr >> 8U)) & 0xFFU); + FTFC->FCCOB[0] = (blt_int8u)(prog_addr & 0xFFU); + /* set the phrase bytes that should be programmed. + * FTFC->FCCOB[7] = FCCOB4 + * FTFC->FCCOB[6] = FCCOB5 + * FTFC->FCCOB[5] = FCCOB6 + * FTFC->FCCOB[4] = FCCOB7 + * FTFC->FCCOB[11] = FCCOB8 + * FTFC->FCCOB[10] = FCCOB9 + * FTFC->FCCOB[9] = FCCOBA + * FTFC->FCCOB[8] = FCCOBB + */ + FTFC->FCCOB[4] = prog_data[0]; + FTFC->FCCOB[5] = prog_data[1]; + FTFC->FCCOB[6] = prog_data[2]; + FTFC->FCCOB[7] = prog_data[3]; + FTFC->FCCOB[8] = prog_data[4]; + FTFC->FCCOB[9] = prog_data[5]; + FTFC->FCCOB[10] = prog_data[6]; + FTFC->FCCOB[11] = prog_data[7]; + /* Execute the command. Note that it needs to run from RAM. */ + FlashCommandSequence(); + /* Check the results. */ + if ((FTFC->FSTAT & (FTFC_FSTAT_MGSTAT0_MASK | FTFC_FSTAT_FPVIOL_MASK | + FTFC_FSTAT_ACCERR_MASK | FTFC_FSTAT_RDCOLERR_MASK)) != 0U) + { + /* could not perform program operation */ + result = BLT_FALSE; + /* error detected so don't bother continuing with the loop */ + break; + } + /* verify that the written data is actually there. */ + flash_data = ((blt_int8u const *)prog_addr); + for (phrase_byte_idx = 0; phrase_byte_idx < phrase_size; phrase_byte_idx++) + { + /* check that the byte in flash has the same value as what was programmed. */ + if (flash_data[phrase_byte_idx] != prog_data[phrase_byte_idx]) + { + /* verification of programmed data failed. */ + result = BLT_FALSE; + /* error detected so don't bother continuing with the loop */ + break; + + } + } + } + } + + /* Give the result back to the caller. */ + return result; +} /*** end of FlashWriteBlock ***/ + + +/************************************************************************************//** +** \brief Erases the flash sectors from indices first_sector_idx up until +** last_sector_idx into the flashLayout[] array. +** \param first_sector_idx First flash sector number index into flashLayout[]. +** \param last_sector_idx Last flash sector number index into flashLayout[]. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +static blt_bool FlashEraseSectors(blt_int8u first_sector_idx, blt_int8u last_sector_idx) +{ + blt_bool result = BLT_TRUE; + blt_int8u sectorIdx; + blt_addr sectorBaseAddr; + blt_int32u sectorSize; + blt_int8u blockIdx; + blt_addr blockBaseAddr; + blt_int8u totalBlocks; + + /* validate the sector numbers */ + if (first_sector_idx > last_sector_idx) + { + result = BLT_FALSE; + } + + /* only continue if all is okay so far */ + if (result == BLT_TRUE) + { + if (last_sector_idx > (FLASH_TOTAL_SECTORS-1)) + { + result = BLT_FALSE; + } + } + + /* only continue if all is okay so far */ + if (result == BLT_TRUE) + { + /* erase the sectors one by one */ + for (sectorIdx = first_sector_idx; sectorIdx <= last_sector_idx; sectorIdx++) + { + /* service the watchdog */ + CopService(); + /* get information about the sector */ + sectorBaseAddr = flashLayout[sectorIdx].sector_start; + sectorSize = flashLayout[sectorIdx].sector_size; + /* validate the sector information */ + if ( (sectorBaseAddr == FLASH_INVALID_ADDRESS) || (sectorSize == 0) ) + { + /* invalid sector information. flag error and abort erase operation */ + result = BLT_FALSE; + break; + } + + /* each sector could contain more than just one block. make sure the base address + * of the sector is block aligned. + */ + if ((sectorBaseAddr % FLASH_ERASE_BLOCK_SIZE) != 0) + { + /* sector base address not aligned to the start of a block. flag error and abort + * erase operation + */ + result = BLT_FALSE; + break; + } + + /* make sure the sector size is an exact multiple of the block size. */ + if ((sectorSize % FLASH_ERASE_BLOCK_SIZE) != 0) + { + /* sector base address not aligned to the start of a block. flag error and abort + * erase operation + */ + result = BLT_FALSE; + break; + } + + /* erase the sector one block at a time. */ + totalBlocks = sectorSize / FLASH_ERASE_BLOCK_SIZE; + for (blockIdx = 0; blockIdx < totalBlocks; blockIdx++) + { + /* service the watchdog */ + CopService(); + /* store the block base address. */ + blockBaseAddr = sectorBaseAddr + (blockIdx * FLASH_ERASE_BLOCK_SIZE); + /* check CCIF to verify that the previous command is completed. */ + if ((FTFC->FSTAT & FTFC_FSTAT_CCIF_MASK) == FTFC_FSTAT_CCIF(0)) + { + /* FTFC module should not be busy anymore. flag error and abort. */ + result = BLT_FALSE; + break; + } + /* clear the old errors that might still be set from a previous operation. */ + FTFC->FSTAT = FTFC_FSTAT_FPVIOL_MASK | FTFC_FSTAT_ACCERR_MASK | FTFC_FSTAT_RDCOLERR_MASK; + /* prepare the sector erase command. + * FTFC->FCCOB[3] = FCCOB0 + */ + FTFC->FCCOB[3] = FLASH_FTFC_CMD_ERASE_SECTOR; + /* set the erase sector base address. note that in this function that means the + * block base address. + * FTFC->FCCOB[2] = FCCOB1 + * FTFC->FCCOB[1] = FCCOB2 + * FTFC->FCCOB[0] = FCCOB3 + */ + FTFC->FCCOB[2] = (blt_int8u)(((blt_addr)(blockBaseAddr >> 16U)) & 0xFFU); + FTFC->FCCOB[1] = (blt_int8u)(((blt_addr)(blockBaseAddr >> 8U)) & 0xFFU); + FTFC->FCCOB[0] = (blt_int8u)(blockBaseAddr & 0xFFU); + /* Execute the command. Note that it needs to run from RAM. */ + FlashCommandSequence(); + /* Check the results. */ + if ((FTFC->FSTAT & (FTFC_FSTAT_MGSTAT0_MASK | FTFC_FSTAT_FPVIOL_MASK | + FTFC_FSTAT_ACCERR_MASK | FTFC_FSTAT_RDCOLERR_MASK)) != 0U) + { + /* could not perform erase operation */ + result = BLT_FALSE; + /* error detected so don't bother continuing with the loop */ + break; + } + } + + /* Only continue with the next sector if all is okay so far. */ + if (result == BLT_FALSE) + { + break; + } + } + } + + /* give the result back to the caller */ + return result; +} /*** end of FlashEraseSectors ***/ + + +/************************************************************************************//** +** \brief Determines the index into the flashLayout[] array of the flash sector that +** the specified address is in. +** \param address Address in the flash sector. +** \return Flash sector index in flashLayout[] or FLASH_INVALID_SECTOR_IDX. +** +****************************************************************************************/ +static blt_int8u FlashGetSectorIdx(blt_addr address) +{ + blt_int8u result = FLASH_INVALID_SECTOR_IDX; + blt_int8u sectorIdx; + + /* search through the sectors to find the right one */ + for (sectorIdx = 0; sectorIdx < FLASH_TOTAL_SECTORS; sectorIdx++) + { + /* keep the watchdog happy */ + CopService(); + /* is the address in this sector? */ + if ((address >= flashLayout[sectorIdx].sector_start) && \ + (address < (flashLayout[sectorIdx].sector_start + \ + flashLayout[sectorIdx].sector_size))) + { + /* update the result value and stop looping */ + result = sectorIdx; + break; + } + } + + /* give the result back to the caller */ + return result; +} /*** end of FlashGetSectorIdx ***/ + + +/************************************************************************************//** +** \brief Use the FTFC module to run the flash command sequence. It is assumed that +** that command and its necessary parameters were already written to the +** correct FTFC registers. +** \attention This function needs to run from RAM. It is configured such that the C +** start-up code automatically copies it from ROM to RAM in function +** init_data_bss(), which is called by the reset handler. +** \return None. +** +****************************************************************************************/ +START_FUNCTION_DEFINITION_RAMSECTION +static void FlashCommandSequence(void) +{ + /* Clear CCIF to launch command. This is done by writing a 1 to the bit. */ + FTFC->FSTAT |= FTFC_FSTAT_CCIF_MASK; + + /* Wait for operation to complete. + * From S32K Reference Manual: + * While executing from a particular PFLASH read partition , FTFC commands (except + * parallel boot) cannot run over that PFLASH read partition. + * + * The S32K series up to 512kB only have 1 partition, meaning we cannot return from + * this (ram based) function until the operation completes. We don't have to worry + * about a potentially endless loop, as if an error occurs during the command, the + * operation will return and set an error flag, which can be evaluated after this + * function call. If an operation hangs we have a processor hardware error, and have + * more to worry about than a hanging while loop. + */ + while ((FTFC->FSTAT & FTFC_FSTAT_CCIF_MASK) == 0U) + { + /* Ideally, the watchdog is serviced in this function. But function CopService() is + * located in the flash partition and can therefore not be accessed. This does mean + * that the watchdog timeout period should be configured to be longer that the worst + * case execution time of the flash phrase program / sector erase commands. + */ + ; + } +} /*** end of FlashCommandSequence ***/ +END_FUNCTION_DEFINITION_RAMSECTION + + +/*********************************** end of flash.c ************************************/ diff --git a/Target/Source/ARMCM0_S32K11/flash.h b/Target/Source/ARMCM0_S32K11/flash.h new file mode 100644 index 00000000..7d870911 --- /dev/null +++ b/Target/Source/ARMCM0_S32K11/flash.h @@ -0,0 +1,45 @@ +/************************************************************************************//** +* \file Source/ARMCM0_S32K11/flash.h +* \brief Bootloader flash driver header file. +* \ingroup Target_ARMCM0_S32K11 +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ +#ifndef FLASH_H +#define FLASH_H + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +void FlashInit(void); +void FlashReinit(void); +blt_bool FlashWrite(blt_addr addr, blt_int32u len, blt_int8u *data); +blt_bool FlashErase(blt_addr addr, blt_int32u len); +blt_bool FlashWriteChecksum(void); +blt_bool FlashVerifyChecksum(void); +blt_bool FlashDone(void); +blt_addr FlashGetUserProgBaseAddress(void); + + +#endif /* FLASH_H */ +/*********************************** end of flash.h ************************************/ diff --git a/Target/Source/ARMCM0_S32K11/nvm.c b/Target/Source/ARMCM0_S32K11/nvm.c new file mode 100644 index 00000000..9e6c39f0 --- /dev/null +++ b/Target/Source/ARMCM0_S32K11/nvm.c @@ -0,0 +1,245 @@ +/************************************************************************************//** +* \file Source/ARMCM0_S32K11/nvm.c +* \brief Bootloader non-volatile memory driver source file. +* \ingroup Target_ARMCM0_S32K11 +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#include "flash.h" + + +/**************************************************************************************** +* Hook functions +****************************************************************************************/ +#if (BOOT_NVM_HOOKS_ENABLE > 0) +extern void NvmInitHook(void); +extern void NvmReinitHook(void); +extern blt_int8u NvmWriteHook(blt_addr addr, blt_int32u len, blt_int8u *data); +extern blt_int8u NvmEraseHook(blt_addr addr, blt_int32u len); +extern blt_bool NvmDoneHook(void); +#endif + +#if (BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0) +extern blt_bool NvmWriteChecksumHook(void); +extern blt_bool NvmVerifyChecksumHook(void); +#endif + + +/************************************************************************************//** +** \brief Initializes the NVM driver. +** \return none. +** +****************************************************************************************/ +void NvmInit(void) +{ +#if (BOOT_NVM_HOOKS_ENABLE > 0) + /* give the application a chance to initialize a driver for operating on NVM + * that is not by default supported by this driver. + */ + NvmInitHook(); +#endif + + /* init the internal driver */ + FlashInit(); +} /*** end of NvmInit ***/ + + +/************************************************************************************//** +** \brief Reinitializes the NVM driver. This function is called at the start of each +** firmware update as opposed to NvmInit, which is only called once during +** power on. +** \return none. +** +****************************************************************************************/ +void NvmReinit(void) +{ +#if (BOOT_NVM_HOOKS_ENABLE > 0) + /* give the application a chance to re-initialize a driver for operating on NVM + * that is not by default supported by this driver. + */ + NvmReinitHook(); +#endif + + /* reinitialize the internal driver */ + FlashReinit(); +} /*** end of NvmReinit ***/ + + +/************************************************************************************//** +** \brief Programs the non-volatile memory. +** \param addr Start address. +** \param len Length in bytes. +** \param data Pointer to the data buffer. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool NvmWrite(blt_addr addr, blt_int32u len, blt_int8u *data) +{ +#if (BOOT_NVM_HOOKS_ENABLE > 0) + blt_int8u result = BLT_NVM_NOT_IN_RANGE; +#endif + +#if (BOOT_NVM_HOOKS_ENABLE > 0) + /* give the application a chance to operate on memory that is not by default supported + * by this driver. + */ + result = NvmWriteHook(addr, len, data); + + /* process the return code */ + if (result == BLT_NVM_OKAY) + { + /* data was within range of the additionally supported memory and succesfully + * programmed, so we are all done. + */ + return BLT_TRUE; + } + else if (result == BLT_NVM_ERROR) + { + /* data was within range of the additionally supported memory and attempted to be + * programmed, but an error occurred, so we can't continue. + */ + return BLT_FALSE; + } +#endif + + /* still here so the internal driver should try and perform the program operation */ + return FlashWrite(addr, len, data); +} /*** end of NvmWrite ***/ + + +/************************************************************************************//** +** \brief Erases the non-volatile memory. +** \param addr Start address. +** \param len Length in bytes. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool NvmErase(blt_addr addr, blt_int32u len) +{ +#if (BOOT_NVM_HOOKS_ENABLE > 0) + blt_int8u result = BLT_NVM_NOT_IN_RANGE; +#endif + +#if (BOOT_NVM_HOOKS_ENABLE > 0) + /* give the application a chance to operate on memory that is not by default supported + * by this driver. + */ + result = NvmEraseHook(addr, len); + + /* process the return code */ + if (result == BLT_NVM_OKAY) + { + /* address was within range of the additionally supported memory and succesfully + * erased, so we are all done. + */ + return BLT_TRUE; + } + else if (result == BLT_NVM_ERROR) + { + /* address was within range of the additionally supported memory and attempted to be + * erased, but an error occurred, so we can't continue. + */ + return BLT_FALSE; + } +#endif + + /* still here so the internal driver should try and perform the erase operation */ + return FlashErase(addr, len); +} /*** end of NvmErase ***/ + + +/************************************************************************************//** +** \brief Verifies the checksum, which indicates that a valid user program is +** present and can be started. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool NvmVerifyChecksum(void) +{ +#if (BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0) + /* check checksum using the application specific method. */ + return NvmVerifyChecksumHook(); +#else + /* check checksum using the interally supported method. */ + return FlashVerifyChecksum(); +#endif +} /*** end of NvmVerifyChecksum ***/ + + +/************************************************************************************//** +** \brief Obtains the base address of the non-volatile memory available to the user +** program. This is typically that start of the vector table. +** \return Base address. +** +****************************************************************************************/ +blt_addr NvmGetUserProgBaseAddress(void) +{ + return FlashGetUserProgBaseAddress(); +} /*** end of NvmGetUserProgBaseAddress ***/ + + +/************************************************************************************//** +** \brief Once all erase and programming operations are completed, this +** function is called, so at the end of the programming session and +** right before a software reset is performed. It is used to calculate +** a checksum and program this into flash. This checksum is later used +** to determine if a valid user program is present in flash. +** \return BLT_TRUE if successful, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool NvmDone(void) +{ +#if (BOOT_NVM_HOOKS_ENABLE > 0) + /* give the application's NVM driver a chance to finish up */ + if (NvmDoneHook() == BLT_FALSE) + { + /* error so no need to continue */ + return BLT_FALSE; + } +#endif + +#if (BOOT_NVM_CHECKSUM_HOOKS_ENABLE > 0) + /* compute and write checksum, using the application specific method. */ + if (NvmWriteChecksumHook() == BLT_FALSE) + { + return BLT_FALSE; + } +#else + /* compute and write checksum, which is programmed by the internal driver. */ + if (FlashWriteChecksum() == BLT_FALSE) + { + return BLT_FALSE; + } +#endif + + /* finish up internal driver operations */ + return FlashDone(); +} /*** end of NvmDone ***/ + + +/*********************************** end of nvm.c **************************************/ diff --git a/Target/Source/ARMCM0_S32K11/rs232.c b/Target/Source/ARMCM0_S32K11/rs232.c new file mode 100644 index 00000000..755779cf --- /dev/null +++ b/Target/Source/ARMCM0_S32K11/rs232.c @@ -0,0 +1,335 @@ +/************************************************************************************//** +* \file Source/ARMCM0_S32K11/uart.c +* \brief Bootloader RS232 communication interface source file. +* \ingroup Target_ARMCM0_S32K11 +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#if (BOOT_COM_RS232_ENABLE > 0) +#include "device_registers.h" /* device registers */ + + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +/** \brief Timeout time for the reception of a CTO packet. The timer is started upon + * reception of the first packet byte. + */ +#define RS232_CTO_RX_PACKET_TIMEOUT_MS (100U) +/** \brief Timeout for transmitting a byte in milliseconds. */ +#define RS232_BYTE_TX_TIMEOUT_MS (10U) + +#if (BOOT_COM_RS232_CHANNEL_INDEX == 0) +/** \brief Set the peripheral LPUART0 base pointer. */ +#define LPUARTx (LPUART0) +/** \brief Set the PCC index offset for LPUART0. */ +#define PCC_LPUARTx_INDEX (PCC_LPUART0_INDEX) +#elif (BOOT_COM_RS232_CHANNEL_INDEX == 1) +/** \brief Set the peripheral LPUART1 base pointer. */ +#define LPUARTx (LPUART1) +/** \brief Set the PCC index offset for LPUART1. */ +#define PCC_LPUARTx_INDEX (PCC_LPUART1_INDEX) +#endif + + +/**************************************************************************************** +* Function prototypes +****************************************************************************************/ +static blt_bool Rs232ReceiveByte(blt_int8u *data); +static void Rs232TransmitByte(blt_int8u data); + + +/************************************************************************************//** +** \brief Initializes the RS232 communication interface. +** \return none. +** +****************************************************************************************/ +void Rs232Init(void) +{ + blt_int32u sourceClockFreqHz; + blt_int32u div2RegValue; + blt_int16u baudrateSbr0_12; + blt_int8u const div2DividerLookup[] = + { + 0U, /* 0b000. Output disabled. */ + 1U, /* 0b001. Divide by 1. */ + 2U, /* 0b010. Divide by 2. */ + 4U, /* 0b011. Divide by 4. */ + 8U, /* 0b100. Divide by 8. */ + 16U, /* 0b101. Divide by 16. */ + 32U, /* 0b110. Divide by 32. */ + 64U, /* 0b111. Divide by 64. */ + }; + + /* Perform compile time assertion to check that the configured UART channel is actually + * supported by this driver. + */ + ASSERT_CT((BOOT_COM_RS232_CHANNEL_INDEX == 0) || + (BOOT_COM_RS232_CHANNEL_INDEX == 1)); + + /* Make sure the UART peripheral clock is disabled before configuring its source + * clock. + */ + PCC->PCCn[PCC_LPUARTx_INDEX] &= ~PCC_PCCn_CGC_MASK; + /* Select option 2 as the UART peripheral source clock and enable the clock. Option 2 + * is the SIRCDIV2_CLK, which is available on all peripherals and configurations. + */ + PCC->PCCn[PCC_LPUARTx_INDEX] |= PCC_PCCn_PCS(2) | PCC_PCCn_CGC_MASK; + /* Obtain the DIV2 divider value of the SIRC_CLK. */ + div2RegValue = (SCG->SIRCDIV & SCG_SIRCDIV_SIRCDIV2_MASK) >> SCG_SIRCDIV_SIRCDIV2_SHIFT; + /* Check if the DIV2 register value for SIRC is 0. In this case SIRCDIV2_CLK is + * currently disabled. + */ + if (div2RegValue == 0U) + { + /* Configure the DIV2 for a default divide by 1 to make sure the SIRCDIV2_CLK is + * actually enabled. + */ + div2RegValue = 1U; + SCG->SIRCDIV |= SCG_SIRCDIV_SIRCDIV2(div2RegValue); + } + /* Determine the SIRC clock frequency. If SIRC high range is enabled, it is 8 MHz. If + * SIRC low range is enabled, it is 2 MHz. + */ + sourceClockFreqHz = 8000000U; + if ((SCG->SIRCCFG & SCG_SIRCCFG_RANGE_MASK) == SCG_SIRCCFG_RANGE(0)) + { + sourceClockFreqHz = 2000000U; + } + /* Now process the configured DIV2 divider factor to get the actual frequency of the + * UART peripheral source clock. + */ + sourceClockFreqHz /= div2DividerLookup[div2RegValue]; + /* Configure the baudrate from BOOT_COM_RS232_BAUDRATE, taking into account that an + * oversampling of 8 will be configured. Default 8,n,1 format is used. Integer + * rounding is used to get the best value for baudrateSbr0_12. Actual baudrate equals + * sourceClockFreqHz / 8 / baudrateSbr0_12. + */ + baudrateSbr0_12 = (((sourceClockFreqHz / BOOT_COM_RS232_BAUDRATE) + (8U - 1U)) / 8U) & + LPUART_BAUD_SBR_MASK; + /* OSR=7: Over sampling ratio = 7+1=8. + * SBNS=0: One stop bit. + * BOTHEDGE=0: receiver samples only on rising edge. + * M10=0: Rx and Tx use 7 to 9 bit data characters. + * RESYNCDIS=0: Resync during rec'd data word supported. + * LBKDIE, RXEDGIE=0: interrupts disable. + * TDMAE, RDMAE, TDMAE=0: DMA requests disabled. + * MAEN1, MAEN2, MATCFG=0: Match disabled. + */ + LPUARTx->BAUD = LPUART_BAUD_SBR(baudrateSbr0_12) | LPUART_BAUD_OSR(7); + /* Clear the error/interrupt flags */ + LPUARTx->STAT = FEATURE_LPUART_STAT_REG_FLAGS_MASK; + /* Reset all features/interrupts by default */ + LPUARTx->CTRL = 0x00000000; + /* Reset match addresses */ + LPUARTx->MATCH = 0x00000000; +#if FEATURE_LPUART_HAS_MODEM_SUPPORT + /* Reset IrDA modem features */ + LPUARTx->MODIR = 0x00000000; +#endif +#if FEATURE_LPUART_FIFO_SIZE > 0U + /* Reset FIFO feature */ + LPUARTx->FIFO = FEATURE_LPUART_FIFO_RESET_MASK; + /* Enable the transmit and receive FIFOs. */ + LPUARTx->FIFO |= LPUART_FIFO_TXFE(1) | LPUART_FIFO_RXFE(1); + /* Set the reception water mark to 0 and the transmitter water mark to 1. */ + LPUARTx->WATER = LPUART_WATER_TXWATER(1) | LPUART_WATER_RXWATER(0); +#endif + /* Enable transmitter and receiver, no parity, 8 bit char: + * RE=1: Receiver enabled. + * TE=1: Transmitter enabled. + * PE,PT=0: No hw parity generation or checking. + * M7,M,R8T9,R9T8=0: 8-bit data characters. + * DOZEEN=0: LPUART enabled in Doze mode. + * ORIE,NEIE,FEIE,PEIE,TIE,TCIE,RIE,ILIE,MA1IE,MA2IE=0: no IRQ. + * TxDIR=0: TxD pin is input if in single-wire mode. + * TXINV=0: Transmit data not inverted. + * RWU,WAKE=0: normal operation; rcvr not in standby. + * IDLCFG=0: one idle character. + * ILT=0: Idle char bit count starts after start bit. + * SBK=0: Normal transmitter operation - no break char. + * LOOPS,RSRC=0: no loop back. + */ + LPUARTx->CTRL = LPUART_CTRL_RE_MASK | LPUART_CTRL_TE_MASK; +} /*** end of Rs232Init ***/ + + +/************************************************************************************//** +** \brief Transmits a packet formatted for the communication interface. +** \param data Pointer to byte array with data that it to be transmitted. +** \param len Number of bytes that are to be transmitted. +** \return none. +** +****************************************************************************************/ +void Rs232TransmitPacket(blt_int8u *data, blt_int8u len) +{ + blt_int16u data_index; + + /* Verify validity of the len-paramenter. */ + ASSERT_RT(len <= BOOT_COM_RS232_TX_MAX_DATA); + + /* First transmit the length of the packet. */ + Rs232TransmitByte(len); + + /* Transmit all the packet bytes one-by-one. */ + for (data_index = 0U; data_index < len; data_index++) + { + /* Keep the watchdog happy. */ + CopService(); + /* Write byte. */ + Rs232TransmitByte(data[data_index]); + } +} /*** end of Rs232TransmitPacket ***/ + + +/************************************************************************************//** +** \brief Receives a communication interface packet if one is present. +** \param data Pointer to byte array where the data is to be stored. +** \param len Pointer where the length of the packet is to be stored. +** \return BLT_TRUE if a packet was received, BLT_FALSE otherwise. +** +****************************************************************************************/ +blt_bool Rs232ReceivePacket(blt_int8u *data, blt_int8u *len) +{ + static blt_int8u xcpCtoReqPacket[BOOT_COM_RS232_RX_MAX_DATA+1U]; /* One extra for length. */ + static blt_int8u xcpCtoRxLength; + static blt_bool xcpCtoRxInProgress = BLT_FALSE; + static blt_int32u xcpCtoRxStartTime = 0U; + + /* Start of cto packet received? */ + if (xcpCtoRxInProgress == BLT_FALSE) + { + /* Store the message length when received. */ + if (Rs232ReceiveByte(&xcpCtoReqPacket[0]) == BLT_TRUE) + { + if ( (xcpCtoReqPacket[0] > 0U) && + (xcpCtoReqPacket[0] <= BOOT_COM_RS232_RX_MAX_DATA) ) + { + /* Store the start time. */ + xcpCtoRxStartTime = TimerGet(); + /* Reset packet data count. */ + xcpCtoRxLength = 0U; + /* Indicate that a cto packet is being received. */ + xcpCtoRxInProgress = BLT_TRUE; + } + } + } + else + { + /* Store the next packet byte. */ + if (Rs232ReceiveByte(&xcpCtoReqPacket[xcpCtoRxLength+1U]) == BLT_TRUE) + { + /* Increment the packet data count. */ + xcpCtoRxLength++; + + /* Check to see if the entire packet was received. */ + if (xcpCtoRxLength == xcpCtoReqPacket[0]) + { + /* Copy the packet data. */ + CpuMemCopy((blt_int32u)data, (blt_int32u)&xcpCtoReqPacket[1], xcpCtoRxLength); + /* Done with cto packet reception. */ + xcpCtoRxInProgress = BLT_FALSE; + /* Set the packet length. */ + *len = xcpCtoRxLength; + /* Packet reception complete. */ + return BLT_TRUE; + } + } + else + { + /* Check packet reception timeout. */ + if (TimerGet() > (xcpCtoRxStartTime + RS232_CTO_RX_PACKET_TIMEOUT_MS)) + { + /* Cancel cto packet reception due to timeout. Note that that automaticaly + * discards the already received packet bytes, allowing the host to retry. + */ + xcpCtoRxInProgress = BLT_FALSE; + } + } + } + /* Packet reception not yet complete. */ + return BLT_FALSE; +} /*** end of Rs232ReceivePacket ***/ + + +/************************************************************************************//** +** \brief Receives a communication interface byte if one is present. +** \param data Pointer to byte where the data is to be stored. +** \return BLT_TRUE if a byte was received, BLT_FALSE otherwise. +** +****************************************************************************************/ +static blt_bool Rs232ReceiveByte(blt_int8u *data) +{ + blt_bool result = BLT_FALSE; + + /* Check if a new byte was received by means of the RDRF-bit. */ + if (((LPUARTx->STAT & LPUART_STAT_RDRF_MASK) >> LPUART_STAT_RDRF_SHIFT) != 0U) + { + /* Retrieve and store the newly received byte. */ + *data = LPUARTx->DATA; + /* Update the result. */ + result = BLT_TRUE; + } + + /* Give the result back to the caller. */ + return result; +} /*** end of Rs232ReceiveByte ***/ + + +/************************************************************************************//** +** \brief Transmits a communication interface byte. +** \param data Value of byte that is to be transmitted. +** \return none. +** +****************************************************************************************/ +static void Rs232TransmitByte(blt_int8u data) +{ + blt_int32u timeout; + + /* Write the byte value in 'data' to the transmit register of the UART peripheral such + * that the transmission of the byte value is started. + */ + LPUARTx->DATA = data; + /* Set timeout time to wait for transmit completion. */ + timeout = TimerGet() + RS232_BYTE_TX_TIMEOUT_MS; + /* Wait for tx holding register to be empty. */ + while (((LPUARTx->STAT & LPUART_STAT_TDRE_MASK) >> LPUART_STAT_TDRE_SHIFT) == 0U) + { + /* Keep the watchdog happy. */ + CopService(); + /* Break loop upon timeout. this would indicate a hardware failure. */ + if (TimerGet() > timeout) + { + break; + } + } +} /*** end of Rs232TransmitByte ***/ +#endif /* BOOT_COM_RS232_ENABLE > 0 */ + + +/*********************************** end of rs232.c ************************************/ diff --git a/Target/Source/ARMCM0_S32K11/target.dox b/Target/Source/ARMCM0_S32K11/target.dox new file mode 100644 index 00000000..ee14b209 --- /dev/null +++ b/Target/Source/ARMCM0_S32K11/target.dox @@ -0,0 +1,9 @@ +/** +\defgroup Target_ARMCM0_S32K11 Target ARMCM0 S32K11 +\ingroup Ports +\brief Target dependent code for the NXP ARMCM0 S32K11x microcontroller family. +\details This module implements the bootloader's target dependent part for the + NXP ARMCM0 S32K11x microcontroller family. +*/ + + diff --git a/Target/Source/ARMCM0_S32K11/timer.c b/Target/Source/ARMCM0_S32K11/timer.c new file mode 100644 index 00000000..82e5b234 --- /dev/null +++ b/Target/Source/ARMCM0_S32K11/timer.c @@ -0,0 +1,110 @@ +/************************************************************************************//** +* \file Source/ARMCM0_S32K11/timer.c +* \brief Bootloader timer driver source file. +* \ingroup Target_ARMCM0_S32K11 +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include "boot.h" /* bootloader generic header */ +#include "device_registers.h" /* device registers */ + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/** \brief Local variable for storing the number of milliseconds that have elapsed since + * startup. + */ +static blt_int32u millisecond_counter; + + +/************************************************************************************//** +** \brief Initializes the polling based millisecond timer driver. +** \return none. +** +****************************************************************************************/ +void TimerInit(void) +{ + /* Reset the timer configuration. */ + TimerReset(); + /* Configure the systick frequency as a 1 ms event generator. */ + S32_SysTick->RVR = BOOT_CPU_SYSTEM_SPEED_KHZ - 1; + /* Reset the current counter value. */ + S32_SysTick->CVR = 0u; + /* Select core clock as source and enable the timer. */ + S32_SysTick->CSR = S32_SysTick_CSR_ENABLE_MASK | S32_SysTick_CSR_CLKSOURCE_MASK; + /* Reset the millisecond counter value. */ + millisecond_counter = 0; +} /*** end of TimerInit ***/ + + +/************************************************************************************//** +** \brief Reset the timer by placing the timer back into it's default reset +** configuration. +** \return none. +** +****************************************************************************************/ +void TimerReset(void) +{ + /* Set the systick's status and control register back into the default reset value. */ + S32_SysTick->CSR = 0; +} /* end of TimerReset */ + + +/************************************************************************************//** +** \brief Updates the millisecond timer. +** \return none. +** +****************************************************************************************/ +void TimerUpdate(void) +{ + /* Check if the millisecond event occurred. */ + if ((S32_SysTick->CSR & S32_SysTick_CSR_COUNTFLAG_MASK) != 0) + { + /* Increment the millisecond counter. */ + millisecond_counter++; + } +} /*** end of TimerUpdate ***/ + + +/************************************************************************************//** +** \brief Obtains the counter value of the millisecond timer. +** \return Current value of the millisecond timer. +** +****************************************************************************************/ +blt_int32u TimerGet(void) +{ + /* Updating timer here allows this function to be called in a loop with timeout + * detection. + */ + TimerUpdate(); + /* Read and return the amount of milliseconds that passed since initialization. */ + return millisecond_counter; +} /*** end of TimerGet ***/ + + +/*********************************** end of timer.c ************************************/ diff --git a/Target/Source/ARMCM0_S32K11/types.h b/Target/Source/ARMCM0_S32K11/types.h new file mode 100644 index 00000000..7627865f --- /dev/null +++ b/Target/Source/ARMCM0_S32K11/types.h @@ -0,0 +1,57 @@ +/************************************************************************************//** +* \file Source/ARMCM0_S32K11/types.h +* \brief Bootloader types header file. +* \ingroup Target_ARMCM0_S32K11 +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2020 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ +#ifndef TYPES_H +#define TYPES_H + +/**************************************************************************************** +* Macro definitions +****************************************************************************************/ +/** \brief Boolean true value. */ +#define BLT_TRUE (1) +/** \brief Boolean false value. */ +#define BLT_FALSE (0) +/** \brief NULL pointer value. */ +#define BLT_NULL ((void *)0) + + +/**************************************************************************************** +* Type definitions +****************************************************************************************/ +typedef unsigned char blt_bool; /**< boolean type */ +typedef char blt_char; /**< character type */ +typedef unsigned long blt_addr; /**< memory address type */ +typedef unsigned char blt_int8u; /**< 8-bit unsigned integer */ +typedef signed char blt_int8s; /**< 8-bit signed integer */ +typedef unsigned short blt_int16u; /**< 16-bit unsigned integer */ +typedef signed short blt_int16s; /**< 16-bit signed integer */ +typedef unsigned int blt_int32u; /**< 32-bit unsigned integer */ +typedef signed int blt_int32s; /**< 32-bit signed integer */ + + +#endif /* TYPES_H */ +/*********************************** end of types.h ************************************/