From eca185dd018ed4f441c5459a1b606260a24ee008 Mon Sep 17 00:00:00 2001 From: Frank Voorburg Date: Fri, 20 Mar 2020 09:31:39 +0000 Subject: [PATCH] Refs #816. Reintegrating branch where the S32K14 port was developed. git-svn-id: https://svn.code.sf.net/p/openblt/code/trunk@762 5dc33758-31d5-4daf-9ae8-b24bf3d40d73 --- .../Boot/.cproject | 170 + .../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 | 217 + .../Boot/Debug/openblt_s32k144.elf | Bin 0 -> 643712 bytes .../Boot/Debug/openblt_s32k144.srec | 462 + .../Boot/S32K144_64_flash.ld | 280 + .../Boot/blt_conf.h | 176 + .../Boot/boot.dox | 7 + .../ARMCM4_S32K14_S32K144EVB_GCC/Boot/hooks.c | 307 + .../ARMCM4_S32K14_S32K144EVB_GCC/Boot/led.c | 108 + .../ARMCM4_S32K14_S32K144EVB_GCC/Boot/led.h | 40 + .../Boot/lib/S32K144.h | 11937 ++++++++++++++++ .../Boot/lib/S32K144_features.h | 1507 ++ .../Boot/lib/devassert.h | 84 + .../Boot/lib/device_registers.h | 70 + .../Boot/lib/s32_core_cm4.h | 209 + .../Boot/lib/system_S32K144.c | 197 + .../Boot/lib/system_S32K144.h | 111 + .../ARMCM4_S32K14_S32K144EVB_GCC/Boot/main.c | 211 + .../Boot/startup/startup.c | 248 + .../Boot/startup/startup.h | 133 + .../Boot/startup/startup_S32K144.S | 531 + .../Prog/.cproject | 166 + .../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_s32k144.elf | Bin 0 -> 593988 bytes .../Prog/Debug/demoprog_s32k144.srec | 245 + .../Prog/Prog_Debug.launch | 217 + .../Prog/S32K144_64_flash.ld | 280 + .../ARMCM4_S32K14_S32K144EVB_GCC/Prog/boot.c | 772 + .../ARMCM4_S32K14_S32K144EVB_GCC/Prog/boot.h | 40 + .../Prog/header.h | 42 + .../ARMCM4_S32K14_S32K144EVB_GCC/Prog/led.c | 96 + .../ARMCM4_S32K14_S32K144EVB_GCC/Prog/led.h | 39 + .../Prog/lib/S32K144.h | 11937 ++++++++++++++++ .../Prog/lib/S32K144_features.h | 1507 ++ .../Prog/lib/devassert.h | 84 + .../Prog/lib/device_registers.h | 70 + .../Prog/lib/s32_core_cm4.h | 209 + .../Prog/lib/system_S32K144.c | 197 + .../Prog/lib/system_S32K144.h | 111 + .../ARMCM4_S32K14_S32K144EVB_GCC/Prog/main.c | 207 + .../Prog/prog.dox | 13 + .../Prog/startup/startup.c | 248 + .../Prog/startup/startup.h | 133 + .../Prog/startup/startup_S32K144.S | 531 + .../ARMCM4_S32K14_S32K144EVB_GCC/Prog/timer.c | 88 + .../ARMCM4_S32K14_S32K144EVB_GCC/Prog/timer.h | 38 + .../ARMCM4_S32K14_S32K144EVB_GCC/demo.dox | 8 + Target/Demo/_template/Prog/boot.c | 2 +- Target/Source/ARMCM4_S32K14/GCC/cpu_comp.c | 59 + Target/Source/ARMCM4_S32K14/can.c | 616 + Target/Source/ARMCM4_S32K14/cpu.c | 192 + Target/Source/ARMCM4_S32K14/flash.c | 1060 ++ Target/Source/ARMCM4_S32K14/flash.h | 45 + Target/Source/ARMCM4_S32K14/nvm.c | 245 + Target/Source/ARMCM4_S32K14/rs232.c | 341 + Target/Source/ARMCM4_S32K14/target.dox | 9 + Target/Source/ARMCM4_S32K14/timer.c | 110 + Target/Source/ARMCM4_S32K14/types.h | 57 + Target/Source/_template/can.c | 2 +- 70 files changed, 37200 insertions(+), 2 deletions(-) create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.cproject create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.project create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.settings/com.nxp.s32ds.cle.runtime.component.prefs create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.settings/com.processorexpert.core.ide.newprojectwizard.prefs create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.settings/language.settings.xml create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.settings/org.eclipse.cdt.core.prefs create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/Boot_Debug.launch create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/Debug/openblt_s32k144.elf create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/Debug/openblt_s32k144.srec create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/S32K144_64_flash.ld create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/blt_conf.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/boot.dox create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/hooks.c create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/led.c create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/led.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/S32K144.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/S32K144_features.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/devassert.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/device_registers.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/s32_core_cm4.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/system_S32K144.c create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/system_S32K144.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/main.c create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/startup/startup.c create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/startup/startup.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/startup/startup_S32K144.S create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.cproject create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.project create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.settings/com.nxp.s32ds.cle.runtime.component.prefs create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.settings/com.processorexpert.core.ide.newprojectwizard.prefs create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.settings/language.settings.xml create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.settings/org.eclipse.cdt.core.prefs create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/Debug/demoprog_s32k144.elf create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/Debug/demoprog_s32k144.srec create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/Prog_Debug.launch create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/S32K144_64_flash.ld create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/boot.c create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/boot.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/header.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/led.c create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/led.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/S32K144.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/S32K144_features.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/devassert.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/device_registers.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/s32_core_cm4.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/system_S32K144.c create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/system_S32K144.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/main.c create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/prog.dox create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/startup/startup.c create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/startup/startup.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/startup/startup_S32K144.S create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/timer.c create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/timer.h create mode 100644 Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/demo.dox create mode 100644 Target/Source/ARMCM4_S32K14/GCC/cpu_comp.c create mode 100644 Target/Source/ARMCM4_S32K14/can.c create mode 100644 Target/Source/ARMCM4_S32K14/cpu.c create mode 100644 Target/Source/ARMCM4_S32K14/flash.c create mode 100644 Target/Source/ARMCM4_S32K14/flash.h create mode 100644 Target/Source/ARMCM4_S32K14/nvm.c create mode 100644 Target/Source/ARMCM4_S32K14/rs232.c create mode 100644 Target/Source/ARMCM4_S32K14/target.dox create mode 100644 Target/Source/ARMCM4_S32K14/timer.c create mode 100644 Target/Source/ARMCM4_S32K14/types.h diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.cproject b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.cproject new file mode 100644 index 00000000..c18025e4 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.cproject @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.project b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.project new file mode 100644 index 00000000..a9a05947 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_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_ROOT + + + + + 1583960353573 + core + 9 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-false-false-ARMCM4_S32K14 + + + + 1583960371701 + core/ARMCM4_S32K14 + 9 + + org.eclipse.ui.ide.multiFilter + 1.0-name-matches-false-false-GCC + + + + + + OPENBLT_ROOT + $%7BPARENT-3-PROJECT_LOC%7D/Source + + + diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.settings/com.nxp.s32ds.cle.runtime.component.prefs b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.settings/com.nxp.s32ds.cle.runtime.component.prefs new file mode 100644 index 00000000..b5c8b16a --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_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=CortexM4F +com.nxp.s32ds.cle.runtime.hardware.registry.device.id=S32K144 +com.nxp.s32ds.cle.runtime.hardware.registry.deviceCore.id=S32K144_M4F +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/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.settings/com.processorexpert.core.ide.newprojectwizard.prefs b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.settings/com.processorexpert.core.ide.newprojectwizard.prefs new file mode 100644 index 00000000..87ca305f --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_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/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.settings/language.settings.xml b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.settings/language.settings.xml new file mode 100644 index 00000000..33841ed7 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.settings/language.settings.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.settings/org.eclipse.cdt.codan.core.prefs b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 00000000..98b63502 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_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/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.settings/org.eclipse.cdt.core.prefs b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 00000000..747ae82e --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_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.1114796322/PATH/delimiter=; +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.1114796322/PATH/operation=prepend +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.1114796322/PATH/value= +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.1114796322/append=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.1114796322/appendContributed=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.305184792/PATH/delimiter=; +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.305184792/PATH/operation=prepend +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.305184792/PATH/value= +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.305184792/append=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.305184792/appendContributed=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.1815311679/PATH/delimiter=; +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.1815311679/PATH/operation=prepend +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.1815311679/PATH/value= +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.1815311679/append=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.1815311679/appendContributed=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.503025150/PATH/delimiter=; +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.503025150/PATH/operation=prepend +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.503025150/PATH/value= +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.503025150/append=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.503025150/appendContributed=true diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/Boot_Debug.launch b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/Boot_Debug.launch new file mode 100644 index 00000000..ba93738b --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/Boot_Debug.launch @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 new file mode 100644 index 0000000000000000000000000000000000000000..c57a777aa4d34f5a7329dd423dcb408983c5881f GIT binary patch literal 643712 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 z

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 z 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 literal 0 HcmV?d00001 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 new file mode 100644 index 00000000..35deb67d --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/Debug/openblt_s32k144.srec @@ -0,0 +1,462 @@ +S01700006F70656E626C745F7333326B3134342E73726563DE +S11300000070002029050000910500009105000002 +S1130010910500009105000091050000000000001A +S11300200000000000000000000000009105000036 +S113003091050000000000009105000091050000FA +S11300409105000091050000910500009105000054 +S11300509105000091050000910500009105000044 +S11300609105000091050000910500009105000034 +S11300709105000091050000910500009105000024 +S11300809105000091050000910500009105000014 +S11300909105000091050000910500009105000004 +S11300A091050000910500009105000091050000F4 +S11300B091050000910500009105000091050000E4 +S11300C091050000910500009105000091050000D4 +S11300D091050000910500009105000091050000C4 +S11300E091050000910500009105000091050000B4 +S11300F091050000910500009105000091050000A4 +S11301009105000091050000910500009105000093 +S11301109105000091050000910500009105000083 +S11301209105000091050000910500009105000073 +S11301309105000091050000910500009105000063 +S11301409105000091050000910500009105000053 +S11301509105000091050000910500009105000043 +S11301609105000091050000910500009105000033 +S11301709105000091050000910500009105000023 +S11301809105000091050000910500009105000013 +S11301909105000091050000910500009105000003 +S11301A091050000910500009105000091050000F3 +S11301B091050000910500009105000091050000E3 +S11301C091050000910500009105000091050000D3 +S11301D091050000910500009105000091050000C3 +S11301E091050000910500009105000091050000B3 +S11301F091050000910500009105000091050000A3 +S11302009105000091050000910500009105000092 +S11302109105000091050000910500009105000082 +S11302209105000091050000910500009105000072 +S11302309105000091050000910500009105000062 +S11302409105000091050000910500009105000052 +S11302509105000091050000910500009105000042 +S11302609105000091050000910500009105000032 +S11302709105000091050000910500009105000022 +S11302809105000091050000910500009105000012 +S11302909105000091050000910500009105000002 +S11302A091050000910500009105000091050000F2 +S11302B091050000910500009105000091050000E2 +S11302C091050000910500009105000091050000D2 +S11302D091050000910500009105000091050000C2 +S11302E091050000910500009105000091050000B2 +S11302F091050000910500009105000091050000A2 +S11303009105000091050000910500009105000091 +S11303109105000091050000910500009105000081 +S11303209105000091050000910500009105000071 +S11303309105000091050000910500009105000061 +S11303409105000091050000910500009105000051 +S11303509105000091050000910500009105000041 +S11303609105000091050000910500009105000031 +S11303709105000091050000910500009105000021 +S11303809105000091050000910500009105000011 +S11303909105000091050000910500009105000001 +S11303A091050000910500009105000091050000F1 +S11303B091050000910500009105000091050000E1 +S11303C091050000910500009105000091050000D1 +S11303D091050000910500009105000091050000C1 +S11303E091050000910500009105000091050000B1 +S11303F0910500009105000091050000FFFFFFFF3B +S1130400FFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFF79 +S1130410044B05481B1A062B02D9044B03B1184799 +S1130420704700BF6F84FF1F6C84FF1F0000000033 +S113043005490648091A891001EBD171491002D007 +S1130440034B03B1184770476C84FF1F6C84FF1F74 +S11304500000000010B5064C237843B9FFF7D8FF1D +S1130460044B13B10448AFF300800123237010BD83 +S11304700000002000000000DC1B000008B5084B51 +S11304801BB108490848AFF300800848036813B952 +S1130490BDE80840CCE7064B002BF9D09847F7E7B6 +S11304A00000000004000020DC1B00006884FF1F23 +S11304B000000000154B002B08BF134B9D46A3F50D +S11304C0803A00218B460F461348144A121A01F051 +S11304D08FFA0F4B002B00D098470E4B002B00D007 +S11304E098470020002104000D000D48002802D088 +S11304F00C48AFF3008001F057FA2000290000F007 +S1130500ADF801F03DFA00BF0000080000700020C3 +S1130510000000000000000000000020140900207A +S1130520000000000000000072B64FF000014FF020 +S113053000024FF000034FF000044FF000054FF0AD +S113054000064FF00007B846B946BA46BB46BC465B +S11305500A490B4A521A013A05DD002004230860B7 +S11305601944043AFBDA0748854607488047074898 +S1130570804762B6FFF79EFFFEE700000080FF1F82 +S11305800070002000700020ED170000A918000082 +S1130590FFF7FEBF08B5054B1B6913F4805F01D05C +S11305A0002008BD00F052F8012008BD80F00F4083 +S11305B008B5642000F006F808BD08B500F01AF884 +S11305C008BD0000084A136843F480731360074BA6 +S11305D05A6942F001025A615A6842F001025A60B3 +S11305E0034B1880704700BF00C00440C0F00F40A8 +S11305F01C00002008B500F05DFE104B1B689842FB +S113060011D30F4B1B787BB901220D4B1A700D4A85 +S1130610936843F00103936000F04CFE0A4B1B887F +S11306201844064B186008BD0022054B1A70054A91 +S1130630536843F001035360EEE700BF200000203D +S11306401E000020C0F00F401C000020024A536826 +S113065043F0010353607047C0F00F4008B5464BA8 +S113066040F20112C3F804212422C3F80821D3F86C +S1130670002112F4000FFAD101223F4BC3F80021EC +S1130680D3F8002112F0807FFAD03B4BD3F8002638 +S113069012F4000FFAD1384BD3F8002622F00102ED +S11306A0C3F80026D3F8042642F4407242F0020252 +S11306B0C3F804264FF4C012C3F80826D3F8002662 +S11306C012F4000FFAD12C4AD2F8003643F0010399 +S11306D0C2F800361346D3F8002612F0807FFAD011 +S11306E0254B40F20112C3F80422244A5A611A46E7 +S11306F01369C3F30363062BFAD101F095F8204B79 +S1130700D3F82C2142F08042C3F82C21D3F83021B5 +S113071042F08042C3F83021D3F8342142F08042C1 +S1130720C3F83421A3F5D0331A6B42F480721A63F0 +S11307301A6B22F002021A63124A516921F48051A1 +S11307405161916921F4805191619A6942F4007276 +S11307509A61DA6942F40072DA6103F500531A69A6 +S113076042F4A0621A615A6942F4A0625A6100F02C +S1130770EBFD00F0F7FDFCE7004006401200010627 +S11307800050064080F00F4072B6704762B6704762 +S113079038B50D4B1B68002B00DB38BD0A4A1368C3 +S11307A023F00043136000F085FD00F1FA05064CC8 +S11307B0236813F4801FF0D000F061FE00F07AFD8E +S11307C08542F5D2E9E700BF0040024038B5114B3D +S11307D01B68002B18DB0F4B1A6842F080421A602A +S11307E01A6842F080521A6000F064FD00F1FA05C4 +S11307F0084C236813F0807F05D100F040FE00F020 +S113080059FD8542F5D238BDDE21034800F05AFD7A +S1130810E1E700BF00400240041A000070B582B056 +S1130820914AD2F8903043F08043C2F89030FFF7F9 +S1130830AFFFFFF7CBFF8D4B1B68002B13DB8B4AFD +S1130840136843F00043136000F034FD00F1FA052F +S1130850864C236813F4801F05D100F010FE00F0CD +S113086029FD8542F5D2814A536823F4005353602D +S1130870FFF78EFFFFF7AAFF00238DF80030012356 +S11308808DF8013002238DF8023004238DF80330F3 +S113089008238DF8043010238DF8053020238DF8BB +S11308A0063040238DF80730714BD3F80431C3F37D +S11308B002232BB94FF480726D4BC3F8042101233A +S11308C002AA134413F8083C4FF4FA50B0FBF3F0B7 +S11308D000221446674E4FF4FA7502E00132122AE0 +S11308E01CD016F8223005FB03F3B0FBF3F103FB35 +S11308F011010029F2D1B0FBF3F39CB2631E9BB249 +S1130900FF2BEBD85B4B03EB820250789178D378C2 +S11309100CE0FE21584800F0D5FC7CE040F2871141 +S1130920554800F0CFFC002108460B464F4A556855 +S113093025F087052D042D0C55605568013C45EACA +S1130940046454605468013800F007002043506088 +S11309505468481EC00400F460102043506050687E +S1130960013B1B0403F4E023034353605068042950 +S113097028BF04214B1E9B0503F44003034353602B +S1130980536843F08003536000231046194603F173 +S1130990200240F822100133802BF8D10023334881 +S11309A0194603F5087240F822100133202BF8D1C0 +S11309B02E4B1A6822F07F0242F01F021A601A6856 +S11309C042F400321A601A6842F480321A601A68DB +S11309D022F000521A606FF02042C3F8A4284FF0AE +S11309E08062C3F81021254AC3F8142100229A62B8 +S11309F04FF0FF321A63224A1A621A6822F4000284 +S1130A001A605A6822F4805222F008025A601B6865 +S1130A10002BFFF67EAF154B1A6822F080421A6055 +S1130A201A6822F080521A6000F044FC00F1FA05C2 +S1130A300E4C236813F0807F05D000F020FD00F0F9 +S1130A4039FC8542F5D200F035FC00F1FA05074C7B +S1130A50236813F0006F05D000F011FD00F02AFCAC +S1130A608542F5D202B070BD0050064000400240FD +S1130A7000400640481A0000041A000000009C19B7 +S1130A8006003B0038B5264B4FF480721A63D3F846 +S1130A90002122F06042C3F80021D3F8002122F49F +S1130AA04012C3F80021D3F8002142F48002C3F8B5 +S1130AB00021D3F8002122F47022C3F80021D3F8D6 +S1130AC000410A0402F470222243C3F8002161B1F8 +S1130AD001380023134D10F8014F83F00302D2B202 +S1130AE054550133DAB29142F5D80D4B0E4AC3F88E +S1130AF00421D3F8002142F04062C3F8002100F041 +S1130B00D9FB00F13205064C236B13F4807F05D129 +S1130B1000F0B5FC00F0CEFB8542F5D238BD00BF35 +S1130B2000400240084102400000841F124B1B6B2E +S1130B3013F4007F1DD010B40F4BD3F81031C3F35E +S1130B4003430B7053B100230C4C83F00302125D7A +S1130B50C2540133DBB20A789A42F6D8064B4FF4FA +S1130B6000721A639A68064B1A6001205DF8044B00 +S1130B7070470020704700BF004002401841024007 +S1130B802400002008B5FFF7FFFD08BD08B500F0FC +S1130B905AFA00B908BDFFF7FDFC0028FAD000F0AE +S1130BA025FC00F073FB00F052FA20F0604020F0C6 +S1130BB07F004FF0E023C3F8080DFFF7E7FD00F0D6 +S1130BC046FA43689847E5E772B170B50D46531E7F +S1130BD09BB2441E1E1815F8013B04F8013F00F0B7 +S1130BE04EFCB442F7D170BD70470000F8B506461C +S1130BF00A4D002403E001340C35152C0AD0E7B269 +S1130C0000F03DFC2B68B342F5D86A6813449E4259 +S1130C10F1D200E0FF273846F8BD00BF901A00006B +S1130C202DE9F04F83B081460068FFF7DFFFFF280E +S1130C3005D100230193019803B0BDE8F08FCA46A3 +S1130C4009F5806B4E4601230193284D07E00023EC +S1130C50019301E00023019308365E45EBD0A6EB37 +S1130C600A08D9F8007008EB070400F008FC2B7898 +S1130C7013F0800F33D04FF070032B704FF0070345 +S1130C80EB71C4F30743AB71C4F307236B71E3B295 +S1130C902B7133792B7273796B72B379AB72F379ED +S1130CA0EB72337A2B73737A6B73B37AAB73F37A15 +S1130CB0EB7300F0A1FF2B7813F0710F12D118F829 +S1130CC0072033799A42C2D1331DE01D14F8011F65 +S1130CD013F8012F9142BDD18442F7D1BCE7002320 +S1130CE00193A8E700230193A5E700BF0000024099 +S1130CF038B50D46114B98420BD00446B1F5005F50 +S1130D0009D0FFF78DFF10B134B9204638BD00205B +S1130D1038BD0B4C00E0094CC5F3090363B92368E3 +S1130D209D4207D0204640F8045B4FF48062294678 +S1130D30FFF74AFF204638BD002038BD2C040020B0 +S1130D40280000202DE9F04106460C4617461D46B2 +S1130D5021F47F7828F003080368B3F1FF3F0BD038 +S1130D603368984510D041463046FFF7C1FF064628 +S1130D7050B90020BDE8F08140F8048B4FF4806244 +S1130D804146FFF721FFEBE704343368E41A3444A7 +S1130D9008F5806805E017F8013B04F8013B013DC4 +S1130DA00ED000F06CFB331DE31AB3F5806FF2D361 +S1130DB041463046FFF79CFF064620B1041DEAE792 +S1130DC00120BDE8F0810020BDE8F0814FF0FF3341 +S1130DD0024A1360024A1360704700BF28000020D3 +S1130DE02C04002070B54B1EC0F5FF2404F2FF74E0 +S1130DF0A34201D9002070BD16460D460446FFF7F4 +S1130E00F5FEFF28F6D0601E2844FFF7EFFEFF280A +S1130E10F0D024F47F7323F00303B3F5005F06D00E +S1130E202B46324621460548FFF78CFF70BD2B4602 +S1130E30324621460248FFF785FF70BD2800002096 +S1130E402C0400204A1EC0F5FF2303F2FF739A42CC +S1130E5001D9002070472DE9F0470D460446FFF7FD +S1130E60C5FE0646601E2844FFF7C0FEFF2E66D06E +S1130E70FF2864D0864202D90020BDE8F0871428F8 +S1130E804ED8324A06EB460902EB8909711C831BD2 +S1130E9051FA83F303EB430302EB830A2C4C4FF028 +S1130EA0700803E009F10C09CA4536D000F0E7FAEE +S1130EB0D9F80050D9F80430B5F1FF3F33D0ABB3C3 +S1130EC0C5F30B02AABBC3F30B02AABBC3F30733DC +S1130ED0002BE7D0013BDBB205F5805606EB033669 +S1130EE0092700F0CCFA237813F0800F2AD084F875 +S1130EF00080E771C5F30743A371C5F3072363714A +S1130F00EBB2237100F078FE237813F0710F19D13E +S1130F1005F58055AE42E4D1C4E70120BDE8F08771 +S1130F200020BDE8F0870020BDE8F0870020BDE880 +S1130F30F0870020BDE8F0870020BDE8F08700209E +S1130F40BDE8F0870020BDE8F08700BF901A0000DC +S1130F5000000240114B1B68B3F1FF3F1BD000B5EA +S1130F6083B00E4A536891680B44D1680B441169ED +S1130F700B4451690B4491690B44D26913445B429D +S1130F8002AA42F8043D042142F2F830FFF72AFF96 +S1130F9003B05DF804FB0120704700BF2C0400205F +S1130FA04FF400531B6842F204021268134442F2E5 +S1130FB008021268134442F20C021268134442F20B +S1130FC010021268134442F214021268134442F2EB +S1130FD018021268134442F2F8321268D3420CBF6A +S1130FE0012000207047000008B50D4B1B68B3F1C9 +S1130FF0FF3F06D00A48FFF713FE034608B9184618 +S113100008BD084B1B68B3F1FF3F06D00548FFF746 +S113101007FE031C18BF0123F1E70123EFE700BF1C +S11310202C040020280000204FF40050704708B51D +S1131030FFF7CCFE08BD08B5FFF7D4FE08BD08B520 +S1131040FFF700FF08BD08B5FFF7AAFF08BD08B504 +S1131050FFF7EAFF08BD08B5FFF77CFF034608B9B0 +S1131060184608BDFFF7C0FF0346F9E738B5094B3A +S1131070D86100F01FF900F10A05064C636913F406 +S1131080000F05D100F0FBF900F014F98542F5D208 +S113109038BD00BF00B0064082B000238DF8003098 +S11310A001238DF8013002238DF8023004238DF8DA +S11310B0033008238DF8043010238DF805302023E5 +S11310C08DF8063040238DF80730254BD3F8AC213A +S11310D022F08042C3F8AC21D3F8AC2142F0844220 +S11310E0C3F8AC21A3F58053D3F80422C2F302223F +S11310F03AB91A46D3F8043243F48073C2F804327E +S11311000122184BD3F8081201F001011648174BBD +S1131110002908BF034602A90A4412F8082CB3FBAD +S1131120F2F3134AA2FB0323DB0B0733C3F3CC0311 +S113113043F0E0630F4A13610F4B53610023936143 +S1131140136253624FF470339362936A43F08803DB +S113115093620123D3624FF44023936102B070473A +S1131160005006400040064080841E0000127A00B1 +S1131170C5B3A29100B0064000C01FC070B50646BA +S11311800D46402911D82846FFF770FFADB25DB176 +S1131190741E013D16FA85F500F071F914F8010F7B +S11311A0FFF764FFAC42F7D170BDC821014800F0DD +S11311B089F8E8E78C1B000070B5254B1C78C4B98E +S11311C0244B5B6913F4001F27D0224BDB69DBB28D +S11311D0214A1370013BDBB23F2B1ED800F06AF8A2 +S11311E01E4B186000221E4B1A700122184B1A70F5 +S11311F013E00D46174B5B6913F4001F1AD018490E +S11312000A78144BDE69144B9C1866700132D2B212 +S11312100A701B78934202D00024204670BD114905 +S1131220FFF7D2FC00220A4B1A700D4B1B782B706F +S11312300124F2E700F03EF8084B1B68643398423F +S113124003D90024024B1C70E7E70024E5E700BF44 +S11312507108002000B00640300800207408002007 +S11312607208002031080020054B00221A6005494D +S113127059609A6005211960034B1A60704700BFDA +S113128010E000E07F380100780800200022014BC4 +S11312901A60704710E000E0044B1B6813F4803FB1 +S11312A003D0034A136801331360704710E000E071 +S11312B07808002008B5FFF7EFFF014B186808BD58 +S11312C07808002008B500F0DAF8FCE708B500F06B +S11312D0CBF8012803D00B4B1B78012B00D008BDA1 +S11312E0FFF7E8FF084B1B68084A1268134403F52C +S11312F0FA739842F3D30022024B1A70FFF746FCAC +S1131300EDE700BF800800207C080020840800204E +S113131008B5054B1B78012B00D008BDFFF7CAFFA9 +S1131320024B1860F9E700BF800800208408002001 +S113133008B50122034B1A70FFF7EAFFFFF7C6FF57 +S113134008BD00BF8008002008B5FFF71BFC00F0B3 +S113135092F8FFF789FFFFF76AFE00F00DF8FFF738 +S1131360E7FF08BD08B500F08AF8FFF795FF00F025 +S113137013F8FFF7ABFF08BD10B500F08FF8FFF7C7 +S11313804DFA044C01232370FFF786FE00232370DB +S113139010BD00BF0084FF1F00B583B00DF107012D +S11313A01048FFF7C3FB012809D00DF107010D48D0 +S11313B0FFF702FF01280BD003B05DF804FB012204 +S11313C0094B1A709DF80710064800F085F8ECE701 +S11313D00022054B1A709DF80710024800F07CF8B3 +S11313E0EAE700BF880800200084FF1F7047000060 +S11313F038B504460D46094B1B78012B05D0074B25 +S11314001B7833B100F060F838BDC9B2FFF73AFB7E +S1131410F5E7E9B22046FFF7B1FEF3E70084FF1FCA +S1131420074B1B78022B06D0032B06D0012B0CBFD5 +S1131430082040207047002070470020704700BFFC +S11314400084FF1F074B1B78022B06D0032B06D00A +S1131450012B0CBF0820402070470020704700205B +S1131460704700BF0084FF1F08B500F025F8003066 +S113147018BF012008BD08B5FFF79AF808BD08B5E4 +S1131480FFF79BF808BD0000034BFE22DA701871C9 +S11314900222A3F844207047C8080020054B00220C +S11314A01A709A6483F84320A3F844209A705A70FF +S11314B0704700BFC8080020024B1878003018BFDE +S11314C001207047C80800200022024B83F8432003 +S11314D0704700BFC808002070B50378FF2B05D003 +S11314E00446AC4A1278012A27D070BDA94C0023C7 +S11314F0637001252570FF22E2701022227163714E +S1131500FFF78EFFA071FFF79DFFE071FFF79AFFD1 +S1131510000A20726572A5720823A4F84430FFF70C +S113152086FD9C4B93F84330012B00F05981994B75 +S1131530B3F944100029D8DD83E0C93B352B00F210 +S11315404B81DFE813F0D10049014901450149010C +S113155049013C01EC002B011701490149014901F2 +S11315604901490149014901490149014901490127 +S11315704901490149014901490149014901490117 +S11315804901490149014901490149014901490107 +S113159049014901490149014901870051003600C7 +S11315A06D00490149014901A5004901B500B9008F +S11315B0C7004578FFF734FF0138854210DC754DCC +S11315C06278A96C281DFFF7FFFAFF23EB7062789D +S11315D0AB6C1344AB6463780133A5F84430A0E7E3 +S11315E02220FFF751FF9CE74578FFF719FF0138E8 +S11315F0854211DC6168674DA9646278281DFFF794 +S1131600E3FAFF23EB706278AB6C1344AB6463784A +S11316100133A5F8443084E72220FFF735FF80E743 +S11316205C4BFF22DA7042689A640122A3F84420DA +S1131630584B93F84330012B00F0D280554BB3F94B +S113164044105448012380F8433089B20330FFF733 +S1131650CFFE70BD4F4BFF22DA709D6C4668AEB171 +S11316602E44002415F8013B1C44E4B2FFF707FFA5 +S1131670B542F7D1474BC3F8074001221A71002243 +S11316805A719A710822A3F84420D1E70024F1E7A3 +S1131690404BFF22DA70404A9A6400221A715A7150 +S11316A09A710722C3F807200822A3F84420BFE751 +S11316B00020FFF7E9FE34E7364BFF22DA70002200 +S11316C01A71597859719A71DA711A720622A3F84B +S11316D04420ADE72F4B00221A705A70FF22DA70B3 +S11316E00122A3F84420A3E72A4B9D6CFFF798FE40 +S11316F0621C411E2846FFF79EFC60B1254CFF2367 +S1131700E370FFF78DFE0138A36C0344A364012347 +S1131710A4F844308CE73120FFF7B6FE01E74578A2 +S1131720FFF77EFE0238854210DC1A4BFF22DA7086 +S11317300122A3F84420617861B9FFF78CFC0028EA +S11317407FF4EFAE3120FFF79FFEEAE62220FFF799 +S11317509BFEE6E6A21C0F4B986CFFF76CFC28B1CD +S11317600C4A6178936C0B449364DAE63120FFF7FA +S11317708BFED6E6074CFF23E370002525716571C7 +S1131780FFF74EFEA071E571257265720723A4F878 +S113179044304DE7C8080020D01B00004168124BBC +S11317A0986CFFF74CFC30B10F4BFF22DA7001222A +S11317B0A3F844203CE73120FFF766FEB1E6FFF7CB +S11317C0E5F9094BFF22DA700122A3F844202FE740 +S11317D03120FFF759FEA4E62020FFF755FEA0E6CE +S11317E01020FFF751FEA2E6C80800204FF0E023C6 +S11317F0D3F8882D42F47002C3F8882DD3F8342F1F +S113180022F08042C3F8342F054B064A5A605A68C6 +S113181042F220121A604FF6FF729A60704700BFBE +S11318200020054020C528D91B4B1A691B69C3F346 +S11318300363013B052B2ED8DFE803F025030D2DB0 +S11318402D12154BD3F8083203F00103002B134972 +S113185018BF0B4618E0104BD3F80833104B13E0B5 +S11318600D4BD3F80816D3F80836C3F3044303F139 +S113187010000A4B03FB00F3C1F3022101314900BC +S1131880B3FBF1F300E0054BC2F303420132B3FBB7 +S1131890F2F3044A136070470040064000127A00D5 +S11318A0006CDC020484FF1F264B274A9A4208D0AE +S11318B013462448254A13F8011B02F8011B9842D9 +S11318C0F9D1234B234A9A4208D013462048224A8E +S11318D013F8011B02F8011B8342F9D11F4B204A64 +S11318E09A4206D0134600211C4A03F8011B934276 +S11318F0FBD11C4B1C4A9A4208D0134619481B4A78 +S113190013F8011B02F8011B8342F9D1184B194A41 +S11319109A4212D010B4184CA40808D019460023D7 +S113192051F8040B42F8040B0133A342F8D1134BD2 +S1131930104A1A605DF8044B7047104B0C4A1A6049 +S1131940704700BF7C1C0000101C00000084FF1FB7 +S1131950941C00007C1C00006C84FF1F14090020F0 +S113196000000020941C0000941C000000000020D3 +S1131970000000000080FF1F0004000008ED00E0EC +S113198008B5074B044613B10021AFF30080054BA3 +S11319901868836A03B19847204600F031F800BF05 +S11319A000000000D81B000070B50D4E0D4CA41BA8 +S11319B0A4100025A54209D10B4E0C4C00F00EF9E1 +S11319C0A41BA4100025A54205D170BD56F82530EE +S11319D098470135EEE756F8253098470135F2E788 +S11319E0081C0000081C0000081C00000C1C00005F +S11319F002440346934200D1704703F8011BF9E700 +S1131A00FEE70000433A2F576F726B2F736F6674B3 +S1131A10776172652F4F70656E424C545F53333259 +S1131A204B31342F5461726765742F536F75726331 +S1131A30652F41524D434D345F5333324B31342F74 +S1131A4063616E2E630000000803020209030302AF +S1131A500A0303030B0403030C0404030D0504032A +S1131A600E0504040F0604041006050411070504FA +S1131A7012070505130805051408060515080705CA +S1131A80160807061708080618080807190808089A +S1131A9000200000001000000200000000300000E0 +S1131AA000100000030000000040000000100000CF +S1131AB004000000005000000010000005000000B9 +S1131AC0006000000010000006000000007000002C +S1131AD000100000070000000080000000800000EB +S1131AE00800000000000100008000000900000060 +S1131AF000800100008000000A00000000000200D5 +S1131B00008000000B000000008002000080000044 +S1131B100C00000000000300008000000D00000025 +S1131B2000800300008000000E000000000004009C +S1131B30008000000F00000000800400008000000E +S1131B4010000000000005000080000011000000EB +S1131B500080050000800000120000000000060064 +S1131B6000800000130000000080060000800000D8 +S1131B7014000000000007000080000015000000B1 +S1131B80008007000080000016000000433A2F5731 +S1131B906F726B2F736F6674776172652F4F706508 +S1131BA06E424C545F5333324B31342F546172675D +S1131BB065742F536F757263652F41524D434D34D5 +S1131BC05F5333324B31342F72733233322E63000E +S1131BD04F70656E424C54000884FF1FF8B500BF77 +S1131BE0F8BC08BC9E467047F8B500BFF8BC08BCFA +S1131BF09E467047000000005FF800F06D84FF1FF0 +S10B1C00B4E8FF7F01000000BD +S1071C087D04000053 +S1071C0C5504000077 +S1131C1004000000006CDC02000000000000000072 +S1131C2000000000000000000000000000000000B0 +S1131C3000000000000000000000000000000000A0 +S1131C400000000000000000000000000000000090 +S1131C500000000000000000000000000000000080 +S1131C600000000000000000000000000000000070 +S10F1C7000000000000000000000000064 +S1131C7C044A137843F080031370137813F0800F25 +S10B1C8CFBD070470000024088 +S9030529CE diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/S32K144_64_flash.ld b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/S32K144_64_flash.ld new file mode 100644 index 00000000..bb9663cf --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/S32K144_64_flash.ld @@ -0,0 +1,280 @@ +/* +** ################################################################### +** Processor: S32K144 with 64 KB SRAM +** Compiler: GNU C Compiler +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright (c) 2015-2016 Freescale Semiconductor, Inc. +** Copyright 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.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__ : 0x00000400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x00000400; + +/* 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 : 0x0400; + +/* Specify the memory areas */ +MEMORY +{ + /* Flash */ + m_interrupts (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000400 + m_flash_config (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000010 + m_text (RX) : ORIGIN = 0x00000410, LENGTH = 0x00001BF0 + + /* SRAM_L */ + m_data (RW) : ORIGIN = 0x1FFF8000, LENGTH = 0x00008000 + + /* SRAM_U */ + m_data_2 (RW) : ORIGIN = 0x20000000, LENGTH = 0x00007000 +} + +/* 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/ARMCM4_S32K14_S32K144EVB_GCC/Boot/blt_conf.h b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/blt_conf.h new file mode 100644 index 00000000..1444313c --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/blt_conf.h @@ -0,0 +1,176 @@ +/************************************************************************************//** +* \file Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/blt_conf.h +* \brief Bootloader configuration header file. +* \ingroup Boot_ARMCM4_S32K14_S32K144EVB_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 (8000) +/** \brief Desired system speed. */ +#define BOOT_CPU_SYSTEM_SPEED_KHZ (80000) +/** \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 (1) + +/* 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 (512) +/** \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/ARMCM4_S32K14_S32K144EVB_GCC/Boot/boot.dox b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/boot.dox new file mode 100644 index 00000000..f8db0d26 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/boot.dox @@ -0,0 +1,7 @@ +/** +\defgroup Boot_ARMCM4_S32K14_S32K144EVB_GCC Bootloader +\brief Bootloader. +\ingroup ARMCM4_S32K14_S32K144EVB_GCC +*/ + + diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/hooks.c b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/hooks.c new file mode 100644 index 00000000..50e2d276 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/hooks.c @@ -0,0 +1,307 @@ +/************************************************************************************//** +* \file Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/hooks.c +* \brief Bootloader callback source file. +* \ingroup Boot_ARMCM4_S32K14_S32K144EVB_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 ((PTC->PDIR & GPIO_PDIR_PDI(1 << 12U)) != 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/ARMCM4_S32K14_S32K144EVB_GCC/Boot/led.c b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/led.c new file mode 100644 index 00000000..593e465c --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/led.c @@ -0,0 +1,108 @@ +/************************************************************************************//** +* \file Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/led.c +* \brief LED driver source file. +* \ingroup Boot_ARMCM4_S32K14_S32K144EVB_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. PD0 = GPIO, MUX = ALT1. */ + PORTD->PCR[0] |= PORT_PCR_MUX(1); + /* configure Port D pin 0 GPIO as digital output */ + PTD->PDDR |= GPIO_PDDR_PDD(0x00000001); + /* turn the LED off on Port D pin 0 */ + PTD->PSOR |= GPIO_PSOR_PTSO(0x00000001); + /* 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. */ + PTD->PCOR |= GPIO_PCOR_PTCO(0x00000001); + } + else + { + ledOn = BLT_FALSE; + /* Turn the LED off. */ + PTD->PSOR |= GPIO_PSOR_PTSO(0x00000001); + } + /* 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. */ + PTD->PSOR |= GPIO_PSOR_PTSO(0x00000001); +} /*** end of LedBlinkExit ***/ + + +/*********************************** end of led.c **************************************/ diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/led.h b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/led.h new file mode 100644 index 00000000..f12771e1 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/led.h @@ -0,0 +1,40 @@ +/************************************************************************************//** +* \file Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/led.h +* \brief LED driver header file. +* \ingroup Boot_ARMCM4_S32K14_S32K144EVB_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/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/S32K144.h b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/S32K144.h new file mode 100644 index 00000000..ae04b8bb --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/S32K144.h @@ -0,0 +1,11937 @@ +/* +** ################################################################### +** Processor: S32K144 +** Reference manual: S32K1XXRM Rev. 9, 09/2018 +** Version: rev. 4.2, 2019-02-19 +** Build: b190219 +** +** Abstract: +** Peripheral Access Layer for S32K144 +** +** 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 (2015-04-09) - Iulian Talpiga +** Initial version. +** - rev. 1.1 (2015-05-19) - Bogdan Nitu +** Updated interrupts table +** Removed SIM_CHIPCTL_DAC2CMP +** Compacted PORT_PCR registers +** Compacted PCC registers +** - rev. 1.2 (2015-06-02) - Bogdan Nitu +** Added 'U' suffix to all integer constants +** Use "" instead of <> for Platform type inclusion +** CNT register from WDOG module is RW +** - rev. 1.3 (2015-08-05) - Iulian Talpiga +** Synchronized with latest RDP +** Removed OSC32 module +** Removed reserved registers +** Incorporated bit band acces macros +** Switched to standard C99 data types +** Added 'u' to constants +** Added size defines for register arrays +** Define peripheral instance count +** - rev. 1.4 (2015-08-10) - Iulian Talpiga +** Compacted TRGMUX registers +** Defined array index offsets for PCC and TRGMUX +** Added FPU registers +** Group FTM channel registers +** Added interrupt information to peripherals +** Renamed CAN interrupts according to the reference manual +** Added author information to revisions +** - rev. 1.5 (2015-09-16) - Iulian Talpiga +** Renamed NVIC and SCB to avoid conflict +** Compacted CAN Wake-up Message buffers +** Added CAN embedded RAM +** Updated interrupts: LPIT, FTFE, LPUART,ACMP +** Corrected ADC_SC1_ADCH_WIDTH +** Compacted PDB registers +** Corrected CAN, FTM, and PDB count defines +** Guarding register acces macro against redefintion +** - rev. 1.6 (2015-09-29) - Iulian Talpiga +** Added WATER and FIFO registers to LPUART. +** - rev. 1.7 (2015-10-21) - Iulian Talpiga +** Updated ADC, AIPS, CMP, LMEM, LPTMR, PMC, PORT, RCM, RTC, SCG, SIM +** Compacted MPU and LPIT +** Added FSL_SysTick +** Updated doxygen documentation grouping +** Updated interrupts: RCM +** - rev. 1.8 (2016-01-06) - Iulian Talpiga +** Updated DMA, compacted TCD registers +** Updated SCG, removed SC2P - SC16P +** Added 8 and 16 bit access to DATA register, CRC module +** - rev. 1.9 (2016-02-15) - Iulian Talpiga +** Updated CRC, renamed DATA union +** Updated PMC, added CLKBIASDIS bitfield +** Added FSL_NVIC registers to SVD +** - rev. 2.0 (2016-04-07) - Iulian Talpiga +** Updated support for Rev2.0 silicon (0N47T) +** Updated ADC, AIPS, DMA, FlexIO, FTM, GPIO, LPI2C, LPIT, LPSPI, MCM, MPU, MSCM, PMC, RTC, RCM, PCC, RTC, SCG, SIM, TRGMUX and WDOG module +** Updated interrupts +** Added EIM and ERM modules +** Added EIM and ERM modules +** - rev. 2.1 (2016-06-10) - Iulian Talpiga +** Updated to latest RM +** Minor changes to: CAN, EIM, LPI2C, MPU, PCC, PMC, RTC, SIM and TRGMUX +** - rev. 2.2 (2016-08-02) - Iulian Talpiga +** Updated to latest RM +** Minor changes to: ADC, CAN, CRC, FTFC, LMEM, LPI2C, MCM, MSCM, PCC, RTC, SIM +** Added CSE_PRAM +** - rev. 2.3 (2016-09-09) - Iulian Talpiga +** Updated to latest RM +** Minor changes to: PCC, FSL_NVIC and FTM +** - rev. 2.4 (2016-09-28) - Iulian Talpiga +** Fix RAMn array size in FlexCAN +** Fix FCSESTAT bit order +** Added CP0CFG0, CP0CFG1,CP0CFG2 and CP0CFG3 in MSCM +** Fixed STIR register in FSL_NVIC +** Fixed SHPR3 and ACTLR registers in FSL_SCB +** - rev. 2.5 (2016-11-25) - Iulian Talpiga +** Fix FRAC bit-field in PCC module +** Removed BITBAND_ACCESS macros +** Added MISRA declarations +** Updated copyright +** Changed prefix of NVIC, SCB and SysTick to S32_ +** - rev. 2.6 (2017-01-09) - Iulian Talpiga +** Fix interrupts for CAN, LPUART, FTFC +** - rev. 2.7 (2017-02-22) - Iulian Talpiga +** Update header as per rev S32K14XRM Rev. 2, 02/2017 +** Updated modules AIPS, CAN, LPI2C, LPSPI, MCM, MPU, SCG and SIM +** - rev. 2.8 (2017-03-27) - Iulian Talpiga +** Synchronized PCC_FlexIO on S32K Family +** - rev. 3.0 (2017-08-04) - Mihai Volmer +** Update header as per rev S32K1XXRM Rev. 4, 06/2017 +** Updated modules CAN, MCM and PORTn +** - rev. 3.1 (2017-09-25) - Andrei Bolojan +** Update NVIC Size of Registers Arrays +** - rev. 4.0 (2018-02-28) - Mihai Volmer +** Updated header as per rev S32K1XXRM Rev. 6, 12/2017 +** Updated modules ERM, I2C, MSCM and SIM +** - rev. 4.1 (2018-07-19) - Dan Nastasa +** Updated the header based on S32K1XXRM Rev. 8, 06/2018. +** - rev. 4.2 (2019-02-19) - Ionut Pavel +** Updated the header based on S32K1XXRM Rev. 9, 09/2018. +** +** ################################################################### +*/ + +/*! + * @file S32K144.h + * @version 4.2 + * @date 2019-02-19 + * @brief Peripheral Access Layer for S32K144 + * + * 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(S32K144_H_) /* Check if memory map has not been already included */ +#define S32K144_H_ +#define MCU_S32K144 + +/* Check if another memory map has not been also included */ +#if (defined(MCU_ACTIVE)) + #error S32K144 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 0x0400u +/** Memory map minor version */ +#define MCU_MEM_MAP_VERSION_MINOR 0x0002u + +/* ---------------------------------------------------------------------------- + -- 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 S32K144 + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Interrupt_vector_numbers_S32K144 Interrupt vector numbers for S32K144 + * @{ + */ + +/** Interrupt Number Definitions */ +#define NUMBER_OF_INT_VECTORS 139u /**< 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-M4 SV Hard Fault Interrupt */ + MemoryManagement_IRQn = -12, /**< Cortex-M4 Memory Management Interrupt */ + BusFault_IRQn = -11, /**< Cortex-M4 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /**< Cortex-M4 Usage Fault Interrupt */ + SVCall_IRQn = -5, /**< Cortex-M4 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /**< Cortex-M4 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /**< Cortex-M4 Pend SV Interrupt */ + SysTick_IRQn = -1, /**< Cortex-M4 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 */ + DMA4_IRQn = 4u, /**< DMA channel 4 transfer complete */ + DMA5_IRQn = 5u, /**< DMA channel 5 transfer complete */ + DMA6_IRQn = 6u, /**< DMA channel 6 transfer complete */ + DMA7_IRQn = 7u, /**< DMA channel 7 transfer complete */ + DMA8_IRQn = 8u, /**< DMA channel 8 transfer complete */ + DMA9_IRQn = 9u, /**< DMA channel 9 transfer complete */ + DMA10_IRQn = 10u, /**< DMA channel 10 transfer complete */ + DMA11_IRQn = 11u, /**< DMA channel 11 transfer complete */ + DMA12_IRQn = 12u, /**< DMA channel 12 transfer complete */ + DMA13_IRQn = 13u, /**< DMA channel 13 transfer complete */ + DMA14_IRQn = 14u, /**< DMA channel 14 transfer complete */ + DMA15_IRQn = 15u, /**< DMA channel 15 transfer complete */ + DMA_Error_IRQn = 16u, /**< DMA error interrupt channels 0-15 */ + MCM_IRQn = 17u, /**< FPU sources */ + FTFC_IRQn = 18u, /**< FTFC Command complete */ + Read_Collision_IRQn = 19u, /**< FTFC Read collision */ + LVD_LVW_IRQn = 20u, /**< PMC Low voltage detect interrupt */ + FTFC_Fault_IRQn = 21u, /**< FTFC Double bit fault detect */ + WDOG_EWM_IRQn = 22u, /**< Single interrupt vector for WDOG and EWM */ + RCM_IRQn = 23u, /**< RCM Asynchronous Interrupt */ + LPI2C0_Master_IRQn = 24u, /**< LPI2C0 Master Interrupt */ + LPI2C0_Slave_IRQn = 25u, /**< LPI2C0 Slave Interrupt */ + LPSPI0_IRQn = 26u, /**< LPSPI0 Interrupt */ + LPSPI1_IRQn = 27u, /**< LPSPI1 Interrupt */ + LPSPI2_IRQn = 28u, /**< LPSPI2 Interrupt */ + LPUART0_RxTx_IRQn = 31u, /**< LPUART0 Transmit / Receive Interrupt */ + LPUART1_RxTx_IRQn = 33u, /**< LPUART1 Transmit / Receive Interrupt */ + LPUART2_RxTx_IRQn = 35u, /**< LPUART2 Transmit / Receive Interrupt */ + ADC0_IRQn = 39u, /**< ADC0 interrupt request. */ + ADC1_IRQn = 40u, /**< ADC1 interrupt request. */ + CMP0_IRQn = 41u, /**< CMP0 interrupt request */ + ERM_single_fault_IRQn = 44u, /**< ERM single bit error correction */ + ERM_double_fault_IRQn = 45u, /**< ERM double bit error non-correctable */ + RTC_IRQn = 46u, /**< RTC alarm interrupt */ + RTC_Seconds_IRQn = 47u, /**< RTC seconds interrupt */ + LPIT0_Ch0_IRQn = 48u, /**< LPIT0 channel 0 overflow interrupt */ + LPIT0_Ch1_IRQn = 49u, /**< LPIT0 channel 1 overflow interrupt */ + LPIT0_Ch2_IRQn = 50u, /**< LPIT0 channel 2 overflow interrupt */ + LPIT0_Ch3_IRQn = 51u, /**< LPIT0 channel 3 overflow interrupt */ + PDB0_IRQn = 52u, /**< PDB0 interrupt */ + SCG_IRQn = 57u, /**< SCG bus interrupt request */ + LPTMR0_IRQn = 58u, /**< LPTIMER interrupt request */ + PORTA_IRQn = 59u, /**< Port A pin detect interrupt */ + PORTB_IRQn = 60u, /**< Port B pin detect interrupt */ + PORTC_IRQn = 61u, /**< Port C pin detect interrupt */ + PORTD_IRQn = 62u, /**< Port D pin detect interrupt */ + PORTE_IRQn = 63u, /**< Port E pin detect interrupt */ + SWI_IRQn = 64u, /**< Software interrupt */ + PDB1_IRQn = 68u, /**< PDB1 interrupt */ + FLEXIO_IRQn = 69u, /**< FlexIO Interrupt */ + CAN0_ORed_IRQn = 78u, /**< CAN0 OR'ed [Bus Off OR Transmit Warning OR Receive Warning] */ + CAN0_Error_IRQn = 79u, /**< CAN0 Interrupt indicating that errors were detected on the CAN bus */ + CAN0_Wake_Up_IRQn = 80u, /**< CAN0 Interrupt asserted when Pretended Networking operation is enabled, and a valid message matches the selected filter criteria during Low Power mode */ + CAN0_ORed_0_15_MB_IRQn = 81u, /**< CAN0 OR'ed Message buffer (0-15) */ + CAN0_ORed_16_31_MB_IRQn = 82u, /**< CAN0 OR'ed Message buffer (16-31) */ + CAN1_ORed_IRQn = 85u, /**< CAN1 OR'ed [Bus Off OR Transmit Warning OR Receive Warning] */ + CAN1_Error_IRQn = 86u, /**< CAN1 Interrupt indicating that errors were detected on the CAN bus */ + CAN1_ORed_0_15_MB_IRQn = 88u, /**< CAN1 OR'ed Interrupt for Message buffer (0-15) */ + CAN2_ORed_IRQn = 92u, /**< CAN2 OR'ed [Bus Off OR Transmit Warning OR Receive Warning] */ + CAN2_Error_IRQn = 93u, /**< CAN2 Interrupt indicating that errors were detected on the CAN bus */ + CAN2_ORed_0_15_MB_IRQn = 95u, /**< CAN2 OR'ed Message buffer (0-15) */ + FTM0_Ch0_Ch1_IRQn = 99u, /**< FTM0 Channel 0 and 1 interrupt */ + FTM0_Ch2_Ch3_IRQn = 100u, /**< FTM0 Channel 2 and 3 interrupt */ + FTM0_Ch4_Ch5_IRQn = 101u, /**< FTM0 Channel 4 and 5 interrupt */ + FTM0_Ch6_Ch7_IRQn = 102u, /**< FTM0 Channel 6 and 7 interrupt */ + FTM0_Fault_IRQn = 103u, /**< FTM0 Fault interrupt */ + FTM0_Ovf_Reload_IRQn = 104u, /**< FTM0 Counter overflow and Reload interrupt */ + FTM1_Ch0_Ch1_IRQn = 105u, /**< FTM1 Channel 0 and 1 interrupt */ + FTM1_Ch2_Ch3_IRQn = 106u, /**< FTM1 Channel 2 and 3 interrupt */ + FTM1_Ch4_Ch5_IRQn = 107u, /**< FTM1 Channel 4 and 5 interrupt */ + FTM1_Ch6_Ch7_IRQn = 108u, /**< FTM1 Channel 6 and 7 interrupt */ + FTM1_Fault_IRQn = 109u, /**< FTM1 Fault interrupt */ + FTM1_Ovf_Reload_IRQn = 110u, /**< FTM1 Counter overflow and Reload interrupt */ + FTM2_Ch0_Ch1_IRQn = 111u, /**< FTM2 Channel 0 and 1 interrupt */ + FTM2_Ch2_Ch3_IRQn = 112u, /**< FTM2 Channel 2 and 3 interrupt */ + FTM2_Ch4_Ch5_IRQn = 113u, /**< FTM2 Channel 4 and 5 interrupt */ + FTM2_Ch6_Ch7_IRQn = 114u, /**< FTM2 Channel 6 and 7 interrupt */ + FTM2_Fault_IRQn = 115u, /**< FTM2 Fault interrupt */ + FTM2_Ovf_Reload_IRQn = 116u, /**< FTM2 Counter overflow and Reload interrupt */ + FTM3_Ch0_Ch1_IRQn = 117u, /**< FTM3 Channel 0 and 1 interrupt */ + FTM3_Ch2_Ch3_IRQn = 118u, /**< FTM3 Channel 2 and 3 interrupt */ + FTM3_Ch4_Ch5_IRQn = 119u, /**< FTM3 Channel 4 and 5 interrupt */ + FTM3_Ch6_Ch7_IRQn = 120u, /**< FTM3 Channel 6 and 7 interrupt */ + FTM3_Fault_IRQn = 121u, /**< FTM3 Fault interrupt */ + FTM3_Ovf_Reload_IRQn = 122u /**< FTM3 Counter overflow and Reload interrupt */ +} IRQn_Type; + +/*! + * @} + */ /* end of group Interrupt_vector_numbers_S32K144 */ + + +/* ---------------------------------------------------------------------------- + -- Device Peripheral Access Layer for S32K144 + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Peripheral_access_layer_S32K144 Device Peripheral Access Layer for S32K144 + * @{ + */ + +/* @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 (2u) + + +/* ADC - Peripheral instance base addresses */ +/** Peripheral ADC0 base address */ +#define ADC0_BASE (0x4003B000u) +/** Peripheral ADC0 base pointer */ +#define ADC0 ((ADC_Type *)ADC0_BASE) +/** Peripheral ADC1 base address */ +#define ADC1_BASE (0x40027000u) +/** Peripheral ADC1 base pointer */ +#define ADC1 ((ADC_Type *)ADC1_BASE) +/** Array initializer of ADC peripheral base addresses */ +#define ADC_BASE_ADDRS { ADC0_BASE, ADC1_BASE } +/** Array initializer of ADC peripheral base pointers */ +#define ADC_BASE_PTRS { ADC0, ADC1 } + /** 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, ADC1_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))< 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) + +/* 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, LPUART2_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 + +/* LPSPI module features */ + +/* @brief DMA instance used for LPSPI module */ +#define LPSPI_DMA_INSTANCE 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} + +/* Interrupt module features */ + +/* @brief Lowest interrupt request number. */ +#define FEATURE_INTERRUPT_IRQ_MIN (NonMaskableInt_IRQn) +/* @brief Highest interrupt request number. */ +#define FEATURE_INTERRUPT_IRQ_MAX (FTM3_Ovf_Reload_IRQn) +/**< Number of priority bits implemented in the NVIC */ +#define FEATURE_NVIC_PRIO_BITS (4U) +/* @brief Has software interrupt. */ +#define FEATURE_INTERRUPT_HAS_SOFTWARE_IRQ (0u) +/* @brief Has pending interrupt state. */ +#define FEATURE_INTERRUPT_HAS_PENDING_STATE (1u) +/* @brief Has active interrupt state. */ +#define FEATURE_INTERRUPT_HAS_ACTIVE_STATE (1u) +/* @brief Multicore support for interrupts */ +#define FEATURE_INTERRUPT_MULTICORE_SUPPORT (0u) +/* @brief Registers in which the start of interrupt vector table needs to be configured */ +#define FEATURE_INTERRUPT_INT_VECTORS {&S32_SCB->VTOR} + + +/* System Control Block module features */ + +/* @brief VECTKEY value so that AIRCR register write is not ignored. */ +#define FEATURE_SCB_VECTKEY (0x05FAU) + + +/* SMC module features */ + +/* @brief Has stop option (register bit STOPCTRL[STOPO]). */ +#define FEATURE_SMC_HAS_STOPO (1U) +/* @brief Has partial stop option (register bit STOPCTRL[PSTOPO]). */ +#define FEATURE_SMC_HAS_PSTOPO (0U) +/* @brief Has WAIT and VLPW options. */ +#define FEATURE_SMC_HAS_WAIT_VLPW (0U) +/* @brief Has high speed run mode (register bit PMPROT[AHSRUN]). */ +#define FEATURE_SMC_HAS_HIGH_SPEED_RUN_MODE (1U) +/* @brief Value of SPLL source clock in the SCG_HCCR register */ +#define FEATURE_SCG_SPLL_VALUE (6U) +/* RCM module feature */ + +/* @brief Has existence of CMU loss of clock as reset source */ +#define FEATURE_RCM_HAS_EXISTENCE_CMU_LOSS_OF_CLOCK (0) +/* @brief Has CMU loss of clock as reset source */ +#define FEATURE_RCM_HAS_CMU_LOSS_OF_CLOCK (0) +/* @brief Has sticky CMU loss of clock as reset source */ +#define FEATURE_RCM_HAS_STICKY_CMU_LOSS_OF_CLOCK (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 S32K14x). +*/ +#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 S32K14x). +*/ +#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 S32K14x). +*/ +#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 S32K14x). +*/ +#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 (4U) +/* @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 back door. */ +#define FEATURE_MPU_SLAVE_SRAM_BACKDOOR (1U) +/* @brief The MPU Slave Port Assignment for SRAM_L front door. */ +#define FEATURE_MPU_SLAVE_SRAM_L_FRONTDOOR (2U) +/* @brief The MPU Slave Port Assignment for SRAM_U front door. */ +#define FEATURE_MPU_SLAVE_SRAM_U_FRONTDOOR (3U) +/* @brief The MPU Slave Port mask. */ +#define FEATURE_MPU_SLAVE_MASK (0xF0000000U) +#define FEATURE_MPU_SLAVE_SHIFT (28u) +#define FEATURE_MPU_SLAVE_WIDTH (4u) +#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 transfer size: */ +#define FEATURE_DMA_TRANSFER_SIZE_16B +#define FEATURE_DMA_TRANSFER_SIZE_32B + +/* DMAMUX module features */ + +/* @brief DMAMUX peripheral is available in silicon. */ +#define FEATURE_DMAMUX_AVAILABLE +/* @brief Number of DMA channels. */ +#define FEATURE_DMAMUX_CHANNELS (16U) +/* @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_LPUART2_RX = 6U, + EDMA_REQ_LPUART2_TX = 7U, + 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_LPSPI2_RX = 18U, + EDMA_REQ_LPSPI2_TX = 19U, + 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_FTM2_CHANNEL_0 = 28U, + EDMA_REQ_FTM2_CHANNEL_1 = 29U, + EDMA_REQ_FTM2_CHANNEL_2 = 30U, + EDMA_REQ_FTM2_CHANNEL_3 = 31U, + EDMA_REQ_FTM2_CHANNEL_4 = 32U, + EDMA_REQ_FTM2_CHANNEL_5 = 33U, + EDMA_REQ_FTM2_CHANNEL_6 = 34U, + EDMA_REQ_FTM2_CHANNEL_7 = 35U, + EDMA_REQ_FTM0_OR_CH0_CH7 = 36U, + EDMA_REQ_FTM3_OR_CH0_CH7 = 37U, + EDMA_REQ_ADC0 = 42U, + EDMA_REQ_ADC1 = 43U, + EDMA_REQ_LPI2C0_RX = 44U, + EDMA_REQ_LPI2C0_TX = 45U, + EDMA_REQ_PDB0 = 46U, + EDMA_REQ_PDB1 = 47U, + 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_FLEXCAN1 = 55U, + EDMA_REQ_FLEXCAN2 = 56U, + EDMA_REQ_LPTMR0 = 59U, + EDMA_REQ_DMAMUX_ALWAYS_ENABLED0 = 62U, + EDMA_REQ_DMAMUX_ALWAYS_ENABLED1 = 63U +} dma_request_source_t; + +/* LPI2C module features */ + +/* @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) + +/* 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 (0U) +/*! @brief Number of interrupt vector for channels of the FTM module. */ +#define FEATURE_FTM_HAS_NUM_IRQS_CHANS (4U) + +/* EWM module features */ + +/* @brief First byte of the EWM Service key */ +#define FEATURE_EWM_KEY_FIRST_BYTE (0xB4U) +/* @brief Second byte of the EWM Service key */ +#define FEATURE_EWM_KEY_SECOND_BYTE (0x2CU) +/* @brief EWM Compare High register maximum value */ +#define FEATURE_EWM_CMPH_MAX_VALUE (0xFEU) +/* @brief EWM Compare Low register minimum value */ +#define FEATURE_EWM_CMPL_MIN_VALUE (0x00U) + +/* @brief Supports high speed run mode. */ +#define FEATURE_HAS_HIGH_SPEED_RUN_MODE (1U) +/* @brief Supports SPLL clock source. */ +#define FEATURE_HAS_SPLL_CLK (1U) + +/*! @brief Clock names. */ +typedef enum { + + /* Main clocks */ + CORE_CLK = 0u, /*!< Core clock */ + BUS_CLK = 1u, /*!< Bus clock */ + SLOW_CLK = 2u, /*!< Slow clock */ + CLKOUT_CLK = 3u, /*!< CLKOUT clock */ + + /* Other internal clocks used by peripherals. */ + SIRC_CLK = 4u, /*!< SIRC clock */ + FIRC_CLK = 5u, /*!< FIRC clock */ + SOSC_CLK = 6u, /*!< SOSC clock */ + SPLL_CLK = 7u, /*!< SPLL clock */ + RTC_CLKIN_CLK = 8u, /*!< RTC_CLKIN clock */ + SCG_CLKOUT_CLK = 9u, /*!< SCG CLK_OUT clock */ + + SIRCDIV1_CLK = 10u, /*!< SIRCDIV1 functional clock */ + SIRCDIV2_CLK = 11u, /*!< SIRCDIV2 functional clock */ + FIRCDIV1_CLK = 12u, /*!< FIRCDIV1 functional clock */ + FIRCDIV2_CLK = 13u, /*!< FIRCDIV2 functional clock */ + SOSCDIV1_CLK = 14u, /*!< SOSCDIV1 functional clock */ + SOSCDIV2_CLK = 15u, /*!< SOSCDIV2 functional clock */ + SPLLDIV1_CLK = 16u, /*!< SPLLDIV1 functional clock */ + SPLLDIV2_CLK = 17u, /*!< SPLLDIV2 functional clock */ + + SCG_END_OF_CLOCKS = 18u, /*!< End of SCG clocks */ + + /* SIM clocks */ + SIM_FTM0_CLOCKSEL = 21u, /*!< FTM0 External Clock Pin Select */ + SIM_FTM1_CLOCKSEL = 22u, /*!< FTM1 External Clock Pin Select */ + SIM_FTM2_CLOCKSEL = 23u, /*!< FTM2 External Clock Pin Select */ + SIM_FTM3_CLOCKSEL = 24u, /*!< FTM3 External Clock Pin Select */ + SIM_CLKOUTSELL = 25u, /*!< CLKOUT Select */ + SIM_RTCCLK_CLK = 26u, /*!< RTCCLK clock */ + SIM_LPO_CLK = 27u, /*!< LPO clock */ + SIM_LPO_1K_CLK = 28u, /*!< LPO 1KHz clock */ + SIM_LPO_32K_CLK = 29u, /*!< LPO 32KHz clock */ + SIM_LPO_128K_CLK = 30u, /*!< LPO 128KHz clock */ + SIM_EIM_CLK = 31u, /*!< EIM clock source */ + SIM_ERM_CLK = 32u, /*!< ERM clock source */ + SIM_DMA_CLK = 33u, /*!< DMA clock source */ + SIM_MPU_CLK = 34u, /*!< MPU clock source */ + SIM_MSCM_CLK = 35u, /*!< MSCM clock source */ + SIM_END_OF_CLOCKS = 36u, /*!< End of SIM clocks */ + + /* PCC clocks */ + CMP0_CLK = 41u, /*!< CMP0 clock source */ + CRC0_CLK = 42u, /*!< CRC0 clock source */ + DMAMUX0_CLK = 43u, /*!< DMAMUX0 clock source */ + EWM0_CLK = 44u, /*!< EWM0 clock source */ + PORTA_CLK = 45u, /*!< PORTA clock source */ + PORTB_CLK = 46u, /*!< PORTB clock source */ + PORTC_CLK = 47u, /*!< PORTC clock source */ + PORTD_CLK = 48u, /*!< PORTD clock source */ + PORTE_CLK = 49u, /*!< PORTE clock source */ + RTC0_CLK = 50u, /*!< RTC0 clock source */ + PCC_END_OF_BUS_CLOCKS = 51u, /*!< End of BUS clocks */ + FlexCAN0_CLK = 52u, /*!< FlexCAN0 clock source */ + FlexCAN1_CLK = 53u, /*!< FlexCAN1 clock source */ + FlexCAN2_CLK = 54u, /*!< FlexCAN2 clock source */ + PDB0_CLK = 55u, /*!< PDB0 clock source */ + PDB1_CLK = 56u, /*!< PDB1 clock source */ + PCC_END_OF_SYS_CLOCKS = 57u, /*!< End of SYS clocks */ + FTFC0_CLK = 58u, /*!< FTFC0 clock source */ + PCC_END_OF_SLOW_CLOCKS = 59u, /*!< End of SLOW clocks */ + FTM0_CLK = 60u, /*!< FTM0 clock source */ + FTM1_CLK = 61u, /*!< FTM1 clock source */ + FTM2_CLK = 62u, /*!< FTM2 clock source */ + FTM3_CLK = 63u, /*!< FTM3 clock source */ + PCC_END_OF_ASYNCH_DIV1_CLOCKS= 64u, /*!< End of ASYNCH DIV1 clocks */ + ADC0_CLK = 65u, /*!< ADC0 clock source */ + ADC1_CLK = 66u, /*!< ADC1 clock source */ + FLEXIO0_CLK = 67u, /*!< FLEXIO0 clock source */ + LPI2C0_CLK = 68u, /*!< LPI2C0 clock source */ + LPIT0_CLK = 69u, /*!< LPIT0 clock source */ + LPSPI0_CLK = 70u, /*!< LPSPI0 clock source */ + LPSPI1_CLK = 71u, /*!< LPSPI1 clock source */ + LPSPI2_CLK = 72u, /*!< LPSPI2 clock source */ + LPTMR0_CLK = 73u, /*!< LPTMR0 clock source */ + LPUART0_CLK = 74u, /*!< LPUART0 clock source */ + LPUART1_CLK = 75u, /*!< LPUART1 clock source */ + LPUART2_CLK = 76u, /*!< LPUART2 clock source */ + PCC_END_OF_ASYNCH_DIV2_CLOCKS= 77u, /*!< End of ASYNCH DIV2 clocks */ + PCC_END_OF_CLOCKS = 78u, /*!< End of PCC clocks */ + CLOCK_NAME_COUNT = 79u, /*!< The total number of entries */ +} clock_names_t; + +#define PCC_INVALID_INDEX 0 + + /*! @brief PCC clock name mappings + * Mappings between clock names and peripheral clock control indexes. + * If there is no peripheral clock control index for a clock name, + * then the corresponding value is PCC_INVALID_INDEX. + */ +#define PCC_CLOCK_NAME_MAPPINGS \ +{ \ +PCC_INVALID_INDEX, /*!< Core clock 0 */ \ +PCC_INVALID_INDEX, /*!< Bus clock 1 */ \ +PCC_INVALID_INDEX, /*!< Slow clock 2 */ \ +PCC_INVALID_INDEX, /*!< CLKOUT clock 3 */ \ +PCC_INVALID_INDEX, /*!< SIRC clock 4 */ \ +PCC_INVALID_INDEX, /*!< FIRC clock 5 */ \ +PCC_INVALID_INDEX, /*!< SOSC clock 6 */ \ +PCC_INVALID_INDEX, /*!< SPLL clock 7 */ \ +PCC_INVALID_INDEX, /*!< RTC_CLKIN clock 8 */ \ +PCC_INVALID_INDEX, /*!< SCG CLK_OUT clock 9 */ \ +PCC_INVALID_INDEX, /*!< SIRCDIV1 functional clock 10 */ \ +PCC_INVALID_INDEX, /*!< SIRCDIV2 functional clock 11 */ \ +PCC_INVALID_INDEX, /*!< FIRCDIV1 functional clock 12 */ \ +PCC_INVALID_INDEX, /*!< FIRCDIV2 functional clock 13 */ \ +PCC_INVALID_INDEX, /*!< SOSCDIV1 functional clock 14 */ \ +PCC_INVALID_INDEX, /*!< SOSCDIV2 functional clock 15 */ \ +PCC_INVALID_INDEX, /*!< SPLLDIV1 functional clock 16 */ \ +PCC_INVALID_INDEX, /*!< SPLLDIV2 functional clock 17 */ \ +PCC_INVALID_INDEX, /*!< End of SCG clocks 18 */ \ +PCC_INVALID_INDEX, /*!< No clock entry in clock_names_t 19 */ \ +PCC_INVALID_INDEX, /*!< No clock entry in clock_names_t 20 */ \ +PCC_INVALID_INDEX, /*!< FTM0 External Clock Pin Select 21 */ \ +PCC_INVALID_INDEX, /*!< FTM1 External Clock Pin Select 22 */ \ +PCC_INVALID_INDEX, /*!< FTM2 External Clock Pin Select 23 */ \ +PCC_INVALID_INDEX, /*!< FTM3 External Clock Pin Select 24 */ \ +PCC_INVALID_INDEX, /*!< CLKOUT Select 25 */ \ +PCC_INVALID_INDEX, /*!< CLK32K clock 26 */ \ +PCC_INVALID_INDEX, /*!< LPO clock 27 */ \ +PCC_INVALID_INDEX, /*!< LPO 1KHz clock 28 */ \ +PCC_INVALID_INDEX, /*!< LPO 32KHz clock 29 */ \ +PCC_INVALID_INDEX, /*!< LPO 128KHz clock 30 */ \ +PCC_INVALID_INDEX, /*!< EIM clock source 31 */ \ +PCC_INVALID_INDEX, /*!< ERM clock source 32 */ \ +PCC_INVALID_INDEX, /*!< DMA clock source 33 */ \ +PCC_INVALID_INDEX, /*!< MPU clock source 34 */ \ +PCC_INVALID_INDEX, /*!< MSCM clock source 35 */ \ +PCC_INVALID_INDEX, /*!< No clock entry in clock_names_t 36 */ \ +PCC_INVALID_INDEX, /*!< No clock entry in clock_names_t 37 */ \ +PCC_INVALID_INDEX, /*!< No clock entry in clock_names_t 38 */ \ +PCC_INVALID_INDEX, /*!< No clock entry in clock_names_t 39 */ \ +PCC_INVALID_INDEX, /*!< No clock entry in clock_names_t 40 */ \ +PCC_CMP0_INDEX, /*!< CMP0 clock source 41 */ \ +PCC_CRC_INDEX, /*!< CRC clock source 42 */ \ +PCC_DMAMUX_INDEX, /*!< DMAMUX clock source 43 */ \ +PCC_EWM_INDEX, /*!< EWM clock source 44 */ \ +PCC_PORTA_INDEX, /*!< PORTA clock source 45 */ \ +PCC_PORTB_INDEX, /*!< PORTB clock source 46 */ \ +PCC_PORTC_INDEX, /*!< PORTC clock source 47 */ \ +PCC_PORTD_INDEX, /*!< PORTD clock source 48 */ \ +PCC_PORTE_INDEX, /*!< PORTE clock source 49 */ \ +PCC_RTC_INDEX, /*!< RTC clock source 50 */ \ +PCC_INVALID_INDEX, /*!< End of BUS clocks 51 */ \ +PCC_FlexCAN0_INDEX, /*!< FlexCAN0 clock source 52 */ \ +PCC_FlexCAN1_INDEX, /*!< FlexCAN1 clock source 53 */ \ +PCC_FlexCAN2_INDEX, /*!< FlexCAN2 clock source 54 */ \ +PCC_PDB0_INDEX, /*!< PDB0 clock source 55 */ \ +PCC_PDB1_INDEX, /*!< PDB1 clock source 56 */ \ +PCC_INVALID_INDEX, /*!< End of SYS clocks 57 */ \ +PCC_FTFC_INDEX, /*!< FTFC clock source 58 */ \ +PCC_INVALID_INDEX, /*!< End of SLOW clocks 59 */ \ +PCC_FTM0_INDEX, /*!< FTM0 clock source 60 */ \ +PCC_FTM1_INDEX, /*!< FTM1 clock source 61 */ \ +PCC_FTM2_INDEX, /*!< FTM2 clock source 62 */ \ +PCC_FTM3_INDEX, /*!< FTM3 clock source 63 */ \ +PCC_INVALID_INDEX, /*!< End of ASYNCH DIV1 clocks 64 */ \ +PCC_ADC0_INDEX, /*!< ADC0 clock source 65 */ \ +PCC_ADC1_INDEX, /*!< ADC1 clock source 66 */ \ +PCC_FlexIO_INDEX, /*!< FLEXIO clock source 67 */ \ +PCC_LPI2C0_INDEX, /*!< LPI2C0 clock source 68 */ \ +PCC_LPIT_INDEX, /*!< LPIT clock source 69 */ \ +PCC_LPSPI0_INDEX, /*!< LPSPI0 clock source 70 */ \ +PCC_LPSPI1_INDEX, /*!< LPSPI1 clock source 71 */ \ +PCC_LPSPI2_INDEX, /*!< LPSPI2 clock source 72 */ \ +PCC_LPTMR0_INDEX, /*!< LPTMR0 clock source 73 */ \ +PCC_LPUART0_INDEX, /*!< LPUART0 clock source 74 */ \ +PCC_LPUART1_INDEX, /*!< LPUART1 clock source 75 */ \ +PCC_LPUART2_INDEX, /*!< LPUART2 clock source 76 */ \ +PCC_INVALID_INDEX, /*!< End of ASYNCH DIV2 clocks 77 */ \ +PCC_INVALID_INDEX, /*!< End of PCC clocks 78 */ \ +} + +/*! @brief Peripheral instance features + * List of features that are supported by a peripheral instance + */ +#define NO_PERIPHERAL_FEATURE (0U) /* It's not a peripheral instance, there is no peripheral feature. */ +#define HAS_CLOCK_GATING_IN_SIM (1U << 0U) /* Clock gating is implemented in SIM (it's not in PCC) */ +#define HAS_MULTIPLIER (1U << 1U) /* Multiplier is implemented in PCC */ +#define HAS_DIVIDER (1U << 2U) /* Divider is implemented in PCC */ +#define HAS_PROTOCOL_CLOCK_FROM_ASYNC1 (1U << 3U) /* Functional clock source is provided by the first asynchronous clock. */ +#define HAS_PROTOCOL_CLOCK_FROM_ASYNC2 (1U << 4U) /* Functional clock source is provided by the second asynchronous clock. */ +#define HAS_INT_CLOCK_FROM_BUS_CLOCK (1U << 5U) /* Interface clock is provided by the bus clock. */ +#define HAS_INT_CLOCK_FROM_SYS_CLOCK (1U << 6U) /* Interface clock is provided by the sys clock. */ +#define HAS_INT_CLOCK_FROM_SLOW_CLOCK (1U << 7U) /* Interface clock is provided by the slow clock. */ + +/*! @brief Peripheral features. +* List of features for each clock name. If a clock name is not +* a peripheral, no feature is supported. +*/ +#define PERIPHERAL_FEATURES \ +{ \ +(NO_PERIPHERAL_FEATURE), /*!< Core clock 0 */ \ +(NO_PERIPHERAL_FEATURE), /*!< Bus clock 1 */ \ +(NO_PERIPHERAL_FEATURE), /*!< Slow clock 2 */ \ +(NO_PERIPHERAL_FEATURE), /*!< CLKOUT clock 3 */ \ +(NO_PERIPHERAL_FEATURE), /*!< SIRC clock 4 */ \ +(NO_PERIPHERAL_FEATURE), /*!< FIRC clock 5 */ \ +(NO_PERIPHERAL_FEATURE), /*!< SOSC clock 6 */ \ +(NO_PERIPHERAL_FEATURE), /*!< SPLL clock 7 */ \ +(NO_PERIPHERAL_FEATURE), /*!< RTC_CLKIN clock 8 */ \ +(NO_PERIPHERAL_FEATURE), /*!< SCG CLK_OUT clock 9 */ \ +(NO_PERIPHERAL_FEATURE), /*!< End of SCG clocks 10 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 11 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 12 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 13 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 14 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 15 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 16 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 17 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 18 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 19 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 20 */ \ +(NO_PERIPHERAL_FEATURE), /*!< FTM0 External Clock Pin Select 21 */ \ +(NO_PERIPHERAL_FEATURE), /*!< FTM1 External Clock Pin Select 22 */ \ +(NO_PERIPHERAL_FEATURE), /*!< FTM2 External Clock Pin Select 23 */ \ +(NO_PERIPHERAL_FEATURE), /*!< FTM3 External Clock Pin Select 24 */ \ +(NO_PERIPHERAL_FEATURE), /*!< CLKOUT Select 25 */ \ +(NO_PERIPHERAL_FEATURE), /*!< CLK32K clock 26 */ \ +(NO_PERIPHERAL_FEATURE), /*!< LPO clock 27 */ \ +(NO_PERIPHERAL_FEATURE), /*!< LPO 1KHz clock 28 */ \ +(NO_PERIPHERAL_FEATURE), /*!< LPO 32KHz clock 29 */ \ +(NO_PERIPHERAL_FEATURE), /*!< LPO 128KHz clock 30 */ \ +(HAS_CLOCK_GATING_IN_SIM | HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< EIM clock source 31 */ \ +(HAS_CLOCK_GATING_IN_SIM | HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< ERM clock source 32 */ \ +(HAS_CLOCK_GATING_IN_SIM | HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< DMA clock source 33 */ \ +(HAS_CLOCK_GATING_IN_SIM | HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< MPU clock source 34 */ \ +(HAS_CLOCK_GATING_IN_SIM | HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< MSCM clock source 35 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 36 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 37 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 38 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 39 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 40 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< CMP0 clock source 41 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< CRC clock source 42 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< DMAMUX clock source 43 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< EWM clock source 44 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< PORTA clock source 45 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< PORTB clock source 46 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< PORTC clock source 47 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< PORTD clock source 48 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< PORTE clock source 49 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< RTC clock source 50 */ \ +(NO_PERIPHERAL_FEATURE), /*!< End of BUS clocks 51 */ \ +(HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< FlexCAN0 clock source 52 */ \ +(HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< FlexCAN1 clock source 53 */ \ +(HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< FlexCAN2 clock source 54 */ \ +(HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< PDB0 clock source 55 */ \ +(HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< PDB1 clock source 56 */ \ +(NO_PERIPHERAL_FEATURE), /*!< End of SYS clocks 57 */ \ +(HAS_INT_CLOCK_FROM_SLOW_CLOCK), /*!< FTFC clock source 58 */ \ +(NO_PERIPHERAL_FEATURE), /*!< End of SLOW clocks 59 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC1 | HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< FTM0 clock source 60 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC1 | HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< FTM1 clock source 61 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC1 | HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< FTM2 clock source 62 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC1 | HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< FTM3 clock source 63 */ \ +(NO_PERIPHERAL_FEATURE), /*!< End of ASYNCH DIV1 clocks 64 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< ADC0 clock source 65 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< ADC1 clock source 66 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< FLEXIO clock source 67 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< LPI2C0 clock source 68 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< LPIT clock source 69 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< LPSPI0 clock source 70 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< LPSPI1 clock source 71 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< LPSPI2 clock source 72 */ \ +(HAS_MULTIPLIER | HAS_DIVIDER | HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< LPTMR0 clock source 73 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< LPUART0 clock source 74 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< LPUART1 clock source 75 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< LPUART2 clock source 76 */ \ +(NO_PERIPHERAL_FEATURE), /*!< End of ASYNCH DIV2 clocks 77 */ \ +(NO_PERIPHERAL_FEATURE), /*!< End of PCC clocks 78 */ \ +} + +/* Time to wait for SIRC to stabilize (number of + * cycles when core runs at maximum speed - 112 MHz */ +#define SIRC_STABILIZATION_TIMEOUT 100U + +/* Time to wait for FIRC to stabilize (number of + * cycles when core runs at maximum speed - 112 MHz */ +#define FIRC_STABILIZATION_TIMEOUT 20U + +/* Time to wait for SOSC to stabilize (number of + * cycles when core runs at maximum speed - 112 MHz */ +#define SOSC_STABILIZATION_TIMEOUT 3205000U; + +/* Time to wait for SPLL to stabilize (number of + * cycles when core runs at maximum speed - 112 MHz */ +#define SPLL_STABILIZATION_TIMEOUT 1000U; + + +/*! @brief Temporary system clock source configurations. + * Each line represents the SYS(CORE), BUS and SLOW(FLASH) dividers + * for SIRC, FIRC, SOSC and SPLL clock sources. + * + * SYS_CLK BUS_CLK SLOW_CLK + * SIRC * * * + * FIRC * * * + * SOSC * * * + * SPLL * * * + */ +#define TMP_SIRC_CLK 0U +#define TMP_FIRC_CLK 1U +#define TMP_SOSC_CLK 2U +#define TMP_SPLL_CLK 3U + +#define TMP_SYS_DIV 0U +#define TMP_BUS_DIV 1U +#define TMP_SLOW_DIV 2U + +#define TMP_SYS_CLK_NO 4U +#define TMP_SYS_DIV_NO 3U + +#define TMP_SYSTEM_CLOCK_CONFIGS \ +{ /* SYS_CLK BUS_CLK SLOW_CLK */ \ +{ SCG_SYSTEM_CLOCK_DIV_BY_1, SCG_SYSTEM_CLOCK_DIV_BY_1, SCG_SYSTEM_CLOCK_DIV_BY_2}, /*!< Dividers for SIRC */ \ +{ SCG_SYSTEM_CLOCK_DIV_BY_1, SCG_SYSTEM_CLOCK_DIV_BY_2, SCG_SYSTEM_CLOCK_DIV_BY_4}, /*!< Dividers for FIRC */ \ +{ SCG_SYSTEM_CLOCK_DIV_BY_1, SCG_SYSTEM_CLOCK_DIV_BY_2, SCG_SYSTEM_CLOCK_DIV_BY_2}, /*!< Dividers for SOSC */ \ +{ SCG_SYSTEM_CLOCK_DIV_BY_3, SCG_SYSTEM_CLOCK_DIV_BY_2, SCG_SYSTEM_CLOCK_DIV_BY_2}, /*!< Dividers for SPLL */ \ +} + +/* Do not use the old names of the renamed symbols */ +/* #define DO_NOT_USE_DEPRECATED_SYMBOLS */ + +/*! START !DO_NOT_USE_DEPRECATED_SYMBOLS + * These symbols have been renamed. + * The old names (deprecated symbols) + * are defined for backward compatibility. + */ +#if !defined(DO_NOT_USE_DEPRECATED_SYMBOLS) +#define CORE_CLOCK CORE_CLK +#define BUS_CLOCK BUS_CLK +#define SLOW_CLOCK SLOW_CLK +#define CLKOUT_CLOCK CLKOUT_CLK +#define SIRC_CLOCK SIRC_CLK +#define FIRC_CLOCK FIRC_CLK +#define SOSC_CLOCK SOSC_CLK +#define SPLL_CLOCK SPLL_CLK +#define RTC_CLKIN_CLOCK RTC_CLKIN_CLK +#define SCG_CLKOUT_CLOCK SCG_CLKOUT_CLK +#define SIM_RTCCLK_CLOCK SIM_RTCCLK_CLK +#define SIM_LPO_CLOCK SIM_LPO_CLK +#define SIM_LPO_1K_CLOCK SIM_LPO_1K_CLK +#define SIM_LPO_32K_CLOCK SIM_LPO_32K_CLK +#define SIM_LPO_128K_CLOCK SIM_LPO_128K_CLK +#define SIM_EIM_CLOCK SIM_EIM_CLK +#define SIM_ERM_CLOCK SIM_ERM_CLK +#define SIM_DMA_CLOCK SIM_DMA_CLK +#define SIM_MPU_CLOCK SIM_MPU_CLK +#define SIM_MSCM_CLOCK SIM_MSCM_CLK +#define PCC_DMAMUX0_CLOCK DMAMUX0_CLK +#define PCC_CRC0_CLOCK CRC0_CLK +#define PCC_RTC0_CLOCK RTC0_CLK +#define PCC_PORTA_CLOCK PORTA_CLK +#define PCC_PORTB_CLOCK PORTB_CLK +#define PCC_PORTC_CLOCK PORTC_CLK +#define PCC_PORTD_CLOCK PORTD_CLK +#define PCC_PORTE_CLOCK PORTE_CLK +#define PCC_EWM0_CLOCK EWM0_CLK +#define PCC_CMP0_CLOCK CMP0_CLK +#define PCC_FlexCAN0_CLOCK FlexCAN0_CLK +#define PCC_FlexCAN1_CLOCK FlexCAN1_CLK +#define PCC_FlexCAN2_CLOCK FlexCAN2_CLK +#define PCC_PDB1_CLOCK PDB1_CLK +#define PCC_PDB0_CLOCK PDB0_CLK +#define PCC_FTFC0_CLOCK FTFC0_CLK +#define PCC_FTM0_CLOCK FTM0_CLK +#define PCC_FTM1_CLOCK FTM1_CLK +#define PCC_FTM2_CLOCK FTM2_CLK +#define PCC_FTM3_CLOCK FTM3_CLK +#define PCC_ADC1_CLOCK ADC1_CLK +#define PCC_LPSPI0_CLOCK LPSPI0_CLK +#define PCC_LPSPI1_CLOCK LPSPI1_CLK +#define PCC_LPSPI2_CLOCK LPSPI2_CLK +#define PCC_LPIT0_CLOCK LPIT0_CLK +#define PCC_ADC0_CLOCK ADC0_CLK +#define PCC_LPTMR0_CLOCK LPTMR0_CLK +#define PCC_FLEXIO0_CLOCK FLEXIO0_CLK +#define PCC_LPI2C0_CLOCK LPI2C0_CLK +#define PCC_LPUART0_CLOCK LPUART0_CLK +#define PCC_LPUART1_CLOCK LPUART1_CLK +#define PCC_LPUART2_CLOCK LPUART2_CLK +#endif /* !DO_NOT_USE_DEPRECATED_SYMBOLS */ + + +/* 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) + + +/* 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) + +/*! @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, ADC1_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) + +/* LPIT module features */ + +/*! @brief Number of interrupt vector for channels of the LPIT module. */ +#define FEATURE_LPIT_HAS_NUM_IRQS_CHANS (4U) +/*! @brief Clock names for LPIT. */ +#define LPIT_CLOCK_NAMES {LPIT0_CLK} + +/* 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) + +/* 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 */ + +/* LPSPI module features */ +/* @brief Initial value for state structure */ +#define FEATURE_LPSPI_STATE_STRUCTURES_NULL {NULL, NULL, NULL} +/* @brief Clock indexes for LPSPI clock */ +#define FEATURE_LPSPI_CLOCKS_NAMES {LPSPI0_CLK, LPSPI1_CLK, LPSPI2_CLK}; + +/* LPTMR module features */ + +/* @brief LPTMR pulse counter input options */ +#define FEATURE_LPTMR_HAS_INPUT_ALT1_SELECTION (1U) + +/* 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_TRGMUX_IN10 = 12U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN11 = 13U, + 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_FTM2_INIT_TRIG = 26U, + TRGMUX_TRIG_SOURCE_FTM2_EXT_TRIG = 27U, + TRGMUX_TRIG_SOURCE_FTM3_INIT_TRIG = 28U, + TRGMUX_TRIG_SOURCE_FTM3_EXT_TRIG = 29U, + TRGMUX_TRIG_SOURCE_ADC0_SC1A_COCO = 30U, + TRGMUX_TRIG_SOURCE_ADC0_SC1B_COCO = 31U, + TRGMUX_TRIG_SOURCE_ADC1_SC1A_COCO = 32U, + TRGMUX_TRIG_SOURCE_ADC1_SC1B_COCO = 33U, + TRGMUX_TRIG_SOURCE_PDB0_CH0_TRIG = 34U, + TRGMUX_TRIG_SOURCE_PDB0_PULSE_OUT = 36U, + TRGMUX_TRIG_SOURCE_PDB1_CH0_TRIG = 37U, + TRGMUX_TRIG_SOURCE_PDB1_PULSE_OUT = 39U, + 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_TRGMUX_OUT6 = 10U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT7 = 11U, + 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_ADC1_ADHWT_TLA0 = 16U, + TRGMUX_TARGET_MODULE_ADC1_ADHWT_TLA1 = 17U, + TRGMUX_TARGET_MODULE_ADC1_ADHWT_TLA2 = 18U, + TRGMUX_TARGET_MODULE_ADC1_ADHWT_TLA3 = 19U, + 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_FTM2_HWTRIG0 = 48U, + TRGMUX_TARGET_MODULE_FTM2_FAULT0 = 49U, + TRGMUX_TARGET_MODULE_FTM2_FAULT1 = 50U, + TRGMUX_TARGET_MODULE_FTM2_FAULT2 = 51U, + TRGMUX_TARGET_MODULE_FTM3_HWTRIG0 = 52U, + TRGMUX_TARGET_MODULE_FTM3_FAULT0 = 53U, + TRGMUX_TARGET_MODULE_FTM3_FAULT1 = 54U, + TRGMUX_TARGET_MODULE_FTM3_FAULT2 = 55U, + TRGMUX_TARGET_MODULE_PDB0_TRG_IN = 56U, + TRGMUX_TARGET_MODULE_PDB1_TRG_IN = 60U, + 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_TRGMUX_OUT6, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT7, \ + 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_ADC1_ADHWT_TLA0, \ + TRGMUX_TARGET_MODULE_ADC1_ADHWT_TLA1, \ + TRGMUX_TARGET_MODULE_ADC1_ADHWT_TLA2, \ + TRGMUX_TARGET_MODULE_ADC1_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_FTM2_HWTRIG0, \ + TRGMUX_TARGET_MODULE_FTM2_FAULT0, \ + TRGMUX_TARGET_MODULE_FTM2_FAULT1, \ + TRGMUX_TARGET_MODULE_FTM2_FAULT2, \ + TRGMUX_TARGET_MODULE_FTM3_HWTRIG0, \ + TRGMUX_TARGET_MODULE_FTM3_FAULT0, \ + TRGMUX_TARGET_MODULE_FTM3_FAULT1, \ + TRGMUX_TARGET_MODULE_FTM3_FAULT2, \ + TRGMUX_TARGET_MODULE_PDB0_TRG_IN, \ + TRGMUX_TARGET_MODULE_PDB1_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 \ +} + +/* ISELED Pins */ + +#define ISELED_PIN_0 0 /*PTA10*/ +#define ISELED_PIN_1 1 /*PTD0*/ +#define ISELED_PIN_2 2 /*PTD9*/ +#define ISELED_PIN_3 3 /*PTA11*/ +#define ISELED_PIN_4 4 /*PTD1*/ +#define ISELED_PIN_5 5 /*PTD8*/ +#define ISELED_PIN_6 6 /*PTA0*/ +#define ISELED_PIN_7 7 /*PTE15*/ +#define ISELED_PIN_8 8 /*PTA1*/ +#define ISELED_PIN_9 9 /*PTE16*/ +#define ISELED_PIN_10 10 /*PTA2*/ +#define ISELED_PIN_11 11 /*PTD2*/ +#define ISELED_PIN_12 12 /*PTE10*/ +#define ISELED_PIN_13 13 /*PTA3*/ +#define ISELED_PIN_14 14 /*PTE11*/ +#define ISELED_PIN_15 15 /*PTD3*/ +#define ISELED_PIN_16 16 /*PTA8*/ +#define ISELED_PIN_17 17 /*PTE3*/ +#define ISELED_PIN_18 18 /*PTA9*/ +#define ISELED_PIN_19 19 /*PTE3*/ + +#define ISELED_PIN_20 20 /*PTB2*/ +#define ISELED_PIN_21 21 /*PTB1*/ +#define ISELED_PIN_22 22 /*PTD15*/ +#define ISELED_PIN_23 23 /*PTB4*/ +#define ISELED_PIN_24 24 /*PTE0*/ +#define ISELED_PIN_25 25 /*PTE2*/ +#define ISELED_PIN_26 26 /*PTD0*/ +#define ISELED_PIN_27 27 /*PTD2*/ +#define ISELED_PIN_28 28 /*PTB14*/ +#define ISELED_PIN_29 29 /*PTB16*/ +#define ISELED_PIN_30 30 /*PTE15*/ +#define ISELED_PIN_31 31 /*PTA8*/ +#define ISELED_PIN_32 32 /*PTC15*/ +#define ISELED_PIN_33 33 /*PTC1*/ + +#define ISELED_PIN_34 34 /*PTE1*/ +#define ISELED_PIN_35 35 /*PTB3*/ +#define ISELED_PIN_36 36 /*PTD16*/ +#define ISELED_PIN_37 37 /*PTB15*/ +#define ISELED_PIN_38 38 /*PTD1*/ +#define ISELED_PIN_39 39 /*PTC0*/ + + +#define MAX_NR_OF_STRIPS 13U + +/* PDB module features */ + +/* @brief PDB has back-to-back at instance level */ +#define FEATURE_PDB_HAS_INSTANCE_BACKTOBACK (1) + +#endif /* S32K144_FEATURES_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/devassert.h b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/devassert.h new file mode 100644 index 00000000..243c8d45 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_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/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/device_registers.h b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/device_registers.h new file mode 100644 index 00000000..f56cf068 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/device_registers.h @@ -0,0 +1,70 @@ +/* +** ################################################################### +** 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_S32K144HFT0VLLT) || defined(CPU_S32K144LFT0MLLT)) + + #define S32K14x_SERIES + + /* Specific core definitions */ + #include "s32_core_cm4.h" + + #define S32K144_SERIES + + /* Register definitions */ + #include "S32K144.h" + /* CPU specific feature definitions */ + #include "S32K144_features.h" + +#else + #error "No valid CPU defined!" +#endif + +#include "devassert.h" + +#endif /* DEVICE_REGISTERS_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/s32_core_cm4.h b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/s32_core_cm4.h new file mode 100644 index 00000000..acdd2628 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/s32_core_cm4.h @@ -0,0 +1,209 @@ +/* + * 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_cm4.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_CM4_H) +#define CORE_CM4_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/** \brief BKPT_ASM + * + * Macro to be used to trigger an debug interrupt + */ +#define BKPT_ASM __asm("BKPT #0\n\t") + + +/** \brief Enable FPU + * + * ENABLE_FPU indicates whether SystemInit will enable the Floating point unit (FPU) + */ +#if defined (__GNUC__) || defined (__ARMCC_VERSION) +#if defined (__VFP_FP__) && !defined (__SOFTFP__) +#define ENABLE_FPU +#endif + +#elif defined (__ICCARM__) +#if defined __ARMVFP__ +#define ENABLE_FPU +#endif + +#elif defined (__ghs__) || defined (__DCC__) +#if defined (__VFP__) +#define ENABLE_FPU +#endif +#endif /* if defined (__GNUC__) */ + +/** \brief Enable interrupts + */ +#if defined (__GNUC__) +#define ENABLE_INTERRUPTS() __asm volatile ("cpsie i" : : : "memory"); +#else +#define ENABLE_INTERRUPTS() __asm("cpsie i") +#endif + + +/** \brief Disable interrupts + */ +#if defined (__GNUC__) +#define DISABLE_INTERRUPTS() __asm volatile ("cpsid i" : : : "memory"); +#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") +#else +#define STANDBY() __asm("wfi") +#endif + +/** \brief No-op + */ +#define NOP() __asm volatile ("nop") + +/** \brief Reverse byte order in a word. + */ +#if defined (__GNUC__) || defined (__ICCARM__) || defined (__ghs__) || defined (__ARMCC_VERSION) +#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. + */ +#if defined (__GNUC__) || defined (__ICCARM__) || defined (__ghs__) || defined (__ARMCC_VERSION) +#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\"") \ + _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 cm4 + */ +#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 Section placement. + */ +#if defined ( __GNUC__ ) || defined ( __ghs__ ) || defined ( __DCC__ ) || defined (__ARMCC_VERSION) + #define PLACE_IN_SECTION(x) __attribute__((section(x))) +#elif defined ( __ICCARM__ ) + #define PLACE_IN_SECTION(x) _Pragma(stringify(section=x)) +#else + /* Keep compatibility with software analysis tools */ + #define PLACE_IN_SECTION(x) +#endif + +/** \brief Endianness. + */ +#define CORE_LITTLE_ENDIAN + +#ifdef __cplusplus +} +#endif + +#endif /* CORE_CM4_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/system_S32K144.c b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/system_S32K144.c new file mode 100644 index 00000000..a8e32c84 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/system_S32K144.c @@ -0,0 +1,197 @@ +/* + * 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. + */ + +/** + * @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_S32K144.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) +{ +/**************************************************************************/ + /* FPU ENABLE*/ +/**************************************************************************/ +#ifdef ENABLE_FPU + /* Enable CP10 and CP11 coprocessors */ + S32_SCB->CPACR |= (S32_SCB_CPACR_CP10_MASK | S32_SCB_CPACR_CP11_MASK); +#ifdef ERRATA_E6940 + /* Disable lazy context save of floating point state by clearing LSPEN bit + * Workaround for errata e6940 */ + S32_SCB->FPCCR &= ~(S32_SCB_FPCCR_LSPEN_MASK); +#endif +#endif /* ENABLE_FPU */ + +/**************************************************************************/ + /* 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) */ + +/**************************************************************************/ + /* ENABLE CACHE */ +/**************************************************************************/ +#if defined(I_CACHE) && (ICACHE_ENABLE == 1) + /* Invalidate and enable code cache */ + LMEM->PCCCR = LMEM_PCCCR_INVW0(1) | LMEM_PCCCR_INVW1(1) | LMEM_PCCCR_GO(1) | LMEM_PCCCR_ENCACHE(1); +#endif /* defined(I_CACHE) && (ICACHE_ENABLE == 1) */ +} + +/*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, prediv, multi; + bool validSystemClockSource = true; + static const uint32_t fircFreq[] = { + FEATURE_SCG_FIRC_FREQ0, + }; + + 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 != 0U) + { + SCGOUTClock = FEATURE_SCG_SIRC_HIGH_RANGE_FREQ; + } + + break; + case 0x3: + /* Fast IRC */ + regValue = (SCG->FIRCCFG & SCG_FIRCCFG_RANGE_MASK) >> SCG_FIRCCFG_RANGE_SHIFT; + SCGOUTClock= fircFreq[regValue]; + break; + case 0x6: + /* System PLL */ + SCGOUTClock = CPU_XTAL_CLK_HZ; + prediv = ((SCG->SPLLCFG & SCG_SPLLCFG_PREDIV_MASK) >> SCG_SPLLCFG_PREDIV_SHIFT) + 1U; + multi = ((SCG->SPLLCFG & SCG_SPLLCFG_MULT_MASK) >> SCG_SPLLCFG_MULT_SHIFT) + 16U; + SCGOUTClock = SCGOUTClock * multi / (prediv * 2U); + 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/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/system_S32K144.h b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/system_S32K144.h new file mode 100644 index 00000000..c7fcf0a7 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/lib/system_S32K144.h @@ -0,0 +1,111 @@ +/* + * 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. + */ + + +/*! @addtogroup soc_support_S32K144*/ +/*! @{*/ + +/*! + * @file system_S32K144.h + * @brief Device specific configuration file for S32K144 + */ + +#ifndef SYSTEM_S32K144_H_ +#define SYSTEM_S32K144_H_ /**< Symbol preventing repeated inclusion */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * CPU Settings. + *****************************************************************************/ + +/* Watchdog disable */ +#ifndef DISABLE_WDOG + #define DISABLE_WDOG 1 +#endif + +/* Cache enablement */ +#ifndef ICACHE_ENABLE +#define ICACHE_ENABLE 0 +#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, enables FPU. + * 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_S32K144_H_) */ diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/main.c b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/main.c new file mode 100644 index 00000000..c2644ac6 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/main.c @@ -0,0 +1,211 @@ +/************************************************************************************//** +* \file Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/main.c +* \brief Bootloader application source file. +* \ingroup Boot_ARMCM4_S32K14_S32K144EVB_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_S32K144.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_PORTC_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 (PC12) GPIO pin for (optional) backdoor entry input. */ + /* Input GPIO pin configuration. PC12 = GPIO, MUX = ALT1. */ + PORTC->PCR[12] |= PORT_PCR_MUX(1); + /* Disable pull device, as SW2 already has a pull down resistor on the board. */ + PORTC->PCR[12] &= ~PORT_PCR_PE(1); + /* Configure and enable Port C pin 12 GPIO as digital input */ + PTC->PDDR &= ~GPIO_PDDR_PDD(1 << 12U); + PTC->PIDR &= ~GPIO_PIDR_PID(1 << 12U); +#if (BOOT_COM_RS232_ENABLE > 0) + /* UART RX GPIO pin configuration. PC6 = UART1 RX, MUX = ALT2. */ + PORTC->PCR[6] |= PORT_PCR_MUX(2); + /* UART TX GPIO pin configuration. PC7 = UART1 TX, MUX = ALT2. */ + PORTC->PCR[7] |= 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 uses the 8 MHz external crystal as a source for the +** PLL and configures the normal RUN mode for the following clock settings: +** - SPLL_CLK = 160 MHz +** - CORE_CLK = 80 MHz +** - SYS_CLK = 80 MHz +** - BUS_CLK = 40 MHz +** - FLASH_CLK = 26.67 MHz +** - SIRCDIV1_CLK = 8 MHz +** - SIRCDIV2_CLK = 8 MHz +** \return none. +** +****************************************************************************************/ +static void SystemClockConfig(void) +{ + /* --------- SOSC Initialization (8 MHz) ------------------------------------------- */ + /* SOSCDIV1 & SOSCDIV2 =1: divide by 1. */ + SCG->SOSCDIV = SCG_SOSCDIV_SOSCDIV1(1) | SCG_SOSCDIV_SOSCDIV2(1); + /* Range=2: Medium freq (SOSC betw 1MHz-8MHz). + * HGO=0: Config xtal osc for low power. + * EREFS=1: Input is external XTAL. + */ + SCG->SOSCCFG = SCG_SOSCCFG_RANGE(2) | 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)) + { + ; + } + + /* --------- SPLL Initialization (160 MHz) ----------------------------------------- */ + /* Ensure SPLLCSR is unlocked. */ + while (SCG->SPLLCSR & SCG_SPLLCSR_LK_MASK) + { + ; + } + /* SPLLEN=0: SPLL is disabled (default). */ + SCG->SPLLCSR &= ~SCG_SPLLCSR_SPLLEN_MASK; + /* SPLLDIV1 divide by 2 and SPLLDIV2 divide by 4. */ + SCG->SPLLDIV |= SCG_SPLLDIV_SPLLDIV1(2) | SCG_SPLLDIV_SPLLDIV2(3); + /* PREDIV=0: Divide SOSC_CLK by 0+1=1. + * MULT=24: Multiply sys pll by 4+24=40. + * SPLL_CLK = 8MHz / 1 * 40 / 2 = 160 MHz. + */ + SCG->SPLLCFG = SCG_SPLLCFG_MULT(24); + /* Ensure SPLLCSR is unlocked. */ + while (SCG->SPLLCSR & SCG_SPLLCSR_LK_MASK) + { + ; + } + /* LK=0: SPLLCSR can be written. + * SPLLCMRE=0: SPLL CLK monitor IRQ if enabled. + * SPLLCM=0: SPLL CLK monitor disabled. + * SPLLSTEN=0: SPLL disabled in Stop modes. + * SPLLEN=1: Enable SPLL. + */ + SCG->SPLLCSR |= SCG_SPLLCSR_SPLLEN_MASK; + /* Wait for SPLL to become valid. */ + while (!(SCG->SPLLCSR & SCG_SPLLCSR_SPLLVLD_MASK)) + { + ; + } + + /* --------- 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 8MHz SOSC, 80 MHz PLL ------------------ */ + /* Note that flash memory should not be programmed or erased when the microcontroller + * is operating in VLPr or HSRUN mode. Therefore normal RUN mode is configured. + */ + /* Select PLL as clock source. + * DIVCORE=1, div. by 2: Core clock = 160/2 MHz = 80 MHz. + * 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); + /* Wait until system clock source is SPLL. */ + while (((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT ) != 6U) + { + ; + } + /* 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/ARMCM4_S32K14_S32K144EVB_GCC/Boot/startup/startup.c b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/startup/startup.c new file mode 100644 index 00000000..2d0efc61 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_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/ARMCM4_S32K14_S32K144EVB_GCC/Boot/startup/startup.h b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/startup/startup.h new file mode 100644 index 00000000..8384b7db --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_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/ARMCM4_S32K14_S32K144EVB_GCC/Boot/startup/startup_S32K144.S b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/startup/startup_S32K144.S new file mode 100644 index 00000000..7e931a59 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Boot/startup/startup_S32K144.S @@ -0,0 +1,531 @@ +/* ---------------------------------------------------------------------------------------*/ +/* @file: startup_S32K144.s */ +/* @purpose: GNU Compiler Collection Startup File */ +/* S32K144 */ +/* @version: 2.0 */ +/* @date: 2017-1-10 */ +/* @build: b170107 */ +/* ---------------------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1997 - 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. */ +/*****************************************************************************/ +/* Version: GNU Compiler Collection */ +/*****************************************************************************/ + .syntax unified + .arch armv7-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 /* NMI Handler*/ + .long HardFault_Handler /* Hard Fault Handler*/ + .long MemManage_Handler /* MPU Fault Handler*/ + .long BusFault_Handler /* Bus Fault Handler*/ + .long UsageFault_Handler /* Usage Fault Handler*/ + .long 0 /* Reserved*/ + .long 0 /* Reserved*/ + .long 0 /* Reserved*/ + .long 0 /* Reserved*/ + .long SVC_Handler /* SVCall Handler*/ + .long DebugMon_Handler /* Debug Monitor Handler*/ + .long 0 /* Reserved*/ + .long PendSV_Handler /* PendSV Handler*/ + .long SysTick_Handler /* SysTick Handler*/ + + /* External Interrupts*/ + .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 DMA4_IRQHandler /* DMA channel 4 transfer complete*/ + .long DMA5_IRQHandler /* DMA channel 5 transfer complete*/ + .long DMA6_IRQHandler /* DMA channel 6 transfer complete*/ + .long DMA7_IRQHandler /* DMA channel 7 transfer complete*/ + .long DMA8_IRQHandler /* DMA channel 8 transfer complete*/ + .long DMA9_IRQHandler /* DMA channel 9 transfer complete*/ + .long DMA10_IRQHandler /* DMA channel 10 transfer complete*/ + .long DMA11_IRQHandler /* DMA channel 11 transfer complete*/ + .long DMA12_IRQHandler /* DMA channel 12 transfer complete*/ + .long DMA13_IRQHandler /* DMA channel 13 transfer complete*/ + .long DMA14_IRQHandler /* DMA channel 14 transfer complete*/ + .long DMA15_IRQHandler /* DMA channel 15 transfer complete*/ + .long DMA_Error_IRQHandler /* DMA error interrupt channels 0-15*/ + .long MCM_IRQHandler /* FPU sources*/ + .long FTFC_IRQHandler /* FTFC Command complete*/ + .long Read_Collision_IRQHandler /* FTFC Read collision*/ + .long LVD_LVW_IRQHandler /* PMC Low voltage detect interrupt*/ + .long FTFC_Fault_IRQHandler /* FTFC Double bit fault detect*/ + .long WDOG_EWM_IRQHandler /* Single interrupt vector for WDOG and EWM*/ + .long RCM_IRQHandler /* RCM Asynchronous Interrupt*/ + .long LPI2C0_Master_IRQHandler /* LPI2C0 Master Interrupt*/ + .long LPI2C0_Slave_IRQHandler /* LPI2C0 Slave Interrupt*/ + .long LPSPI0_IRQHandler /* LPSPI0 Interrupt*/ + .long LPSPI1_IRQHandler /* LPSPI1 Interrupt*/ + .long LPSPI2_IRQHandler /* LPSPI2 Interrupt*/ + .long Reserved45_IRQHandler /* Reserved Interrupt 45*/ + .long Reserved46_IRQHandler /* Reserved Interrupt 46*/ + .long LPUART0_RxTx_IRQHandler /* LPUART0 Transmit / Receive Interrupt*/ + .long Reserved48_IRQHandler /* Reserved Interrupt 48*/ + .long LPUART1_RxTx_IRQHandler /* LPUART1 Transmit / Receive Interrupt*/ + .long Reserved50_IRQHandler /* Reserved Interrupt 50*/ + .long LPUART2_RxTx_IRQHandler /* LPUART2 Transmit / Receive Interrupt*/ + .long Reserved52_IRQHandler /* Reserved Interrupt 52*/ + .long Reserved53_IRQHandler /* Reserved Interrupt 53*/ + .long Reserved54_IRQHandler /* Reserved Interrupt 54*/ + .long ADC0_IRQHandler /* ADC0 interrupt request.*/ + .long ADC1_IRQHandler /* ADC1 interrupt request.*/ + .long CMP0_IRQHandler /* CMP0 interrupt request*/ + .long Reserved58_IRQHandler /* Reserved Interrupt 58*/ + .long Reserved59_IRQHandler /* Reserved Interrupt 59*/ + .long ERM_single_fault_IRQHandler /* ERM single bit error correction*/ + .long ERM_double_fault_IRQHandler /* ERM double bit error non-correctable*/ + .long RTC_IRQHandler /* RTC alarm interrupt*/ + .long RTC_Seconds_IRQHandler /* RTC seconds interrupt*/ + .long LPIT0_Ch0_IRQHandler /* LPIT0 channel 0 overflow interrupt*/ + .long LPIT0_Ch1_IRQHandler /* LPIT0 channel 1 overflow interrupt*/ + .long LPIT0_Ch2_IRQHandler /* LPIT0 channel 2 overflow interrupt*/ + .long LPIT0_Ch3_IRQHandler /* LPIT0 channel 3 overflow interrupt*/ + .long PDB0_IRQHandler /* PDB0 interrupt*/ + .long Reserved69_IRQHandler /* Reserved Interrupt 69*/ + .long Reserved70_IRQHandler /* Reserved Interrupt 70*/ + .long Reserved71_IRQHandler /* Reserved Interrupt 71*/ + .long Reserved72_IRQHandler /* Reserved Interrupt 72*/ + .long SCG_IRQHandler /* SCG bus interrupt request*/ + .long LPTMR0_IRQHandler /* LPTIMER interrupt request*/ + .long PORTA_IRQHandler /* Port A pin detect interrupt*/ + .long PORTB_IRQHandler /* Port B pin detect interrupt*/ + .long PORTC_IRQHandler /* Port C pin detect interrupt*/ + .long PORTD_IRQHandler /* Port D pin detect interrupt*/ + .long PORTE_IRQHandler /* Port E pin detect interrupt*/ + .long SWI_IRQHandler /* Software interrupt*/ + .long Reserved81_IRQHandler /* Reserved Interrupt 81*/ + .long Reserved82_IRQHandler /* Reserved Interrupt 82*/ + .long Reserved83_IRQHandler /* Reserved Interrupt 83*/ + .long PDB1_IRQHandler /* PDB1 interrupt*/ + .long FLEXIO_IRQHandler /* FlexIO Interrupt*/ + .long Reserved86_IRQHandler /* Reserved Interrupt 86*/ + .long Reserved87_IRQHandler /* Reserved Interrupt 87*/ + .long Reserved88_IRQHandler /* Reserved Interrupt 88*/ + .long Reserved89_IRQHandler /* Reserved Interrupt 89*/ + .long Reserved90_IRQHandler /* Reserved Interrupt 90*/ + .long Reserved91_IRQHandler /* Reserved Interrupt 91*/ + .long Reserved92_IRQHandler /* Reserved Interrupt 92*/ + .long Reserved93_IRQHandler /* Reserved Interrupt 93*/ + .long CAN0_ORed_IRQHandler /* CAN0 OR'ed [Bus Off OR Transmit Warning OR Receive Warning]*/ + .long CAN0_Error_IRQHandler /* CAN0 Interrupt indicating that errors were detected on the CAN bus*/ + .long CAN0_Wake_Up_IRQHandler /* CAN0 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_15_MB_IRQHandler /* CAN0 OR'ed Message buffer (0-15)*/ + .long CAN0_ORed_16_31_MB_IRQHandler /* CAN0 OR'ed Message buffer (16-31)*/ + .long Reserved99_IRQHandler /* Reserved Interrupt 99*/ + .long Reserved100_IRQHandler /* Reserved Interrupt 100*/ + .long CAN1_ORed_IRQHandler /* CAN1 OR'ed [Bus Off OR Transmit Warning OR Receive Warning]*/ + .long CAN1_Error_IRQHandler /* CAN1 Interrupt indicating that errors were detected on the CAN bus*/ + .long Reserved103_IRQHandler /* Reserved Interrupt 103*/ + .long CAN1_ORed_0_15_MB_IRQHandler /* CAN1 OR'ed Interrupt for Message buffer (0-15)*/ + .long Reserved105_IRQHandler /* Reserved Interrupt 105*/ + .long Reserved106_IRQHandler /* Reserved Interrupt 106*/ + .long Reserved107_IRQHandler /* Reserved Interrupt 107*/ + .long CAN2_ORed_IRQHandler /* CAN2 OR'ed [Bus Off OR Transmit Warning OR Receive Warning]*/ + .long CAN2_Error_IRQHandler /* CAN2 Interrupt indicating that errors were detected on the CAN bus*/ + .long Reserved110_IRQHandler /* Reserved Interrupt 110*/ + .long CAN2_ORed_0_15_MB_IRQHandler /* CAN2 OR'ed Message buffer (0-15)*/ + .long Reserved112_IRQHandler /* Reserved Interrupt 112*/ + .long Reserved113_IRQHandler /* Reserved Interrupt 113*/ + .long Reserved114_IRQHandler /* Reserved Interrupt 114*/ + .long FTM0_Ch0_Ch1_IRQHandler /* FTM0 Channel 0 and 1 interrupt*/ + .long FTM0_Ch2_Ch3_IRQHandler /* FTM0 Channel 2 and 3 interrupt*/ + .long FTM0_Ch4_Ch5_IRQHandler /* FTM0 Channel 4 and 5 interrupt*/ + .long FTM0_Ch6_Ch7_IRQHandler /* FTM0 Channel 6 and 7 interrupt*/ + .long FTM0_Fault_IRQHandler /* FTM0 Fault interrupt*/ + .long FTM0_Ovf_Reload_IRQHandler /* FTM0 Counter overflow and Reload interrupt*/ + .long FTM1_Ch0_Ch1_IRQHandler /* FTM1 Channel 0 and 1 interrupt*/ + .long FTM1_Ch2_Ch3_IRQHandler /* FTM1 Channel 2 and 3 interrupt*/ + .long FTM1_Ch4_Ch5_IRQHandler /* FTM1 Channel 4 and 5 interrupt*/ + .long FTM1_Ch6_Ch7_IRQHandler /* FTM1 Channel 6 and 7 interrupt*/ + .long FTM1_Fault_IRQHandler /* FTM1 Fault interrupt*/ + .long FTM1_Ovf_Reload_IRQHandler /* FTM1 Counter overflow and Reload interrupt*/ + .long FTM2_Ch0_Ch1_IRQHandler /* FTM2 Channel 0 and 1 interrupt*/ + .long FTM2_Ch2_Ch3_IRQHandler /* FTM2 Channel 2 and 3 interrupt*/ + .long FTM2_Ch4_Ch5_IRQHandler /* FTM2 Channel 4 and 5 interrupt*/ + .long FTM2_Ch6_Ch7_IRQHandler /* FTM2 Channel 6 and 7 interrupt*/ + .long FTM2_Fault_IRQHandler /* FTM2 Fault interrupt*/ + .long FTM2_Ovf_Reload_IRQHandler /* FTM2 Counter overflow and Reload interrupt*/ + .long FTM3_Ch0_Ch1_IRQHandler /* FTM3 Channel 0 and 1 interrupt*/ + .long FTM3_Ch2_Ch3_IRQHandler /* FTM3 Channel 2 and 3 interrupt*/ + .long FTM3_Ch4_Ch5_IRQHandler /* FTM3 Channel 4 and 5 interrupt*/ + .long FTM3_Ch6_Ch7_IRQHandler /* FTM3 Channel 6 and 7 interrupt*/ + .long FTM3_Fault_IRQHandler /* FTM3 Fault interrupt*/ + .long FTM3_Ovf_Reload_IRQHandler /* FTM3 Counter overflow and Reload interrupt*/ + .long DefaultISR /* 139*/ + .long DefaultISR /* 140*/ + .long DefaultISR /* 141*/ + .long DefaultISR /* 142*/ + .long DefaultISR /* 143*/ + .long DefaultISR /* 144*/ + .long DefaultISR /* 145*/ + .long DefaultISR /* 146*/ + .long DefaultISR /* 147*/ + .long DefaultISR /* 148*/ + .long DefaultISR /* 149*/ + .long DefaultISR /* 150*/ + .long DefaultISR /* 151*/ + .long DefaultISR /* 152*/ + .long DefaultISR /* 153*/ + .long DefaultISR /* 154*/ + .long DefaultISR /* 155*/ + .long DefaultISR /* 156*/ + .long DefaultISR /* 157*/ + .long DefaultISR /* 158*/ + .long DefaultISR /* 159*/ + .long DefaultISR /* 160*/ + .long DefaultISR /* 161*/ + .long DefaultISR /* 162*/ + .long DefaultISR /* 163*/ + .long DefaultISR /* 164*/ + .long DefaultISR /* 165*/ + .long DefaultISR /* 166*/ + .long DefaultISR /* 167*/ + .long DefaultISR /* 168*/ + .long DefaultISR /* 169*/ + .long DefaultISR /* 170*/ + .long DefaultISR /* 171*/ + .long DefaultISR /* 172*/ + .long DefaultISR /* 173*/ + .long DefaultISR /* 174*/ + .long DefaultISR /* 175*/ + .long DefaultISR /* 176*/ + .long DefaultISR /* 177*/ + .long DefaultISR /* 178*/ + .long DefaultISR /* 179*/ + .long DefaultISR /* 180*/ + .long DefaultISR /* 181*/ + .long DefaultISR /* 182*/ + .long DefaultISR /* 183*/ + .long DefaultISR /* 184*/ + .long DefaultISR /* 185*/ + .long DefaultISR /* 186*/ + .long DefaultISR /* 187*/ + .long DefaultISR /* 188*/ + .long DefaultISR /* 189*/ + .long DefaultISR /* 190*/ + .long DefaultISR /* 191*/ + .long DefaultISR /* 192*/ + .long DefaultISR /* 193*/ + .long DefaultISR /* 194*/ + .long DefaultISR /* 195*/ + .long DefaultISR /* 196*/ + .long DefaultISR /* 197*/ + .long DefaultISR /* 198*/ + .long DefaultISR /* 199*/ + .long DefaultISR /* 200*/ + .long DefaultISR /* 201*/ + .long DefaultISR /* 202*/ + .long DefaultISR /* 203*/ + .long DefaultISR /* 204*/ + .long DefaultISR /* 205*/ + .long DefaultISR /* 206*/ + .long DefaultISR /* 207*/ + .long DefaultISR /* 208*/ + .long DefaultISR /* 209*/ + .long DefaultISR /* 210*/ + .long DefaultISR /* 211*/ + .long DefaultISR /* 212*/ + .long DefaultISR /* 213*/ + .long DefaultISR /* 214*/ + .long DefaultISR /* 215*/ + .long DefaultISR /* 216*/ + .long DefaultISR /* 217*/ + .long DefaultISR /* 218*/ + .long DefaultISR /* 219*/ + .long DefaultISR /* 220*/ + .long DefaultISR /* 221*/ + .long DefaultISR /* 222*/ + .long DefaultISR /* 223*/ + .long DefaultISR /* 224*/ + .long DefaultISR /* 225*/ + .long DefaultISR /* 226*/ + .long DefaultISR /* 227*/ + .long DefaultISR /* 228*/ + .long DefaultISR /* 229*/ + .long DefaultISR /* 230*/ + .long DefaultISR /* 231*/ + .long DefaultISR /* 232*/ + .long DefaultISR /* 233*/ + .long DefaultISR /* 234*/ + .long DefaultISR /* 235*/ + .long DefaultISR /* 236*/ + .long DefaultISR /* 237*/ + .long DefaultISR /* 238*/ + .long DefaultISR /* 239*/ + .long DefaultISR /* 240*/ + .long DefaultISR /* 241*/ + .long DefaultISR /* 242*/ + .long DefaultISR /* 243*/ + .long DefaultISR /* 244*/ + .long DefaultISR /* 245*/ + .long DefaultISR /* 246*/ + .long DefaultISR /* 247*/ + .long DefaultISR /* 248*/ + .long DefaultISR /* 249*/ + .long DefaultISR /* 250*/ + .long DefaultISR /* 251*/ + .long DefaultISR /* 252*/ + .long DefaultISR /* 253*/ + .long DefaultISR /* 254*/ + .long 0xFFFFFFFF /* Reserved for user TRIM value*/ + + .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 MemManage_Handler + def_irq_handler BusFault_Handler + def_irq_handler UsageFault_Handler + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + def_irq_handler DMA0_IRQHandler + def_irq_handler DMA1_IRQHandler + def_irq_handler DMA2_IRQHandler + def_irq_handler DMA3_IRQHandler + def_irq_handler DMA4_IRQHandler + def_irq_handler DMA5_IRQHandler + def_irq_handler DMA6_IRQHandler + def_irq_handler DMA7_IRQHandler + def_irq_handler DMA8_IRQHandler + def_irq_handler DMA9_IRQHandler + def_irq_handler DMA10_IRQHandler + def_irq_handler DMA11_IRQHandler + def_irq_handler DMA12_IRQHandler + def_irq_handler DMA13_IRQHandler + def_irq_handler DMA14_IRQHandler + def_irq_handler DMA15_IRQHandler + def_irq_handler DMA_Error_IRQHandler + def_irq_handler MCM_IRQHandler + def_irq_handler FTFC_IRQHandler + def_irq_handler Read_Collision_IRQHandler + def_irq_handler LVD_LVW_IRQHandler + def_irq_handler FTFC_Fault_IRQHandler + def_irq_handler WDOG_EWM_IRQHandler + def_irq_handler RCM_IRQHandler + def_irq_handler LPI2C0_Master_IRQHandler + def_irq_handler LPI2C0_Slave_IRQHandler + def_irq_handler LPSPI0_IRQHandler + def_irq_handler LPSPI1_IRQHandler + def_irq_handler LPSPI2_IRQHandler + def_irq_handler Reserved45_IRQHandler + def_irq_handler Reserved46_IRQHandler + def_irq_handler LPUART0_RxTx_IRQHandler + def_irq_handler Reserved48_IRQHandler + def_irq_handler LPUART1_RxTx_IRQHandler + def_irq_handler Reserved50_IRQHandler + def_irq_handler LPUART2_RxTx_IRQHandler + def_irq_handler Reserved52_IRQHandler + def_irq_handler Reserved53_IRQHandler + def_irq_handler Reserved54_IRQHandler + def_irq_handler ADC0_IRQHandler + def_irq_handler ADC1_IRQHandler + def_irq_handler CMP0_IRQHandler + def_irq_handler Reserved58_IRQHandler + def_irq_handler Reserved59_IRQHandler + def_irq_handler ERM_single_fault_IRQHandler + def_irq_handler ERM_double_fault_IRQHandler + def_irq_handler RTC_IRQHandler + def_irq_handler RTC_Seconds_IRQHandler + def_irq_handler LPIT0_Ch0_IRQHandler + def_irq_handler LPIT0_Ch1_IRQHandler + def_irq_handler LPIT0_Ch2_IRQHandler + def_irq_handler LPIT0_Ch3_IRQHandler + def_irq_handler PDB0_IRQHandler + def_irq_handler Reserved69_IRQHandler + def_irq_handler Reserved70_IRQHandler + def_irq_handler Reserved71_IRQHandler + def_irq_handler Reserved72_IRQHandler + def_irq_handler SCG_IRQHandler + def_irq_handler LPTMR0_IRQHandler + def_irq_handler PORTA_IRQHandler + def_irq_handler PORTB_IRQHandler + def_irq_handler PORTC_IRQHandler + def_irq_handler PORTD_IRQHandler + def_irq_handler PORTE_IRQHandler + def_irq_handler SWI_IRQHandler + def_irq_handler Reserved81_IRQHandler + def_irq_handler Reserved82_IRQHandler + def_irq_handler Reserved83_IRQHandler + def_irq_handler PDB1_IRQHandler + def_irq_handler FLEXIO_IRQHandler + def_irq_handler Reserved86_IRQHandler + def_irq_handler Reserved87_IRQHandler + def_irq_handler Reserved88_IRQHandler + def_irq_handler Reserved89_IRQHandler + def_irq_handler Reserved90_IRQHandler + def_irq_handler Reserved91_IRQHandler + def_irq_handler Reserved92_IRQHandler + def_irq_handler Reserved93_IRQHandler + def_irq_handler CAN0_ORed_IRQHandler + def_irq_handler CAN0_Error_IRQHandler + def_irq_handler CAN0_Wake_Up_IRQHandler + def_irq_handler CAN0_ORed_0_15_MB_IRQHandler + def_irq_handler CAN0_ORed_16_31_MB_IRQHandler + def_irq_handler Reserved99_IRQHandler + def_irq_handler Reserved100_IRQHandler + def_irq_handler CAN1_ORed_IRQHandler + def_irq_handler CAN1_Error_IRQHandler + def_irq_handler Reserved103_IRQHandler + def_irq_handler CAN1_ORed_0_15_MB_IRQHandler + def_irq_handler Reserved105_IRQHandler + def_irq_handler Reserved106_IRQHandler + def_irq_handler Reserved107_IRQHandler + def_irq_handler CAN2_ORed_IRQHandler + def_irq_handler CAN2_Error_IRQHandler + def_irq_handler Reserved110_IRQHandler + def_irq_handler CAN2_ORed_0_15_MB_IRQHandler + def_irq_handler Reserved112_IRQHandler + def_irq_handler Reserved113_IRQHandler + def_irq_handler Reserved114_IRQHandler + def_irq_handler FTM0_Ch0_Ch1_IRQHandler + def_irq_handler FTM0_Ch2_Ch3_IRQHandler + def_irq_handler FTM0_Ch4_Ch5_IRQHandler + def_irq_handler FTM0_Ch6_Ch7_IRQHandler + def_irq_handler FTM0_Fault_IRQHandler + def_irq_handler FTM0_Ovf_Reload_IRQHandler + def_irq_handler FTM1_Ch0_Ch1_IRQHandler + def_irq_handler FTM1_Ch2_Ch3_IRQHandler + def_irq_handler FTM1_Ch4_Ch5_IRQHandler + def_irq_handler FTM1_Ch6_Ch7_IRQHandler + def_irq_handler FTM1_Fault_IRQHandler + def_irq_handler FTM1_Ovf_Reload_IRQHandler + def_irq_handler FTM2_Ch0_Ch1_IRQHandler + def_irq_handler FTM2_Ch2_Ch3_IRQHandler + def_irq_handler FTM2_Ch4_Ch5_IRQHandler + def_irq_handler FTM2_Ch6_Ch7_IRQHandler + def_irq_handler FTM2_Fault_IRQHandler + def_irq_handler FTM2_Ovf_Reload_IRQHandler + def_irq_handler FTM3_Ch0_Ch1_IRQHandler + def_irq_handler FTM3_Ch2_Ch3_IRQHandler + def_irq_handler FTM3_Ch4_Ch5_IRQHandler + def_irq_handler FTM3_Ch6_Ch7_IRQHandler + def_irq_handler FTM3_Fault_IRQHandler + def_irq_handler FTM3_Ovf_Reload_IRQHandler + + .end diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.cproject b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.cproject new file mode 100644 index 00000000..eba65a04 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.cproject @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.project b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.project new file mode 100644 index 00000000..aa7f79b4 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_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/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.settings/com.nxp.s32ds.cle.runtime.component.prefs b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.settings/com.nxp.s32ds.cle.runtime.component.prefs new file mode 100644 index 00000000..b5c8b16a --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_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=CortexM4F +com.nxp.s32ds.cle.runtime.hardware.registry.device.id=S32K144 +com.nxp.s32ds.cle.runtime.hardware.registry.deviceCore.id=S32K144_M4F +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/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.settings/com.processorexpert.core.ide.newprojectwizard.prefs b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.settings/com.processorexpert.core.ide.newprojectwizard.prefs new file mode 100644 index 00000000..87ca305f --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_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/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.settings/language.settings.xml b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.settings/language.settings.xml new file mode 100644 index 00000000..7a37f8a6 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.settings/language.settings.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.settings/org.eclipse.cdt.codan.core.prefs b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 00000000..98b63502 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_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/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.settings/org.eclipse.cdt.core.prefs b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 00000000..ac99b9ec --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_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.2040336100/PATH/delimiter=; +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.2040336100/PATH/operation=prepend +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.2040336100/PATH/value= +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.2040336100/append=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.2040336100/appendContributed=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.1476644705/PATH/delimiter=; +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.1476644705/PATH/operation=prepend +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.1476644705/PATH/value= +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.1476644705/append=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.debug.ram.1476644705/appendContributed=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.88811887/PATH/delimiter=; +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.88811887/PATH/operation=prepend +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.88811887/PATH/value= +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.88811887/append=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.88811887/appendContributed=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.537914742/PATH/delimiter=; +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.537914742/PATH/operation=prepend +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.537914742/PATH/value= +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.537914742/append=true +environment/project/com.nxp.s32ds.cle.arm.mbs.arm32.bare.exe.release.ram.537914742/appendContributed=true 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 new file mode 100644 index 0000000000000000000000000000000000000000..f0b3d461763f984c6d55a1225af8d3a58833c9c5 GIT binary patch literal 593988 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

    d@EB{Od)zY^ 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

    &YNJh?mH6kb!K#T-`fM%UN<5-w+KY+c-d4 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 literal 0 HcmV?d00001 diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/Debug/demoprog_s32k144.srec b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/Debug/demoprog_s32k144.srec new file mode 100644 index 00000000..68899c6f --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/Debug/demoprog_s32k144.srec @@ -0,0 +1,245 @@ +S018000064656D6F70726F675F7333326B3134342E7372656374 +S11320000070002029250000912500009125000082 +S1132010912500009125000091250000000000009A +S113202000000000000000000000000091250000F6 +S1132030912500000000000091250000ED2B000018 +S113204091250000912500009125000091250000B4 +S113205091250000912500009125000091250000A4 +S11320609125000091250000912500009125000094 +S11320709125000091250000912500009125000084 +S11320809125000091250000912500009125000074 +S11320909125000091250000912500009125000064 +S11320A09125000091250000912500009125000054 +S11320B09125000091250000912500009125000044 +S11320C09125000091250000912500009125000034 +S11320D09125000091250000912500009125000024 +S11320E09125000091250000912500009125000014 +S11320F09125000091250000912500009125000004 +S113210091250000912500009125000091250000F3 +S113211091250000912500009125000091250000E3 +S113212091250000912500009125000091250000D3 +S113213091250000912500009125000091250000C3 +S113214091250000912500009125000091250000B3 +S113215091250000912500009125000091250000A3 +S11321609125000091250000912500009125000093 +S11321709125000091250000912500009125000083 +S11321809125000091250000912500009125000073 +S11321909125000091250000912500009125000063 +S11321A09125000091250000912500009125000053 +S11321B09125000091250000912500009125000043 +S11321C09125000091250000912500009125000033 +S11321D09125000091250000912500009125000023 +S11321E09125000091250000912500009125000013 +S11321F09125000091250000912500009125000003 +S113220091250000912500009125000091250000F2 +S113221091250000912500009125000091250000E2 +S113222091250000912500009125000091250000D2 +S113223091250000912500009125000091250000C2 +S113224091250000912500009125000091250000B2 +S113225091250000912500009125000091250000A2 +S11322609125000091250000912500009125000092 +S11322709125000091250000912500009125000082 +S11322809125000091250000912500009125000072 +S11322909125000091250000912500009125000062 +S11322A09125000091250000912500009125000052 +S11322B09125000091250000912500009125000042 +S11322C09125000091250000912500009125000032 +S11322D09125000091250000912500009125000022 +S11322E09125000091250000912500009125000012 +S11322F09125000091250000912500009125000002 +S113230091250000912500009125000091250000F1 +S113231091250000912500009125000091250000E1 +S113232091250000912500009125000091250000D1 +S113233091250000912500009125000091250000C1 +S113234091250000912500009125000091250000B1 +S113235091250000912500009125000091250000A1 +S11323609125000091250000912500009125000091 +S11323709125000091250000912500009125000081 +S11323809125000091250000912500009125000071 +S11323909125000091250000912500009125000061 +S11323A09125000091250000912500009125000051 +S11323B09125000091250000912500009125000041 +S11323C09125000091250000912500009125000031 +S11323D09125000091250000912500009125000021 +S11323E09125000091250000912500009125000011 +S11323F09125000091250000EE11AA55FFFFFFFF73 +S1132400FFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFF59 +S1132410044B05481B1A062B02D9044B03B1184779 +S1132420704700BF6B84FF1F6884FF1F000000001B +S113243005490648091A891001EBD171491002D0E7 +S1132440034B03B1184770476884FF1F6884FF1F5C +S11324500000000010B5064C237843B9FFF7D8FFFD +S1132460044B13B10448AFF300800123237010BD63 +S11324700000002000000000782E000008B5084B82 +S11324801BB108490848AFF300800848036813B932 +S1132490BDE80840CCE7064B002BF9D09847F7E796 +S11324A00000000004000020782E00006484FF1F58 +S11324B000000000154B002B08BF134B9D46A3F5ED +S11324C0803A00218B460F461348144A121A00F032 +S11324D0A3FC0F4B002B00D098470E4B002B00D0D1 +S11324E098470020002104000D000D48002802D068 +S11324F00C48AFF3008000F06BFC2000290000F0D2 +S1132500CDFA00F051FC00BF00000800007000206C +S11325100000000000000000000000207400002003 +S1132520000000000000000072B64FF000014FF000 +S113253000024FF000034FF000044FF000054FF08D +S113254000064FF00007B846B946BA46BB46BC463B +S11325500A490B4A521A013A05DD00200423086097 +S11325601944043AFBDA0748854607488047074878 +S1132570804762B6FFF79EFFFEE700000080FF1F62 +S11325800070002000700020FD2B0000D12C000002 +S1132590FFF7FEBF38B50C4B1B68002B00DB38BDC2 +S11325A0094A136823F00043136000F019FB00F19B +S11325B0FA05054C236813F4801FF0D000F010FBDB +S11325C08542F7D2EBE700BF0040024038B50B4B21 +S11325D01A6842F080421A601A6842F080521A6007 +S11325E000F0FEFA00F1FA05044C236813F0807F32 +S11325F003D100F0F5FA8542F7D238BD004002401D +S113260070B582B000238DF8003001238DF80130BD +S113261002238DF8023004238DF8033008238DF84B +S1132620043010238DF8053020238DF80630402324 +S11326308DF80730AA4BD3F8AC2122F08042C3F8BE +S1132640AC21D3F8AC2142F08442C3F8AC21A3F509 +S11326508053D3F80422C2F3022222B94FF48072C9 +S1132660C3F8042201229F4BD3F8081201F00101A0 +S11326709D489E4B002908BF034602A90A4412F84C +S1132680082CB3FBF2F39A4AA2FB0323DB0B0733B8 +S1132690C3F3CC0343F0E063964A1361964B536152 +S11326A000239361136253624FF470339362936A0D +S11326B043F0880393620123D3624FF44023936170 +S11326C0A2F5C042D2F8903043F08043C2F8903073 +S11326D0FFF760FFFFF77AFF884B1B68002B11DBC5 +S11326E0864A136843F00043136000F079FA00F15E +S11326F0FA05824C236813F4801F03D100F070FAAA +S11327008542F7D27D4A536823F400535360FFF7A0 +S113271041FFFFF75BFF00238DF8003001238DF8A4 +S1132720013002238DF8023004238DF8033008238E +S11327308DF8043010238DF8053020238DF80630F1 +S113274040238DF80730674BD3F80431C3F30223D9 +S11327502BB94FF48072634BC3F80421012302AAFE +S1132760134413F8083C4FF4FA50B0FBF3F0002282 +S11327701446634E4FF4FA7502E00132122A17D060 +S113278016F8223005FB03F3B0FBF3F103FB110150 +S11327900029F2D1B0FBF3F39CB2611E89B2FF2988 +S11327A0EBD8574B03EB820255789178D07802E04E +S11327B0002001460546514A536823F087031B0451 +S11327C01B0C53605668631E46EA036353605468E7 +S11327D06B1E03F007032343536054684B1EDB0452 +S11327E003F46013234353605468431E1B0403F42F +S11327F0E023234353605068042928BF04214B1E5F +S11328009B0503F4400303435360536843F0800380 +S1132810536000231046194603F1200240F82210A9 +S11328200133802BF8D100233448194603F508728C +S113283040F822100133202BF8D1304B1A6822F0D3 +S11328407F0242F01F021A601A6842F400321A60D2 +S11328501A6842F480321A601A6822F000521A6030 +S11328606FF02042C3F8A4284FF08062C3F810210F +S1132870244AC3F8142100229A624FF0FF321A63EB +S1132880214A1A621A6822F400021A605A6822F471 +S1132890805222F008025A601A6822F080421A60BC +S11328A01A6822F080521A6000F09AF900F1FA05D1 +S11328B0124C236813F0807F03D000F091F9854215 +S11328C0F7D200F08DF900F1FA050C4C236813F0EF +S11328D0006F03D000F084F98542F7D202B070BDD6 +S11328E0005006400040064080841E0000127A001A +S11328F0C5B3A29100B0064000C01FC00040024012 +S11329002C2E000000009C1906003B0010B582B07C +S11329103D4B1B78002B3FD13C4B5B6913F4001FEC +S113292008D03A4BDB69DBB2394A1370013BDBB2A6 +S11329303F2B26D9374B1B6B13F4007F1FD0354B2D +S1132940D3F81001C0F30340002855D00DF1FF3136 +S11329500023314C83F00302D2B2125D01F8012F3F +S11329600133DAB29042F5D82A4B4FF400721A635D +S11329709A682A4B1A609DF80030FF2B2CD002B0C5 +S113298010BD00F02DF9264B186001221E4B1A7061 +S11329900022244B1A70CDE71C4B5B6913F4001F13 +S11329A01FD020490B78194AD469194AD0184470A9 +S11329B00133DBB20B7012789A42BBD10022124B66 +S11329C01A70134B5B78FF2BB4D1114B9B78002BFF +S11329D0B0D100F071F9ADE70228D0D100F06CF964 +S11329E0CDE700F0FDF80E4B1B6864339842A1D983 +S11329F00022054B1A709DE7064B4FF400721A63D0 +S1132A009A68064B1A60BAE76100002000B00640DD +S1132A102000002000400240184102401C00002019 +S1132A206400002062000020074A136843F48073A6 +S1132A301360064B5A6942F001025A615A6842F027 +S1132A4001025A60704700BF00C00440C0F00F404C +S1132A5008B500F0C5F80E4B1B68C31AB3F5FA7F2E +S1132A600CD30C4B1B7853B901220A4B1A700A4A37 +S1132A70936843F001039360054B186008BD00227E +S1132A80044B1A70044A536843F001035360F3E79C +S1132A906C00002068000020C0F00F4008B5414BD6 +S1132AA040F20112C3F804212422C3F80821D3F808 +S1132AB0002112F4000FFAD101223A4BC3F800218D +S1132AC0D3F8002112F0807FFAD0364BD3F80026D9 +S1132AD012F4000FFAD1334BD3F8002622F001028E +S1132AE0C3F80026D3F8042642F4407242F00202EE +S1132AF0C3F804264FF4C012C3F80826D3F80026FE +S1132B0012F4000FFAD1274AD2F8003643F0010339 +S1132B10C2F800361346D3F8002612F0807FFAD0AC +S1132B20204B40F20112C3F804221F4A5A611A468C +S1132B301369C3F30363062BFAD100F07DF81B4B32 +S1132B40D3F82C2142F08042C3F82C21D3F8302151 +S1132B5042F08042C3F83021D3F8342142F080425D +S1132B60C3F83421A3F5D0339A6942F400729A6110 +S1132B70DA6942F40072DA6103F500531A6942F427 +S1132B80A0621A615A6942F4A0625A6100F010F816 +S1132B90FFF74AFF62B6FFF733FDFFF759FFFFF770 +S1132BA0B5FEFAE700400640120001060050064058 +S1132BB0074B1B68074AA2FB03239B09013B064AF8 +S1132BC053600023936007211160044A1360704727 +S1132BD00084FF1FD34D621010E000E0700000205D +S1132BE0014B1868704700BF70000020024A136848 +S1132BF001331360704700BF700000204FF0E023E2 +S1132C00D3F8882D42F47002C3F8882DD3F8342FFA +S1132C1022F08042C3F8342F054B064A5A605A68A2 +S1132C2042F220121A604FF6FF729A60704700BF9A +S1132C300020054020C528D91B4B1A691B69C3F322 +S1132C400363013B052B2ED8DFE803F025030D2D8C +S1132C502D12154BD3F8083203F00103002B13494E +S1132C6018BF0B4618E0104BD3F80833104B13E091 +S1132C700D4BD3F80816D3F80836C3F3044303F115 +S1132C8010000A4B03FB00F3C1F302210131490098 +S1132C90B3FBF1F300E0054BC2F303420132B3FB93 +S1132CA0F2F3044A136070470040064000127A00B1 +S1132CB0006CDC020084FF1F4FF0E021D1F80C2DE2 +S1132CC092B2024B1343C1F80C3D70470400FA055D +S1132CD0264B274A9A4208D013462448254A13F81B +S1132CE0011B02F8011B9842F9D1234B234A9A4253 +S1132CF008D013462048224A13F8011B02F8011B8E +S1132D008342F9D11F4B204A9A4206D01346002130 +S1132D101C4A03F8011B9342FBD11C4B1C4A9A42E8 +S1132D2008D0134619481B4A13F8011B02F8011B6B +S1132D308342F9D1184B194A9A4212D010B4184C54 +S1132D40A40808D01946002351F8040B42F8040BD8 +S1132D500133A342F8D1134B104A1A605DF8044BB7 +S1132D607047104B0C4A1A60704700BF082F0000D0 +S1132D70A02E00000084FF1F082F0000082F000071 +S1132D806884FF1F7400002000000020082F00004A +S1132D90082F000000000020002000000080FF1F1A +S1132DA00004000008ED00E008B5074B044613B129 +S1132DB00021AFF30080054B1868836A03B198477C +S1132DC0204600F031F800BF00000000742E00001F +S1132DD070B50D4E0D4CA41BA4100025A54209D1BD +S1132DE00B4E0C4C00F048F8A41BA4100025A5427F +S1132DF005D170BD56F8253098470135EEE756F8F1 +S1132E00253098470135F2E7982E0000982E0000EF +S1132E10982E00009C2E000002440346934200D1E9 +S1132E20704703F8011BF9E7FEE7000008030202FC +S1132E30090303020A0303030B0403030C0404033E +S1132E400D0504030E0504040F060404100605040E +S1132E5011070504120705051308050514080605DE +S1132E6015080705160807061708080618080807AE +S1132E70190808080484FF1FF8B500BFF8BC08BC93 +S1132E809E467047F8B500BFF8BC08BC9E46704724 +S10B2E9024F6FF7F010000009D +S1072E987D24000091 +S1072E9C55240000B5 +S1132EA0006CDC02000000000000000000000000D4 +S1132EB0000000000000000000000000000000000E +S1132EC000000000000000000000000000000000FE +S1132ED000000000000000000000000000000000EE +S1132EE000000000000000000000000000000000DE +S1132EF000000000000000000000000000000000CE +S10B2F000000000000000000C5 +S9032529AE diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/Prog_Debug.launch b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/Prog_Debug.launch new file mode 100644 index 00000000..1539dbb2 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/Prog_Debug.launch @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/S32K144_64_flash.ld b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/S32K144_64_flash.ld new file mode 100644 index 00000000..45691b56 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/S32K144_64_flash.ld @@ -0,0 +1,280 @@ +/* +** ################################################################### +** Processor: S32K144 with 64 KB SRAM +** Compiler: GNU C Compiler +** +** Abstract: +** Linker file for the GNU C Compiler +** +** Copyright (c) 2015-2016 Freescale Semiconductor, Inc. +** Copyright 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.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__ : 0x00000400; +STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x00000400; + +/* 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 : 0x0400; + +/* Specify the memory areas */ +MEMORY +{ + /* Flash */ + m_interrupts (RX) : ORIGIN = 0x00002000, LENGTH = 0x00000400 + m_flash_config (RX) : ORIGIN = 0x00002400, LENGTH = 0x00000010 + m_text (RX) : ORIGIN = 0x00002410, LENGTH = 0x0007FBF0 - 0x2000 + + /* SRAM_L */ + m_data (RW) : ORIGIN = 0x1FFF8000, LENGTH = 0x00008000 + + /* SRAM_U */ + m_data_2 (RW) : ORIGIN = 0x20000000, LENGTH = 0x00007000 +} + +/* 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/ARMCM4_S32K14_S32K144EVB_GCC/Prog/boot.c b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/boot.c new file mode 100644 index 00000000..0a9d85ae --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/boot.c @@ -0,0 +1,772 @@ +/************************************************************************************//** +* \file Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/boot.c +* \brief Demo program bootloader interface source file. +* \ingroup Prog_ARMCM4_S32K14_S32K144EVB_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 (LPUART1) +/** \brief Set the PCC index offset for LPUART. */ +#define PCC_LPUARTx_INDEX (PCC_LPUART1_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(0b010) | 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/ARMCM4_S32K14_S32K144EVB_GCC/Prog/boot.h b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/boot.h new file mode 100644 index 00000000..d970166b --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/boot.h @@ -0,0 +1,40 @@ +/************************************************************************************//** +* \file Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/boot.h +* \brief Demo program bootloader interface header file. +* \ingroup Prog_ARMCM4_S32K14_S32K144EVB_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/ARMCM4_S32K14_S32K144EVB_GCC/Prog/header.h b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/header.h new file mode 100644 index 00000000..b3ef58b0 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/header.h @@ -0,0 +1,42 @@ +/************************************************************************************//** +* \file Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/header.h +* \brief Generic header file. +* \ingroup Prog_ARMCM4_S32K14_S32K144EVB_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_S32K144.h" /* Device sconfiguration */ + +#endif /* HEADER_H */ +/*********************************** end of header.h ***********************************/ diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/led.c b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/led.c new file mode 100644 index 00000000..78d67340 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/led.c @@ -0,0 +1,96 @@ +/************************************************************************************//** +* \file Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/led.c +* \brief LED driver source file. +* \ingroup Prog_ARMCM4_S32K14_S32K144EVB_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. PD0 = GPIO, MUX = ALT1. */ + PORTD->PCR[0] |= PORT_PCR_MUX(1); + /* configure Port D pin 0 GPIO as digital output */ + PTD->PDDR |= GPIO_PDDR_PDD(0x00000001); + /* turn the LED off on Port D pin 0 */ + PTD->PSOR |= GPIO_PSOR_PTSO(0x00000001); +} /*** 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. */ + PTD->PCOR |= GPIO_PCOR_PTCO(0x00000001); + } + else + { + led_toggle_state = 0; + /* Turn the LED off. */ + PTD->PSOR |= GPIO_PSOR_PTSO(0x00000001); + } + + /* 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/ARMCM4_S32K14_S32K144EVB_GCC/Prog/led.h b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/led.h new file mode 100644 index 00000000..7246abe1 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/led.h @@ -0,0 +1,39 @@ +/************************************************************************************//** +* \file Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/led.h +* \brief LED driver header file. +* \ingroup Prog_ARMCM4_S32K14_S32K144EVB_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/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/S32K144.h b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/S32K144.h new file mode 100644 index 00000000..ae04b8bb --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/S32K144.h @@ -0,0 +1,11937 @@ +/* +** ################################################################### +** Processor: S32K144 +** Reference manual: S32K1XXRM Rev. 9, 09/2018 +** Version: rev. 4.2, 2019-02-19 +** Build: b190219 +** +** Abstract: +** Peripheral Access Layer for S32K144 +** +** 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 (2015-04-09) - Iulian Talpiga +** Initial version. +** - rev. 1.1 (2015-05-19) - Bogdan Nitu +** Updated interrupts table +** Removed SIM_CHIPCTL_DAC2CMP +** Compacted PORT_PCR registers +** Compacted PCC registers +** - rev. 1.2 (2015-06-02) - Bogdan Nitu +** Added 'U' suffix to all integer constants +** Use "" instead of <> for Platform type inclusion +** CNT register from WDOG module is RW +** - rev. 1.3 (2015-08-05) - Iulian Talpiga +** Synchronized with latest RDP +** Removed OSC32 module +** Removed reserved registers +** Incorporated bit band acces macros +** Switched to standard C99 data types +** Added 'u' to constants +** Added size defines for register arrays +** Define peripheral instance count +** - rev. 1.4 (2015-08-10) - Iulian Talpiga +** Compacted TRGMUX registers +** Defined array index offsets for PCC and TRGMUX +** Added FPU registers +** Group FTM channel registers +** Added interrupt information to peripherals +** Renamed CAN interrupts according to the reference manual +** Added author information to revisions +** - rev. 1.5 (2015-09-16) - Iulian Talpiga +** Renamed NVIC and SCB to avoid conflict +** Compacted CAN Wake-up Message buffers +** Added CAN embedded RAM +** Updated interrupts: LPIT, FTFE, LPUART,ACMP +** Corrected ADC_SC1_ADCH_WIDTH +** Compacted PDB registers +** Corrected CAN, FTM, and PDB count defines +** Guarding register acces macro against redefintion +** - rev. 1.6 (2015-09-29) - Iulian Talpiga +** Added WATER and FIFO registers to LPUART. +** - rev. 1.7 (2015-10-21) - Iulian Talpiga +** Updated ADC, AIPS, CMP, LMEM, LPTMR, PMC, PORT, RCM, RTC, SCG, SIM +** Compacted MPU and LPIT +** Added FSL_SysTick +** Updated doxygen documentation grouping +** Updated interrupts: RCM +** - rev. 1.8 (2016-01-06) - Iulian Talpiga +** Updated DMA, compacted TCD registers +** Updated SCG, removed SC2P - SC16P +** Added 8 and 16 bit access to DATA register, CRC module +** - rev. 1.9 (2016-02-15) - Iulian Talpiga +** Updated CRC, renamed DATA union +** Updated PMC, added CLKBIASDIS bitfield +** Added FSL_NVIC registers to SVD +** - rev. 2.0 (2016-04-07) - Iulian Talpiga +** Updated support for Rev2.0 silicon (0N47T) +** Updated ADC, AIPS, DMA, FlexIO, FTM, GPIO, LPI2C, LPIT, LPSPI, MCM, MPU, MSCM, PMC, RTC, RCM, PCC, RTC, SCG, SIM, TRGMUX and WDOG module +** Updated interrupts +** Added EIM and ERM modules +** Added EIM and ERM modules +** - rev. 2.1 (2016-06-10) - Iulian Talpiga +** Updated to latest RM +** Minor changes to: CAN, EIM, LPI2C, MPU, PCC, PMC, RTC, SIM and TRGMUX +** - rev. 2.2 (2016-08-02) - Iulian Talpiga +** Updated to latest RM +** Minor changes to: ADC, CAN, CRC, FTFC, LMEM, LPI2C, MCM, MSCM, PCC, RTC, SIM +** Added CSE_PRAM +** - rev. 2.3 (2016-09-09) - Iulian Talpiga +** Updated to latest RM +** Minor changes to: PCC, FSL_NVIC and FTM +** - rev. 2.4 (2016-09-28) - Iulian Talpiga +** Fix RAMn array size in FlexCAN +** Fix FCSESTAT bit order +** Added CP0CFG0, CP0CFG1,CP0CFG2 and CP0CFG3 in MSCM +** Fixed STIR register in FSL_NVIC +** Fixed SHPR3 and ACTLR registers in FSL_SCB +** - rev. 2.5 (2016-11-25) - Iulian Talpiga +** Fix FRAC bit-field in PCC module +** Removed BITBAND_ACCESS macros +** Added MISRA declarations +** Updated copyright +** Changed prefix of NVIC, SCB and SysTick to S32_ +** - rev. 2.6 (2017-01-09) - Iulian Talpiga +** Fix interrupts for CAN, LPUART, FTFC +** - rev. 2.7 (2017-02-22) - Iulian Talpiga +** Update header as per rev S32K14XRM Rev. 2, 02/2017 +** Updated modules AIPS, CAN, LPI2C, LPSPI, MCM, MPU, SCG and SIM +** - rev. 2.8 (2017-03-27) - Iulian Talpiga +** Synchronized PCC_FlexIO on S32K Family +** - rev. 3.0 (2017-08-04) - Mihai Volmer +** Update header as per rev S32K1XXRM Rev. 4, 06/2017 +** Updated modules CAN, MCM and PORTn +** - rev. 3.1 (2017-09-25) - Andrei Bolojan +** Update NVIC Size of Registers Arrays +** - rev. 4.0 (2018-02-28) - Mihai Volmer +** Updated header as per rev S32K1XXRM Rev. 6, 12/2017 +** Updated modules ERM, I2C, MSCM and SIM +** - rev. 4.1 (2018-07-19) - Dan Nastasa +** Updated the header based on S32K1XXRM Rev. 8, 06/2018. +** - rev. 4.2 (2019-02-19) - Ionut Pavel +** Updated the header based on S32K1XXRM Rev. 9, 09/2018. +** +** ################################################################### +*/ + +/*! + * @file S32K144.h + * @version 4.2 + * @date 2019-02-19 + * @brief Peripheral Access Layer for S32K144 + * + * 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(S32K144_H_) /* Check if memory map has not been already included */ +#define S32K144_H_ +#define MCU_S32K144 + +/* Check if another memory map has not been also included */ +#if (defined(MCU_ACTIVE)) + #error S32K144 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 0x0400u +/** Memory map minor version */ +#define MCU_MEM_MAP_VERSION_MINOR 0x0002u + +/* ---------------------------------------------------------------------------- + -- 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 S32K144 + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Interrupt_vector_numbers_S32K144 Interrupt vector numbers for S32K144 + * @{ + */ + +/** Interrupt Number Definitions */ +#define NUMBER_OF_INT_VECTORS 139u /**< 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-M4 SV Hard Fault Interrupt */ + MemoryManagement_IRQn = -12, /**< Cortex-M4 Memory Management Interrupt */ + BusFault_IRQn = -11, /**< Cortex-M4 Bus Fault Interrupt */ + UsageFault_IRQn = -10, /**< Cortex-M4 Usage Fault Interrupt */ + SVCall_IRQn = -5, /**< Cortex-M4 SV Call Interrupt */ + DebugMonitor_IRQn = -4, /**< Cortex-M4 Debug Monitor Interrupt */ + PendSV_IRQn = -2, /**< Cortex-M4 Pend SV Interrupt */ + SysTick_IRQn = -1, /**< Cortex-M4 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 */ + DMA4_IRQn = 4u, /**< DMA channel 4 transfer complete */ + DMA5_IRQn = 5u, /**< DMA channel 5 transfer complete */ + DMA6_IRQn = 6u, /**< DMA channel 6 transfer complete */ + DMA7_IRQn = 7u, /**< DMA channel 7 transfer complete */ + DMA8_IRQn = 8u, /**< DMA channel 8 transfer complete */ + DMA9_IRQn = 9u, /**< DMA channel 9 transfer complete */ + DMA10_IRQn = 10u, /**< DMA channel 10 transfer complete */ + DMA11_IRQn = 11u, /**< DMA channel 11 transfer complete */ + DMA12_IRQn = 12u, /**< DMA channel 12 transfer complete */ + DMA13_IRQn = 13u, /**< DMA channel 13 transfer complete */ + DMA14_IRQn = 14u, /**< DMA channel 14 transfer complete */ + DMA15_IRQn = 15u, /**< DMA channel 15 transfer complete */ + DMA_Error_IRQn = 16u, /**< DMA error interrupt channels 0-15 */ + MCM_IRQn = 17u, /**< FPU sources */ + FTFC_IRQn = 18u, /**< FTFC Command complete */ + Read_Collision_IRQn = 19u, /**< FTFC Read collision */ + LVD_LVW_IRQn = 20u, /**< PMC Low voltage detect interrupt */ + FTFC_Fault_IRQn = 21u, /**< FTFC Double bit fault detect */ + WDOG_EWM_IRQn = 22u, /**< Single interrupt vector for WDOG and EWM */ + RCM_IRQn = 23u, /**< RCM Asynchronous Interrupt */ + LPI2C0_Master_IRQn = 24u, /**< LPI2C0 Master Interrupt */ + LPI2C0_Slave_IRQn = 25u, /**< LPI2C0 Slave Interrupt */ + LPSPI0_IRQn = 26u, /**< LPSPI0 Interrupt */ + LPSPI1_IRQn = 27u, /**< LPSPI1 Interrupt */ + LPSPI2_IRQn = 28u, /**< LPSPI2 Interrupt */ + LPUART0_RxTx_IRQn = 31u, /**< LPUART0 Transmit / Receive Interrupt */ + LPUART1_RxTx_IRQn = 33u, /**< LPUART1 Transmit / Receive Interrupt */ + LPUART2_RxTx_IRQn = 35u, /**< LPUART2 Transmit / Receive Interrupt */ + ADC0_IRQn = 39u, /**< ADC0 interrupt request. */ + ADC1_IRQn = 40u, /**< ADC1 interrupt request. */ + CMP0_IRQn = 41u, /**< CMP0 interrupt request */ + ERM_single_fault_IRQn = 44u, /**< ERM single bit error correction */ + ERM_double_fault_IRQn = 45u, /**< ERM double bit error non-correctable */ + RTC_IRQn = 46u, /**< RTC alarm interrupt */ + RTC_Seconds_IRQn = 47u, /**< RTC seconds interrupt */ + LPIT0_Ch0_IRQn = 48u, /**< LPIT0 channel 0 overflow interrupt */ + LPIT0_Ch1_IRQn = 49u, /**< LPIT0 channel 1 overflow interrupt */ + LPIT0_Ch2_IRQn = 50u, /**< LPIT0 channel 2 overflow interrupt */ + LPIT0_Ch3_IRQn = 51u, /**< LPIT0 channel 3 overflow interrupt */ + PDB0_IRQn = 52u, /**< PDB0 interrupt */ + SCG_IRQn = 57u, /**< SCG bus interrupt request */ + LPTMR0_IRQn = 58u, /**< LPTIMER interrupt request */ + PORTA_IRQn = 59u, /**< Port A pin detect interrupt */ + PORTB_IRQn = 60u, /**< Port B pin detect interrupt */ + PORTC_IRQn = 61u, /**< Port C pin detect interrupt */ + PORTD_IRQn = 62u, /**< Port D pin detect interrupt */ + PORTE_IRQn = 63u, /**< Port E pin detect interrupt */ + SWI_IRQn = 64u, /**< Software interrupt */ + PDB1_IRQn = 68u, /**< PDB1 interrupt */ + FLEXIO_IRQn = 69u, /**< FlexIO Interrupt */ + CAN0_ORed_IRQn = 78u, /**< CAN0 OR'ed [Bus Off OR Transmit Warning OR Receive Warning] */ + CAN0_Error_IRQn = 79u, /**< CAN0 Interrupt indicating that errors were detected on the CAN bus */ + CAN0_Wake_Up_IRQn = 80u, /**< CAN0 Interrupt asserted when Pretended Networking operation is enabled, and a valid message matches the selected filter criteria during Low Power mode */ + CAN0_ORed_0_15_MB_IRQn = 81u, /**< CAN0 OR'ed Message buffer (0-15) */ + CAN0_ORed_16_31_MB_IRQn = 82u, /**< CAN0 OR'ed Message buffer (16-31) */ + CAN1_ORed_IRQn = 85u, /**< CAN1 OR'ed [Bus Off OR Transmit Warning OR Receive Warning] */ + CAN1_Error_IRQn = 86u, /**< CAN1 Interrupt indicating that errors were detected on the CAN bus */ + CAN1_ORed_0_15_MB_IRQn = 88u, /**< CAN1 OR'ed Interrupt for Message buffer (0-15) */ + CAN2_ORed_IRQn = 92u, /**< CAN2 OR'ed [Bus Off OR Transmit Warning OR Receive Warning] */ + CAN2_Error_IRQn = 93u, /**< CAN2 Interrupt indicating that errors were detected on the CAN bus */ + CAN2_ORed_0_15_MB_IRQn = 95u, /**< CAN2 OR'ed Message buffer (0-15) */ + FTM0_Ch0_Ch1_IRQn = 99u, /**< FTM0 Channel 0 and 1 interrupt */ + FTM0_Ch2_Ch3_IRQn = 100u, /**< FTM0 Channel 2 and 3 interrupt */ + FTM0_Ch4_Ch5_IRQn = 101u, /**< FTM0 Channel 4 and 5 interrupt */ + FTM0_Ch6_Ch7_IRQn = 102u, /**< FTM0 Channel 6 and 7 interrupt */ + FTM0_Fault_IRQn = 103u, /**< FTM0 Fault interrupt */ + FTM0_Ovf_Reload_IRQn = 104u, /**< FTM0 Counter overflow and Reload interrupt */ + FTM1_Ch0_Ch1_IRQn = 105u, /**< FTM1 Channel 0 and 1 interrupt */ + FTM1_Ch2_Ch3_IRQn = 106u, /**< FTM1 Channel 2 and 3 interrupt */ + FTM1_Ch4_Ch5_IRQn = 107u, /**< FTM1 Channel 4 and 5 interrupt */ + FTM1_Ch6_Ch7_IRQn = 108u, /**< FTM1 Channel 6 and 7 interrupt */ + FTM1_Fault_IRQn = 109u, /**< FTM1 Fault interrupt */ + FTM1_Ovf_Reload_IRQn = 110u, /**< FTM1 Counter overflow and Reload interrupt */ + FTM2_Ch0_Ch1_IRQn = 111u, /**< FTM2 Channel 0 and 1 interrupt */ + FTM2_Ch2_Ch3_IRQn = 112u, /**< FTM2 Channel 2 and 3 interrupt */ + FTM2_Ch4_Ch5_IRQn = 113u, /**< FTM2 Channel 4 and 5 interrupt */ + FTM2_Ch6_Ch7_IRQn = 114u, /**< FTM2 Channel 6 and 7 interrupt */ + FTM2_Fault_IRQn = 115u, /**< FTM2 Fault interrupt */ + FTM2_Ovf_Reload_IRQn = 116u, /**< FTM2 Counter overflow and Reload interrupt */ + FTM3_Ch0_Ch1_IRQn = 117u, /**< FTM3 Channel 0 and 1 interrupt */ + FTM3_Ch2_Ch3_IRQn = 118u, /**< FTM3 Channel 2 and 3 interrupt */ + FTM3_Ch4_Ch5_IRQn = 119u, /**< FTM3 Channel 4 and 5 interrupt */ + FTM3_Ch6_Ch7_IRQn = 120u, /**< FTM3 Channel 6 and 7 interrupt */ + FTM3_Fault_IRQn = 121u, /**< FTM3 Fault interrupt */ + FTM3_Ovf_Reload_IRQn = 122u /**< FTM3 Counter overflow and Reload interrupt */ +} IRQn_Type; + +/*! + * @} + */ /* end of group Interrupt_vector_numbers_S32K144 */ + + +/* ---------------------------------------------------------------------------- + -- Device Peripheral Access Layer for S32K144 + ---------------------------------------------------------------------------- */ + +/*! + * @addtogroup Peripheral_access_layer_S32K144 Device Peripheral Access Layer for S32K144 + * @{ + */ + +/* @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 (2u) + + +/* ADC - Peripheral instance base addresses */ +/** Peripheral ADC0 base address */ +#define ADC0_BASE (0x4003B000u) +/** Peripheral ADC0 base pointer */ +#define ADC0 ((ADC_Type *)ADC0_BASE) +/** Peripheral ADC1 base address */ +#define ADC1_BASE (0x40027000u) +/** Peripheral ADC1 base pointer */ +#define ADC1 ((ADC_Type *)ADC1_BASE) +/** Array initializer of ADC peripheral base addresses */ +#define ADC_BASE_ADDRS { ADC0_BASE, ADC1_BASE } +/** Array initializer of ADC peripheral base pointers */ +#define ADC_BASE_PTRS { ADC0, ADC1 } + /** 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, ADC1_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))< 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) + +/* 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, LPUART2_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 + +/* LPSPI module features */ + +/* @brief DMA instance used for LPSPI module */ +#define LPSPI_DMA_INSTANCE 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} + +/* Interrupt module features */ + +/* @brief Lowest interrupt request number. */ +#define FEATURE_INTERRUPT_IRQ_MIN (NonMaskableInt_IRQn) +/* @brief Highest interrupt request number. */ +#define FEATURE_INTERRUPT_IRQ_MAX (FTM3_Ovf_Reload_IRQn) +/**< Number of priority bits implemented in the NVIC */ +#define FEATURE_NVIC_PRIO_BITS (4U) +/* @brief Has software interrupt. */ +#define FEATURE_INTERRUPT_HAS_SOFTWARE_IRQ (0u) +/* @brief Has pending interrupt state. */ +#define FEATURE_INTERRUPT_HAS_PENDING_STATE (1u) +/* @brief Has active interrupt state. */ +#define FEATURE_INTERRUPT_HAS_ACTIVE_STATE (1u) +/* @brief Multicore support for interrupts */ +#define FEATURE_INTERRUPT_MULTICORE_SUPPORT (0u) +/* @brief Registers in which the start of interrupt vector table needs to be configured */ +#define FEATURE_INTERRUPT_INT_VECTORS {&S32_SCB->VTOR} + + +/* System Control Block module features */ + +/* @brief VECTKEY value so that AIRCR register write is not ignored. */ +#define FEATURE_SCB_VECTKEY (0x05FAU) + + +/* SMC module features */ + +/* @brief Has stop option (register bit STOPCTRL[STOPO]). */ +#define FEATURE_SMC_HAS_STOPO (1U) +/* @brief Has partial stop option (register bit STOPCTRL[PSTOPO]). */ +#define FEATURE_SMC_HAS_PSTOPO (0U) +/* @brief Has WAIT and VLPW options. */ +#define FEATURE_SMC_HAS_WAIT_VLPW (0U) +/* @brief Has high speed run mode (register bit PMPROT[AHSRUN]). */ +#define FEATURE_SMC_HAS_HIGH_SPEED_RUN_MODE (1U) +/* @brief Value of SPLL source clock in the SCG_HCCR register */ +#define FEATURE_SCG_SPLL_VALUE (6U) +/* RCM module feature */ + +/* @brief Has existence of CMU loss of clock as reset source */ +#define FEATURE_RCM_HAS_EXISTENCE_CMU_LOSS_OF_CLOCK (0) +/* @brief Has CMU loss of clock as reset source */ +#define FEATURE_RCM_HAS_CMU_LOSS_OF_CLOCK (0) +/* @brief Has sticky CMU loss of clock as reset source */ +#define FEATURE_RCM_HAS_STICKY_CMU_LOSS_OF_CLOCK (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 S32K14x). +*/ +#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 S32K14x). +*/ +#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 S32K14x). +*/ +#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 S32K14x). +*/ +#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 (4U) +/* @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 back door. */ +#define FEATURE_MPU_SLAVE_SRAM_BACKDOOR (1U) +/* @brief The MPU Slave Port Assignment for SRAM_L front door. */ +#define FEATURE_MPU_SLAVE_SRAM_L_FRONTDOOR (2U) +/* @brief The MPU Slave Port Assignment for SRAM_U front door. */ +#define FEATURE_MPU_SLAVE_SRAM_U_FRONTDOOR (3U) +/* @brief The MPU Slave Port mask. */ +#define FEATURE_MPU_SLAVE_MASK (0xF0000000U) +#define FEATURE_MPU_SLAVE_SHIFT (28u) +#define FEATURE_MPU_SLAVE_WIDTH (4u) +#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 transfer size: */ +#define FEATURE_DMA_TRANSFER_SIZE_16B +#define FEATURE_DMA_TRANSFER_SIZE_32B + +/* DMAMUX module features */ + +/* @brief DMAMUX peripheral is available in silicon. */ +#define FEATURE_DMAMUX_AVAILABLE +/* @brief Number of DMA channels. */ +#define FEATURE_DMAMUX_CHANNELS (16U) +/* @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_LPUART2_RX = 6U, + EDMA_REQ_LPUART2_TX = 7U, + 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_LPSPI2_RX = 18U, + EDMA_REQ_LPSPI2_TX = 19U, + 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_FTM2_CHANNEL_0 = 28U, + EDMA_REQ_FTM2_CHANNEL_1 = 29U, + EDMA_REQ_FTM2_CHANNEL_2 = 30U, + EDMA_REQ_FTM2_CHANNEL_3 = 31U, + EDMA_REQ_FTM2_CHANNEL_4 = 32U, + EDMA_REQ_FTM2_CHANNEL_5 = 33U, + EDMA_REQ_FTM2_CHANNEL_6 = 34U, + EDMA_REQ_FTM2_CHANNEL_7 = 35U, + EDMA_REQ_FTM0_OR_CH0_CH7 = 36U, + EDMA_REQ_FTM3_OR_CH0_CH7 = 37U, + EDMA_REQ_ADC0 = 42U, + EDMA_REQ_ADC1 = 43U, + EDMA_REQ_LPI2C0_RX = 44U, + EDMA_REQ_LPI2C0_TX = 45U, + EDMA_REQ_PDB0 = 46U, + EDMA_REQ_PDB1 = 47U, + 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_FLEXCAN1 = 55U, + EDMA_REQ_FLEXCAN2 = 56U, + EDMA_REQ_LPTMR0 = 59U, + EDMA_REQ_DMAMUX_ALWAYS_ENABLED0 = 62U, + EDMA_REQ_DMAMUX_ALWAYS_ENABLED1 = 63U +} dma_request_source_t; + +/* LPI2C module features */ + +/* @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) + +/* 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 (0U) +/*! @brief Number of interrupt vector for channels of the FTM module. */ +#define FEATURE_FTM_HAS_NUM_IRQS_CHANS (4U) + +/* EWM module features */ + +/* @brief First byte of the EWM Service key */ +#define FEATURE_EWM_KEY_FIRST_BYTE (0xB4U) +/* @brief Second byte of the EWM Service key */ +#define FEATURE_EWM_KEY_SECOND_BYTE (0x2CU) +/* @brief EWM Compare High register maximum value */ +#define FEATURE_EWM_CMPH_MAX_VALUE (0xFEU) +/* @brief EWM Compare Low register minimum value */ +#define FEATURE_EWM_CMPL_MIN_VALUE (0x00U) + +/* @brief Supports high speed run mode. */ +#define FEATURE_HAS_HIGH_SPEED_RUN_MODE (1U) +/* @brief Supports SPLL clock source. */ +#define FEATURE_HAS_SPLL_CLK (1U) + +/*! @brief Clock names. */ +typedef enum { + + /* Main clocks */ + CORE_CLK = 0u, /*!< Core clock */ + BUS_CLK = 1u, /*!< Bus clock */ + SLOW_CLK = 2u, /*!< Slow clock */ + CLKOUT_CLK = 3u, /*!< CLKOUT clock */ + + /* Other internal clocks used by peripherals. */ + SIRC_CLK = 4u, /*!< SIRC clock */ + FIRC_CLK = 5u, /*!< FIRC clock */ + SOSC_CLK = 6u, /*!< SOSC clock */ + SPLL_CLK = 7u, /*!< SPLL clock */ + RTC_CLKIN_CLK = 8u, /*!< RTC_CLKIN clock */ + SCG_CLKOUT_CLK = 9u, /*!< SCG CLK_OUT clock */ + + SIRCDIV1_CLK = 10u, /*!< SIRCDIV1 functional clock */ + SIRCDIV2_CLK = 11u, /*!< SIRCDIV2 functional clock */ + FIRCDIV1_CLK = 12u, /*!< FIRCDIV1 functional clock */ + FIRCDIV2_CLK = 13u, /*!< FIRCDIV2 functional clock */ + SOSCDIV1_CLK = 14u, /*!< SOSCDIV1 functional clock */ + SOSCDIV2_CLK = 15u, /*!< SOSCDIV2 functional clock */ + SPLLDIV1_CLK = 16u, /*!< SPLLDIV1 functional clock */ + SPLLDIV2_CLK = 17u, /*!< SPLLDIV2 functional clock */ + + SCG_END_OF_CLOCKS = 18u, /*!< End of SCG clocks */ + + /* SIM clocks */ + SIM_FTM0_CLOCKSEL = 21u, /*!< FTM0 External Clock Pin Select */ + SIM_FTM1_CLOCKSEL = 22u, /*!< FTM1 External Clock Pin Select */ + SIM_FTM2_CLOCKSEL = 23u, /*!< FTM2 External Clock Pin Select */ + SIM_FTM3_CLOCKSEL = 24u, /*!< FTM3 External Clock Pin Select */ + SIM_CLKOUTSELL = 25u, /*!< CLKOUT Select */ + SIM_RTCCLK_CLK = 26u, /*!< RTCCLK clock */ + SIM_LPO_CLK = 27u, /*!< LPO clock */ + SIM_LPO_1K_CLK = 28u, /*!< LPO 1KHz clock */ + SIM_LPO_32K_CLK = 29u, /*!< LPO 32KHz clock */ + SIM_LPO_128K_CLK = 30u, /*!< LPO 128KHz clock */ + SIM_EIM_CLK = 31u, /*!< EIM clock source */ + SIM_ERM_CLK = 32u, /*!< ERM clock source */ + SIM_DMA_CLK = 33u, /*!< DMA clock source */ + SIM_MPU_CLK = 34u, /*!< MPU clock source */ + SIM_MSCM_CLK = 35u, /*!< MSCM clock source */ + SIM_END_OF_CLOCKS = 36u, /*!< End of SIM clocks */ + + /* PCC clocks */ + CMP0_CLK = 41u, /*!< CMP0 clock source */ + CRC0_CLK = 42u, /*!< CRC0 clock source */ + DMAMUX0_CLK = 43u, /*!< DMAMUX0 clock source */ + EWM0_CLK = 44u, /*!< EWM0 clock source */ + PORTA_CLK = 45u, /*!< PORTA clock source */ + PORTB_CLK = 46u, /*!< PORTB clock source */ + PORTC_CLK = 47u, /*!< PORTC clock source */ + PORTD_CLK = 48u, /*!< PORTD clock source */ + PORTE_CLK = 49u, /*!< PORTE clock source */ + RTC0_CLK = 50u, /*!< RTC0 clock source */ + PCC_END_OF_BUS_CLOCKS = 51u, /*!< End of BUS clocks */ + FlexCAN0_CLK = 52u, /*!< FlexCAN0 clock source */ + FlexCAN1_CLK = 53u, /*!< FlexCAN1 clock source */ + FlexCAN2_CLK = 54u, /*!< FlexCAN2 clock source */ + PDB0_CLK = 55u, /*!< PDB0 clock source */ + PDB1_CLK = 56u, /*!< PDB1 clock source */ + PCC_END_OF_SYS_CLOCKS = 57u, /*!< End of SYS clocks */ + FTFC0_CLK = 58u, /*!< FTFC0 clock source */ + PCC_END_OF_SLOW_CLOCKS = 59u, /*!< End of SLOW clocks */ + FTM0_CLK = 60u, /*!< FTM0 clock source */ + FTM1_CLK = 61u, /*!< FTM1 clock source */ + FTM2_CLK = 62u, /*!< FTM2 clock source */ + FTM3_CLK = 63u, /*!< FTM3 clock source */ + PCC_END_OF_ASYNCH_DIV1_CLOCKS= 64u, /*!< End of ASYNCH DIV1 clocks */ + ADC0_CLK = 65u, /*!< ADC0 clock source */ + ADC1_CLK = 66u, /*!< ADC1 clock source */ + FLEXIO0_CLK = 67u, /*!< FLEXIO0 clock source */ + LPI2C0_CLK = 68u, /*!< LPI2C0 clock source */ + LPIT0_CLK = 69u, /*!< LPIT0 clock source */ + LPSPI0_CLK = 70u, /*!< LPSPI0 clock source */ + LPSPI1_CLK = 71u, /*!< LPSPI1 clock source */ + LPSPI2_CLK = 72u, /*!< LPSPI2 clock source */ + LPTMR0_CLK = 73u, /*!< LPTMR0 clock source */ + LPUART0_CLK = 74u, /*!< LPUART0 clock source */ + LPUART1_CLK = 75u, /*!< LPUART1 clock source */ + LPUART2_CLK = 76u, /*!< LPUART2 clock source */ + PCC_END_OF_ASYNCH_DIV2_CLOCKS= 77u, /*!< End of ASYNCH DIV2 clocks */ + PCC_END_OF_CLOCKS = 78u, /*!< End of PCC clocks */ + CLOCK_NAME_COUNT = 79u, /*!< The total number of entries */ +} clock_names_t; + +#define PCC_INVALID_INDEX 0 + + /*! @brief PCC clock name mappings + * Mappings between clock names and peripheral clock control indexes. + * If there is no peripheral clock control index for a clock name, + * then the corresponding value is PCC_INVALID_INDEX. + */ +#define PCC_CLOCK_NAME_MAPPINGS \ +{ \ +PCC_INVALID_INDEX, /*!< Core clock 0 */ \ +PCC_INVALID_INDEX, /*!< Bus clock 1 */ \ +PCC_INVALID_INDEX, /*!< Slow clock 2 */ \ +PCC_INVALID_INDEX, /*!< CLKOUT clock 3 */ \ +PCC_INVALID_INDEX, /*!< SIRC clock 4 */ \ +PCC_INVALID_INDEX, /*!< FIRC clock 5 */ \ +PCC_INVALID_INDEX, /*!< SOSC clock 6 */ \ +PCC_INVALID_INDEX, /*!< SPLL clock 7 */ \ +PCC_INVALID_INDEX, /*!< RTC_CLKIN clock 8 */ \ +PCC_INVALID_INDEX, /*!< SCG CLK_OUT clock 9 */ \ +PCC_INVALID_INDEX, /*!< SIRCDIV1 functional clock 10 */ \ +PCC_INVALID_INDEX, /*!< SIRCDIV2 functional clock 11 */ \ +PCC_INVALID_INDEX, /*!< FIRCDIV1 functional clock 12 */ \ +PCC_INVALID_INDEX, /*!< FIRCDIV2 functional clock 13 */ \ +PCC_INVALID_INDEX, /*!< SOSCDIV1 functional clock 14 */ \ +PCC_INVALID_INDEX, /*!< SOSCDIV2 functional clock 15 */ \ +PCC_INVALID_INDEX, /*!< SPLLDIV1 functional clock 16 */ \ +PCC_INVALID_INDEX, /*!< SPLLDIV2 functional clock 17 */ \ +PCC_INVALID_INDEX, /*!< End of SCG clocks 18 */ \ +PCC_INVALID_INDEX, /*!< No clock entry in clock_names_t 19 */ \ +PCC_INVALID_INDEX, /*!< No clock entry in clock_names_t 20 */ \ +PCC_INVALID_INDEX, /*!< FTM0 External Clock Pin Select 21 */ \ +PCC_INVALID_INDEX, /*!< FTM1 External Clock Pin Select 22 */ \ +PCC_INVALID_INDEX, /*!< FTM2 External Clock Pin Select 23 */ \ +PCC_INVALID_INDEX, /*!< FTM3 External Clock Pin Select 24 */ \ +PCC_INVALID_INDEX, /*!< CLKOUT Select 25 */ \ +PCC_INVALID_INDEX, /*!< CLK32K clock 26 */ \ +PCC_INVALID_INDEX, /*!< LPO clock 27 */ \ +PCC_INVALID_INDEX, /*!< LPO 1KHz clock 28 */ \ +PCC_INVALID_INDEX, /*!< LPO 32KHz clock 29 */ \ +PCC_INVALID_INDEX, /*!< LPO 128KHz clock 30 */ \ +PCC_INVALID_INDEX, /*!< EIM clock source 31 */ \ +PCC_INVALID_INDEX, /*!< ERM clock source 32 */ \ +PCC_INVALID_INDEX, /*!< DMA clock source 33 */ \ +PCC_INVALID_INDEX, /*!< MPU clock source 34 */ \ +PCC_INVALID_INDEX, /*!< MSCM clock source 35 */ \ +PCC_INVALID_INDEX, /*!< No clock entry in clock_names_t 36 */ \ +PCC_INVALID_INDEX, /*!< No clock entry in clock_names_t 37 */ \ +PCC_INVALID_INDEX, /*!< No clock entry in clock_names_t 38 */ \ +PCC_INVALID_INDEX, /*!< No clock entry in clock_names_t 39 */ \ +PCC_INVALID_INDEX, /*!< No clock entry in clock_names_t 40 */ \ +PCC_CMP0_INDEX, /*!< CMP0 clock source 41 */ \ +PCC_CRC_INDEX, /*!< CRC clock source 42 */ \ +PCC_DMAMUX_INDEX, /*!< DMAMUX clock source 43 */ \ +PCC_EWM_INDEX, /*!< EWM clock source 44 */ \ +PCC_PORTA_INDEX, /*!< PORTA clock source 45 */ \ +PCC_PORTB_INDEX, /*!< PORTB clock source 46 */ \ +PCC_PORTC_INDEX, /*!< PORTC clock source 47 */ \ +PCC_PORTD_INDEX, /*!< PORTD clock source 48 */ \ +PCC_PORTE_INDEX, /*!< PORTE clock source 49 */ \ +PCC_RTC_INDEX, /*!< RTC clock source 50 */ \ +PCC_INVALID_INDEX, /*!< End of BUS clocks 51 */ \ +PCC_FlexCAN0_INDEX, /*!< FlexCAN0 clock source 52 */ \ +PCC_FlexCAN1_INDEX, /*!< FlexCAN1 clock source 53 */ \ +PCC_FlexCAN2_INDEX, /*!< FlexCAN2 clock source 54 */ \ +PCC_PDB0_INDEX, /*!< PDB0 clock source 55 */ \ +PCC_PDB1_INDEX, /*!< PDB1 clock source 56 */ \ +PCC_INVALID_INDEX, /*!< End of SYS clocks 57 */ \ +PCC_FTFC_INDEX, /*!< FTFC clock source 58 */ \ +PCC_INVALID_INDEX, /*!< End of SLOW clocks 59 */ \ +PCC_FTM0_INDEX, /*!< FTM0 clock source 60 */ \ +PCC_FTM1_INDEX, /*!< FTM1 clock source 61 */ \ +PCC_FTM2_INDEX, /*!< FTM2 clock source 62 */ \ +PCC_FTM3_INDEX, /*!< FTM3 clock source 63 */ \ +PCC_INVALID_INDEX, /*!< End of ASYNCH DIV1 clocks 64 */ \ +PCC_ADC0_INDEX, /*!< ADC0 clock source 65 */ \ +PCC_ADC1_INDEX, /*!< ADC1 clock source 66 */ \ +PCC_FlexIO_INDEX, /*!< FLEXIO clock source 67 */ \ +PCC_LPI2C0_INDEX, /*!< LPI2C0 clock source 68 */ \ +PCC_LPIT_INDEX, /*!< LPIT clock source 69 */ \ +PCC_LPSPI0_INDEX, /*!< LPSPI0 clock source 70 */ \ +PCC_LPSPI1_INDEX, /*!< LPSPI1 clock source 71 */ \ +PCC_LPSPI2_INDEX, /*!< LPSPI2 clock source 72 */ \ +PCC_LPTMR0_INDEX, /*!< LPTMR0 clock source 73 */ \ +PCC_LPUART0_INDEX, /*!< LPUART0 clock source 74 */ \ +PCC_LPUART1_INDEX, /*!< LPUART1 clock source 75 */ \ +PCC_LPUART2_INDEX, /*!< LPUART2 clock source 76 */ \ +PCC_INVALID_INDEX, /*!< End of ASYNCH DIV2 clocks 77 */ \ +PCC_INVALID_INDEX, /*!< End of PCC clocks 78 */ \ +} + +/*! @brief Peripheral instance features + * List of features that are supported by a peripheral instance + */ +#define NO_PERIPHERAL_FEATURE (0U) /* It's not a peripheral instance, there is no peripheral feature. */ +#define HAS_CLOCK_GATING_IN_SIM (1U << 0U) /* Clock gating is implemented in SIM (it's not in PCC) */ +#define HAS_MULTIPLIER (1U << 1U) /* Multiplier is implemented in PCC */ +#define HAS_DIVIDER (1U << 2U) /* Divider is implemented in PCC */ +#define HAS_PROTOCOL_CLOCK_FROM_ASYNC1 (1U << 3U) /* Functional clock source is provided by the first asynchronous clock. */ +#define HAS_PROTOCOL_CLOCK_FROM_ASYNC2 (1U << 4U) /* Functional clock source is provided by the second asynchronous clock. */ +#define HAS_INT_CLOCK_FROM_BUS_CLOCK (1U << 5U) /* Interface clock is provided by the bus clock. */ +#define HAS_INT_CLOCK_FROM_SYS_CLOCK (1U << 6U) /* Interface clock is provided by the sys clock. */ +#define HAS_INT_CLOCK_FROM_SLOW_CLOCK (1U << 7U) /* Interface clock is provided by the slow clock. */ + +/*! @brief Peripheral features. +* List of features for each clock name. If a clock name is not +* a peripheral, no feature is supported. +*/ +#define PERIPHERAL_FEATURES \ +{ \ +(NO_PERIPHERAL_FEATURE), /*!< Core clock 0 */ \ +(NO_PERIPHERAL_FEATURE), /*!< Bus clock 1 */ \ +(NO_PERIPHERAL_FEATURE), /*!< Slow clock 2 */ \ +(NO_PERIPHERAL_FEATURE), /*!< CLKOUT clock 3 */ \ +(NO_PERIPHERAL_FEATURE), /*!< SIRC clock 4 */ \ +(NO_PERIPHERAL_FEATURE), /*!< FIRC clock 5 */ \ +(NO_PERIPHERAL_FEATURE), /*!< SOSC clock 6 */ \ +(NO_PERIPHERAL_FEATURE), /*!< SPLL clock 7 */ \ +(NO_PERIPHERAL_FEATURE), /*!< RTC_CLKIN clock 8 */ \ +(NO_PERIPHERAL_FEATURE), /*!< SCG CLK_OUT clock 9 */ \ +(NO_PERIPHERAL_FEATURE), /*!< End of SCG clocks 10 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 11 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 12 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 13 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 14 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 15 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 16 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 17 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 18 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 19 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 20 */ \ +(NO_PERIPHERAL_FEATURE), /*!< FTM0 External Clock Pin Select 21 */ \ +(NO_PERIPHERAL_FEATURE), /*!< FTM1 External Clock Pin Select 22 */ \ +(NO_PERIPHERAL_FEATURE), /*!< FTM2 External Clock Pin Select 23 */ \ +(NO_PERIPHERAL_FEATURE), /*!< FTM3 External Clock Pin Select 24 */ \ +(NO_PERIPHERAL_FEATURE), /*!< CLKOUT Select 25 */ \ +(NO_PERIPHERAL_FEATURE), /*!< CLK32K clock 26 */ \ +(NO_PERIPHERAL_FEATURE), /*!< LPO clock 27 */ \ +(NO_PERIPHERAL_FEATURE), /*!< LPO 1KHz clock 28 */ \ +(NO_PERIPHERAL_FEATURE), /*!< LPO 32KHz clock 29 */ \ +(NO_PERIPHERAL_FEATURE), /*!< LPO 128KHz clock 30 */ \ +(HAS_CLOCK_GATING_IN_SIM | HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< EIM clock source 31 */ \ +(HAS_CLOCK_GATING_IN_SIM | HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< ERM clock source 32 */ \ +(HAS_CLOCK_GATING_IN_SIM | HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< DMA clock source 33 */ \ +(HAS_CLOCK_GATING_IN_SIM | HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< MPU clock source 34 */ \ +(HAS_CLOCK_GATING_IN_SIM | HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< MSCM clock source 35 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 36 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 37 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 38 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 39 */ \ +(NO_PERIPHERAL_FEATURE), /*!< No clock entry in clock_names_t 40 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< CMP0 clock source 41 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< CRC clock source 42 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< DMAMUX clock source 43 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< EWM clock source 44 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< PORTA clock source 45 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< PORTB clock source 46 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< PORTC clock source 47 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< PORTD clock source 48 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< PORTE clock source 49 */ \ +(HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< RTC clock source 50 */ \ +(NO_PERIPHERAL_FEATURE), /*!< End of BUS clocks 51 */ \ +(HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< FlexCAN0 clock source 52 */ \ +(HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< FlexCAN1 clock source 53 */ \ +(HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< FlexCAN2 clock source 54 */ \ +(HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< PDB0 clock source 55 */ \ +(HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< PDB1 clock source 56 */ \ +(NO_PERIPHERAL_FEATURE), /*!< End of SYS clocks 57 */ \ +(HAS_INT_CLOCK_FROM_SLOW_CLOCK), /*!< FTFC clock source 58 */ \ +(NO_PERIPHERAL_FEATURE), /*!< End of SLOW clocks 59 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC1 | HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< FTM0 clock source 60 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC1 | HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< FTM1 clock source 61 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC1 | HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< FTM2 clock source 62 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC1 | HAS_INT_CLOCK_FROM_SYS_CLOCK), /*!< FTM3 clock source 63 */ \ +(NO_PERIPHERAL_FEATURE), /*!< End of ASYNCH DIV1 clocks 64 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< ADC0 clock source 65 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< ADC1 clock source 66 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< FLEXIO clock source 67 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< LPI2C0 clock source 68 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< LPIT clock source 69 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< LPSPI0 clock source 70 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< LPSPI1 clock source 71 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< LPSPI2 clock source 72 */ \ +(HAS_MULTIPLIER | HAS_DIVIDER | HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< LPTMR0 clock source 73 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< LPUART0 clock source 74 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< LPUART1 clock source 75 */ \ +(HAS_PROTOCOL_CLOCK_FROM_ASYNC2 | HAS_INT_CLOCK_FROM_BUS_CLOCK), /*!< LPUART2 clock source 76 */ \ +(NO_PERIPHERAL_FEATURE), /*!< End of ASYNCH DIV2 clocks 77 */ \ +(NO_PERIPHERAL_FEATURE), /*!< End of PCC clocks 78 */ \ +} + +/* Time to wait for SIRC to stabilize (number of + * cycles when core runs at maximum speed - 112 MHz */ +#define SIRC_STABILIZATION_TIMEOUT 100U + +/* Time to wait for FIRC to stabilize (number of + * cycles when core runs at maximum speed - 112 MHz */ +#define FIRC_STABILIZATION_TIMEOUT 20U + +/* Time to wait for SOSC to stabilize (number of + * cycles when core runs at maximum speed - 112 MHz */ +#define SOSC_STABILIZATION_TIMEOUT 3205000U; + +/* Time to wait for SPLL to stabilize (number of + * cycles when core runs at maximum speed - 112 MHz */ +#define SPLL_STABILIZATION_TIMEOUT 1000U; + + +/*! @brief Temporary system clock source configurations. + * Each line represents the SYS(CORE), BUS and SLOW(FLASH) dividers + * for SIRC, FIRC, SOSC and SPLL clock sources. + * + * SYS_CLK BUS_CLK SLOW_CLK + * SIRC * * * + * FIRC * * * + * SOSC * * * + * SPLL * * * + */ +#define TMP_SIRC_CLK 0U +#define TMP_FIRC_CLK 1U +#define TMP_SOSC_CLK 2U +#define TMP_SPLL_CLK 3U + +#define TMP_SYS_DIV 0U +#define TMP_BUS_DIV 1U +#define TMP_SLOW_DIV 2U + +#define TMP_SYS_CLK_NO 4U +#define TMP_SYS_DIV_NO 3U + +#define TMP_SYSTEM_CLOCK_CONFIGS \ +{ /* SYS_CLK BUS_CLK SLOW_CLK */ \ +{ SCG_SYSTEM_CLOCK_DIV_BY_1, SCG_SYSTEM_CLOCK_DIV_BY_1, SCG_SYSTEM_CLOCK_DIV_BY_2}, /*!< Dividers for SIRC */ \ +{ SCG_SYSTEM_CLOCK_DIV_BY_1, SCG_SYSTEM_CLOCK_DIV_BY_2, SCG_SYSTEM_CLOCK_DIV_BY_4}, /*!< Dividers for FIRC */ \ +{ SCG_SYSTEM_CLOCK_DIV_BY_1, SCG_SYSTEM_CLOCK_DIV_BY_2, SCG_SYSTEM_CLOCK_DIV_BY_2}, /*!< Dividers for SOSC */ \ +{ SCG_SYSTEM_CLOCK_DIV_BY_3, SCG_SYSTEM_CLOCK_DIV_BY_2, SCG_SYSTEM_CLOCK_DIV_BY_2}, /*!< Dividers for SPLL */ \ +} + +/* Do not use the old names of the renamed symbols */ +/* #define DO_NOT_USE_DEPRECATED_SYMBOLS */ + +/*! START !DO_NOT_USE_DEPRECATED_SYMBOLS + * These symbols have been renamed. + * The old names (deprecated symbols) + * are defined for backward compatibility. + */ +#if !defined(DO_NOT_USE_DEPRECATED_SYMBOLS) +#define CORE_CLOCK CORE_CLK +#define BUS_CLOCK BUS_CLK +#define SLOW_CLOCK SLOW_CLK +#define CLKOUT_CLOCK CLKOUT_CLK +#define SIRC_CLOCK SIRC_CLK +#define FIRC_CLOCK FIRC_CLK +#define SOSC_CLOCK SOSC_CLK +#define SPLL_CLOCK SPLL_CLK +#define RTC_CLKIN_CLOCK RTC_CLKIN_CLK +#define SCG_CLKOUT_CLOCK SCG_CLKOUT_CLK +#define SIM_RTCCLK_CLOCK SIM_RTCCLK_CLK +#define SIM_LPO_CLOCK SIM_LPO_CLK +#define SIM_LPO_1K_CLOCK SIM_LPO_1K_CLK +#define SIM_LPO_32K_CLOCK SIM_LPO_32K_CLK +#define SIM_LPO_128K_CLOCK SIM_LPO_128K_CLK +#define SIM_EIM_CLOCK SIM_EIM_CLK +#define SIM_ERM_CLOCK SIM_ERM_CLK +#define SIM_DMA_CLOCK SIM_DMA_CLK +#define SIM_MPU_CLOCK SIM_MPU_CLK +#define SIM_MSCM_CLOCK SIM_MSCM_CLK +#define PCC_DMAMUX0_CLOCK DMAMUX0_CLK +#define PCC_CRC0_CLOCK CRC0_CLK +#define PCC_RTC0_CLOCK RTC0_CLK +#define PCC_PORTA_CLOCK PORTA_CLK +#define PCC_PORTB_CLOCK PORTB_CLK +#define PCC_PORTC_CLOCK PORTC_CLK +#define PCC_PORTD_CLOCK PORTD_CLK +#define PCC_PORTE_CLOCK PORTE_CLK +#define PCC_EWM0_CLOCK EWM0_CLK +#define PCC_CMP0_CLOCK CMP0_CLK +#define PCC_FlexCAN0_CLOCK FlexCAN0_CLK +#define PCC_FlexCAN1_CLOCK FlexCAN1_CLK +#define PCC_FlexCAN2_CLOCK FlexCAN2_CLK +#define PCC_PDB1_CLOCK PDB1_CLK +#define PCC_PDB0_CLOCK PDB0_CLK +#define PCC_FTFC0_CLOCK FTFC0_CLK +#define PCC_FTM0_CLOCK FTM0_CLK +#define PCC_FTM1_CLOCK FTM1_CLK +#define PCC_FTM2_CLOCK FTM2_CLK +#define PCC_FTM3_CLOCK FTM3_CLK +#define PCC_ADC1_CLOCK ADC1_CLK +#define PCC_LPSPI0_CLOCK LPSPI0_CLK +#define PCC_LPSPI1_CLOCK LPSPI1_CLK +#define PCC_LPSPI2_CLOCK LPSPI2_CLK +#define PCC_LPIT0_CLOCK LPIT0_CLK +#define PCC_ADC0_CLOCK ADC0_CLK +#define PCC_LPTMR0_CLOCK LPTMR0_CLK +#define PCC_FLEXIO0_CLOCK FLEXIO0_CLK +#define PCC_LPI2C0_CLOCK LPI2C0_CLK +#define PCC_LPUART0_CLOCK LPUART0_CLK +#define PCC_LPUART1_CLOCK LPUART1_CLK +#define PCC_LPUART2_CLOCK LPUART2_CLK +#endif /* !DO_NOT_USE_DEPRECATED_SYMBOLS */ + + +/* 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) + + +/* 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) + +/*! @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, ADC1_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) + +/* LPIT module features */ + +/*! @brief Number of interrupt vector for channels of the LPIT module. */ +#define FEATURE_LPIT_HAS_NUM_IRQS_CHANS (4U) +/*! @brief Clock names for LPIT. */ +#define LPIT_CLOCK_NAMES {LPIT0_CLK} + +/* 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) + +/* 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 */ + +/* LPSPI module features */ +/* @brief Initial value for state structure */ +#define FEATURE_LPSPI_STATE_STRUCTURES_NULL {NULL, NULL, NULL} +/* @brief Clock indexes for LPSPI clock */ +#define FEATURE_LPSPI_CLOCKS_NAMES {LPSPI0_CLK, LPSPI1_CLK, LPSPI2_CLK}; + +/* LPTMR module features */ + +/* @brief LPTMR pulse counter input options */ +#define FEATURE_LPTMR_HAS_INPUT_ALT1_SELECTION (1U) + +/* 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_TRGMUX_IN10 = 12U, + TRGMUX_TRIG_SOURCE_TRGMUX_IN11 = 13U, + 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_FTM2_INIT_TRIG = 26U, + TRGMUX_TRIG_SOURCE_FTM2_EXT_TRIG = 27U, + TRGMUX_TRIG_SOURCE_FTM3_INIT_TRIG = 28U, + TRGMUX_TRIG_SOURCE_FTM3_EXT_TRIG = 29U, + TRGMUX_TRIG_SOURCE_ADC0_SC1A_COCO = 30U, + TRGMUX_TRIG_SOURCE_ADC0_SC1B_COCO = 31U, + TRGMUX_TRIG_SOURCE_ADC1_SC1A_COCO = 32U, + TRGMUX_TRIG_SOURCE_ADC1_SC1B_COCO = 33U, + TRGMUX_TRIG_SOURCE_PDB0_CH0_TRIG = 34U, + TRGMUX_TRIG_SOURCE_PDB0_PULSE_OUT = 36U, + TRGMUX_TRIG_SOURCE_PDB1_CH0_TRIG = 37U, + TRGMUX_TRIG_SOURCE_PDB1_PULSE_OUT = 39U, + 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_TRGMUX_OUT6 = 10U, + TRGMUX_TARGET_MODULE_TRGMUX_OUT7 = 11U, + 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_ADC1_ADHWT_TLA0 = 16U, + TRGMUX_TARGET_MODULE_ADC1_ADHWT_TLA1 = 17U, + TRGMUX_TARGET_MODULE_ADC1_ADHWT_TLA2 = 18U, + TRGMUX_TARGET_MODULE_ADC1_ADHWT_TLA3 = 19U, + 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_FTM2_HWTRIG0 = 48U, + TRGMUX_TARGET_MODULE_FTM2_FAULT0 = 49U, + TRGMUX_TARGET_MODULE_FTM2_FAULT1 = 50U, + TRGMUX_TARGET_MODULE_FTM2_FAULT2 = 51U, + TRGMUX_TARGET_MODULE_FTM3_HWTRIG0 = 52U, + TRGMUX_TARGET_MODULE_FTM3_FAULT0 = 53U, + TRGMUX_TARGET_MODULE_FTM3_FAULT1 = 54U, + TRGMUX_TARGET_MODULE_FTM3_FAULT2 = 55U, + TRGMUX_TARGET_MODULE_PDB0_TRG_IN = 56U, + TRGMUX_TARGET_MODULE_PDB1_TRG_IN = 60U, + 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_TRGMUX_OUT6, \ + TRGMUX_TARGET_MODULE_TRGMUX_OUT7, \ + 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_ADC1_ADHWT_TLA0, \ + TRGMUX_TARGET_MODULE_ADC1_ADHWT_TLA1, \ + TRGMUX_TARGET_MODULE_ADC1_ADHWT_TLA2, \ + TRGMUX_TARGET_MODULE_ADC1_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_FTM2_HWTRIG0, \ + TRGMUX_TARGET_MODULE_FTM2_FAULT0, \ + TRGMUX_TARGET_MODULE_FTM2_FAULT1, \ + TRGMUX_TARGET_MODULE_FTM2_FAULT2, \ + TRGMUX_TARGET_MODULE_FTM3_HWTRIG0, \ + TRGMUX_TARGET_MODULE_FTM3_FAULT0, \ + TRGMUX_TARGET_MODULE_FTM3_FAULT1, \ + TRGMUX_TARGET_MODULE_FTM3_FAULT2, \ + TRGMUX_TARGET_MODULE_PDB0_TRG_IN, \ + TRGMUX_TARGET_MODULE_PDB1_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 \ +} + +/* ISELED Pins */ + +#define ISELED_PIN_0 0 /*PTA10*/ +#define ISELED_PIN_1 1 /*PTD0*/ +#define ISELED_PIN_2 2 /*PTD9*/ +#define ISELED_PIN_3 3 /*PTA11*/ +#define ISELED_PIN_4 4 /*PTD1*/ +#define ISELED_PIN_5 5 /*PTD8*/ +#define ISELED_PIN_6 6 /*PTA0*/ +#define ISELED_PIN_7 7 /*PTE15*/ +#define ISELED_PIN_8 8 /*PTA1*/ +#define ISELED_PIN_9 9 /*PTE16*/ +#define ISELED_PIN_10 10 /*PTA2*/ +#define ISELED_PIN_11 11 /*PTD2*/ +#define ISELED_PIN_12 12 /*PTE10*/ +#define ISELED_PIN_13 13 /*PTA3*/ +#define ISELED_PIN_14 14 /*PTE11*/ +#define ISELED_PIN_15 15 /*PTD3*/ +#define ISELED_PIN_16 16 /*PTA8*/ +#define ISELED_PIN_17 17 /*PTE3*/ +#define ISELED_PIN_18 18 /*PTA9*/ +#define ISELED_PIN_19 19 /*PTE3*/ + +#define ISELED_PIN_20 20 /*PTB2*/ +#define ISELED_PIN_21 21 /*PTB1*/ +#define ISELED_PIN_22 22 /*PTD15*/ +#define ISELED_PIN_23 23 /*PTB4*/ +#define ISELED_PIN_24 24 /*PTE0*/ +#define ISELED_PIN_25 25 /*PTE2*/ +#define ISELED_PIN_26 26 /*PTD0*/ +#define ISELED_PIN_27 27 /*PTD2*/ +#define ISELED_PIN_28 28 /*PTB14*/ +#define ISELED_PIN_29 29 /*PTB16*/ +#define ISELED_PIN_30 30 /*PTE15*/ +#define ISELED_PIN_31 31 /*PTA8*/ +#define ISELED_PIN_32 32 /*PTC15*/ +#define ISELED_PIN_33 33 /*PTC1*/ + +#define ISELED_PIN_34 34 /*PTE1*/ +#define ISELED_PIN_35 35 /*PTB3*/ +#define ISELED_PIN_36 36 /*PTD16*/ +#define ISELED_PIN_37 37 /*PTB15*/ +#define ISELED_PIN_38 38 /*PTD1*/ +#define ISELED_PIN_39 39 /*PTC0*/ + + +#define MAX_NR_OF_STRIPS 13U + +/* PDB module features */ + +/* @brief PDB has back-to-back at instance level */ +#define FEATURE_PDB_HAS_INSTANCE_BACKTOBACK (1) + +#endif /* S32K144_FEATURES_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/devassert.h b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/devassert.h new file mode 100644 index 00000000..243c8d45 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_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/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/device_registers.h b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/device_registers.h new file mode 100644 index 00000000..f56cf068 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/device_registers.h @@ -0,0 +1,70 @@ +/* +** ################################################################### +** 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_S32K144HFT0VLLT) || defined(CPU_S32K144LFT0MLLT)) + + #define S32K14x_SERIES + + /* Specific core definitions */ + #include "s32_core_cm4.h" + + #define S32K144_SERIES + + /* Register definitions */ + #include "S32K144.h" + /* CPU specific feature definitions */ + #include "S32K144_features.h" + +#else + #error "No valid CPU defined!" +#endif + +#include "devassert.h" + +#endif /* DEVICE_REGISTERS_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/s32_core_cm4.h b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/s32_core_cm4.h new file mode 100644 index 00000000..acdd2628 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/s32_core_cm4.h @@ -0,0 +1,209 @@ +/* + * 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_cm4.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_CM4_H) +#define CORE_CM4_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/** \brief BKPT_ASM + * + * Macro to be used to trigger an debug interrupt + */ +#define BKPT_ASM __asm("BKPT #0\n\t") + + +/** \brief Enable FPU + * + * ENABLE_FPU indicates whether SystemInit will enable the Floating point unit (FPU) + */ +#if defined (__GNUC__) || defined (__ARMCC_VERSION) +#if defined (__VFP_FP__) && !defined (__SOFTFP__) +#define ENABLE_FPU +#endif + +#elif defined (__ICCARM__) +#if defined __ARMVFP__ +#define ENABLE_FPU +#endif + +#elif defined (__ghs__) || defined (__DCC__) +#if defined (__VFP__) +#define ENABLE_FPU +#endif +#endif /* if defined (__GNUC__) */ + +/** \brief Enable interrupts + */ +#if defined (__GNUC__) +#define ENABLE_INTERRUPTS() __asm volatile ("cpsie i" : : : "memory"); +#else +#define ENABLE_INTERRUPTS() __asm("cpsie i") +#endif + + +/** \brief Disable interrupts + */ +#if defined (__GNUC__) +#define DISABLE_INTERRUPTS() __asm volatile ("cpsid i" : : : "memory"); +#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") +#else +#define STANDBY() __asm("wfi") +#endif + +/** \brief No-op + */ +#define NOP() __asm volatile ("nop") + +/** \brief Reverse byte order in a word. + */ +#if defined (__GNUC__) || defined (__ICCARM__) || defined (__ghs__) || defined (__ARMCC_VERSION) +#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. + */ +#if defined (__GNUC__) || defined (__ICCARM__) || defined (__ghs__) || defined (__ARMCC_VERSION) +#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\"") \ + _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 cm4 + */ +#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 Section placement. + */ +#if defined ( __GNUC__ ) || defined ( __ghs__ ) || defined ( __DCC__ ) || defined (__ARMCC_VERSION) + #define PLACE_IN_SECTION(x) __attribute__((section(x))) +#elif defined ( __ICCARM__ ) + #define PLACE_IN_SECTION(x) _Pragma(stringify(section=x)) +#else + /* Keep compatibility with software analysis tools */ + #define PLACE_IN_SECTION(x) +#endif + +/** \brief Endianness. + */ +#define CORE_LITTLE_ENDIAN + +#ifdef __cplusplus +} +#endif + +#endif /* CORE_CM4_H */ + +/******************************************************************************* + * EOF + ******************************************************************************/ diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/system_S32K144.c b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/system_S32K144.c new file mode 100644 index 00000000..a8e32c84 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/system_S32K144.c @@ -0,0 +1,197 @@ +/* + * 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. + */ + +/** + * @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_S32K144.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) +{ +/**************************************************************************/ + /* FPU ENABLE*/ +/**************************************************************************/ +#ifdef ENABLE_FPU + /* Enable CP10 and CP11 coprocessors */ + S32_SCB->CPACR |= (S32_SCB_CPACR_CP10_MASK | S32_SCB_CPACR_CP11_MASK); +#ifdef ERRATA_E6940 + /* Disable lazy context save of floating point state by clearing LSPEN bit + * Workaround for errata e6940 */ + S32_SCB->FPCCR &= ~(S32_SCB_FPCCR_LSPEN_MASK); +#endif +#endif /* ENABLE_FPU */ + +/**************************************************************************/ + /* 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) */ + +/**************************************************************************/ + /* ENABLE CACHE */ +/**************************************************************************/ +#if defined(I_CACHE) && (ICACHE_ENABLE == 1) + /* Invalidate and enable code cache */ + LMEM->PCCCR = LMEM_PCCCR_INVW0(1) | LMEM_PCCCR_INVW1(1) | LMEM_PCCCR_GO(1) | LMEM_PCCCR_ENCACHE(1); +#endif /* defined(I_CACHE) && (ICACHE_ENABLE == 1) */ +} + +/*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, prediv, multi; + bool validSystemClockSource = true; + static const uint32_t fircFreq[] = { + FEATURE_SCG_FIRC_FREQ0, + }; + + 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 != 0U) + { + SCGOUTClock = FEATURE_SCG_SIRC_HIGH_RANGE_FREQ; + } + + break; + case 0x3: + /* Fast IRC */ + regValue = (SCG->FIRCCFG & SCG_FIRCCFG_RANGE_MASK) >> SCG_FIRCCFG_RANGE_SHIFT; + SCGOUTClock= fircFreq[regValue]; + break; + case 0x6: + /* System PLL */ + SCGOUTClock = CPU_XTAL_CLK_HZ; + prediv = ((SCG->SPLLCFG & SCG_SPLLCFG_PREDIV_MASK) >> SCG_SPLLCFG_PREDIV_SHIFT) + 1U; + multi = ((SCG->SPLLCFG & SCG_SPLLCFG_MULT_MASK) >> SCG_SPLLCFG_MULT_SHIFT) + 16U; + SCGOUTClock = SCGOUTClock * multi / (prediv * 2U); + 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/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/system_S32K144.h b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/system_S32K144.h new file mode 100644 index 00000000..c7fcf0a7 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/lib/system_S32K144.h @@ -0,0 +1,111 @@ +/* + * 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. + */ + + +/*! @addtogroup soc_support_S32K144*/ +/*! @{*/ + +/*! + * @file system_S32K144.h + * @brief Device specific configuration file for S32K144 + */ + +#ifndef SYSTEM_S32K144_H_ +#define SYSTEM_S32K144_H_ /**< Symbol preventing repeated inclusion */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/****************************************************************************** + * CPU Settings. + *****************************************************************************/ + +/* Watchdog disable */ +#ifndef DISABLE_WDOG + #define DISABLE_WDOG 1 +#endif + +/* Cache enablement */ +#ifndef ICACHE_ENABLE +#define ICACHE_ENABLE 0 +#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, enables FPU. + * 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_S32K144_H_) */ diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/main.c b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/main.c new file mode 100644 index 00000000..49f4795b --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/main.c @@ -0,0 +1,207 @@ +/************************************************************************************//** +* \file Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/main.c +* \brief Demo program application source file. +* \ingroup Prog_ARMCM4_S32K14_S32K144EVB_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_PORTC_INDEX] |= PCC_PCCn_CGC_MASK; + PCC->PCCn[PCC_PORTD_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. PC6 = UART1 RX, MUX = ALT2. */ + PORTC->PCR[6] |= PORT_PCR_MUX(2); + /* UART TX GPIO pin configuration. PC7 = UART1 TX, MUX = ALT2. */ + PORTC->PCR[7] |= 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 uses the 8 MHz external crystal as a source for the +** PLL and configures the normal RUN mode for the following clock settings: +** - SPLL_CLK = 160 MHz +** - CORE_CLK = 80 MHz +** - SYS_CLK = 80 MHz +** - BUS_CLK = 40 MHz +** - FLASH_CLK = 26.67 MHz +** - SIRCDIV1_CLK = 8 MHz +** - SIRCDIV2_CLK = 8 MHz +** \return none. +** +****************************************************************************************/ +static void SystemClockConfig(void) +{ + /* --------- SOSC Initialization (8 MHz) ------------------------------------------- */ + /* SOSCDIV1 & SOSCDIV2 =1: divide by 1. */ + SCG->SOSCDIV = SCG_SOSCDIV_SOSCDIV1(1) | SCG_SOSCDIV_SOSCDIV2(1); + /* Range=2: Medium freq (SOSC betw 1MHz-8MHz). + * HGO=0: Config xtal osc for low power. + * EREFS=1: Input is external XTAL. + */ + SCG->SOSCCFG = SCG_SOSCCFG_RANGE(2) | 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)) + { + ; + } + + /* --------- SPLL Initialization (160 MHz) ----------------------------------------- */ + /* Ensure SPLLCSR is unlocked. */ + while (SCG->SPLLCSR & SCG_SPLLCSR_LK_MASK) + { + ; + } + /* SPLLEN=0: SPLL is disabled (default). */ + SCG->SPLLCSR &= ~SCG_SPLLCSR_SPLLEN_MASK; + /* SPLLDIV1 divide by 2 and SPLLDIV2 divide by 4. */ + SCG->SPLLDIV |= SCG_SPLLDIV_SPLLDIV1(2) | SCG_SPLLDIV_SPLLDIV2(3); + /* PREDIV=0: Divide SOSC_CLK by 0+1=1. + * MULT=24: Multiply sys pll by 4+24=40. + * SPLL_CLK = 8MHz / 1 * 40 / 2 = 160 MHz. + */ + SCG->SPLLCFG = SCG_SPLLCFG_MULT(24); + /* Ensure SPLLCSR is unlocked. */ + while (SCG->SPLLCSR & SCG_SPLLCSR_LK_MASK) + { + ; + } + /* LK=0: SPLLCSR can be written. + * SPLLCMRE=0: SPLL CLK monitor IRQ if enabled. + * SPLLCM=0: SPLL CLK monitor disabled. + * SPLLSTEN=0: SPLL disabled in Stop modes. + * SPLLEN=1: Enable SPLL. + */ + SCG->SPLLCSR |= SCG_SPLLCSR_SPLLEN_MASK; + /* Wait for SPLL to become valid. */ + while (!(SCG->SPLLCSR & SCG_SPLLCSR_SPLLVLD_MASK)) + { + ; + } + + /* --------- 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 8MHz SOSC, 80 MHz PLL ------------------ */ + /* Select PLL as clock source. + * DIVCORE=1, div. by 2: Core clock = 160/2 MHz = 80 MHz. + * 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); + /* Wait until system clock source is SPLL. */ + while (((SCG->CSR & SCG_CSR_SCS_MASK) >> SCG_CSR_SCS_SHIFT ) != 6U) + { + ; + } + /* 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/ARMCM4_S32K14_S32K144EVB_GCC/Prog/prog.dox b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/prog.dox new file mode 100644 index 00000000..a9680d7e --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/prog.dox @@ -0,0 +1,13 @@ +/** +\defgroup Prog_ARMCM4_S32K14_S32K144EVB_GCC User Program +\ingroup ARMCM4_S32K14_S32K144EVB_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/ARMCM4_S32K14_S32K144EVB_GCC/Prog/startup/startup.c b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/startup/startup.c new file mode 100644 index 00000000..2d0efc61 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_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/ARMCM4_S32K14_S32K144EVB_GCC/Prog/startup/startup.h b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/startup/startup.h new file mode 100644 index 00000000..8384b7db --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_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/ARMCM4_S32K14_S32K144EVB_GCC/Prog/startup/startup_S32K144.S b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/startup/startup_S32K144.S new file mode 100644 index 00000000..2e9bbcb8 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/startup/startup_S32K144.S @@ -0,0 +1,531 @@ +/* ---------------------------------------------------------------------------------------*/ +/* @file: startup_S32K144.s */ +/* @purpose: GNU Compiler Collection Startup File */ +/* S32K144 */ +/* @version: 2.0 */ +/* @date: 2017-1-10 */ +/* @build: b170107 */ +/* ---------------------------------------------------------------------------------------*/ +/* */ +/* Copyright (c) 1997 - 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. */ +/*****************************************************************************/ +/* Version: GNU Compiler Collection */ +/*****************************************************************************/ + .syntax unified + .arch armv7-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 /* NMI Handler*/ + .long HardFault_Handler /* Hard Fault Handler*/ + .long MemManage_Handler /* MPU Fault Handler*/ + .long BusFault_Handler /* Bus Fault Handler*/ + .long UsageFault_Handler /* Usage Fault Handler*/ + .long 0 /* Reserved*/ + .long 0 /* Reserved*/ + .long 0 /* Reserved*/ + .long 0 /* Reserved*/ + .long SVC_Handler /* SVCall Handler*/ + .long DebugMon_Handler /* Debug Monitor Handler*/ + .long 0 /* Reserved*/ + .long PendSV_Handler /* PendSV Handler*/ + .long SysTick_Handler /* SysTick Handler*/ + + /* External Interrupts*/ + .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 DMA4_IRQHandler /* DMA channel 4 transfer complete*/ + .long DMA5_IRQHandler /* DMA channel 5 transfer complete*/ + .long DMA6_IRQHandler /* DMA channel 6 transfer complete*/ + .long DMA7_IRQHandler /* DMA channel 7 transfer complete*/ + .long DMA8_IRQHandler /* DMA channel 8 transfer complete*/ + .long DMA9_IRQHandler /* DMA channel 9 transfer complete*/ + .long DMA10_IRQHandler /* DMA channel 10 transfer complete*/ + .long DMA11_IRQHandler /* DMA channel 11 transfer complete*/ + .long DMA12_IRQHandler /* DMA channel 12 transfer complete*/ + .long DMA13_IRQHandler /* DMA channel 13 transfer complete*/ + .long DMA14_IRQHandler /* DMA channel 14 transfer complete*/ + .long DMA15_IRQHandler /* DMA channel 15 transfer complete*/ + .long DMA_Error_IRQHandler /* DMA error interrupt channels 0-15*/ + .long MCM_IRQHandler /* FPU sources*/ + .long FTFC_IRQHandler /* FTFC Command complete*/ + .long Read_Collision_IRQHandler /* FTFC Read collision*/ + .long LVD_LVW_IRQHandler /* PMC Low voltage detect interrupt*/ + .long FTFC_Fault_IRQHandler /* FTFC Double bit fault detect*/ + .long WDOG_EWM_IRQHandler /* Single interrupt vector for WDOG and EWM*/ + .long RCM_IRQHandler /* RCM Asynchronous Interrupt*/ + .long LPI2C0_Master_IRQHandler /* LPI2C0 Master Interrupt*/ + .long LPI2C0_Slave_IRQHandler /* LPI2C0 Slave Interrupt*/ + .long LPSPI0_IRQHandler /* LPSPI0 Interrupt*/ + .long LPSPI1_IRQHandler /* LPSPI1 Interrupt*/ + .long LPSPI2_IRQHandler /* LPSPI2 Interrupt*/ + .long Reserved45_IRQHandler /* Reserved Interrupt 45*/ + .long Reserved46_IRQHandler /* Reserved Interrupt 46*/ + .long LPUART0_RxTx_IRQHandler /* LPUART0 Transmit / Receive Interrupt*/ + .long Reserved48_IRQHandler /* Reserved Interrupt 48*/ + .long LPUART1_RxTx_IRQHandler /* LPUART1 Transmit / Receive Interrupt*/ + .long Reserved50_IRQHandler /* Reserved Interrupt 50*/ + .long LPUART2_RxTx_IRQHandler /* LPUART2 Transmit / Receive Interrupt*/ + .long Reserved52_IRQHandler /* Reserved Interrupt 52*/ + .long Reserved53_IRQHandler /* Reserved Interrupt 53*/ + .long Reserved54_IRQHandler /* Reserved Interrupt 54*/ + .long ADC0_IRQHandler /* ADC0 interrupt request.*/ + .long ADC1_IRQHandler /* ADC1 interrupt request.*/ + .long CMP0_IRQHandler /* CMP0 interrupt request*/ + .long Reserved58_IRQHandler /* Reserved Interrupt 58*/ + .long Reserved59_IRQHandler /* Reserved Interrupt 59*/ + .long ERM_single_fault_IRQHandler /* ERM single bit error correction*/ + .long ERM_double_fault_IRQHandler /* ERM double bit error non-correctable*/ + .long RTC_IRQHandler /* RTC alarm interrupt*/ + .long RTC_Seconds_IRQHandler /* RTC seconds interrupt*/ + .long LPIT0_Ch0_IRQHandler /* LPIT0 channel 0 overflow interrupt*/ + .long LPIT0_Ch1_IRQHandler /* LPIT0 channel 1 overflow interrupt*/ + .long LPIT0_Ch2_IRQHandler /* LPIT0 channel 2 overflow interrupt*/ + .long LPIT0_Ch3_IRQHandler /* LPIT0 channel 3 overflow interrupt*/ + .long PDB0_IRQHandler /* PDB0 interrupt*/ + .long Reserved69_IRQHandler /* Reserved Interrupt 69*/ + .long Reserved70_IRQHandler /* Reserved Interrupt 70*/ + .long Reserved71_IRQHandler /* Reserved Interrupt 71*/ + .long Reserved72_IRQHandler /* Reserved Interrupt 72*/ + .long SCG_IRQHandler /* SCG bus interrupt request*/ + .long LPTMR0_IRQHandler /* LPTIMER interrupt request*/ + .long PORTA_IRQHandler /* Port A pin detect interrupt*/ + .long PORTB_IRQHandler /* Port B pin detect interrupt*/ + .long PORTC_IRQHandler /* Port C pin detect interrupt*/ + .long PORTD_IRQHandler /* Port D pin detect interrupt*/ + .long PORTE_IRQHandler /* Port E pin detect interrupt*/ + .long SWI_IRQHandler /* Software interrupt*/ + .long Reserved81_IRQHandler /* Reserved Interrupt 81*/ + .long Reserved82_IRQHandler /* Reserved Interrupt 82*/ + .long Reserved83_IRQHandler /* Reserved Interrupt 83*/ + .long PDB1_IRQHandler /* PDB1 interrupt*/ + .long FLEXIO_IRQHandler /* FlexIO Interrupt*/ + .long Reserved86_IRQHandler /* Reserved Interrupt 86*/ + .long Reserved87_IRQHandler /* Reserved Interrupt 87*/ + .long Reserved88_IRQHandler /* Reserved Interrupt 88*/ + .long Reserved89_IRQHandler /* Reserved Interrupt 89*/ + .long Reserved90_IRQHandler /* Reserved Interrupt 90*/ + .long Reserved91_IRQHandler /* Reserved Interrupt 91*/ + .long Reserved92_IRQHandler /* Reserved Interrupt 92*/ + .long Reserved93_IRQHandler /* Reserved Interrupt 93*/ + .long CAN0_ORed_IRQHandler /* CAN0 OR'ed [Bus Off OR Transmit Warning OR Receive Warning]*/ + .long CAN0_Error_IRQHandler /* CAN0 Interrupt indicating that errors were detected on the CAN bus*/ + .long CAN0_Wake_Up_IRQHandler /* CAN0 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_15_MB_IRQHandler /* CAN0 OR'ed Message buffer (0-15)*/ + .long CAN0_ORed_16_31_MB_IRQHandler /* CAN0 OR'ed Message buffer (16-31)*/ + .long Reserved99_IRQHandler /* Reserved Interrupt 99*/ + .long Reserved100_IRQHandler /* Reserved Interrupt 100*/ + .long CAN1_ORed_IRQHandler /* CAN1 OR'ed [Bus Off OR Transmit Warning OR Receive Warning]*/ + .long CAN1_Error_IRQHandler /* CAN1 Interrupt indicating that errors were detected on the CAN bus*/ + .long Reserved103_IRQHandler /* Reserved Interrupt 103*/ + .long CAN1_ORed_0_15_MB_IRQHandler /* CAN1 OR'ed Interrupt for Message buffer (0-15)*/ + .long Reserved105_IRQHandler /* Reserved Interrupt 105*/ + .long Reserved106_IRQHandler /* Reserved Interrupt 106*/ + .long Reserved107_IRQHandler /* Reserved Interrupt 107*/ + .long CAN2_ORed_IRQHandler /* CAN2 OR'ed [Bus Off OR Transmit Warning OR Receive Warning]*/ + .long CAN2_Error_IRQHandler /* CAN2 Interrupt indicating that errors were detected on the CAN bus*/ + .long Reserved110_IRQHandler /* Reserved Interrupt 110*/ + .long CAN2_ORed_0_15_MB_IRQHandler /* CAN2 OR'ed Message buffer (0-15)*/ + .long Reserved112_IRQHandler /* Reserved Interrupt 112*/ + .long Reserved113_IRQHandler /* Reserved Interrupt 113*/ + .long Reserved114_IRQHandler /* Reserved Interrupt 114*/ + .long FTM0_Ch0_Ch1_IRQHandler /* FTM0 Channel 0 and 1 interrupt*/ + .long FTM0_Ch2_Ch3_IRQHandler /* FTM0 Channel 2 and 3 interrupt*/ + .long FTM0_Ch4_Ch5_IRQHandler /* FTM0 Channel 4 and 5 interrupt*/ + .long FTM0_Ch6_Ch7_IRQHandler /* FTM0 Channel 6 and 7 interrupt*/ + .long FTM0_Fault_IRQHandler /* FTM0 Fault interrupt*/ + .long FTM0_Ovf_Reload_IRQHandler /* FTM0 Counter overflow and Reload interrupt*/ + .long FTM1_Ch0_Ch1_IRQHandler /* FTM1 Channel 0 and 1 interrupt*/ + .long FTM1_Ch2_Ch3_IRQHandler /* FTM1 Channel 2 and 3 interrupt*/ + .long FTM1_Ch4_Ch5_IRQHandler /* FTM1 Channel 4 and 5 interrupt*/ + .long FTM1_Ch6_Ch7_IRQHandler /* FTM1 Channel 6 and 7 interrupt*/ + .long FTM1_Fault_IRQHandler /* FTM1 Fault interrupt*/ + .long FTM1_Ovf_Reload_IRQHandler /* FTM1 Counter overflow and Reload interrupt*/ + .long FTM2_Ch0_Ch1_IRQHandler /* FTM2 Channel 0 and 1 interrupt*/ + .long FTM2_Ch2_Ch3_IRQHandler /* FTM2 Channel 2 and 3 interrupt*/ + .long FTM2_Ch4_Ch5_IRQHandler /* FTM2 Channel 4 and 5 interrupt*/ + .long FTM2_Ch6_Ch7_IRQHandler /* FTM2 Channel 6 and 7 interrupt*/ + .long FTM2_Fault_IRQHandler /* FTM2 Fault interrupt*/ + .long FTM2_Ovf_Reload_IRQHandler /* FTM2 Counter overflow and Reload interrupt*/ + .long FTM3_Ch0_Ch1_IRQHandler /* FTM3 Channel 0 and 1 interrupt*/ + .long FTM3_Ch2_Ch3_IRQHandler /* FTM3 Channel 2 and 3 interrupt*/ + .long FTM3_Ch4_Ch5_IRQHandler /* FTM3 Channel 4 and 5 interrupt*/ + .long FTM3_Ch6_Ch7_IRQHandler /* FTM3 Channel 6 and 7 interrupt*/ + .long FTM3_Fault_IRQHandler /* FTM3 Fault interrupt*/ + .long FTM3_Ovf_Reload_IRQHandler /* FTM3 Counter overflow and Reload interrupt*/ + .long DefaultISR /* 139*/ + .long DefaultISR /* 140*/ + .long DefaultISR /* 141*/ + .long DefaultISR /* 142*/ + .long DefaultISR /* 143*/ + .long DefaultISR /* 144*/ + .long DefaultISR /* 145*/ + .long DefaultISR /* 146*/ + .long DefaultISR /* 147*/ + .long DefaultISR /* 148*/ + .long DefaultISR /* 149*/ + .long DefaultISR /* 150*/ + .long DefaultISR /* 151*/ + .long DefaultISR /* 152*/ + .long DefaultISR /* 153*/ + .long DefaultISR /* 154*/ + .long DefaultISR /* 155*/ + .long DefaultISR /* 156*/ + .long DefaultISR /* 157*/ + .long DefaultISR /* 158*/ + .long DefaultISR /* 159*/ + .long DefaultISR /* 160*/ + .long DefaultISR /* 161*/ + .long DefaultISR /* 162*/ + .long DefaultISR /* 163*/ + .long DefaultISR /* 164*/ + .long DefaultISR /* 165*/ + .long DefaultISR /* 166*/ + .long DefaultISR /* 167*/ + .long DefaultISR /* 168*/ + .long DefaultISR /* 169*/ + .long DefaultISR /* 170*/ + .long DefaultISR /* 171*/ + .long DefaultISR /* 172*/ + .long DefaultISR /* 173*/ + .long DefaultISR /* 174*/ + .long DefaultISR /* 175*/ + .long DefaultISR /* 176*/ + .long DefaultISR /* 177*/ + .long DefaultISR /* 178*/ + .long DefaultISR /* 179*/ + .long DefaultISR /* 180*/ + .long DefaultISR /* 181*/ + .long DefaultISR /* 182*/ + .long DefaultISR /* 183*/ + .long DefaultISR /* 184*/ + .long DefaultISR /* 185*/ + .long DefaultISR /* 186*/ + .long DefaultISR /* 187*/ + .long DefaultISR /* 188*/ + .long DefaultISR /* 189*/ + .long DefaultISR /* 190*/ + .long DefaultISR /* 191*/ + .long DefaultISR /* 192*/ + .long DefaultISR /* 193*/ + .long DefaultISR /* 194*/ + .long DefaultISR /* 195*/ + .long DefaultISR /* 196*/ + .long DefaultISR /* 197*/ + .long DefaultISR /* 198*/ + .long DefaultISR /* 199*/ + .long DefaultISR /* 200*/ + .long DefaultISR /* 201*/ + .long DefaultISR /* 202*/ + .long DefaultISR /* 203*/ + .long DefaultISR /* 204*/ + .long DefaultISR /* 205*/ + .long DefaultISR /* 206*/ + .long DefaultISR /* 207*/ + .long DefaultISR /* 208*/ + .long DefaultISR /* 209*/ + .long DefaultISR /* 210*/ + .long DefaultISR /* 211*/ + .long DefaultISR /* 212*/ + .long DefaultISR /* 213*/ + .long DefaultISR /* 214*/ + .long DefaultISR /* 215*/ + .long DefaultISR /* 216*/ + .long DefaultISR /* 217*/ + .long DefaultISR /* 218*/ + .long DefaultISR /* 219*/ + .long DefaultISR /* 220*/ + .long DefaultISR /* 221*/ + .long DefaultISR /* 222*/ + .long DefaultISR /* 223*/ + .long DefaultISR /* 224*/ + .long DefaultISR /* 225*/ + .long DefaultISR /* 226*/ + .long DefaultISR /* 227*/ + .long DefaultISR /* 228*/ + .long DefaultISR /* 229*/ + .long DefaultISR /* 230*/ + .long DefaultISR /* 231*/ + .long DefaultISR /* 232*/ + .long DefaultISR /* 233*/ + .long DefaultISR /* 234*/ + .long DefaultISR /* 235*/ + .long DefaultISR /* 236*/ + .long DefaultISR /* 237*/ + .long DefaultISR /* 238*/ + .long DefaultISR /* 239*/ + .long DefaultISR /* 240*/ + .long DefaultISR /* 241*/ + .long DefaultISR /* 242*/ + .long DefaultISR /* 243*/ + .long DefaultISR /* 244*/ + .long DefaultISR /* 245*/ + .long DefaultISR /* 246*/ + .long DefaultISR /* 247*/ + .long DefaultISR /* 248*/ + .long DefaultISR /* 249*/ + .long DefaultISR /* 250*/ + .long DefaultISR /* 251*/ + .long DefaultISR /* 252*/ + .long DefaultISR /* 253*/ + .long 0x55AA11EE /* 254 - Reserved for OpenBLT checksum*/ + .long 0xFFFFFFFF /* Reserved for user TRIM value*/ + + .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 MemManage_Handler + def_irq_handler BusFault_Handler + def_irq_handler UsageFault_Handler + def_irq_handler SVC_Handler + def_irq_handler DebugMon_Handler + def_irq_handler PendSV_Handler + def_irq_handler SysTick_Handler + def_irq_handler DMA0_IRQHandler + def_irq_handler DMA1_IRQHandler + def_irq_handler DMA2_IRQHandler + def_irq_handler DMA3_IRQHandler + def_irq_handler DMA4_IRQHandler + def_irq_handler DMA5_IRQHandler + def_irq_handler DMA6_IRQHandler + def_irq_handler DMA7_IRQHandler + def_irq_handler DMA8_IRQHandler + def_irq_handler DMA9_IRQHandler + def_irq_handler DMA10_IRQHandler + def_irq_handler DMA11_IRQHandler + def_irq_handler DMA12_IRQHandler + def_irq_handler DMA13_IRQHandler + def_irq_handler DMA14_IRQHandler + def_irq_handler DMA15_IRQHandler + def_irq_handler DMA_Error_IRQHandler + def_irq_handler MCM_IRQHandler + def_irq_handler FTFC_IRQHandler + def_irq_handler Read_Collision_IRQHandler + def_irq_handler LVD_LVW_IRQHandler + def_irq_handler FTFC_Fault_IRQHandler + def_irq_handler WDOG_EWM_IRQHandler + def_irq_handler RCM_IRQHandler + def_irq_handler LPI2C0_Master_IRQHandler + def_irq_handler LPI2C0_Slave_IRQHandler + def_irq_handler LPSPI0_IRQHandler + def_irq_handler LPSPI1_IRQHandler + def_irq_handler LPSPI2_IRQHandler + def_irq_handler Reserved45_IRQHandler + def_irq_handler Reserved46_IRQHandler + def_irq_handler LPUART0_RxTx_IRQHandler + def_irq_handler Reserved48_IRQHandler + def_irq_handler LPUART1_RxTx_IRQHandler + def_irq_handler Reserved50_IRQHandler + def_irq_handler LPUART2_RxTx_IRQHandler + def_irq_handler Reserved52_IRQHandler + def_irq_handler Reserved53_IRQHandler + def_irq_handler Reserved54_IRQHandler + def_irq_handler ADC0_IRQHandler + def_irq_handler ADC1_IRQHandler + def_irq_handler CMP0_IRQHandler + def_irq_handler Reserved58_IRQHandler + def_irq_handler Reserved59_IRQHandler + def_irq_handler ERM_single_fault_IRQHandler + def_irq_handler ERM_double_fault_IRQHandler + def_irq_handler RTC_IRQHandler + def_irq_handler RTC_Seconds_IRQHandler + def_irq_handler LPIT0_Ch0_IRQHandler + def_irq_handler LPIT0_Ch1_IRQHandler + def_irq_handler LPIT0_Ch2_IRQHandler + def_irq_handler LPIT0_Ch3_IRQHandler + def_irq_handler PDB0_IRQHandler + def_irq_handler Reserved69_IRQHandler + def_irq_handler Reserved70_IRQHandler + def_irq_handler Reserved71_IRQHandler + def_irq_handler Reserved72_IRQHandler + def_irq_handler SCG_IRQHandler + def_irq_handler LPTMR0_IRQHandler + def_irq_handler PORTA_IRQHandler + def_irq_handler PORTB_IRQHandler + def_irq_handler PORTC_IRQHandler + def_irq_handler PORTD_IRQHandler + def_irq_handler PORTE_IRQHandler + def_irq_handler SWI_IRQHandler + def_irq_handler Reserved81_IRQHandler + def_irq_handler Reserved82_IRQHandler + def_irq_handler Reserved83_IRQHandler + def_irq_handler PDB1_IRQHandler + def_irq_handler FLEXIO_IRQHandler + def_irq_handler Reserved86_IRQHandler + def_irq_handler Reserved87_IRQHandler + def_irq_handler Reserved88_IRQHandler + def_irq_handler Reserved89_IRQHandler + def_irq_handler Reserved90_IRQHandler + def_irq_handler Reserved91_IRQHandler + def_irq_handler Reserved92_IRQHandler + def_irq_handler Reserved93_IRQHandler + def_irq_handler CAN0_ORed_IRQHandler + def_irq_handler CAN0_Error_IRQHandler + def_irq_handler CAN0_Wake_Up_IRQHandler + def_irq_handler CAN0_ORed_0_15_MB_IRQHandler + def_irq_handler CAN0_ORed_16_31_MB_IRQHandler + def_irq_handler Reserved99_IRQHandler + def_irq_handler Reserved100_IRQHandler + def_irq_handler CAN1_ORed_IRQHandler + def_irq_handler CAN1_Error_IRQHandler + def_irq_handler Reserved103_IRQHandler + def_irq_handler CAN1_ORed_0_15_MB_IRQHandler + def_irq_handler Reserved105_IRQHandler + def_irq_handler Reserved106_IRQHandler + def_irq_handler Reserved107_IRQHandler + def_irq_handler CAN2_ORed_IRQHandler + def_irq_handler CAN2_Error_IRQHandler + def_irq_handler Reserved110_IRQHandler + def_irq_handler CAN2_ORed_0_15_MB_IRQHandler + def_irq_handler Reserved112_IRQHandler + def_irq_handler Reserved113_IRQHandler + def_irq_handler Reserved114_IRQHandler + def_irq_handler FTM0_Ch0_Ch1_IRQHandler + def_irq_handler FTM0_Ch2_Ch3_IRQHandler + def_irq_handler FTM0_Ch4_Ch5_IRQHandler + def_irq_handler FTM0_Ch6_Ch7_IRQHandler + def_irq_handler FTM0_Fault_IRQHandler + def_irq_handler FTM0_Ovf_Reload_IRQHandler + def_irq_handler FTM1_Ch0_Ch1_IRQHandler + def_irq_handler FTM1_Ch2_Ch3_IRQHandler + def_irq_handler FTM1_Ch4_Ch5_IRQHandler + def_irq_handler FTM1_Ch6_Ch7_IRQHandler + def_irq_handler FTM1_Fault_IRQHandler + def_irq_handler FTM1_Ovf_Reload_IRQHandler + def_irq_handler FTM2_Ch0_Ch1_IRQHandler + def_irq_handler FTM2_Ch2_Ch3_IRQHandler + def_irq_handler FTM2_Ch4_Ch5_IRQHandler + def_irq_handler FTM2_Ch6_Ch7_IRQHandler + def_irq_handler FTM2_Fault_IRQHandler + def_irq_handler FTM2_Ovf_Reload_IRQHandler + def_irq_handler FTM3_Ch0_Ch1_IRQHandler + def_irq_handler FTM3_Ch2_Ch3_IRQHandler + def_irq_handler FTM3_Ch4_Ch5_IRQHandler + def_irq_handler FTM3_Ch6_Ch7_IRQHandler + def_irq_handler FTM3_Fault_IRQHandler + def_irq_handler FTM3_Ovf_Reload_IRQHandler + + .end diff --git a/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/timer.c b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/timer.c new file mode 100644 index 00000000..bfb145e3 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/timer.c @@ -0,0 +1,88 @@ +/************************************************************************************//** +* \file Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/timer.c +* \brief Timer driver source file. +* \ingroup Prog_ARMCM4_S32K14_S32K144EVB_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/ARMCM4_S32K14_S32K144EVB_GCC/Prog/timer.h b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/timer.h new file mode 100644 index 00000000..0fe30a84 --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/timer.h @@ -0,0 +1,38 @@ +/************************************************************************************//** +* \file Demo/ARMCM4_S32K14_S32K144EVB_GCC/Prog/timer.h +* \brief Timer driver header file. +* \ingroup Prog_ARMCM4_S32K14_S32K144EVB_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/ARMCM4_S32K14_S32K144EVB_GCC/demo.dox b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/demo.dox new file mode 100644 index 00000000..84e1e6ac --- /dev/null +++ b/Target/Demo/ARMCM4_S32K14_S32K144EVB_GCC/demo.dox @@ -0,0 +1,8 @@ +/** +\defgroup ARMCM4_S32K14_S32K144EVB_GCC Demo for S32K144EVB/GCC +\ingroup Demos +\brief Preconfigured programs for the NXP S32K144EVB board and the S32 Design Studio + development environment, which is based on the ARM GCC toolchain. +*/ + + diff --git a/Target/Demo/_template/Prog/boot.c b/Target/Demo/_template/Prog/boot.c index db6b754c..a2c095fa 100644 --- a/Target/Demo/_template/Prog/boot.c +++ b/Target/Demo/_template/Prog/boot.c @@ -198,7 +198,7 @@ static unsigned char Rs232ReceiveByte(unsigned char *data) { unsigned char result = 0; - /* TODO ##Port Check if a new byte was received on the configured channel. This is + /* TODO ##Prog Check if a new byte was received on the configured channel. This is * typically done by checking the reception register not empty flag. If a new byte * was received, read it out and store it in '*data'. Next, clear the reception flag * such that a new byte can be received again. Finally, set 'result' to 1 to indicate diff --git a/Target/Source/ARMCM4_S32K14/GCC/cpu_comp.c b/Target/Source/ARMCM4_S32K14/GCC/cpu_comp.c new file mode 100644 index 00000000..475ce770 --- /dev/null +++ b/Target/Source/ARMCM4_S32K14/GCC/cpu_comp.c @@ -0,0 +1,59 @@ +/************************************************************************************//** +* \file Source/ARMCM4_S32K14/GCC/cpu_comp.c +* \brief Bootloader cpu module source file. +* \ingroup Target_ARMCM4_S32K14 +* \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/ARMCM4_S32K14/can.c b/Target/Source/ARMCM4_S32K14/can.c new file mode 100644 index 00000000..912d0856 --- /dev/null +++ b/Target/Source/ARMCM4_S32K14/can.c @@ -0,0 +1,616 @@ +/************************************************************************************//** +* \file Source/ARMCM4_S32K14/can.c +* \brief Bootloader CAN communication interface source file. +* \ingroup Target_ARMCM4_S32K14 +* \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) +#elif (BOOT_COM_CAN_CHANNEL_INDEX == 1) +/** \brief Set the peripheral CAN1 base pointer. */ +#define CANx (CAN1) +/** \brief Set the PCC index offset for CAN1. */ +#define PCC_FlexCANx_INDEX (PCC_FlexCAN1_INDEX) +/** \brief Set the number of message boxes supported by CAN1. */ +#define CANx_MAX_MB_NUM (FEATURE_CAN1_MAX_MB_NUM) +#elif (BOOT_COM_CAN_CHANNEL_INDEX == 2) +/** \brief Set the peripheral CAN2 base pointer. */ +#define CANx (CAN2) +/** \brief Set the PCC index offset for CAN2. */ +#define PCC_FlexCANx_INDEX (PCC_FlexCAN2_INDEX) +/** \brief Set the number of message boxes supported by CAN2. */ +#define CANx_MAX_MB_NUM (FEATURE_CAN2_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) || + (BOOT_COM_CAN_CHANNEL_INDEX == 1) || + (BOOT_COM_CAN_CHANNEL_INDEX == 2)); + + /* 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/ARMCM4_S32K14/cpu.c b/Target/Source/ARMCM4_S32K14/cpu.c new file mode 100644 index 00000000..5d7c407a --- /dev/null +++ b/Target/Source/ARMCM4_S32K14/cpu.c @@ -0,0 +1,192 @@ +/************************************************************************************//** +* \file Source/ARMCM4_S32K14/cpu.c +* \brief Bootloader cpu module source file. +* \ingroup Target_ARMCM4_S32K14 +* \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/ARMCM4_S32K14/flash.c b/Target/Source/ARMCM4_S32K14/flash.c new file mode 100644 index 00000000..6623d9a7 --- /dev/null +++ b/Target/Source/ARMCM4_S32K14/flash.c @@ -0,0 +1,1060 @@ +/************************************************************************************//** +* \file Source/ARMCM4_S32K14/flash.c +* \brief Bootloader flash driver source file. +* \ingroup Target_ARMCM4_S32K14 +* \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 (1024) +/** \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. + * For this target it is set to the second to last entry (254) in the vector + * table. 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 (0x3F8) +#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 + * S32K14x, the flash sector erase size is either 2kb or 4kb. It was decided to create + * entries that are equal or a multiple of 4kb to simplify the flash layout array and + * to keep it from getting unnecessarily large. + */ + /*{ 0x00000000, 0x01000, 0}, flash sector 0 - reserved for bootloader */ + /*{ 0x00001000, 0x01000, 1}, flash sector 1 - reserved for bootloader */ + { 0x00002000, 0x01000, 2}, /* flash sector 2 - 4kb */ + { 0x00003000, 0x01000, 3}, /* flash sector 3 - 4kb */ + { 0x00004000, 0x01000, 4}, /* flash sector 4 - 4kb */ + { 0x00005000, 0x01000, 5}, /* flash sector 5 - 4kb */ + { 0x00006000, 0x01000, 6}, /* flash sector 6 - 4kb */ + { 0x00007000, 0x01000, 7}, /* flash sector 7 - 4kb */ + { 0x00008000, 0x08000, 8}, /* flash sector 8 - 32kb */ + { 0x00010000, 0x08000, 9}, /* flash sector 9 - 32kb */ + { 0x00018000, 0x08000, 10}, /* flash sector 10 - 32kb */ + #if (BOOT_NVM_SIZE_KB > 128) + { 0x00020000, 0x08000, 11}, /* flash sector 11 - 32kb */ + { 0x00028000, 0x08000, 12}, /* flash sector 12 - 32kb */ + { 0x00030000, 0x08000, 13}, /* flash sector 13 - 32kb */ + { 0x00038000, 0x08000, 14}, /* flash sector 14 - 32kb */ + #endif + #if (BOOT_NVM_SIZE_KB > 256) + { 0x00040000, 0x08000, 15}, /* flash sector 15 - 32kb */ + { 0x00048000, 0x08000, 16}, /* flash sector 16 - 32kb */ + { 0x00050000, 0x08000, 17}, /* flash sector 17 - 32kb */ + { 0x00058000, 0x08000, 18}, /* flash sector 18 - 32kb */ + { 0x00060000, 0x08000, 19}, /* flash sector 19 - 32kb */ + { 0x00068000, 0x08000, 20}, /* flash sector 20 - 32kb */ + { 0x00070000, 0x08000, 21}, /* flash sector 21 - 32kb */ + { 0x00078000, 0x08000, 22}, /* flash sector 22 - 32kb */ + #endif + #if (BOOT_NVM_SIZE_KB > 512) + { 0x00080000, 0x08000, 23}, /* flash sector 23 - 32kb */ + { 0x00088000, 0x08000, 24}, /* flash sector 24 - 32kb */ + { 0x00090000, 0x08000, 25}, /* flash sector 25 - 32kb */ + { 0x00098000, 0x08000, 26}, /* flash sector 26 - 32kb */ + { 0x000A0000, 0x08000, 27}, /* flash sector 27 - 32kb */ + { 0x000A8000, 0x08000, 28}, /* flash sector 28 - 32kb */ + { 0x000B0000, 0x08000, 29}, /* flash sector 29 - 32kb */ + { 0x000B8000, 0x08000, 30}, /* flash sector 30 - 32kb */ + { 0x000C0000, 0x08000, 31}, /* flash sector 31 - 32kb */ + { 0x000C8000, 0x08000, 32}, /* flash sector 32 - 32kb */ + { 0x000D0000, 0x08000, 33}, /* flash sector 33 - 32kb */ + { 0x000D8000, 0x08000, 34}, /* flash sector 34 - 32kb */ + { 0x000E0000, 0x08000, 35}, /* flash sector 35 - 32kb */ + { 0x000E8000, 0x08000, 36}, /* flash sector 36 - 32kb */ + { 0x000F0000, 0x08000, 37}, /* flash sector 37 - 32kb */ + { 0x000F8000, 0x08000, 38}, /* flash sector 38 - 32kb */ + #endif + #if (BOOT_NVM_SIZE_KB > 1024) + { 0x00100000, 0x08000, 39}, /* flash sector 39 - 32kb */ + { 0x00108000, 0x08000, 40}, /* flash sector 40 - 32kb */ + { 0x00110000, 0x08000, 41}, /* flash sector 41 - 32kb */ + { 0x00118000, 0x08000, 42}, /* flash sector 42 - 32kb */ + { 0x00120000, 0x08000, 43}, /* flash sector 43 - 32kb */ + { 0x00128000, 0x08000, 44}, /* flash sector 44 - 32kb */ + { 0x00130000, 0x08000, 45}, /* flash sector 45 - 32kb */ + { 0x00138000, 0x08000, 46}, /* flash sector 46 - 32kb */ + { 0x00140000, 0x08000, 47}, /* flash sector 47 - 32kb */ + { 0x00148000, 0x08000, 48}, /* flash sector 48 - 32kb */ + { 0x00150000, 0x08000, 49}, /* flash sector 49 - 32kb */ + { 0x00158000, 0x08000, 50}, /* flash sector 50 - 32kb */ + { 0x00160000, 0x08000, 51}, /* flash sector 51 - 32kb */ + { 0x00168000, 0x08000, 52}, /* flash sector 52 - 32kb */ + { 0x00170000, 0x08000, 53}, /* flash sector 53 - 32kb */ + { 0x00178000, 0x08000, 54}, /* flash sector 54 - 32kb */ + #endif + #if (BOOT_NVM_SIZE_KB > 1536) + /* the largest flash memory if 2MB, but that one only has 1.5MB of continuous program + * flash that is currently supported by this flash driver. + */ + #error "BOOT_NVM_SIZE_KB > 1536 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/ARMCM4_S32K14/flash.h b/Target/Source/ARMCM4_S32K14/flash.h new file mode 100644 index 00000000..cb3175af --- /dev/null +++ b/Target/Source/ARMCM4_S32K14/flash.h @@ -0,0 +1,45 @@ +/************************************************************************************//** +* \file Source/ARMCM4_S32K14/flash.h +* \brief Bootloader flash driver header file. +* \ingroup Target_ARMCM4_S32K14 +* \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/ARMCM4_S32K14/nvm.c b/Target/Source/ARMCM4_S32K14/nvm.c new file mode 100644 index 00000000..70420663 --- /dev/null +++ b/Target/Source/ARMCM4_S32K14/nvm.c @@ -0,0 +1,245 @@ +/************************************************************************************//** +* \file Source/ARMCM4_S32K14/nvm.c +* \brief Bootloader non-volatile memory driver source file. +* \ingroup Target_ARMCM4_S32K14 +* \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/ARMCM4_S32K14/rs232.c b/Target/Source/ARMCM4_S32K14/rs232.c new file mode 100644 index 00000000..6d509d08 --- /dev/null +++ b/Target/Source/ARMCM4_S32K14/rs232.c @@ -0,0 +1,341 @@ +/************************************************************************************//** +* \file Source/ARMCM4_S32K14/uart.c +* \brief Bootloader RS232 communication interface source file. +* \ingroup Target_ARMCM4_S32K14 +* \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) +#elif (BOOT_COM_RS232_CHANNEL_INDEX == 2) +/** \brief Set the peripheral LPUART2 base pointer. */ +#define LPUARTx (LPUART2) +/** \brief Set the PCC index offset for LPUART2. */ +#define PCC_LPUARTx_INDEX (PCC_LPUART2_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) || + (BOOT_COM_RS232_CHANNEL_INDEX == 2)); + + /* 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(0b010) | 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/ARMCM4_S32K14/target.dox b/Target/Source/ARMCM4_S32K14/target.dox new file mode 100644 index 00000000..708f7ba0 --- /dev/null +++ b/Target/Source/ARMCM4_S32K14/target.dox @@ -0,0 +1,9 @@ +/** +\defgroup Target_ARMCM4_S32K14 Target ARMCM4 S32K14 +\ingroup Ports +\brief Target dependent code for the NXP ARMCM4 S32K14x microcontroller family. +\details This module implements the bootloader's target dependent part for the + NXP ARMCM4 S32K14x microcontroller family. +*/ + + diff --git a/Target/Source/ARMCM4_S32K14/timer.c b/Target/Source/ARMCM4_S32K14/timer.c new file mode 100644 index 00000000..a1924ee7 --- /dev/null +++ b/Target/Source/ARMCM4_S32K14/timer.c @@ -0,0 +1,110 @@ +/************************************************************************************//** +* \file Source/ARMCM4_S32K14/timer.c +* \brief Bootloader timer driver source file. +* \ingroup Target_ARMCM4_S32K14 +* \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/ARMCM4_S32K14/types.h b/Target/Source/ARMCM4_S32K14/types.h new file mode 100644 index 00000000..07b95b9d --- /dev/null +++ b/Target/Source/ARMCM4_S32K14/types.h @@ -0,0 +1,57 @@ +/************************************************************************************//** +* \file Source/ARMCM4_S32K14/types.h +* \brief Bootloader types header file. +* \ingroup Target_ARMCM4_S32K14 +* \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 ************************************/ diff --git a/Target/Source/_template/can.c b/Target/Source/_template/can.c index da10b22b..b087ba44 100644 --- a/Target/Source/_template/can.c +++ b/Target/Source/_template/can.c @@ -181,7 +181,7 @@ void CanInit(void) ASSERT_RT(BLT_FALSE); } - /* TODO ##Vg Perform the configuration and initialization of the CAN controller. Note + /* TODO ##Port Perform the configuration and initialization of the CAN controller. Note * that the bittiming related values are already stored in 'prescaler, 'tseg1', and * 'tseg2'. There values are ready to be used. Typically, the following tasks need * to be performed: